From e82599a6890ba298755ffc8643c5af57cf59fd26 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Mon, 28 Aug 2023 16:23:34 +0200 Subject: [PATCH 001/123] new payment driver integration (#2710) * new payment driver: update deps & remove zksync * new payment driver: initial integration * temporary fix of payment example -- will not work with new driver. TODO: make the new driver work in the example. * cleanup transfer, remove _transfer, remove gasless. * general way to compute chain_id based on config-payments.toml. * remove lots of code made obsolete by the new driver. * introduce signer for signing transactions for erc20_payment_lib * temporarily disable payment fund. --------- Co-authored-by: scx1332 --- Cargo.lock | 2272 ++++++++--------- Cargo.toml | 37 +- core/model/src/payment.rs | 3 + core/payment-driver/base/Cargo.toml | 8 +- core/payment-driver/base/src/bus.rs | 10 + core/payment-driver/base/src/db/models.rs | 3 + core/payment-driver/erc20/Cargo.toml | 11 +- core/payment-driver/erc20/src/driver/cli.rs | 8 + core/payment-driver/erc20/src/erc20/config.rs | 14 + .../erc20/src/erc20/ethereum.rs | 6 +- core/payment-driver/erc20/src/lib.rs | 18 +- core/payment-driver/erc20/src/network.rs | 15 +- .../{zksync => erc20next}/Cargo.toml | 30 +- core/payment-driver/erc20next/Readme.md | 163 ++ .../erc20next/config-payments.toml | 82 + .../erc20next/src/contracts/eip712.json | 16 + .../erc20next/src/contracts/faucet.json | 107 + .../erc20next/src/contracts/ierc20.json | 222 ++ .../src/contracts/meta_transaction.json | 53 + .../{zksync => erc20next}/src/dao.rs | 236 +- core/payment-driver/erc20next/src/driver.rs | 294 +++ .../erc20next/src/driver/api.rs | 128 + .../erc20next/src/driver/cli.rs | 46 + .../erc20next/src/erc20/config.rs | 119 + .../erc20next/src/erc20/eth_utils.rs | 121 + .../erc20next/src/erc20/ethereum.rs | 841 ++++++ .../erc20next/src/erc20/faucet.rs | 176 ++ .../payment-driver/erc20next/src/erc20/mod.rs | 12 + .../erc20next/src/erc20/transaction.rs | 19 + .../erc20next/src/erc20/utils.rs | 91 + .../erc20next/src/erc20/wallet.rs | 455 ++++ core/payment-driver/erc20next/src/lib.rs | 57 + core/payment-driver/erc20next/src/network.rs | 130 + core/payment-driver/erc20next/src/service.rs | 88 + core/payment-driver/erc20next/src/signer.rs | 174 ++ .../erc20next/view_transactions.sql | 39 + .../payment-driver/zksync/examples/deposit.rs | 41 - .../zksync/examples/simple_balance.rs | 41 - .../zksync/examples/withdrawal.rs | 87 - core/payment-driver/zksync/src/driver.rs | 584 ----- core/payment-driver/zksync/src/lib.rs | 28 - core/payment-driver/zksync/src/network.rs | 80 - core/payment-driver/zksync/src/service.rs | 48 - .../zksync/src/zksync/faucet.rs | 116 - core/payment-driver/zksync/src/zksync/mod.rs | 9 - .../zksync/src/zksync/signer.rs | 168 -- .../payment-driver/zksync/src/zksync/utils.rs | 77 - .../zksync/src/zksync/wallet.rs | 552 ---- core/payment/Cargo.toml | 22 +- core/payment/examples/payment_api.rs | 23 +- core/payment/src/api/allocations.rs | 1 + core/serv/src/main.rs | 12 +- golem_cli/src/command/yagna.rs | 58 +- 53 files changed, 4855 insertions(+), 3196 deletions(-) rename core/payment-driver/{zksync => erc20next}/Cargo.toml (58%) create mode 100644 core/payment-driver/erc20next/Readme.md create mode 100644 core/payment-driver/erc20next/config-payments.toml create mode 100644 core/payment-driver/erc20next/src/contracts/eip712.json create mode 100644 core/payment-driver/erc20next/src/contracts/faucet.json create mode 100644 core/payment-driver/erc20next/src/contracts/ierc20.json create mode 100644 core/payment-driver/erc20next/src/contracts/meta_transaction.json rename core/payment-driver/{zksync => erc20next}/src/dao.rs (51%) create mode 100644 core/payment-driver/erc20next/src/driver.rs create mode 100644 core/payment-driver/erc20next/src/driver/api.rs create mode 100644 core/payment-driver/erc20next/src/driver/cli.rs create mode 100644 core/payment-driver/erc20next/src/erc20/config.rs create mode 100644 core/payment-driver/erc20next/src/erc20/eth_utils.rs create mode 100644 core/payment-driver/erc20next/src/erc20/ethereum.rs create mode 100644 core/payment-driver/erc20next/src/erc20/faucet.rs create mode 100644 core/payment-driver/erc20next/src/erc20/mod.rs create mode 100644 core/payment-driver/erc20next/src/erc20/transaction.rs create mode 100644 core/payment-driver/erc20next/src/erc20/utils.rs create mode 100644 core/payment-driver/erc20next/src/erc20/wallet.rs create mode 100644 core/payment-driver/erc20next/src/lib.rs create mode 100644 core/payment-driver/erc20next/src/network.rs create mode 100644 core/payment-driver/erc20next/src/service.rs create mode 100644 core/payment-driver/erc20next/src/signer.rs create mode 100644 core/payment-driver/erc20next/view_transactions.sql delete mode 100644 core/payment-driver/zksync/examples/deposit.rs delete mode 100644 core/payment-driver/zksync/examples/simple_balance.rs delete mode 100644 core/payment-driver/zksync/examples/withdrawal.rs delete mode 100644 core/payment-driver/zksync/src/driver.rs delete mode 100644 core/payment-driver/zksync/src/lib.rs delete mode 100644 core/payment-driver/zksync/src/network.rs delete mode 100644 core/payment-driver/zksync/src/service.rs delete mode 100644 core/payment-driver/zksync/src/zksync/faucet.rs delete mode 100644 core/payment-driver/zksync/src/zksync/mod.rs delete mode 100644 core/payment-driver/zksync/src/zksync/signer.rs delete mode 100644 core/payment-driver/zksync/src/zksync/utils.rs delete mode 100644 core/payment-driver/zksync/src/zksync/wallet.rs diff --git a/Cargo.lock b/Cargo.lock index 172476a60d..af5bb56c6f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -455,17 +455,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "alga" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f823d037a7ec6ea2197046bafd4ae150e6bc36f9ca347404f46a46823fa84f2" -dependencies = [ - "approx", - "num-complex 0.2.4", - "num-traits", -] - [[package]] name = "all_asserts" version = "2.3.1" @@ -487,6 +476,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -534,36 +529,12 @@ dependencies = [ "winapi 0.2.8", ] -[[package]] -name = "approx" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0e60b75072ecd4168020818c0107f2857bb6c4e64252d8d3983f6263b40a5c3" -dependencies = [ - "num-traits", -] - [[package]] name = "arc-swap" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dabe5a181f83789739c194cbe5a897dde195078fac08568d09221fd6137a7ba8" -[[package]] -name = "arrayref" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" - -[[package]] -name = "arrayvec" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" -dependencies = [ - "nodrop", -] - [[package]] name = "arrayvec" version = "0.5.2" @@ -588,7 +559,7 @@ version = "0.1.1" source = "git+https://github.com/dequbed/asnom.git#06696cefca408a56431922f95293330ed293dbda" dependencies = [ "byteorder", - "nom", + "nom 2.2.1", ] [[package]] @@ -623,18 +594,6 @@ dependencies = [ "xz2", ] -[[package]] -name = "async-native-tls" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e9e7a929bd34c68a82d58a4de7f86fffdaf97fb2af850162a7bb19dd7269b33" -dependencies = [ - "native-tls", - "thiserror", - "tokio 0.2.25", - "url", -] - [[package]] name = "async-trait" version = "0.1.73" @@ -646,6 +605,15 @@ dependencies = [ "syn 2.0.29", ] +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + [[package]] name = "atomic-shim" version = "0.1.0" @@ -766,24 +734,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" [[package]] -name = "bellman_ce" -version = "0.3.2" -source = "git+https://github.com/matter-labs/bellman?branch=beta#416f79d3f93fc855fb96bb61bfe73d2472e95548" -dependencies = [ - "bit-vec", - "blake2s_const", - "blake2s_simd", - "byteorder", - "cfg-if 1.0.0", - "crossbeam", - "futures 0.3.28", - "hex", - "lazy_static", - "num_cpus", - "pairing_ce", - "rand 0.4.6", - "tiny-keccak 1.5.0", -] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bigdecimal" @@ -808,12 +762,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - [[package]] name = "bitflags" version = "1.3.2" @@ -825,6 +773,9 @@ name = "bitflags" version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +dependencies = [ + "serde", +] [[package]] name = "bitmaps" @@ -835,69 +786,28 @@ dependencies = [ "typenum", ] -[[package]] -name = "bitvec" -version = "0.17.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41262f11d771fd4a61aa3ce019fca363b4b6c282fca9da2a31186d3965a47a5c" -dependencies = [ - "either", - "radium 0.3.0", -] - [[package]] name = "bitvec" version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" dependencies = [ - "funty", + "funty 1.1.0", "radium 0.6.2", "tap", - "wyz", -] - -[[package]] -name = "blake2" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4e37d16930f5459780f5621038b6382b9bb37c19016f39fb6b5808d831f174" -dependencies = [ - "crypto-mac 0.8.0", - "digest 0.9.0", - "opaque-debug 0.3.0", + "wyz 0.2.0", ] [[package]] -name = "blake2-rfc_bellman_edition" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc60350286c7c3db13b98e91dbe5c8b6830a6821bc20af5b0c310ce94d74915" -dependencies = [ - "arrayvec 0.4.12", - "byteorder", - "constant_time_eq", -] - -[[package]] -name = "blake2s_const" -version = "0.6.0" -source = "git+https://github.com/matter-labs/bellman?branch=beta#416f79d3f93fc855fb96bb61bfe73d2472e95548" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "constant_time_eq", -] - -[[package]] -name = "blake2s_simd" -version = "0.5.11" +name = "bitvec" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e461a7034e85b211a4acb57ee2e6730b32912b06c08cc242243c39fc21ae6a2" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "constant_time_eq", + "funty 2.0.0", + "radium 0.7.0", + "tap", + "wyz 0.5.1", ] [[package]] @@ -956,6 +866,51 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" +[[package]] +name = "borsh" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +dependencies = [ + "borsh-derive", + "hashbrown 0.12.3", +] + +[[package]] +name = "borsh-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" +dependencies = [ + "borsh-derive-internal", + "borsh-schema-derive-internal", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "brotli" version = "3.3.4" @@ -984,7 +939,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" dependencies = [ "memchr", - "regex-automata 0.3.6", + "regex-automata", "serde", ] @@ -994,12 +949,6 @@ version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" -[[package]] -name = "byte-slice-cast" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0a5e3906bcbf133e33c1d4d95afc664ad37fbdb9f6568d8043e7ea8c27d93d3" - [[package]] name = "byte-slice-cast" version = "1.2.2" @@ -1022,6 +971,28 @@ dependencies = [ "utf8-width", ] +[[package]] +name = "bytecheck" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "byteorder" version = "1.4.3" @@ -1118,7 +1089,6 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", - "rustc-serialize", "serde", "time 0.1.45", "wasm-bindgen", @@ -1221,10 +1191,10 @@ dependencies = [ ] [[package]] -name = "constant_time_eq" -version = "0.1.5" +name = "const-oid" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" [[package]] name = "convert_case" @@ -1268,6 +1238,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" + [[package]] name = "crc32fast" version = "1.3.2" @@ -1285,9 +1270,9 @@ checksum = "69323bff1fb41c635347b8ead484a5ca6c3f11914d784170b158d8449ab07f8e" dependencies = [ "cfg-if 0.1.10", "crossbeam-channel 0.4.4", - "crossbeam-deque 0.7.4", - "crossbeam-epoch 0.8.2", - "crossbeam-queue", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue 0.2.3", "crossbeam-utils 0.7.2", ] @@ -1317,22 +1302,11 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c20ff29ded3204c5106278a81a38f4b482636ed4fa1e6cfbeef193291beb29ed" dependencies = [ - "crossbeam-epoch 0.8.2", + "crossbeam-epoch", "crossbeam-utils 0.7.2", "maybe-uninit", ] -[[package]] -name = "crossbeam-deque" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-epoch 0.9.15", - "crossbeam-utils 0.8.16", -] - [[package]] name = "crossbeam-epoch" version = "0.8.2" @@ -1348,19 +1322,6 @@ dependencies = [ "scopeguard", ] -[[package]] -name = "crossbeam-epoch" -version = "0.9.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" -dependencies = [ - "autocfg 1.1.0", - "cfg-if 1.0.0", - "crossbeam-utils 0.8.16", - "memoffset 0.9.0", - "scopeguard", -] - [[package]] name = "crossbeam-queue" version = "0.2.3" @@ -1372,6 +1333,16 @@ dependencies = [ "maybe-uninit", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils 0.8.16", +] + [[package]] name = "crossbeam-utils" version = "0.7.2" @@ -1449,16 +1420,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "crypto-mac" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -dependencies = [ - "generic-array 0.14.7", - "subtle", -] - [[package]] name = "crypto-mac" version = "0.10.1" @@ -1469,16 +1430,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "crypto-mac" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" -dependencies = [ - "generic-array 0.14.7", - "subtle", -] - [[package]] name = "csv" version = "1.2.2" @@ -1531,9 +1482,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "3.2.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" dependencies = [ "byteorder", "digest 0.9.0", @@ -1548,18 +1499,8 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" dependencies = [ - "darling_core 0.10.2", - "darling_macro 0.10.2", -] - -[[package]] -name = "darling" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" -dependencies = [ - "darling_core 0.13.4", - "darling_macro 0.13.4", + "darling_core", + "darling_macro", ] [[package]] @@ -1576,38 +1517,13 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "darling_core" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 1.0.109", -] - [[package]] name = "darling_macro" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" dependencies = [ - "darling_core 0.10.2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "darling_macro" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" -dependencies = [ - "darling_core 0.13.4", + "darling_core", "quote", "syn 1.0.109", ] @@ -1642,13 +1558,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" [[package]] -name = "debugid" -version = "0.7.3" +name = "der" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ee87af31d84ef885378aebca32be3d682b0e0dc119d5b4860a2c5bb5046730" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ - "serde", - "uuid 0.8.2", + "const-oid", + "pem-rfc7468", + "zeroize", ] [[package]] @@ -1757,7 +1674,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", + "const-oid", "crypto-common", + "subtle", ] [[package]] @@ -1824,6 +1743,12 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + [[package]] name = "dyn-clone" version = "1.0.13" @@ -1836,7 +1761,7 @@ version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" dependencies = [ - "signature", + "signature 1.6.4", ] [[package]] @@ -1858,6 +1783,9 @@ name = "either" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +dependencies = [ + "serde", +] [[package]] name = "encode_unicode" @@ -1961,17 +1889,47 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "errno" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e2b2decb0484e15560df3210cf0d78654bb0864b2c138977c07e377a1bae0e2" +name = "erc20_payment_lib" +version = "0.1.9" dependencies = [ - "kernel32-sys", - "libc", - "winapi 0.2.8", -] - -[[package]] + "actix-files", + "actix-web", + "async-trait", + "chrono", + "dotenv", + "fastrand", + "futures 0.3.28", + "hex", + "humantime 2.1.0", + "lazy_static", + "log", + "rand 0.8.5", + "rust_decimal", + "rustc-hex", + "secp256k1 0.27.0", + "serde", + "serde_json", + "sha3 0.10.8", + "sqlx", + "structopt", + "tokio 1.32.0", + "toml", + "uuid 1.4.1", + "web3", +] + +[[package]] +name = "errno" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e2b2decb0484e15560df3210cf0d78654bb0864b2c138977c07e377a1bae0e2" +dependencies = [ + "kernel32-sys", + "libc", + "winapi 0.2.8", +] + +[[package]] name = "errno" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" @@ -2002,46 +1960,58 @@ dependencies = [ "str-buf", ] +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if 1.0.0", + "home", + "windows-sys 0.48.0", +] + [[package]] name = "ethabi" -version = "14.1.0" +version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01317735d563b3bad2d5f90d2e1799f414165408251abb762510f40e790e69a" +checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" dependencies = [ - "anyhow", - "ethereum-types 0.11.0", + "ethereum-types 0.14.1", "hex", + "once_cell", + "regex", "serde", "serde_json", - "sha3 0.9.1", + "sha3 0.10.8", "thiserror", "uint 0.9.5", ] [[package]] name = "ethbloom" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a621dcebea74f2a6f2002d0a885c81ccf6cbdf86760183316a7722b5707ca4" +checksum = "bfb684ac8fa8f6c5759f788862bb22ec6fe3cb392f6bfd08e3c64b603661e3f8" dependencies = [ "crunchy", - "fixed-hash", + "fixed-hash 0.7.0", "impl-rlp", - "impl-serde", - "tiny-keccak 2.0.2", + "impl-serde 0.3.2", + "tiny-keccak", ] [[package]] name = "ethbloom" -version = "0.11.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb684ac8fa8f6c5759f788862bb22ec6fe3cb392f6bfd08e3c64b603661e3f8" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" dependencies = [ "crunchy", - "fixed-hash", + "fixed-hash 0.8.0", "impl-rlp", - "impl-serde", - "tiny-keccak 2.0.2", + "impl-serde 0.4.0", + "tiny-keccak", ] [[package]] @@ -2056,34 +2026,34 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "tiny-keccak 2.0.2", + "tiny-keccak", ] [[package]] name = "ethereum-types" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05dc5f0df4915fa6dff7f975a8366ecfaaa8959c74235469495153e7bb1b280e" +checksum = "f64b5df66a228d85e4b17e5d6c6aa43b0310898ffe8a85988c4c032357aaabfd" dependencies = [ - "ethbloom 0.10.0", - "fixed-hash", + "ethbloom 0.11.1", + "fixed-hash 0.7.0", "impl-rlp", - "impl-serde", - "primitive-types 0.8.0", + "impl-serde 0.3.2", + "primitive-types 0.9.1", "uint 0.9.5", ] [[package]] name = "ethereum-types" -version = "0.11.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64b5df66a228d85e4b17e5d6c6aa43b0310898ffe8a85988c4c032357aaabfd" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" dependencies = [ - "ethbloom 0.11.1", - "fixed-hash", + "ethbloom 0.13.0", + "fixed-hash 0.8.0", "impl-rlp", - "impl-serde", - "primitive-types 0.9.1", + "impl-serde 0.4.0", + "primitive-types 0.12.1", "uint 0.9.5", ] @@ -2101,6 +2071,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + [[package]] name = "fake-simd" version = "0.1.2" @@ -2124,32 +2100,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "ff_ce" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38107cbd8bac0d907d7e7513c9f68c95adbda9e6f6f6bdf3f5111c6ecac4fe47" -dependencies = [ - "byteorder", - "ff_derive_ce", - "hex", - "rand 0.4.6", -] - -[[package]] -name = "ff_derive_ce" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde5a00073374b4d7aa2d3a8359a5709f9c0bfac8393f254655d16b4acdfe823" -dependencies = [ - "num-bigint 0.4.3", - "num-integer", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "field-offset" version = "0.3.6" @@ -2184,6 +2134,18 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + [[package]] name = "fixedbitset" version = "0.2.0" @@ -2262,6 +2224,18 @@ dependencies = [ "num-traits", ] +[[package]] +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +dependencies = [ + "futures-core", + "futures-sink", + "pin-project 1.1.3", + "spin 0.9.8", +] + [[package]] name = "fnv" version = "1.0.7" @@ -2292,33 +2266,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "franklin-crypto" -version = "0.0.5" -source = "git+https://github.com/matter-labs/franklin-crypto.git?branch=beta#6e448d23161eacabb9465dc3181b7b15174cda2f" -dependencies = [ - "bellman_ce", - "bit-vec", - "blake2", - "blake2-rfc_bellman_edition", - "blake2s_simd", - "byteorder", - "digest 0.9.0", - "hex", - "hmac 0.11.0", - "itertools 0.9.0", - "num-bigint 0.3.3", - "num-integer", - "num-traits", - "poseidon_hash", - "rand 0.4.6", - "serde", - "serde_derive", - "sha2 0.9.9", - "splitmut", - "tiny-keccak 1.5.0", -] - [[package]] name = "fs2" version = "0.4.3" @@ -2376,6 +2323,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.1.31" @@ -2422,7 +2375,17 @@ dependencies = [ "futures-core", "futures-task", "futures-util", - "num_cpus", +] + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api 0.4.10", + "parking_lot 0.12.1", ] [[package]] @@ -2692,7 +2655,7 @@ dependencies = [ "hex", "http", "hyper 0.14.27", - "hyper-tls 0.5.0", + "hyper-tls", "openssl", "serde", "serde_json", @@ -2753,12 +2716,28 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.6", +] [[package]] name = "hashbrown" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +dependencies = [ + "ahash 0.8.3", + "allocator-api2", +] + +[[package]] +name = "hashlink" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "312f66718a2d7789ffef4f4b7b213138ed9f1eb3aa1d0d82fc99f88fb3ffd26f" +dependencies = [ + "hashbrown 0.14.0", +] [[package]] name = "hdrhistogram" @@ -2809,6 +2788,9 @@ name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +dependencies = [ + "unicode-segmentation", +] [[package]] name = "hermit-abi" @@ -2831,24 +2813,41 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hkdf" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +dependencies = [ + "hmac 0.12.1", +] + [[package]] name = "hmac" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" dependencies = [ - "crypto-mac 0.10.1", + "crypto-mac", "digest 0.9.0", ] [[package]] name = "hmac" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "crypto-mac 0.11.1", - "digest 0.9.0", + "digest 0.10.7", +] + +[[package]] +name = "home" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +dependencies = [ + "windows-sys 0.48.0", ] [[package]] @@ -2982,34 +2981,17 @@ dependencies = [ ] [[package]] -name = "hyper-proxy" -version = "0.8.0" +name = "hyper-rustls" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ec5be69758dfc06b9b29efa9d6e9306e387c85eb362c603912eead2ad98c7" +checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" dependencies = [ - "bytes 0.5.6", - "futures 0.3.28", + "futures-util", "http", - "hyper 0.13.10", - "hyper-tls 0.4.3", - "native-tls", - "tokio 0.2.25", - "tokio-tls", - "tower-service", - "typed-headers", -] - -[[package]] -name = "hyper-tls" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d979acc56dcb5b8dddba3917601745e877576475aa046df3226eabdecef78eed" -dependencies = [ - "bytes 0.5.6", - "hyper 0.13.10", - "native-tls", - "tokio 0.2.25", - "tokio-tls", + "hyper 0.14.27", + "rustls", + "tokio 1.32.0", + "tokio-rustls", ] [[package]] @@ -3091,20 +3073,20 @@ dependencies = [ [[package]] name = "impl-codec" -version = "0.4.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1be51a921b067b0eaca2fad532d9400041561aa922221cc65f95a85641c6bf53" +checksum = "161ebdfec3c8e3b52bf61c4f3550a1eea4f9579d10dc1b936f3171ebdcd6c443" dependencies = [ - "parity-scale-codec 1.3.7", + "parity-scale-codec 2.3.1", ] [[package]] name = "impl-codec" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "161ebdfec3c8e3b52bf61c4f3550a1eea4f9579d10dc1b936f3171ebdcd6c443" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ - "parity-scale-codec 2.3.1", + "parity-scale-codec 3.6.4", ] [[package]] @@ -3125,6 +3107,15 @@ dependencies = [ "serde", ] +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + [[package]] name = "impl-trait-for-tuples" version = "0.2.2" @@ -3286,35 +3277,9 @@ dependencies = [ [[package]] name = "jsonrpc-core" -version = "14.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0747307121ffb9703afd93afbd0fb4f854c38fb873f2c8b90e0e902f27c7b62" -dependencies = [ - "futures 0.1.31", - "log", - "serde", - "serde_derive", - "serde_json", -] - -[[package]] -name = "jsonrpc-core" -version = "16.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a47c4c3ac843f9a4238943f97620619033dadef4b378cd1e8addd170de396b3" -dependencies = [ - "futures 0.3.28", - "log", - "serde", - "serde_derive", - "serde_json", -] - -[[package]] -name = "jsonrpc-core" -version = "17.1.0" +version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4467ab6dfa369b69e52bd0692e480c4d117410538526a57a304a0f2250fd95e" +checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" dependencies = [ "futures 0.3.28", "futures-executor", @@ -3355,6 +3320,9 @@ name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin 0.5.2", +] [[package]] name = "lazycell" @@ -3456,7 +3424,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a42526bb432bcd1b43571d5f163984effa25409a29f1a3242a54d0577d55bcf" dependencies = [ - "darling 0.10.2", + "darling", "proc-macro2", "quote", "syn 1.0.109", @@ -3500,31 +3468,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" -[[package]] -name = "matchers" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" -dependencies = [ - "regex-automata 0.1.10", -] - [[package]] name = "matches" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" -[[package]] -name = "mathru" -version = "0.6.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7584d97fddf282cc3e5cc6fae54e596cfcd708a3b375633294d9db8e8b6d776" -dependencies = [ - "rand 0.7.3", - "serde", -] - [[package]] name = "maybe-uninit" version = "2.0.0" @@ -3582,17 +3531,6 @@ dependencies = [ "metrics-core", ] -[[package]] -name = "metrics" -version = "0.13.0-alpha.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f059a62fe88c33ee501116c762d8d1da5a69b8ea33a938ac6918af9b135b56a" -dependencies = [ - "metrics-macros 0.1.0-alpha.5", - "once_cell", - "proc-macro-hack", -] - [[package]] name = "metrics" version = "0.16.0" @@ -3644,12 +3582,11 @@ dependencies = [ [[package]] name = "metrics-macros" -version = "0.1.0-alpha.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64523162f5087a5268890e572caedb44c060f37252497fa144f4d91fe517e777" +checksum = "0daa0ab3a0ae956d0e2c1f42511422850e577d36a255357d1a7d08d45ee3a2f1" dependencies = [ "lazy_static", - "proc-macro-hack", "proc-macro2", "quote", "regex", @@ -3658,22 +3595,9 @@ dependencies = [ [[package]] name = "metrics-macros" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0daa0ab3a0ae956d0e2c1f42511422850e577d36a255357d1a7d08d45ee3a2f1" -dependencies = [ - "lazy_static", - "proc-macro2", - "quote", - "regex", - "syn 1.0.109", -] - -[[package]] -name = "metrics-macros" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49e30813093f757be5cf21e50389a24dc7dbb22c49f23b7e8f51d69b508a5ffa" +checksum = "49e30813093f757be5cf21e50389a24dc7dbb22c49f23b7e8f51d69b508a5ffa" dependencies = [ "proc-macro2", "quote", @@ -3743,7 +3667,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "277619f040719a5a23d75724586d5601286e8fa53451cfaaca3b8c627c2c2378" dependencies = [ - "crossbeam-epoch 0.8.2", + "crossbeam-epoch", "serde", ] @@ -3784,6 +3708,12 @@ dependencies = [ "unicase", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.5.4" @@ -3815,7 +3745,7 @@ dependencies = [ "kernel32-sys", "libc", "log", - "miow 0.2.2", + "miow", "net2", "slab", "winapi 0.2.8", @@ -3845,29 +3775,6 @@ dependencies = [ "slab", ] -[[package]] -name = "mio-named-pipes" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0840c1c50fd55e521b247f949c241c9997709f23bd7f023b9762cd561e935656" -dependencies = [ - "log", - "mio 0.6.23", - "miow 0.3.7", - "winapi 0.3.9", -] - -[[package]] -name = "mio-uds" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" -dependencies = [ - "iovec", - "libc", - "mio 0.6.23", -] - [[package]] name = "miow" version = "0.2.2" @@ -3880,15 +3787,6 @@ dependencies = [ "ws2_32-sys", ] -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "multimap" version = "0.8.3" @@ -4028,16 +3926,20 @@ dependencies = [ ] [[package]] -name = "nodrop" -version = "0.1.14" +name = "nom" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +checksum = "cf51a729ecf40266a2368ad335a5fdde43471f545a967109cd62146ecf8b66ff" [[package]] name = "nom" -version = "2.2.1" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf51a729ecf40266a2368ad335a5fdde43471f545a967109cd62146ecf8b66ff" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] [[package]] name = "nonzero_ext" @@ -4069,20 +3971,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "num" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7a8e9be5e039e2ff869df49155f1c06bd01ade2117ec783e56ab0932b67a8f" -dependencies = [ - "num-bigint 0.3.3", - "num-complex 0.3.1", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - [[package]] name = "num-bigint" version = "0.2.6" @@ -4107,34 +3995,20 @@ dependencies = [ ] [[package]] -name = "num-bigint" -version = "0.4.3" +name = "num-bigint-dig" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" dependencies = [ - "autocfg 1.1.0", + "byteorder", + "lazy_static", + "libm", "num-integer", + "num-iter", "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" -dependencies = [ - "autocfg 1.1.0", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "747d632c0c558b87dbabbe6a82f3b4ae03720d0646ac5b7b4dae89394be5f2c5" -dependencies = [ - "num-traits", - "serde", + "rand 0.8.5", + "smallvec", + "zeroize", ] [[package]] @@ -4169,19 +4043,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-rational" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" -dependencies = [ - "autocfg 1.1.0", - "num-bigint 0.3.3", - "num-integer", - "num-traits", - "serde", -] - [[package]] name = "num-traits" version = "0.2.16" @@ -4217,7 +4078,7 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -4329,18 +4190,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "pairing_ce" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e753515675eaaa98071d814bea0148ae8c9d7995fa0531bf222e7857e3f1759" -dependencies = [ - "byteorder", - "cfg-if 1.0.0", - "ff_ce", - "rand 0.4.6", -] - [[package]] name = "parity-crypto" version = "0.8.0" @@ -4351,43 +4200,41 @@ dependencies = [ "aes-ctr", "block-modes", "digest 0.9.0", - "ethereum-types 0.11.0", "hmac 0.10.1", - "lazy_static", "pbkdf2", "ripemd160", - "rustc-hex", "scrypt", - "secp256k1 0.20.3", "sha2 0.9.9", "subtle", - "tiny-keccak 2.0.2", + "tiny-keccak", "zeroize", ] [[package]] name = "parity-scale-codec" -version = "1.3.7" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b26b16c7687c3075982af47719e481815df30bc544f7a6690763a25ca16e9d" +checksum = "373b1a4c1338d9cd3d1fa53b3a11bdab5ab6bd80a20f7f7becd76953ae2be909" dependencies = [ - "arrayvec 0.5.2", - "bitvec 0.17.4", - "byte-slice-cast 0.3.5", + "arrayvec 0.7.4", + "bitvec 0.20.4", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive 2.3.1", "serde", ] [[package]] name = "parity-scale-codec" -version = "2.3.1" +version = "3.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373b1a4c1338d9cd3d1fa53b3a11bdab5ab6bd80a20f7f7becd76953ae2be909" +checksum = "dd8e946cc0cc711189c0b0249fb8b599cbeeab9784d83c415719368bb8d4ac64" dependencies = [ "arrayvec 0.7.4", - "bitvec 0.20.4", - "byte-slice-cast 1.2.2", + "bitvec 1.0.1", + "byte-slice-cast", "impl-trait-for-tuples", - "parity-scale-codec-derive", + "parity-scale-codec-derive 3.6.4", "serde", ] @@ -4397,7 +4244,19 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1557010476e0595c9b568d16dcfb81b93cdeb157612726f5170d31aa707bed27" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a296c3079b5fefbc499e1de58dc26c09b1b9a5952d26694ee89f04a43ebbb3e" +dependencies = [ + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -4494,7 +4353,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3b8c0d71734018084da0c0354193a5edfb81b20d2d57a92c5b154aefc554a4a" dependencies = [ "base64 0.13.1", - "crypto-mac 0.10.1", + "crypto-mac", "hmac 0.10.1", "rand 0.7.3", "rand_core 0.5.1", @@ -4502,6 +4361,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -4597,30 +4465,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "pkg-config" -version = "0.3.27" +name = "pkcs1" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] [[package]] -name = "poseidon_hash" -version = "0.0.1" -source = "git+https://github.com/shamatar/poseidon_hash.git#495ae87ff066d066b140c7d0dff8d929b87d31ee" +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "alga", - "approx", - "blake2-rfc_bellman_edition", - "byteorder", - "mathru", - "num-bigint 0.2.6", - "num-integer", - "num-traits", - "pairing_ce", - "rand 0.4.6", - "sha2 0.8.2", - "tiny-keccak 1.5.0", + "der", + "spki", ] +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -4695,30 +4565,39 @@ dependencies = [ [[package]] name = "primitive-types" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3824ae2c5e27160113b9e029a10ec9e3f0237bad8029f69c7724393c9fdefd8" +checksum = "06345ee39fbccfb06ab45f3a1a5798d9dafa04cb8921a76d227040003a234b0e" dependencies = [ - "fixed-hash", - "impl-codec 0.4.2", + "fixed-hash 0.7.0", + "impl-codec 0.5.1", "impl-rlp", - "impl-serde", + "impl-serde 0.3.2", "uint 0.9.5", ] [[package]] name = "primitive-types" -version = "0.9.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06345ee39fbccfb06ab45f3a1a5798d9dafa04cb8921a76d227040003a234b0e" +checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" dependencies = [ - "fixed-hash", - "impl-codec 0.5.1", + "fixed-hash 0.8.0", + "impl-codec 0.6.0", "impl-rlp", - "impl-serde", + "impl-serde 0.4.0", "uint 0.9.5", ] +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -4883,6 +4762,26 @@ dependencies = [ "prost 0.10.4", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "quanta" version = "0.3.2" @@ -4942,15 +4841,15 @@ dependencies = [ [[package]] name = "radium" -version = "0.3.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" [[package]] name = "radium" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "radix_trie" @@ -5171,28 +5070,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "rayon" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" -dependencies = [ - "crossbeam-channel 0.5.8", - "crossbeam-deque 0.8.3", - "crossbeam-utils 0.8.16", - "num_cpus", -] - [[package]] name = "rdrand" version = "0.4.0" @@ -5202,17 +5079,6 @@ dependencies = [ "rand_core 0.3.1", ] -[[package]] -name = "recursive_aggregation_circuit" -version = "1.0.0" -source = "git+https://github.com/matter-labs/recursive_aggregation_circuit.git?branch=master#63c954be7f755d235965a9e0e668813bfd2330eb" -dependencies = [ - "franklin-crypto", - "hex", - "once_cell", - "sha2 0.9.9", -] - [[package]] name = "redox_syscall" version = "0.1.57" @@ -5256,17 +5122,8 @@ checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.6", - "regex-syntax 0.7.4", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] @@ -5277,15 +5134,9 @@ checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.4", + "regex-syntax", ] -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.7.4" @@ -5302,39 +5153,12 @@ dependencies = [ ] [[package]] -name = "reqwest" -version = "0.10.10" +name = "rend" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0718f81a8e14c4dbb3b34cf23dc6aaf9ab8a0dfec160c534b3dbca1aaa21f47c" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" dependencies = [ - "base64 0.13.1", - "bytes 0.5.6", - "encoding_rs", - "futures-core", - "futures-util", - "http", - "http-body 0.3.1", - "hyper 0.13.10", - "hyper-tls 0.4.3", - "ipnet", - "js-sys", - "lazy_static", - "log", - "mime", - "mime_guess", - "native-tls", - "percent-encoding", - "pin-project-lite 0.2.12", - "serde", - "serde_json", - "serde_urlencoded", - "tokio 0.2.25", - "tokio-tls", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg 0.7.0", + "bytecheck", ] [[package]] @@ -5352,7 +5176,8 @@ dependencies = [ "http", "http-body 0.4.5", "hyper 0.14.27", - "hyper-tls 0.5.0", + "hyper-rustls", + "hyper-tls", "ipnet", "js-sys", "log", @@ -5361,43 +5186,47 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite 0.2.12", + "rustls", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", "tokio 1.32.0", "tokio-native-tls", + "tokio-rustls", "tower-service", "trust-dns-resolver 0.22.0", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", + "webpki-roots", "winreg 0.10.1", ] [[package]] -name = "rescue_poseidon" -version = "0.3.0" -source = "git+https://github.com/matter-labs/rescue-poseidon.git?branch=stable#3415de1faa2cfa836f1ac059bf91b19af7c4c620" +name = "resolv-conf" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" dependencies = [ - "byteorder", - "franklin-crypto", - "num-bigint 0.3.3", - "num-integer", - "num-iter", - "num-traits", - "rand 0.4.6", - "sha3 0.9.1", + "hostname", + "quick-error", ] [[package]] -name = "resolv-conf" -version = "0.7.0" +name = "ring" +version = "0.16.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52e44394d2086d010551b14b53b1f24e31647570cd1deb0379e2c21b329aba00" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" dependencies = [ - "hostname", - "quick-error", + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted", + "web-sys", + "winapi 0.3.9", ] [[package]] @@ -5411,6 +5240,34 @@ dependencies = [ "opaque-debug 0.3.0", ] +[[package]] +name = "rkyv" +version = "0.7.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" +dependencies = [ + "bitvec 1.0.1", + "bytecheck", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid 1.4.1", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rlp" version = "0.5.2" @@ -5432,6 +5289,44 @@ dependencies = [ "winapi 0.2.8", ] +[[package]] +name = "rsa" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab43bb47d23c1a631b4b680199a45255dce26fa9ab2fa902581f624ff13e6a8" +dependencies = [ + "byteorder", + "const-oid", + "digest 0.10.7", + "num-bigint-dig", + "num-integer", + "num-iter", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature 2.1.0", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rust_decimal" +version = "1.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c4216490d5a413bc6d10fa4742bd7d4955941d062c0ef873141d6b0e7b30fd" +dependencies = [ + "arrayvec 0.7.4", + "borsh", + "bytes 1.4.0", + "num-traits", + "rand 0.8.5", + "rkyv", + "serde", + "serde_json", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -5444,12 +5339,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" -[[package]] -name = "rustc-serialize" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" - [[package]] name = "rustc_version" version = "0.2.3" @@ -5481,6 +5370,37 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "rustls" +version = "0.21.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +dependencies = [ + "base64 0.21.2", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.14" @@ -5648,6 +5568,22 @@ dependencies = [ "subtle", ] +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "secp256k1" version = "0.19.0" @@ -5665,10 +5601,18 @@ version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97d03ceae636d0fed5bae6a7f4f664354c5f4fcedf6eef053fef17e49f837d0a" dependencies = [ - "rand 0.6.5", "secp256k1-sys 0.4.2", ] +[[package]] +name = "secp256k1" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" +dependencies = [ + "secp256k1-sys 0.8.1", +] + [[package]] name = "secp256k1-sys" version = "0.3.0" @@ -5687,6 +5631,15 @@ dependencies = [ "cc", ] +[[package]] +name = "secp256k1-sys" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" +dependencies = [ + "cc", +] + [[package]] name = "security-framework" version = "2.9.2" @@ -5721,7 +5674,7 @@ dependencies = [ "log", "quick-xml", "regex", - "reqwest 0.11.18", + "reqwest", "semver 0.11.0", "serde_json", "tempfile", @@ -5770,86 +5723,6 @@ dependencies = [ "pest", ] -[[package]] -name = "sentry" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "933beb0343c84eefd69a368318e9291b179e09e51982d49c65d7b362b0e9466f" -dependencies = [ - "httpdate 0.3.2", - "reqwest 0.10.10", - "sentry-backtrace", - "sentry-contexts", - "sentry-core", - "sentry-panic", -] - -[[package]] -name = "sentry-backtrace" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e528fb457baf53fcd6c90beb420705f35c12c3d8caed8817dcf7be00eff7c7" -dependencies = [ - "backtrace", - "lazy_static", - "regex", - "sentry-core", -] - -[[package]] -name = "sentry-contexts" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce3a560a34cffac347f0b588fc29b31db969e27bf57208f946d6a2d588668b0b" -dependencies = [ - "hostname", - "lazy_static", - "libc", - "regex", - "rustc_version 0.2.3", - "sentry-core", - "uname", -] - -[[package]] -name = "sentry-core" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b8c235063c1007fd8e2fc7e35ce7eac09dd678d198ecc996daee33d46b3dcc" -dependencies = [ - "im", - "lazy_static", - "rand 0.7.3", - "sentry-types", - "serde", - "serde_json", -] - -[[package]] -name = "sentry-panic" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04ee338d8292fcdcfb032929c9f53bc0dfac8e0b9d3096be79ceee96818851ed" -dependencies = [ - "sentry-backtrace", - "sentry-core", -] - -[[package]] -name = "sentry-types" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbbea6debac0a24880a38239d4c2fc3dbb0b1b398f621bea03ed761796b7dfb" -dependencies = [ - "chrono", - "debugid", - "serde", - "serde_json", - "thiserror", - "url", - "uuid 0.8.2", -] - [[package]] name = "serde" version = "1.0.183" @@ -5935,28 +5808,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_with" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" -dependencies = [ - "serde", - "serde_with_macros", -] - -[[package]] -name = "serde_with_macros" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" -dependencies = [ - "darling 0.13.4", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "serde_yaml" version = "0.8.26" @@ -6173,15 +6024,6 @@ dependencies = [ "keccak", ] -[[package]] -name = "sharded-slab" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" -dependencies = [ - "lazy_static", -] - [[package]] name = "shared_child" version = "0.3.5" @@ -6256,6 +6098,22 @@ version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +[[package]] +name = "signature" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + [[package]] name = "sized-chunks" version = "0.6.5" @@ -6324,24 +6182,253 @@ dependencies = [ [[package]] name = "soketto" -version = "0.4.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5c71ed3d54db0a699f4948e1bb3e45b450fa31fe602621dee6680361d569c88" +checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" dependencies = [ - "base64 0.12.3", - "bytes 0.5.6", + "base64 0.13.1", + "bytes 1.4.0", "futures 0.3.28", "httparse", "log", - "rand 0.7.3", + "rand 0.8.5", "sha-1", ] [[package]] -name = "splitmut" +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api 0.4.10", +] + +[[package]] +name = "spki" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sqlformat" version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85070f382340e8b23a75808e83573ddf65f9ad9143df9573ca37c1ed2ee956a" +checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e" +dependencies = [ + "itertools 0.10.5", + "nom 7.1.3", + "unicode_categories", +] + +[[package]] +name = "sqlx" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e58421b6bc416714d5115a2ca953718f6c621a51b68e4f4922aea5a4391a721" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd4cef4251aabbae751a3710927945901ee1d97ee96d757f6880ebb9a79bfd53" +dependencies = [ + "ahash 0.8.3", + "atoi", + "byteorder", + "bytes 1.4.0", + "chrono", + "crc", + "crossbeam-queue 0.3.8", + "dotenvy", + "either", + "event-listener", + "futures-channel", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashlink", + "hex", + "indexmap 2.0.0", + "log", + "memchr", + "once_cell", + "paste", + "percent-encoding", + "serde", + "serde_json", + "sha2 0.10.7", + "smallvec", + "sqlformat", + "thiserror", + "tokio 1.32.0", + "tokio-stream", + "tracing", + "url", +] + +[[package]] +name = "sqlx-macros" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "208e3165167afd7f3881b16c1ef3f2af69fa75980897aac8874a0696516d12c2" +dependencies = [ + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 1.0.109", +] + +[[package]] +name = "sqlx-macros-core" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a4a8336d278c62231d87f24e8a7a74898156e34c1c18942857be2acb29c7dfc" +dependencies = [ + "dotenvy", + "either", + "heck 0.4.1", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2 0.10.7", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 1.0.109", + "tempfile", + "tokio 1.32.0", + "url", +] + +[[package]] +name = "sqlx-mysql" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca69bf415b93b60b80dc8fda3cb4ef52b2336614d8da2de5456cc942a110482" +dependencies = [ + "atoi", + "base64 0.21.2", + "bitflags 2.4.0", + "byteorder", + "bytes 1.4.0", + "chrono", + "crc", + "digest 0.10.7", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array 0.14.7", + "hex", + "hkdf", + "hmac 0.12.1", + "itoa 1.0.9", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand 0.8.5", + "rsa", + "serde", + "sha1", + "sha2 0.10.7", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-postgres" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0db2df1b8731c3651e204629dd55e52adbae0462fa1bdcbed56a2302c18181e" +dependencies = [ + "atoi", + "base64 0.21.2", + "bitflags 2.4.0", + "byteorder", + "chrono", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hkdf", + "hmac 0.12.1", + "home", + "itoa 1.0.9", + "log", + "md-5", + "memchr", + "once_cell", + "rand 0.8.5", + "serde", + "serde_json", + "sha1", + "sha2 0.10.7", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", +] + +[[package]] +name = "sqlx-sqlite" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be4c21bf34c7cae5b283efb3ac1bcc7670df7561124dc2f8bdc0b59be40f79a2" +dependencies = [ + "atoi", + "chrono", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "sqlx-core", + "tracing", + "url", +] [[package]] name = "static_assertions" @@ -6355,6 +6442,16 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" +[[package]] +name = "stringprep" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3737bde7edce97102e0e2b15365bf7a20bfdb5f60f4f9e8d7004258a51a8da" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "strip-ansi-escapes" version = "0.1.1" @@ -6376,12 +6473,6 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "structopt" version = "0.3.26" @@ -6667,16 +6758,6 @@ dependencies = [ "syn 2.0.29", ] -[[package]] -name = "thread_local" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" -dependencies = [ - "cfg-if 1.0.0", - "once_cell", -] - [[package]] name = "time" version = "0.1.45" @@ -6706,15 +6787,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" -[[package]] -name = "tiny-keccak" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d8a021c69bb74a44ccedb824a046447e2c84a01df9e5c20779750acb38e11b2" -dependencies = [ - "crunchy", -] - [[package]] name = "tiny-keccak" version = "2.0.2" @@ -6750,17 +6822,10 @@ dependencies = [ "futures-core", "iovec", "lazy_static", - "libc", "memchr", "mio 0.6.23", - "mio-named-pipes", - "mio-uds", - "num_cpus", "pin-project-lite 0.1.12", - "signal-hook-registry", "slab", - "tokio-macros 0.2.6", - "winapi 0.3.9", ] [[package]] @@ -6778,7 +6843,7 @@ dependencies = [ "pin-project-lite 0.2.12", "signal-hook-registry", "socket2 0.5.3", - "tokio-macros 2.1.0", + "tokio-macros", "windows-sys 0.48.0", ] @@ -6792,31 +6857,6 @@ dependencies = [ "tokio 1.32.0", ] -[[package]] -name = "tokio-compat-02" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d4237822b7be8fff0a7a27927462fad435dcb6650f95cea9e946bf6bdc7e07" -dependencies = [ - "bytes 0.5.6", - "once_cell", - "pin-project-lite 0.2.12", - "tokio 0.2.25", - "tokio 1.32.0", - "tokio-stream", -] - -[[package]] -name = "tokio-macros" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e44da00bfc73a25f814cd8d7e57a68a5c31b74b3152a0a1d1f590c97ed06265a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "tokio-macros" version = "2.1.0" @@ -6859,6 +6899,16 @@ dependencies = [ "tokio 1.32.0", ] +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio 1.32.0", +] + [[package]] name = "tokio-stream" version = "0.1.14" @@ -6886,16 +6936,6 @@ dependencies = [ "xattr", ] -[[package]] -name = "tokio-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343" -dependencies = [ - "native-tls", - "tokio 0.2.25", -] - [[package]] name = "tokio-util" version = "0.3.1" @@ -6910,21 +6950,6 @@ dependencies = [ "tokio 0.2.25", ] -[[package]] -name = "tokio-util" -version = "0.6.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" -dependencies = [ - "bytes 1.4.0", - "futures-core", - "futures-io", - "futures-sink", - "log", - "pin-project-lite 0.2.12", - "tokio 1.32.0", -] - [[package]] name = "tokio-util" version = "0.7.8" @@ -6933,7 +6958,10 @@ checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes 1.4.0", "futures-core", + "futures-io", "futures-sink", + "futures-util", + "hashbrown 0.12.3", "pin-project-lite 0.2.12", "tokio 1.32.0", "tracing", @@ -7002,7 +7030,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", - "valuable", ] [[package]] @@ -7015,49 +7042,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tracing-log" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" -dependencies = [ - "lazy_static", - "log", - "tracing-core", -] - -[[package]] -name = "tracing-serde" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" -dependencies = [ - "serde", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "ansi_term", - "chrono", - "lazy_static", - "matchers", - "regex", - "serde", - "serde_json", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", - "tracing-serde", -] - [[package]] name = "trust-dns-proto" version = "0.21.2" @@ -7155,19 +7139,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" -[[package]] -name = "typed-headers" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3179a61e9eccceead5f1574fd173cf2e162ac42638b9bf214c6ad0baf7efa24a" -dependencies = [ - "base64 0.11.0", - "bytes 0.5.6", - "chrono", - "http", - "mime", -] - [[package]] name = "typenum" version = "1.16.0" @@ -7203,15 +7174,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "uname" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b72f89f0ca32e4db1c04e2a72f5345d59796d4866a1ee0609084569f73683dc8" -dependencies = [ - "libc", -] - [[package]] name = "unicase" version = "2.6.0" @@ -7266,6 +7228,12 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + [[package]] name = "url" version = "2.4.0" @@ -7306,14 +7274,9 @@ version = "1.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" dependencies = [ - "getrandom 0.2.10", -] - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + "getrandom 0.2.10", + "serde", +] [[package]] name = "vcpkg" @@ -7344,16 +7307,6 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "vlog" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "sentry", - "tracing", - "tracing-subscriber", -] - [[package]] name = "vte" version = "0.10.1" @@ -7428,8 +7381,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if 1.0.0", - "serde", - "serde_json", "wasm-bindgen-macro", ] @@ -7501,67 +7452,35 @@ dependencies = [ [[package]] name = "web3" -version = "0.15.0" -source = "git+https://github.com/golemfactory/rust-web3?branch=update_ethabi#fe462bde01957d8161a144e9fc3e38cf1949eabc" -dependencies = [ - "arrayvec 0.5.2", - "async-native-tls", - "base64 0.13.1", - "derive_more", - "ethabi", - "ethereum-types 0.11.0", - "futures 0.3.28", - "futures-timer", - "hex", - "hyper 0.13.10", - "hyper-proxy", - "hyper-tls 0.4.3", - "jsonrpc-core 16.0.0", - "log", - "native-tls", - "parking_lot 0.11.2", - "pin-project 1.1.3", - "rlp", - "secp256k1 0.20.3", - "serde", - "serde_json", - "soketto", - "tiny-keccak 2.0.2", - "tokio 0.2.25", - "tokio-util 0.6.10", - "typed-headers", - "url", -] - -[[package]] -name = "web3" -version = "0.16.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc4c18ae15621f764fab919f7e4a83d87163494cbc3460884debef7c6bc1bc6b" +checksum = "5388522c899d1e1c96a4c307e3797e0f697ba7c77dd8e0e625ecba9dd0342937" dependencies = [ - "arrayvec 0.5.2", - "base64 0.13.1", + "arrayvec 0.7.4", + "base64 0.21.2", "bytes 1.4.0", "derive_more", "ethabi", - "ethereum-types 0.11.0", + "ethereum-types 0.14.1", "futures 0.3.28", "futures-timer", "headers", "hex", - "jsonrpc-core 17.1.0", + "idna 0.4.0", + "jsonrpc-core", "log", - "parking_lot 0.11.2", + "once_cell", + "parking_lot 0.12.1", "pin-project 1.1.3", - "reqwest 0.11.18", + "reqwest", "rlp", - "secp256k1 0.20.3", + "secp256k1 0.27.0", "serde", "serde_json", "soketto", - "tiny-keccak 2.0.2", + "tiny-keccak", "tokio 1.32.0", - "tokio-util 0.6.10", + "tokio-util 0.7.8", "url", "web3-async-native-tls", ] @@ -7578,6 +7497,25 @@ dependencies = [ "url", ] +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +dependencies = [ + "webpki", +] + [[package]] name = "which" version = "4.4.0" @@ -7589,6 +7527,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "whoami" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" + [[package]] name = "widestring" version = "1.0.2" @@ -7788,15 +7732,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "winreg" version = "0.10.1" @@ -7832,6 +7767,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "xattr" version = "1.0.1" @@ -8041,9 +7985,52 @@ dependencies = [ "derive_more", "dotenv", "env_logger 0.7.1", + "erc20_payment_lib", "ethabi", "ethereum-tx-sign", - "ethereum-types 0.11.0", + "ethereum-types 0.14.1", + "futures 0.3.28", + "hex", + "lazy_static", + "log", + "maplit", + "num-bigint 0.3.3", + "num-traits", + "rlp", + "serde", + "serde_json", + "sha3 0.8.2", + "structopt", + "thiserror", + "tiny-keccak", + "tokio 1.32.0", + "uuid 0.8.2", + "web3", + "ya-client-model", + "ya-payment-driver", + "ya-service-api-interfaces", + "ya-utils-futures", + "ya-utils-networking", +] + +[[package]] +name = "ya-erc20next-driver" +version = "0.4.0" +dependencies = [ + "actix-rt", + "anyhow", + "async-trait", + "awc", + "bigdecimal 0.2.2", + "chrono", + "derive_more", + "dotenv", + "env_logger 0.7.1", + "erc20_payment_lib", + "ethabi", + "ethereum-tx-sign", + "ethereum-types 0.14.1", + "ethsign", "futures 0.3.28", "hex", "lazy_static", @@ -8057,10 +8044,11 @@ dependencies = [ "sha3 0.8.2", "structopt", "thiserror", - "tiny-keccak 2.0.2", + "tiny-keccak", "tokio 1.32.0", + "tokio-util 0.7.8", "uuid 0.8.2", - "web3 0.16.0", + "web3", "ya-client-model", "ya-payment-driver", "ya-service-api-interfaces", @@ -8096,7 +8084,7 @@ dependencies = [ "openssl", "rand 0.6.5", "regex", - "reqwest 0.11.18", + "reqwest", "rustyline 7.1.0", "secp256k1 0.19.0", "serde", @@ -8346,7 +8334,7 @@ dependencies = [ "chrono", "env_logger 0.7.1", "log", - "nom", + "nom 2.2.1", "regex", "semver 0.11.0", "serde_json", @@ -8454,6 +8442,7 @@ dependencies = [ "diesel_migrations", "dotenv", "env_logger 0.7.1", + "erc20_payment_lib", "ethsign", "futures 0.3.28", "hex", @@ -8478,6 +8467,7 @@ dependencies = [ "ya-core-model", "ya-dummy-driver", "ya-erc20-driver", + "ya-erc20next-driver", "ya-metrics", "ya-net", "ya-persistence", @@ -8486,7 +8476,6 @@ dependencies = [ "ya-service-api-interfaces", "ya-service-api-web", "ya-service-bus", - "ya-zksync-driver", ] [[package]] @@ -8500,7 +8489,7 @@ dependencies = [ "chrono", "diesel", "diesel_migrations", - "ethereum-types 0.11.0", + "ethereum-types 0.14.1", "ethsign", "futures 0.3.28", "hex", @@ -9120,43 +9109,6 @@ dependencies = [ "ya-utils-networking", ] -[[package]] -name = "ya-zksync-driver" -version = "0.3.0" -dependencies = [ - "actix-rt", - "anyhow", - "async-trait", - "awc", - "bigdecimal 0.2.2", - "chrono", - "dotenv", - "env_logger 0.7.1", - "ethereum-types 0.10.0", - "futures 0.3.28", - "hex", - "lazy_static", - "log", - "maplit", - "metrics-macros 0.1.0-alpha.5", - "num-bigint 0.3.3", - "rlp", - "serde", - "serde_json", - "structopt", - "tiny-keccak 1.5.0", - "tokio 1.32.0", - "tokio-compat-02", - "uuid 0.8.2", - "ya-client-model", - "ya-payment-driver", - "ya-service-api-interfaces", - "ya-utils-futures", - "ya-utils-networking", - "zksync", - "zksync_eth_signer", -] - [[package]] name = "yagna" version = "0.12.2" @@ -9171,6 +9123,7 @@ dependencies = [ "futures 0.3.28", "gftp", "lazy_static", + "libsqlite3-sys", "log", "metrics 0.12.1", "openssl", @@ -9189,6 +9142,7 @@ dependencies = [ "ya-core-model", "ya-dummy-driver", "ya-erc20-driver", + "ya-erc20next-driver", "ya-fd-metrics", "ya-file-logging", "ya-gsb-api", @@ -9214,7 +9168,6 @@ dependencies = [ "ya-utils-process", "ya-version", "ya-vpn", - "ya-zksync-driver", ] [[package]] @@ -9234,9 +9187,9 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "zeroize" -version = "1.3.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" dependencies = [ "zeroize_derive", ] @@ -9268,165 +9221,6 @@ dependencies = [ "tokio-byteorder", ] -[[package]] -name = "zksync" -version = "0.3.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "async-trait", - "ethabi", - "jsonrpc-core 14.2.0", - "num", - "reqwest 0.10.10", - "serde", - "serde_json", - "sha2 0.8.2", - "thiserror", - "tokio 0.2.25", - "web3 0.15.0", - "zksync_config", - "zksync_crypto", - "zksync_eth_client", - "zksync_eth_signer", - "zksync_types", - "zksync_utils", -] - -[[package]] -name = "zksync_basic_types" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "serde", - "web3 0.15.0", -] - -[[package]] -name = "zksync_config" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "chrono", - "envy", - "num", - "reqwest 0.10.10", - "serde", - "serde_json", - "toml", - "tracing", - "url", - "zksync_crypto", - "zksync_types", - "zksync_utils", -] - -[[package]] -name = "zksync_contracts" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "ethabi", - "serde_json", -] - -[[package]] -name = "zksync_crypto" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "base64 0.13.1", - "ethabi", - "fnv", - "franklin-crypto", - "hex", - "lazy_static", - "num", - "rand 0.4.6", - "rayon", - "recursive_aggregation_circuit", - "rescue_poseidon", - "serde", - "thiserror", - "zksync_basic_types", -] - -[[package]] -name = "zksync_eth_client" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "anyhow", - "ethabi", - "hex", - "metrics 0.13.0-alpha.8", - "parity-crypto", - "serde", - "tokio 0.2.25", - "vlog", - "web3 0.15.0", - "zksync_config", - "zksync_contracts", - "zksync_eth_signer", - "zksync_types", -] - -[[package]] -name = "zksync_eth_signer" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "async-trait", - "hex", - "jsonrpc-core 14.2.0", - "parity-crypto", - "reqwest 0.10.10", - "rlp", - "serde", - "serde_derive", - "serde_json", - "thiserror", - "zksync_types", -] - -[[package]] -name = "zksync_types" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "bigdecimal 0.2.2", - "chrono", - "ethabi", - "hex", - "itertools 0.9.0", - "num", - "once_cell", - "parity-crypto", - "serde", - "serde_json", - "serde_with", - "thiserror", - "tiny-keccak 1.5.0", - "vlog", - "zksync_basic_types", - "zksync_crypto", - "zksync_utils", -] - -[[package]] -name = "zksync_utils" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "anyhow", - "bigdecimal 0.2.2", - "futures 0.3.28", - "hex", - "num", - "serde", - "serde_json", - "tokio 0.2.25", -] - [[package]] name = "zstd" version = "0.12.4" diff --git a/Cargo.toml b/Cargo.toml index 2e7249ab87..a4affa9699 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,11 +10,11 @@ license = "GPL-3.0" edition = "2018" [features] -default = ['erc20-driver', 'zksync-driver', 'gftp/bin'] +default = ['erc20-driver', 'erc20next-driver', 'gftp/bin'] static-openssl = ["openssl/vendored", "openssl-probe"] dummy-driver = ['ya-dummy-driver'] erc20-driver = ['ya-erc20-driver'] -zksync-driver = ['ya-zksync-driver'] +erc20next-driver = ['ya-erc20next-driver'] tos = [] framework-test = [] # Temporary to make goth integration tests work @@ -23,13 +23,21 @@ packet-trace-enable = [ "ya-vpn/packet-trace-enable", "ya-file-logging/packet-trace-enable", "ya-net/packet-trace-enable", - "ya-service-bus/packet-trace-enable" + "ya-service-bus/packet-trace-enable", ] [[bin]] name = "yagna" path = "core/serv/src/main.rs" +[workspace.dependencies] +# this entry is needed to make sqlx version >=0.5.9 work with diesel 1.4.* +# diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 +# sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible +libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } +erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } +#erc20_payment_lib = { version = "=0.1.9" } + [dependencies] ya-activity = "0.4" ya-compile-time-utils = "0.2" @@ -38,7 +46,7 @@ ya-dummy-driver = { version = "0.3", optional = true } ya-file-logging = "0.1" ya-gsb-api = "0.1" ya-erc20-driver = { version = "0.4", optional = true } -ya-zksync-driver = { version = "0.3", optional = true } +ya-erc20next-driver = { version = "0.4", optional = true } ya-identity = "0.3" ya-market = "0.4" ya-metrics = "0.2" @@ -86,6 +94,8 @@ tokio = { version = "1", features = ["net"] } tokio-util = { version = "0.7", features = ["codec"] } tokio-stream = { version = "0.1.8", features = ["io-util"] } url = "2.1.1" +libsqlite3-sys = { workspace = true } + [dev-dependencies] ya-test-framework = "0.1" @@ -167,8 +177,6 @@ assets = [ "644", ], ] -[workspace.dependencies] -libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } [workspace] members = [ @@ -185,7 +193,7 @@ members = [ "core/payment-driver/base", "core/payment-driver/dummy", "core/payment-driver/erc20", - "core/payment-driver/zksync", + "core/payment-driver/erc20next", "core/persistence", "core/serv-api", "core/serv-api/derive", @@ -216,7 +224,7 @@ members = [ "utils/fd-metrics", "core/metrics", "test-utils/test-framework", - "test-utils/test-framework/framework-macro" + "test-utils/test-framework/framework-macro", ] [patch.crates-io] @@ -231,7 +239,7 @@ ya-payment = { path = "core/payment" } ya-payment-driver = { path = "core/payment-driver/base" } ya-dummy-driver = { path = "core/payment-driver/dummy" } ya-erc20-driver = { path = "core/payment-driver/erc20" } -ya-zksync-driver = { path = "core/payment-driver/zksync" } +ya-erc20next-driver = { path = "core/payment-driver/erc20next" } ya-version = { path = "core/version" } ya-vpn = { path = "core/vpn" } ya-gsb-api = { path = "core/gsb-api" } @@ -245,10 +253,10 @@ ya-service-api-interfaces = { path = "core/serv-api/interfaces" } ya-service-api-web = { path = "core/serv-api/web" } ## SERVICE BUS -ya-service-bus = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = "190f0d772f7ed0830d54a2cef77d7a177f276c68"} -ya-sb-proto = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = "190f0d772f7ed0830d54a2cef77d7a177f276c68"} -ya-sb-router = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = "190f0d772f7ed0830d54a2cef77d7a177f276c68"} -ya-sb-util = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = "190f0d772f7ed0830d54a2cef77d7a177f276c68"} +ya-service-bus = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = "190f0d772f7ed0830d54a2cef77d7a177f276c68" } +ya-sb-proto = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = "190f0d772f7ed0830d54a2cef77d7a177f276c68" } +ya-sb-router = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = "190f0d772f7ed0830d54a2cef77d7a177f276c68" } +ya-sb-util = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = "190f0d772f7ed0830d54a2cef77d7a177f276c68" } #ya-service-bus = { path = "../ya-service-bus" } #ya-sb-proto = { path = "../ya-service-bus/crates/proto" } @@ -290,9 +298,8 @@ ya-framework-macro = { path = "test-utils/test-framework/framework-macro" } ethereum-tx-sign = { git = "https://github.com/mfranciszkiewicz/ethereum-tx-sign.git", rev = "1164c74187a9e2947faeaea7dde104c3cdec4195" } graphene-sgx = { git = " https://github.com/golemfactory/graphene-rust.git", rev = "dbd993ebad7f9190410ea390a589348479af6407" } -web3 = { git = "https://github.com/golemfactory/rust-web3", branch = "update_ethabi" } -diesel = { git = "https://github.com/golemfactory/yagna-diesel-patch.git", rev = "a512c66d520a9066dd9a4d1416f9109019b39563"} +diesel = { git = "https://github.com/golemfactory/yagna-diesel-patch.git", rev = "a512c66d520a9066dd9a4d1416f9109019b39563" } # Speed up builds on macOS (will be default in next rust version probably) # https://jakedeichert.com/blog/reducing-rust-incremental-compilation-times-on-macos-by-70-percent/ diff --git a/core/model/src/payment.rs b/core/model/src/payment.rs index 0e6bc7f45b..6f5266c857 100644 --- a/core/model/src/payment.rs +++ b/core/model/src/payment.rs @@ -458,6 +458,8 @@ pub mod local { Polygon, #[strum(props(token = "tGLM"))] Mumbai, + #[strum(props(token = "tGLM"))] + Yatestnet, } /// Experimental. In future releases this might change or be removed. @@ -479,6 +481,7 @@ pub mod local { pub enum DriverName { ZkSync, Erc20, + Erc20legacy, } #[derive(StructOpt, Debug, Clone)] diff --git a/core/payment-driver/base/Cargo.toml b/core/payment-driver/base/Cargo.toml index ae3cd4d437..25fcf53c2f 100644 --- a/core/payment-driver/base/Cargo.toml +++ b/core/payment-driver/base/Cargo.toml @@ -15,7 +15,7 @@ bigdecimal = { version = "0.2" } chrono = { version = "0.4", features = ["serde"] } diesel = { version = "1.4", features = ["sqlite", "r2d2", "chrono"] } diesel_migrations = "1.4" -ethereum-types = "0.11" +ethereum-types = "0.14.1" ethsign = "0.8" futures = "0.3" hex = "0.4" @@ -30,7 +30,11 @@ tokio = { version = "1", features = ["macros"] } ## yagna dependencies ya-client-model = "0.5" -ya-core-model = { version = "^0.9", features = ["driver", "identity", "payment"] } +ya-core-model = { version = "^0.9", features = [ + "driver", + "identity", + "payment", +] } ya-persistence = "0.3" ya-service-bus = "0.6.1" diff --git a/core/payment-driver/base/src/bus.rs b/core/payment-driver/base/src/bus.rs index 092625f7dc..c6cb111bf4 100644 --- a/core/payment-driver/base/src/bus.rs +++ b/core/payment-driver/base/src/bus.rs @@ -155,6 +155,16 @@ pub async fn sign(node_id: NodeId, payload: Vec) -> Result, GenericE Ok(signature) } +pub async fn get_pubkey(node_id: NodeId) -> Result, GenericError> { + let pubkey = service(identity::BUS_ID) + .send(identity::GetPubKey(node_id)) + .await + .map_err(GenericError::new)? + .map_err(GenericError::new)?; + + Ok(pubkey) +} + pub async fn notify_payment( driver_name: &str, platform: &str, diff --git a/core/payment-driver/base/src/db/models.rs b/core/payment-driver/base/src/db/models.rs index fffa65c363..fdb29cb963 100644 --- a/core/payment-driver/base/src/db/models.rs +++ b/core/payment-driver/base/src/db/models.rs @@ -105,6 +105,7 @@ pub enum Network { #[default] Goerli = 5, //Goerli is another Ethereum testnet Mumbai = 80001, //Mumbai is testnet for Polygon network + Yatestnet = 987789, //Yatestnet is Golem internal testnet Polygon = 137, //Polygon is Polygon production network } @@ -118,6 +119,7 @@ impl FromStr for Network { "goerli" => Ok(Network::Goerli), "polygon" => Ok(Network::Polygon), "mumbai" => Ok(Network::Mumbai), + "yatestnet" => Ok(Network::Yatestnet), _ => Err(DbError::InvalidData(format!("Invalid network: {}", s))), } } @@ -130,6 +132,7 @@ impl Display for Network { Network::Rinkeby => f.write_str("rinkeby"), Network::Goerli => f.write_str("goerli"), Network::Mumbai => f.write_str("mumbai"), + Network::Yatestnet => f.write_str("yatestnet"), Network::Polygon => f.write_str("polygon"), } } diff --git a/core/payment-driver/erc20/Cargo.toml b/core/payment-driver/erc20/Cargo.toml index 514e5872f6..d5bedf0313 100644 --- a/core/payment-driver/erc20/Cargo.toml +++ b/core/payment-driver/erc20/Cargo.toml @@ -14,8 +14,8 @@ awc = { version = "3", features = ["openssl"] } bigdecimal = { version = "0.2" } chrono = { version = "0.4", features = ["serde"] } derive_more = "0.99" -ethabi = "14.1" -ethereum-types = "0.11" +ethabi = "18.0" +ethereum-types = "0.14.1" ethereum-tx-sign = "3.1" futures = "0.3" hex = "0.4" @@ -32,7 +32,11 @@ thiserror = "1.0" tiny-keccak = { version = "2.0", features = ["keccak"] } tokio = { version = "1", features = ["full"] } uuid = { version = "0.8", features = ["v4"] } -web3 = { version = "0.16", default-features = false, features = [ "http-tls", "signing", "ws-tls-tokio" ] } +web3 = { version = "0.19.0", default-features = false, features = [ + "http-tls", + "signing", + "ws-tls-tokio", +] } ## yagna dependencies ya-payment-driver = "0.3" @@ -40,6 +44,7 @@ ya-client-model = "0.5" ya-service-api-interfaces = "0.2" ya-utils-futures = "0.2" ya-utils-networking = "0.2" +erc20_payment_lib = { workspace = true } [dev-dependencies] actix-rt = "2.7" diff --git a/core/payment-driver/erc20/src/driver/cli.rs b/core/payment-driver/erc20/src/driver/cli.rs index 59ecbd8ba3..f7b2312e89 100644 --- a/core/payment-driver/erc20/src/driver/cli.rs +++ b/core/payment-driver/erc20/src/driver/cli.rs @@ -70,6 +70,13 @@ pub async fn fund(dao: &Erc20Dao, msg: Fund) -> Result { .map_err(GenericError::new)??; format!("Received funds from the faucet. address=0x{:x}", &address) } + Network::Yatestnet => format!( + r#"Your Yatestnet address is {}. + +TODO - add faucet +"#, + address + ), Network::Mumbai => format!( r#"Your Mumbai Polygon address is {}. @@ -145,6 +152,7 @@ pub async fn transfer(dao: &Erc20Dao, msg: Transfer) -> Result "https://rinkeby.etherscan.io/tx/", Network::Goerli => "https://goerli.etherscan.io/tx/", Network::Mumbai => "https://mumbai.polygonscan.com/tx/", + Network::Yatestnet => "https://yatestnet.org:4000/tx/", }; let message = format!("Follow your transaction: {}0x{:x}", endpoint, tx_id); diff --git a/core/payment-driver/erc20/src/erc20/config.rs b/core/payment-driver/erc20/src/erc20/config.rs index c6b36aee96..0e62210def 100644 --- a/core/payment-driver/erc20/src/erc20/config.rs +++ b/core/payment-driver/erc20/src/erc20/config.rs @@ -88,6 +88,20 @@ lazy_static! { } } }; + pub static ref YATESTNET_CONFIG: EnvConfiguration = EnvConfiguration { + glm_contract_address: utils::str_to_addr( + &env::var("YATESTNET_TGLM_CONTRACT_ADDRESS") + .unwrap_or_else(|_| "0x3b80bF85867eE9b079322802A734c074e093328E".to_string()) + ) + .unwrap(), + glm_faucet_address: None, + required_confirmations: { + match env::var("YATESTNET_REQUIRED_CONFIRMATIONS").map(|s| s.parse()) { + Ok(Ok(x)) => x, + _ => 3, + } + } + }; pub static ref POLYGON_MAINNET_CONFIG: EnvConfiguration = EnvConfiguration { glm_contract_address: utils::str_to_addr( &env::var("POLYGON_GLM_CONTRACT_ADDRESS") diff --git a/core/payment-driver/erc20/src/erc20/ethereum.rs b/core/payment-driver/erc20/src/erc20/ethereum.rs index c90e3ad757..21cdae2916 100644 --- a/core/payment-driver/erc20/src/erc20/ethereum.rs +++ b/core/payment-driver/erc20/src/erc20/ethereum.rs @@ -437,7 +437,7 @@ pub async fn get_tx_on_chain_status( } let transaction = get_tx_from_network(tx_hash, network).await?; if let Some(t) = transaction { - res.gas_price = Some(t.gas_price); + res.gas_price = t.gas_price; } } else { } @@ -531,6 +531,9 @@ fn get_rpc_addr_from_env(network: Network) -> Vec { Network::Mainnet => { collect_rpc_addr_from("MAINNET_GETH_ADDR", "https://geth.golem.network:55555") } + Network::Yatestnet => { + collect_rpc_addr_from("YATESTNET_GETH_ADDR", "https://yatestnet.org/web3/yagna") + } Network::Rinkeby => collect_rpc_addr_from( "RINKEBY_GETH_ADDR", "http://geth.testnet.golem.network:55555", @@ -593,6 +596,7 @@ fn get_env(network: Network) -> config::EnvConfiguration { Network::Rinkeby => *config::RINKEBY_CONFIG, Network::Goerli => *config::GOERLI_CONFIG, Network::Mumbai => *config::MUMBAI_CONFIG, + Network::Yatestnet => *config::YATESTNET_CONFIG, Network::Polygon => *config::POLYGON_MAINNET_CONFIG, } } diff --git a/core/payment-driver/erc20/src/lib.rs b/core/payment-driver/erc20/src/lib.rs index 4cbe2ce4cd..a4263aeaef 100644 --- a/core/payment-driver/erc20/src/lib.rs +++ b/core/payment-driver/erc20/src/lib.rs @@ -5,35 +5,41 @@ */ // Public -pub const DRIVER_NAME: &str = "erc20"; +pub const DRIVER_NAME: &str = "erc20legacy"; pub const RINKEBY_NETWORK: &str = "rinkeby"; pub const RINKEBY_TOKEN: &str = "tGLM"; -pub const RINKEBY_PLATFORM: &str = "erc20-rinkeby-tglm"; +pub const RINKEBY_PLATFORM: &str = "erc20legacy-rinkeby-tglm"; pub const RINKEBY_CURRENCY_SHORT: &str = "tETH"; pub const RINKEBY_CURRENCY_LONG: &str = "Rinkeby Ether"; pub const GOERLI_NETWORK: &str = "goerli"; pub const GOERLI_TOKEN: &str = "tGLM"; -pub const GOERLI_PLATFORM: &str = "erc20-goerli-tglm"; +pub const GOERLI_PLATFORM: &str = "erc20legacy-goerli-tglm"; pub const GOERLI_CURRENCY_SHORT: &str = "tETH"; pub const GOERLI_CURRENCY_LONG: &str = "Goerli Ether"; +pub const YATESTNET_NETWORK: &str = "yatestnet"; +pub const YATESTNET_TOKEN: &str = "tGLM"; +pub const YATESTNET_PLATFORM: &str = "erc20legacy-yatestnet-tglm"; +pub const YATESTNET_CURRENCY_SHORT: &str = "tETH"; +pub const YATESTNET_CURRENCY_LONG: &str = "Test Ether"; + pub const MUMBAI_NETWORK: &str = "mumbai"; pub const MUMBAI_TOKEN: &str = "tGLM"; -pub const MUMBAI_PLATFORM: &str = "erc20-mumbai-tglm"; +pub const MUMBAI_PLATFORM: &str = "erc20legacy-mumbai-tglm"; pub const MUMBAI_CURRENCY_SHORT: &str = "tMATIC"; pub const MUMBAI_CURRENCY_LONG: &str = "Test MATIC"; pub const MAINNET_NETWORK: &str = "mainnet"; pub const MAINNET_TOKEN: &str = "GLM"; -pub const MAINNET_PLATFORM: &str = "erc20-mainnet-glm"; +pub const MAINNET_PLATFORM: &str = "erc20legacy-mainnet-glm"; pub const MAINNET_CURRENCY_SHORT: &str = "ETH"; pub const MAINNET_CURRENCY_LONG: &str = "Ether"; pub const POLYGON_MAINNET_NETWORK: &str = "polygon"; pub const POLYGON_MAINNET_TOKEN: &str = "GLM"; -pub const POLYGON_MAINNET_PLATFORM: &str = "erc20-polygon-glm"; +pub const POLYGON_MAINNET_PLATFORM: &str = "erc20legacy-polygon-glm"; pub const POLYGON_MAINNET_CURRENCY_SHORT: &str = "MATIC"; pub const POLYGON_MAINNET_CURRENCY_LONG: &str = "Polygon"; diff --git a/core/payment-driver/erc20/src/network.rs b/core/payment-driver/erc20/src/network.rs index d54ac9f419..991842da97 100644 --- a/core/payment-driver/erc20/src/network.rs +++ b/core/payment-driver/erc20/src/network.rs @@ -13,7 +13,8 @@ use crate::{ MUMBAI_TOKEN, POLYGON_MAINNET_CURRENCY_LONG, POLYGON_MAINNET_CURRENCY_SHORT, POLYGON_MAINNET_NETWORK, POLYGON_MAINNET_PLATFORM, POLYGON_MAINNET_TOKEN, RINKEBY_CURRENCY_LONG, RINKEBY_CURRENCY_SHORT, RINKEBY_NETWORK, RINKEBY_PLATFORM, - RINKEBY_TOKEN, + RINKEBY_TOKEN, YATESTNET_CURRENCY_LONG, YATESTNET_CURRENCY_SHORT, YATESTNET_NETWORK, + YATESTNET_PLATFORM, YATESTNET_TOKEN, }; lazy_static::lazy_static! { @@ -36,6 +37,12 @@ lazy_static::lazy_static! { MAINNET_TOKEN.to_string() => MAINNET_PLATFORM.to_string() } }, + YATESTNET_NETWORK.to_string() => Network { + default_token: YATESTNET_TOKEN.to_string(), + tokens: hashmap! { + YATESTNET_TOKEN.to_string() => YATESTNET_PLATFORM.to_string() + } + }, MUMBAI_NETWORK.to_string() => Network { default_token: MUMBAI_TOKEN.to_string(), tokens: hashmap! { @@ -54,6 +61,7 @@ lazy_static::lazy_static! { pub static ref MAINNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(MAINNET_NETWORK).unwrap(); pub static ref MUMBAI_DB_NETWORK: DbNetwork = DbNetwork::from_str(MUMBAI_NETWORK).unwrap(); pub static ref POLYGON_MAINNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(POLYGON_MAINNET_NETWORK).unwrap(); + pub static ref YATESTNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(YATESTNET_NETWORK).unwrap(); } pub fn platform_to_network_token(platform: String) -> Result<(DbNetwork, String), GenericError> { @@ -62,6 +70,7 @@ pub fn platform_to_network_token(platform: String) -> Result<(DbNetwork, String) GOERLI_PLATFORM => Ok((*GOERLI_DB_NETWORK, GOERLI_TOKEN.to_owned())), MAINNET_PLATFORM => Ok((*MAINNET_DB_NETWORK, MAINNET_TOKEN.to_owned())), MUMBAI_PLATFORM => Ok((*MUMBAI_DB_NETWORK, MUMBAI_TOKEN.to_owned())), + YATESTNET_PLATFORM => Ok((*YATESTNET_DB_NETWORK, YATESTNET_TOKEN.to_owned())), POLYGON_MAINNET_PLATFORM => Ok(( *POLYGON_MAINNET_DB_NETWORK, POLYGON_MAINNET_TOKEN.to_owned(), @@ -125,6 +134,10 @@ pub fn platform_to_currency(platform: String) -> Result<(String, String), Generi POLYGON_MAINNET_CURRENCY_SHORT.to_owned(), POLYGON_MAINNET_CURRENCY_LONG.to_owned(), )), + YATESTNET_PLATFORM => Ok(( + YATESTNET_CURRENCY_SHORT.to_owned(), + YATESTNET_CURRENCY_LONG.to_owned(), + )), other => Err(GenericError::new(format!( "Unable to find network currency for platform: {}", other diff --git a/core/payment-driver/zksync/Cargo.toml b/core/payment-driver/erc20next/Cargo.toml similarity index 58% rename from core/payment-driver/zksync/Cargo.toml rename to core/payment-driver/erc20next/Cargo.toml index 196ef1f09a..918cca5b4c 100644 --- a/core/payment-driver/zksync/Cargo.toml +++ b/core/payment-driver/erc20next/Cargo.toml @@ -1,6 +1,6 @@ [package] -name = "ya-zksync-driver" -version = "0.3.0" +name = "ya-erc20next-driver" +version = "0.4.0" authors = ["Golem Factory "] edition = "2018" @@ -10,26 +10,35 @@ default = [] [dependencies] async-trait = "0.1" anyhow = "1.0" -awc = { version = "3.0", features = ["openssl"] } +awc = { version = "3", features = ["openssl"] } bigdecimal = { version = "0.2" } +ethsign = "0.8" chrono = { version = "0.4", features = ["serde"] } -ethereum-types = "0.10" +derive_more = "0.99" +ethabi = "18.0" +ethereum-types = "0.14.1" +ethereum-tx-sign = "3.1" futures = "0.3" hex = "0.4" lazy_static = "1.4" -log = "0.4.17" +log = "0.4" maplit = "1.0" -metrics-macros = "=0.1.0-alpha.5" num-bigint = { version = "0.3", features = ["serde"] } +num-traits = "0.2" rlp = "0.5" serde = "1.0" serde_json = "^1.0" -tiny-keccak = "1.4.2" +sha3 = "0.8" +thiserror = "1.0" +tiny-keccak = { version = "2.0", features = ["keccak"] } tokio = { version = "1", features = ["full"] } -tokio-compat-02 = "0.2" +tokio-util = { version = "0.7.8", features = ["rt"] } uuid = { version = "0.8", features = ["v4"] } -zksync = { git = "https://github.com/matter-labs/zksync", rev = "0e28e238f71b3be128e4a760b0147e7c62d8dee5"} -zksync_eth_signer = { git = "https://github.com/matter-labs/zksync", rev = "0e28e238f71b3be128e4a760b0147e7c62d8dee5"} +web3 = { version = "0.19.0", default-features = false, features = [ + "http-tls", + "signing", + "ws-tls-tokio", +] } ## yagna dependencies ya-payment-driver = "0.3" @@ -37,6 +46,7 @@ ya-client-model = "0.5" ya-service-api-interfaces = "0.2" ya-utils-futures = "0.2" ya-utils-networking = "0.2" +erc20_payment_lib = { workspace = true } [dev-dependencies] actix-rt = "2.7" diff --git a/core/payment-driver/erc20next/Readme.md b/core/payment-driver/erc20next/Readme.md new file mode 100644 index 0000000000..f5434615af --- /dev/null +++ b/core/payment-driver/erc20next/Readme.md @@ -0,0 +1,163 @@ +## Current ERC20 transactions flow +Date: 2021-10-22 + +Disclaimer: This is dev documentation not officially maintained, it is intended for internal development. + +Testing transfers: +This command will send 0.0001 GLMs from internal wallet to address 0x89Ef977db64A2597bA57E3eb4b717D3bAAeBaeC3 (use your own address for testing) +Note that service have to be running otherwise you get no connection error. + +``` +yagna.exe payment transfer --amount 0.0001 --driver erc20 --network mumbai --to-address 0x89Ef977db64A2597bA57E3eb4b717D3bAAeBaeC3 +``` + +You can specify extra options +* --gas-price (starting gas price in gwei) +* --max-gas-price (maximum allowed gas price in gwei) +* --gas-limit (limit of gas used in transaction). Better to leave default as it is not affecting cost of transaction. This is convenient for testing errors on blockchain. + +``` +yagna.exe payment transfer --amount 0.0001 --gas-price 1.1 --max-gas-price 60.4 --gas-limit 80000 --driver erc20 --network mumbai --to-address 0x89Ef977db64A2597bA57E3eb4b717D3bAAeBaeC3 +``` + +Networks currently supported: +* mainnnet (ETH mainnet, do not use) +* rinkeby (ETH testnet, good support) +* goerli (ETH testnet) +* mumbai (Polygon testnet) +* polygon (Polygon mainnet) + +## Implementation + +DB fields explained + +```sql + tx_id TEXT NOT NULL PRIMARY KEY, + sender TEXT NOT NULL, + nonce INTEGER NOT NULL DEFAULT -1, + status INTEGER NOT NULL, + tx_type INTEGER NOT NULL, + tmp_onchain_txs TEXT NULL, + final_tx TEXT NULL, + starting_gas_price DOUBLE NULL, + current_gas_price DOUBLE NULL, + max_gas_price DOUBLE NULL, + final_gas_price DOUBLE NULL, + final_gas_used INTEGER NULL, + gas_limit INTEGER NULL, + time_created DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + time_last_action DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + time_sent DATETIME NULL, + time_confirmed DATETIME NULL, + network INTEGER NOT NULL DEFAULT 4, + last_error_msg TEXT NULL, + resent_times INT DEFAULT 0, + signature TEXT NULL, + encoded TEXT NOT NULL, +``` + +* tx_id - unique UUID4 generated for trasnsaction +* sender - internal yagna address used for sending transaction +* nonce - Ethereum nonce assigned to transaction +* status - status of the transaction: + * CREATED(1) - the transaction is submitted to db and wait to be sent + * SENT(2) - the transaction is successfully sent to the blockchain network + * PENDING(3) - the transaction is found on blockchain but waiting for execution + * CONFIRMED(4) - the transaction is confirmed and succeeded + * ERRORSENT(10) - transaction failed to be sent on-chain (not consuming nonce, has to be repeated) + * ERRORONCHAIN(11) - transaction is confirmed but failed on-chain (consuming nonce, cannot be repeated until new transaction is assigned to payment) +* tx_type (transfer or faucet transaction) +* tmp_onchain_txs - hashes of all transactions that are sent to the chain (important for checking transaction status when gas is increased) +* final_tx - onchain transaction hash only when transaction is CONFIRMED or ERRORONCHAIN. tmp_onchain_txs are removed to reduce clutter. +* starting_gas_price - gas in Gwei +* current_gas_price - starts with null then it has assigned higher level of gas until transaction is processed +* max_gas_price - limit for current_gas_price +* final_gas_price - assigned after transaction is CONFIRMED or ERRORONCHAIN. +* final_gas_used - assigned after transaction is CONFIRMED or ERRORONCHAIN. use final_gas_used * final_gas_price to have transaction cost in Gwei +* gas_limit - assigned max gas for transaction. If set to low ends with error during transaction sent or error on chain depending on set value. +* time_created - UTC time when entry is created. +* time_last_action - UTC time of last change of the entry. +* time_sent - UTC time of last succesfull sent. +* time_confirmed - UTC time of transaction confirmation (can be also when error on-chain) +* network - id of the Network (for example: 80001 is Mumbai, 137 is Polygon) +* last_error_msg - last error during sending or error onchain, Nulled when trasnaction is successfull +* resent_times - not used right now, intended to limit transaction retries +* signature - transaction signature +* encoded - YagnaRawTransaction encoded in json + +## Assigning nonces + +To process transaction in ethereum network you have to assign nonce which has to be strictly one greater than previous nonce. +This makes process of sending transaction tricky and complicated, because when you send two transactions with the same nonce one of them will fail. Other case is when one transaction is blocked or waiting others with higher nonce will get stuck too. +Currently for every transaction nonce is assigned and not changed until transaction will consume nonce on chain. + +Huge issue: When transaction is malformed and it get stuck, resend will not help and all transactions are blocked. + +With the implementation of the driver we are trying to resolve cases automatically but the process is complicated and not perfect right now. + +Good news: Nonce prevents double spending so we don't have to worry about that (unless we change the nonce) + +Note: Error on chain will consume nonce and gas and new nonce has to be assigned to proceed with transaction, which is currently not handled. + +## Bumping gas prices + +Problem on Ethereum network is as follows: +If you sent transaction you have only vague idea when transaction will be performed. +There is function that is estimating current gas price but it is far from perfect. +Also we want to pay for gas as little as possible. +For example on Polygon Network if you sent transaction for 30.01Gwei you can be pretty sure it get proceeded fairly smoothly +right now, but when the network is congested transaction can get stuck for indefinite amount of time. +When network usage is lower you can try to make transaction for lower gas fee (for example 20Gwei). +To resolve this issue we implemented automatic gas bumping. Every set amount of time gas is increased to increase probability of transaction getting processed. +That way we can save money on gas and also have bigger chance of transactions not getting stuck. + +Currently we proposed following gas levels for polygon network: +``` +10.011, //LOW PRIORITY +15.011, //LOW PRIORITY +20.011, //LOW PRIORITY +25.011, //LOW PRIORITY +30.011, //minimum suggested gas price - FAST PRIORITY +33.011, //not used +36.011, //not used +40.011, //not used +50.011, //not used +60.011, //EXPRESS PRIORITY +80.011, +100.011 +``` +Note that we add 0.011 to increase the chance of getting inline of someone setting whole number as gas price (which people tend to do). It costs almost nothing but significally increase your chance of transaction beeing processed. + +Note that on test networks gas doesn't matter and transaction is processed instantly regardless of gas set. So to test this +feature you have to use Polygon network and pay some Matic for gas. + +## VARIABLES: + +POLYGON_PRIORITY: +possible values: +slow - normal, low priority, economic mode, +fast - fast transaction (for testing or normal mode) +express - express transaction (for testing) + +ERC20_WAIT_FOR_PENDING_ON_NETWORK: (duration) +after that time transaction is resent with higher gas + +## List of known errors: + +Error when sending when gas-limit set too low +``` +RPC error: Error { code: ServerError(-32000), message: "intrinsic gas too low", data: None } +``` +``` +RPC error: Error { code: ServerError(-32000), message: "already known", data: None } +``` +``` +RPC error: Error { code: ServerError(-32000), message: "nonce too low", data: None } +``` + + + + + + + diff --git a/core/payment-driver/erc20next/config-payments.toml b/core/payment-driver/erc20next/config-payments.toml new file mode 100644 index 0000000000..7a3543e41e --- /dev/null +++ b/core/payment-driver/erc20next/config-payments.toml @@ -0,0 +1,82 @@ +[engine] +service-sleep = 1 +process-sleep = 1 +automatic-recover = false + +[chain.rinkeby] +chain-name = "Rinkeby" +chain-id = 4 +rpc-endpoints = ["http://geth.testnet.golem.network:55555"] +currency-symbol = "tETH" +priority-fee = 1.5111 +max-fee-per-gas = 20.0 +gas-left-warning-limit = 1000000 +transaction-timeout = 100 +token = { address = "0xd94e3DC39d4Cad1DAd634e7eb585A57A19dC7EFE", symbol = "tGLM", max-at-once = 10 } +confirmation-blocks = 1 +block-explorer-url = "https://rinkeby.etherscan.io" + +[chain.goerli] +chain-name = "Goerli" +chain-id = 5 +rpc-endpoints = [ + "https://ethereum-goerli-rpc.allthatnode.com", + "https://rpc.slock.it/goerli", + "https://rpc.ankr.com/eth_goerli", +] +currency-symbol = "tETH" +priority-fee = 1.5111 +max-fee-per-gas = 10.0 +gas-left-warning-limit = 1000000 +transaction-timeout = 100 +token = { address = "0x33af15c79d64b85ba14aaffaa4577949104b22e8", symbol = "tGLM" } +multi-contract = { address = "0x7777784f803a7bf1d7f115f849d29ce5706da64a", max-at-once = 10 } +confirmation-blocks = 1 +block-explorer-url = "https://goerli.etherscan.io" + +[chain.mumbai] +chain-name = "Mumbai testnet" +chain-id = 80001 +rpc-endpoints = [ + "https://rpc-mumbai.maticvigil.com/v1/fd04db1066cae0f44d3461ae6d6a7cbbdd46e4a5", +] +# rpc-endpoints = ["http://127.0.0.1:8545"] +currency-symbol = "tMATIC" +priority-fee = 1.5111 +max-fee-per-gas = 500.0 +gas-left-warning-limit = 1000000 +transaction-timeout = 100 +token = { address = "0x2036807B0B3aaf5b1858EE822D0e111fDdac7018", symbol = "tGLM" } +# multi-contract = { address = "0x800010D7d0d315DCA795110ecCf0127cBd76b89f", max-at-once = 10 } +confirmation-blocks = 1 +block-explorer-url = "https://mumbai.polygonscan.com" + +[chain.polygon] +chain-name = "Polygon mainnet" +chain-id = 137 +rpc-endpoints = ["https://polygon-rpc.com"] +currency-symbol = "MATIC" +priority-fee = 30.111 +max-fee-per-gas = 500.0 +gas-left-warning-limit = 1000000 +transaction-timeout = 100 +token = { address = "0x2036807B0B3aaf5b1858EE822D0e111fDdac7018", symbol = "tGLM" } +# multi-contract = { address = "0x50100d4faf5f3b09987dea36dc2eddd57a3e561b", max-at-once = 10 } +confirmation-blocks = 1 +block-explorer-url = "https://polygonscan.com" + +[chain.dev] +chain-name = "Golem testnet" +chain-id = 987789 +rpc-endpoints = ["http://145.239.69.80:8545"] +currency-symbol = "tETH" +priority-fee = 1.1 +max-fee-per-gas = 500.0 +gas-left-warning-limit = 1000000 +transaction-timeout = 100 +token = { address = "0xEC9F23c207018A444f9351dF3D7937f609870667", symbol = "tGLM" } +multi-contract = { address = "0xBCfe9736A4f5bF2E43620061fF3001eA0D003c0F", max-at-once = 10 } +confirmation-blocks = 1 +faucet-eth-amount = 10.0 +faucet-glm-amount = 20.0 +block-explorer-url = "http://145.239.69.80:4000" diff --git a/core/payment-driver/erc20next/src/contracts/eip712.json b/core/payment-driver/erc20next/src/contracts/eip712.json new file mode 100644 index 0000000000..ad0534d974 --- /dev/null +++ b/core/payment-driver/erc20next/src/contracts/eip712.json @@ -0,0 +1,16 @@ +[ + { + "inputs": [], + "name": "getChainId", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeperator", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + } + ] \ No newline at end of file diff --git a/core/payment-driver/erc20next/src/contracts/faucet.json b/core/payment-driver/erc20next/src/contracts/faucet.json new file mode 100644 index 0000000000..9bbe61926c --- /dev/null +++ b/core/payment-driver/erc20next/src/contracts/faucet.json @@ -0,0 +1,107 @@ +[ + { + "constant": false, + "inputs": [ + { + "name": "_token", + "type": "address" + } + ], + "name": "setNGNT", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "isOwner", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "create", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "token", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + } +] diff --git a/core/payment-driver/erc20next/src/contracts/ierc20.json b/core/payment-driver/erc20next/src/contracts/ierc20.json new file mode 100644 index 0000000000..06b572ddc2 --- /dev/null +++ b/core/payment-driver/erc20next/src/contracts/ierc20.json @@ -0,0 +1,222 @@ +[ + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [ + { + "name": "", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "payable": true, + "stateMutability": "payable", + "type": "fallback" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + } +] diff --git a/core/payment-driver/erc20next/src/contracts/meta_transaction.json b/core/payment-driver/erc20next/src/contracts/meta_transaction.json new file mode 100644 index 0000000000..d2dc77d80c --- /dev/null +++ b/core/payment-driver/erc20next/src/contracts/meta_transaction.json @@ -0,0 +1,53 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "userAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "address payable", + "name": "relayerAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "functionSignature", + "type": "bytes" + } + ], + "name": "MetaTransactionExecuted", + "type": "event" + }, + + { + "inputs": [ + { "internalType": "address", "name": "userAddress", "type": "address" }, + { "internalType": "bytes", "name": "functionSignature", "type": "bytes" }, + { "internalType": "bytes32", "name": "sigR", "type": "bytes32" }, + { "internalType": "bytes32", "name": "sigS", "type": "bytes32" }, + { "internalType": "uint8", "name": "sigV", "type": "uint8" } + ], + "name": "executeMetaTransaction", + "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }], + "stateMutability": "payable", + "type": "function" + }, + + { + "inputs": [ + { "internalType": "address", "name": "user", "type": "address" } + ], + "name": "getNonce", + "outputs": [ + { "internalType": "uint256", "name": "nonce", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/core/payment-driver/zksync/src/dao.rs b/core/payment-driver/erc20next/src/dao.rs similarity index 51% rename from core/payment-driver/zksync/src/dao.rs rename to core/payment-driver/erc20next/src/dao.rs index 96121c387d..911422eb50 100644 --- a/core/payment-driver/zksync/src/dao.rs +++ b/core/payment-driver/erc20next/src/dao.rs @@ -2,28 +2,26 @@ Database Access Object, all you need to interact with the database. */ -// Extrernal crates -use chrono::{DateTime, Utc}; -use uuid::Uuid; +use web3::types::U256; // Workspace uses use ya_payment_driver::{ dao::{payment::PaymentDao, transaction::TransactionDao, DbExecutor}, db::models::{ - Network, PaymentEntity, TransactionEntity, TransactionStatus, TxType, - PAYMENT_STATUS_FAILED, PAYMENT_STATUS_NOT_YET, + Network, PaymentEntity, TransactionEntity, TransactionStatus, PAYMENT_STATUS_FAILED, + PAYMENT_STATUS_NOT_YET, }, - model::{GenericError, PaymentDetails, SchedulePayment}, + model::{GenericError, SchedulePayment}, utils, }; use crate::network::platform_to_network_token; -pub struct ZksyncDao { +pub struct Erc20Dao { db: DbExecutor, } -impl ZksyncDao { +impl Erc20Dao { pub fn new(db: DbExecutor) -> Self { Self { db } } @@ -91,62 +89,107 @@ impl ZksyncDao { Ok(()) } - pub async fn insert_transaction( + pub async fn get_next_nonce( &self, - details: &PaymentDetails, - date: DateTime, + address: &str, network: Network, - ) -> String { - // TO CHECK: No difference between tx_id and tx_hash on zksync - // TODO: Implement pre-sign - let tx_id = Uuid::new_v4().to_string(); - let tx = TransactionEntity { - tx_id: tx_id.clone(), - sender: details.sender.clone(), - nonce: -1, // not used till pre-sign - status: TransactionStatus::Created as i32, - time_created: date.naive_utc(), - time_last_action: date.naive_utc(), - time_confirmed: None, - time_sent: None, - current_gas_price: None, - starting_gas_price: None, - max_gas_price: None, - final_gas_used: None, - amount_base: None, - amount_erc20: None, - gas_limit: None, - tx_type: TxType::Transfer as i32, // Zksync only knows transfers, unused field - encoded: "".to_string(), // not used till pre-sign - signature: None, // not used till pre-sign - final_tx: None, - tmp_onchain_txs: None, - network, - last_error_msg: None, - resent_times: 0, + ) -> Result { + let list_of_nonces = self + .transaction() + .get_used_nonces(address, network) + .await + .map_err(GenericError::new)?; + + let max_nonce = list_of_nonces.into_iter().max(); + + let next_nonce = match max_nonce { + Some(nonce) => U256::from(nonce + 1), + None => U256::from(0), }; + Ok(next_nonce) + } + + pub async fn insert_raw_transaction(&self, tx: TransactionEntity) -> String { + let tx_id = tx.tx_id.clone(); + if let Err(e) = self.transaction().insert_transactions(vec![tx]).await { - log::error!("Failed to store transaction for {:?} : {:?}", details, e) + log::error!("Failed to store transaction for {} : {:?}", tx_id, e) // TO CHECK: Should it continue or stop the process... } tx_id } - pub async fn transaction_confirmed(&self, tx_id: &str) -> Vec { + pub async fn get_payments_based_on_tx(&self, tx_id: &str) -> Vec { + match self.payment().get_by_tx_id(tx_id.to_string()).await { + Ok(payments) => payments, + Err(e) => { + log::error!("Failed to fetch `payments` for tx {:?} : {:?}", tx_id, e); + vec![] + } + } + } + + pub async fn transaction_confirmed( + &self, + tx_id: &str, + final_hash: &str, + final_gas_price: Option, + ) { if let Err(e) = self .transaction() - .update_tx_status(tx_id.to_string(), TransactionStatus::Confirmed, None) + .confirm_tx( + tx_id.to_string(), + TransactionStatus::Confirmed, + None, + Some(final_hash.to_string()), + final_gas_price, + ) + .await + { + log::error!("Failed to update tx status for {:?} : {:?}", tx_id, e) + // TO CHECK: Should it continue or stop the process... + } + } + + pub async fn transaction_confirmed_and_failed( + &self, + tx_id: &str, + final_hash: &str, + final_gas_price: Option, + error: &str, + ) { + if let Err(e) = self + .transaction() + .confirm_tx( + tx_id.to_string(), + TransactionStatus::ErrorOnChain, + Some(error.to_string()), + Some(final_hash.to_string()), + final_gas_price, + ) + .await + { + log::error!("Failed to update tx status for {:?} : {:?}", tx_id, e) + // TO CHECK: Should it continue or stop the process... + } + } + + pub async fn transaction_failed_with_nonce_too_low(&self, tx_id: &str, error: &str) { + if let Err(e) = self + .transaction() + .confirm_tx( + tx_id.to_string(), + TransactionStatus::ErrorNonceTooLow, + Some(error.to_string()), + None, + None, + ) .await { log::error!("Failed to update tx status for {:?} : {:?}", tx_id, e) // TO CHECK: Should it continue or stop the process... } - match self.payment().get_by_tx_id(tx_id.to_string()).await { - Ok(payments) => return payments, - Err(e) => log::error!("Failed to fetch `payments` for tx {:?} : {:?}", tx_id, e), - }; - vec![] } pub async fn get_first_payment(&self, tx_hash: &str) -> Option { @@ -160,7 +203,7 @@ impl ZksyncDao { } } - pub async fn transaction_sent(&self, tx_id: &str, tx_hash: &str, order_id: &str) { + pub async fn transaction_saved(&self, tx_id: &str, order_id: &str) { if let Err(e) = self .payment() .update_tx_id(order_id.to_string(), tx_id.to_string()) @@ -169,9 +212,12 @@ impl ZksyncDao { log::error!("Failed to update for transaction {:?} : {:?}", tx_id, e) // TO CHECK: Should it continue or stop the process... } + } + + pub async fn retry_send_transaction(&self, tx_id: &str, bump_gas: bool) { if let Err(e) = self .transaction() - .update_tx_sent(tx_id.to_string(), tx_hash.to_string(), None) + .update_tx_send_again(tx_id.to_string(), bump_gas) .await { log::error!("Failed to update for transaction {:?} : {:?}", tx_id, e) @@ -179,13 +225,60 @@ impl ZksyncDao { } } - pub async fn transaction_failed(&self, tx_id: &str, err: &str) { + pub async fn update_tx_fields( + &self, + tx_id: &str, + encoded: String, + signature: String, + current_gas_price: Option, + ) { if let Err(e) = self .transaction() - .update_tx_status( + .update_tx_fields(tx_id.to_string(), encoded, signature, current_gas_price) + .await + { + log::error!("Failed to update for transaction {:?} : {:?}", tx_id, e) + // TO CHECK: Should it continue or stop the process... + } + } + + pub async fn overwrite_tmp_onchain_txs_and_status_back_to_pending( + &self, + tx_id: &str, + overwrite_tmp_onchain_txs: &str, + ) { + if let Err(e) = self + .transaction() + .overwrite_tmp_onchain_txs_and_status_back_to_pending( tx_id.to_string(), - TransactionStatus::ErrorOnChain, - Some(err.to_string()), + overwrite_tmp_onchain_txs.to_string(), + ) + .await + { + log::error!("Failed to update for transaction {:?} : {:?}", tx_id, e) + // TO CHECK: Should it continue or stop the process... + } + } + + pub async fn transaction_sent(&self, tx_id: &str, tx_hash: &str, gas_price: Option) { + if let Err(e) = self + .transaction() + .update_tx_sent(tx_id.to_string(), tx_hash.to_string(), gas_price) + .await + { + log::error!("Failed to update for transaction {:?} : {:?}", tx_id, e) + // TO CHECK: Should it continue or stop the process... + } + } + + pub async fn transaction_failed_send(&self, tx_id: &str, new_resent_count: i32, error: &str) { + if let Err(e) = self + .transaction() + .update_error_sent( + tx_id.to_string(), + TransactionStatus::ErrorSent, + new_resent_count, + Some(error.to_string()), ) .await { @@ -213,18 +306,13 @@ impl ZksyncDao { } } - pub async fn retry_payment(&self, order_id: &str) { - if let Err(e) = self - .payment() - .update_status(order_id.to_string(), PAYMENT_STATUS_NOT_YET) - .await - { - log::error!( - "Failed to set status of the `payment` {:?} to be retried : {:?}", - order_id, - e - ) - // TO CHECK: Should it continue or stop the process... + pub async fn get_unsent_txs(&self, network: Network) -> Vec { + match self.transaction().get_unsent_txs(network).await { + Ok(txs) => txs, + Err(e) => { + log::error!("Failed to fetch unconfirmed transactions : {:?}", e); + vec![] + } } } @@ -244,4 +332,22 @@ impl ZksyncDao { .await .map_err(GenericError::new) } + + pub async fn get_pending_faucet_txs( + &self, + node_id: &str, + network: Network, + ) -> Vec { + match self + .transaction() + .get_pending_faucet_txs(node_id, network) + .await + { + Ok(txs) => txs, + Err(e) => { + log::error!("Failed to fetch unsent transactions : {:?}", e); + vec![] + } + } + } } diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs new file mode 100644 index 0000000000..2c1ade15e2 --- /dev/null +++ b/core/payment-driver/erc20next/src/driver.rs @@ -0,0 +1,294 @@ +/* + Erc20Driver to handle payments on the erc20 network. + + Please limit the logic in this file, use local mods to handle the calls. +*/ +// Extrnal crates +use erc20_payment_lib::db::ops::insert_token_transfer; +use erc20_payment_lib::runtime::PaymentRuntime; +use erc20_payment_lib::transaction::create_token_transfer; +use ethereum_types::H160; +use std::collections::HashMap; +use std::str::FromStr; +use uuid::Uuid; + +// Workspace uses +use ya_payment_driver::{ + account::{Accounts, AccountsRc}, + bus, + cron::PaymentDriverCron, + dao::DbExecutor, + driver::{ + async_trait, BigDecimal, IdentityError, IdentityEvent, Network as NetworkConfig, + PaymentDriver, + }, + model::*, +}; + +// Local uses +use crate::erc20::utils::big_dec_to_u256; +use crate::{network::SUPPORTED_NETWORKS, DRIVER_NAME, RINKEBY_NETWORK}; + +mod api; +mod cli; + +lazy_static::lazy_static! { + static ref TX_SENDOUT_INTERVAL: std::time::Duration = std::time::Duration::from_secs( + std::env::var("ERC20_SENDOUT_INTERVAL_SECS") + .ok() + .and_then(|x| x.parse().ok()) + .unwrap_or(30), + ); + + static ref TX_CONFIRMATION_INTERVAL: std::time::Duration = std::time::Duration::from_secs( + std::env::var("ERC20_CONFIRMATION_INTERVAL_SECS") + .ok() + .and_then(|x| x.parse().ok()) + .unwrap_or(30), + ); +} + +pub struct Erc20NextDriver { + active_accounts: AccountsRc, + payment_runtime: PaymentRuntime, +} + +impl Erc20NextDriver { + pub fn new(pr: PaymentRuntime) -> Self { + Self { + active_accounts: Accounts::new_rc(), + payment_runtime: pr, + } + } + + pub async fn load_active_accounts(&self) { + log::debug!("load_active_accounts"); + let unlocked_accounts = bus::list_unlocked_identities().await.unwrap(); + let mut accounts = self.active_accounts.borrow_mut(); + for account in unlocked_accounts { + log::debug!("account={}", account); + accounts.add_account(account) + } + } + + fn is_account_active(&self, address: &str) -> Result<(), GenericError> { + match self.active_accounts.as_ref().borrow().get_node_id(address) { + Some(_) => Ok(()), + None => Err(GenericError::new(format!( + "Account not active: {}", + &address + ))), + } + } + + async fn do_transfer( + &self, + sender: &str, + to: &str, + amount: &BigDecimal, + network: &str, + ) -> Result { + self.is_account_active(sender)?; + let sender = H160::from_str(sender) + .map_err(|err| GenericError::new(format!("Error when parsing sender {err:?}")))?; + let receiver = H160::from_str(to) + .map_err(|err| GenericError::new(format!("Error when parsing receiver {err:?}")))?; + let amount = big_dec_to_u256(amount)?; + + let chain_id = self + .payment_runtime + .setup + .chain_setup + .values() + .find(|chain_setup| &chain_setup.network == network) + .ok_or_else(|| GenericError::new(format!("Unsupported network: {}", network)))? + .chain_id; + + let chain_cfg = self + .payment_runtime + .setup + .chain_setup + .get(&chain_id) + .ok_or(GenericError::new(format!( + "Cannot find chain cfg for chain {chain_id}" + )))?; + + let glm_address = chain_cfg.glm_address.ok_or(GenericError::new(format!( + "Cannot find GLM address for chain {chain_id}" + )))?; + + let payment_id = Uuid::new_v4().to_simple().to_string(); + let token_transfer = create_token_transfer( + sender, + receiver, + chain_cfg.chain_id, + Some(&payment_id), + Some(glm_address), + amount, + ); + let _res = insert_token_transfer(&self.payment_runtime.conn, &token_transfer) + .await + .map_err(|err| GenericError::new(format!("Error when inserting transfer {err:?}")))?; + + Ok(payment_id) + } +} + +#[async_trait(?Send)] +impl PaymentDriver for Erc20NextDriver { + async fn account_event( + &self, + _db: DbExecutor, + _caller: String, + msg: IdentityEvent, + ) -> Result<(), IdentityError> { + self.active_accounts.borrow_mut().handle_event(msg); + Ok(()) + } + + async fn enter( + &self, + _db: DbExecutor, + _caller: String, + msg: Enter, + ) -> Result { + log::info!("ENTER = Not Implemented: {:?}", msg); + Ok("NOT_IMPLEMENTED".to_string()) + } + + async fn exit( + &self, + _db: DbExecutor, + _caller: String, + msg: Exit, + ) -> Result { + log::info!("EXIT = Not Implemented: {:?}", msg); + Ok("NOT_IMPLEMENTED".to_string()) + } + + async fn get_account_balance( + &self, + _db: DbExecutor, + _caller: String, + msg: GetAccountBalance, + ) -> Result { + api::get_account_balance(msg).await + } + + async fn get_account_gas_balance( + &self, + _db: DbExecutor, + _caller: String, + msg: GetAccountGasBalance, + ) -> Result, GenericError> { + api::get_account_gas_balance(msg).await + } + + fn get_name(&self) -> String { + DRIVER_NAME.to_string() + } + + fn get_default_network(&self) -> String { + RINKEBY_NETWORK.to_string() + } + + fn get_networks(&self) -> HashMap { + SUPPORTED_NETWORKS.clone() + } + + fn recv_init_required(&self) -> bool { + false + } + + async fn init(&self, _db: DbExecutor, _caller: String, msg: Init) -> Result { + cli::init(self, msg).await?; + Ok(Ack {}) + } + + async fn fund( + &self, + _db: DbExecutor, + _caller: String, + msg: Fund, + ) -> Result { + log::info!("FUND = Not Implemented: {:?}", msg); + Ok("NOT_IMPLEMENTED".to_string()) + } + + async fn transfer( + &self, + _db: DbExecutor, + _caller: String, + msg: Transfer, + ) -> Result { + let network = msg + .network + .ok_or(GenericError::new("Network not specified".to_string()))?; + + self.do_transfer(&msg.sender, &msg.to, &msg.amount, &network) + .await + } + + async fn schedule_payment( + &self, + _db: DbExecutor, + _caller: String, + msg: SchedulePayment, + ) -> Result { + let platform = msg.platform(); + let network = platform.split("-").nth(1).ok_or(GenericError::new(format!( + "Malformed platform string: {}", + msg.platform() + )))?; + + self.do_transfer(&msg.sender(), &msg.recipient(), &msg.amount(), &network) + .await + } + + async fn verify_payment( + &self, + _db: DbExecutor, + _caller: String, + msg: VerifyPayment, + ) -> Result { + api::verify_payment(msg).await + } + + async fn validate_allocation( + &self, + _db: DbExecutor, + _caller: String, + msg: ValidateAllocation, + ) -> Result { + api::validate_allocation(msg).await + } + + async fn shut_down( + &self, + _db: DbExecutor, + _caller: String, + _msg: ShutDown, + ) -> Result<(), GenericError> { + // no-op, erc20_payment_lib driver doesn't expose clean shutdown interface yet + Ok(()) + } +} + +#[async_trait(?Send)] +impl PaymentDriverCron for Erc20NextDriver { + async fn confirm_payments(&self) { + // no-op, handled by erc20_payment_lib internally + } + + async fn send_out_payments(&self) { + // no-op, handled by erc20_payment_lib internally + } + + fn sendout_interval(&self) -> std::time::Duration { + *TX_SENDOUT_INTERVAL + } + + fn confirmation_interval(&self) -> std::time::Duration { + *TX_CONFIRMATION_INTERVAL + } +} diff --git a/core/payment-driver/erc20next/src/driver/api.rs b/core/payment-driver/erc20next/src/driver/api.rs new file mode 100644 index 0000000000..dbf89eb3dd --- /dev/null +++ b/core/payment-driver/erc20next/src/driver/api.rs @@ -0,0 +1,128 @@ +/* + Driver helper for handling messages from payment_api. +*/ +// Extrnal crates +// use lazy_static::lazy_static; +// use num_bigint::BigInt; +use uuid::Uuid; + +// Workspace uses +use ya_payment_driver::{ + driver::BigDecimal, + model::{ + GasDetails, GenericError, GetAccountBalance, GetAccountGasBalance, SchedulePayment, + ValidateAllocation, VerifyPayment, + }, +}; + +// Local uses +use crate::{ + dao::Erc20Dao, + driver::PaymentDetails, + erc20::{utils, wallet}, + network, +}; + +// lazy_static! { +// static ref MAX_ALLOCATION_SURCHARGE: BigDecimal = +// match std::env::var("MAX_ALLOCATION_SURCHARGE").map(|s| s.parse()) { +// Ok(Ok(x)) => x, +// _ => BigDecimal::from(200), +// }; +// +// // Environment variable will be replaced by allocation parameter in PAY-82 +// static ref TRANSACTIONS_PER_ALLOCATION: BigInt = +// match std::env::var("TRANSACTIONS_PER_ALLOCATION").map(|s| s.parse()) { +// Ok(Ok(x)) => x, +// _ => BigInt::from(10), +// }; +// } + +pub async fn get_account_balance(msg: GetAccountBalance) -> Result { + log::debug!("get_account_balance: {:?}", msg); + let (network, _) = network::platform_to_network_token(msg.platform())?; + let address = utils::str_to_addr(&msg.address())?; + // TODO implement token + let balance = wallet::account_balance(address, network).await?; + + log::info!( + "get_account_balance() - account={}, balance={}", + &msg.address(), + &balance + ); + Ok(balance) +} + +pub async fn get_account_gas_balance( + msg: GetAccountGasBalance, +) -> Result, GenericError> { + log::debug!("get_account_gas_balance: {:?}", msg); + let (currency_short_name, currency_long_name) = network::platform_to_currency(msg.platform())?; + let (network, _) = network::platform_to_network_token(msg.platform())?; + + let address = utils::str_to_addr(&msg.address())?; + + let balance = wallet::account_gas_balance(address, network).await?; + + log::info!( + "get_account_gas_balance() - account={}, balance={}, currency {}", + &msg.address(), + &balance, + currency_long_name + ); + Ok(Some(GasDetails { + currency_short_name, + currency_long_name, + balance, + })) +} + +pub async fn _schedule_payment( + dao: &Erc20Dao, + msg: SchedulePayment, +) -> Result { + let order_id = Uuid::new_v4().to_string(); + dao.insert_payment(&order_id, &msg).await?; + log::info!("schedule_payment()"); + Ok(order_id) +} + +pub async fn verify_payment(msg: VerifyPayment) -> Result { + log::debug!("verify_payment: {:?}", msg); + let (network, _) = network::platform_to_network_token(msg.platform())?; + let tx_hash = format!("0x{}", hex::encode(msg.confirmation().confirmation)); + log::info!("Verifying transaction: {}", tx_hash); + wallet::verify_tx(&tx_hash, network).await +} + +pub async fn validate_allocation(msg: ValidateAllocation) -> Result { + log::debug!("validate_allocation: {:?}", msg); + let address = utils::str_to_addr(&msg.address)?; + let (network, _) = network::platform_to_network_token(msg.platform)?; + let account_balance = wallet::account_balance(address, network).await?; + let total_allocated_amount: BigDecimal = msg + .existing_allocations + .into_iter() + .map(|allocation| allocation.remaining_amount) + .sum(); + + // TODO: calculate fee. Below commented out reference to zkSync implementation + // let tx_fee_cost = wallet::get_tx_fee(&msg.address, network).await?; + // let total_txs_cost = tx_fee_cost * &*TRANSACTIONS_PER_ALLOCATION; + // let allocation_surcharge = (&*MAX_ALLOCATION_SURCHARGE).min(&total_txs_cost); + // + log::info!( + "Allocation validation: \ + allocating: {:.5}, \ + account_balance: {:.5}, \ + total_allocated_amount: {:.5}", //", \ + // allocation_surcharge: {:.5} \ + // ", + msg.amount, + account_balance, + total_allocated_amount, + //allocation_surcharge, + ); + // Ok(msg.amount <= (account_balance - total_allocated_amount - allocation_surcharge)) + Ok(msg.amount <= account_balance - total_allocated_amount) +} diff --git a/core/payment-driver/erc20next/src/driver/cli.rs b/core/payment-driver/erc20next/src/driver/cli.rs new file mode 100644 index 0000000000..f2c3a06e7c --- /dev/null +++ b/core/payment-driver/erc20next/src/driver/cli.rs @@ -0,0 +1,46 @@ +/* + Driver helper for handling messages from CLI. + + Please limit the logic in this file, use local mods to handle the calls. +*/ +// Extrnal crates + +// Workspace uses +use ya_payment_driver::{ + bus, + model::{AccountMode, GenericError, Init}, +}; +use ya_utils_futures::timeout::IntoTimeoutFuture; + +// Local uses +use crate::{driver::Erc20NextDriver, erc20::wallet, network, DRIVER_NAME}; + +pub async fn init(driver: &Erc20NextDriver, msg: Init) -> Result<(), GenericError> { + log::debug!("init: {:?}", msg); + let mode = msg.mode(); + let address = msg.address(); + + // Ensure account is unlock before initialising send mode + if mode.contains(AccountMode::SEND) { + driver.is_account_active(&address)? + } + + wallet::init_wallet(&msg) + .timeout(Some(30)) + .await + .map_err(GenericError::new)??; + + let network = network::network_like_to_network(msg.network()); + let token = network::get_network_token(network, msg.token()); + bus::register_account(driver, &msg.address(), &network.to_string(), &token, mode).await?; + + log::info!( + "Initialised payment account. mode={:?}, address={}, driver={}, network={}, token={}", + mode, + &msg.address(), + DRIVER_NAME, + network, + token + ); + Ok(()) +} diff --git a/core/payment-driver/erc20next/src/erc20/config.rs b/core/payment-driver/erc20next/src/erc20/config.rs new file mode 100644 index 0000000000..0e62210def --- /dev/null +++ b/core/payment-driver/erc20next/src/erc20/config.rs @@ -0,0 +1,119 @@ +use lazy_static::lazy_static; +use std::env; +use web3::types::Address; + +use crate::erc20::utils; + +// TODO: REUSE old verification checks? +// pub(crate) const ETH_TX_SUCCESS: u64 = 1; +// pub(crate) const TRANSFER_LOGS_LENGTH: usize = 1; +// pub(crate) const TX_LOG_DATA_LENGTH: usize = 32; +// pub(crate) const TX_LOG_TOPICS_LENGTH: usize = 3; +// pub(crate) const TRANSFER_CANONICAL_SIGNATURE: &str = +// "ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"; + +#[derive(Clone, Copy, Debug)] +pub struct EnvConfiguration { + pub glm_contract_address: Address, + pub glm_faucet_address: Option
, + pub required_confirmations: u64, +} + +lazy_static! { + pub static ref RINKEBY_CONFIG: EnvConfiguration = EnvConfiguration { + glm_contract_address: utils::str_to_addr( + &env::var("RINKEBY_TGLM_CONTRACT_ADDRESS") + .unwrap_or_else(|_| "0xd94e3DC39d4Cad1DAd634e7eb585A57A19dC7EFE".to_string()) + ) + .unwrap(), + glm_faucet_address: Some( + utils::str_to_addr( + &env::var("RINKEBY_TGLM_FAUCET_ADDRESS") + .unwrap_or_else(|_| "0x59259943616265A03d775145a2eC371732E2B06C".to_string()) + ) + .unwrap() + ), + required_confirmations: { + match env::var("ERC20_RINKEBY_REQUIRED_CONFIRMATIONS").map(|s| s.parse()) { + Ok(Ok(x)) => x, + _ => 3, + } + } + }; + pub static ref MAINNET_CONFIG: EnvConfiguration = EnvConfiguration { + glm_contract_address: utils::str_to_addr( + &env::var("MAINNET_GLM_CONTRACT_ADDRESS") + .unwrap_or_else(|_| "0x7DD9c5Cba05E151C895FDe1CF355C9A1D5DA6429".to_string()) + ) + .unwrap(), + glm_faucet_address: None, + required_confirmations: { + match env::var("ERC20_MAINNET_REQUIRED_CONFIRMATIONS").map(|s| s.parse()) { + Ok(Ok(x)) => x, + _ => 5, + } + } + }; + pub static ref GOERLI_CONFIG: EnvConfiguration = EnvConfiguration { + glm_contract_address: utils::str_to_addr( + &env::var("GOERLI_TGLM_CONTRACT_ADDRESS") + .unwrap_or_else(|_| "0x33af15c79d64b85ba14aaffaa4577949104b22e8".to_string()) + ) + .unwrap(), + glm_faucet_address: Some( + utils::str_to_addr( + &env::var("GOERLI_TGLM_FAUCET_ADDRESS") + .unwrap_or_else(|_| "0xCCA41b09C1F50320bFB41BD6822BD0cdBDC7d85C".to_string()) + ) + .unwrap() + ), + required_confirmations: { + match env::var("ERC20_GOERLI_REQUIRED_CONFIRMATIONS").map(|s| s.parse()) { + Ok(Ok(x)) => x, + _ => 3, + } + } + }; + pub static ref MUMBAI_CONFIG: EnvConfiguration = EnvConfiguration { + glm_contract_address: utils::str_to_addr( + &env::var("MUMBAI_TGLM_CONTRACT_ADDRESS") + .unwrap_or_else(|_| "0x2036807B0B3aaf5b1858EE822D0e111fDdac7018".to_string()) + ) + .unwrap(), + glm_faucet_address: None, + required_confirmations: { + match env::var("ERC20_MUMBAI_REQUIRED_CONFIRMATIONS").map(|s| s.parse()) { + Ok(Ok(x)) => x, + _ => 3, + } + } + }; + pub static ref YATESTNET_CONFIG: EnvConfiguration = EnvConfiguration { + glm_contract_address: utils::str_to_addr( + &env::var("YATESTNET_TGLM_CONTRACT_ADDRESS") + .unwrap_or_else(|_| "0x3b80bF85867eE9b079322802A734c074e093328E".to_string()) + ) + .unwrap(), + glm_faucet_address: None, + required_confirmations: { + match env::var("YATESTNET_REQUIRED_CONFIRMATIONS").map(|s| s.parse()) { + Ok(Ok(x)) => x, + _ => 3, + } + } + }; + pub static ref POLYGON_MAINNET_CONFIG: EnvConfiguration = EnvConfiguration { + glm_contract_address: utils::str_to_addr( + &env::var("POLYGON_GLM_CONTRACT_ADDRESS") + .unwrap_or_else(|_| "0x0b220b82f3ea3b7f6d9a1d8ab58930c064a2b5bf".to_string()) + ) + .unwrap(), + glm_faucet_address: None, + required_confirmations: { + match env::var("ERC20_POLYGON_REQUIRED_CONFIRMATIONS").map(|s| s.parse()) { + Ok(Ok(x)) => x, + _ => 5, + } + } + }; +} diff --git a/core/payment-driver/erc20next/src/erc20/eth_utils.rs b/core/payment-driver/erc20next/src/erc20/eth_utils.rs new file mode 100644 index 0000000000..cbc8dce1cb --- /dev/null +++ b/core/payment-driver/erc20next/src/erc20/eth_utils.rs @@ -0,0 +1,121 @@ +// PRIVATE RawTransaction.hash() + +use ethereum_types::U256; +use rlp::RlpStream; +use tiny_keccak::{Hasher, Keccak}; + +use crate::erc20::transaction::YagnaRawTransaction; + +pub fn get_tx_hash(tx: &YagnaRawTransaction, chain_id: u64) -> Vec { + let mut hash = RlpStream::new(); + hash.begin_unbounded_list(); + tx_encode(tx, &mut hash); + hash.append(&chain_id.clone()); + hash.append(&U256::zero()); + hash.append(&U256::zero()); + hash.finalize_unbounded_list(); + keccak256_hash(&hash.out()) +} + +pub fn keccak256_hash(bytes: &[u8]) -> Vec { + let mut hasher = Keccak::v256(); + hasher.update(bytes); + let mut resp: [u8; 32] = Default::default(); + hasher.finalize(&mut resp); + resp.to_vec() +} + +fn tx_encode(tx: &YagnaRawTransaction, s: &mut RlpStream) { + s.append(&tx.nonce); + s.append(&tx.gas_price); + s.append(&tx.gas); + if let Some(ref t) = tx.to { + s.append(t); + } else { + s.append(&vec![]); + } + s.append(&tx.value); + s.append(&tx.data); +} + +// MISSING RawTransaction.encode_signed_tx() + +pub fn encode_signed_tx( + raw_tx: &YagnaRawTransaction, + signature: Vec, + chain_id: u64, +) -> Vec { + let (sig_v, sig_r, sig_s) = prepare_signature(signature, chain_id); + + let mut tx = RlpStream::new(); + + tx.begin_unbounded_list(); + + tx_encode(raw_tx, &mut tx); + tx.append(&sig_v); + tx.append(&sig_r); + tx.append(&sig_s); + + tx.finalize_unbounded_list(); + + tx.out().to_vec() +} + +fn prepare_signature(mut signature: Vec, chain_id: u64) -> (u64, Vec, Vec) { + // TODO ugly solution + assert_eq!(signature.len(), 65); + + let sig_v = signature[0]; + let sig_v = sig_v as u64 + chain_id * 2 + 35; + + let mut sig_r = signature.split_off(1); + let mut sig_s = sig_r.split_off(32); + + prepare_signature_part(&mut sig_r); + prepare_signature_part(&mut sig_s); + + (sig_v, sig_r, sig_s) +} + +fn prepare_signature_part(part: &mut Vec) { + assert_eq!(part.len(), 32); + while part[0] == 0 { + part.remove(0); + } +} + +// MISSING contract.encode() + +use ethabi::{Error, Token}; +use web3::contract::tokens::Tokenize; +use web3::contract::Contract; +use web3::Transport; + +pub fn contract_encode( + contract: &Contract, + func: &str, + params: P, +) -> Result, Error> +where + P: Tokenize, + T: Transport, +{ + contract + .abi() + .function(func) + .and_then(|function| function.encode_input(¶ms.into_tokens())) +} + +pub fn contract_decode( + contract: &Contract, + func: &str, + data: Vec, +) -> Result, Error> +where + T: Transport, +{ + contract + .abi() + .function(func) + .and_then(|function| function.decode_input(&data)) +} diff --git a/core/payment-driver/erc20next/src/erc20/ethereum.rs b/core/payment-driver/erc20next/src/erc20/ethereum.rs new file mode 100644 index 0000000000..21cdae2916 --- /dev/null +++ b/core/payment-driver/erc20next/src/erc20/ethereum.rs @@ -0,0 +1,841 @@ +#![allow(clippy::too_many_arguments)] + +use std::collections::HashMap; +use std::sync::Arc; + +use bigdecimal::BigDecimal; +use chrono::{DateTime, Utc}; +use ethabi::Token; +use lazy_static::lazy_static; +use tokio::sync::RwLock; +use uuid::Uuid; +use web3::{ + contract::{tokens::Tokenize, Contract, Options}, + error::Error, + transports::Http, + types::{Bytes, Transaction, TransactionId, TransactionReceipt, H160, H256, U256, U64}, + Web3, +}; + +use ya_client_model::NodeId; +use ya_payment_driver::db::models::{Network, TransactionEntity, TransactionStatus, TxType}; +use ya_payment_driver::utils::big_dec_to_u256; +use ya_payment_driver::{bus, model::GenericError}; + +use crate::erc20::eth_utils::keccak256_hash; +use crate::erc20::transaction::YagnaRawTransaction; +use crate::erc20::{config, eth_utils}; + +#[derive(Clone, Debug, thiserror::Error)] +pub enum ClientError { + #[error("{0}")] + Web3(#[from] Error), + #[error("{0}")] + Other(#[from] GenericError), +} + +impl ClientError { + pub fn new(value: impl std::fmt::Display) -> Self { + Self::Other(GenericError::new(value)) + } +} + +impl From for ClientError { + fn from(e: web3::contract::Error) -> Self { + Self::Other(GenericError::new(e)) + } +} + +impl From for GenericError { + fn from(e: ClientError) -> Self { + match e { + ClientError::Other(e) => e, + ClientError::Web3(e) => GenericError::new(e), + } + } +} + +pub enum PolygonPriority { + PolygonPrioritySlow, + PolygonPriorityFast, + PolygonPriorityExpress, +} + +pub enum PolygonGasPriceMethod { + PolygonGasPriceStatic, + PolygonGasPriceDynamic, +} + +pub const POLYGON_PREFERRED_GAS_PRICES_SLOW: [f64; 6] = [0.0, 10.01, 15.01, 20.01, 25.01, 30.01]; +pub const POLYGON_PREFERRED_GAS_PRICES_FAST: [f64; 3] = [0.0, 30.01, 40.01]; +pub const POLYGON_PREFERRED_GAS_PRICES_EXPRESS: [f64; 3] = [0.0, 60.01, 100.01]; + +lazy_static! { + pub static ref GLM_FAUCET_GAS: U256 = U256::from(90_000); + pub static ref GLM_TRANSFER_GAS: U256 = U256::from(55_000); + pub static ref GLM_POLYGON_GAS_LIMIT: U256 = U256::from(100_000); + static ref WEB3_CLIENT_MAP: Arc>>> = Default::default(); +} +const CREATE_FAUCET_FUNCTION: &str = "create"; +const BALANCE_ERC20_FUNCTION: &str = "balanceOf"; +const TRANSFER_ERC20_FUNCTION: &str = "transfer"; +const GET_DOMAIN_SEPARATOR_FUNCTION: &str = "getDomainSeperator"; +const GET_NONCE_FUNCTION: &str = "getNonce"; + +pub fn get_polygon_starting_price() -> f64 { + match get_polygon_priority() { + PolygonPriority::PolygonPrioritySlow => POLYGON_PREFERRED_GAS_PRICES_SLOW[1], + PolygonPriority::PolygonPriorityFast => POLYGON_PREFERRED_GAS_PRICES_FAST[1], + PolygonPriority::PolygonPriorityExpress => POLYGON_PREFERRED_GAS_PRICES_EXPRESS[1], + } +} + +pub fn get_polygon_maximum_price() -> f64 { + match get_polygon_gas_price_method() { + PolygonGasPriceMethod::PolygonGasPriceStatic => match get_polygon_priority() { + PolygonPriority::PolygonPrioritySlow => { + POLYGON_PREFERRED_GAS_PRICES_SLOW[POLYGON_PREFERRED_GAS_PRICES_SLOW.len() - 1] + } + PolygonPriority::PolygonPriorityFast => { + POLYGON_PREFERRED_GAS_PRICES_FAST[POLYGON_PREFERRED_GAS_PRICES_FAST.len() - 1] + } + PolygonPriority::PolygonPriorityExpress => { + POLYGON_PREFERRED_GAS_PRICES_EXPRESS[POLYGON_PREFERRED_GAS_PRICES_EXPRESS.len() - 1] + } + }, + PolygonGasPriceMethod::PolygonGasPriceDynamic => get_polygon_max_gas_price_dynamic(), + } +} + +pub fn get_polygon_max_gas_price_dynamic() -> f64 { + std::env::var("POLYGON_MAX_GAS_PRICE_DYNAMIC") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(1000.0f64) +} + +pub fn get_polygon_gas_price_method() -> PolygonGasPriceMethod { + match std::env::var("POLYGON_GAS_PRICE_METHOD") + .ok() + .map(|v| v.to_lowercase()) + .as_ref() + .map(AsRef::as_ref) // Option<&str> + { + Some("static") => PolygonGasPriceMethod::PolygonGasPriceStatic, + Some("dynamic") => PolygonGasPriceMethod::PolygonGasPriceDynamic, + _ => PolygonGasPriceMethod::PolygonGasPriceDynamic, + } +} + +pub fn get_polygon_priority() -> PolygonPriority { + match std::env::var("POLYGON_PRIORITY") + .unwrap_or_else(|_| "default".to_string()) + .to_lowercase() + .as_str() + { + "slow" => PolygonPriority::PolygonPrioritySlow, + "fast" => PolygonPriority::PolygonPriorityFast, + "express" => PolygonPriority::PolygonPriorityExpress, + _ => PolygonPriority::PolygonPrioritySlow, + } +} + +pub async fn get_glm_balance(address: H160, network: Network) -> Result { + with_clients(network, |client| { + get_glm_balance_with(client, address, network) + }) + .await +} + +async fn get_glm_balance_with( + client: Web3, + address: H160, + network: Network, +) -> Result { + let env = get_env(network); + let glm_contract = prepare_erc20_contract(&client, &env)?; + glm_contract + .query( + BALANCE_ERC20_FUNCTION, + (address,), + None, + Options::default(), + None, + ) + .await + .map_err(Into::into) +} + +pub async fn get_balance(address: H160, network: Network) -> Result { + with_clients(network, |client| get_balance_with(address, client)).await +} + +async fn get_balance_with(address: H160, client: Web3) -> Result { + client + .eth() + .balance(address, None) + .await + .map_err(Into::into) +} + +pub async fn get_next_nonce_pending(address: H160, network: Network) -> Result { + with_clients(network, |client| { + get_next_nonce_pending_with(client, address) + }) + .await +} + +async fn get_next_nonce_pending_with( + client: Web3, + address: H160, +) -> Result { + client + .eth() + .transaction_count(address, Some(web3::types::BlockNumber::Pending)) + .await + .map_err(Into::into) +} + +pub async fn with_clients(network: Network, mut f: F) -> Result +where + F: FnMut(Web3) -> R, + R: futures::Future>, +{ + let clients = get_clients(network).await?; + let mut last_err: Option = None; + + for client in clients { + match f(client).await { + Ok(result) => return Ok(result), + Err(ClientError::Web3(e)) => match e { + Error::Internal | Error::Recovery(_) | Error::Rpc(_) | Error::Decoder(_) => { + return Err(GenericError::new(e)) + } + _ => continue, + }, + Err(e) => last_err.replace(e), + }; + } + + match last_err { + Some(e) => Err(e.into()), + _ => Err(GenericError::new("Web3 clients failed.")), + } +} + +pub async fn block_number(network: Network) -> Result { + with_clients(network, block_number_with).await +} + +async fn block_number_with(client: Web3) -> Result { + client.eth().block_number().await.map_err(Into::into) +} + +pub async fn sign_faucet_tx( + address: H160, + network: Network, + nonce: U256, +) -> Result { + with_clients(network, |client| { + sign_faucet_tx_with(client, address, network, nonce) + }) + .await +} + +async fn sign_faucet_tx_with( + client: Web3, + address: H160, + network: Network, + nonce: U256, +) -> Result { + let env = get_env(network); + let contract = prepare_glm_faucet_contract(&client, &env)?; + let contract = match contract { + Some(c) => c, + None => { + return Err(ClientError::new( + "Failed to get faucet fn, are you on the right network?", + )) + } + }; + + let data = eth_utils::contract_encode(&contract, CREATE_FAUCET_FUNCTION, ()).unwrap(); + let gas_price = client.eth().gas_price().await.map_err(GenericError::new)?; + let tx = YagnaRawTransaction { + nonce, + to: Some(contract.address()), + value: U256::from(0), + gas_price, + gas: *GLM_FAUCET_GAS, + data, + }; + //let chain_id = network as u64; + //let node_id = NodeId::from(address.as_ref()); + //let signature = bus::sign(node_id, eth_utils::get_tx_hash(&tx, chain_id)).await?; + + Ok(create_dao_entity( + nonce, + address, + gas_price.to_string(), + Some(gas_price.to_string()), + GLM_FAUCET_GAS.as_u32() as i32, + serde_json::to_string(&tx).map_err(GenericError::new)?, + network, + Utc::now(), + TxType::Faucet, + None, + )) +} + +pub async fn sign_raw_transfer_transaction( + address: H160, + network: Network, + tx: &YagnaRawTransaction, +) -> Result, GenericError> { + let chain_id = network as u64; + let node_id = NodeId::from(address.as_ref()); + let signature = bus::sign(node_id, eth_utils::get_tx_hash(tx, chain_id)).await?; + Ok(signature) +} + +pub async fn sign_hash_of_data(address: H160, hash: Vec) -> Result, GenericError> { + let node_id = NodeId::from(address.as_ref()); + + let signature = bus::sign(node_id, hash).await?; + Ok(signature) +} + +pub async fn prepare_raw_transaction( + _address: H160, + recipient: H160, + amount: U256, + network: Network, + nonce: U256, + gas_price_override: Option, + gas_limit_override: Option, +) -> Result { + with_clients(network, |client| { + prepare_raw_transaction_with( + client, + _address, + recipient, + amount, + network, + nonce, + gas_price_override, + gas_limit_override, + ) + }) + .await +} + +async fn prepare_raw_transaction_with( + client: Web3, + _address: H160, + recipient: H160, + amount: U256, + network: Network, + nonce: U256, + gas_price_override: Option, + gas_limit_override: Option, +) -> Result { + let env = get_env(network); + let contract = prepare_erc20_contract(&client, &env)?; + let data = eth_utils::contract_encode(&contract, TRANSFER_ERC20_FUNCTION, (recipient, amount)) + .map_err(GenericError::new)?; + + //get gas price from network in not provided + let gas_price = match gas_price_override { + Some(gas_price_new) => gas_price_new, + None => { + let small_gas_bump = U256::from(1000); + let mut gas_price_from_network = + client.eth().gas_price().await.map_err(GenericError::new)?; + + //add small amount of gas to be first in queue + if gas_price_from_network / 1000 > small_gas_bump { + gas_price_from_network += small_gas_bump; + } + gas_price_from_network + } + }; + + let gas_limit = match network { + Network::Polygon => gas_limit_override.map_or(*GLM_POLYGON_GAS_LIMIT, U256::from), + Network::Mumbai => gas_limit_override.map_or(*GLM_POLYGON_GAS_LIMIT, U256::from), + _ => gas_limit_override.map_or(*GLM_TRANSFER_GAS, U256::from), + }; + + let tx = YagnaRawTransaction { + nonce, + to: Some(contract.address()), + value: U256::from(0), + gas_price, + gas: gas_limit, + data, + }; + + Ok(tx) +} + +pub async fn send_tx(signed_tx: Vec, network: Network) -> Result { + with_clients(network, |client| send_tx_with(client, signed_tx.clone())).await +} + +async fn send_tx_with(client: Web3, signed_tx: Vec) -> Result { + client + .eth() + .send_raw_transaction(Bytes::from(signed_tx)) + .await + .map_err(Into::into) +} + +pub struct TransactionChainStatus { + pub exists_on_chain: bool, + pub pending: bool, + pub confirmed: bool, + pub succeeded: bool, + pub gas_used: Option, + pub gas_price: Option, +} + +pub async fn get_tx_on_chain_status( + tx_hash: H256, + current_block: Option, + network: Network, +) -> Result { + let mut res = TransactionChainStatus { + exists_on_chain: false, + pending: false, + confirmed: false, + succeeded: false, + gas_price: None, + gas_used: None, + }; + let env = get_env(network); + let tx = get_tx_receipt(tx_hash, network).await?; + if let Some(tx) = tx { + res.exists_on_chain = true; + res.gas_used = tx.gas_used; + const TRANSACTION_STATUS_SUCCESS: u64 = 1; + if tx.status == Some(ethereum_types::U64::from(TRANSACTION_STATUS_SUCCESS)) { + res.succeeded = true; + } + if let Some(tx_bn) = tx.block_number { + // TODO: Store tx.block_number in DB and check only once after required_confirmations. + log::trace!( + "is_tx_confirmed? tb + rq - 1 <= cb. tb={}, rq={}, cb={}", + tx_bn, + env.required_confirmations, + current_block.unwrap_or(0) + ); + // tx.block_number is the first confirmation, so we need to - 1 + if let Some(current_block) = current_block { + if tx_bn.as_u64() + env.required_confirmations - 1 <= current_block { + res.confirmed = true; + } + } + let transaction = get_tx_from_network(tx_hash, network).await?; + if let Some(t) = transaction { + res.gas_price = t.gas_price; + } + } else { + } + } else { + let transaction = get_tx_from_network(tx_hash, network).await?; + if let Some(_transaction) = transaction { + res.exists_on_chain = true; + res.pending = true; + } + } + Ok(res) +} + +//unused but tested that it is working for transfers +pub async fn decode_encoded_transaction_data( + network: Network, + encoded: &str, +) -> Result<(ethereum_types::Address, ethereum_types::U256), GenericError> { + with_clients(network, |client| { + decode_encoded_transaction_data_with(client, network, encoded) + }) + .await +} + +async fn decode_encoded_transaction_data_with( + client: Web3, + network: Network, + encoded: &str, +) -> Result<(ethereum_types::Address, ethereum_types::U256), ClientError> { + let env = get_env(network); + let contract = prepare_erc20_contract(&client, &env)?; + let raw_tx: YagnaRawTransaction = serde_json::from_str(encoded).map_err(GenericError::new)?; + + let tokens = eth_utils::contract_decode(&contract, TRANSFER_ERC20_FUNCTION, raw_tx.data) + .map_err(GenericError::new)?; + let mut address: Option = None; + let mut amount: Option = None; + for token in tokens { + match token { + Token::Address(val) => address = Some(val), + Token::Uint(am) => amount = Some(am), + _ => {} + }; + } + if let Some(add) = address { + if let Some(am) = amount { + return Ok((add, am)); + } + } + Err(GenericError::new("Failed to parse tokens").into()) +} + +pub async fn get_tx_from_network( + tx_hash: H256, + network: Network, +) -> Result, GenericError> { + with_clients(network, |client| get_tx_from_network_with(client, tx_hash)).await +} + +async fn get_tx_from_network_with( + client: Web3, + tx_hash: H256, +) -> Result, ClientError> { + client + .eth() + .transaction(TransactionId::from(tx_hash)) + .await + .map_err(Into::into) +} + +pub async fn get_tx_receipt( + tx_hash: H256, + network: Network, +) -> Result, GenericError> { + with_clients(network, |client| get_tx_receipt_with(client, tx_hash)).await +} + +async fn get_tx_receipt_with( + client: Web3, + tx_hash: H256, +) -> Result, ClientError> { + client + .eth() + .transaction_receipt(tx_hash) + .await + .map_err(Into::into) +} + +fn get_rpc_addr_from_env(network: Network) -> Vec { + match network { + Network::Mainnet => { + collect_rpc_addr_from("MAINNET_GETH_ADDR", "https://geth.golem.network:55555") + } + Network::Yatestnet => { + collect_rpc_addr_from("YATESTNET_GETH_ADDR", "https://yatestnet.org/web3/yagna") + } + Network::Rinkeby => collect_rpc_addr_from( + "RINKEBY_GETH_ADDR", + "http://geth.testnet.golem.network:55555", + ), + Network::Goerli => { + collect_rpc_addr_from("GOERLI_GETH_ADDR", "https://rpc.ankr.com/eth_goerli") + } + Network::Polygon => collect_rpc_addr_from( + "POLYGON_GETH_ADDR", + "https://bor.golem.network,https://polygon-rpc.com", + ), + Network::Mumbai => collect_rpc_addr_from( + "MUMBAI_GETH_ADDR", + "https://matic-mumbai.chainstacklabs.com", + ), + } +} + +fn collect_rpc_addr_from(env: &str, default: &str) -> Vec { + std::env::var(env) + .ok() + .unwrap_or_else(|| default.to_string()) + .split(',') + .map(|path| path.to_string()) + .collect() +} + +async fn get_clients(network: Network) -> Result>, GenericError> { + let geth_addrs = get_rpc_addr_from_env(network); + let mut clients: Vec> = Default::default(); + + for geth_addr in geth_addrs { + { + let client_map = WEB3_CLIENT_MAP.read().await; + if let Some(client) = client_map.get(&geth_addr).cloned() { + clients.push(client); + continue; + } + } + + let transport = match web3::transports::Http::new(&geth_addr) { + Ok(t) => t, + Err(_) => continue, + }; + + let client = Web3::new(transport); + + let mut client_map = WEB3_CLIENT_MAP.write().await; + client_map.insert(geth_addr, client.clone()); + + clients.push(client); + } + + Ok(clients) +} + +fn get_env(network: Network) -> config::EnvConfiguration { + match network { + Network::Mainnet => *config::MAINNET_CONFIG, + Network::Rinkeby => *config::RINKEBY_CONFIG, + Network::Goerli => *config::GOERLI_CONFIG, + Network::Mumbai => *config::MUMBAI_CONFIG, + Network::Yatestnet => *config::YATESTNET_CONFIG, + Network::Polygon => *config::POLYGON_MAINNET_CONFIG, + } +} + +fn prepare_contract( + ethereum_client: &Web3, + address: H160, + json_abi: &[u8], +) -> Result, GenericError> { + let contract = + Contract::from_json(ethereum_client.eth(), address, json_abi).map_err(GenericError::new)?; + + Ok(contract) +} + +fn prepare_erc20_contract( + ethereum_client: &Web3, + env: &config::EnvConfiguration, +) -> Result, GenericError> { + prepare_contract( + ethereum_client, + env.glm_contract_address, + include_bytes!("../contracts/ierc20.json"), + ) +} + +fn prepare_glm_faucet_contract( + ethereum_client: &Web3, + env: &config::EnvConfiguration, +) -> Result>, GenericError> { + if let Some(glm_faucet_address) = env.glm_faucet_address { + Ok(Some(prepare_contract( + ethereum_client, + glm_faucet_address, + include_bytes!("../contracts/faucet.json"), + )?)) + } else { + Ok(None) + } +} + +fn prepare_eip712_contract( + ethereum_client: &Web3, + env: &config::EnvConfiguration, +) -> Result, GenericError> { + prepare_contract( + ethereum_client, + env.glm_contract_address, + include_bytes!("../contracts/eip712.json"), + ) +} + +fn prepare_meta_transaction_contract( + ethereum_client: &Web3, + env: &config::EnvConfiguration, +) -> Result, GenericError> { + prepare_contract( + ethereum_client, + env.glm_contract_address, + include_bytes!("../contracts/meta_transaction.json"), + ) +} + +pub fn create_dao_entity( + nonce: U256, + sender: H160, + starting_gas_price: String, + max_gas_price: Option, + gas_limit: i32, + encoded_raw_tx: String, + network: Network, + timestamp: DateTime, + tx_type: TxType, + amount: Option, +) -> TransactionEntity { + let current_naive_time = timestamp.naive_utc(); + TransactionEntity { + tx_id: Uuid::new_v4().to_string(), + sender: format!("0x{:x}", sender), + nonce: nonce.as_u32() as i32, + time_created: current_naive_time, + time_last_action: current_naive_time, + time_sent: None, + time_confirmed: None, + max_gas_price, + final_gas_used: None, + amount_base: Some("0".to_string()), + amount_erc20: amount.as_ref().map(|a| big_dec_to_u256(a).to_string()), + gas_limit: Some(gas_limit), + starting_gas_price: Some(starting_gas_price), + current_gas_price: None, + encoded: encoded_raw_tx, + status: TransactionStatus::Created as i32, + tx_type: tx_type as i32, + signature: None, + tmp_onchain_txs: None, + final_tx: None, + network, + last_error_msg: None, + resent_times: 0, + } +} + +pub fn get_max_gas_costs(db_tx: &TransactionEntity) -> Result { + let raw_tx: YagnaRawTransaction = + serde_json::from_str(&db_tx.encoded).map_err(GenericError::new)?; + Ok(raw_tx.gas_price * raw_tx.gas) +} + +pub fn get_gas_price_from_db_tx(db_tx: &TransactionEntity) -> Result { + let raw_tx: YagnaRawTransaction = + serde_json::from_str(&db_tx.encoded).map_err(GenericError::new)?; + Ok(raw_tx.gas_price) +} + +pub async fn get_nonce_from_contract( + address: H160, + network: Network, +) -> Result { + let env = get_env(network); + + with_clients(network, |client| async move { + let meta_tx_contract = prepare_meta_transaction_contract(&client, &env)?; + let nonce: U256 = meta_tx_contract + .query( + GET_NONCE_FUNCTION, + (address,), + None, + Options::default(), + None, + ) + .await + .map_err(GenericError::new)?; + + Ok(nonce) + }) + .await +} + +pub async fn encode_transfer_abi( + recipient: H160, + amount: U256, + network: Network, +) -> Result, GenericError> { + let env = get_env(network); + with_clients(network, |client| async move { + let erc20_contract = prepare_erc20_contract(&client, &env)?; + let function_abi = eth_utils::contract_encode( + &erc20_contract, + TRANSFER_ERC20_FUNCTION, + (recipient, amount), + ) + .map_err(GenericError::new)?; + + Ok(function_abi) + }) + .await +} + +/// Creates EIP712 message for calling `function_abi` using contract's 'executeMetaTransaction' function +/// Message can be later signed, and send to the contract in order to make an indirect call. +pub async fn encode_meta_transaction_to_eip712( + sender: H160, + recipient: H160, + amount: U256, + nonce: U256, + function_abi: &[u8], + network: Network, +) -> Result, GenericError> { + info!("Creating meta tx for sender {sender:02X?}, recipient {recipient:02X?}, amount {amount:?}, nonce {nonce:?}, network {network:?}"); + + const META_TRANSACTION_SIGNATURE: &str = + "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"; + const MAGIC: [u8; 2] = [0x19, 0x1]; + + let env = get_env(network); + + with_clients(network, |client| async move { + let eip712_contract = prepare_eip712_contract(&client, &env)?; + let domain_separator: Vec = eip712_contract + .query( + GET_DOMAIN_SEPARATOR_FUNCTION, + (), + None, + Options::default(), + None, + ) + .await + .map_err(|e| GenericError::new(format!("Unable to query contract, reason: {e}")))?; + + let mut eip712_message = Vec::from(MAGIC); + + let abi_hash = H256::from_slice(&keccak256_hash(function_abi)); + let encoded_data = ethabi::encode(&(nonce, sender, abi_hash).into_tokens()); + + let type_hash = keccak256_hash(META_TRANSACTION_SIGNATURE.as_bytes()); + let hash_struct = keccak256_hash(&[type_hash, encoded_data].concat()); + + eip712_message.extend_from_slice(&domain_separator); + eip712_message.extend_from_slice(&hash_struct); + + debug!("full eip712 message: {eip712_message:02X?}"); + + Ok(eip712_message) + }) + .await +} + +#[cfg(test)] +mod tests { + use std::str::FromStr; + + use ethereum_types::U256; + + use super::*; + + #[tokio::test] + async fn test_create_gasless_message() { + let sender = H160::from_str("0xfeaed3f817169c012d040f05c6c52bce5740fc37").unwrap(); + let recipient = H160::from_str("0xd4EA255B238E214A9A0E5656eC36Fe27CD14adAC").unwrap(); + let amount: U256 = U256::from_dec_str("12300000000000").unwrap(); + let nonce = U256::from(27u32); + let network = Network::Polygon; + + let transfer_abi = encode_transfer_abi(recipient, amount, network) + .await + .unwrap(); + let encoded_meta_transfer = encode_meta_transaction_to_eip712( + sender, + recipient, + amount, + nonce, + &transfer_abi, + network, + ) + .await + .unwrap(); + + assert_eq!(hex::encode(transfer_abi), "a9059cbb000000000000000000000000d4ea255b238e214a9a0e5656ec36fe27cd14adac00000000000000000000000000000000000000000000000000000b2fd1217800"); + assert_eq!(hex::encode(encoded_meta_transfer), "1901804e8c6f5926bd56018ff8fa95b472e09d8b3612bf1b892f2d5e5f4365a5e95e7bc74d293cbaa554151b05ad958d04d7c19f2552a6315fe4a99f6aef60a887fd"); + } +} diff --git a/core/payment-driver/erc20next/src/erc20/faucet.rs b/core/payment-driver/erc20next/src/erc20/faucet.rs new file mode 100644 index 0000000000..9eefce63df --- /dev/null +++ b/core/payment-driver/erc20next/src/erc20/faucet.rs @@ -0,0 +1,176 @@ +/* + Top up new accounts from the rinkeby erc20 faucet and wait for the funds to arive. +*/ + +// External crates +use bigdecimal::{BigDecimal, FromPrimitive}; +use chrono::{Duration, Utc}; +use lazy_static::lazy_static; +use std::{env, time}; +use tokio::time::sleep; +use web3::types::{H160, U256}; + +// Workspace uses +use ya_payment_driver::{db::models::Network, model::GenericError, utils}; +use ya_utils_networking::resolver; + +// Local uses +use crate::dao::Erc20Dao; +use crate::erc20::{ethereum, wallet}; + +const DEFAULT_FAUCET_SRV_PREFIX: &str = "_eth-faucet._tcp"; +const DEFAULT_ETH_FAUCET_HOST: &str = "faucet.testnet.golem.network"; +const FAUCET_ADDR_ENVAR: &str = "ETH_FAUCET_ADDRESS"; +const MAX_FAUCET_REQUESTS: u32 = 6; + +lazy_static! { + static ref MIN_GLM_BALANCE: U256 = utils::big_dec_to_u256(&BigDecimal::from(50)); + static ref MIN_ETH_BALANCE: U256 = + utils::big_dec_to_u256(&BigDecimal::from_f64(0.005).unwrap()); + static ref MAX_WAIT: Duration = Duration::minutes(1); +} + +pub async fn request_glm( + dao: &Erc20Dao, + address: H160, + network: Network, +) -> Result<(), GenericError> { + let str_addr = format!("0x{:x}", address); + let balance = ethereum::get_balance(address, network).await?; + if balance >= *MIN_ETH_BALANCE { + log::info!("Enough tETH balance."); + } else { + log::info!( + "Requesting tETH from erc20 faucet... address = {}", + &str_addr + ); + + for i in 0..MAX_FAUCET_REQUESTS { + match faucet_donate(address, network).await { + Ok(()) => break, + Err(e) => { + // Do not warn nor sleep at the last try. + if i >= MAX_FAUCET_REQUESTS - 1 { + log::error!( + "Failed to request tGLM from Faucet, tried {} times.: {:?}", + MAX_FAUCET_REQUESTS, + e + ); + return Err(e); + } else { + log::warn!( + "Retrying ({}/{}) to request tGLM from Faucet after failure: {:?}", + i + 1, + MAX_FAUCET_REQUESTS, + e + ); + sleep(time::Duration::from_secs(10)).await; + } + } + } + } + wait_for_eth(address, network).await?; + } + let glm_balance = ethereum::get_glm_balance(address, network).await?; + + if glm_balance >= *MIN_GLM_BALANCE { + log::info!("Enough tGLM balance."); + return Ok(()); + } + let pending = dao.get_pending_faucet_txs(&str_addr, network).await; + if !pending.is_empty() { + log::info!("Already pending a mint transactin."); + return Ok(()); + } + log::info!( + "Requesting tGLM from erc20 faucet... address = {}", + &str_addr + ); + + let nonce = wallet::get_next_nonce(dao, address, network).await?; + let db_tx = ethereum::sign_faucet_tx(address, network, nonce).await?; + // After inserting into the database, the tx will get send by the send_payments job + dao.insert_raw_transaction(db_tx).await; + + // Wait for tx to get mined: + // - send_payments job runs every 10 seconds + // - blocks are mined every 15 seconds + sleep(time::Duration::from_secs(10)).await; + + wait_for_glm(address, network).await?; + + Ok(()) +} + +async fn wait_for_eth(address: H160, network: Network) -> Result<(), GenericError> { + log::info!("Waiting for tETH from faucet..."); + let wait_until = Utc::now() + *MAX_WAIT; + while Utc::now() < wait_until { + if ethereum::get_balance(address, network).await? >= *MIN_ETH_BALANCE { + log::info!("Received tETH from faucet."); + return Ok(()); + } + sleep(time::Duration::from_secs(3)).await; + } + let msg = "Waiting for tETH timed out."; + log::error!("{}", msg); + Err(GenericError::new(msg)) +} + +async fn wait_for_glm(address: H160, network: Network) -> Result<(), GenericError> { + log::info!("Waiting for tGLM from faucet..."); + let wait_until = Utc::now() + *MAX_WAIT; + while Utc::now() < wait_until { + if ethereum::get_glm_balance(address, network).await? >= *MIN_GLM_BALANCE { + log::info!("Received tGLM from faucet."); + return Ok(()); + } + sleep(time::Duration::from_secs(3)).await; + } + let msg = "Waiting for tGLM timed out."; + log::error!("{}", msg); + Err(GenericError::new(msg)) +} + +async fn faucet_donate(address: H160, network: Network) -> Result<(), GenericError> { + // TODO: Reduce timeout to 20-30 seconds when transfer is used. + let client = awc::Client::builder() + .timeout(std::time::Duration::from_secs(60)) + .finish(); + let faucet_url = resolve_faucet_url(network).await?; + let request_url = format!("{}/0x{:x}", faucet_url, address); + let request_url = resolver::try_resolve_dns_record(&request_url).await; + debug!("Faucet request url: {}", request_url); + let response = client + .get(request_url) + .send() + .await + .map_err(GenericError::new)? + .body() + .await + .map_err(GenericError::new)?; + let response = String::from_utf8_lossy(response.as_ref()); + log::debug!("Funds requested. Response = {}", response); + // TODO: Verify tx hash + Ok(()) +} + +async fn resolve_faucet_url(network: Network) -> Result { + match env::var(FAUCET_ADDR_ENVAR) { + Ok(addr) => Ok(addr), + _ => { + let faucet_host = resolver::resolve_yagna_srv_record(DEFAULT_FAUCET_SRV_PREFIX) + .await + .unwrap_or_else(|_| DEFAULT_ETH_FAUCET_HOST.to_string()); + + let port = match network { + Network::Mumbai => 4002, + Network::Goerli => 4001, + Network::Rinkeby => 4000, + _ => return Err(GenericError::new("faucet not defined")), + }; + + Ok(format!("http://{faucet_host}:{port}/donate")) + } + } +} diff --git a/core/payment-driver/erc20next/src/erc20/mod.rs b/core/payment-driver/erc20next/src/erc20/mod.rs new file mode 100644 index 0000000000..5900681925 --- /dev/null +++ b/core/payment-driver/erc20next/src/erc20/mod.rs @@ -0,0 +1,12 @@ +/* + Private mod to encapsulate all erc20 logic, revealed from the `wallet`. +*/ + +pub mod ethereum; +pub mod faucet; +pub mod utils; +pub mod wallet; + +mod config; +pub mod eth_utils; +pub mod transaction; diff --git a/core/payment-driver/erc20next/src/erc20/transaction.rs b/core/payment-driver/erc20next/src/erc20/transaction.rs new file mode 100644 index 0000000000..f204918ce5 --- /dev/null +++ b/core/payment-driver/erc20next/src/erc20/transaction.rs @@ -0,0 +1,19 @@ +use ethereum_types::{H160, U256}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)] +pub struct YagnaRawTransaction { + /// Nonce value + pub nonce: U256, + /// Recipient, None when creating contract + pub to: Option, + /// Transferred value + pub value: U256, + /// Gas price + #[serde(rename = "gasPrice")] + pub gas_price: U256, + /// Gas amount + pub gas: U256, + /// Transaction data + pub data: Vec, +} diff --git a/core/payment-driver/erc20next/src/erc20/utils.rs b/core/payment-driver/erc20next/src/erc20/utils.rs new file mode 100644 index 0000000000..1eea29112e --- /dev/null +++ b/core/payment-driver/erc20next/src/erc20/utils.rs @@ -0,0 +1,91 @@ +/* + Erc20 related utilities. +*/ + +use std::str::FromStr; + +// External uses +use bigdecimal::BigDecimal; +use lazy_static::lazy_static; +use num_bigint::{BigInt, BigUint, ToBigInt}; +use web3::types::{Address, H160, H256, U256}; +// Workspace uses +use ya_payment_driver::model::GenericError; + +lazy_static! { + // TODO: Get token decimals from erc20-provider / wallet + pub static ref PRECISION: BigDecimal = BigDecimal::from(1_000_000_000_000_000_000u64); + pub static ref GWEI_PRECISION: BigDecimal = BigDecimal::from(1_000_000_000u64); +} + +pub fn big_dec_to_u256(v: &BigDecimal) -> Result { + let v = v * &(*PRECISION); + let v = v + .to_bigint() + .ok_or_else(|| GenericError::new("Failed to convert to bigint"))?; + let v = &v.to_string(); + U256::from_dec_str(v).map_err(GenericError::new) +} + +pub fn big_dec_gwei_to_u256(v: BigDecimal) -> Result { + let v = v * &(*GWEI_PRECISION); + let v = v + .to_bigint() + .ok_or_else(|| GenericError::new("Failed to convert to bigint"))?; + let v = &v.to_string(); + U256::from_dec_str(v).map_err(GenericError::new) +} + +pub fn u256_to_big_dec(v: U256) -> Result { + let v: BigDecimal = v.to_string().parse().map_err(GenericError::new)?; + Ok(v / &(*PRECISION)) +} + +pub fn big_uint_to_big_dec(v: BigUint) -> BigDecimal { + let v: BigDecimal = Into::::into(v).into(); + v / &(*PRECISION) +} + +pub fn topic_to_str_address(topic: &H256) -> String { + let result = H160::from_slice(&topic.as_bytes()[12..]); + format!("0x{:x}", result) +} + +pub fn str_to_big_dec(v: &str) -> Result { + let v: BigDecimal = BigDecimal::from_str(v).map_err(GenericError::new)?; + Ok(v) +} + +pub fn str_to_addr(addr: &str) -> Result { + match addr.trim_start_matches("0x").parse() { + Ok(addr) => Ok(addr), + Err(_e) => Err(GenericError::new(format!( + "Unable to parse address {}", + addr + ))), + } +} + +pub fn convert_float_gas_to_u256(gas_in_gwei: f64) -> U256 { + let gas_in_wei = gas_in_gwei * 1.0E9; + let gas_in_wei_int = gas_in_wei as u64; + U256::from(gas_in_wei_int) +} +pub fn convert_u256_gas_to_float(gas_in_wei: U256) -> f64 { + let gas_in_wei = gas_in_wei.as_u64() as f64; + + gas_in_wei * 1.0E-9 +} + +pub fn gas_float_equals(gas_value1: f64, gas_value2: f64) -> bool { + if gas_value1 > 0.0 + && gas_value2 > 0.0 + && (gas_value1 - gas_value2).abs() / (gas_value1 + gas_value2) < 0.0001 + { + return true; + } + if gas_value1 == 0.0 && gas_value2 == 0.0 { + return true; + } + false +} diff --git a/core/payment-driver/erc20next/src/erc20/wallet.rs b/core/payment-driver/erc20next/src/erc20/wallet.rs new file mode 100644 index 0000000000..08b18f1ad2 --- /dev/null +++ b/core/payment-driver/erc20next/src/erc20/wallet.rs @@ -0,0 +1,455 @@ +/* + Wallet functions on erc20. +*/ + +// External crates +use crate::erc20::ethereum::{ + get_polygon_gas_price_method, get_polygon_maximum_price, get_polygon_priority, + get_polygon_starting_price, PolygonGasPriceMethod, PolygonPriority, + POLYGON_PREFERRED_GAS_PRICES_EXPRESS, POLYGON_PREFERRED_GAS_PRICES_FAST, + POLYGON_PREFERRED_GAS_PRICES_SLOW, +}; +use bigdecimal::BigDecimal; +use chrono::Utc; +use num_bigint::BigUint; +use std::str::FromStr; +use web3::types::{H160, H256, U256, U64}; + +// Workspace uses +use ya_payment_driver::{ + db::models::{Network, TransactionEntity, TxType}, + model::{GenericError, Init, PaymentDetails}, +}; + +// Local uses +use crate::erc20::transaction::YagnaRawTransaction; +use crate::{ + dao::Erc20Dao, + erc20::{ + eth_utils, ethereum, faucet, + utils::{ + big_dec_gwei_to_u256, big_dec_to_u256, big_uint_to_big_dec, convert_float_gas_to_u256, + convert_u256_gas_to_float, str_to_addr, topic_to_str_address, u256_to_big_dec, + }, + }, + RINKEBY_NETWORK, +}; +use ya_payment_driver::db::models::TransactionStatus; + +pub async fn account_balance(address: H160, network: Network) -> Result { + let balance_com = ethereum::get_glm_balance(address, network).await?; + + let balance = u256_to_big_dec(balance_com)?; + log::debug!( + "account_balance. address={}, network={}, balance={}", + address, + &network, + &balance + ); + + Ok(balance) +} + +pub async fn account_gas_balance( + address: H160, + network: Network, +) -> Result { + let balance_com = ethereum::get_balance(address, network).await?; + let balance = u256_to_big_dec(balance_com)?; + + log::debug!( + "account_gas_balance. address={}, network={}, balance={}", + address, + &network, + &balance + ); + + Ok(balance) +} + +pub async fn init_wallet(msg: &Init) -> Result<(), GenericError> { + log::debug!("init_wallet. msg={:?}", msg); + let address = msg.address(); + let network = msg.network().unwrap_or_else(|| RINKEBY_NETWORK.to_string()); + let network = Network::from_str(&network).map_err(GenericError::new)?; + + // Validate address and that checking balance of GLM and ETH works. + let h160_addr = str_to_addr(&address)?; + let _glm_balance = ethereum::get_glm_balance(h160_addr, network).await?; + let _eth_balance = ethereum::get_balance(h160_addr, network).await?; + + Ok(()) +} + +pub async fn fund(dao: &Erc20Dao, address: H160, network: Network) -> Result<(), GenericError> { + if network == Network::Mainnet { + return Err(GenericError::new("Wallet can not be funded on mainnet.")); + } + faucet::request_glm(dao, address, network).await?; + Ok(()) +} + +pub async fn get_next_nonce( + dao: &Erc20Dao, + address: H160, + network: Network, +) -> Result { + let network_nonce = ethereum::get_next_nonce_pending(address, network).await?; + let str_addr = format!("0x{:x}", &address); + let db_nonce = dao.get_next_nonce(&str_addr, network).await?; + + if db_nonce > network_nonce { + warn!( + "Network nonce different than db nonce: {} != {}", + network_nonce, db_nonce + ); + return Ok(db_nonce); + } + + Ok(network_nonce) +} + +pub async fn has_enough_eth_for_gas( + db_tx: &TransactionEntity, + network: Network, +) -> Result { + let sender_h160 = str_to_addr(&db_tx.sender)?; + let eth_balance = ethereum::get_balance(sender_h160, network).await?; + let gas_costs = ethereum::get_max_gas_costs(db_tx)?; + let gas_price = ethereum::get_gas_price_from_db_tx(db_tx)?; + let human_gas_cost = u256_to_big_dec(gas_costs)?; + let human_gas_price = convert_u256_gas_to_float(gas_price); + if gas_costs > eth_balance { + return Err(GenericError::new(format!( + "Not enough ETH balance for gas. balance={}, gas_cost={}, gas_price={} Gwei, address={}, network={}", + u256_to_big_dec(eth_balance)?, + &human_gas_cost, + &human_gas_price, + &db_tx.sender, + &db_tx.network + ))); + } + Ok(human_gas_cost) +} + +pub async fn get_block_number(network: Network) -> Result { + ethereum::block_number(network).await +} + +pub async fn make_transfer( + details: &PaymentDetails, + nonce: U256, + network: Network, + gas_price: Option, + max_gas_price: Option, + gas_limit: Option, +) -> Result { + log::debug!( + "make_transfer(). network={}, nonce={}, details={:?}", + &network, + &nonce, + &details + ); + let amount_big_dec = details.amount.clone(); + let amount = big_dec_to_u256(&amount_big_dec)?; + + let (gas_price, max_gas_price) = match network { + Network::Polygon => match get_polygon_gas_price_method() { + PolygonGasPriceMethod::PolygonGasPriceStatic => ( + Some(match gas_price { + Some(v) => big_dec_gwei_to_u256(v)?, + None => convert_float_gas_to_u256(get_polygon_starting_price()), + }), + Some(match max_gas_price { + Some(v) => big_dec_gwei_to_u256(v)?, + None => convert_float_gas_to_u256(get_polygon_maximum_price()), + }), + ), + PolygonGasPriceMethod::PolygonGasPriceDynamic => ( + match gas_price { + None => None, + Some(v) => Some(big_dec_gwei_to_u256(v)?), + }, + Some(match max_gas_price { + Some(v) => big_dec_gwei_to_u256(v)?, + None => convert_float_gas_to_u256(get_polygon_maximum_price()), + }), + ), + }, + _ => ( + match gas_price { + None => None, + Some(v) => Some(big_dec_gwei_to_u256(v)?), + }, + match max_gas_price { + None => None, + Some(v) => Some(big_dec_gwei_to_u256(v)?), + }, + ), + }; + + let address = str_to_addr(&details.sender)?; + let recipient = str_to_addr(&details.recipient)?; + // TODO: Implement token + //let token = get_network_token(network, None); + let mut raw_tx = ethereum::prepare_raw_transaction( + address, recipient, amount, network, nonce, gas_price, gas_limit, + ) + .await?; + + if let Some(max_gas_price) = max_gas_price { + if raw_tx.gas_price > max_gas_price { + raw_tx.gas_price = max_gas_price; + } + } + + Ok(ethereum::create_dao_entity( + nonce, + address, + raw_tx.gas_price.to_string(), + max_gas_price.map(|v| v.to_string()), + raw_tx.gas.as_u32() as i32, + serde_json::to_string(&raw_tx).map_err(GenericError::new)?, + network, + Utc::now(), + TxType::Transfer, + Some(amount_big_dec), + )) +} + +fn bump_gas_price(gas_in_gwei: U256) -> U256 { + let min_bump_num: U256 = U256::from(111u64); + let min_bump_den: U256 = U256::from(100u64); + let min_gas = gas_in_gwei * min_bump_num / min_bump_den; + + match get_polygon_gas_price_method() { + PolygonGasPriceMethod::PolygonGasPriceDynamic => { + //ignore maximum gas price, because we have to bump at least 10% so the transaction will be accepted + min_gas + } + PolygonGasPriceMethod::PolygonGasPriceStatic => { + let polygon_prices = get_polygon_priority(); + + let gas_prices: &[f64] = match polygon_prices { + PolygonPriority::PolygonPriorityExpress => { + &POLYGON_PREFERRED_GAS_PRICES_EXPRESS[..] + } + PolygonPriority::PolygonPriorityFast => &POLYGON_PREFERRED_GAS_PRICES_FAST[..], + PolygonPriority::PolygonPrioritySlow => &POLYGON_PREFERRED_GAS_PRICES_SLOW[..], + }; + + gas_prices + .iter() + .map(|&f| convert_float_gas_to_u256(f)) + .find(|&gas_price_step| gas_price_step > min_gas) + .unwrap_or(min_gas) + } + } +} + +pub async fn send_transactions( + dao: &Erc20Dao, + txs: Vec, + network: Network, +) -> Result<(), GenericError> { + // TODO: Use batch sending? + for tx in txs { + let mut raw_tx: YagnaRawTransaction = + match serde_json::from_str::(&tx.encoded) { + Ok(raw_tx) => raw_tx, + Err(err) => { + log::error!( + "send_transactions - YagnaRawTransaction serialization failed: {:?}", + err + ); + //handle problem when deserializing transaction + dao.transaction_confirmed_and_failed( + &tx.tx_id, + "", + None, + "Json parse failed, unrecoverable error", + ) + .await; + continue; + } + }; + + let address = str_to_addr(&tx.sender)?; + + let new_gas_price = if let Some(current_gas_price) = tx.current_gas_price { + if tx.status == TransactionStatus::ResendAndBumpGas as i32 { + let gas_u256 = U256::from_dec_str(¤t_gas_price).map_err(GenericError::new)?; + + let max_gas_u256 = match tx.max_gas_price { + Some(max_gas_price) => { + Some(U256::from_dec_str(&max_gas_price).map_err(GenericError::new)?) + } + None => None, + }; + let new_gas = bump_gas_price(gas_u256); + if let Some(max_gas_u256) = max_gas_u256 { + if gas_u256 > max_gas_u256 { + log::warn!( + "bump gas ({}) larger than max gas ({}) price", + gas_u256, + max_gas_u256 + ) + } + } + new_gas + } else { + U256::from_dec_str(¤t_gas_price).map_err(GenericError::new)? + } + } else if let Some(starting_gas_price) = tx.starting_gas_price { + U256::from_dec_str(&starting_gas_price).map_err(GenericError::new)? + } else { + convert_float_gas_to_u256(get_polygon_starting_price()) + }; + raw_tx.gas_price = new_gas_price; + + let encoded = serde_json::to_string(&raw_tx).map_err(GenericError::new)?; + let signature = ethereum::sign_raw_transfer_transaction(address, network, &raw_tx).await?; + + //save new parameters to db before proceeding. Maybe we should change status to sending + dao.update_tx_fields( + &tx.tx_id, + encoded, + hex::encode(&signature), + Some(new_gas_price.to_string()), + ) + .await; + + let signed = eth_utils::encode_signed_tx(&raw_tx, signature, network as u64); + + match ethereum::send_tx(signed, network).await { + Ok(tx_hash) => { + let str_tx_hash = format!("0x{:x}", &tx_hash); + let str_tx_hash = if let Some(tmp_onchain_txs) = tx.tmp_onchain_txs { + tmp_onchain_txs + ";" + str_tx_hash.as_str() + } else { + str_tx_hash + }; + dao.transaction_sent(&tx.tx_id, &str_tx_hash, Some(raw_tx.gas_price.to_string())) + .await; + log::info!("Send transaction. hash={}", &str_tx_hash); + log::debug!("id={}", &tx.tx_id); + } + Err(e) => { + log::error!( + "Error sending transaction {:?}@{:?}: {:?}", + tx.tx_id, + network, + e + ); + if e.to_string().contains("nonce too low") { + if tx.tmp_onchain_txs.filter(|v| !v.is_empty()).is_some() && tx.resent_times < 5 + { + //if tmp on-chain tx transactions exist give it a chance but marking it as failed sent + dao.transaction_failed_send( + &tx.tx_id, + tx.resent_times + 1, + e.to_string().as_str(), + ) + .await; + continue; + } else { + //if trying to sent transaction too much times just end with unrecoverable error + log::error!("Nonce too low: {:?}", e); + dao.transaction_failed_with_nonce_too_low( + &tx.tx_id, + e.to_string().as_str(), + ) + .await; + continue; + } + } + if e.to_string().contains("already known") { + log::error!("Already known: {:?}. Send transaction with higher gas to get from this error loop. (resent won't fix anything)", e); + dao.retry_send_transaction(&tx.tx_id, true).await; + continue; + } + + dao.transaction_failed_send(&tx.tx_id, tx.resent_times, e.to_string().as_str()) + .await; + } + } + } + Ok(()) +} + +// TODO: calculate fee. Below commented out reference to zkSync implementation +// pub async fn get_tx_fee(address: &str, network: Network) -> Result { +// // let token = get_network_token(network, None); +// // let wallet = get_wallet(&address, network).await?; +// // let tx_fee = wallet +// // .provider +// // .get_tx_fee(TxFeeTypes::Transfer, wallet.address(), token.as_str()) +// // .await +// // .map_err(GenericError::new)? +// // .total_fee; +// // let tx_fee_bigdec = utils::big_uint_to_big_dec(tx_fee); +// // +// // log::debug!("Transaction fee {:.5} {}", tx_fee_bigdec, token.as_str()); +// // Ok(tx_fee_bigdec) +// todo!(); +// } + +pub async fn verify_tx(tx_hash: &str, network: Network) -> Result { + log::debug!("verify_tx. hash={}", tx_hash); + let hex_hash = H256::from_str(&tx_hash[2..]).map_err(|err| { + log::warn!("tx hash failed to parse: {}", tx_hash); + GenericError::new(err) + })?; + let tx = ethereum::get_tx_receipt(hex_hash, network) + .await + .map_err(|err| { + log::warn!( + "Failed to obtain tx receipt from blockchain network: {}", + hex_hash + ); + err + })?; + + if let Some(tx) = tx { + // TODO: Properly parse logs after https://github.com/tomusdrw/rust-web3/issues/208 + // let tx_log = tx.logs.get(0).unwrap_or_else(|| GenericError::new(format!("Failure when parsing tx: {} ", tx_hash)))?; + + let tx_log = tx.logs.get(0).ok_or_else(|| { + GenericError::new(format!("Failure when parsing tx.logs.get(0): {} ", tx_hash)) + })?; + let (topic1, topic2) = match tx_log.topics.as_slice() { + [_, t1, t2] => (t1, t2), + _ => { + return Err(GenericError::new(format!( + "Failure when parsing tx_log.topics.get(1): {} ", + tx_hash + ))) + } + }; + + let sender = topic_to_str_address(topic1); + let recipient = topic_to_str_address(topic2); + + let amount = big_uint_to_big_dec(BigUint::from_bytes_be(&tx_log.data.0)); + + if let Some(_block_number) = tx_log.block_number { + // TODO: Get date from block + } + let date = Some(chrono::Utc::now()); + + let details = PaymentDetails { + recipient, + sender, + amount, + date, + }; + log::debug!("PaymentDetails from blockchain: {:?}", &details); + + Ok(details) + } else { + Err(GenericError::new(format!( + "Transaction {} not found on chain", + tx_hash + ))) + } +} diff --git a/core/payment-driver/erc20next/src/lib.rs b/core/payment-driver/erc20next/src/lib.rs new file mode 100644 index 0000000000..e6f370edfc --- /dev/null +++ b/core/payment-driver/erc20next/src/lib.rs @@ -0,0 +1,57 @@ +/* + Payment driver for yagna using erc20. + + This file only contains constants and imports. +*/ + +// Public +pub const DRIVER_NAME: &str = "erc20"; + +pub const RINKEBY_NETWORK: &str = "rinkeby"; +pub const RINKEBY_TOKEN: &str = "tGLM"; +pub const RINKEBY_PLATFORM: &str = "erc20-rinkeby-tglm"; +pub const RINKEBY_CURRENCY_SHORT: &str = "tETH"; +pub const RINKEBY_CURRENCY_LONG: &str = "Rinkeby Ether"; + +pub const GOERLI_NETWORK: &str = "goerli"; +pub const GOERLI_TOKEN: &str = "tGLM"; +pub const GOERLI_PLATFORM: &str = "erc20-goerli-tglm"; +pub const GOERLI_CURRENCY_SHORT: &str = "tETH"; +pub const GOERLI_CURRENCY_LONG: &str = "Goerli Ether"; + +pub const YATESTNET_NETWORK: &str = "yatestnet"; +pub const YATESTNET_TOKEN: &str = "tGLM"; +pub const YATESTNET_PLATFORM: &str = "erc20-yatestnet-tglm"; +pub const YATESTNET_CURRENCY_SHORT: &str = "tETH"; +pub const YATESTNET_CURRENCY_LONG: &str = "Test Ether"; + +pub const MUMBAI_NETWORK: &str = "mumbai"; +pub const MUMBAI_TOKEN: &str = "tGLM"; +pub const MUMBAI_PLATFORM: &str = "erc20-mumbai-tglm"; +pub const MUMBAI_CURRENCY_SHORT: &str = "tMATIC"; +pub const MUMBAI_CURRENCY_LONG: &str = "Test MATIC"; + +pub const MAINNET_NETWORK: &str = "mainnet"; +pub const MAINNET_TOKEN: &str = "GLM"; +pub const MAINNET_PLATFORM: &str = "erc20-mainnet-glm"; +pub const MAINNET_CURRENCY_SHORT: &str = "ETH"; +pub const MAINNET_CURRENCY_LONG: &str = "Ether"; + +pub const POLYGON_MAINNET_NETWORK: &str = "polygon"; +pub const POLYGON_MAINNET_TOKEN: &str = "GLM"; +pub const POLYGON_MAINNET_PLATFORM: &str = "erc20-polygon-glm"; +pub const POLYGON_MAINNET_CURRENCY_SHORT: &str = "MATIC"; +pub const POLYGON_MAINNET_CURRENCY_LONG: &str = "Polygon"; + +pub use service::Erc20NextService as PaymentDriverService; + +// Private +#[macro_use] +extern crate log; + +mod dao; +mod driver; +pub mod erc20; +mod network; +mod service; +mod signer; diff --git a/core/payment-driver/erc20next/src/network.rs b/core/payment-driver/erc20next/src/network.rs new file mode 100644 index 0000000000..e765568ac1 --- /dev/null +++ b/core/payment-driver/erc20next/src/network.rs @@ -0,0 +1,130 @@ +use maplit::hashmap; +use std::collections::HashMap; +use std::str::FromStr; + +// Workspace uses +use ya_payment_driver::{db::models::Network as DbNetwork, driver::Network, model::GenericError}; + +// Local uses +use crate::{ + GOERLI_CURRENCY_LONG, GOERLI_CURRENCY_SHORT, GOERLI_NETWORK, GOERLI_PLATFORM, GOERLI_TOKEN, + MAINNET_CURRENCY_LONG, MAINNET_CURRENCY_SHORT, MAINNET_NETWORK, MAINNET_PLATFORM, + MAINNET_TOKEN, MUMBAI_CURRENCY_LONG, MUMBAI_CURRENCY_SHORT, MUMBAI_NETWORK, MUMBAI_PLATFORM, + MUMBAI_TOKEN, POLYGON_MAINNET_CURRENCY_LONG, POLYGON_MAINNET_CURRENCY_SHORT, + POLYGON_MAINNET_NETWORK, POLYGON_MAINNET_PLATFORM, POLYGON_MAINNET_TOKEN, + RINKEBY_CURRENCY_LONG, RINKEBY_CURRENCY_SHORT, RINKEBY_NETWORK, RINKEBY_PLATFORM, + RINKEBY_TOKEN, YATESTNET_CURRENCY_LONG, YATESTNET_CURRENCY_SHORT, YATESTNET_NETWORK, + YATESTNET_PLATFORM, YATESTNET_TOKEN, +}; + +lazy_static::lazy_static! { + pub static ref SUPPORTED_NETWORKS: HashMap = hashmap! { + RINKEBY_NETWORK.to_string() => Network { + default_token: RINKEBY_TOKEN.to_string(), + tokens: hashmap! { + RINKEBY_TOKEN.to_string() => RINKEBY_PLATFORM.to_string() + } + }, + GOERLI_NETWORK.to_string() => Network { + default_token: GOERLI_TOKEN.to_string(), + tokens: hashmap! { + GOERLI_TOKEN.to_string() => GOERLI_PLATFORM.to_string() + } + }, + MAINNET_NETWORK.to_string() => Network { + default_token: MAINNET_TOKEN.to_string(), + tokens: hashmap! { + MAINNET_TOKEN.to_string() => MAINNET_PLATFORM.to_string() + } + }, + YATESTNET_NETWORK.to_string() => Network { + default_token: YATESTNET_TOKEN.to_string(), + tokens: hashmap! { + YATESTNET_TOKEN.to_string() => YATESTNET_PLATFORM.to_string() + } + }, + MUMBAI_NETWORK.to_string() => Network { + default_token: MUMBAI_TOKEN.to_string(), + tokens: hashmap! { + MUMBAI_TOKEN.to_string() => MUMBAI_PLATFORM.to_string() + } + }, + POLYGON_MAINNET_NETWORK.to_string() => Network { + default_token: POLYGON_MAINNET_TOKEN.to_string(), + tokens: hashmap! { + POLYGON_MAINNET_TOKEN.to_string() => POLYGON_MAINNET_PLATFORM.to_string() + } + } + }; + pub static ref RINKEBY_DB_NETWORK: DbNetwork = DbNetwork::from_str(RINKEBY_NETWORK).unwrap(); + pub static ref GOERLI_DB_NETWORK: DbNetwork = DbNetwork::from_str(GOERLI_NETWORK).unwrap(); + pub static ref MAINNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(MAINNET_NETWORK).unwrap(); + pub static ref MUMBAI_DB_NETWORK: DbNetwork = DbNetwork::from_str(MUMBAI_NETWORK).unwrap(); + pub static ref POLYGON_MAINNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(POLYGON_MAINNET_NETWORK).unwrap(); + pub static ref YATESTNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(YATESTNET_NETWORK).unwrap(); +} + +pub fn platform_to_network_token(platform: String) -> Result<(DbNetwork, String), GenericError> { + match platform.as_str() { + RINKEBY_PLATFORM => Ok((*RINKEBY_DB_NETWORK, RINKEBY_TOKEN.to_owned())), + GOERLI_PLATFORM => Ok((*GOERLI_DB_NETWORK, GOERLI_TOKEN.to_owned())), + MAINNET_PLATFORM => Ok((*MAINNET_DB_NETWORK, MAINNET_TOKEN.to_owned())), + MUMBAI_PLATFORM => Ok((*MUMBAI_DB_NETWORK, MUMBAI_TOKEN.to_owned())), + YATESTNET_PLATFORM => Ok((*YATESTNET_DB_NETWORK, YATESTNET_TOKEN.to_owned())), + POLYGON_MAINNET_PLATFORM => Ok(( + *POLYGON_MAINNET_DB_NETWORK, + POLYGON_MAINNET_TOKEN.to_owned(), + )), + other => Err(GenericError::new(format!( + "Unable to find network for platform: {}", + other + ))), + } +} + +pub fn platform_to_currency(platform: String) -> Result<(String, String), GenericError> { + match platform.as_str() { + RINKEBY_PLATFORM => Ok(( + RINKEBY_CURRENCY_SHORT.to_owned(), + RINKEBY_CURRENCY_LONG.to_owned(), + )), + GOERLI_PLATFORM => Ok(( + GOERLI_CURRENCY_SHORT.to_owned(), + GOERLI_CURRENCY_LONG.to_owned(), + )), + MAINNET_PLATFORM => Ok(( + MAINNET_CURRENCY_SHORT.to_owned(), + MAINNET_CURRENCY_LONG.to_owned(), + )), + MUMBAI_PLATFORM => Ok(( + MUMBAI_CURRENCY_SHORT.to_owned(), + MUMBAI_CURRENCY_LONG.to_owned(), + )), + POLYGON_MAINNET_PLATFORM => Ok(( + POLYGON_MAINNET_CURRENCY_SHORT.to_owned(), + POLYGON_MAINNET_CURRENCY_LONG.to_owned(), + )), + YATESTNET_PLATFORM => Ok(( + YATESTNET_CURRENCY_SHORT.to_owned(), + YATESTNET_CURRENCY_LONG.to_owned(), + )), + other => Err(GenericError::new(format!( + "Unable to find network currency for platform: {}", + other + ))), + } +} + +pub fn get_network_token(network: DbNetwork, token: Option) -> String { + // Fetch network config, safe as long as all DbNetwork entries are in SUPPORTED_NETWORKS + let network_config = (*SUPPORTED_NETWORKS).get(&(network.to_string())).unwrap(); + // TODO: Check if token in network.tokens + token.unwrap_or_else(|| network_config.default_token.clone()) +} + +pub fn network_like_to_network(network_like: Option) -> DbNetwork { + match network_like { + Some(n) => DbNetwork::from_str(&n).unwrap_or(*RINKEBY_DB_NETWORK), + None => *RINKEBY_DB_NETWORK, + } +} diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs new file mode 100644 index 0000000000..40f2e77165 --- /dev/null +++ b/core/payment-driver/erc20next/src/service.rs @@ -0,0 +1,88 @@ +/* + The service that binds this payment driver into yagna via GSB. +*/ + +use std::env; +// External crates +use erc20_payment_lib::config; +use erc20_payment_lib::config::AdditionalOptions; +use erc20_payment_lib::misc::load_private_keys; +use erc20_payment_lib::runtime::start_payment_engine; +use std::sync::Arc; + +// Workspace uses +use ya_payment_driver::{ + bus, + dao::{init, DbExecutor}, + model::GenericError, +}; +use ya_service_api_interfaces::Provider; + +// Local uses +use crate::{driver::Erc20NextDriver, signer::IdentitySigner}; + +pub struct Erc20NextService; + +impl Erc20NextService { + pub async fn gsb>(context: &Context) -> anyhow::Result<()> { + log::debug!("Connecting Erc20NextService to gsb..."); + + // TODO: Read and validate env + log::debug!("Environment variables validated"); + + // Init database + let db: DbExecutor = context.component(); + init(&db).await.map_err(GenericError::new)?; + log::debug!("Database initialised"); + + // Start cron + //Cron::new(driver_rc.clone()); + log::debug!("Cron started"); + + { + let (private_keys, _public_addresses) = + load_private_keys(&env::var("ETH_PRIVATE_KEYS").unwrap_or_default()).unwrap(); + let additional_options = AdditionalOptions { + keep_running: true, + generate_tx_only: false, + skip_multi_contract_check: false, + contract_use_direct_method: false, + contract_use_unpacked_method: false, + }; + log::warn!("Loading config"); + let config_str = include_str!("../config-payments.toml"); + let config = match config::Config::load("config-payments.toml").await { + Ok(config) => config, + Err(err) => { + log::warn!( + "Failed to load config from config-payments.toml due to {err:?}, using default config" + ); + config::Config::load_from_str(config_str).unwrap() + } + }; + + log::warn!("Starting payment engine: {:#?}", config); + let signer = IdentitySigner::new(); + let pr = start_payment_engine( + &private_keys, + "db.sqlite", + config, + signer, + None, + Some(additional_options), + None, + None, + ) + .await + .unwrap(); + log::warn!("Payment engine started - outside task"); + let driver = Erc20NextDriver::new(pr); + driver.load_active_accounts().await; + let driver_rc = Arc::new(driver); + bus::bind_service(&db, driver_rc.clone()).await?; + + log::info!("Successfully connected Erc20NextService to gsb."); + Ok(()) + } + } +} diff --git a/core/payment-driver/erc20next/src/signer.rs b/core/payment-driver/erc20next/src/signer.rs new file mode 100644 index 0000000000..06cfa3539d --- /dev/null +++ b/core/payment-driver/erc20next/src/signer.rs @@ -0,0 +1,174 @@ +use std::sync::{Arc, Mutex}; + +use async_trait::async_trait; +use erc20_payment_lib::{contracts::DUMMY_RPC_PROVIDER, signer::SignerError}; +use ethereum_types::{H160, H256}; +use web3::{ + signing::{Signature, SigningError}, + types::{Address, SignedTransaction, TransactionParameters}, +}; +use ya_client_model::NodeId; +use ya_payment_driver::bus; + +#[derive(Default, Clone)] +struct DummyKeyState { + message: Vec, + signed: Vec, +} + +/// Key for hacky interaction with the web3 API +/// +/// We cannot sign the transaction here, as it needs to be done by GSB, +/// which cannot be done in the implementation of [`web3::signing::Key`] +/// either. +/// +/// This key is to be used in two steps -- first one invokes `sign_transaction` +/// to capture the payload for signing. Then the payload has to be signed using +/// the identitiy API. Afterwards the signed message can be injected into the state, +/// and `sign_transaction` can be invoked again -- this time returning the pre-computed +/// signature. +/// +/// This doesn't really depend on internal details of web3 and thus will work with future +/// versions of web3 as long as you pass in transactions consistently. This means you +/// cannot depend on `sign_transaction` populating the optional fields: `nonce`, `gas_price` +/// and `chain_id`. +#[derive(Clone)] +struct DummyKey { + pub pub_address: Address, + pub state: Arc>, +} + +impl DummyKey { + fn new(pub_address: Address) -> (DummyKey, Arc>) { + let state = Arc::new(Mutex::new(DummyKeyState::default())); + let key = DummyKey { + pub_address, + state: state.clone(), + }; + (key, state) + } +} + +impl web3::signing::Key for DummyKey { + fn sign(&self, _message: &[u8], _chain_id: Option) -> Result { + panic!("DummyKey cannot sign legacy transactions"); + } + + fn sign_message(&self, message: &[u8]) -> Result { + let mut state = self.state.lock().unwrap(); + + if state.signed.is_empty() { + state.message = message.to_vec(); + Ok(Signature { + v: 0, + r: Default::default(), + s: Default::default(), + }) + } else { + eprintln!("({}) {:?}", state.signed.len(), &state.signed); + Ok(Signature { + v: state.signed[0] as u64, + r: H256::from_slice(&state.signed[1..33]), + s: H256::from_slice(&state.signed[33..65]), + }) + } + } + + fn address(&self) -> Address { + self.pub_address + } +} + +pub struct IdentitySigner; + +impl IdentitySigner { + pub fn new() -> Self { + IdentitySigner + } + + async fn get_matching_node_id(pub_address: H160) -> Result { + let unlocked_identities = + bus::list_unlocked_identities() + .await + .map_err(|e| SignerError { + message: e.to_string(), + })?; + + for node_id in unlocked_identities { + let addr = bus::get_pubkey(node_id).await.map_err(|e| SignerError { + message: e.to_string(), + })?; + let address = ethsign::PublicKey::from_slice(&addr) + .map_err(|_| SignerError { + message: "Public address from bus::get_pubkey is invalid".to_string(), + })? + .address() + .clone(); + + if address == pub_address.as_bytes() { + return Ok(node_id); + } + } + + Err(SignerError { + message: format!("No matching unlocked identity for address {pub_address}"), + }) + } +} + +#[async_trait] +impl erc20_payment_lib::signer::Signer for IdentitySigner { + async fn check_if_sign_possible(&self, pub_address: H160) -> Result<(), SignerError> { + let pool = tokio_util::task::LocalPoolHandle::new(1); + + pool.spawn_pinned(move || async move { + Self::get_matching_node_id(pub_address).await.map(|_| ()) + }) + .await + .map_err(|e| SignerError { + message: e.to_string(), + })? + } + + async fn sign( + &self, + pub_address: H160, + tp: TransactionParameters, + ) -> Result { + let pool = tokio_util::task::LocalPoolHandle::new(1); + let (dummy_key, state) = DummyKey::new(pub_address); + + pool.spawn_pinned(move || async move { + // We don't care about the result. This is only called + // so that web3 computes the message to sign for us. + DUMMY_RPC_PROVIDER + .accounts() + .sign_transaction(tp.clone(), dummy_key.clone()) + .await + .ok(); + + let message = state.lock().unwrap().message.clone(); + let node_id = Self::get_matching_node_id(pub_address).await?; + let signed = bus::sign(node_id, message).await.map_err(|e| SignerError { + message: e.to_string(), + })?; + + { + let mut state = state.lock().unwrap(); + state.signed = signed; + } + + DUMMY_RPC_PROVIDER + .accounts() + .sign_transaction(tp, dummy_key) + .await + .map_err(|e| SignerError { + message: e.to_string(), + }) + }) + .await + .map_err(|e| SignerError { + message: e.to_string(), + })? + } +} diff --git a/core/payment-driver/erc20next/view_transactions.sql b/core/payment-driver/erc20next/view_transactions.sql new file mode 100644 index 0000000000..a2400aee79 --- /dev/null +++ b/core/payment-driver/erc20next/view_transactions.sql @@ -0,0 +1,39 @@ +--use this query to debug and view ERC20 transaction list + + +SELECT tx_id, + ts.status || '(' || t.status || ')' as `status`, + Cast ((julianday('now') - julianday(time_created)) * 24 * 60 * 60 as integer) as `Created ago`, + Cast ((julianday('now') - julianday(time_last_action)) * 24 * 60 * 60 as integer) as `Last action ago`, + Cast ((julianday('now') - julianday(time_sent)) * 24 * 60 * 60 as integer) as `Last sent ago`, + Cast ((julianday('now') - julianday(time_confirmed)) * 24 * 60 * 60 as integer) as `Last confirmed ago`, + Cast ((julianday(time_confirmed) - julianday(time_created)) * 24 * 60 * 60 as integer) as `Total process time`, + nonce, + starting_gas_price, + current_gas_price, + max_gas_price, + final_gas_price, + final_gas_price_exact, + final_gas_used, + amount_base, + amount_base_exact, + amount_erc20, + amount_erc20_exact, + tx_type, + tmp_onchain_txs, + final_tx, + gas_limit, + time_created, + time_last_action, + time_sent, + time_confirmed, + network, + last_error_msg, + resent_times, + signature, + sender, + encoded + FROM `transaction` as t + JOIN `transaction_status` as ts on ts.status_id=t.status + ORDER BY time_created DESC + diff --git a/core/payment-driver/zksync/examples/deposit.rs b/core/payment-driver/zksync/examples/deposit.rs deleted file mode 100644 index cfebbc237e..0000000000 --- a/core/payment-driver/zksync/examples/deposit.rs +++ /dev/null @@ -1,41 +0,0 @@ -#[macro_use] -extern crate log; - -use bigdecimal::BigDecimal; -use std::str::FromStr; -use ya_payment_driver::db::models::Network as DbNetwork; -use ya_zksync_driver::zksync::wallet as driver_wallet; -use zksync::zksync_types::H256; -use zksync::{Network, RpcProvider, Wallet, WalletCredentials}; -use zksync_eth_signer::{EthereumSigner, PrivateKeySigner}; - -const PRIVATE_KEY: &str = "e0c704b6e925c3be222337f9c94610c46b7fec95c14b8f5b9800d20ed4782670"; - -#[actix_rt::main] -async fn main() -> anyhow::Result<()> { - let log_level = std::env::var("RUST_LOG").unwrap_or_else(|_| "info".to_owned()); - std::env::set_var("RUST_LOG", log_level); - env_logger::init(); - - dotenv::dotenv().expect("Failed to read .env file"); - - let private_key = H256::from_str(PRIVATE_KEY).expect("Cannot decode bytes from hex-encoded PK"); - let signer = PrivateKeySigner::new(private_key); - let address = signer.get_address().await?; - info!("Account address {:#x}", address); - - info!("Creating wallet"); - let provider = RpcProvider::new(Network::Rinkeby); - let cred = WalletCredentials::from_eth_signer(address, signer, Network::Rinkeby).await?; - let wallet = Wallet::new(provider, cred).await?; - - let one_tglm = BigDecimal::from(1); - - let deposit_tx_hash = driver_wallet::deposit(wallet, DbNetwork::Rinkeby, one_tglm).await?; - info!( - "Check out deposit transaction at https://rinkeby.etherscan.io/tx/{:#x}", - deposit_tx_hash - ); - - Ok(()) -} diff --git a/core/payment-driver/zksync/examples/simple_balance.rs b/core/payment-driver/zksync/examples/simple_balance.rs deleted file mode 100644 index f6c5249b39..0000000000 --- a/core/payment-driver/zksync/examples/simple_balance.rs +++ /dev/null @@ -1,41 +0,0 @@ -use zksync::zksync_types::Address; -use zksync::Network; -use zksync::{provider::Provider, RpcProvider}; - -use std::str::FromStr; - -#[macro_use] -extern crate log; - -#[tokio::main] -async fn main() { - let log_level = std::env::var("RUST_LOG").unwrap_or_else(|_| "info".to_owned()); - std::env::set_var("RUST_LOG", log_level); - env_logger::init(); - info!("Simple balance check example."); - let pub_key = "bf55a824c3114b07899e63870917da1bc01bcd06"; - - info!("Public key. {}", pub_key); - let pub_address = Address::from_str(pub_key).unwrap(); - info!("Public address. {}", pub_address); - let provider = RpcProvider::new(Network::Rinkeby); - - let acc_info = provider.account_info(pub_address).await.unwrap(); - debug!("{:?}", acc_info); - let token = "tGLM"; - let balance_com = acc_info - .committed - .balances - .get(token as &str) - .map(|x| x.0.clone()) - .unwrap_or_default(); - let balance_ver = acc_info - .verified - .balances - .get(token as &str) - .map(|x| x.0.clone()) - .unwrap_or_default(); - - info!("balance_com: {}", balance_com); - info!("balance_ver: {}", balance_ver); -} diff --git a/core/payment-driver/zksync/examples/withdrawal.rs b/core/payment-driver/zksync/examples/withdrawal.rs deleted file mode 100644 index e98df33bd4..0000000000 --- a/core/payment-driver/zksync/examples/withdrawal.rs +++ /dev/null @@ -1,87 +0,0 @@ -#[macro_use] -extern crate log; - -use bigdecimal::BigDecimal; -use hex::ToHex; -use std::str::FromStr; -use structopt::StructOpt; -use ya_payment_driver::db::models::Network as DbNetwork; -use ya_zksync_driver::zksync::faucet; -use ya_zksync_driver::zksync::wallet as driver_wallet; -use zksync::zksync_types::H256; -use zksync::{Network, RpcProvider, Wallet, WalletCredentials}; -use zksync_eth_signer::{EthereumSigner, PrivateKeySigner}; - -const TOKEN: &str = "tGLM"; -const PRIVATE_KEY: &str = "312776bb901c426cb62238db9015c100948534dea42f9fa1591eff4beb35cc13"; - -#[derive(Clone, Debug, StructOpt)] -struct Args { - #[structopt(long = "gen-key")] - genkey: bool, - - #[structopt(long, default_value = "5.0")] - amount: String, -} - -#[actix_rt::main] -async fn main() -> anyhow::Result<()> { - let log_level = std::env::var("RUST_LOG").unwrap_or_else(|_| "info".to_owned()); - std::env::set_var("RUST_LOG", log_level); - env_logger::init(); - - let args: Args = Args::from_args(); - let private_key = if args.genkey { - debug!("Using randomly generated key"); - H256::random() - } else { - debug!("Using hardcoded key"); - H256::from_str(PRIVATE_KEY).expect("Cannot decode bytes from hex-encoded PK") - }; - - let signer = PrivateKeySigner::new(private_key); - let address = signer.get_address().await?; - let addr_hex = format!("0x{}", address.encode_hex::()); - info!("Account address {}", addr_hex); - - info!("Funding an account"); - faucet::request_tglm(&addr_hex, DbNetwork::Rinkeby).await?; - - info!("Creating wallet"); - let provider = RpcProvider::new(Network::Rinkeby); - let cred = WalletCredentials::from_eth_signer(address, signer, Network::Rinkeby).await?; - let wallet = Wallet::new(provider, cred).await?; - - if !(wallet.is_signing_key_set().await?) { - info!("Unlocking account"); - let unlock = wallet - .start_change_pubkey() - .fee_token(TOKEN)? - .send() - .await?; - debug!("unlock={:?}", unlock); - unlock.wait_for_commit().await?; - } - - let amount: BigDecimal = args - .amount - .parse() - .expect("Cannot parse 'amount' parameter to BigDecimal"); - - let withdraw_handle = - driver_wallet::withdraw(wallet, DbNetwork::Rinkeby, Some(amount), None).await?; - - let tx_info = withdraw_handle.wait_for_commit().await?; - if tx_info.success.unwrap_or(false) { - let tx_hash = withdraw_handle.hash(); - let hash_hex = hex::encode(tx_hash.as_ref()); - info!("Transaction committed, track it here https://rinkeby.zkscan.io/explorer/transactions/{}", hash_hex); - info!("Waiting for verification - this takes LOOONG to complete..."); - withdraw_handle.wait_for_verify().await?; - info!("Withdrawal succeeded!"); - } else { - warn!("Withdraw has failed. Reason: {:?}", tx_info.fail_reason); - } - - Ok(()) -} diff --git a/core/payment-driver/zksync/src/driver.rs b/core/payment-driver/zksync/src/driver.rs deleted file mode 100644 index 9066fd0721..0000000000 --- a/core/payment-driver/zksync/src/driver.rs +++ /dev/null @@ -1,584 +0,0 @@ -/* - ZksyncDriver to handle payments on the zksync network. - - Please limit the logic in this file, use local mods to handle the calls. -*/ -// Extrnal crates -use chrono::{Duration, TimeZone, Utc}; -use futures::lock::Mutex; -use lazy_static::lazy_static; -use num_bigint::BigInt; -use std::collections::HashMap; -use std::env; -use std::str::FromStr; -use uuid::Uuid; - -// Workspace uses -use ya_payment_driver::{ - account::{Accounts, AccountsRc}, - bus, - cron::PaymentDriverCron, - dao::DbExecutor, - db::models::{Network as DbNetwork, PaymentEntity, TxType}, - driver::{async_trait, BigDecimal, IdentityError, IdentityEvent, Network, PaymentDriver}, - model::*, - utils, -}; -use ya_utils_futures::timeout::IntoTimeoutFuture; - -// Local uses -use crate::{ - dao::ZksyncDao, - network::{ - get_network_token, network_token_to_platform, platform_to_network_token, SUPPORTED_NETWORKS, - }, - zksync::wallet, - DEFAULT_NETWORK, DRIVER_NAME, -}; - -lazy_static! { - static ref TX_SUMBIT_TIMEOUT: Duration = Duration::minutes(15); - static ref MAX_ALLOCATION_SURCHARGE: BigDecimal = - match env::var("MAX_ALLOCATION_SURCHARGE").map(|s| s.parse()) { - Ok(Ok(x)) => x, - _ => BigDecimal::from(200), - }; - - // Environment variable will be replaced by allocation parameter in PAY-82 - static ref TRANSACTIONS_PER_ALLOCATION: BigInt = - match env::var("TRANSACTIONS_PER_ALLOCATION").map(|s| s.parse()) { - Ok(Ok(x)) => x, - _ => BigInt::from(10), - }; - - static ref TX_SENDOUT_INTERVAL: std::time::Duration = std::time::Duration::from_secs( - std::env::var("ZKSYNC_SENDOUT_INTERVAL_SECS") - .ok() - .and_then(|x| x.parse().ok()) - .unwrap_or(10), - ); - - static ref TX_CONFIRMATION_INTERVAL: std::time::Duration = std::time::Duration::from_secs( - std::env::var("ZKSYNC_CONFIRMATION_INTERVAL_SECS") - .ok() - .and_then(|x| x.parse().ok()) - .unwrap_or(5), - ); -} - -pub struct ZksyncDriver { - active_accounts: AccountsRc, - dao: ZksyncDao, - sendout_lock: Mutex<()>, - confirmation_lock: Mutex<()>, -} - -impl ZksyncDriver { - pub fn new(db: DbExecutor) -> Self { - Self { - active_accounts: Accounts::new_rc(), - dao: ZksyncDao::new(db), - sendout_lock: Default::default(), - confirmation_lock: Default::default(), - } - } - - pub async fn load_active_accounts(&self) { - log::debug!("load_active_accounts"); - let unlocked_accounts = bus::list_unlocked_identities().await.unwrap(); - let mut accounts = self.active_accounts.borrow_mut(); - for account in unlocked_accounts { - log::debug!("account={}", account); - accounts.add_account(account) - } - } - - fn is_account_active(&self, address: &str) -> bool { - self.active_accounts - .as_ref() - .borrow() - .get_node_id(address) - .is_some() - } - - async fn process_payments_for_account(&self, node_id: &str) { - log::trace!("Processing payments for node_id={}", node_id); - for network_key in self.get_networks().keys() { - let network = DbNetwork::from_str(network_key).unwrap(); - let payments: Vec = - self.dao.get_pending_payments(node_id, network).await; - let mut nonce = 0; - if !payments.is_empty() { - log::info!( - "Processing payments. count={}, network={} node_id={}", - payments.len(), - network_key, - node_id - ); - - nonce = wallet::get_nonce(node_id, network).await; - log::debug!("Payments: nonce={}, details={:?}", &nonce, payments); - } - for payment in payments { - self.handle_payment(payment, &mut nonce).await; - } - } - } - - async fn handle_payment(&self, payment: PaymentEntity, nonce: &mut u32) { - let details = utils::db_to_payment_details(&payment); - let tx_nonce = nonce.to_owned(); - - match wallet::make_transfer(&details, tx_nonce, payment.network).await { - Ok(tx_hash) => { - let tx_id = self - .dao - .insert_transaction(&details, Utc::now(), payment.network) - .await; - self.dao - .transaction_sent(&tx_id, &tx_hash, &payment.order_id) - .await; - *nonce += 1; - } - Err(e) => { - let deadline = - Utc.from_utc_datetime(&payment.payment_due_date) + *TX_SUMBIT_TIMEOUT; - if Utc::now() > deadline { - log::error!("Failed to submit zkSync transaction. Retry deadline reached. details={:?} error={}", payment, e); - self.dao.payment_failed(&payment.order_id).await; - } else { - log::warn!( - "Failed to submit zkSync transaction. Payment will be retried until {}. details={:?} error={}", - deadline, payment, e - ); - }; - } - }; - } -} - -#[async_trait(?Send)] -impl PaymentDriver for ZksyncDriver { - async fn account_event( - &self, - _db: DbExecutor, - _caller: String, - msg: IdentityEvent, - ) -> Result<(), IdentityError> { - self.active_accounts.borrow_mut().handle_event(msg); - Ok(()) - } - - async fn enter( - &self, - _db: DbExecutor, - _caller: String, - msg: Enter, - ) -> Result { - let tx_hash = wallet::enter(msg).await?; - - Ok(format!( - "Deposit transaction has been sent on Ethereum and soon funds should be available \ - on ZkSync network. You can check transaction status in the block explorer. \ - Tracking link: https://rinkeby.zkscan.io/explorer/transactions/{}", - tx_hash - )) - } - - async fn exit( - &self, - _db: DbExecutor, - _caller: String, - msg: Exit, - ) -> Result { - if !self.is_account_active(&msg.sender()) { - return Err(GenericError::new( - "Cannot start withdrawal, account is not active", - )); - } - - let tx_hash = wallet::exit(&msg).await?; - Ok(format!( - "Withdrawal has been accepted by the zkSync operator. \ - It may take some time until the funds are available on Ethereum blockchain. \ - Tracking link: https://rinkeby.zkscan.io/explorer/transactions/{}", - tx_hash - )) - } - - async fn get_account_balance( - &self, - _db: DbExecutor, - _caller: String, - msg: GetAccountBalance, - ) -> Result { - log::debug!("get_account_balance: {:?}", msg); - let (network, _) = platform_to_network_token(msg.platform())?; - - let balance = wallet::account_balance(&msg.address(), network).await?; - - log::debug!("get_account_balance - result: {}", &balance); - Ok(balance) - } - - async fn get_account_gas_balance( - &self, - _db: DbExecutor, - _caller: String, - _msg: GetAccountGasBalance, - ) -> Result, GenericError> { - log::debug!("get_account_gas_balance: unsupported"); - - Ok(None) - } - - fn get_name(&self) -> String { - DRIVER_NAME.to_string() - } - - fn get_default_network(&self) -> String { - DEFAULT_NETWORK.to_string() - } - - fn get_networks(&self) -> HashMap { - SUPPORTED_NETWORKS.clone() - } - - fn recv_init_required(&self) -> bool { - false - } - - async fn init(&self, _db: DbExecutor, _caller: String, msg: Init) -> Result { - log::debug!("init: {:?}", msg); - let address = msg.address().clone(); - let mode = msg.mode(); - - // Ensure account is unlock before initialising send mode - if mode.contains(AccountMode::SEND) && !self.is_account_active(&address) { - return Err(GenericError::new("Can not init, account not active")); - } - - wallet::init_wallet(&msg) - .timeout(Some(180)) - .await - .map_err(GenericError::new)??; - - let network = msg.network().unwrap_or_else(|| DEFAULT_NETWORK.to_string()); - let token = get_network_token( - DbNetwork::from_str(&network).map_err(GenericError::new)?, - msg.token(), - ); - bus::register_account(self, &address, &network, &token, mode).await?; - - log::info!( - "Initialised payment account. mode={:?}, address={}, driver={}, network={}, token={}", - mode, - &address, - DRIVER_NAME, - network, - token - ); - Ok(Ack {}) - } - - async fn fund( - &self, - _db: DbExecutor, - _caller: String, - msg: Fund, - ) -> Result { - let address = msg.address(); - let network = - DbNetwork::from_str(&msg.network().unwrap_or_else(|| DEFAULT_NETWORK.to_string())) - .map_err(GenericError::new)?; - match network { - DbNetwork::Rinkeby => { - log::info!( - "Handling fund request. network={}, address={}", - &network, - &address - ); - wallet::fund(&address, network) - .timeout(Some(15)) // Regular scenario =~ 5s - .await - .map_err(GenericError::new)??; - Ok(format!( - "Received funds from the faucet. address={}", - &address - )) - } - DbNetwork::Goerli => Ok("Goerli network is not supported by this driver.".to_string()), - DbNetwork::Mumbai => Ok("Mumbai network is not supported by this driver.".to_string()), - DbNetwork::Polygon => { - Ok("Polygon network is not supported by this driver.".to_string()) - } - DbNetwork::Mainnet => Ok(format!( - r#"Using this driver is not recommended. Consider using the Polygon driver instead. - -Your mainnet zkSync address is {}. -To be able to use zkSync driver please send some GLM tokens and optionally ETH for gas to this address. -"#, - address - )), - } - } - - async fn transfer( - &self, - _db: DbExecutor, - _caller: String, - msg: Transfer, - ) -> Result { - log::info!("TRANSFER = Not Implemented: {:?}", msg); - Ok("NOT_IMPLEMENTED".to_string()) - } - - async fn schedule_payment( - &self, - _db: DbExecutor, - _caller: String, - msg: SchedulePayment, - ) -> Result { - log::debug!("schedule_payment: {:?}", msg); - - let sender = msg.sender().to_owned(); - if !self.is_account_active(&sender) { - return Err(GenericError::new( - "Can not schedule_payment, account not active", - )); - } - - let order_id = Uuid::new_v4().to_string(); - self.dao.insert_payment(&order_id, &msg).await?; - Ok(order_id) - } - - async fn verify_payment( - &self, - _db: DbExecutor, - _caller: String, - msg: VerifyPayment, - ) -> Result { - log::debug!("verify_payment: {:?}", msg); - let (network, _) = platform_to_network_token(msg.platform())?; - let tx_hash = hex::encode(msg.confirmation().confirmation); - log::info!("Verifying transaction: {}", tx_hash); - wallet::verify_tx(&tx_hash, network).await - } - - async fn validate_allocation( - &self, - _db: DbExecutor, - _caller: String, - msg: ValidateAllocation, - ) -> Result { - let (network, _) = platform_to_network_token(msg.platform)?; - let account_balance = wallet::account_balance(&msg.address, network).await?; - let total_allocated_amount: BigDecimal = msg - .existing_allocations - .into_iter() - .map(|allocation| allocation.remaining_amount) - .sum(); - - // NOTE: `wallet::get_tx_fee` accepts an _recipient_ address which is unknown at the moment - // so the _sender_ address is provider. This might bias fee calculation, because transaction - // to new account is little more expensive. - let tx_fee_cost = wallet::get_tx_fee(&msg.address, network).await?; - let total_txs_cost = tx_fee_cost * &*TRANSACTIONS_PER_ALLOCATION; - let allocation_surcharge = (&*MAX_ALLOCATION_SURCHARGE).min(&total_txs_cost); - - log::info!( - "Allocation validation: \ - allocating: {:.5}, \ - account_balance: {:.5}, \ - total_allocated_amount: {:.5}, \ - allocation_surcharge: {:.5} \ - ", - msg.amount, - account_balance, - total_allocated_amount, - allocation_surcharge, - ); - Ok(msg.amount <= (account_balance - total_allocated_amount - allocation_surcharge)) - } - - async fn shut_down( - &self, - _db: DbExecutor, - _caller: String, - msg: ShutDown, - ) -> Result<(), GenericError> { - self.send_out_payments().await; - // HACK: Make sure that send-out job did complete. It might have just been running in another thread (cron). In such case .send_out_payments() would not block. - self.sendout_lock.lock().await; - let timeout = Duration::from_std(msg.timeout) - .map_err(|e| GenericError::new(format!("Invalid shutdown timeout: {}", e)))?; - let deadline = Utc::now() + timeout - Duration::seconds(1); - while { - self.confirm_payments().await; // Run it at least once - Utc::now() < deadline && self.dao.has_unconfirmed_txs().await? // Stop if deadline passes or there are no more transactions to confirm - } { - tokio::time::sleep(std::time::Duration::from_secs(1)).await; - } - Ok(()) - } -} - -#[async_trait(?Send)] -impl PaymentDriverCron for ZksyncDriver { - async fn confirm_payments(&self) { - let guard = match self.confirmation_lock.try_lock() { - None => { - log::trace!("ZkSync confirmation job in progress."); - return; - } - Some(guard) => guard, - }; - log::trace!("Running zkSync confirmation job..."); - - for network_key in self.get_networks().keys() { - let network = - match DbNetwork::from_str(network_key) { - Ok(n) => n, - Err(e) => { - log::error!( - "Failed to parse network, skipping confirmation job. key={}, error={:?}", - network_key, e); - continue; - } - }; - let txs = self.dao.get_unconfirmed_txs(network).await; - log::trace!("confirm_payments network={} txs={:?}", &network_key, &txs); - - for tx in txs { - log::trace!("checking tx {:?}", &tx); - let tx_hash = match &tx.tmp_onchain_txs { - None => continue, - Some(tx_hash) => tx_hash, - }; - - log::debug!( - "Checking if tx was a success. network={}, hash={}", - &network, - &tx_hash - ); - let tx_success = match wallet::check_tx(tx_hash, network).await { - None => continue, // Check_tx returns None when the result is unknown - Some(tx_success) => tx_success, - }; - - let payments = self.dao.transaction_confirmed(&tx.tx_id).await; - - // Faucet can stop here IF the tx was a success. - if tx.tx_type == TxType::Faucet as i32 && tx_success.is_ok() { - log::debug!("Faucet tx confirmed, exit early. hash={}", &tx_hash); - continue; - } - - let order_ids: Vec = payments - .iter() - .map(|payment| payment.order_id.clone()) - .collect(); - - if let Err(err) = tx_success { - // In case of invalid nonce error we can retry sending transaction. - // Reset payment and transaction state to 'not sent', so cron job will pickup - // transaction again. - if err.contains("Nonce mismatch") { - log::warn!( - "Scheduling retry for tx {:?} because of nonce mismatch. ZkSync error: {}", - tx, - err - ); - - for order_id in order_ids.iter() { - self.dao.retry_payment(order_id).await; - } - } else { - log::error!( - "ZkSync transaction verification failed. tx_details={:?} error={}", - tx, - err - ); - - for order_id in order_ids.iter() { - self.dao.payment_failed(order_id).await; - } - } - - self.dao - .transaction_failed(&tx.tx_id, "Unknown error") - .await; - return; - } - - // TODO: Add token support - let platform = network_token_to_platform(Some(network), None).unwrap(); // TODO: Catch error? - let details = match wallet::verify_tx(tx_hash, network).await { - Ok(a) => a, - Err(e) => { - log::warn!("Failed to get transaction details from zksync, creating bespoke details. Error={}", e); - - //Create bespoke payment details: - // - Sender + receiver are the same - // - Date is always now - // - Amount needs to be updated to total of all PaymentEntity's - let first_payment: PaymentEntity = - match self.dao.get_first_payment(tx_hash).await { - Some(p) => p, - None => continue, - }; - let mut details = utils::db_to_payment_details(&first_payment); - details.amount = payments - .into_iter() - .map(|payment| utils::db_amount_to_big_dec(payment.amount)) - .sum::(); - details - } - }; - if tx.tx_type == TxType::Transfer as i32 { - let tx_hash = hex::decode(tx_hash).unwrap(); - - if let Err(e) = bus::notify_payment( - &self.get_name(), - &platform, - order_ids, - &details, - tx_hash, - ) - .await - { - log::error!("{}", e) - }; - } - } - } - log::trace!("ZkSync confirmation job complete."); - drop(guard); // Explicit drop to tell Rust that guard is not unused variable - } - - async fn send_out_payments(&self) { - let guard = match self.sendout_lock.try_lock() { - None => { - log::trace!("ZkSync send-out job in progress."); - return; - } - Some(guard) => guard, - }; - log::trace!("Running zkSync send-out job..."); - let accounts = self.active_accounts.borrow().list_accounts(); - for node_id in accounts { - self.process_payments_for_account(&node_id).await; - } - log::trace!("ZkSync send-out job complete."); - drop(guard); // Explicit drop to tell Rust that guard is not unused variable - } - - fn sendout_interval(&self) -> std::time::Duration { - *TX_SENDOUT_INTERVAL - } - - fn confirmation_interval(&self) -> std::time::Duration { - *TX_CONFIRMATION_INTERVAL - } -} diff --git a/core/payment-driver/zksync/src/lib.rs b/core/payment-driver/zksync/src/lib.rs deleted file mode 100644 index 2787a9cf97..0000000000 --- a/core/payment-driver/zksync/src/lib.rs +++ /dev/null @@ -1,28 +0,0 @@ -/* - Payment driver for yagna using zksync. - - This file only contains constants and imports. -*/ - -// Public -pub const DRIVER_NAME: &str = "zksync"; - -pub const DEFAULT_NETWORK: &str = "rinkeby"; -pub const DEFAULT_TOKEN: &str = "tGLM"; -pub const DEFAULT_PLATFORM: &str = "zksync-rinkeby-tglm"; - -pub const MAINNET_NETWORK: &str = "mainnet"; -pub const MAINNET_TOKEN: &str = "GLM"; -pub const MAINNET_PLATFORM: &str = "zksync-mainnet-glm"; - -pub use service::ZksyncService as PaymentDriverService; - -// Private -#[macro_use] -extern crate log; - -mod dao; -mod driver; -mod network; -mod service; -pub mod zksync; diff --git a/core/payment-driver/zksync/src/network.rs b/core/payment-driver/zksync/src/network.rs deleted file mode 100644 index c92a9a2024..0000000000 --- a/core/payment-driver/zksync/src/network.rs +++ /dev/null @@ -1,80 +0,0 @@ -use maplit::hashmap; -use std::collections::HashMap; -use std::str::FromStr; - -// Workspace uses -use ya_payment_driver::{db::models::Network as DbNetwork, driver::Network, model::GenericError}; - -// Local uses -use crate::{ - DEFAULT_NETWORK, DEFAULT_PLATFORM, DEFAULT_TOKEN, MAINNET_NETWORK, MAINNET_PLATFORM, - MAINNET_TOKEN, -}; - -lazy_static::lazy_static! { - pub static ref SUPPORTED_NETWORKS: HashMap = hashmap! { - DEFAULT_NETWORK.to_string() => Network { - default_token: DEFAULT_TOKEN.to_string(), - tokens: hashmap! { - DEFAULT_TOKEN.to_string() => DEFAULT_PLATFORM.to_string() - } - }, - MAINNET_NETWORK.to_string() => Network { - default_token: MAINNET_TOKEN.to_string(), - tokens: hashmap! { - MAINNET_TOKEN.to_string() => MAINNET_PLATFORM.to_string() - } - } - }; - static ref DEFAULT_DB_NETWORK: DbNetwork = DbNetwork::from_str(DEFAULT_NETWORK).unwrap(); - static ref MAINNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(MAINNET_NETWORK).unwrap(); -} - -pub fn platform_to_network_token(platform: String) -> Result<(DbNetwork, String), GenericError> { - match platform.as_str() { - DEFAULT_PLATFORM => Ok((*DEFAULT_DB_NETWORK, DEFAULT_TOKEN.to_owned())), - MAINNET_PLATFORM => Ok((*MAINNET_DB_NETWORK, MAINNET_TOKEN.to_owned())), - other => Err(GenericError::new(format!( - "Unable to find network for platform: {}", - other - ))), - } -} - -pub fn network_token_to_platform( - network: Option, - token: Option, -) -> Result { - let network = - network.unwrap_or(DbNetwork::from_str(DEFAULT_NETWORK).map_err(GenericError::new)?); - let network_config = (*SUPPORTED_NETWORKS).get(&(network.to_string())); - let network_config = match network_config { - Some(nc) => nc, - None => { - return Err(GenericError::new(format!( - "Unable to find platform for network={}", - network - ))) - } - }; - - let token = token.unwrap_or_else(|| network_config.default_token.clone()); - let platform = network_config.tokens.get(&token); - let platform = match platform { - Some(p) => p, - None => { - return Err(GenericError::new(format!( - "Unable to find platform for token={}", - token - ))) - } - }; - Ok(platform.to_string()) -} - -pub fn get_network_token(network: DbNetwork, token: Option) -> String { - // Fetch network config, safe as long as all DbNetwork entries are in SUPPORTED_NETWORKS - let network_config = (*SUPPORTED_NETWORKS).get(&(network.to_string())).unwrap(); - // TODO: Check if token in network.tokens - token.unwrap_or_else(|| network_config.default_token.clone()) -} diff --git a/core/payment-driver/zksync/src/service.rs b/core/payment-driver/zksync/src/service.rs deleted file mode 100644 index dee353a6b7..0000000000 --- a/core/payment-driver/zksync/src/service.rs +++ /dev/null @@ -1,48 +0,0 @@ -/* - The service that binds this payment driver into yagna via GSB. -*/ - -// Extrernal crates -use std::sync::Arc; - -// Workspace uses -use ya_payment_driver::{ - bus, - cron::Cron, - dao::{init, DbExecutor}, - model::GenericError, -}; -use ya_service_api_interfaces::Provider; - -// Local uses -use crate::driver::ZksyncDriver; - -pub struct ZksyncService; - -impl ZksyncService { - pub async fn gsb>(context: &Context) -> anyhow::Result<()> { - log::debug!("Connecting ZksyncService to gsb..."); - - // TODO: Read and validate env - log::debug!("Environment variables validated"); - - // Init database - let db: DbExecutor = context.component(); - init(&db).await.map_err(GenericError::new)?; - log::debug!("Database initialised"); - - // Load driver - let driver = ZksyncDriver::new(db.clone()); - driver.load_active_accounts().await; - let driver_rc = Arc::new(driver); - bus::bind_service(&db, driver_rc.clone()).await?; - log::debug!("Driver loaded"); - - // Start cron - Cron::new(driver_rc.clone()); - log::debug!("Cron started"); - - log::info!("Successfully connected ZksyncService to gsb."); - Ok(()) - } -} diff --git a/core/payment-driver/zksync/src/zksync/faucet.rs b/core/payment-driver/zksync/src/zksync/faucet.rs deleted file mode 100644 index b884769172..0000000000 --- a/core/payment-driver/zksync/src/zksync/faucet.rs +++ /dev/null @@ -1,116 +0,0 @@ -/* - Top up new accounts from the rinkeby zksync faucet and wait for the funds to arive. -*/ - -// External crates -use bigdecimal::BigDecimal; -use chrono::{Duration, Utc}; -use lazy_static::lazy_static; -use std::{env, time}; -use tokio::time::sleep; - -// Workspace uses -use ya_payment_driver::{db::models::Network, model::GenericError}; -use ya_utils_networking::resolver; - -// Local uses -use crate::zksync::wallet::account_balance; - -const DEFAULT_FAUCET_SRV_PREFIX: &str = "_zk-faucet._tcp"; -const FAUCET_ADDR_ENVAR: &str = "ZKSYNC_FAUCET_ADDR"; -const MAX_FAUCET_REQUESTS: u32 = 6; - -lazy_static! { - static ref MIN_BALANCE: BigDecimal = BigDecimal::from(50); - static ref MAX_WAIT: Duration = Duration::minutes(1); -} - -pub async fn request_tglm(address: &str, network: Network) -> Result<(), GenericError> { - let balance = account_balance(address, network).await?; - if balance >= *MIN_BALANCE { - return Ok(()); - } - - log::info!( - "Requesting tGLM from zkSync faucet... address = {}", - address - ); - - for i in 0..MAX_FAUCET_REQUESTS { - match faucet_donate(address, network).await { - Ok(()) => break, - Err(e) => { - // Do not warn nor sleep at the last try. - if i >= MAX_FAUCET_REQUESTS - 1 { - log::error!( - "Failed to request tGLM from Faucet, tried {} times.: {:?}", - MAX_FAUCET_REQUESTS, - e - ); - return Err(e); - } else { - log::warn!( - "Retrying ({}/{}) to request tGLM from Faucet after failure: {:?}", - i + 1, - MAX_FAUCET_REQUESTS, - e - ); - sleep(time::Duration::from_secs(10)).await; - } - } - } - } - wait_for_tglm(address, network).await?; - Ok(()) -} - -async fn wait_for_tglm(address: &str, network: Network) -> Result<(), GenericError> { - log::info!("Waiting for tGLM from faucet..."); - let wait_until = Utc::now() + *MAX_WAIT; - while Utc::now() < wait_until { - if account_balance(address, network).await? >= *MIN_BALANCE { - log::info!("Received tGLM from faucet."); - return Ok(()); - } - sleep(time::Duration::from_secs(3)).await; - } - let msg = "Waiting for tGLM timed out."; - log::error!("{}", msg); - Err(GenericError::new(msg)) -} - -async fn faucet_donate(address: &str, _network: Network) -> Result<(), GenericError> { - // TODO: Reduce timeout to 20-30 seconds when transfer is used. - let client = awc::Client::builder() - .timeout(std::time::Duration::from_secs(60)) - .finish(); - let faucet_url = resolve_faucet_url().await?; - let request_url = format!("{}/{}", faucet_url, address); - let request_url = resolver::try_resolve_dns_record(&request_url).await; - debug!("Faucet request url: {}", request_url); - let response = client - .get(request_url) - .send() - .await - .map_err(GenericError::new)? - .body() - .await - .map_err(GenericError::new)?; - let response = String::from_utf8_lossy(response.as_ref()); - log::debug!("Funds requested. Response = {}", response); - // TODO: Verify tx hash - Ok(()) -} - -async fn resolve_faucet_url() -> Result { - match env::var(FAUCET_ADDR_ENVAR) { - Ok(addr) => Ok(addr), - _ => { - let faucet_host = resolver::resolve_yagna_srv_record(DEFAULT_FAUCET_SRV_PREFIX) - .await - .map_err(|_| GenericError::new("Faucet SRV record cannot be resolved"))?; - - Ok(format!("http://{}/zk/donatex", faucet_host)) - } - } -} diff --git a/core/payment-driver/zksync/src/zksync/mod.rs b/core/payment-driver/zksync/src/zksync/mod.rs deleted file mode 100644 index 3666a50042..0000000000 --- a/core/payment-driver/zksync/src/zksync/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -/* - Private mod to encapsulate all zksync logic, revealed from the `wallet`. -*/ - -pub mod wallet; - -pub mod faucet; -mod signer; -pub mod utils; diff --git a/core/payment-driver/zksync/src/zksync/signer.rs b/core/payment-driver/zksync/src/zksync/signer.rs deleted file mode 100644 index a45be24f80..0000000000 --- a/core/payment-driver/zksync/src/zksync/signer.rs +++ /dev/null @@ -1,168 +0,0 @@ -/* - Handle zksync signing. - - - EthereumSigner trait - - ya_service_bus connection to sign - - Helpers to convert byte formats/orders -*/ - -// External uses -use async_trait::async_trait; -use futures::{Future, FutureExt}; -use rlp::RlpStream; -use std::pin::Pin; -use tiny_keccak::keccak256; -use tokio::task; -use zksync::zksync_types::{ - tx::{PackedEthSignature, TxEthSignature}, - Address, -}; -use zksync_eth_signer::{error::SignerError, EthereumSigner, RawTransaction}; - -// Workspace uses -use ya_client_model::NodeId; -use ya_payment_driver::bus; - -pub struct YagnaEthSigner { - eth_address: Address, -} - -impl YagnaEthSigner { - pub fn new(eth_address: Address) -> Self { - Self { eth_address } - } -} - -impl Clone for YagnaEthSigner { - fn clone(&self) -> Self { - Self::new(self.eth_address) - } -} - -#[async_trait] -impl EthereumSigner for YagnaEthSigner { - async fn get_address(&self) -> Result { - Ok(self.eth_address) - } - - async fn sign_message(&self, message: &[u8]) -> Result { - log::debug!("YagnaEthSigner sign_message({})", hex::encode(message)); - let node_id = self.eth_address.as_bytes().into(); - let msg_as_bytes = message_to_signable_bytes(message, true); - let signature = sign_tx(node_id, msg_as_bytes).await?; - let signature = convert_to_eth_byte_order(signature); - let packed_sig = PackedEthSignature::deserialize_packed(&signature) - .map_err(|_| SignerError::SigningFailed("Failed to pack eth signature".to_string()))?; - let tx_eth_sig = TxEthSignature::EthereumSignature(packed_sig); - Ok(tx_eth_sig) - } - - async fn sign_transaction(&self, raw_tx: RawTransaction) -> Result, SignerError> { - log::debug!("YagnaEthSigner sign_transaction"); - - let node_id = self.eth_address.as_bytes().into(); - let payload: Vec = raw_tx.hash().into(); - let chain_id = raw_tx.chain_id as u64; - - let signature = sign_tx(node_id, payload.clone()).await?; - - Ok(encode_signed_tx(&raw_tx, signature, chain_id)) - } -} - -fn message_to_signable_bytes(msg: &[u8], include_prefix: bool) -> Vec { - let bytes = if include_prefix { - let prefix = format!("\x19Ethereum Signed Message:\n{}", msg.len()); - let mut b = Vec::with_capacity(prefix.len() + msg.len()); - b.extend_from_slice(prefix.as_bytes()); - b.extend_from_slice(msg); - b - } else { - msg.into() - }; - keccak256(&bytes).into() -} - -fn convert_to_eth_byte_order(signature: Vec) -> Vec { - // Yagna byte order (v, r s) - // Ethereum byte order (r, s, (v % 2 + 28)) - let v = &signature[0]; - let r = &signature[1..33]; - let s = &signature[33..65]; - let mut result = Vec::with_capacity(65); - result.extend_from_slice(r); - result.extend_from_slice(s); - result.push(if v % 2 == 1 { 0x1c } else { 0x1b }); - result -} - -fn sign_tx( - node_id: NodeId, - payload: Vec, -) -> Pin, SignerError>> + Send>> { - // The zksync EthereumAccount requires "Send", while the bus can not use "Send". - let fut = task::spawn_local(async move { - let signature = bus::sign(node_id, payload) - .await - .map_err(|e| SignerError::SigningFailed(format!("{:?}", e)))?; - Ok(signature) - }); - let fut = fut.map(|res| match res { - Ok(res) => res, - Err(e) => Err(SignerError::SigningFailed(e.to_string())), - }); - Box::pin(fut) -} - -fn encode_signed_tx(raw_tx: &RawTransaction, signature: Vec, chain_id: u64) -> Vec { - let (sig_v, sig_r, sig_s) = prepare_signature(signature, chain_id); - - let mut tx = RlpStream::new(); - - tx.begin_unbounded_list(); - - tx_encode(raw_tx, &mut tx); - tx.append(&sig_v); - tx.append(&sig_r); - tx.append(&sig_s); - - tx.finalize_unbounded_list(); - - tx.out().to_vec() -} - -fn prepare_signature(mut signature: Vec, chain_id: u64) -> (u64, Vec, Vec) { - // TODO ugly solution - assert_eq!(signature.len(), 65); - - let sig_v = signature[0]; - let sig_v = sig_v as u64 + chain_id * 2 + 35; - - let mut sig_r = signature.split_off(1); - let mut sig_s = sig_r.split_off(32); - - prepare_signature_part(&mut sig_r); - prepare_signature_part(&mut sig_s); - - (sig_v, sig_r, sig_s) -} - -fn prepare_signature_part(part: &mut Vec) { - assert_eq!(part.len(), 32); - while part[0] == 0 { - part.remove(0); - } -} - -fn tx_encode(tx: &RawTransaction, s: &mut RlpStream) { - s.append(&tx.nonce); - s.append(&tx.gas_price); - s.append(&tx.gas); - if let Some(ref t) = tx.to { - s.append(t); - } else { - s.append(&vec![]); - } - s.append(&tx.value); - s.append(&tx.data); -} diff --git a/core/payment-driver/zksync/src/zksync/utils.rs b/core/payment-driver/zksync/src/zksync/utils.rs deleted file mode 100644 index 5f927e6e13..0000000000 --- a/core/payment-driver/zksync/src/zksync/utils.rs +++ /dev/null @@ -1,77 +0,0 @@ -/* - Zksync related utilities. -*/ - -// External uses -use bigdecimal::BigDecimal; -use lazy_static::lazy_static; -use num_bigint::{BigInt, BigUint, ToBigInt}; -use zksync::utils::{closest_packable_token_amount, is_token_amount_packable}; - -// Workspace uses -use ya_payment_driver::model::GenericError; - -lazy_static! { - // TODO: Get token decimals from zksync-provider / wallet - pub static ref PRECISION: BigDecimal = BigDecimal::from(1_000_000_000_000_000_000u64); -} - -pub fn big_dec_to_big_uint(v: BigDecimal) -> Result { - let v = v * &(*PRECISION); - let v = v - .to_bigint() - .ok_or_else(|| GenericError::new("Failed to convert to bigint"))?; - let v = v - .to_biguint() - .ok_or_else(|| GenericError::new("Failed to convert to biguint"))?; - Ok(v) -} - -pub fn big_uint_to_big_dec(v: BigUint) -> BigDecimal { - let v: BigDecimal = Into::::into(v).into(); - v / &(*PRECISION) -} - -/// Find the closest **bigger** packable amount -pub fn pack_up(amount: &BigUint) -> BigUint { - let mut packable_amount = closest_packable_token_amount(amount); - while (&packable_amount < amount) || !is_token_amount_packable(&packable_amount) { - packable_amount = increase_least_significant_digit(&packable_amount); - } - packable_amount -} - -fn increase_least_significant_digit(amount: &BigUint) -> BigUint { - let digits = amount.to_radix_le(10); - for (i, digit) in digits.iter().enumerate() { - if *digit != 0 { - return amount + BigUint::from(10u32).pow(i as u32); - } - } - amount.clone() // zero -} - -#[cfg(test)] -mod tests { - use super::*; - use std::str::FromStr; - - #[test] - fn test_increase_least_significant_digit() { - let amount = BigUint::from_str("999000").unwrap(); - let increased = increase_least_significant_digit(&amount); - let expected = BigUint::from_str("1000000").unwrap(); - assert_eq!(increased, expected); - } - - #[test] - fn test_pack_up() { - let amount = BigUint::from_str("12300285190700000000").unwrap(); - let packable = pack_up(&amount); - assert!( - zksync::utils::is_token_amount_packable(&packable), - "Not packable!" - ); - assert!(packable >= amount, "To little!"); - } -} diff --git a/core/payment-driver/zksync/src/zksync/wallet.rs b/core/payment-driver/zksync/src/zksync/wallet.rs deleted file mode 100644 index 3d4c8e2e08..0000000000 --- a/core/payment-driver/zksync/src/zksync/wallet.rs +++ /dev/null @@ -1,552 +0,0 @@ -/* - Wallet functions on zksync. -*/ - -// External crates -use bigdecimal::{BigDecimal, Zero}; -use num_bigint::BigUint; -use std::env; -use std::str::FromStr; -use tokio_compat_02::FutureExt; -use zksync::operations::SyncTransactionHandle; -use zksync::types::BlockStatus; -use zksync::zksync_types::{ - tokens::ChangePubKeyFeeTypeArg, tx::TxHash, Address, Nonce, TxFeeTypes, H256, -}; -use zksync::{ - provider::{Provider, RpcProvider}, - Network as ZkNetwork, Wallet, WalletCredentials, -}; -use zksync_eth_signer::EthereumSigner; - -// Workspace uses -use ya_payment_driver::{ - db::models::Network, - model::{AccountMode, Enter, Exit, GenericError, Init, PaymentDetails}, - utils as base_utils, -}; - -// Local uses -use crate::{ - network::get_network_token, - zksync::{faucet, signer::YagnaEthSigner, utils}, - DEFAULT_NETWORK, -}; -use zksync::zksync_types::tx::ChangePubKeyType; - -pub async fn account_balance(address: &str, network: Network) -> Result { - let pub_address = Address::from_str(&address[2..]).map_err(GenericError::new)?; - let acc_info = get_provider(network) - .account_info(pub_address) - .compat() - .await - .map_err(GenericError::new)?; - // TODO: implement tokens, replace None - let token = get_network_token(network, None); - let balance_com = acc_info - .committed - .balances - .get(&token) - .map(|x| x.0.clone()) - .unwrap_or_else(BigUint::zero); - let balance = utils::big_uint_to_big_dec(balance_com); - log::debug!( - "account_balance. address={}, network={}, balance={}", - address, - &network, - &balance - ); - Ok(balance) -} - -pub async fn init_wallet(msg: &Init) -> Result<(), GenericError> { - log::debug!("init_wallet. msg={:?}", msg); - let mode = msg.mode(); - let address = msg.address().clone(); - let network = msg.network().unwrap_or_else(|| DEFAULT_NETWORK.to_string()); - let network = Network::from_str(&network).map_err(GenericError::new)?; - - if mode.contains(AccountMode::SEND) { - let wallet = get_wallet(&address, network).await?; - unlock_wallet(&wallet, network).await.map_err(|e| { - GenericError::new(format!( - "{:?} HINT: Did you run `yagna payment fund` and follow the instructions?", - e - )) - })?; - } - Ok(()) -} - -pub async fn fund(address: &str, network: Network) -> Result<(), GenericError> { - if network == Network::Mainnet { - return Err(GenericError::new("Wallet can not be funded on mainnet.")); - } - faucet::request_tglm(address, network).await?; - Ok(()) -} - -pub async fn exit(msg: &Exit) -> Result { - let network = msg.network().unwrap_or_else(|| DEFAULT_NETWORK.to_string()); - let network = Network::from_str(&network).map_err(GenericError::new)?; - let wallet = get_wallet(&msg.sender(), network).await?; - - let token = get_network_token(network, None); - let balance = get_balance(&wallet, &token).await?; - let unlock_fee = get_unlock_fee(&wallet, &token).await?; - let withdraw_fee = get_withdraw_fee(&wallet, &token).await?; - let total_fee = unlock_fee + withdraw_fee; - if balance < total_fee { - return Err(GenericError::new(format!( - "Not enough balance to exit. Minimum required balance to pay withdraw fees is {} {}", - utils::big_uint_to_big_dec(total_fee), - token - ))); - } - - unlock_wallet(&wallet, network).await?; - let tx_handle = withdraw(wallet, network, msg.amount(), msg.to()).await?; - let tx_info = tx_handle - .wait_for_commit() - .compat() - .await - .map_err(GenericError::new)?; - - match tx_info.success { - Some(true) => Ok(hash_to_hex(tx_handle.hash())), - Some(false) => Err(GenericError::new( - tx_info - .fail_reason - .unwrap_or_else(|| "Unknown failure reason".to_string()), - )), - None => Err(GenericError::new("Transaction time-outed")), - } -} - -pub async fn enter(msg: Enter) -> Result { - let network = msg.network.unwrap_or_else(|| DEFAULT_NETWORK.to_string()); - let network = Network::from_str(&network).map_err(GenericError::new)?; - let wallet = get_wallet(&msg.address, network).await?; - - let tx_hash = deposit(wallet, network, msg.amount).await?; - - Ok(hex::encode(tx_hash.as_fixed_bytes())) -} - -pub async fn get_tx_fee(address: &str, network: Network) -> Result { - let token = get_network_token(network, None); - let wallet = get_wallet(address, network).await?; - let tx_fee = wallet - .provider - .get_tx_fee(TxFeeTypes::Transfer, wallet.address(), token.as_str()) - .await - .map_err(GenericError::new)? - .total_fee; - let tx_fee_bigdec = utils::big_uint_to_big_dec(tx_fee); - - log::debug!("Transaction fee {:.5} {}", tx_fee_bigdec, token.as_str()); - Ok(tx_fee_bigdec) -} - -fn hash_to_hex(hash: TxHash) -> String { - // TxHash::to_string adds a prefix to the hex value - hex::encode(hash.as_ref()) -} - -pub async fn get_nonce(address: &str, network: Network) -> u32 { - let addr = match Address::from_str(&address[2..]) { - Ok(a) => a, - Err(e) => { - log::error!("Unable to parse address, failed to get nonce. {:?}", e); - return 0; - } - }; - let provider = get_provider(network); - let account_info = match provider.account_info(addr).compat().await { - Ok(i) => i, - Err(e) => { - log::error!("Unable to get account info, failed to get nonce. {:?}", e); - return 0; - } - }; - *account_info.committed.nonce -} - -pub async fn make_transfer( - details: &PaymentDetails, - nonce: u32, - network: Network, -) -> Result { - log::debug!("make_transfer. {:?}", details); - let amount = details.amount.clone(); - let amount = utils::big_dec_to_big_uint(amount)?; - let amount = utils::pack_up(&amount); - - let sender = details.sender.clone(); - let wallet = get_wallet(&sender, network).await?; - let token = get_network_token(network, None); - - let balance = get_balance(&wallet, &token).await?; - log::debug!("balance before transfer={}", balance); - - let transfer_builder = wallet - .start_transfer() - .nonce(Nonce(nonce)) - .str_to(&details.recipient[2..]) - .map_err(GenericError::new)? - .token(token.as_str()) - .map_err(GenericError::new)? - .amount(amount.clone()); - log::debug!( - "transfer raw data. nonce={}, to={}, token={}, amount={}", - nonce, - &details.recipient, - token, - amount - ); - let transfer = transfer_builder - .send() - .compat() - .await - .map_err(GenericError::new)?; - - let tx_hash = hex::encode(transfer.hash()); - log::info!("Created zksync transaction with hash={}", tx_hash); - Ok(tx_hash) -} - -pub async fn check_tx(tx_hash: &str, network: Network) -> Option> { - let provider = get_provider(network); - let tx_hash = format!("sync-tx:{}", tx_hash); - let tx_hash = TxHash::from_str(&tx_hash).unwrap(); - let tx_info = provider.tx_info(tx_hash).compat().await.unwrap(); - log::trace!("tx_info: {:?}", tx_info); - match tx_info.success { - None => None, - Some(true) => Some(Ok(())), - Some(false) => match tx_info.fail_reason { - Some(err) => Some(Err(err)), - None => Some(Err("Unknown failure".to_string())), - }, - } -} - -#[derive(serde::Deserialize)] -struct TxRespObj { - to: String, - from: String, - amount: String, - created_at: String, -} - -pub async fn verify_tx(tx_hash: &str, network: Network) -> Result { - let provider_url = get_rpc_addr(network); - - // HACK: Get the transaction data from v0.1 api - let api_url = provider_url.replace("/jsrpc", "/api/v0.1"); - let req_url = format!("{}/transactions_all/{}", api_url, tx_hash); - log::debug!("Request URL: {}", &req_url); - - let client = awc::Client::new(); - let response = client - .get(req_url) - .send() - .await - .map_err(GenericError::new)? - .body() - .await - .map_err(GenericError::new)?; - let response = String::from_utf8_lossy(response.as_ref()); - log::trace!("Request response: {}", &response); - let v: TxRespObj = serde_json::from_str(&response).map_err(GenericError::new)?; - - let recipient = v.to; - let sender = v.from; - let amount = - utils::big_uint_to_big_dec(BigUint::from_str(&v.amount).map_err(GenericError::new)?); - let date_str = format!("{}Z", v.created_at); - let date = Some(chrono::DateTime::from_str(&date_str).map_err(GenericError::new)?); - let details = PaymentDetails { - recipient, - sender, - amount, - date, - }; - log::debug!("PaymentDetails from server: {:?}", &details); - - Ok(details) -} - -fn get_provider(network: Network) -> RpcProvider { - RpcProvider::from_addr_and_network(get_rpc_addr(network), get_zk_network(network)) -} - -fn get_rpc_addr(network: Network) -> String { - match network { - Network::Mainnet => env::var("ZKSYNC_MAINNET_RPC_ADDRESS") - .unwrap_or_else(|_| "https://api.zksync.golem.network/jsrpc".to_string()), - Network::Rinkeby => env::var("ZKSYNC_RINKEBY_RPC_ADDRESS") - .unwrap_or_else(|_| "https://rinkeby-api.zksync.golem.network/jsrpc".to_string()), - Network::Goerli => panic!("Goerli not supported on zksync"), - Network::Polygon => panic!("Polygon not supported on zksync"), - Network::Mumbai => panic!("Mumbai not supported on zksync"), - } -} - -fn get_ethereum_node_addr_from_env(network: Network) -> String { - match network { - Network::Mainnet => env::var("MAINNET_GETH_ADDR") - .unwrap_or_else(|_| "https://geth.golem.network:55555".to_string()), - Network::Rinkeby => env::var("RINKEBY_GETH_ADDR") - .unwrap_or_else(|_| "http://geth.testnet.golem.network:55555".to_string()), - Network::Goerli => panic!("Goerli not supported on zksync"), - Network::Polygon => panic!("Polygon mainnet not supported on zksync"), - Network::Mumbai => panic!("Polygon mumbai not supported on zksync"), - } -} - -fn get_ethereum_confirmation_timeout() -> std::time::Duration { - let value = std::env::var("ZKSYNC_ETH_CONFIRMATION_TIMEOUT_SECONDS") - .unwrap_or_else(|_| "60".to_owned()); - std::time::Duration::from_secs(value.parse::().unwrap()) -} - -async fn get_wallet( - address: &str, - network: Network, -) -> Result, GenericError> { - log::debug!("get_wallet {:?}", address); - let addr = Address::from_str(&address[2..]).map_err(GenericError::new)?; - let provider = get_provider(network); - let signer = YagnaEthSigner::new(addr); - let credentials = WalletCredentials::from_eth_signer(addr, signer, get_zk_network(network)) - .compat() - .await - .map_err(GenericError::new)?; - let wallet = Wallet::new(provider, credentials) - .compat() - .await - .map_err(GenericError::new)?; - Ok(wallet) -} - -fn get_zk_network(network: Network) -> ZkNetwork { - ZkNetwork::from_str(&network.to_string()).unwrap() // _or(ZkNetwork::Rinkeby) -} - -async fn unlock_wallet( - wallet: &Wallet, - network: Network, -) -> Result<(), GenericError> { - log::debug!("unlock_wallet"); - if !wallet - .is_signing_key_set() - .compat() - .await - .map_err(GenericError::new)? - { - log::info!("Unlocking wallet... address = {}", wallet.signer.address); - let token = get_network_token(network, None); - let balance = get_balance(wallet, &token).await?; - let unlock_fee = get_unlock_fee(wallet, &token).await?; - if unlock_fee > balance { - return Err(GenericError::new("Not enough balance to unlock account")); - } - - let unlock = wallet - .start_change_pubkey() - .fee(unlock_fee) - .fee_token(token.as_str()) - .map_err(|e| { - GenericError::new(format!("Failed to create change_pubkey request: {}", e)) - })? - .send() - .compat() - .await - .map_err(|e| { - GenericError::new(format!("Failed to send change_pubkey request: {}", e)) - })?; - log::info!("Unlock send. tx_hash= {}", unlock.hash().to_string()); - - let tx_info = unlock - .wait_for_commit() - .compat() - .await - .map_err(GenericError::new)?; - log::debug!("tx_info = {:?}", tx_info); - match tx_info.success { - Some(true) => log::info!("Wallet successfully unlocked. address = {}", wallet.signer.address), - Some(false) => return Err(GenericError::new(format!("Failed to unlock wallet. reason={}", tx_info.fail_reason.unwrap_or_else(|| "Unknown reason".to_string())))), - None => return Err(GenericError::new(format!("Unknown result from zksync unlock, please check your wallet on zkscan and try again. {:?}", tx_info))), - } - } - Ok(()) -} - -pub async fn withdraw( - wallet: Wallet, - network: Network, - amount: Option, - recipient: Option, -) -> Result, GenericError> { - let token = get_network_token(network, None); - let balance = get_balance(&wallet, &token).await?; - info!( - "Wallet funded with {} {} available for withdrawal", - utils::big_uint_to_big_dec(balance.clone()), - token - ); - - info!("Obtaining withdrawal fee"); - let withdraw_fee = get_withdraw_fee(&wallet, &token).await?; - info!( - "Withdrawal transaction fee {:.5} {}", - utils::big_uint_to_big_dec(withdraw_fee.clone()), - token - ); - if withdraw_fee > balance { - return Err(GenericError::new("Not enough balance to withdraw")); - } - - let amount = match amount { - Some(amount) => utils::big_dec_to_big_uint(amount)?, - None => balance.clone(), - }; - let withdraw_amount = std::cmp::min(balance - &withdraw_fee, amount); - info!( - "Withdrawal of {:.5} {} started", - utils::big_uint_to_big_dec(withdraw_amount.clone()), - token - ); - - let recipient_address = match recipient { - Some(addr) => Address::from_str(&addr[2..]).map_err(GenericError::new)?, - None => wallet.address(), - }; - - let withdraw_builder = wallet - .start_withdraw() - .fee(withdraw_fee) - .token(token.as_str()) - .map_err(GenericError::new)? - .amount(withdraw_amount.clone()) - .to(recipient_address); - log::debug!( - "Withdrawal raw data. token={}, amount={}, to={}", - token, - withdraw_amount, - recipient_address - ); - let withdraw_handle = withdraw_builder - .send() - .compat() - .await - .map_err(GenericError::new)?; - - Ok(withdraw_handle) -} - -async fn get_balance( - wallet: &Wallet, - token: &str, -) -> Result { - let balance = wallet - .get_balance(BlockStatus::Committed, token) - .compat() - .await - .map_err(GenericError::new)?; - Ok(balance) -} - -async fn get_withdraw_fee( - wallet: &Wallet, - token: &str, -) -> Result { - let withdraw_fee = wallet - .provider - .get_tx_fee(TxFeeTypes::Withdraw, wallet.address(), token) - .compat() - .await - .map_err(GenericError::new)? - .total_fee; - Ok(withdraw_fee) -} - -async fn get_unlock_fee( - wallet: &Wallet, - token: &str, -) -> Result { - if wallet - .is_signing_key_set() - .compat() - .await - .map_err(GenericError::new)? - { - return Ok(BigUint::zero()); - } - let unlock_fee = wallet - .provider - .get_tx_fee( - TxFeeTypes::ChangePubKey(ChangePubKeyFeeTypeArg::ContractsV4Version( - ChangePubKeyType::ECDSA, - )), - wallet.address(), - token, - ) - .compat() - .await - .map_err(GenericError::new)? - .total_fee; - Ok(unlock_fee) -} - -pub async fn deposit( - wallet: Wallet, - network: Network, - amount: BigDecimal, -) -> Result { - let token = get_network_token(network, None); - let amount = base_utils::big_dec_to_u256(&amount); - let address = wallet.address(); - - log::info!( - "Starting deposit into ZkSync network. Address {:#x}, amount: {} of {}", - address, - amount, - token - ); - - let mut ethereum = wallet - .ethereum(get_ethereum_node_addr_from_env(network)) - .await - .map_err(GenericError::new)?; - ethereum.set_confirmation_timeout(get_ethereum_confirmation_timeout()); - - if !ethereum - .is_limited_erc20_deposit_approved(token.as_str(), amount) - .await - .unwrap() - { - let tx = ethereum - .limited_approve_erc20_token_deposits(token.as_str(), amount) - .await - .map_err(GenericError::new)?; - info!( - "Approve erc20 token for ZkSync deposit. Tx: https://rinkeby.etherscan.io/tx/{:#x}", - tx - ); - - ethereum.wait_for_tx(tx).await.map_err(GenericError::new)?; - } - - let deposit_tx_hash = ethereum - .deposit(token.as_str(), amount, address) - .await - .map_err(GenericError::new)?; - info!( - "Check out deposit transaction at https://rinkeby.etherscan.io/tx/{:#x}", - deposit_tx_hash - ); - - Ok(deposit_tx_hash) -} diff --git a/core/payment/Cargo.toml b/core/payment/Cargo.toml index 38fb173c85..00388cbda6 100644 --- a/core/payment/Cargo.toml +++ b/core/payment/Cargo.toml @@ -10,7 +10,13 @@ default = [] [dependencies] ya-agreement-utils = { version = "0.5.0" } ya-client-model = { version = "0.5", features = ["with-diesel"] } -ya-core-model = { version = "^0.9", features = [ "activity", "driver", "identity", "market", "payment" ] } +ya-core-model = { version = "^0.9", features = [ + "activity", + "driver", + "identity", + "market", + "payment", +] } ya-net = "0.3" ya-metrics = "0.2" ya-persistence = "0.3" @@ -24,13 +30,18 @@ anyhow = "1.0" base64 = "0.12" bigdecimal = "0.2" chrono = { version = "0.4", features = ["serde"] } -diesel = { version = "1.4", features = [ "sqlite", "r2d2", "chrono", "bigdecimal" ] } +diesel = { version = "1.4", features = [ + "sqlite", + "r2d2", + "chrono", + "bigdecimal", +] } diesel_migrations = "1.4" dotenv = "0.15.0" env_logger = "0.7" futures = "0.3" hex = "0.4" -metrics="0.12" +metrics = "0.12" lazy_static = "1.4" libsqlite3-sys = { workspace = true } log = "0.4" @@ -43,13 +54,14 @@ thiserror = "1.0" tokio = { version = "1", features = ["fs", "signal", "macros"] } uint = "0.7" uuid = { version = "0.8", features = ["v4"] } -humantime="2.0.1" +humantime = "2.0.1" +erc20_payment_lib = { workspace = true } [dev-dependencies] ya-client = "0.7" ya-dummy-driver = "0.3" ya-erc20-driver = "0.4" -ya-zksync-driver = "0.3" +ya-erc20next-driver = "0.4" ya-net = { version = "0.3", features = ["service"] } ya-sb-router = "0.6.1" diff --git a/core/payment/examples/payment_api.rs b/core/payment/examples/payment_api.rs index 1d5ce8b786..a6d803ccdc 100644 --- a/core/payment/examples/payment_api.rs +++ b/core/payment/examples/payment_api.rs @@ -30,13 +30,12 @@ use ya_service_api_web::middleware::Identity; use ya_service_api_web::rest_api_addr; use ya_service_api_web::scope::ExtendableScope; use ya_service_bus::typed as bus; -use ya_zksync_driver as zksync; #[derive(Clone, Debug, StructOpt)] enum Driver { Dummy, Erc20, - Zksync, + Erc20next, } impl FromStr for Driver { @@ -45,8 +44,8 @@ impl FromStr for Driver { fn from_str(s: &str) -> anyhow::Result { match s.to_lowercase().as_str() { "dummy" => Ok(Driver::Dummy), - "erc20" => Ok(Driver::Erc20), - "zksync" => Ok(Driver::Zksync), + "erc20legacy" => Ok(Driver::Erc20), + "erc20" => Ok(Driver::Erc20next), s => Err(anyhow::Error::msg(format!("Invalid driver: {}", s))), } } @@ -56,8 +55,8 @@ impl std::fmt::Display for Driver { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Driver::Dummy => write!(f, "dummy"), - Driver::Erc20 => write!(f, "erc20"), - Driver::Zksync => write!(f, "zksync"), + Driver::Erc20 => write!(f, "erc20legacy"), + Driver::Erc20next => write!(f, "erc20"), } } } @@ -108,7 +107,7 @@ pub async fn start_erc20_driver( Ok(()) } -pub async fn start_zksync_driver( +pub async fn start_erc20_next_driver( db: &DbExecutor, requestor_account: SecretKey, ) -> anyhow::Result<()> { @@ -116,7 +115,8 @@ pub async fn start_zksync_driver( fake_list_identities(vec![requestor]); fake_subscribe_to_events(); - zksync::PaymentDriverService::gsb(db).await?; + erc20::PaymentDriverService::gsb(db).await?; + let requestor_sign_tx = get_sign_tx(requestor_account); fake_sign_tx(Box::new(requestor_sign_tx)); Ok(()) @@ -257,9 +257,10 @@ async fn main() -> anyhow::Result<()> { start_erc20_driver(&db, requestor_account).await?; erc20::DRIVER_NAME } - Driver::Zksync => { - start_zksync_driver(&db, requestor_account).await?; - zksync::DRIVER_NAME + Driver::Erc20next => { + //start_erc20next_driver(&db, requestor_account).await?; + //erc20next::DRIVER_NAME + todo!() } }; bus::service(driver_bus_id(driver_name)) diff --git a/core/payment/src/api/allocations.rs b/core/payment/src/api/allocations.rs index 876251d9dc..92a49a9539 100644 --- a/core/payment/src/api/allocations.rs +++ b/core/payment/src/api/allocations.rs @@ -80,6 +80,7 @@ async fn create_allocation( }; if let Err(e) = init_account(acc).await { + log::error!("Error initializing account: {:?}", e); return response::server_error(&e); } } diff --git a/core/serv/src/main.rs b/core/serv/src/main.rs index 5d6244fb83..684a296ca1 100644 --- a/core/serv/src/main.rs +++ b/core/serv/src/main.rs @@ -289,6 +289,13 @@ async fn start_payment_drivers(data_dir: &Path) -> anyhow::Result> { PaymentDriverService::gsb(&db_executor).await?; drivers.push(DRIVER_NAME.to_owned()); } + #[cfg(feature = "erc20next-driver")] + { + use ya_erc20next_driver::{PaymentDriverService, DRIVER_NAME}; + let db_executor = DbExecutor::from_data_dir(data_dir, "erc20next-driver")?; + PaymentDriverService::gsb(&db_executor).await?; + drivers.push(DRIVER_NAME.to_owned()); + } #[cfg(feature = "zksync-driver")] { use ya_zksync_driver::{PaymentDriverService, DRIVER_NAME}; @@ -500,8 +507,9 @@ impl ServiceCommand { // to enable it explicitly set RUST_LOG=info or more verbose env::set_var( "RUST_LOG", - env::var("RUST_LOG") - .unwrap_or_else(|_| "info,actix_web::middleware::logger=warn".to_string()), + env::var("RUST_LOG").unwrap_or_else(|_| { + "info,actix_web::middleware::logger=warn,sqlx=warn".to_string() + }), ); //this force_debug flag sets default log level to debug diff --git a/golem_cli/src/command/yagna.rs b/golem_cli/src/command/yagna.rs index 85edecf4fb..a63e62df32 100644 --- a/golem_cli/src/command/yagna.rs +++ b/golem_cli/src/command/yagna.rs @@ -54,6 +54,54 @@ lazy_static! { pub static ref ERC20_DRIVER: PaymentDriver = { let mut erc20 = HashMap::new(); erc20.insert( + NetworkName::Mainnet.into(), + PaymentPlatform { + platform: "erc20legacy-mainnet-glm", + driver: "erc20legacy", + token: "GLM", + }, + ); + erc20.insert( + NetworkName::Rinkeby.into(), + PaymentPlatform { + platform: "erc20legacy-rinkeby-tglm", + driver: "erc20legacy", + token: "tGLM", + }, + ); + erc20.insert( + NetworkName::Goerli.into(), + PaymentPlatform { + platform: "erc20legacy-goerli-tglm", + driver: "erc20legacy", + token: "tGLM", + }, + ); + erc20.insert( + NetworkName::Mumbai.into(), + PaymentPlatform { + platform: "erc20legacy-mumbai-tglm", + driver: "erc20legacy", + token: "tGLM", + }, + ); + erc20.insert( + NetworkName::Polygon.into(), + PaymentPlatform { + platform: "erc20legacy-polygon-glm", + driver: "erc20legacy", + token: "GLM", + }, + ); + + PaymentDriver { + platforms: erc20, + name: "erc20", + } + }; + pub static ref ERC20NEXT_DRIVER: PaymentDriver = { + let mut erc20next = HashMap::new(); + erc20next.insert( NetworkName::Mainnet.into(), PaymentPlatform { platform: "erc20-mainnet-glm", @@ -61,7 +109,7 @@ lazy_static! { token: "GLM", }, ); - erc20.insert( + erc20next.insert( NetworkName::Rinkeby.into(), PaymentPlatform { platform: "erc20-rinkeby-tglm", @@ -69,7 +117,7 @@ lazy_static! { token: "tGLM", }, ); - erc20.insert( + erc20next.insert( NetworkName::Goerli.into(), PaymentPlatform { platform: "erc20-goerli-tglm", @@ -77,7 +125,7 @@ lazy_static! { token: "tGLM", }, ); - erc20.insert( + erc20next.insert( NetworkName::Mumbai.into(), PaymentPlatform { platform: "erc20-mumbai-tglm", @@ -85,7 +133,7 @@ lazy_static! { token: "tGLM", }, ); - erc20.insert( + erc20next.insert( NetworkName::Polygon.into(), PaymentPlatform { platform: "erc20-polygon-glm", @@ -95,7 +143,7 @@ lazy_static! { ); PaymentDriver { - platforms: erc20, + platforms: erc20next, name: "erc20", } }; From 77e9a80e0bb144df0aa8c8536a0ab733d89b4e61 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 29 Aug 2023 10:57:01 +0200 Subject: [PATCH 002/123] erc20next: remove view_transactions.sql --- .../erc20next/view_transactions.sql | 39 ------------------- 1 file changed, 39 deletions(-) delete mode 100644 core/payment-driver/erc20next/view_transactions.sql diff --git a/core/payment-driver/erc20next/view_transactions.sql b/core/payment-driver/erc20next/view_transactions.sql deleted file mode 100644 index a2400aee79..0000000000 --- a/core/payment-driver/erc20next/view_transactions.sql +++ /dev/null @@ -1,39 +0,0 @@ ---use this query to debug and view ERC20 transaction list - - -SELECT tx_id, - ts.status || '(' || t.status || ')' as `status`, - Cast ((julianday('now') - julianday(time_created)) * 24 * 60 * 60 as integer) as `Created ago`, - Cast ((julianday('now') - julianday(time_last_action)) * 24 * 60 * 60 as integer) as `Last action ago`, - Cast ((julianday('now') - julianday(time_sent)) * 24 * 60 * 60 as integer) as `Last sent ago`, - Cast ((julianday('now') - julianday(time_confirmed)) * 24 * 60 * 60 as integer) as `Last confirmed ago`, - Cast ((julianday(time_confirmed) - julianday(time_created)) * 24 * 60 * 60 as integer) as `Total process time`, - nonce, - starting_gas_price, - current_gas_price, - max_gas_price, - final_gas_price, - final_gas_price_exact, - final_gas_used, - amount_base, - amount_base_exact, - amount_erc20, - amount_erc20_exact, - tx_type, - tmp_onchain_txs, - final_tx, - gas_limit, - time_created, - time_last_action, - time_sent, - time_confirmed, - network, - last_error_msg, - resent_times, - signature, - sender, - encoded - FROM `transaction` as t - JOIN `transaction_status` as ts on ts.status_id=t.status - ORDER BY time_created DESC - From bc2d4fe2dcd73f44697fbee591e8d2857393a4d3 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 29 Aug 2023 11:25:06 +0200 Subject: [PATCH 003/123] workflows: enable tests for payments-dev branch --- .github/workflows/binaries-aarch64.yml | 2 ++ .github/workflows/binaries-x86-64.yml | 2 ++ .github/workflows/integration-test.yml | 2 ++ .github/workflows/market-test-suite.yml | 2 ++ .github/workflows/system-test.yml | 1 + .github/workflows/unit-test-sgx.yml | 2 ++ .github/workflows/unit-test.yml | 2 ++ 7 files changed, 13 insertions(+) diff --git a/.github/workflows/binaries-aarch64.yml b/.github/workflows/binaries-aarch64.yml index 908241392a..ad2b71a1e5 100644 --- a/.github/workflows/binaries-aarch64.yml +++ b/.github/workflows/binaries-aarch64.yml @@ -4,10 +4,12 @@ on: push: branches: - master + - payments-dev - release/* pull_request: branches: - master + - payments-dev - release/* jobs: diff --git a/.github/workflows/binaries-x86-64.yml b/.github/workflows/binaries-x86-64.yml index b490ba028f..6d0d50eb5f 100644 --- a/.github/workflows/binaries-x86-64.yml +++ b/.github/workflows/binaries-x86-64.yml @@ -4,10 +4,12 @@ on: push: branches: - master + - payments-dev - release/* pull_request: branches: - master + - payments-dev - release/* env: diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 5324f4f34c..05b3a582c3 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -4,10 +4,12 @@ on: push: branches: - master + - payments-dev - release/* pull_request: branches: - master + - payments-dev - release/* jobs: diff --git a/.github/workflows/market-test-suite.yml b/.github/workflows/market-test-suite.yml index c770b365a9..c3e3158be1 100644 --- a/.github/workflows/market-test-suite.yml +++ b/.github/workflows/market-test-suite.yml @@ -4,10 +4,12 @@ on: push: branches: - master + - payments-dev - release/* pull_request: branches: - master + - payments-dev - release/* env: diff --git a/.github/workflows/system-test.yml b/.github/workflows/system-test.yml index e43801b34b..110f5eb776 100644 --- a/.github/workflows/system-test.yml +++ b/.github/workflows/system-test.yml @@ -4,6 +4,7 @@ on: pull_request: branches: - master + - payments-dev - release/* env: diff --git a/.github/workflows/unit-test-sgx.yml b/.github/workflows/unit-test-sgx.yml index 8b5b4c8f38..27c165b1c8 100644 --- a/.github/workflows/unit-test-sgx.yml +++ b/.github/workflows/unit-test-sgx.yml @@ -4,10 +4,12 @@ on: push: branches: - master + - payments-dev - release/* pull_request: branches: - master + - payments-dev - release/* - sgx/* diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 0b1419c262..a69ee7307d 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -4,10 +4,12 @@ on: push: branches: - master + - payments-dev - release/* pull_request: branches: - master + - payments-dev - release/* env: From fef718ae4d81c6f2e3a19d033600417f5d2bc0f3 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 29 Aug 2023 11:30:07 +0200 Subject: [PATCH 004/123] erc20next: use git source for erc20_payment_lib dep --- Cargo.lock | 5 +++-- Cargo.toml | 3 ++- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index af5bb56c6f..02a5d6dd10 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1891,6 +1891,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.1.9" +source = "git+https://github.com/golemfactory/erc20_payment_lib#5c3744ef423fd36d84fe561b1e7e38c096c7c50d" dependencies = [ "actix-files", "actix-web", @@ -7298,7 +7299,7 @@ checksum = "e7141e445af09c8919f1d5f8a20dae0b20c3b57a45dee0d5823c6ed5d237f15a" dependencies = [ "bitflags 1.3.2", "chrono", - "rustc_version 0.4.0", + "rustc_version 0.2.3", ] [[package]] @@ -8157,7 +8158,7 @@ dependencies = [ "actix-web-actors", "anyhow", "awc", - "base64 0.21.2", + "base64 0.11.0", "bytes 1.4.0", "ctor", "env_logger 0.10.0", diff --git a/Cargo.toml b/Cargo.toml index a4affa9699..45dcb99ec1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,8 @@ path = "core/serv/src/main.rs" # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib" } +#erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.1.9" } [dependencies] From 9aa9e632a4bf8a3a6a938b91e264f4b6faa310fc Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 29 Aug 2023 11:33:21 +0200 Subject: [PATCH 005/123] specify version of base64 in gsb-api --- Cargo.lock | 2 +- core/gsb-api/Cargo.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 02a5d6dd10..ef4648d2ac 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8158,7 +8158,7 @@ dependencies = [ "actix-web-actors", "anyhow", "awc", - "base64 0.11.0", + "base64 0.21.2", "bytes 1.4.0", "ctor", "env_logger 0.10.0", diff --git a/core/gsb-api/Cargo.toml b/core/gsb-api/Cargo.toml index e8b42dfe77..52330dee5e 100644 --- a/core/gsb-api/Cargo.toml +++ b/core/gsb-api/Cargo.toml @@ -25,10 +25,10 @@ lazy_static = "1" thiserror = "1" uuid = { version = "1.2.2", features = ["v4"] } futures = "0.3" -base64 = "0" +base64 = "0.21.2" flexbuffers = "2" bytes = "1" -tokio = { version = "1", features=["macros"] } +tokio = { version = "1", features = ["macros"] } [dev-dependencies] ya-core-model = { version = "^0.9", features = ["gftp"] } From 1268ffc6d8a244b518b03eda6d1e9a5978266c97 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 29 Aug 2023 11:51:15 +0200 Subject: [PATCH 006/123] chore: appease clippy --- core/payment-driver/erc20next/src/driver.rs | 6 +++--- core/payment-driver/erc20next/src/signer.rs | 5 ++--- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index 2c1ade15e2..f6ad1b2f7e 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -100,7 +100,7 @@ impl Erc20NextDriver { .setup .chain_setup .values() - .find(|chain_setup| &chain_setup.network == network) + .find(|chain_setup| chain_setup.network == network) .ok_or_else(|| GenericError::new(format!("Unsupported network: {}", network)))? .chain_id; @@ -236,12 +236,12 @@ impl PaymentDriver for Erc20NextDriver { msg: SchedulePayment, ) -> Result { let platform = msg.platform(); - let network = platform.split("-").nth(1).ok_or(GenericError::new(format!( + let network = platform.split('-').nth(1).ok_or(GenericError::new(format!( "Malformed platform string: {}", msg.platform() )))?; - self.do_transfer(&msg.sender(), &msg.recipient(), &msg.amount(), &network) + self.do_transfer(&msg.sender(), &msg.recipient(), &msg.amount(), network) .await } diff --git a/core/payment-driver/erc20next/src/signer.rs b/core/payment-driver/erc20next/src/signer.rs index 06cfa3539d..8ddb699a84 100644 --- a/core/payment-driver/erc20next/src/signer.rs +++ b/core/payment-driver/erc20next/src/signer.rs @@ -98,12 +98,11 @@ impl IdentitySigner { let addr = bus::get_pubkey(node_id).await.map_err(|e| SignerError { message: e.to_string(), })?; - let address = ethsign::PublicKey::from_slice(&addr) + let address = *ethsign::PublicKey::from_slice(&addr) .map_err(|_| SignerError { message: "Public address from bus::get_pubkey is invalid".to_string(), })? - .address() - .clone(); + .address(); if address == pub_address.as_bytes() { return Ok(node_id); From 30ecbcb5c1d85be783b03252ae8ca251ca656564 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 29 Aug 2023 15:14:01 +0200 Subject: [PATCH 007/123] erc20next: support payment confirmation --- core/payment-driver/erc20next/Cargo.toml | 2 +- core/payment-driver/erc20next/src/driver.rs | 60 ++++++++++++++++++-- core/payment-driver/erc20next/src/service.rs | 10 +++- 3 files changed, 64 insertions(+), 8 deletions(-) diff --git a/core/payment-driver/erc20next/Cargo.toml b/core/payment-driver/erc20next/Cargo.toml index 918cca5b4c..e88cb61822 100644 --- a/core/payment-driver/erc20next/Cargo.toml +++ b/core/payment-driver/erc20next/Cargo.toml @@ -2,7 +2,7 @@ name = "ya-erc20next-driver" version = "0.4.0" authors = ["Golem Factory "] -edition = "2018" +edition = "2021" [features] default = [] diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index f6ad1b2f7e..5e55b34ebd 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -4,12 +4,14 @@ Please limit the logic in this file, use local mods to handle the calls. */ // Extrnal crates -use erc20_payment_lib::db::ops::insert_token_transfer; -use erc20_payment_lib::runtime::PaymentRuntime; +use erc20_payment_lib::runtime::{DriverEventContent, PaymentRuntime}; use erc20_payment_lib::transaction::create_token_transfer; +use erc20_payment_lib::{db::ops::insert_token_transfer, runtime::DriverEvent}; use ethereum_types::H160; use std::collections::HashMap; use std::str::FromStr; +use tokio::sync::mpsc::Receiver; +use tokio::sync::Mutex; use uuid::Uuid; // Workspace uses @@ -51,13 +53,15 @@ lazy_static::lazy_static! { pub struct Erc20NextDriver { active_accounts: AccountsRc, payment_runtime: PaymentRuntime, + events: Mutex>, } impl Erc20NextDriver { - pub fn new(pr: PaymentRuntime) -> Self { + pub fn new(payment_runtime: PaymentRuntime, events: Receiver) -> Self { Self { active_accounts: Accounts::new_rc(), - payment_runtime: pr, + payment_runtime, + events: Mutex::new(events), } } @@ -277,7 +281,53 @@ impl PaymentDriver for Erc20NextDriver { #[async_trait(?Send)] impl PaymentDriverCron for Erc20NextDriver { async fn confirm_payments(&self) { - // no-op, handled by erc20_payment_lib internally + let mut events = self.events.lock().await; + while let Ok(event) = events.try_recv() { + if let DriverEventContent::TransferFinished(tx) = event.content { + let chain_id = tx.chain_id; + let network_name = &self + .payment_runtime + .setup + .chain_setup + .get(&chain_id) + .unwrap_or_else(|| panic!("Missing configuration for chain_id {chain_id}")) + .network; + + let networks = self.get_networks(); + let network = networks.get(network_name).unwrap_or_else(|| { + panic!("Network {network_name} not supported by Erc20NextDriver") + }); + let platform = network + .tokens + .get(&network.default_token) + .unwrap_or_else(|| { + panic!( + "Network {} doesn't specify platform for default token {}", + network_name, network.default_token + ) + }) + .as_str(); + + let token_amount = tx.token_amount; + + bus::notify_payment( + &self.get_name(), + platform, + vec![tx.payment_id.unwrap()], + &PaymentDetails { + recipient: tx.receiver_addr, + sender: tx.from_addr, + amount: BigDecimal::from_str(&token_amount).unwrap_or_else(|_| { + panic!("malformed tx.token_amount: {}", token_amount) + }), + date: tx.paid_date, + }, + tx.tx_id.unwrap_or(0xDEADBEEF).to_le_bytes().to_vec(), + ) + .await + .ok(); + } + } } async fn send_out_payments(&self) { diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index 40f2e77165..7ed051f075 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -63,6 +63,9 @@ impl Erc20NextService { log::warn!("Starting payment engine: {:#?}", config); let signer = IdentitySigner::new(); + + let (sender, recv) = tokio::sync::mpsc::channel(16); + let pr = start_payment_engine( &private_keys, "db.sqlite", @@ -70,15 +73,18 @@ impl Erc20NextService { signer, None, Some(additional_options), - None, + Some(sender), None, ) .await .unwrap(); + log::warn!("Payment engine started - outside task"); - let driver = Erc20NextDriver::new(pr); + let driver = Erc20NextDriver::new(pr, recv); + driver.load_active_accounts().await; let driver_rc = Arc::new(driver); + bus::bind_service(&db, driver_rc.clone()).await?; log::info!("Successfully connected Erc20NextService to gsb."); From d6bb8fe776b84e2726b7938915840fff15269dab Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Wed, 30 Aug 2023 10:02:40 +0200 Subject: [PATCH 008/123] erc20next: add info logs to payment confirmation job --- core/payment-driver/erc20next/src/driver.rs | 34 +++++++++++++-------- 1 file changed, 22 insertions(+), 12 deletions(-) diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index 5e55b34ebd..05e80730be 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -36,14 +36,14 @@ mod cli; lazy_static::lazy_static! { static ref TX_SENDOUT_INTERVAL: std::time::Duration = std::time::Duration::from_secs( - std::env::var("ERC20_SENDOUT_INTERVAL_SECS") + std::env::var("ERC20NEXT_SENDOUT_INTERVAL_SECS") .ok() .and_then(|x| x.parse().ok()) .unwrap_or(30), ); static ref TX_CONFIRMATION_INTERVAL: std::time::Duration = std::time::Duration::from_secs( - std::env::var("ERC20_CONFIRMATION_INTERVAL_SECS") + std::env::var("ERC20NEXT_CONFIRMATION_INTERVAL_SECS") .ok() .and_then(|x| x.parse().ok()) .unwrap_or(30), @@ -284,6 +284,8 @@ impl PaymentDriverCron for Erc20NextDriver { let mut events = self.events.lock().await; while let Ok(event) = events.try_recv() { if let DriverEventContent::TransferFinished(tx) = event.content { + log::info!("Received event TransferFinished: {:#?}", tx); + let chain_id = tx.chain_id; let network_name = &self .payment_runtime @@ -308,21 +310,29 @@ impl PaymentDriverCron for Erc20NextDriver { }) .as_str(); - let token_amount = tx.token_amount; + let payment_details = PaymentDetails { + recipient: tx.receiver_addr, + sender: tx.from_addr, + amount: BigDecimal::from_str(&tx.token_amount).unwrap_or_else(|_| { + panic!("malformed tx.token_amount: {}", tx.token_amount) + }), + date: tx.paid_date, + }; + + let confirmation = tx.tx_id.unwrap_or(0xDEADBEEF).to_le_bytes().to_vec(); + + log::info!("name = {}", &self.get_name()); + log::info!("platform = {}", platform); + log::info!("order_id = {}", tx.payment_id.as_ref().unwrap()); + log::info!("payment_details = {:#?}", payment_details); + log::info!("confirmation = {:x?}", confirmation); bus::notify_payment( &self.get_name(), platform, vec![tx.payment_id.unwrap()], - &PaymentDetails { - recipient: tx.receiver_addr, - sender: tx.from_addr, - amount: BigDecimal::from_str(&token_amount).unwrap_or_else(|_| { - panic!("malformed tx.token_amount: {}", token_amount) - }), - date: tx.paid_date, - }, - tx.tx_id.unwrap_or(0xDEADBEEF).to_le_bytes().to_vec(), + &payment_details, + confirmation, ) .await .ok(); From 784fe1356d784338a50bebfbc816c0eca037b6df Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Wed, 30 Aug 2023 11:42:10 +0200 Subject: [PATCH 009/123] erc20next: add support for setting geth endpoints via env --- core/payment-driver/erc20next/src/service.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index 7ed051f075..7f1a362b6d 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -51,7 +51,7 @@ impl Erc20NextService { }; log::warn!("Loading config"); let config_str = include_str!("../config-payments.toml"); - let config = match config::Config::load("config-payments.toml").await { + let mut config = match config::Config::load("config-payments.toml").await { Ok(config) => config, Err(err) => { log::warn!( @@ -61,6 +61,21 @@ impl Erc20NextService { } }; + let env_overrides = [ + ("goerli", "GOERLI_GETH_ADDR"), + ("polygon", "POLYGON_GETH_ADDR"), + ("mumbai", "MUMBAI_GETH_ADDR"), + ]; + + for env_override in env_overrides { + if let Ok(addr) = env::var(env_override.1) { + log::info!("Geth addr override: {addr}"); + if let Some(goerli_conf) = config.chain.get_mut(env_override.0) { + goerli_conf.rpc_endpoints = vec![addr]; + } + } + } + log::warn!("Starting payment engine: {:#?}", config); let signer = IdentitySigner::new(); From df25e47f36b497d67488fc8b8ad92e8468d3e497 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Wed, 30 Aug 2023 12:47:10 +0200 Subject: [PATCH 010/123] erc20next: add support for token addr overrides & bump goth --- .../erc20next/config-payments.toml | 2 +- core/payment-driver/erc20next/src/service.rs | 26 ++++++++++++++----- goth_tests/pyproject.toml | 9 +++---- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/core/payment-driver/erc20next/config-payments.toml b/core/payment-driver/erc20next/config-payments.toml index 7a3543e41e..2974e5b752 100644 --- a/core/payment-driver/erc20next/config-payments.toml +++ b/core/payment-driver/erc20next/config-payments.toml @@ -30,7 +30,7 @@ max-fee-per-gas = 10.0 gas-left-warning-limit = 1000000 transaction-timeout = 100 token = { address = "0x33af15c79d64b85ba14aaffaa4577949104b22e8", symbol = "tGLM" } -multi-contract = { address = "0x7777784f803a7bf1d7f115f849d29ce5706da64a", max-at-once = 10 } +# multi-contract = { address = "0x7777784f803a7bf1d7f115f849d29ce5706da64a", max-at-once = 10 } confirmation-blocks = 1 block-explorer-url = "https://goerli.etherscan.io" diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index 7f1a362b6d..d30101907d 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -2,12 +2,13 @@ The service that binds this payment driver into yagna via GSB. */ -use std::env; +use std::{env, str::FromStr}; // External crates use erc20_payment_lib::config; use erc20_payment_lib::config::AdditionalOptions; use erc20_payment_lib::misc::load_private_keys; use erc20_payment_lib::runtime::start_payment_engine; +use ethereum_types::H160; use std::sync::Arc; // Workspace uses @@ -62,17 +63,28 @@ impl Erc20NextService { }; let env_overrides = [ - ("goerli", "GOERLI_GETH_ADDR"), - ("polygon", "POLYGON_GETH_ADDR"), - ("mumbai", "MUMBAI_GETH_ADDR"), + ("goerli", "GOERLI_GETH_ADDR", "GOERLI_TGLM_CONTRACT_ADDRESS"), + ( + "polygon", + "POLYGON_GETH_ADDR", + "POLYGON_GLM_CONTRACT_ADDRESS", + ), ]; for env_override in env_overrides { - if let Ok(addr) = env::var(env_override.1) { - log::info!("Geth addr override: {addr}"); - if let Some(goerli_conf) = config.chain.get_mut(env_override.0) { + log::info!("Checking overrides for {}", env_override.0); + if let Some(goerli_conf) = config.chain.get_mut(env_override.0) { + if let Ok(addr) = env::var(env_override.1) { + log::info!("Geth addr: {addr}"); + goerli_conf.rpc_endpoints = vec![addr]; } + if let Ok(addr) = env::var(env_override.2) { + log::info!("Token addr: {addr}"); + + goerli_conf.token.as_mut().unwrap().address = + H160::from_str(&addr).unwrap(); + } } } diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index c7f18f0604..20a53dd18c 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -8,10 +8,7 @@ version = "0.1.1" description = "Integration tests for yagna" authors = ["GolemFactory "] license = "LGPL-3.0-or-later" -classifiers = [ - "Development Status :: 3 - Alpha", - "Framework :: AsyncIO", -] +classifiers = ["Development Status :: 3 - Alpha", "Framework :: AsyncIO"] repository = "https://github.com/golemfactory/yagna" documentation = "https://handbook.golem.network" readme = "README.md" @@ -22,9 +19,9 @@ pytest = "^6.2" pytest-asyncio = "^0.20.2" pytest-rerunfailures = "^10.3" pytest-split = "^0.8.1" -goth = "^0.15.0" +# goth = "^0.15.0" # to use development goth version uncomment below -# goth = { git = "https://github.com/golemfactory/goth.git", rev = "d2951a62e2a7cf0712f7f4a66c4a080777841611" } +goth = { git = "https://github.com/golemfactory/goth.git", rev = "664c85965cee5fed14c5b42e81ff2ca343184e08" } [tool.poetry.dev-dependencies] black = "^20.8b1" From c8356a45186060f9bf325e711768e5dcc316666f Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Sun, 3 Sep 2023 12:04:34 +0200 Subject: [PATCH 011/123] gsb-api: fix test_json This test used a serde_json::Value -> flexbuffers -> Rust struct serde trip which is not guaranteed to work and should not be relied upon. The proper route is Value -> flexbuffers -> Value -> Rust. This only broke recently because without the arbitrary_precision feature of serde_json the shorter path works. The feature has been enabled due to the addition of erc20_payment_lib to the dependency graph, which transitively depends on serde_json with arbitrary prec. Note that cargo unifies duplicate dependencies under the assumption that features are purely additive, hence the spooky action at a distance. --- core/gsb-api/src/lib.rs | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/core/gsb-api/src/lib.rs b/core/gsb-api/src/lib.rs index f00d31b162..6cbfc15311 100644 --- a/core/gsb-api/src/lib.rs +++ b/core/gsb-api/src/lib.rs @@ -116,12 +116,6 @@ impl From<&DropMessages> for WsResponseMsg { } } -#[derive(Debug, Serialize, Deserialize)] -struct Msg { - id: String, - payload: serde_json::Value, -} - #[derive(Message, Debug)] #[rtype(result = "()")] struct WsDisconnect(CloseReason); @@ -561,7 +555,9 @@ mod flexbuffer_util { clone_map(builder_map, &r_m).unwrap(); let r = Reader::get_root(builder.view()).unwrap(); - let payload = Payload::deserialize(r).unwrap(); + + let json_deserialized = serde_json::Value::deserialize(r).unwrap(); + let payload = Payload::deserialize(json_deserialized).unwrap(); assert_eq!(11, payload.file_size); } From efcdbf63560457a8485e0fbe8d9d9f365f9221f7 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Sat, 2 Sep 2023 22:46:05 +0200 Subject: [PATCH 012/123] Specify rust version for aarch64 CI builds --- .github/workflows/binaries-aarch64.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/binaries-aarch64.yml b/.github/workflows/binaries-aarch64.yml index ad2b71a1e5..78cad0a9e0 100644 --- a/.github/workflows/binaries-aarch64.yml +++ b/.github/workflows/binaries-aarch64.yml @@ -12,6 +12,9 @@ on: - payments-dev - release/* +env: + rust_stable: 1.71.1 + jobs: build: name: Build binaries (aarch64) @@ -22,10 +25,10 @@ jobs: - name: Checkout uses: actions/checkout@v2 - - name: Setup toolchain + - name: Install Rust ${{ env.rust_stable }} uses: actions-rs/toolchain@v1 with: - toolchain: stable + toolchain: ${{ env.rust_stable }} target: aarch64-unknown-linux-musl override: true From 4d590ab764123de6b69015680fe662f1893d0ea8 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Mon, 4 Sep 2023 09:56:36 +0200 Subject: [PATCH 013/123] erc20next: put config & db relative to provider data dir --- Cargo.lock | 5 +++-- Cargo.toml | 2 +- core/payment-driver/erc20next/src/service.rs | 10 ++++------ core/payment/examples/payment_api.rs | 5 ++++- core/serv/src/main.rs | 2 +- 5 files changed, 13 insertions(+), 11 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ef4648d2ac..14a1739439 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1891,7 +1891,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.1.9" -source = "git+https://github.com/golemfactory/erc20_payment_lib#5c3744ef423fd36d84fe561b1e7e38c096c7c50d" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=51154917b0d583dd368f1a5c3883666ee8fac98e#51154917b0d583dd368f1a5c3883666ee8fac98e" dependencies = [ "actix-files", "actix-web", @@ -1904,6 +1904,7 @@ dependencies = [ "humantime 2.1.0", "lazy_static", "log", + "percent-encoding", "rand 0.8.5", "rust_decimal", "rustc-hex", @@ -7299,7 +7300,7 @@ checksum = "e7141e445af09c8919f1d5f8a20dae0b20c3b57a45dee0d5823c6ed5d237f15a" dependencies = [ "bitflags 1.3.2", "chrono", - "rustc_version 0.2.3", + "rustc_version 0.4.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 45dcb99ec1..8cec878aed 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ path = "core/serv/src/main.rs" # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "51154917b0d583dd368f1a5c3883666ee8fac98e" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.1.9" } diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index d30101907d..016b4777bc 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -2,7 +2,7 @@ The service that binds this payment driver into yagna via GSB. */ -use std::{env, str::FromStr}; +use std::{env, path::PathBuf, str::FromStr}; // External crates use erc20_payment_lib::config; use erc20_payment_lib::config::AdditionalOptions; @@ -17,7 +17,6 @@ use ya_payment_driver::{ dao::{init, DbExecutor}, model::GenericError, }; -use ya_service_api_interfaces::Provider; // Local uses use crate::{driver::Erc20NextDriver, signer::IdentitySigner}; @@ -25,14 +24,13 @@ use crate::{driver::Erc20NextDriver, signer::IdentitySigner}; pub struct Erc20NextService; impl Erc20NextService { - pub async fn gsb>(context: &Context) -> anyhow::Result<()> { + pub async fn gsb(db: &DbExecutor, path: PathBuf) -> anyhow::Result<()> { log::debug!("Connecting Erc20NextService to gsb..."); // TODO: Read and validate env log::debug!("Environment variables validated"); // Init database - let db: DbExecutor = context.component(); init(&db).await.map_err(GenericError::new)?; log::debug!("Database initialised"); @@ -52,7 +50,7 @@ impl Erc20NextService { }; log::warn!("Loading config"); let config_str = include_str!("../config-payments.toml"); - let mut config = match config::Config::load("config-payments.toml").await { + let mut config = match config::Config::load(path.join("config-payments.toml")).await { Ok(config) => config, Err(err) => { log::warn!( @@ -95,7 +93,7 @@ impl Erc20NextService { let pr = start_payment_engine( &private_keys, - "db.sqlite", + &path.join("db.sqlite"), config, signer, None, diff --git a/core/payment/examples/payment_api.rs b/core/payment/examples/payment_api.rs index a6d803ccdc..f7b4b3c0df 100644 --- a/core/payment/examples/payment_api.rs +++ b/core/payment/examples/payment_api.rs @@ -10,6 +10,7 @@ use rand::Rng; use std::convert::TryInto; use std::io::Write; +use std::path::PathBuf; use std::pin::Pin; use std::str::FromStr; use std::sync::Arc; @@ -21,6 +22,7 @@ use ya_core_model::driver::{driver_bus_id, AccountMode, Fund, Init}; use ya_core_model::identity; use ya_dummy_driver as dummy; use ya_erc20_driver as erc20; +use ya_erc20next_driver as erc20next; use ya_net::Config; use ya_payment::processor::PaymentProcessor; use ya_payment::{migrations, utils, PaymentService}; @@ -109,13 +111,14 @@ pub async fn start_erc20_driver( pub async fn start_erc20_next_driver( db: &DbExecutor, + path: PathBuf, requestor_account: SecretKey, ) -> anyhow::Result<()> { let requestor = NodeId::from(requestor_account.public().address().as_ref()); fake_list_identities(vec![requestor]); fake_subscribe_to_events(); - erc20::PaymentDriverService::gsb(db).await?; + erc20next::PaymentDriverService::gsb(db, path).await?; let requestor_sign_tx = get_sign_tx(requestor_account); fake_sign_tx(Box::new(requestor_sign_tx)); diff --git a/core/serv/src/main.rs b/core/serv/src/main.rs index 684a296ca1..5c79c1c360 100644 --- a/core/serv/src/main.rs +++ b/core/serv/src/main.rs @@ -293,7 +293,7 @@ async fn start_payment_drivers(data_dir: &Path) -> anyhow::Result> { { use ya_erc20next_driver::{PaymentDriverService, DRIVER_NAME}; let db_executor = DbExecutor::from_data_dir(data_dir, "erc20next-driver")?; - PaymentDriverService::gsb(&db_executor).await?; + PaymentDriverService::gsb(&db_executor, data_dir.join("erc20next-driver")).await?; drivers.push(DRIVER_NAME.to_owned()); } #[cfg(feature = "zksync-driver")] From 162da9c8f81ba6fa026df6b201a0f49265accf57 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Mon, 4 Sep 2023 10:40:24 +0200 Subject: [PATCH 014/123] chore: appease clippy --- core/net/src/config.rs | 35 +++++++++----------- core/payment-driver/erc20next/src/service.rs | 4 +-- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/core/net/src/config.rs b/core/net/src/config.rs index b105096821..c71976231e 100644 --- a/core/net/src/config.rs +++ b/core/net/src/config.rs @@ -5,11 +5,26 @@ use strum::{EnumString, EnumVariantNames, IntoStaticStr}; use url::Url; #[derive( - StructOpt, EnumString, EnumVariantNames, IntoStaticStr, Copy, Clone, Eq, PartialEq, Debug, + StructOpt, + EnumString, + EnumVariantNames, + IntoStaticStr, + Copy, + Clone, + Default, + Eq, + PartialEq, + Debug, )] #[strum(serialize_all = "lowercase")] pub enum NetType { + /// TODO: Remove compilation flag. + /// This conditional compilation is hack to make Goth integration tests work. + /// Current solution in Goth is to build separate binary with compilation flag. + /// This is only temporary for transition period, to make this PR as small as possible. + #[cfg_attr(feature = "central-net", default)] Central, + #[cfg_attr(not(feature = "central-net"), default)] Hybrid, } @@ -35,21 +50,3 @@ impl Config { Config::from_iter_safe(&[""]) } } - -/// TODO: Remove compilation flag. -/// This conditional compilation is hack to make Goth integration tests work. -/// Current solution in Goth is to build separate binary with compilation flag. -/// This is only temporary for transition period, to make this PR as small as possible. -#[cfg(feature = "central-net")] -impl Default for NetType { - fn default() -> Self { - NetType::Central - } -} - -#[cfg(not(feature = "central-net"))] -impl Default for NetType { - fn default() -> Self { - NetType::Hybrid - } -} diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index 016b4777bc..cdb3224cd0 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -31,7 +31,7 @@ impl Erc20NextService { log::debug!("Environment variables validated"); // Init database - init(&db).await.map_err(GenericError::new)?; + init(db).await.map_err(GenericError::new)?; log::debug!("Database initialised"); // Start cron @@ -110,7 +110,7 @@ impl Erc20NextService { driver.load_active_accounts().await; let driver_rc = Arc::new(driver); - bus::bind_service(&db, driver_rc.clone()).await?; + bus::bind_service(db, driver_rc.clone()).await?; log::info!("Successfully connected Erc20NextService to gsb."); Ok(()) From 4756187c87c5bc8f243df178305469b03be3bcb5 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Mon, 4 Sep 2023 12:50:06 +0200 Subject: [PATCH 015/123] erc20next: proper env handling --- core/payment-driver/erc20next/src/service.rs | 84 ++++++++++++-------- 1 file changed, 53 insertions(+), 31 deletions(-) diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index cdb3224cd0..2da83bf5d4 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -48,42 +48,64 @@ impl Erc20NextService { contract_use_direct_method: false, contract_use_unpacked_method: false, }; + log::warn!("Loading config"); - let config_str = include_str!("../config-payments.toml"); - let mut config = match config::Config::load(path.join("config-payments.toml")).await { - Ok(config) => config, - Err(err) => { - log::warn!( - "Failed to load config from config-payments.toml due to {err:?}, using default config" - ); - config::Config::load_from_str(config_str).unwrap() + let mut config = config::Config::load_from_str(include_str!("../config-payments.toml")) + .expect("Default erc20next config doesn't parse"); + + for (network, chain) in &mut config.chain { + let prefix = network.to_ascii_uppercase(); + let Some(token) = &mut chain.token else { continue }; + let symbol = token.symbol.to_ascii_uppercase(); + + let rpc_env = format!("{prefix}_GETH_ADDR"); + let priority_fee_env = format!("{prefix}_PRIORITY_FEE"); + let max_fee_per_gas_env = format!("{prefix}_MAX_FEE_PER_GAS"); + let token_addr_env = format!("{prefix}_{symbol}_CONTRACT_ADDRESS"); + + if let Ok(addr) = env::var(&rpc_env) { + chain.rpc_endpoints = addr.split(",").map(ToOwned::to_owned).collect(); + log::info!( + "{} rpc endpoints set to {:?}", + network, + &chain.rpc_endpoints + ) } - }; - - let env_overrides = [ - ("goerli", "GOERLI_GETH_ADDR", "GOERLI_TGLM_CONTRACT_ADDRESS"), - ( - "polygon", - "POLYGON_GETH_ADDR", - "POLYGON_GLM_CONTRACT_ADDRESS", - ), - ]; - - for env_override in env_overrides { - log::info!("Checking overrides for {}", env_override.0); - if let Some(goerli_conf) = config.chain.get_mut(env_override.0) { - if let Ok(addr) = env::var(env_override.1) { - log::info!("Geth addr: {addr}"); - - goerli_conf.rpc_endpoints = vec![addr]; + if let Ok(fee) = env::var(&priority_fee_env) { + match fee.parse::() { + Ok(fee) => { + log::info!("{network} priority fee set to {fee}"); + chain.priority_fee = fee; + } + Err(e) => log::warn!( + "Valiue {fee} for {priority_fee_env} is not a valid devimal: {e}" + ), } - if let Ok(addr) = env::var(env_override.2) { - log::info!("Token addr: {addr}"); - - goerli_conf.token.as_mut().unwrap().address = - H160::from_str(&addr).unwrap(); + } + if let Ok(max_fee) = env::var(&max_fee_per_gas_env) { + match max_fee.parse::() { + Ok(max_fee) => { + log::info!("{network} max fee per gas set to {max_fee}"); + chain.max_fee_per_gas = max_fee; + } + Err(e) => log::warn!( + "Valiue {max_fee} for {max_fee_per_gas_env} is not a valid devimal: {e}" + ), } } + if let Ok(addr) = env::var(&token_addr_env) { + match H160::from_str(&addr) { + Ok(parsed) => { + log::info!("{network} token address set to {addr}"); + token.address = parsed; + } + Err(e) => { + log::warn!( + "Value {addr} for {token_addr_env} is not valid H160 address: {e}" + ); + } + }; + } } log::warn!("Starting payment engine: {:#?}", config); From 3a16af84492588ff2180d6bfe179726d368b24e3 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Mon, 4 Sep 2023 12:49:18 +0200 Subject: [PATCH 016/123] Enable amending allocations (#2727) * Enable amending allocations * Specify ya-client dependency to be 0.7 instead of 0.7.1 The version 0.7.1 is published on crates.io (?) but the corresponding tag is not present on master and HEAD Cargo.toml declared itself to be 0.7.0, which prevented the git revision in patch.crates-io from being considered by cargo. * bump ya-client * Specify rust version for aarch64 CI builds --- .github/workflows/binaries-aarch64.yml | 7 +- Cargo.lock | 119 ++++++++++++------------- Cargo.toml | 6 +- core/gsb-api/Cargo.toml | 4 +- core/market/tests/test_rest_api.rs | 2 +- core/payment/src/api/allocations.rs | 87 +++++++++++++++++- core/payment/src/dao/allocation.rs | 14 +++ core/payment/src/models/allocation.rs | 17 +++- exe-unit/Cargo.toml | 35 ++++++-- exe-unit/examples/transfer.rs | 2 +- exe-unit/examples/transfer_abort.rs | 2 +- exe-unit/src/crypto.rs | 2 +- 12 files changed, 215 insertions(+), 82 deletions(-) diff --git a/.github/workflows/binaries-aarch64.yml b/.github/workflows/binaries-aarch64.yml index 908241392a..73a02be276 100644 --- a/.github/workflows/binaries-aarch64.yml +++ b/.github/workflows/binaries-aarch64.yml @@ -10,6 +10,9 @@ on: - master - release/* +env: + rust_stable: 1.71.1 + jobs: build: name: Build binaries (aarch64) @@ -20,10 +23,10 @@ jobs: - name: Checkout uses: actions/checkout@v2 - - name: Setup toolchain + - name: Install Rust ${{ env.rust_stable }} uses: actions-rs/toolchain@v1 with: - toolchain: stable + toolchain: ${{ env.rust_stable }} target: aarch64-unknown-linux-musl override: true diff --git a/Cargo.lock b/Cargo.lock index 172476a60d..16451b5d83 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -93,7 +93,7 @@ dependencies = [ "actix-tls", "actix-utils", "ahash 0.8.3", - "base64 0.21.2", + "base64 0.21.3", "bitflags 1.3.2", "brotli", "bytes 1.4.0", @@ -694,7 +694,7 @@ dependencies = [ "actix-tls", "actix-utils", "ahash 0.7.6", - "base64 0.21.2", + "base64 0.21.3", "bytes 1.4.0", "cfg-if 1.0.0", "cookie", @@ -761,9 +761,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.2" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" +checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" [[package]] name = "bellman_ce" @@ -1531,9 +1531,9 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "3.2.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90f9d052967f590a76e62eb387bd0bbb1b000182c3cefe5364db6b7211651bc0" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" dependencies = [ "byteorder", "digest 0.9.0", @@ -2142,7 +2142,7 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dde5a00073374b4d7aa2d3a8359a5709f9c0bfac8393f254655d16b4acdfe823" dependencies = [ - "num-bigint 0.4.3", + "num-bigint 0.4.4", "num-integer", "num-traits", "proc-macro2", @@ -2650,8 +2650,8 @@ dependencies = [ "serde_json", "strip-ansi-escapes", "structopt", - "strum 0.24.1", - "strum_macros 0.24.3", + "strum", + "strum_macros", "tokio 1.32.0", "url", "ya-client", @@ -4108,9 +4108,9 @@ dependencies = [ [[package]] name = "num-bigint" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" dependencies = [ "autocfg 1.1.0", "num-integer", @@ -5343,7 +5343,7 @@ version = "0.11.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ - "base64 0.21.2", + "base64 0.21.3", "bytes 1.4.0", "encoding_rs", "futures-core", @@ -5654,9 +5654,7 @@ version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c6179428c22c73ac0fbb7b5579a56353ce78ba29759b3b8575183336ea74cdfb" dependencies = [ - "rand 0.6.5", "secp256k1-sys 0.3.0", - "serde", ] [[package]] @@ -5669,6 +5667,17 @@ dependencies = [ "secp256k1-sys 0.4.2", ] +[[package]] +name = "secp256k1" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25996b82292a7a57ed3508f052cfff8640d38d32018784acd714758b43da9c8f" +dependencies = [ + "rand 0.8.5", + "secp256k1-sys 0.8.1", + "serde", +] + [[package]] name = "secp256k1-sys" version = "0.3.0" @@ -5687,6 +5696,15 @@ dependencies = [ "cc", ] +[[package]] +name = "secp256k1-sys" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" +dependencies = [ + "cc", +] + [[package]] name = "security-framework" version = "2.9.2" @@ -5914,9 +5932,9 @@ dependencies = [ [[package]] name = "serde_qs" -version = "0.8.5" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7715380eec75f029a4ef7de39a9200e0a63823176b759d055b613f5a87df6a6" +checksum = "0431a35568651e363364210c91983c1da5eb29404d9f0928b67d4ebcfa7d330c" dependencies = [ "percent-encoding", "serde", @@ -6406,31 +6424,13 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "strum" -version = "0.19.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b89a286a7e3b5720b9a477b23253bc50debac207c8d21505f8e70b36792f11b5" - [[package]] name = "strum" version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" dependencies = [ - "strum_macros 0.24.3", -] - -[[package]] -name = "strum_macros" -version = "0.19.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e61bb0be289045cb80bfce000512e32d09f8337e54c186725da381377ad1f8d5" -dependencies = [ - "heck 0.3.3", - "proc-macro2", - "quote", - "syn 1.0.109", + "strum_macros", ] [[package]] @@ -7921,9 +7921,8 @@ dependencies = [ [[package]] name = "ya-client" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0b90678d1068fc53bd898b32d5990eec77fdf5b1585f59267258863e727a1b5" +version = "0.7.0" +source = "git+https://github.com/golemfactory/ya-client.git?rev=20590d867dff7bb0662b5fc2abc6b6417cc47fe5#20590d867dff7bb0662b5fc2abc6b6417cc47fe5" dependencies = [ "actix-codec", "awc", @@ -7931,11 +7930,10 @@ dependencies = [ "chrono", "envy", "futures 0.3.28", - "heck 0.3.3", + "heck 0.4.1", "hex", "log", "mime", - "rand 0.6.5", "serde", "serde_json", "serde_qs", @@ -7948,8 +7946,7 @@ dependencies = [ [[package]] name = "ya-client-model" version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70a4a2f46bc12b1c747495c7911a844e7dc2c879826993426d568b9b594c26a1" +source = "git+https://github.com/golemfactory/ya-client.git?rev=20590d867dff7bb0662b5fc2abc6b6417cc47fe5#20590d867dff7bb0662b5fc2abc6b6417cc47fe5" dependencies = [ "bigdecimal 0.2.2", "chrono", @@ -7958,11 +7955,11 @@ dependencies = [ "hex", "openssl", "rand 0.8.5", - "secp256k1 0.19.0", + "secp256k1 0.27.0", "serde", "serde_json", - "strum 0.19.5", - "strum_macros 0.19.4", + "strum", + "strum_macros", "thiserror", ] @@ -7989,8 +7986,8 @@ dependencies = [ "serde", "serde_bytes", "structopt", - "strum 0.24.1", - "strum_macros 0.24.3", + "strum", + "strum_macros", "thiserror", "ya-client-model", "ya-service-bus", @@ -8094,11 +8091,11 @@ dependencies = [ "log", "nix 0.22.3", "openssl", - "rand 0.6.5", + "rand 0.8.5", "regex", "reqwest 0.11.18", "rustyline 7.1.0", - "secp256k1 0.19.0", + "secp256k1 0.27.0", "serde", "serde_json", "serde_yaml 0.8.26", @@ -8169,7 +8166,7 @@ dependencies = [ "actix-web-actors", "anyhow", "awc", - "base64 0.21.2", + "base64 0.21.3", "bytes 1.4.0", "ctor", "env_logger 0.10.0", @@ -8251,7 +8248,7 @@ name = "ya-manifest-utils" version = "0.2.0" dependencies = [ "anyhow", - "base64 0.21.2", + "base64 0.21.3", "chrono", "golem-certificate", "hex", @@ -8270,7 +8267,7 @@ dependencies = [ "shlex 1.1.0", "snailquote", "structopt", - "strum 0.24.1", + "strum", "tar", "tempfile", "test-case 3.1.0", @@ -8317,8 +8314,8 @@ dependencies = [ "serial_test 0.5.1", "sha3 0.8.2", "structopt", - "strum 0.24.1", - "strum_macros 0.24.3", + "strum", + "strum_macros", "thiserror", "tokio 1.32.0", "uuid 0.8.2", @@ -8399,7 +8396,7 @@ dependencies = [ "serde", "serde_json", "structopt", - "strum 0.24.1", + "strum", "test-case 2.2.2", "thiserror", "tokio 1.32.0", @@ -8587,8 +8584,8 @@ dependencies = [ "shlex 1.1.0", "signal-hook", "structopt", - "strum 0.24.1", - "strum_macros 0.24.3", + "strum", + "strum_macros", "sys-info", "tempdir", "tempfile", @@ -8813,8 +8810,8 @@ dependencies = [ "proc-macro2", "quote", "structopt", - "strum 0.24.1", - "strum_macros 0.24.3", + "strum", + "strum_macros", "syn 1.0.109", "ya-service-api-interfaces", ] @@ -9234,9 +9231,9 @@ checksum = "09041cd90cf85f7f8b2df60c646f853b7f535ce68f85244eb6731cf89fa498ec" [[package]] name = "zeroize" -version = "1.3.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" dependencies = [ "zeroize_derive", ] diff --git a/Cargo.toml b/Cargo.toml index 2e7249ab87..611d267248 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -60,7 +60,7 @@ ya-utils-networking = "0.2" ya-fd-metrics = { path = "utils/fd-metrics" } ya-version = "0.2" ya-vpn = "0.2" -ya-client = "0.7.1" +ya-client = "0.7" ya-client-model = "0.5" gftp = { version = "0.3.1", optional = true } # just to enable gftp build for cargo-deb @@ -256,8 +256,8 @@ ya-sb-util = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = #ya-sb-util = { path = "../ya-service-bus/crates/util" } ## CLIENT -#ya-client = { git = "https://github.com/golemfactory/ya-client.git", rev = "2a6350f62cf8d926721225a3451822731456e3fe" } -#ya-client-model = { git = "https://github.com/golemfactory/ya-client.git", rev = "2a6350f62cf8d926721225a3451822731456e3fe" } +ya-client = { git = "https://github.com/golemfactory/ya-client.git", rev = "20590d867dff7bb0662b5fc2abc6b6417cc47fe5" } +ya-client-model = { git = "https://github.com/golemfactory/ya-client.git", rev = "20590d867dff7bb0662b5fc2abc6b6417cc47fe5" } ## RELAY and networking stack ya-relay-stack = { git = "https://github.com/golemfactory/ya-relay.git", rev = "c92a75b0cf062fcc9dbb3ea2a034d913e5fad8e5" } diff --git a/core/gsb-api/Cargo.toml b/core/gsb-api/Cargo.toml index e8b42dfe77..8d1db889b9 100644 --- a/core/gsb-api/Cargo.toml +++ b/core/gsb-api/Cargo.toml @@ -25,10 +25,10 @@ lazy_static = "1" thiserror = "1" uuid = { version = "1.2.2", features = ["v4"] } futures = "0.3" -base64 = "0" +base64 = "0.21.3" flexbuffers = "2" bytes = "1" -tokio = { version = "1", features=["macros"] } +tokio = { version = "1", features = ["macros"] } [dev-dependencies] ya-core-model = { version = "^0.9", features = ["gftp"] } diff --git a/core/market/tests/test_rest_api.rs b/core/market/tests/test_rest_api.rs index a07fc836a4..ad61116a70 100644 --- a/core/market/tests/test_rest_api.rs +++ b/core/market/tests/test_rest_api.rs @@ -410,7 +410,7 @@ async fn test_rest_query_agreement_events() { let app = network.get_rest_app("Node-1").await; let url = format!( "/market-api/v1/agreementEvents?{}", - QueryParamsBuilder::new() + QueryParamsBuilder::default() .put("afterTimestamp", Some(after_timestamp)) .put("appSessionId", Some("r-session")) .put("maxEvents", Some(10)) diff --git a/core/payment/src/api/allocations.rs b/core/payment/src/api/allocations.rs index 876251d9dc..416e35fc63 100644 --- a/core/payment/src/api/allocations.rs +++ b/core/payment/src/api/allocations.rs @@ -3,6 +3,7 @@ use std::time::Duration; // External crates use actix_web::web::{delete, get, post, put, Data, Json, Path, Query}; use actix_web::{HttpResponse, Scope}; +use bigdecimal::BigDecimal; use chrono::{DateTime, Utc}; use serde_json::value::Value::Null; use ya_client_model::NodeId; @@ -162,12 +163,94 @@ async fn get_allocation( } } +fn amend_allocation_fields( + old_allocation: Allocation, + update: AllocationUpdate, +) -> Result { + let total_amount = update + .total_amount + .unwrap_or_else(|| old_allocation.total_amount.clone()); + let remaining_amount = total_amount.clone() - &old_allocation.spent_amount; + + if remaining_amount < BigDecimal::from(0) { + return Err("New allocation would be smaller than the already spent amount"); + } + if let Some(timeout) = update.timeout { + if timeout < chrono::offset::Utc::now() { + return Err("New allocation timeout is in the past"); + } + } + + Ok(Allocation { + total_amount, + remaining_amount, + timeout: update.timeout.or(old_allocation.timeout), + ..old_allocation + }) +} + async fn amend_allocation( db: Data, path: Path, - body: Json, + body: Json, + id: Identity, ) -> HttpResponse { - response::not_implemented() // TODO + let allocation_id = path.allocation_id.clone(); + let node_id = id.identity; + let new_allocation: AllocationUpdate = body.into_inner(); + let dao: AllocationDao = db.as_dao(); + + let current_allocation = match dao.get(allocation_id.clone(), node_id).await { + Ok(AllocationStatus::Active(allocation)) => allocation, + Ok(AllocationStatus::Gone) => { + return response::gone(&format!( + "Allocation {allocation_id} has been already released", + )) + } + Ok(AllocationStatus::NotFound) => return response::not_found(), + Err(e) => return response::server_error(&e), + }; + + let amended_allocation = + match amend_allocation_fields(current_allocation.clone(), new_allocation) { + Ok(allocation) => allocation, + Err(e) => return response::bad_request(&e), + }; + + // validation will take into account all existing allocation, including the one + // being currently modified. This means we only need to validate the increase. + let amount_to_validate = + amended_allocation.total_amount.clone() - ¤t_allocation.total_amount; + + let validate_msg = ValidateAllocation { + platform: amended_allocation.payment_platform.clone(), + address: amended_allocation.address.clone(), + amount: if amount_to_validate > BigDecimal::from(0) { + amount_to_validate + } else { + 0.into() + }, + }; + match async move { Ok(bus::service(LOCAL_SERVICE).send(validate_msg).await??) }.await { + Ok(true) => {} + Ok(false) => return response::bad_request(&"Insufficient funds to make allocation. Top up your account or release all existing allocations to unlock the funds via `yagna payment release-allocations`"), + Err(Error::Rpc(RpcMessageError::ValidateAllocation( + ValidateAllocationError::AccountNotRegistered, + ))) => return response::bad_request(&"Account not registered"), + Err(e) => return response::server_error(&e), + } + + match dao.replace(amended_allocation, node_id).await { + Ok(true) => {} + Ok(false) => { + return response::server_error( + &"Allocation not present despite preconditions being already ensured", + ) + } + Err(e) => return response::server_error(&e), + } + + get_allocation(db, path, id).await } async fn release_allocation( diff --git a/core/payment/src/dao/allocation.rs b/core/payment/src/dao/allocation.rs index 693f332c82..338fb2613d 100644 --- a/core/payment/src/dao/allocation.rs +++ b/core/payment/src/dao/allocation.rs @@ -63,6 +63,20 @@ impl<'c> AllocationDao<'c> { .await } + pub async fn replace(&self, allocation: Allocation, owner_id: NodeId) -> DbResult { + do_with_transaction(self.pool, move |conn| { + let count = diesel::update(dsl::pay_allocation) + .filter(dsl::id.eq(allocation.allocation_id.clone())) + .filter(dsl::owner_id.eq(&owner_id)) + .filter(dsl::released.eq(false)) + .set(WriteObj::from_allocation(allocation, owner_id)) + .execute(conn)?; + + Ok(count == 1) + }) + .await + } + pub async fn get(&self, allocation_id: String, owner_id: NodeId) -> DbResult { readonly_transaction(self.pool, move |conn| { let allocation: Option = dsl::pay_allocation diff --git a/core/payment/src/models/allocation.rs b/core/payment/src/models/allocation.rs index feb0ac0161..77458608bb 100644 --- a/core/payment/src/models/allocation.rs +++ b/core/payment/src/models/allocation.rs @@ -5,7 +5,7 @@ use ya_client_model::payment::{Allocation, NewAllocation}; use ya_client_model::NodeId; use ya_persistence::types::BigDecimalField; -#[derive(Queryable, Debug, Identifiable, Insertable)] +#[derive(Queryable, Debug, Identifiable, Insertable, AsChangeset)] #[table_name = "pay_allocation"] pub struct WriteObj { pub id: String, @@ -56,6 +56,21 @@ impl WriteObj { released: false, } } + + pub fn from_allocation(allocation: Allocation, owner_id: NodeId) -> Self { + Self { + id: allocation.allocation_id, + owner_id, + payment_platform: allocation.payment_platform, + address: allocation.address, + total_amount: allocation.total_amount.into(), + spent_amount: allocation.spent_amount.into(), + remaining_amount: allocation.remaining_amount.into(), + timeout: allocation.timeout.map(|v| v.naive_utc()), + make_deposit: allocation.make_deposit, + released: false, + } + } } impl From for Allocation { diff --git a/exe-unit/Cargo.toml b/exe-unit/Cargo.toml index 78dd11810f..963112064f 100644 --- a/exe-unit/Cargo.toml +++ b/exe-unit/Cargo.toml @@ -15,7 +15,14 @@ path = "src/bin.rs" [features] default = ['compat-deployment'] compat-deployment = [] -sgx = ['graphene-sgx', 'openssl/vendored', 'reqwest/trust-dns', 'secp256k1/rand', 'ya-client-model/sgx', 'ya-core-model/sgx'] +sgx = [ + 'graphene-sgx', + 'openssl/vendored', + 'reqwest/trust-dns', + 'secp256k1/rand', + 'ya-client-model/sgx', + 'ya-core-model/sgx', +] packet-trace-enable = ["ya-packet-trace/enable"] [target.'cfg(target_family = "unix")'.dependencies] @@ -34,12 +41,17 @@ ya-manifest-utils = { version = "0.2" } ya-client-model = "0.5" ya-compile-time-utils = "0.2" ya-core-model = { version = "^0.9", features = ["activity", "appkey"] } -ya-runtime-api = { version = "0.7", path = "runtime-api", features = ["server"] } +ya-runtime-api = { version = "0.7", path = "runtime-api", features = [ + "server", +] } ya-service-bus = "0.6.1" ya-transfer = "0.3" ya-utils-path = "0.1" ya-std-utils = "0.1" -ya-utils-networking = { version = "0.2", default-features = false, features = ["dns", "vpn"]} +ya-utils-networking = { version = "0.2", default-features = false, features = [ + "dns", + "vpn", +] } ya-packet-trace = { git = "https://github.com/golemfactory/ya-packet-trace" } actix = { version = "0.13", default-features = false } @@ -59,10 +71,10 @@ ipnet = "2.3" lazy_static = "1.4.0" log = "0.4" openssl = { version = "0.10", optional = true } -rand = "0.6" +rand = "0.8.5" regex = "1.5" reqwest = { version = "0.11", optional = true } -secp256k1 = { version = "0.19", optional = true } +secp256k1 = { version = "0.27.0", optional = true } serde = { version = "^1.0", features = ["derive"] } serde_json = "1.0" serde_yaml = "0.8" @@ -72,14 +84,23 @@ socket2 = "0.4" structopt = "0.3" thiserror = "1.0" # keep the "rt-multi-thread" feature -tokio = { version = "1", features = ["process", "signal", "time", "net", "rt-multi-thread"] } +tokio = { version = "1", features = [ + "process", + "signal", + "time", + "net", + "rt-multi-thread", +] } tokio-util = { version = "0.7.2", features = ["codec", "net"] } tokio-stream = "0.1.6" url = "2.1" yansi = "0.5.0" [dev-dependencies] -ya-runtime-api = { version = "0.7", path = "runtime-api", features = ["codec", "server"] } +ya-runtime-api = { version = "0.7", path = "runtime-api", features = [ + "codec", + "server", +] } ya-sb-router = "0.6.1" actix-files = "0.6" diff --git a/exe-unit/examples/transfer.rs b/exe-unit/examples/transfer.rs index 4d8b798516..608c25a68d 100644 --- a/exe-unit/examples/transfer.rs +++ b/exe-unit/examples/transfer.rs @@ -35,7 +35,7 @@ fn create_file(path: &Path, name: &str, chunk_size: usize, chunk_count: usize) - for _ in 0..chunk_count { let input: Vec = (0..chunk_size) - .map(|_| rng.gen_range(0, 256) as u8) + .map(|_| rng.gen_range(0..256) as u8) .collect(); hasher.input(&input); diff --git a/exe-unit/examples/transfer_abort.rs b/exe-unit/examples/transfer_abort.rs index f877f82227..d920a3ba1b 100644 --- a/exe-unit/examples/transfer_abort.rs +++ b/exe-unit/examples/transfer_abort.rs @@ -30,7 +30,7 @@ fn create_file(path: &PathBuf) { let mut rng = rand::thread_rng(); let input: Vec = (0..CHUNK_SIZE) - .map(|_| rng.gen_range(0, 256) as u8) + .map(|_| rng.gen_range(0..256) as u8) .collect(); for _ in 0..CHUNK_COUNT { diff --git a/exe-unit/src/crypto.rs b/exe-unit/src/crypto.rs index 245c536ab9..006a4566c7 100644 --- a/exe-unit/src/crypto.rs +++ b/exe-unit/src/crypto.rs @@ -63,7 +63,7 @@ impl Crypto { let ec = Secp256k1::new(); let hash = sha3::Sha3_256::digest(data.as_ref()); let msg = Message::from_slice(hash.as_slice())?; - let sig = ec.sign(&msg, &self.sec_key).serialize_der(); + let sig = ec.sign_ecdsa(&msg, &self.sec_key).serialize_der(); Ok(sig.as_ref().to_vec()) } } From e54216238a56f9e09446ebb18f92d142090ce807 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Mon, 28 Aug 2023 16:23:34 +0200 Subject: [PATCH 017/123] new payment driver integration (#2710) * new payment driver: update deps & remove zksync * new payment driver: initial integration * temporary fix of payment example -- will not work with new driver. TODO: make the new driver work in the example. * cleanup transfer, remove _transfer, remove gasless. * general way to compute chain_id based on config-payments.toml. * remove lots of code made obsolete by the new driver. * introduce signer for signing transactions for erc20_payment_lib * temporarily disable payment fund. --------- Co-authored-by: scx1332 --- Cargo.lock | 2464 +++++++---------- Cargo.toml | 37 +- core/model/src/payment.rs | 3 + core/payment-driver/base/Cargo.toml | 8 +- core/payment-driver/base/src/bus.rs | 10 + core/payment-driver/base/src/db/models.rs | 3 + core/payment-driver/erc20/Cargo.toml | 11 +- core/payment-driver/erc20/src/driver/cli.rs | 8 + core/payment-driver/erc20/src/erc20/config.rs | 14 + .../erc20/src/erc20/ethereum.rs | 6 +- core/payment-driver/erc20/src/lib.rs | 18 +- core/payment-driver/erc20/src/network.rs | 15 +- .../{zksync => erc20next}/Cargo.toml | 30 +- core/payment-driver/erc20next/Readme.md | 163 ++ .../erc20next/config-payments.toml | 82 + .../erc20next/src/contracts/eip712.json | 16 + .../erc20next/src/contracts/faucet.json | 107 + .../erc20next/src/contracts/ierc20.json | 222 ++ .../src/contracts/meta_transaction.json | 53 + .../{zksync => erc20next}/src/dao.rs | 236 +- core/payment-driver/erc20next/src/driver.rs | 294 ++ .../erc20next/src/driver/api.rs | 128 + .../erc20next/src/driver/cli.rs | 46 + .../erc20next/src/erc20/config.rs | 119 + .../erc20next/src/erc20/eth_utils.rs | 121 + .../erc20next/src/erc20/ethereum.rs | 841 ++++++ .../erc20next/src/erc20/faucet.rs | 176 ++ .../payment-driver/erc20next/src/erc20/mod.rs | 12 + .../erc20next/src/erc20/transaction.rs | 19 + .../erc20next/src/erc20/utils.rs | 91 + .../erc20next/src/erc20/wallet.rs | 455 +++ core/payment-driver/erc20next/src/lib.rs | 57 + core/payment-driver/erc20next/src/network.rs | 130 + core/payment-driver/erc20next/src/service.rs | 88 + core/payment-driver/erc20next/src/signer.rs | 174 ++ .../erc20next/view_transactions.sql | 39 + .../payment-driver/zksync/examples/deposit.rs | 41 - .../zksync/examples/simple_balance.rs | 41 - .../zksync/examples/withdrawal.rs | 87 - core/payment-driver/zksync/src/driver.rs | 584 ---- core/payment-driver/zksync/src/lib.rs | 28 - core/payment-driver/zksync/src/network.rs | 80 - core/payment-driver/zksync/src/service.rs | 48 - .../zksync/src/zksync/faucet.rs | 116 - core/payment-driver/zksync/src/zksync/mod.rs | 9 - .../zksync/src/zksync/signer.rs | 168 -- .../payment-driver/zksync/src/zksync/utils.rs | 77 - .../zksync/src/zksync/wallet.rs | 552 ---- core/payment/Cargo.toml | 22 +- core/payment/examples/payment_api.rs | 23 +- core/payment/src/api/allocations.rs | 1 + core/serv/src/main.rs | 12 +- golem_cli/src/command/yagna.rs | 58 +- 53 files changed, 4892 insertions(+), 3351 deletions(-) rename core/payment-driver/{zksync => erc20next}/Cargo.toml (58%) create mode 100644 core/payment-driver/erc20next/Readme.md create mode 100644 core/payment-driver/erc20next/config-payments.toml create mode 100644 core/payment-driver/erc20next/src/contracts/eip712.json create mode 100644 core/payment-driver/erc20next/src/contracts/faucet.json create mode 100644 core/payment-driver/erc20next/src/contracts/ierc20.json create mode 100644 core/payment-driver/erc20next/src/contracts/meta_transaction.json rename core/payment-driver/{zksync => erc20next}/src/dao.rs (51%) create mode 100644 core/payment-driver/erc20next/src/driver.rs create mode 100644 core/payment-driver/erc20next/src/driver/api.rs create mode 100644 core/payment-driver/erc20next/src/driver/cli.rs create mode 100644 core/payment-driver/erc20next/src/erc20/config.rs create mode 100644 core/payment-driver/erc20next/src/erc20/eth_utils.rs create mode 100644 core/payment-driver/erc20next/src/erc20/ethereum.rs create mode 100644 core/payment-driver/erc20next/src/erc20/faucet.rs create mode 100644 core/payment-driver/erc20next/src/erc20/mod.rs create mode 100644 core/payment-driver/erc20next/src/erc20/transaction.rs create mode 100644 core/payment-driver/erc20next/src/erc20/utils.rs create mode 100644 core/payment-driver/erc20next/src/erc20/wallet.rs create mode 100644 core/payment-driver/erc20next/src/lib.rs create mode 100644 core/payment-driver/erc20next/src/network.rs create mode 100644 core/payment-driver/erc20next/src/service.rs create mode 100644 core/payment-driver/erc20next/src/signer.rs create mode 100644 core/payment-driver/erc20next/view_transactions.sql delete mode 100644 core/payment-driver/zksync/examples/deposit.rs delete mode 100644 core/payment-driver/zksync/examples/simple_balance.rs delete mode 100644 core/payment-driver/zksync/examples/withdrawal.rs delete mode 100644 core/payment-driver/zksync/src/driver.rs delete mode 100644 core/payment-driver/zksync/src/lib.rs delete mode 100644 core/payment-driver/zksync/src/network.rs delete mode 100644 core/payment-driver/zksync/src/service.rs delete mode 100644 core/payment-driver/zksync/src/zksync/faucet.rs delete mode 100644 core/payment-driver/zksync/src/zksync/mod.rs delete mode 100644 core/payment-driver/zksync/src/zksync/signer.rs delete mode 100644 core/payment-driver/zksync/src/zksync/utils.rs delete mode 100644 core/payment-driver/zksync/src/zksync/wallet.rs diff --git a/Cargo.lock b/Cargo.lock index 16451b5d83..58092c4cb3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -455,17 +455,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "alga" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f823d037a7ec6ea2197046bafd4ae150e6bc36f9ca347404f46a46823fa84f2" -dependencies = [ - "approx", - "num-complex 0.2.4", - "num-traits", -] - [[package]] name = "all_asserts" version = "2.3.1" @@ -487,6 +476,12 @@ dependencies = [ "alloc-no-stdlib", ] +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + [[package]] name = "android-tzdata" version = "0.1.1" @@ -534,36 +529,12 @@ dependencies = [ "winapi 0.2.8", ] -[[package]] -name = "approx" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f0e60b75072ecd4168020818c0107f2857bb6c4e64252d8d3983f6263b40a5c3" -dependencies = [ - "num-traits", -] - [[package]] name = "arc-swap" version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dabe5a181f83789739c194cbe5a897dde195078fac08568d09221fd6137a7ba8" -[[package]] -name = "arrayref" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" - -[[package]] -name = "arrayvec" -version = "0.4.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd9fd44efafa8690358b7408d253adf110036b88f55672a933f01d616ad9b1b9" -dependencies = [ - "nodrop", -] - [[package]] name = "arrayvec" version = "0.5.2" @@ -588,7 +559,7 @@ version = "0.1.1" source = "git+https://github.com/dequbed/asnom.git#06696cefca408a56431922f95293330ed293dbda" dependencies = [ "byteorder", - "nom", + "nom 2.2.1", ] [[package]] @@ -623,18 +594,6 @@ dependencies = [ "xz2", ] -[[package]] -name = "async-native-tls" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e9e7a929bd34c68a82d58a4de7f86fffdaf97fb2af850162a7bb19dd7269b33" -dependencies = [ - "native-tls", - "thiserror", - "tokio 0.2.25", - "url", -] - [[package]] name = "async-trait" version = "0.1.73" @@ -646,6 +605,15 @@ dependencies = [ "syn 2.0.29", ] +[[package]] +name = "atoi" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28d99ec8bfea296261ca1af174f24225171fea9664ba9003cbebee704810528" +dependencies = [ + "num-traits", +] + [[package]] name = "atomic-shim" version = "0.1.0" @@ -666,15 +634,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "autocfg" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dde43e75fd43e8a1bf86103336bc699aa8d17ad1be60c76c0bdfd4828e19b78" -dependencies = [ - "autocfg 1.1.0", -] - [[package]] name = "autocfg" version = "1.1.0" @@ -766,24 +725,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" [[package]] -name = "bellman_ce" -version = "0.3.2" -source = "git+https://github.com/matter-labs/bellman?branch=beta#416f79d3f93fc855fb96bb61bfe73d2472e95548" -dependencies = [ - "bit-vec", - "blake2s_const", - "blake2s_simd", - "byteorder", - "cfg-if 1.0.0", - "crossbeam", - "futures 0.3.28", - "hex", - "lazy_static", - "num_cpus", - "pairing_ce", - "rand 0.4.6", - "tiny-keccak 1.5.0", -] +name = "base64ct" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c3c1a368f70d6cf7302d78f8f7093da241fb8e8807c05cc9e51a125895a6d5b" [[package]] name = "bigdecimal" @@ -808,12 +753,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - [[package]] name = "bitflags" version = "1.3.2" @@ -825,6 +764,9 @@ name = "bitflags" version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b4682ae6287fcf752ecaabbfcc7b6f9b72aa33933dc23a554d853aea8eea8635" +dependencies = [ + "serde", +] [[package]] name = "bitmaps" @@ -835,69 +777,28 @@ dependencies = [ "typenum", ] -[[package]] -name = "bitvec" -version = "0.17.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41262f11d771fd4a61aa3ce019fca363b4b6c282fca9da2a31186d3965a47a5c" -dependencies = [ - "either", - "radium 0.3.0", -] - [[package]] name = "bitvec" version = "0.20.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7774144344a4faa177370406a7ff5f1da24303817368584c6206c8303eb07848" dependencies = [ - "funty", + "funty 1.1.0", "radium 0.6.2", "tap", - "wyz", -] - -[[package]] -name = "blake2" -version = "0.9.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4e37d16930f5459780f5621038b6382b9bb37c19016f39fb6b5808d831f174" -dependencies = [ - "crypto-mac 0.8.0", - "digest 0.9.0", - "opaque-debug 0.3.0", -] - -[[package]] -name = "blake2-rfc_bellman_edition" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdc60350286c7c3db13b98e91dbe5c8b6830a6821bc20af5b0c310ce94d74915" -dependencies = [ - "arrayvec 0.4.12", - "byteorder", - "constant_time_eq", -] - -[[package]] -name = "blake2s_const" -version = "0.6.0" -source = "git+https://github.com/matter-labs/bellman?branch=beta#416f79d3f93fc855fb96bb61bfe73d2472e95548" -dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "constant_time_eq", + "wyz 0.2.0", ] [[package]] -name = "blake2s_simd" -version = "0.5.11" +name = "bitvec" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e461a7034e85b211a4acb57ee2e6730b32912b06c08cc242243c39fc21ae6a2" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" dependencies = [ - "arrayref", - "arrayvec 0.5.2", - "constant_time_eq", + "funty 2.0.0", + "radium 0.7.0", + "tap", + "wyz 0.5.1", ] [[package]] @@ -956,6 +857,51 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" +[[package]] +name = "borsh" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" +dependencies = [ + "borsh-derive", + "hashbrown 0.12.3", +] + +[[package]] +name = "borsh-derive" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0754613691538d51f329cce9af41d7b7ca150bc973056f1156611489475f54f7" +dependencies = [ + "borsh-derive-internal", + "borsh-schema-derive-internal", + "proc-macro-crate 0.1.5", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "borsh-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afb438156919598d2c7bad7e1c0adf3d26ed3840dbc010db1a882a65583ca2fb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "borsh-schema-derive-internal" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634205cc43f74a1b9046ef87c4540ebda95696ec0f315024860cad7c5b0f5ccd" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "brotli" version = "3.3.4" @@ -984,7 +930,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" dependencies = [ "memchr", - "regex-automata 0.3.6", + "regex-automata", "serde", ] @@ -994,12 +940,6 @@ version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" -[[package]] -name = "byte-slice-cast" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0a5e3906bcbf133e33c1d4d95afc664ad37fbdb9f6568d8043e7ea8c27d93d3" - [[package]] name = "byte-slice-cast" version = "1.2.2" @@ -1022,6 +962,28 @@ dependencies = [ "utf8-width", ] +[[package]] +name = "bytecheck" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b6372023ac861f6e6dc89c8344a8f398fb42aaba2b5dbc649ca0c0e9dbcb627" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7ec4c6f261935ad534c0c22dbef2201b45918860eb1c574b972bd213a76af61" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "byteorder" version = "1.4.3" @@ -1118,7 +1080,6 @@ dependencies = [ "iana-time-zone", "js-sys", "num-traits", - "rustc-serialize", "serde", "time 0.1.45", "wasm-bindgen", @@ -1221,10 +1182,10 @@ dependencies = [ ] [[package]] -name = "constant_time_eq" -version = "0.1.5" +name = "const-oid" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +checksum = "28c122c3980598d243d63d9a704629a2d748d101f278052ff068be5a4423ab6f" [[package]] name = "convert_case" @@ -1268,6 +1229,21 @@ dependencies = [ "libc", ] +[[package]] +name = "crc" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86ec7a15cbe22e59248fc7eadb1907dab5ba09372595da4d73dd805ed4417dfe" +dependencies = [ + "crc-catalog", +] + +[[package]] +name = "crc-catalog" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cace84e55f07e7301bae1c519df89cdad8cc3cd868413d3fdbdeca9ff3db484" + [[package]] name = "crc32fast" version = "1.3.2" @@ -1285,9 +1261,9 @@ checksum = "69323bff1fb41c635347b8ead484a5ca6c3f11914d784170b158d8449ab07f8e" dependencies = [ "cfg-if 0.1.10", "crossbeam-channel 0.4.4", - "crossbeam-deque 0.7.4", - "crossbeam-epoch 0.8.2", - "crossbeam-queue", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue 0.2.3", "crossbeam-utils 0.7.2", ] @@ -1317,29 +1293,18 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c20ff29ded3204c5106278a81a38f4b482636ed4fa1e6cfbeef193291beb29ed" dependencies = [ - "crossbeam-epoch 0.8.2", + "crossbeam-epoch", "crossbeam-utils 0.7.2", "maybe-uninit", ] -[[package]] -name = "crossbeam-deque" -version = "0.8.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" -dependencies = [ - "cfg-if 1.0.0", - "crossbeam-epoch 0.9.15", - "crossbeam-utils 0.8.16", -] - [[package]] name = "crossbeam-epoch" version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" dependencies = [ - "autocfg 1.1.0", + "autocfg", "cfg-if 0.1.10", "crossbeam-utils 0.7.2", "lazy_static", @@ -1348,19 +1313,6 @@ dependencies = [ "scopeguard", ] -[[package]] -name = "crossbeam-epoch" -version = "0.9.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" -dependencies = [ - "autocfg 1.1.0", - "cfg-if 1.0.0", - "crossbeam-utils 0.8.16", - "memoffset 0.9.0", - "scopeguard", -] - [[package]] name = "crossbeam-queue" version = "0.2.3" @@ -1372,13 +1324,23 @@ dependencies = [ "maybe-uninit", ] +[[package]] +name = "crossbeam-queue" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1cfb3ea8a53f37c40dea2c7bedcbd88bdfae54f5e2175d6ecaff1c988353add" +dependencies = [ + "cfg-if 1.0.0", + "crossbeam-utils 0.8.16", +] + [[package]] name = "crossbeam-utils" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" dependencies = [ - "autocfg 1.1.0", + "autocfg", "cfg-if 0.1.10", "lazy_static", ] @@ -1449,16 +1411,6 @@ dependencies = [ "typenum", ] -[[package]] -name = "crypto-mac" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b584a330336237c1eecd3e94266efb216c56ed91225d634cb2991c5f3fd1aeab" -dependencies = [ - "generic-array 0.14.7", - "subtle", -] - [[package]] name = "crypto-mac" version = "0.10.1" @@ -1469,16 +1421,6 @@ dependencies = [ "subtle", ] -[[package]] -name = "crypto-mac" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714" -dependencies = [ - "generic-array 0.14.7", - "subtle", -] - [[package]] name = "csv" version = "1.2.2" @@ -1548,18 +1490,8 @@ version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d706e75d87e35569db781a9b5e2416cff1236a47ed380831f959382ccd5f858" dependencies = [ - "darling_core 0.10.2", - "darling_macro 0.10.2", -] - -[[package]] -name = "darling" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c" -dependencies = [ - "darling_core 0.13.4", - "darling_macro 0.13.4", + "darling_core", + "darling_macro", ] [[package]] @@ -1576,38 +1508,13 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "darling_core" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "859d65a907b6852c9361e3185c862aae7fafd2887876799fa55f5f99dc40d610" -dependencies = [ - "fnv", - "ident_case", - "proc-macro2", - "quote", - "strsim 0.10.0", - "syn 1.0.109", -] - [[package]] name = "darling_macro" version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9b5a2f4ac4969822c62224815d069952656cadc7084fdca9751e6d959189b72" dependencies = [ - "darling_core 0.10.2", - "quote", - "syn 1.0.109", -] - -[[package]] -name = "darling_macro" -version = "0.13.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835" -dependencies = [ - "darling_core 0.13.4", + "darling_core", "quote", "syn 1.0.109", ] @@ -1642,13 +1549,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" [[package]] -name = "debugid" -version = "0.7.3" +name = "der" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6ee87af31d84ef885378aebca32be3d682b0e0dc119d5b4860a2c5bb5046730" +checksum = "fffa369a668c8af7dbf8b5e56c9f744fbd399949ed171606040001947de40b1c" dependencies = [ - "serde", - "uuid 0.8.2", + "const-oid", + "pem-rfc7468", + "zeroize", ] [[package]] @@ -1757,7 +1665,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" dependencies = [ "block-buffer 0.10.4", + "const-oid", "crypto-common", + "subtle", ] [[package]] @@ -1824,6 +1734,12 @@ version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "dotenvy" +version = "0.15.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" + [[package]] name = "dyn-clone" version = "1.0.13" @@ -1836,7 +1752,7 @@ version = "1.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91cff35c70bba8a626e3185d8cd48cc11b5437e1a5bcd15b9b5fa3c64b6dfee7" dependencies = [ - "signature", + "signature 1.6.4", ] [[package]] @@ -1858,6 +1774,9 @@ name = "either" version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +dependencies = [ + "serde", +] [[package]] name = "encode_unicode" @@ -1961,12 +1880,42 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] -name = "errno" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e2b2decb0484e15560df3210cf0d78654bb0864b2c138977c07e377a1bae0e2" +name = "erc20_payment_lib" +version = "0.1.9" dependencies = [ - "kernel32-sys", + "actix-files", + "actix-web", + "async-trait", + "chrono", + "dotenv", + "fastrand", + "futures 0.3.28", + "hex", + "humantime 2.1.0", + "lazy_static", + "log", + "rand 0.8.5", + "rust_decimal", + "rustc-hex", + "secp256k1 0.27.0", + "serde", + "serde_json", + "sha3 0.10.8", + "sqlx", + "structopt", + "tokio 1.32.0", + "toml", + "uuid 1.4.1", + "web3", +] + +[[package]] +name = "errno" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e2b2decb0484e15560df3210cf0d78654bb0864b2c138977c07e377a1bae0e2" +dependencies = [ + "kernel32-sys", "libc", "winapi 0.2.8", ] @@ -2002,46 +1951,58 @@ dependencies = [ "str-buf", ] +[[package]] +name = "etcetera" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "136d1b5283a1ab77bd9257427ffd09d8667ced0570b6f938942bc7568ed5b943" +dependencies = [ + "cfg-if 1.0.0", + "home", + "windows-sys 0.48.0", +] + [[package]] name = "ethabi" -version = "14.1.0" +version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a01317735d563b3bad2d5f90d2e1799f414165408251abb762510f40e790e69a" +checksum = "7413c5f74cc903ea37386a8965a936cbeb334bd270862fdece542c1b2dcbc898" dependencies = [ - "anyhow", - "ethereum-types 0.11.0", + "ethereum-types 0.14.1", "hex", + "once_cell", + "regex", "serde", "serde_json", - "sha3 0.9.1", + "sha3 0.10.8", "thiserror", "uint 0.9.5", ] [[package]] name = "ethbloom" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a621dcebea74f2a6f2002d0a885c81ccf6cbdf86760183316a7722b5707ca4" +checksum = "bfb684ac8fa8f6c5759f788862bb22ec6fe3cb392f6bfd08e3c64b603661e3f8" dependencies = [ "crunchy", - "fixed-hash", + "fixed-hash 0.7.0", "impl-rlp", - "impl-serde", - "tiny-keccak 2.0.2", + "impl-serde 0.3.2", + "tiny-keccak", ] [[package]] name = "ethbloom" -version = "0.11.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfb684ac8fa8f6c5759f788862bb22ec6fe3cb392f6bfd08e3c64b603661e3f8" +checksum = "c22d4b5885b6aa2fe5e8b9329fb8d232bf739e434e6b87347c63bdd00c120f60" dependencies = [ "crunchy", - "fixed-hash", + "fixed-hash 0.8.0", "impl-rlp", - "impl-serde", - "tiny-keccak 2.0.2", + "impl-serde 0.4.0", + "tiny-keccak", ] [[package]] @@ -2056,34 +2017,34 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "tiny-keccak 2.0.2", + "tiny-keccak", ] [[package]] name = "ethereum-types" -version = "0.10.0" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05dc5f0df4915fa6dff7f975a8366ecfaaa8959c74235469495153e7bb1b280e" +checksum = "f64b5df66a228d85e4b17e5d6c6aa43b0310898ffe8a85988c4c032357aaabfd" dependencies = [ - "ethbloom 0.10.0", - "fixed-hash", + "ethbloom 0.11.1", + "fixed-hash 0.7.0", "impl-rlp", - "impl-serde", - "primitive-types 0.8.0", + "impl-serde 0.3.2", + "primitive-types 0.9.1", "uint 0.9.5", ] [[package]] name = "ethereum-types" -version = "0.11.0" +version = "0.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f64b5df66a228d85e4b17e5d6c6aa43b0310898ffe8a85988c4c032357aaabfd" +checksum = "02d215cbf040552efcbe99a38372fe80ab9d00268e20012b79fcd0f073edd8ee" dependencies = [ - "ethbloom 0.11.1", - "fixed-hash", + "ethbloom 0.13.0", + "fixed-hash 0.8.0", "impl-rlp", - "impl-serde", - "primitive-types 0.9.1", + "impl-serde 0.4.0", + "primitive-types 0.12.1", "uint 0.9.5", ] @@ -2101,6 +2062,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + [[package]] name = "fake-simd" version = "0.1.2" @@ -2124,32 +2091,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "ff_ce" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38107cbd8bac0d907d7e7513c9f68c95adbda9e6f6f6bdf3f5111c6ecac4fe47" -dependencies = [ - "byteorder", - "ff_derive_ce", - "hex", - "rand 0.4.6", -] - -[[package]] -name = "ff_derive_ce" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dde5a00073374b4d7aa2d3a8359a5709f9c0bfac8393f254655d16b4acdfe823" -dependencies = [ - "num-bigint 0.4.4", - "num-integer", - "num-traits", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "field-offset" version = "0.3.6" @@ -2184,6 +2125,18 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "fixed-hash" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "835c052cb0c08c1acf6ffd71c022172e18723949c8282f2b9f27efbc51e64534" +dependencies = [ + "byteorder", + "rand 0.8.5", + "rustc-hex", + "static_assertions", +] + [[package]] name = "fixedbitset" version = "0.2.0" @@ -2262,6 +2215,18 @@ dependencies = [ "num-traits", ] +[[package]] +name = "flume" +version = "0.10.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" +dependencies = [ + "futures-core", + "futures-sink", + "pin-project 1.1.3", + "spin 0.9.8", +] + [[package]] name = "fnv" version = "1.0.7" @@ -2292,33 +2257,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "franklin-crypto" -version = "0.0.5" -source = "git+https://github.com/matter-labs/franklin-crypto.git?branch=beta#6e448d23161eacabb9465dc3181b7b15174cda2f" -dependencies = [ - "bellman_ce", - "bit-vec", - "blake2", - "blake2-rfc_bellman_edition", - "blake2s_simd", - "byteorder", - "digest 0.9.0", - "hex", - "hmac 0.11.0", - "itertools 0.9.0", - "num-bigint 0.3.3", - "num-integer", - "num-traits", - "poseidon_hash", - "rand 0.4.6", - "serde", - "serde_derive", - "sha2 0.9.9", - "splitmut", - "tiny-keccak 1.5.0", -] - [[package]] name = "fs2" version = "0.4.3" @@ -2376,6 +2314,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fed34cd105917e91daa4da6b3728c47b068749d6a62c59811f06ed2ac71d9da7" +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futures" version = "0.1.31" @@ -2422,7 +2366,17 @@ dependencies = [ "futures-core", "futures-task", "futures-util", - "num_cpus", +] + +[[package]] +name = "futures-intrusive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d930c203dd0b6ff06e0201a4a2fe9149b43c684fd4420555b26d21b1a02956f" +dependencies = [ + "futures-core", + "lock_api 0.4.10", + "parking_lot 0.12.1", ] [[package]] @@ -2692,7 +2646,7 @@ dependencies = [ "hex", "http", "hyper 0.14.27", - "hyper-tls 0.5.0", + "hyper-tls", "openssl", "serde", "serde_json", @@ -2745,7 +2699,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e91b62f79061a0bc2e046024cb7ba44b08419ed238ecbd9adbd787434b9e8c25" dependencies = [ "ahash 0.3.8", - "autocfg 1.1.0", + "autocfg", ] [[package]] @@ -2753,12 +2707,28 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.6", +] [[package]] name = "hashbrown" version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" +dependencies = [ + "ahash 0.8.3", + "allocator-api2", +] + +[[package]] +name = "hashlink" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "312f66718a2d7789ffef4f4b7b213138ed9f1eb3aa1d0d82fc99f88fb3ffd26f" +dependencies = [ + "hashbrown 0.14.0", +] [[package]] name = "hdrhistogram" @@ -2809,6 +2779,9 @@ name = "heck" version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" +dependencies = [ + "unicode-segmentation", +] [[package]] name = "hermit-abi" @@ -2831,24 +2804,41 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" +[[package]] +name = "hkdf" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791a029f6b9fc27657f6f188ec6e5e43f6911f6f878e0dc5501396e09809d437" +dependencies = [ + "hmac 0.12.1", +] + [[package]] name = "hmac" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" dependencies = [ - "crypto-mac 0.10.1", + "crypto-mac", "digest 0.9.0", ] [[package]] name = "hmac" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" dependencies = [ - "crypto-mac 0.11.1", - "digest 0.9.0", + "digest 0.10.7", +] + +[[package]] +name = "home" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb" +dependencies = [ + "windows-sys 0.48.0", ] [[package]] @@ -2982,34 +2972,17 @@ dependencies = [ ] [[package]] -name = "hyper-proxy" -version = "0.8.0" +name = "hyper-rustls" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93ec5be69758dfc06b9b29efa9d6e9306e387c85eb362c603912eead2ad98c7" +checksum = "8d78e1e73ec14cf7375674f74d7dde185c8206fd9dea6fb6295e8a98098aaa97" dependencies = [ - "bytes 0.5.6", - "futures 0.3.28", + "futures-util", "http", - "hyper 0.13.10", - "hyper-tls 0.4.3", - "native-tls", - "tokio 0.2.25", - "tokio-tls", - "tower-service", - "typed-headers", -] - -[[package]] -name = "hyper-tls" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d979acc56dcb5b8dddba3917601745e877576475aa046df3226eabdecef78eed" -dependencies = [ - "bytes 0.5.6", - "hyper 0.13.10", - "native-tls", - "tokio 0.2.25", - "tokio-tls", + "hyper 0.14.27", + "rustls", + "tokio 1.32.0", + "tokio-rustls", ] [[package]] @@ -3091,20 +3064,20 @@ dependencies = [ [[package]] name = "impl-codec" -version = "0.4.2" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1be51a921b067b0eaca2fad532d9400041561aa922221cc65f95a85641c6bf53" +checksum = "161ebdfec3c8e3b52bf61c4f3550a1eea4f9579d10dc1b936f3171ebdcd6c443" dependencies = [ - "parity-scale-codec 1.3.7", + "parity-scale-codec 2.3.1", ] [[package]] name = "impl-codec" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "161ebdfec3c8e3b52bf61c4f3550a1eea4f9579d10dc1b936f3171ebdcd6c443" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ - "parity-scale-codec 2.3.1", + "parity-scale-codec 3.6.4", ] [[package]] @@ -3125,6 +3098,15 @@ dependencies = [ "serde", ] +[[package]] +name = "impl-serde" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebc88fc67028ae3db0c853baa36269d398d5f45b6982f95549ff5def78c935cd" +dependencies = [ + "serde", +] + [[package]] name = "impl-trait-for-tuples" version = "0.2.2" @@ -3142,7 +3124,7 @@ version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ - "autocfg 1.1.0", + "autocfg", "hashbrown 0.12.3", "serde", ] @@ -3286,35 +3268,9 @@ dependencies = [ [[package]] name = "jsonrpc-core" -version = "14.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0747307121ffb9703afd93afbd0fb4f854c38fb873f2c8b90e0e902f27c7b62" -dependencies = [ - "futures 0.1.31", - "log", - "serde", - "serde_derive", - "serde_json", -] - -[[package]] -name = "jsonrpc-core" -version = "16.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a47c4c3ac843f9a4238943f97620619033dadef4b378cd1e8addd170de396b3" -dependencies = [ - "futures 0.3.28", - "log", - "serde", - "serde_derive", - "serde_json", -] - -[[package]] -name = "jsonrpc-core" -version = "17.1.0" +version = "18.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4467ab6dfa369b69e52bd0692e480c4d117410538526a57a304a0f2250fd95e" +checksum = "14f7f76aef2d054868398427f6c54943cf3d1caa9a7ec7d0c38d69df97a965eb" dependencies = [ "futures 0.3.28", "futures-executor", @@ -3355,6 +3311,9 @@ name = "lazy_static" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin 0.5.2", +] [[package]] name = "lazycell" @@ -3440,7 +3399,7 @@ version = "0.4.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16" dependencies = [ - "autocfg 1.1.0", + "autocfg", "scopeguard", ] @@ -3456,7 +3415,7 @@ version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a42526bb432bcd1b43571d5f163984effa25409a29f1a3242a54d0577d55bcf" dependencies = [ - "darling 0.10.2", + "darling", "proc-macro2", "quote", "syn 1.0.109", @@ -3500,31 +3459,12 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffbee8634e0d45d258acb448e7eaab3fce7a0a467395d4d9f228e3c1f01fb2e4" -[[package]] -name = "matchers" -version = "0.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f099785f7595cc4b4553a174ce30dd7589ef93391ff414dbb67f62392b9e0ce1" -dependencies = [ - "regex-automata 0.1.10", -] - [[package]] name = "matches" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" -[[package]] -name = "mathru" -version = "0.6.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b7584d97fddf282cc3e5cc6fae54e596cfcd708a3b375633294d9db8e8b6d776" -dependencies = [ - "rand 0.7.3", - "serde", -] - [[package]] name = "maybe-uninit" version = "2.0.0" @@ -3552,7 +3492,7 @@ version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" dependencies = [ - "autocfg 1.1.0", + "autocfg", ] [[package]] @@ -3561,7 +3501,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ - "autocfg 1.1.0", + "autocfg", ] [[package]] @@ -3570,7 +3510,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" dependencies = [ - "autocfg 1.1.0", + "autocfg", ] [[package]] @@ -3582,17 +3522,6 @@ dependencies = [ "metrics-core", ] -[[package]] -name = "metrics" -version = "0.13.0-alpha.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f059a62fe88c33ee501116c762d8d1da5a69b8ea33a938ac6918af9b135b56a" -dependencies = [ - "metrics-macros 0.1.0-alpha.5", - "once_cell", - "proc-macro-hack", -] - [[package]] name = "metrics" version = "0.16.0" @@ -3644,12 +3573,11 @@ dependencies = [ [[package]] name = "metrics-macros" -version = "0.1.0-alpha.5" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64523162f5087a5268890e572caedb44c060f37252497fa144f4d91fe517e777" +checksum = "0daa0ab3a0ae956d0e2c1f42511422850e577d36a255357d1a7d08d45ee3a2f1" dependencies = [ "lazy_static", - "proc-macro-hack", "proc-macro2", "quote", "regex", @@ -3658,22 +3586,9 @@ dependencies = [ [[package]] name = "metrics-macros" -version = "0.4.1" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0daa0ab3a0ae956d0e2c1f42511422850e577d36a255357d1a7d08d45ee3a2f1" -dependencies = [ - "lazy_static", - "proc-macro2", - "quote", - "regex", - "syn 1.0.109", -] - -[[package]] -name = "metrics-macros" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49e30813093f757be5cf21e50389a24dc7dbb22c49f23b7e8f51d69b508a5ffa" +checksum = "49e30813093f757be5cf21e50389a24dc7dbb22c49f23b7e8f51d69b508a5ffa" dependencies = [ "proc-macro2", "quote", @@ -3743,7 +3658,7 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "277619f040719a5a23d75724586d5601286e8fa53451cfaaca3b8c627c2c2378" dependencies = [ - "crossbeam-epoch 0.8.2", + "crossbeam-epoch", "serde", ] @@ -3784,6 +3699,12 @@ dependencies = [ "unicase", ] +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.5.4" @@ -3815,7 +3736,7 @@ dependencies = [ "kernel32-sys", "libc", "log", - "miow 0.2.2", + "miow", "net2", "slab", "winapi 0.2.8", @@ -3845,29 +3766,6 @@ dependencies = [ "slab", ] -[[package]] -name = "mio-named-pipes" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0840c1c50fd55e521b247f949c241c9997709f23bd7f023b9762cd561e935656" -dependencies = [ - "log", - "mio 0.6.23", - "miow 0.3.7", - "winapi 0.3.9", -] - -[[package]] -name = "mio-uds" -version = "0.6.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "afcb699eb26d4332647cc848492bbc15eafb26f08d0304550d5aa1f612e066f0" -dependencies = [ - "iovec", - "libc", - "mio 0.6.23", -] - [[package]] name = "miow" version = "0.2.2" @@ -3880,15 +3778,6 @@ dependencies = [ "ws2_32-sys", ] -[[package]] -name = "miow" -version = "0.3.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9f1c5b025cda876f66ef43a113f91ebc9f4ccef34843000e0adf6ebbab84e21" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "multimap" version = "0.8.3" @@ -3998,7 +3887,7 @@ version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f346ff70e7dbfd675fe90590b92d59ef2de15a8779ae305ebcbfd3f0caf59be4" dependencies = [ - "autocfg 1.1.0", + "autocfg", "bitflags 1.3.2", "cfg-if 1.0.0", "libc", @@ -4028,16 +3917,20 @@ dependencies = [ ] [[package]] -name = "nodrop" -version = "0.1.14" +name = "nom" +version = "2.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +checksum = "cf51a729ecf40266a2368ad335a5fdde43471f545a967109cd62146ecf8b66ff" [[package]] name = "nom" -version = "2.2.1" +version = "7.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf51a729ecf40266a2368ad335a5fdde43471f545a967109cd62146ecf8b66ff" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] [[package]] name = "nonzero_ext" @@ -4069,27 +3962,13 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "num" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7a8e9be5e039e2ff869df49155f1c06bd01ade2117ec783e56ab0932b67a8f" -dependencies = [ - "num-bigint 0.3.3", - "num-complex 0.3.1", - "num-integer", - "num-iter", - "num-rational", - "num-traits", -] - [[package]] name = "num-bigint" version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "090c7f9998ee0ff65aa5b723e4009f7b217707f1fb5ea551329cc4d6231fb304" dependencies = [ - "autocfg 1.1.0", + "autocfg", "num-integer", "num-traits", ] @@ -4100,41 +3979,27 @@ version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f6f7833f2cbf2360a6cfd58cd41a53aa7a90bd4c202f5b1c7dd2ed73c57b2c3" dependencies = [ - "autocfg 1.1.0", + "autocfg", "num-integer", "num-traits", "serde", ] [[package]] -name = "num-bigint" -version = "0.4.4" +name = "num-bigint-dig" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" +checksum = "dc84195820f291c7697304f3cbdadd1cb7199c0efc917ff5eafd71225c136151" dependencies = [ - "autocfg 1.1.0", + "byteorder", + "lazy_static", + "libm", "num-integer", + "num-iter", "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6b19411a9719e753aff12e5187b74d60d3dc449ec3f4dc21e3989c3f554bc95" -dependencies = [ - "autocfg 1.1.0", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "747d632c0c558b87dbabbe6a82f3b4ae03720d0646ac5b7b4dae89394be5f2c5" -dependencies = [ - "num-traits", - "serde", + "rand 0.8.5", + "smallvec", + "zeroize", ] [[package]] @@ -4154,7 +4019,7 @@ version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ - "autocfg 1.1.0", + "autocfg", "num-traits", ] @@ -4164,22 +4029,9 @@ version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252" dependencies = [ - "autocfg 1.1.0", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" -dependencies = [ - "autocfg 1.1.0", - "num-bigint 0.3.3", + "autocfg", "num-integer", "num-traits", - "serde", ] [[package]] @@ -4188,7 +4040,7 @@ version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ - "autocfg 1.1.0", + "autocfg", "libm", ] @@ -4217,7 +4069,7 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -4329,18 +4181,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "pairing_ce" -version = "0.24.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e753515675eaaa98071d814bea0148ae8c9d7995fa0531bf222e7857e3f1759" -dependencies = [ - "byteorder", - "cfg-if 1.0.0", - "ff_ce", - "rand 0.4.6", -] - [[package]] name = "parity-crypto" version = "0.8.0" @@ -4351,43 +4191,41 @@ dependencies = [ "aes-ctr", "block-modes", "digest 0.9.0", - "ethereum-types 0.11.0", "hmac 0.10.1", - "lazy_static", "pbkdf2", "ripemd160", - "rustc-hex", "scrypt", - "secp256k1 0.20.3", "sha2 0.9.9", "subtle", - "tiny-keccak 2.0.2", + "tiny-keccak", "zeroize", ] [[package]] name = "parity-scale-codec" -version = "1.3.7" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4b26b16c7687c3075982af47719e481815df30bc544f7a6690763a25ca16e9d" +checksum = "373b1a4c1338d9cd3d1fa53b3a11bdab5ab6bd80a20f7f7becd76953ae2be909" dependencies = [ - "arrayvec 0.5.2", - "bitvec 0.17.4", - "byte-slice-cast 0.3.5", + "arrayvec 0.7.4", + "bitvec 0.20.4", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive 2.3.1", "serde", ] [[package]] name = "parity-scale-codec" -version = "2.3.1" +version = "3.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "373b1a4c1338d9cd3d1fa53b3a11bdab5ab6bd80a20f7f7becd76953ae2be909" +checksum = "dd8e946cc0cc711189c0b0249fb8b599cbeeab9784d83c415719368bb8d4ac64" dependencies = [ "arrayvec 0.7.4", - "bitvec 0.20.4", - "byte-slice-cast 1.2.2", + "bitvec 1.0.1", + "byte-slice-cast", "impl-trait-for-tuples", - "parity-scale-codec-derive", + "parity-scale-codec-derive 3.6.4", "serde", ] @@ -4397,7 +4235,19 @@ version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1557010476e0595c9b568d16dcfb81b93cdeb157612726f5170d31aa707bed27" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a296c3079b5fefbc499e1de58dc26c09b1b9a5952d26694ee89f04a43ebbb3e" +dependencies = [ + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -4494,7 +4344,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3b8c0d71734018084da0c0354193a5edfb81b20d2d57a92c5b154aefc554a4a" dependencies = [ "base64 0.13.1", - "crypto-mac 0.10.1", + "crypto-mac", "hmac 0.10.1", "rand 0.7.3", "rand_core 0.5.1", @@ -4502,6 +4352,15 @@ dependencies = [ "subtle", ] +[[package]] +name = "pem-rfc7468" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88b39c9bfcfc231068454382784bb460aae594343fb030d46e9f50a645418412" +dependencies = [ + "base64ct", +] + [[package]] name = "percent-encoding" version = "2.3.0" @@ -4597,30 +4456,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] -name = "pkg-config" -version = "0.3.27" +name = "pkcs1" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "c8ffb9f10fa047879315e6625af03c164b16962a5368d724ed16323b68ace47f" +dependencies = [ + "der", + "pkcs8", + "spki", +] [[package]] -name = "poseidon_hash" -version = "0.0.1" -source = "git+https://github.com/shamatar/poseidon_hash.git#495ae87ff066d066b140c7d0dff8d929b87d31ee" +name = "pkcs8" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f950b2377845cebe5cf8b5165cb3cc1a5e0fa5cfa3e1f7f55707d8fd82e0a7b7" dependencies = [ - "alga", - "approx", - "blake2-rfc_bellman_edition", - "byteorder", - "mathru", - "num-bigint 0.2.6", - "num-integer", - "num-traits", - "pairing_ce", - "rand 0.4.6", - "sha2 0.8.2", - "tiny-keccak 1.5.0", + "der", + "spki", ] +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + [[package]] name = "ppv-lite86" version = "0.2.17" @@ -4695,30 +4556,39 @@ dependencies = [ [[package]] name = "primitive-types" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3824ae2c5e27160113b9e029a10ec9e3f0237bad8029f69c7724393c9fdefd8" +checksum = "06345ee39fbccfb06ab45f3a1a5798d9dafa04cb8921a76d227040003a234b0e" dependencies = [ - "fixed-hash", - "impl-codec 0.4.2", + "fixed-hash 0.7.0", + "impl-codec 0.5.1", "impl-rlp", - "impl-serde", + "impl-serde 0.3.2", "uint 0.9.5", ] [[package]] name = "primitive-types" -version = "0.9.1" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06345ee39fbccfb06ab45f3a1a5798d9dafa04cb8921a76d227040003a234b0e" +checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" dependencies = [ - "fixed-hash", - "impl-codec 0.5.1", + "fixed-hash 0.8.0", + "impl-codec 0.6.0", "impl-rlp", - "impl-serde", + "impl-serde 0.4.0", "uint 0.9.5", ] +[[package]] +name = "proc-macro-crate" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d6ea3c4595b96363c13943497db34af4460fb474a95c43f4446ad341b8c9785" +dependencies = [ + "toml", +] + [[package]] name = "proc-macro-crate" version = "1.3.1" @@ -4883,6 +4753,26 @@ dependencies = [ "prost 0.10.4", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "quanta" version = "0.3.2" @@ -4942,15 +4832,15 @@ dependencies = [ [[package]] name = "radium" -version = "0.3.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "def50a86306165861203e7f84ecffbbdfdea79f0e51039b33de1e952358c47ac" +checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" [[package]] name = "radium" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "643f8f41a8ebc4c5dc4515c82bb8abd397b527fc20fd681b7c011c2aee5d44fb" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" [[package]] name = "radix_trie" @@ -4985,25 +4875,6 @@ dependencies = [ "winapi 0.3.9", ] -[[package]] -name = "rand" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -dependencies = [ - "autocfg 0.1.8", - "libc", - "rand_chacha 0.1.1", - "rand_core 0.4.2", - "rand_hc 0.1.0", - "rand_isaac", - "rand_jitter", - "rand_os", - "rand_pcg", - "rand_xorshift", - "winapi 0.3.9", -] - [[package]] name = "rand" version = "0.7.3" @@ -5014,7 +4885,7 @@ dependencies = [ "libc", "rand_chacha 0.2.2", "rand_core 0.5.1", - "rand_hc 0.2.0", + "rand_hc", ] [[package]] @@ -5028,16 +4899,6 @@ dependencies = [ "rand_core 0.6.4", ] -[[package]] -name = "rand_chacha" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -dependencies = [ - "autocfg 0.1.8", - "rand_core 0.3.1", -] - [[package]] name = "rand_chacha" version = "0.2.2" @@ -5093,159 +4954,64 @@ dependencies = [ [[package]] name = "rand_hc" -version = "0.1.0" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.3.1", + "rand_core 0.5.1", ] [[package]] -name = "rand_hc" -version = "0.2.0" +name = "rand_xoshiro" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" dependencies = [ - "rand_core 0.5.1", + "rand_core 0.6.4", ] [[package]] -name = "rand_isaac" -version = "0.1.1" +name = "rdrand" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" +checksum = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" dependencies = [ "rand_core 0.3.1", ] [[package]] -name = "rand_jitter" -version = "0.1.4" +name = "redox_syscall" +version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -dependencies = [ - "libc", - "rand_core 0.4.2", - "winapi 0.3.9", -] +checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" [[package]] -name = "rand_os" -version = "0.1.3" +name = "redox_syscall" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" dependencies = [ - "cloudabi", - "fuchsia-cprng", - "libc", - "rand_core 0.4.2", - "rdrand", - "winapi 0.3.9", + "bitflags 1.3.2", ] [[package]] -name = "rand_pcg" -version = "0.1.2" +name = "redox_syscall" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" dependencies = [ - "autocfg 0.1.8", - "rand_core 0.4.2", + "bitflags 1.3.2", ] [[package]] -name = "rand_xorshift" -version = "0.1.1" +name = "redox_users" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" dependencies = [ - "rand_core 0.3.1", -] - -[[package]] -name = "rand_xoshiro" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f97cdb2a36ed4183de61b2f824cc45c9f1037f28afe0a322e9fff4c108b5aaa" -dependencies = [ - "rand_core 0.6.4", -] - -[[package]] -name = "rayon" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" -dependencies = [ - "either", - "rayon-core", -] - -[[package]] -name = "rayon-core" -version = "1.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" -dependencies = [ - "crossbeam-channel 0.5.8", - "crossbeam-deque 0.8.3", - "crossbeam-utils 0.8.16", - "num_cpus", -] - -[[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 = "recursive_aggregation_circuit" -version = "1.0.0" -source = "git+https://github.com/matter-labs/recursive_aggregation_circuit.git?branch=master#63c954be7f755d235965a9e0e668813bfd2330eb" -dependencies = [ - "franklin-crypto", - "hex", - "once_cell", - "sha2 0.9.9", -] - -[[package]] -name = "redox_syscall" -version = "0.1.57" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" - -[[package]] -name = "redox_syscall" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - -[[package]] -name = "redox_users" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" -dependencies = [ - "getrandom 0.2.10", - "redox_syscall 0.2.16", - "thiserror", + "getrandom 0.2.10", + "redox_syscall 0.2.16", + "thiserror", ] [[package]] @@ -5256,17 +5022,8 @@ checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.3.6", - "regex-syntax 0.7.4", -] - -[[package]] -name = "regex-automata" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" -dependencies = [ - "regex-syntax 0.6.29", + "regex-automata", + "regex-syntax", ] [[package]] @@ -5277,15 +5034,9 @@ checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" dependencies = [ "aho-corasick", "memchr", - "regex-syntax 0.7.4", + "regex-syntax", ] -[[package]] -name = "regex-syntax" -version = "0.6.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" - [[package]] name = "regex-syntax" version = "0.7.4" @@ -5302,39 +5053,12 @@ dependencies = [ ] [[package]] -name = "reqwest" -version = "0.10.10" +name = "rend" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0718f81a8e14c4dbb3b34cf23dc6aaf9ab8a0dfec160c534b3dbca1aaa21f47c" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" dependencies = [ - "base64 0.13.1", - "bytes 0.5.6", - "encoding_rs", - "futures-core", - "futures-util", - "http", - "http-body 0.3.1", - "hyper 0.13.10", - "hyper-tls 0.4.3", - "ipnet", - "js-sys", - "lazy_static", - "log", - "mime", - "mime_guess", - "native-tls", - "percent-encoding", - "pin-project-lite 0.2.12", - "serde", - "serde_json", - "serde_urlencoded", - "tokio 0.2.25", - "tokio-tls", - "url", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "winreg 0.7.0", + "bytecheck", ] [[package]] @@ -5352,7 +5076,8 @@ dependencies = [ "http", "http-body 0.4.5", "hyper 0.14.27", - "hyper-tls 0.5.0", + "hyper-rustls", + "hyper-tls", "ipnet", "js-sys", "log", @@ -5361,35 +5086,24 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite 0.2.12", + "rustls", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", "tokio 1.32.0", "tokio-native-tls", + "tokio-rustls", "tower-service", "trust-dns-resolver 0.22.0", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", + "webpki-roots", "winreg 0.10.1", ] -[[package]] -name = "rescue_poseidon" -version = "0.3.0" -source = "git+https://github.com/matter-labs/rescue-poseidon.git?branch=stable#3415de1faa2cfa836f1ac059bf91b19af7c4c620" -dependencies = [ - "byteorder", - "franklin-crypto", - "num-bigint 0.3.3", - "num-integer", - "num-iter", - "num-traits", - "rand 0.4.6", - "sha3 0.9.1", -] - [[package]] name = "resolv-conf" version = "0.7.0" @@ -5400,6 +5114,21 @@ dependencies = [ "quick-error", ] +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin 0.5.2", + "untrusted", + "web-sys", + "winapi 0.3.9", +] + [[package]] name = "ripemd160" version = "0.9.1" @@ -5411,6 +5140,34 @@ dependencies = [ "opaque-debug 0.3.0", ] +[[package]] +name = "rkyv" +version = "0.7.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0200c8230b013893c0b2d6213d6ec64ed2b9be2e0e016682b7224ff82cff5c58" +dependencies = [ + "bitvec 1.0.1", + "bytecheck", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid 1.4.1", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e06b915b5c230a17d7a736d1e2e63ee753c256a8614ef3f5147b13a4f5541d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rlp" version = "0.5.2" @@ -5432,6 +5189,44 @@ dependencies = [ "winapi 0.2.8", ] +[[package]] +name = "rsa" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ab43bb47d23c1a631b4b680199a45255dce26fa9ab2fa902581f624ff13e6a8" +dependencies = [ + "byteorder", + "const-oid", + "digest 0.10.7", + "num-bigint-dig", + "num-integer", + "num-iter", + "num-traits", + "pkcs1", + "pkcs8", + "rand_core 0.6.4", + "signature 2.1.0", + "spki", + "subtle", + "zeroize", +] + +[[package]] +name = "rust_decimal" +version = "1.32.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4c4216490d5a413bc6d10fa4742bd7d4955941d062c0ef873141d6b0e7b30fd" +dependencies = [ + "arrayvec 0.7.4", + "borsh", + "bytes 1.4.0", + "num-traits", + "rand 0.8.5", + "rkyv", + "serde", + "serde_json", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -5444,12 +5239,6 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" -[[package]] -name = "rustc-serialize" -version = "0.3.24" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" - [[package]] name = "rustc_version" version = "0.2.3" @@ -5481,6 +5270,37 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "rustls" +version = "0.21.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" +dependencies = [ + "log", + "ring", + "rustls-webpki", + "sct", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" +dependencies = [ + "base64 0.21.3", +] + +[[package]] +name = "rustls-webpki" +version = "0.101.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "rustversion" version = "1.0.14" @@ -5648,6 +5468,22 @@ dependencies = [ "subtle", ] +[[package]] +name = "sct" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d53dcdb7c9f8158937a7981b48accfd39a43af418591a5d008c7b22b5e1b7ca4" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "secp256k1" version = "0.19.0" @@ -5663,7 +5499,6 @@ version = "0.20.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97d03ceae636d0fed5bae6a7f4f664354c5f4fcedf6eef053fef17e49f837d0a" dependencies = [ - "rand 0.6.5", "secp256k1-sys 0.4.2", ] @@ -5739,7 +5574,7 @@ dependencies = [ "log", "quick-xml", "regex", - "reqwest 0.11.18", + "reqwest", "semver 0.11.0", "serde_json", "tempfile", @@ -5788,86 +5623,6 @@ dependencies = [ "pest", ] -[[package]] -name = "sentry" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "933beb0343c84eefd69a368318e9291b179e09e51982d49c65d7b362b0e9466f" -dependencies = [ - "httpdate 0.3.2", - "reqwest 0.10.10", - "sentry-backtrace", - "sentry-contexts", - "sentry-core", - "sentry-panic", -] - -[[package]] -name = "sentry-backtrace" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e528fb457baf53fcd6c90beb420705f35c12c3d8caed8817dcf7be00eff7c7" -dependencies = [ - "backtrace", - "lazy_static", - "regex", - "sentry-core", -] - -[[package]] -name = "sentry-contexts" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce3a560a34cffac347f0b588fc29b31db969e27bf57208f946d6a2d588668b0b" -dependencies = [ - "hostname", - "lazy_static", - "libc", - "regex", - "rustc_version 0.2.3", - "sentry-core", - "uname", -] - -[[package]] -name = "sentry-core" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b8c235063c1007fd8e2fc7e35ce7eac09dd678d198ecc996daee33d46b3dcc" -dependencies = [ - "im", - "lazy_static", - "rand 0.7.3", - "sentry-types", - "serde", - "serde_json", -] - -[[package]] -name = "sentry-panic" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04ee338d8292fcdcfb032929c9f53bc0dfac8e0b9d3096be79ceee96818851ed" -dependencies = [ - "sentry-backtrace", - "sentry-core", -] - -[[package]] -name = "sentry-types" -version = "0.21.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fbbea6debac0a24880a38239d4c2fc3dbb0b1b398f621bea03ed761796b7dfb" -dependencies = [ - "chrono", - "debugid", - "serde", - "serde_json", - "thiserror", - "url", - "uuid 0.8.2", -] - [[package]] name = "serde" version = "1.0.183" @@ -5953,28 +5708,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_with" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "678b5a069e50bf00ecd22d0cd8ddf7c236f68581b03db652061ed5eb13a312ff" -dependencies = [ - "serde", - "serde_with_macros", -] - -[[package]] -name = "serde_with_macros" -version = "1.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e182d6ec6f05393cc0e5ed1bf81ad6db3a8feedf8ee515ecdd369809bcce8082" -dependencies = [ - "darling 0.13.4", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "serde_yaml" version = "0.8.26" @@ -6191,15 +5924,6 @@ dependencies = [ "keccak", ] -[[package]] -name = "sharded-slab" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" -dependencies = [ - "lazy_static", -] - [[package]] name = "shared_child" version = "0.3.5" @@ -6274,6 +5998,22 @@ version = "1.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74233d3b3b2f6d4b006dc19dee745e73e2a6bfb6f93607cd3b02bd5b00797d7c" +[[package]] +name = "signature" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e1788eed21689f9cf370582dfc467ef36ed9c707f073528ddafa8d83e3b8500" +dependencies = [ + "digest 0.10.7", + "rand_core 0.6.4", +] + +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + [[package]] name = "sized-chunks" version = "0.6.5" @@ -6290,7 +6030,7 @@ version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" dependencies = [ - "autocfg 1.1.0", + "autocfg", ] [[package]] @@ -6306,60 +6046,289 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec62a949bda7f15800481a711909f946e1204f2460f89210eaf7f57730f88f86" dependencies = [ "thiserror", - "unicode_categories", + "unicode_categories", +] + +[[package]] +name = "socket2" +version = "0.3.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi 0.3.9", +] + +[[package]] +name = "socket2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +dependencies = [ + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "soketto" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" +dependencies = [ + "base64 0.13.1", + "bytes 1.4.0", + "futures 0.3.28", + "httparse", + "log", + "rand 0.8.5", + "sha-1", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api 0.4.10", +] + +[[package]] +name = "spki" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d1e996ef02c474957d681f1b05213dfb0abab947b446a62d37770b23500184a" +dependencies = [ + "base64ct", + "der", +] + +[[package]] +name = "sqlformat" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e" +dependencies = [ + "itertools 0.10.5", + "nom 7.1.3", + "unicode_categories", +] + +[[package]] +name = "sqlx" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e58421b6bc416714d5115a2ca953718f6c621a51b68e4f4922aea5a4391a721" +dependencies = [ + "sqlx-core", + "sqlx-macros", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", +] + +[[package]] +name = "sqlx-core" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd4cef4251aabbae751a3710927945901ee1d97ee96d757f6880ebb9a79bfd53" +dependencies = [ + "ahash 0.8.3", + "atoi", + "byteorder", + "bytes 1.4.0", + "chrono", + "crc", + "crossbeam-queue 0.3.8", + "dotenvy", + "either", + "event-listener", + "futures-channel", + "futures-core", + "futures-intrusive", + "futures-io", + "futures-util", + "hashlink", + "hex", + "indexmap 2.0.0", + "log", + "memchr", + "once_cell", + "paste", + "percent-encoding", + "serde", + "serde_json", + "sha2 0.10.7", + "smallvec", + "sqlformat", + "thiserror", + "tokio 1.32.0", + "tokio-stream", + "tracing", + "url", ] [[package]] -name = "socket2" -version = "0.3.19" +name = "sqlx-macros" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "122e570113d28d773067fab24266b66753f6ea915758651696b6e35e49f88d6e" +checksum = "208e3165167afd7f3881b16c1ef3f2af69fa75980897aac8874a0696516d12c2" dependencies = [ - "cfg-if 1.0.0", - "libc", - "winapi 0.3.9", + "proc-macro2", + "quote", + "sqlx-core", + "sqlx-macros-core", + "syn 1.0.109", ] [[package]] -name = "socket2" -version = "0.4.9" +name = "sqlx-macros-core" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "8a4a8336d278c62231d87f24e8a7a74898156e34c1c18942857be2acb29c7dfc" dependencies = [ - "libc", - "winapi 0.3.9", + "dotenvy", + "either", + "heck 0.4.1", + "hex", + "once_cell", + "proc-macro2", + "quote", + "serde", + "serde_json", + "sha2 0.10.7", + "sqlx-core", + "sqlx-mysql", + "sqlx-postgres", + "sqlx-sqlite", + "syn 1.0.109", + "tempfile", + "tokio 1.32.0", + "url", ] [[package]] -name = "socket2" -version = "0.5.3" +name = "sqlx-mysql" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +checksum = "8ca69bf415b93b60b80dc8fda3cb4ef52b2336614d8da2de5456cc942a110482" dependencies = [ - "libc", - "windows-sys 0.48.0", + "atoi", + "base64 0.21.3", + "bitflags 2.4.0", + "byteorder", + "bytes 1.4.0", + "chrono", + "crc", + "digest 0.10.7", + "dotenvy", + "either", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "generic-array 0.14.7", + "hex", + "hkdf", + "hmac 0.12.1", + "itoa 1.0.9", + "log", + "md-5", + "memchr", + "once_cell", + "percent-encoding", + "rand 0.8.5", + "rsa", + "serde", + "sha1", + "sha2 0.10.7", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", ] [[package]] -name = "soketto" -version = "0.4.2" +name = "sqlx-postgres" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5c71ed3d54db0a699f4948e1bb3e45b450fa31fe602621dee6680361d569c88" +checksum = "a0db2df1b8731c3651e204629dd55e52adbae0462fa1bdcbed56a2302c18181e" dependencies = [ - "base64 0.12.3", - "bytes 0.5.6", - "futures 0.3.28", - "httparse", + "atoi", + "base64 0.21.3", + "bitflags 2.4.0", + "byteorder", + "chrono", + "crc", + "dotenvy", + "etcetera", + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "hex", + "hkdf", + "hmac 0.12.1", + "home", + "itoa 1.0.9", "log", - "rand 0.7.3", - "sha-1", + "md-5", + "memchr", + "once_cell", + "rand 0.8.5", + "serde", + "serde_json", + "sha1", + "sha2 0.10.7", + "smallvec", + "sqlx-core", + "stringprep", + "thiserror", + "tracing", + "whoami", ] [[package]] -name = "splitmut" -version = "0.2.1" +name = "sqlx-sqlite" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c85070f382340e8b23a75808e83573ddf65f9ad9143df9573ca37c1ed2ee956a" +checksum = "be4c21bf34c7cae5b283efb3ac1bcc7670df7561124dc2f8bdc0b59be40f79a2" +dependencies = [ + "atoi", + "chrono", + "flume", + "futures-channel", + "futures-core", + "futures-executor", + "futures-intrusive", + "futures-util", + "libsqlite3-sys", + "log", + "percent-encoding", + "serde", + "sqlx-core", + "tracing", + "url", +] [[package]] name = "static_assertions" @@ -6373,6 +6342,16 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" +[[package]] +name = "stringprep" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3737bde7edce97102e0e2b15365bf7a20bfdb5f60f4f9e8d7004258a51a8da" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + [[package]] name = "strip-ansi-escapes" version = "0.1.1" @@ -6394,12 +6373,6 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" -[[package]] -name = "strsim" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" - [[package]] name = "structopt" version = "0.3.26" @@ -6667,16 +6640,6 @@ dependencies = [ "syn 2.0.29", ] -[[package]] -name = "thread_local" -version = "1.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" -dependencies = [ - "cfg-if 1.0.0", - "once_cell", -] - [[package]] name = "time" version = "0.1.45" @@ -6706,15 +6669,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792" -[[package]] -name = "tiny-keccak" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d8a021c69bb74a44ccedb824a046447e2c84a01df9e5c20779750acb38e11b2" -dependencies = [ - "crunchy", -] - [[package]] name = "tiny-keccak" version = "2.0.2" @@ -6750,17 +6704,10 @@ dependencies = [ "futures-core", "iovec", "lazy_static", - "libc", "memchr", "mio 0.6.23", - "mio-named-pipes", - "mio-uds", - "num_cpus", "pin-project-lite 0.1.12", - "signal-hook-registry", "slab", - "tokio-macros 0.2.6", - "winapi 0.3.9", ] [[package]] @@ -6778,7 +6725,7 @@ dependencies = [ "pin-project-lite 0.2.12", "signal-hook-registry", "socket2 0.5.3", - "tokio-macros 2.1.0", + "tokio-macros", "windows-sys 0.48.0", ] @@ -6792,31 +6739,6 @@ dependencies = [ "tokio 1.32.0", ] -[[package]] -name = "tokio-compat-02" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7d4237822b7be8fff0a7a27927462fad435dcb6650f95cea9e946bf6bdc7e07" -dependencies = [ - "bytes 0.5.6", - "once_cell", - "pin-project-lite 0.2.12", - "tokio 0.2.25", - "tokio 1.32.0", - "tokio-stream", -] - -[[package]] -name = "tokio-macros" -version = "0.2.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e44da00bfc73a25f814cd8d7e57a68a5c31b74b3152a0a1d1f590c97ed06265a" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "tokio-macros" version = "2.1.0" @@ -6859,6 +6781,16 @@ dependencies = [ "tokio 1.32.0", ] +[[package]] +name = "tokio-rustls" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" +dependencies = [ + "rustls", + "tokio 1.32.0", +] + [[package]] name = "tokio-stream" version = "0.1.14" @@ -6886,16 +6818,6 @@ dependencies = [ "xattr", ] -[[package]] -name = "tokio-tls" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a70f4fcd7b3b24fb194f837560168208f669ca8cb70d0c4b862944452396343" -dependencies = [ - "native-tls", - "tokio 0.2.25", -] - [[package]] name = "tokio-util" version = "0.3.1" @@ -6910,21 +6832,6 @@ dependencies = [ "tokio 0.2.25", ] -[[package]] -name = "tokio-util" -version = "0.6.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36943ee01a6d67977dd3f84a5a1d2efeb4ada3a1ae771cadfaa535d9d9fc6507" -dependencies = [ - "bytes 1.4.0", - "futures-core", - "futures-io", - "futures-sink", - "log", - "pin-project-lite 0.2.12", - "tokio 1.32.0", -] - [[package]] name = "tokio-util" version = "0.7.8" @@ -6933,7 +6840,10 @@ checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ "bytes 1.4.0", "futures-core", + "futures-io", "futures-sink", + "futures-util", + "hashbrown 0.12.3", "pin-project-lite 0.2.12", "tokio 1.32.0", "tracing", @@ -7002,7 +6912,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0955b8137a1df6f1a2e9a37d8a6656291ff0297c1a97c24e0d8425fe2312f79a" dependencies = [ "once_cell", - "valuable", ] [[package]] @@ -7015,49 +6924,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "tracing-log" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922" -dependencies = [ - "lazy_static", - "log", - "tracing-core", -] - -[[package]] -name = "tracing-serde" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc6b213177105856957181934e4920de57730fc69bf42c37ee5bb664d406d9e1" -dependencies = [ - "serde", - "tracing-core", -] - -[[package]] -name = "tracing-subscriber" -version = "0.2.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e0d2eaa99c3c2e41547cfa109e910a68ea03823cccad4a0525dcbc9b01e8c71" -dependencies = [ - "ansi_term", - "chrono", - "lazy_static", - "matchers", - "regex", - "serde", - "serde_json", - "sharded-slab", - "smallvec", - "thread_local", - "tracing", - "tracing-core", - "tracing-log", - "tracing-serde", -] - [[package]] name = "trust-dns-proto" version = "0.21.2" @@ -7155,19 +7021,6 @@ version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" -[[package]] -name = "typed-headers" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3179a61e9eccceead5f1574fd173cf2e162ac42638b9bf214c6ad0baf7efa24a" -dependencies = [ - "base64 0.11.0", - "bytes 0.5.6", - "chrono", - "http", - "mime", -] - [[package]] name = "typenum" version = "1.16.0" @@ -7203,15 +7056,6 @@ dependencies = [ "static_assertions", ] -[[package]] -name = "uname" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b72f89f0ca32e4db1c04e2a72f5345d59796d4866a1ee0609084569f73683dc8" -dependencies = [ - "libc", -] - [[package]] name = "unicase" version = "2.6.0" @@ -7266,6 +7110,12 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f28467d3e1d3c6586d8f25fa243f544f5800fec42d97032474e17222c2b75cfa" +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + [[package]] name = "url" version = "2.4.0" @@ -7307,13 +7157,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79daa5ed5740825c40b389c5e50312b9c86df53fccd33f281df655642b43869d" dependencies = [ "getrandom 0.2.10", -] - -[[package]] -name = "valuable" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + "serde", +] [[package]] name = "vcpkg" @@ -7335,7 +7180,7 @@ checksum = "e7141e445af09c8919f1d5f8a20dae0b20c3b57a45dee0d5823c6ed5d237f15a" dependencies = [ "bitflags 1.3.2", "chrono", - "rustc_version 0.4.0", + "rustc_version 0.2.3", ] [[package]] @@ -7344,16 +7189,6 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" -[[package]] -name = "vlog" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "sentry", - "tracing", - "tracing-subscriber", -] - [[package]] name = "vte" version = "0.10.1" @@ -7428,8 +7263,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7706a72ab36d8cb1f80ffbf0e071533974a60d0a308d01a5d0375bf60499a342" dependencies = [ "cfg-if 1.0.0", - "serde", - "serde_json", "wasm-bindgen-macro", ] @@ -7501,67 +7334,35 @@ dependencies = [ [[package]] name = "web3" -version = "0.15.0" -source = "git+https://github.com/golemfactory/rust-web3?branch=update_ethabi#fe462bde01957d8161a144e9fc3e38cf1949eabc" -dependencies = [ - "arrayvec 0.5.2", - "async-native-tls", - "base64 0.13.1", - "derive_more", - "ethabi", - "ethereum-types 0.11.0", - "futures 0.3.28", - "futures-timer", - "hex", - "hyper 0.13.10", - "hyper-proxy", - "hyper-tls 0.4.3", - "jsonrpc-core 16.0.0", - "log", - "native-tls", - "parking_lot 0.11.2", - "pin-project 1.1.3", - "rlp", - "secp256k1 0.20.3", - "serde", - "serde_json", - "soketto", - "tiny-keccak 2.0.2", - "tokio 0.2.25", - "tokio-util 0.6.10", - "typed-headers", - "url", -] - -[[package]] -name = "web3" -version = "0.16.0" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc4c18ae15621f764fab919f7e4a83d87163494cbc3460884debef7c6bc1bc6b" +checksum = "5388522c899d1e1c96a4c307e3797e0f697ba7c77dd8e0e625ecba9dd0342937" dependencies = [ - "arrayvec 0.5.2", - "base64 0.13.1", + "arrayvec 0.7.4", + "base64 0.21.3", "bytes 1.4.0", "derive_more", "ethabi", - "ethereum-types 0.11.0", + "ethereum-types 0.14.1", "futures 0.3.28", "futures-timer", "headers", "hex", - "jsonrpc-core 17.1.0", + "idna 0.4.0", + "jsonrpc-core", "log", - "parking_lot 0.11.2", + "once_cell", + "parking_lot 0.12.1", "pin-project 1.1.3", - "reqwest 0.11.18", + "reqwest", "rlp", - "secp256k1 0.20.3", + "secp256k1 0.27.0", "serde", "serde_json", "soketto", - "tiny-keccak 2.0.2", + "tiny-keccak", "tokio 1.32.0", - "tokio-util 0.6.10", + "tokio-util 0.7.8", "url", "web3-async-native-tls", ] @@ -7578,6 +7379,25 @@ dependencies = [ "url", ] +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + +[[package]] +name = "webpki-roots" +version = "0.22.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +dependencies = [ + "webpki", +] + [[package]] name = "which" version = "4.4.0" @@ -7589,6 +7409,12 @@ dependencies = [ "once_cell", ] +[[package]] +name = "whoami" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22fc3756b8a9133049b26c7f61ab35416c130e8c09b660f5b3958b446f52cc50" + [[package]] name = "widestring" version = "1.0.2" @@ -7788,15 +7614,6 @@ dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0120db82e8a1e0b9fb3345a539c478767c0048d842860994d96113d5b667bd69" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "winreg" version = "0.10.1" @@ -7832,6 +7649,15 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85e60b0d1b5f99db2556934e21937020776a5d31520bf169e851ac44e6420214" +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "xattr" version = "1.0.1" @@ -8038,9 +7864,52 @@ dependencies = [ "derive_more", "dotenv", "env_logger 0.7.1", + "erc20_payment_lib", "ethabi", "ethereum-tx-sign", - "ethereum-types 0.11.0", + "ethereum-types 0.14.1", + "futures 0.3.28", + "hex", + "lazy_static", + "log", + "maplit", + "num-bigint 0.3.3", + "num-traits", + "rlp", + "serde", + "serde_json", + "sha3 0.8.2", + "structopt", + "thiserror", + "tiny-keccak", + "tokio 1.32.0", + "uuid 0.8.2", + "web3", + "ya-client-model", + "ya-payment-driver", + "ya-service-api-interfaces", + "ya-utils-futures", + "ya-utils-networking", +] + +[[package]] +name = "ya-erc20next-driver" +version = "0.4.0" +dependencies = [ + "actix-rt", + "anyhow", + "async-trait", + "awc", + "bigdecimal 0.2.2", + "chrono", + "derive_more", + "dotenv", + "env_logger 0.7.1", + "erc20_payment_lib", + "ethabi", + "ethereum-tx-sign", + "ethereum-types 0.14.1", + "ethsign", "futures 0.3.28", "hex", "lazy_static", @@ -8054,10 +7923,11 @@ dependencies = [ "sha3 0.8.2", "structopt", "thiserror", - "tiny-keccak 2.0.2", + "tiny-keccak", "tokio 1.32.0", + "tokio-util 0.7.8", "uuid 0.8.2", - "web3 0.16.0", + "web3", "ya-client-model", "ya-payment-driver", "ya-service-api-interfaces", @@ -8093,7 +7963,7 @@ dependencies = [ "openssl", "rand 0.8.5", "regex", - "reqwest 0.11.18", + "reqwest", "rustyline 7.1.0", "secp256k1 0.27.0", "serde", @@ -8343,7 +8213,7 @@ dependencies = [ "chrono", "env_logger 0.7.1", "log", - "nom", + "nom 2.2.1", "regex", "semver 0.11.0", "serde_json", @@ -8451,6 +8321,7 @@ dependencies = [ "diesel_migrations", "dotenv", "env_logger 0.7.1", + "erc20_payment_lib", "ethsign", "futures 0.3.28", "hex", @@ -8475,6 +8346,7 @@ dependencies = [ "ya-core-model", "ya-dummy-driver", "ya-erc20-driver", + "ya-erc20next-driver", "ya-metrics", "ya-net", "ya-persistence", @@ -8483,7 +8355,6 @@ dependencies = [ "ya-service-api-interfaces", "ya-service-api-web", "ya-service-bus", - "ya-zksync-driver", ] [[package]] @@ -8497,7 +8368,7 @@ dependencies = [ "chrono", "diesel", "diesel_migrations", - "ethereum-types 0.11.0", + "ethereum-types 0.14.1", "ethsign", "futures 0.3.28", "hex", @@ -9117,43 +8988,6 @@ dependencies = [ "ya-utils-networking", ] -[[package]] -name = "ya-zksync-driver" -version = "0.3.0" -dependencies = [ - "actix-rt", - "anyhow", - "async-trait", - "awc", - "bigdecimal 0.2.2", - "chrono", - "dotenv", - "env_logger 0.7.1", - "ethereum-types 0.10.0", - "futures 0.3.28", - "hex", - "lazy_static", - "log", - "maplit", - "metrics-macros 0.1.0-alpha.5", - "num-bigint 0.3.3", - "rlp", - "serde", - "serde_json", - "structopt", - "tiny-keccak 1.5.0", - "tokio 1.32.0", - "tokio-compat-02", - "uuid 0.8.2", - "ya-client-model", - "ya-payment-driver", - "ya-service-api-interfaces", - "ya-utils-futures", - "ya-utils-networking", - "zksync", - "zksync_eth_signer", -] - [[package]] name = "yagna" version = "0.12.2" @@ -9168,6 +9002,7 @@ dependencies = [ "futures 0.3.28", "gftp", "lazy_static", + "libsqlite3-sys", "log", "metrics 0.12.1", "openssl", @@ -9186,6 +9021,7 @@ dependencies = [ "ya-core-model", "ya-dummy-driver", "ya-erc20-driver", + "ya-erc20next-driver", "ya-fd-metrics", "ya-file-logging", "ya-gsb-api", @@ -9211,7 +9047,6 @@ dependencies = [ "ya-utils-process", "ya-version", "ya-vpn", - "ya-zksync-driver", ] [[package]] @@ -9265,165 +9100,6 @@ dependencies = [ "tokio-byteorder", ] -[[package]] -name = "zksync" -version = "0.3.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "async-trait", - "ethabi", - "jsonrpc-core 14.2.0", - "num", - "reqwest 0.10.10", - "serde", - "serde_json", - "sha2 0.8.2", - "thiserror", - "tokio 0.2.25", - "web3 0.15.0", - "zksync_config", - "zksync_crypto", - "zksync_eth_client", - "zksync_eth_signer", - "zksync_types", - "zksync_utils", -] - -[[package]] -name = "zksync_basic_types" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "serde", - "web3 0.15.0", -] - -[[package]] -name = "zksync_config" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "chrono", - "envy", - "num", - "reqwest 0.10.10", - "serde", - "serde_json", - "toml", - "tracing", - "url", - "zksync_crypto", - "zksync_types", - "zksync_utils", -] - -[[package]] -name = "zksync_contracts" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "ethabi", - "serde_json", -] - -[[package]] -name = "zksync_crypto" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "base64 0.13.1", - "ethabi", - "fnv", - "franklin-crypto", - "hex", - "lazy_static", - "num", - "rand 0.4.6", - "rayon", - "recursive_aggregation_circuit", - "rescue_poseidon", - "serde", - "thiserror", - "zksync_basic_types", -] - -[[package]] -name = "zksync_eth_client" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "anyhow", - "ethabi", - "hex", - "metrics 0.13.0-alpha.8", - "parity-crypto", - "serde", - "tokio 0.2.25", - "vlog", - "web3 0.15.0", - "zksync_config", - "zksync_contracts", - "zksync_eth_signer", - "zksync_types", -] - -[[package]] -name = "zksync_eth_signer" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "async-trait", - "hex", - "jsonrpc-core 14.2.0", - "parity-crypto", - "reqwest 0.10.10", - "rlp", - "serde", - "serde_derive", - "serde_json", - "thiserror", - "zksync_types", -] - -[[package]] -name = "zksync_types" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "bigdecimal 0.2.2", - "chrono", - "ethabi", - "hex", - "itertools 0.9.0", - "num", - "once_cell", - "parity-crypto", - "serde", - "serde_json", - "serde_with", - "thiserror", - "tiny-keccak 1.5.0", - "vlog", - "zksync_basic_types", - "zksync_crypto", - "zksync_utils", -] - -[[package]] -name = "zksync_utils" -version = "1.0.0" -source = "git+https://github.com/matter-labs/zksync?rev=0e28e238f71b3be128e4a760b0147e7c62d8dee5#0e28e238f71b3be128e4a760b0147e7c62d8dee5" -dependencies = [ - "anyhow", - "bigdecimal 0.2.2", - "futures 0.3.28", - "hex", - "num", - "serde", - "serde_json", - "tokio 0.2.25", -] - [[package]] name = "zstd" version = "0.12.4" diff --git a/Cargo.toml b/Cargo.toml index 611d267248..b45c2c542e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -10,11 +10,11 @@ license = "GPL-3.0" edition = "2018" [features] -default = ['erc20-driver', 'zksync-driver', 'gftp/bin'] +default = ['erc20-driver', 'erc20next-driver', 'gftp/bin'] static-openssl = ["openssl/vendored", "openssl-probe"] dummy-driver = ['ya-dummy-driver'] erc20-driver = ['ya-erc20-driver'] -zksync-driver = ['ya-zksync-driver'] +erc20next-driver = ['ya-erc20next-driver'] tos = [] framework-test = [] # Temporary to make goth integration tests work @@ -23,13 +23,21 @@ packet-trace-enable = [ "ya-vpn/packet-trace-enable", "ya-file-logging/packet-trace-enable", "ya-net/packet-trace-enable", - "ya-service-bus/packet-trace-enable" + "ya-service-bus/packet-trace-enable", ] [[bin]] name = "yagna" path = "core/serv/src/main.rs" +[workspace.dependencies] +# this entry is needed to make sqlx version >=0.5.9 work with diesel 1.4.* +# diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 +# sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible +libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } +erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } +#erc20_payment_lib = { version = "=0.1.9" } + [dependencies] ya-activity = "0.4" ya-compile-time-utils = "0.2" @@ -38,7 +46,7 @@ ya-dummy-driver = { version = "0.3", optional = true } ya-file-logging = "0.1" ya-gsb-api = "0.1" ya-erc20-driver = { version = "0.4", optional = true } -ya-zksync-driver = { version = "0.3", optional = true } +ya-erc20next-driver = { version = "0.4", optional = true } ya-identity = "0.3" ya-market = "0.4" ya-metrics = "0.2" @@ -86,6 +94,8 @@ tokio = { version = "1", features = ["net"] } tokio-util = { version = "0.7", features = ["codec"] } tokio-stream = { version = "0.1.8", features = ["io-util"] } url = "2.1.1" +libsqlite3-sys = { workspace = true } + [dev-dependencies] ya-test-framework = "0.1" @@ -167,8 +177,6 @@ assets = [ "644", ], ] -[workspace.dependencies] -libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } [workspace] members = [ @@ -185,7 +193,7 @@ members = [ "core/payment-driver/base", "core/payment-driver/dummy", "core/payment-driver/erc20", - "core/payment-driver/zksync", + "core/payment-driver/erc20next", "core/persistence", "core/serv-api", "core/serv-api/derive", @@ -216,7 +224,7 @@ members = [ "utils/fd-metrics", "core/metrics", "test-utils/test-framework", - "test-utils/test-framework/framework-macro" + "test-utils/test-framework/framework-macro", ] [patch.crates-io] @@ -231,7 +239,7 @@ ya-payment = { path = "core/payment" } ya-payment-driver = { path = "core/payment-driver/base" } ya-dummy-driver = { path = "core/payment-driver/dummy" } ya-erc20-driver = { path = "core/payment-driver/erc20" } -ya-zksync-driver = { path = "core/payment-driver/zksync" } +ya-erc20next-driver = { path = "core/payment-driver/erc20next" } ya-version = { path = "core/version" } ya-vpn = { path = "core/vpn" } ya-gsb-api = { path = "core/gsb-api" } @@ -245,10 +253,10 @@ ya-service-api-interfaces = { path = "core/serv-api/interfaces" } ya-service-api-web = { path = "core/serv-api/web" } ## SERVICE BUS -ya-service-bus = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = "190f0d772f7ed0830d54a2cef77d7a177f276c68"} -ya-sb-proto = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = "190f0d772f7ed0830d54a2cef77d7a177f276c68"} -ya-sb-router = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = "190f0d772f7ed0830d54a2cef77d7a177f276c68"} -ya-sb-util = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = "190f0d772f7ed0830d54a2cef77d7a177f276c68"} +ya-service-bus = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = "190f0d772f7ed0830d54a2cef77d7a177f276c68" } +ya-sb-proto = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = "190f0d772f7ed0830d54a2cef77d7a177f276c68" } +ya-sb-router = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = "190f0d772f7ed0830d54a2cef77d7a177f276c68" } +ya-sb-util = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = "190f0d772f7ed0830d54a2cef77d7a177f276c68" } #ya-service-bus = { path = "../ya-service-bus" } #ya-sb-proto = { path = "../ya-service-bus/crates/proto" } @@ -290,9 +298,8 @@ ya-framework-macro = { path = "test-utils/test-framework/framework-macro" } ethereum-tx-sign = { git = "https://github.com/mfranciszkiewicz/ethereum-tx-sign.git", rev = "1164c74187a9e2947faeaea7dde104c3cdec4195" } graphene-sgx = { git = " https://github.com/golemfactory/graphene-rust.git", rev = "dbd993ebad7f9190410ea390a589348479af6407" } -web3 = { git = "https://github.com/golemfactory/rust-web3", branch = "update_ethabi" } -diesel = { git = "https://github.com/golemfactory/yagna-diesel-patch.git", rev = "a512c66d520a9066dd9a4d1416f9109019b39563"} +diesel = { git = "https://github.com/golemfactory/yagna-diesel-patch.git", rev = "a512c66d520a9066dd9a4d1416f9109019b39563" } # Speed up builds on macOS (will be default in next rust version probably) # https://jakedeichert.com/blog/reducing-rust-incremental-compilation-times-on-macos-by-70-percent/ diff --git a/core/model/src/payment.rs b/core/model/src/payment.rs index 0e6bc7f45b..6f5266c857 100644 --- a/core/model/src/payment.rs +++ b/core/model/src/payment.rs @@ -458,6 +458,8 @@ pub mod local { Polygon, #[strum(props(token = "tGLM"))] Mumbai, + #[strum(props(token = "tGLM"))] + Yatestnet, } /// Experimental. In future releases this might change or be removed. @@ -479,6 +481,7 @@ pub mod local { pub enum DriverName { ZkSync, Erc20, + Erc20legacy, } #[derive(StructOpt, Debug, Clone)] diff --git a/core/payment-driver/base/Cargo.toml b/core/payment-driver/base/Cargo.toml index ae3cd4d437..25fcf53c2f 100644 --- a/core/payment-driver/base/Cargo.toml +++ b/core/payment-driver/base/Cargo.toml @@ -15,7 +15,7 @@ bigdecimal = { version = "0.2" } chrono = { version = "0.4", features = ["serde"] } diesel = { version = "1.4", features = ["sqlite", "r2d2", "chrono"] } diesel_migrations = "1.4" -ethereum-types = "0.11" +ethereum-types = "0.14.1" ethsign = "0.8" futures = "0.3" hex = "0.4" @@ -30,7 +30,11 @@ tokio = { version = "1", features = ["macros"] } ## yagna dependencies ya-client-model = "0.5" -ya-core-model = { version = "^0.9", features = ["driver", "identity", "payment"] } +ya-core-model = { version = "^0.9", features = [ + "driver", + "identity", + "payment", +] } ya-persistence = "0.3" ya-service-bus = "0.6.1" diff --git a/core/payment-driver/base/src/bus.rs b/core/payment-driver/base/src/bus.rs index 092625f7dc..c6cb111bf4 100644 --- a/core/payment-driver/base/src/bus.rs +++ b/core/payment-driver/base/src/bus.rs @@ -155,6 +155,16 @@ pub async fn sign(node_id: NodeId, payload: Vec) -> Result, GenericE Ok(signature) } +pub async fn get_pubkey(node_id: NodeId) -> Result, GenericError> { + let pubkey = service(identity::BUS_ID) + .send(identity::GetPubKey(node_id)) + .await + .map_err(GenericError::new)? + .map_err(GenericError::new)?; + + Ok(pubkey) +} + pub async fn notify_payment( driver_name: &str, platform: &str, diff --git a/core/payment-driver/base/src/db/models.rs b/core/payment-driver/base/src/db/models.rs index fffa65c363..fdb29cb963 100644 --- a/core/payment-driver/base/src/db/models.rs +++ b/core/payment-driver/base/src/db/models.rs @@ -105,6 +105,7 @@ pub enum Network { #[default] Goerli = 5, //Goerli is another Ethereum testnet Mumbai = 80001, //Mumbai is testnet for Polygon network + Yatestnet = 987789, //Yatestnet is Golem internal testnet Polygon = 137, //Polygon is Polygon production network } @@ -118,6 +119,7 @@ impl FromStr for Network { "goerli" => Ok(Network::Goerli), "polygon" => Ok(Network::Polygon), "mumbai" => Ok(Network::Mumbai), + "yatestnet" => Ok(Network::Yatestnet), _ => Err(DbError::InvalidData(format!("Invalid network: {}", s))), } } @@ -130,6 +132,7 @@ impl Display for Network { Network::Rinkeby => f.write_str("rinkeby"), Network::Goerli => f.write_str("goerli"), Network::Mumbai => f.write_str("mumbai"), + Network::Yatestnet => f.write_str("yatestnet"), Network::Polygon => f.write_str("polygon"), } } diff --git a/core/payment-driver/erc20/Cargo.toml b/core/payment-driver/erc20/Cargo.toml index 514e5872f6..d5bedf0313 100644 --- a/core/payment-driver/erc20/Cargo.toml +++ b/core/payment-driver/erc20/Cargo.toml @@ -14,8 +14,8 @@ awc = { version = "3", features = ["openssl"] } bigdecimal = { version = "0.2" } chrono = { version = "0.4", features = ["serde"] } derive_more = "0.99" -ethabi = "14.1" -ethereum-types = "0.11" +ethabi = "18.0" +ethereum-types = "0.14.1" ethereum-tx-sign = "3.1" futures = "0.3" hex = "0.4" @@ -32,7 +32,11 @@ thiserror = "1.0" tiny-keccak = { version = "2.0", features = ["keccak"] } tokio = { version = "1", features = ["full"] } uuid = { version = "0.8", features = ["v4"] } -web3 = { version = "0.16", default-features = false, features = [ "http-tls", "signing", "ws-tls-tokio" ] } +web3 = { version = "0.19.0", default-features = false, features = [ + "http-tls", + "signing", + "ws-tls-tokio", +] } ## yagna dependencies ya-payment-driver = "0.3" @@ -40,6 +44,7 @@ ya-client-model = "0.5" ya-service-api-interfaces = "0.2" ya-utils-futures = "0.2" ya-utils-networking = "0.2" +erc20_payment_lib = { workspace = true } [dev-dependencies] actix-rt = "2.7" diff --git a/core/payment-driver/erc20/src/driver/cli.rs b/core/payment-driver/erc20/src/driver/cli.rs index 59ecbd8ba3..f7b2312e89 100644 --- a/core/payment-driver/erc20/src/driver/cli.rs +++ b/core/payment-driver/erc20/src/driver/cli.rs @@ -70,6 +70,13 @@ pub async fn fund(dao: &Erc20Dao, msg: Fund) -> Result { .map_err(GenericError::new)??; format!("Received funds from the faucet. address=0x{:x}", &address) } + Network::Yatestnet => format!( + r#"Your Yatestnet address is {}. + +TODO - add faucet +"#, + address + ), Network::Mumbai => format!( r#"Your Mumbai Polygon address is {}. @@ -145,6 +152,7 @@ pub async fn transfer(dao: &Erc20Dao, msg: Transfer) -> Result "https://rinkeby.etherscan.io/tx/", Network::Goerli => "https://goerli.etherscan.io/tx/", Network::Mumbai => "https://mumbai.polygonscan.com/tx/", + Network::Yatestnet => "https://yatestnet.org:4000/tx/", }; let message = format!("Follow your transaction: {}0x{:x}", endpoint, tx_id); diff --git a/core/payment-driver/erc20/src/erc20/config.rs b/core/payment-driver/erc20/src/erc20/config.rs index c6b36aee96..0e62210def 100644 --- a/core/payment-driver/erc20/src/erc20/config.rs +++ b/core/payment-driver/erc20/src/erc20/config.rs @@ -88,6 +88,20 @@ lazy_static! { } } }; + pub static ref YATESTNET_CONFIG: EnvConfiguration = EnvConfiguration { + glm_contract_address: utils::str_to_addr( + &env::var("YATESTNET_TGLM_CONTRACT_ADDRESS") + .unwrap_or_else(|_| "0x3b80bF85867eE9b079322802A734c074e093328E".to_string()) + ) + .unwrap(), + glm_faucet_address: None, + required_confirmations: { + match env::var("YATESTNET_REQUIRED_CONFIRMATIONS").map(|s| s.parse()) { + Ok(Ok(x)) => x, + _ => 3, + } + } + }; pub static ref POLYGON_MAINNET_CONFIG: EnvConfiguration = EnvConfiguration { glm_contract_address: utils::str_to_addr( &env::var("POLYGON_GLM_CONTRACT_ADDRESS") diff --git a/core/payment-driver/erc20/src/erc20/ethereum.rs b/core/payment-driver/erc20/src/erc20/ethereum.rs index c90e3ad757..21cdae2916 100644 --- a/core/payment-driver/erc20/src/erc20/ethereum.rs +++ b/core/payment-driver/erc20/src/erc20/ethereum.rs @@ -437,7 +437,7 @@ pub async fn get_tx_on_chain_status( } let transaction = get_tx_from_network(tx_hash, network).await?; if let Some(t) = transaction { - res.gas_price = Some(t.gas_price); + res.gas_price = t.gas_price; } } else { } @@ -531,6 +531,9 @@ fn get_rpc_addr_from_env(network: Network) -> Vec { Network::Mainnet => { collect_rpc_addr_from("MAINNET_GETH_ADDR", "https://geth.golem.network:55555") } + Network::Yatestnet => { + collect_rpc_addr_from("YATESTNET_GETH_ADDR", "https://yatestnet.org/web3/yagna") + } Network::Rinkeby => collect_rpc_addr_from( "RINKEBY_GETH_ADDR", "http://geth.testnet.golem.network:55555", @@ -593,6 +596,7 @@ fn get_env(network: Network) -> config::EnvConfiguration { Network::Rinkeby => *config::RINKEBY_CONFIG, Network::Goerli => *config::GOERLI_CONFIG, Network::Mumbai => *config::MUMBAI_CONFIG, + Network::Yatestnet => *config::YATESTNET_CONFIG, Network::Polygon => *config::POLYGON_MAINNET_CONFIG, } } diff --git a/core/payment-driver/erc20/src/lib.rs b/core/payment-driver/erc20/src/lib.rs index 4cbe2ce4cd..a4263aeaef 100644 --- a/core/payment-driver/erc20/src/lib.rs +++ b/core/payment-driver/erc20/src/lib.rs @@ -5,35 +5,41 @@ */ // Public -pub const DRIVER_NAME: &str = "erc20"; +pub const DRIVER_NAME: &str = "erc20legacy"; pub const RINKEBY_NETWORK: &str = "rinkeby"; pub const RINKEBY_TOKEN: &str = "tGLM"; -pub const RINKEBY_PLATFORM: &str = "erc20-rinkeby-tglm"; +pub const RINKEBY_PLATFORM: &str = "erc20legacy-rinkeby-tglm"; pub const RINKEBY_CURRENCY_SHORT: &str = "tETH"; pub const RINKEBY_CURRENCY_LONG: &str = "Rinkeby Ether"; pub const GOERLI_NETWORK: &str = "goerli"; pub const GOERLI_TOKEN: &str = "tGLM"; -pub const GOERLI_PLATFORM: &str = "erc20-goerli-tglm"; +pub const GOERLI_PLATFORM: &str = "erc20legacy-goerli-tglm"; pub const GOERLI_CURRENCY_SHORT: &str = "tETH"; pub const GOERLI_CURRENCY_LONG: &str = "Goerli Ether"; +pub const YATESTNET_NETWORK: &str = "yatestnet"; +pub const YATESTNET_TOKEN: &str = "tGLM"; +pub const YATESTNET_PLATFORM: &str = "erc20legacy-yatestnet-tglm"; +pub const YATESTNET_CURRENCY_SHORT: &str = "tETH"; +pub const YATESTNET_CURRENCY_LONG: &str = "Test Ether"; + pub const MUMBAI_NETWORK: &str = "mumbai"; pub const MUMBAI_TOKEN: &str = "tGLM"; -pub const MUMBAI_PLATFORM: &str = "erc20-mumbai-tglm"; +pub const MUMBAI_PLATFORM: &str = "erc20legacy-mumbai-tglm"; pub const MUMBAI_CURRENCY_SHORT: &str = "tMATIC"; pub const MUMBAI_CURRENCY_LONG: &str = "Test MATIC"; pub const MAINNET_NETWORK: &str = "mainnet"; pub const MAINNET_TOKEN: &str = "GLM"; -pub const MAINNET_PLATFORM: &str = "erc20-mainnet-glm"; +pub const MAINNET_PLATFORM: &str = "erc20legacy-mainnet-glm"; pub const MAINNET_CURRENCY_SHORT: &str = "ETH"; pub const MAINNET_CURRENCY_LONG: &str = "Ether"; pub const POLYGON_MAINNET_NETWORK: &str = "polygon"; pub const POLYGON_MAINNET_TOKEN: &str = "GLM"; -pub const POLYGON_MAINNET_PLATFORM: &str = "erc20-polygon-glm"; +pub const POLYGON_MAINNET_PLATFORM: &str = "erc20legacy-polygon-glm"; pub const POLYGON_MAINNET_CURRENCY_SHORT: &str = "MATIC"; pub const POLYGON_MAINNET_CURRENCY_LONG: &str = "Polygon"; diff --git a/core/payment-driver/erc20/src/network.rs b/core/payment-driver/erc20/src/network.rs index d54ac9f419..991842da97 100644 --- a/core/payment-driver/erc20/src/network.rs +++ b/core/payment-driver/erc20/src/network.rs @@ -13,7 +13,8 @@ use crate::{ MUMBAI_TOKEN, POLYGON_MAINNET_CURRENCY_LONG, POLYGON_MAINNET_CURRENCY_SHORT, POLYGON_MAINNET_NETWORK, POLYGON_MAINNET_PLATFORM, POLYGON_MAINNET_TOKEN, RINKEBY_CURRENCY_LONG, RINKEBY_CURRENCY_SHORT, RINKEBY_NETWORK, RINKEBY_PLATFORM, - RINKEBY_TOKEN, + RINKEBY_TOKEN, YATESTNET_CURRENCY_LONG, YATESTNET_CURRENCY_SHORT, YATESTNET_NETWORK, + YATESTNET_PLATFORM, YATESTNET_TOKEN, }; lazy_static::lazy_static! { @@ -36,6 +37,12 @@ lazy_static::lazy_static! { MAINNET_TOKEN.to_string() => MAINNET_PLATFORM.to_string() } }, + YATESTNET_NETWORK.to_string() => Network { + default_token: YATESTNET_TOKEN.to_string(), + tokens: hashmap! { + YATESTNET_TOKEN.to_string() => YATESTNET_PLATFORM.to_string() + } + }, MUMBAI_NETWORK.to_string() => Network { default_token: MUMBAI_TOKEN.to_string(), tokens: hashmap! { @@ -54,6 +61,7 @@ lazy_static::lazy_static! { pub static ref MAINNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(MAINNET_NETWORK).unwrap(); pub static ref MUMBAI_DB_NETWORK: DbNetwork = DbNetwork::from_str(MUMBAI_NETWORK).unwrap(); pub static ref POLYGON_MAINNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(POLYGON_MAINNET_NETWORK).unwrap(); + pub static ref YATESTNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(YATESTNET_NETWORK).unwrap(); } pub fn platform_to_network_token(platform: String) -> Result<(DbNetwork, String), GenericError> { @@ -62,6 +70,7 @@ pub fn platform_to_network_token(platform: String) -> Result<(DbNetwork, String) GOERLI_PLATFORM => Ok((*GOERLI_DB_NETWORK, GOERLI_TOKEN.to_owned())), MAINNET_PLATFORM => Ok((*MAINNET_DB_NETWORK, MAINNET_TOKEN.to_owned())), MUMBAI_PLATFORM => Ok((*MUMBAI_DB_NETWORK, MUMBAI_TOKEN.to_owned())), + YATESTNET_PLATFORM => Ok((*YATESTNET_DB_NETWORK, YATESTNET_TOKEN.to_owned())), POLYGON_MAINNET_PLATFORM => Ok(( *POLYGON_MAINNET_DB_NETWORK, POLYGON_MAINNET_TOKEN.to_owned(), @@ -125,6 +134,10 @@ pub fn platform_to_currency(platform: String) -> Result<(String, String), Generi POLYGON_MAINNET_CURRENCY_SHORT.to_owned(), POLYGON_MAINNET_CURRENCY_LONG.to_owned(), )), + YATESTNET_PLATFORM => Ok(( + YATESTNET_CURRENCY_SHORT.to_owned(), + YATESTNET_CURRENCY_LONG.to_owned(), + )), other => Err(GenericError::new(format!( "Unable to find network currency for platform: {}", other diff --git a/core/payment-driver/zksync/Cargo.toml b/core/payment-driver/erc20next/Cargo.toml similarity index 58% rename from core/payment-driver/zksync/Cargo.toml rename to core/payment-driver/erc20next/Cargo.toml index 196ef1f09a..918cca5b4c 100644 --- a/core/payment-driver/zksync/Cargo.toml +++ b/core/payment-driver/erc20next/Cargo.toml @@ -1,6 +1,6 @@ [package] -name = "ya-zksync-driver" -version = "0.3.0" +name = "ya-erc20next-driver" +version = "0.4.0" authors = ["Golem Factory "] edition = "2018" @@ -10,26 +10,35 @@ default = [] [dependencies] async-trait = "0.1" anyhow = "1.0" -awc = { version = "3.0", features = ["openssl"] } +awc = { version = "3", features = ["openssl"] } bigdecimal = { version = "0.2" } +ethsign = "0.8" chrono = { version = "0.4", features = ["serde"] } -ethereum-types = "0.10" +derive_more = "0.99" +ethabi = "18.0" +ethereum-types = "0.14.1" +ethereum-tx-sign = "3.1" futures = "0.3" hex = "0.4" lazy_static = "1.4" -log = "0.4.17" +log = "0.4" maplit = "1.0" -metrics-macros = "=0.1.0-alpha.5" num-bigint = { version = "0.3", features = ["serde"] } +num-traits = "0.2" rlp = "0.5" serde = "1.0" serde_json = "^1.0" -tiny-keccak = "1.4.2" +sha3 = "0.8" +thiserror = "1.0" +tiny-keccak = { version = "2.0", features = ["keccak"] } tokio = { version = "1", features = ["full"] } -tokio-compat-02 = "0.2" +tokio-util = { version = "0.7.8", features = ["rt"] } uuid = { version = "0.8", features = ["v4"] } -zksync = { git = "https://github.com/matter-labs/zksync", rev = "0e28e238f71b3be128e4a760b0147e7c62d8dee5"} -zksync_eth_signer = { git = "https://github.com/matter-labs/zksync", rev = "0e28e238f71b3be128e4a760b0147e7c62d8dee5"} +web3 = { version = "0.19.0", default-features = false, features = [ + "http-tls", + "signing", + "ws-tls-tokio", +] } ## yagna dependencies ya-payment-driver = "0.3" @@ -37,6 +46,7 @@ ya-client-model = "0.5" ya-service-api-interfaces = "0.2" ya-utils-futures = "0.2" ya-utils-networking = "0.2" +erc20_payment_lib = { workspace = true } [dev-dependencies] actix-rt = "2.7" diff --git a/core/payment-driver/erc20next/Readme.md b/core/payment-driver/erc20next/Readme.md new file mode 100644 index 0000000000..f5434615af --- /dev/null +++ b/core/payment-driver/erc20next/Readme.md @@ -0,0 +1,163 @@ +## Current ERC20 transactions flow +Date: 2021-10-22 + +Disclaimer: This is dev documentation not officially maintained, it is intended for internal development. + +Testing transfers: +This command will send 0.0001 GLMs from internal wallet to address 0x89Ef977db64A2597bA57E3eb4b717D3bAAeBaeC3 (use your own address for testing) +Note that service have to be running otherwise you get no connection error. + +``` +yagna.exe payment transfer --amount 0.0001 --driver erc20 --network mumbai --to-address 0x89Ef977db64A2597bA57E3eb4b717D3bAAeBaeC3 +``` + +You can specify extra options +* --gas-price (starting gas price in gwei) +* --max-gas-price (maximum allowed gas price in gwei) +* --gas-limit (limit of gas used in transaction). Better to leave default as it is not affecting cost of transaction. This is convenient for testing errors on blockchain. + +``` +yagna.exe payment transfer --amount 0.0001 --gas-price 1.1 --max-gas-price 60.4 --gas-limit 80000 --driver erc20 --network mumbai --to-address 0x89Ef977db64A2597bA57E3eb4b717D3bAAeBaeC3 +``` + +Networks currently supported: +* mainnnet (ETH mainnet, do not use) +* rinkeby (ETH testnet, good support) +* goerli (ETH testnet) +* mumbai (Polygon testnet) +* polygon (Polygon mainnet) + +## Implementation + +DB fields explained + +```sql + tx_id TEXT NOT NULL PRIMARY KEY, + sender TEXT NOT NULL, + nonce INTEGER NOT NULL DEFAULT -1, + status INTEGER NOT NULL, + tx_type INTEGER NOT NULL, + tmp_onchain_txs TEXT NULL, + final_tx TEXT NULL, + starting_gas_price DOUBLE NULL, + current_gas_price DOUBLE NULL, + max_gas_price DOUBLE NULL, + final_gas_price DOUBLE NULL, + final_gas_used INTEGER NULL, + gas_limit INTEGER NULL, + time_created DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + time_last_action DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + time_sent DATETIME NULL, + time_confirmed DATETIME NULL, + network INTEGER NOT NULL DEFAULT 4, + last_error_msg TEXT NULL, + resent_times INT DEFAULT 0, + signature TEXT NULL, + encoded TEXT NOT NULL, +``` + +* tx_id - unique UUID4 generated for trasnsaction +* sender - internal yagna address used for sending transaction +* nonce - Ethereum nonce assigned to transaction +* status - status of the transaction: + * CREATED(1) - the transaction is submitted to db and wait to be sent + * SENT(2) - the transaction is successfully sent to the blockchain network + * PENDING(3) - the transaction is found on blockchain but waiting for execution + * CONFIRMED(4) - the transaction is confirmed and succeeded + * ERRORSENT(10) - transaction failed to be sent on-chain (not consuming nonce, has to be repeated) + * ERRORONCHAIN(11) - transaction is confirmed but failed on-chain (consuming nonce, cannot be repeated until new transaction is assigned to payment) +* tx_type (transfer or faucet transaction) +* tmp_onchain_txs - hashes of all transactions that are sent to the chain (important for checking transaction status when gas is increased) +* final_tx - onchain transaction hash only when transaction is CONFIRMED or ERRORONCHAIN. tmp_onchain_txs are removed to reduce clutter. +* starting_gas_price - gas in Gwei +* current_gas_price - starts with null then it has assigned higher level of gas until transaction is processed +* max_gas_price - limit for current_gas_price +* final_gas_price - assigned after transaction is CONFIRMED or ERRORONCHAIN. +* final_gas_used - assigned after transaction is CONFIRMED or ERRORONCHAIN. use final_gas_used * final_gas_price to have transaction cost in Gwei +* gas_limit - assigned max gas for transaction. If set to low ends with error during transaction sent or error on chain depending on set value. +* time_created - UTC time when entry is created. +* time_last_action - UTC time of last change of the entry. +* time_sent - UTC time of last succesfull sent. +* time_confirmed - UTC time of transaction confirmation (can be also when error on-chain) +* network - id of the Network (for example: 80001 is Mumbai, 137 is Polygon) +* last_error_msg - last error during sending or error onchain, Nulled when trasnaction is successfull +* resent_times - not used right now, intended to limit transaction retries +* signature - transaction signature +* encoded - YagnaRawTransaction encoded in json + +## Assigning nonces + +To process transaction in ethereum network you have to assign nonce which has to be strictly one greater than previous nonce. +This makes process of sending transaction tricky and complicated, because when you send two transactions with the same nonce one of them will fail. Other case is when one transaction is blocked or waiting others with higher nonce will get stuck too. +Currently for every transaction nonce is assigned and not changed until transaction will consume nonce on chain. + +Huge issue: When transaction is malformed and it get stuck, resend will not help and all transactions are blocked. + +With the implementation of the driver we are trying to resolve cases automatically but the process is complicated and not perfect right now. + +Good news: Nonce prevents double spending so we don't have to worry about that (unless we change the nonce) + +Note: Error on chain will consume nonce and gas and new nonce has to be assigned to proceed with transaction, which is currently not handled. + +## Bumping gas prices + +Problem on Ethereum network is as follows: +If you sent transaction you have only vague idea when transaction will be performed. +There is function that is estimating current gas price but it is far from perfect. +Also we want to pay for gas as little as possible. +For example on Polygon Network if you sent transaction for 30.01Gwei you can be pretty sure it get proceeded fairly smoothly +right now, but when the network is congested transaction can get stuck for indefinite amount of time. +When network usage is lower you can try to make transaction for lower gas fee (for example 20Gwei). +To resolve this issue we implemented automatic gas bumping. Every set amount of time gas is increased to increase probability of transaction getting processed. +That way we can save money on gas and also have bigger chance of transactions not getting stuck. + +Currently we proposed following gas levels for polygon network: +``` +10.011, //LOW PRIORITY +15.011, //LOW PRIORITY +20.011, //LOW PRIORITY +25.011, //LOW PRIORITY +30.011, //minimum suggested gas price - FAST PRIORITY +33.011, //not used +36.011, //not used +40.011, //not used +50.011, //not used +60.011, //EXPRESS PRIORITY +80.011, +100.011 +``` +Note that we add 0.011 to increase the chance of getting inline of someone setting whole number as gas price (which people tend to do). It costs almost nothing but significally increase your chance of transaction beeing processed. + +Note that on test networks gas doesn't matter and transaction is processed instantly regardless of gas set. So to test this +feature you have to use Polygon network and pay some Matic for gas. + +## VARIABLES: + +POLYGON_PRIORITY: +possible values: +slow - normal, low priority, economic mode, +fast - fast transaction (for testing or normal mode) +express - express transaction (for testing) + +ERC20_WAIT_FOR_PENDING_ON_NETWORK: (duration) +after that time transaction is resent with higher gas + +## List of known errors: + +Error when sending when gas-limit set too low +``` +RPC error: Error { code: ServerError(-32000), message: "intrinsic gas too low", data: None } +``` +``` +RPC error: Error { code: ServerError(-32000), message: "already known", data: None } +``` +``` +RPC error: Error { code: ServerError(-32000), message: "nonce too low", data: None } +``` + + + + + + + diff --git a/core/payment-driver/erc20next/config-payments.toml b/core/payment-driver/erc20next/config-payments.toml new file mode 100644 index 0000000000..7a3543e41e --- /dev/null +++ b/core/payment-driver/erc20next/config-payments.toml @@ -0,0 +1,82 @@ +[engine] +service-sleep = 1 +process-sleep = 1 +automatic-recover = false + +[chain.rinkeby] +chain-name = "Rinkeby" +chain-id = 4 +rpc-endpoints = ["http://geth.testnet.golem.network:55555"] +currency-symbol = "tETH" +priority-fee = 1.5111 +max-fee-per-gas = 20.0 +gas-left-warning-limit = 1000000 +transaction-timeout = 100 +token = { address = "0xd94e3DC39d4Cad1DAd634e7eb585A57A19dC7EFE", symbol = "tGLM", max-at-once = 10 } +confirmation-blocks = 1 +block-explorer-url = "https://rinkeby.etherscan.io" + +[chain.goerli] +chain-name = "Goerli" +chain-id = 5 +rpc-endpoints = [ + "https://ethereum-goerli-rpc.allthatnode.com", + "https://rpc.slock.it/goerli", + "https://rpc.ankr.com/eth_goerli", +] +currency-symbol = "tETH" +priority-fee = 1.5111 +max-fee-per-gas = 10.0 +gas-left-warning-limit = 1000000 +transaction-timeout = 100 +token = { address = "0x33af15c79d64b85ba14aaffaa4577949104b22e8", symbol = "tGLM" } +multi-contract = { address = "0x7777784f803a7bf1d7f115f849d29ce5706da64a", max-at-once = 10 } +confirmation-blocks = 1 +block-explorer-url = "https://goerli.etherscan.io" + +[chain.mumbai] +chain-name = "Mumbai testnet" +chain-id = 80001 +rpc-endpoints = [ + "https://rpc-mumbai.maticvigil.com/v1/fd04db1066cae0f44d3461ae6d6a7cbbdd46e4a5", +] +# rpc-endpoints = ["http://127.0.0.1:8545"] +currency-symbol = "tMATIC" +priority-fee = 1.5111 +max-fee-per-gas = 500.0 +gas-left-warning-limit = 1000000 +transaction-timeout = 100 +token = { address = "0x2036807B0B3aaf5b1858EE822D0e111fDdac7018", symbol = "tGLM" } +# multi-contract = { address = "0x800010D7d0d315DCA795110ecCf0127cBd76b89f", max-at-once = 10 } +confirmation-blocks = 1 +block-explorer-url = "https://mumbai.polygonscan.com" + +[chain.polygon] +chain-name = "Polygon mainnet" +chain-id = 137 +rpc-endpoints = ["https://polygon-rpc.com"] +currency-symbol = "MATIC" +priority-fee = 30.111 +max-fee-per-gas = 500.0 +gas-left-warning-limit = 1000000 +transaction-timeout = 100 +token = { address = "0x2036807B0B3aaf5b1858EE822D0e111fDdac7018", symbol = "tGLM" } +# multi-contract = { address = "0x50100d4faf5f3b09987dea36dc2eddd57a3e561b", max-at-once = 10 } +confirmation-blocks = 1 +block-explorer-url = "https://polygonscan.com" + +[chain.dev] +chain-name = "Golem testnet" +chain-id = 987789 +rpc-endpoints = ["http://145.239.69.80:8545"] +currency-symbol = "tETH" +priority-fee = 1.1 +max-fee-per-gas = 500.0 +gas-left-warning-limit = 1000000 +transaction-timeout = 100 +token = { address = "0xEC9F23c207018A444f9351dF3D7937f609870667", symbol = "tGLM" } +multi-contract = { address = "0xBCfe9736A4f5bF2E43620061fF3001eA0D003c0F", max-at-once = 10 } +confirmation-blocks = 1 +faucet-eth-amount = 10.0 +faucet-glm-amount = 20.0 +block-explorer-url = "http://145.239.69.80:4000" diff --git a/core/payment-driver/erc20next/src/contracts/eip712.json b/core/payment-driver/erc20next/src/contracts/eip712.json new file mode 100644 index 0000000000..ad0534d974 --- /dev/null +++ b/core/payment-driver/erc20next/src/contracts/eip712.json @@ -0,0 +1,16 @@ +[ + { + "inputs": [], + "name": "getChainId", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }], + "stateMutability": "pure", + "type": "function" + }, + { + "inputs": [], + "name": "getDomainSeperator", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }], + "stateMutability": "view", + "type": "function" + } + ] \ No newline at end of file diff --git a/core/payment-driver/erc20next/src/contracts/faucet.json b/core/payment-driver/erc20next/src/contracts/faucet.json new file mode 100644 index 0000000000..9bbe61926c --- /dev/null +++ b/core/payment-driver/erc20next/src/contracts/faucet.json @@ -0,0 +1,107 @@ +[ + { + "constant": false, + "inputs": [ + { + "name": "_token", + "type": "address" + } + ], + "name": "setNGNT", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "renounceOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "isOwner", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [], + "name": "create", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "token", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + } +] diff --git a/core/payment-driver/erc20next/src/contracts/ierc20.json b/core/payment-driver/erc20next/src/contracts/ierc20.json new file mode 100644 index 0000000000..06b572ddc2 --- /dev/null +++ b/core/payment-driver/erc20next/src/contracts/ierc20.json @@ -0,0 +1,222 @@ +[ + { + "constant": true, + "inputs": [], + "name": "name", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_spender", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_from", + "type": "address" + }, + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "decimals", + "outputs": [ + { + "name": "", + "type": "uint8" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "name": "balance", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": true, + "inputs": [], + "name": "symbol", + "outputs": [ + { + "name": "", + "type": "string" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "constant": false, + "inputs": [ + { + "name": "_to", + "type": "address" + }, + { + "name": "_value", + "type": "uint256" + } + ], + "name": "transfer", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": false, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": true, + "inputs": [ + { + "name": "_owner", + "type": "address" + }, + { + "name": "_spender", + "type": "address" + } + ], + "name": "allowance", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": false, + "stateMutability": "view", + "type": "function" + }, + { + "payable": true, + "stateMutability": "payable", + "type": "fallback" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "name": "spender", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "name": "from", + "type": "address" + }, + { + "indexed": true, + "name": "to", + "type": "address" + }, + { + "indexed": false, + "name": "value", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + } +] diff --git a/core/payment-driver/erc20next/src/contracts/meta_transaction.json b/core/payment-driver/erc20next/src/contracts/meta_transaction.json new file mode 100644 index 0000000000..d2dc77d80c --- /dev/null +++ b/core/payment-driver/erc20next/src/contracts/meta_transaction.json @@ -0,0 +1,53 @@ +[ + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "address", + "name": "userAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "address payable", + "name": "relayerAddress", + "type": "address" + }, + { + "indexed": false, + "internalType": "bytes", + "name": "functionSignature", + "type": "bytes" + } + ], + "name": "MetaTransactionExecuted", + "type": "event" + }, + + { + "inputs": [ + { "internalType": "address", "name": "userAddress", "type": "address" }, + { "internalType": "bytes", "name": "functionSignature", "type": "bytes" }, + { "internalType": "bytes32", "name": "sigR", "type": "bytes32" }, + { "internalType": "bytes32", "name": "sigS", "type": "bytes32" }, + { "internalType": "uint8", "name": "sigV", "type": "uint8" } + ], + "name": "executeMetaTransaction", + "outputs": [{ "internalType": "bytes", "name": "", "type": "bytes" }], + "stateMutability": "payable", + "type": "function" + }, + + { + "inputs": [ + { "internalType": "address", "name": "user", "type": "address" } + ], + "name": "getNonce", + "outputs": [ + { "internalType": "uint256", "name": "nonce", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function" + } +] diff --git a/core/payment-driver/zksync/src/dao.rs b/core/payment-driver/erc20next/src/dao.rs similarity index 51% rename from core/payment-driver/zksync/src/dao.rs rename to core/payment-driver/erc20next/src/dao.rs index 96121c387d..911422eb50 100644 --- a/core/payment-driver/zksync/src/dao.rs +++ b/core/payment-driver/erc20next/src/dao.rs @@ -2,28 +2,26 @@ Database Access Object, all you need to interact with the database. */ -// Extrernal crates -use chrono::{DateTime, Utc}; -use uuid::Uuid; +use web3::types::U256; // Workspace uses use ya_payment_driver::{ dao::{payment::PaymentDao, transaction::TransactionDao, DbExecutor}, db::models::{ - Network, PaymentEntity, TransactionEntity, TransactionStatus, TxType, - PAYMENT_STATUS_FAILED, PAYMENT_STATUS_NOT_YET, + Network, PaymentEntity, TransactionEntity, TransactionStatus, PAYMENT_STATUS_FAILED, + PAYMENT_STATUS_NOT_YET, }, - model::{GenericError, PaymentDetails, SchedulePayment}, + model::{GenericError, SchedulePayment}, utils, }; use crate::network::platform_to_network_token; -pub struct ZksyncDao { +pub struct Erc20Dao { db: DbExecutor, } -impl ZksyncDao { +impl Erc20Dao { pub fn new(db: DbExecutor) -> Self { Self { db } } @@ -91,62 +89,107 @@ impl ZksyncDao { Ok(()) } - pub async fn insert_transaction( + pub async fn get_next_nonce( &self, - details: &PaymentDetails, - date: DateTime, + address: &str, network: Network, - ) -> String { - // TO CHECK: No difference between tx_id and tx_hash on zksync - // TODO: Implement pre-sign - let tx_id = Uuid::new_v4().to_string(); - let tx = TransactionEntity { - tx_id: tx_id.clone(), - sender: details.sender.clone(), - nonce: -1, // not used till pre-sign - status: TransactionStatus::Created as i32, - time_created: date.naive_utc(), - time_last_action: date.naive_utc(), - time_confirmed: None, - time_sent: None, - current_gas_price: None, - starting_gas_price: None, - max_gas_price: None, - final_gas_used: None, - amount_base: None, - amount_erc20: None, - gas_limit: None, - tx_type: TxType::Transfer as i32, // Zksync only knows transfers, unused field - encoded: "".to_string(), // not used till pre-sign - signature: None, // not used till pre-sign - final_tx: None, - tmp_onchain_txs: None, - network, - last_error_msg: None, - resent_times: 0, + ) -> Result { + let list_of_nonces = self + .transaction() + .get_used_nonces(address, network) + .await + .map_err(GenericError::new)?; + + let max_nonce = list_of_nonces.into_iter().max(); + + let next_nonce = match max_nonce { + Some(nonce) => U256::from(nonce + 1), + None => U256::from(0), }; + Ok(next_nonce) + } + + pub async fn insert_raw_transaction(&self, tx: TransactionEntity) -> String { + let tx_id = tx.tx_id.clone(); + if let Err(e) = self.transaction().insert_transactions(vec![tx]).await { - log::error!("Failed to store transaction for {:?} : {:?}", details, e) + log::error!("Failed to store transaction for {} : {:?}", tx_id, e) // TO CHECK: Should it continue or stop the process... } tx_id } - pub async fn transaction_confirmed(&self, tx_id: &str) -> Vec { + pub async fn get_payments_based_on_tx(&self, tx_id: &str) -> Vec { + match self.payment().get_by_tx_id(tx_id.to_string()).await { + Ok(payments) => payments, + Err(e) => { + log::error!("Failed to fetch `payments` for tx {:?} : {:?}", tx_id, e); + vec![] + } + } + } + + pub async fn transaction_confirmed( + &self, + tx_id: &str, + final_hash: &str, + final_gas_price: Option, + ) { if let Err(e) = self .transaction() - .update_tx_status(tx_id.to_string(), TransactionStatus::Confirmed, None) + .confirm_tx( + tx_id.to_string(), + TransactionStatus::Confirmed, + None, + Some(final_hash.to_string()), + final_gas_price, + ) + .await + { + log::error!("Failed to update tx status for {:?} : {:?}", tx_id, e) + // TO CHECK: Should it continue or stop the process... + } + } + + pub async fn transaction_confirmed_and_failed( + &self, + tx_id: &str, + final_hash: &str, + final_gas_price: Option, + error: &str, + ) { + if let Err(e) = self + .transaction() + .confirm_tx( + tx_id.to_string(), + TransactionStatus::ErrorOnChain, + Some(error.to_string()), + Some(final_hash.to_string()), + final_gas_price, + ) + .await + { + log::error!("Failed to update tx status for {:?} : {:?}", tx_id, e) + // TO CHECK: Should it continue or stop the process... + } + } + + pub async fn transaction_failed_with_nonce_too_low(&self, tx_id: &str, error: &str) { + if let Err(e) = self + .transaction() + .confirm_tx( + tx_id.to_string(), + TransactionStatus::ErrorNonceTooLow, + Some(error.to_string()), + None, + None, + ) .await { log::error!("Failed to update tx status for {:?} : {:?}", tx_id, e) // TO CHECK: Should it continue or stop the process... } - match self.payment().get_by_tx_id(tx_id.to_string()).await { - Ok(payments) => return payments, - Err(e) => log::error!("Failed to fetch `payments` for tx {:?} : {:?}", tx_id, e), - }; - vec![] } pub async fn get_first_payment(&self, tx_hash: &str) -> Option { @@ -160,7 +203,7 @@ impl ZksyncDao { } } - pub async fn transaction_sent(&self, tx_id: &str, tx_hash: &str, order_id: &str) { + pub async fn transaction_saved(&self, tx_id: &str, order_id: &str) { if let Err(e) = self .payment() .update_tx_id(order_id.to_string(), tx_id.to_string()) @@ -169,9 +212,12 @@ impl ZksyncDao { log::error!("Failed to update for transaction {:?} : {:?}", tx_id, e) // TO CHECK: Should it continue or stop the process... } + } + + pub async fn retry_send_transaction(&self, tx_id: &str, bump_gas: bool) { if let Err(e) = self .transaction() - .update_tx_sent(tx_id.to_string(), tx_hash.to_string(), None) + .update_tx_send_again(tx_id.to_string(), bump_gas) .await { log::error!("Failed to update for transaction {:?} : {:?}", tx_id, e) @@ -179,13 +225,60 @@ impl ZksyncDao { } } - pub async fn transaction_failed(&self, tx_id: &str, err: &str) { + pub async fn update_tx_fields( + &self, + tx_id: &str, + encoded: String, + signature: String, + current_gas_price: Option, + ) { if let Err(e) = self .transaction() - .update_tx_status( + .update_tx_fields(tx_id.to_string(), encoded, signature, current_gas_price) + .await + { + log::error!("Failed to update for transaction {:?} : {:?}", tx_id, e) + // TO CHECK: Should it continue or stop the process... + } + } + + pub async fn overwrite_tmp_onchain_txs_and_status_back_to_pending( + &self, + tx_id: &str, + overwrite_tmp_onchain_txs: &str, + ) { + if let Err(e) = self + .transaction() + .overwrite_tmp_onchain_txs_and_status_back_to_pending( tx_id.to_string(), - TransactionStatus::ErrorOnChain, - Some(err.to_string()), + overwrite_tmp_onchain_txs.to_string(), + ) + .await + { + log::error!("Failed to update for transaction {:?} : {:?}", tx_id, e) + // TO CHECK: Should it continue or stop the process... + } + } + + pub async fn transaction_sent(&self, tx_id: &str, tx_hash: &str, gas_price: Option) { + if let Err(e) = self + .transaction() + .update_tx_sent(tx_id.to_string(), tx_hash.to_string(), gas_price) + .await + { + log::error!("Failed to update for transaction {:?} : {:?}", tx_id, e) + // TO CHECK: Should it continue or stop the process... + } + } + + pub async fn transaction_failed_send(&self, tx_id: &str, new_resent_count: i32, error: &str) { + if let Err(e) = self + .transaction() + .update_error_sent( + tx_id.to_string(), + TransactionStatus::ErrorSent, + new_resent_count, + Some(error.to_string()), ) .await { @@ -213,18 +306,13 @@ impl ZksyncDao { } } - pub async fn retry_payment(&self, order_id: &str) { - if let Err(e) = self - .payment() - .update_status(order_id.to_string(), PAYMENT_STATUS_NOT_YET) - .await - { - log::error!( - "Failed to set status of the `payment` {:?} to be retried : {:?}", - order_id, - e - ) - // TO CHECK: Should it continue or stop the process... + pub async fn get_unsent_txs(&self, network: Network) -> Vec { + match self.transaction().get_unsent_txs(network).await { + Ok(txs) => txs, + Err(e) => { + log::error!("Failed to fetch unconfirmed transactions : {:?}", e); + vec![] + } } } @@ -244,4 +332,22 @@ impl ZksyncDao { .await .map_err(GenericError::new) } + + pub async fn get_pending_faucet_txs( + &self, + node_id: &str, + network: Network, + ) -> Vec { + match self + .transaction() + .get_pending_faucet_txs(node_id, network) + .await + { + Ok(txs) => txs, + Err(e) => { + log::error!("Failed to fetch unsent transactions : {:?}", e); + vec![] + } + } + } } diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs new file mode 100644 index 0000000000..2c1ade15e2 --- /dev/null +++ b/core/payment-driver/erc20next/src/driver.rs @@ -0,0 +1,294 @@ +/* + Erc20Driver to handle payments on the erc20 network. + + Please limit the logic in this file, use local mods to handle the calls. +*/ +// Extrnal crates +use erc20_payment_lib::db::ops::insert_token_transfer; +use erc20_payment_lib::runtime::PaymentRuntime; +use erc20_payment_lib::transaction::create_token_transfer; +use ethereum_types::H160; +use std::collections::HashMap; +use std::str::FromStr; +use uuid::Uuid; + +// Workspace uses +use ya_payment_driver::{ + account::{Accounts, AccountsRc}, + bus, + cron::PaymentDriverCron, + dao::DbExecutor, + driver::{ + async_trait, BigDecimal, IdentityError, IdentityEvent, Network as NetworkConfig, + PaymentDriver, + }, + model::*, +}; + +// Local uses +use crate::erc20::utils::big_dec_to_u256; +use crate::{network::SUPPORTED_NETWORKS, DRIVER_NAME, RINKEBY_NETWORK}; + +mod api; +mod cli; + +lazy_static::lazy_static! { + static ref TX_SENDOUT_INTERVAL: std::time::Duration = std::time::Duration::from_secs( + std::env::var("ERC20_SENDOUT_INTERVAL_SECS") + .ok() + .and_then(|x| x.parse().ok()) + .unwrap_or(30), + ); + + static ref TX_CONFIRMATION_INTERVAL: std::time::Duration = std::time::Duration::from_secs( + std::env::var("ERC20_CONFIRMATION_INTERVAL_SECS") + .ok() + .and_then(|x| x.parse().ok()) + .unwrap_or(30), + ); +} + +pub struct Erc20NextDriver { + active_accounts: AccountsRc, + payment_runtime: PaymentRuntime, +} + +impl Erc20NextDriver { + pub fn new(pr: PaymentRuntime) -> Self { + Self { + active_accounts: Accounts::new_rc(), + payment_runtime: pr, + } + } + + pub async fn load_active_accounts(&self) { + log::debug!("load_active_accounts"); + let unlocked_accounts = bus::list_unlocked_identities().await.unwrap(); + let mut accounts = self.active_accounts.borrow_mut(); + for account in unlocked_accounts { + log::debug!("account={}", account); + accounts.add_account(account) + } + } + + fn is_account_active(&self, address: &str) -> Result<(), GenericError> { + match self.active_accounts.as_ref().borrow().get_node_id(address) { + Some(_) => Ok(()), + None => Err(GenericError::new(format!( + "Account not active: {}", + &address + ))), + } + } + + async fn do_transfer( + &self, + sender: &str, + to: &str, + amount: &BigDecimal, + network: &str, + ) -> Result { + self.is_account_active(sender)?; + let sender = H160::from_str(sender) + .map_err(|err| GenericError::new(format!("Error when parsing sender {err:?}")))?; + let receiver = H160::from_str(to) + .map_err(|err| GenericError::new(format!("Error when parsing receiver {err:?}")))?; + let amount = big_dec_to_u256(amount)?; + + let chain_id = self + .payment_runtime + .setup + .chain_setup + .values() + .find(|chain_setup| &chain_setup.network == network) + .ok_or_else(|| GenericError::new(format!("Unsupported network: {}", network)))? + .chain_id; + + let chain_cfg = self + .payment_runtime + .setup + .chain_setup + .get(&chain_id) + .ok_or(GenericError::new(format!( + "Cannot find chain cfg for chain {chain_id}" + )))?; + + let glm_address = chain_cfg.glm_address.ok_or(GenericError::new(format!( + "Cannot find GLM address for chain {chain_id}" + )))?; + + let payment_id = Uuid::new_v4().to_simple().to_string(); + let token_transfer = create_token_transfer( + sender, + receiver, + chain_cfg.chain_id, + Some(&payment_id), + Some(glm_address), + amount, + ); + let _res = insert_token_transfer(&self.payment_runtime.conn, &token_transfer) + .await + .map_err(|err| GenericError::new(format!("Error when inserting transfer {err:?}")))?; + + Ok(payment_id) + } +} + +#[async_trait(?Send)] +impl PaymentDriver for Erc20NextDriver { + async fn account_event( + &self, + _db: DbExecutor, + _caller: String, + msg: IdentityEvent, + ) -> Result<(), IdentityError> { + self.active_accounts.borrow_mut().handle_event(msg); + Ok(()) + } + + async fn enter( + &self, + _db: DbExecutor, + _caller: String, + msg: Enter, + ) -> Result { + log::info!("ENTER = Not Implemented: {:?}", msg); + Ok("NOT_IMPLEMENTED".to_string()) + } + + async fn exit( + &self, + _db: DbExecutor, + _caller: String, + msg: Exit, + ) -> Result { + log::info!("EXIT = Not Implemented: {:?}", msg); + Ok("NOT_IMPLEMENTED".to_string()) + } + + async fn get_account_balance( + &self, + _db: DbExecutor, + _caller: String, + msg: GetAccountBalance, + ) -> Result { + api::get_account_balance(msg).await + } + + async fn get_account_gas_balance( + &self, + _db: DbExecutor, + _caller: String, + msg: GetAccountGasBalance, + ) -> Result, GenericError> { + api::get_account_gas_balance(msg).await + } + + fn get_name(&self) -> String { + DRIVER_NAME.to_string() + } + + fn get_default_network(&self) -> String { + RINKEBY_NETWORK.to_string() + } + + fn get_networks(&self) -> HashMap { + SUPPORTED_NETWORKS.clone() + } + + fn recv_init_required(&self) -> bool { + false + } + + async fn init(&self, _db: DbExecutor, _caller: String, msg: Init) -> Result { + cli::init(self, msg).await?; + Ok(Ack {}) + } + + async fn fund( + &self, + _db: DbExecutor, + _caller: String, + msg: Fund, + ) -> Result { + log::info!("FUND = Not Implemented: {:?}", msg); + Ok("NOT_IMPLEMENTED".to_string()) + } + + async fn transfer( + &self, + _db: DbExecutor, + _caller: String, + msg: Transfer, + ) -> Result { + let network = msg + .network + .ok_or(GenericError::new("Network not specified".to_string()))?; + + self.do_transfer(&msg.sender, &msg.to, &msg.amount, &network) + .await + } + + async fn schedule_payment( + &self, + _db: DbExecutor, + _caller: String, + msg: SchedulePayment, + ) -> Result { + let platform = msg.platform(); + let network = platform.split("-").nth(1).ok_or(GenericError::new(format!( + "Malformed platform string: {}", + msg.platform() + )))?; + + self.do_transfer(&msg.sender(), &msg.recipient(), &msg.amount(), &network) + .await + } + + async fn verify_payment( + &self, + _db: DbExecutor, + _caller: String, + msg: VerifyPayment, + ) -> Result { + api::verify_payment(msg).await + } + + async fn validate_allocation( + &self, + _db: DbExecutor, + _caller: String, + msg: ValidateAllocation, + ) -> Result { + api::validate_allocation(msg).await + } + + async fn shut_down( + &self, + _db: DbExecutor, + _caller: String, + _msg: ShutDown, + ) -> Result<(), GenericError> { + // no-op, erc20_payment_lib driver doesn't expose clean shutdown interface yet + Ok(()) + } +} + +#[async_trait(?Send)] +impl PaymentDriverCron for Erc20NextDriver { + async fn confirm_payments(&self) { + // no-op, handled by erc20_payment_lib internally + } + + async fn send_out_payments(&self) { + // no-op, handled by erc20_payment_lib internally + } + + fn sendout_interval(&self) -> std::time::Duration { + *TX_SENDOUT_INTERVAL + } + + fn confirmation_interval(&self) -> std::time::Duration { + *TX_CONFIRMATION_INTERVAL + } +} diff --git a/core/payment-driver/erc20next/src/driver/api.rs b/core/payment-driver/erc20next/src/driver/api.rs new file mode 100644 index 0000000000..dbf89eb3dd --- /dev/null +++ b/core/payment-driver/erc20next/src/driver/api.rs @@ -0,0 +1,128 @@ +/* + Driver helper for handling messages from payment_api. +*/ +// Extrnal crates +// use lazy_static::lazy_static; +// use num_bigint::BigInt; +use uuid::Uuid; + +// Workspace uses +use ya_payment_driver::{ + driver::BigDecimal, + model::{ + GasDetails, GenericError, GetAccountBalance, GetAccountGasBalance, SchedulePayment, + ValidateAllocation, VerifyPayment, + }, +}; + +// Local uses +use crate::{ + dao::Erc20Dao, + driver::PaymentDetails, + erc20::{utils, wallet}, + network, +}; + +// lazy_static! { +// static ref MAX_ALLOCATION_SURCHARGE: BigDecimal = +// match std::env::var("MAX_ALLOCATION_SURCHARGE").map(|s| s.parse()) { +// Ok(Ok(x)) => x, +// _ => BigDecimal::from(200), +// }; +// +// // Environment variable will be replaced by allocation parameter in PAY-82 +// static ref TRANSACTIONS_PER_ALLOCATION: BigInt = +// match std::env::var("TRANSACTIONS_PER_ALLOCATION").map(|s| s.parse()) { +// Ok(Ok(x)) => x, +// _ => BigInt::from(10), +// }; +// } + +pub async fn get_account_balance(msg: GetAccountBalance) -> Result { + log::debug!("get_account_balance: {:?}", msg); + let (network, _) = network::platform_to_network_token(msg.platform())?; + let address = utils::str_to_addr(&msg.address())?; + // TODO implement token + let balance = wallet::account_balance(address, network).await?; + + log::info!( + "get_account_balance() - account={}, balance={}", + &msg.address(), + &balance + ); + Ok(balance) +} + +pub async fn get_account_gas_balance( + msg: GetAccountGasBalance, +) -> Result, GenericError> { + log::debug!("get_account_gas_balance: {:?}", msg); + let (currency_short_name, currency_long_name) = network::platform_to_currency(msg.platform())?; + let (network, _) = network::platform_to_network_token(msg.platform())?; + + let address = utils::str_to_addr(&msg.address())?; + + let balance = wallet::account_gas_balance(address, network).await?; + + log::info!( + "get_account_gas_balance() - account={}, balance={}, currency {}", + &msg.address(), + &balance, + currency_long_name + ); + Ok(Some(GasDetails { + currency_short_name, + currency_long_name, + balance, + })) +} + +pub async fn _schedule_payment( + dao: &Erc20Dao, + msg: SchedulePayment, +) -> Result { + let order_id = Uuid::new_v4().to_string(); + dao.insert_payment(&order_id, &msg).await?; + log::info!("schedule_payment()"); + Ok(order_id) +} + +pub async fn verify_payment(msg: VerifyPayment) -> Result { + log::debug!("verify_payment: {:?}", msg); + let (network, _) = network::platform_to_network_token(msg.platform())?; + let tx_hash = format!("0x{}", hex::encode(msg.confirmation().confirmation)); + log::info!("Verifying transaction: {}", tx_hash); + wallet::verify_tx(&tx_hash, network).await +} + +pub async fn validate_allocation(msg: ValidateAllocation) -> Result { + log::debug!("validate_allocation: {:?}", msg); + let address = utils::str_to_addr(&msg.address)?; + let (network, _) = network::platform_to_network_token(msg.platform)?; + let account_balance = wallet::account_balance(address, network).await?; + let total_allocated_amount: BigDecimal = msg + .existing_allocations + .into_iter() + .map(|allocation| allocation.remaining_amount) + .sum(); + + // TODO: calculate fee. Below commented out reference to zkSync implementation + // let tx_fee_cost = wallet::get_tx_fee(&msg.address, network).await?; + // let total_txs_cost = tx_fee_cost * &*TRANSACTIONS_PER_ALLOCATION; + // let allocation_surcharge = (&*MAX_ALLOCATION_SURCHARGE).min(&total_txs_cost); + // + log::info!( + "Allocation validation: \ + allocating: {:.5}, \ + account_balance: {:.5}, \ + total_allocated_amount: {:.5}", //", \ + // allocation_surcharge: {:.5} \ + // ", + msg.amount, + account_balance, + total_allocated_amount, + //allocation_surcharge, + ); + // Ok(msg.amount <= (account_balance - total_allocated_amount - allocation_surcharge)) + Ok(msg.amount <= account_balance - total_allocated_amount) +} diff --git a/core/payment-driver/erc20next/src/driver/cli.rs b/core/payment-driver/erc20next/src/driver/cli.rs new file mode 100644 index 0000000000..f2c3a06e7c --- /dev/null +++ b/core/payment-driver/erc20next/src/driver/cli.rs @@ -0,0 +1,46 @@ +/* + Driver helper for handling messages from CLI. + + Please limit the logic in this file, use local mods to handle the calls. +*/ +// Extrnal crates + +// Workspace uses +use ya_payment_driver::{ + bus, + model::{AccountMode, GenericError, Init}, +}; +use ya_utils_futures::timeout::IntoTimeoutFuture; + +// Local uses +use crate::{driver::Erc20NextDriver, erc20::wallet, network, DRIVER_NAME}; + +pub async fn init(driver: &Erc20NextDriver, msg: Init) -> Result<(), GenericError> { + log::debug!("init: {:?}", msg); + let mode = msg.mode(); + let address = msg.address(); + + // Ensure account is unlock before initialising send mode + if mode.contains(AccountMode::SEND) { + driver.is_account_active(&address)? + } + + wallet::init_wallet(&msg) + .timeout(Some(30)) + .await + .map_err(GenericError::new)??; + + let network = network::network_like_to_network(msg.network()); + let token = network::get_network_token(network, msg.token()); + bus::register_account(driver, &msg.address(), &network.to_string(), &token, mode).await?; + + log::info!( + "Initialised payment account. mode={:?}, address={}, driver={}, network={}, token={}", + mode, + &msg.address(), + DRIVER_NAME, + network, + token + ); + Ok(()) +} diff --git a/core/payment-driver/erc20next/src/erc20/config.rs b/core/payment-driver/erc20next/src/erc20/config.rs new file mode 100644 index 0000000000..0e62210def --- /dev/null +++ b/core/payment-driver/erc20next/src/erc20/config.rs @@ -0,0 +1,119 @@ +use lazy_static::lazy_static; +use std::env; +use web3::types::Address; + +use crate::erc20::utils; + +// TODO: REUSE old verification checks? +// pub(crate) const ETH_TX_SUCCESS: u64 = 1; +// pub(crate) const TRANSFER_LOGS_LENGTH: usize = 1; +// pub(crate) const TX_LOG_DATA_LENGTH: usize = 32; +// pub(crate) const TX_LOG_TOPICS_LENGTH: usize = 3; +// pub(crate) const TRANSFER_CANONICAL_SIGNATURE: &str = +// "ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef"; + +#[derive(Clone, Copy, Debug)] +pub struct EnvConfiguration { + pub glm_contract_address: Address, + pub glm_faucet_address: Option
, + pub required_confirmations: u64, +} + +lazy_static! { + pub static ref RINKEBY_CONFIG: EnvConfiguration = EnvConfiguration { + glm_contract_address: utils::str_to_addr( + &env::var("RINKEBY_TGLM_CONTRACT_ADDRESS") + .unwrap_or_else(|_| "0xd94e3DC39d4Cad1DAd634e7eb585A57A19dC7EFE".to_string()) + ) + .unwrap(), + glm_faucet_address: Some( + utils::str_to_addr( + &env::var("RINKEBY_TGLM_FAUCET_ADDRESS") + .unwrap_or_else(|_| "0x59259943616265A03d775145a2eC371732E2B06C".to_string()) + ) + .unwrap() + ), + required_confirmations: { + match env::var("ERC20_RINKEBY_REQUIRED_CONFIRMATIONS").map(|s| s.parse()) { + Ok(Ok(x)) => x, + _ => 3, + } + } + }; + pub static ref MAINNET_CONFIG: EnvConfiguration = EnvConfiguration { + glm_contract_address: utils::str_to_addr( + &env::var("MAINNET_GLM_CONTRACT_ADDRESS") + .unwrap_or_else(|_| "0x7DD9c5Cba05E151C895FDe1CF355C9A1D5DA6429".to_string()) + ) + .unwrap(), + glm_faucet_address: None, + required_confirmations: { + match env::var("ERC20_MAINNET_REQUIRED_CONFIRMATIONS").map(|s| s.parse()) { + Ok(Ok(x)) => x, + _ => 5, + } + } + }; + pub static ref GOERLI_CONFIG: EnvConfiguration = EnvConfiguration { + glm_contract_address: utils::str_to_addr( + &env::var("GOERLI_TGLM_CONTRACT_ADDRESS") + .unwrap_or_else(|_| "0x33af15c79d64b85ba14aaffaa4577949104b22e8".to_string()) + ) + .unwrap(), + glm_faucet_address: Some( + utils::str_to_addr( + &env::var("GOERLI_TGLM_FAUCET_ADDRESS") + .unwrap_or_else(|_| "0xCCA41b09C1F50320bFB41BD6822BD0cdBDC7d85C".to_string()) + ) + .unwrap() + ), + required_confirmations: { + match env::var("ERC20_GOERLI_REQUIRED_CONFIRMATIONS").map(|s| s.parse()) { + Ok(Ok(x)) => x, + _ => 3, + } + } + }; + pub static ref MUMBAI_CONFIG: EnvConfiguration = EnvConfiguration { + glm_contract_address: utils::str_to_addr( + &env::var("MUMBAI_TGLM_CONTRACT_ADDRESS") + .unwrap_or_else(|_| "0x2036807B0B3aaf5b1858EE822D0e111fDdac7018".to_string()) + ) + .unwrap(), + glm_faucet_address: None, + required_confirmations: { + match env::var("ERC20_MUMBAI_REQUIRED_CONFIRMATIONS").map(|s| s.parse()) { + Ok(Ok(x)) => x, + _ => 3, + } + } + }; + pub static ref YATESTNET_CONFIG: EnvConfiguration = EnvConfiguration { + glm_contract_address: utils::str_to_addr( + &env::var("YATESTNET_TGLM_CONTRACT_ADDRESS") + .unwrap_or_else(|_| "0x3b80bF85867eE9b079322802A734c074e093328E".to_string()) + ) + .unwrap(), + glm_faucet_address: None, + required_confirmations: { + match env::var("YATESTNET_REQUIRED_CONFIRMATIONS").map(|s| s.parse()) { + Ok(Ok(x)) => x, + _ => 3, + } + } + }; + pub static ref POLYGON_MAINNET_CONFIG: EnvConfiguration = EnvConfiguration { + glm_contract_address: utils::str_to_addr( + &env::var("POLYGON_GLM_CONTRACT_ADDRESS") + .unwrap_or_else(|_| "0x0b220b82f3ea3b7f6d9a1d8ab58930c064a2b5bf".to_string()) + ) + .unwrap(), + glm_faucet_address: None, + required_confirmations: { + match env::var("ERC20_POLYGON_REQUIRED_CONFIRMATIONS").map(|s| s.parse()) { + Ok(Ok(x)) => x, + _ => 5, + } + } + }; +} diff --git a/core/payment-driver/erc20next/src/erc20/eth_utils.rs b/core/payment-driver/erc20next/src/erc20/eth_utils.rs new file mode 100644 index 0000000000..cbc8dce1cb --- /dev/null +++ b/core/payment-driver/erc20next/src/erc20/eth_utils.rs @@ -0,0 +1,121 @@ +// PRIVATE RawTransaction.hash() + +use ethereum_types::U256; +use rlp::RlpStream; +use tiny_keccak::{Hasher, Keccak}; + +use crate::erc20::transaction::YagnaRawTransaction; + +pub fn get_tx_hash(tx: &YagnaRawTransaction, chain_id: u64) -> Vec { + let mut hash = RlpStream::new(); + hash.begin_unbounded_list(); + tx_encode(tx, &mut hash); + hash.append(&chain_id.clone()); + hash.append(&U256::zero()); + hash.append(&U256::zero()); + hash.finalize_unbounded_list(); + keccak256_hash(&hash.out()) +} + +pub fn keccak256_hash(bytes: &[u8]) -> Vec { + let mut hasher = Keccak::v256(); + hasher.update(bytes); + let mut resp: [u8; 32] = Default::default(); + hasher.finalize(&mut resp); + resp.to_vec() +} + +fn tx_encode(tx: &YagnaRawTransaction, s: &mut RlpStream) { + s.append(&tx.nonce); + s.append(&tx.gas_price); + s.append(&tx.gas); + if let Some(ref t) = tx.to { + s.append(t); + } else { + s.append(&vec![]); + } + s.append(&tx.value); + s.append(&tx.data); +} + +// MISSING RawTransaction.encode_signed_tx() + +pub fn encode_signed_tx( + raw_tx: &YagnaRawTransaction, + signature: Vec, + chain_id: u64, +) -> Vec { + let (sig_v, sig_r, sig_s) = prepare_signature(signature, chain_id); + + let mut tx = RlpStream::new(); + + tx.begin_unbounded_list(); + + tx_encode(raw_tx, &mut tx); + tx.append(&sig_v); + tx.append(&sig_r); + tx.append(&sig_s); + + tx.finalize_unbounded_list(); + + tx.out().to_vec() +} + +fn prepare_signature(mut signature: Vec, chain_id: u64) -> (u64, Vec, Vec) { + // TODO ugly solution + assert_eq!(signature.len(), 65); + + let sig_v = signature[0]; + let sig_v = sig_v as u64 + chain_id * 2 + 35; + + let mut sig_r = signature.split_off(1); + let mut sig_s = sig_r.split_off(32); + + prepare_signature_part(&mut sig_r); + prepare_signature_part(&mut sig_s); + + (sig_v, sig_r, sig_s) +} + +fn prepare_signature_part(part: &mut Vec) { + assert_eq!(part.len(), 32); + while part[0] == 0 { + part.remove(0); + } +} + +// MISSING contract.encode() + +use ethabi::{Error, Token}; +use web3::contract::tokens::Tokenize; +use web3::contract::Contract; +use web3::Transport; + +pub fn contract_encode( + contract: &Contract, + func: &str, + params: P, +) -> Result, Error> +where + P: Tokenize, + T: Transport, +{ + contract + .abi() + .function(func) + .and_then(|function| function.encode_input(¶ms.into_tokens())) +} + +pub fn contract_decode( + contract: &Contract, + func: &str, + data: Vec, +) -> Result, Error> +where + T: Transport, +{ + contract + .abi() + .function(func) + .and_then(|function| function.decode_input(&data)) +} diff --git a/core/payment-driver/erc20next/src/erc20/ethereum.rs b/core/payment-driver/erc20next/src/erc20/ethereum.rs new file mode 100644 index 0000000000..21cdae2916 --- /dev/null +++ b/core/payment-driver/erc20next/src/erc20/ethereum.rs @@ -0,0 +1,841 @@ +#![allow(clippy::too_many_arguments)] + +use std::collections::HashMap; +use std::sync::Arc; + +use bigdecimal::BigDecimal; +use chrono::{DateTime, Utc}; +use ethabi::Token; +use lazy_static::lazy_static; +use tokio::sync::RwLock; +use uuid::Uuid; +use web3::{ + contract::{tokens::Tokenize, Contract, Options}, + error::Error, + transports::Http, + types::{Bytes, Transaction, TransactionId, TransactionReceipt, H160, H256, U256, U64}, + Web3, +}; + +use ya_client_model::NodeId; +use ya_payment_driver::db::models::{Network, TransactionEntity, TransactionStatus, TxType}; +use ya_payment_driver::utils::big_dec_to_u256; +use ya_payment_driver::{bus, model::GenericError}; + +use crate::erc20::eth_utils::keccak256_hash; +use crate::erc20::transaction::YagnaRawTransaction; +use crate::erc20::{config, eth_utils}; + +#[derive(Clone, Debug, thiserror::Error)] +pub enum ClientError { + #[error("{0}")] + Web3(#[from] Error), + #[error("{0}")] + Other(#[from] GenericError), +} + +impl ClientError { + pub fn new(value: impl std::fmt::Display) -> Self { + Self::Other(GenericError::new(value)) + } +} + +impl From for ClientError { + fn from(e: web3::contract::Error) -> Self { + Self::Other(GenericError::new(e)) + } +} + +impl From for GenericError { + fn from(e: ClientError) -> Self { + match e { + ClientError::Other(e) => e, + ClientError::Web3(e) => GenericError::new(e), + } + } +} + +pub enum PolygonPriority { + PolygonPrioritySlow, + PolygonPriorityFast, + PolygonPriorityExpress, +} + +pub enum PolygonGasPriceMethod { + PolygonGasPriceStatic, + PolygonGasPriceDynamic, +} + +pub const POLYGON_PREFERRED_GAS_PRICES_SLOW: [f64; 6] = [0.0, 10.01, 15.01, 20.01, 25.01, 30.01]; +pub const POLYGON_PREFERRED_GAS_PRICES_FAST: [f64; 3] = [0.0, 30.01, 40.01]; +pub const POLYGON_PREFERRED_GAS_PRICES_EXPRESS: [f64; 3] = [0.0, 60.01, 100.01]; + +lazy_static! { + pub static ref GLM_FAUCET_GAS: U256 = U256::from(90_000); + pub static ref GLM_TRANSFER_GAS: U256 = U256::from(55_000); + pub static ref GLM_POLYGON_GAS_LIMIT: U256 = U256::from(100_000); + static ref WEB3_CLIENT_MAP: Arc>>> = Default::default(); +} +const CREATE_FAUCET_FUNCTION: &str = "create"; +const BALANCE_ERC20_FUNCTION: &str = "balanceOf"; +const TRANSFER_ERC20_FUNCTION: &str = "transfer"; +const GET_DOMAIN_SEPARATOR_FUNCTION: &str = "getDomainSeperator"; +const GET_NONCE_FUNCTION: &str = "getNonce"; + +pub fn get_polygon_starting_price() -> f64 { + match get_polygon_priority() { + PolygonPriority::PolygonPrioritySlow => POLYGON_PREFERRED_GAS_PRICES_SLOW[1], + PolygonPriority::PolygonPriorityFast => POLYGON_PREFERRED_GAS_PRICES_FAST[1], + PolygonPriority::PolygonPriorityExpress => POLYGON_PREFERRED_GAS_PRICES_EXPRESS[1], + } +} + +pub fn get_polygon_maximum_price() -> f64 { + match get_polygon_gas_price_method() { + PolygonGasPriceMethod::PolygonGasPriceStatic => match get_polygon_priority() { + PolygonPriority::PolygonPrioritySlow => { + POLYGON_PREFERRED_GAS_PRICES_SLOW[POLYGON_PREFERRED_GAS_PRICES_SLOW.len() - 1] + } + PolygonPriority::PolygonPriorityFast => { + POLYGON_PREFERRED_GAS_PRICES_FAST[POLYGON_PREFERRED_GAS_PRICES_FAST.len() - 1] + } + PolygonPriority::PolygonPriorityExpress => { + POLYGON_PREFERRED_GAS_PRICES_EXPRESS[POLYGON_PREFERRED_GAS_PRICES_EXPRESS.len() - 1] + } + }, + PolygonGasPriceMethod::PolygonGasPriceDynamic => get_polygon_max_gas_price_dynamic(), + } +} + +pub fn get_polygon_max_gas_price_dynamic() -> f64 { + std::env::var("POLYGON_MAX_GAS_PRICE_DYNAMIC") + .ok() + .and_then(|v| v.parse().ok()) + .unwrap_or(1000.0f64) +} + +pub fn get_polygon_gas_price_method() -> PolygonGasPriceMethod { + match std::env::var("POLYGON_GAS_PRICE_METHOD") + .ok() + .map(|v| v.to_lowercase()) + .as_ref() + .map(AsRef::as_ref) // Option<&str> + { + Some("static") => PolygonGasPriceMethod::PolygonGasPriceStatic, + Some("dynamic") => PolygonGasPriceMethod::PolygonGasPriceDynamic, + _ => PolygonGasPriceMethod::PolygonGasPriceDynamic, + } +} + +pub fn get_polygon_priority() -> PolygonPriority { + match std::env::var("POLYGON_PRIORITY") + .unwrap_or_else(|_| "default".to_string()) + .to_lowercase() + .as_str() + { + "slow" => PolygonPriority::PolygonPrioritySlow, + "fast" => PolygonPriority::PolygonPriorityFast, + "express" => PolygonPriority::PolygonPriorityExpress, + _ => PolygonPriority::PolygonPrioritySlow, + } +} + +pub async fn get_glm_balance(address: H160, network: Network) -> Result { + with_clients(network, |client| { + get_glm_balance_with(client, address, network) + }) + .await +} + +async fn get_glm_balance_with( + client: Web3, + address: H160, + network: Network, +) -> Result { + let env = get_env(network); + let glm_contract = prepare_erc20_contract(&client, &env)?; + glm_contract + .query( + BALANCE_ERC20_FUNCTION, + (address,), + None, + Options::default(), + None, + ) + .await + .map_err(Into::into) +} + +pub async fn get_balance(address: H160, network: Network) -> Result { + with_clients(network, |client| get_balance_with(address, client)).await +} + +async fn get_balance_with(address: H160, client: Web3) -> Result { + client + .eth() + .balance(address, None) + .await + .map_err(Into::into) +} + +pub async fn get_next_nonce_pending(address: H160, network: Network) -> Result { + with_clients(network, |client| { + get_next_nonce_pending_with(client, address) + }) + .await +} + +async fn get_next_nonce_pending_with( + client: Web3, + address: H160, +) -> Result { + client + .eth() + .transaction_count(address, Some(web3::types::BlockNumber::Pending)) + .await + .map_err(Into::into) +} + +pub async fn with_clients(network: Network, mut f: F) -> Result +where + F: FnMut(Web3) -> R, + R: futures::Future>, +{ + let clients = get_clients(network).await?; + let mut last_err: Option = None; + + for client in clients { + match f(client).await { + Ok(result) => return Ok(result), + Err(ClientError::Web3(e)) => match e { + Error::Internal | Error::Recovery(_) | Error::Rpc(_) | Error::Decoder(_) => { + return Err(GenericError::new(e)) + } + _ => continue, + }, + Err(e) => last_err.replace(e), + }; + } + + match last_err { + Some(e) => Err(e.into()), + _ => Err(GenericError::new("Web3 clients failed.")), + } +} + +pub async fn block_number(network: Network) -> Result { + with_clients(network, block_number_with).await +} + +async fn block_number_with(client: Web3) -> Result { + client.eth().block_number().await.map_err(Into::into) +} + +pub async fn sign_faucet_tx( + address: H160, + network: Network, + nonce: U256, +) -> Result { + with_clients(network, |client| { + sign_faucet_tx_with(client, address, network, nonce) + }) + .await +} + +async fn sign_faucet_tx_with( + client: Web3, + address: H160, + network: Network, + nonce: U256, +) -> Result { + let env = get_env(network); + let contract = prepare_glm_faucet_contract(&client, &env)?; + let contract = match contract { + Some(c) => c, + None => { + return Err(ClientError::new( + "Failed to get faucet fn, are you on the right network?", + )) + } + }; + + let data = eth_utils::contract_encode(&contract, CREATE_FAUCET_FUNCTION, ()).unwrap(); + let gas_price = client.eth().gas_price().await.map_err(GenericError::new)?; + let tx = YagnaRawTransaction { + nonce, + to: Some(contract.address()), + value: U256::from(0), + gas_price, + gas: *GLM_FAUCET_GAS, + data, + }; + //let chain_id = network as u64; + //let node_id = NodeId::from(address.as_ref()); + //let signature = bus::sign(node_id, eth_utils::get_tx_hash(&tx, chain_id)).await?; + + Ok(create_dao_entity( + nonce, + address, + gas_price.to_string(), + Some(gas_price.to_string()), + GLM_FAUCET_GAS.as_u32() as i32, + serde_json::to_string(&tx).map_err(GenericError::new)?, + network, + Utc::now(), + TxType::Faucet, + None, + )) +} + +pub async fn sign_raw_transfer_transaction( + address: H160, + network: Network, + tx: &YagnaRawTransaction, +) -> Result, GenericError> { + let chain_id = network as u64; + let node_id = NodeId::from(address.as_ref()); + let signature = bus::sign(node_id, eth_utils::get_tx_hash(tx, chain_id)).await?; + Ok(signature) +} + +pub async fn sign_hash_of_data(address: H160, hash: Vec) -> Result, GenericError> { + let node_id = NodeId::from(address.as_ref()); + + let signature = bus::sign(node_id, hash).await?; + Ok(signature) +} + +pub async fn prepare_raw_transaction( + _address: H160, + recipient: H160, + amount: U256, + network: Network, + nonce: U256, + gas_price_override: Option, + gas_limit_override: Option, +) -> Result { + with_clients(network, |client| { + prepare_raw_transaction_with( + client, + _address, + recipient, + amount, + network, + nonce, + gas_price_override, + gas_limit_override, + ) + }) + .await +} + +async fn prepare_raw_transaction_with( + client: Web3, + _address: H160, + recipient: H160, + amount: U256, + network: Network, + nonce: U256, + gas_price_override: Option, + gas_limit_override: Option, +) -> Result { + let env = get_env(network); + let contract = prepare_erc20_contract(&client, &env)?; + let data = eth_utils::contract_encode(&contract, TRANSFER_ERC20_FUNCTION, (recipient, amount)) + .map_err(GenericError::new)?; + + //get gas price from network in not provided + let gas_price = match gas_price_override { + Some(gas_price_new) => gas_price_new, + None => { + let small_gas_bump = U256::from(1000); + let mut gas_price_from_network = + client.eth().gas_price().await.map_err(GenericError::new)?; + + //add small amount of gas to be first in queue + if gas_price_from_network / 1000 > small_gas_bump { + gas_price_from_network += small_gas_bump; + } + gas_price_from_network + } + }; + + let gas_limit = match network { + Network::Polygon => gas_limit_override.map_or(*GLM_POLYGON_GAS_LIMIT, U256::from), + Network::Mumbai => gas_limit_override.map_or(*GLM_POLYGON_GAS_LIMIT, U256::from), + _ => gas_limit_override.map_or(*GLM_TRANSFER_GAS, U256::from), + }; + + let tx = YagnaRawTransaction { + nonce, + to: Some(contract.address()), + value: U256::from(0), + gas_price, + gas: gas_limit, + data, + }; + + Ok(tx) +} + +pub async fn send_tx(signed_tx: Vec, network: Network) -> Result { + with_clients(network, |client| send_tx_with(client, signed_tx.clone())).await +} + +async fn send_tx_with(client: Web3, signed_tx: Vec) -> Result { + client + .eth() + .send_raw_transaction(Bytes::from(signed_tx)) + .await + .map_err(Into::into) +} + +pub struct TransactionChainStatus { + pub exists_on_chain: bool, + pub pending: bool, + pub confirmed: bool, + pub succeeded: bool, + pub gas_used: Option, + pub gas_price: Option, +} + +pub async fn get_tx_on_chain_status( + tx_hash: H256, + current_block: Option, + network: Network, +) -> Result { + let mut res = TransactionChainStatus { + exists_on_chain: false, + pending: false, + confirmed: false, + succeeded: false, + gas_price: None, + gas_used: None, + }; + let env = get_env(network); + let tx = get_tx_receipt(tx_hash, network).await?; + if let Some(tx) = tx { + res.exists_on_chain = true; + res.gas_used = tx.gas_used; + const TRANSACTION_STATUS_SUCCESS: u64 = 1; + if tx.status == Some(ethereum_types::U64::from(TRANSACTION_STATUS_SUCCESS)) { + res.succeeded = true; + } + if let Some(tx_bn) = tx.block_number { + // TODO: Store tx.block_number in DB and check only once after required_confirmations. + log::trace!( + "is_tx_confirmed? tb + rq - 1 <= cb. tb={}, rq={}, cb={}", + tx_bn, + env.required_confirmations, + current_block.unwrap_or(0) + ); + // tx.block_number is the first confirmation, so we need to - 1 + if let Some(current_block) = current_block { + if tx_bn.as_u64() + env.required_confirmations - 1 <= current_block { + res.confirmed = true; + } + } + let transaction = get_tx_from_network(tx_hash, network).await?; + if let Some(t) = transaction { + res.gas_price = t.gas_price; + } + } else { + } + } else { + let transaction = get_tx_from_network(tx_hash, network).await?; + if let Some(_transaction) = transaction { + res.exists_on_chain = true; + res.pending = true; + } + } + Ok(res) +} + +//unused but tested that it is working for transfers +pub async fn decode_encoded_transaction_data( + network: Network, + encoded: &str, +) -> Result<(ethereum_types::Address, ethereum_types::U256), GenericError> { + with_clients(network, |client| { + decode_encoded_transaction_data_with(client, network, encoded) + }) + .await +} + +async fn decode_encoded_transaction_data_with( + client: Web3, + network: Network, + encoded: &str, +) -> Result<(ethereum_types::Address, ethereum_types::U256), ClientError> { + let env = get_env(network); + let contract = prepare_erc20_contract(&client, &env)?; + let raw_tx: YagnaRawTransaction = serde_json::from_str(encoded).map_err(GenericError::new)?; + + let tokens = eth_utils::contract_decode(&contract, TRANSFER_ERC20_FUNCTION, raw_tx.data) + .map_err(GenericError::new)?; + let mut address: Option = None; + let mut amount: Option = None; + for token in tokens { + match token { + Token::Address(val) => address = Some(val), + Token::Uint(am) => amount = Some(am), + _ => {} + }; + } + if let Some(add) = address { + if let Some(am) = amount { + return Ok((add, am)); + } + } + Err(GenericError::new("Failed to parse tokens").into()) +} + +pub async fn get_tx_from_network( + tx_hash: H256, + network: Network, +) -> Result, GenericError> { + with_clients(network, |client| get_tx_from_network_with(client, tx_hash)).await +} + +async fn get_tx_from_network_with( + client: Web3, + tx_hash: H256, +) -> Result, ClientError> { + client + .eth() + .transaction(TransactionId::from(tx_hash)) + .await + .map_err(Into::into) +} + +pub async fn get_tx_receipt( + tx_hash: H256, + network: Network, +) -> Result, GenericError> { + with_clients(network, |client| get_tx_receipt_with(client, tx_hash)).await +} + +async fn get_tx_receipt_with( + client: Web3, + tx_hash: H256, +) -> Result, ClientError> { + client + .eth() + .transaction_receipt(tx_hash) + .await + .map_err(Into::into) +} + +fn get_rpc_addr_from_env(network: Network) -> Vec { + match network { + Network::Mainnet => { + collect_rpc_addr_from("MAINNET_GETH_ADDR", "https://geth.golem.network:55555") + } + Network::Yatestnet => { + collect_rpc_addr_from("YATESTNET_GETH_ADDR", "https://yatestnet.org/web3/yagna") + } + Network::Rinkeby => collect_rpc_addr_from( + "RINKEBY_GETH_ADDR", + "http://geth.testnet.golem.network:55555", + ), + Network::Goerli => { + collect_rpc_addr_from("GOERLI_GETH_ADDR", "https://rpc.ankr.com/eth_goerli") + } + Network::Polygon => collect_rpc_addr_from( + "POLYGON_GETH_ADDR", + "https://bor.golem.network,https://polygon-rpc.com", + ), + Network::Mumbai => collect_rpc_addr_from( + "MUMBAI_GETH_ADDR", + "https://matic-mumbai.chainstacklabs.com", + ), + } +} + +fn collect_rpc_addr_from(env: &str, default: &str) -> Vec { + std::env::var(env) + .ok() + .unwrap_or_else(|| default.to_string()) + .split(',') + .map(|path| path.to_string()) + .collect() +} + +async fn get_clients(network: Network) -> Result>, GenericError> { + let geth_addrs = get_rpc_addr_from_env(network); + let mut clients: Vec> = Default::default(); + + for geth_addr in geth_addrs { + { + let client_map = WEB3_CLIENT_MAP.read().await; + if let Some(client) = client_map.get(&geth_addr).cloned() { + clients.push(client); + continue; + } + } + + let transport = match web3::transports::Http::new(&geth_addr) { + Ok(t) => t, + Err(_) => continue, + }; + + let client = Web3::new(transport); + + let mut client_map = WEB3_CLIENT_MAP.write().await; + client_map.insert(geth_addr, client.clone()); + + clients.push(client); + } + + Ok(clients) +} + +fn get_env(network: Network) -> config::EnvConfiguration { + match network { + Network::Mainnet => *config::MAINNET_CONFIG, + Network::Rinkeby => *config::RINKEBY_CONFIG, + Network::Goerli => *config::GOERLI_CONFIG, + Network::Mumbai => *config::MUMBAI_CONFIG, + Network::Yatestnet => *config::YATESTNET_CONFIG, + Network::Polygon => *config::POLYGON_MAINNET_CONFIG, + } +} + +fn prepare_contract( + ethereum_client: &Web3, + address: H160, + json_abi: &[u8], +) -> Result, GenericError> { + let contract = + Contract::from_json(ethereum_client.eth(), address, json_abi).map_err(GenericError::new)?; + + Ok(contract) +} + +fn prepare_erc20_contract( + ethereum_client: &Web3, + env: &config::EnvConfiguration, +) -> Result, GenericError> { + prepare_contract( + ethereum_client, + env.glm_contract_address, + include_bytes!("../contracts/ierc20.json"), + ) +} + +fn prepare_glm_faucet_contract( + ethereum_client: &Web3, + env: &config::EnvConfiguration, +) -> Result>, GenericError> { + if let Some(glm_faucet_address) = env.glm_faucet_address { + Ok(Some(prepare_contract( + ethereum_client, + glm_faucet_address, + include_bytes!("../contracts/faucet.json"), + )?)) + } else { + Ok(None) + } +} + +fn prepare_eip712_contract( + ethereum_client: &Web3, + env: &config::EnvConfiguration, +) -> Result, GenericError> { + prepare_contract( + ethereum_client, + env.glm_contract_address, + include_bytes!("../contracts/eip712.json"), + ) +} + +fn prepare_meta_transaction_contract( + ethereum_client: &Web3, + env: &config::EnvConfiguration, +) -> Result, GenericError> { + prepare_contract( + ethereum_client, + env.glm_contract_address, + include_bytes!("../contracts/meta_transaction.json"), + ) +} + +pub fn create_dao_entity( + nonce: U256, + sender: H160, + starting_gas_price: String, + max_gas_price: Option, + gas_limit: i32, + encoded_raw_tx: String, + network: Network, + timestamp: DateTime, + tx_type: TxType, + amount: Option, +) -> TransactionEntity { + let current_naive_time = timestamp.naive_utc(); + TransactionEntity { + tx_id: Uuid::new_v4().to_string(), + sender: format!("0x{:x}", sender), + nonce: nonce.as_u32() as i32, + time_created: current_naive_time, + time_last_action: current_naive_time, + time_sent: None, + time_confirmed: None, + max_gas_price, + final_gas_used: None, + amount_base: Some("0".to_string()), + amount_erc20: amount.as_ref().map(|a| big_dec_to_u256(a).to_string()), + gas_limit: Some(gas_limit), + starting_gas_price: Some(starting_gas_price), + current_gas_price: None, + encoded: encoded_raw_tx, + status: TransactionStatus::Created as i32, + tx_type: tx_type as i32, + signature: None, + tmp_onchain_txs: None, + final_tx: None, + network, + last_error_msg: None, + resent_times: 0, + } +} + +pub fn get_max_gas_costs(db_tx: &TransactionEntity) -> Result { + let raw_tx: YagnaRawTransaction = + serde_json::from_str(&db_tx.encoded).map_err(GenericError::new)?; + Ok(raw_tx.gas_price * raw_tx.gas) +} + +pub fn get_gas_price_from_db_tx(db_tx: &TransactionEntity) -> Result { + let raw_tx: YagnaRawTransaction = + serde_json::from_str(&db_tx.encoded).map_err(GenericError::new)?; + Ok(raw_tx.gas_price) +} + +pub async fn get_nonce_from_contract( + address: H160, + network: Network, +) -> Result { + let env = get_env(network); + + with_clients(network, |client| async move { + let meta_tx_contract = prepare_meta_transaction_contract(&client, &env)?; + let nonce: U256 = meta_tx_contract + .query( + GET_NONCE_FUNCTION, + (address,), + None, + Options::default(), + None, + ) + .await + .map_err(GenericError::new)?; + + Ok(nonce) + }) + .await +} + +pub async fn encode_transfer_abi( + recipient: H160, + amount: U256, + network: Network, +) -> Result, GenericError> { + let env = get_env(network); + with_clients(network, |client| async move { + let erc20_contract = prepare_erc20_contract(&client, &env)?; + let function_abi = eth_utils::contract_encode( + &erc20_contract, + TRANSFER_ERC20_FUNCTION, + (recipient, amount), + ) + .map_err(GenericError::new)?; + + Ok(function_abi) + }) + .await +} + +/// Creates EIP712 message for calling `function_abi` using contract's 'executeMetaTransaction' function +/// Message can be later signed, and send to the contract in order to make an indirect call. +pub async fn encode_meta_transaction_to_eip712( + sender: H160, + recipient: H160, + amount: U256, + nonce: U256, + function_abi: &[u8], + network: Network, +) -> Result, GenericError> { + info!("Creating meta tx for sender {sender:02X?}, recipient {recipient:02X?}, amount {amount:?}, nonce {nonce:?}, network {network:?}"); + + const META_TRANSACTION_SIGNATURE: &str = + "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"; + const MAGIC: [u8; 2] = [0x19, 0x1]; + + let env = get_env(network); + + with_clients(network, |client| async move { + let eip712_contract = prepare_eip712_contract(&client, &env)?; + let domain_separator: Vec = eip712_contract + .query( + GET_DOMAIN_SEPARATOR_FUNCTION, + (), + None, + Options::default(), + None, + ) + .await + .map_err(|e| GenericError::new(format!("Unable to query contract, reason: {e}")))?; + + let mut eip712_message = Vec::from(MAGIC); + + let abi_hash = H256::from_slice(&keccak256_hash(function_abi)); + let encoded_data = ethabi::encode(&(nonce, sender, abi_hash).into_tokens()); + + let type_hash = keccak256_hash(META_TRANSACTION_SIGNATURE.as_bytes()); + let hash_struct = keccak256_hash(&[type_hash, encoded_data].concat()); + + eip712_message.extend_from_slice(&domain_separator); + eip712_message.extend_from_slice(&hash_struct); + + debug!("full eip712 message: {eip712_message:02X?}"); + + Ok(eip712_message) + }) + .await +} + +#[cfg(test)] +mod tests { + use std::str::FromStr; + + use ethereum_types::U256; + + use super::*; + + #[tokio::test] + async fn test_create_gasless_message() { + let sender = H160::from_str("0xfeaed3f817169c012d040f05c6c52bce5740fc37").unwrap(); + let recipient = H160::from_str("0xd4EA255B238E214A9A0E5656eC36Fe27CD14adAC").unwrap(); + let amount: U256 = U256::from_dec_str("12300000000000").unwrap(); + let nonce = U256::from(27u32); + let network = Network::Polygon; + + let transfer_abi = encode_transfer_abi(recipient, amount, network) + .await + .unwrap(); + let encoded_meta_transfer = encode_meta_transaction_to_eip712( + sender, + recipient, + amount, + nonce, + &transfer_abi, + network, + ) + .await + .unwrap(); + + assert_eq!(hex::encode(transfer_abi), "a9059cbb000000000000000000000000d4ea255b238e214a9a0e5656ec36fe27cd14adac00000000000000000000000000000000000000000000000000000b2fd1217800"); + assert_eq!(hex::encode(encoded_meta_transfer), "1901804e8c6f5926bd56018ff8fa95b472e09d8b3612bf1b892f2d5e5f4365a5e95e7bc74d293cbaa554151b05ad958d04d7c19f2552a6315fe4a99f6aef60a887fd"); + } +} diff --git a/core/payment-driver/erc20next/src/erc20/faucet.rs b/core/payment-driver/erc20next/src/erc20/faucet.rs new file mode 100644 index 0000000000..9eefce63df --- /dev/null +++ b/core/payment-driver/erc20next/src/erc20/faucet.rs @@ -0,0 +1,176 @@ +/* + Top up new accounts from the rinkeby erc20 faucet and wait for the funds to arive. +*/ + +// External crates +use bigdecimal::{BigDecimal, FromPrimitive}; +use chrono::{Duration, Utc}; +use lazy_static::lazy_static; +use std::{env, time}; +use tokio::time::sleep; +use web3::types::{H160, U256}; + +// Workspace uses +use ya_payment_driver::{db::models::Network, model::GenericError, utils}; +use ya_utils_networking::resolver; + +// Local uses +use crate::dao::Erc20Dao; +use crate::erc20::{ethereum, wallet}; + +const DEFAULT_FAUCET_SRV_PREFIX: &str = "_eth-faucet._tcp"; +const DEFAULT_ETH_FAUCET_HOST: &str = "faucet.testnet.golem.network"; +const FAUCET_ADDR_ENVAR: &str = "ETH_FAUCET_ADDRESS"; +const MAX_FAUCET_REQUESTS: u32 = 6; + +lazy_static! { + static ref MIN_GLM_BALANCE: U256 = utils::big_dec_to_u256(&BigDecimal::from(50)); + static ref MIN_ETH_BALANCE: U256 = + utils::big_dec_to_u256(&BigDecimal::from_f64(0.005).unwrap()); + static ref MAX_WAIT: Duration = Duration::minutes(1); +} + +pub async fn request_glm( + dao: &Erc20Dao, + address: H160, + network: Network, +) -> Result<(), GenericError> { + let str_addr = format!("0x{:x}", address); + let balance = ethereum::get_balance(address, network).await?; + if balance >= *MIN_ETH_BALANCE { + log::info!("Enough tETH balance."); + } else { + log::info!( + "Requesting tETH from erc20 faucet... address = {}", + &str_addr + ); + + for i in 0..MAX_FAUCET_REQUESTS { + match faucet_donate(address, network).await { + Ok(()) => break, + Err(e) => { + // Do not warn nor sleep at the last try. + if i >= MAX_FAUCET_REQUESTS - 1 { + log::error!( + "Failed to request tGLM from Faucet, tried {} times.: {:?}", + MAX_FAUCET_REQUESTS, + e + ); + return Err(e); + } else { + log::warn!( + "Retrying ({}/{}) to request tGLM from Faucet after failure: {:?}", + i + 1, + MAX_FAUCET_REQUESTS, + e + ); + sleep(time::Duration::from_secs(10)).await; + } + } + } + } + wait_for_eth(address, network).await?; + } + let glm_balance = ethereum::get_glm_balance(address, network).await?; + + if glm_balance >= *MIN_GLM_BALANCE { + log::info!("Enough tGLM balance."); + return Ok(()); + } + let pending = dao.get_pending_faucet_txs(&str_addr, network).await; + if !pending.is_empty() { + log::info!("Already pending a mint transactin."); + return Ok(()); + } + log::info!( + "Requesting tGLM from erc20 faucet... address = {}", + &str_addr + ); + + let nonce = wallet::get_next_nonce(dao, address, network).await?; + let db_tx = ethereum::sign_faucet_tx(address, network, nonce).await?; + // After inserting into the database, the tx will get send by the send_payments job + dao.insert_raw_transaction(db_tx).await; + + // Wait for tx to get mined: + // - send_payments job runs every 10 seconds + // - blocks are mined every 15 seconds + sleep(time::Duration::from_secs(10)).await; + + wait_for_glm(address, network).await?; + + Ok(()) +} + +async fn wait_for_eth(address: H160, network: Network) -> Result<(), GenericError> { + log::info!("Waiting for tETH from faucet..."); + let wait_until = Utc::now() + *MAX_WAIT; + while Utc::now() < wait_until { + if ethereum::get_balance(address, network).await? >= *MIN_ETH_BALANCE { + log::info!("Received tETH from faucet."); + return Ok(()); + } + sleep(time::Duration::from_secs(3)).await; + } + let msg = "Waiting for tETH timed out."; + log::error!("{}", msg); + Err(GenericError::new(msg)) +} + +async fn wait_for_glm(address: H160, network: Network) -> Result<(), GenericError> { + log::info!("Waiting for tGLM from faucet..."); + let wait_until = Utc::now() + *MAX_WAIT; + while Utc::now() < wait_until { + if ethereum::get_glm_balance(address, network).await? >= *MIN_GLM_BALANCE { + log::info!("Received tGLM from faucet."); + return Ok(()); + } + sleep(time::Duration::from_secs(3)).await; + } + let msg = "Waiting for tGLM timed out."; + log::error!("{}", msg); + Err(GenericError::new(msg)) +} + +async fn faucet_donate(address: H160, network: Network) -> Result<(), GenericError> { + // TODO: Reduce timeout to 20-30 seconds when transfer is used. + let client = awc::Client::builder() + .timeout(std::time::Duration::from_secs(60)) + .finish(); + let faucet_url = resolve_faucet_url(network).await?; + let request_url = format!("{}/0x{:x}", faucet_url, address); + let request_url = resolver::try_resolve_dns_record(&request_url).await; + debug!("Faucet request url: {}", request_url); + let response = client + .get(request_url) + .send() + .await + .map_err(GenericError::new)? + .body() + .await + .map_err(GenericError::new)?; + let response = String::from_utf8_lossy(response.as_ref()); + log::debug!("Funds requested. Response = {}", response); + // TODO: Verify tx hash + Ok(()) +} + +async fn resolve_faucet_url(network: Network) -> Result { + match env::var(FAUCET_ADDR_ENVAR) { + Ok(addr) => Ok(addr), + _ => { + let faucet_host = resolver::resolve_yagna_srv_record(DEFAULT_FAUCET_SRV_PREFIX) + .await + .unwrap_or_else(|_| DEFAULT_ETH_FAUCET_HOST.to_string()); + + let port = match network { + Network::Mumbai => 4002, + Network::Goerli => 4001, + Network::Rinkeby => 4000, + _ => return Err(GenericError::new("faucet not defined")), + }; + + Ok(format!("http://{faucet_host}:{port}/donate")) + } + } +} diff --git a/core/payment-driver/erc20next/src/erc20/mod.rs b/core/payment-driver/erc20next/src/erc20/mod.rs new file mode 100644 index 0000000000..5900681925 --- /dev/null +++ b/core/payment-driver/erc20next/src/erc20/mod.rs @@ -0,0 +1,12 @@ +/* + Private mod to encapsulate all erc20 logic, revealed from the `wallet`. +*/ + +pub mod ethereum; +pub mod faucet; +pub mod utils; +pub mod wallet; + +mod config; +pub mod eth_utils; +pub mod transaction; diff --git a/core/payment-driver/erc20next/src/erc20/transaction.rs b/core/payment-driver/erc20next/src/erc20/transaction.rs new file mode 100644 index 0000000000..f204918ce5 --- /dev/null +++ b/core/payment-driver/erc20next/src/erc20/transaction.rs @@ -0,0 +1,19 @@ +use ethereum_types::{H160, U256}; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Default, Clone, PartialEq, Eq, Deserialize, Serialize)] +pub struct YagnaRawTransaction { + /// Nonce value + pub nonce: U256, + /// Recipient, None when creating contract + pub to: Option, + /// Transferred value + pub value: U256, + /// Gas price + #[serde(rename = "gasPrice")] + pub gas_price: U256, + /// Gas amount + pub gas: U256, + /// Transaction data + pub data: Vec, +} diff --git a/core/payment-driver/erc20next/src/erc20/utils.rs b/core/payment-driver/erc20next/src/erc20/utils.rs new file mode 100644 index 0000000000..1eea29112e --- /dev/null +++ b/core/payment-driver/erc20next/src/erc20/utils.rs @@ -0,0 +1,91 @@ +/* + Erc20 related utilities. +*/ + +use std::str::FromStr; + +// External uses +use bigdecimal::BigDecimal; +use lazy_static::lazy_static; +use num_bigint::{BigInt, BigUint, ToBigInt}; +use web3::types::{Address, H160, H256, U256}; +// Workspace uses +use ya_payment_driver::model::GenericError; + +lazy_static! { + // TODO: Get token decimals from erc20-provider / wallet + pub static ref PRECISION: BigDecimal = BigDecimal::from(1_000_000_000_000_000_000u64); + pub static ref GWEI_PRECISION: BigDecimal = BigDecimal::from(1_000_000_000u64); +} + +pub fn big_dec_to_u256(v: &BigDecimal) -> Result { + let v = v * &(*PRECISION); + let v = v + .to_bigint() + .ok_or_else(|| GenericError::new("Failed to convert to bigint"))?; + let v = &v.to_string(); + U256::from_dec_str(v).map_err(GenericError::new) +} + +pub fn big_dec_gwei_to_u256(v: BigDecimal) -> Result { + let v = v * &(*GWEI_PRECISION); + let v = v + .to_bigint() + .ok_or_else(|| GenericError::new("Failed to convert to bigint"))?; + let v = &v.to_string(); + U256::from_dec_str(v).map_err(GenericError::new) +} + +pub fn u256_to_big_dec(v: U256) -> Result { + let v: BigDecimal = v.to_string().parse().map_err(GenericError::new)?; + Ok(v / &(*PRECISION)) +} + +pub fn big_uint_to_big_dec(v: BigUint) -> BigDecimal { + let v: BigDecimal = Into::::into(v).into(); + v / &(*PRECISION) +} + +pub fn topic_to_str_address(topic: &H256) -> String { + let result = H160::from_slice(&topic.as_bytes()[12..]); + format!("0x{:x}", result) +} + +pub fn str_to_big_dec(v: &str) -> Result { + let v: BigDecimal = BigDecimal::from_str(v).map_err(GenericError::new)?; + Ok(v) +} + +pub fn str_to_addr(addr: &str) -> Result { + match addr.trim_start_matches("0x").parse() { + Ok(addr) => Ok(addr), + Err(_e) => Err(GenericError::new(format!( + "Unable to parse address {}", + addr + ))), + } +} + +pub fn convert_float_gas_to_u256(gas_in_gwei: f64) -> U256 { + let gas_in_wei = gas_in_gwei * 1.0E9; + let gas_in_wei_int = gas_in_wei as u64; + U256::from(gas_in_wei_int) +} +pub fn convert_u256_gas_to_float(gas_in_wei: U256) -> f64 { + let gas_in_wei = gas_in_wei.as_u64() as f64; + + gas_in_wei * 1.0E-9 +} + +pub fn gas_float_equals(gas_value1: f64, gas_value2: f64) -> bool { + if gas_value1 > 0.0 + && gas_value2 > 0.0 + && (gas_value1 - gas_value2).abs() / (gas_value1 + gas_value2) < 0.0001 + { + return true; + } + if gas_value1 == 0.0 && gas_value2 == 0.0 { + return true; + } + false +} diff --git a/core/payment-driver/erc20next/src/erc20/wallet.rs b/core/payment-driver/erc20next/src/erc20/wallet.rs new file mode 100644 index 0000000000..08b18f1ad2 --- /dev/null +++ b/core/payment-driver/erc20next/src/erc20/wallet.rs @@ -0,0 +1,455 @@ +/* + Wallet functions on erc20. +*/ + +// External crates +use crate::erc20::ethereum::{ + get_polygon_gas_price_method, get_polygon_maximum_price, get_polygon_priority, + get_polygon_starting_price, PolygonGasPriceMethod, PolygonPriority, + POLYGON_PREFERRED_GAS_PRICES_EXPRESS, POLYGON_PREFERRED_GAS_PRICES_FAST, + POLYGON_PREFERRED_GAS_PRICES_SLOW, +}; +use bigdecimal::BigDecimal; +use chrono::Utc; +use num_bigint::BigUint; +use std::str::FromStr; +use web3::types::{H160, H256, U256, U64}; + +// Workspace uses +use ya_payment_driver::{ + db::models::{Network, TransactionEntity, TxType}, + model::{GenericError, Init, PaymentDetails}, +}; + +// Local uses +use crate::erc20::transaction::YagnaRawTransaction; +use crate::{ + dao::Erc20Dao, + erc20::{ + eth_utils, ethereum, faucet, + utils::{ + big_dec_gwei_to_u256, big_dec_to_u256, big_uint_to_big_dec, convert_float_gas_to_u256, + convert_u256_gas_to_float, str_to_addr, topic_to_str_address, u256_to_big_dec, + }, + }, + RINKEBY_NETWORK, +}; +use ya_payment_driver::db::models::TransactionStatus; + +pub async fn account_balance(address: H160, network: Network) -> Result { + let balance_com = ethereum::get_glm_balance(address, network).await?; + + let balance = u256_to_big_dec(balance_com)?; + log::debug!( + "account_balance. address={}, network={}, balance={}", + address, + &network, + &balance + ); + + Ok(balance) +} + +pub async fn account_gas_balance( + address: H160, + network: Network, +) -> Result { + let balance_com = ethereum::get_balance(address, network).await?; + let balance = u256_to_big_dec(balance_com)?; + + log::debug!( + "account_gas_balance. address={}, network={}, balance={}", + address, + &network, + &balance + ); + + Ok(balance) +} + +pub async fn init_wallet(msg: &Init) -> Result<(), GenericError> { + log::debug!("init_wallet. msg={:?}", msg); + let address = msg.address(); + let network = msg.network().unwrap_or_else(|| RINKEBY_NETWORK.to_string()); + let network = Network::from_str(&network).map_err(GenericError::new)?; + + // Validate address and that checking balance of GLM and ETH works. + let h160_addr = str_to_addr(&address)?; + let _glm_balance = ethereum::get_glm_balance(h160_addr, network).await?; + let _eth_balance = ethereum::get_balance(h160_addr, network).await?; + + Ok(()) +} + +pub async fn fund(dao: &Erc20Dao, address: H160, network: Network) -> Result<(), GenericError> { + if network == Network::Mainnet { + return Err(GenericError::new("Wallet can not be funded on mainnet.")); + } + faucet::request_glm(dao, address, network).await?; + Ok(()) +} + +pub async fn get_next_nonce( + dao: &Erc20Dao, + address: H160, + network: Network, +) -> Result { + let network_nonce = ethereum::get_next_nonce_pending(address, network).await?; + let str_addr = format!("0x{:x}", &address); + let db_nonce = dao.get_next_nonce(&str_addr, network).await?; + + if db_nonce > network_nonce { + warn!( + "Network nonce different than db nonce: {} != {}", + network_nonce, db_nonce + ); + return Ok(db_nonce); + } + + Ok(network_nonce) +} + +pub async fn has_enough_eth_for_gas( + db_tx: &TransactionEntity, + network: Network, +) -> Result { + let sender_h160 = str_to_addr(&db_tx.sender)?; + let eth_balance = ethereum::get_balance(sender_h160, network).await?; + let gas_costs = ethereum::get_max_gas_costs(db_tx)?; + let gas_price = ethereum::get_gas_price_from_db_tx(db_tx)?; + let human_gas_cost = u256_to_big_dec(gas_costs)?; + let human_gas_price = convert_u256_gas_to_float(gas_price); + if gas_costs > eth_balance { + return Err(GenericError::new(format!( + "Not enough ETH balance for gas. balance={}, gas_cost={}, gas_price={} Gwei, address={}, network={}", + u256_to_big_dec(eth_balance)?, + &human_gas_cost, + &human_gas_price, + &db_tx.sender, + &db_tx.network + ))); + } + Ok(human_gas_cost) +} + +pub async fn get_block_number(network: Network) -> Result { + ethereum::block_number(network).await +} + +pub async fn make_transfer( + details: &PaymentDetails, + nonce: U256, + network: Network, + gas_price: Option, + max_gas_price: Option, + gas_limit: Option, +) -> Result { + log::debug!( + "make_transfer(). network={}, nonce={}, details={:?}", + &network, + &nonce, + &details + ); + let amount_big_dec = details.amount.clone(); + let amount = big_dec_to_u256(&amount_big_dec)?; + + let (gas_price, max_gas_price) = match network { + Network::Polygon => match get_polygon_gas_price_method() { + PolygonGasPriceMethod::PolygonGasPriceStatic => ( + Some(match gas_price { + Some(v) => big_dec_gwei_to_u256(v)?, + None => convert_float_gas_to_u256(get_polygon_starting_price()), + }), + Some(match max_gas_price { + Some(v) => big_dec_gwei_to_u256(v)?, + None => convert_float_gas_to_u256(get_polygon_maximum_price()), + }), + ), + PolygonGasPriceMethod::PolygonGasPriceDynamic => ( + match gas_price { + None => None, + Some(v) => Some(big_dec_gwei_to_u256(v)?), + }, + Some(match max_gas_price { + Some(v) => big_dec_gwei_to_u256(v)?, + None => convert_float_gas_to_u256(get_polygon_maximum_price()), + }), + ), + }, + _ => ( + match gas_price { + None => None, + Some(v) => Some(big_dec_gwei_to_u256(v)?), + }, + match max_gas_price { + None => None, + Some(v) => Some(big_dec_gwei_to_u256(v)?), + }, + ), + }; + + let address = str_to_addr(&details.sender)?; + let recipient = str_to_addr(&details.recipient)?; + // TODO: Implement token + //let token = get_network_token(network, None); + let mut raw_tx = ethereum::prepare_raw_transaction( + address, recipient, amount, network, nonce, gas_price, gas_limit, + ) + .await?; + + if let Some(max_gas_price) = max_gas_price { + if raw_tx.gas_price > max_gas_price { + raw_tx.gas_price = max_gas_price; + } + } + + Ok(ethereum::create_dao_entity( + nonce, + address, + raw_tx.gas_price.to_string(), + max_gas_price.map(|v| v.to_string()), + raw_tx.gas.as_u32() as i32, + serde_json::to_string(&raw_tx).map_err(GenericError::new)?, + network, + Utc::now(), + TxType::Transfer, + Some(amount_big_dec), + )) +} + +fn bump_gas_price(gas_in_gwei: U256) -> U256 { + let min_bump_num: U256 = U256::from(111u64); + let min_bump_den: U256 = U256::from(100u64); + let min_gas = gas_in_gwei * min_bump_num / min_bump_den; + + match get_polygon_gas_price_method() { + PolygonGasPriceMethod::PolygonGasPriceDynamic => { + //ignore maximum gas price, because we have to bump at least 10% so the transaction will be accepted + min_gas + } + PolygonGasPriceMethod::PolygonGasPriceStatic => { + let polygon_prices = get_polygon_priority(); + + let gas_prices: &[f64] = match polygon_prices { + PolygonPriority::PolygonPriorityExpress => { + &POLYGON_PREFERRED_GAS_PRICES_EXPRESS[..] + } + PolygonPriority::PolygonPriorityFast => &POLYGON_PREFERRED_GAS_PRICES_FAST[..], + PolygonPriority::PolygonPrioritySlow => &POLYGON_PREFERRED_GAS_PRICES_SLOW[..], + }; + + gas_prices + .iter() + .map(|&f| convert_float_gas_to_u256(f)) + .find(|&gas_price_step| gas_price_step > min_gas) + .unwrap_or(min_gas) + } + } +} + +pub async fn send_transactions( + dao: &Erc20Dao, + txs: Vec, + network: Network, +) -> Result<(), GenericError> { + // TODO: Use batch sending? + for tx in txs { + let mut raw_tx: YagnaRawTransaction = + match serde_json::from_str::(&tx.encoded) { + Ok(raw_tx) => raw_tx, + Err(err) => { + log::error!( + "send_transactions - YagnaRawTransaction serialization failed: {:?}", + err + ); + //handle problem when deserializing transaction + dao.transaction_confirmed_and_failed( + &tx.tx_id, + "", + None, + "Json parse failed, unrecoverable error", + ) + .await; + continue; + } + }; + + let address = str_to_addr(&tx.sender)?; + + let new_gas_price = if let Some(current_gas_price) = tx.current_gas_price { + if tx.status == TransactionStatus::ResendAndBumpGas as i32 { + let gas_u256 = U256::from_dec_str(¤t_gas_price).map_err(GenericError::new)?; + + let max_gas_u256 = match tx.max_gas_price { + Some(max_gas_price) => { + Some(U256::from_dec_str(&max_gas_price).map_err(GenericError::new)?) + } + None => None, + }; + let new_gas = bump_gas_price(gas_u256); + if let Some(max_gas_u256) = max_gas_u256 { + if gas_u256 > max_gas_u256 { + log::warn!( + "bump gas ({}) larger than max gas ({}) price", + gas_u256, + max_gas_u256 + ) + } + } + new_gas + } else { + U256::from_dec_str(¤t_gas_price).map_err(GenericError::new)? + } + } else if let Some(starting_gas_price) = tx.starting_gas_price { + U256::from_dec_str(&starting_gas_price).map_err(GenericError::new)? + } else { + convert_float_gas_to_u256(get_polygon_starting_price()) + }; + raw_tx.gas_price = new_gas_price; + + let encoded = serde_json::to_string(&raw_tx).map_err(GenericError::new)?; + let signature = ethereum::sign_raw_transfer_transaction(address, network, &raw_tx).await?; + + //save new parameters to db before proceeding. Maybe we should change status to sending + dao.update_tx_fields( + &tx.tx_id, + encoded, + hex::encode(&signature), + Some(new_gas_price.to_string()), + ) + .await; + + let signed = eth_utils::encode_signed_tx(&raw_tx, signature, network as u64); + + match ethereum::send_tx(signed, network).await { + Ok(tx_hash) => { + let str_tx_hash = format!("0x{:x}", &tx_hash); + let str_tx_hash = if let Some(tmp_onchain_txs) = tx.tmp_onchain_txs { + tmp_onchain_txs + ";" + str_tx_hash.as_str() + } else { + str_tx_hash + }; + dao.transaction_sent(&tx.tx_id, &str_tx_hash, Some(raw_tx.gas_price.to_string())) + .await; + log::info!("Send transaction. hash={}", &str_tx_hash); + log::debug!("id={}", &tx.tx_id); + } + Err(e) => { + log::error!( + "Error sending transaction {:?}@{:?}: {:?}", + tx.tx_id, + network, + e + ); + if e.to_string().contains("nonce too low") { + if tx.tmp_onchain_txs.filter(|v| !v.is_empty()).is_some() && tx.resent_times < 5 + { + //if tmp on-chain tx transactions exist give it a chance but marking it as failed sent + dao.transaction_failed_send( + &tx.tx_id, + tx.resent_times + 1, + e.to_string().as_str(), + ) + .await; + continue; + } else { + //if trying to sent transaction too much times just end with unrecoverable error + log::error!("Nonce too low: {:?}", e); + dao.transaction_failed_with_nonce_too_low( + &tx.tx_id, + e.to_string().as_str(), + ) + .await; + continue; + } + } + if e.to_string().contains("already known") { + log::error!("Already known: {:?}. Send transaction with higher gas to get from this error loop. (resent won't fix anything)", e); + dao.retry_send_transaction(&tx.tx_id, true).await; + continue; + } + + dao.transaction_failed_send(&tx.tx_id, tx.resent_times, e.to_string().as_str()) + .await; + } + } + } + Ok(()) +} + +// TODO: calculate fee. Below commented out reference to zkSync implementation +// pub async fn get_tx_fee(address: &str, network: Network) -> Result { +// // let token = get_network_token(network, None); +// // let wallet = get_wallet(&address, network).await?; +// // let tx_fee = wallet +// // .provider +// // .get_tx_fee(TxFeeTypes::Transfer, wallet.address(), token.as_str()) +// // .await +// // .map_err(GenericError::new)? +// // .total_fee; +// // let tx_fee_bigdec = utils::big_uint_to_big_dec(tx_fee); +// // +// // log::debug!("Transaction fee {:.5} {}", tx_fee_bigdec, token.as_str()); +// // Ok(tx_fee_bigdec) +// todo!(); +// } + +pub async fn verify_tx(tx_hash: &str, network: Network) -> Result { + log::debug!("verify_tx. hash={}", tx_hash); + let hex_hash = H256::from_str(&tx_hash[2..]).map_err(|err| { + log::warn!("tx hash failed to parse: {}", tx_hash); + GenericError::new(err) + })?; + let tx = ethereum::get_tx_receipt(hex_hash, network) + .await + .map_err(|err| { + log::warn!( + "Failed to obtain tx receipt from blockchain network: {}", + hex_hash + ); + err + })?; + + if let Some(tx) = tx { + // TODO: Properly parse logs after https://github.com/tomusdrw/rust-web3/issues/208 + // let tx_log = tx.logs.get(0).unwrap_or_else(|| GenericError::new(format!("Failure when parsing tx: {} ", tx_hash)))?; + + let tx_log = tx.logs.get(0).ok_or_else(|| { + GenericError::new(format!("Failure when parsing tx.logs.get(0): {} ", tx_hash)) + })?; + let (topic1, topic2) = match tx_log.topics.as_slice() { + [_, t1, t2] => (t1, t2), + _ => { + return Err(GenericError::new(format!( + "Failure when parsing tx_log.topics.get(1): {} ", + tx_hash + ))) + } + }; + + let sender = topic_to_str_address(topic1); + let recipient = topic_to_str_address(topic2); + + let amount = big_uint_to_big_dec(BigUint::from_bytes_be(&tx_log.data.0)); + + if let Some(_block_number) = tx_log.block_number { + // TODO: Get date from block + } + let date = Some(chrono::Utc::now()); + + let details = PaymentDetails { + recipient, + sender, + amount, + date, + }; + log::debug!("PaymentDetails from blockchain: {:?}", &details); + + Ok(details) + } else { + Err(GenericError::new(format!( + "Transaction {} not found on chain", + tx_hash + ))) + } +} diff --git a/core/payment-driver/erc20next/src/lib.rs b/core/payment-driver/erc20next/src/lib.rs new file mode 100644 index 0000000000..e6f370edfc --- /dev/null +++ b/core/payment-driver/erc20next/src/lib.rs @@ -0,0 +1,57 @@ +/* + Payment driver for yagna using erc20. + + This file only contains constants and imports. +*/ + +// Public +pub const DRIVER_NAME: &str = "erc20"; + +pub const RINKEBY_NETWORK: &str = "rinkeby"; +pub const RINKEBY_TOKEN: &str = "tGLM"; +pub const RINKEBY_PLATFORM: &str = "erc20-rinkeby-tglm"; +pub const RINKEBY_CURRENCY_SHORT: &str = "tETH"; +pub const RINKEBY_CURRENCY_LONG: &str = "Rinkeby Ether"; + +pub const GOERLI_NETWORK: &str = "goerli"; +pub const GOERLI_TOKEN: &str = "tGLM"; +pub const GOERLI_PLATFORM: &str = "erc20-goerli-tglm"; +pub const GOERLI_CURRENCY_SHORT: &str = "tETH"; +pub const GOERLI_CURRENCY_LONG: &str = "Goerli Ether"; + +pub const YATESTNET_NETWORK: &str = "yatestnet"; +pub const YATESTNET_TOKEN: &str = "tGLM"; +pub const YATESTNET_PLATFORM: &str = "erc20-yatestnet-tglm"; +pub const YATESTNET_CURRENCY_SHORT: &str = "tETH"; +pub const YATESTNET_CURRENCY_LONG: &str = "Test Ether"; + +pub const MUMBAI_NETWORK: &str = "mumbai"; +pub const MUMBAI_TOKEN: &str = "tGLM"; +pub const MUMBAI_PLATFORM: &str = "erc20-mumbai-tglm"; +pub const MUMBAI_CURRENCY_SHORT: &str = "tMATIC"; +pub const MUMBAI_CURRENCY_LONG: &str = "Test MATIC"; + +pub const MAINNET_NETWORK: &str = "mainnet"; +pub const MAINNET_TOKEN: &str = "GLM"; +pub const MAINNET_PLATFORM: &str = "erc20-mainnet-glm"; +pub const MAINNET_CURRENCY_SHORT: &str = "ETH"; +pub const MAINNET_CURRENCY_LONG: &str = "Ether"; + +pub const POLYGON_MAINNET_NETWORK: &str = "polygon"; +pub const POLYGON_MAINNET_TOKEN: &str = "GLM"; +pub const POLYGON_MAINNET_PLATFORM: &str = "erc20-polygon-glm"; +pub const POLYGON_MAINNET_CURRENCY_SHORT: &str = "MATIC"; +pub const POLYGON_MAINNET_CURRENCY_LONG: &str = "Polygon"; + +pub use service::Erc20NextService as PaymentDriverService; + +// Private +#[macro_use] +extern crate log; + +mod dao; +mod driver; +pub mod erc20; +mod network; +mod service; +mod signer; diff --git a/core/payment-driver/erc20next/src/network.rs b/core/payment-driver/erc20next/src/network.rs new file mode 100644 index 0000000000..e765568ac1 --- /dev/null +++ b/core/payment-driver/erc20next/src/network.rs @@ -0,0 +1,130 @@ +use maplit::hashmap; +use std::collections::HashMap; +use std::str::FromStr; + +// Workspace uses +use ya_payment_driver::{db::models::Network as DbNetwork, driver::Network, model::GenericError}; + +// Local uses +use crate::{ + GOERLI_CURRENCY_LONG, GOERLI_CURRENCY_SHORT, GOERLI_NETWORK, GOERLI_PLATFORM, GOERLI_TOKEN, + MAINNET_CURRENCY_LONG, MAINNET_CURRENCY_SHORT, MAINNET_NETWORK, MAINNET_PLATFORM, + MAINNET_TOKEN, MUMBAI_CURRENCY_LONG, MUMBAI_CURRENCY_SHORT, MUMBAI_NETWORK, MUMBAI_PLATFORM, + MUMBAI_TOKEN, POLYGON_MAINNET_CURRENCY_LONG, POLYGON_MAINNET_CURRENCY_SHORT, + POLYGON_MAINNET_NETWORK, POLYGON_MAINNET_PLATFORM, POLYGON_MAINNET_TOKEN, + RINKEBY_CURRENCY_LONG, RINKEBY_CURRENCY_SHORT, RINKEBY_NETWORK, RINKEBY_PLATFORM, + RINKEBY_TOKEN, YATESTNET_CURRENCY_LONG, YATESTNET_CURRENCY_SHORT, YATESTNET_NETWORK, + YATESTNET_PLATFORM, YATESTNET_TOKEN, +}; + +lazy_static::lazy_static! { + pub static ref SUPPORTED_NETWORKS: HashMap = hashmap! { + RINKEBY_NETWORK.to_string() => Network { + default_token: RINKEBY_TOKEN.to_string(), + tokens: hashmap! { + RINKEBY_TOKEN.to_string() => RINKEBY_PLATFORM.to_string() + } + }, + GOERLI_NETWORK.to_string() => Network { + default_token: GOERLI_TOKEN.to_string(), + tokens: hashmap! { + GOERLI_TOKEN.to_string() => GOERLI_PLATFORM.to_string() + } + }, + MAINNET_NETWORK.to_string() => Network { + default_token: MAINNET_TOKEN.to_string(), + tokens: hashmap! { + MAINNET_TOKEN.to_string() => MAINNET_PLATFORM.to_string() + } + }, + YATESTNET_NETWORK.to_string() => Network { + default_token: YATESTNET_TOKEN.to_string(), + tokens: hashmap! { + YATESTNET_TOKEN.to_string() => YATESTNET_PLATFORM.to_string() + } + }, + MUMBAI_NETWORK.to_string() => Network { + default_token: MUMBAI_TOKEN.to_string(), + tokens: hashmap! { + MUMBAI_TOKEN.to_string() => MUMBAI_PLATFORM.to_string() + } + }, + POLYGON_MAINNET_NETWORK.to_string() => Network { + default_token: POLYGON_MAINNET_TOKEN.to_string(), + tokens: hashmap! { + POLYGON_MAINNET_TOKEN.to_string() => POLYGON_MAINNET_PLATFORM.to_string() + } + } + }; + pub static ref RINKEBY_DB_NETWORK: DbNetwork = DbNetwork::from_str(RINKEBY_NETWORK).unwrap(); + pub static ref GOERLI_DB_NETWORK: DbNetwork = DbNetwork::from_str(GOERLI_NETWORK).unwrap(); + pub static ref MAINNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(MAINNET_NETWORK).unwrap(); + pub static ref MUMBAI_DB_NETWORK: DbNetwork = DbNetwork::from_str(MUMBAI_NETWORK).unwrap(); + pub static ref POLYGON_MAINNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(POLYGON_MAINNET_NETWORK).unwrap(); + pub static ref YATESTNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(YATESTNET_NETWORK).unwrap(); +} + +pub fn platform_to_network_token(platform: String) -> Result<(DbNetwork, String), GenericError> { + match platform.as_str() { + RINKEBY_PLATFORM => Ok((*RINKEBY_DB_NETWORK, RINKEBY_TOKEN.to_owned())), + GOERLI_PLATFORM => Ok((*GOERLI_DB_NETWORK, GOERLI_TOKEN.to_owned())), + MAINNET_PLATFORM => Ok((*MAINNET_DB_NETWORK, MAINNET_TOKEN.to_owned())), + MUMBAI_PLATFORM => Ok((*MUMBAI_DB_NETWORK, MUMBAI_TOKEN.to_owned())), + YATESTNET_PLATFORM => Ok((*YATESTNET_DB_NETWORK, YATESTNET_TOKEN.to_owned())), + POLYGON_MAINNET_PLATFORM => Ok(( + *POLYGON_MAINNET_DB_NETWORK, + POLYGON_MAINNET_TOKEN.to_owned(), + )), + other => Err(GenericError::new(format!( + "Unable to find network for platform: {}", + other + ))), + } +} + +pub fn platform_to_currency(platform: String) -> Result<(String, String), GenericError> { + match platform.as_str() { + RINKEBY_PLATFORM => Ok(( + RINKEBY_CURRENCY_SHORT.to_owned(), + RINKEBY_CURRENCY_LONG.to_owned(), + )), + GOERLI_PLATFORM => Ok(( + GOERLI_CURRENCY_SHORT.to_owned(), + GOERLI_CURRENCY_LONG.to_owned(), + )), + MAINNET_PLATFORM => Ok(( + MAINNET_CURRENCY_SHORT.to_owned(), + MAINNET_CURRENCY_LONG.to_owned(), + )), + MUMBAI_PLATFORM => Ok(( + MUMBAI_CURRENCY_SHORT.to_owned(), + MUMBAI_CURRENCY_LONG.to_owned(), + )), + POLYGON_MAINNET_PLATFORM => Ok(( + POLYGON_MAINNET_CURRENCY_SHORT.to_owned(), + POLYGON_MAINNET_CURRENCY_LONG.to_owned(), + )), + YATESTNET_PLATFORM => Ok(( + YATESTNET_CURRENCY_SHORT.to_owned(), + YATESTNET_CURRENCY_LONG.to_owned(), + )), + other => Err(GenericError::new(format!( + "Unable to find network currency for platform: {}", + other + ))), + } +} + +pub fn get_network_token(network: DbNetwork, token: Option) -> String { + // Fetch network config, safe as long as all DbNetwork entries are in SUPPORTED_NETWORKS + let network_config = (*SUPPORTED_NETWORKS).get(&(network.to_string())).unwrap(); + // TODO: Check if token in network.tokens + token.unwrap_or_else(|| network_config.default_token.clone()) +} + +pub fn network_like_to_network(network_like: Option) -> DbNetwork { + match network_like { + Some(n) => DbNetwork::from_str(&n).unwrap_or(*RINKEBY_DB_NETWORK), + None => *RINKEBY_DB_NETWORK, + } +} diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs new file mode 100644 index 0000000000..40f2e77165 --- /dev/null +++ b/core/payment-driver/erc20next/src/service.rs @@ -0,0 +1,88 @@ +/* + The service that binds this payment driver into yagna via GSB. +*/ + +use std::env; +// External crates +use erc20_payment_lib::config; +use erc20_payment_lib::config::AdditionalOptions; +use erc20_payment_lib::misc::load_private_keys; +use erc20_payment_lib::runtime::start_payment_engine; +use std::sync::Arc; + +// Workspace uses +use ya_payment_driver::{ + bus, + dao::{init, DbExecutor}, + model::GenericError, +}; +use ya_service_api_interfaces::Provider; + +// Local uses +use crate::{driver::Erc20NextDriver, signer::IdentitySigner}; + +pub struct Erc20NextService; + +impl Erc20NextService { + pub async fn gsb>(context: &Context) -> anyhow::Result<()> { + log::debug!("Connecting Erc20NextService to gsb..."); + + // TODO: Read and validate env + log::debug!("Environment variables validated"); + + // Init database + let db: DbExecutor = context.component(); + init(&db).await.map_err(GenericError::new)?; + log::debug!("Database initialised"); + + // Start cron + //Cron::new(driver_rc.clone()); + log::debug!("Cron started"); + + { + let (private_keys, _public_addresses) = + load_private_keys(&env::var("ETH_PRIVATE_KEYS").unwrap_or_default()).unwrap(); + let additional_options = AdditionalOptions { + keep_running: true, + generate_tx_only: false, + skip_multi_contract_check: false, + contract_use_direct_method: false, + contract_use_unpacked_method: false, + }; + log::warn!("Loading config"); + let config_str = include_str!("../config-payments.toml"); + let config = match config::Config::load("config-payments.toml").await { + Ok(config) => config, + Err(err) => { + log::warn!( + "Failed to load config from config-payments.toml due to {err:?}, using default config" + ); + config::Config::load_from_str(config_str).unwrap() + } + }; + + log::warn!("Starting payment engine: {:#?}", config); + let signer = IdentitySigner::new(); + let pr = start_payment_engine( + &private_keys, + "db.sqlite", + config, + signer, + None, + Some(additional_options), + None, + None, + ) + .await + .unwrap(); + log::warn!("Payment engine started - outside task"); + let driver = Erc20NextDriver::new(pr); + driver.load_active_accounts().await; + let driver_rc = Arc::new(driver); + bus::bind_service(&db, driver_rc.clone()).await?; + + log::info!("Successfully connected Erc20NextService to gsb."); + Ok(()) + } + } +} diff --git a/core/payment-driver/erc20next/src/signer.rs b/core/payment-driver/erc20next/src/signer.rs new file mode 100644 index 0000000000..06cfa3539d --- /dev/null +++ b/core/payment-driver/erc20next/src/signer.rs @@ -0,0 +1,174 @@ +use std::sync::{Arc, Mutex}; + +use async_trait::async_trait; +use erc20_payment_lib::{contracts::DUMMY_RPC_PROVIDER, signer::SignerError}; +use ethereum_types::{H160, H256}; +use web3::{ + signing::{Signature, SigningError}, + types::{Address, SignedTransaction, TransactionParameters}, +}; +use ya_client_model::NodeId; +use ya_payment_driver::bus; + +#[derive(Default, Clone)] +struct DummyKeyState { + message: Vec, + signed: Vec, +} + +/// Key for hacky interaction with the web3 API +/// +/// We cannot sign the transaction here, as it needs to be done by GSB, +/// which cannot be done in the implementation of [`web3::signing::Key`] +/// either. +/// +/// This key is to be used in two steps -- first one invokes `sign_transaction` +/// to capture the payload for signing. Then the payload has to be signed using +/// the identitiy API. Afterwards the signed message can be injected into the state, +/// and `sign_transaction` can be invoked again -- this time returning the pre-computed +/// signature. +/// +/// This doesn't really depend on internal details of web3 and thus will work with future +/// versions of web3 as long as you pass in transactions consistently. This means you +/// cannot depend on `sign_transaction` populating the optional fields: `nonce`, `gas_price` +/// and `chain_id`. +#[derive(Clone)] +struct DummyKey { + pub pub_address: Address, + pub state: Arc>, +} + +impl DummyKey { + fn new(pub_address: Address) -> (DummyKey, Arc>) { + let state = Arc::new(Mutex::new(DummyKeyState::default())); + let key = DummyKey { + pub_address, + state: state.clone(), + }; + (key, state) + } +} + +impl web3::signing::Key for DummyKey { + fn sign(&self, _message: &[u8], _chain_id: Option) -> Result { + panic!("DummyKey cannot sign legacy transactions"); + } + + fn sign_message(&self, message: &[u8]) -> Result { + let mut state = self.state.lock().unwrap(); + + if state.signed.is_empty() { + state.message = message.to_vec(); + Ok(Signature { + v: 0, + r: Default::default(), + s: Default::default(), + }) + } else { + eprintln!("({}) {:?}", state.signed.len(), &state.signed); + Ok(Signature { + v: state.signed[0] as u64, + r: H256::from_slice(&state.signed[1..33]), + s: H256::from_slice(&state.signed[33..65]), + }) + } + } + + fn address(&self) -> Address { + self.pub_address + } +} + +pub struct IdentitySigner; + +impl IdentitySigner { + pub fn new() -> Self { + IdentitySigner + } + + async fn get_matching_node_id(pub_address: H160) -> Result { + let unlocked_identities = + bus::list_unlocked_identities() + .await + .map_err(|e| SignerError { + message: e.to_string(), + })?; + + for node_id in unlocked_identities { + let addr = bus::get_pubkey(node_id).await.map_err(|e| SignerError { + message: e.to_string(), + })?; + let address = ethsign::PublicKey::from_slice(&addr) + .map_err(|_| SignerError { + message: "Public address from bus::get_pubkey is invalid".to_string(), + })? + .address() + .clone(); + + if address == pub_address.as_bytes() { + return Ok(node_id); + } + } + + Err(SignerError { + message: format!("No matching unlocked identity for address {pub_address}"), + }) + } +} + +#[async_trait] +impl erc20_payment_lib::signer::Signer for IdentitySigner { + async fn check_if_sign_possible(&self, pub_address: H160) -> Result<(), SignerError> { + let pool = tokio_util::task::LocalPoolHandle::new(1); + + pool.spawn_pinned(move || async move { + Self::get_matching_node_id(pub_address).await.map(|_| ()) + }) + .await + .map_err(|e| SignerError { + message: e.to_string(), + })? + } + + async fn sign( + &self, + pub_address: H160, + tp: TransactionParameters, + ) -> Result { + let pool = tokio_util::task::LocalPoolHandle::new(1); + let (dummy_key, state) = DummyKey::new(pub_address); + + pool.spawn_pinned(move || async move { + // We don't care about the result. This is only called + // so that web3 computes the message to sign for us. + DUMMY_RPC_PROVIDER + .accounts() + .sign_transaction(tp.clone(), dummy_key.clone()) + .await + .ok(); + + let message = state.lock().unwrap().message.clone(); + let node_id = Self::get_matching_node_id(pub_address).await?; + let signed = bus::sign(node_id, message).await.map_err(|e| SignerError { + message: e.to_string(), + })?; + + { + let mut state = state.lock().unwrap(); + state.signed = signed; + } + + DUMMY_RPC_PROVIDER + .accounts() + .sign_transaction(tp, dummy_key) + .await + .map_err(|e| SignerError { + message: e.to_string(), + }) + }) + .await + .map_err(|e| SignerError { + message: e.to_string(), + })? + } +} diff --git a/core/payment-driver/erc20next/view_transactions.sql b/core/payment-driver/erc20next/view_transactions.sql new file mode 100644 index 0000000000..a2400aee79 --- /dev/null +++ b/core/payment-driver/erc20next/view_transactions.sql @@ -0,0 +1,39 @@ +--use this query to debug and view ERC20 transaction list + + +SELECT tx_id, + ts.status || '(' || t.status || ')' as `status`, + Cast ((julianday('now') - julianday(time_created)) * 24 * 60 * 60 as integer) as `Created ago`, + Cast ((julianday('now') - julianday(time_last_action)) * 24 * 60 * 60 as integer) as `Last action ago`, + Cast ((julianday('now') - julianday(time_sent)) * 24 * 60 * 60 as integer) as `Last sent ago`, + Cast ((julianday('now') - julianday(time_confirmed)) * 24 * 60 * 60 as integer) as `Last confirmed ago`, + Cast ((julianday(time_confirmed) - julianday(time_created)) * 24 * 60 * 60 as integer) as `Total process time`, + nonce, + starting_gas_price, + current_gas_price, + max_gas_price, + final_gas_price, + final_gas_price_exact, + final_gas_used, + amount_base, + amount_base_exact, + amount_erc20, + amount_erc20_exact, + tx_type, + tmp_onchain_txs, + final_tx, + gas_limit, + time_created, + time_last_action, + time_sent, + time_confirmed, + network, + last_error_msg, + resent_times, + signature, + sender, + encoded + FROM `transaction` as t + JOIN `transaction_status` as ts on ts.status_id=t.status + ORDER BY time_created DESC + diff --git a/core/payment-driver/zksync/examples/deposit.rs b/core/payment-driver/zksync/examples/deposit.rs deleted file mode 100644 index cfebbc237e..0000000000 --- a/core/payment-driver/zksync/examples/deposit.rs +++ /dev/null @@ -1,41 +0,0 @@ -#[macro_use] -extern crate log; - -use bigdecimal::BigDecimal; -use std::str::FromStr; -use ya_payment_driver::db::models::Network as DbNetwork; -use ya_zksync_driver::zksync::wallet as driver_wallet; -use zksync::zksync_types::H256; -use zksync::{Network, RpcProvider, Wallet, WalletCredentials}; -use zksync_eth_signer::{EthereumSigner, PrivateKeySigner}; - -const PRIVATE_KEY: &str = "e0c704b6e925c3be222337f9c94610c46b7fec95c14b8f5b9800d20ed4782670"; - -#[actix_rt::main] -async fn main() -> anyhow::Result<()> { - let log_level = std::env::var("RUST_LOG").unwrap_or_else(|_| "info".to_owned()); - std::env::set_var("RUST_LOG", log_level); - env_logger::init(); - - dotenv::dotenv().expect("Failed to read .env file"); - - let private_key = H256::from_str(PRIVATE_KEY).expect("Cannot decode bytes from hex-encoded PK"); - let signer = PrivateKeySigner::new(private_key); - let address = signer.get_address().await?; - info!("Account address {:#x}", address); - - info!("Creating wallet"); - let provider = RpcProvider::new(Network::Rinkeby); - let cred = WalletCredentials::from_eth_signer(address, signer, Network::Rinkeby).await?; - let wallet = Wallet::new(provider, cred).await?; - - let one_tglm = BigDecimal::from(1); - - let deposit_tx_hash = driver_wallet::deposit(wallet, DbNetwork::Rinkeby, one_tglm).await?; - info!( - "Check out deposit transaction at https://rinkeby.etherscan.io/tx/{:#x}", - deposit_tx_hash - ); - - Ok(()) -} diff --git a/core/payment-driver/zksync/examples/simple_balance.rs b/core/payment-driver/zksync/examples/simple_balance.rs deleted file mode 100644 index f6c5249b39..0000000000 --- a/core/payment-driver/zksync/examples/simple_balance.rs +++ /dev/null @@ -1,41 +0,0 @@ -use zksync::zksync_types::Address; -use zksync::Network; -use zksync::{provider::Provider, RpcProvider}; - -use std::str::FromStr; - -#[macro_use] -extern crate log; - -#[tokio::main] -async fn main() { - let log_level = std::env::var("RUST_LOG").unwrap_or_else(|_| "info".to_owned()); - std::env::set_var("RUST_LOG", log_level); - env_logger::init(); - info!("Simple balance check example."); - let pub_key = "bf55a824c3114b07899e63870917da1bc01bcd06"; - - info!("Public key. {}", pub_key); - let pub_address = Address::from_str(pub_key).unwrap(); - info!("Public address. {}", pub_address); - let provider = RpcProvider::new(Network::Rinkeby); - - let acc_info = provider.account_info(pub_address).await.unwrap(); - debug!("{:?}", acc_info); - let token = "tGLM"; - let balance_com = acc_info - .committed - .balances - .get(token as &str) - .map(|x| x.0.clone()) - .unwrap_or_default(); - let balance_ver = acc_info - .verified - .balances - .get(token as &str) - .map(|x| x.0.clone()) - .unwrap_or_default(); - - info!("balance_com: {}", balance_com); - info!("balance_ver: {}", balance_ver); -} diff --git a/core/payment-driver/zksync/examples/withdrawal.rs b/core/payment-driver/zksync/examples/withdrawal.rs deleted file mode 100644 index e98df33bd4..0000000000 --- a/core/payment-driver/zksync/examples/withdrawal.rs +++ /dev/null @@ -1,87 +0,0 @@ -#[macro_use] -extern crate log; - -use bigdecimal::BigDecimal; -use hex::ToHex; -use std::str::FromStr; -use structopt::StructOpt; -use ya_payment_driver::db::models::Network as DbNetwork; -use ya_zksync_driver::zksync::faucet; -use ya_zksync_driver::zksync::wallet as driver_wallet; -use zksync::zksync_types::H256; -use zksync::{Network, RpcProvider, Wallet, WalletCredentials}; -use zksync_eth_signer::{EthereumSigner, PrivateKeySigner}; - -const TOKEN: &str = "tGLM"; -const PRIVATE_KEY: &str = "312776bb901c426cb62238db9015c100948534dea42f9fa1591eff4beb35cc13"; - -#[derive(Clone, Debug, StructOpt)] -struct Args { - #[structopt(long = "gen-key")] - genkey: bool, - - #[structopt(long, default_value = "5.0")] - amount: String, -} - -#[actix_rt::main] -async fn main() -> anyhow::Result<()> { - let log_level = std::env::var("RUST_LOG").unwrap_or_else(|_| "info".to_owned()); - std::env::set_var("RUST_LOG", log_level); - env_logger::init(); - - let args: Args = Args::from_args(); - let private_key = if args.genkey { - debug!("Using randomly generated key"); - H256::random() - } else { - debug!("Using hardcoded key"); - H256::from_str(PRIVATE_KEY).expect("Cannot decode bytes from hex-encoded PK") - }; - - let signer = PrivateKeySigner::new(private_key); - let address = signer.get_address().await?; - let addr_hex = format!("0x{}", address.encode_hex::()); - info!("Account address {}", addr_hex); - - info!("Funding an account"); - faucet::request_tglm(&addr_hex, DbNetwork::Rinkeby).await?; - - info!("Creating wallet"); - let provider = RpcProvider::new(Network::Rinkeby); - let cred = WalletCredentials::from_eth_signer(address, signer, Network::Rinkeby).await?; - let wallet = Wallet::new(provider, cred).await?; - - if !(wallet.is_signing_key_set().await?) { - info!("Unlocking account"); - let unlock = wallet - .start_change_pubkey() - .fee_token(TOKEN)? - .send() - .await?; - debug!("unlock={:?}", unlock); - unlock.wait_for_commit().await?; - } - - let amount: BigDecimal = args - .amount - .parse() - .expect("Cannot parse 'amount' parameter to BigDecimal"); - - let withdraw_handle = - driver_wallet::withdraw(wallet, DbNetwork::Rinkeby, Some(amount), None).await?; - - let tx_info = withdraw_handle.wait_for_commit().await?; - if tx_info.success.unwrap_or(false) { - let tx_hash = withdraw_handle.hash(); - let hash_hex = hex::encode(tx_hash.as_ref()); - info!("Transaction committed, track it here https://rinkeby.zkscan.io/explorer/transactions/{}", hash_hex); - info!("Waiting for verification - this takes LOOONG to complete..."); - withdraw_handle.wait_for_verify().await?; - info!("Withdrawal succeeded!"); - } else { - warn!("Withdraw has failed. Reason: {:?}", tx_info.fail_reason); - } - - Ok(()) -} diff --git a/core/payment-driver/zksync/src/driver.rs b/core/payment-driver/zksync/src/driver.rs deleted file mode 100644 index 9066fd0721..0000000000 --- a/core/payment-driver/zksync/src/driver.rs +++ /dev/null @@ -1,584 +0,0 @@ -/* - ZksyncDriver to handle payments on the zksync network. - - Please limit the logic in this file, use local mods to handle the calls. -*/ -// Extrnal crates -use chrono::{Duration, TimeZone, Utc}; -use futures::lock::Mutex; -use lazy_static::lazy_static; -use num_bigint::BigInt; -use std::collections::HashMap; -use std::env; -use std::str::FromStr; -use uuid::Uuid; - -// Workspace uses -use ya_payment_driver::{ - account::{Accounts, AccountsRc}, - bus, - cron::PaymentDriverCron, - dao::DbExecutor, - db::models::{Network as DbNetwork, PaymentEntity, TxType}, - driver::{async_trait, BigDecimal, IdentityError, IdentityEvent, Network, PaymentDriver}, - model::*, - utils, -}; -use ya_utils_futures::timeout::IntoTimeoutFuture; - -// Local uses -use crate::{ - dao::ZksyncDao, - network::{ - get_network_token, network_token_to_platform, platform_to_network_token, SUPPORTED_NETWORKS, - }, - zksync::wallet, - DEFAULT_NETWORK, DRIVER_NAME, -}; - -lazy_static! { - static ref TX_SUMBIT_TIMEOUT: Duration = Duration::minutes(15); - static ref MAX_ALLOCATION_SURCHARGE: BigDecimal = - match env::var("MAX_ALLOCATION_SURCHARGE").map(|s| s.parse()) { - Ok(Ok(x)) => x, - _ => BigDecimal::from(200), - }; - - // Environment variable will be replaced by allocation parameter in PAY-82 - static ref TRANSACTIONS_PER_ALLOCATION: BigInt = - match env::var("TRANSACTIONS_PER_ALLOCATION").map(|s| s.parse()) { - Ok(Ok(x)) => x, - _ => BigInt::from(10), - }; - - static ref TX_SENDOUT_INTERVAL: std::time::Duration = std::time::Duration::from_secs( - std::env::var("ZKSYNC_SENDOUT_INTERVAL_SECS") - .ok() - .and_then(|x| x.parse().ok()) - .unwrap_or(10), - ); - - static ref TX_CONFIRMATION_INTERVAL: std::time::Duration = std::time::Duration::from_secs( - std::env::var("ZKSYNC_CONFIRMATION_INTERVAL_SECS") - .ok() - .and_then(|x| x.parse().ok()) - .unwrap_or(5), - ); -} - -pub struct ZksyncDriver { - active_accounts: AccountsRc, - dao: ZksyncDao, - sendout_lock: Mutex<()>, - confirmation_lock: Mutex<()>, -} - -impl ZksyncDriver { - pub fn new(db: DbExecutor) -> Self { - Self { - active_accounts: Accounts::new_rc(), - dao: ZksyncDao::new(db), - sendout_lock: Default::default(), - confirmation_lock: Default::default(), - } - } - - pub async fn load_active_accounts(&self) { - log::debug!("load_active_accounts"); - let unlocked_accounts = bus::list_unlocked_identities().await.unwrap(); - let mut accounts = self.active_accounts.borrow_mut(); - for account in unlocked_accounts { - log::debug!("account={}", account); - accounts.add_account(account) - } - } - - fn is_account_active(&self, address: &str) -> bool { - self.active_accounts - .as_ref() - .borrow() - .get_node_id(address) - .is_some() - } - - async fn process_payments_for_account(&self, node_id: &str) { - log::trace!("Processing payments for node_id={}", node_id); - for network_key in self.get_networks().keys() { - let network = DbNetwork::from_str(network_key).unwrap(); - let payments: Vec = - self.dao.get_pending_payments(node_id, network).await; - let mut nonce = 0; - if !payments.is_empty() { - log::info!( - "Processing payments. count={}, network={} node_id={}", - payments.len(), - network_key, - node_id - ); - - nonce = wallet::get_nonce(node_id, network).await; - log::debug!("Payments: nonce={}, details={:?}", &nonce, payments); - } - for payment in payments { - self.handle_payment(payment, &mut nonce).await; - } - } - } - - async fn handle_payment(&self, payment: PaymentEntity, nonce: &mut u32) { - let details = utils::db_to_payment_details(&payment); - let tx_nonce = nonce.to_owned(); - - match wallet::make_transfer(&details, tx_nonce, payment.network).await { - Ok(tx_hash) => { - let tx_id = self - .dao - .insert_transaction(&details, Utc::now(), payment.network) - .await; - self.dao - .transaction_sent(&tx_id, &tx_hash, &payment.order_id) - .await; - *nonce += 1; - } - Err(e) => { - let deadline = - Utc.from_utc_datetime(&payment.payment_due_date) + *TX_SUMBIT_TIMEOUT; - if Utc::now() > deadline { - log::error!("Failed to submit zkSync transaction. Retry deadline reached. details={:?} error={}", payment, e); - self.dao.payment_failed(&payment.order_id).await; - } else { - log::warn!( - "Failed to submit zkSync transaction. Payment will be retried until {}. details={:?} error={}", - deadline, payment, e - ); - }; - } - }; - } -} - -#[async_trait(?Send)] -impl PaymentDriver for ZksyncDriver { - async fn account_event( - &self, - _db: DbExecutor, - _caller: String, - msg: IdentityEvent, - ) -> Result<(), IdentityError> { - self.active_accounts.borrow_mut().handle_event(msg); - Ok(()) - } - - async fn enter( - &self, - _db: DbExecutor, - _caller: String, - msg: Enter, - ) -> Result { - let tx_hash = wallet::enter(msg).await?; - - Ok(format!( - "Deposit transaction has been sent on Ethereum and soon funds should be available \ - on ZkSync network. You can check transaction status in the block explorer. \ - Tracking link: https://rinkeby.zkscan.io/explorer/transactions/{}", - tx_hash - )) - } - - async fn exit( - &self, - _db: DbExecutor, - _caller: String, - msg: Exit, - ) -> Result { - if !self.is_account_active(&msg.sender()) { - return Err(GenericError::new( - "Cannot start withdrawal, account is not active", - )); - } - - let tx_hash = wallet::exit(&msg).await?; - Ok(format!( - "Withdrawal has been accepted by the zkSync operator. \ - It may take some time until the funds are available on Ethereum blockchain. \ - Tracking link: https://rinkeby.zkscan.io/explorer/transactions/{}", - tx_hash - )) - } - - async fn get_account_balance( - &self, - _db: DbExecutor, - _caller: String, - msg: GetAccountBalance, - ) -> Result { - log::debug!("get_account_balance: {:?}", msg); - let (network, _) = platform_to_network_token(msg.platform())?; - - let balance = wallet::account_balance(&msg.address(), network).await?; - - log::debug!("get_account_balance - result: {}", &balance); - Ok(balance) - } - - async fn get_account_gas_balance( - &self, - _db: DbExecutor, - _caller: String, - _msg: GetAccountGasBalance, - ) -> Result, GenericError> { - log::debug!("get_account_gas_balance: unsupported"); - - Ok(None) - } - - fn get_name(&self) -> String { - DRIVER_NAME.to_string() - } - - fn get_default_network(&self) -> String { - DEFAULT_NETWORK.to_string() - } - - fn get_networks(&self) -> HashMap { - SUPPORTED_NETWORKS.clone() - } - - fn recv_init_required(&self) -> bool { - false - } - - async fn init(&self, _db: DbExecutor, _caller: String, msg: Init) -> Result { - log::debug!("init: {:?}", msg); - let address = msg.address().clone(); - let mode = msg.mode(); - - // Ensure account is unlock before initialising send mode - if mode.contains(AccountMode::SEND) && !self.is_account_active(&address) { - return Err(GenericError::new("Can not init, account not active")); - } - - wallet::init_wallet(&msg) - .timeout(Some(180)) - .await - .map_err(GenericError::new)??; - - let network = msg.network().unwrap_or_else(|| DEFAULT_NETWORK.to_string()); - let token = get_network_token( - DbNetwork::from_str(&network).map_err(GenericError::new)?, - msg.token(), - ); - bus::register_account(self, &address, &network, &token, mode).await?; - - log::info!( - "Initialised payment account. mode={:?}, address={}, driver={}, network={}, token={}", - mode, - &address, - DRIVER_NAME, - network, - token - ); - Ok(Ack {}) - } - - async fn fund( - &self, - _db: DbExecutor, - _caller: String, - msg: Fund, - ) -> Result { - let address = msg.address(); - let network = - DbNetwork::from_str(&msg.network().unwrap_or_else(|| DEFAULT_NETWORK.to_string())) - .map_err(GenericError::new)?; - match network { - DbNetwork::Rinkeby => { - log::info!( - "Handling fund request. network={}, address={}", - &network, - &address - ); - wallet::fund(&address, network) - .timeout(Some(15)) // Regular scenario =~ 5s - .await - .map_err(GenericError::new)??; - Ok(format!( - "Received funds from the faucet. address={}", - &address - )) - } - DbNetwork::Goerli => Ok("Goerli network is not supported by this driver.".to_string()), - DbNetwork::Mumbai => Ok("Mumbai network is not supported by this driver.".to_string()), - DbNetwork::Polygon => { - Ok("Polygon network is not supported by this driver.".to_string()) - } - DbNetwork::Mainnet => Ok(format!( - r#"Using this driver is not recommended. Consider using the Polygon driver instead. - -Your mainnet zkSync address is {}. -To be able to use zkSync driver please send some GLM tokens and optionally ETH for gas to this address. -"#, - address - )), - } - } - - async fn transfer( - &self, - _db: DbExecutor, - _caller: String, - msg: Transfer, - ) -> Result { - log::info!("TRANSFER = Not Implemented: {:?}", msg); - Ok("NOT_IMPLEMENTED".to_string()) - } - - async fn schedule_payment( - &self, - _db: DbExecutor, - _caller: String, - msg: SchedulePayment, - ) -> Result { - log::debug!("schedule_payment: {:?}", msg); - - let sender = msg.sender().to_owned(); - if !self.is_account_active(&sender) { - return Err(GenericError::new( - "Can not schedule_payment, account not active", - )); - } - - let order_id = Uuid::new_v4().to_string(); - self.dao.insert_payment(&order_id, &msg).await?; - Ok(order_id) - } - - async fn verify_payment( - &self, - _db: DbExecutor, - _caller: String, - msg: VerifyPayment, - ) -> Result { - log::debug!("verify_payment: {:?}", msg); - let (network, _) = platform_to_network_token(msg.platform())?; - let tx_hash = hex::encode(msg.confirmation().confirmation); - log::info!("Verifying transaction: {}", tx_hash); - wallet::verify_tx(&tx_hash, network).await - } - - async fn validate_allocation( - &self, - _db: DbExecutor, - _caller: String, - msg: ValidateAllocation, - ) -> Result { - let (network, _) = platform_to_network_token(msg.platform)?; - let account_balance = wallet::account_balance(&msg.address, network).await?; - let total_allocated_amount: BigDecimal = msg - .existing_allocations - .into_iter() - .map(|allocation| allocation.remaining_amount) - .sum(); - - // NOTE: `wallet::get_tx_fee` accepts an _recipient_ address which is unknown at the moment - // so the _sender_ address is provider. This might bias fee calculation, because transaction - // to new account is little more expensive. - let tx_fee_cost = wallet::get_tx_fee(&msg.address, network).await?; - let total_txs_cost = tx_fee_cost * &*TRANSACTIONS_PER_ALLOCATION; - let allocation_surcharge = (&*MAX_ALLOCATION_SURCHARGE).min(&total_txs_cost); - - log::info!( - "Allocation validation: \ - allocating: {:.5}, \ - account_balance: {:.5}, \ - total_allocated_amount: {:.5}, \ - allocation_surcharge: {:.5} \ - ", - msg.amount, - account_balance, - total_allocated_amount, - allocation_surcharge, - ); - Ok(msg.amount <= (account_balance - total_allocated_amount - allocation_surcharge)) - } - - async fn shut_down( - &self, - _db: DbExecutor, - _caller: String, - msg: ShutDown, - ) -> Result<(), GenericError> { - self.send_out_payments().await; - // HACK: Make sure that send-out job did complete. It might have just been running in another thread (cron). In such case .send_out_payments() would not block. - self.sendout_lock.lock().await; - let timeout = Duration::from_std(msg.timeout) - .map_err(|e| GenericError::new(format!("Invalid shutdown timeout: {}", e)))?; - let deadline = Utc::now() + timeout - Duration::seconds(1); - while { - self.confirm_payments().await; // Run it at least once - Utc::now() < deadline && self.dao.has_unconfirmed_txs().await? // Stop if deadline passes or there are no more transactions to confirm - } { - tokio::time::sleep(std::time::Duration::from_secs(1)).await; - } - Ok(()) - } -} - -#[async_trait(?Send)] -impl PaymentDriverCron for ZksyncDriver { - async fn confirm_payments(&self) { - let guard = match self.confirmation_lock.try_lock() { - None => { - log::trace!("ZkSync confirmation job in progress."); - return; - } - Some(guard) => guard, - }; - log::trace!("Running zkSync confirmation job..."); - - for network_key in self.get_networks().keys() { - let network = - match DbNetwork::from_str(network_key) { - Ok(n) => n, - Err(e) => { - log::error!( - "Failed to parse network, skipping confirmation job. key={}, error={:?}", - network_key, e); - continue; - } - }; - let txs = self.dao.get_unconfirmed_txs(network).await; - log::trace!("confirm_payments network={} txs={:?}", &network_key, &txs); - - for tx in txs { - log::trace!("checking tx {:?}", &tx); - let tx_hash = match &tx.tmp_onchain_txs { - None => continue, - Some(tx_hash) => tx_hash, - }; - - log::debug!( - "Checking if tx was a success. network={}, hash={}", - &network, - &tx_hash - ); - let tx_success = match wallet::check_tx(tx_hash, network).await { - None => continue, // Check_tx returns None when the result is unknown - Some(tx_success) => tx_success, - }; - - let payments = self.dao.transaction_confirmed(&tx.tx_id).await; - - // Faucet can stop here IF the tx was a success. - if tx.tx_type == TxType::Faucet as i32 && tx_success.is_ok() { - log::debug!("Faucet tx confirmed, exit early. hash={}", &tx_hash); - continue; - } - - let order_ids: Vec = payments - .iter() - .map(|payment| payment.order_id.clone()) - .collect(); - - if let Err(err) = tx_success { - // In case of invalid nonce error we can retry sending transaction. - // Reset payment and transaction state to 'not sent', so cron job will pickup - // transaction again. - if err.contains("Nonce mismatch") { - log::warn!( - "Scheduling retry for tx {:?} because of nonce mismatch. ZkSync error: {}", - tx, - err - ); - - for order_id in order_ids.iter() { - self.dao.retry_payment(order_id).await; - } - } else { - log::error!( - "ZkSync transaction verification failed. tx_details={:?} error={}", - tx, - err - ); - - for order_id in order_ids.iter() { - self.dao.payment_failed(order_id).await; - } - } - - self.dao - .transaction_failed(&tx.tx_id, "Unknown error") - .await; - return; - } - - // TODO: Add token support - let platform = network_token_to_platform(Some(network), None).unwrap(); // TODO: Catch error? - let details = match wallet::verify_tx(tx_hash, network).await { - Ok(a) => a, - Err(e) => { - log::warn!("Failed to get transaction details from zksync, creating bespoke details. Error={}", e); - - //Create bespoke payment details: - // - Sender + receiver are the same - // - Date is always now - // - Amount needs to be updated to total of all PaymentEntity's - let first_payment: PaymentEntity = - match self.dao.get_first_payment(tx_hash).await { - Some(p) => p, - None => continue, - }; - let mut details = utils::db_to_payment_details(&first_payment); - details.amount = payments - .into_iter() - .map(|payment| utils::db_amount_to_big_dec(payment.amount)) - .sum::(); - details - } - }; - if tx.tx_type == TxType::Transfer as i32 { - let tx_hash = hex::decode(tx_hash).unwrap(); - - if let Err(e) = bus::notify_payment( - &self.get_name(), - &platform, - order_ids, - &details, - tx_hash, - ) - .await - { - log::error!("{}", e) - }; - } - } - } - log::trace!("ZkSync confirmation job complete."); - drop(guard); // Explicit drop to tell Rust that guard is not unused variable - } - - async fn send_out_payments(&self) { - let guard = match self.sendout_lock.try_lock() { - None => { - log::trace!("ZkSync send-out job in progress."); - return; - } - Some(guard) => guard, - }; - log::trace!("Running zkSync send-out job..."); - let accounts = self.active_accounts.borrow().list_accounts(); - for node_id in accounts { - self.process_payments_for_account(&node_id).await; - } - log::trace!("ZkSync send-out job complete."); - drop(guard); // Explicit drop to tell Rust that guard is not unused variable - } - - fn sendout_interval(&self) -> std::time::Duration { - *TX_SENDOUT_INTERVAL - } - - fn confirmation_interval(&self) -> std::time::Duration { - *TX_CONFIRMATION_INTERVAL - } -} diff --git a/core/payment-driver/zksync/src/lib.rs b/core/payment-driver/zksync/src/lib.rs deleted file mode 100644 index 2787a9cf97..0000000000 --- a/core/payment-driver/zksync/src/lib.rs +++ /dev/null @@ -1,28 +0,0 @@ -/* - Payment driver for yagna using zksync. - - This file only contains constants and imports. -*/ - -// Public -pub const DRIVER_NAME: &str = "zksync"; - -pub const DEFAULT_NETWORK: &str = "rinkeby"; -pub const DEFAULT_TOKEN: &str = "tGLM"; -pub const DEFAULT_PLATFORM: &str = "zksync-rinkeby-tglm"; - -pub const MAINNET_NETWORK: &str = "mainnet"; -pub const MAINNET_TOKEN: &str = "GLM"; -pub const MAINNET_PLATFORM: &str = "zksync-mainnet-glm"; - -pub use service::ZksyncService as PaymentDriverService; - -// Private -#[macro_use] -extern crate log; - -mod dao; -mod driver; -mod network; -mod service; -pub mod zksync; diff --git a/core/payment-driver/zksync/src/network.rs b/core/payment-driver/zksync/src/network.rs deleted file mode 100644 index c92a9a2024..0000000000 --- a/core/payment-driver/zksync/src/network.rs +++ /dev/null @@ -1,80 +0,0 @@ -use maplit::hashmap; -use std::collections::HashMap; -use std::str::FromStr; - -// Workspace uses -use ya_payment_driver::{db::models::Network as DbNetwork, driver::Network, model::GenericError}; - -// Local uses -use crate::{ - DEFAULT_NETWORK, DEFAULT_PLATFORM, DEFAULT_TOKEN, MAINNET_NETWORK, MAINNET_PLATFORM, - MAINNET_TOKEN, -}; - -lazy_static::lazy_static! { - pub static ref SUPPORTED_NETWORKS: HashMap = hashmap! { - DEFAULT_NETWORK.to_string() => Network { - default_token: DEFAULT_TOKEN.to_string(), - tokens: hashmap! { - DEFAULT_TOKEN.to_string() => DEFAULT_PLATFORM.to_string() - } - }, - MAINNET_NETWORK.to_string() => Network { - default_token: MAINNET_TOKEN.to_string(), - tokens: hashmap! { - MAINNET_TOKEN.to_string() => MAINNET_PLATFORM.to_string() - } - } - }; - static ref DEFAULT_DB_NETWORK: DbNetwork = DbNetwork::from_str(DEFAULT_NETWORK).unwrap(); - static ref MAINNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(MAINNET_NETWORK).unwrap(); -} - -pub fn platform_to_network_token(platform: String) -> Result<(DbNetwork, String), GenericError> { - match platform.as_str() { - DEFAULT_PLATFORM => Ok((*DEFAULT_DB_NETWORK, DEFAULT_TOKEN.to_owned())), - MAINNET_PLATFORM => Ok((*MAINNET_DB_NETWORK, MAINNET_TOKEN.to_owned())), - other => Err(GenericError::new(format!( - "Unable to find network for platform: {}", - other - ))), - } -} - -pub fn network_token_to_platform( - network: Option, - token: Option, -) -> Result { - let network = - network.unwrap_or(DbNetwork::from_str(DEFAULT_NETWORK).map_err(GenericError::new)?); - let network_config = (*SUPPORTED_NETWORKS).get(&(network.to_string())); - let network_config = match network_config { - Some(nc) => nc, - None => { - return Err(GenericError::new(format!( - "Unable to find platform for network={}", - network - ))) - } - }; - - let token = token.unwrap_or_else(|| network_config.default_token.clone()); - let platform = network_config.tokens.get(&token); - let platform = match platform { - Some(p) => p, - None => { - return Err(GenericError::new(format!( - "Unable to find platform for token={}", - token - ))) - } - }; - Ok(platform.to_string()) -} - -pub fn get_network_token(network: DbNetwork, token: Option) -> String { - // Fetch network config, safe as long as all DbNetwork entries are in SUPPORTED_NETWORKS - let network_config = (*SUPPORTED_NETWORKS).get(&(network.to_string())).unwrap(); - // TODO: Check if token in network.tokens - token.unwrap_or_else(|| network_config.default_token.clone()) -} diff --git a/core/payment-driver/zksync/src/service.rs b/core/payment-driver/zksync/src/service.rs deleted file mode 100644 index dee353a6b7..0000000000 --- a/core/payment-driver/zksync/src/service.rs +++ /dev/null @@ -1,48 +0,0 @@ -/* - The service that binds this payment driver into yagna via GSB. -*/ - -// Extrernal crates -use std::sync::Arc; - -// Workspace uses -use ya_payment_driver::{ - bus, - cron::Cron, - dao::{init, DbExecutor}, - model::GenericError, -}; -use ya_service_api_interfaces::Provider; - -// Local uses -use crate::driver::ZksyncDriver; - -pub struct ZksyncService; - -impl ZksyncService { - pub async fn gsb>(context: &Context) -> anyhow::Result<()> { - log::debug!("Connecting ZksyncService to gsb..."); - - // TODO: Read and validate env - log::debug!("Environment variables validated"); - - // Init database - let db: DbExecutor = context.component(); - init(&db).await.map_err(GenericError::new)?; - log::debug!("Database initialised"); - - // Load driver - let driver = ZksyncDriver::new(db.clone()); - driver.load_active_accounts().await; - let driver_rc = Arc::new(driver); - bus::bind_service(&db, driver_rc.clone()).await?; - log::debug!("Driver loaded"); - - // Start cron - Cron::new(driver_rc.clone()); - log::debug!("Cron started"); - - log::info!("Successfully connected ZksyncService to gsb."); - Ok(()) - } -} diff --git a/core/payment-driver/zksync/src/zksync/faucet.rs b/core/payment-driver/zksync/src/zksync/faucet.rs deleted file mode 100644 index b884769172..0000000000 --- a/core/payment-driver/zksync/src/zksync/faucet.rs +++ /dev/null @@ -1,116 +0,0 @@ -/* - Top up new accounts from the rinkeby zksync faucet and wait for the funds to arive. -*/ - -// External crates -use bigdecimal::BigDecimal; -use chrono::{Duration, Utc}; -use lazy_static::lazy_static; -use std::{env, time}; -use tokio::time::sleep; - -// Workspace uses -use ya_payment_driver::{db::models::Network, model::GenericError}; -use ya_utils_networking::resolver; - -// Local uses -use crate::zksync::wallet::account_balance; - -const DEFAULT_FAUCET_SRV_PREFIX: &str = "_zk-faucet._tcp"; -const FAUCET_ADDR_ENVAR: &str = "ZKSYNC_FAUCET_ADDR"; -const MAX_FAUCET_REQUESTS: u32 = 6; - -lazy_static! { - static ref MIN_BALANCE: BigDecimal = BigDecimal::from(50); - static ref MAX_WAIT: Duration = Duration::minutes(1); -} - -pub async fn request_tglm(address: &str, network: Network) -> Result<(), GenericError> { - let balance = account_balance(address, network).await?; - if balance >= *MIN_BALANCE { - return Ok(()); - } - - log::info!( - "Requesting tGLM from zkSync faucet... address = {}", - address - ); - - for i in 0..MAX_FAUCET_REQUESTS { - match faucet_donate(address, network).await { - Ok(()) => break, - Err(e) => { - // Do not warn nor sleep at the last try. - if i >= MAX_FAUCET_REQUESTS - 1 { - log::error!( - "Failed to request tGLM from Faucet, tried {} times.: {:?}", - MAX_FAUCET_REQUESTS, - e - ); - return Err(e); - } else { - log::warn!( - "Retrying ({}/{}) to request tGLM from Faucet after failure: {:?}", - i + 1, - MAX_FAUCET_REQUESTS, - e - ); - sleep(time::Duration::from_secs(10)).await; - } - } - } - } - wait_for_tglm(address, network).await?; - Ok(()) -} - -async fn wait_for_tglm(address: &str, network: Network) -> Result<(), GenericError> { - log::info!("Waiting for tGLM from faucet..."); - let wait_until = Utc::now() + *MAX_WAIT; - while Utc::now() < wait_until { - if account_balance(address, network).await? >= *MIN_BALANCE { - log::info!("Received tGLM from faucet."); - return Ok(()); - } - sleep(time::Duration::from_secs(3)).await; - } - let msg = "Waiting for tGLM timed out."; - log::error!("{}", msg); - Err(GenericError::new(msg)) -} - -async fn faucet_donate(address: &str, _network: Network) -> Result<(), GenericError> { - // TODO: Reduce timeout to 20-30 seconds when transfer is used. - let client = awc::Client::builder() - .timeout(std::time::Duration::from_secs(60)) - .finish(); - let faucet_url = resolve_faucet_url().await?; - let request_url = format!("{}/{}", faucet_url, address); - let request_url = resolver::try_resolve_dns_record(&request_url).await; - debug!("Faucet request url: {}", request_url); - let response = client - .get(request_url) - .send() - .await - .map_err(GenericError::new)? - .body() - .await - .map_err(GenericError::new)?; - let response = String::from_utf8_lossy(response.as_ref()); - log::debug!("Funds requested. Response = {}", response); - // TODO: Verify tx hash - Ok(()) -} - -async fn resolve_faucet_url() -> Result { - match env::var(FAUCET_ADDR_ENVAR) { - Ok(addr) => Ok(addr), - _ => { - let faucet_host = resolver::resolve_yagna_srv_record(DEFAULT_FAUCET_SRV_PREFIX) - .await - .map_err(|_| GenericError::new("Faucet SRV record cannot be resolved"))?; - - Ok(format!("http://{}/zk/donatex", faucet_host)) - } - } -} diff --git a/core/payment-driver/zksync/src/zksync/mod.rs b/core/payment-driver/zksync/src/zksync/mod.rs deleted file mode 100644 index 3666a50042..0000000000 --- a/core/payment-driver/zksync/src/zksync/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -/* - Private mod to encapsulate all zksync logic, revealed from the `wallet`. -*/ - -pub mod wallet; - -pub mod faucet; -mod signer; -pub mod utils; diff --git a/core/payment-driver/zksync/src/zksync/signer.rs b/core/payment-driver/zksync/src/zksync/signer.rs deleted file mode 100644 index a45be24f80..0000000000 --- a/core/payment-driver/zksync/src/zksync/signer.rs +++ /dev/null @@ -1,168 +0,0 @@ -/* - Handle zksync signing. - - - EthereumSigner trait - - ya_service_bus connection to sign - - Helpers to convert byte formats/orders -*/ - -// External uses -use async_trait::async_trait; -use futures::{Future, FutureExt}; -use rlp::RlpStream; -use std::pin::Pin; -use tiny_keccak::keccak256; -use tokio::task; -use zksync::zksync_types::{ - tx::{PackedEthSignature, TxEthSignature}, - Address, -}; -use zksync_eth_signer::{error::SignerError, EthereumSigner, RawTransaction}; - -// Workspace uses -use ya_client_model::NodeId; -use ya_payment_driver::bus; - -pub struct YagnaEthSigner { - eth_address: Address, -} - -impl YagnaEthSigner { - pub fn new(eth_address: Address) -> Self { - Self { eth_address } - } -} - -impl Clone for YagnaEthSigner { - fn clone(&self) -> Self { - Self::new(self.eth_address) - } -} - -#[async_trait] -impl EthereumSigner for YagnaEthSigner { - async fn get_address(&self) -> Result { - Ok(self.eth_address) - } - - async fn sign_message(&self, message: &[u8]) -> Result { - log::debug!("YagnaEthSigner sign_message({})", hex::encode(message)); - let node_id = self.eth_address.as_bytes().into(); - let msg_as_bytes = message_to_signable_bytes(message, true); - let signature = sign_tx(node_id, msg_as_bytes).await?; - let signature = convert_to_eth_byte_order(signature); - let packed_sig = PackedEthSignature::deserialize_packed(&signature) - .map_err(|_| SignerError::SigningFailed("Failed to pack eth signature".to_string()))?; - let tx_eth_sig = TxEthSignature::EthereumSignature(packed_sig); - Ok(tx_eth_sig) - } - - async fn sign_transaction(&self, raw_tx: RawTransaction) -> Result, SignerError> { - log::debug!("YagnaEthSigner sign_transaction"); - - let node_id = self.eth_address.as_bytes().into(); - let payload: Vec = raw_tx.hash().into(); - let chain_id = raw_tx.chain_id as u64; - - let signature = sign_tx(node_id, payload.clone()).await?; - - Ok(encode_signed_tx(&raw_tx, signature, chain_id)) - } -} - -fn message_to_signable_bytes(msg: &[u8], include_prefix: bool) -> Vec { - let bytes = if include_prefix { - let prefix = format!("\x19Ethereum Signed Message:\n{}", msg.len()); - let mut b = Vec::with_capacity(prefix.len() + msg.len()); - b.extend_from_slice(prefix.as_bytes()); - b.extend_from_slice(msg); - b - } else { - msg.into() - }; - keccak256(&bytes).into() -} - -fn convert_to_eth_byte_order(signature: Vec) -> Vec { - // Yagna byte order (v, r s) - // Ethereum byte order (r, s, (v % 2 + 28)) - let v = &signature[0]; - let r = &signature[1..33]; - let s = &signature[33..65]; - let mut result = Vec::with_capacity(65); - result.extend_from_slice(r); - result.extend_from_slice(s); - result.push(if v % 2 == 1 { 0x1c } else { 0x1b }); - result -} - -fn sign_tx( - node_id: NodeId, - payload: Vec, -) -> Pin, SignerError>> + Send>> { - // The zksync EthereumAccount requires "Send", while the bus can not use "Send". - let fut = task::spawn_local(async move { - let signature = bus::sign(node_id, payload) - .await - .map_err(|e| SignerError::SigningFailed(format!("{:?}", e)))?; - Ok(signature) - }); - let fut = fut.map(|res| match res { - Ok(res) => res, - Err(e) => Err(SignerError::SigningFailed(e.to_string())), - }); - Box::pin(fut) -} - -fn encode_signed_tx(raw_tx: &RawTransaction, signature: Vec, chain_id: u64) -> Vec { - let (sig_v, sig_r, sig_s) = prepare_signature(signature, chain_id); - - let mut tx = RlpStream::new(); - - tx.begin_unbounded_list(); - - tx_encode(raw_tx, &mut tx); - tx.append(&sig_v); - tx.append(&sig_r); - tx.append(&sig_s); - - tx.finalize_unbounded_list(); - - tx.out().to_vec() -} - -fn prepare_signature(mut signature: Vec, chain_id: u64) -> (u64, Vec, Vec) { - // TODO ugly solution - assert_eq!(signature.len(), 65); - - let sig_v = signature[0]; - let sig_v = sig_v as u64 + chain_id * 2 + 35; - - let mut sig_r = signature.split_off(1); - let mut sig_s = sig_r.split_off(32); - - prepare_signature_part(&mut sig_r); - prepare_signature_part(&mut sig_s); - - (sig_v, sig_r, sig_s) -} - -fn prepare_signature_part(part: &mut Vec) { - assert_eq!(part.len(), 32); - while part[0] == 0 { - part.remove(0); - } -} - -fn tx_encode(tx: &RawTransaction, s: &mut RlpStream) { - s.append(&tx.nonce); - s.append(&tx.gas_price); - s.append(&tx.gas); - if let Some(ref t) = tx.to { - s.append(t); - } else { - s.append(&vec![]); - } - s.append(&tx.value); - s.append(&tx.data); -} diff --git a/core/payment-driver/zksync/src/zksync/utils.rs b/core/payment-driver/zksync/src/zksync/utils.rs deleted file mode 100644 index 5f927e6e13..0000000000 --- a/core/payment-driver/zksync/src/zksync/utils.rs +++ /dev/null @@ -1,77 +0,0 @@ -/* - Zksync related utilities. -*/ - -// External uses -use bigdecimal::BigDecimal; -use lazy_static::lazy_static; -use num_bigint::{BigInt, BigUint, ToBigInt}; -use zksync::utils::{closest_packable_token_amount, is_token_amount_packable}; - -// Workspace uses -use ya_payment_driver::model::GenericError; - -lazy_static! { - // TODO: Get token decimals from zksync-provider / wallet - pub static ref PRECISION: BigDecimal = BigDecimal::from(1_000_000_000_000_000_000u64); -} - -pub fn big_dec_to_big_uint(v: BigDecimal) -> Result { - let v = v * &(*PRECISION); - let v = v - .to_bigint() - .ok_or_else(|| GenericError::new("Failed to convert to bigint"))?; - let v = v - .to_biguint() - .ok_or_else(|| GenericError::new("Failed to convert to biguint"))?; - Ok(v) -} - -pub fn big_uint_to_big_dec(v: BigUint) -> BigDecimal { - let v: BigDecimal = Into::::into(v).into(); - v / &(*PRECISION) -} - -/// Find the closest **bigger** packable amount -pub fn pack_up(amount: &BigUint) -> BigUint { - let mut packable_amount = closest_packable_token_amount(amount); - while (&packable_amount < amount) || !is_token_amount_packable(&packable_amount) { - packable_amount = increase_least_significant_digit(&packable_amount); - } - packable_amount -} - -fn increase_least_significant_digit(amount: &BigUint) -> BigUint { - let digits = amount.to_radix_le(10); - for (i, digit) in digits.iter().enumerate() { - if *digit != 0 { - return amount + BigUint::from(10u32).pow(i as u32); - } - } - amount.clone() // zero -} - -#[cfg(test)] -mod tests { - use super::*; - use std::str::FromStr; - - #[test] - fn test_increase_least_significant_digit() { - let amount = BigUint::from_str("999000").unwrap(); - let increased = increase_least_significant_digit(&amount); - let expected = BigUint::from_str("1000000").unwrap(); - assert_eq!(increased, expected); - } - - #[test] - fn test_pack_up() { - let amount = BigUint::from_str("12300285190700000000").unwrap(); - let packable = pack_up(&amount); - assert!( - zksync::utils::is_token_amount_packable(&packable), - "Not packable!" - ); - assert!(packable >= amount, "To little!"); - } -} diff --git a/core/payment-driver/zksync/src/zksync/wallet.rs b/core/payment-driver/zksync/src/zksync/wallet.rs deleted file mode 100644 index 3d4c8e2e08..0000000000 --- a/core/payment-driver/zksync/src/zksync/wallet.rs +++ /dev/null @@ -1,552 +0,0 @@ -/* - Wallet functions on zksync. -*/ - -// External crates -use bigdecimal::{BigDecimal, Zero}; -use num_bigint::BigUint; -use std::env; -use std::str::FromStr; -use tokio_compat_02::FutureExt; -use zksync::operations::SyncTransactionHandle; -use zksync::types::BlockStatus; -use zksync::zksync_types::{ - tokens::ChangePubKeyFeeTypeArg, tx::TxHash, Address, Nonce, TxFeeTypes, H256, -}; -use zksync::{ - provider::{Provider, RpcProvider}, - Network as ZkNetwork, Wallet, WalletCredentials, -}; -use zksync_eth_signer::EthereumSigner; - -// Workspace uses -use ya_payment_driver::{ - db::models::Network, - model::{AccountMode, Enter, Exit, GenericError, Init, PaymentDetails}, - utils as base_utils, -}; - -// Local uses -use crate::{ - network::get_network_token, - zksync::{faucet, signer::YagnaEthSigner, utils}, - DEFAULT_NETWORK, -}; -use zksync::zksync_types::tx::ChangePubKeyType; - -pub async fn account_balance(address: &str, network: Network) -> Result { - let pub_address = Address::from_str(&address[2..]).map_err(GenericError::new)?; - let acc_info = get_provider(network) - .account_info(pub_address) - .compat() - .await - .map_err(GenericError::new)?; - // TODO: implement tokens, replace None - let token = get_network_token(network, None); - let balance_com = acc_info - .committed - .balances - .get(&token) - .map(|x| x.0.clone()) - .unwrap_or_else(BigUint::zero); - let balance = utils::big_uint_to_big_dec(balance_com); - log::debug!( - "account_balance. address={}, network={}, balance={}", - address, - &network, - &balance - ); - Ok(balance) -} - -pub async fn init_wallet(msg: &Init) -> Result<(), GenericError> { - log::debug!("init_wallet. msg={:?}", msg); - let mode = msg.mode(); - let address = msg.address().clone(); - let network = msg.network().unwrap_or_else(|| DEFAULT_NETWORK.to_string()); - let network = Network::from_str(&network).map_err(GenericError::new)?; - - if mode.contains(AccountMode::SEND) { - let wallet = get_wallet(&address, network).await?; - unlock_wallet(&wallet, network).await.map_err(|e| { - GenericError::new(format!( - "{:?} HINT: Did you run `yagna payment fund` and follow the instructions?", - e - )) - })?; - } - Ok(()) -} - -pub async fn fund(address: &str, network: Network) -> Result<(), GenericError> { - if network == Network::Mainnet { - return Err(GenericError::new("Wallet can not be funded on mainnet.")); - } - faucet::request_tglm(address, network).await?; - Ok(()) -} - -pub async fn exit(msg: &Exit) -> Result { - let network = msg.network().unwrap_or_else(|| DEFAULT_NETWORK.to_string()); - let network = Network::from_str(&network).map_err(GenericError::new)?; - let wallet = get_wallet(&msg.sender(), network).await?; - - let token = get_network_token(network, None); - let balance = get_balance(&wallet, &token).await?; - let unlock_fee = get_unlock_fee(&wallet, &token).await?; - let withdraw_fee = get_withdraw_fee(&wallet, &token).await?; - let total_fee = unlock_fee + withdraw_fee; - if balance < total_fee { - return Err(GenericError::new(format!( - "Not enough balance to exit. Minimum required balance to pay withdraw fees is {} {}", - utils::big_uint_to_big_dec(total_fee), - token - ))); - } - - unlock_wallet(&wallet, network).await?; - let tx_handle = withdraw(wallet, network, msg.amount(), msg.to()).await?; - let tx_info = tx_handle - .wait_for_commit() - .compat() - .await - .map_err(GenericError::new)?; - - match tx_info.success { - Some(true) => Ok(hash_to_hex(tx_handle.hash())), - Some(false) => Err(GenericError::new( - tx_info - .fail_reason - .unwrap_or_else(|| "Unknown failure reason".to_string()), - )), - None => Err(GenericError::new("Transaction time-outed")), - } -} - -pub async fn enter(msg: Enter) -> Result { - let network = msg.network.unwrap_or_else(|| DEFAULT_NETWORK.to_string()); - let network = Network::from_str(&network).map_err(GenericError::new)?; - let wallet = get_wallet(&msg.address, network).await?; - - let tx_hash = deposit(wallet, network, msg.amount).await?; - - Ok(hex::encode(tx_hash.as_fixed_bytes())) -} - -pub async fn get_tx_fee(address: &str, network: Network) -> Result { - let token = get_network_token(network, None); - let wallet = get_wallet(address, network).await?; - let tx_fee = wallet - .provider - .get_tx_fee(TxFeeTypes::Transfer, wallet.address(), token.as_str()) - .await - .map_err(GenericError::new)? - .total_fee; - let tx_fee_bigdec = utils::big_uint_to_big_dec(tx_fee); - - log::debug!("Transaction fee {:.5} {}", tx_fee_bigdec, token.as_str()); - Ok(tx_fee_bigdec) -} - -fn hash_to_hex(hash: TxHash) -> String { - // TxHash::to_string adds a prefix to the hex value - hex::encode(hash.as_ref()) -} - -pub async fn get_nonce(address: &str, network: Network) -> u32 { - let addr = match Address::from_str(&address[2..]) { - Ok(a) => a, - Err(e) => { - log::error!("Unable to parse address, failed to get nonce. {:?}", e); - return 0; - } - }; - let provider = get_provider(network); - let account_info = match provider.account_info(addr).compat().await { - Ok(i) => i, - Err(e) => { - log::error!("Unable to get account info, failed to get nonce. {:?}", e); - return 0; - } - }; - *account_info.committed.nonce -} - -pub async fn make_transfer( - details: &PaymentDetails, - nonce: u32, - network: Network, -) -> Result { - log::debug!("make_transfer. {:?}", details); - let amount = details.amount.clone(); - let amount = utils::big_dec_to_big_uint(amount)?; - let amount = utils::pack_up(&amount); - - let sender = details.sender.clone(); - let wallet = get_wallet(&sender, network).await?; - let token = get_network_token(network, None); - - let balance = get_balance(&wallet, &token).await?; - log::debug!("balance before transfer={}", balance); - - let transfer_builder = wallet - .start_transfer() - .nonce(Nonce(nonce)) - .str_to(&details.recipient[2..]) - .map_err(GenericError::new)? - .token(token.as_str()) - .map_err(GenericError::new)? - .amount(amount.clone()); - log::debug!( - "transfer raw data. nonce={}, to={}, token={}, amount={}", - nonce, - &details.recipient, - token, - amount - ); - let transfer = transfer_builder - .send() - .compat() - .await - .map_err(GenericError::new)?; - - let tx_hash = hex::encode(transfer.hash()); - log::info!("Created zksync transaction with hash={}", tx_hash); - Ok(tx_hash) -} - -pub async fn check_tx(tx_hash: &str, network: Network) -> Option> { - let provider = get_provider(network); - let tx_hash = format!("sync-tx:{}", tx_hash); - let tx_hash = TxHash::from_str(&tx_hash).unwrap(); - let tx_info = provider.tx_info(tx_hash).compat().await.unwrap(); - log::trace!("tx_info: {:?}", tx_info); - match tx_info.success { - None => None, - Some(true) => Some(Ok(())), - Some(false) => match tx_info.fail_reason { - Some(err) => Some(Err(err)), - None => Some(Err("Unknown failure".to_string())), - }, - } -} - -#[derive(serde::Deserialize)] -struct TxRespObj { - to: String, - from: String, - amount: String, - created_at: String, -} - -pub async fn verify_tx(tx_hash: &str, network: Network) -> Result { - let provider_url = get_rpc_addr(network); - - // HACK: Get the transaction data from v0.1 api - let api_url = provider_url.replace("/jsrpc", "/api/v0.1"); - let req_url = format!("{}/transactions_all/{}", api_url, tx_hash); - log::debug!("Request URL: {}", &req_url); - - let client = awc::Client::new(); - let response = client - .get(req_url) - .send() - .await - .map_err(GenericError::new)? - .body() - .await - .map_err(GenericError::new)?; - let response = String::from_utf8_lossy(response.as_ref()); - log::trace!("Request response: {}", &response); - let v: TxRespObj = serde_json::from_str(&response).map_err(GenericError::new)?; - - let recipient = v.to; - let sender = v.from; - let amount = - utils::big_uint_to_big_dec(BigUint::from_str(&v.amount).map_err(GenericError::new)?); - let date_str = format!("{}Z", v.created_at); - let date = Some(chrono::DateTime::from_str(&date_str).map_err(GenericError::new)?); - let details = PaymentDetails { - recipient, - sender, - amount, - date, - }; - log::debug!("PaymentDetails from server: {:?}", &details); - - Ok(details) -} - -fn get_provider(network: Network) -> RpcProvider { - RpcProvider::from_addr_and_network(get_rpc_addr(network), get_zk_network(network)) -} - -fn get_rpc_addr(network: Network) -> String { - match network { - Network::Mainnet => env::var("ZKSYNC_MAINNET_RPC_ADDRESS") - .unwrap_or_else(|_| "https://api.zksync.golem.network/jsrpc".to_string()), - Network::Rinkeby => env::var("ZKSYNC_RINKEBY_RPC_ADDRESS") - .unwrap_or_else(|_| "https://rinkeby-api.zksync.golem.network/jsrpc".to_string()), - Network::Goerli => panic!("Goerli not supported on zksync"), - Network::Polygon => panic!("Polygon not supported on zksync"), - Network::Mumbai => panic!("Mumbai not supported on zksync"), - } -} - -fn get_ethereum_node_addr_from_env(network: Network) -> String { - match network { - Network::Mainnet => env::var("MAINNET_GETH_ADDR") - .unwrap_or_else(|_| "https://geth.golem.network:55555".to_string()), - Network::Rinkeby => env::var("RINKEBY_GETH_ADDR") - .unwrap_or_else(|_| "http://geth.testnet.golem.network:55555".to_string()), - Network::Goerli => panic!("Goerli not supported on zksync"), - Network::Polygon => panic!("Polygon mainnet not supported on zksync"), - Network::Mumbai => panic!("Polygon mumbai not supported on zksync"), - } -} - -fn get_ethereum_confirmation_timeout() -> std::time::Duration { - let value = std::env::var("ZKSYNC_ETH_CONFIRMATION_TIMEOUT_SECONDS") - .unwrap_or_else(|_| "60".to_owned()); - std::time::Duration::from_secs(value.parse::().unwrap()) -} - -async fn get_wallet( - address: &str, - network: Network, -) -> Result, GenericError> { - log::debug!("get_wallet {:?}", address); - let addr = Address::from_str(&address[2..]).map_err(GenericError::new)?; - let provider = get_provider(network); - let signer = YagnaEthSigner::new(addr); - let credentials = WalletCredentials::from_eth_signer(addr, signer, get_zk_network(network)) - .compat() - .await - .map_err(GenericError::new)?; - let wallet = Wallet::new(provider, credentials) - .compat() - .await - .map_err(GenericError::new)?; - Ok(wallet) -} - -fn get_zk_network(network: Network) -> ZkNetwork { - ZkNetwork::from_str(&network.to_string()).unwrap() // _or(ZkNetwork::Rinkeby) -} - -async fn unlock_wallet( - wallet: &Wallet, - network: Network, -) -> Result<(), GenericError> { - log::debug!("unlock_wallet"); - if !wallet - .is_signing_key_set() - .compat() - .await - .map_err(GenericError::new)? - { - log::info!("Unlocking wallet... address = {}", wallet.signer.address); - let token = get_network_token(network, None); - let balance = get_balance(wallet, &token).await?; - let unlock_fee = get_unlock_fee(wallet, &token).await?; - if unlock_fee > balance { - return Err(GenericError::new("Not enough balance to unlock account")); - } - - let unlock = wallet - .start_change_pubkey() - .fee(unlock_fee) - .fee_token(token.as_str()) - .map_err(|e| { - GenericError::new(format!("Failed to create change_pubkey request: {}", e)) - })? - .send() - .compat() - .await - .map_err(|e| { - GenericError::new(format!("Failed to send change_pubkey request: {}", e)) - })?; - log::info!("Unlock send. tx_hash= {}", unlock.hash().to_string()); - - let tx_info = unlock - .wait_for_commit() - .compat() - .await - .map_err(GenericError::new)?; - log::debug!("tx_info = {:?}", tx_info); - match tx_info.success { - Some(true) => log::info!("Wallet successfully unlocked. address = {}", wallet.signer.address), - Some(false) => return Err(GenericError::new(format!("Failed to unlock wallet. reason={}", tx_info.fail_reason.unwrap_or_else(|| "Unknown reason".to_string())))), - None => return Err(GenericError::new(format!("Unknown result from zksync unlock, please check your wallet on zkscan and try again. {:?}", tx_info))), - } - } - Ok(()) -} - -pub async fn withdraw( - wallet: Wallet, - network: Network, - amount: Option, - recipient: Option, -) -> Result, GenericError> { - let token = get_network_token(network, None); - let balance = get_balance(&wallet, &token).await?; - info!( - "Wallet funded with {} {} available for withdrawal", - utils::big_uint_to_big_dec(balance.clone()), - token - ); - - info!("Obtaining withdrawal fee"); - let withdraw_fee = get_withdraw_fee(&wallet, &token).await?; - info!( - "Withdrawal transaction fee {:.5} {}", - utils::big_uint_to_big_dec(withdraw_fee.clone()), - token - ); - if withdraw_fee > balance { - return Err(GenericError::new("Not enough balance to withdraw")); - } - - let amount = match amount { - Some(amount) => utils::big_dec_to_big_uint(amount)?, - None => balance.clone(), - }; - let withdraw_amount = std::cmp::min(balance - &withdraw_fee, amount); - info!( - "Withdrawal of {:.5} {} started", - utils::big_uint_to_big_dec(withdraw_amount.clone()), - token - ); - - let recipient_address = match recipient { - Some(addr) => Address::from_str(&addr[2..]).map_err(GenericError::new)?, - None => wallet.address(), - }; - - let withdraw_builder = wallet - .start_withdraw() - .fee(withdraw_fee) - .token(token.as_str()) - .map_err(GenericError::new)? - .amount(withdraw_amount.clone()) - .to(recipient_address); - log::debug!( - "Withdrawal raw data. token={}, amount={}, to={}", - token, - withdraw_amount, - recipient_address - ); - let withdraw_handle = withdraw_builder - .send() - .compat() - .await - .map_err(GenericError::new)?; - - Ok(withdraw_handle) -} - -async fn get_balance( - wallet: &Wallet, - token: &str, -) -> Result { - let balance = wallet - .get_balance(BlockStatus::Committed, token) - .compat() - .await - .map_err(GenericError::new)?; - Ok(balance) -} - -async fn get_withdraw_fee( - wallet: &Wallet, - token: &str, -) -> Result { - let withdraw_fee = wallet - .provider - .get_tx_fee(TxFeeTypes::Withdraw, wallet.address(), token) - .compat() - .await - .map_err(GenericError::new)? - .total_fee; - Ok(withdraw_fee) -} - -async fn get_unlock_fee( - wallet: &Wallet, - token: &str, -) -> Result { - if wallet - .is_signing_key_set() - .compat() - .await - .map_err(GenericError::new)? - { - return Ok(BigUint::zero()); - } - let unlock_fee = wallet - .provider - .get_tx_fee( - TxFeeTypes::ChangePubKey(ChangePubKeyFeeTypeArg::ContractsV4Version( - ChangePubKeyType::ECDSA, - )), - wallet.address(), - token, - ) - .compat() - .await - .map_err(GenericError::new)? - .total_fee; - Ok(unlock_fee) -} - -pub async fn deposit( - wallet: Wallet, - network: Network, - amount: BigDecimal, -) -> Result { - let token = get_network_token(network, None); - let amount = base_utils::big_dec_to_u256(&amount); - let address = wallet.address(); - - log::info!( - "Starting deposit into ZkSync network. Address {:#x}, amount: {} of {}", - address, - amount, - token - ); - - let mut ethereum = wallet - .ethereum(get_ethereum_node_addr_from_env(network)) - .await - .map_err(GenericError::new)?; - ethereum.set_confirmation_timeout(get_ethereum_confirmation_timeout()); - - if !ethereum - .is_limited_erc20_deposit_approved(token.as_str(), amount) - .await - .unwrap() - { - let tx = ethereum - .limited_approve_erc20_token_deposits(token.as_str(), amount) - .await - .map_err(GenericError::new)?; - info!( - "Approve erc20 token for ZkSync deposit. Tx: https://rinkeby.etherscan.io/tx/{:#x}", - tx - ); - - ethereum.wait_for_tx(tx).await.map_err(GenericError::new)?; - } - - let deposit_tx_hash = ethereum - .deposit(token.as_str(), amount, address) - .await - .map_err(GenericError::new)?; - info!( - "Check out deposit transaction at https://rinkeby.etherscan.io/tx/{:#x}", - deposit_tx_hash - ); - - Ok(deposit_tx_hash) -} diff --git a/core/payment/Cargo.toml b/core/payment/Cargo.toml index 38fb173c85..00388cbda6 100644 --- a/core/payment/Cargo.toml +++ b/core/payment/Cargo.toml @@ -10,7 +10,13 @@ default = [] [dependencies] ya-agreement-utils = { version = "0.5.0" } ya-client-model = { version = "0.5", features = ["with-diesel"] } -ya-core-model = { version = "^0.9", features = [ "activity", "driver", "identity", "market", "payment" ] } +ya-core-model = { version = "^0.9", features = [ + "activity", + "driver", + "identity", + "market", + "payment", +] } ya-net = "0.3" ya-metrics = "0.2" ya-persistence = "0.3" @@ -24,13 +30,18 @@ anyhow = "1.0" base64 = "0.12" bigdecimal = "0.2" chrono = { version = "0.4", features = ["serde"] } -diesel = { version = "1.4", features = [ "sqlite", "r2d2", "chrono", "bigdecimal" ] } +diesel = { version = "1.4", features = [ + "sqlite", + "r2d2", + "chrono", + "bigdecimal", +] } diesel_migrations = "1.4" dotenv = "0.15.0" env_logger = "0.7" futures = "0.3" hex = "0.4" -metrics="0.12" +metrics = "0.12" lazy_static = "1.4" libsqlite3-sys = { workspace = true } log = "0.4" @@ -43,13 +54,14 @@ thiserror = "1.0" tokio = { version = "1", features = ["fs", "signal", "macros"] } uint = "0.7" uuid = { version = "0.8", features = ["v4"] } -humantime="2.0.1" +humantime = "2.0.1" +erc20_payment_lib = { workspace = true } [dev-dependencies] ya-client = "0.7" ya-dummy-driver = "0.3" ya-erc20-driver = "0.4" -ya-zksync-driver = "0.3" +ya-erc20next-driver = "0.4" ya-net = { version = "0.3", features = ["service"] } ya-sb-router = "0.6.1" diff --git a/core/payment/examples/payment_api.rs b/core/payment/examples/payment_api.rs index 1d5ce8b786..a6d803ccdc 100644 --- a/core/payment/examples/payment_api.rs +++ b/core/payment/examples/payment_api.rs @@ -30,13 +30,12 @@ use ya_service_api_web::middleware::Identity; use ya_service_api_web::rest_api_addr; use ya_service_api_web::scope::ExtendableScope; use ya_service_bus::typed as bus; -use ya_zksync_driver as zksync; #[derive(Clone, Debug, StructOpt)] enum Driver { Dummy, Erc20, - Zksync, + Erc20next, } impl FromStr for Driver { @@ -45,8 +44,8 @@ impl FromStr for Driver { fn from_str(s: &str) -> anyhow::Result { match s.to_lowercase().as_str() { "dummy" => Ok(Driver::Dummy), - "erc20" => Ok(Driver::Erc20), - "zksync" => Ok(Driver::Zksync), + "erc20legacy" => Ok(Driver::Erc20), + "erc20" => Ok(Driver::Erc20next), s => Err(anyhow::Error::msg(format!("Invalid driver: {}", s))), } } @@ -56,8 +55,8 @@ impl std::fmt::Display for Driver { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Driver::Dummy => write!(f, "dummy"), - Driver::Erc20 => write!(f, "erc20"), - Driver::Zksync => write!(f, "zksync"), + Driver::Erc20 => write!(f, "erc20legacy"), + Driver::Erc20next => write!(f, "erc20"), } } } @@ -108,7 +107,7 @@ pub async fn start_erc20_driver( Ok(()) } -pub async fn start_zksync_driver( +pub async fn start_erc20_next_driver( db: &DbExecutor, requestor_account: SecretKey, ) -> anyhow::Result<()> { @@ -116,7 +115,8 @@ pub async fn start_zksync_driver( fake_list_identities(vec![requestor]); fake_subscribe_to_events(); - zksync::PaymentDriverService::gsb(db).await?; + erc20::PaymentDriverService::gsb(db).await?; + let requestor_sign_tx = get_sign_tx(requestor_account); fake_sign_tx(Box::new(requestor_sign_tx)); Ok(()) @@ -257,9 +257,10 @@ async fn main() -> anyhow::Result<()> { start_erc20_driver(&db, requestor_account).await?; erc20::DRIVER_NAME } - Driver::Zksync => { - start_zksync_driver(&db, requestor_account).await?; - zksync::DRIVER_NAME + Driver::Erc20next => { + //start_erc20next_driver(&db, requestor_account).await?; + //erc20next::DRIVER_NAME + todo!() } }; bus::service(driver_bus_id(driver_name)) diff --git a/core/payment/src/api/allocations.rs b/core/payment/src/api/allocations.rs index 416e35fc63..8a3e1a3092 100644 --- a/core/payment/src/api/allocations.rs +++ b/core/payment/src/api/allocations.rs @@ -81,6 +81,7 @@ async fn create_allocation( }; if let Err(e) = init_account(acc).await { + log::error!("Error initializing account: {:?}", e); return response::server_error(&e); } } diff --git a/core/serv/src/main.rs b/core/serv/src/main.rs index 5d6244fb83..684a296ca1 100644 --- a/core/serv/src/main.rs +++ b/core/serv/src/main.rs @@ -289,6 +289,13 @@ async fn start_payment_drivers(data_dir: &Path) -> anyhow::Result> { PaymentDriverService::gsb(&db_executor).await?; drivers.push(DRIVER_NAME.to_owned()); } + #[cfg(feature = "erc20next-driver")] + { + use ya_erc20next_driver::{PaymentDriverService, DRIVER_NAME}; + let db_executor = DbExecutor::from_data_dir(data_dir, "erc20next-driver")?; + PaymentDriverService::gsb(&db_executor).await?; + drivers.push(DRIVER_NAME.to_owned()); + } #[cfg(feature = "zksync-driver")] { use ya_zksync_driver::{PaymentDriverService, DRIVER_NAME}; @@ -500,8 +507,9 @@ impl ServiceCommand { // to enable it explicitly set RUST_LOG=info or more verbose env::set_var( "RUST_LOG", - env::var("RUST_LOG") - .unwrap_or_else(|_| "info,actix_web::middleware::logger=warn".to_string()), + env::var("RUST_LOG").unwrap_or_else(|_| { + "info,actix_web::middleware::logger=warn,sqlx=warn".to_string() + }), ); //this force_debug flag sets default log level to debug diff --git a/golem_cli/src/command/yagna.rs b/golem_cli/src/command/yagna.rs index 85edecf4fb..a63e62df32 100644 --- a/golem_cli/src/command/yagna.rs +++ b/golem_cli/src/command/yagna.rs @@ -54,6 +54,54 @@ lazy_static! { pub static ref ERC20_DRIVER: PaymentDriver = { let mut erc20 = HashMap::new(); erc20.insert( + NetworkName::Mainnet.into(), + PaymentPlatform { + platform: "erc20legacy-mainnet-glm", + driver: "erc20legacy", + token: "GLM", + }, + ); + erc20.insert( + NetworkName::Rinkeby.into(), + PaymentPlatform { + platform: "erc20legacy-rinkeby-tglm", + driver: "erc20legacy", + token: "tGLM", + }, + ); + erc20.insert( + NetworkName::Goerli.into(), + PaymentPlatform { + platform: "erc20legacy-goerli-tglm", + driver: "erc20legacy", + token: "tGLM", + }, + ); + erc20.insert( + NetworkName::Mumbai.into(), + PaymentPlatform { + platform: "erc20legacy-mumbai-tglm", + driver: "erc20legacy", + token: "tGLM", + }, + ); + erc20.insert( + NetworkName::Polygon.into(), + PaymentPlatform { + platform: "erc20legacy-polygon-glm", + driver: "erc20legacy", + token: "GLM", + }, + ); + + PaymentDriver { + platforms: erc20, + name: "erc20", + } + }; + pub static ref ERC20NEXT_DRIVER: PaymentDriver = { + let mut erc20next = HashMap::new(); + erc20next.insert( NetworkName::Mainnet.into(), PaymentPlatform { platform: "erc20-mainnet-glm", @@ -61,7 +109,7 @@ lazy_static! { token: "GLM", }, ); - erc20.insert( + erc20next.insert( NetworkName::Rinkeby.into(), PaymentPlatform { platform: "erc20-rinkeby-tglm", @@ -69,7 +117,7 @@ lazy_static! { token: "tGLM", }, ); - erc20.insert( + erc20next.insert( NetworkName::Goerli.into(), PaymentPlatform { platform: "erc20-goerli-tglm", @@ -77,7 +125,7 @@ lazy_static! { token: "tGLM", }, ); - erc20.insert( + erc20next.insert( NetworkName::Mumbai.into(), PaymentPlatform { platform: "erc20-mumbai-tglm", @@ -85,7 +133,7 @@ lazy_static! { token: "tGLM", }, ); - erc20.insert( + erc20next.insert( NetworkName::Polygon.into(), PaymentPlatform { platform: "erc20-polygon-glm", @@ -95,7 +143,7 @@ lazy_static! { ); PaymentDriver { - platforms: erc20, + platforms: erc20next, name: "erc20", } }; From 6d5f05dfc5fe085c422e26d804e07347394ded7f Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 29 Aug 2023 10:57:01 +0200 Subject: [PATCH 018/123] erc20next: remove view_transactions.sql --- .../erc20next/view_transactions.sql | 39 ------------------- 1 file changed, 39 deletions(-) delete mode 100644 core/payment-driver/erc20next/view_transactions.sql diff --git a/core/payment-driver/erc20next/view_transactions.sql b/core/payment-driver/erc20next/view_transactions.sql deleted file mode 100644 index a2400aee79..0000000000 --- a/core/payment-driver/erc20next/view_transactions.sql +++ /dev/null @@ -1,39 +0,0 @@ ---use this query to debug and view ERC20 transaction list - - -SELECT tx_id, - ts.status || '(' || t.status || ')' as `status`, - Cast ((julianday('now') - julianday(time_created)) * 24 * 60 * 60 as integer) as `Created ago`, - Cast ((julianday('now') - julianday(time_last_action)) * 24 * 60 * 60 as integer) as `Last action ago`, - Cast ((julianday('now') - julianday(time_sent)) * 24 * 60 * 60 as integer) as `Last sent ago`, - Cast ((julianday('now') - julianday(time_confirmed)) * 24 * 60 * 60 as integer) as `Last confirmed ago`, - Cast ((julianday(time_confirmed) - julianday(time_created)) * 24 * 60 * 60 as integer) as `Total process time`, - nonce, - starting_gas_price, - current_gas_price, - max_gas_price, - final_gas_price, - final_gas_price_exact, - final_gas_used, - amount_base, - amount_base_exact, - amount_erc20, - amount_erc20_exact, - tx_type, - tmp_onchain_txs, - final_tx, - gas_limit, - time_created, - time_last_action, - time_sent, - time_confirmed, - network, - last_error_msg, - resent_times, - signature, - sender, - encoded - FROM `transaction` as t - JOIN `transaction_status` as ts on ts.status_id=t.status - ORDER BY time_created DESC - From 74411181758598c1d7768de93d83c75f175bfd5d Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 5 Sep 2023 13:24:20 +0200 Subject: [PATCH 019/123] Remove outdated output of payment fund --polygon (#2730) --- core/payment-driver/erc20/src/driver/cli.rs | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/core/payment-driver/erc20/src/driver/cli.rs b/core/payment-driver/erc20/src/driver/cli.rs index f7b2312e89..e1099230fc 100644 --- a/core/payment-driver/erc20/src/driver/cli.rs +++ b/core/payment-driver/erc20/src/driver/cli.rs @@ -89,15 +89,7 @@ To be able to use Mumbai Polygon network, please send some GLM tokens and MATIC Network::Polygon => format!( r#"Your mainnet Polygon address is {}. -To fund your wallet and be able to pay for your activities on Golem head to -the https://chat.golem.network, join the #funding channel and type /terms -and follow instructions to request GLMs. - -Mind that to be eligible you have to run your app at least once on testnet - -- we will verify if that is true so we can avoid people requesting "free GLMs". - -You will also need some MATIC for gas. You can acquire them by visiting - https://macncheese.finance/matic-polygon-mainnet-faucet.php +Automatically obtaining funds for the Polygon network is not supported. "#, address ), From 683bfd56d0302622ed1ed2b3fa6d4aeb93e41881 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 5 Sep 2023 13:24:29 +0200 Subject: [PATCH 020/123] Document app-key create --id (#2729) --- core/identity/src/cli/appkey.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/core/identity/src/cli/appkey.rs b/core/identity/src/cli/appkey.rs index 2eb1b46d8f..4f3653158b 100644 --- a/core/identity/src/cli/appkey.rs +++ b/core/identity/src/cli/appkey.rs @@ -15,6 +15,7 @@ pub enum AppKeyCommand { name: String, #[structopt(skip = model::DEFAULT_ROLE)] role: String, + /// Select identity for this app-key. #[structopt(long)] id: Option, /// Set cors policy for request made using this app-key. From fef0d20472243dfed46befb74e753a4c349e2833 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Wed, 6 Sep 2023 14:39:20 +0200 Subject: [PATCH 021/123] Use erc20_payment_lib for checking token & gas balance (#2732) * Use erc20_payment_lib for checking token & gas balance * .gitignore: erc20next files * Use PaymentDriver::transfer instead of low-level create_/insert_ --- .gitignore | 5 + Cargo.lock | 2 + Cargo.toml | 3 +- core/payment-driver/erc20next/src/driver.rs | 103 +++++++++++------- .../erc20next/src/driver/api.rs | 71 +----------- core/payment-driver/erc20next/src/service.rs | 8 +- 6 files changed, 80 insertions(+), 112 deletions(-) diff --git a/.gitignore b/.gitignore index b2fb991625..309bca222a 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,11 @@ workdir/* core/market/decentralized/tests/test-workdir/* releases/ +# erc20next +db.sqlite +db.sqlite-shm +db.sqlite-wal + # IDEs .idea .vs diff --git a/Cargo.lock b/Cargo.lock index 58092c4cb3..0173109335 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1882,6 +1882,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.1.9" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=9b6d23a5d8844f26a98abed5f2d85b7a96d8cbb2#9b6d23a5d8844f26a98abed5f2d85b7a96d8cbb2" dependencies = [ "actix-files", "actix-web", @@ -1894,6 +1895,7 @@ dependencies = [ "humantime 2.1.0", "lazy_static", "log", + "percent-encoding", "rand 0.8.5", "rust_decimal", "rustc-hex", diff --git a/Cargo.toml b/Cargo.toml index b45c2c542e..95fc46ff31 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,8 @@ path = "core/serv/src/main.rs" # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } +# erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "9b6d23a5d8844f26a98abed5f2d85b7a96d8cbb2" } #erc20_payment_lib = { version = "=0.1.9" } [dependencies] diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index 2c1ade15e2..2fe13eb954 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -4,10 +4,9 @@ Please limit the logic in this file, use local mods to handle the calls. */ // Extrnal crates -use erc20_payment_lib::db::ops::insert_token_transfer; -use erc20_payment_lib::runtime::PaymentRuntime; -use erc20_payment_lib::transaction::create_token_transfer; +use erc20_payment_lib::runtime::{PaymentRuntime, TransferType}; use ethereum_types::H160; +use num_bigint::BigInt; use std::collections::HashMap; use std::str::FromStr; use uuid::Uuid; @@ -26,7 +25,7 @@ use ya_payment_driver::{ }; // Local uses -use crate::erc20::utils::big_dec_to_u256; +use crate::{erc20::utils::big_dec_to_u256, network::platform_to_currency}; use crate::{network::SUPPORTED_NETWORKS, DRIVER_NAME, RINKEBY_NETWORK}; mod api; @@ -95,38 +94,17 @@ impl Erc20NextDriver { .map_err(|err| GenericError::new(format!("Error when parsing receiver {err:?}")))?; let amount = big_dec_to_u256(amount)?; - let chain_id = self - .payment_runtime - .setup - .chain_setup - .values() - .find(|chain_setup| &chain_setup.network == network) - .ok_or_else(|| GenericError::new(format!("Unsupported network: {}", network)))? - .chain_id; - - let chain_cfg = self - .payment_runtime - .setup - .chain_setup - .get(&chain_id) - .ok_or(GenericError::new(format!( - "Cannot find chain cfg for chain {chain_id}" - )))?; - - let glm_address = chain_cfg.glm_address.ok_or(GenericError::new(format!( - "Cannot find GLM address for chain {chain_id}" - )))?; - let payment_id = Uuid::new_v4().to_simple().to_string(); - let token_transfer = create_token_transfer( - sender, - receiver, - chain_cfg.chain_id, - Some(&payment_id), - Some(glm_address), - amount, - ); - let _res = insert_token_transfer(&self.payment_runtime.conn, &token_transfer) + + self.payment_runtime + .transfer( + network, + sender, + receiver, + TransferType::Token, + amount, + &payment_id, + ) .await .map_err(|err| GenericError::new(format!("Error when inserting transfer {err:?}")))?; @@ -172,7 +150,29 @@ impl PaymentDriver for Erc20NextDriver { _caller: String, msg: GetAccountBalance, ) -> Result { - api::get_account_balance(msg).await + let platform = msg.platform(); + let network = platform.split("-").nth(1).ok_or(GenericError::new(format!( + "Malformed platform string: {}", + msg.platform() + )))?; + + let address_str = msg.address(); + let address = H160::from_str(&address_str).map_err(|e| { + GenericError::new(format!( + "{} isn't a valid H160 address: {}", + address_str, + e.to_string() + )) + })?; + + let balance = self + .payment_runtime + .get_token_balance(network.to_string(), address) + .await + .map_err(|e| GenericError::new(e.to_string()))?; + let balance_int = BigInt::from_str(&format!("{balance}")).unwrap(); + + Ok(BigDecimal::new(balance_int, 18)) } async fn get_account_gas_balance( @@ -181,7 +181,36 @@ impl PaymentDriver for Erc20NextDriver { _caller: String, msg: GetAccountGasBalance, ) -> Result, GenericError> { - api::get_account_gas_balance(msg).await + let platform = msg.platform(); + let network = platform.split("-").nth(1).ok_or(GenericError::new(format!( + "Malformed platform string: {}", + msg.platform() + )))?; + + let address_str = msg.address(); + let address = H160::from_str(&address_str).map_err(|e| { + GenericError::new(format!( + "{} isn't a valid H160 address: {}", + address_str, + e.to_string() + )) + })?; + + let balance = self + .payment_runtime + .get_gas_balance(network.to_string(), address) + .await + .map_err(|e| GenericError::new(e.to_string()))?; + let balance_int = BigInt::from_str(&format!("{balance}")).unwrap(); + let balance = BigDecimal::new(balance_int, 18); + + let (currency_short_name, currency_long_name) = platform_to_currency(platform)?; + + Ok(Some(GasDetails { + currency_long_name, + currency_short_name, + balance, + })) } fn get_name(&self) -> String { diff --git a/core/payment-driver/erc20next/src/driver/api.rs b/core/payment-driver/erc20next/src/driver/api.rs index dbf89eb3dd..f21fa43471 100644 --- a/core/payment-driver/erc20next/src/driver/api.rs +++ b/core/payment-driver/erc20next/src/driver/api.rs @@ -4,89 +4,20 @@ // Extrnal crates // use lazy_static::lazy_static; // use num_bigint::BigInt; -use uuid::Uuid; // Workspace uses use ya_payment_driver::{ driver::BigDecimal, - model::{ - GasDetails, GenericError, GetAccountBalance, GetAccountGasBalance, SchedulePayment, - ValidateAllocation, VerifyPayment, - }, + model::{GenericError, ValidateAllocation, VerifyPayment}, }; // Local uses use crate::{ - dao::Erc20Dao, driver::PaymentDetails, erc20::{utils, wallet}, network, }; -// lazy_static! { -// static ref MAX_ALLOCATION_SURCHARGE: BigDecimal = -// match std::env::var("MAX_ALLOCATION_SURCHARGE").map(|s| s.parse()) { -// Ok(Ok(x)) => x, -// _ => BigDecimal::from(200), -// }; -// -// // Environment variable will be replaced by allocation parameter in PAY-82 -// static ref TRANSACTIONS_PER_ALLOCATION: BigInt = -// match std::env::var("TRANSACTIONS_PER_ALLOCATION").map(|s| s.parse()) { -// Ok(Ok(x)) => x, -// _ => BigInt::from(10), -// }; -// } - -pub async fn get_account_balance(msg: GetAccountBalance) -> Result { - log::debug!("get_account_balance: {:?}", msg); - let (network, _) = network::platform_to_network_token(msg.platform())?; - let address = utils::str_to_addr(&msg.address())?; - // TODO implement token - let balance = wallet::account_balance(address, network).await?; - - log::info!( - "get_account_balance() - account={}, balance={}", - &msg.address(), - &balance - ); - Ok(balance) -} - -pub async fn get_account_gas_balance( - msg: GetAccountGasBalance, -) -> Result, GenericError> { - log::debug!("get_account_gas_balance: {:?}", msg); - let (currency_short_name, currency_long_name) = network::platform_to_currency(msg.platform())?; - let (network, _) = network::platform_to_network_token(msg.platform())?; - - let address = utils::str_to_addr(&msg.address())?; - - let balance = wallet::account_gas_balance(address, network).await?; - - log::info!( - "get_account_gas_balance() - account={}, balance={}, currency {}", - &msg.address(), - &balance, - currency_long_name - ); - Ok(Some(GasDetails { - currency_short_name, - currency_long_name, - balance, - })) -} - -pub async fn _schedule_payment( - dao: &Erc20Dao, - msg: SchedulePayment, -) -> Result { - let order_id = Uuid::new_v4().to_string(); - dao.insert_payment(&order_id, &msg).await?; - log::info!("schedule_payment()"); - Ok(order_id) -} - pub async fn verify_payment(msg: VerifyPayment) -> Result { log::debug!("verify_payment: {:?}", msg); let (network, _) = network::platform_to_network_token(msg.platform())?; diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index 40f2e77165..15c220a59b 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -2,12 +2,12 @@ The service that binds this payment driver into yagna via GSB. */ -use std::env; +use std::{env, path::Path}; // External crates use erc20_payment_lib::config; use erc20_payment_lib::config::AdditionalOptions; use erc20_payment_lib::misc::load_private_keys; -use erc20_payment_lib::runtime::start_payment_engine; +use erc20_payment_lib::runtime::PaymentRuntime; use std::sync::Arc; // Workspace uses @@ -63,9 +63,9 @@ impl Erc20NextService { log::warn!("Starting payment engine: {:#?}", config); let signer = IdentitySigner::new(); - let pr = start_payment_engine( + let pr = PaymentRuntime::new( &private_keys, - "db.sqlite", + Path::new("db.sqlite"), config, signer, None, From 1d5e89e6a55a02abfe81b1977bf370649e92befa Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Thu, 7 Sep 2023 16:28:15 +0200 Subject: [PATCH 022/123] Bump goth --- goth_tests/pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index 20a53dd18c..f9414413a4 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -21,7 +21,7 @@ pytest-rerunfailures = "^10.3" pytest-split = "^0.8.1" # goth = "^0.15.0" # to use development goth version uncomment below -goth = { git = "https://github.com/golemfactory/goth.git", rev = "664c85965cee5fed14c5b42e81ff2ca343184e08" } +goth = { git = "https://github.com/golemfactory/goth.git", rev = "70b98f2346321f520c9d82f49346fbe806c24ca5" } [tool.poetry.dev-dependencies] black = "^20.8b1" From 4ffb1dbac63b2fc6e90c771c31995f1ec9785619 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Thu, 7 Sep 2023 16:39:24 +0200 Subject: [PATCH 023/123] dummy From 2fc92309a5c4afae035aec0a9e3c49c7d3fe3db7 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Thu, 7 Sep 2023 16:41:52 +0200 Subject: [PATCH 024/123] workflows temp workaround --- .github/workflows/binaries-aarch64.yml | 1 + .github/workflows/binaries-x86-64.yml | 1 + .github/workflows/integration-test.yml | 1 + .github/workflows/market-test-suite.yml | 1 + .github/workflows/system-test.yml | 3 +++ .github/workflows/unit-test-sgx.yml | 1 + .github/workflows/unit-test.yml | 1 + 7 files changed, 9 insertions(+) diff --git a/.github/workflows/binaries-aarch64.yml b/.github/workflows/binaries-aarch64.yml index 78cad0a9e0..9953b76864 100644 --- a/.github/workflows/binaries-aarch64.yml +++ b/.github/workflows/binaries-aarch64.yml @@ -11,6 +11,7 @@ on: - master - payments-dev - release/* + - kek/enable-tests2 env: rust_stable: 1.71.1 diff --git a/.github/workflows/binaries-x86-64.yml b/.github/workflows/binaries-x86-64.yml index 6d0d50eb5f..70fb85dbbd 100644 --- a/.github/workflows/binaries-x86-64.yml +++ b/.github/workflows/binaries-x86-64.yml @@ -6,6 +6,7 @@ on: - master - payments-dev - release/* + - kek/enable-tests2 pull_request: branches: - master diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 05b3a582c3..ce7399f146 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -6,6 +6,7 @@ on: - master - payments-dev - release/* + - kek/enable-tests2 pull_request: branches: - master diff --git a/.github/workflows/market-test-suite.yml b/.github/workflows/market-test-suite.yml index c3e3158be1..b3f982dae6 100644 --- a/.github/workflows/market-test-suite.yml +++ b/.github/workflows/market-test-suite.yml @@ -6,6 +6,7 @@ on: - master - payments-dev - release/* + - kek/enable-tests2 pull_request: branches: - master diff --git a/.github/workflows/system-test.yml b/.github/workflows/system-test.yml index 110f5eb776..29602537bb 100644 --- a/.github/workflows/system-test.yml +++ b/.github/workflows/system-test.yml @@ -6,6 +6,9 @@ on: - master - payments-dev - release/* + push: + branches: + - kek/enable-tests2 env: rust_stable: 1.71.1 diff --git a/.github/workflows/unit-test-sgx.yml b/.github/workflows/unit-test-sgx.yml index 27c165b1c8..6c0c939beb 100644 --- a/.github/workflows/unit-test-sgx.yml +++ b/.github/workflows/unit-test-sgx.yml @@ -6,6 +6,7 @@ on: - master - payments-dev - release/* + - kek/enable-tests2 pull_request: branches: - master diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index a69ee7307d..9771e8e1e0 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -6,6 +6,7 @@ on: - master - payments-dev - release/* + - kek/enable-tests2 pull_request: branches: - master From b8689940338bb5772bb986f315dde6882a13eece Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Thu, 7 Sep 2023 17:01:43 +0200 Subject: [PATCH 025/123] chore: clippy --- core/payment-driver/erc20next/src/service.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index 2da83bf5d4..d6d6c68709 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -64,7 +64,7 @@ impl Erc20NextService { let token_addr_env = format!("{prefix}_{symbol}_CONTRACT_ADDRESS"); if let Ok(addr) = env::var(&rpc_env) { - chain.rpc_endpoints = addr.split(",").map(ToOwned::to_owned).collect(); + chain.rpc_endpoints = addr.split(',').map(ToOwned::to_owned).collect(); log::info!( "{} rpc endpoints set to {:?}", network, From b89d72f5b4c47f01775cab1bcbf6b4e538cb5bf1 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Thu, 7 Sep 2023 17:44:09 +0200 Subject: [PATCH 026/123] erc20next: bump erc20_payment_lib --- Cargo.lock | 10 ++++------ Cargo.toml | 4 ++-- .../src/market/negotiator/builtin/payment_timeout.rs | 2 +- core/market/resolver/src/resolver/properties.rs | 2 +- core/market/src/db/model/agreement.rs | 6 ++++-- core/market/src/db/model/agreement_events.rs | 2 +- core/market/src/db/model/negotiation_events.rs | 4 ++-- core/market/src/market.rs | 2 +- core/market/src/market/agreement.rs | 2 +- core/net/src/cli.rs | 2 +- core/payment-driver/erc20next/src/service.rs | 4 ++-- utils/manifest-utils/src/keystore/x509_keystore.rs | 2 +- 12 files changed, 21 insertions(+), 21 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 14a1739439..ff437d1f82 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1081,18 +1081,17 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.26" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +checksum = "defd4e7873dbddba6c7c91e199c7fcb946abc4a6a4ac3195400bcfb01b5de877" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", - "time 0.1.45", "wasm-bindgen", - "winapi 0.3.9", + "windows-targets 0.48.4", ] [[package]] @@ -1891,7 +1890,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.1.9" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=51154917b0d583dd368f1a5c3883666ee8fac98e#51154917b0d583dd368f1a5c3883666ee8fac98e" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=ee0798b0073f0de9f291ff1b751fa8a996aa63ac#ee0798b0073f0de9f291ff1b751fa8a996aa63ac" dependencies = [ "actix-files", "actix-web", @@ -1904,7 +1903,6 @@ dependencies = [ "humantime 2.1.0", "lazy_static", "log", - "percent-encoding", "rand 0.8.5", "rust_decimal", "rustc-hex", diff --git a/Cargo.toml b/Cargo.toml index 8cec878aed..af63738648 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ path = "core/serv/src/main.rs" # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "51154917b0d583dd368f1a5c3883666ee8fac98e" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "ee0798b0073f0de9f291ff1b751fa8a996aa63ac" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.1.9" } @@ -79,7 +79,7 @@ actix-rt = "2.7" actix-service = "2" actix-web = "4" anyhow = "1.0" -chrono = "0.4" +chrono = "0.4.30" directories = "2.0.2" dotenv = "0.15.0" futures = "0.3" diff --git a/agent/provider/src/market/negotiator/builtin/payment_timeout.rs b/agent/provider/src/market/negotiator/builtin/payment_timeout.rs index 6fdb06801a..dc0e3fbbd6 100644 --- a/agent/provider/src/market/negotiator/builtin/payment_timeout.rs +++ b/agent/provider/src/market/negotiator/builtin/payment_timeout.rs @@ -147,7 +147,7 @@ fn read_utc_timestamp(pointer: &str, proposal: &ProposalView) -> anyhow::Result< let nsecs = 1_000_000 * (val % 1000) as u32; let naive = NaiveDateTime::from_timestamp_opt(secs, nsecs) .ok_or_else(|| anyhow::anyhow!("Cannot make DateTime from {secs} and {nsecs}"))?; - Ok(DateTime::from_utc(naive, Utc)) + Ok(DateTime::from_naive_utc_and_offset(naive, Utc)) } Err(err) => Err(err.into()), } diff --git a/core/market/resolver/src/resolver/properties.rs b/core/market/resolver/src/resolver/properties.rs index 6598287785..79f61de54f 100644 --- a/core/market/resolver/src/resolver/properties.rs +++ b/core/market/resolver/src/resolver/properties.rs @@ -181,7 +181,7 @@ impl<'a> PropertyValue<'a> { fn parse_date_from_rfc3339(dt_str: &str) -> Result, chrono::ParseError> { match DateTime::parse_from_rfc3339(dt_str) { Ok(parsed_value) => { - let dt = DateTime::::from_utc(parsed_value.naive_utc(), Utc); + let dt = DateTime::::from_naive_utc_and_offset(parsed_value.naive_utc(), Utc); Ok(dt) } Err(err) => Err(err), diff --git a/core/market/src/db/model/agreement.rs b/core/market/src/db/model/agreement.rs index 43cf1a3e09..9313dc9827 100644 --- a/core/market/src/db/model/agreement.rs +++ b/core/market/src/db/model/agreement.rs @@ -168,8 +168,10 @@ impl Agreement { agreement_id: self.id.into_client(), demand, offer, - valid_to: DateTime::::from_utc(self.valid_to, Utc), - approved_date: self.approved_ts.map(|d| DateTime::::from_utc(d, Utc)), + valid_to: DateTime::::from_naive_utc_and_offset(self.valid_to, Utc), + approved_date: self + .approved_ts + .map(|d| DateTime::::from_naive_utc_and_offset(d, Utc)), state: self.state.into(), timestamp: Utc.from_utc_datetime(&self.creation_ts), app_session_id: self.session_id, diff --git a/core/market/src/db/model/agreement_events.rs b/core/market/src/db/model/agreement_events.rs index 7930f7b6ec..435bfd1dc6 100644 --- a/core/market/src/db/model/agreement_events.rs +++ b/core/market/src/db/model/agreement_events.rs @@ -102,7 +102,7 @@ impl NewAgreementEvent { impl AgreementEvent { pub fn into_client(self) -> ClientEvent { let agreement_id = self.agreement_id.into_client(); - let event_date = DateTime::::from_utc(self.timestamp, Utc); + let event_date = DateTime::::from_naive_utc_and_offset(self.timestamp, Utc); let reason = self.reason.map(|reason| reason.0); match self.event_type { diff --git a/core/market/src/db/model/negotiation_events.rs b/core/market/src/db/model/negotiation_events.rs index 13e20b2801..ef87ba7b1b 100644 --- a/core/market/src/db/model/negotiation_events.rs +++ b/core/market/src/db/model/negotiation_events.rs @@ -115,7 +115,7 @@ impl MarketEvent { self, db: &DbMixedExecutor, ) -> Result { - let event_date = DateTime::::from_utc(self.timestamp, Utc); + let event_date = DateTime::::from_naive_utc_and_offset(self.timestamp, Utc); match self.event_type { EventType::RequestorNewProposal => Ok(RequestorEvent::ProposalEvent { event_date, @@ -166,7 +166,7 @@ impl MarketEvent { self, db: &DbMixedExecutor, ) -> Result { - let event_date = DateTime::::from_utc(self.timestamp, Utc); + let event_date = DateTime::::from_naive_utc_and_offset(self.timestamp, Utc); match self.event_type { EventType::ProviderNewProposal => Ok(ProviderEvent::ProposalEvent { event_date, diff --git a/core/market/src/market.rs b/core/market/src/market.rs index d6c18e9eb9..110d65076f 100644 --- a/core/market/src/market.rs +++ b/core/market/src/market.rs @@ -251,7 +251,7 @@ impl MarketService { .map_err(|e| AgreementError::Internal(e.to_string()))?; let mut result = Vec::new(); - let naive_to_utc = |ts| DateTime::::from_utc(ts, Utc); + let naive_to_utc = |ts| DateTime::::from_naive_utc_and_offset(ts, Utc); for agreement in agreements { let role = match agreement.id.owner() { diff --git a/core/market/src/market/agreement.rs b/core/market/src/market/agreement.rs index d6e25a84f9..c4d58339d3 100644 --- a/core/market/src/market/agreement.rs +++ b/core/market/src/market/agreement.rs @@ -34,7 +34,7 @@ async fn list_agreements( .map_err(|e| RpcMessageError::Market(e.to_string()))?; let mut result = Vec::new(); - let naive_to_utc = |ts| DateTime::::from_utc(ts, Utc); + let naive_to_utc = |ts| DateTime::::from_naive_utc_and_offset(ts, Utc); for agreement in agreements { let role = match agreement.id.owner() { diff --git a/core/net/src/cli.rs b/core/net/src/cli.rs index 44ab380e8b..9f0cd803a8 100644 --- a/core/net/src/cli.rs +++ b/core/net/src/cli.rs @@ -232,7 +232,7 @@ fn to_mib(value: usize, is_json: bool) -> serde_json::Value { fn find_node_to_output(response: model::FindNodeResponse) -> anyhow::Result { let naive = NaiveDateTime::from_timestamp_opt(response.seen.into(), 0) .context("Failed on out-of-range number of seconds")?; - let seen: DateTime = DateTime::from_utc(naive, Utc); + let seen: DateTime = DateTime::from_naive_utc_and_offset(naive, Utc); CommandOutput::object(serde_json::json!({ "identities": response.identities.into_iter().map(|n| n.to_string()).collect::>(), diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index d6d6c68709..aae36764d6 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -7,7 +7,7 @@ use std::{env, path::PathBuf, str::FromStr}; use erc20_payment_lib::config; use erc20_payment_lib::config::AdditionalOptions; use erc20_payment_lib::misc::load_private_keys; -use erc20_payment_lib::runtime::start_payment_engine; +use erc20_payment_lib::runtime::PaymentRuntime; use ethereum_types::H160; use std::sync::Arc; @@ -113,7 +113,7 @@ impl Erc20NextService { let (sender, recv) = tokio::sync::mpsc::channel(16); - let pr = start_payment_engine( + let pr = PaymentRuntime::new( &private_keys, &path.join("db.sqlite"), config, diff --git a/utils/manifest-utils/src/keystore/x509_keystore.rs b/utils/manifest-utils/src/keystore/x509_keystore.rs index 867acff511..5838cfd011 100644 --- a/utils/manifest-utils/src/keystore/x509_keystore.rs +++ b/utils/manifest-utils/src/keystore/x509_keystore.rs @@ -62,7 +62,7 @@ fn asn1_time_to_date_time(time: &Asn1TimeRef) -> anyhow::Result> { let not_after = NaiveDateTime::from_timestamp_millis(0).unwrap() + Duration::days(time_diff.days as i64) + Duration::seconds(time_diff.secs as i64); - Ok(DateTime::::from_utc(not_after, Utc)) + Ok(DateTime::::from_naive_utc_and_offset(not_after, Utc)) } pub(super) struct AddX509Response { From c2bcb68a3765de2839587275cea08a8fc16844ff Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 8 Sep 2023 07:52:18 +0200 Subject: [PATCH 027/123] erc20next: db location fixup --- core/payment-driver/erc20next/src/service.rs | 2 +- core/serv/src/main.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index aae36764d6..d2360dcfa9 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -115,7 +115,7 @@ impl Erc20NextService { let pr = PaymentRuntime::new( &private_keys, - &path.join("db.sqlite"), + &path.join("erc20next.sqlite"), config, signer, None, diff --git a/core/serv/src/main.rs b/core/serv/src/main.rs index 5c79c1c360..f19ba0329d 100644 --- a/core/serv/src/main.rs +++ b/core/serv/src/main.rs @@ -293,7 +293,7 @@ async fn start_payment_drivers(data_dir: &Path) -> anyhow::Result> { { use ya_erc20next_driver::{PaymentDriverService, DRIVER_NAME}; let db_executor = DbExecutor::from_data_dir(data_dir, "erc20next-driver")?; - PaymentDriverService::gsb(&db_executor, data_dir.join("erc20next-driver")).await?; + PaymentDriverService::gsb(&db_executor, data_dir.to_path_buf()).await?; drivers.push(DRIVER_NAME.to_owned()); } #[cfg(feature = "zksync-driver")] From 1e3e00b606e2b508c912591271680cbe8a854647 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 8 Sep 2023 10:55:09 +0200 Subject: [PATCH 028/123] Don't check ballance in account init --- core/payment-driver/erc20next/src/driver/cli.rs | 8 +------- .../erc20next/src/erc20/wallet.rs | 17 +---------------- 2 files changed, 2 insertions(+), 23 deletions(-) diff --git a/core/payment-driver/erc20next/src/driver/cli.rs b/core/payment-driver/erc20next/src/driver/cli.rs index f2c3a06e7c..e53c0bf3f8 100644 --- a/core/payment-driver/erc20next/src/driver/cli.rs +++ b/core/payment-driver/erc20next/src/driver/cli.rs @@ -10,10 +10,9 @@ use ya_payment_driver::{ bus, model::{AccountMode, GenericError, Init}, }; -use ya_utils_futures::timeout::IntoTimeoutFuture; // Local uses -use crate::{driver::Erc20NextDriver, erc20::wallet, network, DRIVER_NAME}; +use crate::{driver::Erc20NextDriver, network, DRIVER_NAME}; pub async fn init(driver: &Erc20NextDriver, msg: Init) -> Result<(), GenericError> { log::debug!("init: {:?}", msg); @@ -25,11 +24,6 @@ pub async fn init(driver: &Erc20NextDriver, msg: Init) -> Result<(), GenericErro driver.is_account_active(&address)? } - wallet::init_wallet(&msg) - .timeout(Some(30)) - .await - .map_err(GenericError::new)??; - let network = network::network_like_to_network(msg.network()); let token = network::get_network_token(network, msg.token()); bus::register_account(driver, &msg.address(), &network.to_string(), &token, mode).await?; diff --git a/core/payment-driver/erc20next/src/erc20/wallet.rs b/core/payment-driver/erc20next/src/erc20/wallet.rs index 08b18f1ad2..6fe9222469 100644 --- a/core/payment-driver/erc20next/src/erc20/wallet.rs +++ b/core/payment-driver/erc20next/src/erc20/wallet.rs @@ -18,7 +18,7 @@ use web3::types::{H160, H256, U256, U64}; // Workspace uses use ya_payment_driver::{ db::models::{Network, TransactionEntity, TxType}, - model::{GenericError, Init, PaymentDetails}, + model::{GenericError, PaymentDetails}, }; // Local uses @@ -32,7 +32,6 @@ use crate::{ convert_u256_gas_to_float, str_to_addr, topic_to_str_address, u256_to_big_dec, }, }, - RINKEBY_NETWORK, }; use ya_payment_driver::db::models::TransactionStatus; @@ -67,20 +66,6 @@ pub async fn account_gas_balance( Ok(balance) } -pub async fn init_wallet(msg: &Init) -> Result<(), GenericError> { - log::debug!("init_wallet. msg={:?}", msg); - let address = msg.address(); - let network = msg.network().unwrap_or_else(|| RINKEBY_NETWORK.to_string()); - let network = Network::from_str(&network).map_err(GenericError::new)?; - - // Validate address and that checking balance of GLM and ETH works. - let h160_addr = str_to_addr(&address)?; - let _glm_balance = ethereum::get_glm_balance(h160_addr, network).await?; - let _eth_balance = ethereum::get_balance(h160_addr, network).await?; - - Ok(()) -} - pub async fn fund(dao: &Erc20Dao, address: H160, network: Network) -> Result<(), GenericError> { if network == Network::Mainnet { return Err(GenericError::new("Wallet can not be funded on mainnet.")); From ed1a99b1c59286a242d54fdc44819312c11960a7 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 8 Sep 2023 10:56:49 +0200 Subject: [PATCH 029/123] Update gnt2-docker-yagna image hash --- goth_tests/assets/docker/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/goth_tests/assets/docker/docker-compose.yml b/goth_tests/assets/docker/docker-compose.yml index 9c54bcef6b..2951453b99 100644 --- a/goth_tests/assets/docker/docker-compose.yml +++ b/goth_tests/assets/docker/docker-compose.yml @@ -25,7 +25,7 @@ services: - "16001-16100:6001-6100" ethereum: - image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:483c6f241edd + image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:4bbf5b4c7e6b ports: - "8545:8545" From f1ab17d7feee97a3c8fe2f5101db86bbac31d37a Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 8 Sep 2023 10:59:41 +0200 Subject: [PATCH 030/123] Fix duplicate GH action runs --- .github/workflows/binaries-aarch64.yml | 1 - .github/workflows/binaries-x86-64.yml | 1 - .github/workflows/integration-test.yml | 1 - .github/workflows/market-test-suite.yml | 1 - .github/workflows/system-test.yml | 3 --- .github/workflows/unit-test-sgx.yml | 1 - .github/workflows/unit-test.yml | 1 - 7 files changed, 9 deletions(-) diff --git a/.github/workflows/binaries-aarch64.yml b/.github/workflows/binaries-aarch64.yml index 006a915532..f7530e5360 100644 --- a/.github/workflows/binaries-aarch64.yml +++ b/.github/workflows/binaries-aarch64.yml @@ -11,7 +11,6 @@ on: - master - payments-dev - release/* - - kek/enable-tests2 env: rust_stable: 1.71.1 diff --git a/.github/workflows/binaries-x86-64.yml b/.github/workflows/binaries-x86-64.yml index 70fb85dbbd..6d0d50eb5f 100644 --- a/.github/workflows/binaries-x86-64.yml +++ b/.github/workflows/binaries-x86-64.yml @@ -6,7 +6,6 @@ on: - master - payments-dev - release/* - - kek/enable-tests2 pull_request: branches: - master diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index ce7399f146..05b3a582c3 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -6,7 +6,6 @@ on: - master - payments-dev - release/* - - kek/enable-tests2 pull_request: branches: - master diff --git a/.github/workflows/market-test-suite.yml b/.github/workflows/market-test-suite.yml index b3f982dae6..c3e3158be1 100644 --- a/.github/workflows/market-test-suite.yml +++ b/.github/workflows/market-test-suite.yml @@ -6,7 +6,6 @@ on: - master - payments-dev - release/* - - kek/enable-tests2 pull_request: branches: - master diff --git a/.github/workflows/system-test.yml b/.github/workflows/system-test.yml index 29602537bb..110f5eb776 100644 --- a/.github/workflows/system-test.yml +++ b/.github/workflows/system-test.yml @@ -6,9 +6,6 @@ on: - master - payments-dev - release/* - push: - branches: - - kek/enable-tests2 env: rust_stable: 1.71.1 diff --git a/.github/workflows/unit-test-sgx.yml b/.github/workflows/unit-test-sgx.yml index 6c0c939beb..27c165b1c8 100644 --- a/.github/workflows/unit-test-sgx.yml +++ b/.github/workflows/unit-test-sgx.yml @@ -6,7 +6,6 @@ on: - master - payments-dev - release/* - - kek/enable-tests2 pull_request: branches: - master diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 9771e8e1e0..a69ee7307d 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -6,7 +6,6 @@ on: - master - payments-dev - release/* - - kek/enable-tests2 pull_request: branches: - master From 919d4d679a08407135606a04fa29c29903ca3d53 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 8 Sep 2023 11:05:05 +0200 Subject: [PATCH 031/123] chore: appease clippy --- core/payment-driver/erc20next/src/driver.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index 5142ceec89..f2827f365a 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -156,7 +156,7 @@ impl PaymentDriver for Erc20NextDriver { msg: GetAccountBalance, ) -> Result { let platform = msg.platform(); - let network = platform.split("-").nth(1).ok_or(GenericError::new(format!( + let network = platform.split('-').nth(1).ok_or(GenericError::new(format!( "Malformed platform string: {}", msg.platform() )))?; @@ -166,7 +166,7 @@ impl PaymentDriver for Erc20NextDriver { GenericError::new(format!( "{} isn't a valid H160 address: {}", address_str, - e.to_string() + e )) })?; @@ -187,7 +187,7 @@ impl PaymentDriver for Erc20NextDriver { msg: GetAccountGasBalance, ) -> Result, GenericError> { let platform = msg.platform(); - let network = platform.split("-").nth(1).ok_or(GenericError::new(format!( + let network = platform.split('-').nth(1).ok_or(GenericError::new(format!( "Malformed platform string: {}", msg.platform() )))?; @@ -197,7 +197,7 @@ impl PaymentDriver for Erc20NextDriver { GenericError::new(format!( "{} isn't a valid H160 address: {}", address_str, - e.to_string() + e )) })?; From 00e1e8336aa7a85f141b7793c0f8d9ac80478414 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 8 Sep 2023 11:10:02 +0200 Subject: [PATCH 032/123] chore: fmt --- core/payment-driver/erc20next/src/driver.rs | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index f2827f365a..12daa0e819 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -163,11 +163,7 @@ impl PaymentDriver for Erc20NextDriver { let address_str = msg.address(); let address = H160::from_str(&address_str).map_err(|e| { - GenericError::new(format!( - "{} isn't a valid H160 address: {}", - address_str, - e - )) + GenericError::new(format!("{} isn't a valid H160 address: {}", address_str, e)) })?; let balance = self @@ -194,11 +190,7 @@ impl PaymentDriver for Erc20NextDriver { let address_str = msg.address(); let address = H160::from_str(&address_str).map_err(|e| { - GenericError::new(format!( - "{} isn't a valid H160 address: {}", - address_str, - e - )) + GenericError::new(format!("{} isn't a valid H160 address: {}", address_str, e)) })?; let balance = self From 0b450d2a280fee6e717460542c1573b0d15a8596 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 8 Sep 2023 11:56:55 +0200 Subject: [PATCH 033/123] goth: remove zksync from docker-compose --- goth_tests/assets/docker/docker-compose.yml | 9 --------- 1 file changed, 9 deletions(-) diff --git a/goth_tests/assets/docker/docker-compose.yml b/goth_tests/assets/docker/docker-compose.yml index 2951453b99..f214fa4380 100644 --- a/goth_tests/assets/docker/docker-compose.yml +++ b/goth_tests/assets/docker/docker-compose.yml @@ -28,15 +28,6 @@ services: image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:4bbf5b4c7e6b ports: - "8545:8545" - - zksync: - image: docker.pkg.github.com/golemfactory/yagna-zksync/yagna-zksync-mock:fddc527d2bf1 - ports: - - "3030:3030" - environment: - - WEB3_PROVIDER_URI=http://ethereum:8545 - depends_on: - - ethereum outbound-test: # A service running a TCP sink, echo and iperf3 servers From 45b8b1112537157ec190b811ebaf44d65172d921 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 8 Sep 2023 12:20:00 +0200 Subject: [PATCH 034/123] erc20next: reimplement validation of allocations --- core/payment-driver/erc20next/src/driver.rs | 32 ++++++++++++-- .../erc20next/src/driver/api.rs | 43 +------------------ .../erc20next/src/erc20/wallet.rs | 31 ------------- 3 files changed, 31 insertions(+), 75 deletions(-) diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index 12daa0e819..4665900705 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -282,11 +282,37 @@ impl PaymentDriver for Erc20NextDriver { async fn validate_allocation( &self, - _db: DbExecutor, - _caller: String, + db: DbExecutor, + caller: String, msg: ValidateAllocation, ) -> Result { - api::validate_allocation(msg).await + log::info!("Validate_allocation: {:?}", msg); + let account_balance = self + .get_account_balance( + db, + caller, + GetAccountBalance::new(msg.address, msg.platform.clone()), + ) + .await?; + + let total_allocated_amount: BigDecimal = msg + .existing_allocations + .into_iter() + .filter(|allocation| allocation.payment_platform == msg.platform) + .map(|allocation| allocation.remaining_amount) + .sum(); + + log::info!( + "Allocation validation: \ + allocating: {:.5}, \ + account_balance: {:.5}, \ + total_allocated_amount: {:.5}", + msg.amount, + account_balance, + total_allocated_amount, + ); + + Ok(msg.amount <= account_balance - total_allocated_amount) } async fn shut_down( diff --git a/core/payment-driver/erc20next/src/driver/api.rs b/core/payment-driver/erc20next/src/driver/api.rs index f21fa43471..e5850ffe25 100644 --- a/core/payment-driver/erc20next/src/driver/api.rs +++ b/core/payment-driver/erc20next/src/driver/api.rs @@ -6,17 +6,10 @@ // use num_bigint::BigInt; // Workspace uses -use ya_payment_driver::{ - driver::BigDecimal, - model::{GenericError, ValidateAllocation, VerifyPayment}, -}; +use ya_payment_driver::model::{GenericError, VerifyPayment}; // Local uses -use crate::{ - driver::PaymentDetails, - erc20::{utils, wallet}, - network, -}; +use crate::{driver::PaymentDetails, erc20::wallet, network}; pub async fn verify_payment(msg: VerifyPayment) -> Result { log::debug!("verify_payment: {:?}", msg); @@ -25,35 +18,3 @@ pub async fn verify_payment(msg: VerifyPayment) -> Result Result { - log::debug!("validate_allocation: {:?}", msg); - let address = utils::str_to_addr(&msg.address)?; - let (network, _) = network::platform_to_network_token(msg.platform)?; - let account_balance = wallet::account_balance(address, network).await?; - let total_allocated_amount: BigDecimal = msg - .existing_allocations - .into_iter() - .map(|allocation| allocation.remaining_amount) - .sum(); - - // TODO: calculate fee. Below commented out reference to zkSync implementation - // let tx_fee_cost = wallet::get_tx_fee(&msg.address, network).await?; - // let total_txs_cost = tx_fee_cost * &*TRANSACTIONS_PER_ALLOCATION; - // let allocation_surcharge = (&*MAX_ALLOCATION_SURCHARGE).min(&total_txs_cost); - // - log::info!( - "Allocation validation: \ - allocating: {:.5}, \ - account_balance: {:.5}, \ - total_allocated_amount: {:.5}", //", \ - // allocation_surcharge: {:.5} \ - // ", - msg.amount, - account_balance, - total_allocated_amount, - //allocation_surcharge, - ); - // Ok(msg.amount <= (account_balance - total_allocated_amount - allocation_surcharge)) - Ok(msg.amount <= account_balance - total_allocated_amount) -} diff --git a/core/payment-driver/erc20next/src/erc20/wallet.rs b/core/payment-driver/erc20next/src/erc20/wallet.rs index 6fe9222469..6e155df142 100644 --- a/core/payment-driver/erc20next/src/erc20/wallet.rs +++ b/core/payment-driver/erc20next/src/erc20/wallet.rs @@ -35,37 +35,6 @@ use crate::{ }; use ya_payment_driver::db::models::TransactionStatus; -pub async fn account_balance(address: H160, network: Network) -> Result { - let balance_com = ethereum::get_glm_balance(address, network).await?; - - let balance = u256_to_big_dec(balance_com)?; - log::debug!( - "account_balance. address={}, network={}, balance={}", - address, - &network, - &balance - ); - - Ok(balance) -} - -pub async fn account_gas_balance( - address: H160, - network: Network, -) -> Result { - let balance_com = ethereum::get_balance(address, network).await?; - let balance = u256_to_big_dec(balance_com)?; - - log::debug!( - "account_gas_balance. address={}, network={}, balance={}", - address, - &network, - &balance - ); - - Ok(balance) -} - pub async fn fund(dao: &Erc20Dao, address: H160, network: Network) -> Result<(), GenericError> { if network == Network::Mainnet { return Err(GenericError::new("Wallet can not be funded on mainnet.")); From b71454edab4939dda87867c026edf6a11beec367 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 8 Sep 2023 12:25:53 +0200 Subject: [PATCH 035/123] erc20next: temporarily disable payment verification This must be reimplemented using erc20_payment_lib. --- core/payment/src/service.rs | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/core/payment/src/service.rs b/core/payment/src/service.rs index 9de3a86d31..13788ebbd3 100644 --- a/core/payment/src/service.rs +++ b/core/payment/src/service.rs @@ -351,7 +351,7 @@ mod public { use crate::error::DbError; use crate::utils::*; - use crate::error::processor::VerifyPaymentError; + // use crate::error::processor::VerifyPaymentError; use ya_client_model::payment::*; use ya_core_model::payment::public::*; use ya_persistence::types::Role; @@ -759,18 +759,18 @@ mod public { .verify_payment(payment, signature) .await { - Ok(_) => { + Ok(_) | Err(_) => { counter!("payment.amount.received", ya_metrics::utils::cryptocurrency_to_u64(&amount), "platform" => platform); counter!("payment.invoices.provider.paid", num_paid_invoices); Ok(Ack {}) } - Err(e) => match e { - VerifyPaymentError::ConfirmationEncoding => { - Err(SendError::BadRequest(e.to_string())) - } - VerifyPaymentError::Validation(e) => Err(SendError::BadRequest(e)), - _ => Err(SendError::ServiceError(e.to_string())), - }, + // Err(e) => match e { + // VerifyPaymentError::ConfirmationEncoding => { + // Err(SendError::BadRequest(e.to_string())) + // } + // VerifyPaymentError::Validation(e) => Err(SendError::BadRequest(e)), + // _ => Err(SendError::ServiceError(e.to_string())), + //}, } } } From 5f8c5a727a3b52cd6498e7204e471da38ce2c3a3 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 8 Sep 2023 12:55:36 +0200 Subject: [PATCH 036/123] remove zksync traces from goth_tests --- goth_tests/README.md | 1 - goth_tests/domain/exe_units/goth-config.yml | 1 - goth_tests/domain/payments/goth-config.yml | 1 - goth_tests/domain/ya-provider/goth-config.yml | 1 - goth_tests/goth-config.yml | 1 - 5 files changed, 5 deletions(-) diff --git a/goth_tests/README.md b/goth_tests/README.md index 5e06d99d85..76ae4aa25c 100644 --- a/goth_tests/README.md +++ b/goth_tests/README.md @@ -74,7 +74,6 @@ This path will depend either on the shell environment or the operating system on │   ├── requestor.log │   ├── router.log │   ├── test.log # debug console logs from this test case only, duplicated in `runner.log` - │   └── zksync.log └── test_e2e_wasi └── ... ``` diff --git a/goth_tests/domain/exe_units/goth-config.yml b/goth_tests/domain/exe_units/goth-config.yml index 6a7b03df44..298b9b932b 100644 --- a/goth_tests/domain/exe_units/goth-config.yml +++ b/goth_tests/domain/exe_units/goth-config.yml @@ -23,7 +23,6 @@ docker-compose: compose-log-patterns: ethereum: ".*Wallets supplied." - zksync: ".*Running on http://.*:3030/.*" key-dir: "../../assets/keys" diff --git a/goth_tests/domain/payments/goth-config.yml b/goth_tests/domain/payments/goth-config.yml index da2a38ca4f..f9ab871621 100644 --- a/goth_tests/domain/payments/goth-config.yml +++ b/goth_tests/domain/payments/goth-config.yml @@ -23,7 +23,6 @@ docker-compose: compose-log-patterns: ethereum: ".*Wallets supplied." - zksync: ".*Running on http://.*:3030/.*" key-dir: "../../assets/keys" diff --git a/goth_tests/domain/ya-provider/goth-config.yml b/goth_tests/domain/ya-provider/goth-config.yml index 34e923fa7f..aab318fa2b 100644 --- a/goth_tests/domain/ya-provider/goth-config.yml +++ b/goth_tests/domain/ya-provider/goth-config.yml @@ -23,7 +23,6 @@ docker-compose: compose-log-patterns: ethereum: ".*Wallets supplied." - zksync: ".*Running on http://.*:3030/.*" key-dir: "../../assets/keys" diff --git a/goth_tests/goth-config.yml b/goth_tests/goth-config.yml index bf5675900c..14f1bc6890 100644 --- a/goth_tests/goth-config.yml +++ b/goth_tests/goth-config.yml @@ -22,7 +22,6 @@ docker-compose: compose-log-patterns: ethereum: ".*Wallets supplied." - zksync: ".*Running on http://.*:3030/.*" key-dir: "assets/keys" From cb4b03b436cdb89a2b0a517fc6c37b7d7acb5832 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 8 Sep 2023 13:57:22 +0200 Subject: [PATCH 037/123] Bump gnt2-docker-yagna hash --- goth_tests/assets/docker/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/goth_tests/assets/docker/docker-compose.yml b/goth_tests/assets/docker/docker-compose.yml index f214fa4380..15306b564c 100644 --- a/goth_tests/assets/docker/docker-compose.yml +++ b/goth_tests/assets/docker/docker-compose.yml @@ -25,7 +25,7 @@ services: - "16001-16100:6001-6100" ethereum: - image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:4bbf5b4c7e6b + image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:2c6027dbcf7f ports: - "8545:8545" From f9ed0607cb505456afaf7d96d8c3d85c27ef2402 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Tue, 12 Sep 2023 11:51:18 +0200 Subject: [PATCH 038/123] Fixed conflicts --- Cargo.lock | 629 +++++++++++++++++++++++++++-------------------------- Cargo.toml | 8 +- 2 files changed, 322 insertions(+), 315 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f3b1198ee6..cdb3c62277 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,14 +4,15 @@ version = 3 [[package]] name = "actix" -version = "0.13.0" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f728064aca1c318585bf4bb04ffcfac9e75e508ab4e8b1bd9ba5dfe04e2cbed5" +checksum = "cba56612922b907719d4a01cf11c8d5b458e7d3dba946d0435f20f58d6795ed2" dependencies = [ + "actix-macros", "actix-rt", "actix_derive", - "bitflags 1.3.2", - "bytes 1.4.0", + "bitflags 2.4.0", + "bytes 1.5.0", "crossbeam-channel 0.5.8", "futures-core", "futures-sink", @@ -20,7 +21,7 @@ dependencies = [ "log", "once_cell", "parking_lot 0.12.1", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", "smallvec", "tokio 1.32.0", "tokio-util 0.7.8", @@ -33,11 +34,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617a8268e3537fe1d8c9ead925fca49ef6400927ee7bc26750e90ecee14ce4b8" dependencies = [ "bitflags 1.3.2", - "bytes 1.4.0", + "bytes 1.5.0", "futures-core", "futures-sink", "memchr", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", "tokio 1.32.0", "tokio-util 0.7.8", "tracing", @@ -70,7 +71,7 @@ dependencies = [ "actix-web", "askama_escape", "bitflags 1.3.2", - "bytes 1.4.0", + "bytes 1.5.0", "derive_more", "futures-core", "http-range", @@ -78,14 +79,14 @@ dependencies = [ "mime", "mime_guess", "percent-encoding", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", ] [[package]] name = "actix-http" -version = "3.3.1" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2079246596c18b4a33e274ae10c0e50613f4d32a4198e09c7b93771013fed74" +checksum = "a92ef85799cba03f76e4f7c10f533e66d87c9a7e7055f3391f09000ad8351bc9" dependencies = [ "actix-codec", "actix-rt", @@ -93,16 +94,16 @@ dependencies = [ "actix-tls", "actix-utils", "ahash 0.8.3", - "base64 0.21.3", - "bitflags 1.3.2", + "base64 0.21.4", + "bitflags 2.4.0", "brotli", - "bytes 1.4.0", + "bytes 1.5.0", "bytestring", "derive_more", "encoding_rs", "flate2", "futures-core", - "h2 0.3.20", + "h2 0.3.21", "http", "httparse", "httpdate 1.0.3", @@ -111,7 +112,7 @@ dependencies = [ "local-channel", "mime", "percent-encoding", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", "rand 0.8.5", "sha1", "smallvec", @@ -134,7 +135,7 @@ dependencies = [ "actix-tls", "actix-utils", "awc", - "bytes 1.4.0", + "bytes 1.5.0", "futures-core", "http", "log", @@ -153,7 +154,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -171,9 +172,9 @@ dependencies = [ [[package]] name = "actix-rt" -version = "2.8.0" +version = "2.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15265b6b8e2347670eb363c47fc8c75208b4a4994b27192f345fcbe707804f3e" +checksum = "28f32d40287d3f402ae0028a9d54bef51af15c8769492826a69d28f81893151d" dependencies = [ "actix-macros", "futures-core", @@ -182,9 +183,9 @@ dependencies = [ [[package]] name = "actix-server" -version = "2.2.0" +version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e8613a75dd50cc45f473cee3c34d59ed677c0f7b44480ce3b8247d7dc519327" +checksum = "3eb13e7eef0423ea6eab0e59f6c72e7cb46d33691ad56a726b3cd07ddec2c2d4" dependencies = [ "actix-rt", "actix-service", @@ -192,8 +193,7 @@ dependencies = [ "futures-core", "futures-util", "mio 0.8.8", - "num_cpus", - "socket2 0.4.9", + "socket2 0.5.4", "tokio 1.32.0", "tracing", ] @@ -206,14 +206,14 @@ checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" dependencies = [ "futures-core", "paste", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", ] [[package]] name = "actix-test" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7c7d37a955bfa3ccde83c12bc8987262abaf6c90ae9dd24fcdbd78c6c01ffaf" +checksum = "2173910d0c7d0a21730d3e1304576d9c969eead2b91f3257a7435f7face702e0" dependencies = [ "actix-codec", "actix-http", @@ -234,21 +234,24 @@ dependencies = [ [[package]] name = "actix-tls" -version = "3.0.3" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fde0cf292f7cdc7f070803cb9a0d45c018441321a78b1042ffbbb81ec333297" +checksum = "72616e7fbec0aa99c6f3164677fa48ff5a60036d0799c98cab894a44f3e0efc3" dependencies = [ - "actix-codec", "actix-rt", "actix-service", "actix-utils", "futures-core", "http", - "log", + "impl-more", "openssl", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", + "rustls", + "rustls-webpki", + "tokio 1.32.0", "tokio-openssl", "tokio-util 0.7.8", + "tracing", ] [[package]] @@ -258,14 +261,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" dependencies = [ "local-waker", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", ] [[package]] name = "actix-web" -version = "4.3.1" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd3cb42f9566ab176e1ef0b8b3a896529062b4efc6be0123046095914c4c1c96" +checksum = "0e4a5b5e29603ca8c94a77c65cf874718ceb60292c5a5c3e5f4ace041af462b9" dependencies = [ "actix-codec", "actix-http", @@ -277,8 +280,8 @@ dependencies = [ "actix-tls", "actix-utils", "actix-web-codegen", - "ahash 0.7.6", - "bytes 1.4.0", + "ahash 0.8.3", + "bytes 1.5.0", "bytestring", "cfg-if 1.0.0", "cookie", @@ -286,19 +289,18 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", - "http", "itoa 1.0.9", "language-tags", "log", "mime", "once_cell", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", "regex", "serde", "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.4.9", + "socket2 0.5.4", "time 0.3.9", "url", ] @@ -313,24 +315,24 @@ dependencies = [ "actix-codec", "actix-http", "actix-web", - "bytes 1.4.0", + "bytes 1.5.0", "bytestring", "futures-core", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", "tokio 1.32.0", "tokio-util 0.7.8", ] [[package]] name = "actix-web-codegen" -version = "4.2.0" +version = "4.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2262160a7ae29e3415554a3f1fc04c764b1540c116aa524683208078b7a75bc9" +checksum = "eb1f50ebbb30eca122b188319a4398b3f7bb4a8cdf50ecfb73bfc6a3c3ce54f5" dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.32", ] [[package]] @@ -345,25 +347,25 @@ dependencies = [ "base64 0.13.1", "futures-core", "futures-util", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", ] [[package]] name = "actix_derive" -version = "0.6.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d44b8fee1ced9671ba043476deddef739dd0959bf77030b26b738cc591737a7" +checksum = "7c7db3d5a9718568e4cf4a537cfd7070e6e6ff7481510d0237fb529ac850f6d3" dependencies = [ "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.32", ] [[package]] name = "addr2line" -version = "0.20.0" +version = "0.21.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" dependencies = [ "gimli", ] @@ -448,9 +450,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.0.4" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" +checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" dependencies = [ "memchr", ] @@ -508,9 +510,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" +checksum = "b84bf0a05bbb2a83e5eb6fa36bb6e87baa08193c35ff52bbf6b38d8af2890e46" [[package]] name = "anyhow" @@ -589,7 +591,7 @@ dependencies = [ "futures-core", "futures-io", "memchr", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", "tokio 1.32.0", "xz2", ] @@ -602,7 +604,7 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -642,9 +644,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "awc" -version = "3.1.1" +version = "3.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ef547a81796eb2dfe9b345aba34c2e08391a0502493711395b36dd64052b69" +checksum = "7fa3c705a9c7917ac0f41c0757a0a747b43bbc29b0b364b081bd7c5fc67fb223" dependencies = [ "actix-codec", "actix-http", @@ -652,22 +654,21 @@ dependencies = [ "actix-service", "actix-tls", "actix-utils", - "ahash 0.7.6", - "base64 0.21.3", - "bytes 1.4.0", + "base64 0.21.4", + "bytes 1.5.0", "cfg-if 1.0.0", "cookie", "derive_more", "futures-core", "futures-util", - "h2 0.3.20", + "h2 0.3.21", "http", "itoa 1.0.9", "log", "mime", "openssl", "percent-encoding", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", "rand 0.8.5", "serde", "serde_json", @@ -687,9 +688,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.68" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" +checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" dependencies = [ "addr2line", "cc", @@ -720,9 +721,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.3" +version = "0.21.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" +checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" [[package]] name = "base64ct" @@ -864,7 +865,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" dependencies = [ "borsh-derive", - "hashbrown 0.12.3", + "hashbrown 0.13.2", ] [[package]] @@ -925,9 +926,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.6.0" +version = "1.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" +checksum = "4c2f7349907b712260e64b0afe2f84692af14a454be26187d9df565c7f69266a" dependencies = [ "memchr", "regex-automata", @@ -998,15 +999,15 @@ checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] name = "bytes" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" [[package]] name = "bytesize" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38fcc2979eff34a4b84e1cf9a1e3da42a7d44b3b690a40cdcb23e3d556cfb2e5" +checksum = "a3e368af43e418a04d52505cf3dbc23dda4e3407ae2fa99fd0e4f308ce546acc" [[package]] name = "bytestring" @@ -1014,7 +1015,7 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "238e4886760d98c4f899360c834fa93e62cf7f721ac3c2da375cbdf4b8679aae" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", ] [[package]] @@ -1050,9 +1051,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.82" +version = "1.0.83" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "305fe645edc1442a0fa8b6726ba61d422798d37a52e12eaecf4b022ebbb88f01" +checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" dependencies = [ "jobserver", "libc", @@ -1072,18 +1073,17 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.26" +version = "0.4.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" +checksum = "defd4e7873dbddba6c7c91e199c7fcb946abc4a6a4ac3195400bcfb01b5de877" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", - "time 0.1.45", "wasm-bindgen", - "winapi 0.3.9", + "windows-targets 0.48.5", ] [[package]] @@ -1463,11 +1463,11 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.4.0" +version = "3.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a011bbe2c35ce9c1f143b7af6f94f29a167beb4cd1d29e6740ce836f723120e" +checksum = "82e95fbd621905b854affdc67943b043a0fbb6ed7385fd5a25650d19a8a6cfdf" dependencies = [ - "nix 0.26.2", + "nix 0.27.1", "windows-sys 0.48.0", ] @@ -1531,9 +1531,9 @@ dependencies = [ [[package]] name = "dashmap" -version = "5.5.0" +version = "5.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6943ae99c34386c84a470c499d3414f66502a41340aa895406e0d2e4a207b91d" +checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" dependencies = [ "cfg-if 1.0.0", "hashbrown 0.14.0", @@ -1792,9 +1792,9 @@ checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" -version = "0.8.32" +version = "0.8.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" +checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" dependencies = [ "cfg-if 1.0.0", ] @@ -1912,9 +1912,9 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" +checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" dependencies = [ "errno-dragonfly", "libc", @@ -2103,6 +2103,12 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "finl_unicode" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" + [[package]] name = "fixed-hash" version = "0.7.0" @@ -2383,7 +2389,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -2418,7 +2424,7 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", "pin-utils", "slab", ] @@ -2500,9 +2506,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.27.3" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" +checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" [[package]] name = "git-version" @@ -2665,11 +2671,11 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.20" +version = "0.3.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" +checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "fnv", "futures-core", "futures-sink", @@ -2701,6 +2707,15 @@ dependencies = [ "ahash 0.7.6", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.3", +] + [[package]] name = "hashbrown" version = "0.14.0" @@ -2713,9 +2728,9 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.8.3" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312f66718a2d7789ffef4f4b7b213138ed9f1eb3aa1d0d82fc99f88fb3ffd26f" +checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" dependencies = [ "hashbrown 0.14.0", ] @@ -2732,13 +2747,12 @@ dependencies = [ [[package]] name = "headers" -version = "0.3.8" +version = "0.3.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" +checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" dependencies = [ - "base64 0.13.1", - "bitflags 1.3.2", - "bytes 1.4.0", + "base64 0.21.4", + "bytes 1.5.0", "headers-core", "http", "httpdate 1.0.3", @@ -2848,7 +2862,7 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "fnv", "itoa 1.0.9", ] @@ -2869,9 +2883,9 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "http", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", ] [[package]] @@ -2943,17 +2957,17 @@ version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "futures-channel", "futures-core", "futures-util", - "h2 0.3.20", + "h2 0.3.21", "http", "http-body 0.4.5", "httparse", "httpdate 1.0.3", "itoa 1.0.9", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", "socket2 0.4.9", "tokio 1.32.0", "tower-service", @@ -2981,7 +2995,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "hyper 0.14.27", "native-tls", "tokio 1.32.0", @@ -3067,9 +3081,15 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ - "parity-scale-codec 3.6.4", + "parity-scale-codec 3.6.5", ] +[[package]] +name = "impl-more" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d" + [[package]] name = "impl-rlp" version = "0.3.0" @@ -3185,10 +3205,10 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.3", + "socket2 0.5.4", "widestring", "windows-sys 0.48.0", - "winreg 0.50.0", + "winreg", ] [[package]] @@ -3226,6 +3246,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.8" @@ -3352,9 +3381,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.5" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" +checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128" [[package]] name = "local-channel" @@ -3472,9 +3501,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.5.0" +version = "2.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" +checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" [[package]] name = "memoffset" @@ -3887,14 +3916,13 @@ dependencies = [ [[package]] name = "nix" -version = "0.26.2" +version = "0.27.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.0", "cfg-if 1.0.0", "libc", - "static_assertions", ] [[package]] @@ -4082,9 +4110,9 @@ checksum = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a" [[package]] name = "object" -version = "0.31.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" +checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" dependencies = [ "memchr", ] @@ -4119,11 +4147,11 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.56" +version = "0.10.57" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "729b745ad4a5575dd06a3e1af1414bd330ee561c01b3899eb584baeaa8def17e" +checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.0", "cfg-if 1.0.0", "foreign-types", "libc", @@ -4140,7 +4168,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -4151,18 +4179,18 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "111.27.0+1.1.1v" +version = "300.1.3+3.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06e8f197c82d7511c5b014030c9b1efeda40d7d5f99d23b4ceed3524a5e63f02" +checksum = "cd2c101a165fff9935e34def4669595ab1c7847943c42be86e21503e482be107" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.91" +version = "0.9.93" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "866b5f16f90776b9bb8dc1e1802ac6f0513de3a7a7465867bfbc563dc737faac" +checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d" dependencies = [ "cc", "libc", @@ -4207,15 +4235,15 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.6.4" +version = "3.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8e946cc0cc711189c0b0249fb8b599cbeeab9784d83c415719368bb8d4ac64" +checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" dependencies = [ "arrayvec 0.7.4", "bitvec 1.0.1", "byte-slice-cast", "impl-trait-for-tuples", - "parity-scale-codec-derive 3.6.4", + "parity-scale-codec-derive 3.6.5", "serde", ] @@ -4233,9 +4261,9 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.4" +version = "3.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a296c3079b5fefbc499e1de58dc26c09b1b9a5952d26694ee89f04a43ebbb3e" +checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", @@ -4312,7 +4340,7 @@ dependencies = [ "libc", "redox_syscall 0.3.5", "smallvec", - "windows-targets 0.48.4", + "windows-targets 0.48.5", ] [[package]] @@ -4359,10 +4387,11 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pest" -version = "2.7.2" +version = "2.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1acb4a4365a13f749a93f1a094a7805e5cfa0955373a9de860d962eaa3a5fe5a" +checksum = "d7a4d085fd991ac8d5b05a147b437791b4260b76326baf0fc60cf7c9c27ecd33" dependencies = [ + "memchr", "thiserror", "ucd-trie", ] @@ -4379,12 +4408,12 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.6.3" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" +checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" dependencies = [ "fixedbitset 0.4.2", - "indexmap 1.9.3", + "indexmap 2.0.0", ] [[package]] @@ -4424,7 +4453,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -4435,9 +4464,9 @@ checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" [[package]] name = "pin-project-lite" -version = "0.2.12" +version = "0.2.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" [[package]] name = "pin-utils" @@ -4643,7 +4672,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e6984d2f1a23009bd270b8bb56d0926810a3d483f59c987d77969e9d8e840b2" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "prost-derive 0.7.0", ] @@ -4653,7 +4682,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71adf41db68aa0daaefc69bb30bcd68ded9b9abaad5d1fbb6304c4fb390e083e" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "prost-derive 0.10.1", ] @@ -4663,7 +4692,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32d3ebd75ac2679c2af3a92246639f9fcc8a442ee420719cc4fe195b98dd5fa3" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "heck 0.3.3", "itertools 0.9.0", "log", @@ -4681,7 +4710,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ae5a4388762d5815a9fc0dea33c56b021cdc8dde0c55e0c9ca57197254b0cab" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "cfg-if 1.0.0", "cmake", "heck 0.4.1", @@ -4689,7 +4718,7 @@ dependencies = [ "lazy_static", "log", "multimap", - "petgraph 0.6.3", + "petgraph 0.6.4", "prost 0.10.4", "prost-types 0.10.1", "regex", @@ -4729,7 +4758,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b518d7cdd93dab1d1122cf07fa9a60771836c668dde9d9e2a139f957f0d9f1bb" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "prost 0.7.0", ] @@ -4739,7 +4768,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d0a014229361011dc8e69c8a1ec6c2e8d0f2af7c91e3ea3f5b2170298461e68" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "prost 0.10.4", ] @@ -5006,9 +5035,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.3" +version = "1.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" +checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" dependencies = [ "aho-corasick", "memchr", @@ -5018,9 +5047,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.6" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" +checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" dependencies = [ "aho-corasick", "memchr", @@ -5029,9 +5058,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" +checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" [[package]] name = "remove_dir_all" @@ -5053,16 +5082,16 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.18" +version = "0.11.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" +checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" dependencies = [ - "base64 0.21.3", - "bytes 1.4.0", + "base64 0.21.4", + "bytes 1.5.0", "encoding_rs", "futures-core", "futures-util", - "h2 0.3.20", + "h2 0.3.21", "http", "http-body 0.4.5", "hyper 0.14.27", @@ -5075,7 +5104,7 @@ dependencies = [ "native-tls", "once_cell", "percent-encoding", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", "rustls", "rustls-pemfile", "serde", @@ -5091,7 +5120,7 @@ dependencies = [ "wasm-bindgen-futures", "web-sys", "webpki-roots", - "winreg 0.10.1", + "winreg", ] [[package]] @@ -5164,7 +5193,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "rustc-hex", ] @@ -5209,7 +5238,7 @@ checksum = "a4c4216490d5a413bc6d10fa4742bd7d4955941d062c0ef873141d6b0e7b30fd" dependencies = [ "arrayvec 0.7.4", "borsh", - "bytes 1.4.0", + "bytes 1.5.0", "num-traits", "rand 0.8.5", "rkyv", @@ -5249,12 +5278,12 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.8" +version = "0.38.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" +checksum = "d7db8590df6dfcd144d22afd1b83b36c21a18d7cbc1dc4bb5295a8712e9eb662" dependencies = [ "bitflags 2.4.0", - "errno 0.3.2", + "errno 0.3.3", "libc", "linux-raw-sys", "windows-sys 0.48.0", @@ -5262,9 +5291,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.6" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" +checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" dependencies = [ "log", "ring", @@ -5278,14 +5307,14 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ - "base64 0.21.3", + "base64 0.21.4", ] [[package]] name = "rustls-webpki" -version = "0.101.4" +version = "0.101.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" +checksum = "45a27e3b59326c16e23d30aeb7a36a24cc0d29e71d68ff611cdfb4a01d013bed" dependencies = [ "ring", "untrusted", @@ -5411,9 +5440,9 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.12" +version = "0.8.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" +checksum = "763f8cd0d4c71ed8389c90cb8100cba87e763bd01a8e614d4f0af97bcd50a161" dependencies = [ "chrono", "dyn-clone", @@ -5426,9 +5455,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.12" +version = "0.8.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" +checksum = "ec0f696e21e10fa546b7ffb1c9672c6de8fbc7a81acf59524386d8639bf12737" dependencies = [ "proc-macro2", "quote", @@ -5615,9 +5644,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.183" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c" +checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" dependencies = [ "serde_derive", ] @@ -5633,13 +5662,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.183" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -5655,9 +5684,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.105" +version = "1.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" +checksum = "2cc66a619ed80bf7a0f6b17dd063a84b88f6dea1813737cf469aef1d081142c2" dependencies = [ "itoa 1.0.9", "ryu", @@ -5739,7 +5768,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92761393ee4dc3ff8f4af487bd58f4307c9329bbedea02cac0089ad9c411e153" dependencies = [ - "dashmap 5.5.0", + "dashmap 5.5.3", "futures 0.3.28", "lazy_static", "log", @@ -5753,7 +5782,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "538c30747ae860d6fb88330addbbd3e0ddbe46d662d032855596d8a8ca260611" dependencies = [ - "dashmap 5.5.0", + "dashmap 5.5.3", "futures 0.3.28", "lazy_static", "log", @@ -5767,7 +5796,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e56dd856803e253c8f298af3f4d7eb0ae5e23a737252cd90bb4f3b435033b2d" dependencies = [ - "dashmap 5.5.0", + "dashmap 5.5.3", "futures 0.3.28", "lazy_static", "log", @@ -5816,7 +5845,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -5948,9 +5977,9 @@ checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" [[package]] name = "shlex" -version = "1.1.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" +checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" [[package]] name = "signal-hook" @@ -6016,9 +6045,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.8" +version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" dependencies = [ "autocfg", ] @@ -6062,9 +6091,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.3" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" +checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" dependencies = [ "libc", "windows-sys 0.48.0", @@ -6077,7 +6106,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" dependencies = [ "base64 0.13.1", - "bytes 1.4.0", + "bytes 1.5.0", "futures 0.3.28", "httparse", "log", @@ -6112,11 +6141,11 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e" +checksum = "6b7b278788e7be4d0d29c0f39497a0eef3fba6bbc8e70d8bf7fde46edeaa9e85" dependencies = [ - "itertools 0.10.5", + "itertools 0.11.0", "nom 7.1.3", "unicode_categories", ] @@ -6143,7 +6172,7 @@ dependencies = [ "ahash 0.8.3", "atoi", "byteorder", - "bytes 1.4.0", + "bytes 1.5.0", "chrono", "crc", "crossbeam-queue 0.3.8", @@ -6221,10 +6250,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca69bf415b93b60b80dc8fda3cb4ef52b2336614d8da2de5456cc942a110482" dependencies = [ "atoi", - "base64 0.21.3", + "base64 0.21.4", "bitflags 2.4.0", "byteorder", - "bytes 1.4.0", + "bytes 1.5.0", "chrono", "crc", "digest 0.10.7", @@ -6264,7 +6293,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0db2df1b8731c3651e204629dd55e52adbae0462fa1bdcbed56a2302c18181e" dependencies = [ "atoi", - "base64 0.21.3", + "base64 0.21.4", "bitflags 2.4.0", "byteorder", "chrono", @@ -6334,10 +6363,11 @@ checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" [[package]] name = "stringprep" -version = "0.1.3" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db3737bde7edce97102e0e2b15365bf7a20bfdb5f60f4f9e8d7004258a51a8da" +checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" dependencies = [ + "finl_unicode", "unicode-bidi", "unicode-normalization", ] @@ -6428,9 +6458,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.29" +version = "2.0.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" +checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2" dependencies = [ "proc-macro2", "quote", @@ -6488,9 +6518,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.7.1" +version = "3.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc02fddf48964c42031a0b3fe0428320ecf3a73c401040fc0096f97794310651" +checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" dependencies = [ "cfg-if 1.0.0", "fastrand", @@ -6612,22 +6642,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.47" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" +checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.47" +version = "1.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" +checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -6707,14 +6737,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" dependencies = [ "backtrace", - "bytes 1.4.0", + "bytes 1.5.0", "libc", "mio 0.8.8", "num_cpus", "parking_lot 0.12.1", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", "signal-hook-registry", - "socket2 0.5.3", + "socket2 0.5.4", "tokio-macros", "windows-sys 0.48.0", ] @@ -6737,7 +6767,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -6788,7 +6818,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" dependencies = [ "futures-core", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", "tokio 1.32.0", "tokio-util 0.7.8", ] @@ -6828,13 +6858,13 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "futures-core", "futures-io", "futures-sink", "futures-util", "hashbrown 0.12.3", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", "tokio 1.32.0", "tracing", ] @@ -6856,9 +6886,9 @@ checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" [[package]] name = "toml_edit" -version = "0.19.14" +version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.0.0", "toml_datetime", @@ -6879,7 +6909,7 @@ checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if 1.0.0", "log", - "pin-project-lite 0.2.12", + "pin-project-lite 0.2.13", "tracing-attributes", "tracing-core", ] @@ -6892,7 +6922,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] @@ -7003,9 +7033,9 @@ dependencies = [ [[package]] name = "unicase" -version = "2.6.0" +version = "2.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" dependencies = [ "version_check", ] @@ -7063,9 +7093,9 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" +checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" dependencies = [ "form_urlencoded", "idna 0.4.0", @@ -7125,7 +7155,7 @@ checksum = "e7141e445af09c8919f1d5f8a20dae0b20c3b57a45dee0d5823c6ed5d237f15a" dependencies = [ "bitflags 1.3.2", "chrono", - "rustc_version 0.2.3", + "rustc_version 0.4.0", ] [[package]] @@ -7166,9 +7196,9 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.3.3" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" +checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" dependencies = [ "same-file", "winapi-util", @@ -7222,7 +7252,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", "wasm-bindgen-shared", ] @@ -7256,7 +7286,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7284,8 +7314,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5388522c899d1e1c96a4c307e3797e0f697ba7c77dd8e0e625ecba9dd0342937" dependencies = [ "arrayvec 0.7.4", - "base64 0.21.3", - "bytes 1.4.0", + "base64 0.21.4", + "bytes 1.5.0", "derive_more", "ethabi", "ethereum-types 0.14.1", @@ -7324,34 +7354,22 @@ dependencies = [ "url", ] -[[package]] -name = "webpki" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" -dependencies = [ - "ring", - "untrusted", -] - [[package]] name = "webpki-roots" -version = "0.22.6" +version = "0.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" -dependencies = [ - "webpki", -] +checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" [[package]] name = "which" -version = "4.4.0" +version = "4.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" dependencies = [ "either", - "libc", + "home", "once_cell", + "rustix", ] [[package]] @@ -7415,7 +7433,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-targets 0.48.4", + "windows-targets 0.48.5", ] [[package]] @@ -7433,7 +7451,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.4", + "windows-targets 0.48.5", ] [[package]] @@ -7453,17 +7471,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.4" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d92ecb8ae0317859f509f17b19adc74b0763b0fa3b085dea8ed01085c8dac222" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" dependencies = [ - "windows_aarch64_gnullvm 0.48.4", - "windows_aarch64_msvc 0.48.4", - "windows_i686_gnu 0.48.4", - "windows_i686_msvc 0.48.4", - "windows_x86_64_gnu 0.48.4", - "windows_x86_64_gnullvm 0.48.4", - "windows_x86_64_msvc 0.48.4", + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", ] [[package]] @@ -7474,9 +7492,9 @@ checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.4" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d14b0ee96970be7108701212f097ce67ca772fd84cb0ffbc86d26a94e77ba929" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" [[package]] name = "windows_aarch64_msvc" @@ -7486,9 +7504,9 @@ checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" -version = "0.48.4" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1332277d49f440c8fc6014941e320ee47ededfcce10cb272728470f56cc092c9" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" [[package]] name = "windows_i686_gnu" @@ -7498,9 +7516,9 @@ checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.48.4" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d992130ac399d56f02c20564e9975ac5ba08cb25cb832849bbc0d736a101abe5" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" [[package]] name = "windows_i686_msvc" @@ -7510,9 +7528,9 @@ checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" -version = "0.48.4" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "962e96d0fa4b4773c63977977ea6564f463fb10e34a6e07360428b53ae7a3f71" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" [[package]] name = "windows_x86_64_gnu" @@ -7522,9 +7540,9 @@ checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" -version = "0.48.4" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30652a53018a48a9735fbc2986ff0446c37bc8bed0d3f98a0ed4d04cdb80027e" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" [[package]] name = "windows_x86_64_gnullvm" @@ -7534,9 +7552,9 @@ checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.4" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5bb3f0331abfe1a95af56067f1e64b3791b55b5373b03869560b6025de809bf" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" [[package]] name = "windows_x86_64_msvc" @@ -7546,28 +7564,19 @@ checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.48.4" +version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd1df36d9fd0bbe4849461de9b969f765170f4e0f90497d580a235d515722b10" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" [[package]] name = "winnow" -version = "0.5.14" +version = "0.5.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d09770118a7eb1ccaf4a594a221334119a44a814fcb0d31c5b85e83e97227a97" +checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" dependencies = [ "memchr", ] -[[package]] -name = "winreg" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" -dependencies = [ - "winapi 0.3.9", -] - [[package]] name = "winreg" version = "0.50.0" @@ -7684,7 +7693,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml 0.9.25", - "shlex 1.1.0", + "shlex 1.2.0", "tempdir", "thiserror", "ya-client-model", @@ -7697,7 +7706,7 @@ source = "git+https://github.com/golemfactory/ya-client.git?rev=20590d867dff7bb0 dependencies = [ "actix-codec", "awc", - "bytes 1.4.0", + "bytes 1.5.0", "chrono", "envy", "futures 0.3.28", @@ -7894,7 +7903,7 @@ dependencies = [ "actix-web", "anyhow", "async-trait", - "bytes 1.4.0", + "bytes 1.5.0", "chrono", "derivative", "derive_more", @@ -7985,8 +7994,8 @@ dependencies = [ "actix-web-actors", "anyhow", "awc", - "base64 0.21.3", - "bytes 1.4.0", + "base64 0.21.4", + "bytes 1.5.0", "ctor", "env_logger 0.10.0", "flexbuffers", @@ -8067,7 +8076,7 @@ name = "ya-manifest-utils" version = "0.2.0" dependencies = [ "anyhow", - "base64 0.21.3", + "base64 0.21.4", "chrono", "golem-certificate", "hex", @@ -8083,7 +8092,7 @@ dependencies = [ "serde_json", "serde_yaml 0.9.25", "serial_test 2.0.0", - "shlex 1.1.0", + "shlex 1.2.0", "snailquote", "structopt", "strum", @@ -8201,7 +8210,7 @@ dependencies = [ "actix", "actix-web", "anyhow", - "bytes 1.4.0", + "bytes 1.5.0", "chrono", "env_logger 0.7.1", "ethsign", @@ -8401,7 +8410,7 @@ dependencies = [ "serde_json", "serial_test 0.9.0", "shared_child", - "shlex 1.1.0", + "shlex 1.2.0", "signal-hook", "structopt", "strum", @@ -8492,7 +8501,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d0d9cf0deab658d8efc643fec135e1aa37856aa6a68ee6387e039f568a7dc27" dependencies = [ "anyhow", - "bytes 1.4.0", + "bytes 1.5.0", "derive_more", "futures 0.3.28", "prost 0.10.4", @@ -8530,7 +8539,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "306a73f6ce2286987c9da25bc0c2ef81f4f0b2b58bb8d9aeedc34d27407603ff" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "derive_more", ] @@ -8539,7 +8548,7 @@ name = "ya-runtime-api" version = "0.7.0" dependencies = [ "anyhow", - "bytes 1.4.0", + "bytes 1.5.0", "env_logger 0.7.1", "futures 0.3.28", "log", @@ -8557,7 +8566,7 @@ name = "ya-sb-proto" version = "0.6.1" source = "git+https://github.com/golemfactory/ya-service-bus.git?rev=190f0d772f7ed0830d54a2cef77d7a177f276c68#190f0d772f7ed0830d54a2cef77d7a177f276c68" dependencies = [ - "bytes 1.4.0", + "bytes 1.5.0", "prost 0.10.4", "prost-build 0.7.0", "thiserror", @@ -8758,13 +8767,13 @@ dependencies = [ "anyhow", "async-compression", "awc", - "bytes 1.4.0", + "bytes 1.5.0", "crossterm 0.26.1", "env_logger 0.7.1", "futures 0.3.28", "gftp", "globset", - "h2 0.3.20", + "h2 0.3.21", "hex", "lazy_static", "log", @@ -8905,7 +8914,7 @@ dependencies = [ "actix-web", "actix-web-actors", "anyhow", - "bytes 1.4.0", + "bytes 1.5.0", "env_logger 0.7.1", "futures 0.3.28", "hex", @@ -9030,7 +9039,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.29", + "syn 2.0.32", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 0fc860e256..8a968797e0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -38,6 +38,9 @@ libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } # erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "9b6d23a5d8844f26a98abed5f2d85b7a96d8cbb2" } #erc20_payment_lib = { version = "=0.1.9" } +rand = "0.8.5" +url = "2.3.1" +trust-dns-resolver = "0.22" [dependencies] ya-activity = "0.4" @@ -228,11 +231,6 @@ members = [ "test-utils/test-framework/framework-macro", ] -[workspace.dependencies] -rand = "0.8.5" -url = "2.3.1" -trust-dns-resolver = "0.22" -libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } [patch.crates-io] ## SERVICES From f8c42adfd8addc02cec692fb7046e6f24decee2c Mon Sep 17 00:00:00 2001 From: scx1332 Date: Tue, 12 Sep 2023 12:29:41 +0200 Subject: [PATCH 039/123] working on github actions --- .github/workflows/binaries-x86-64.yml | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/.github/workflows/binaries-x86-64.yml b/.github/workflows/binaries-x86-64.yml index b490ba028f..85f6312536 100644 --- a/.github/workflows/binaries-x86-64.yml +++ b/.github/workflows/binaries-x86-64.yml @@ -4,10 +4,12 @@ on: push: branches: - master + - payments-dev - release/* pull_request: branches: - master + - payments-dev - release/* env: @@ -49,7 +51,7 @@ jobs: - name: Setup cache uses: Swatinem/rust-cache@v2 with: - save-if: ${{ github.ref == 'refs/heads/master' }} + save-if: ${{ github.ref == 'refs/heads/payments-dev' }} - name: Check lockfile @@ -67,11 +69,7 @@ jobs: - name: Build binaries run: | - cargo build --features static-openssl --target x86_64-unknown-linux-musl - (cd core/gftp && cargo build --bin gftp -p gftp --features bin --target x86_64-unknown-linux-musl) - (cd golem_cli && cargo build --bin golemsp -p golemsp --target x86_64-unknown-linux-musl) - (cd agent/provider && cargo build --bin ya-provider -p ya-provider --target x86_64-unknown-linux-musl) - (cd exe-unit && cargo build --bin exe-unit -p ya-exe-unit --features openssl/vendored --target x86_64-unknown-linux-musl) + cargo build --features static-openssl --target x86_64-unknown-linux-musl -p yagna -p ya-exe-unit -p gftp -p golemsp -p ya-provider - name: Copy binaries shell: bash From 546a9035fcc2bd870483e661f5d4810734850913 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Tue, 12 Sep 2023 12:33:54 +0200 Subject: [PATCH 040/123] Cache name --- .github/workflows/binaries-x86-64.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/binaries-x86-64.yml b/.github/workflows/binaries-x86-64.yml index 85f6312536..c0d633dc35 100644 --- a/.github/workflows/binaries-x86-64.yml +++ b/.github/workflows/binaries-x86-64.yml @@ -51,6 +51,7 @@ jobs: - name: Setup cache uses: Swatinem/rust-cache@v2 with: + shared-key: "payment-dev-x86-64" save-if: ${{ github.ref == 'refs/heads/payments-dev' }} From ed1ec382d8287b201c2fdfbeca28b09a40d02f3c Mon Sep 17 00:00:00 2001 From: scx1332 Date: Tue, 12 Sep 2023 12:37:36 +0200 Subject: [PATCH 041/123] Fix toml formatting --- exe-unit/runtime-api/Cargo.toml | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/exe-unit/runtime-api/Cargo.toml b/exe-unit/runtime-api/Cargo.toml index e908b0f50f..7b4a0d67eb 100644 --- a/exe-unit/runtime-api/Cargo.toml +++ b/exe-unit/runtime-api/Cargo.toml @@ -15,22 +15,17 @@ required-features = ["server"] [features] default = ['server'] codec = [] -server = [ - 'prost' , - 'futures', - 'tokio', - 'tokio-util' -] +server = ['prost', 'futures', 'tokio', 'tokio-util'] [dependencies] anyhow = "1.0.31" bytes = "1.0" -futures = { version = "0.3", optional = true } +futures = { version = "0.3", optional = true } log = "0.4" prost = { version = "0.10", optional = true } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -tokio = { version = "1" , optional = true, features = ["io-std", "rt", "process", "sync"] } +tokio = { version = "1", optional = true, features = ["io-std", "rt", "process", "sync"] } tokio-util = { version = "0.7", optional = true, features = ["codec"] } url = "2.3" @@ -38,5 +33,5 @@ url = "2.3" prost-build = "0.10" [dev-dependencies] -tokio = { version = "1" , features = ["macros", "time"] } +tokio = { version = "1", features = ["macros", "time"] } env_logger = "0.7" From 3685d3378cb49c634e29a8290e18f3836caf6a94 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Tue, 12 Sep 2023 13:48:31 +0200 Subject: [PATCH 042/123] Other cargo lock --- Cargo.lock | 700 ++++++++++++++++++++++++++++------------------------- 1 file changed, 372 insertions(+), 328 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index cdb3c62277..d6b19545ad 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,15 +4,14 @@ version = 3 [[package]] name = "actix" -version = "0.13.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cba56612922b907719d4a01cf11c8d5b458e7d3dba946d0435f20f58d6795ed2" +checksum = "f728064aca1c318585bf4bb04ffcfac9e75e508ab4e8b1bd9ba5dfe04e2cbed5" dependencies = [ - "actix-macros", "actix-rt", "actix_derive", - "bitflags 2.4.0", - "bytes 1.5.0", + "bitflags 1.3.2", + "bytes 1.4.0", "crossbeam-channel 0.5.8", "futures-core", "futures-sink", @@ -21,7 +20,7 @@ dependencies = [ "log", "once_cell", "parking_lot 0.12.1", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "smallvec", "tokio 1.32.0", "tokio-util 0.7.8", @@ -34,11 +33,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617a8268e3537fe1d8c9ead925fca49ef6400927ee7bc26750e90ecee14ce4b8" dependencies = [ "bitflags 1.3.2", - "bytes 1.5.0", + "bytes 1.4.0", "futures-core", "futures-sink", "memchr", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "tokio 1.32.0", "tokio-util 0.7.8", "tracing", @@ -71,7 +70,7 @@ dependencies = [ "actix-web", "askama_escape", "bitflags 1.3.2", - "bytes 1.5.0", + "bytes 1.4.0", "derive_more", "futures-core", "http-range", @@ -79,14 +78,14 @@ dependencies = [ "mime", "mime_guess", "percent-encoding", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", ] [[package]] name = "actix-http" -version = "3.4.0" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92ef85799cba03f76e4f7c10f533e66d87c9a7e7055f3391f09000ad8351bc9" +checksum = "c2079246596c18b4a33e274ae10c0e50613f4d32a4198e09c7b93771013fed74" dependencies = [ "actix-codec", "actix-rt", @@ -94,16 +93,16 @@ dependencies = [ "actix-tls", "actix-utils", "ahash 0.8.3", - "base64 0.21.4", - "bitflags 2.4.0", + "base64 0.21.3", + "bitflags 1.3.2", "brotli", - "bytes 1.5.0", + "bytes 1.4.0", "bytestring", "derive_more", "encoding_rs", "flate2", "futures-core", - "h2 0.3.21", + "h2 0.3.20", "http", "httparse", "httpdate 1.0.3", @@ -112,7 +111,7 @@ dependencies = [ "local-channel", "mime", "percent-encoding", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "rand 0.8.5", "sha1", "smallvec", @@ -135,7 +134,7 @@ dependencies = [ "actix-tls", "actix-utils", "awc", - "bytes 1.5.0", + "bytes 1.4.0", "futures-core", "http", "log", @@ -154,7 +153,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.32", + "syn 2.0.29", ] [[package]] @@ -172,9 +171,9 @@ dependencies = [ [[package]] name = "actix-rt" -version = "2.9.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28f32d40287d3f402ae0028a9d54bef51af15c8769492826a69d28f81893151d" +checksum = "15265b6b8e2347670eb363c47fc8c75208b4a4994b27192f345fcbe707804f3e" dependencies = [ "actix-macros", "futures-core", @@ -183,9 +182,9 @@ dependencies = [ [[package]] name = "actix-server" -version = "2.3.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb13e7eef0423ea6eab0e59f6c72e7cb46d33691ad56a726b3cd07ddec2c2d4" +checksum = "3e8613a75dd50cc45f473cee3c34d59ed677c0f7b44480ce3b8247d7dc519327" dependencies = [ "actix-rt", "actix-service", @@ -193,7 +192,8 @@ dependencies = [ "futures-core", "futures-util", "mio 0.8.8", - "socket2 0.5.4", + "num_cpus", + "socket2 0.4.9", "tokio 1.32.0", "tracing", ] @@ -206,14 +206,14 @@ checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" dependencies = [ "futures-core", "paste", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", ] [[package]] name = "actix-test" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2173910d0c7d0a21730d3e1304576d9c969eead2b91f3257a7435f7face702e0" +checksum = "a7c7d37a955bfa3ccde83c12bc8987262abaf6c90ae9dd24fcdbd78c6c01ffaf" dependencies = [ "actix-codec", "actix-http", @@ -234,24 +234,21 @@ dependencies = [ [[package]] name = "actix-tls" -version = "3.1.1" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72616e7fbec0aa99c6f3164677fa48ff5a60036d0799c98cab894a44f3e0efc3" +checksum = "9fde0cf292f7cdc7f070803cb9a0d45c018441321a78b1042ffbbb81ec333297" dependencies = [ + "actix-codec", "actix-rt", "actix-service", "actix-utils", "futures-core", "http", - "impl-more", + "log", "openssl", - "pin-project-lite 0.2.13", - "rustls", - "rustls-webpki", - "tokio 1.32.0", + "pin-project-lite 0.2.12", "tokio-openssl", "tokio-util 0.7.8", - "tracing", ] [[package]] @@ -261,14 +258,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" dependencies = [ "local-waker", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", ] [[package]] name = "actix-web" -version = "4.4.0" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4a5b5e29603ca8c94a77c65cf874718ceb60292c5a5c3e5f4ace041af462b9" +checksum = "cd3cb42f9566ab176e1ef0b8b3a896529062b4efc6be0123046095914c4c1c96" dependencies = [ "actix-codec", "actix-http", @@ -280,8 +277,8 @@ dependencies = [ "actix-tls", "actix-utils", "actix-web-codegen", - "ahash 0.8.3", - "bytes 1.5.0", + "ahash 0.7.6", + "bytes 1.4.0", "bytestring", "cfg-if 1.0.0", "cookie", @@ -289,18 +286,19 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", + "http", "itoa 1.0.9", "language-tags", "log", "mime", "once_cell", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "regex", "serde", "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.5.4", + "socket2 0.4.9", "time 0.3.9", "url", ] @@ -315,24 +313,24 @@ dependencies = [ "actix-codec", "actix-http", "actix-web", - "bytes 1.5.0", + "bytes 1.4.0", "bytestring", "futures-core", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "tokio 1.32.0", "tokio-util 0.7.8", ] [[package]] name = "actix-web-codegen" -version = "4.2.2" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1f50ebbb30eca122b188319a4398b3f7bb4a8cdf50ecfb73bfc6a3c3ce54f5" +checksum = "2262160a7ae29e3415554a3f1fc04c764b1540c116aa524683208078b7a75bc9" dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.32", + "syn 1.0.109", ] [[package]] @@ -347,25 +345,25 @@ dependencies = [ "base64 0.13.1", "futures-core", "futures-util", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", ] [[package]] name = "actix_derive" -version = "0.6.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c7db3d5a9718568e4cf4a537cfd7070e6e6ff7481510d0237fb529ac850f6d3" +checksum = "6d44b8fee1ced9671ba043476deddef739dd0959bf77030b26b738cc591737a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 1.0.109", ] [[package]] name = "addr2line" -version = "0.21.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" dependencies = [ "gimli", ] @@ -450,9 +448,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.0.5" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c378d78423fdad8089616f827526ee33c19f2fddbd5de1629152c9593ba4783" +checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" dependencies = [ "memchr", ] @@ -510,9 +508,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.3" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b84bf0a05bbb2a83e5eb6fa36bb6e87baa08193c35ff52bbf6b38d8af2890e46" +checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" [[package]] name = "anyhow" @@ -591,7 +589,7 @@ dependencies = [ "futures-core", "futures-io", "memchr", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "tokio 1.32.0", "xz2", ] @@ -604,7 +602,7 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.29", ] [[package]] @@ -644,9 +642,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "awc" -version = "3.2.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fa3c705a9c7917ac0f41c0757a0a747b43bbc29b0b364b081bd7c5fc67fb223" +checksum = "87ef547a81796eb2dfe9b345aba34c2e08391a0502493711395b36dd64052b69" dependencies = [ "actix-codec", "actix-http", @@ -654,21 +652,22 @@ dependencies = [ "actix-service", "actix-tls", "actix-utils", - "base64 0.21.4", - "bytes 1.5.0", + "ahash 0.7.6", + "base64 0.21.3", + "bytes 1.4.0", "cfg-if 1.0.0", "cookie", "derive_more", "futures-core", "futures-util", - "h2 0.3.21", + "h2 0.3.20", "http", "itoa 1.0.9", "log", "mime", "openssl", "percent-encoding", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "rand 0.8.5", "serde", "serde_json", @@ -688,9 +687,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" dependencies = [ "addr2line", "cc", @@ -721,9 +720,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.4" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" [[package]] name = "base64ct" @@ -865,7 +864,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" dependencies = [ "borsh-derive", - "hashbrown 0.13.2", + "hashbrown 0.12.3", ] [[package]] @@ -926,9 +925,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.6.2" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c2f7349907b712260e64b0afe2f84692af14a454be26187d9df565c7f69266a" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" dependencies = [ "memchr", "regex-automata", @@ -999,15 +998,15 @@ checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] name = "bytes" -version = "1.5.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "bytesize" -version = "1.3.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e368af43e418a04d52505cf3dbc23dda4e3407ae2fa99fd0e4f308ce546acc" +checksum = "38fcc2979eff34a4b84e1cf9a1e3da42a7d44b3b690a40cdcb23e3d556cfb2e5" [[package]] name = "bytestring" @@ -1015,7 +1014,7 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "238e4886760d98c4f899360c834fa93e62cf7f721ac3c2da375cbdf4b8679aae" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", ] [[package]] @@ -1051,9 +1050,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "305fe645edc1442a0fa8b6726ba61d422798d37a52e12eaecf4b022ebbb88f01" dependencies = [ "jobserver", "libc", @@ -1073,17 +1072,18 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.30" +version = "0.4.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd4e7873dbddba6c7c91e199c7fcb946abc4a6a4ac3195400bcfb01b5de877" +checksum = "ec837a71355b28f6556dbd569b37b3f363091c0bd4b2e735674521b4c5fd9bc5" dependencies = [ "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", + "time 0.1.45", "wasm-bindgen", - "windows-targets 0.48.5", + "winapi 0.3.9", ] [[package]] @@ -1463,11 +1463,11 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.4.1" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e95fbd621905b854affdc67943b043a0fbb6ed7385fd5a25650d19a8a6cfdf" +checksum = "2a011bbe2c35ce9c1f143b7af6f94f29a167beb4cd1d29e6740ce836f723120e" dependencies = [ - "nix 0.27.1", + "nix 0.26.2", "windows-sys 0.48.0", ] @@ -1531,9 +1531,9 @@ dependencies = [ [[package]] name = "dashmap" -version = "5.5.3" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +checksum = "6943ae99c34386c84a470c499d3414f66502a41340aa895406e0d2e4a207b91d" dependencies = [ "cfg-if 1.0.0", "hashbrown 0.14.0", @@ -1792,9 +1792,9 @@ checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" -version = "0.8.33" +version = "0.8.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" dependencies = [ "cfg-if 1.0.0", ] @@ -1805,6 +1805,18 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" +[[package]] +name = "enum-as-inner" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73" +dependencies = [ + "heck 0.4.1", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "enum-as-inner" version = "0.5.1" @@ -1912,9 +1924,9 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.3" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "136526188508e25c6fef639d7927dfb3e0e3084488bf202267829cf7fc23dbdd" +checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" dependencies = [ "errno-dragonfly", "libc", @@ -2103,12 +2115,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "finl_unicode" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" - [[package]] name = "fixed-hash" version = "0.7.0" @@ -2389,7 +2395,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.29", ] [[package]] @@ -2424,7 +2430,7 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "pin-utils", "slab", ] @@ -2506,9 +2512,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" [[package]] name = "git-version" @@ -2671,11 +2677,11 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.21" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "fnv", "futures-core", "futures-sink", @@ -2707,15 +2713,6 @@ dependencies = [ "ahash 0.7.6", ] -[[package]] -name = "hashbrown" -version = "0.13.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash 0.8.3", -] - [[package]] name = "hashbrown" version = "0.14.0" @@ -2728,9 +2725,9 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.8.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +checksum = "312f66718a2d7789ffef4f4b7b213138ed9f1eb3aa1d0d82fc99f88fb3ffd26f" dependencies = [ "hashbrown 0.14.0", ] @@ -2747,12 +2744,13 @@ dependencies = [ [[package]] name = "headers" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" +checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" dependencies = [ - "base64 0.21.4", - "bytes 1.5.0", + "base64 0.13.1", + "bitflags 1.3.2", + "bytes 1.4.0", "headers-core", "http", "httpdate 1.0.3", @@ -2862,7 +2860,7 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "fnv", "itoa 1.0.9", ] @@ -2883,9 +2881,9 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "http", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", ] [[package]] @@ -2957,17 +2955,17 @@ version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "futures-channel", "futures-core", "futures-util", - "h2 0.3.21", + "h2 0.3.20", "http", "http-body 0.4.5", "httparse", "httpdate 1.0.3", "itoa 1.0.9", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "socket2 0.4.9", "tokio 1.32.0", "tower-service", @@ -2995,7 +2993,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "hyper 0.14.27", "native-tls", "tokio 1.32.0", @@ -3081,15 +3079,9 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ - "parity-scale-codec 3.6.5", + "parity-scale-codec 3.6.4", ] -[[package]] -name = "impl-more" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d" - [[package]] name = "impl-rlp" version = "0.3.0" @@ -3205,10 +3197,10 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.4", + "socket2 0.5.3", "widestring", "windows-sys 0.48.0", - "winreg", + "winreg 0.50.0", ] [[package]] @@ -3246,15 +3238,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "0.4.8" @@ -3381,9 +3364,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.7" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a9bad9f94746442c783ca431b22403b519cd7fbeed0533fdd6328b2f2212128" +checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" [[package]] name = "local-channel" @@ -3501,9 +3484,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.6.3" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f232d6ef707e1956a43342693d2a31e72989554d58299d7a88738cc95b0d35c" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" @@ -3916,13 +3899,14 @@ dependencies = [ [[package]] name = "nix" -version = "0.27.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" dependencies = [ - "bitflags 2.4.0", + "bitflags 1.3.2", "cfg-if 1.0.0", "libc", + "static_assertions", ] [[package]] @@ -4110,9 +4094,9 @@ checksum = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a" [[package]] name = "object" -version = "0.32.1" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" dependencies = [ "memchr", ] @@ -4147,11 +4131,11 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.57" +version = "0.10.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" +checksum = "729b745ad4a5575dd06a3e1af1414bd330ee561c01b3899eb584baeaa8def17e" dependencies = [ - "bitflags 2.4.0", + "bitflags 1.3.2", "cfg-if 1.0.0", "foreign-types", "libc", @@ -4168,7 +4152,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.29", ] [[package]] @@ -4179,18 +4163,18 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "300.1.3+3.1.2" +version = "111.27.0+1.1.1v" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd2c101a165fff9935e34def4669595ab1c7847943c42be86e21503e482be107" +checksum = "06e8f197c82d7511c5b014030c9b1efeda40d7d5f99d23b4ceed3524a5e63f02" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.93" +version = "0.9.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d" +checksum = "866b5f16f90776b9bb8dc1e1802ac6f0513de3a7a7465867bfbc563dc737faac" dependencies = [ "cc", "libc", @@ -4235,15 +4219,15 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.6.5" +version = "3.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" +checksum = "dd8e946cc0cc711189c0b0249fb8b599cbeeab9784d83c415719368bb8d4ac64" dependencies = [ "arrayvec 0.7.4", "bitvec 1.0.1", "byte-slice-cast", "impl-trait-for-tuples", - "parity-scale-codec-derive 3.6.5", + "parity-scale-codec-derive 3.6.4", "serde", ] @@ -4261,9 +4245,9 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.5" +version = "3.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" +checksum = "2a296c3079b5fefbc499e1de58dc26c09b1b9a5952d26694ee89f04a43ebbb3e" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", @@ -4340,7 +4324,7 @@ dependencies = [ "libc", "redox_syscall 0.3.5", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.48.4", ] [[package]] @@ -4387,11 +4371,10 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pest" -version = "2.7.3" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7a4d085fd991ac8d5b05a147b437791b4260b76326baf0fc60cf7c9c27ecd33" +checksum = "1acb4a4365a13f749a93f1a094a7805e5cfa0955373a9de860d962eaa3a5fe5a" dependencies = [ - "memchr", "thiserror", "ucd-trie", ] @@ -4408,12 +4391,12 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" dependencies = [ "fixedbitset 0.4.2", - "indexmap 2.0.0", + "indexmap 1.9.3", ] [[package]] @@ -4453,7 +4436,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.29", ] [[package]] @@ -4464,9 +4447,9 @@ checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" [[package]] name = "pin-utils" @@ -4672,7 +4655,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e6984d2f1a23009bd270b8bb56d0926810a3d483f59c987d77969e9d8e840b2" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "prost-derive 0.7.0", ] @@ -4682,7 +4665,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71adf41db68aa0daaefc69bb30bcd68ded9b9abaad5d1fbb6304c4fb390e083e" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "prost-derive 0.10.1", ] @@ -4692,7 +4675,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32d3ebd75ac2679c2af3a92246639f9fcc8a442ee420719cc4fe195b98dd5fa3" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "heck 0.3.3", "itertools 0.9.0", "log", @@ -4710,7 +4693,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ae5a4388762d5815a9fc0dea33c56b021cdc8dde0c55e0c9ca57197254b0cab" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "cfg-if 1.0.0", "cmake", "heck 0.4.1", @@ -4718,7 +4701,7 @@ dependencies = [ "lazy_static", "log", "multimap", - "petgraph 0.6.4", + "petgraph 0.6.3", "prost 0.10.4", "prost-types 0.10.1", "regex", @@ -4758,7 +4741,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b518d7cdd93dab1d1122cf07fa9a60771836c668dde9d9e2a139f957f0d9f1bb" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "prost 0.7.0", ] @@ -4768,7 +4751,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d0a014229361011dc8e69c8a1ec6c2e8d0f2af7c91e3ea3f5b2170298461e68" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "prost 0.10.4", ] @@ -5035,9 +5018,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.9.5" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "697061221ea1b4a94a624f67d0ae2bfe4e22b8a17b6a192afb11046542cc8c47" +checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" dependencies = [ "aho-corasick", "memchr", @@ -5047,9 +5030,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.3.8" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f401f4955220693b56f8ec66ee9c78abffd8d1c4f23dc41a23839eb88f0795" +checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" dependencies = [ "aho-corasick", "memchr", @@ -5058,9 +5041,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.7.5" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbb5fb1acd8a1a18b3dd5be62d25485eb770e05afb408a9627d14d451bae12da" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "remove_dir_all" @@ -5082,16 +5065,16 @@ dependencies = [ [[package]] name = "reqwest" -version = "0.11.20" +version = "0.11.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e9ad3fe7488d7e34558a2033d45a0c90b72d97b4f80705666fea71472e2e6a1" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ - "base64 0.21.4", - "bytes 1.5.0", + "base64 0.21.3", + "bytes 1.4.0", "encoding_rs", "futures-core", "futures-util", - "h2 0.3.21", + "h2 0.3.20", "http", "http-body 0.4.5", "hyper 0.14.27", @@ -5104,7 +5087,7 @@ dependencies = [ "native-tls", "once_cell", "percent-encoding", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "rustls", "rustls-pemfile", "serde", @@ -5114,13 +5097,13 @@ dependencies = [ "tokio-native-tls", "tokio-rustls", "tower-service", - "trust-dns-resolver", + "trust-dns-resolver 0.22.0", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", "webpki-roots", - "winreg", + "winreg 0.10.1", ] [[package]] @@ -5193,7 +5176,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "rustc-hex", ] @@ -5238,7 +5221,7 @@ checksum = "a4c4216490d5a413bc6d10fa4742bd7d4955941d062c0ef873141d6b0e7b30fd" dependencies = [ "arrayvec 0.7.4", "borsh", - "bytes 1.5.0", + "bytes 1.4.0", "num-traits", "rand 0.8.5", "rkyv", @@ -5278,12 +5261,12 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.13" +version = "0.38.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7db8590df6dfcd144d22afd1b83b36c21a18d7cbc1dc4bb5295a8712e9eb662" +checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" dependencies = [ "bitflags 2.4.0", - "errno 0.3.3", + "errno 0.3.2", "libc", "linux-raw-sys", "windows-sys 0.48.0", @@ -5291,9 +5274,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.7" +version = "0.21.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" +checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" dependencies = [ "log", "ring", @@ -5307,14 +5290,14 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ - "base64 0.21.4", + "base64 0.21.3", ] [[package]] name = "rustls-webpki" -version = "0.101.5" +version = "0.101.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45a27e3b59326c16e23d30aeb7a36a24cc0d29e71d68ff611cdfb4a01d013bed" +checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" dependencies = [ "ring", "untrusted", @@ -5440,9 +5423,9 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.13" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "763f8cd0d4c71ed8389c90cb8100cba87e763bd01a8e614d4f0af97bcd50a161" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" dependencies = [ "chrono", "dyn-clone", @@ -5455,9 +5438,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.13" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0f696e21e10fa546b7ffb1c9672c6de8fbc7a81acf59524386d8639bf12737" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" dependencies = [ "proc-macro2", "quote", @@ -5644,9 +5627,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.188" +version = "1.0.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c" dependencies = [ "serde_derive", ] @@ -5662,13 +5645,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.188" +version = "1.0.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.29", ] [[package]] @@ -5684,9 +5667,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.106" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2cc66a619ed80bf7a0f6b17dd063a84b88f6dea1813737cf469aef1d081142c2" +checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" dependencies = [ "itoa 1.0.9", "ryu", @@ -5768,7 +5751,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92761393ee4dc3ff8f4af487bd58f4307c9329bbedea02cac0089ad9c411e153" dependencies = [ - "dashmap 5.5.3", + "dashmap 5.5.0", "futures 0.3.28", "lazy_static", "log", @@ -5782,7 +5765,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "538c30747ae860d6fb88330addbbd3e0ddbe46d662d032855596d8a8ca260611" dependencies = [ - "dashmap 5.5.3", + "dashmap 5.5.0", "futures 0.3.28", "lazy_static", "log", @@ -5796,7 +5779,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e56dd856803e253c8f298af3f4d7eb0ae5e23a737252cd90bb4f3b435033b2d" dependencies = [ - "dashmap 5.5.3", + "dashmap 5.5.0", "futures 0.3.28", "lazy_static", "log", @@ -5845,7 +5828,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.29", ] [[package]] @@ -5977,9 +5960,9 @@ checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" [[package]] name = "shlex" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" +checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" [[package]] name = "signal-hook" @@ -6045,9 +6028,9 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.9" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" dependencies = [ "autocfg", ] @@ -6091,9 +6074,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.4" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" dependencies = [ "libc", "windows-sys 0.48.0", @@ -6106,7 +6089,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" dependencies = [ "base64 0.13.1", - "bytes 1.5.0", + "bytes 1.4.0", "futures 0.3.28", "httparse", "log", @@ -6141,11 +6124,11 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7b278788e7be4d0d29c0f39497a0eef3fba6bbc8e70d8bf7fde46edeaa9e85" +checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e" dependencies = [ - "itertools 0.11.0", + "itertools 0.10.5", "nom 7.1.3", "unicode_categories", ] @@ -6172,7 +6155,7 @@ dependencies = [ "ahash 0.8.3", "atoi", "byteorder", - "bytes 1.5.0", + "bytes 1.4.0", "chrono", "crc", "crossbeam-queue 0.3.8", @@ -6250,10 +6233,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca69bf415b93b60b80dc8fda3cb4ef52b2336614d8da2de5456cc942a110482" dependencies = [ "atoi", - "base64 0.21.4", + "base64 0.21.3", "bitflags 2.4.0", "byteorder", - "bytes 1.5.0", + "bytes 1.4.0", "chrono", "crc", "digest 0.10.7", @@ -6293,7 +6276,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a0db2df1b8731c3651e204629dd55e52adbae0462fa1bdcbed56a2302c18181e" dependencies = [ "atoi", - "base64 0.21.4", + "base64 0.21.3", "bitflags 2.4.0", "byteorder", "chrono", @@ -6363,11 +6346,10 @@ checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" [[package]] name = "stringprep" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" +checksum = "db3737bde7edce97102e0e2b15365bf7a20bfdb5f60f4f9e8d7004258a51a8da" dependencies = [ - "finl_unicode", "unicode-bidi", "unicode-normalization", ] @@ -6458,9 +6440,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.32" +version = "2.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "239814284fd6f1a4ffe4ca893952cdd93c224b6a1571c9a9eadd670295c0c9e2" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" dependencies = [ "proc-macro2", "quote", @@ -6518,9 +6500,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.8.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +checksum = "dc02fddf48964c42031a0b3fe0428320ecf3a73c401040fc0096f97794310651" dependencies = [ "cfg-if 1.0.0", "fastrand", @@ -6642,22 +6624,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.48" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d6d7a740b8a666a7e828dd00da9c0dc290dff53154ea77ac109281de90589b7" +checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.48" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49922ecae66cc8a249b77e68d1d0623c1b2c514f0060c27cdc68bd62a1219d35" +checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.29", ] [[package]] @@ -6737,14 +6719,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" dependencies = [ "backtrace", - "bytes 1.5.0", + "bytes 1.4.0", "libc", "mio 0.8.8", "num_cpus", "parking_lot 0.12.1", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "signal-hook-registry", - "socket2 0.5.4", + "socket2 0.5.3", "tokio-macros", "windows-sys 0.48.0", ] @@ -6767,7 +6749,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.29", ] [[package]] @@ -6818,7 +6800,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" dependencies = [ "futures-core", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "tokio 1.32.0", "tokio-util 0.7.8", ] @@ -6858,13 +6840,13 @@ version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "futures-core", "futures-io", "futures-sink", "futures-util", "hashbrown 0.12.3", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "tokio 1.32.0", "tracing", ] @@ -6886,9 +6868,9 @@ checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" [[package]] name = "toml_edit" -version = "0.19.15" +version = "0.19.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" dependencies = [ "indexmap 2.0.0", "toml_datetime", @@ -6909,7 +6891,7 @@ checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if 1.0.0", "log", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "tracing-attributes", "tracing-core", ] @@ -6922,7 +6904,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.29", ] [[package]] @@ -6944,6 +6926,31 @@ dependencies = [ "tracing", ] +[[package]] +name = "trust-dns-proto" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c31f240f59877c3d4bb3b3ea0ec5a6a0cff07323580ff8c7a605cd7d08b255d" +dependencies = [ + "async-trait", + "cfg-if 1.0.0", + "data-encoding", + "enum-as-inner 0.4.0", + "futures-channel", + "futures-io", + "futures-util", + "idna 0.2.3", + "ipnet", + "lazy_static", + "log", + "rand 0.8.5", + "smallvec", + "thiserror", + "tinyvec", + "tokio 1.32.0", + "url", +] + [[package]] name = "trust-dns-proto" version = "0.22.0" @@ -6953,7 +6960,7 @@ dependencies = [ "async-trait", "cfg-if 1.0.0", "data-encoding", - "enum-as-inner", + "enum-as-inner 0.5.1", "futures-channel", "futures-io", "futures-util", @@ -6969,6 +6976,27 @@ dependencies = [ "url", ] +[[package]] +name = "trust-dns-resolver" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4ba72c2ea84515690c9fcef4c6c660bb9df3036ed1051686de84605b74fd558" +dependencies = [ + "cfg-if 1.0.0", + "futures-util", + "ipconfig", + "lazy_static", + "log", + "lru-cache", + "parking_lot 0.12.1", + "resolv-conf", + "smallvec", + "thiserror", + "tokio 1.32.0", + "tokio-openssl", + "trust-dns-proto 0.21.2", +] + [[package]] name = "trust-dns-resolver" version = "0.22.0" @@ -6985,9 +7013,8 @@ dependencies = [ "smallvec", "thiserror", "tokio 1.32.0", - "tokio-openssl", "tracing", - "trust-dns-proto", + "trust-dns-proto 0.22.0", ] [[package]] @@ -7033,9 +7060,9 @@ dependencies = [ [[package]] name = "unicase" -version = "2.7.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" dependencies = [ "version_check", ] @@ -7093,9 +7120,9 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.4.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna 0.4.0", @@ -7155,7 +7182,7 @@ checksum = "e7141e445af09c8919f1d5f8a20dae0b20c3b57a45dee0d5823c6ed5d237f15a" dependencies = [ "bitflags 1.3.2", "chrono", - "rustc_version 0.4.0", + "rustc_version 0.2.3", ] [[package]] @@ -7196,9 +7223,9 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.4.0" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" dependencies = [ "same-file", "winapi-util", @@ -7252,7 +7279,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.29", "wasm-bindgen-shared", ] @@ -7286,7 +7313,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.29", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7314,8 +7341,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5388522c899d1e1c96a4c307e3797e0f697ba7c77dd8e0e625ecba9dd0342937" dependencies = [ "arrayvec 0.7.4", - "base64 0.21.4", - "bytes 1.5.0", + "base64 0.21.3", + "bytes 1.4.0", "derive_more", "ethabi", "ethereum-types 0.14.1", @@ -7354,22 +7381,34 @@ dependencies = [ "url", ] +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "webpki-roots" -version = "0.25.2" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" +checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +dependencies = [ + "webpki", +] [[package]] name = "which" -version = "4.4.2" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" dependencies = [ "either", - "home", + "libc", "once_cell", - "rustix", ] [[package]] @@ -7433,7 +7472,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-targets 0.48.5", + "windows-targets 0.48.4", ] [[package]] @@ -7451,7 +7490,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.5", + "windows-targets 0.48.4", ] [[package]] @@ -7471,17 +7510,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.5" +version = "0.48.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "d92ecb8ae0317859f509f17b19adc74b0763b0fa3b085dea8ed01085c8dac222" dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows_aarch64_gnullvm 0.48.4", + "windows_aarch64_msvc 0.48.4", + "windows_i686_gnu 0.48.4", + "windows_i686_msvc 0.48.4", + "windows_x86_64_gnu 0.48.4", + "windows_x86_64_gnullvm 0.48.4", + "windows_x86_64_msvc 0.48.4", ] [[package]] @@ -7492,9 +7531,9 @@ checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.5" +version = "0.48.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "d14b0ee96970be7108701212f097ce67ca772fd84cb0ffbc86d26a94e77ba929" [[package]] name = "windows_aarch64_msvc" @@ -7504,9 +7543,9 @@ checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.48.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "1332277d49f440c8fc6014941e320ee47ededfcce10cb272728470f56cc092c9" [[package]] name = "windows_i686_gnu" @@ -7516,9 +7555,9 @@ checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.48.5" +version = "0.48.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "d992130ac399d56f02c20564e9975ac5ba08cb25cb832849bbc0d736a101abe5" [[package]] name = "windows_i686_msvc" @@ -7528,9 +7567,9 @@ checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" -version = "0.48.5" +version = "0.48.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "962e96d0fa4b4773c63977977ea6564f463fb10e34a6e07360428b53ae7a3f71" [[package]] name = "windows_x86_64_gnu" @@ -7540,9 +7579,9 @@ checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.48.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "30652a53018a48a9735fbc2986ff0446c37bc8bed0d3f98a0ed4d04cdb80027e" [[package]] name = "windows_x86_64_gnullvm" @@ -7552,9 +7591,9 @@ checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.5" +version = "0.48.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "b5bb3f0331abfe1a95af56067f1e64b3791b55b5373b03869560b6025de809bf" [[package]] name = "windows_x86_64_msvc" @@ -7564,19 +7603,28 @@ checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.48.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "bd1df36d9fd0bbe4849461de9b969f765170f4e0f90497d580a235d515722b10" [[package]] name = "winnow" -version = "0.5.15" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c2e3184b9c4e92ad5167ca73039d0c42476302ab603e2fec4487511f38ccefc" +checksum = "d09770118a7eb1ccaf4a594a221334119a44a814fcb0d31c5b85e83e97227a97" dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "winreg" version = "0.50.0" @@ -7693,7 +7741,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml 0.9.25", - "shlex 1.2.0", + "shlex 1.1.0", "tempdir", "thiserror", "ya-client-model", @@ -7706,7 +7754,7 @@ source = "git+https://github.com/golemfactory/ya-client.git?rev=20590d867dff7bb0 dependencies = [ "actix-codec", "awc", - "bytes 1.5.0", + "bytes 1.4.0", "chrono", "envy", "futures 0.3.28", @@ -7829,18 +7877,14 @@ dependencies = [ "maplit", "num-bigint 0.3.3", "num-traits", - "rand 0.8.5", "rlp", "serde", "serde_json", "sha3 0.8.2", "structopt", - "test-case 3.1.0", "thiserror", "tiny-keccak", "tokio 1.32.0", - "trust-dns-resolver", - "url", "uuid 0.8.2", "web3", "ya-client-model", @@ -7903,7 +7947,7 @@ dependencies = [ "actix-web", "anyhow", "async-trait", - "bytes 1.5.0", + "bytes 1.4.0", "chrono", "derivative", "derive_more", @@ -7994,8 +8038,8 @@ dependencies = [ "actix-web-actors", "anyhow", "awc", - "base64 0.21.4", - "bytes 1.5.0", + "base64 0.21.3", + "bytes 1.4.0", "ctor", "env_logger 0.10.0", "flexbuffers", @@ -8076,7 +8120,7 @@ name = "ya-manifest-utils" version = "0.2.0" dependencies = [ "anyhow", - "base64 0.21.4", + "base64 0.21.3", "chrono", "golem-certificate", "hex", @@ -8092,7 +8136,7 @@ dependencies = [ "serde_json", "serde_yaml 0.9.25", "serial_test 2.0.0", - "shlex 1.2.0", + "shlex 1.1.0", "snailquote", "structopt", "strum", @@ -8210,7 +8254,7 @@ dependencies = [ "actix", "actix-web", "anyhow", - "bytes 1.5.0", + "bytes 1.4.0", "chrono", "env_logger 0.7.1", "ethsign", @@ -8410,7 +8454,7 @@ dependencies = [ "serde_json", "serial_test 0.9.0", "shared_child", - "shlex 1.2.0", + "shlex 1.1.0", "signal-hook", "structopt", "strum", @@ -8501,7 +8545,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d0d9cf0deab658d8efc643fec135e1aa37856aa6a68ee6387e039f568a7dc27" dependencies = [ "anyhow", - "bytes 1.5.0", + "bytes 1.4.0", "derive_more", "futures 0.3.28", "prost 0.10.4", @@ -8539,7 +8583,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "306a73f6ce2286987c9da25bc0c2ef81f4f0b2b58bb8d9aeedc34d27407603ff" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "derive_more", ] @@ -8548,7 +8592,7 @@ name = "ya-runtime-api" version = "0.7.0" dependencies = [ "anyhow", - "bytes 1.5.0", + "bytes 1.4.0", "env_logger 0.7.1", "futures 0.3.28", "log", @@ -8566,7 +8610,7 @@ name = "ya-sb-proto" version = "0.6.1" source = "git+https://github.com/golemfactory/ya-service-bus.git?rev=190f0d772f7ed0830d54a2cef77d7a177f276c68#190f0d772f7ed0830d54a2cef77d7a177f276c68" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "prost 0.10.4", "prost-build 0.7.0", "thiserror", @@ -8767,13 +8811,13 @@ dependencies = [ "anyhow", "async-compression", "awc", - "bytes 1.5.0", + "bytes 1.4.0", "crossterm 0.26.1", "env_logger 0.7.1", "futures 0.3.28", "gftp", "globset", - "h2 0.3.21", + "h2 0.3.20", "hex", "lazy_static", "log", @@ -8842,7 +8886,7 @@ dependencies = [ "log", "regex", "thiserror", - "trust-dns-resolver", + "trust-dns-resolver 0.21.2", "url", "ya-relay-stack", ] @@ -8914,7 +8958,7 @@ dependencies = [ "actix-web", "actix-web-actors", "anyhow", - "bytes 1.5.0", + "bytes 1.4.0", "env_logger 0.7.1", "futures 0.3.28", "hex", @@ -9039,7 +9083,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.32", + "syn 2.0.29", ] [[package]] From db7329bf0e6e29db2e04d5d18fb51c37d643f8de Mon Sep 17 00:00:00 2001 From: scx1332 Date: Tue, 12 Sep 2023 13:51:13 +0200 Subject: [PATCH 043/123] Update lock --- Cargo.lock | 71 +++++++----------------------------------------------- 1 file changed, 9 insertions(+), 62 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d6b19545ad..f3b1198ee6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1805,18 +1805,6 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c34f04666d835ff5d62e058c3995147c06f42fe86ff053337632bca83e42702d" -[[package]] -name = "enum-as-inner" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "21cdad81446a7f7dc43f6a77409efeb9733d2fa65553efef6018ef257c959b73" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "enum-as-inner" version = "0.5.1" @@ -5097,7 +5085,7 @@ dependencies = [ "tokio-native-tls", "tokio-rustls", "tower-service", - "trust-dns-resolver 0.22.0", + "trust-dns-resolver", "url", "wasm-bindgen", "wasm-bindgen-futures", @@ -6926,31 +6914,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "trust-dns-proto" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c31f240f59877c3d4bb3b3ea0ec5a6a0cff07323580ff8c7a605cd7d08b255d" -dependencies = [ - "async-trait", - "cfg-if 1.0.0", - "data-encoding", - "enum-as-inner 0.4.0", - "futures-channel", - "futures-io", - "futures-util", - "idna 0.2.3", - "ipnet", - "lazy_static", - "log", - "rand 0.8.5", - "smallvec", - "thiserror", - "tinyvec", - "tokio 1.32.0", - "url", -] - [[package]] name = "trust-dns-proto" version = "0.22.0" @@ -6960,7 +6923,7 @@ dependencies = [ "async-trait", "cfg-if 1.0.0", "data-encoding", - "enum-as-inner 0.5.1", + "enum-as-inner", "futures-channel", "futures-io", "futures-util", @@ -6976,27 +6939,6 @@ dependencies = [ "url", ] -[[package]] -name = "trust-dns-resolver" -version = "0.21.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4ba72c2ea84515690c9fcef4c6c660bb9df3036ed1051686de84605b74fd558" -dependencies = [ - "cfg-if 1.0.0", - "futures-util", - "ipconfig", - "lazy_static", - "log", - "lru-cache", - "parking_lot 0.12.1", - "resolv-conf", - "smallvec", - "thiserror", - "tokio 1.32.0", - "tokio-openssl", - "trust-dns-proto 0.21.2", -] - [[package]] name = "trust-dns-resolver" version = "0.22.0" @@ -7013,8 +6955,9 @@ dependencies = [ "smallvec", "thiserror", "tokio 1.32.0", + "tokio-openssl", "tracing", - "trust-dns-proto 0.22.0", + "trust-dns-proto", ] [[package]] @@ -7877,14 +7820,18 @@ dependencies = [ "maplit", "num-bigint 0.3.3", "num-traits", + "rand 0.8.5", "rlp", "serde", "serde_json", "sha3 0.8.2", "structopt", + "test-case 3.1.0", "thiserror", "tiny-keccak", "tokio 1.32.0", + "trust-dns-resolver", + "url", "uuid 0.8.2", "web3", "ya-client-model", @@ -8886,7 +8833,7 @@ dependencies = [ "log", "regex", "thiserror", - "trust-dns-resolver 0.21.2", + "trust-dns-resolver", "url", "ya-relay-stack", ] From 3d9a2e8bf6266788b54d2596a4343c279e283461 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Tue, 12 Sep 2023 13:54:31 +0200 Subject: [PATCH 044/123] fix --- .github/workflows/binaries-x86-64.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/binaries-x86-64.yml b/.github/workflows/binaries-x86-64.yml index c0d633dc35..9ad6423708 100644 --- a/.github/workflows/binaries-x86-64.yml +++ b/.github/workflows/binaries-x86-64.yml @@ -20,7 +20,7 @@ jobs: name: Build binaries (x86-64) env: # `-D warnings` means any warnings emitted will cause build to fail - RUSTFLAGS: "-D warnings -C opt-level=z -C target-cpu=x86-64 -C debuginfo=1" + RUSTFLAGS: "-C opt-level=z -C target-cpu=x86-64 -C debuginfo=1" X86_64_PC_WINDOWS_MSVC_OPENSSL_DIR: c:/vcpkg/installed/x64-windows runs-on: ${{ matrix.os }} strategy: From f7377721aa05e08691922792256f4903f668f036 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Tue, 12 Sep 2023 14:48:49 +0200 Subject: [PATCH 045/123] save-if true --- .github/workflows/binaries-x86-64.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/binaries-x86-64.yml b/.github/workflows/binaries-x86-64.yml index 9ad6423708..c14f3d45e2 100644 --- a/.github/workflows/binaries-x86-64.yml +++ b/.github/workflows/binaries-x86-64.yml @@ -52,7 +52,6 @@ jobs: uses: Swatinem/rust-cache@v2 with: shared-key: "payment-dev-x86-64" - save-if: ${{ github.ref == 'refs/heads/payments-dev' }} - name: Check lockfile From 11e9b09f1299a8897f441df66d891c30ad64fcd8 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Tue, 12 Sep 2023 15:17:37 +0200 Subject: [PATCH 046/123] More jobs for building binaries --- .github/workflows/binaries-x86-64.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/binaries-x86-64.yml b/.github/workflows/binaries-x86-64.yml index c14f3d45e2..f16c58f360 100644 --- a/.github/workflows/binaries-x86-64.yml +++ b/.github/workflows/binaries-x86-64.yml @@ -69,7 +69,7 @@ jobs: - name: Build binaries run: | - cargo build --features static-openssl --target x86_64-unknown-linux-musl -p yagna -p ya-exe-unit -p gftp -p golemsp -p ya-provider + cargo build --jobs 8 --features static-openssl --target x86_64-unknown-linux-musl -p yagna -p ya-exe-unit -p gftp -p golemsp -p ya-provider - name: Copy binaries shell: bash From 7231ca0b04f415b9db364e85492e7f7b902d5d74 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Tue, 12 Sep 2023 15:32:09 +0200 Subject: [PATCH 047/123] Build yagna only --- .github/workflows/binaries-x86-64.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/binaries-x86-64.yml b/.github/workflows/binaries-x86-64.yml index f16c58f360..346dae02c1 100644 --- a/.github/workflows/binaries-x86-64.yml +++ b/.github/workflows/binaries-x86-64.yml @@ -69,7 +69,7 @@ jobs: - name: Build binaries run: | - cargo build --jobs 8 --features static-openssl --target x86_64-unknown-linux-musl -p yagna -p ya-exe-unit -p gftp -p golemsp -p ya-provider + cargo build --features static-openssl --target x86_64-unknown-linux-musl -p yagna - name: Copy binaries shell: bash From 6afb87a66ed9df882841b7f50690877a6e3a8d4f Mon Sep 17 00:00:00 2001 From: scx1332 Date: Tue, 12 Sep 2023 15:58:01 +0200 Subject: [PATCH 048/123] Separated yagna and binaries build --- .github/workflows/binaries-x86-64.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/binaries-x86-64.yml b/.github/workflows/binaries-x86-64.yml index 346dae02c1..2f623d5a37 100644 --- a/.github/workflows/binaries-x86-64.yml +++ b/.github/workflows/binaries-x86-64.yml @@ -70,6 +70,7 @@ jobs: - name: Build binaries run: | cargo build --features static-openssl --target x86_64-unknown-linux-musl -p yagna + cargo build --features static-openssl --target x86_64-unknown-linux-musl -p ya-exe-unit -p gftp -p golemsp -p ya-provider - name: Copy binaries shell: bash From c66e7a8cea7750be3f3b10067bc624c846465f89 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Tue, 12 Sep 2023 16:09:06 +0200 Subject: [PATCH 049/123] Fix derive more in different versions which can cause unnecessary rebuilds --- Cargo.toml | 1 + agent/provider/Cargo.toml | 2 +- core/market/Cargo.toml | 2 +- core/model/Cargo.toml | 2 +- core/payment-driver/erc20/Cargo.toml | 6 +++--- core/payment-driver/erc20next/Cargo.toml | 2 +- exe-unit/Cargo.toml | 2 +- utils/process/Cargo.toml | 2 +- 8 files changed, 10 insertions(+), 9 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 8a968797e0..57d7b9536f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -41,6 +41,7 @@ erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rand = "0.8.5" url = "2.3.1" trust-dns-resolver = "0.22" +derive_more = "0.99.11" [dependencies] ya-activity = "0.4" diff --git a/agent/provider/Cargo.toml b/agent/provider/Cargo.toml index 4f7b803e07..a4bfbc7fc8 100644 --- a/agent/provider/Cargo.toml +++ b/agent/provider/Cargo.toml @@ -35,7 +35,7 @@ backoff = "0.2.1" bigdecimal = "0.2" bytesize = "1.0.1" chrono = { version = "0.4", features = ["serde"] } -derive_more = "0.99.5" +derive_more = { workspace = true } dialoguer = "0.5.0" directories = "2.0.2" dotenv = "0.15.0" diff --git a/core/market/Cargo.toml b/core/market/Cargo.toml index ee9489541f..6b83f870d2 100644 --- a/core/market/Cargo.toml +++ b/core/market/Cargo.toml @@ -33,7 +33,7 @@ anyhow = "1.0" async-trait = { version = "0.1.33" } backtrace = "0.3.50" chrono = { version = "0.4", features = ["serde"] } -derive_more = "0.99.5" +derive_more = { workspace = true } diesel = { version = "1.4", features = ["chrono", "sqlite", "r2d2"] } diesel_migrations = "1.4" digest = "0.8.1" diff --git a/core/model/Cargo.toml b/core/model/Cargo.toml index 22b6380a29..8d6f99ad92 100644 --- a/core/model/Cargo.toml +++ b/core/model/Cargo.toml @@ -41,7 +41,7 @@ ya-service-bus = "0.6.1" bigdecimal = { version = "0.2", features = ["serde"], optional = true } bitflags = { version = "1.2", optional = true } chrono = { version = "0.4", features = ["serde"] } -derive_more = "0.99.11" +derive_more = { workspace = true } graphene-sgx = { version = "0.3.3", optional = true } log = "0.4" serde = { version = "1.0", features = ["derive"] } diff --git a/core/payment-driver/erc20/Cargo.toml b/core/payment-driver/erc20/Cargo.toml index a940f53dfc..d09426c122 100644 --- a/core/payment-driver/erc20/Cargo.toml +++ b/core/payment-driver/erc20/Cargo.toml @@ -14,7 +14,7 @@ anyhow = "1.0" awc = { version = "3", features = ["openssl"] } bigdecimal = { version = "0.2" } chrono = { version = "0.4", features = ["serde"] } -derive_more = "0.99" +derive_more = { workspace = true } ethabi = "18.0" ethereum-types = "0.14.1" ethereum-tx-sign = "3.1" @@ -39,8 +39,8 @@ web3 = { version = "0.19.0", default-features = false, features = [ "ws-tls-tokio", ] } rand = { workspace = true } -url = { workspace=true } -trust-dns-resolver = { workspace=true, default-features = false } +url = { workspace = true } +trust-dns-resolver = { workspace = true, default-features = false } ## yagna dependencies ya-payment-driver = "0.3" ya-client-model = "0.5" diff --git a/core/payment-driver/erc20next/Cargo.toml b/core/payment-driver/erc20next/Cargo.toml index 918cca5b4c..6d0e4c5e5a 100644 --- a/core/payment-driver/erc20next/Cargo.toml +++ b/core/payment-driver/erc20next/Cargo.toml @@ -14,7 +14,7 @@ awc = { version = "3", features = ["openssl"] } bigdecimal = { version = "0.2" } ethsign = "0.8" chrono = { version = "0.4", features = ["serde"] } -derive_more = "0.99" +derive_more = { workspace = true } ethabi = "18.0" ethereum-types = "0.14.1" ethereum-tx-sign = "3.1" diff --git a/exe-unit/Cargo.toml b/exe-unit/Cargo.toml index 963112064f..d968069def 100644 --- a/exe-unit/Cargo.toml +++ b/exe-unit/Cargo.toml @@ -61,7 +61,7 @@ async-trait = "0.1.24" bytes = "1" chrono = "0.4" derivative = "2.1" -derive_more = "0.99" +derive_more = { workspace = true } dotenv = "0.15.0" flexi_logger = { version = "0.22", features = ["colors"] } futures = "0.3" diff --git a/utils/process/Cargo.toml b/utils/process/Cargo.toml index 37aa85d4bd..1d6ac4d5d8 100644 --- a/utils/process/Cargo.toml +++ b/utils/process/Cargo.toml @@ -16,7 +16,7 @@ lock = ["fs2"] [dependencies] actix = { version = "0.13", default-features = false } anyhow = "1.0" -derive_more = "0.99.5" +derive_more = { workspace = true } futures = "0.3" futures-util = "0.3.4" libc = "0.2" From 8fc2064773e1dc45733d7f964e1825a9b1951e32 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Tue, 12 Sep 2023 18:03:59 +0200 Subject: [PATCH 050/123] no clippy lints --- .github/workflows/unit-test.yml | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 0b1419c262..37ccb8ec19 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -46,18 +46,6 @@ jobs: command: tree args: --locked - - name: Check formatting - uses: actions-rs/cargo@v1 - with: - command: fmt - args: --all -- --check - - - name: Check clippy lints - uses: actions-rs/cargo@v1 - with: - command: clippy - args: --all-targets --all-features --workspace -- -D warnings - - name: Install openssl ( Windows only ) if: runner.os == 'Windows' run: | From d68fb7822a1d0a3018fcb90bda8710ddd9bea34f Mon Sep 17 00:00:00 2001 From: scx1332 Date: Tue, 12 Sep 2023 18:15:11 +0200 Subject: [PATCH 051/123] fix --- .github/workflows/unit-test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/unit-test.yml b/.github/workflows/unit-test.yml index 37ccb8ec19..caac51f26c 100644 --- a/.github/workflows/unit-test.yml +++ b/.github/workflows/unit-test.yml @@ -18,7 +18,7 @@ jobs: name: Unit Tests env: # `-D warnings` means any warnings emitted will cause build to fail - RUSTFLAGS: "-D warnings -C opt-level=z -C target-cpu=x86-64 -C debuginfo=1" + RUSTFLAGS: "-C opt-level=z -C target-cpu=x86-64 -C debuginfo=1" X86_64_PC_WINDOWS_MSVC_OPENSSL_DIR: c:/vcpkg/installed/x64-windows runs-on: ${{ matrix.os }} strategy: From 6ec4583d697788fbaaca161dc53c5c3484f102e6 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Wed, 13 Sep 2023 12:17:10 +0200 Subject: [PATCH 052/123] Update payment library to latest version --- Cargo.lock | 3 +-- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index f3b1198ee6..0fb4bf0f7c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1870,7 +1870,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.1.9" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=9b6d23a5d8844f26a98abed5f2d85b7a96d8cbb2#9b6d23a5d8844f26a98abed5f2d85b7a96d8cbb2" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=ee0798b0073f0de9f291ff1b751fa8a996aa63ac#ee0798b0073f0de9f291ff1b751fa8a996aa63ac" dependencies = [ "actix-files", "actix-web", @@ -1883,7 +1883,6 @@ dependencies = [ "humantime 2.1.0", "lazy_static", "log", - "percent-encoding", "rand 0.8.5", "rust_decimal", "rustc-hex", diff --git a/Cargo.toml b/Cargo.toml index 57d7b9536f..51ec442a46 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,7 +36,7 @@ path = "core/serv/src/main.rs" # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } # erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "9b6d23a5d8844f26a98abed5f2d85b7a96d8cbb2" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "ee0798b0073f0de9f291ff1b751fa8a996aa63ac" } #erc20_payment_lib = { version = "=0.1.9" } rand = "0.8.5" url = "2.3.1" From 597324a1387e94de3804998ba96d1a5303ac3d50 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Wed, 13 Sep 2023 13:06:01 +0200 Subject: [PATCH 053/123] Investigating confirm_payments --- core/payment-driver/erc20next/src/driver.rs | 26 +++++++++++---------- 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index 4665900705..897d908cda 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -328,8 +328,21 @@ impl PaymentDriver for Erc20NextDriver { #[async_trait(?Send)] impl PaymentDriverCron for Erc20NextDriver { + fn sendout_interval(&self) -> std::time::Duration { + *TX_SENDOUT_INTERVAL + } + + fn confirmation_interval(&self) -> std::time::Duration { + *TX_CONFIRMATION_INTERVAL + } + + async fn send_out_payments(&self) { + // no-op, handled by erc20_payment_lib internally + } + async fn confirm_payments(&self) { let mut events = self.events.lock().await; + log::info!("Job confirm_payments started"); while let Ok(event) = events.try_recv() { if let DriverEventContent::TransferFinished(tx) = event.content { log::info!("Received event TransferFinished: {:#?}", tx); @@ -386,17 +399,6 @@ impl PaymentDriverCron for Erc20NextDriver { .ok(); } } - } - - async fn send_out_payments(&self) { - // no-op, handled by erc20_payment_lib internally - } - - fn sendout_interval(&self) -> std::time::Duration { - *TX_SENDOUT_INTERVAL - } - - fn confirmation_interval(&self) -> std::time::Duration { - *TX_CONFIRMATION_INTERVAL + log::info!("Job confirm_payments finished"); } } From 2a234100602025c2b08765dd79df625ca9c2f98d Mon Sep 17 00:00:00 2001 From: scx1332 Date: Wed, 13 Sep 2023 19:38:44 +0200 Subject: [PATCH 054/123] Payment confirmation should be sent properly now --- Cargo.lock | 2 +- Cargo.toml | 2 +- core/payment-driver/erc20/src/driver.rs | 40 ++--- .../erc20/src/erc20/ethereum.rs | 4 +- core/payment-driver/erc20next/src/driver.rs | 162 ++++++++++++------ core/payment-driver/erc20next/src/service.rs | 9 +- core/payment/src/processor.rs | 4 +- 7 files changed, 141 insertions(+), 82 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 79dac50fcd..4a62f3f3d1 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1869,7 +1869,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.1.9" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=ee0798b0073f0de9f291ff1b751fa8a996aa63ac#ee0798b0073f0de9f291ff1b751fa8a996aa63ac" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=bd3b7399dc54e0382c216a168266376deef7ad56#bd3b7399dc54e0382c216a168266376deef7ad56" dependencies = [ "actix-files", "actix-web", diff --git a/Cargo.toml b/Cargo.toml index 7c489cdf49..f60a970a30 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ path = "core/serv/src/main.rs" # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "ee0798b0073f0de9f291ff1b751fa8a996aa63ac" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "bd3b7399dc54e0382c216a168266376deef7ad56" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.1.9" } rand = "0.8.5" diff --git a/core/payment-driver/erc20/src/driver.rs b/core/payment-driver/erc20/src/driver.rs index 43c01c4804..8c92c6e8ab 100644 --- a/core/payment-driver/erc20/src/driver.rs +++ b/core/payment-driver/erc20/src/driver.rs @@ -228,20 +228,12 @@ impl PaymentDriver for Erc20Driver { #[async_trait(?Send)] impl PaymentDriverCron for Erc20Driver { - async fn confirm_payments(&self) { - let guard = match self.confirmation_lock.try_lock() { - None => { - log::trace!("ERC-20 confirmation job in progress."); - return; - } - Some(guard) => guard, - }; - log::trace!("Running ERC-20 confirmation job..."); - for network_key in self.get_networks().keys() { - cron::confirm_payments(&self.dao, &self.get_name(), network_key).await; - } - log::trace!("ERC-20 confirmation job complete."); - drop(guard); // Explicit drop to tell Rust that guard is not unused variable + fn sendout_interval(&self) -> std::time::Duration { + *TX_SENDOUT_INTERVAL + } + + fn confirmation_interval(&self) -> std::time::Duration { + *TX_CONFIRMATION_INTERVAL } async fn send_out_payments(&self) { @@ -278,11 +270,19 @@ impl PaymentDriverCron for Erc20Driver { drop(guard); // Explicit drop to tell Rust that guard is not unused variable } - fn sendout_interval(&self) -> std::time::Duration { - *TX_SENDOUT_INTERVAL - } - - fn confirmation_interval(&self) -> std::time::Duration { - *TX_CONFIRMATION_INTERVAL + async fn confirm_payments(&self) { + let guard = match self.confirmation_lock.try_lock() { + None => { + log::trace!("ERC-20 confirmation job in progress."); + return; + } + Some(guard) => guard, + }; + log::trace!("Running ERC-20 confirmation job..."); + for network_key in self.get_networks().keys() { + cron::confirm_payments(&self.dao, &self.get_name(), network_key).await; + } + log::trace!("ERC-20 confirmation job complete."); + drop(guard); // Explicit drop to tell Rust that guard is not unused variable } } diff --git a/core/payment-driver/erc20/src/erc20/ethereum.rs b/core/payment-driver/erc20/src/erc20/ethereum.rs index ab7c7d36ed..cf9603cb28 100644 --- a/core/payment-driver/erc20/src/erc20/ethereum.rs +++ b/core/payment-driver/erc20/src/erc20/ethereum.rs @@ -534,7 +534,7 @@ async fn get_tx_receipt_with( .await .map_err(Into::into) } - +/* fn get_rpc_addr_from_env(network: Network) -> Vec { match network { Network::Mainnet => { @@ -598,7 +598,7 @@ async fn get_clients(network: Network) -> Result>, GenericError> Ok(clients) } - +*/ fn get_env(network: Network) -> config::EnvConfiguration { match network { Network::Mainnet => *config::MAINNET_CONFIG, diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index 897d908cda..c5b9b1ed22 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -4,8 +4,10 @@ Please limit the logic in this file, use local mods to handle the calls. */ // Extrnal crates +use erc20_payment_lib::db::model::{TokenTransferDao, TxDao}; use erc20_payment_lib::runtime::{DriverEvent, DriverEventContent, PaymentRuntime, TransferType}; use ethereum_types::H160; +use ethereum_types::U256; use num_bigint::BigInt; use std::collections::HashMap; use std::str::FromStr; @@ -27,7 +29,7 @@ use ya_payment_driver::{ }; // Local uses -use crate::erc20::utils::big_dec_to_u256; +use crate::erc20::utils::{big_dec_to_u256, u256_to_big_dec}; use crate::network::platform_to_currency; use crate::{network::SUPPORTED_NETWORKS, DRIVER_NAME, RINKEBY_NETWORK}; @@ -115,6 +117,83 @@ impl Erc20NextDriver { Ok(payment_id) } + + async fn _confirm_payments( + &self, + token_transfer: &TokenTransferDao, + tx: &TxDao, + ) -> Result<(), GenericError> { + log::info!("Received event TransferFinished: {:#?}", token_transfer); + + let chain_id = token_transfer.chain_id; + let network_name = &self + .payment_runtime + .setup + .chain_setup + .get(&chain_id) + .ok_or(GenericError::new(format!( + "Missing configuration for chain_id {chain_id}" + )))? + .network; + + let networks = self.get_networks(); + let network = networks.get(network_name).ok_or(GenericError::new(format!( + "Network {network_name} not supported by Erc20NextDriver" + )))?; + let platform = network + .tokens + .get(&network.default_token) + .ok_or(GenericError::new(format!( + "Network {} doesn't specify platform for default token {}", + network_name, network.default_token + )))? + .as_str(); + + let Ok(tx_token_amount) = U256::from_dec_str(&token_transfer.token_amount) else { + return Err(GenericError::new(format!("Malformed token_transfer.token_amount: {}", token_transfer.token_amount))); + }; + let Ok(tx_token_amount) = u256_to_big_dec(tx_token_amount) else { + return Err(GenericError::new(format!("Cannot convert to big decimal tx_token_amount: {}", tx_token_amount))); + }; + let payment_details = PaymentDetails { + recipient: token_transfer.receiver_addr.clone(), + sender: token_transfer.from_addr.clone(), + amount: tx_token_amount, + date: token_transfer.paid_date, + }; + + let tx_hash = tx.tx_hash.clone().ok_or(GenericError::new(format!( + "Missing tx_hash in tx_dao: {:?}", + tx + )))?; + if tx_hash.len() != 66 { + return Err(GenericError::new(format!( + "Malformed tx_hash, length should be 66: {:?}", + tx_hash + ))); + }; + let transaction_hash = hex::decode(&tx_hash[2..]).map_err(|err| { + GenericError::new(format!("Malformed tx.tx_hash: {:?} {err}", tx_hash)) + })?; + + log::info!("name = {}", &self.get_name()); + log::info!("platform = {}", platform); + log::info!("order_id = {}", token_transfer.payment_id.as_ref().unwrap()); + log::info!("payment_details = {:#?}", payment_details); + log::info!("confirmation = {:x?}", transaction_hash); + + let Some(payment_id) = &token_transfer.payment_id else { + return Err(GenericError::new("token_transfer.payment_id is null")); + }; + bus::notify_payment( + &self.get_name(), + platform, + vec![payment_id.clone()], + &payment_details, + transaction_hash, + ) + .await + } } #[async_trait(?Send)] @@ -342,63 +421,34 @@ impl PaymentDriverCron for Erc20NextDriver { async fn confirm_payments(&self) { let mut events = self.events.lock().await; - log::info!("Job confirm_payments started"); while let Ok(event) = events.try_recv() { - if let DriverEventContent::TransferFinished(tx) = event.content { - log::info!("Received event TransferFinished: {:#?}", tx); - - let chain_id = tx.chain_id; - let network_name = &self - .payment_runtime - .setup - .chain_setup - .get(&chain_id) - .unwrap_or_else(|| panic!("Missing configuration for chain_id {chain_id}")) - .network; - - let networks = self.get_networks(); - let network = networks.get(network_name).unwrap_or_else(|| { - panic!("Network {network_name} not supported by Erc20NextDriver") - }); - let platform = network - .tokens - .get(&network.default_token) - .unwrap_or_else(|| { - panic!( - "Network {} doesn't specify platform for default token {}", - network_name, network.default_token - ) - }) - .as_str(); - - let payment_details = PaymentDetails { - recipient: tx.receiver_addr, - sender: tx.from_addr, - amount: BigDecimal::from_str(&tx.token_amount).unwrap_or_else(|_| { - panic!("malformed tx.token_amount: {}", tx.token_amount) - }), - date: tx.paid_date, - }; - - let confirmation = tx.tx_id.unwrap_or(0xDEADBEEF).to_le_bytes().to_vec(); - - log::info!("name = {}", &self.get_name()); - log::info!("platform = {}", platform); - log::info!("order_id = {}", tx.payment_id.as_ref().unwrap()); - log::info!("payment_details = {:#?}", payment_details); - log::info!("confirmation = {:x?}", confirmation); - - bus::notify_payment( - &self.get_name(), - platform, - vec![tx.payment_id.unwrap()], - &payment_details, - confirmation, - ) - .await - .ok(); + if let DriverEventContent::TransferFinished(transfer_finished) = &event.content { + match self + ._confirm_payments( + &transfer_finished.token_transfer_dao, + &transfer_finished.tx_dao, + ) + .await + { + Ok(_) => log::info!( + "Payment confirmed: {}", + transfer_finished + .token_transfer_dao + .payment_id + .clone() + .unwrap_or_default() + ), + Err(e) => log::error!( + "Error confirming payment: {}, error: {}", + transfer_finished + .token_transfer_dao + .payment_id + .clone() + .unwrap_or_default(), + e + ), + } } } - log::info!("Job confirm_payments finished"); } } diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index d2360dcfa9..33d5799ea5 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -12,6 +12,7 @@ use ethereum_types::H160; use std::sync::Arc; // Workspace uses +use ya_payment_driver::cron::PaymentDriverCron; use ya_payment_driver::{ bus, dao::{init, DbExecutor}, @@ -131,7 +132,13 @@ impl Erc20NextService { driver.load_active_accounts().await; let driver_rc = Arc::new(driver); - + let driver_rc_ = driver_rc.clone(); + tokio::task::spawn_local(async move { + loop { + driver_rc_.confirm_payments().await; + tokio::time::sleep(std::time::Duration::from_secs(10)).await; + } + }); bus::bind_service(db, driver_rc.clone()).await?; log::info!("Successfully connected Erc20NextService to gsb."); diff --git a/core/payment/src/processor.rs b/core/payment/src/processor.rs index 4dcc88bff4..271386c772 100644 --- a/core/payment/src/processor.rs +++ b/core/payment/src/processor.rs @@ -426,6 +426,7 @@ impl PaymentProcessor { .send(driver::SignPayment(payment.clone())) .await??; + log::warn!("####### payment: {:?}, signature {:?}", payment, signature); counter!("payment.amount.sent", ya_metrics::utils::cryptocurrency_to_u64(&msg.amount), "platform" => payment_platform); let msg = SendPayment::new(payment, signature); @@ -437,7 +438,8 @@ impl PaymentProcessor { .call(msg) .map(|res| match res { Ok(Ok(_)) => (), - err => log::error!("Error sending payment message to provider: {:?}", err), + Err(err) => log::error!("Error sending payment message to provider: {:?}", err), + Ok(Err(err)) => log::error!("Provider rejected payment: {:?}", err), }), ); // TODO: Implement re-sending mechanism in case SendPayment fails From 3ff3ae13a580bc6eea9cadcc55d382c772157c40 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Wed, 13 Sep 2023 20:15:55 +0200 Subject: [PATCH 055/123] Added schedule message debug log --- core/payment-driver/erc20next/src/driver.rs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index c5b9b1ed22..32379c7de2 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -340,6 +340,8 @@ impl PaymentDriver for Erc20NextDriver { _caller: String, msg: SchedulePayment, ) -> Result { + log::debug!("schedule_payment: {:?}", msg); + let platform = msg.platform(); let network = platform.split('-').nth(1).ok_or(GenericError::new(format!( "Malformed platform string: {}", From 6e48a126f4286529f8da27f95d033d82948c8f92 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Wed, 13 Sep 2023 20:39:19 +0200 Subject: [PATCH 056/123] Extra logging for Goth test_mid_agreement payments debugging --- Cargo.lock | 2 +- Cargo.toml | 2 +- core/payment-driver/erc20next/src/driver.rs | 6 ++++++ 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4a62f3f3d1..369ae5f744 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1869,7 +1869,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.1.9" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=bd3b7399dc54e0382c216a168266376deef7ad56#bd3b7399dc54e0382c216a168266376deef7ad56" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=eda7198ee893850391912a100382e2b52f26a23f#eda7198ee893850391912a100382e2b52f26a23f" dependencies = [ "actix-files", "actix-web", diff --git a/Cargo.toml b/Cargo.toml index f60a970a30..c1e5c82c2e 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ path = "core/serv/src/main.rs" # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "bd3b7399dc54e0382c216a168266376deef7ad56" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "eda7198ee893850391912a100382e2b52f26a23fca" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.1.9" } rand = "0.8.5" diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index 32379c7de2..c6cf75b608 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -245,6 +245,12 @@ impl PaymentDriver for Erc20NextDriver { GenericError::new(format!("{} isn't a valid H160 address: {}", address_str, e)) })?; + log::debug!( + "Getting balance for network: {}, address: {}", + network.to_string(), + address_str + ); + let balance = self .payment_runtime .get_token_balance(network.to_string(), address) From b76f08652e97f677edc9a85cd28e8cdb71179d85 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Wed, 13 Sep 2023 21:46:52 +0200 Subject: [PATCH 057/123] fix erc20lib reference --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index c1e5c82c2e..dd1431f1f3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ path = "core/serv/src/main.rs" # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "eda7198ee893850391912a100382e2b52f26a23fca" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "eda7198ee893850391912a100382e2b52f26a23f" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.1.9" } rand = "0.8.5" From 3f76f5f1f440e5b7366e97509c3aa33646b7adf9 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Thu, 14 Sep 2023 16:50:38 +0200 Subject: [PATCH 058/123] lower gas usage by goth --- goth_tests/pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index 7117808f53..f072d56fa3 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -26,9 +26,9 @@ pytest = "^6.2" pytest-asyncio = "^0.20.2" pytest-rerunfailures = "^10.3" pytest-split = "^0.8.1" -goth = "0.15.1" +# goth = "0.15.1" # to use development goth version uncomment below -# goth = { git = "https://github.com/golemfactory/goth.git", rev = "f399163b9f3882cca4ca4152c06aed57b916ca67" } +goth = { git = "https://github.com/golemfactory/goth.git", rev = "d8535bad0c606daaa61f97966d4121a44157ebc6" } [tool.poetry.dev-dependencies] black = "^20.8b1" From 4b380442182f805f5101e335f95b11a559108ff5 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Thu, 14 Sep 2023 18:39:27 +0200 Subject: [PATCH 059/123] More logs --- Cargo.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index dd1431f1f3..c5e285ad15 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ path = "core/serv/src/main.rs" # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "eda7198ee893850391912a100382e2b52f26a23f" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "ef91a37a66520ed16577081761f31efb9eea45b3" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.1.9" } rand = "0.8.5" From a17069d0e23ec132cb6e1569f60c8457aabf600b Mon Sep 17 00:00:00 2001 From: scx1332 Date: Thu, 14 Sep 2023 18:48:45 +0200 Subject: [PATCH 060/123] No lockfile check --- .github/workflows/binaries-x86-64.yml | 6 ------ Cargo.lock | 2 +- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/.github/workflows/binaries-x86-64.yml b/.github/workflows/binaries-x86-64.yml index 2f623d5a37..b7d4aa4757 100644 --- a/.github/workflows/binaries-x86-64.yml +++ b/.github/workflows/binaries-x86-64.yml @@ -54,12 +54,6 @@ jobs: shared-key: "payment-dev-x86-64" - - name: Check lockfile - uses: actions-rs/cargo@v1 - with: - command: tree - args: --locked - - name: Install openssl ( Windows only ) if: runner.os == 'Windows' run: | diff --git a/Cargo.lock b/Cargo.lock index 369ae5f744..3e093b7ebd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1869,7 +1869,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.1.9" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=eda7198ee893850391912a100382e2b52f26a23f#eda7198ee893850391912a100382e2b52f26a23f" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=ef91a37a66520ed16577081761f31efb9eea45b3#ef91a37a66520ed16577081761f31efb9eea45b3" dependencies = [ "actix-files", "actix-web", From b7a3baa29811d133a7d5cafe80ca3801198a82eb Mon Sep 17 00:00:00 2001 From: scx1332 Date: Thu, 14 Sep 2023 22:56:33 +0200 Subject: [PATCH 061/123] Updated gnt2 docker --- goth_tests/assets/docker/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/goth_tests/assets/docker/docker-compose.yml b/goth_tests/assets/docker/docker-compose.yml index 15306b564c..2d56c93799 100644 --- a/goth_tests/assets/docker/docker-compose.yml +++ b/goth_tests/assets/docker/docker-compose.yml @@ -25,7 +25,7 @@ services: - "16001-16100:6001-6100" ethereum: - image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:2c6027dbcf7f + image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:f417b721f07e ports: - "8545:8545" From 9251459000637fce0a8f347a48ca5330c29ffc9d Mon Sep 17 00:00:00 2001 From: scx1332 Date: Fri, 15 Sep 2023 17:47:16 +0200 Subject: [PATCH 062/123] Chainid 4 --- goth_tests/assets/docker/docker-compose.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/goth_tests/assets/docker/docker-compose.yml b/goth_tests/assets/docker/docker-compose.yml index 2d56c93799..2e1aae5cd9 100644 --- a/goth_tests/assets/docker/docker-compose.yml +++ b/goth_tests/assets/docker/docker-compose.yml @@ -25,7 +25,7 @@ services: - "16001-16100:6001-6100" ethereum: - image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:f417b721f07e + image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:96a6fea67c45 ports: - "8545:8545" From 1991aa272fa3328623603a5ebc85e709d3ad4a56 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Fri, 15 Sep 2023 18:32:50 +0200 Subject: [PATCH 063/123] Change required confirmations according to env variable --- core/payment-driver/erc20next/src/service.rs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index 33d5799ea5..c9fa91bfb1 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -63,6 +63,7 @@ impl Erc20NextService { let priority_fee_env = format!("{prefix}_PRIORITY_FEE"); let max_fee_per_gas_env = format!("{prefix}_MAX_FEE_PER_GAS"); let token_addr_env = format!("{prefix}_{symbol}_CONTRACT_ADDRESS"); + let confirmations = format!("ERC20_{prefix}_REQUIRED_CONFIRMATIONS"); if let Ok(addr) = env::var(&rpc_env) { chain.rpc_endpoints = addr.split(',').map(ToOwned::to_owned).collect(); @@ -107,6 +108,19 @@ impl Erc20NextService { } }; } + if let Ok(confirmations) = env::var(&confirmations) { + match confirmations.parse::() { + Ok(parsed) => { + log::info!("{network} required confirmations set to {parsed}"); + chain.confirmation_blocks = parsed; + } + Err(e) => { + log::warn!( + "Value {confirmations} for {confirmations} is not valid u64: {e}" + ); + } + }; + } } log::warn!("Starting payment engine: {:#?}", config); From 6c3e16455ec6abb3e45658b502be0a01ebbe54f1 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Fri, 15 Sep 2023 18:46:43 +0200 Subject: [PATCH 064/123] fix workflow file --- .github/workflows/binaries-aarch64.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/binaries-aarch64.yml b/.github/workflows/binaries-aarch64.yml index f7530e5360..78cad0a9e0 100644 --- a/.github/workflows/binaries-aarch64.yml +++ b/.github/workflows/binaries-aarch64.yml @@ -15,9 +15,6 @@ on: env: rust_stable: 1.71.1 -env: - rust_stable: 1.71.1 - jobs: build: name: Build binaries (aarch64) From e5a1a922a3b9c1f1575ad10295c9fb8fb92192b3 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Fri, 15 Sep 2023 18:54:53 +0200 Subject: [PATCH 065/123] Test mid agreement payments longer timeout --- goth_tests/domain/payments/test_mid_payments.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/goth_tests/domain/payments/test_mid_payments.py b/goth_tests/domain/payments/test_mid_payments.py index c0448eb589..014470b213 100644 --- a/goth_tests/domain/payments/test_mid_payments.py +++ b/goth_tests/domain/payments/test_mid_payments.py @@ -88,7 +88,7 @@ async def test_mid_agreement_payments( await provider.wait_for_exeunit_started() for i in range(0, ITERATION_COUNT): - await asyncio.sleep(PAYMENT_TIMEOUT_SEC) + await asyncio.sleep(PAYMENT_TIMEOUT_SEC + 5) payments = await provider.api.payment.get_payments(after_timestamp=ts) for payment in payments: amount += float(payment.amount) From 7a52abeb09aacbed9d10bd21c9b4ea0c4815dc5c Mon Sep 17 00:00:00 2001 From: scx1332 Date: Fri, 15 Sep 2023 20:43:12 +0200 Subject: [PATCH 066/123] test mid agreement payments --- goth_tests/domain/payments/test_mid_payments.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/goth_tests/domain/payments/test_mid_payments.py b/goth_tests/domain/payments/test_mid_payments.py index 014470b213..c0448eb589 100644 --- a/goth_tests/domain/payments/test_mid_payments.py +++ b/goth_tests/domain/payments/test_mid_payments.py @@ -88,7 +88,7 @@ async def test_mid_agreement_payments( await provider.wait_for_exeunit_started() for i in range(0, ITERATION_COUNT): - await asyncio.sleep(PAYMENT_TIMEOUT_SEC + 5) + await asyncio.sleep(PAYMENT_TIMEOUT_SEC) payments = await provider.api.payment.get_payments(after_timestamp=ts) for payment in payments: amount += float(payment.amount) From 56b42b72c40fc8b38ed3f3a0c64155587b713f52 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Mon, 18 Sep 2023 12:50:19 +0200 Subject: [PATCH 067/123] erc20next: configure cron intervals in goth-config.yml --- goth_tests/domain/payments/goth-config.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/goth_tests/domain/payments/goth-config.yml b/goth_tests/domain/payments/goth-config.yml index f9ab871621..78aeb4a354 100644 --- a/goth_tests/domain/payments/goth-config.yml +++ b/goth_tests/domain/payments/goth-config.yml @@ -40,6 +40,8 @@ node-types: environment: - "ERC20_SENDOUT_INTERVAL_SECS=1" - "ERC20_CONFIRMATION_INTERVAL_SECS=1" + - "ERC20NEXT_SENDOUT_INTERVAL_SECS=1" + - "ERC20NEXT_CONFIRMATION_INTERVAL_SECS=1" - name: "Provider" class: "goth_tests.helpers.probe.ProviderProbe" @@ -55,6 +57,7 @@ node-types: - "DEBIT_NOTE_INTERVAL=3s" - "PAYMENT_TIMEOUT=5s" - "ERC20_CONFIRMATION_INTERVAL_SECS=1" + - "ERC20NEXT_CONFIRMATION_INTERVAL_SECS=1" nodes: From c3fdd17ada12e78d575874ca3f01a38c6160eddc Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Mon, 18 Sep 2023 13:03:08 +0200 Subject: [PATCH 068/123] erc20next: Use cron for background jobs --- core/payment-driver/erc20next/src/service.rs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index c9fa91bfb1..208ab9800c 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -12,7 +12,7 @@ use ethereum_types::H160; use std::sync::Arc; // Workspace uses -use ya_payment_driver::cron::PaymentDriverCron; +use ya_payment_driver::cron::Cron; use ya_payment_driver::{ bus, dao::{init, DbExecutor}, @@ -35,10 +35,6 @@ impl Erc20NextService { init(db).await.map_err(GenericError::new)?; log::debug!("Database initialised"); - // Start cron - //Cron::new(driver_rc.clone()); - log::debug!("Cron started"); - { let (private_keys, _public_addresses) = load_private_keys(&env::var("ETH_PRIVATE_KEYS").unwrap_or_default()).unwrap(); @@ -146,15 +142,13 @@ impl Erc20NextService { driver.load_active_accounts().await; let driver_rc = Arc::new(driver); - let driver_rc_ = driver_rc.clone(); - tokio::task::spawn_local(async move { - loop { - driver_rc_.confirm_payments().await; - tokio::time::sleep(std::time::Duration::from_secs(10)).await; - } - }); + bus::bind_service(db, driver_rc.clone()).await?; + // Start cron + Cron::new(driver_rc); + log::debug!("Cron started"); + log::info!("Successfully connected Erc20NextService to gsb."); Ok(()) } From 8c711932eff3ca025cc07d9295277b6365e7ad06 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Mon, 18 Sep 2023 15:02:33 +0200 Subject: [PATCH 069/123] Docker that takes chain id as argument --- goth_tests/assets/docker/docker-compose.yml | 29 ++++++++++++++++++--- 1 file changed, 26 insertions(+), 3 deletions(-) diff --git a/goth_tests/assets/docker/docker-compose.yml b/goth_tests/assets/docker/docker-compose.yml index 2e1aae5cd9..460fa08f24 100644 --- a/goth_tests/assets/docker/docker-compose.yml +++ b/goth_tests/assets/docker/docker-compose.yml @@ -24,11 +24,34 @@ services: # we map them to ports 16001-16100 on the host. - "16001-16100:6001-6100" - ethereum: - image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:96a6fea67c45 + ethereum-rinkeby: + image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:a93c126e8255 ports: - "8545:8545" - + environment: + - GANACHE_CHAIN_ID=4 + + ethereum-mainnet: + image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:a93c126e8255 + ports: + - "8546:8545" + environment: + - GANACHE_CHAIN_ID=1 + + ethereum-goerli: + image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:a93c126e8255 + ports: + - "8547:8545" + environment: + - GANACHE_CHAIN_ID=5 + + ethereum-polygon: + image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:a93c126e8255 + ports: + - "8548:8545" + environment: + - GANACHE_CHAIN_ID=5 + outbound-test: # A service running a TCP sink, echo and iperf3 servers image: outbound-test From b9c849e1010ce02b50086b502712793e0eaf59ba Mon Sep 17 00:00:00 2001 From: scx1332 Date: Mon, 18 Sep 2023 15:23:02 +0200 Subject: [PATCH 070/123] Update goth version --- goth_tests/assets/docker/docker-compose.yml | 9 +---- goth_tests/poetry.lock | 44 +++++++++++---------- goth_tests/pyproject.toml | 2 +- 3 files changed, 26 insertions(+), 29 deletions(-) diff --git a/goth_tests/assets/docker/docker-compose.yml b/goth_tests/assets/docker/docker-compose.yml index 460fa08f24..3a55dbef92 100644 --- a/goth_tests/assets/docker/docker-compose.yml +++ b/goth_tests/assets/docker/docker-compose.yml @@ -24,13 +24,6 @@ services: # we map them to ports 16001-16100 on the host. - "16001-16100:6001-6100" - ethereum-rinkeby: - image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:a93c126e8255 - ports: - - "8545:8545" - environment: - - GANACHE_CHAIN_ID=4 - ethereum-mainnet: image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:a93c126e8255 ports: @@ -50,7 +43,7 @@ services: ports: - "8548:8545" environment: - - GANACHE_CHAIN_ID=5 + - GANACHE_CHAIN_ID=137 outbound-test: # A service running a TCP sink, echo and iperf3 servers diff --git a/goth_tests/poetry.lock b/goth_tests/poetry.lock index 5b668dabde..2389e33f42 100644 --- a/goth_tests/poetry.lock +++ b/goth_tests/poetry.lock @@ -734,27 +734,31 @@ version = "0.15.1" description = "Golem Test Harness - integration testing framework" category = "main" optional = false -python-versions = ">=3.8,<4.0" -files = [ - {file = "goth-0.15.1-py3-none-any.whl", hash = "sha256:b948134c293d3bd85985168c1ad04873727a84bb84dbc166fd192dc542b535c7"}, - {file = "goth-0.15.1.tar.gz", hash = "sha256:7cd4f05cb6b0324dbf357244b9b6bae3b984011fbaf61de9b262b7f2a0b1541c"}, -] +python-versions = "^3.8" +files = [] +develop = false [package.dependencies] aiohttp = "3.7.4" -ansicolors = ">=1.1.0,<2.0.0" -docker = ">=5.0,<6.0" -docker-compose = ">=1.29,<2.0" -dpath = ">=2.0,<3.0" +ansicolors = "^1.1.0" +docker = "^5.0" +docker-compose = "^1.29" +dpath = "^2.0" func_timeout = "4.3.5" -ghapi = ">=0.1.16,<0.2.0" +ghapi = "^0.1.16" markupsafe = "2.0.1" -mitmproxy = ">=5.3,<6.0" -pyyaml = ">=5.4,<6.0" -transitions = ">=0.8,<0.9" -typing_extensions = ">=3.10.0,<4.0.0" -urllib3 = ">=1.26,<2.0" -ya-aioclient = ">=0.6,<0.7" +mitmproxy = "^5.3" +pyyaml = "^5.4" +transitions = "^0.8" +typing_extensions = "^3.10.0" +urllib3 = "^1.26" +ya-aioclient = "^0.6" + +[package.source] +type = "git" +url = "https://github.com/golemfactory/goth.git" +reference = "58ceafcef4fcb40649e9b12c93f89b805bb8c284" +resolved_reference = "58ceafcef4fcb40649e9b12c93f89b805bb8c284" [[package]] name = "h11" @@ -1910,14 +1914,14 @@ files = [ [[package]] name = "setuptools" -version = "68.2.1" +version = "68.2.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" category = "main" optional = false python-versions = ">=3.8" files = [ - {file = "setuptools-68.2.1-py3-none-any.whl", hash = "sha256:eff96148eb336377ab11beee0c73ed84f1709a40c0b870298b0d058828761bae"}, - {file = "setuptools-68.2.1.tar.gz", hash = "sha256:56ee14884fd8d0cd015411f4a13f40b4356775a0aefd9ebc1d3bfb9a1acb32f1"}, + {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, + {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, ] [package.extras] @@ -2327,4 +2331,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8.0" -content-hash = "e9545ea1e71ee520c9dad95741fbfc55599ba4f2eab3fd0e92b868855e0a0f20" +content-hash = "c5698d423ffff34cb2c8b5b2b5b005c26ec281ff1ba06ff14749e18b4897c300" diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index f072d56fa3..eac5b03e54 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -28,7 +28,7 @@ pytest-rerunfailures = "^10.3" pytest-split = "^0.8.1" # goth = "0.15.1" # to use development goth version uncomment below -goth = { git = "https://github.com/golemfactory/goth.git", rev = "d8535bad0c606daaa61f97966d4121a44157ebc6" } +goth = { git = "https://github.com/golemfactory/goth.git", rev = "58ceafcef4fcb40649e9b12c93f89b805bb8c284" } [tool.poetry.dev-dependencies] black = "^20.8b1" From d5cd2d7d5f66778a3bd753fa5451a5860c00c7bd Mon Sep 17 00:00:00 2001 From: scx1332 Date: Mon, 18 Sep 2023 15:37:59 +0200 Subject: [PATCH 071/123] Update goth --- goth_tests/domain/exe_units/goth-config.yml | 4 +++- goth_tests/poetry.lock | 6 +++--- goth_tests/pyproject.toml | 2 +- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/goth_tests/domain/exe_units/goth-config.yml b/goth_tests/domain/exe_units/goth-config.yml index 298b9b932b..523619b10f 100644 --- a/goth_tests/domain/exe_units/goth-config.yml +++ b/goth_tests/domain/exe_units/goth-config.yml @@ -22,7 +22,9 @@ docker-compose: # release-tag: ... compose-log-patterns: - ethereum: ".*Wallets supplied." + ethereum-mainnet: ".*Wallets supplied." + ethereum-goerli: ".*Wallets supplied." + ethereum-polygon: ".*Wallets supplied." key-dir: "../../assets/keys" diff --git a/goth_tests/poetry.lock b/goth_tests/poetry.lock index 2389e33f42..4d84a3535b 100644 --- a/goth_tests/poetry.lock +++ b/goth_tests/poetry.lock @@ -757,8 +757,8 @@ ya-aioclient = "^0.6" [package.source] type = "git" url = "https://github.com/golemfactory/goth.git" -reference = "58ceafcef4fcb40649e9b12c93f89b805bb8c284" -resolved_reference = "58ceafcef4fcb40649e9b12c93f89b805bb8c284" +reference = "4478c986eac2e461fa48f4ae48f92da20bb18afb" +resolved_reference = "4478c986eac2e461fa48f4ae48f92da20bb18afb" [[package]] name = "h11" @@ -2331,4 +2331,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8.0" -content-hash = "c5698d423ffff34cb2c8b5b2b5b005c26ec281ff1ba06ff14749e18b4897c300" +content-hash = "bfe4296fce9cb21c0a86452287d4ebe3af8b90367b2a29a89451bbd77bfacfc8" diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index eac5b03e54..d20eac78f7 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -28,7 +28,7 @@ pytest-rerunfailures = "^10.3" pytest-split = "^0.8.1" # goth = "0.15.1" # to use development goth version uncomment below -goth = { git = "https://github.com/golemfactory/goth.git", rev = "58ceafcef4fcb40649e9b12c93f89b805bb8c284" } +goth = { git = "https://github.com/golemfactory/goth.git", rev = "4478c986eac2e461fa48f4ae48f92da20bb18afb" } [tool.poetry.dev-dependencies] black = "^20.8b1" From 93bb4cb08beb050d3e1695cae023d86a0a0d510f Mon Sep 17 00:00:00 2001 From: scx1332 Date: Mon, 18 Sep 2023 15:40:31 +0200 Subject: [PATCH 072/123] Remove rinkeby from payment config --- core/payment-driver/erc20next/config-payments.toml | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/core/payment-driver/erc20next/config-payments.toml b/core/payment-driver/erc20next/config-payments.toml index 2974e5b752..613007c87d 100644 --- a/core/payment-driver/erc20next/config-payments.toml +++ b/core/payment-driver/erc20next/config-payments.toml @@ -3,19 +3,6 @@ service-sleep = 1 process-sleep = 1 automatic-recover = false -[chain.rinkeby] -chain-name = "Rinkeby" -chain-id = 4 -rpc-endpoints = ["http://geth.testnet.golem.network:55555"] -currency-symbol = "tETH" -priority-fee = 1.5111 -max-fee-per-gas = 20.0 -gas-left-warning-limit = 1000000 -transaction-timeout = 100 -token = { address = "0xd94e3DC39d4Cad1DAd634e7eb585A57A19dC7EFE", symbol = "tGLM", max-at-once = 10 } -confirmation-blocks = 1 -block-explorer-url = "https://rinkeby.etherscan.io" - [chain.goerli] chain-name = "Goerli" chain-id = 5 From 42bce9ae097073d3f03de45af30519f34a2614c8 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Mon, 18 Sep 2023 15:42:47 +0200 Subject: [PATCH 073/123] Update goth version --- goth_tests/poetry.lock | 6 +++--- goth_tests/pyproject.toml | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/goth_tests/poetry.lock b/goth_tests/poetry.lock index 4d84a3535b..d943541910 100644 --- a/goth_tests/poetry.lock +++ b/goth_tests/poetry.lock @@ -757,8 +757,8 @@ ya-aioclient = "^0.6" [package.source] type = "git" url = "https://github.com/golemfactory/goth.git" -reference = "4478c986eac2e461fa48f4ae48f92da20bb18afb" -resolved_reference = "4478c986eac2e461fa48f4ae48f92da20bb18afb" +reference = "7033689d4200bde527666dcfe09db4fb72b708ac" +resolved_reference = "7033689d4200bde527666dcfe09db4fb72b708ac" [[package]] name = "h11" @@ -2331,4 +2331,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8.0" -content-hash = "bfe4296fce9cb21c0a86452287d4ebe3af8b90367b2a29a89451bbd77bfacfc8" +content-hash = "da72f9ded5843bc94dc10253f12d836ed88c373ea144640a05a63bc26b9af0b1" diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index d20eac78f7..c1eae31d73 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -28,7 +28,7 @@ pytest-rerunfailures = "^10.3" pytest-split = "^0.8.1" # goth = "0.15.1" # to use development goth version uncomment below -goth = { git = "https://github.com/golemfactory/goth.git", rev = "4478c986eac2e461fa48f4ae48f92da20bb18afb" } +goth = { git = "https://github.com/golemfactory/goth.git", rev = "7033689d4200bde527666dcfe09db4fb72b708ac" } [tool.poetry.dev-dependencies] black = "^20.8b1" From d9f769bc4eaab3e4018c782e018ef11112187766 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Mon, 18 Sep 2023 16:07:34 +0200 Subject: [PATCH 074/123] Expand ethereum to ethereum-{mainnet,polygon,goerli} --- goth_tests/README.md | 8 ++++++-- goth_tests/domain/payments/goth-config.yml | 4 +++- goth_tests/domain/ya-provider/goth-config.yml | 4 +++- goth_tests/goth-config.yml | 4 +++- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/goth_tests/README.md b/goth_tests/README.md index 76ae4aa25c..2ae824f058 100644 --- a/goth_tests/README.md +++ b/goth_tests/README.md @@ -64,7 +64,9 @@ This path will depend either on the shell environment or the operating system on └── goth_20210420_093848+0000 ├── runner.log # debug console logs from the entire test session ├── test_e2e_vm # directory with logs from a single test - │   ├── ethereum.log + │   ├── ethereum-mainnet.log + │   ├── ethereum-goerli.log + │   ├── ethereum-polygon.log │   ├── provider_1.log # debug logs from a single yagna node │   ├── provider_1_ya-provider.log # debug logs from an agent running in a yagna node │   ├── provider_2.log @@ -250,7 +252,9 @@ docker-compose: # release-tag: ... compose-log-patterns: # Log message patterns used for container ready checks - ethereum: ".*Wallets supplied." + ethereum-mainnet: ".*Wallets supplied." + ethereum-goerli: ".*Wallets supplied." + ethereum-polygon: ".*Wallets supplied." ... key-dir: "keys" # Where to look for pre-funded Ethereum keys diff --git a/goth_tests/domain/payments/goth-config.yml b/goth_tests/domain/payments/goth-config.yml index 78aeb4a354..91536ef20d 100644 --- a/goth_tests/domain/payments/goth-config.yml +++ b/goth_tests/domain/payments/goth-config.yml @@ -22,7 +22,9 @@ docker-compose: # release-tag: ... compose-log-patterns: - ethereum: ".*Wallets supplied." + ethereum-mainnet: ".*Wallets supplied." + ethereum-goerli: ".*Wallets supplied." + ethereum-polygon: ".*Wallets supplied." key-dir: "../../assets/keys" diff --git a/goth_tests/domain/ya-provider/goth-config.yml b/goth_tests/domain/ya-provider/goth-config.yml index aab318fa2b..22e167982f 100644 --- a/goth_tests/domain/ya-provider/goth-config.yml +++ b/goth_tests/domain/ya-provider/goth-config.yml @@ -22,7 +22,9 @@ docker-compose: # release-tag: ... compose-log-patterns: - ethereum: ".*Wallets supplied." + ethereum-mainnet: ".*Wallets supplied." + ethereum-goerli: ".*Wallets supplied." + ethereum-polygon: ".*Wallets supplied." key-dir: "../../assets/keys" diff --git a/goth_tests/goth-config.yml b/goth_tests/goth-config.yml index 14f1bc6890..8b29a5b9cb 100644 --- a/goth_tests/goth-config.yml +++ b/goth_tests/goth-config.yml @@ -21,7 +21,9 @@ docker-compose: # release-tag: ... compose-log-patterns: - ethereum: ".*Wallets supplied." + ethereum-mainnet: ".*Wallets supplied." + ethereum-goerli: ".*Wallets supplied." + ethereum-polygon: ".*Wallets supplied." key-dir: "assets/keys" From 2daaebe00cf28ab3ddc9651bb284aee8da57977a Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Mon, 18 Sep 2023 16:40:55 +0200 Subject: [PATCH 075/123] bump goth --- goth_tests/assets/docker/docker-compose.yml | 6 +- goth_tests/poetry.lock | 4667 +++++++++---------- goth_tests/pyproject.toml | 2 +- 3 files changed, 2337 insertions(+), 2338 deletions(-) diff --git a/goth_tests/assets/docker/docker-compose.yml b/goth_tests/assets/docker/docker-compose.yml index 3a55dbef92..7706372f3c 100644 --- a/goth_tests/assets/docker/docker-compose.yml +++ b/goth_tests/assets/docker/docker-compose.yml @@ -27,21 +27,21 @@ services: ethereum-mainnet: image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:a93c126e8255 ports: - - "8546:8545" + - "8545:8545" environment: - GANACHE_CHAIN_ID=1 ethereum-goerli: image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:a93c126e8255 ports: - - "8547:8545" + - "8545:8545" environment: - GANACHE_CHAIN_ID=5 ethereum-polygon: image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:a93c126e8255 ports: - - "8548:8545" + - "8545:8545" environment: - GANACHE_CHAIN_ID=137 diff --git a/goth_tests/poetry.lock b/goth_tests/poetry.lock index d943541910..3abdff8672 100644 --- a/goth_tests/poetry.lock +++ b/goth_tests/poetry.lock @@ -1,2334 +1,2333 @@ -# This file is automatically @generated by Poetry and should not be changed by hand. - -[[package]] -name = "aiohttp" -version = "3.7.4" -description = "Async http client/server framework (asyncio)" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "aiohttp-3.7.4-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:6c8200abc9dc5f27203986100579fc19ccad7a832c07d2bc151ce4ff17190076"}, - {file = "aiohttp-3.7.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:dd7936f2a6daa861143e376b3a1fb56e9b802f4980923594edd9ca5670974895"}, - {file = "aiohttp-3.7.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:bc3d14bf71a3fb94e5acf5bbf67331ab335467129af6416a437bd6024e4f743d"}, - {file = "aiohttp-3.7.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:8ec1a38074f68d66ccb467ed9a673a726bb397142c273f90d4ba954666e87d54"}, - {file = "aiohttp-3.7.4-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:b84ad94868e1e6a5e30d30ec419956042815dfaea1b1df1cef623e4564c374d9"}, - {file = "aiohttp-3.7.4-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:d5d102e945ecca93bcd9801a7bb2fa703e37ad188a2f81b1e65e4abe4b51b00c"}, - {file = "aiohttp-3.7.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:c2a80fd9a8d7e41b4e38ea9fe149deed0d6aaede255c497e66b8213274d6d61b"}, - {file = "aiohttp-3.7.4-cp36-cp36m-win32.whl", hash = "sha256:481d4b96969fbfdcc3ff35eea5305d8565a8300410d3d269ccac69e7256b1329"}, - {file = "aiohttp-3.7.4-cp36-cp36m-win_amd64.whl", hash = "sha256:16d0683ef8a6d803207f02b899c928223eb219111bd52420ef3d7a8aa76227b6"}, - {file = "aiohttp-3.7.4-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:eab51036cac2da8a50d7ff0ea30be47750547c9aa1aa2cf1a1b710a1827e7dbe"}, - {file = "aiohttp-3.7.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:feb24ff1226beeb056e247cf2e24bba5232519efb5645121c4aea5b6ad74c1f2"}, - {file = "aiohttp-3.7.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:119feb2bd551e58d83d1b38bfa4cb921af8ddedec9fad7183132db334c3133e0"}, - {file = "aiohttp-3.7.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:6ca56bdfaf825f4439e9e3673775e1032d8b6ea63b8953d3812c71bd6a8b81de"}, - {file = "aiohttp-3.7.4-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:5563ad7fde451b1986d42b9bb9140e2599ecf4f8e42241f6da0d3d624b776f40"}, - {file = "aiohttp-3.7.4-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:62bc216eafac3204877241569209d9ba6226185aa6d561c19159f2e1cbb6abfb"}, - {file = "aiohttp-3.7.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:f4496d8d04da2e98cc9133e238ccebf6a13ef39a93da2e87146c8c8ac9768242"}, - {file = "aiohttp-3.7.4-cp37-cp37m-win32.whl", hash = "sha256:2ffea7904e70350da429568113ae422c88d2234ae776519549513c8f217f58a9"}, - {file = "aiohttp-3.7.4-cp37-cp37m-win_amd64.whl", hash = "sha256:5e91e927003d1ed9283dee9abcb989334fc8e72cf89ebe94dc3e07e3ff0b11e9"}, - {file = "aiohttp-3.7.4-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:4c1bdbfdd231a20eee3e56bd0ac1cd88c4ff41b64ab679ed65b75c9c74b6c5c2"}, - {file = "aiohttp-3.7.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:71680321a8a7176a58dfbc230789790639db78dad61a6e120b39f314f43f1907"}, - {file = "aiohttp-3.7.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7dbd087ff2f4046b9b37ba28ed73f15fd0bc9f4fdc8ef6781913da7f808d9536"}, - {file = "aiohttp-3.7.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:dee68ec462ff10c1d836c0ea2642116aba6151c6880b688e56b4c0246770f297"}, - {file = "aiohttp-3.7.4-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:99c5a5bf7135607959441b7d720d96c8e5c46a1f96e9d6d4c9498be8d5f24212"}, - {file = "aiohttp-3.7.4-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:5dde6d24bacac480be03f4f864e9a67faac5032e28841b00533cd168ab39cad9"}, - {file = "aiohttp-3.7.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:418597633b5cd9639e514b1d748f358832c08cd5d9ef0870026535bd5eaefdd0"}, - {file = "aiohttp-3.7.4-cp38-cp38-win32.whl", hash = "sha256:e76e78863a4eaec3aee5722d85d04dcbd9844bc6cd3bfa6aa880ff46ad16bfcb"}, - {file = "aiohttp-3.7.4-cp38-cp38-win_amd64.whl", hash = "sha256:950b7ef08b2afdab2488ee2edaff92a03ca500a48f1e1aaa5900e73d6cf992bc"}, - {file = "aiohttp-3.7.4-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2eb3efe243e0f4ecbb654b08444ae6ffab37ac0ef8f69d3a2ffb958905379daf"}, - {file = "aiohttp-3.7.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:822bd4fd21abaa7b28d65fc9871ecabaddc42767884a626317ef5b75c20e8a2d"}, - {file = "aiohttp-3.7.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:58c62152c4c8731a3152e7e650b29ace18304d086cb5552d317a54ff2749d32a"}, - {file = "aiohttp-3.7.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:7c7820099e8b3171e54e7eedc33e9450afe7cd08172632d32128bd527f8cb77d"}, - {file = "aiohttp-3.7.4-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:5b50e0b9460100fe05d7472264d1975f21ac007b35dcd6fd50279b72925a27f4"}, - {file = "aiohttp-3.7.4-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:c44d3c82a933c6cbc21039326767e778eface44fca55c65719921c4b9661a3f7"}, - {file = "aiohttp-3.7.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:cc31e906be1cc121ee201adbdf844522ea3349600dd0a40366611ca18cd40e81"}, - {file = "aiohttp-3.7.4-cp39-cp39-win32.whl", hash = "sha256:fbd3b5e18d34683decc00d9a360179ac1e7a320a5fee10ab8053ffd6deab76e0"}, - {file = "aiohttp-3.7.4-cp39-cp39-win_amd64.whl", hash = "sha256:40bd1b101b71a18a528ffce812cc14ff77d4a2a1272dfb8b11b200967489ef3e"}, - {file = "aiohttp-3.7.4.tar.gz", hash = "sha256:5d84ecc73141d0a0d61ece0742bb7ff5751b0657dab8405f899d3ceb104cc7de"}, -] - -[package.dependencies] -async-timeout = ">=3.0,<4.0" -attrs = ">=17.3.0" -chardet = ">=2.0,<4.0" -multidict = ">=4.5,<7.0" -typing-extensions = ">=3.6.5" -yarl = ">=1.0,<2.0" - -[package.extras] -speedups = ["aiodns", "brotlipy", "cchardet"] - -[[package]] -name = "ansicolors" -version = "1.1.8" -description = "ANSI colors for Python" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "ansicolors-1.1.8-py2.py3-none-any.whl", hash = "sha256:00d2dde5a675579325902536738dd27e4fac1fd68f773fe36c21044eb559e187"}, - {file = "ansicolors-1.1.8.zip", hash = "sha256:99f94f5e3348a0bcd43c82e5fc4414013ccc19d70bd939ad71e0133ce9c372e0"}, -] - -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] - -[[package]] -name = "asgiref" -version = "3.3.4" -description = "ASGI specs, helper code, and adapters" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "asgiref-3.3.4-py3-none-any.whl", hash = "sha256:92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee"}, - {file = "asgiref-3.3.4.tar.gz", hash = "sha256:d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78"}, -] - -[package.extras] -tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] - -[[package]] -name = "async-timeout" -version = "3.0.1" -description = "Timeout context manager for asyncio programs" -category = "main" -optional = false -python-versions = ">=3.5.3" -files = [ - {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"}, - {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"}, -] - -[[package]] -name = "atomicwrites" -version = "1.4.1" -description = "Atomic file writes." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, -] - -[[package]] -name = "attrs" -version = "23.1.0" -description = "Classes Without Boilerplate" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] - -[[package]] -name = "bcrypt" -version = "4.0.1" -description = "Modern password hashing for your software and your servers" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "bcrypt-4.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b1023030aec778185a6c16cf70f359cbb6e0c289fd564a7cfa29e727a1c38f8f"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:08d2947c490093a11416df18043c27abe3921558d2c03e2076ccb28a116cb6d0"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eaa47d4661c326bfc9d08d16debbc4edf78778e6aaba29c1bc7ce67214d4410"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae88eca3024bb34bb3430f964beab71226e761f51b912de5133470b649d82344"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:a522427293d77e1c29e303fc282e2d71864579527a04ddcfda6d4f8396c6c36a"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fbdaec13c5105f0c4e5c52614d04f0bca5f5af007910daa8b6b12095edaa67b3"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ca3204d00d3cb2dfed07f2d74a25f12fc12f73e606fcaa6975d1f7ae69cacbb2"}, - {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:089098effa1bc35dc055366740a067a2fc76987e8ec75349eb9484061c54f535"}, - {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e9a51bbfe7e9802b5f3508687758b564069ba937748ad7b9e890086290d2f79e"}, - {file = "bcrypt-4.0.1-cp36-abi3-win32.whl", hash = "sha256:2caffdae059e06ac23fce178d31b4a702f2a3264c20bfb5ff541b338194d8fab"}, - {file = "bcrypt-4.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf4fa8b2ca74381bb5442c089350f09a3f17797829d958fad058d6e44d9eb83c"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:67a97e1c405b24f19d08890e7ae0c4f7ce1e56a712a016746c8b2d7732d65d4b"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b3b85202d95dd568efcb35b53936c5e3b3600c7cdcc6115ba461df3a8e89f38d"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbb03eec97496166b704ed663a53680ab57c5084b2fc98ef23291987b525cb7d"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:5ad4d32a28b80c5fa6671ccfb43676e8c1cc232887759d1cd7b6f56ea4355215"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b57adba8a1444faf784394de3436233728a1ecaeb6e07e8c22c8848f179b893c"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b2cea8a9ed3d55b4491887ceadb0106acf7c6387699fca771af56b1cdeeda"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:2b3ac11cf45161628f1f3733263e63194f22664bf4d0c0f3ab34099c02134665"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3100851841186c25f127731b9fa11909ab7b1df6fc4b9f8353f4f1fd952fbf71"}, - {file = "bcrypt-4.0.1.tar.gz", hash = "sha256:27d375903ac8261cfe4047f6709d16f7d18d39b1ec92aaf72af989552a650ebd"}, -] - -[package.extras] -tests = ["pytest (>=3.2.1,!=3.3.0)"] -typecheck = ["mypy"] - -[[package]] -name = "black" -version = "20.8b1" -description = "The uncompromising code formatter." -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, -] - -[package.dependencies] -appdirs = "*" -click = ">=7.1.2" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.6,<1" -regex = ">=2020.1.8" -toml = ">=0.10.1" -typed-ast = ">=1.4.0" -typing-extensions = ">=3.7.4" - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] - -[[package]] -name = "blinker" -version = "1.4" -description = "Fast, simple object-to-object and broadcast signaling" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "blinker-1.4.tar.gz", hash = "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"}, -] - -[[package]] -name = "brotli" -version = "1.0.9" -description = "Python bindings for the Brotli compression library" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "Brotli-1.0.9-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:268fe94547ba25b58ebc724680609c8ee3e5a843202e9a381f6f9c5e8bdb5c70"}, - {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:c2415d9d082152460f2bd4e382a1e85aed233abc92db5a3880da2257dc7daf7b"}, - {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5913a1177fc36e30fcf6dc868ce23b0453952c78c04c266d3149b3d39e1410d6"}, - {file = "Brotli-1.0.9-cp27-cp27m-win32.whl", hash = "sha256:afde17ae04d90fbe53afb628f7f2d4ca022797aa093e809de5c3cf276f61bbfa"}, - {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7cb81373984cc0e4682f31bc3d6be9026006d96eecd07ea49aafb06897746452"}, - {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:db844eb158a87ccab83e868a762ea8024ae27337fc7ddcbfcddd157f841fdfe7"}, - {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9744a863b489c79a73aba014df554b0e7a0fc44ef3f8a0ef2a52919c7d155031"}, - {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a72661af47119a80d82fa583b554095308d6a4c356b2a554fdc2799bc19f2a43"}, - {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ee83d3e3a024a9618e5be64648d6d11c37047ac48adff25f12fa4226cf23d1c"}, - {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:19598ecddd8a212aedb1ffa15763dd52a388518c4550e615aed88dc3753c0f0c"}, - {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:44bb8ff420c1d19d91d79d8c3574b8954288bdff0273bf788954064d260d7ab0"}, - {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e23281b9a08ec338469268f98f194658abfb13658ee98e2b7f85ee9dd06caa91"}, - {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3496fc835370da351d37cada4cf744039616a6db7d13c430035e901443a34daa"}, - {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83bb06a0192cccf1eb8d0a28672a1b79c74c3a8a5f2619625aeb6f28b3a82bb"}, - {file = "Brotli-1.0.9-cp310-cp310-win32.whl", hash = "sha256:26d168aac4aaec9a4394221240e8a5436b5634adc3cd1cdf637f6645cecbf181"}, - {file = "Brotli-1.0.9-cp310-cp310-win_amd64.whl", hash = "sha256:622a231b08899c864eb87e85f81c75e7b9ce05b001e59bbfbf43d4a71f5f32b2"}, - {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cc0283a406774f465fb45ec7efb66857c09ffefbe49ec20b7882eff6d3c86d3a"}, - {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:11d3283d89af7033236fa4e73ec2cbe743d4f6a81d41bd234f24bf63dde979df"}, - {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c1306004d49b84bd0c4f90457c6f57ad109f5cc6067a9664e12b7b79a9948ad"}, - {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1375b5d17d6145c798661b67e4ae9d5496920d9265e2f00f1c2c0b5ae91fbde"}, - {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cab1b5964b39607a66adbba01f1c12df2e55ac36c81ec6ed44f2fca44178bf1a"}, - {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ed6a5b3d23ecc00ea02e1ed8e0ff9a08f4fc87a1f58a2530e71c0f48adf882f"}, - {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cb02ed34557afde2d2da68194d12f5719ee96cfb2eacc886352cb73e3808fc5d"}, - {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b3523f51818e8f16599613edddb1ff924eeb4b53ab7e7197f85cbc321cdca32f"}, - {file = "Brotli-1.0.9-cp311-cp311-win32.whl", hash = "sha256:ba72d37e2a924717990f4d7482e8ac88e2ef43fb95491eb6e0d124d77d2a150d"}, - {file = "Brotli-1.0.9-cp311-cp311-win_amd64.whl", hash = "sha256:3ffaadcaeafe9d30a7e4e1e97ad727e4f5610b9fa2f7551998471e3736738679"}, - {file = "Brotli-1.0.9-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:c83aa123d56f2e060644427a882a36b3c12db93727ad7a7b9efd7d7f3e9cc2c4"}, - {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:6b2ae9f5f67f89aade1fab0f7fd8f2832501311c363a21579d02defa844d9296"}, - {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:68715970f16b6e92c574c30747c95cf8cf62804569647386ff032195dc89a430"}, - {file = "Brotli-1.0.9-cp35-cp35m-win32.whl", hash = "sha256:defed7ea5f218a9f2336301e6fd379f55c655bea65ba2476346340a0ce6f74a1"}, - {file = "Brotli-1.0.9-cp35-cp35m-win_amd64.whl", hash = "sha256:88c63a1b55f352b02c6ffd24b15ead9fc0e8bf781dbe070213039324922a2eea"}, - {file = "Brotli-1.0.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:503fa6af7da9f4b5780bb7e4cbe0c639b010f12be85d02c99452825dd0feef3f"}, - {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:40d15c79f42e0a2c72892bf407979febd9cf91f36f495ffb333d1d04cebb34e4"}, - {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:93130612b837103e15ac3f9cbacb4613f9e348b58b3aad53721d92e57f96d46a"}, - {file = "Brotli-1.0.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87fdccbb6bb589095f413b1e05734ba492c962b4a45a13ff3408fa44ffe6479b"}, - {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:6d847b14f7ea89f6ad3c9e3901d1bc4835f6b390a9c71df999b0162d9bb1e20f"}, - {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:495ba7e49c2db22b046a53b469bbecea802efce200dffb69b93dd47397edc9b6"}, - {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:4688c1e42968ba52e57d8670ad2306fe92e0169c6f3af0089be75bbac0c64a3b"}, - {file = "Brotli-1.0.9-cp36-cp36m-win32.whl", hash = "sha256:61a7ee1f13ab913897dac7da44a73c6d44d48a4adff42a5701e3239791c96e14"}, - {file = "Brotli-1.0.9-cp36-cp36m-win_amd64.whl", hash = "sha256:1c48472a6ba3b113452355b9af0a60da5c2ae60477f8feda8346f8fd48e3e87c"}, - {file = "Brotli-1.0.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b78a24b5fd13c03ee2b7b86290ed20efdc95da75a3557cc06811764d5ad1126"}, - {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:9d12cf2851759b8de8ca5fde36a59c08210a97ffca0eb94c532ce7b17c6a3d1d"}, - {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6c772d6c0a79ac0f414a9f8947cc407e119b8598de7621f39cacadae3cf57d12"}, - {file = "Brotli-1.0.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29d1d350178e5225397e28ea1b7aca3648fcbab546d20e7475805437bfb0a130"}, - {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7bbff90b63328013e1e8cb50650ae0b9bac54ffb4be6104378490193cd60f85a"}, - {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ec1947eabbaf8e0531e8e899fc1d9876c179fc518989461f5d24e2223395a9e3"}, - {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12effe280b8ebfd389022aa65114e30407540ccb89b177d3fbc9a4f177c4bd5d"}, - {file = "Brotli-1.0.9-cp37-cp37m-win32.whl", hash = "sha256:f909bbbc433048b499cb9db9e713b5d8d949e8c109a2a548502fb9aa8630f0b1"}, - {file = "Brotli-1.0.9-cp37-cp37m-win_amd64.whl", hash = "sha256:97f715cf371b16ac88b8c19da00029804e20e25f30d80203417255d239f228b5"}, - {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e16eb9541f3dd1a3e92b89005e37b1257b157b7256df0e36bd7b33b50be73bcb"}, - {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:160c78292e98d21e73a4cc7f76a234390e516afcd982fa17e1422f7c6a9ce9c8"}, - {file = "Brotli-1.0.9-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b663f1e02de5d0573610756398e44c130add0eb9a3fc912a09665332942a2efb"}, - {file = "Brotli-1.0.9-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5b6ef7d9f9c38292df3690fe3e302b5b530999fa90014853dcd0d6902fb59f26"}, - {file = "Brotli-1.0.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a674ac10e0a87b683f4fa2b6fa41090edfd686a6524bd8dedbd6138b309175c"}, - {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e2d9e1cbc1b25e22000328702b014227737756f4b5bf5c485ac1d8091ada078b"}, - {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b336c5e9cf03c7be40c47b5fd694c43c9f1358a80ba384a21969e0b4e66a9b17"}, - {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:85f7912459c67eaab2fb854ed2bc1cc25772b300545fe7ed2dc03954da638649"}, - {file = "Brotli-1.0.9-cp38-cp38-win32.whl", hash = "sha256:35a3edbe18e876e596553c4007a087f8bcfd538f19bc116917b3c7522fca0429"}, - {file = "Brotli-1.0.9-cp38-cp38-win_amd64.whl", hash = "sha256:269a5743a393c65db46a7bb982644c67ecba4b8d91b392403ad8a861ba6f495f"}, - {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2aad0e0baa04517741c9bb5b07586c642302e5fb3e75319cb62087bd0995ab19"}, - {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5cb1e18167792d7d21e21365d7650b72d5081ed476123ff7b8cac7f45189c0c7"}, - {file = "Brotli-1.0.9-cp39-cp39-manylinux1_i686.whl", hash = "sha256:16d528a45c2e1909c2798f27f7bf0a3feec1dc9e50948e738b961618e38b6a7b"}, - {file = "Brotli-1.0.9-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:56d027eace784738457437df7331965473f2c0da2c70e1a1f6fdbae5402e0389"}, - {file = "Brotli-1.0.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bf919756d25e4114ace16a8ce91eb340eb57a08e2c6950c3cebcbe3dff2a5e7"}, - {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e4c4e92c14a57c9bd4cb4be678c25369bf7a092d55fd0866f759e425b9660806"}, - {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e48f4234f2469ed012a98f4b7874e7f7e173c167bed4934912a29e03167cf6b1"}, - {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ed4c92a0665002ff8ea852353aeb60d9141eb04109e88928026d3c8a9e5433c"}, - {file = "Brotli-1.0.9-cp39-cp39-win32.whl", hash = "sha256:cfc391f4429ee0a9370aa93d812a52e1fee0f37a81861f4fdd1f4fb28e8547c3"}, - {file = "Brotli-1.0.9-cp39-cp39-win_amd64.whl", hash = "sha256:854c33dad5ba0fbd6ab69185fec8dab89e13cda6b7d191ba111987df74f38761"}, - {file = "Brotli-1.0.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9749a124280a0ada4187a6cfd1ffd35c350fb3af79c706589d98e088c5044267"}, - {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:73fd30d4ce0ea48010564ccee1a26bfe39323fde05cb34b5863455629db61dc7"}, - {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02177603aaca36e1fd21b091cb742bb3b305a569e2402f1ca38af471777fb019"}, - {file = "Brotli-1.0.9-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:76ffebb907bec09ff511bb3acc077695e2c32bc2142819491579a695f77ffd4d"}, - {file = "Brotli-1.0.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b43775532a5904bc938f9c15b77c613cb6ad6fb30990f3b0afaea82797a402d8"}, - {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5bf37a08493232fbb0f8229f1824b366c2fc1d02d64e7e918af40acd15f3e337"}, - {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:330e3f10cd01da535c70d09c4283ba2df5fb78e915bea0a28becad6e2ac010be"}, - {file = "Brotli-1.0.9-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e1abbeef02962596548382e393f56e4c94acd286bd0c5afba756cffc33670e8a"}, - {file = "Brotli-1.0.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3148362937217b7072cf80a2dcc007f09bb5ecb96dae4617316638194113d5be"}, - {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:336b40348269f9b91268378de5ff44dc6fbaa2268194f85177b53463d313842a"}, - {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b8b09a16a1950b9ef495a0f8b9d0a87599a9d1f179e2d4ac014b2ec831f87e7"}, - {file = "Brotli-1.0.9-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c8e521a0ce7cf690ca84b8cc2272ddaf9d8a50294fd086da67e517439614c755"}, - {file = "Brotli-1.0.9.zip", hash = "sha256:4d1b810aa0ed773f81dceda2cc7b403d01057458730e309856356d4ef4188438"}, -] - -[[package]] -name = "certifi" -version = "2020.12.5" -description = "Python package for providing Mozilla's CA Bundle." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, - {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, -] - -[[package]] -name = "cffi" -version = "1.15.1" -description = "Foreign Function Interface for Python calling C code." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, -] - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "chardet" -version = "3.0.4" -description = "Universal encoding detector for Python 2 and 3" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, - {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, -] - -[[package]] -name = "charset-normalizer" -version = "3.2.0" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, -] - -[[package]] -name = "click" -version = "7.1.2" -description = "Composable command line interface toolkit" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, -] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "cryptography" -version = "3.2.1" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -files = [ - {file = "cryptography-3.2.1-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:6dc59630ecce8c1f558277ceb212c751d6730bd12c80ea96b4ac65637c4f55e7"}, - {file = "cryptography-3.2.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:75e8e6684cf0034f6bf2a97095cb95f81537b12b36a8fedf06e73050bb171c2d"}, - {file = "cryptography-3.2.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4e7268a0ca14536fecfdf2b00297d4e407da904718658c1ff1961c713f90fd33"}, - {file = "cryptography-3.2.1-cp27-cp27m-win32.whl", hash = "sha256:7117319b44ed1842c617d0a452383a5a052ec6aa726dfbaffa8b94c910444297"}, - {file = "cryptography-3.2.1-cp27-cp27m-win_amd64.whl", hash = "sha256:a733671100cd26d816eed39507e585c156e4498293a907029969234e5e634bc4"}, - {file = "cryptography-3.2.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a75f306a16d9f9afebfbedc41c8c2351d8e61e818ba6b4c40815e2b5740bb6b8"}, - {file = "cryptography-3.2.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:5849d59358547bf789ee7e0d7a9036b2d29e9a4ddf1ce5e06bb45634f995c53e"}, - {file = "cryptography-3.2.1-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:bd717aa029217b8ef94a7d21632a3bb5a4e7218a4513d2521c2a2fd63011e98b"}, - {file = "cryptography-3.2.1-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:efe15aca4f64f3a7ea0c09c87826490e50ed166ce67368a68f315ea0807a20df"}, - {file = "cryptography-3.2.1-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:32434673d8505b42c0de4de86da8c1620651abd24afe91ae0335597683ed1b77"}, - {file = "cryptography-3.2.1-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:7b8d9d8d3a9bd240f453342981f765346c87ade811519f98664519696f8e6ab7"}, - {file = "cryptography-3.2.1-cp35-cp35m-win32.whl", hash = "sha256:d3545829ab42a66b84a9aaabf216a4dce7f16dbc76eb69be5c302ed6b8f4a29b"}, - {file = "cryptography-3.2.1-cp35-cp35m-win_amd64.whl", hash = "sha256:a4e27ed0b2504195f855b52052eadcc9795c59909c9d84314c5408687f933fc7"}, - {file = "cryptography-3.2.1-cp36-abi3-win32.whl", hash = "sha256:13b88a0bd044b4eae1ef40e265d006e34dbcde0c2f1e15eb9896501b2d8f6c6f"}, - {file = "cryptography-3.2.1-cp36-abi3-win_amd64.whl", hash = "sha256:07ca431b788249af92764e3be9a488aa1d39a0bc3be313d826bbec690417e538"}, - {file = "cryptography-3.2.1-cp36-cp36m-win32.whl", hash = "sha256:a035a10686532b0587d58a606004aa20ad895c60c4d029afa245802347fab57b"}, - {file = "cryptography-3.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:d26a2557d8f9122f9bf445fc7034242f4375bd4e95ecda007667540270965b13"}, - {file = "cryptography-3.2.1-cp37-cp37m-win32.whl", hash = "sha256:545a8550782dda68f8cdc75a6e3bf252017aa8f75f19f5a9ca940772fc0cb56e"}, - {file = "cryptography-3.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:55d0b896631412b6f0c7de56e12eb3e261ac347fbaa5d5e705291a9016e5f8cb"}, - {file = "cryptography-3.2.1-cp38-cp38-win32.whl", hash = "sha256:3cd75a683b15576cfc822c7c5742b3276e50b21a06672dc3a800a2d5da4ecd1b"}, - {file = "cryptography-3.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:d25cecbac20713a7c3bc544372d42d8eafa89799f492a43b79e1dfd650484851"}, - {file = "cryptography-3.2.1.tar.gz", hash = "sha256:d3d5e10be0cf2a12214ddee45c6bd203dab435e3d83b4560c03066eda600bfe3"}, -] - -[package.dependencies] -cffi = ">=1.8,<1.11.3 || >1.11.3" -six = ">=1.4.1" - -[package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["doc8", "pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=3.6.0,!=3.9.0,!=3.9.1,!=3.9.2)", "pytz"] - -[[package]] -name = "distro" -version = "1.8.0" -description = "Distro - an OS platform information API" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "distro-1.8.0-py3-none-any.whl", hash = "sha256:99522ca3e365cac527b44bde033f64c6945d90eb9f769703caaec52b09bbd3ff"}, - {file = "distro-1.8.0.tar.gz", hash = "sha256:02e111d1dc6a50abb8eed6bf31c3e48ed8b0830d1ea2a1b78c61765c2513fdd8"}, -] - -[[package]] -name = "docker" -version = "5.0.3" -description = "A Python library for the Docker Engine API." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "docker-5.0.3-py2.py3-none-any.whl", hash = "sha256:7a79bb439e3df59d0a72621775d600bc8bc8b422d285824cb37103eab91d1ce0"}, - {file = "docker-5.0.3.tar.gz", hash = "sha256:d916a26b62970e7c2f554110ed6af04c7ccff8e9f81ad17d0d40c75637e227fb"}, -] - -[package.dependencies] -paramiko = {version = ">=2.4.2", optional = true, markers = "extra == \"ssh\""} -pywin32 = {version = "227", markers = "sys_platform == \"win32\""} -requests = ">=2.14.2,<2.18.0 || >2.18.0" -websocket-client = ">=0.32.0" - -[package.extras] -ssh = ["paramiko (>=2.4.2)"] -tls = ["cryptography (>=3.4.7)", "idna (>=2.0.0)", "pyOpenSSL (>=17.5.0)"] - -[[package]] -name = "docker-compose" -version = "1.29.2" -description = "Multi-container orchestration for Docker" -category = "main" -optional = false -python-versions = ">=3.4" -files = [ - {file = "docker-compose-1.29.2.tar.gz", hash = "sha256:4c8cd9d21d237412793d18bd33110049ee9af8dab3fe2c213bbd0733959b09b7"}, - {file = "docker_compose-1.29.2-py2.py3-none-any.whl", hash = "sha256:8d5589373b35c8d3b1c8c1182c6e4a4ff14bffa3dd0b605fcd08f73c94cef809"}, -] - -[package.dependencies] -colorama = {version = ">=0.4,<1", markers = "sys_platform == \"win32\""} -distro = ">=1.5.0,<2" -docker = {version = ">=5", extras = ["ssh"]} -dockerpty = ">=0.4.1,<1" -docopt = ">=0.6.1,<1" -jsonschema = ">=2.5.1,<4" -python-dotenv = ">=0.13.0,<1" -PyYAML = ">=3.10,<6" -requests = ">=2.20.0,<3" -texttable = ">=0.9.0,<2" -websocket-client = ">=0.32.0,<1" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2)"] -tests = ["ddt (>=1.2.2,<2)", "pytest (<6)"] - -[[package]] -name = "dockerpty" -version = "0.4.1" -description = "Python library to use the pseudo-tty of a docker container" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "dockerpty-0.4.1.tar.gz", hash = "sha256:69a9d69d573a0daa31bcd1c0774eeed5c15c295fe719c61aca550ed1393156ce"}, -] - -[package.dependencies] -six = ">=1.3.0" - -[[package]] -name = "docopt" -version = "0.6.2" -description = "Pythonic argument parser, that will make you smile" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, -] - -[[package]] -name = "dpath" -version = "2.1.6" -description = "Filesystem-like pathing and searching for dictionaries" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "dpath-2.1.6-py3-none-any.whl", hash = "sha256:31407395b177ab63ef72e2f6ae268c15e938f2990a8ecf6510f5686c02b6db73"}, - {file = "dpath-2.1.6.tar.gz", hash = "sha256:f1e07c72e8605c6a9e80b64bc8f42714de08a789c7de417e49c3f87a19692e47"}, -] - -[[package]] -name = "fastcore" -version = "1.5.29" -description = "Python supercharged for fastai development" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "fastcore-1.5.29-py3-none-any.whl", hash = "sha256:a7d7e89faf968f2d8584df2deca344c3974f6cf476e1299cd3c067d8fa7440e9"}, - {file = "fastcore-1.5.29.tar.gz", hash = "sha256:f1a2eb04eb7933f3f9eb4064852817df44dc96e20fab5658c14c035815269a3f"}, -] - -[package.dependencies] -packaging = "*" -pip = "*" - -[package.extras] -dev = ["jupyterlab", "matplotlib", "nbdev (>=0.2.39)", "numpy", "pandas", "pillow", "torch"] - -[[package]] -name = "flask" -version = "1.1.4" -description = "A simple framework for building complex web applications." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "Flask-1.1.4-py2.py3-none-any.whl", hash = "sha256:c34f04500f2cbbea882b1acb02002ad6fe6b7ffa64a6164577995657f50aed22"}, - {file = "Flask-1.1.4.tar.gz", hash = "sha256:0fbeb6180d383a9186d0d6ed954e0042ad9f18e0e8de088b2b419d526927d196"}, -] - -[package.dependencies] -click = ">=5.1,<8.0" -itsdangerous = ">=0.24,<2.0" -Jinja2 = ">=2.10.1,<3.0" -Werkzeug = ">=0.15,<2.0" - -[package.extras] -dev = ["coverage", "pallets-sphinx-themes", "pytest", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet", "tox"] -docs = ["pallets-sphinx-themes", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet"] -dotenv = ["python-dotenv"] - -[[package]] -name = "func-timeout" -version = "4.3.5" -description = "Python module which allows you to specify timeouts when calling any existing function. Also provides support for stoppable-threads" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "func_timeout-4.3.5.tar.gz", hash = "sha256:74cd3c428ec94f4edfba81f9b2f14904846d5ffccc27c92433b8b5939b5575dd"}, -] - -[[package]] -name = "ghapi" -version = "0.1.23" -description = "A python client for the GitHub API" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "ghapi-0.1.23-py3-none-any.whl", hash = "sha256:492b5f82b5d4844a0297c8ae6afda638432cee6c74b0bd0a0458b35d19b92b5e"}, - {file = "ghapi-0.1.23.tar.gz", hash = "sha256:93fa097e394d743c6702e217d588a4123696f62d055f2acc495166676843d59f"}, -] - -[package.dependencies] -fastcore = ">=1.5.4" -packaging = "*" -pip = "*" - -[package.extras] -dev = ["jsonref"] - -[[package]] -name = "goth" -version = "0.15.1" -description = "Golem Test Harness - integration testing framework" -category = "main" -optional = false -python-versions = "^3.8" -files = [] -develop = false - -[package.dependencies] -aiohttp = "3.7.4" -ansicolors = "^1.1.0" -docker = "^5.0" -docker-compose = "^1.29" -dpath = "^2.0" -func_timeout = "4.3.5" -ghapi = "^0.1.16" -markupsafe = "2.0.1" -mitmproxy = "^5.3" -pyyaml = "^5.4" -transitions = "^0.8" -typing_extensions = "^3.10.0" -urllib3 = "^1.26" -ya-aioclient = "^0.6" - -[package.source] -type = "git" -url = "https://github.com/golemfactory/goth.git" -reference = "7033689d4200bde527666dcfe09db4fb72b708ac" -resolved_reference = "7033689d4200bde527666dcfe09db4fb72b708ac" - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "h2" -version = "4.1.0" -description = "HTTP/2 State-Machine based protocol implementation" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, - {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, -] - -[package.dependencies] -hpack = ">=4.0,<5" -hyperframe = ">=6.0,<7" - -[[package]] -name = "hpack" -version = "4.0.0" -description = "Pure-Python HPACK header compression" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, - {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, -] - -[[package]] -name = "hyperframe" -version = "6.0.1" -description = "HTTP/2 framing layer for Python" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, - {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, -] - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "itsdangerous" -version = "1.1.0" -description = "Various helpers to pass data to untrusted environments and back." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"}, - {file = "itsdangerous-1.1.0.tar.gz", hash = "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19"}, -] - -[[package]] -name = "jinja2" -version = "2.11.3" -description = "A very fast and expressive template engine." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, - {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, -] - -[package.dependencies] -MarkupSafe = ">=0.23" - -[package.extras] -i18n = ["Babel (>=0.8)"] - -[[package]] -name = "jsonschema" -version = "3.2.0" -description = "An implementation of JSON Schema validation for Python" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, - {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, -] - -[package.dependencies] -attrs = ">=17.4.0" -pyrsistent = ">=0.14.0" -setuptools = "*" -six = ">=1.11.0" - -[package.extras] -format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] -format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] - -[[package]] -name = "kaitaistruct" -version = "0.9" -description = "Kaitai Struct declarative parser generator for binary data: runtime library for Python" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -files = [ - {file = "kaitaistruct-0.9.tar.gz", hash = "sha256:3d5845817ec8a4d5504379cc11bd570b038850ee49c4580bc0998c8fb1d327ad"}, -] - -[[package]] -name = "ldap3" -version = "2.8.1" -description = "A strictly RFC 4510 conforming LDAP V3 pure Python client library" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "ldap3-2.8.1-py2.py3-none-any.whl", hash = "sha256:7c3738570766f5e5e74a56fade15470f339d5c436d821cf476ef27da0a4de8b0"}, - {file = "ldap3-2.8.1.tar.gz", hash = "sha256:37d633e20fa360c302b1263c96fe932d40622d0119f1bddcb829b03462eeeeb7"}, -] - -[package.dependencies] -pyasn1 = ">=0.4.6" - -[[package]] -name = "markupsafe" -version = "2.0.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, -] - -[[package]] -name = "mitmproxy" -version = "5.3.0" -description = "An interactive, SSL/TLS-capable intercepting proxy for HTTP/1, HTTP/2, and WebSockets." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "mitmproxy-5.3.0-py3-none-any.whl", hash = "sha256:481940365fc08fc2318343e530ef01d35084e8b56d1c61b5e1a7b6ed9b664d24"}, -] - -[package.dependencies] -asgiref = ">=3.2.10,<3.4" -blinker = ">=1.4,<1.5" -Brotli = ">=1.0,<1.1" -certifi = ">=2019.9.11" -click = ">=7.0,<8" -cryptography = ">=3.2,<3.3" -flask = ">=1.1.1,<1.2" -h2 = {version = ">=4.0,<5", markers = "python_version >= \"3.6.0\""} -hyperframe = {version = ">=6.0,<7", markers = "python_version >= \"3.6.0\""} -kaitaistruct = ">=0.7,<0.10" -ldap3 = ">=2.8,<2.9" -msgpack = ">=1.0.0,<1.1.0" -passlib = ">=1.6.5,<1.8" -protobuf = ">=3.6.0,<3.14" -publicsuffix2 = ">=2.20190812,<3" -pyasn1 = ">=0.3.1,<0.5" -pydivert = {version = ">=2.0.3,<2.2", markers = "sys_platform == \"win32\""} -pyOpenSSL = ">=19.1.0,<19.2" -pyparsing = ">=2.4.2,<2.5" -pyperclip = ">=1.6.0,<1.9" -"ruamel.yaml" = ">=0.16,<0.17" -sortedcontainers = ">=2.1,<2.3" -tornado = ">=4.3,<7" -urwid = ">=2.1.1,<2.2" -wsproto = ">=0.14,<0.16" -zstandard = ">=0.11,<0.15" - -[package.extras] -dev = ["Flask (>=1.0,<1.2)", "asynctest (>=0.12.0)", "hypothesis (>=5.8,<6)", "parver (>=0.1,<2.0)", "pytest (>=6.1.0,<7)", "pytest-asyncio (>=0.10.0,<0.14)", "pytest-cov (>=2.7.1,<3)", "pytest-timeout (>=1.3.3,<2)", "pytest-xdist (>=2.1.0,<3)", "requests (>=2.9.1,<3)", "tox (>=3.5,<4)"] - -[[package]] -name = "msgpack" -version = "1.0.5" -description = "MessagePack serializer" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:525228efd79bb831cf6830a732e2e80bc1b05436b086d4264814b4b2955b2fa9"}, - {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f8d8b3bf1ff2672567d6b5c725a1b347fe838b912772aa8ae2bf70338d5a198"}, - {file = "msgpack-1.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdc793c50be3f01106245a61b739328f7dccc2c648b501e237f0699fe1395b81"}, - {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cb47c21a8a65b165ce29f2bec852790cbc04936f502966768e4aae9fa763cb7"}, - {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e42b9594cc3bf4d838d67d6ed62b9e59e201862a25e9a157019e171fbe672dd3"}, - {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:55b56a24893105dc52c1253649b60f475f36b3aa0fc66115bffafb624d7cb30b"}, - {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1967f6129fc50a43bfe0951c35acbb729be89a55d849fab7686004da85103f1c"}, - {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20a97bf595a232c3ee6d57ddaadd5453d174a52594bf9c21d10407e2a2d9b3bd"}, - {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d25dd59bbbbb996eacf7be6b4ad082ed7eacc4e8f3d2df1ba43822da9bfa122a"}, - {file = "msgpack-1.0.5-cp310-cp310-win32.whl", hash = "sha256:382b2c77589331f2cb80b67cc058c00f225e19827dbc818d700f61513ab47bea"}, - {file = "msgpack-1.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:4867aa2df9e2a5fa5f76d7d5565d25ec76e84c106b55509e78c1ede0f152659a"}, - {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9f5ae84c5c8a857ec44dc180a8b0cc08238e021f57abdf51a8182e915e6299f0"}, - {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e6ca5d5699bcd89ae605c150aee83b5321f2115695e741b99618f4856c50898"}, - {file = "msgpack-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5494ea30d517a3576749cad32fa27f7585c65f5f38309c88c6d137877fa28a5a"}, - {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ab2f3331cb1b54165976a9d976cb251a83183631c88076613c6c780f0d6e45a"}, - {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28592e20bbb1620848256ebc105fc420436af59515793ed27d5c77a217477705"}, - {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe5c63197c55bce6385d9aee16c4d0641684628f63ace85f73571e65ad1c1e8d"}, - {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed40e926fa2f297e8a653c954b732f125ef97bdd4c889f243182299de27e2aa9"}, - {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b2de4c1c0538dcb7010902a2b97f4e00fc4ddf2c8cda9749af0e594d3b7fa3d7"}, - {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bf22a83f973b50f9d38e55c6aade04c41ddda19b00c4ebc558930d78eecc64ed"}, - {file = "msgpack-1.0.5-cp311-cp311-win32.whl", hash = "sha256:c396e2cc213d12ce017b686e0f53497f94f8ba2b24799c25d913d46c08ec422c"}, - {file = "msgpack-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c4c68d87497f66f96d50142a2b73b97972130d93677ce930718f68828b382e2"}, - {file = "msgpack-1.0.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a2b031c2e9b9af485d5e3c4520f4220d74f4d222a5b8dc8c1a3ab9448ca79c57"}, - {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f837b93669ce4336e24d08286c38761132bc7ab29782727f8557e1eb21b2080"}, - {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1d46dfe3832660f53b13b925d4e0fa1432b00f5f7210eb3ad3bb9a13c6204a6"}, - {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:366c9a7b9057e1547f4ad51d8facad8b406bab69c7d72c0eb6f529cf76d4b85f"}, - {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4c075728a1095efd0634a7dccb06204919a2f67d1893b6aa8e00497258bf926c"}, - {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:f933bbda5a3ee63b8834179096923b094b76f0c7a73c1cfe8f07ad608c58844b"}, - {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:36961b0568c36027c76e2ae3ca1132e35123dcec0706c4b7992683cc26c1320c"}, - {file = "msgpack-1.0.5-cp36-cp36m-win32.whl", hash = "sha256:b5ef2f015b95f912c2fcab19c36814963b5463f1fb9049846994b007962743e9"}, - {file = "msgpack-1.0.5-cp36-cp36m-win_amd64.whl", hash = "sha256:288e32b47e67f7b171f86b030e527e302c91bd3f40fd9033483f2cacc37f327a"}, - {file = "msgpack-1.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:137850656634abddfb88236008339fdaba3178f4751b28f270d2ebe77a563b6c"}, - {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c05a4a96585525916b109bb85f8cb6511db1c6f5b9d9cbcbc940dc6b4be944b"}, - {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56a62ec00b636583e5cb6ad313bbed36bb7ead5fa3a3e38938503142c72cba4f"}, - {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef8108f8dedf204bb7b42994abf93882da1159728a2d4c5e82012edd92c9da9f"}, - {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1835c84d65f46900920b3708f5ba829fb19b1096c1800ad60bae8418652a951d"}, - {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e57916ef1bd0fee4f21c4600e9d1da352d8816b52a599c46460e93a6e9f17086"}, - {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:17358523b85973e5f242ad74aa4712b7ee560715562554aa2134d96e7aa4cbbf"}, - {file = "msgpack-1.0.5-cp37-cp37m-win32.whl", hash = "sha256:cb5aaa8c17760909ec6cb15e744c3ebc2ca8918e727216e79607b7bbce9c8f77"}, - {file = "msgpack-1.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:ab31e908d8424d55601ad7075e471b7d0140d4d3dd3272daf39c5c19d936bd82"}, - {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b72d0698f86e8d9ddf9442bdedec15b71df3598199ba33322d9711a19f08145c"}, - {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:379026812e49258016dd84ad79ac8446922234d498058ae1d415f04b522d5b2d"}, - {file = "msgpack-1.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:332360ff25469c346a1c5e47cbe2a725517919892eda5cfaffe6046656f0b7bb"}, - {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:476a8fe8fae289fdf273d6d2a6cb6e35b5a58541693e8f9f019bfe990a51e4ba"}, - {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9985b214f33311df47e274eb788a5893a761d025e2b92c723ba4c63936b69b1"}, - {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48296af57cdb1d885843afd73c4656be5c76c0c6328db3440c9601a98f303d87"}, - {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:addab7e2e1fcc04bd08e4eb631c2a90960c340e40dfc4a5e24d2ff0d5a3b3edb"}, - {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:916723458c25dfb77ff07f4c66aed34e47503b2eb3188b3adbec8d8aa6e00f48"}, - {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:821c7e677cc6acf0fd3f7ac664c98803827ae6de594a9f99563e48c5a2f27eb0"}, - {file = "msgpack-1.0.5-cp38-cp38-win32.whl", hash = "sha256:1c0f7c47f0087ffda62961d425e4407961a7ffd2aa004c81b9c07d9269512f6e"}, - {file = "msgpack-1.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:bae7de2026cbfe3782c8b78b0db9cbfc5455e079f1937cb0ab8d133496ac55e1"}, - {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:20c784e66b613c7f16f632e7b5e8a1651aa5702463d61394671ba07b2fc9e025"}, - {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:266fa4202c0eb94d26822d9bfd7af25d1e2c088927fe8de9033d929dd5ba24c5"}, - {file = "msgpack-1.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18334484eafc2b1aa47a6d42427da7fa8f2ab3d60b674120bce7a895a0a85bdd"}, - {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57e1f3528bd95cc44684beda696f74d3aaa8a5e58c816214b9046512240ef437"}, - {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:586d0d636f9a628ddc6a17bfd45aa5b5efaf1606d2b60fa5d87b8986326e933f"}, - {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a740fa0e4087a734455f0fc3abf5e746004c9da72fbd541e9b113013c8dc3282"}, - {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3055b0455e45810820db1f29d900bf39466df96ddca11dfa6d074fa47054376d"}, - {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a61215eac016f391129a013c9e46f3ab308db5f5ec9f25811e811f96962599a8"}, - {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:362d9655cd369b08fda06b6657a303eb7172d5279997abe094512e919cf74b11"}, - {file = "msgpack-1.0.5-cp39-cp39-win32.whl", hash = "sha256:ac9dd47af78cae935901a9a500104e2dea2e253207c924cc95de149606dc43cc"}, - {file = "msgpack-1.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:06f5174b5f8ed0ed919da0e62cbd4ffde676a374aba4020034da05fab67b9164"}, - {file = "msgpack-1.0.5.tar.gz", hash = "sha256:c075544284eadc5cddc70f4757331d99dcbc16b2bbd4849d15f8aae4cf36d31c"}, -] - -[[package]] -name = "multidict" -version = "6.0.4" -description = "multidict implementation" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, -] - -[[package]] -name = "mypy" -version = "0.782" -description = "Optional static typing for Python" -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy-0.782-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:2c6cde8aa3426c1682d35190b59b71f661237d74b053822ea3d748e2c9578a7c"}, - {file = "mypy-0.782-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9c7a9a7ceb2871ba4bac1cf7217a7dd9ccd44c27c2950edbc6dc08530f32ad4e"}, - {file = "mypy-0.782-cp35-cp35m-win_amd64.whl", hash = "sha256:c05b9e4fb1d8a41d41dec8786c94f3b95d3c5f528298d769eb8e73d293abc48d"}, - {file = "mypy-0.782-cp36-cp36m-macosx_10_6_x86_64.whl", hash = "sha256:6731603dfe0ce4352c555c6284c6db0dc935b685e9ce2e4cf220abe1e14386fd"}, - {file = "mypy-0.782-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:f05644db6779387ccdb468cc47a44b4356fc2ffa9287135d05b70a98dc83b89a"}, - {file = "mypy-0.782-cp36-cp36m-win_amd64.whl", hash = "sha256:b7fbfabdbcc78c4f6fc4712544b9b0d6bf171069c6e0e3cb82440dd10ced3406"}, - {file = "mypy-0.782-cp37-cp37m-macosx_10_6_x86_64.whl", hash = "sha256:3fdda71c067d3ddfb21da4b80e2686b71e9e5c72cca65fa216d207a358827f86"}, - {file = "mypy-0.782-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d7df6eddb6054d21ca4d3c6249cae5578cb4602951fd2b6ee2f5510ffb098707"}, - {file = "mypy-0.782-cp37-cp37m-win_amd64.whl", hash = "sha256:a4a2cbcfc4cbf45cd126f531dedda8485671545b43107ded25ce952aac6fb308"}, - {file = "mypy-0.782-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6bb93479caa6619d21d6e7160c552c1193f6952f0668cdda2f851156e85186fc"}, - {file = "mypy-0.782-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:81c7908b94239c4010e16642c9102bfc958ab14e36048fa77d0be3289dda76ea"}, - {file = "mypy-0.782-cp38-cp38-win_amd64.whl", hash = "sha256:5dd13ff1f2a97f94540fd37a49e5d255950ebcdf446fb597463a40d0df3fac8b"}, - {file = "mypy-0.782-py3-none-any.whl", hash = "sha256:e0b61738ab504e656d1fe4ff0c0601387a5489ca122d55390ade31f9ca0e252d"}, - {file = "mypy-0.782.tar.gz", hash = "sha256:eff7d4a85e9eea55afa34888dfeaccde99e7520b51f867ac28a48492c0b1130c"}, -] - -[package.dependencies] -mypy-extensions = ">=0.4.3,<0.5.0" -typed-ast = ">=1.4.0,<1.5.0" -typing-extensions = ">=3.7.4" - -[package.extras] -dmypy = ["psutil (>=4.0)"] - -[[package]] -name = "mypy-extensions" -version = "0.4.4" -description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "dev" -optional = false -python-versions = ">=2.7" -files = [ - {file = "mypy_extensions-0.4.4.tar.gz", hash = "sha256:c8b707883a96efe9b4bb3aaf0dcc07e7e217d7d8368eec4db4049ee9e142f4fd"}, -] - -[[package]] -name = "packaging" -version = "23.1" -description = "Core utilities for Python packages" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, -] - -[[package]] -name = "paramiko" -version = "2.12.0" -description = "SSH2 protocol library" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "paramiko-2.12.0-py2.py3-none-any.whl", hash = "sha256:b2df1a6325f6996ef55a8789d0462f5b502ea83b3c990cbb5bbe57345c6812c4"}, - {file = "paramiko-2.12.0.tar.gz", hash = "sha256:376885c05c5d6aa6e1f4608aac2a6b5b0548b1add40274477324605903d9cd49"}, -] - -[package.dependencies] -bcrypt = ">=3.1.3" -cryptography = ">=2.5" -pynacl = ">=1.0.1" -six = "*" - -[package.extras] -all = ["bcrypt (>=3.1.3)", "gssapi (>=1.4.1)", "invoke (>=1.3)", "pyasn1 (>=0.1.7)", "pynacl (>=1.0.1)", "pywin32 (>=2.1.8)"] -ed25519 = ["bcrypt (>=3.1.3)", "pynacl (>=1.0.1)"] -gssapi = ["gssapi (>=1.4.1)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] -invoke = ["invoke (>=1.3)"] - -[[package]] -name = "passlib" -version = "1.7.4" -description = "comprehensive password hashing framework supporting over 30 schemes" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, - {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, -] - -[package.extras] -argon2 = ["argon2-cffi (>=18.2.0)"] -bcrypt = ["bcrypt (>=3.1.0)"] -build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"] -totp = ["cryptography"] - -[[package]] -name = "pastel" -version = "0.2.1" -description = "Bring colors to your terminal." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, - {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, -] - -[[package]] -name = "pathspec" -version = "0.11.2" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, -] - -[[package]] -name = "pip" -version = "23.2.1" -description = "The PyPA recommended tool for installing Python packages." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pip-23.2.1-py3-none-any.whl", hash = "sha256:7ccf472345f20d35bdc9d1841ff5f313260c2c33fe417f48c30ac46cccabf5be"}, - {file = "pip-23.2.1.tar.gz", hash = "sha256:fb0bd5435b3200c602b5bf61d2d43c2f13c02e29c1707567ae7fbc514eb9faf2"}, -] - -[[package]] -name = "pluggy" -version = "1.3.0" -description = "plugin and hook calling mechanisms for python" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "poethepoet" -version = "0.10.0" -description = "A task runner that works well with poetry." -category = "dev" -optional = false -python-versions = ">=3.6,<4.0" -files = [ - {file = "poethepoet-0.10.0-py3-none-any.whl", hash = "sha256:6fb3021603d4421c6fcc40072bbcf150a6c52ef70ff4d3be089b8b04e015ef5a"}, - {file = "poethepoet-0.10.0.tar.gz", hash = "sha256:70b97cb194b978dc464c70793e85e6f746cddf82b84a38bfb135946ad71ae19c"}, -] - -[package.dependencies] -pastel = ">=0.2.0,<0.3.0" -tomlkit = ">=0.6.0,<1.0.0" - -[[package]] -name = "protobuf" -version = "3.13.0" -description = "Protocol Buffers" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "protobuf-3.13.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9c2e63c1743cba12737169c447374fab3dfeb18111a460a8c1a000e35836b18c"}, - {file = "protobuf-3.13.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1e834076dfef9e585815757a2c7e4560c7ccc5962b9d09f831214c693a91b463"}, - {file = "protobuf-3.13.0-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:df3932e1834a64b46ebc262e951cd82c3cf0fa936a154f0a42231140d8237060"}, - {file = "protobuf-3.13.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8c35bcbed1c0d29b127c886790e9d37e845ffc2725cc1db4bd06d70f4e8359f4"}, - {file = "protobuf-3.13.0-cp35-cp35m-win32.whl", hash = "sha256:339c3a003e3c797bc84499fa32e0aac83c768e67b3de4a5d7a5a9aa3b0da634c"}, - {file = "protobuf-3.13.0-cp35-cp35m-win_amd64.whl", hash = "sha256:361acd76f0ad38c6e38f14d08775514fbd241316cce08deb2ce914c7dfa1184a"}, - {file = "protobuf-3.13.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9edfdc679a3669988ec55a989ff62449f670dfa7018df6ad7f04e8dbacb10630"}, - {file = "protobuf-3.13.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5db9d3e12b6ede5e601b8d8684a7f9d90581882925c96acf8495957b4f1b204b"}, - {file = "protobuf-3.13.0-cp36-cp36m-win32.whl", hash = "sha256:c8abd7605185836f6f11f97b21200f8a864f9cb078a193fe3c9e235711d3ff1e"}, - {file = "protobuf-3.13.0-cp36-cp36m-win_amd64.whl", hash = "sha256:4d1174c9ed303070ad59553f435846a2f877598f59f9afc1b89757bdf846f2a7"}, - {file = "protobuf-3.13.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0bba42f439bf45c0f600c3c5993666fcb88e8441d011fad80a11df6f324eef33"}, - {file = "protobuf-3.13.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c0c5ab9c4b1eac0a9b838f1e46038c3175a95b0f2d944385884af72876bd6bc7"}, - {file = "protobuf-3.13.0-cp37-cp37m-win32.whl", hash = "sha256:f68eb9d03c7d84bd01c790948320b768de8559761897763731294e3bc316decb"}, - {file = "protobuf-3.13.0-cp37-cp37m-win_amd64.whl", hash = "sha256:91c2d897da84c62816e2f473ece60ebfeab024a16c1751aaf31100127ccd93ec"}, - {file = "protobuf-3.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3dee442884a18c16d023e52e32dd34a8930a889e511af493f6dc7d4d9bf12e4f"}, - {file = "protobuf-3.13.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:e7662437ca1e0c51b93cadb988f9b353fa6b8013c0385d63a70c8a77d84da5f9"}, - {file = "protobuf-3.13.0-py2.py3-none-any.whl", hash = "sha256:d69697acac76d9f250ab745b46c725edf3e98ac24763990b24d58c16c642947a"}, - {file = "protobuf-3.13.0.tar.gz", hash = "sha256:6a82e0c8bb2bf58f606040cc5814e07715b2094caeba281e2e7d0b0e2e397db5"}, -] - -[package.dependencies] -setuptools = "*" -six = ">=1.9" - -[[package]] -name = "publicsuffix2" -version = "2.20191221" -description = "Get a public suffix for a domain name using the Public Suffix List. Forked from and using the same API as the publicsuffix package." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "publicsuffix2-2.20191221-py2.py3-none-any.whl", hash = "sha256:786b5e36205b88758bd3518725ec8cfe7a8173f5269354641f581c6b80a99893"}, - {file = "publicsuffix2-2.20191221.tar.gz", hash = "sha256:00f8cc31aa8d0d5592a5ced19cccba7de428ebca985db26ac852d920ddd6fe7b"}, -] - -[[package]] -name = "py" -version = "1.11.0" -description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] - -[[package]] -name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, -] - -[[package]] -name = "pycparser" -version = "2.21" -description = "C parser in Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] - -[[package]] -name = "pydivert" -version = "2.1.0" -description = "Python binding to windivert driver" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pydivert-2.1.0-py2.py3-none-any.whl", hash = "sha256:382db488e3c37c03ec9ec94e061a0b24334d78dbaeebb7d4e4d32ce4355d9da1"}, - {file = "pydivert-2.1.0.tar.gz", hash = "sha256:f0e150f4ff591b78e35f514e319561dadff7f24a82186a171dd4d465483de5b4"}, -] - -[package.extras] -docs = ["sphinx (>=1.4.8)"] -test = ["codecov (>=2.0.5)", "hypothesis (>=3.5.3)", "mock (>=1.0.1)", "pytest (>=3.0.3)", "pytest-cov (>=2.2.1)", "pytest-faulthandler (>=1.3.0,<2)", "pytest-timeout (>=1.0.0,<2)", "wheel (>=0.29)"] - -[[package]] -name = "pynacl" -version = "1.5.0" -description = "Python binding to the Networking and Cryptography (NaCl) library" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, - {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, - {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, - {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, - {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, - {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, -] - -[package.dependencies] -cffi = ">=1.4.1" - -[package.extras] -docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] -tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] - -[[package]] -name = "pyopenssl" -version = "19.1.0" -description = "Python wrapper module around the OpenSSL library" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pyOpenSSL-19.1.0-py2.py3-none-any.whl", hash = "sha256:621880965a720b8ece2f1b2f54ea2071966ab00e2970ad2ce11d596102063504"}, - {file = "pyOpenSSL-19.1.0.tar.gz", hash = "sha256:9a24494b2602aaf402be5c9e30a0b82d4a5c67528fe8fb475e3f3bc00dd69507"}, -] - -[package.dependencies] -cryptography = ">=2.8" -six = ">=1.5.2" - -[package.extras] -docs = ["sphinx", "sphinx-rtd-theme"] -test = ["flaky", "pretend", "pytest (>=3.0.1)"] - -[[package]] -name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] - -[[package]] -name = "pyperclip" -version = "1.8.2" -description = "A cross-platform clipboard module for Python. (Only handles plain text for now.)" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pyperclip-1.8.2.tar.gz", hash = "sha256:105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57"}, -] - -[[package]] -name = "pyrsistent" -version = "0.19.3" -description = "Persistent/Functional/Immutable data structures" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, - {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, - {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, - {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, - {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, - {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, - {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, - {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, - {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, - {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, - {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, - {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, - {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, - {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, - {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, - {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, - {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, - {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, - {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, - {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, - {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, - {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, -] - -[[package]] -name = "pytest" -version = "6.2.5" -description = "pytest: simple powerful testing with Python" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] - -[package.dependencies] -atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} -attrs = ">=19.2.0" -colorama = {version = "*", markers = "sys_platform == \"win32\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -py = ">=1.8.2" -toml = "*" - -[package.extras] -testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] - -[[package]] -name = "pytest-asyncio" -version = "0.20.3" -description = "Pytest support for asyncio" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest-asyncio-0.20.3.tar.gz", hash = "sha256:83cbf01169ce3e8eb71c6c278ccb0574d1a7a3bb8eaaf5e50e0ad342afb33b36"}, - {file = "pytest_asyncio-0.20.3-py3-none-any.whl", hash = "sha256:f129998b209d04fcc65c96fc85c11e5316738358909a8399e93be553d7656442"}, -] - -[package.dependencies] -pytest = ">=6.1.0" - -[package.extras] -docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] -testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] - -[[package]] -name = "pytest-rerunfailures" -version = "10.3" -description = "pytest plugin to re-run tests to eliminate flaky failures" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pytest-rerunfailures-10.3.tar.gz", hash = "sha256:d8244d799f89a6edb5e57301ddaeb3b6f10d6691638d51e80b371311592e28c6"}, - {file = "pytest_rerunfailures-10.3-py3-none-any.whl", hash = "sha256:6be6f96510bf94b54198bf15bc5568fe2cdff88e83875912e22d29810acf65ff"}, -] - -[package.dependencies] -packaging = ">=17.1" -pytest = ">=5.3" - -[[package]] -name = "pytest-split" -version = "0.8.1" -description = "Pytest plugin which splits the test suite to equally sized sub suites based on test execution time." -category = "main" -optional = false -python-versions = ">=3.7.1,<4.0" -files = [ - {file = "pytest_split-0.8.1-py3-none-any.whl", hash = "sha256:74b110ea091bd147cc1c5f9665a59506e5cedfa66f96a89fb03e4ab447c2c168"}, - {file = "pytest_split-0.8.1.tar.gz", hash = "sha256:2d88bd3dc528689a7a3f58fc12ea165c3aa62e90795e420dfad920afe5612d6d"}, -] - -[package.dependencies] -pytest = ">=5,<8" - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-dotenv" -version = "0.21.1" -description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "python-dotenv-0.21.1.tar.gz", hash = "sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49"}, - {file = "python_dotenv-0.21.1-py3-none-any.whl", hash = "sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a"}, -] - -[package.extras] -cli = ["click (>=5.0)"] - -[[package]] -name = "pywin32" -version = "227" -description = "Python for Window Extensions" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pywin32-227-cp27-cp27m-win32.whl", hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"}, - {file = "pywin32-227-cp27-cp27m-win_amd64.whl", hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"}, - {file = "pywin32-227-cp35-cp35m-win32.whl", hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"}, - {file = "pywin32-227-cp35-cp35m-win_amd64.whl", hash = "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4"}, - {file = "pywin32-227-cp36-cp36m-win32.whl", hash = "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be"}, - {file = "pywin32-227-cp36-cp36m-win_amd64.whl", hash = "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2"}, - {file = "pywin32-227-cp37-cp37m-win32.whl", hash = "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507"}, - {file = "pywin32-227-cp37-cp37m-win_amd64.whl", hash = "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511"}, - {file = "pywin32-227-cp38-cp38-win32.whl", hash = "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc"}, - {file = "pywin32-227-cp38-cp38-win_amd64.whl", hash = "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e"}, - {file = "pywin32-227-cp39-cp39-win32.whl", hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"}, - {file = "pywin32-227-cp39-cp39-win_amd64.whl", hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"}, -] - -[[package]] -name = "pyyaml" -version = "5.4.1" -description = "YAML parser and emitter for Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, - {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, - {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, - {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, - {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, - {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, - {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, - {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, - {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, -] - -[[package]] -name = "regex" -version = "2023.8.8" -description = "Alternative regular expression module, to replace re." -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, - {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, - {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, - {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, - {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, - {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, - {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, - {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, - {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, - {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, - {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, - {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, - {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, - {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, - {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, - {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, - {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, - {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, - {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, - {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, - {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, - {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, - {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, -] - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "ruamel-yaml" -version = "0.16.13" -description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "ruamel.yaml-0.16.13-py2.py3-none-any.whl", hash = "sha256:64b06e7873eb8e1125525ecef7345447d786368cadca92a7cd9b59eae62e95a3"}, - {file = "ruamel.yaml-0.16.13.tar.gz", hash = "sha256:bb48c514222702878759a05af96f4b7ecdba9b33cd4efcf25c86b882cef3a942"}, -] - -[package.dependencies] -"ruamel.yaml.clib" = {version = ">=0.1.2", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.10\""} - -[package.extras] -docs = ["ryd"] -jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] - -[[package]] -name = "ruamel-yaml-clib" -version = "0.2.7" -description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5859983f26d8cd7bb5c287ef452e8aacc86501487634573d260968f753e1d71"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:debc87a9516b237d0466a711b18b6ebeb17ba9f391eb7f91c649c5c4ec5006c7"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:df5828871e6648db72d1c19b4bd24819b80a755c4541d3409f0f7acd0f335c80"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:efa08d63ef03d079dcae1dfe334f6c8847ba8b645d08df286358b1f5293d24ab"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win32.whl", hash = "sha256:763d65baa3b952479c4e972669f679fe490eee058d5aa85da483ebae2009d231"}, - {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:d000f258cf42fec2b1bbf2863c61d7b8918d31ffee905da62dede869254d3b8a"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:045e0626baf1c52e5527bd5db361bc83180faaba2ff586e763d3d5982a876a9e"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_13_0_arm64.whl", hash = "sha256:1a6391a7cabb7641c32517539ca42cf84b87b667bad38b78d4d42dd23e957c81"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:9c7617df90c1365638916b98cdd9be833d31d337dbcd722485597b43c4a215bf"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:41d0f1fa4c6830176eef5b276af04c89320ea616655d01327d5ce65e50575c94"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win32.whl", hash = "sha256:f6d3d39611ac2e4f62c3128a9eed45f19a6608670c5a2f4f07f24e8de3441d38"}, - {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:da538167284de58a52109a9b89b8f6a53ff8437dd6dc26d33b57bf6699153122"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4b3a93bb9bc662fc1f99c5c3ea8e623d8b23ad22f861eb6fce9377ac07ad6072"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_12_0_arm64.whl", hash = "sha256:a234a20ae07e8469da311e182e70ef6b199d0fbeb6c6cc2901204dd87fb867e8"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:15910ef4f3e537eea7fe45f8a5d19997479940d9196f357152a09031c5be59f3"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:370445fd795706fd291ab00c9df38a0caed0f17a6fb46b0f607668ecb16ce763"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win32.whl", hash = "sha256:ecdf1a604009bd35c674b9225a8fa609e0282d9b896c03dd441a91e5f53b534e"}, - {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win_amd64.whl", hash = "sha256:f34019dced51047d6f70cb9383b2ae2853b7fc4dce65129a5acd49f4f9256646"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aa261c29a5545adfef9296b7e33941f46aa5bbd21164228e833412af4c9c75f"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f01da5790e95815eb5a8a138508c01c758e5f5bc0ce4286c4f7028b8dd7ac3d0"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:40d030e2329ce5286d6b231b8726959ebbe0404c92f0a578c0e2482182e38282"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c3ca1fbba4ae962521e5eb66d72998b51f0f4d0f608d3c0347a48e1af262efa7"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win32.whl", hash = "sha256:7bdb4c06b063f6fd55e472e201317a3bb6cdeeee5d5a38512ea5c01e1acbdd93"}, - {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:be2a7ad8fd8f7442b24323d24ba0b56c51219513cfa45b9ada3b87b76c374d4b"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91a789b4aa0097b78c93e3dc4b40040ba55bef518f84a40d4442f713b4094acb"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:99e77daab5d13a48a4054803d052ff40780278240a902b880dd37a51ba01a307"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3243f48ecd450eddadc2d11b5feb08aca941b5cd98c9b1db14b2fd128be8c697"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8831a2cedcd0f0927f788c5bdf6567d9dc9cc235646a434986a852af1cb54b4b"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win32.whl", hash = "sha256:3110a99e0f94a4a3470ff67fc20d3f96c25b13d24c6980ff841e82bafe827cac"}, - {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:92460ce908546ab69770b2e576e4f99fbb4ce6ab4b245345a3869a0a0410488f"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc0667c1eb8f83a3752b71b9c4ba55ef7c7058ae57022dd9b29065186a113d9"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:4a4d8d417868d68b979076a9be6a38c676eca060785abaa6709c7b31593c35d1"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf9a6bc4a0221538b1a7de3ed7bca4c93c02346853f44e1cd764be0023cd3640"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a7b301ff08055d73223058b5c46c55638917f04d21577c95e00e0c4d79201a6b"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win32.whl", hash = "sha256:d5e51e2901ec2366b79f16c2299a03e74ba4531ddcfacc1416639c557aef0ad8"}, - {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:184faeaec61dbaa3cace407cffc5819f7b977e75360e8d5ca19461cd851a5fc5"}, - {file = "ruamel.yaml.clib-0.2.7.tar.gz", hash = "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497"}, -] - -[[package]] -name = "setuptools" -version = "68.2.2" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, - {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "sortedcontainers" -version = "2.2.2" -description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "sortedcontainers-2.2.2-py2.py3-none-any.whl", hash = "sha256:c633ebde8580f241f274c1f8994a665c0e54a17724fecd0cae2f079e09c36d3f"}, - {file = "sortedcontainers-2.2.2.tar.gz", hash = "sha256:4e73a757831fc3ca4de2859c422564239a31d8213d09a2a666e375807034d2ba"}, -] - -[[package]] -name = "texttable" -version = "1.6.7" -description = "module to create simple ASCII tables" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "texttable-1.6.7-py2.py3-none-any.whl", hash = "sha256:b7b68139aa8a6339d2c320ca8b1dc42d13a7831a346b446cb9eb385f0c76310c"}, - {file = "texttable-1.6.7.tar.gz", hash = "sha256:290348fb67f7746931bcdfd55ac7584ecd4e5b0846ab164333f0794b121760f2"}, -] - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, - {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, -] - -[[package]] -name = "tomlkit" -version = "0.12.1" -description = "Style preserving TOML library" -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, - {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, -] - -[[package]] -name = "tornado" -version = "6.3.3" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "main" -optional = false -python-versions = ">= 3.8" -files = [ - {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, - {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, - {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, - {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, - {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, -] - -[[package]] -name = "transitions" -version = "0.8.11" -description = "A lightweight, object-oriented Python state machine implementation with many extensions." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "transitions-0.8.11-py2.py3-none-any.whl", hash = "sha256:9525dd9b708b0a54bb4562a06a483d237e75c94547ba9831c81c6872d0ea1522"}, - {file = "transitions-0.8.11.tar.gz", hash = "sha256:7b20d32906ea4d60ee6f6c1f5dc9c9f178802425c5b155213eb0f25c277f04e4"}, -] - -[package.dependencies] -six = "*" - -[package.extras] -diagrams = ["pygraphviz"] -test = ["pytest"] - -[[package]] -name = "typed-ast" -version = "1.4.3" -description = "a fork of Python 2 and 3 ast modules with type comment support" -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, - {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, - {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, - {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, - {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, - {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, - {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, - {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, - {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, - {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, - {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, - {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, - {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, - {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, - {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, - {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, - {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, - {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, -] - -[[package]] -name = "typing-extensions" -version = "3.10.0.2" -description = "Backported and Experimental Type Hints for Python 3.5+" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, - {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, - {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, -] - -[[package]] -name = "urllib3" -version = "1.26.16" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, - {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "urwid" -version = "2.1.2" -description = "A full-featured console (xterm et al.) user interface library" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "urwid-2.1.2.tar.gz", hash = "sha256:588bee9c1cb208d0906a9f73c613d2bd32c3ed3702012f51efe318a3f2127eae"}, -] - -[[package]] -name = "websocket-client" -version = "0.59.0" -description = "WebSocket client for Python with low level API options" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "websocket-client-0.59.0.tar.gz", hash = "sha256:d376bd60eace9d437ab6d7ee16f4ab4e821c9dae591e1b783c58ebd8aaf80c5c"}, - {file = "websocket_client-0.59.0-py2.py3-none-any.whl", hash = "sha256:2e50d26ca593f70aba7b13a489435ef88b8fc3b5c5643c1ce8808ff9b40f0b32"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "werkzeug" -version = "1.0.1" -description = "The comprehensive WSGI web application library." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "Werkzeug-1.0.1-py2.py3-none-any.whl", hash = "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43"}, - {file = "Werkzeug-1.0.1.tar.gz", hash = "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c"}, -] - -[package.extras] -dev = ["coverage", "pallets-sphinx-themes", "pytest", "pytest-timeout", "sphinx", "sphinx-issues", "tox"] -watchdog = ["watchdog"] - -[[package]] -name = "wsproto" -version = "0.15.0" -description = "WebSockets state-machine based protocol implementation" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "wsproto-0.15.0-py2.py3-none-any.whl", hash = "sha256:e3d190a11d9307112ba23bbe60055604949b172143969c8f641318476a9b6f1d"}, - {file = "wsproto-0.15.0.tar.gz", hash = "sha256:614798c30e5dc2b3f65acc03d2d50842b97621487350ce79a80a711229edfa9d"}, -] - -[package.dependencies] -h11 = ">=0.8.1" - -[[package]] -name = "ya-aioclient" -version = "0.6.4" -description = "" -category = "main" -optional = false -python-versions = ">=3.6,<4.0" -files = [ - {file = "ya-aioclient-0.6.4.tar.gz", hash = "sha256:e5e5926e3a7d834082b05aeb986d8fb2f7fa46a1bd1bca2f3f1c872e1ba479ae"}, - {file = "ya_aioclient-0.6.4-py3-none-any.whl", hash = "sha256:1d36c2544c2d7629a00a2b1f18b4535e836586cae99bfbf5714ed5ca3f9caa0c"}, -] - -[package.dependencies] -aiohttp = ">=3.6.2,<4.0.0" -certifi = ">=2020.6.20,<2021.0.0" -python-dateutil = ">=2.8.1,<3.0.0" - -[[package]] -name = "yarl" -version = "1.9.2" -description = "Yet another URL library" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, -] - -[package.dependencies] -idna = ">=2.0" -multidict = ">=4.0" - -[[package]] -name = "zstandard" -version = "0.14.1" -description = "Zstandard bindings for Python" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "zstandard-0.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ec1a20936484f3804fba4f29f7d8ed67c70e44536b0f0191a13eff4dc61c815c"}, - {file = "zstandard-0.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:85b37acd054f8f778e5c9832e17fb651f321a3daafa0eb94360eeffce141b0cf"}, - {file = "zstandard-0.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:95939a7e3972ec20e2e959ee9cd0fd858b25ff3a6f5040c5c78fcab51eeab030"}, - {file = "zstandard-0.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:d3999f92ab7aab2a99ac7f7730b3bee8d6bd3e52953ed0e87ab881ca4244a315"}, - {file = "zstandard-0.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:8df3114dfff411aa9827d754bb8fdcdaa15e63c96d7730778fe322f4c85360d8"}, - {file = "zstandard-0.14.1-cp27-cp27m-win32.whl", hash = "sha256:4e6d6b0e541b00d0096a260d5f6eb32f737bfcdb2e5b87a7b7be77ef669c7a6c"}, - {file = "zstandard-0.14.1-cp27-cp27m-win_amd64.whl", hash = "sha256:064aac12b8e7813fa3870e7479e9cbd3803e33212b68e555b408711ea8f6cb54"}, - {file = "zstandard-0.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:b508a826c4b99835e3d8a8d415a6e516cacad4a95ef5ed01f60f9b067f200a51"}, - {file = "zstandard-0.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a72cb707cc0a9d06e3912fe5b6c1648d70ac512f3e180018c82fe926926be12c"}, - {file = "zstandard-0.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:1c065de617b7367c4da4de687a071932e48ae200d09c0afbc24415d98aec470d"}, - {file = "zstandard-0.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:391c30620e3ad6bc53804f32e3f74cbbaa713d95f46ac5f2e54e735d1dfc51c0"}, - {file = "zstandard-0.14.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:403fa9544ecdedcc5fdc48f5e41e092658ac48222cfe6e75fb5710cb3d14c700"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:657a49b1df5a82985ea6495c6c1497a17e34e41a0bd8ef95a640342a19b8e6a4"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c3c9657417bf1eccb94ad64544e12efa8ea3e16612944b32e253314472a54e5"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:d2db7bcdc9b3e5a782d71df0163a6587b8b2f759cc4a819859e27e6ad2f778e6"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:1be45b237fea45c705d83215450a9381c2787bbf0720824b1fe23ed72f8db0b7"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux2014_i686.whl", hash = "sha256:477db538b596767d036379165a27aa2e19edbae50bec4cea195a986ba50bbad6"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:ac9b88a72f2dcfa3facbe6af96d59e82459e5815c15aa59481cc6080937ee02e"}, - {file = "zstandard-0.14.1-cp35-cp35m-win32.whl", hash = "sha256:2826d664eb84f9efe0fae47cf20c27f3662aae3556fbcc4cecd5318fbc9239f3"}, - {file = "zstandard-0.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:36cd223d7fd0fe0e32e82993240e9a24503269c93431e62369088e2299cf4605"}, - {file = "zstandard-0.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d4a7065d7fc991edb93483dbb7bc37dd091a2bac9572d9b9df243e6565d30522"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6f437168752e50ad6a47d054f4a41933693b1675f65663c117067747d95f057c"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e80ade52a06fb433c9ad7d6c8cfb3dafa34f05bedce543e95a670972ba41d65d"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:0b3ae587556a6f45cd982d7684b1318793430d0ae9e376dbc3d877b48ac6d576"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:d34848645f3507dc85baa8c67426f0685b08583e930fa3a1ab5048c5f0ba8fc1"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:5be097127be1659bc6cffb5d885c781e61947597e2fcd1ecf48713313e53657d"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:e3731e0dc1c200e5c2f56ca36bed6c28903f764769f534fbf9ed4178f193e8aa"}, - {file = "zstandard-0.14.1-cp36-cp36m-win32.whl", hash = "sha256:aab21dd5724aa5bdd0aac16f5d175e5df0715fc614910220a918d50f08321982"}, - {file = "zstandard-0.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:ed14a62f8bf2462f19373c337527ff684deb6d0d6b973fbcaece1f561c30f405"}, - {file = "zstandard-0.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:db1b3442441577d81bdae85fc7a4bd553e3161ec745e9dd1f2f93889248363fe"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:8486a01696e3cdfa47b93caa8f5064c9d277bad1c39eb31947bf2b8f019e3510"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4b054fd8cf274b958a3d7a201f8b42a30ebf8f76d87770075e1aca6017006e97"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:fb5f0d29bcbfba6ef9beccba55f567d089747034add5cd7e8dc58842bb745803"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:90f0bb1adcfea326c6548a45cc35474bec56a34d80310b6e78abab313da780fc"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:0b57df1f9530669d61f8708eb15ded6584db4a6733cc5155eb8561d31f292557"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:3948000d753b9110e1eb43a6cba6fdb64c895faebb47628a96550edc5238b78a"}, - {file = "zstandard-0.14.1-cp37-cp37m-win32.whl", hash = "sha256:17e8f29aae79d870daa3ab48c0dbf83594bf956c2c2125ae45cdfebd2b62d8ed"}, - {file = "zstandard-0.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d7fecb5172dc885665581437fe96bf8f03ffc0022b723964c272accbb62713b4"}, - {file = "zstandard-0.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2fd76d29f4e8d7c4aac42617a0439506144146032b5d7b9b0a42f37f916fdb2"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:7309bf511c8b332be2b5a834efbd7ee0cd43db2c811dd916fd0f48acd43e8722"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:a51a09a3be208e627ebb518a78c639d240584f5d1da8106dcafa31d22103b4df"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a820ef78f39c29469caacb0bf43ffd024b78f242393c605daa748588b3247306"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:e3963c919f65367587cf987a71991e69385f19cec9ad8166249b83e176cdbcd8"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:0e5b8fd428d0d00fb7dabc0898de9e87659cb54738d527becff37d3d90df8e88"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:41eab10e6570e14dd77a346f3dbb1eab3f23a652bce07ba47c8c23116b0cee9c"}, - {file = "zstandard-0.14.1-cp38-cp38-win32.whl", hash = "sha256:fbbe18afb67329577ab6a907f348175d3f6044d179a9b56b02206ff9e67c5b12"}, - {file = "zstandard-0.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:3bd044ef32bd6738c3db2cb2d4bc77812e9a3132df942303bbfcd1a484023b60"}, - {file = "zstandard-0.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:24ab8f1c7c970822bd55dbb091f7eb271b417e777e8b3ae6722e60d67f747c05"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:cf67443d06b88218eb8915da2d968dcf6fdc384fb245f97155617ff3b8d77e92"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d78db92ac27cdcd55333b7e642cd400719842e692e8836f0b249e459b26d384b"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bd4da25cc46e972b029f8aa9f103c5977dbe461e1916ff7edec24065071b4a08"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:2075be64372206af3df40fef0fee657b44845d3e6d98b4cc8aba220be861de2d"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:70dfe74b24971476a6a20d42abb964c9ac0fb1af7b89228e5845748377543bd0"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:3382ce6e44e9e847dce848bc2638403aa9320cb38edcc34b71e13be5793619e0"}, - {file = "zstandard-0.14.1-cp39-cp39-win32.whl", hash = "sha256:7161d71debb94c456cbddd8a239e89219f37f0b1a4c0620a2c1400801aeeec7d"}, - {file = "zstandard-0.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d2ec8309309fc7254d21286d6b3e5c28e4019cd8e266d1a860456a69ea7c2400"}, - {file = "zstandard-0.14.1.tar.gz", hash = "sha256:5dd700e52ec28c64d43f681ccde76b6436c8f89a332d6c9e22a6b629f28daeb5"}, -] - -[metadata] -lock-version = "2.0" -python-versions = "^3.8.0" -content-hash = "da72f9ded5843bc94dc10253f12d836ed88c373ea144640a05a63bc26b9af0b1" +# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. + +[[package]] +name = "aiohttp" +version = "3.7.4" +description = "Async http client/server framework (asyncio)" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aiohttp-3.7.4-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:6c8200abc9dc5f27203986100579fc19ccad7a832c07d2bc151ce4ff17190076"}, + {file = "aiohttp-3.7.4-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:dd7936f2a6daa861143e376b3a1fb56e9b802f4980923594edd9ca5670974895"}, + {file = "aiohttp-3.7.4-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:bc3d14bf71a3fb94e5acf5bbf67331ab335467129af6416a437bd6024e4f743d"}, + {file = "aiohttp-3.7.4-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:8ec1a38074f68d66ccb467ed9a673a726bb397142c273f90d4ba954666e87d54"}, + {file = "aiohttp-3.7.4-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:b84ad94868e1e6a5e30d30ec419956042815dfaea1b1df1cef623e4564c374d9"}, + {file = "aiohttp-3.7.4-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:d5d102e945ecca93bcd9801a7bb2fa703e37ad188a2f81b1e65e4abe4b51b00c"}, + {file = "aiohttp-3.7.4-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:c2a80fd9a8d7e41b4e38ea9fe149deed0d6aaede255c497e66b8213274d6d61b"}, + {file = "aiohttp-3.7.4-cp36-cp36m-win32.whl", hash = "sha256:481d4b96969fbfdcc3ff35eea5305d8565a8300410d3d269ccac69e7256b1329"}, + {file = "aiohttp-3.7.4-cp36-cp36m-win_amd64.whl", hash = "sha256:16d0683ef8a6d803207f02b899c928223eb219111bd52420ef3d7a8aa76227b6"}, + {file = "aiohttp-3.7.4-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:eab51036cac2da8a50d7ff0ea30be47750547c9aa1aa2cf1a1b710a1827e7dbe"}, + {file = "aiohttp-3.7.4-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:feb24ff1226beeb056e247cf2e24bba5232519efb5645121c4aea5b6ad74c1f2"}, + {file = "aiohttp-3.7.4-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:119feb2bd551e58d83d1b38bfa4cb921af8ddedec9fad7183132db334c3133e0"}, + {file = "aiohttp-3.7.4-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:6ca56bdfaf825f4439e9e3673775e1032d8b6ea63b8953d3812c71bd6a8b81de"}, + {file = "aiohttp-3.7.4-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:5563ad7fde451b1986d42b9bb9140e2599ecf4f8e42241f6da0d3d624b776f40"}, + {file = "aiohttp-3.7.4-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:62bc216eafac3204877241569209d9ba6226185aa6d561c19159f2e1cbb6abfb"}, + {file = "aiohttp-3.7.4-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:f4496d8d04da2e98cc9133e238ccebf6a13ef39a93da2e87146c8c8ac9768242"}, + {file = "aiohttp-3.7.4-cp37-cp37m-win32.whl", hash = "sha256:2ffea7904e70350da429568113ae422c88d2234ae776519549513c8f217f58a9"}, + {file = "aiohttp-3.7.4-cp37-cp37m-win_amd64.whl", hash = "sha256:5e91e927003d1ed9283dee9abcb989334fc8e72cf89ebe94dc3e07e3ff0b11e9"}, + {file = "aiohttp-3.7.4-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:4c1bdbfdd231a20eee3e56bd0ac1cd88c4ff41b64ab679ed65b75c9c74b6c5c2"}, + {file = "aiohttp-3.7.4-cp38-cp38-manylinux1_i686.whl", hash = "sha256:71680321a8a7176a58dfbc230789790639db78dad61a6e120b39f314f43f1907"}, + {file = "aiohttp-3.7.4-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:7dbd087ff2f4046b9b37ba28ed73f15fd0bc9f4fdc8ef6781913da7f808d9536"}, + {file = "aiohttp-3.7.4-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:dee68ec462ff10c1d836c0ea2642116aba6151c6880b688e56b4c0246770f297"}, + {file = "aiohttp-3.7.4-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:99c5a5bf7135607959441b7d720d96c8e5c46a1f96e9d6d4c9498be8d5f24212"}, + {file = "aiohttp-3.7.4-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:5dde6d24bacac480be03f4f864e9a67faac5032e28841b00533cd168ab39cad9"}, + {file = "aiohttp-3.7.4-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:418597633b5cd9639e514b1d748f358832c08cd5d9ef0870026535bd5eaefdd0"}, + {file = "aiohttp-3.7.4-cp38-cp38-win32.whl", hash = "sha256:e76e78863a4eaec3aee5722d85d04dcbd9844bc6cd3bfa6aa880ff46ad16bfcb"}, + {file = "aiohttp-3.7.4-cp38-cp38-win_amd64.whl", hash = "sha256:950b7ef08b2afdab2488ee2edaff92a03ca500a48f1e1aaa5900e73d6cf992bc"}, + {file = "aiohttp-3.7.4-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:2eb3efe243e0f4ecbb654b08444ae6ffab37ac0ef8f69d3a2ffb958905379daf"}, + {file = "aiohttp-3.7.4-cp39-cp39-manylinux1_i686.whl", hash = "sha256:822bd4fd21abaa7b28d65fc9871ecabaddc42767884a626317ef5b75c20e8a2d"}, + {file = "aiohttp-3.7.4-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:58c62152c4c8731a3152e7e650b29ace18304d086cb5552d317a54ff2749d32a"}, + {file = "aiohttp-3.7.4-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:7c7820099e8b3171e54e7eedc33e9450afe7cd08172632d32128bd527f8cb77d"}, + {file = "aiohttp-3.7.4-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:5b50e0b9460100fe05d7472264d1975f21ac007b35dcd6fd50279b72925a27f4"}, + {file = "aiohttp-3.7.4-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:c44d3c82a933c6cbc21039326767e778eface44fca55c65719921c4b9661a3f7"}, + {file = "aiohttp-3.7.4-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:cc31e906be1cc121ee201adbdf844522ea3349600dd0a40366611ca18cd40e81"}, + {file = "aiohttp-3.7.4-cp39-cp39-win32.whl", hash = "sha256:fbd3b5e18d34683decc00d9a360179ac1e7a320a5fee10ab8053ffd6deab76e0"}, + {file = "aiohttp-3.7.4-cp39-cp39-win_amd64.whl", hash = "sha256:40bd1b101b71a18a528ffce812cc14ff77d4a2a1272dfb8b11b200967489ef3e"}, + {file = "aiohttp-3.7.4.tar.gz", hash = "sha256:5d84ecc73141d0a0d61ece0742bb7ff5751b0657dab8405f899d3ceb104cc7de"}, +] + +[package.dependencies] +async-timeout = ">=3.0,<4.0" +attrs = ">=17.3.0" +chardet = ">=2.0,<4.0" +multidict = ">=4.5,<7.0" +typing-extensions = ">=3.6.5" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["aiodns", "brotlipy", "cchardet"] + +[[package]] +name = "ansicolors" +version = "1.1.8" +description = "ANSI colors for Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "ansicolors-1.1.8-py2.py3-none-any.whl", hash = "sha256:00d2dde5a675579325902536738dd27e4fac1fd68f773fe36c21044eb559e187"}, + {file = "ansicolors-1.1.8.zip", hash = "sha256:99f94f5e3348a0bcd43c82e5fc4414013ccc19d70bd939ad71e0133ce9c372e0"}, +] + +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] + +[[package]] +name = "asgiref" +version = "3.3.4" +description = "ASGI specs, helper code, and adapters" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "asgiref-3.3.4-py3-none-any.whl", hash = "sha256:92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee"}, + {file = "asgiref-3.3.4.tar.gz", hash = "sha256:d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78"}, +] + +[package.extras] +tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] + +[[package]] +name = "async-timeout" +version = "3.0.1" +description = "Timeout context manager for asyncio programs" +category = "main" +optional = false +python-versions = ">=3.5.3" +files = [ + {file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"}, + {file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"}, +] + +[[package]] +name = "atomicwrites" +version = "1.4.1" +description = "Atomic file writes." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "bcrypt" +version = "4.0.1" +description = "Modern password hashing for your software and your servers" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "bcrypt-4.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b1023030aec778185a6c16cf70f359cbb6e0c289fd564a7cfa29e727a1c38f8f"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:08d2947c490093a11416df18043c27abe3921558d2c03e2076ccb28a116cb6d0"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eaa47d4661c326bfc9d08d16debbc4edf78778e6aaba29c1bc7ce67214d4410"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae88eca3024bb34bb3430f964beab71226e761f51b912de5133470b649d82344"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:a522427293d77e1c29e303fc282e2d71864579527a04ddcfda6d4f8396c6c36a"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fbdaec13c5105f0c4e5c52614d04f0bca5f5af007910daa8b6b12095edaa67b3"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ca3204d00d3cb2dfed07f2d74a25f12fc12f73e606fcaa6975d1f7ae69cacbb2"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:089098effa1bc35dc055366740a067a2fc76987e8ec75349eb9484061c54f535"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e9a51bbfe7e9802b5f3508687758b564069ba937748ad7b9e890086290d2f79e"}, + {file = "bcrypt-4.0.1-cp36-abi3-win32.whl", hash = "sha256:2caffdae059e06ac23fce178d31b4a702f2a3264c20bfb5ff541b338194d8fab"}, + {file = "bcrypt-4.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf4fa8b2ca74381bb5442c089350f09a3f17797829d958fad058d6e44d9eb83c"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:67a97e1c405b24f19d08890e7ae0c4f7ce1e56a712a016746c8b2d7732d65d4b"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b3b85202d95dd568efcb35b53936c5e3b3600c7cdcc6115ba461df3a8e89f38d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbb03eec97496166b704ed663a53680ab57c5084b2fc98ef23291987b525cb7d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:5ad4d32a28b80c5fa6671ccfb43676e8c1cc232887759d1cd7b6f56ea4355215"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b57adba8a1444faf784394de3436233728a1ecaeb6e07e8c22c8848f179b893c"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b2cea8a9ed3d55b4491887ceadb0106acf7c6387699fca771af56b1cdeeda"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:2b3ac11cf45161628f1f3733263e63194f22664bf4d0c0f3ab34099c02134665"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3100851841186c25f127731b9fa11909ab7b1df6fc4b9f8353f4f1fd952fbf71"}, + {file = "bcrypt-4.0.1.tar.gz", hash = "sha256:27d375903ac8261cfe4047f6709d16f7d18d39b1ec92aaf72af989552a650ebd"}, +] + +[package.extras] +tests = ["pytest (>=3.2.1,!=3.3.0)"] +typecheck = ["mypy"] + +[[package]] +name = "black" +version = "20.8b1" +description = "The uncompromising code formatter." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "black-20.8b1.tar.gz", hash = "sha256:1c02557aa099101b9d21496f8a914e9ed2222ef70336404eeeac8edba836fbea"}, +] + +[package.dependencies] +appdirs = "*" +click = ">=7.1.2" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.6,<1" +regex = ">=2020.1.8" +toml = ">=0.10.1" +typed-ast = ">=1.4.0" +typing-extensions = ">=3.7.4" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.3.2)", "aiohttp-cors"] + +[[package]] +name = "blinker" +version = "1.4" +description = "Fast, simple object-to-object and broadcast signaling" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "blinker-1.4.tar.gz", hash = "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"}, +] + +[[package]] +name = "brotli" +version = "1.0.9" +description = "Python bindings for the Brotli compression library" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "Brotli-1.0.9-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:268fe94547ba25b58ebc724680609c8ee3e5a843202e9a381f6f9c5e8bdb5c70"}, + {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:c2415d9d082152460f2bd4e382a1e85aed233abc92db5a3880da2257dc7daf7b"}, + {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5913a1177fc36e30fcf6dc868ce23b0453952c78c04c266d3149b3d39e1410d6"}, + {file = "Brotli-1.0.9-cp27-cp27m-win32.whl", hash = "sha256:afde17ae04d90fbe53afb628f7f2d4ca022797aa093e809de5c3cf276f61bbfa"}, + {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7cb81373984cc0e4682f31bc3d6be9026006d96eecd07ea49aafb06897746452"}, + {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:db844eb158a87ccab83e868a762ea8024ae27337fc7ddcbfcddd157f841fdfe7"}, + {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9744a863b489c79a73aba014df554b0e7a0fc44ef3f8a0ef2a52919c7d155031"}, + {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a72661af47119a80d82fa583b554095308d6a4c356b2a554fdc2799bc19f2a43"}, + {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ee83d3e3a024a9618e5be64648d6d11c37047ac48adff25f12fa4226cf23d1c"}, + {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:19598ecddd8a212aedb1ffa15763dd52a388518c4550e615aed88dc3753c0f0c"}, + {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:44bb8ff420c1d19d91d79d8c3574b8954288bdff0273bf788954064d260d7ab0"}, + {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e23281b9a08ec338469268f98f194658abfb13658ee98e2b7f85ee9dd06caa91"}, + {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3496fc835370da351d37cada4cf744039616a6db7d13c430035e901443a34daa"}, + {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83bb06a0192cccf1eb8d0a28672a1b79c74c3a8a5f2619625aeb6f28b3a82bb"}, + {file = "Brotli-1.0.9-cp310-cp310-win32.whl", hash = "sha256:26d168aac4aaec9a4394221240e8a5436b5634adc3cd1cdf637f6645cecbf181"}, + {file = "Brotli-1.0.9-cp310-cp310-win_amd64.whl", hash = "sha256:622a231b08899c864eb87e85f81c75e7b9ce05b001e59bbfbf43d4a71f5f32b2"}, + {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cc0283a406774f465fb45ec7efb66857c09ffefbe49ec20b7882eff6d3c86d3a"}, + {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:11d3283d89af7033236fa4e73ec2cbe743d4f6a81d41bd234f24bf63dde979df"}, + {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c1306004d49b84bd0c4f90457c6f57ad109f5cc6067a9664e12b7b79a9948ad"}, + {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1375b5d17d6145c798661b67e4ae9d5496920d9265e2f00f1c2c0b5ae91fbde"}, + {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cab1b5964b39607a66adbba01f1c12df2e55ac36c81ec6ed44f2fca44178bf1a"}, + {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ed6a5b3d23ecc00ea02e1ed8e0ff9a08f4fc87a1f58a2530e71c0f48adf882f"}, + {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cb02ed34557afde2d2da68194d12f5719ee96cfb2eacc886352cb73e3808fc5d"}, + {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b3523f51818e8f16599613edddb1ff924eeb4b53ab7e7197f85cbc321cdca32f"}, + {file = "Brotli-1.0.9-cp311-cp311-win32.whl", hash = "sha256:ba72d37e2a924717990f4d7482e8ac88e2ef43fb95491eb6e0d124d77d2a150d"}, + {file = "Brotli-1.0.9-cp311-cp311-win_amd64.whl", hash = "sha256:3ffaadcaeafe9d30a7e4e1e97ad727e4f5610b9fa2f7551998471e3736738679"}, + {file = "Brotli-1.0.9-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:c83aa123d56f2e060644427a882a36b3c12db93727ad7a7b9efd7d7f3e9cc2c4"}, + {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:6b2ae9f5f67f89aade1fab0f7fd8f2832501311c363a21579d02defa844d9296"}, + {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:68715970f16b6e92c574c30747c95cf8cf62804569647386ff032195dc89a430"}, + {file = "Brotli-1.0.9-cp35-cp35m-win32.whl", hash = "sha256:defed7ea5f218a9f2336301e6fd379f55c655bea65ba2476346340a0ce6f74a1"}, + {file = "Brotli-1.0.9-cp35-cp35m-win_amd64.whl", hash = "sha256:88c63a1b55f352b02c6ffd24b15ead9fc0e8bf781dbe070213039324922a2eea"}, + {file = "Brotli-1.0.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:503fa6af7da9f4b5780bb7e4cbe0c639b010f12be85d02c99452825dd0feef3f"}, + {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:40d15c79f42e0a2c72892bf407979febd9cf91f36f495ffb333d1d04cebb34e4"}, + {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:93130612b837103e15ac3f9cbacb4613f9e348b58b3aad53721d92e57f96d46a"}, + {file = "Brotli-1.0.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87fdccbb6bb589095f413b1e05734ba492c962b4a45a13ff3408fa44ffe6479b"}, + {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:6d847b14f7ea89f6ad3c9e3901d1bc4835f6b390a9c71df999b0162d9bb1e20f"}, + {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:495ba7e49c2db22b046a53b469bbecea802efce200dffb69b93dd47397edc9b6"}, + {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:4688c1e42968ba52e57d8670ad2306fe92e0169c6f3af0089be75bbac0c64a3b"}, + {file = "Brotli-1.0.9-cp36-cp36m-win32.whl", hash = "sha256:61a7ee1f13ab913897dac7da44a73c6d44d48a4adff42a5701e3239791c96e14"}, + {file = "Brotli-1.0.9-cp36-cp36m-win_amd64.whl", hash = "sha256:1c48472a6ba3b113452355b9af0a60da5c2ae60477f8feda8346f8fd48e3e87c"}, + {file = "Brotli-1.0.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b78a24b5fd13c03ee2b7b86290ed20efdc95da75a3557cc06811764d5ad1126"}, + {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:9d12cf2851759b8de8ca5fde36a59c08210a97ffca0eb94c532ce7b17c6a3d1d"}, + {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6c772d6c0a79ac0f414a9f8947cc407e119b8598de7621f39cacadae3cf57d12"}, + {file = "Brotli-1.0.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29d1d350178e5225397e28ea1b7aca3648fcbab546d20e7475805437bfb0a130"}, + {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7bbff90b63328013e1e8cb50650ae0b9bac54ffb4be6104378490193cd60f85a"}, + {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ec1947eabbaf8e0531e8e899fc1d9876c179fc518989461f5d24e2223395a9e3"}, + {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12effe280b8ebfd389022aa65114e30407540ccb89b177d3fbc9a4f177c4bd5d"}, + {file = "Brotli-1.0.9-cp37-cp37m-win32.whl", hash = "sha256:f909bbbc433048b499cb9db9e713b5d8d949e8c109a2a548502fb9aa8630f0b1"}, + {file = "Brotli-1.0.9-cp37-cp37m-win_amd64.whl", hash = "sha256:97f715cf371b16ac88b8c19da00029804e20e25f30d80203417255d239f228b5"}, + {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e16eb9541f3dd1a3e92b89005e37b1257b157b7256df0e36bd7b33b50be73bcb"}, + {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:160c78292e98d21e73a4cc7f76a234390e516afcd982fa17e1422f7c6a9ce9c8"}, + {file = "Brotli-1.0.9-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b663f1e02de5d0573610756398e44c130add0eb9a3fc912a09665332942a2efb"}, + {file = "Brotli-1.0.9-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5b6ef7d9f9c38292df3690fe3e302b5b530999fa90014853dcd0d6902fb59f26"}, + {file = "Brotli-1.0.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a674ac10e0a87b683f4fa2b6fa41090edfd686a6524bd8dedbd6138b309175c"}, + {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e2d9e1cbc1b25e22000328702b014227737756f4b5bf5c485ac1d8091ada078b"}, + {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b336c5e9cf03c7be40c47b5fd694c43c9f1358a80ba384a21969e0b4e66a9b17"}, + {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:85f7912459c67eaab2fb854ed2bc1cc25772b300545fe7ed2dc03954da638649"}, + {file = "Brotli-1.0.9-cp38-cp38-win32.whl", hash = "sha256:35a3edbe18e876e596553c4007a087f8bcfd538f19bc116917b3c7522fca0429"}, + {file = "Brotli-1.0.9-cp38-cp38-win_amd64.whl", hash = "sha256:269a5743a393c65db46a7bb982644c67ecba4b8d91b392403ad8a861ba6f495f"}, + {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2aad0e0baa04517741c9bb5b07586c642302e5fb3e75319cb62087bd0995ab19"}, + {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5cb1e18167792d7d21e21365d7650b72d5081ed476123ff7b8cac7f45189c0c7"}, + {file = "Brotli-1.0.9-cp39-cp39-manylinux1_i686.whl", hash = "sha256:16d528a45c2e1909c2798f27f7bf0a3feec1dc9e50948e738b961618e38b6a7b"}, + {file = "Brotli-1.0.9-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:56d027eace784738457437df7331965473f2c0da2c70e1a1f6fdbae5402e0389"}, + {file = "Brotli-1.0.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bf919756d25e4114ace16a8ce91eb340eb57a08e2c6950c3cebcbe3dff2a5e7"}, + {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e4c4e92c14a57c9bd4cb4be678c25369bf7a092d55fd0866f759e425b9660806"}, + {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e48f4234f2469ed012a98f4b7874e7f7e173c167bed4934912a29e03167cf6b1"}, + {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ed4c92a0665002ff8ea852353aeb60d9141eb04109e88928026d3c8a9e5433c"}, + {file = "Brotli-1.0.9-cp39-cp39-win32.whl", hash = "sha256:cfc391f4429ee0a9370aa93d812a52e1fee0f37a81861f4fdd1f4fb28e8547c3"}, + {file = "Brotli-1.0.9-cp39-cp39-win_amd64.whl", hash = "sha256:854c33dad5ba0fbd6ab69185fec8dab89e13cda6b7d191ba111987df74f38761"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9749a124280a0ada4187a6cfd1ffd35c350fb3af79c706589d98e088c5044267"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:73fd30d4ce0ea48010564ccee1a26bfe39323fde05cb34b5863455629db61dc7"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02177603aaca36e1fd21b091cb742bb3b305a569e2402f1ca38af471777fb019"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:76ffebb907bec09ff511bb3acc077695e2c32bc2142819491579a695f77ffd4d"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b43775532a5904bc938f9c15b77c613cb6ad6fb30990f3b0afaea82797a402d8"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5bf37a08493232fbb0f8229f1824b366c2fc1d02d64e7e918af40acd15f3e337"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:330e3f10cd01da535c70d09c4283ba2df5fb78e915bea0a28becad6e2ac010be"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e1abbeef02962596548382e393f56e4c94acd286bd0c5afba756cffc33670e8a"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3148362937217b7072cf80a2dcc007f09bb5ecb96dae4617316638194113d5be"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:336b40348269f9b91268378de5ff44dc6fbaa2268194f85177b53463d313842a"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b8b09a16a1950b9ef495a0f8b9d0a87599a9d1f179e2d4ac014b2ec831f87e7"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c8e521a0ce7cf690ca84b8cc2272ddaf9d8a50294fd086da67e517439614c755"}, + {file = "Brotli-1.0.9.zip", hash = "sha256:4d1b810aa0ed773f81dceda2cc7b403d01057458730e309856356d4ef4188438"}, +] + +[[package]] +name = "certifi" +version = "2020.12.5" +description = "Python package for providing Mozilla's CA Bundle." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, + {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "chardet" +version = "3.0.4" +description = "Universal encoding detector for Python 2 and 3" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "chardet-3.0.4-py2.py3-none-any.whl", hash = "sha256:fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"}, + {file = "chardet-3.0.4.tar.gz", hash = "sha256:84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] + +[[package]] +name = "click" +version = "7.1.2" +description = "Composable command line interface toolkit" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, + {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "cryptography" +version = "3.2.1" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "cryptography-3.2.1-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:6dc59630ecce8c1f558277ceb212c751d6730bd12c80ea96b4ac65637c4f55e7"}, + {file = "cryptography-3.2.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:75e8e6684cf0034f6bf2a97095cb95f81537b12b36a8fedf06e73050bb171c2d"}, + {file = "cryptography-3.2.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4e7268a0ca14536fecfdf2b00297d4e407da904718658c1ff1961c713f90fd33"}, + {file = "cryptography-3.2.1-cp27-cp27m-win32.whl", hash = "sha256:7117319b44ed1842c617d0a452383a5a052ec6aa726dfbaffa8b94c910444297"}, + {file = "cryptography-3.2.1-cp27-cp27m-win_amd64.whl", hash = "sha256:a733671100cd26d816eed39507e585c156e4498293a907029969234e5e634bc4"}, + {file = "cryptography-3.2.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a75f306a16d9f9afebfbedc41c8c2351d8e61e818ba6b4c40815e2b5740bb6b8"}, + {file = "cryptography-3.2.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:5849d59358547bf789ee7e0d7a9036b2d29e9a4ddf1ce5e06bb45634f995c53e"}, + {file = "cryptography-3.2.1-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:bd717aa029217b8ef94a7d21632a3bb5a4e7218a4513d2521c2a2fd63011e98b"}, + {file = "cryptography-3.2.1-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:efe15aca4f64f3a7ea0c09c87826490e50ed166ce67368a68f315ea0807a20df"}, + {file = "cryptography-3.2.1-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:32434673d8505b42c0de4de86da8c1620651abd24afe91ae0335597683ed1b77"}, + {file = "cryptography-3.2.1-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:7b8d9d8d3a9bd240f453342981f765346c87ade811519f98664519696f8e6ab7"}, + {file = "cryptography-3.2.1-cp35-cp35m-win32.whl", hash = "sha256:d3545829ab42a66b84a9aaabf216a4dce7f16dbc76eb69be5c302ed6b8f4a29b"}, + {file = "cryptography-3.2.1-cp35-cp35m-win_amd64.whl", hash = "sha256:a4e27ed0b2504195f855b52052eadcc9795c59909c9d84314c5408687f933fc7"}, + {file = "cryptography-3.2.1-cp36-abi3-win32.whl", hash = "sha256:13b88a0bd044b4eae1ef40e265d006e34dbcde0c2f1e15eb9896501b2d8f6c6f"}, + {file = "cryptography-3.2.1-cp36-abi3-win_amd64.whl", hash = "sha256:07ca431b788249af92764e3be9a488aa1d39a0bc3be313d826bbec690417e538"}, + {file = "cryptography-3.2.1-cp36-cp36m-win32.whl", hash = "sha256:a035a10686532b0587d58a606004aa20ad895c60c4d029afa245802347fab57b"}, + {file = "cryptography-3.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:d26a2557d8f9122f9bf445fc7034242f4375bd4e95ecda007667540270965b13"}, + {file = "cryptography-3.2.1-cp37-cp37m-win32.whl", hash = "sha256:545a8550782dda68f8cdc75a6e3bf252017aa8f75f19f5a9ca940772fc0cb56e"}, + {file = "cryptography-3.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:55d0b896631412b6f0c7de56e12eb3e261ac347fbaa5d5e705291a9016e5f8cb"}, + {file = "cryptography-3.2.1-cp38-cp38-win32.whl", hash = "sha256:3cd75a683b15576cfc822c7c5742b3276e50b21a06672dc3a800a2d5da4ecd1b"}, + {file = "cryptography-3.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:d25cecbac20713a7c3bc544372d42d8eafa89799f492a43b79e1dfd650484851"}, + {file = "cryptography-3.2.1.tar.gz", hash = "sha256:d3d5e10be0cf2a12214ddee45c6bd203dab435e3d83b4560c03066eda600bfe3"}, +] + +[package.dependencies] +cffi = ">=1.8,<1.11.3 || >1.11.3" +six = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docstest = ["doc8", "pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=3.6.0,!=3.9.0,!=3.9.1,!=3.9.2)", "pytz"] + +[[package]] +name = "distro" +version = "1.8.0" +description = "Distro - an OS platform information API" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.8.0-py3-none-any.whl", hash = "sha256:99522ca3e365cac527b44bde033f64c6945d90eb9f769703caaec52b09bbd3ff"}, + {file = "distro-1.8.0.tar.gz", hash = "sha256:02e111d1dc6a50abb8eed6bf31c3e48ed8b0830d1ea2a1b78c61765c2513fdd8"}, +] + +[[package]] +name = "docker" +version = "5.0.3" +description = "A Python library for the Docker Engine API." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "docker-5.0.3-py2.py3-none-any.whl", hash = "sha256:7a79bb439e3df59d0a72621775d600bc8bc8b422d285824cb37103eab91d1ce0"}, + {file = "docker-5.0.3.tar.gz", hash = "sha256:d916a26b62970e7c2f554110ed6af04c7ccff8e9f81ad17d0d40c75637e227fb"}, +] + +[package.dependencies] +paramiko = {version = ">=2.4.2", optional = true, markers = "extra == \"ssh\""} +pywin32 = {version = "227", markers = "sys_platform == \"win32\""} +requests = ">=2.14.2,<2.18.0 || >2.18.0" +websocket-client = ">=0.32.0" + +[package.extras] +ssh = ["paramiko (>=2.4.2)"] +tls = ["cryptography (>=3.4.7)", "idna (>=2.0.0)", "pyOpenSSL (>=17.5.0)"] + +[[package]] +name = "docker-compose" +version = "1.29.2" +description = "Multi-container orchestration for Docker" +category = "main" +optional = false +python-versions = ">=3.4" +files = [ + {file = "docker-compose-1.29.2.tar.gz", hash = "sha256:4c8cd9d21d237412793d18bd33110049ee9af8dab3fe2c213bbd0733959b09b7"}, + {file = "docker_compose-1.29.2-py2.py3-none-any.whl", hash = "sha256:8d5589373b35c8d3b1c8c1182c6e4a4ff14bffa3dd0b605fcd08f73c94cef809"}, +] + +[package.dependencies] +colorama = {version = ">=0.4,<1", markers = "sys_platform == \"win32\""} +distro = ">=1.5.0,<2" +docker = {version = ">=5", extras = ["ssh"]} +dockerpty = ">=0.4.1,<1" +docopt = ">=0.6.1,<1" +jsonschema = ">=2.5.1,<4" +python-dotenv = ">=0.13.0,<1" +PyYAML = ">=3.10,<6" +requests = ">=2.20.0,<3" +texttable = ">=0.9.0,<2" +websocket-client = ">=0.32.0,<1" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2)"] +tests = ["ddt (>=1.2.2,<2)", "pytest (<6)"] + +[[package]] +name = "dockerpty" +version = "0.4.1" +description = "Python library to use the pseudo-tty of a docker container" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "dockerpty-0.4.1.tar.gz", hash = "sha256:69a9d69d573a0daa31bcd1c0774eeed5c15c295fe719c61aca550ed1393156ce"}, +] + +[package.dependencies] +six = ">=1.3.0" + +[[package]] +name = "docopt" +version = "0.6.2" +description = "Pythonic argument parser, that will make you smile" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] + +[[package]] +name = "dpath" +version = "2.1.6" +description = "Filesystem-like pathing and searching for dictionaries" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dpath-2.1.6-py3-none-any.whl", hash = "sha256:31407395b177ab63ef72e2f6ae268c15e938f2990a8ecf6510f5686c02b6db73"}, + {file = "dpath-2.1.6.tar.gz", hash = "sha256:f1e07c72e8605c6a9e80b64bc8f42714de08a789c7de417e49c3f87a19692e47"}, +] + +[[package]] +name = "fastcore" +version = "1.5.29" +description = "Python supercharged for fastai development" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "fastcore-1.5.29-py3-none-any.whl", hash = "sha256:a7d7e89faf968f2d8584df2deca344c3974f6cf476e1299cd3c067d8fa7440e9"}, + {file = "fastcore-1.5.29.tar.gz", hash = "sha256:f1a2eb04eb7933f3f9eb4064852817df44dc96e20fab5658c14c035815269a3f"}, +] + +[package.dependencies] +packaging = "*" +pip = "*" + +[package.extras] +dev = ["jupyterlab", "matplotlib", "nbdev (>=0.2.39)", "numpy", "pandas", "pillow", "torch"] + +[[package]] +name = "flask" +version = "1.1.4" +description = "A simple framework for building complex web applications." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "Flask-1.1.4-py2.py3-none-any.whl", hash = "sha256:c34f04500f2cbbea882b1acb02002ad6fe6b7ffa64a6164577995657f50aed22"}, + {file = "Flask-1.1.4.tar.gz", hash = "sha256:0fbeb6180d383a9186d0d6ed954e0042ad9f18e0e8de088b2b419d526927d196"}, +] + +[package.dependencies] +click = ">=5.1,<8.0" +itsdangerous = ">=0.24,<2.0" +Jinja2 = ">=2.10.1,<3.0" +Werkzeug = ">=0.15,<2.0" + +[package.extras] +dev = ["coverage", "pallets-sphinx-themes", "pytest", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet", "tox"] +docs = ["pallets-sphinx-themes", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet"] +dotenv = ["python-dotenv"] + +[[package]] +name = "func-timeout" +version = "4.3.5" +description = "Python module which allows you to specify timeouts when calling any existing function. Also provides support for stoppable-threads" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "func_timeout-4.3.5.tar.gz", hash = "sha256:74cd3c428ec94f4edfba81f9b2f14904846d5ffccc27c92433b8b5939b5575dd"}, +] + +[[package]] +name = "ghapi" +version = "0.1.23" +description = "A python client for the GitHub API" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "ghapi-0.1.23-py3-none-any.whl", hash = "sha256:492b5f82b5d4844a0297c8ae6afda638432cee6c74b0bd0a0458b35d19b92b5e"}, + {file = "ghapi-0.1.23.tar.gz", hash = "sha256:93fa097e394d743c6702e217d588a4123696f62d055f2acc495166676843d59f"}, +] + +[package.dependencies] +fastcore = ">=1.5.4" +packaging = "*" +pip = "*" + +[package.extras] +dev = ["jsonref"] + +[[package]] +name = "goth" +version = "0.15.1" +description = "Golem Test Harness - integration testing framework" +category = "main" +optional = false +python-versions = "^3.8" +files = [] +develop = false + +[package.dependencies] +aiohttp = "3.7.4" +ansicolors = "^1.1.0" +docker = "^5.0" +docker-compose = "^1.29" +dpath = "^2.0" +func_timeout = "4.3.5" +ghapi = "^0.1.16" +markupsafe = "2.0.1" +mitmproxy = "^5.3" +pyyaml = "^5.4" +transitions = "^0.8" +typing_extensions = "^3.10.0" +urllib3 = "^1.26" +ya-aioclient = "^0.6" + +[package.source] +type = "git" +url = "https://github.com/golemfactory/goth.git" +reference = "324fa3e3c38a1f2ab0b3508cbdbf6152e4c03ec8" +resolved_reference = "324fa3e3c38a1f2ab0b3508cbdbf6152e4c03ec8" + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "h2" +version = "4.1.0" +description = "HTTP/2 State-Machine based protocol implementation" +category = "main" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, + {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, +] + +[package.dependencies] +hpack = ">=4.0,<5" +hyperframe = ">=6.0,<7" + +[[package]] +name = "hpack" +version = "4.0.0" +description = "Pure-Python HPACK header compression" +category = "main" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, + {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, +] + +[[package]] +name = "hyperframe" +version = "6.0.1" +description = "HTTP/2 framing layer for Python" +category = "main" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, + {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, +] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "itsdangerous" +version = "1.1.0" +description = "Various helpers to pass data to untrusted environments and back." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"}, + {file = "itsdangerous-1.1.0.tar.gz", hash = "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19"}, +] + +[[package]] +name = "jinja2" +version = "2.11.3" +description = "A very fast and expressive template engine." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, + {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, +] + +[package.dependencies] +MarkupSafe = ">=0.23" + +[package.extras] +i18n = ["Babel (>=0.8)"] + +[[package]] +name = "jsonschema" +version = "3.2.0" +description = "An implementation of JSON Schema validation for Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, + {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, +] + +[package.dependencies] +attrs = ">=17.4.0" +pyrsistent = ">=0.14.0" +setuptools = "*" +six = ">=1.11.0" + +[package.extras] +format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] +format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] + +[[package]] +name = "kaitaistruct" +version = "0.9" +description = "Kaitai Struct declarative parser generator for binary data: runtime library for Python" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "kaitaistruct-0.9.tar.gz", hash = "sha256:3d5845817ec8a4d5504379cc11bd570b038850ee49c4580bc0998c8fb1d327ad"}, +] + +[[package]] +name = "ldap3" +version = "2.8.1" +description = "A strictly RFC 4510 conforming LDAP V3 pure Python client library" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "ldap3-2.8.1-py2.py3-none-any.whl", hash = "sha256:7c3738570766f5e5e74a56fade15470f339d5c436d821cf476ef27da0a4de8b0"}, + {file = "ldap3-2.8.1.tar.gz", hash = "sha256:37d633e20fa360c302b1263c96fe932d40622d0119f1bddcb829b03462eeeeb7"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6" + +[[package]] +name = "markupsafe" +version = "2.0.1" +description = "Safely add untrusted strings to HTML/XML markup." +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +] + +[[package]] +name = "mitmproxy" +version = "5.3.0" +description = "An interactive, SSL/TLS-capable intercepting proxy for HTTP/1, HTTP/2, and WebSockets." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "mitmproxy-5.3.0-py3-none-any.whl", hash = "sha256:481940365fc08fc2318343e530ef01d35084e8b56d1c61b5e1a7b6ed9b664d24"}, +] + +[package.dependencies] +asgiref = ">=3.2.10,<3.4" +blinker = ">=1.4,<1.5" +Brotli = ">=1.0,<1.1" +certifi = ">=2019.9.11" +click = ">=7.0,<8" +cryptography = ">=3.2,<3.3" +flask = ">=1.1.1,<1.2" +h2 = {version = ">=4.0,<5", markers = "python_version >= \"3.6.0\""} +hyperframe = {version = ">=6.0,<7", markers = "python_version >= \"3.6.0\""} +kaitaistruct = ">=0.7,<0.10" +ldap3 = ">=2.8,<2.9" +msgpack = ">=1.0.0,<1.1.0" +passlib = ">=1.6.5,<1.8" +protobuf = ">=3.6.0,<3.14" +publicsuffix2 = ">=2.20190812,<3" +pyasn1 = ">=0.3.1,<0.5" +pydivert = {version = ">=2.0.3,<2.2", markers = "sys_platform == \"win32\""} +pyOpenSSL = ">=19.1.0,<19.2" +pyparsing = ">=2.4.2,<2.5" +pyperclip = ">=1.6.0,<1.9" +"ruamel.yaml" = ">=0.16,<0.17" +sortedcontainers = ">=2.1,<2.3" +tornado = ">=4.3,<7" +urwid = ">=2.1.1,<2.2" +wsproto = ">=0.14,<0.16" +zstandard = ">=0.11,<0.15" + +[package.extras] +dev = ["Flask (>=1.0,<1.2)", "asynctest (>=0.12.0)", "hypothesis (>=5.8,<6)", "parver (>=0.1,<2.0)", "pytest (>=6.1.0,<7)", "pytest-asyncio (>=0.10.0,<0.14)", "pytest-cov (>=2.7.1,<3)", "pytest-timeout (>=1.3.3,<2)", "pytest-xdist (>=2.1.0,<3)", "requests (>=2.9.1,<3)", "tox (>=3.5,<4)"] + +[[package]] +name = "msgpack" +version = "1.0.5" +description = "MessagePack serializer" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:525228efd79bb831cf6830a732e2e80bc1b05436b086d4264814b4b2955b2fa9"}, + {file = "msgpack-1.0.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f8d8b3bf1ff2672567d6b5c725a1b347fe838b912772aa8ae2bf70338d5a198"}, + {file = "msgpack-1.0.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdc793c50be3f01106245a61b739328f7dccc2c648b501e237f0699fe1395b81"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cb47c21a8a65b165ce29f2bec852790cbc04936f502966768e4aae9fa763cb7"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e42b9594cc3bf4d838d67d6ed62b9e59e201862a25e9a157019e171fbe672dd3"}, + {file = "msgpack-1.0.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:55b56a24893105dc52c1253649b60f475f36b3aa0fc66115bffafb624d7cb30b"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1967f6129fc50a43bfe0951c35acbb729be89a55d849fab7686004da85103f1c"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20a97bf595a232c3ee6d57ddaadd5453d174a52594bf9c21d10407e2a2d9b3bd"}, + {file = "msgpack-1.0.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d25dd59bbbbb996eacf7be6b4ad082ed7eacc4e8f3d2df1ba43822da9bfa122a"}, + {file = "msgpack-1.0.5-cp310-cp310-win32.whl", hash = "sha256:382b2c77589331f2cb80b67cc058c00f225e19827dbc818d700f61513ab47bea"}, + {file = "msgpack-1.0.5-cp310-cp310-win_amd64.whl", hash = "sha256:4867aa2df9e2a5fa5f76d7d5565d25ec76e84c106b55509e78c1ede0f152659a"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9f5ae84c5c8a857ec44dc180a8b0cc08238e021f57abdf51a8182e915e6299f0"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9e6ca5d5699bcd89ae605c150aee83b5321f2115695e741b99618f4856c50898"}, + {file = "msgpack-1.0.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5494ea30d517a3576749cad32fa27f7585c65f5f38309c88c6d137877fa28a5a"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1ab2f3331cb1b54165976a9d976cb251a83183631c88076613c6c780f0d6e45a"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28592e20bbb1620848256ebc105fc420436af59515793ed27d5c77a217477705"}, + {file = "msgpack-1.0.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe5c63197c55bce6385d9aee16c4d0641684628f63ace85f73571e65ad1c1e8d"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ed40e926fa2f297e8a653c954b732f125ef97bdd4c889f243182299de27e2aa9"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b2de4c1c0538dcb7010902a2b97f4e00fc4ddf2c8cda9749af0e594d3b7fa3d7"}, + {file = "msgpack-1.0.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:bf22a83f973b50f9d38e55c6aade04c41ddda19b00c4ebc558930d78eecc64ed"}, + {file = "msgpack-1.0.5-cp311-cp311-win32.whl", hash = "sha256:c396e2cc213d12ce017b686e0f53497f94f8ba2b24799c25d913d46c08ec422c"}, + {file = "msgpack-1.0.5-cp311-cp311-win_amd64.whl", hash = "sha256:6c4c68d87497f66f96d50142a2b73b97972130d93677ce930718f68828b382e2"}, + {file = "msgpack-1.0.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:a2b031c2e9b9af485d5e3c4520f4220d74f4d222a5b8dc8c1a3ab9448ca79c57"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f837b93669ce4336e24d08286c38761132bc7ab29782727f8557e1eb21b2080"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1d46dfe3832660f53b13b925d4e0fa1432b00f5f7210eb3ad3bb9a13c6204a6"}, + {file = "msgpack-1.0.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:366c9a7b9057e1547f4ad51d8facad8b406bab69c7d72c0eb6f529cf76d4b85f"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4c075728a1095efd0634a7dccb06204919a2f67d1893b6aa8e00497258bf926c"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:f933bbda5a3ee63b8834179096923b094b76f0c7a73c1cfe8f07ad608c58844b"}, + {file = "msgpack-1.0.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:36961b0568c36027c76e2ae3ca1132e35123dcec0706c4b7992683cc26c1320c"}, + {file = "msgpack-1.0.5-cp36-cp36m-win32.whl", hash = "sha256:b5ef2f015b95f912c2fcab19c36814963b5463f1fb9049846994b007962743e9"}, + {file = "msgpack-1.0.5-cp36-cp36m-win_amd64.whl", hash = "sha256:288e32b47e67f7b171f86b030e527e302c91bd3f40fd9033483f2cacc37f327a"}, + {file = "msgpack-1.0.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:137850656634abddfb88236008339fdaba3178f4751b28f270d2ebe77a563b6c"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c05a4a96585525916b109bb85f8cb6511db1c6f5b9d9cbcbc940dc6b4be944b"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56a62ec00b636583e5cb6ad313bbed36bb7ead5fa3a3e38938503142c72cba4f"}, + {file = "msgpack-1.0.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ef8108f8dedf204bb7b42994abf93882da1159728a2d4c5e82012edd92c9da9f"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:1835c84d65f46900920b3708f5ba829fb19b1096c1800ad60bae8418652a951d"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e57916ef1bd0fee4f21c4600e9d1da352d8816b52a599c46460e93a6e9f17086"}, + {file = "msgpack-1.0.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:17358523b85973e5f242ad74aa4712b7ee560715562554aa2134d96e7aa4cbbf"}, + {file = "msgpack-1.0.5-cp37-cp37m-win32.whl", hash = "sha256:cb5aaa8c17760909ec6cb15e744c3ebc2ca8918e727216e79607b7bbce9c8f77"}, + {file = "msgpack-1.0.5-cp37-cp37m-win_amd64.whl", hash = "sha256:ab31e908d8424d55601ad7075e471b7d0140d4d3dd3272daf39c5c19d936bd82"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b72d0698f86e8d9ddf9442bdedec15b71df3598199ba33322d9711a19f08145c"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:379026812e49258016dd84ad79ac8446922234d498058ae1d415f04b522d5b2d"}, + {file = "msgpack-1.0.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:332360ff25469c346a1c5e47cbe2a725517919892eda5cfaffe6046656f0b7bb"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:476a8fe8fae289fdf273d6d2a6cb6e35b5a58541693e8f9f019bfe990a51e4ba"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9985b214f33311df47e274eb788a5893a761d025e2b92c723ba4c63936b69b1"}, + {file = "msgpack-1.0.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48296af57cdb1d885843afd73c4656be5c76c0c6328db3440c9601a98f303d87"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:addab7e2e1fcc04bd08e4eb631c2a90960c340e40dfc4a5e24d2ff0d5a3b3edb"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:916723458c25dfb77ff07f4c66aed34e47503b2eb3188b3adbec8d8aa6e00f48"}, + {file = "msgpack-1.0.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:821c7e677cc6acf0fd3f7ac664c98803827ae6de594a9f99563e48c5a2f27eb0"}, + {file = "msgpack-1.0.5-cp38-cp38-win32.whl", hash = "sha256:1c0f7c47f0087ffda62961d425e4407961a7ffd2aa004c81b9c07d9269512f6e"}, + {file = "msgpack-1.0.5-cp38-cp38-win_amd64.whl", hash = "sha256:bae7de2026cbfe3782c8b78b0db9cbfc5455e079f1937cb0ab8d133496ac55e1"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:20c784e66b613c7f16f632e7b5e8a1651aa5702463d61394671ba07b2fc9e025"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:266fa4202c0eb94d26822d9bfd7af25d1e2c088927fe8de9033d929dd5ba24c5"}, + {file = "msgpack-1.0.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:18334484eafc2b1aa47a6d42427da7fa8f2ab3d60b674120bce7a895a0a85bdd"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:57e1f3528bd95cc44684beda696f74d3aaa8a5e58c816214b9046512240ef437"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:586d0d636f9a628ddc6a17bfd45aa5b5efaf1606d2b60fa5d87b8986326e933f"}, + {file = "msgpack-1.0.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a740fa0e4087a734455f0fc3abf5e746004c9da72fbd541e9b113013c8dc3282"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:3055b0455e45810820db1f29d900bf39466df96ddca11dfa6d074fa47054376d"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:a61215eac016f391129a013c9e46f3ab308db5f5ec9f25811e811f96962599a8"}, + {file = "msgpack-1.0.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:362d9655cd369b08fda06b6657a303eb7172d5279997abe094512e919cf74b11"}, + {file = "msgpack-1.0.5-cp39-cp39-win32.whl", hash = "sha256:ac9dd47af78cae935901a9a500104e2dea2e253207c924cc95de149606dc43cc"}, + {file = "msgpack-1.0.5-cp39-cp39-win_amd64.whl", hash = "sha256:06f5174b5f8ed0ed919da0e62cbd4ffde676a374aba4020034da05fab67b9164"}, + {file = "msgpack-1.0.5.tar.gz", hash = "sha256:c075544284eadc5cddc70f4757331d99dcbc16b2bbd4849d15f8aae4cf36d31c"}, +] + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] + +[[package]] +name = "mypy" +version = "0.782" +description = "Optional static typing for Python" +category = "dev" +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy-0.782-cp35-cp35m-macosx_10_6_x86_64.whl", hash = "sha256:2c6cde8aa3426c1682d35190b59b71f661237d74b053822ea3d748e2c9578a7c"}, + {file = "mypy-0.782-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:9c7a9a7ceb2871ba4bac1cf7217a7dd9ccd44c27c2950edbc6dc08530f32ad4e"}, + {file = "mypy-0.782-cp35-cp35m-win_amd64.whl", hash = "sha256:c05b9e4fb1d8a41d41dec8786c94f3b95d3c5f528298d769eb8e73d293abc48d"}, + {file = "mypy-0.782-cp36-cp36m-macosx_10_6_x86_64.whl", hash = "sha256:6731603dfe0ce4352c555c6284c6db0dc935b685e9ce2e4cf220abe1e14386fd"}, + {file = "mypy-0.782-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:f05644db6779387ccdb468cc47a44b4356fc2ffa9287135d05b70a98dc83b89a"}, + {file = "mypy-0.782-cp36-cp36m-win_amd64.whl", hash = "sha256:b7fbfabdbcc78c4f6fc4712544b9b0d6bf171069c6e0e3cb82440dd10ced3406"}, + {file = "mypy-0.782-cp37-cp37m-macosx_10_6_x86_64.whl", hash = "sha256:3fdda71c067d3ddfb21da4b80e2686b71e9e5c72cca65fa216d207a358827f86"}, + {file = "mypy-0.782-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d7df6eddb6054d21ca4d3c6249cae5578cb4602951fd2b6ee2f5510ffb098707"}, + {file = "mypy-0.782-cp37-cp37m-win_amd64.whl", hash = "sha256:a4a2cbcfc4cbf45cd126f531dedda8485671545b43107ded25ce952aac6fb308"}, + {file = "mypy-0.782-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6bb93479caa6619d21d6e7160c552c1193f6952f0668cdda2f851156e85186fc"}, + {file = "mypy-0.782-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:81c7908b94239c4010e16642c9102bfc958ab14e36048fa77d0be3289dda76ea"}, + {file = "mypy-0.782-cp38-cp38-win_amd64.whl", hash = "sha256:5dd13ff1f2a97f94540fd37a49e5d255950ebcdf446fb597463a40d0df3fac8b"}, + {file = "mypy-0.782-py3-none-any.whl", hash = "sha256:e0b61738ab504e656d1fe4ff0c0601387a5489ca122d55390ade31f9ca0e252d"}, + {file = "mypy-0.782.tar.gz", hash = "sha256:eff7d4a85e9eea55afa34888dfeaccde99e7520b51f867ac28a48492c0b1130c"}, +] + +[package.dependencies] +mypy-extensions = ">=0.4.3,<0.5.0" +typed-ast = ">=1.4.0,<1.5.0" +typing-extensions = ">=3.7.4" + +[package.extras] +dmypy = ["psutil (>=4.0)"] + +[[package]] +name = "mypy-extensions" +version = "0.4.4" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +category = "dev" +optional = false +python-versions = ">=2.7" +files = [ + {file = "mypy_extensions-0.4.4.tar.gz", hash = "sha256:c8b707883a96efe9b4bb3aaf0dcc07e7e217d7d8368eec4db4049ee9e142f4fd"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "paramiko" +version = "2.12.0" +description = "SSH2 protocol library" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "paramiko-2.12.0-py2.py3-none-any.whl", hash = "sha256:b2df1a6325f6996ef55a8789d0462f5b502ea83b3c990cbb5bbe57345c6812c4"}, + {file = "paramiko-2.12.0.tar.gz", hash = "sha256:376885c05c5d6aa6e1f4608aac2a6b5b0548b1add40274477324605903d9cd49"}, +] + +[package.dependencies] +bcrypt = ">=3.1.3" +cryptography = ">=2.5" +pynacl = ">=1.0.1" +six = "*" + +[package.extras] +all = ["bcrypt (>=3.1.3)", "gssapi (>=1.4.1)", "invoke (>=1.3)", "pyasn1 (>=0.1.7)", "pynacl (>=1.0.1)", "pywin32 (>=2.1.8)"] +ed25519 = ["bcrypt (>=3.1.3)", "pynacl (>=1.0.1)"] +gssapi = ["gssapi (>=1.4.1)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] +invoke = ["invoke (>=1.3)"] + +[[package]] +name = "passlib" +version = "1.7.4" +description = "comprehensive password hashing framework supporting over 30 schemes" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, + {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, +] + +[package.extras] +argon2 = ["argon2-cffi (>=18.2.0)"] +bcrypt = ["bcrypt (>=3.1.0)"] +build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"] +totp = ["cryptography"] + +[[package]] +name = "pastel" +version = "0.2.1" +description = "Bring colors to your terminal." +category = "dev" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, + {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, +] + +[[package]] +name = "pathspec" +version = "0.11.2" +description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, +] + +[[package]] +name = "pip" +version = "23.2.1" +description = "The PyPA recommended tool for installing Python packages." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pip-23.2.1-py3-none-any.whl", hash = "sha256:7ccf472345f20d35bdc9d1841ff5f313260c2c33fe417f48c30ac46cccabf5be"}, + {file = "pip-23.2.1.tar.gz", hash = "sha256:fb0bd5435b3200c602b5bf61d2d43c2f13c02e29c1707567ae7fbc514eb9faf2"}, +] + +[[package]] +name = "pluggy" +version = "1.3.0" +description = "plugin and hook calling mechanisms for python" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poethepoet" +version = "0.10.0" +description = "A task runner that works well with poetry." +category = "dev" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "poethepoet-0.10.0-py3-none-any.whl", hash = "sha256:6fb3021603d4421c6fcc40072bbcf150a6c52ef70ff4d3be089b8b04e015ef5a"}, + {file = "poethepoet-0.10.0.tar.gz", hash = "sha256:70b97cb194b978dc464c70793e85e6f746cddf82b84a38bfb135946ad71ae19c"}, +] + +[package.dependencies] +pastel = ">=0.2.0,<0.3.0" +tomlkit = ">=0.6.0,<1.0.0" + +[[package]] +name = "protobuf" +version = "3.13.0" +description = "Protocol Buffers" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "protobuf-3.13.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9c2e63c1743cba12737169c447374fab3dfeb18111a460a8c1a000e35836b18c"}, + {file = "protobuf-3.13.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1e834076dfef9e585815757a2c7e4560c7ccc5962b9d09f831214c693a91b463"}, + {file = "protobuf-3.13.0-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:df3932e1834a64b46ebc262e951cd82c3cf0fa936a154f0a42231140d8237060"}, + {file = "protobuf-3.13.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8c35bcbed1c0d29b127c886790e9d37e845ffc2725cc1db4bd06d70f4e8359f4"}, + {file = "protobuf-3.13.0-cp35-cp35m-win32.whl", hash = "sha256:339c3a003e3c797bc84499fa32e0aac83c768e67b3de4a5d7a5a9aa3b0da634c"}, + {file = "protobuf-3.13.0-cp35-cp35m-win_amd64.whl", hash = "sha256:361acd76f0ad38c6e38f14d08775514fbd241316cce08deb2ce914c7dfa1184a"}, + {file = "protobuf-3.13.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9edfdc679a3669988ec55a989ff62449f670dfa7018df6ad7f04e8dbacb10630"}, + {file = "protobuf-3.13.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5db9d3e12b6ede5e601b8d8684a7f9d90581882925c96acf8495957b4f1b204b"}, + {file = "protobuf-3.13.0-cp36-cp36m-win32.whl", hash = "sha256:c8abd7605185836f6f11f97b21200f8a864f9cb078a193fe3c9e235711d3ff1e"}, + {file = "protobuf-3.13.0-cp36-cp36m-win_amd64.whl", hash = "sha256:4d1174c9ed303070ad59553f435846a2f877598f59f9afc1b89757bdf846f2a7"}, + {file = "protobuf-3.13.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0bba42f439bf45c0f600c3c5993666fcb88e8441d011fad80a11df6f324eef33"}, + {file = "protobuf-3.13.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c0c5ab9c4b1eac0a9b838f1e46038c3175a95b0f2d944385884af72876bd6bc7"}, + {file = "protobuf-3.13.0-cp37-cp37m-win32.whl", hash = "sha256:f68eb9d03c7d84bd01c790948320b768de8559761897763731294e3bc316decb"}, + {file = "protobuf-3.13.0-cp37-cp37m-win_amd64.whl", hash = "sha256:91c2d897da84c62816e2f473ece60ebfeab024a16c1751aaf31100127ccd93ec"}, + {file = "protobuf-3.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3dee442884a18c16d023e52e32dd34a8930a889e511af493f6dc7d4d9bf12e4f"}, + {file = "protobuf-3.13.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:e7662437ca1e0c51b93cadb988f9b353fa6b8013c0385d63a70c8a77d84da5f9"}, + {file = "protobuf-3.13.0-py2.py3-none-any.whl", hash = "sha256:d69697acac76d9f250ab745b46c725edf3e98ac24763990b24d58c16c642947a"}, + {file = "protobuf-3.13.0.tar.gz", hash = "sha256:6a82e0c8bb2bf58f606040cc5814e07715b2094caeba281e2e7d0b0e2e397db5"}, +] + +[package.dependencies] +setuptools = "*" +six = ">=1.9" + +[[package]] +name = "publicsuffix2" +version = "2.20191221" +description = "Get a public suffix for a domain name using the Public Suffix List. Forked from and using the same API as the publicsuffix package." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "publicsuffix2-2.20191221-py2.py3-none-any.whl", hash = "sha256:786b5e36205b88758bd3518725ec8cfe7a8173f5269354641f581c6b80a99893"}, + {file = "publicsuffix2-2.20191221.tar.gz", hash = "sha256:00f8cc31aa8d0d5592a5ced19cccba7de428ebca985db26ac852d920ddd6fe7b"}, +] + +[[package]] +name = "py" +version = "1.11.0" +description = "library with cross-python path, ini-parsing, io, code, log facilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] + +[[package]] +name = "pyasn1" +version = "0.4.8" +description = "ASN.1 types and codecs" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, + {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pydivert" +version = "2.1.0" +description = "Python binding to windivert driver" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pydivert-2.1.0-py2.py3-none-any.whl", hash = "sha256:382db488e3c37c03ec9ec94e061a0b24334d78dbaeebb7d4e4d32ce4355d9da1"}, + {file = "pydivert-2.1.0.tar.gz", hash = "sha256:f0e150f4ff591b78e35f514e319561dadff7f24a82186a171dd4d465483de5b4"}, +] + +[package.extras] +docs = ["sphinx (>=1.4.8)"] +test = ["codecov (>=2.0.5)", "hypothesis (>=3.5.3)", "mock (>=1.0.1)", "pytest (>=3.0.3)", "pytest-cov (>=2.2.1)", "pytest-faulthandler (>=1.3.0,<2)", "pytest-timeout (>=1.0.0,<2)", "wheel (>=0.29)"] + +[[package]] +name = "pynacl" +version = "1.5.0" +description = "Python binding to the Networking and Cryptography (NaCl) library" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, + {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, +] + +[package.dependencies] +cffi = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] +tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] + +[[package]] +name = "pyopenssl" +version = "19.1.0" +description = "Python wrapper module around the OpenSSL library" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pyOpenSSL-19.1.0-py2.py3-none-any.whl", hash = "sha256:621880965a720b8ece2f1b2f54ea2071966ab00e2970ad2ce11d596102063504"}, + {file = "pyOpenSSL-19.1.0.tar.gz", hash = "sha256:9a24494b2602aaf402be5c9e30a0b82d4a5c67528fe8fb475e3f3bc00dd69507"}, +] + +[package.dependencies] +cryptography = ">=2.8" +six = ">=1.5.2" + +[package.extras] +docs = ["sphinx", "sphinx-rtd-theme"] +test = ["flaky", "pretend", "pytest (>=3.0.1)"] + +[[package]] +name = "pyparsing" +version = "2.4.7" +description = "Python parsing module" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, + {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, +] + +[[package]] +name = "pyperclip" +version = "1.8.2" +description = "A cross-platform clipboard module for Python. (Only handles plain text for now.)" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pyperclip-1.8.2.tar.gz", hash = "sha256:105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57"}, +] + +[[package]] +name = "pyrsistent" +version = "0.19.3" +description = "Persistent/Functional/Immutable data structures" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, + {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, + {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, + {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, + {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, + {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, +] + +[[package]] +name = "pytest" +version = "6.2.5" +description = "pytest: simple powerful testing with Python" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] + +[package.dependencies] +atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} +attrs = ">=19.2.0" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +py = ">=1.8.2" +toml = "*" + +[package.extras] +testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "0.20.3" +description = "Pytest support for asyncio" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-asyncio-0.20.3.tar.gz", hash = "sha256:83cbf01169ce3e8eb71c6c278ccb0574d1a7a3bb8eaaf5e50e0ad342afb33b36"}, + {file = "pytest_asyncio-0.20.3-py3-none-any.whl", hash = "sha256:f129998b209d04fcc65c96fc85c11e5316738358909a8399e93be553d7656442"}, +] + +[package.dependencies] +pytest = ">=6.1.0" + +[package.extras] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] + +[[package]] +name = "pytest-rerunfailures" +version = "10.3" +description = "pytest plugin to re-run tests to eliminate flaky failures" +category = "main" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pytest-rerunfailures-10.3.tar.gz", hash = "sha256:d8244d799f89a6edb5e57301ddaeb3b6f10d6691638d51e80b371311592e28c6"}, + {file = "pytest_rerunfailures-10.3-py3-none-any.whl", hash = "sha256:6be6f96510bf94b54198bf15bc5568fe2cdff88e83875912e22d29810acf65ff"}, +] + +[package.dependencies] +packaging = ">=17.1" +pytest = ">=5.3" + +[[package]] +name = "pytest-split" +version = "0.8.1" +description = "Pytest plugin which splits the test suite to equally sized sub suites based on test execution time." +category = "main" +optional = false +python-versions = ">=3.7.1,<4.0" +files = [ + {file = "pytest_split-0.8.1-py3-none-any.whl", hash = "sha256:74b110ea091bd147cc1c5f9665a59506e5cedfa66f96a89fb03e4ab447c2c168"}, + {file = "pytest_split-0.8.1.tar.gz", hash = "sha256:2d88bd3dc528689a7a3f58fc12ea165c3aa62e90795e420dfad920afe5612d6d"}, +] + +[package.dependencies] +pytest = ">=5,<8" + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +category = "main" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "0.21.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python-dotenv-0.21.1.tar.gz", hash = "sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49"}, + {file = "python_dotenv-0.21.1-py3-none-any.whl", hash = "sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "pywin32" +version = "227" +description = "Python for Window Extensions" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-227-cp27-cp27m-win32.whl", hash = "sha256:371fcc39416d736401f0274dd64c2302728c9e034808e37381b5e1b22be4a6b0"}, + {file = "pywin32-227-cp27-cp27m-win_amd64.whl", hash = "sha256:4cdad3e84191194ea6d0dd1b1b9bdda574ff563177d2adf2b4efec2a244fa116"}, + {file = "pywin32-227-cp35-cp35m-win32.whl", hash = "sha256:f4c5be1a293bae0076d93c88f37ee8da68136744588bc5e2be2f299a34ceb7aa"}, + {file = "pywin32-227-cp35-cp35m-win_amd64.whl", hash = "sha256:a929a4af626e530383a579431b70e512e736e9588106715215bf685a3ea508d4"}, + {file = "pywin32-227-cp36-cp36m-win32.whl", hash = "sha256:300a2db938e98c3e7e2093e4491439e62287d0d493fe07cce110db070b54c0be"}, + {file = "pywin32-227-cp36-cp36m-win_amd64.whl", hash = "sha256:9b31e009564fb95db160f154e2aa195ed66bcc4c058ed72850d047141b36f3a2"}, + {file = "pywin32-227-cp37-cp37m-win32.whl", hash = "sha256:47a3c7551376a865dd8d095a98deba954a98f326c6fe3c72d8726ca6e6b15507"}, + {file = "pywin32-227-cp37-cp37m-win_amd64.whl", hash = "sha256:31f88a89139cb2adc40f8f0e65ee56a8c585f629974f9e07622ba80199057511"}, + {file = "pywin32-227-cp38-cp38-win32.whl", hash = "sha256:7f18199fbf29ca99dff10e1f09451582ae9e372a892ff03a28528a24d55875bc"}, + {file = "pywin32-227-cp38-cp38-win_amd64.whl", hash = "sha256:7c1ae32c489dc012930787f06244426f8356e129184a02c25aef163917ce158e"}, + {file = "pywin32-227-cp39-cp39-win32.whl", hash = "sha256:c054c52ba46e7eb6b7d7dfae4dbd987a1bb48ee86debe3f245a2884ece46e295"}, + {file = "pywin32-227-cp39-cp39-win_amd64.whl", hash = "sha256:f27cec5e7f588c3d1051651830ecc00294f90728d19c3bf6916e6dba93ea357c"}, +] + +[[package]] +name = "pyyaml" +version = "5.4.1" +description = "YAML parser and emitter for Python" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, + {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, + {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, + {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, + {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, + {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, + {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, + {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, + {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, + {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, + {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, + {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, + {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, + {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, + {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, + {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, + {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, + {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, + {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, + {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, + {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, +] + +[[package]] +name = "regex" +version = "2023.8.8" +description = "Alternative regular expression module, to replace re." +category = "dev" +optional = false +python-versions = ">=3.6" +files = [ + {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, + {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, + {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, + {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, + {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, + {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, + {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, + {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, + {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, + {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, + {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, + {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, + {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, + {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, + {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, + {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, + {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, + {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, + {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, + {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, + {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, + {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, + {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "ruamel-yaml" +version = "0.16.13" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "ruamel.yaml-0.16.13-py2.py3-none-any.whl", hash = "sha256:64b06e7873eb8e1125525ecef7345447d786368cadca92a7cd9b59eae62e95a3"}, + {file = "ruamel.yaml-0.16.13.tar.gz", hash = "sha256:bb48c514222702878759a05af96f4b7ecdba9b33cd4efcf25c86b882cef3a942"}, +] + +[package.dependencies] +"ruamel.yaml.clib" = {version = ">=0.1.2", markers = "platform_python_implementation == \"CPython\" and python_version < \"3.10\""} + +[package.extras] +docs = ["ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[[package]] +name = "ruamel-yaml-clib" +version = "0.2.7" +description = "C version of reader, parser and emitter for ruamel.yaml derived from libyaml" +category = "main" +optional = false +python-versions = ">=3.5" +files = [ + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5859983f26d8cd7bb5c287ef452e8aacc86501487634573d260968f753e1d71"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:debc87a9516b237d0466a711b18b6ebeb17ba9f391eb7f91c649c5c4ec5006c7"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:df5828871e6648db72d1c19b4bd24819b80a755c4541d3409f0f7acd0f335c80"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:efa08d63ef03d079dcae1dfe334f6c8847ba8b645d08df286358b1f5293d24ab"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win32.whl", hash = "sha256:763d65baa3b952479c4e972669f679fe490eee058d5aa85da483ebae2009d231"}, + {file = "ruamel.yaml.clib-0.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:d000f258cf42fec2b1bbf2863c61d7b8918d31ffee905da62dede869254d3b8a"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:045e0626baf1c52e5527bd5db361bc83180faaba2ff586e763d3d5982a876a9e"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-macosx_12_6_arm64.whl", hash = "sha256:721bc4ba4525f53f6a611ec0967bdcee61b31df5a56801281027a3a6d1c2daf5"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:41d0f1fa4c6830176eef5b276af04c89320ea616655d01327d5ce65e50575c94"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win32.whl", hash = "sha256:f6d3d39611ac2e4f62c3128a9eed45f19a6608670c5a2f4f07f24e8de3441d38"}, + {file = "ruamel.yaml.clib-0.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:da538167284de58a52109a9b89b8f6a53ff8437dd6dc26d33b57bf6699153122"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:4b3a93bb9bc662fc1f99c5c3ea8e623d8b23ad22f861eb6fce9377ac07ad6072"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-macosx_12_0_arm64.whl", hash = "sha256:a234a20ae07e8469da311e182e70ef6b199d0fbeb6c6cc2901204dd87fb867e8"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:15910ef4f3e537eea7fe45f8a5d19997479940d9196f357152a09031c5be59f3"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:370445fd795706fd291ab00c9df38a0caed0f17a6fb46b0f607668ecb16ce763"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win32.whl", hash = "sha256:ecdf1a604009bd35c674b9225a8fa609e0282d9b896c03dd441a91e5f53b534e"}, + {file = "ruamel.yaml.clib-0.2.7-cp36-cp36m-win_amd64.whl", hash = "sha256:f34019dced51047d6f70cb9383b2ae2853b7fc4dce65129a5acd49f4f9256646"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:2aa261c29a5545adfef9296b7e33941f46aa5bbd21164228e833412af4c9c75f"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-macosx_12_0_arm64.whl", hash = "sha256:f01da5790e95815eb5a8a138508c01c758e5f5bc0ce4286c4f7028b8dd7ac3d0"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:40d030e2329ce5286d6b231b8726959ebbe0404c92f0a578c0e2482182e38282"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:c3ca1fbba4ae962521e5eb66d72998b51f0f4d0f608d3c0347a48e1af262efa7"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win32.whl", hash = "sha256:7bdb4c06b063f6fd55e472e201317a3bb6cdeeee5d5a38512ea5c01e1acbdd93"}, + {file = "ruamel.yaml.clib-0.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:be2a7ad8fd8f7442b24323d24ba0b56c51219513cfa45b9ada3b87b76c374d4b"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:91a789b4aa0097b78c93e3dc4b40040ba55bef518f84a40d4442f713b4094acb"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:99e77daab5d13a48a4054803d052ff40780278240a902b880dd37a51ba01a307"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3243f48ecd450eddadc2d11b5feb08aca941b5cd98c9b1db14b2fd128be8c697"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:8831a2cedcd0f0927f788c5bdf6567d9dc9cc235646a434986a852af1cb54b4b"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win32.whl", hash = "sha256:3110a99e0f94a4a3470ff67fc20d3f96c25b13d24c6980ff841e82bafe827cac"}, + {file = "ruamel.yaml.clib-0.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:92460ce908546ab69770b2e576e4f99fbb4ce6ab4b245345a3869a0a0410488f"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5bc0667c1eb8f83a3752b71b9c4ba55ef7c7058ae57022dd9b29065186a113d9"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:4a4d8d417868d68b979076a9be6a38c676eca060785abaa6709c7b31593c35d1"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bf9a6bc4a0221538b1a7de3ed7bca4c93c02346853f44e1cd764be0023cd3640"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:a7b301ff08055d73223058b5c46c55638917f04d21577c95e00e0c4d79201a6b"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win32.whl", hash = "sha256:d5e51e2901ec2366b79f16c2299a03e74ba4531ddcfacc1416639c557aef0ad8"}, + {file = "ruamel.yaml.clib-0.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:184faeaec61dbaa3cace407cffc5819f7b977e75360e8d5ca19461cd851a5fc5"}, + {file = "ruamel.yaml.clib-0.2.7.tar.gz", hash = "sha256:1f08fd5a2bea9c4180db71678e850b995d2a5f4537be0e94557668cf0f5f9497"}, +] + +[[package]] +name = "setuptools" +version = "68.2.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, + {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sortedcontainers" +version = "2.2.2" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "sortedcontainers-2.2.2-py2.py3-none-any.whl", hash = "sha256:c633ebde8580f241f274c1f8994a665c0e54a17724fecd0cae2f079e09c36d3f"}, + {file = "sortedcontainers-2.2.2.tar.gz", hash = "sha256:4e73a757831fc3ca4de2859c422564239a31d8213d09a2a666e375807034d2ba"}, +] + +[[package]] +name = "texttable" +version = "1.6.7" +description = "module to create simple ASCII tables" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "texttable-1.6.7-py2.py3-none-any.whl", hash = "sha256:b7b68139aa8a6339d2c320ca8b1dc42d13a7831a346b446cb9eb385f0c76310c"}, + {file = "texttable-1.6.7.tar.gz", hash = "sha256:290348fb67f7746931bcdfd55ac7584ecd4e5b0846ab164333f0794b121760f2"}, +] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + +[[package]] +name = "tomlkit" +version = "0.12.1" +description = "Style preserving TOML library" +category = "dev" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomlkit-0.12.1-py3-none-any.whl", hash = "sha256:712cbd236609acc6a3e2e97253dfc52d4c2082982a88f61b640ecf0817eab899"}, + {file = "tomlkit-0.12.1.tar.gz", hash = "sha256:38e1ff8edb991273ec9f6181244a6a391ac30e9f5098e7535640ea6be97a7c86"}, +] + +[[package]] +name = "tornado" +version = "6.3.3" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +category = "main" +optional = false +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, + {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, + {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, + {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, +] + +[[package]] +name = "transitions" +version = "0.8.11" +description = "A lightweight, object-oriented Python state machine implementation with many extensions." +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "transitions-0.8.11-py2.py3-none-any.whl", hash = "sha256:9525dd9b708b0a54bb4562a06a483d237e75c94547ba9831c81c6872d0ea1522"}, + {file = "transitions-0.8.11.tar.gz", hash = "sha256:7b20d32906ea4d60ee6f6c1f5dc9c9f178802425c5b155213eb0f25c277f04e4"}, +] + +[package.dependencies] +six = "*" + +[package.extras] +diagrams = ["pygraphviz"] +test = ["pytest"] + +[[package]] +name = "typed-ast" +version = "1.4.3" +description = "a fork of Python 2 and 3 ast modules with type comment support" +category = "dev" +optional = false +python-versions = "*" +files = [ + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:2068531575a125b87a41802130fa7e29f26c09a2833fea68d9a40cf33902eba6"}, + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:c907f561b1e83e93fad565bac5ba9c22d96a54e7ea0267c708bffe863cbe4075"}, + {file = "typed_ast-1.4.3-cp35-cp35m-manylinux2014_aarch64.whl", hash = "sha256:1b3ead4a96c9101bef08f9f7d1217c096f31667617b58de957f690c92378b528"}, + {file = "typed_ast-1.4.3-cp35-cp35m-win32.whl", hash = "sha256:dde816ca9dac1d9c01dd504ea5967821606f02e510438120091b84e852367428"}, + {file = "typed_ast-1.4.3-cp35-cp35m-win_amd64.whl", hash = "sha256:777a26c84bea6cd934422ac2e3b78863a37017618b6e5c08f92ef69853e765d3"}, + {file = "typed_ast-1.4.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f8afcf15cc511ada719a88e013cec87c11aff7b91f019295eb4530f96fe5ef2f"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:52b1eb8c83f178ab787f3a4283f68258525f8d70f778a2f6dd54d3b5e5fb4341"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:01ae5f73431d21eead5015997ab41afa53aa1fbe252f9da060be5dad2c730ace"}, + {file = "typed_ast-1.4.3-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:c190f0899e9f9f8b6b7863debfb739abcb21a5c054f911ca3596d12b8a4c4c7f"}, + {file = "typed_ast-1.4.3-cp36-cp36m-win32.whl", hash = "sha256:398e44cd480f4d2b7ee8d98385ca104e35c81525dd98c519acff1b79bdaac363"}, + {file = "typed_ast-1.4.3-cp36-cp36m-win_amd64.whl", hash = "sha256:bff6ad71c81b3bba8fa35f0f1921fb24ff4476235a6e94a26ada2e54370e6da7"}, + {file = "typed_ast-1.4.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0fb71b8c643187d7492c1f8352f2c15b4c4af3f6338f21681d3681b3dc31a266"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:760ad187b1041a154f0e4d0f6aae3e40fdb51d6de16e5c99aedadd9246450e9e"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:5feca99c17af94057417d744607b82dd0a664fd5e4ca98061480fd8b14b18d04"}, + {file = "typed_ast-1.4.3-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:95431a26309a21874005845c21118c83991c63ea800dd44843e42a916aec5899"}, + {file = "typed_ast-1.4.3-cp37-cp37m-win32.whl", hash = "sha256:aee0c1256be6c07bd3e1263ff920c325b59849dc95392a05f258bb9b259cf39c"}, + {file = "typed_ast-1.4.3-cp37-cp37m-win_amd64.whl", hash = "sha256:9ad2c92ec681e02baf81fdfa056fe0d818645efa9af1f1cd5fd6f1bd2bdfd805"}, + {file = "typed_ast-1.4.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b36b4f3920103a25e1d5d024d155c504080959582b928e91cb608a65c3a49e1a"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_i686.whl", hash = "sha256:067a74454df670dcaa4e59349a2e5c81e567d8d65458d480a5b3dfecec08c5ff"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7538e495704e2ccda9b234b82423a4038f324f3a10c43bc088a1636180f11a41"}, + {file = "typed_ast-1.4.3-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:af3d4a73793725138d6b334d9d247ce7e5f084d96284ed23f22ee626a7b88e39"}, + {file = "typed_ast-1.4.3-cp38-cp38-win32.whl", hash = "sha256:f2362f3cb0f3172c42938946dbc5b7843c2a28aec307c49100c8b38764eb6927"}, + {file = "typed_ast-1.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:dd4a21253f42b8d2b48410cb31fe501d32f8b9fbeb1f55063ad102fe9c425e40"}, + {file = "typed_ast-1.4.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f328adcfebed9f11301eaedfa48e15bdece9b519fb27e6a8c01aa52a17ec31b3"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_i686.whl", hash = "sha256:2c726c276d09fc5c414693a2de063f521052d9ea7c240ce553316f70656c84d4"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:cae53c389825d3b46fb37538441f75d6aecc4174f615d048321b716df2757fb0"}, + {file = "typed_ast-1.4.3-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:b9574c6f03f685070d859e75c7f9eeca02d6933273b5e69572e5ff9d5e3931c3"}, + {file = "typed_ast-1.4.3-cp39-cp39-win32.whl", hash = "sha256:209596a4ec71d990d71d5e0d312ac935d86930e6eecff6ccc7007fe54d703808"}, + {file = "typed_ast-1.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:9c6d1a54552b5330bc657b7ef0eae25d00ba7ffe85d9ea8ae6540d2197a3788c"}, + {file = "typed_ast-1.4.3.tar.gz", hash = "sha256:fb1bbeac803adea29cedd70781399c99138358c26d05fcbd23c13016b7f5ec65"}, +] + +[[package]] +name = "typing-extensions" +version = "3.10.0.2" +description = "Backported and Experimental Type Hints for Python 3.5+" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, + {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, + {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, +] + +[[package]] +name = "urllib3" +version = "1.26.16" +description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, + {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "urwid" +version = "2.1.2" +description = "A full-featured console (xterm et al.) user interface library" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "urwid-2.1.2.tar.gz", hash = "sha256:588bee9c1cb208d0906a9f73c613d2bd32c3ed3702012f51efe318a3f2127eae"}, +] + +[[package]] +name = "websocket-client" +version = "0.59.0" +description = "WebSocket client for Python with low level API options" +category = "main" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "websocket-client-0.59.0.tar.gz", hash = "sha256:d376bd60eace9d437ab6d7ee16f4ab4e821c9dae591e1b783c58ebd8aaf80c5c"}, + {file = "websocket_client-0.59.0-py2.py3-none-any.whl", hash = "sha256:2e50d26ca593f70aba7b13a489435ef88b8fc3b5c5643c1ce8808ff9b40f0b32"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "werkzeug" +version = "1.0.1" +description = "The comprehensive WSGI web application library." +category = "main" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "Werkzeug-1.0.1-py2.py3-none-any.whl", hash = "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43"}, + {file = "Werkzeug-1.0.1.tar.gz", hash = "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c"}, +] + +[package.extras] +dev = ["coverage", "pallets-sphinx-themes", "pytest", "pytest-timeout", "sphinx", "sphinx-issues", "tox"] +watchdog = ["watchdog"] + +[[package]] +name = "wsproto" +version = "0.15.0" +description = "WebSockets state-machine based protocol implementation" +category = "main" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "wsproto-0.15.0-py2.py3-none-any.whl", hash = "sha256:e3d190a11d9307112ba23bbe60055604949b172143969c8f641318476a9b6f1d"}, + {file = "wsproto-0.15.0.tar.gz", hash = "sha256:614798c30e5dc2b3f65acc03d2d50842b97621487350ce79a80a711229edfa9d"}, +] + +[package.dependencies] +h11 = ">=0.8.1" + +[[package]] +name = "ya-aioclient" +version = "0.6.4" +description = "" +category = "main" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "ya-aioclient-0.6.4.tar.gz", hash = "sha256:e5e5926e3a7d834082b05aeb986d8fb2f7fa46a1bd1bca2f3f1c872e1ba479ae"}, + {file = "ya_aioclient-0.6.4-py3-none-any.whl", hash = "sha256:1d36c2544c2d7629a00a2b1f18b4535e836586cae99bfbf5714ed5ca3f9caa0c"}, +] + +[package.dependencies] +aiohttp = ">=3.6.2,<4.0.0" +certifi = ">=2020.6.20,<2021.0.0" +python-dateutil = ">=2.8.1,<3.0.0" + +[[package]] +name = "yarl" +version = "1.9.2" +description = "Yet another URL library" +category = "main" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[[package]] +name = "zstandard" +version = "0.14.1" +description = "Zstandard bindings for Python" +category = "main" +optional = false +python-versions = "*" +files = [ + {file = "zstandard-0.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ec1a20936484f3804fba4f29f7d8ed67c70e44536b0f0191a13eff4dc61c815c"}, + {file = "zstandard-0.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:85b37acd054f8f778e5c9832e17fb651f321a3daafa0eb94360eeffce141b0cf"}, + {file = "zstandard-0.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:95939a7e3972ec20e2e959ee9cd0fd858b25ff3a6f5040c5c78fcab51eeab030"}, + {file = "zstandard-0.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:d3999f92ab7aab2a99ac7f7730b3bee8d6bd3e52953ed0e87ab881ca4244a315"}, + {file = "zstandard-0.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:8df3114dfff411aa9827d754bb8fdcdaa15e63c96d7730778fe322f4c85360d8"}, + {file = "zstandard-0.14.1-cp27-cp27m-win32.whl", hash = "sha256:4e6d6b0e541b00d0096a260d5f6eb32f737bfcdb2e5b87a7b7be77ef669c7a6c"}, + {file = "zstandard-0.14.1-cp27-cp27m-win_amd64.whl", hash = "sha256:064aac12b8e7813fa3870e7479e9cbd3803e33212b68e555b408711ea8f6cb54"}, + {file = "zstandard-0.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:b508a826c4b99835e3d8a8d415a6e516cacad4a95ef5ed01f60f9b067f200a51"}, + {file = "zstandard-0.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a72cb707cc0a9d06e3912fe5b6c1648d70ac512f3e180018c82fe926926be12c"}, + {file = "zstandard-0.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:1c065de617b7367c4da4de687a071932e48ae200d09c0afbc24415d98aec470d"}, + {file = "zstandard-0.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:391c30620e3ad6bc53804f32e3f74cbbaa713d95f46ac5f2e54e735d1dfc51c0"}, + {file = "zstandard-0.14.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:403fa9544ecdedcc5fdc48f5e41e092658ac48222cfe6e75fb5710cb3d14c700"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:657a49b1df5a82985ea6495c6c1497a17e34e41a0bd8ef95a640342a19b8e6a4"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c3c9657417bf1eccb94ad64544e12efa8ea3e16612944b32e253314472a54e5"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:d2db7bcdc9b3e5a782d71df0163a6587b8b2f759cc4a819859e27e6ad2f778e6"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:1be45b237fea45c705d83215450a9381c2787bbf0720824b1fe23ed72f8db0b7"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux2014_i686.whl", hash = "sha256:477db538b596767d036379165a27aa2e19edbae50bec4cea195a986ba50bbad6"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:ac9b88a72f2dcfa3facbe6af96d59e82459e5815c15aa59481cc6080937ee02e"}, + {file = "zstandard-0.14.1-cp35-cp35m-win32.whl", hash = "sha256:2826d664eb84f9efe0fae47cf20c27f3662aae3556fbcc4cecd5318fbc9239f3"}, + {file = "zstandard-0.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:36cd223d7fd0fe0e32e82993240e9a24503269c93431e62369088e2299cf4605"}, + {file = "zstandard-0.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d4a7065d7fc991edb93483dbb7bc37dd091a2bac9572d9b9df243e6565d30522"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6f437168752e50ad6a47d054f4a41933693b1675f65663c117067747d95f057c"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e80ade52a06fb433c9ad7d6c8cfb3dafa34f05bedce543e95a670972ba41d65d"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:0b3ae587556a6f45cd982d7684b1318793430d0ae9e376dbc3d877b48ac6d576"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:d34848645f3507dc85baa8c67426f0685b08583e930fa3a1ab5048c5f0ba8fc1"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:5be097127be1659bc6cffb5d885c781e61947597e2fcd1ecf48713313e53657d"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:e3731e0dc1c200e5c2f56ca36bed6c28903f764769f534fbf9ed4178f193e8aa"}, + {file = "zstandard-0.14.1-cp36-cp36m-win32.whl", hash = "sha256:aab21dd5724aa5bdd0aac16f5d175e5df0715fc614910220a918d50f08321982"}, + {file = "zstandard-0.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:ed14a62f8bf2462f19373c337527ff684deb6d0d6b973fbcaece1f561c30f405"}, + {file = "zstandard-0.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:db1b3442441577d81bdae85fc7a4bd553e3161ec745e9dd1f2f93889248363fe"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:8486a01696e3cdfa47b93caa8f5064c9d277bad1c39eb31947bf2b8f019e3510"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4b054fd8cf274b958a3d7a201f8b42a30ebf8f76d87770075e1aca6017006e97"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:fb5f0d29bcbfba6ef9beccba55f567d089747034add5cd7e8dc58842bb745803"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:90f0bb1adcfea326c6548a45cc35474bec56a34d80310b6e78abab313da780fc"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:0b57df1f9530669d61f8708eb15ded6584db4a6733cc5155eb8561d31f292557"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:3948000d753b9110e1eb43a6cba6fdb64c895faebb47628a96550edc5238b78a"}, + {file = "zstandard-0.14.1-cp37-cp37m-win32.whl", hash = "sha256:17e8f29aae79d870daa3ab48c0dbf83594bf956c2c2125ae45cdfebd2b62d8ed"}, + {file = "zstandard-0.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d7fecb5172dc885665581437fe96bf8f03ffc0022b723964c272accbb62713b4"}, + {file = "zstandard-0.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2fd76d29f4e8d7c4aac42617a0439506144146032b5d7b9b0a42f37f916fdb2"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:7309bf511c8b332be2b5a834efbd7ee0cd43db2c811dd916fd0f48acd43e8722"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:a51a09a3be208e627ebb518a78c639d240584f5d1da8106dcafa31d22103b4df"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a820ef78f39c29469caacb0bf43ffd024b78f242393c605daa748588b3247306"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:e3963c919f65367587cf987a71991e69385f19cec9ad8166249b83e176cdbcd8"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:0e5b8fd428d0d00fb7dabc0898de9e87659cb54738d527becff37d3d90df8e88"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:41eab10e6570e14dd77a346f3dbb1eab3f23a652bce07ba47c8c23116b0cee9c"}, + {file = "zstandard-0.14.1-cp38-cp38-win32.whl", hash = "sha256:fbbe18afb67329577ab6a907f348175d3f6044d179a9b56b02206ff9e67c5b12"}, + {file = "zstandard-0.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:3bd044ef32bd6738c3db2cb2d4bc77812e9a3132df942303bbfcd1a484023b60"}, + {file = "zstandard-0.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:24ab8f1c7c970822bd55dbb091f7eb271b417e777e8b3ae6722e60d67f747c05"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:cf67443d06b88218eb8915da2d968dcf6fdc384fb245f97155617ff3b8d77e92"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d78db92ac27cdcd55333b7e642cd400719842e692e8836f0b249e459b26d384b"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bd4da25cc46e972b029f8aa9f103c5977dbe461e1916ff7edec24065071b4a08"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:2075be64372206af3df40fef0fee657b44845d3e6d98b4cc8aba220be861de2d"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:70dfe74b24971476a6a20d42abb964c9ac0fb1af7b89228e5845748377543bd0"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:3382ce6e44e9e847dce848bc2638403aa9320cb38edcc34b71e13be5793619e0"}, + {file = "zstandard-0.14.1-cp39-cp39-win32.whl", hash = "sha256:7161d71debb94c456cbddd8a239e89219f37f0b1a4c0620a2c1400801aeeec7d"}, + {file = "zstandard-0.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d2ec8309309fc7254d21286d6b3e5c28e4019cd8e266d1a860456a69ea7c2400"}, + {file = "zstandard-0.14.1.tar.gz", hash = "sha256:5dd700e52ec28c64d43f681ccde76b6436c8f89a332d6c9e22a6b629f28daeb5"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.8.0" +content-hash = "3bacb4b39f8331d894fba3d10b07d38cd1c61a88a23960a402c3c678134906c8" diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index c1eae31d73..6c6dc0ec64 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -28,7 +28,7 @@ pytest-rerunfailures = "^10.3" pytest-split = "^0.8.1" # goth = "0.15.1" # to use development goth version uncomment below -goth = { git = "https://github.com/golemfactory/goth.git", rev = "7033689d4200bde527666dcfe09db4fb72b708ac" } +goth = { git = "https://github.com/golemfactory/goth.git", rev = "324fa3e3c38a1f2ab0b3508cbdbf6152e4c03ec8" } [tool.poetry.dev-dependencies] black = "^20.8b1" From afdabbfe956ff277ace9046e85d23988923674aa Mon Sep 17 00:00:00 2001 From: scx1332 Date: Mon, 18 Sep 2023 16:49:29 +0200 Subject: [PATCH 076/123] Remove ports from configuration --- goth_tests/assets/docker/docker-compose.yml | 6 ------ 1 file changed, 6 deletions(-) diff --git a/goth_tests/assets/docker/docker-compose.yml b/goth_tests/assets/docker/docker-compose.yml index 7706372f3c..d570a8cd7a 100644 --- a/goth_tests/assets/docker/docker-compose.yml +++ b/goth_tests/assets/docker/docker-compose.yml @@ -26,22 +26,16 @@ services: ethereum-mainnet: image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:a93c126e8255 - ports: - - "8545:8545" environment: - GANACHE_CHAIN_ID=1 ethereum-goerli: image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:a93c126e8255 - ports: - - "8545:8545" environment: - GANACHE_CHAIN_ID=5 ethereum-polygon: image: docker.pkg.github.com/golemfactory/gnt2/gnt2-docker-yagna:a93c126e8255 - ports: - - "8545:8545" environment: - GANACHE_CHAIN_ID=137 From 976e86932ac4de5020a4c3db0c58e7c19f720e67 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 19 Sep 2023 11:58:39 +0200 Subject: [PATCH 077/123] Bump goth: fix merged logs --- goth_tests/poetry.lock | 8 ++++---- goth_tests/pyproject.toml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/goth_tests/poetry.lock b/goth_tests/poetry.lock index 3abdff8672..893eb346f9 100644 --- a/goth_tests/poetry.lock +++ b/goth_tests/poetry.lock @@ -730,7 +730,7 @@ dev = ["jsonref"] [[package]] name = "goth" -version = "0.15.1" +version = "0.15.2" description = "Golem Test Harness - integration testing framework" category = "main" optional = false @@ -757,8 +757,8 @@ ya-aioclient = "^0.6" [package.source] type = "git" url = "https://github.com/golemfactory/goth.git" -reference = "324fa3e3c38a1f2ab0b3508cbdbf6152e4c03ec8" -resolved_reference = "324fa3e3c38a1f2ab0b3508cbdbf6152e4c03ec8" +reference = "2848004464f2378696ceaecda29d6e6e8aedb98e" +resolved_reference = "2848004464f2378696ceaecda29d6e6e8aedb98e" [[package]] name = "h11" @@ -2330,4 +2330,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8.0" -content-hash = "3bacb4b39f8331d894fba3d10b07d38cd1c61a88a23960a402c3c678134906c8" +content-hash = "5ce9212fa1dcdd0d799ee26acf9988416e02d666dc9405df227cd05aef5427c9" diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index 6c6dc0ec64..3cb2ce6d6e 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -28,7 +28,7 @@ pytest-rerunfailures = "^10.3" pytest-split = "^0.8.1" # goth = "0.15.1" # to use development goth version uncomment below -goth = { git = "https://github.com/golemfactory/goth.git", rev = "324fa3e3c38a1f2ab0b3508cbdbf6152e4c03ec8" } +goth = { git = "https://github.com/golemfactory/goth.git", rev = "2848004464f2378696ceaecda29d6e6e8aedb98e" } [tool.poetry.dev-dependencies] black = "^20.8b1" From fbc242c02effac0010ed450244db6830644de72f Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 19 Sep 2023 12:25:16 +0200 Subject: [PATCH 078/123] goth: disable fast-fail --- .github/workflows/integration-test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/integration-test.yml b/.github/workflows/integration-test.yml index 05b3a582c3..b066c39b3c 100644 --- a/.github/workflows/integration-test.yml +++ b/.github/workflows/integration-test.yml @@ -35,6 +35,7 @@ jobs: runs-on: [goth, ubuntu-18.04] needs: test_check strategy: + fail-fast: false matrix: group: [1, 2] defaults: From 25885c400c55cef2a7f6adc93bd80e21998bf2cf Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 19 Sep 2023 12:49:36 +0200 Subject: [PATCH 079/123] Bump goth: re-run docker-compose down --- goth_tests/pyproject.toml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index 3cb2ce6d6e..5dc54dc750 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -26,9 +26,9 @@ pytest = "^6.2" pytest-asyncio = "^0.20.2" pytest-rerunfailures = "^10.3" pytest-split = "^0.8.1" -# goth = "0.15.1" +# goth = "0.15.2" # to use development goth version uncomment below -goth = { git = "https://github.com/golemfactory/goth.git", rev = "2848004464f2378696ceaecda29d6e6e8aedb98e" } +goth = { git = "https://github.com/golemfactory/goth.git", rev = "b36906be0ee1caed7941258eda9432f051b791d6" } [tool.poetry.dev-dependencies] black = "^20.8b1" From a67d3665d8430e328cbd6d291b22671f43d3f106 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 19 Sep 2023 14:05:54 +0200 Subject: [PATCH 080/123] activity-api: temporarily ignore event timeouts --- core/activity/src/provider/mod.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/activity/src/provider/mod.rs b/core/activity/src/provider/mod.rs index c64f61a468..bb3899172b 100644 --- a/core/activity/src/provider/mod.rs +++ b/core/activity/src/provider/mod.rs @@ -2,7 +2,6 @@ use actix_web::{web, Responder}; use ya_client_model::activity::{ActivityState, ProviderEvent}; use ya_client_model::market::Role; -use ya_service_bus::timeout::IntoTimeoutFuture; use ya_persistence::executor::DbExecutor; use ya_service_api_web::middleware::Identity; @@ -48,8 +47,8 @@ async fn get_events( query.after_timestamp, query.max_events, ) - .timeout(query.timeout) - .await?? + //.timeout(query.timeout) + .await? //? .into_iter() .collect::>(); From ad58e76acc6ef516381d8176f2276173c1ab2459 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 19 Sep 2023 16:05:04 +0200 Subject: [PATCH 081/123] activity-api: temporarily ignore get_batch_results request timeouts --- core/activity/src/requestor/control.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/core/activity/src/requestor/control.rs b/core/activity/src/requestor/control.rs index c99273ad09..b0b09fd94e 100644 --- a/core/activity/src/requestor/control.rs +++ b/core/activity/src/requestor/control.rs @@ -227,7 +227,7 @@ async fn await_results( let msg = activity::GetExecBatchResults { activity_id: path.activity_id.to_string(), batch_id: path.batch_id.to_string(), - timeout: query.timeout, + timeout: None, //query.timeout, command_index: query.command_index, }; @@ -235,8 +235,8 @@ async fn await_results( .to(*agreement.provider_id()) .service_transfer(&activity::exeunit::bus_id(&path.activity_id)) .send(msg) - .timeout(timeout_margin(query.timeout)) - .await???; + //.timeout(timeout_margin(query.timeout)) + .await??; Ok::<_, Error>(web::Json(results)) } From d7485e42dc140f0056da44f41d0044cbf6c609e6 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 22 Sep 2023 14:01:42 +0200 Subject: [PATCH 082/123] Fix collect_results ApiException (#2763) * Revert "activity-api: temporarily ignore get_batch_results request timeouts" * Revert "activity-api: temporarily ignore event timeouts" * Bump goth --- core/activity/src/provider/mod.rs | 5 ++- core/activity/src/requestor/control.rs | 6 +-- goth_tests/poetry.lock | 56 +++++++++----------------- goth_tests/pyproject.toml | 2 +- 4 files changed, 27 insertions(+), 42 deletions(-) diff --git a/core/activity/src/provider/mod.rs b/core/activity/src/provider/mod.rs index bb3899172b..c64f61a468 100644 --- a/core/activity/src/provider/mod.rs +++ b/core/activity/src/provider/mod.rs @@ -2,6 +2,7 @@ use actix_web::{web, Responder}; use ya_client_model::activity::{ActivityState, ProviderEvent}; use ya_client_model::market::Role; +use ya_service_bus::timeout::IntoTimeoutFuture; use ya_persistence::executor::DbExecutor; use ya_service_api_web::middleware::Identity; @@ -47,8 +48,8 @@ async fn get_events( query.after_timestamp, query.max_events, ) - //.timeout(query.timeout) - .await? //? + .timeout(query.timeout) + .await?? .into_iter() .collect::>(); diff --git a/core/activity/src/requestor/control.rs b/core/activity/src/requestor/control.rs index b0b09fd94e..c99273ad09 100644 --- a/core/activity/src/requestor/control.rs +++ b/core/activity/src/requestor/control.rs @@ -227,7 +227,7 @@ async fn await_results( let msg = activity::GetExecBatchResults { activity_id: path.activity_id.to_string(), batch_id: path.batch_id.to_string(), - timeout: None, //query.timeout, + timeout: query.timeout, command_index: query.command_index, }; @@ -235,8 +235,8 @@ async fn await_results( .to(*agreement.provider_id()) .service_transfer(&activity::exeunit::bus_id(&path.activity_id)) .send(msg) - //.timeout(timeout_margin(query.timeout)) - .await??; + .timeout(timeout_margin(query.timeout)) + .await???; Ok::<_, Error>(web::Json(results)) } diff --git a/goth_tests/poetry.lock b/goth_tests/poetry.lock index 893eb346f9..93ad547d8b 100644 --- a/goth_tests/poetry.lock +++ b/goth_tests/poetry.lock @@ -730,7 +730,7 @@ dev = ["jsonref"] [[package]] name = "goth" -version = "0.15.2" +version = "0.15.3" description = "Golem Test Harness - integration testing framework" category = "main" optional = false @@ -748,7 +748,7 @@ func_timeout = "4.3.5" ghapi = "^0.1.16" markupsafe = "2.0.1" mitmproxy = "^5.3" -pyyaml = "^5.4" +pyyaml = "5.3.1" transitions = "^0.8" typing_extensions = "^3.10.0" urllib3 = "^1.26" @@ -757,8 +757,8 @@ ya-aioclient = "^0.6" [package.source] type = "git" url = "https://github.com/golemfactory/goth.git" -reference = "2848004464f2378696ceaecda29d6e6e8aedb98e" -resolved_reference = "2848004464f2378696ceaecda29d6e6e8aedb98e" +reference = "f6518fe8008a972d40d0627647ddd3641039d852" +resolved_reference = "f6518fe8008a972d40d0627647ddd3641039d852" [[package]] name = "h11" @@ -1689,41 +1689,25 @@ files = [ [[package]] name = "pyyaml" -version = "5.4.1" +version = "5.3.1" description = "YAML parser and emitter for Python" category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +python-versions = "*" files = [ - {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, - {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, - {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, - {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, - {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, - {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, - {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, - {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, - {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, - {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, - {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, - {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, - {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, - {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, - {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, - {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, - {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, + {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, + {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, + {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, + {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, + {file = "PyYAML-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a"}, + {file = "PyYAML-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e"}, + {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, ] [[package]] @@ -2330,4 +2314,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.8.0" -content-hash = "5ce9212fa1dcdd0d799ee26acf9988416e02d666dc9405df227cd05aef5427c9" +content-hash = "3e4bfcc5fe3881ffef8cfcef62f62716da487e5e1a1b63448d9f732bfa7bbf1d" diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index 5dc54dc750..979f060c3e 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -28,7 +28,7 @@ pytest-rerunfailures = "^10.3" pytest-split = "^0.8.1" # goth = "0.15.2" # to use development goth version uncomment below -goth = { git = "https://github.com/golemfactory/goth.git", rev = "b36906be0ee1caed7941258eda9432f051b791d6" } +goth = { git = "https://github.com/golemfactory/goth.git", rev = "f6518fe8008a972d40d0627647ddd3641039d852" } [tool.poetry.dev-dependencies] black = "^20.8b1" From 05e8ec820de85154124ea4f765db4b0b5747b355 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Mon, 25 Sep 2023 10:49:16 +0200 Subject: [PATCH 083/123] erc20,erc20next: remove yatestnet --- core/model/src/payment.rs | 2 -- core/payment-driver/base/src/db/models.rs | 3 --- core/payment-driver/erc20/src/driver/cli.rs | 8 -------- core/payment-driver/erc20/src/erc20/config.rs | 14 -------------- core/payment-driver/erc20/src/erc20/ethereum.rs | 4 ---- core/payment-driver/erc20/src/lib.rs | 6 ------ core/payment-driver/erc20/src/network.rs | 15 +-------------- .../erc20next/config-payments.toml | 16 ---------------- .../payment-driver/erc20next/src/erc20/config.rs | 14 -------------- .../erc20next/src/erc20/ethereum.rs | 4 ---- core/payment-driver/erc20next/src/lib.rs | 6 ------ core/payment-driver/erc20next/src/network.rs | 15 +-------------- 12 files changed, 2 insertions(+), 105 deletions(-) diff --git a/core/model/src/payment.rs b/core/model/src/payment.rs index 6f5266c857..8d3bd3a2f4 100644 --- a/core/model/src/payment.rs +++ b/core/model/src/payment.rs @@ -458,8 +458,6 @@ pub mod local { Polygon, #[strum(props(token = "tGLM"))] Mumbai, - #[strum(props(token = "tGLM"))] - Yatestnet, } /// Experimental. In future releases this might change or be removed. diff --git a/core/payment-driver/base/src/db/models.rs b/core/payment-driver/base/src/db/models.rs index 88b83c3388..8fe0de520f 100644 --- a/core/payment-driver/base/src/db/models.rs +++ b/core/payment-driver/base/src/db/models.rs @@ -117,7 +117,6 @@ pub enum Network { #[default] Goerli = 5, //Goerli is another Ethereum testnet Mumbai = 80001, //Mumbai is testnet for Polygon network - Yatestnet = 987789, //Yatestnet is Golem internal testnet Polygon = 137, //Polygon is Polygon production network } @@ -131,7 +130,6 @@ impl FromStr for Network { "goerli" => Ok(Network::Goerli), "polygon" => Ok(Network::Polygon), "mumbai" => Ok(Network::Mumbai), - "yatestnet" => Ok(Network::Yatestnet), _ => Err(DbError::InvalidData(format!("Invalid network: {}", s))), } } @@ -144,7 +142,6 @@ impl Display for Network { Network::Rinkeby => f.write_str("rinkeby"), Network::Goerli => f.write_str("goerli"), Network::Mumbai => f.write_str("mumbai"), - Network::Yatestnet => f.write_str("yatestnet"), Network::Polygon => f.write_str("polygon"), } } diff --git a/core/payment-driver/erc20/src/driver/cli.rs b/core/payment-driver/erc20/src/driver/cli.rs index e1099230fc..48a7304837 100644 --- a/core/payment-driver/erc20/src/driver/cli.rs +++ b/core/payment-driver/erc20/src/driver/cli.rs @@ -70,13 +70,6 @@ pub async fn fund(dao: &Erc20Dao, msg: Fund) -> Result { .map_err(GenericError::new)??; format!("Received funds from the faucet. address=0x{:x}", &address) } - Network::Yatestnet => format!( - r#"Your Yatestnet address is {}. - -TODO - add faucet -"#, - address - ), Network::Mumbai => format!( r#"Your Mumbai Polygon address is {}. @@ -144,7 +137,6 @@ pub async fn transfer(dao: &Erc20Dao, msg: Transfer) -> Result "https://rinkeby.etherscan.io/tx/", Network::Goerli => "https://goerli.etherscan.io/tx/", Network::Mumbai => "https://mumbai.polygonscan.com/tx/", - Network::Yatestnet => "https://yatestnet.org:4000/tx/", }; let message = format!("Follow your transaction: {}0x{:x}", endpoint, tx_id); diff --git a/core/payment-driver/erc20/src/erc20/config.rs b/core/payment-driver/erc20/src/erc20/config.rs index 0e62210def..c6b36aee96 100644 --- a/core/payment-driver/erc20/src/erc20/config.rs +++ b/core/payment-driver/erc20/src/erc20/config.rs @@ -88,20 +88,6 @@ lazy_static! { } } }; - pub static ref YATESTNET_CONFIG: EnvConfiguration = EnvConfiguration { - glm_contract_address: utils::str_to_addr( - &env::var("YATESTNET_TGLM_CONTRACT_ADDRESS") - .unwrap_or_else(|_| "0x3b80bF85867eE9b079322802A734c074e093328E".to_string()) - ) - .unwrap(), - glm_faucet_address: None, - required_confirmations: { - match env::var("YATESTNET_REQUIRED_CONFIRMATIONS").map(|s| s.parse()) { - Ok(Ok(x)) => x, - _ => 3, - } - } - }; pub static ref POLYGON_MAINNET_CONFIG: EnvConfiguration = EnvConfiguration { glm_contract_address: utils::str_to_addr( &env::var("POLYGON_GLM_CONTRACT_ADDRESS") diff --git a/core/payment-driver/erc20/src/erc20/ethereum.rs b/core/payment-driver/erc20/src/erc20/ethereum.rs index cf9603cb28..b956f1adf2 100644 --- a/core/payment-driver/erc20/src/erc20/ethereum.rs +++ b/core/payment-driver/erc20/src/erc20/ethereum.rs @@ -540,9 +540,6 @@ fn get_rpc_addr_from_env(network: Network) -> Vec { Network::Mainnet => { collect_rpc_addr_from("MAINNET_GETH_ADDR", "https://geth.golem.network:55555") } - Network::Yatestnet => { - collect_rpc_addr_from("YATESTNET_GETH_ADDR", "https://yatestnet.org/web3/yagna") - } Network::Rinkeby => collect_rpc_addr_from( "RINKEBY_GETH_ADDR", "http://geth.testnet.golem.network:55555", @@ -605,7 +602,6 @@ fn get_env(network: Network) -> config::EnvConfiguration { Network::Rinkeby => *config::RINKEBY_CONFIG, Network::Goerli => *config::GOERLI_CONFIG, Network::Mumbai => *config::MUMBAI_CONFIG, - Network::Yatestnet => *config::YATESTNET_CONFIG, Network::Polygon => *config::POLYGON_MAINNET_CONFIG, } } diff --git a/core/payment-driver/erc20/src/lib.rs b/core/payment-driver/erc20/src/lib.rs index a4263aeaef..aaa7532d90 100644 --- a/core/payment-driver/erc20/src/lib.rs +++ b/core/payment-driver/erc20/src/lib.rs @@ -19,12 +19,6 @@ pub const GOERLI_PLATFORM: &str = "erc20legacy-goerli-tglm"; pub const GOERLI_CURRENCY_SHORT: &str = "tETH"; pub const GOERLI_CURRENCY_LONG: &str = "Goerli Ether"; -pub const YATESTNET_NETWORK: &str = "yatestnet"; -pub const YATESTNET_TOKEN: &str = "tGLM"; -pub const YATESTNET_PLATFORM: &str = "erc20legacy-yatestnet-tglm"; -pub const YATESTNET_CURRENCY_SHORT: &str = "tETH"; -pub const YATESTNET_CURRENCY_LONG: &str = "Test Ether"; - pub const MUMBAI_NETWORK: &str = "mumbai"; pub const MUMBAI_TOKEN: &str = "tGLM"; pub const MUMBAI_PLATFORM: &str = "erc20legacy-mumbai-tglm"; diff --git a/core/payment-driver/erc20/src/network.rs b/core/payment-driver/erc20/src/network.rs index 991842da97..d54ac9f419 100644 --- a/core/payment-driver/erc20/src/network.rs +++ b/core/payment-driver/erc20/src/network.rs @@ -13,8 +13,7 @@ use crate::{ MUMBAI_TOKEN, POLYGON_MAINNET_CURRENCY_LONG, POLYGON_MAINNET_CURRENCY_SHORT, POLYGON_MAINNET_NETWORK, POLYGON_MAINNET_PLATFORM, POLYGON_MAINNET_TOKEN, RINKEBY_CURRENCY_LONG, RINKEBY_CURRENCY_SHORT, RINKEBY_NETWORK, RINKEBY_PLATFORM, - RINKEBY_TOKEN, YATESTNET_CURRENCY_LONG, YATESTNET_CURRENCY_SHORT, YATESTNET_NETWORK, - YATESTNET_PLATFORM, YATESTNET_TOKEN, + RINKEBY_TOKEN, }; lazy_static::lazy_static! { @@ -37,12 +36,6 @@ lazy_static::lazy_static! { MAINNET_TOKEN.to_string() => MAINNET_PLATFORM.to_string() } }, - YATESTNET_NETWORK.to_string() => Network { - default_token: YATESTNET_TOKEN.to_string(), - tokens: hashmap! { - YATESTNET_TOKEN.to_string() => YATESTNET_PLATFORM.to_string() - } - }, MUMBAI_NETWORK.to_string() => Network { default_token: MUMBAI_TOKEN.to_string(), tokens: hashmap! { @@ -61,7 +54,6 @@ lazy_static::lazy_static! { pub static ref MAINNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(MAINNET_NETWORK).unwrap(); pub static ref MUMBAI_DB_NETWORK: DbNetwork = DbNetwork::from_str(MUMBAI_NETWORK).unwrap(); pub static ref POLYGON_MAINNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(POLYGON_MAINNET_NETWORK).unwrap(); - pub static ref YATESTNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(YATESTNET_NETWORK).unwrap(); } pub fn platform_to_network_token(platform: String) -> Result<(DbNetwork, String), GenericError> { @@ -70,7 +62,6 @@ pub fn platform_to_network_token(platform: String) -> Result<(DbNetwork, String) GOERLI_PLATFORM => Ok((*GOERLI_DB_NETWORK, GOERLI_TOKEN.to_owned())), MAINNET_PLATFORM => Ok((*MAINNET_DB_NETWORK, MAINNET_TOKEN.to_owned())), MUMBAI_PLATFORM => Ok((*MUMBAI_DB_NETWORK, MUMBAI_TOKEN.to_owned())), - YATESTNET_PLATFORM => Ok((*YATESTNET_DB_NETWORK, YATESTNET_TOKEN.to_owned())), POLYGON_MAINNET_PLATFORM => Ok(( *POLYGON_MAINNET_DB_NETWORK, POLYGON_MAINNET_TOKEN.to_owned(), @@ -134,10 +125,6 @@ pub fn platform_to_currency(platform: String) -> Result<(String, String), Generi POLYGON_MAINNET_CURRENCY_SHORT.to_owned(), POLYGON_MAINNET_CURRENCY_LONG.to_owned(), )), - YATESTNET_PLATFORM => Ok(( - YATESTNET_CURRENCY_SHORT.to_owned(), - YATESTNET_CURRENCY_LONG.to_owned(), - )), other => Err(GenericError::new(format!( "Unable to find network currency for platform: {}", other diff --git a/core/payment-driver/erc20next/config-payments.toml b/core/payment-driver/erc20next/config-payments.toml index 613007c87d..1f35d688cf 100644 --- a/core/payment-driver/erc20next/config-payments.toml +++ b/core/payment-driver/erc20next/config-payments.toml @@ -51,19 +51,3 @@ token = { address = "0x2036807B0B3aaf5b1858EE822D0e111fDdac7018", symbol = "tGLM # multi-contract = { address = "0x50100d4faf5f3b09987dea36dc2eddd57a3e561b", max-at-once = 10 } confirmation-blocks = 1 block-explorer-url = "https://polygonscan.com" - -[chain.dev] -chain-name = "Golem testnet" -chain-id = 987789 -rpc-endpoints = ["http://145.239.69.80:8545"] -currency-symbol = "tETH" -priority-fee = 1.1 -max-fee-per-gas = 500.0 -gas-left-warning-limit = 1000000 -transaction-timeout = 100 -token = { address = "0xEC9F23c207018A444f9351dF3D7937f609870667", symbol = "tGLM" } -multi-contract = { address = "0xBCfe9736A4f5bF2E43620061fF3001eA0D003c0F", max-at-once = 10 } -confirmation-blocks = 1 -faucet-eth-amount = 10.0 -faucet-glm-amount = 20.0 -block-explorer-url = "http://145.239.69.80:4000" diff --git a/core/payment-driver/erc20next/src/erc20/config.rs b/core/payment-driver/erc20next/src/erc20/config.rs index 0e62210def..c6b36aee96 100644 --- a/core/payment-driver/erc20next/src/erc20/config.rs +++ b/core/payment-driver/erc20next/src/erc20/config.rs @@ -88,20 +88,6 @@ lazy_static! { } } }; - pub static ref YATESTNET_CONFIG: EnvConfiguration = EnvConfiguration { - glm_contract_address: utils::str_to_addr( - &env::var("YATESTNET_TGLM_CONTRACT_ADDRESS") - .unwrap_or_else(|_| "0x3b80bF85867eE9b079322802A734c074e093328E".to_string()) - ) - .unwrap(), - glm_faucet_address: None, - required_confirmations: { - match env::var("YATESTNET_REQUIRED_CONFIRMATIONS").map(|s| s.parse()) { - Ok(Ok(x)) => x, - _ => 3, - } - } - }; pub static ref POLYGON_MAINNET_CONFIG: EnvConfiguration = EnvConfiguration { glm_contract_address: utils::str_to_addr( &env::var("POLYGON_GLM_CONTRACT_ADDRESS") diff --git a/core/payment-driver/erc20next/src/erc20/ethereum.rs b/core/payment-driver/erc20next/src/erc20/ethereum.rs index 21cdae2916..40f3e5c00f 100644 --- a/core/payment-driver/erc20next/src/erc20/ethereum.rs +++ b/core/payment-driver/erc20next/src/erc20/ethereum.rs @@ -531,9 +531,6 @@ fn get_rpc_addr_from_env(network: Network) -> Vec { Network::Mainnet => { collect_rpc_addr_from("MAINNET_GETH_ADDR", "https://geth.golem.network:55555") } - Network::Yatestnet => { - collect_rpc_addr_from("YATESTNET_GETH_ADDR", "https://yatestnet.org/web3/yagna") - } Network::Rinkeby => collect_rpc_addr_from( "RINKEBY_GETH_ADDR", "http://geth.testnet.golem.network:55555", @@ -596,7 +593,6 @@ fn get_env(network: Network) -> config::EnvConfiguration { Network::Rinkeby => *config::RINKEBY_CONFIG, Network::Goerli => *config::GOERLI_CONFIG, Network::Mumbai => *config::MUMBAI_CONFIG, - Network::Yatestnet => *config::YATESTNET_CONFIG, Network::Polygon => *config::POLYGON_MAINNET_CONFIG, } } diff --git a/core/payment-driver/erc20next/src/lib.rs b/core/payment-driver/erc20next/src/lib.rs index e6f370edfc..d504ff5926 100644 --- a/core/payment-driver/erc20next/src/lib.rs +++ b/core/payment-driver/erc20next/src/lib.rs @@ -19,12 +19,6 @@ pub const GOERLI_PLATFORM: &str = "erc20-goerli-tglm"; pub const GOERLI_CURRENCY_SHORT: &str = "tETH"; pub const GOERLI_CURRENCY_LONG: &str = "Goerli Ether"; -pub const YATESTNET_NETWORK: &str = "yatestnet"; -pub const YATESTNET_TOKEN: &str = "tGLM"; -pub const YATESTNET_PLATFORM: &str = "erc20-yatestnet-tglm"; -pub const YATESTNET_CURRENCY_SHORT: &str = "tETH"; -pub const YATESTNET_CURRENCY_LONG: &str = "Test Ether"; - pub const MUMBAI_NETWORK: &str = "mumbai"; pub const MUMBAI_TOKEN: &str = "tGLM"; pub const MUMBAI_PLATFORM: &str = "erc20-mumbai-tglm"; diff --git a/core/payment-driver/erc20next/src/network.rs b/core/payment-driver/erc20next/src/network.rs index e765568ac1..f7ff83426a 100644 --- a/core/payment-driver/erc20next/src/network.rs +++ b/core/payment-driver/erc20next/src/network.rs @@ -13,8 +13,7 @@ use crate::{ MUMBAI_TOKEN, POLYGON_MAINNET_CURRENCY_LONG, POLYGON_MAINNET_CURRENCY_SHORT, POLYGON_MAINNET_NETWORK, POLYGON_MAINNET_PLATFORM, POLYGON_MAINNET_TOKEN, RINKEBY_CURRENCY_LONG, RINKEBY_CURRENCY_SHORT, RINKEBY_NETWORK, RINKEBY_PLATFORM, - RINKEBY_TOKEN, YATESTNET_CURRENCY_LONG, YATESTNET_CURRENCY_SHORT, YATESTNET_NETWORK, - YATESTNET_PLATFORM, YATESTNET_TOKEN, + RINKEBY_TOKEN, }; lazy_static::lazy_static! { @@ -37,12 +36,6 @@ lazy_static::lazy_static! { MAINNET_TOKEN.to_string() => MAINNET_PLATFORM.to_string() } }, - YATESTNET_NETWORK.to_string() => Network { - default_token: YATESTNET_TOKEN.to_string(), - tokens: hashmap! { - YATESTNET_TOKEN.to_string() => YATESTNET_PLATFORM.to_string() - } - }, MUMBAI_NETWORK.to_string() => Network { default_token: MUMBAI_TOKEN.to_string(), tokens: hashmap! { @@ -61,7 +54,6 @@ lazy_static::lazy_static! { pub static ref MAINNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(MAINNET_NETWORK).unwrap(); pub static ref MUMBAI_DB_NETWORK: DbNetwork = DbNetwork::from_str(MUMBAI_NETWORK).unwrap(); pub static ref POLYGON_MAINNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(POLYGON_MAINNET_NETWORK).unwrap(); - pub static ref YATESTNET_DB_NETWORK: DbNetwork = DbNetwork::from_str(YATESTNET_NETWORK).unwrap(); } pub fn platform_to_network_token(platform: String) -> Result<(DbNetwork, String), GenericError> { @@ -70,7 +62,6 @@ pub fn platform_to_network_token(platform: String) -> Result<(DbNetwork, String) GOERLI_PLATFORM => Ok((*GOERLI_DB_NETWORK, GOERLI_TOKEN.to_owned())), MAINNET_PLATFORM => Ok((*MAINNET_DB_NETWORK, MAINNET_TOKEN.to_owned())), MUMBAI_PLATFORM => Ok((*MUMBAI_DB_NETWORK, MUMBAI_TOKEN.to_owned())), - YATESTNET_PLATFORM => Ok((*YATESTNET_DB_NETWORK, YATESTNET_TOKEN.to_owned())), POLYGON_MAINNET_PLATFORM => Ok(( *POLYGON_MAINNET_DB_NETWORK, POLYGON_MAINNET_TOKEN.to_owned(), @@ -104,10 +95,6 @@ pub fn platform_to_currency(platform: String) -> Result<(String, String), Generi POLYGON_MAINNET_CURRENCY_SHORT.to_owned(), POLYGON_MAINNET_CURRENCY_LONG.to_owned(), )), - YATESTNET_PLATFORM => Ok(( - YATESTNET_CURRENCY_SHORT.to_owned(), - YATESTNET_CURRENCY_LONG.to_owned(), - )), other => Err(GenericError::new(format!( "Unable to find network currency for platform: {}", other From d4bfd126acd862da8ea8746a40368a4c6ad3f097 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Mon, 25 Sep 2023 13:32:24 +0200 Subject: [PATCH 084/123] Remove zksync leftovers --- .env-template | 14 --------- accounts-example.json | 9 +++--- core/model/src/payment.rs | 1 - core/payment-driver/erc20/src/driver/api.rs | 27 ++--------------- core/payment-driver/erc20/src/erc20/wallet.rs | 17 ----------- .../erc20next/src/erc20/wallet.rs | 17 ----------- core/payment/README.md | 23 ++++++-------- core/payment/examples/README.md | 2 +- core/payment/examples/validate_allocation.rs | 5 +--- core/payment/src/service.rs | 4 --- core/serv/src/main.rs | 13 +------- docs/provider/installing-exeunit.md | 1 - golem_cli/src/command/yagna.rs | 30 +------------------ golem_cli/src/status.rs | 3 +- 14 files changed, 21 insertions(+), 145 deletions(-) diff --git a/.env-template b/.env-template index 1ff2e79d9a..fbd341049a 100644 --- a/.env-template +++ b/.env-template @@ -54,20 +54,6 @@ YAGNA_DATADIR="." #ERC20_SENDOUT_INTERVAL_SECS=10 #ERC20_CONFIRMATION_INTERVAL_SECS=5 -## ZkSync driver -#ZKSYNC_RINKEBY_RPC_ADDRESS=https://rinkeby-api.zksync.io/jsrpc -#ZKSYNC_MAINNET_RPC_ADDRESS=https://api.zksync.io/jsrpc -#ZKSYNC_ETH_CONFIRMATION_TIMEOUT_SECONDS=60 -#ZKSYNC_FAUCET_ADDR= -#ZKSYNC_SENDOUT_INTERVAL_SECS=10 -#ZKSYNC_CONFIRMATION_INTERVAL_SECS=5 - -# ZkSync driver asserts additional funds available to make `N` transactions -#TRANSACTIONS_PER_ALLOCATION=10 -# However if transaction's fee gets higher, it does not exceed max surcharge for allocation (in GLM) -#MAX_ALLOCATION_SURCHARGE=200 - - ## Activity Service # Threshold of inactivity period in seconds. diff --git a/accounts-example.json b/accounts-example.json index 9cd266ef4e..f334984bc7 100644 --- a/accounts-example.json +++ b/accounts-example.json @@ -1,13 +1,14 @@ [ { - "driver": "zksync", + "driver": "erc20", "address": "0xdde2ccd1566294aa77db314501385ea50f1059c3", "send": true, "receive": false - }, { - "driver": "zksync", + }, + { + "driver": "erc20", "address": "0x96af8f53f7f135824273105f94716f36970cfe75", "send": false, "receive": true } -] +] \ No newline at end of file diff --git a/core/model/src/payment.rs b/core/model/src/payment.rs index 8d3bd3a2f4..b48dbae434 100644 --- a/core/model/src/payment.rs +++ b/core/model/src/payment.rs @@ -477,7 +477,6 @@ pub mod local { #[serde(rename_all = "lowercase")] #[non_exhaustive] pub enum DriverName { - ZkSync, Erc20, Erc20legacy, } diff --git a/core/payment-driver/erc20/src/driver/api.rs b/core/payment-driver/erc20/src/driver/api.rs index e6f11fcdf2..54344e3dac 100644 --- a/core/payment-driver/erc20/src/driver/api.rs +++ b/core/payment-driver/erc20/src/driver/api.rs @@ -23,21 +23,6 @@ use crate::{ network, }; -// lazy_static! { -// static ref MAX_ALLOCATION_SURCHARGE: BigDecimal = -// match std::env::var("MAX_ALLOCATION_SURCHARGE").map(|s| s.parse()) { -// Ok(Ok(x)) => x, -// _ => BigDecimal::from(200), -// }; -// -// // Environment variable will be replaced by allocation parameter in PAY-82 -// static ref TRANSACTIONS_PER_ALLOCATION: BigInt = -// match std::env::var("TRANSACTIONS_PER_ALLOCATION").map(|s| s.parse()) { -// Ok(Ok(x)) => x, -// _ => BigInt::from(10), -// }; -// } - pub async fn get_account_balance(msg: GetAccountBalance) -> Result { log::debug!("get_account_balance: {:?}", msg); let (network, _) = network::platform_to_network_token(msg.platform())?; @@ -107,23 +92,15 @@ pub async fn validate_allocation(msg: ValidateAllocation) -> Result Result { -// // let token = get_network_token(network, None); -// // let wallet = get_wallet(&address, network).await?; -// // let tx_fee = wallet -// // .provider -// // .get_tx_fee(TxFeeTypes::Transfer, wallet.address(), token.as_str()) -// // .await -// // .map_err(GenericError::new)? -// // .total_fee; -// // let tx_fee_bigdec = utils::big_uint_to_big_dec(tx_fee); -// // -// // log::debug!("Transaction fee {:.5} {}", tx_fee_bigdec, token.as_str()); -// // Ok(tx_fee_bigdec) -// todo!(); -// } - pub async fn verify_tx(tx_hash: &str, network: Network) -> Result { log::debug!("verify_tx. hash={}", tx_hash); let hex_hash = H256::from_str(&tx_hash[2..]).map_err(|err| { diff --git a/core/payment-driver/erc20next/src/erc20/wallet.rs b/core/payment-driver/erc20next/src/erc20/wallet.rs index 6e155df142..5f15af6517 100644 --- a/core/payment-driver/erc20next/src/erc20/wallet.rs +++ b/core/payment-driver/erc20next/src/erc20/wallet.rs @@ -331,23 +331,6 @@ pub async fn send_transactions( Ok(()) } -// TODO: calculate fee. Below commented out reference to zkSync implementation -// pub async fn get_tx_fee(address: &str, network: Network) -> Result { -// // let token = get_network_token(network, None); -// // let wallet = get_wallet(&address, network).await?; -// // let tx_fee = wallet -// // .provider -// // .get_tx_fee(TxFeeTypes::Transfer, wallet.address(), token.as_str()) -// // .await -// // .map_err(GenericError::new)? -// // .total_fee; -// // let tx_fee_bigdec = utils::big_uint_to_big_dec(tx_fee); -// // -// // log::debug!("Transaction fee {:.5} {}", tx_fee_bigdec, token.as_str()); -// // Ok(tx_fee_bigdec) -// todo!(); -// } - pub async fn verify_tx(tx_hash: &str, network: Network) -> Result { log::debug!("verify_tx. hash={}", tx_hash); let hex_hash = H256::from_str(&tx_hash[2..]).map_err(|err| { diff --git a/core/payment/README.md b/core/payment/README.md index ea4ef8b064..ed154e566b 100644 --- a/core/payment/README.md +++ b/core/payment/README.md @@ -8,29 +8,24 @@ The payments are made by drivers loaded in the service. Currently these drivers are available to use: - Erc20 +- Erc20Legacy - Dummy -- ZkSync -By default the Erc20 and ZkSync drivers are selected, extra drivers need to be specifically loaded with a feature flag. +By default only the Erc20 & Erc20Next drivers are enabled, extra drivers need to be specifically loaded with a feature flag. ## DO NOT USE DUMMY DRIVER FOR BUILDS THAT WILL BE DISTRIBUTED!!! You can enable multiple drivers at the same time, use this table for the required feature flags and platform parameters: -|Driver name|Feature flag|Public explorer|Local|Testnet|Mainnet| -|-|-|-|-|-|-| -|zksync|`zksync-driver`|[zkscan](https://rinkeby.zkscan.io/)|x|x|| -|erc20|`erc20-driver`|[etherscan](https://rinkeby.etherscan.io/token/0xd94e3dc39d4cad1dad634e7eb585a57a19dc7efe)|x|x|| -|dummy|`dummy-driver`|None|x||| +| Driver name | Feature flag | Public explorer | Local | Testnet | Mainnet | +| ----------- | -------------- | ------------------------------------------------------------------------------------------ | ----- | ------- | ------- | +| erc20 | `erc20-driver` | [etherscan](https://rinkeby.etherscan.io/token/0xd94e3dc39d4cad1dad634e7eb585a57a19dc7efe) | x | x | | +| erc20 | `erc20-driver` | [etherscan](https://rinkeby.etherscan.io/token/0xd94e3dc39d4cad1dad634e7eb585a57a19dc7efe) | x | x | | +| dummy | `dummy-driver` | None | x | | | ### Examples: -Build with zksync + erc20 driver: +Build with erc20 and erc20legacy drivers: ``` cargo build --release -``` - -Build with only zksync ( not recommended ) -``` -cargo build --release --no-default-features --features zksync-driver -``` +``` \ No newline at end of file diff --git a/core/payment/examples/README.md b/core/payment/examples/README.md index 0c03eb6050..6f06a40331 100644 --- a/core/payment/examples/README.md +++ b/core/payment/examples/README.md @@ -8,7 +8,7 @@ cd core/payment cp ../../.env-template .env (rm payment.db* || true) && cargo run --example payment_api ``` -To use ZkSync instead of Dummy driver use `cargo run --example payment_api -- --driver=zksync --platform=zksync-rinkeby-tglm` instead. +To use erc20 instead of Dummy driver use `cargo run --example payment_api -- --driver=erc20 --platform=erc20-goerli-tglm` instead. ### Examples diff --git a/core/payment/examples/validate_allocation.rs b/core/payment/examples/validate_allocation.rs index 4875a96ad5..d1e97f2dbe 100644 --- a/core/payment/examples/validate_allocation.rs +++ b/core/payment/examples/validate_allocation.rs @@ -5,8 +5,6 @@ use ya_client_model::payment::NewAllocation; use ya_core_model::payment::local as pay; use ya_service_bus::typed as bus; -use std::str::FromStr; - async fn get_requestor_balance_and_platform() -> anyhow::Result<(BigDecimal, String)> { let account_list = bus::service(pay::BUS_ID) .call(pay::GetAccounts {}) @@ -71,11 +69,10 @@ async fn main() -> anyhow::Result<()> { assert!(result.is_err()); log::info!("Failed to create allocation (as expected)."); - // We need to take ZkSync's transaction fees into account (allowing 45% of funds per allocation) let new_allocation = NewAllocation { address: None, // Use default address (i.e. identity) payment_platform, - total_amount: requestor_balance * BigDecimal::from_str("0.45").unwrap(), + total_amount: requestor_balance, timeout: None, make_deposit: false, }; diff --git a/core/payment/src/service.rs b/core/payment/src/service.rs index 13788ebbd3..e2b9c12e49 100644 --- a/core/payment/src/service.rs +++ b/core/payment/src/service.rs @@ -74,13 +74,9 @@ mod local { counter!("payment.amount.received", 0, "platform" => "erc20-rinkeby-tglm"); counter!("payment.amount.received", 0, "platform" => "erc20-mainnet-glm"); - counter!("payment.amount.received", 0, "platform" => "zksync-rinkeby-tglm"); - counter!("payment.amount.received", 0, "platform" => "zksync-mainnet-glm"); counter!("payment.amount.sent", 0, "platform" => "erc20-rinkeby-tglm"); counter!("payment.amount.sent", 0, "platform" => "erc20-mainnet-glm"); - counter!("payment.amount.sent", 0, "platform" => "zksync-rinkeby-tglm"); - counter!("payment.amount.sent", 0, "platform" => "zksync-mainnet-glm"); log::debug!("Successfully bound payment local service to service bus"); } diff --git a/core/serv/src/main.rs b/core/serv/src/main.rs index f19ba0329d..87f2b55172 100644 --- a/core/serv/src/main.rs +++ b/core/serv/src/main.rs @@ -266,11 +266,7 @@ enum Services { GsbApi(GsbApiService), } -#[cfg(not(any( - feature = "dummy-driver", - feature = "erc20-driver", - feature = "zksync-driver", -)))] +#[cfg(not(any(feature = "dummy-driver", feature = "erc20-driver",)))] compile_error!("At least one payment driver needs to be enabled in order to make payments."); #[allow(unused)] @@ -296,13 +292,6 @@ async fn start_payment_drivers(data_dir: &Path) -> anyhow::Result> { PaymentDriverService::gsb(&db_executor, data_dir.to_path_buf()).await?; drivers.push(DRIVER_NAME.to_owned()); } - #[cfg(feature = "zksync-driver")] - { - use ya_zksync_driver::{PaymentDriverService, DRIVER_NAME}; - let db_executor = DbExecutor::from_data_dir(data_dir, "zksync-driver")?; - PaymentDriverService::gsb(&db_executor).await?; - drivers.push(DRIVER_NAME.to_owned()); - } Ok(drivers) } diff --git a/docs/provider/installing-exeunit.md b/docs/provider/installing-exeunit.md index 4e09af59de..b71f7984ca 100644 --- a/docs/provider/installing-exeunit.md +++ b/docs/provider/installing-exeunit.md @@ -65,7 +65,6 @@ If there is no error message than self-test execution passed. "golem.com.payment.debit-notes.accept-timeout?": 240, "golem.com.payment.platform.erc20-mainnet-glm.address": "0xf98bb0842a7e744beedd291c98e7cd2c9b27f300", "golem.com.payment.platform.erc20-polygon-glm.address": "0xf98bb0842a7e744beedd291c98e7cd2c9b27f300", - "golem.com.payment.platform.zksync-mainnet-glm.address": "0xf98bb0842a7e744beedd291c98e7cd2c9b27f300", "golem.com.pricing.model": "linear", "golem.com.pricing.model.linear.coeffs": [ 0.00002777777777777778, diff --git a/golem_cli/src/command/yagna.rs b/golem_cli/src/command/yagna.rs index a63e62df32..c5d0dbda30 100644 --- a/golem_cli/src/command/yagna.rs +++ b/golem_cli/src/command/yagna.rs @@ -27,30 +27,6 @@ pub struct PaymentDriver { } lazy_static! { - pub static ref ZKSYNC_DRIVER: PaymentDriver = { - let mut zksync = HashMap::new(); - zksync.insert( - NetworkName::Mainnet.into(), - PaymentPlatform { - platform: "zksync-mainnet-glm", - driver: "zksync", - token: "GLM", - }, - ); - // zksync.insert( - // NetworkName::Rinkeby.into(), - // PaymentPlatform { - // platform: "zksync-rinkeby-tglm", - // driver: "zksync", - // token: "tGLM", - // }, - // ); - - PaymentDriver { - platforms: zksync, - name: "zksync", - } - }; pub static ref ERC20_DRIVER: PaymentDriver = { let mut erc20 = HashMap::new(); erc20.insert( @@ -147,7 +123,7 @@ lazy_static! { name: "erc20", } }; - pub static ref DRIVERS: Vec<&'static PaymentDriver> = vec![&ZKSYNC_DRIVER, &ERC20_DRIVER]; + pub static ref DRIVERS: Vec<&'static PaymentDriver> = vec![&ERC20_DRIVER]; } impl PaymentDriver { @@ -159,10 +135,6 @@ impl PaymentDriver { } pub fn status_label(&self, network: &NetworkName) -> String { - if self.name == ZKSYNC_DRIVER.name { - return "zksync".to_string(); - } - if network == &NetworkName::Mainnet { "on-chain".to_string() } else { diff --git a/golem_cli/src/status.rs b/golem_cli/src/status.rs index 3b6eef744c..45a8cf5559 100644 --- a/golem_cli/src/status.rs +++ b/golem_cli/src/status.rs @@ -13,7 +13,6 @@ use ya_core_model::NodeId; use crate::appkey; use crate::command::{ NetworkGroup, PaymentSummary, YaCommand, DRIVERS, ERC20_DRIVER, NETWORK_GROUP_MAP, - ZKSYNC_DRIVER, }; use crate::platform::Status as KvmStatus; use crate::utils::{is_yagna_running, payment_account}; @@ -248,7 +247,7 @@ async fn get_payment_network() -> Result<(usize, NetworkName)> { let net_to_check = net.parse()?; let platform = ERC20_DRIVER .platform(&net_to_check) - .or_else(|_e| ZKSYNC_DRIVER.platform(&net_to_check))?; + .or_else(|_e| ERC20_DRIVER.platform(&net_to_check))?; let platform_property = &format!("golem.com.payment.platform.{}.address", platform.platform,); if latest_offer.properties.get(platform_property).is_some() { From 5c63a13e426629fabc743972245c645fc9b2c0cb Mon Sep 17 00:00:00 2001 From: scx1332 Date: Mon, 25 Sep 2023 14:13:32 +0200 Subject: [PATCH 085/123] fix test_mid_agreement_payments --- .../domain/payments/test_mid_payments.py | 6 +- goth_tests/poetry.lock | 4600 ++++++++--------- 2 files changed, 2259 insertions(+), 2347 deletions(-) diff --git a/goth_tests/domain/payments/test_mid_payments.py b/goth_tests/domain/payments/test_mid_payments.py index c0448eb589..3797268d8e 100644 --- a/goth_tests/domain/payments/test_mid_payments.py +++ b/goth_tests/domain/payments/test_mid_payments.py @@ -88,7 +88,11 @@ async def test_mid_agreement_payments( await provider.wait_for_exeunit_started() for i in range(0, ITERATION_COUNT): - await asyncio.sleep(PAYMENT_TIMEOUT_SEC) + if i == ITERATION_COUNT - 1: + await asyncio.sleep(PAYMENT_TIMEOUT_SEC + 10) + else: + await asyncio.sleep(PAYMENT_TIMEOUT_SEC) + payments = await provider.api.payment.get_payments(after_timestamp=ts) for payment in payments: amount += float(payment.amount) diff --git a/goth_tests/poetry.lock b/goth_tests/poetry.lock index 5cb69c8705..2b758cde87 100644 --- a/goth_tests/poetry.lock +++ b/goth_tests/poetry.lock @@ -1,2346 +1,2254 @@ -# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. - -[[package]] -name = "aiohttp" -version = "3.8.5" -description = "Async http client/server framework (asyncio)" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, - {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, - {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, - {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, - {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, - {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, - {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, - {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, - {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, - {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, - {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, -] - -[package.dependencies] -aiosignal = ">=1.1.2" -async-timeout = ">=4.0.0a3,<5.0" -attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<4.0" -frozenlist = ">=1.1.1" -multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" - -[package.extras] -speedups = ["Brotli", "aiodns", "cchardet"] - -[[package]] -name = "aiosignal" -version = "1.3.1" -description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, - {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, -] - -[package.dependencies] -frozenlist = ">=1.1.0" - -[[package]] -name = "ansicolors" -version = "1.1.8" -description = "ANSI colors for Python" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "ansicolors-1.1.8-py2.py3-none-any.whl", hash = "sha256:00d2dde5a675579325902536738dd27e4fac1fd68f773fe36c21044eb559e187"}, - {file = "ansicolors-1.1.8.zip", hash = "sha256:99f94f5e3348a0bcd43c82e5fc4414013ccc19d70bd939ad71e0133ce9c372e0"}, -] - -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" -optional = false -python-versions = "*" -files = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] - -[[package]] -name = "asgiref" -version = "3.3.4" -description = "ASGI specs, helper code, and adapters" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "asgiref-3.3.4-py3-none-any.whl", hash = "sha256:92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee"}, - {file = "asgiref-3.3.4.tar.gz", hash = "sha256:d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78"}, -] - -[package.extras] -tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] - -[[package]] -name = "async-timeout" -version = "4.0.3" -description = "Timeout context manager for asyncio programs" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, - {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, -] - -[[package]] -name = "attrs" -version = "23.1.0" -description = "Classes Without Boilerplate" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] - -[[package]] -name = "bcrypt" -version = "4.0.1" -description = "Modern password hashing for your software and your servers" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "bcrypt-4.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b1023030aec778185a6c16cf70f359cbb6e0c289fd564a7cfa29e727a1c38f8f"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:08d2947c490093a11416df18043c27abe3921558d2c03e2076ccb28a116cb6d0"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eaa47d4661c326bfc9d08d16debbc4edf78778e6aaba29c1bc7ce67214d4410"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae88eca3024bb34bb3430f964beab71226e761f51b912de5133470b649d82344"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:a522427293d77e1c29e303fc282e2d71864579527a04ddcfda6d4f8396c6c36a"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fbdaec13c5105f0c4e5c52614d04f0bca5f5af007910daa8b6b12095edaa67b3"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ca3204d00d3cb2dfed07f2d74a25f12fc12f73e606fcaa6975d1f7ae69cacbb2"}, - {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:089098effa1bc35dc055366740a067a2fc76987e8ec75349eb9484061c54f535"}, - {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e9a51bbfe7e9802b5f3508687758b564069ba937748ad7b9e890086290d2f79e"}, - {file = "bcrypt-4.0.1-cp36-abi3-win32.whl", hash = "sha256:2caffdae059e06ac23fce178d31b4a702f2a3264c20bfb5ff541b338194d8fab"}, - {file = "bcrypt-4.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf4fa8b2ca74381bb5442c089350f09a3f17797829d958fad058d6e44d9eb83c"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:67a97e1c405b24f19d08890e7ae0c4f7ce1e56a712a016746c8b2d7732d65d4b"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b3b85202d95dd568efcb35b53936c5e3b3600c7cdcc6115ba461df3a8e89f38d"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbb03eec97496166b704ed663a53680ab57c5084b2fc98ef23291987b525cb7d"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:5ad4d32a28b80c5fa6671ccfb43676e8c1cc232887759d1cd7b6f56ea4355215"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b57adba8a1444faf784394de3436233728a1ecaeb6e07e8c22c8848f179b893c"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b2cea8a9ed3d55b4491887ceadb0106acf7c6387699fca771af56b1cdeeda"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:2b3ac11cf45161628f1f3733263e63194f22664bf4d0c0f3ab34099c02134665"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3100851841186c25f127731b9fa11909ab7b1df6fc4b9f8353f4f1fd952fbf71"}, - {file = "bcrypt-4.0.1.tar.gz", hash = "sha256:27d375903ac8261cfe4047f6709d16f7d18d39b1ec92aaf72af989552a650ebd"}, -] - -[package.extras] -tests = ["pytest (>=3.2.1,!=3.3.0)"] -typecheck = ["mypy"] - -[[package]] -name = "black" -version = "21.7b0" -description = "The uncompromising code formatter." -category = "dev" -optional = false -python-versions = ">=3.6.2" -files = [ - {file = "black-21.7b0-py3-none-any.whl", hash = "sha256:1c7aa6ada8ee864db745b22790a32f94b2795c253a75d6d9b5e439ff10d23116"}, - {file = "black-21.7b0.tar.gz", hash = "sha256:c8373c6491de9362e39271630b65b964607bc5c79c83783547d76c839b3aa219"}, -] - -[package.dependencies] -appdirs = "*" -click = ">=7.1.2" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.8.1,<1" -regex = ">=2020.1.8" -tomli = ">=0.2.6,<2.0.0" - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] -python2 = ["typed-ast (>=1.4.2)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "blinker" -version = "1.4" -description = "Fast, simple object-to-object and broadcast signaling" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "blinker-1.4.tar.gz", hash = "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"}, -] - -[[package]] -name = "brotli" -version = "1.0.9" -description = "Python bindings for the Brotli compression library" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "Brotli-1.0.9-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:268fe94547ba25b58ebc724680609c8ee3e5a843202e9a381f6f9c5e8bdb5c70"}, - {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:c2415d9d082152460f2bd4e382a1e85aed233abc92db5a3880da2257dc7daf7b"}, - {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5913a1177fc36e30fcf6dc868ce23b0453952c78c04c266d3149b3d39e1410d6"}, - {file = "Brotli-1.0.9-cp27-cp27m-win32.whl", hash = "sha256:afde17ae04d90fbe53afb628f7f2d4ca022797aa093e809de5c3cf276f61bbfa"}, - {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7cb81373984cc0e4682f31bc3d6be9026006d96eecd07ea49aafb06897746452"}, - {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:db844eb158a87ccab83e868a762ea8024ae27337fc7ddcbfcddd157f841fdfe7"}, - {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9744a863b489c79a73aba014df554b0e7a0fc44ef3f8a0ef2a52919c7d155031"}, - {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a72661af47119a80d82fa583b554095308d6a4c356b2a554fdc2799bc19f2a43"}, - {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ee83d3e3a024a9618e5be64648d6d11c37047ac48adff25f12fa4226cf23d1c"}, - {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:19598ecddd8a212aedb1ffa15763dd52a388518c4550e615aed88dc3753c0f0c"}, - {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:44bb8ff420c1d19d91d79d8c3574b8954288bdff0273bf788954064d260d7ab0"}, - {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e23281b9a08ec338469268f98f194658abfb13658ee98e2b7f85ee9dd06caa91"}, - {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3496fc835370da351d37cada4cf744039616a6db7d13c430035e901443a34daa"}, - {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83bb06a0192cccf1eb8d0a28672a1b79c74c3a8a5f2619625aeb6f28b3a82bb"}, - {file = "Brotli-1.0.9-cp310-cp310-win32.whl", hash = "sha256:26d168aac4aaec9a4394221240e8a5436b5634adc3cd1cdf637f6645cecbf181"}, - {file = "Brotli-1.0.9-cp310-cp310-win_amd64.whl", hash = "sha256:622a231b08899c864eb87e85f81c75e7b9ce05b001e59bbfbf43d4a71f5f32b2"}, - {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cc0283a406774f465fb45ec7efb66857c09ffefbe49ec20b7882eff6d3c86d3a"}, - {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:11d3283d89af7033236fa4e73ec2cbe743d4f6a81d41bd234f24bf63dde979df"}, - {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c1306004d49b84bd0c4f90457c6f57ad109f5cc6067a9664e12b7b79a9948ad"}, - {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1375b5d17d6145c798661b67e4ae9d5496920d9265e2f00f1c2c0b5ae91fbde"}, - {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cab1b5964b39607a66adbba01f1c12df2e55ac36c81ec6ed44f2fca44178bf1a"}, - {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ed6a5b3d23ecc00ea02e1ed8e0ff9a08f4fc87a1f58a2530e71c0f48adf882f"}, - {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cb02ed34557afde2d2da68194d12f5719ee96cfb2eacc886352cb73e3808fc5d"}, - {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b3523f51818e8f16599613edddb1ff924eeb4b53ab7e7197f85cbc321cdca32f"}, - {file = "Brotli-1.0.9-cp311-cp311-win32.whl", hash = "sha256:ba72d37e2a924717990f4d7482e8ac88e2ef43fb95491eb6e0d124d77d2a150d"}, - {file = "Brotli-1.0.9-cp311-cp311-win_amd64.whl", hash = "sha256:3ffaadcaeafe9d30a7e4e1e97ad727e4f5610b9fa2f7551998471e3736738679"}, - {file = "Brotli-1.0.9-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:c83aa123d56f2e060644427a882a36b3c12db93727ad7a7b9efd7d7f3e9cc2c4"}, - {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:6b2ae9f5f67f89aade1fab0f7fd8f2832501311c363a21579d02defa844d9296"}, - {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:68715970f16b6e92c574c30747c95cf8cf62804569647386ff032195dc89a430"}, - {file = "Brotli-1.0.9-cp35-cp35m-win32.whl", hash = "sha256:defed7ea5f218a9f2336301e6fd379f55c655bea65ba2476346340a0ce6f74a1"}, - {file = "Brotli-1.0.9-cp35-cp35m-win_amd64.whl", hash = "sha256:88c63a1b55f352b02c6ffd24b15ead9fc0e8bf781dbe070213039324922a2eea"}, - {file = "Brotli-1.0.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:503fa6af7da9f4b5780bb7e4cbe0c639b010f12be85d02c99452825dd0feef3f"}, - {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:40d15c79f42e0a2c72892bf407979febd9cf91f36f495ffb333d1d04cebb34e4"}, - {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:93130612b837103e15ac3f9cbacb4613f9e348b58b3aad53721d92e57f96d46a"}, - {file = "Brotli-1.0.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87fdccbb6bb589095f413b1e05734ba492c962b4a45a13ff3408fa44ffe6479b"}, - {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:6d847b14f7ea89f6ad3c9e3901d1bc4835f6b390a9c71df999b0162d9bb1e20f"}, - {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:495ba7e49c2db22b046a53b469bbecea802efce200dffb69b93dd47397edc9b6"}, - {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:4688c1e42968ba52e57d8670ad2306fe92e0169c6f3af0089be75bbac0c64a3b"}, - {file = "Brotli-1.0.9-cp36-cp36m-win32.whl", hash = "sha256:61a7ee1f13ab913897dac7da44a73c6d44d48a4adff42a5701e3239791c96e14"}, - {file = "Brotli-1.0.9-cp36-cp36m-win_amd64.whl", hash = "sha256:1c48472a6ba3b113452355b9af0a60da5c2ae60477f8feda8346f8fd48e3e87c"}, - {file = "Brotli-1.0.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b78a24b5fd13c03ee2b7b86290ed20efdc95da75a3557cc06811764d5ad1126"}, - {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:9d12cf2851759b8de8ca5fde36a59c08210a97ffca0eb94c532ce7b17c6a3d1d"}, - {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6c772d6c0a79ac0f414a9f8947cc407e119b8598de7621f39cacadae3cf57d12"}, - {file = "Brotli-1.0.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29d1d350178e5225397e28ea1b7aca3648fcbab546d20e7475805437bfb0a130"}, - {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7bbff90b63328013e1e8cb50650ae0b9bac54ffb4be6104378490193cd60f85a"}, - {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ec1947eabbaf8e0531e8e899fc1d9876c179fc518989461f5d24e2223395a9e3"}, - {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12effe280b8ebfd389022aa65114e30407540ccb89b177d3fbc9a4f177c4bd5d"}, - {file = "Brotli-1.0.9-cp37-cp37m-win32.whl", hash = "sha256:f909bbbc433048b499cb9db9e713b5d8d949e8c109a2a548502fb9aa8630f0b1"}, - {file = "Brotli-1.0.9-cp37-cp37m-win_amd64.whl", hash = "sha256:97f715cf371b16ac88b8c19da00029804e20e25f30d80203417255d239f228b5"}, - {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e16eb9541f3dd1a3e92b89005e37b1257b157b7256df0e36bd7b33b50be73bcb"}, - {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:160c78292e98d21e73a4cc7f76a234390e516afcd982fa17e1422f7c6a9ce9c8"}, - {file = "Brotli-1.0.9-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b663f1e02de5d0573610756398e44c130add0eb9a3fc912a09665332942a2efb"}, - {file = "Brotli-1.0.9-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5b6ef7d9f9c38292df3690fe3e302b5b530999fa90014853dcd0d6902fb59f26"}, - {file = "Brotli-1.0.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a674ac10e0a87b683f4fa2b6fa41090edfd686a6524bd8dedbd6138b309175c"}, - {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e2d9e1cbc1b25e22000328702b014227737756f4b5bf5c485ac1d8091ada078b"}, - {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b336c5e9cf03c7be40c47b5fd694c43c9f1358a80ba384a21969e0b4e66a9b17"}, - {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:85f7912459c67eaab2fb854ed2bc1cc25772b300545fe7ed2dc03954da638649"}, - {file = "Brotli-1.0.9-cp38-cp38-win32.whl", hash = "sha256:35a3edbe18e876e596553c4007a087f8bcfd538f19bc116917b3c7522fca0429"}, - {file = "Brotli-1.0.9-cp38-cp38-win_amd64.whl", hash = "sha256:269a5743a393c65db46a7bb982644c67ecba4b8d91b392403ad8a861ba6f495f"}, - {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2aad0e0baa04517741c9bb5b07586c642302e5fb3e75319cb62087bd0995ab19"}, - {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5cb1e18167792d7d21e21365d7650b72d5081ed476123ff7b8cac7f45189c0c7"}, - {file = "Brotli-1.0.9-cp39-cp39-manylinux1_i686.whl", hash = "sha256:16d528a45c2e1909c2798f27f7bf0a3feec1dc9e50948e738b961618e38b6a7b"}, - {file = "Brotli-1.0.9-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:56d027eace784738457437df7331965473f2c0da2c70e1a1f6fdbae5402e0389"}, - {file = "Brotli-1.0.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bf919756d25e4114ace16a8ce91eb340eb57a08e2c6950c3cebcbe3dff2a5e7"}, - {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e4c4e92c14a57c9bd4cb4be678c25369bf7a092d55fd0866f759e425b9660806"}, - {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e48f4234f2469ed012a98f4b7874e7f7e173c167bed4934912a29e03167cf6b1"}, - {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ed4c92a0665002ff8ea852353aeb60d9141eb04109e88928026d3c8a9e5433c"}, - {file = "Brotli-1.0.9-cp39-cp39-win32.whl", hash = "sha256:cfc391f4429ee0a9370aa93d812a52e1fee0f37a81861f4fdd1f4fb28e8547c3"}, - {file = "Brotli-1.0.9-cp39-cp39-win_amd64.whl", hash = "sha256:854c33dad5ba0fbd6ab69185fec8dab89e13cda6b7d191ba111987df74f38761"}, - {file = "Brotli-1.0.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9749a124280a0ada4187a6cfd1ffd35c350fb3af79c706589d98e088c5044267"}, - {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:73fd30d4ce0ea48010564ccee1a26bfe39323fde05cb34b5863455629db61dc7"}, - {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02177603aaca36e1fd21b091cb742bb3b305a569e2402f1ca38af471777fb019"}, - {file = "Brotli-1.0.9-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:76ffebb907bec09ff511bb3acc077695e2c32bc2142819491579a695f77ffd4d"}, - {file = "Brotli-1.0.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b43775532a5904bc938f9c15b77c613cb6ad6fb30990f3b0afaea82797a402d8"}, - {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5bf37a08493232fbb0f8229f1824b366c2fc1d02d64e7e918af40acd15f3e337"}, - {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:330e3f10cd01da535c70d09c4283ba2df5fb78e915bea0a28becad6e2ac010be"}, - {file = "Brotli-1.0.9-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e1abbeef02962596548382e393f56e4c94acd286bd0c5afba756cffc33670e8a"}, - {file = "Brotli-1.0.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3148362937217b7072cf80a2dcc007f09bb5ecb96dae4617316638194113d5be"}, - {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:336b40348269f9b91268378de5ff44dc6fbaa2268194f85177b53463d313842a"}, - {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b8b09a16a1950b9ef495a0f8b9d0a87599a9d1f179e2d4ac014b2ec831f87e7"}, - {file = "Brotli-1.0.9-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c8e521a0ce7cf690ca84b8cc2272ddaf9d8a50294fd086da67e517439614c755"}, - {file = "Brotli-1.0.9.zip", hash = "sha256:4d1b810aa0ed773f81dceda2cc7b403d01057458730e309856356d4ef4188438"}, -] - -[[package]] -name = "certifi" -version = "2020.12.5" -description = "Python package for providing Mozilla's CA Bundle." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, - {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, -] - -[[package]] -name = "cffi" -version = "1.15.1" -description = "Foreign Function Interface for Python calling C code." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, - {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, - {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, - {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, - {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, - {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, - {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, - {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, - {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, - {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, - {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, - {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, - {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, - {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, - {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, - {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, - {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, - {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, - {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, - {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, - {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, - {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, - {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, - {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, - {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, - {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, - {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, - {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, - {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, - {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, - {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, - {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, - {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, -] - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "charset-normalizer" -version = "3.2.0" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, - {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, - {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, - {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, - {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, - {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, - {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, -] - -[[package]] -name = "click" -version = "7.1.2" -description = "Composable command line interface toolkit" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, -] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "cryptography" -version = "3.2.1" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -files = [ - {file = "cryptography-3.2.1-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:6dc59630ecce8c1f558277ceb212c751d6730bd12c80ea96b4ac65637c4f55e7"}, - {file = "cryptography-3.2.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:75e8e6684cf0034f6bf2a97095cb95f81537b12b36a8fedf06e73050bb171c2d"}, - {file = "cryptography-3.2.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4e7268a0ca14536fecfdf2b00297d4e407da904718658c1ff1961c713f90fd33"}, - {file = "cryptography-3.2.1-cp27-cp27m-win32.whl", hash = "sha256:7117319b44ed1842c617d0a452383a5a052ec6aa726dfbaffa8b94c910444297"}, - {file = "cryptography-3.2.1-cp27-cp27m-win_amd64.whl", hash = "sha256:a733671100cd26d816eed39507e585c156e4498293a907029969234e5e634bc4"}, - {file = "cryptography-3.2.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a75f306a16d9f9afebfbedc41c8c2351d8e61e818ba6b4c40815e2b5740bb6b8"}, - {file = "cryptography-3.2.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:5849d59358547bf789ee7e0d7a9036b2d29e9a4ddf1ce5e06bb45634f995c53e"}, - {file = "cryptography-3.2.1-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:bd717aa029217b8ef94a7d21632a3bb5a4e7218a4513d2521c2a2fd63011e98b"}, - {file = "cryptography-3.2.1-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:efe15aca4f64f3a7ea0c09c87826490e50ed166ce67368a68f315ea0807a20df"}, - {file = "cryptography-3.2.1-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:32434673d8505b42c0de4de86da8c1620651abd24afe91ae0335597683ed1b77"}, - {file = "cryptography-3.2.1-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:7b8d9d8d3a9bd240f453342981f765346c87ade811519f98664519696f8e6ab7"}, - {file = "cryptography-3.2.1-cp35-cp35m-win32.whl", hash = "sha256:d3545829ab42a66b84a9aaabf216a4dce7f16dbc76eb69be5c302ed6b8f4a29b"}, - {file = "cryptography-3.2.1-cp35-cp35m-win_amd64.whl", hash = "sha256:a4e27ed0b2504195f855b52052eadcc9795c59909c9d84314c5408687f933fc7"}, - {file = "cryptography-3.2.1-cp36-abi3-win32.whl", hash = "sha256:13b88a0bd044b4eae1ef40e265d006e34dbcde0c2f1e15eb9896501b2d8f6c6f"}, - {file = "cryptography-3.2.1-cp36-abi3-win_amd64.whl", hash = "sha256:07ca431b788249af92764e3be9a488aa1d39a0bc3be313d826bbec690417e538"}, - {file = "cryptography-3.2.1-cp36-cp36m-win32.whl", hash = "sha256:a035a10686532b0587d58a606004aa20ad895c60c4d029afa245802347fab57b"}, - {file = "cryptography-3.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:d26a2557d8f9122f9bf445fc7034242f4375bd4e95ecda007667540270965b13"}, - {file = "cryptography-3.2.1-cp37-cp37m-win32.whl", hash = "sha256:545a8550782dda68f8cdc75a6e3bf252017aa8f75f19f5a9ca940772fc0cb56e"}, - {file = "cryptography-3.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:55d0b896631412b6f0c7de56e12eb3e261ac347fbaa5d5e705291a9016e5f8cb"}, - {file = "cryptography-3.2.1-cp38-cp38-win32.whl", hash = "sha256:3cd75a683b15576cfc822c7c5742b3276e50b21a06672dc3a800a2d5da4ecd1b"}, - {file = "cryptography-3.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:d25cecbac20713a7c3bc544372d42d8eafa89799f492a43b79e1dfd650484851"}, - {file = "cryptography-3.2.1.tar.gz", hash = "sha256:d3d5e10be0cf2a12214ddee45c6bd203dab435e3d83b4560c03066eda600bfe3"}, -] - -[package.dependencies] -cffi = ">=1.8,<1.11.3 || >1.11.3" -six = ">=1.4.1" - -[package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["doc8", "pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=3.6.0,!=3.9.0,!=3.9.1,!=3.9.2)", "pytz"] - -[[package]] -name = "distro" -version = "1.8.0" -description = "Distro - an OS platform information API" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "distro-1.8.0-py3-none-any.whl", hash = "sha256:99522ca3e365cac527b44bde033f64c6945d90eb9f769703caaec52b09bbd3ff"}, - {file = "distro-1.8.0.tar.gz", hash = "sha256:02e111d1dc6a50abb8eed6bf31c3e48ed8b0830d1ea2a1b78c61765c2513fdd8"}, -] - -[[package]] -name = "docker" -version = "6.1.3" -description = "A Python library for the Docker Engine API." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "docker-6.1.3-py3-none-any.whl", hash = "sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9"}, - {file = "docker-6.1.3.tar.gz", hash = "sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20"}, -] - -[package.dependencies] -packaging = ">=14.0" -paramiko = {version = ">=2.4.3", optional = true, markers = "extra == \"ssh\""} -pywin32 = {version = ">=304", markers = "sys_platform == \"win32\""} -requests = ">=2.26.0" -urllib3 = ">=1.26.0" -websocket-client = ">=0.32.0" - -[package.extras] -ssh = ["paramiko (>=2.4.3)"] - -[[package]] -name = "docker-compose" -version = "1.29.2" -description = "Multi-container orchestration for Docker" -category = "main" -optional = false -python-versions = ">=3.4" -files = [ - {file = "docker-compose-1.29.2.tar.gz", hash = "sha256:4c8cd9d21d237412793d18bd33110049ee9af8dab3fe2c213bbd0733959b09b7"}, - {file = "docker_compose-1.29.2-py2.py3-none-any.whl", hash = "sha256:8d5589373b35c8d3b1c8c1182c6e4a4ff14bffa3dd0b605fcd08f73c94cef809"}, -] - -[package.dependencies] -colorama = {version = ">=0.4,<1", markers = "sys_platform == \"win32\""} -distro = ">=1.5.0,<2" -docker = {version = ">=5", extras = ["ssh"]} -dockerpty = ">=0.4.1,<1" -docopt = ">=0.6.1,<1" -jsonschema = ">=2.5.1,<4" -python-dotenv = ">=0.13.0,<1" -PyYAML = ">=3.10,<6" -requests = ">=2.20.0,<3" -texttable = ">=0.9.0,<2" -websocket-client = ">=0.32.0,<1" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2)"] -tests = ["ddt (>=1.2.2,<2)", "pytest (<6)"] - -[[package]] -name = "dockerpty" -version = "0.4.1" -description = "Python library to use the pseudo-tty of a docker container" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "dockerpty-0.4.1.tar.gz", hash = "sha256:69a9d69d573a0daa31bcd1c0774eeed5c15c295fe719c61aca550ed1393156ce"}, -] - -[package.dependencies] -six = ">=1.3.0" - -[[package]] -name = "docopt" -version = "0.6.2" -description = "Pythonic argument parser, that will make you smile" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, -] - -[[package]] -name = "dpath" -version = "2.1.6" -description = "Filesystem-like pathing and searching for dictionaries" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "dpath-2.1.6-py3-none-any.whl", hash = "sha256:31407395b177ab63ef72e2f6ae268c15e938f2990a8ecf6510f5686c02b6db73"}, - {file = "dpath-2.1.6.tar.gz", hash = "sha256:f1e07c72e8605c6a9e80b64bc8f42714de08a789c7de417e49c3f87a19692e47"}, -] - -[[package]] -name = "exceptiongroup" -version = "1.1.3" -description = "Backport of PEP 654 (exception groups)" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, - {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "fastcore" -version = "1.5.29" -description = "Python supercharged for fastai development" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "fastcore-1.5.29-py3-none-any.whl", hash = "sha256:a7d7e89faf968f2d8584df2deca344c3974f6cf476e1299cd3c067d8fa7440e9"}, - {file = "fastcore-1.5.29.tar.gz", hash = "sha256:f1a2eb04eb7933f3f9eb4064852817df44dc96e20fab5658c14c035815269a3f"}, -] - -[package.dependencies] -packaging = "*" -pip = "*" - -[package.extras] -dev = ["jupyterlab", "matplotlib", "nbdev (>=0.2.39)", "numpy", "pandas", "pillow", "torch"] - -[[package]] -name = "flask" -version = "1.1.4" -description = "A simple framework for building complex web applications." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "Flask-1.1.4-py2.py3-none-any.whl", hash = "sha256:c34f04500f2cbbea882b1acb02002ad6fe6b7ffa64a6164577995657f50aed22"}, - {file = "Flask-1.1.4.tar.gz", hash = "sha256:0fbeb6180d383a9186d0d6ed954e0042ad9f18e0e8de088b2b419d526927d196"}, -] - -[package.dependencies] -click = ">=5.1,<8.0" -itsdangerous = ">=0.24,<2.0" -Jinja2 = ">=2.10.1,<3.0" -Werkzeug = ">=0.15,<2.0" - -[package.extras] -dev = ["coverage", "pallets-sphinx-themes", "pytest", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet", "tox"] -docs = ["pallets-sphinx-themes", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet"] -dotenv = ["python-dotenv"] - -[[package]] -name = "frozenlist" -version = "1.4.0" -description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, - {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, - {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, - {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, - {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, - {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, - {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, - {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, - {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, - {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, -] - -[[package]] -name = "func-timeout" -version = "4.3.5" -description = "Python module which allows you to specify timeouts when calling any existing function. Also provides support for stoppable-threads" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "func_timeout-4.3.5.tar.gz", hash = "sha256:74cd3c428ec94f4edfba81f9b2f14904846d5ffccc27c92433b8b5939b5575dd"}, -] - -[[package]] -name = "ghapi" -version = "0.1.23" -description = "A python client for the GitHub API" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "ghapi-0.1.23-py3-none-any.whl", hash = "sha256:492b5f82b5d4844a0297c8ae6afda638432cee6c74b0bd0a0458b35d19b92b5e"}, - {file = "ghapi-0.1.23.tar.gz", hash = "sha256:93fa097e394d743c6702e217d588a4123696f62d055f2acc495166676843d59f"}, -] - -[package.dependencies] -fastcore = ">=1.5.4" -packaging = "*" -pip = "*" - -[package.extras] -dev = ["jsonref"] - -[[package]] -name = "goth" -version = "0.15.3" -description = "Golem Test Harness - integration testing framework" -category = "main" -optional = false -python-versions = "^3.10.1" -files = [] -develop = false - -[package.dependencies] -aiohttp = "^3.8.5" -ansicolors = "^1.1.0" -docker = "^6.0" -docker-compose = "^1.29" -dpath = "^2.0" -func_timeout = "4.3.5" -ghapi = "^0.1.16" -markupsafe = "2.0.1" -mitmproxy = "^5.3" -pyyaml = "5.3.1" -transitions = "^0.8" -typing_extensions = "^4.5" -urllib3 = "^1.26" -ya-aioclient = "^0.6" - -[package.source] -type = "git" -url = "https://github.com/golemfactory/goth.git" -reference = "1aa00bf9706de9464af5b06cd44416b54455f0ae" -resolved_reference = "1aa00bf9706de9464af5b06cd44416b54455f0ae" - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "h2" -version = "4.1.0" -description = "HTTP/2 State-Machine based protocol implementation" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, - {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, -] - -[package.dependencies] -hpack = ">=4.0,<5" -hyperframe = ">=6.0,<7" - -[[package]] -name = "hpack" -version = "4.0.0" -description = "Pure-Python HPACK header compression" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, - {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, -] - -[[package]] -name = "hyperframe" -version = "6.0.1" -description = "HTTP/2 framing layer for Python" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, - {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, -] - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "itsdangerous" -version = "1.1.0" -description = "Various helpers to pass data to untrusted environments and back." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"}, - {file = "itsdangerous-1.1.0.tar.gz", hash = "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19"}, -] - -[[package]] -name = "jinja2" -version = "2.11.3" -description = "A very fast and expressive template engine." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, - {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, -] - -[package.dependencies] -MarkupSafe = ">=0.23" - -[package.extras] -i18n = ["Babel (>=0.8)"] - -[[package]] -name = "jsonschema" -version = "3.2.0" -description = "An implementation of JSON Schema validation for Python" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, - {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, -] - -[package.dependencies] -attrs = ">=17.4.0" -pyrsistent = ">=0.14.0" -setuptools = "*" -six = ">=1.11.0" - -[package.extras] -format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] -format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] - -[[package]] -name = "kaitaistruct" -version = "0.9" -description = "Kaitai Struct declarative parser generator for binary data: runtime library for Python" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -files = [ - {file = "kaitaistruct-0.9.tar.gz", hash = "sha256:3d5845817ec8a4d5504379cc11bd570b038850ee49c4580bc0998c8fb1d327ad"}, -] - -[[package]] -name = "ldap3" -version = "2.8.1" -description = "A strictly RFC 4510 conforming LDAP V3 pure Python client library" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "ldap3-2.8.1-py2.py3-none-any.whl", hash = "sha256:7c3738570766f5e5e74a56fade15470f339d5c436d821cf476ef27da0a4de8b0"}, - {file = "ldap3-2.8.1.tar.gz", hash = "sha256:37d633e20fa360c302b1263c96fe932d40622d0119f1bddcb829b03462eeeeb7"}, -] - -[package.dependencies] -pyasn1 = ">=0.4.6" - -[[package]] -name = "markupsafe" -version = "2.0.1" -description = "Safely add untrusted strings to HTML/XML markup." -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, -] - -[[package]] -name = "mitmproxy" -version = "5.3.0" -description = "An interactive, SSL/TLS-capable intercepting proxy for HTTP/1, HTTP/2, and WebSockets." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "mitmproxy-5.3.0-py3-none-any.whl", hash = "sha256:481940365fc08fc2318343e530ef01d35084e8b56d1c61b5e1a7b6ed9b664d24"}, -] - -[package.dependencies] -asgiref = ">=3.2.10,<3.4" -blinker = ">=1.4,<1.5" -Brotli = ">=1.0,<1.1" -certifi = ">=2019.9.11" -click = ">=7.0,<8" -cryptography = ">=3.2,<3.3" -flask = ">=1.1.1,<1.2" -h2 = {version = ">=4.0,<5", markers = "python_version >= \"3.6.0\""} -hyperframe = {version = ">=6.0,<7", markers = "python_version >= \"3.6.0\""} -kaitaistruct = ">=0.7,<0.10" -ldap3 = ">=2.8,<2.9" -msgpack = ">=1.0.0,<1.1.0" -passlib = ">=1.6.5,<1.8" -protobuf = ">=3.6.0,<3.14" -publicsuffix2 = ">=2.20190812,<3" -pyasn1 = ">=0.3.1,<0.5" -pydivert = {version = ">=2.0.3,<2.2", markers = "sys_platform == \"win32\""} -pyOpenSSL = ">=19.1.0,<19.2" -pyparsing = ">=2.4.2,<2.5" -pyperclip = ">=1.6.0,<1.9" -"ruamel.yaml" = ">=0.16,<0.17" -sortedcontainers = ">=2.1,<2.3" -tornado = ">=4.3,<7" -urwid = ">=2.1.1,<2.2" -wsproto = ">=0.14,<0.16" -zstandard = ">=0.11,<0.15" - -[package.extras] -dev = ["Flask (>=1.0,<1.2)", "asynctest (>=0.12.0)", "hypothesis (>=5.8,<6)", "parver (>=0.1,<2.0)", "pytest (>=6.1.0,<7)", "pytest-asyncio (>=0.10.0,<0.14)", "pytest-cov (>=2.7.1,<3)", "pytest-timeout (>=1.3.3,<2)", "pytest-xdist (>=2.1.0,<3)", "requests (>=2.9.1,<3)", "tox (>=3.5,<4)"] - -[[package]] -name = "msgpack" -version = "1.0.6" -description = "MessagePack serializer" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "msgpack-1.0.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f4321692e7f299277e55f322329b2c972d93bb612d85f3fda8741bec5c6285ce"}, - {file = "msgpack-1.0.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f0e36a5fa7a182cde391a128a64f437657d2b9371dfa42eda3436245adccbf5"}, - {file = "msgpack-1.0.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b5c8dd9a386a66e50bd7fa22b7a49fb8ead2b3574d6bd69eb1caced6caea0803"}, - {file = "msgpack-1.0.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f85200ea102276afdd3749ca94747f057bbb868d1c52921ee2446730b508d0f"}, - {file = "msgpack-1.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a006c300e82402c0c8f1ded11352a3ba2a61b87e7abb3054c845af2ca8d553c"}, - {file = "msgpack-1.0.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33bbf47ea5a6ff20c23426106e81863cdbb5402de1825493026ce615039cc99d"}, - {file = "msgpack-1.0.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:04450e4b5e1e662e7c86b6aafb7c230af9334fd0becf5e6b80459a507884241c"}, - {file = "msgpack-1.0.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b06a5095a79384760625b5de3f83f40b3053a385fb893be8a106fbbd84c14980"}, - {file = "msgpack-1.0.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3910211b0ab20be3a38e0bb944ed45bd4265d8d9f11a3d1674b95b298e08dd5c"}, - {file = "msgpack-1.0.6-cp310-cp310-win32.whl", hash = "sha256:1dc67b40fe81217b308ab12651adba05e7300b3a2ccf84d6b35a878e308dd8d4"}, - {file = "msgpack-1.0.6-cp310-cp310-win_amd64.whl", hash = "sha256:885de1ed5ea01c1bfe0a34c901152a264c3c1f8f1d382042b92ea354bd14bb0e"}, - {file = "msgpack-1.0.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:099c3d8a027367e1a6fc55d15336f04ff65c60c4f737b5739f7db4525c65fe9e"}, - {file = "msgpack-1.0.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9b88dc97ba86c96b964c3745a445d9a65f76fe21955a953064fe04adb63e9367"}, - {file = "msgpack-1.0.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:00ce5f827d4f26fc094043e6f08b6069c1b148efa2631c47615ae14fb6cafc89"}, - {file = "msgpack-1.0.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd6af61388be65a8701f5787362cb54adae20007e0cc67ca9221a4b95115583b"}, - {file = "msgpack-1.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:652e4b7497825b0af6259e2c54700e6dc33d2fc4ed92b8839435090d4c9cc911"}, - {file = "msgpack-1.0.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b08676a17e3f791daad34d5fcb18479e9c85e7200d5a17cbe8de798643a7e37"}, - {file = "msgpack-1.0.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:229ccb6713c8b941eaa5cf13dc7478eba117f21513b5893c35e44483e2f0c9c8"}, - {file = "msgpack-1.0.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:95ade0bd4cf69e04e8b8f8ec2d197d9c9c4a9b6902e048dc7456bf6d82e12a80"}, - {file = "msgpack-1.0.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b16344032a27b2ccfd341f89dadf3e4ef6407d91e4b93563c14644a8abb3ad7"}, - {file = "msgpack-1.0.6-cp311-cp311-win32.whl", hash = "sha256:55bb4a1bf94e39447bc08238a2fb8a767460388a8192f67c103442eb36920887"}, - {file = "msgpack-1.0.6-cp311-cp311-win_amd64.whl", hash = "sha256:ae97504958d0bc58c1152045c170815d5c4f8af906561ce044b6358b43d0c97e"}, - {file = "msgpack-1.0.6-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7ecf431786019a7bfedc28281531d706627f603e3691d64eccdbce3ecd353823"}, - {file = "msgpack-1.0.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a635aecf1047255576dbb0927cbf9a7aa4a68e9d54110cc3c926652d18f144e0"}, - {file = "msgpack-1.0.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:102cfb54eaefa73e8ca1e784b9352c623524185c98e057e519545131a56fb0af"}, - {file = "msgpack-1.0.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c5e05e4f5756758c58a8088aa10dc70d851c89f842b611fdccfc0581c1846bc"}, - {file = "msgpack-1.0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68569509dd015fcdd1e6b2b3ccc8c51fd27d9a97f461ccc909270e220ee09685"}, - {file = "msgpack-1.0.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf652839d16de91fe1cfb253e0a88db9a548796939533894e07f45d4bdf90a5f"}, - {file = "msgpack-1.0.6-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14db7e1b7a7ed362b2f94897bf2486c899c8bb50f6e34b2db92fe534cdab306f"}, - {file = "msgpack-1.0.6-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:159cfec18a6e125dd4723e2b1de6f202b34b87c850fb9d509acfd054c01135e9"}, - {file = "msgpack-1.0.6-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6a01a072b2219b65a6ff74df208f20b2cac9401c60adb676ee34e53b4c651077"}, - {file = "msgpack-1.0.6-cp312-cp312-win32.whl", hash = "sha256:e36560d001d4ba469d469b02037f2dd404421fd72277d9474efe9f03f83fced5"}, - {file = "msgpack-1.0.6-cp312-cp312-win_amd64.whl", hash = "sha256:5e7fae9ca93258a956551708cf60dc6c8145574e32ce8c8c4d894e63bcb04341"}, - {file = "msgpack-1.0.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:40b801b768f5a765e33c68f30665d3c6ee1c8623a2d2bb78e6e59f2db4e4ceb7"}, - {file = "msgpack-1.0.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:da057d3652e698b00746e47f06dbb513314f847421e857e32e1dc61c46f6c052"}, - {file = "msgpack-1.0.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f75114c05ec56566da6b55122791cf5bb53d5aada96a98c016d6231e03132f76"}, - {file = "msgpack-1.0.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61213482b5a387ead9e250e9e3cb290292feca39dc83b41c3b1b7b8ffc8d8ecb"}, - {file = "msgpack-1.0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae6c561f11b444b258b1b4be2bdd1e1cf93cd1d80766b7e869a79db4543a8a8"}, - {file = "msgpack-1.0.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:619a63753ba9e792fe3c6c0fc2b9ee2cfbd92153dd91bee029a89a71eb2942cd"}, - {file = "msgpack-1.0.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:70843788c85ca385846a2d2f836efebe7bb2687ca0734648bf5c9dc6c55602d2"}, - {file = "msgpack-1.0.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:fb4571efe86545b772a4630fee578c213c91cbcfd20347806e47fd4e782a18fe"}, - {file = "msgpack-1.0.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bbb4448a05d261fae423d5c0b0974ad899f60825bc77eabad5a0c518e78448c2"}, - {file = "msgpack-1.0.6-cp38-cp38-win32.whl", hash = "sha256:5cd67674db3c73026e0a2c729b909780e88bd9cbc8184256f9567640a5d299a8"}, - {file = "msgpack-1.0.6-cp38-cp38-win_amd64.whl", hash = "sha256:a1cf98afa7ad5e7012454ca3fde254499a13f9d92fd50cb46118118a249a1355"}, - {file = "msgpack-1.0.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d6d25b8a5c70e2334ed61a8da4c11cd9b97c6fbd980c406033f06e4463fda006"}, - {file = "msgpack-1.0.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88cdb1da7fdb121dbb3116910722f5acab4d6e8bfcacab8fafe27e2e7744dc6a"}, - {file = "msgpack-1.0.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3b5658b1f9e486a2eec4c0c688f213a90085b9cf2fec76ef08f98fdf6c62f4b9"}, - {file = "msgpack-1.0.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76820f2ece3b0a7c948bbb6a599020e29574626d23a649476def023cbb026787"}, - {file = "msgpack-1.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c780d992f5d734432726b92a0c87bf1857c3d85082a8dea29cbf56e44a132b3"}, - {file = "msgpack-1.0.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0ed35d6d6122d0baa9a1b59ebca4ee302139f4cfb57dab85e4c73ab793ae7ed"}, - {file = "msgpack-1.0.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:32c0aff31f33033f4961abc01f78497e5e07bac02a508632aef394b384d27428"}, - {file = "msgpack-1.0.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:35ad5aed9b52217d4cea739d0ea3a492a18dd86fecb4b132668a69f27fb0363b"}, - {file = "msgpack-1.0.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47275ff73005a3e5e146e50baa2378e1730cba6e292f0222bc496a8e4c4adfc8"}, - {file = "msgpack-1.0.6-cp39-cp39-win32.whl", hash = "sha256:7baf16fd8908a025c4a8d7b699103e72d41f967e2aee5a2065432bcdbd9fd06e"}, - {file = "msgpack-1.0.6-cp39-cp39-win_amd64.whl", hash = "sha256:fc97aa4b4fb928ff4d3b74da7c30b360d0cb3ede49a5a6e1fd9705f49aea1deb"}, - {file = "msgpack-1.0.6.tar.gz", hash = "sha256:25d3746da40f3c8c59c3b1d001e49fd2aa17904438f980d9a391370366df001e"}, -] - -[[package]] -name = "multidict" -version = "6.0.4" -description = "multidict implementation" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, -] - -[[package]] -name = "mypy" -version = "1.5.1" -description = "Optional static typing for Python" -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "mypy-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f33592ddf9655a4894aef22d134de7393e95fcbdc2d15c1ab65828eee5c66c70"}, - {file = "mypy-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:258b22210a4a258ccd077426c7a181d789d1121aca6db73a83f79372f5569ae0"}, - {file = "mypy-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9ec1f695f0c25986e6f7f8778e5ce61659063268836a38c951200c57479cc12"}, - {file = "mypy-1.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:abed92d9c8f08643c7d831300b739562b0a6c9fcb028d211134fc9ab20ccad5d"}, - {file = "mypy-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a156e6390944c265eb56afa67c74c0636f10283429171018446b732f1a05af25"}, - {file = "mypy-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6ac9c21bfe7bc9f7f1b6fae441746e6a106e48fc9de530dea29e8cd37a2c0cc4"}, - {file = "mypy-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51cb1323064b1099e177098cb939eab2da42fea5d818d40113957ec954fc85f4"}, - {file = "mypy-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:596fae69f2bfcb7305808c75c00f81fe2829b6236eadda536f00610ac5ec2243"}, - {file = "mypy-1.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:32cb59609b0534f0bd67faebb6e022fe534bdb0e2ecab4290d683d248be1b275"}, - {file = "mypy-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:159aa9acb16086b79bbb0016145034a1a05360626046a929f84579ce1666b315"}, - {file = "mypy-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f6b0e77db9ff4fda74de7df13f30016a0a663928d669c9f2c057048ba44f09bb"}, - {file = "mypy-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26f71b535dfc158a71264e6dc805a9f8d2e60b67215ca0bfa26e2e1aa4d4d373"}, - {file = "mypy-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc3a600f749b1008cc75e02b6fb3d4db8dbcca2d733030fe7a3b3502902f161"}, - {file = "mypy-1.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:26fb32e4d4afa205b24bf645eddfbb36a1e17e995c5c99d6d00edb24b693406a"}, - {file = "mypy-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:82cb6193de9bbb3844bab4c7cf80e6227d5225cc7625b068a06d005d861ad5f1"}, - {file = "mypy-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a465ea2ca12804d5b34bb056be3a29dc47aea5973b892d0417c6a10a40b2d65"}, - {file = "mypy-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9fece120dbb041771a63eb95e4896791386fe287fefb2837258925b8326d6160"}, - {file = "mypy-1.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d28ddc3e3dfeab553e743e532fb95b4e6afad51d4706dd22f28e1e5e664828d2"}, - {file = "mypy-1.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:57b10c56016adce71fba6bc6e9fd45d8083f74361f629390c556738565af8eeb"}, - {file = "mypy-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff0cedc84184115202475bbb46dd99f8dcb87fe24d5d0ddfc0fe6b8575c88d2f"}, - {file = "mypy-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8f772942d372c8cbac575be99f9cc9d9fb3bd95c8bc2de6c01411e2c84ebca8a"}, - {file = "mypy-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5d627124700b92b6bbaa99f27cbe615c8ea7b3402960f6372ea7d65faf376c14"}, - {file = "mypy-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:361da43c4f5a96173220eb53340ace68cda81845cd88218f8862dfb0adc8cddb"}, - {file = "mypy-1.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:330857f9507c24de5c5724235e66858f8364a0693894342485e543f5b07c8693"}, - {file = "mypy-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:c543214ffdd422623e9fedd0869166c2f16affe4ba37463975043ef7d2ea8770"}, - {file = "mypy-1.5.1-py3-none-any.whl", hash = "sha256:f757063a83970d67c444f6e01d9550a7402322af3557ce7630d3c957386fa8f5"}, - {file = "mypy-1.5.1.tar.gz", hash = "sha256:b031b9601f1060bf1281feab89697324726ba0c0bae9d7cd7ab4b690940f0b92"}, -] - -[package.dependencies] -mypy-extensions = ">=1.0.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.1.0" - -[package.extras] -dmypy = ["psutil (>=4.0)"] -install-types = ["pip"] -reports = ["lxml"] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "packaging" -version = "23.1" -description = "Core utilities for Python packages" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, - {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, -] - -[[package]] -name = "paramiko" -version = "2.12.0" -description = "SSH2 protocol library" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "paramiko-2.12.0-py2.py3-none-any.whl", hash = "sha256:b2df1a6325f6996ef55a8789d0462f5b502ea83b3c990cbb5bbe57345c6812c4"}, - {file = "paramiko-2.12.0.tar.gz", hash = "sha256:376885c05c5d6aa6e1f4608aac2a6b5b0548b1add40274477324605903d9cd49"}, -] - -[package.dependencies] -bcrypt = ">=3.1.3" -cryptography = ">=2.5" -pynacl = ">=1.0.1" -six = "*" - -[package.extras] -all = ["bcrypt (>=3.1.3)", "gssapi (>=1.4.1)", "invoke (>=1.3)", "pyasn1 (>=0.1.7)", "pynacl (>=1.0.1)", "pywin32 (>=2.1.8)"] -ed25519 = ["bcrypt (>=3.1.3)", "pynacl (>=1.0.1)"] -gssapi = ["gssapi (>=1.4.1)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] -invoke = ["invoke (>=1.3)"] - -[[package]] -name = "passlib" -version = "1.7.4" -description = "comprehensive password hashing framework supporting over 30 schemes" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, - {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, -] - -[package.extras] -argon2 = ["argon2-cffi (>=18.2.0)"] -bcrypt = ["bcrypt (>=3.1.0)"] -build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"] -totp = ["cryptography"] - -[[package]] -name = "pastel" -version = "0.2.1" -description = "Bring colors to your terminal." -category = "dev" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, - {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, -] - -[[package]] -name = "pathspec" -version = "0.11.2" -description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, -] - -[[package]] -name = "pip" -version = "23.2.1" -description = "The PyPA recommended tool for installing Python packages." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pip-23.2.1-py3-none-any.whl", hash = "sha256:7ccf472345f20d35bdc9d1841ff5f313260c2c33fe417f48c30ac46cccabf5be"}, - {file = "pip-23.2.1.tar.gz", hash = "sha256:fb0bd5435b3200c602b5bf61d2d43c2f13c02e29c1707567ae7fbc514eb9faf2"}, -] - -[[package]] -name = "pluggy" -version = "1.3.0" -description = "plugin and hook calling mechanisms for python" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "poethepoet" -version = "0.22.1" -description = "A task runner that works well with poetry." -category = "dev" -optional = false -python-versions = ">=3.8" -files = [ - {file = "poethepoet-0.22.1-py3-none-any.whl", hash = "sha256:1da4cd00d3b2c44b811c91616a744cf71094a26a299ea9956025162d34eef1a5"}, - {file = "poethepoet-0.22.1.tar.gz", hash = "sha256:e758bcac731fa9ac0b812389589541e32b825c4a1894e16fa90aeb1946ba2823"}, -] - -[package.dependencies] -pastel = ">=0.2.1,<0.3.0" -tomli = ">=1.2.2" - -[package.extras] -poetry-plugin = ["poetry (>=1.0,<2.0)"] - -[[package]] -name = "protobuf" -version = "3.13.0" -description = "Protocol Buffers" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "protobuf-3.13.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9c2e63c1743cba12737169c447374fab3dfeb18111a460a8c1a000e35836b18c"}, - {file = "protobuf-3.13.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1e834076dfef9e585815757a2c7e4560c7ccc5962b9d09f831214c693a91b463"}, - {file = "protobuf-3.13.0-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:df3932e1834a64b46ebc262e951cd82c3cf0fa936a154f0a42231140d8237060"}, - {file = "protobuf-3.13.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8c35bcbed1c0d29b127c886790e9d37e845ffc2725cc1db4bd06d70f4e8359f4"}, - {file = "protobuf-3.13.0-cp35-cp35m-win32.whl", hash = "sha256:339c3a003e3c797bc84499fa32e0aac83c768e67b3de4a5d7a5a9aa3b0da634c"}, - {file = "protobuf-3.13.0-cp35-cp35m-win_amd64.whl", hash = "sha256:361acd76f0ad38c6e38f14d08775514fbd241316cce08deb2ce914c7dfa1184a"}, - {file = "protobuf-3.13.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9edfdc679a3669988ec55a989ff62449f670dfa7018df6ad7f04e8dbacb10630"}, - {file = "protobuf-3.13.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5db9d3e12b6ede5e601b8d8684a7f9d90581882925c96acf8495957b4f1b204b"}, - {file = "protobuf-3.13.0-cp36-cp36m-win32.whl", hash = "sha256:c8abd7605185836f6f11f97b21200f8a864f9cb078a193fe3c9e235711d3ff1e"}, - {file = "protobuf-3.13.0-cp36-cp36m-win_amd64.whl", hash = "sha256:4d1174c9ed303070ad59553f435846a2f877598f59f9afc1b89757bdf846f2a7"}, - {file = "protobuf-3.13.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0bba42f439bf45c0f600c3c5993666fcb88e8441d011fad80a11df6f324eef33"}, - {file = "protobuf-3.13.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c0c5ab9c4b1eac0a9b838f1e46038c3175a95b0f2d944385884af72876bd6bc7"}, - {file = "protobuf-3.13.0-cp37-cp37m-win32.whl", hash = "sha256:f68eb9d03c7d84bd01c790948320b768de8559761897763731294e3bc316decb"}, - {file = "protobuf-3.13.0-cp37-cp37m-win_amd64.whl", hash = "sha256:91c2d897da84c62816e2f473ece60ebfeab024a16c1751aaf31100127ccd93ec"}, - {file = "protobuf-3.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3dee442884a18c16d023e52e32dd34a8930a889e511af493f6dc7d4d9bf12e4f"}, - {file = "protobuf-3.13.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:e7662437ca1e0c51b93cadb988f9b353fa6b8013c0385d63a70c8a77d84da5f9"}, - {file = "protobuf-3.13.0-py2.py3-none-any.whl", hash = "sha256:d69697acac76d9f250ab745b46c725edf3e98ac24763990b24d58c16c642947a"}, - {file = "protobuf-3.13.0.tar.gz", hash = "sha256:6a82e0c8bb2bf58f606040cc5814e07715b2094caeba281e2e7d0b0e2e397db5"}, -] - -[package.dependencies] -setuptools = "*" -six = ">=1.9" - -[[package]] -name = "publicsuffix2" -version = "2.20191221" -description = "Get a public suffix for a domain name using the Public Suffix List. Forked from and using the same API as the publicsuffix package." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "publicsuffix2-2.20191221-py2.py3-none-any.whl", hash = "sha256:786b5e36205b88758bd3518725ec8cfe7a8173f5269354641f581c6b80a99893"}, - {file = "publicsuffix2-2.20191221.tar.gz", hash = "sha256:00f8cc31aa8d0d5592a5ced19cccba7de428ebca985db26ac852d920ddd6fe7b"}, -] - -[[package]] -name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, -] - -[[package]] -name = "pycparser" -version = "2.21" -description = "C parser in Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] - -[[package]] -name = "pydivert" -version = "2.1.0" -description = "Python binding to windivert driver" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pydivert-2.1.0-py2.py3-none-any.whl", hash = "sha256:382db488e3c37c03ec9ec94e061a0b24334d78dbaeebb7d4e4d32ce4355d9da1"}, - {file = "pydivert-2.1.0.tar.gz", hash = "sha256:f0e150f4ff591b78e35f514e319561dadff7f24a82186a171dd4d465483de5b4"}, -] - -[package.extras] -docs = ["sphinx (>=1.4.8)"] -test = ["codecov (>=2.0.5)", "hypothesis (>=3.5.3)", "mock (>=1.0.1)", "pytest (>=3.0.3)", "pytest-cov (>=2.2.1)", "pytest-faulthandler (>=1.3.0,<2)", "pytest-timeout (>=1.0.0,<2)", "wheel (>=0.29)"] - -[[package]] -name = "pynacl" -version = "1.5.0" -description = "Python binding to the Networking and Cryptography (NaCl) library" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, - {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, - {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, - {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, - {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, - {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, -] - -[package.dependencies] -cffi = ">=1.4.1" - -[package.extras] -docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] -tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] - -[[package]] -name = "pyopenssl" -version = "19.1.0" -description = "Python wrapper module around the OpenSSL library" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pyOpenSSL-19.1.0-py2.py3-none-any.whl", hash = "sha256:621880965a720b8ece2f1b2f54ea2071966ab00e2970ad2ce11d596102063504"}, - {file = "pyOpenSSL-19.1.0.tar.gz", hash = "sha256:9a24494b2602aaf402be5c9e30a0b82d4a5c67528fe8fb475e3f3bc00dd69507"}, -] - -[package.dependencies] -cryptography = ">=2.8" -six = ">=1.5.2" - -[package.extras] -docs = ["sphinx", "sphinx-rtd-theme"] -test = ["flaky", "pretend", "pytest (>=3.0.1)"] - -[[package]] -name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] - -[[package]] -name = "pyperclip" -version = "1.8.2" -description = "A cross-platform clipboard module for Python. (Only handles plain text for now.)" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pyperclip-1.8.2.tar.gz", hash = "sha256:105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57"}, -] - -[[package]] -name = "pyrsistent" -version = "0.19.3" -description = "Persistent/Functional/Immutable data structures" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, - {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, - {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, - {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, - {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, - {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, - {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, - {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, - {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, - {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, - {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, - {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, - {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, - {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, - {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, - {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, - {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, - {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, - {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, - {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, - {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, - {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, -] - -[[package]] -name = "pytest" -version = "7.4.2" -description = "pytest: simple powerful testing with Python" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, - {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} - -[package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "pytest-asyncio" -version = "0.21.0" -description = "Pytest support for asyncio" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest-asyncio-0.21.0.tar.gz", hash = "sha256:2b38a496aef56f56b0e87557ec313e11e1ab9276fc3863f6a7be0f1d0e415e1b"}, - {file = "pytest_asyncio-0.21.0-py3-none-any.whl", hash = "sha256:f2b3366b7cd501a4056858bd39349d5af19742aed2d81660b7998b6341c7eb9c"}, -] - -[package.dependencies] -pytest = ">=7.0.0" - -[package.extras] -docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] -testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] - -[[package]] -name = "pytest-rerunfailures" -version = "10.3" -description = "pytest plugin to re-run tests to eliminate flaky failures" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "pytest-rerunfailures-10.3.tar.gz", hash = "sha256:d8244d799f89a6edb5e57301ddaeb3b6f10d6691638d51e80b371311592e28c6"}, - {file = "pytest_rerunfailures-10.3-py3-none-any.whl", hash = "sha256:6be6f96510bf94b54198bf15bc5568fe2cdff88e83875912e22d29810acf65ff"}, -] - -[package.dependencies] -packaging = ">=17.1" -pytest = ">=5.3" - -[[package]] -name = "pytest-split" -version = "0.8.1" -description = "Pytest plugin which splits the test suite to equally sized sub suites based on test execution time." -category = "main" -optional = false -python-versions = ">=3.7.1,<4.0" -files = [ - {file = "pytest_split-0.8.1-py3-none-any.whl", hash = "sha256:74b110ea091bd147cc1c5f9665a59506e5cedfa66f96a89fb03e4ab447c2c168"}, - {file = "pytest_split-0.8.1.tar.gz", hash = "sha256:2d88bd3dc528689a7a3f58fc12ea165c3aa62e90795e420dfad920afe5612d6d"}, -] - -[package.dependencies] -pytest = ">=5,<8" - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-dotenv" -version = "0.21.1" -description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "python-dotenv-0.21.1.tar.gz", hash = "sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49"}, - {file = "python_dotenv-0.21.1-py3-none-any.whl", hash = "sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a"}, -] - -[package.extras] -cli = ["click (>=5.0)"] - -[[package]] -name = "pywin32" -version = "306" -description = "Python for Window Extensions" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, - {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, - {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, - {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, - {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, - {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, - {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, - {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, - {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, - {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, - {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, - {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, - {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, - {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, -] - -[[package]] -name = "pyyaml" -version = "5.3.1" -description = "YAML parser and emitter for Python" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, - {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, - {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, - {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, - {file = "PyYAML-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a"}, - {file = "PyYAML-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e"}, - {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, -] - -[[package]] -name = "regex" -version = "2023.8.8" -description = "Alternative regular expression module, to replace re." -category = "dev" -optional = false -python-versions = ">=3.6" -files = [ - {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, - {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, - {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, - {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, - {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, - {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, - {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, - {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, - {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, - {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, - {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, - {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, - {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, - {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, - {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, - {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, - {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, - {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, - {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, - {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, - {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, - {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, - {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, - {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, - {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, - {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, - {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, - {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, - {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, - {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, - {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, - {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, - {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, - {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, - {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, -] - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "ruamel-yaml" -version = "0.16.13" -description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "ruamel.yaml-0.16.13-py2.py3-none-any.whl", hash = "sha256:64b06e7873eb8e1125525ecef7345447d786368cadca92a7cd9b59eae62e95a3"}, - {file = "ruamel.yaml-0.16.13.tar.gz", hash = "sha256:bb48c514222702878759a05af96f4b7ecdba9b33cd4efcf25c86b882cef3a942"}, -] - -[package.extras] -docs = ["ryd"] -jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] - -[[package]] -name = "setuptools" -version = "68.2.2" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, - {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "sortedcontainers" -version = "2.2.2" -description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "sortedcontainers-2.2.2-py2.py3-none-any.whl", hash = "sha256:c633ebde8580f241f274c1f8994a665c0e54a17724fecd0cae2f079e09c36d3f"}, - {file = "sortedcontainers-2.2.2.tar.gz", hash = "sha256:4e73a757831fc3ca4de2859c422564239a31d8213d09a2a666e375807034d2ba"}, -] - -[[package]] -name = "texttable" -version = "1.6.7" -description = "module to create simple ASCII tables" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "texttable-1.6.7-py2.py3-none-any.whl", hash = "sha256:b7b68139aa8a6339d2c320ca8b1dc42d13a7831a346b446cb9eb385f0c76310c"}, - {file = "texttable-1.6.7.tar.gz", hash = "sha256:290348fb67f7746931bcdfd55ac7584ecd4e5b0846ab164333f0794b121760f2"}, -] - -[[package]] -name = "tomli" -version = "1.2.3" -description = "A lil' TOML parser" -category = "main" -optional = false -python-versions = ">=3.6" -files = [ - {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, - {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, -] - -[[package]] -name = "tornado" -version = "6.3.3" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "main" -optional = false -python-versions = ">= 3.8" -files = [ - {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, - {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, - {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, - {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, - {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, -] - -[[package]] -name = "transitions" -version = "0.8.11" -description = "A lightweight, object-oriented Python state machine implementation with many extensions." -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "transitions-0.8.11-py2.py3-none-any.whl", hash = "sha256:9525dd9b708b0a54bb4562a06a483d237e75c94547ba9831c81c6872d0ea1522"}, - {file = "transitions-0.8.11.tar.gz", hash = "sha256:7b20d32906ea4d60ee6f6c1f5dc9c9f178802425c5b155213eb0f25c277f04e4"}, -] - -[package.dependencies] -six = "*" - -[package.extras] -diagrams = ["pygraphviz"] -test = ["pytest"] - -[[package]] -name = "typing-extensions" -version = "4.8.0" -description = "Backported and Experimental Type Hints for Python 3.8+" -category = "main" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, -] - -[[package]] -name = "urllib3" -version = "1.26.16" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, - {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, -] - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "urwid" -version = "2.1.2" -description = "A full-featured console (xterm et al.) user interface library" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "urwid-2.1.2.tar.gz", hash = "sha256:588bee9c1cb208d0906a9f73c613d2bd32c3ed3702012f51efe318a3f2127eae"}, -] - -[[package]] -name = "websocket-client" -version = "0.59.0" -description = "WebSocket client for Python with low level API options" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "websocket-client-0.59.0.tar.gz", hash = "sha256:d376bd60eace9d437ab6d7ee16f4ab4e821c9dae591e1b783c58ebd8aaf80c5c"}, - {file = "websocket_client-0.59.0-py2.py3-none-any.whl", hash = "sha256:2e50d26ca593f70aba7b13a489435ef88b8fc3b5c5643c1ce8808ff9b40f0b32"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "werkzeug" -version = "1.0.1" -description = "The comprehensive WSGI web application library." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "Werkzeug-1.0.1-py2.py3-none-any.whl", hash = "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43"}, - {file = "Werkzeug-1.0.1.tar.gz", hash = "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c"}, -] - -[package.extras] -dev = ["coverage", "pallets-sphinx-themes", "pytest", "pytest-timeout", "sphinx", "sphinx-issues", "tox"] -watchdog = ["watchdog"] - -[[package]] -name = "wsproto" -version = "0.15.0" -description = "WebSockets state-machine based protocol implementation" -category = "main" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "wsproto-0.15.0-py2.py3-none-any.whl", hash = "sha256:e3d190a11d9307112ba23bbe60055604949b172143969c8f641318476a9b6f1d"}, - {file = "wsproto-0.15.0.tar.gz", hash = "sha256:614798c30e5dc2b3f65acc03d2d50842b97621487350ce79a80a711229edfa9d"}, -] - -[package.dependencies] -h11 = ">=0.8.1" - -[[package]] -name = "ya-aioclient" -version = "0.6.4" -description = "" -category = "main" -optional = false -python-versions = ">=3.6,<4.0" -files = [ - {file = "ya-aioclient-0.6.4.tar.gz", hash = "sha256:e5e5926e3a7d834082b05aeb986d8fb2f7fa46a1bd1bca2f3f1c872e1ba479ae"}, - {file = "ya_aioclient-0.6.4-py3-none-any.whl", hash = "sha256:1d36c2544c2d7629a00a2b1f18b4535e836586cae99bfbf5714ed5ca3f9caa0c"}, -] - -[package.dependencies] -aiohttp = ">=3.6.2,<4.0.0" -certifi = ">=2020.6.20,<2021.0.0" -python-dateutil = ">=2.8.1,<3.0.0" - -[[package]] -name = "yarl" -version = "1.9.2" -description = "Yet another URL library" -category = "main" -optional = false -python-versions = ">=3.7" -files = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, -] - -[package.dependencies] -idna = ">=2.0" -multidict = ">=4.0" - -[[package]] -name = "zstandard" -version = "0.14.1" -description = "Zstandard bindings for Python" -category = "main" -optional = false -python-versions = "*" -files = [ - {file = "zstandard-0.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ec1a20936484f3804fba4f29f7d8ed67c70e44536b0f0191a13eff4dc61c815c"}, - {file = "zstandard-0.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:85b37acd054f8f778e5c9832e17fb651f321a3daafa0eb94360eeffce141b0cf"}, - {file = "zstandard-0.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:95939a7e3972ec20e2e959ee9cd0fd858b25ff3a6f5040c5c78fcab51eeab030"}, - {file = "zstandard-0.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:d3999f92ab7aab2a99ac7f7730b3bee8d6bd3e52953ed0e87ab881ca4244a315"}, - {file = "zstandard-0.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:8df3114dfff411aa9827d754bb8fdcdaa15e63c96d7730778fe322f4c85360d8"}, - {file = "zstandard-0.14.1-cp27-cp27m-win32.whl", hash = "sha256:4e6d6b0e541b00d0096a260d5f6eb32f737bfcdb2e5b87a7b7be77ef669c7a6c"}, - {file = "zstandard-0.14.1-cp27-cp27m-win_amd64.whl", hash = "sha256:064aac12b8e7813fa3870e7479e9cbd3803e33212b68e555b408711ea8f6cb54"}, - {file = "zstandard-0.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:b508a826c4b99835e3d8a8d415a6e516cacad4a95ef5ed01f60f9b067f200a51"}, - {file = "zstandard-0.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a72cb707cc0a9d06e3912fe5b6c1648d70ac512f3e180018c82fe926926be12c"}, - {file = "zstandard-0.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:1c065de617b7367c4da4de687a071932e48ae200d09c0afbc24415d98aec470d"}, - {file = "zstandard-0.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:391c30620e3ad6bc53804f32e3f74cbbaa713d95f46ac5f2e54e735d1dfc51c0"}, - {file = "zstandard-0.14.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:403fa9544ecdedcc5fdc48f5e41e092658ac48222cfe6e75fb5710cb3d14c700"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:657a49b1df5a82985ea6495c6c1497a17e34e41a0bd8ef95a640342a19b8e6a4"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c3c9657417bf1eccb94ad64544e12efa8ea3e16612944b32e253314472a54e5"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:d2db7bcdc9b3e5a782d71df0163a6587b8b2f759cc4a819859e27e6ad2f778e6"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:1be45b237fea45c705d83215450a9381c2787bbf0720824b1fe23ed72f8db0b7"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux2014_i686.whl", hash = "sha256:477db538b596767d036379165a27aa2e19edbae50bec4cea195a986ba50bbad6"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:ac9b88a72f2dcfa3facbe6af96d59e82459e5815c15aa59481cc6080937ee02e"}, - {file = "zstandard-0.14.1-cp35-cp35m-win32.whl", hash = "sha256:2826d664eb84f9efe0fae47cf20c27f3662aae3556fbcc4cecd5318fbc9239f3"}, - {file = "zstandard-0.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:36cd223d7fd0fe0e32e82993240e9a24503269c93431e62369088e2299cf4605"}, - {file = "zstandard-0.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d4a7065d7fc991edb93483dbb7bc37dd091a2bac9572d9b9df243e6565d30522"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6f437168752e50ad6a47d054f4a41933693b1675f65663c117067747d95f057c"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e80ade52a06fb433c9ad7d6c8cfb3dafa34f05bedce543e95a670972ba41d65d"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:0b3ae587556a6f45cd982d7684b1318793430d0ae9e376dbc3d877b48ac6d576"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:d34848645f3507dc85baa8c67426f0685b08583e930fa3a1ab5048c5f0ba8fc1"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:5be097127be1659bc6cffb5d885c781e61947597e2fcd1ecf48713313e53657d"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:e3731e0dc1c200e5c2f56ca36bed6c28903f764769f534fbf9ed4178f193e8aa"}, - {file = "zstandard-0.14.1-cp36-cp36m-win32.whl", hash = "sha256:aab21dd5724aa5bdd0aac16f5d175e5df0715fc614910220a918d50f08321982"}, - {file = "zstandard-0.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:ed14a62f8bf2462f19373c337527ff684deb6d0d6b973fbcaece1f561c30f405"}, - {file = "zstandard-0.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:db1b3442441577d81bdae85fc7a4bd553e3161ec745e9dd1f2f93889248363fe"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:8486a01696e3cdfa47b93caa8f5064c9d277bad1c39eb31947bf2b8f019e3510"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4b054fd8cf274b958a3d7a201f8b42a30ebf8f76d87770075e1aca6017006e97"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:fb5f0d29bcbfba6ef9beccba55f567d089747034add5cd7e8dc58842bb745803"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:90f0bb1adcfea326c6548a45cc35474bec56a34d80310b6e78abab313da780fc"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:0b57df1f9530669d61f8708eb15ded6584db4a6733cc5155eb8561d31f292557"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:3948000d753b9110e1eb43a6cba6fdb64c895faebb47628a96550edc5238b78a"}, - {file = "zstandard-0.14.1-cp37-cp37m-win32.whl", hash = "sha256:17e8f29aae79d870daa3ab48c0dbf83594bf956c2c2125ae45cdfebd2b62d8ed"}, - {file = "zstandard-0.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d7fecb5172dc885665581437fe96bf8f03ffc0022b723964c272accbb62713b4"}, - {file = "zstandard-0.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2fd76d29f4e8d7c4aac42617a0439506144146032b5d7b9b0a42f37f916fdb2"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:7309bf511c8b332be2b5a834efbd7ee0cd43db2c811dd916fd0f48acd43e8722"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:a51a09a3be208e627ebb518a78c639d240584f5d1da8106dcafa31d22103b4df"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a820ef78f39c29469caacb0bf43ffd024b78f242393c605daa748588b3247306"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:e3963c919f65367587cf987a71991e69385f19cec9ad8166249b83e176cdbcd8"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:0e5b8fd428d0d00fb7dabc0898de9e87659cb54738d527becff37d3d90df8e88"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:41eab10e6570e14dd77a346f3dbb1eab3f23a652bce07ba47c8c23116b0cee9c"}, - {file = "zstandard-0.14.1-cp38-cp38-win32.whl", hash = "sha256:fbbe18afb67329577ab6a907f348175d3f6044d179a9b56b02206ff9e67c5b12"}, - {file = "zstandard-0.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:3bd044ef32bd6738c3db2cb2d4bc77812e9a3132df942303bbfcd1a484023b60"}, - {file = "zstandard-0.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:24ab8f1c7c970822bd55dbb091f7eb271b417e777e8b3ae6722e60d67f747c05"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:cf67443d06b88218eb8915da2d968dcf6fdc384fb245f97155617ff3b8d77e92"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d78db92ac27cdcd55333b7e642cd400719842e692e8836f0b249e459b26d384b"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bd4da25cc46e972b029f8aa9f103c5977dbe461e1916ff7edec24065071b4a08"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:2075be64372206af3df40fef0fee657b44845d3e6d98b4cc8aba220be861de2d"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:70dfe74b24971476a6a20d42abb964c9ac0fb1af7b89228e5845748377543bd0"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:3382ce6e44e9e847dce848bc2638403aa9320cb38edcc34b71e13be5793619e0"}, - {file = "zstandard-0.14.1-cp39-cp39-win32.whl", hash = "sha256:7161d71debb94c456cbddd8a239e89219f37f0b1a4c0620a2c1400801aeeec7d"}, - {file = "zstandard-0.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d2ec8309309fc7254d21286d6b3e5c28e4019cd8e266d1a860456a69ea7c2400"}, - {file = "zstandard-0.14.1.tar.gz", hash = "sha256:5dd700e52ec28c64d43f681ccde76b6436c8f89a332d6c9e22a6b629f28daeb5"}, -] - -[metadata] -lock-version = "2.0" -python-versions = "^3.10.1" -content-hash = "86a557f07199857f73bd83f8e52d1f3844d7e5101263900f679705732db43761" +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. + +[[package]] +name = "aiohttp" +version = "3.8.5" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, + {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, + {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, + {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, + {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, + {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, + {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, + {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, + {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, + {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, + {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<4.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "cchardet"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "ansicolors" +version = "1.1.8" +description = "ANSI colors for Python" +optional = false +python-versions = "*" +files = [ + {file = "ansicolors-1.1.8-py2.py3-none-any.whl", hash = "sha256:00d2dde5a675579325902536738dd27e4fac1fd68f773fe36c21044eb559e187"}, + {file = "ansicolors-1.1.8.zip", hash = "sha256:99f94f5e3348a0bcd43c82e5fc4414013ccc19d70bd939ad71e0133ce9c372e0"}, +] + +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] + +[[package]] +name = "asgiref" +version = "3.3.4" +description = "ASGI specs, helper code, and adapters" +optional = false +python-versions = ">=3.6" +files = [ + {file = "asgiref-3.3.4-py3-none-any.whl", hash = "sha256:92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee"}, + {file = "asgiref-3.3.4.tar.gz", hash = "sha256:d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78"}, +] + +[package.extras] +tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] + +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "bcrypt" +version = "4.0.1" +description = "Modern password hashing for your software and your servers" +optional = false +python-versions = ">=3.6" +files = [ + {file = "bcrypt-4.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b1023030aec778185a6c16cf70f359cbb6e0c289fd564a7cfa29e727a1c38f8f"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:08d2947c490093a11416df18043c27abe3921558d2c03e2076ccb28a116cb6d0"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eaa47d4661c326bfc9d08d16debbc4edf78778e6aaba29c1bc7ce67214d4410"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae88eca3024bb34bb3430f964beab71226e761f51b912de5133470b649d82344"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:a522427293d77e1c29e303fc282e2d71864579527a04ddcfda6d4f8396c6c36a"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fbdaec13c5105f0c4e5c52614d04f0bca5f5af007910daa8b6b12095edaa67b3"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ca3204d00d3cb2dfed07f2d74a25f12fc12f73e606fcaa6975d1f7ae69cacbb2"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:089098effa1bc35dc055366740a067a2fc76987e8ec75349eb9484061c54f535"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e9a51bbfe7e9802b5f3508687758b564069ba937748ad7b9e890086290d2f79e"}, + {file = "bcrypt-4.0.1-cp36-abi3-win32.whl", hash = "sha256:2caffdae059e06ac23fce178d31b4a702f2a3264c20bfb5ff541b338194d8fab"}, + {file = "bcrypt-4.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf4fa8b2ca74381bb5442c089350f09a3f17797829d958fad058d6e44d9eb83c"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:67a97e1c405b24f19d08890e7ae0c4f7ce1e56a712a016746c8b2d7732d65d4b"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b3b85202d95dd568efcb35b53936c5e3b3600c7cdcc6115ba461df3a8e89f38d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbb03eec97496166b704ed663a53680ab57c5084b2fc98ef23291987b525cb7d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:5ad4d32a28b80c5fa6671ccfb43676e8c1cc232887759d1cd7b6f56ea4355215"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b57adba8a1444faf784394de3436233728a1ecaeb6e07e8c22c8848f179b893c"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b2cea8a9ed3d55b4491887ceadb0106acf7c6387699fca771af56b1cdeeda"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:2b3ac11cf45161628f1f3733263e63194f22664bf4d0c0f3ab34099c02134665"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3100851841186c25f127731b9fa11909ab7b1df6fc4b9f8353f4f1fd952fbf71"}, + {file = "bcrypt-4.0.1.tar.gz", hash = "sha256:27d375903ac8261cfe4047f6709d16f7d18d39b1ec92aaf72af989552a650ebd"}, +] + +[package.extras] +tests = ["pytest (>=3.2.1,!=3.3.0)"] +typecheck = ["mypy"] + +[[package]] +name = "black" +version = "21.7b0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.6.2" +files = [ + {file = "black-21.7b0-py3-none-any.whl", hash = "sha256:1c7aa6ada8ee864db745b22790a32f94b2795c253a75d6d9b5e439ff10d23116"}, + {file = "black-21.7b0.tar.gz", hash = "sha256:c8373c6491de9362e39271630b65b964607bc5c79c83783547d76c839b3aa219"}, +] + +[package.dependencies] +appdirs = "*" +click = ">=7.1.2" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.8.1,<1" +regex = ">=2020.1.8" +tomli = ">=0.2.6,<2.0.0" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +python2 = ["typed-ast (>=1.4.2)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "blinker" +version = "1.4" +description = "Fast, simple object-to-object and broadcast signaling" +optional = false +python-versions = "*" +files = [ + {file = "blinker-1.4.tar.gz", hash = "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"}, +] + +[[package]] +name = "brotli" +version = "1.0.9" +description = "Python bindings for the Brotli compression library" +optional = false +python-versions = "*" +files = [ + {file = "Brotli-1.0.9-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:268fe94547ba25b58ebc724680609c8ee3e5a843202e9a381f6f9c5e8bdb5c70"}, + {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:c2415d9d082152460f2bd4e382a1e85aed233abc92db5a3880da2257dc7daf7b"}, + {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5913a1177fc36e30fcf6dc868ce23b0453952c78c04c266d3149b3d39e1410d6"}, + {file = "Brotli-1.0.9-cp27-cp27m-win32.whl", hash = "sha256:afde17ae04d90fbe53afb628f7f2d4ca022797aa093e809de5c3cf276f61bbfa"}, + {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7cb81373984cc0e4682f31bc3d6be9026006d96eecd07ea49aafb06897746452"}, + {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:db844eb158a87ccab83e868a762ea8024ae27337fc7ddcbfcddd157f841fdfe7"}, + {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9744a863b489c79a73aba014df554b0e7a0fc44ef3f8a0ef2a52919c7d155031"}, + {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a72661af47119a80d82fa583b554095308d6a4c356b2a554fdc2799bc19f2a43"}, + {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ee83d3e3a024a9618e5be64648d6d11c37047ac48adff25f12fa4226cf23d1c"}, + {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:19598ecddd8a212aedb1ffa15763dd52a388518c4550e615aed88dc3753c0f0c"}, + {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:44bb8ff420c1d19d91d79d8c3574b8954288bdff0273bf788954064d260d7ab0"}, + {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e23281b9a08ec338469268f98f194658abfb13658ee98e2b7f85ee9dd06caa91"}, + {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3496fc835370da351d37cada4cf744039616a6db7d13c430035e901443a34daa"}, + {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83bb06a0192cccf1eb8d0a28672a1b79c74c3a8a5f2619625aeb6f28b3a82bb"}, + {file = "Brotli-1.0.9-cp310-cp310-win32.whl", hash = "sha256:26d168aac4aaec9a4394221240e8a5436b5634adc3cd1cdf637f6645cecbf181"}, + {file = "Brotli-1.0.9-cp310-cp310-win_amd64.whl", hash = "sha256:622a231b08899c864eb87e85f81c75e7b9ce05b001e59bbfbf43d4a71f5f32b2"}, + {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cc0283a406774f465fb45ec7efb66857c09ffefbe49ec20b7882eff6d3c86d3a"}, + {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:11d3283d89af7033236fa4e73ec2cbe743d4f6a81d41bd234f24bf63dde979df"}, + {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c1306004d49b84bd0c4f90457c6f57ad109f5cc6067a9664e12b7b79a9948ad"}, + {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1375b5d17d6145c798661b67e4ae9d5496920d9265e2f00f1c2c0b5ae91fbde"}, + {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cab1b5964b39607a66adbba01f1c12df2e55ac36c81ec6ed44f2fca44178bf1a"}, + {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ed6a5b3d23ecc00ea02e1ed8e0ff9a08f4fc87a1f58a2530e71c0f48adf882f"}, + {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cb02ed34557afde2d2da68194d12f5719ee96cfb2eacc886352cb73e3808fc5d"}, + {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b3523f51818e8f16599613edddb1ff924eeb4b53ab7e7197f85cbc321cdca32f"}, + {file = "Brotli-1.0.9-cp311-cp311-win32.whl", hash = "sha256:ba72d37e2a924717990f4d7482e8ac88e2ef43fb95491eb6e0d124d77d2a150d"}, + {file = "Brotli-1.0.9-cp311-cp311-win_amd64.whl", hash = "sha256:3ffaadcaeafe9d30a7e4e1e97ad727e4f5610b9fa2f7551998471e3736738679"}, + {file = "Brotli-1.0.9-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:c83aa123d56f2e060644427a882a36b3c12db93727ad7a7b9efd7d7f3e9cc2c4"}, + {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:6b2ae9f5f67f89aade1fab0f7fd8f2832501311c363a21579d02defa844d9296"}, + {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:68715970f16b6e92c574c30747c95cf8cf62804569647386ff032195dc89a430"}, + {file = "Brotli-1.0.9-cp35-cp35m-win32.whl", hash = "sha256:defed7ea5f218a9f2336301e6fd379f55c655bea65ba2476346340a0ce6f74a1"}, + {file = "Brotli-1.0.9-cp35-cp35m-win_amd64.whl", hash = "sha256:88c63a1b55f352b02c6ffd24b15ead9fc0e8bf781dbe070213039324922a2eea"}, + {file = "Brotli-1.0.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:503fa6af7da9f4b5780bb7e4cbe0c639b010f12be85d02c99452825dd0feef3f"}, + {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:40d15c79f42e0a2c72892bf407979febd9cf91f36f495ffb333d1d04cebb34e4"}, + {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:93130612b837103e15ac3f9cbacb4613f9e348b58b3aad53721d92e57f96d46a"}, + {file = "Brotli-1.0.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87fdccbb6bb589095f413b1e05734ba492c962b4a45a13ff3408fa44ffe6479b"}, + {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:6d847b14f7ea89f6ad3c9e3901d1bc4835f6b390a9c71df999b0162d9bb1e20f"}, + {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:495ba7e49c2db22b046a53b469bbecea802efce200dffb69b93dd47397edc9b6"}, + {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:4688c1e42968ba52e57d8670ad2306fe92e0169c6f3af0089be75bbac0c64a3b"}, + {file = "Brotli-1.0.9-cp36-cp36m-win32.whl", hash = "sha256:61a7ee1f13ab913897dac7da44a73c6d44d48a4adff42a5701e3239791c96e14"}, + {file = "Brotli-1.0.9-cp36-cp36m-win_amd64.whl", hash = "sha256:1c48472a6ba3b113452355b9af0a60da5c2ae60477f8feda8346f8fd48e3e87c"}, + {file = "Brotli-1.0.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b78a24b5fd13c03ee2b7b86290ed20efdc95da75a3557cc06811764d5ad1126"}, + {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:9d12cf2851759b8de8ca5fde36a59c08210a97ffca0eb94c532ce7b17c6a3d1d"}, + {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6c772d6c0a79ac0f414a9f8947cc407e119b8598de7621f39cacadae3cf57d12"}, + {file = "Brotli-1.0.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29d1d350178e5225397e28ea1b7aca3648fcbab546d20e7475805437bfb0a130"}, + {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7bbff90b63328013e1e8cb50650ae0b9bac54ffb4be6104378490193cd60f85a"}, + {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ec1947eabbaf8e0531e8e899fc1d9876c179fc518989461f5d24e2223395a9e3"}, + {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12effe280b8ebfd389022aa65114e30407540ccb89b177d3fbc9a4f177c4bd5d"}, + {file = "Brotli-1.0.9-cp37-cp37m-win32.whl", hash = "sha256:f909bbbc433048b499cb9db9e713b5d8d949e8c109a2a548502fb9aa8630f0b1"}, + {file = "Brotli-1.0.9-cp37-cp37m-win_amd64.whl", hash = "sha256:97f715cf371b16ac88b8c19da00029804e20e25f30d80203417255d239f228b5"}, + {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e16eb9541f3dd1a3e92b89005e37b1257b157b7256df0e36bd7b33b50be73bcb"}, + {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:160c78292e98d21e73a4cc7f76a234390e516afcd982fa17e1422f7c6a9ce9c8"}, + {file = "Brotli-1.0.9-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b663f1e02de5d0573610756398e44c130add0eb9a3fc912a09665332942a2efb"}, + {file = "Brotli-1.0.9-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5b6ef7d9f9c38292df3690fe3e302b5b530999fa90014853dcd0d6902fb59f26"}, + {file = "Brotli-1.0.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a674ac10e0a87b683f4fa2b6fa41090edfd686a6524bd8dedbd6138b309175c"}, + {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e2d9e1cbc1b25e22000328702b014227737756f4b5bf5c485ac1d8091ada078b"}, + {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b336c5e9cf03c7be40c47b5fd694c43c9f1358a80ba384a21969e0b4e66a9b17"}, + {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:85f7912459c67eaab2fb854ed2bc1cc25772b300545fe7ed2dc03954da638649"}, + {file = "Brotli-1.0.9-cp38-cp38-win32.whl", hash = "sha256:35a3edbe18e876e596553c4007a087f8bcfd538f19bc116917b3c7522fca0429"}, + {file = "Brotli-1.0.9-cp38-cp38-win_amd64.whl", hash = "sha256:269a5743a393c65db46a7bb982644c67ecba4b8d91b392403ad8a861ba6f495f"}, + {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2aad0e0baa04517741c9bb5b07586c642302e5fb3e75319cb62087bd0995ab19"}, + {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5cb1e18167792d7d21e21365d7650b72d5081ed476123ff7b8cac7f45189c0c7"}, + {file = "Brotli-1.0.9-cp39-cp39-manylinux1_i686.whl", hash = "sha256:16d528a45c2e1909c2798f27f7bf0a3feec1dc9e50948e738b961618e38b6a7b"}, + {file = "Brotli-1.0.9-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:56d027eace784738457437df7331965473f2c0da2c70e1a1f6fdbae5402e0389"}, + {file = "Brotli-1.0.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bf919756d25e4114ace16a8ce91eb340eb57a08e2c6950c3cebcbe3dff2a5e7"}, + {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e4c4e92c14a57c9bd4cb4be678c25369bf7a092d55fd0866f759e425b9660806"}, + {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e48f4234f2469ed012a98f4b7874e7f7e173c167bed4934912a29e03167cf6b1"}, + {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ed4c92a0665002ff8ea852353aeb60d9141eb04109e88928026d3c8a9e5433c"}, + {file = "Brotli-1.0.9-cp39-cp39-win32.whl", hash = "sha256:cfc391f4429ee0a9370aa93d812a52e1fee0f37a81861f4fdd1f4fb28e8547c3"}, + {file = "Brotli-1.0.9-cp39-cp39-win_amd64.whl", hash = "sha256:854c33dad5ba0fbd6ab69185fec8dab89e13cda6b7d191ba111987df74f38761"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9749a124280a0ada4187a6cfd1ffd35c350fb3af79c706589d98e088c5044267"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:73fd30d4ce0ea48010564ccee1a26bfe39323fde05cb34b5863455629db61dc7"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02177603aaca36e1fd21b091cb742bb3b305a569e2402f1ca38af471777fb019"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:76ffebb907bec09ff511bb3acc077695e2c32bc2142819491579a695f77ffd4d"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b43775532a5904bc938f9c15b77c613cb6ad6fb30990f3b0afaea82797a402d8"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5bf37a08493232fbb0f8229f1824b366c2fc1d02d64e7e918af40acd15f3e337"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:330e3f10cd01da535c70d09c4283ba2df5fb78e915bea0a28becad6e2ac010be"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e1abbeef02962596548382e393f56e4c94acd286bd0c5afba756cffc33670e8a"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3148362937217b7072cf80a2dcc007f09bb5ecb96dae4617316638194113d5be"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:336b40348269f9b91268378de5ff44dc6fbaa2268194f85177b53463d313842a"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b8b09a16a1950b9ef495a0f8b9d0a87599a9d1f179e2d4ac014b2ec831f87e7"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c8e521a0ce7cf690ca84b8cc2272ddaf9d8a50294fd086da67e517439614c755"}, + {file = "Brotli-1.0.9.zip", hash = "sha256:4d1b810aa0ed773f81dceda2cc7b403d01057458730e309856356d4ef4188438"}, +] + +[[package]] +name = "certifi" +version = "2020.12.5" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = "*" +files = [ + {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, + {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, +] + +[[package]] +name = "cffi" +version = "1.15.1" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = "*" +files = [ + {file = "cffi-1.15.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a66d3508133af6e8548451b25058d5812812ec3798c886bf38ed24a98216fab2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:470c103ae716238bbe698d67ad020e1db9d9dba34fa5a899b5e21577e6d52ed2"}, + {file = "cffi-1.15.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:9ad5db27f9cabae298d151c85cf2bad1d359a1b9c686a275df03385758e2f914"}, + {file = "cffi-1.15.1-cp27-cp27m-win32.whl", hash = "sha256:b3bbeb01c2b273cca1e1e0c5df57f12dce9a4dd331b4fa1635b8bec26350bde3"}, + {file = "cffi-1.15.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e00b098126fd45523dd056d2efba6c5a63b71ffe9f2bbe1a4fe1716e1d0c331e"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:d61f4695e6c866a23a21acab0509af1cdfd2c013cf256bbf5b6b5e2695827162"}, + {file = "cffi-1.15.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:ed9cb427ba5504c1dc15ede7d516b84757c3e3d7868ccc85121d9310d27eed0b"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:39d39875251ca8f612b6f33e6b1195af86d1b3e60086068be9cc053aa4376e21"}, + {file = "cffi-1.15.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:285d29981935eb726a4399badae8f0ffdff4f5050eaa6d0cfc3f64b857b77185"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3eb6971dcff08619f8d91607cfc726518b6fa2a9eba42856be181c6d0d9515fd"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:21157295583fe8943475029ed5abdcf71eb3911894724e360acff1d61c1d54bc"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5635bd9cb9731e6d4a1132a498dd34f764034a8ce60cef4f5319c0541159392f"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2012c72d854c2d03e45d06ae57f40d78e5770d252f195b93f581acf3ba44496e"}, + {file = "cffi-1.15.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd86c085fae2efd48ac91dd7ccffcfc0571387fe1193d33b6394db7ef31fe2a4"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:fa6693661a4c91757f4412306191b6dc88c1703f780c8234035eac011922bc01"}, + {file = "cffi-1.15.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:59c0b02d0a6c384d453fece7566d1c7e6b7bae4fc5874ef2ef46d56776d61c9e"}, + {file = "cffi-1.15.1-cp310-cp310-win32.whl", hash = "sha256:cba9d6b9a7d64d4bd46167096fc9d2f835e25d7e4c121fb2ddfc6528fb0413b2"}, + {file = "cffi-1.15.1-cp310-cp310-win_amd64.whl", hash = "sha256:ce4bcc037df4fc5e3d184794f27bdaab018943698f4ca31630bc7f84a7b69c6d"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3d08afd128ddaa624a48cf2b859afef385b720bb4b43df214f85616922e6a5ac"}, + {file = "cffi-1.15.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3799aecf2e17cf585d977b780ce79ff0dc9b78d799fc694221ce814c2c19db83"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a591fe9e525846e4d154205572a029f653ada1a78b93697f3b5a8f1f2bc055b9"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3548db281cd7d2561c9ad9984681c95f7b0e38881201e157833a2342c30d5e8c"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:91fc98adde3d7881af9b59ed0294046f3806221863722ba7d8d120c575314325"}, + {file = "cffi-1.15.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94411f22c3985acaec6f83c6df553f2dbe17b698cc7f8ae751ff2237d96b9e3c"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:03425bdae262c76aad70202debd780501fabeaca237cdfddc008987c0e0f59ef"}, + {file = "cffi-1.15.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cc4d65aeeaa04136a12677d3dd0b1c0c94dc43abac5860ab33cceb42b801c1e8"}, + {file = "cffi-1.15.1-cp311-cp311-win32.whl", hash = "sha256:a0f100c8912c114ff53e1202d0078b425bee3649ae34d7b070e9697f93c5d52d"}, + {file = "cffi-1.15.1-cp311-cp311-win_amd64.whl", hash = "sha256:04ed324bda3cda42b9b695d51bb7d54b680b9719cfab04227cdd1e04e5de3104"}, + {file = "cffi-1.15.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50a74364d85fd319352182ef59c5c790484a336f6db772c1a9231f1c3ed0cbd7"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e263d77ee3dd201c3a142934a086a4450861778baaeeb45db4591ef65550b0a6"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cec7d9412a9102bdc577382c3929b337320c4c4c4849f2c5cdd14d7368c5562d"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4289fc34b2f5316fbb762d75362931e351941fa95fa18789191b33fc4cf9504a"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:173379135477dc8cac4bc58f45db08ab45d228b3363adb7af79436135d028405"}, + {file = "cffi-1.15.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:6975a3fac6bc83c4a65c9f9fcab9e47019a11d3d2cf7f3c0d03431bf145a941e"}, + {file = "cffi-1.15.1-cp36-cp36m-win32.whl", hash = "sha256:2470043b93ff09bf8fb1d46d1cb756ce6132c54826661a32d4e4d132e1977adf"}, + {file = "cffi-1.15.1-cp36-cp36m-win_amd64.whl", hash = "sha256:30d78fbc8ebf9c92c9b7823ee18eb92f2e6ef79b45ac84db507f52fbe3ec4497"}, + {file = "cffi-1.15.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:198caafb44239b60e252492445da556afafc7d1e3ab7a1fb3f0584ef6d742375"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5ef34d190326c3b1f822a5b7a45f6c4535e2f47ed06fec77d3d799c450b2651e"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8102eaf27e1e448db915d08afa8b41d6c7ca7a04b7d73af6514df10a3e74bd82"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5df2768244d19ab7f60546d0c7c63ce1581f7af8b5de3eb3004b9b6fc8a9f84b"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8c4917bd7ad33e8eb21e9a5bbba979b49d9a97acb3a803092cbc1133e20343c"}, + {file = "cffi-1.15.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2642fe3142e4cc4af0799748233ad6da94c62a8bec3a6648bf8ee68b1c7426"}, + {file = "cffi-1.15.1-cp37-cp37m-win32.whl", hash = "sha256:e229a521186c75c8ad9490854fd8bbdd9a0c9aa3a524326b55be83b54d4e0ad9"}, + {file = "cffi-1.15.1-cp37-cp37m-win_amd64.whl", hash = "sha256:a0b71b1b8fbf2b96e41c4d990244165e2c9be83d54962a9a1d118fd8657d2045"}, + {file = "cffi-1.15.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:320dab6e7cb2eacdf0e658569d2575c4dad258c0fcc794f46215e1e39f90f2c3"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e74c6b51a9ed6589199c787bf5f9875612ca4a8a0785fb2d4a84429badaf22a"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5c84c68147988265e60416b57fc83425a78058853509c1b0629c180094904a5"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b926aa83d1edb5aa5b427b4053dc420ec295a08e40911296b9eb1b6170f6cca"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87c450779d0914f2861b8526e035c5e6da0a3199d8f1add1a665e1cbc6fc6d02"}, + {file = "cffi-1.15.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2c9f67e9821cad2e5f480bc8d83b8742896f1242dba247911072d4fa94c192"}, + {file = "cffi-1.15.1-cp38-cp38-win32.whl", hash = "sha256:8b7ee99e510d7b66cdb6c593f21c043c248537a32e0bedf02e01e9553a172314"}, + {file = "cffi-1.15.1-cp38-cp38-win_amd64.whl", hash = "sha256:00a9ed42e88df81ffae7a8ab6d9356b371399b91dbdf0c3cb1e84c03a13aceb5"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:54a2db7b78338edd780e7ef7f9f6c442500fb0d41a5a4ea24fff1c929d5af585"}, + {file = "cffi-1.15.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fcd131dd944808b5bdb38e6f5b53013c5aa4f334c5cad0c72742f6eba4b73db0"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7473e861101c9e72452f9bf8acb984947aa1661a7704553a9f6e4baa5ba64415"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c9a799e985904922a4d207a94eae35c78ebae90e128f0c4e521ce339396be9d"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bcde07039e586f91b45c88f8583ea7cf7a0770df3a1649627bf598332cb6984"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:33ab79603146aace82c2427da5ca6e58f2b3f2fb5da893ceac0c42218a40be35"}, + {file = "cffi-1.15.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d598b938678ebf3c67377cdd45e09d431369c3b1a5b331058c338e201f12b27"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db0fbb9c62743ce59a9ff687eb5f4afbe77e5e8403d6697f7446e5f609976f76"}, + {file = "cffi-1.15.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:98d85c6a2bef81588d9227dde12db8a7f47f639f4a17c9ae08e773aa9c697bf3"}, + {file = "cffi-1.15.1-cp39-cp39-win32.whl", hash = "sha256:40f4774f5a9d4f5e344f31a32b5096977b5d48560c5592e2f3d2c4374bd543ee"}, + {file = "cffi-1.15.1-cp39-cp39-win_amd64.whl", hash = "sha256:70df4e3b545a17496c9b3f41f5115e69a4f2e77e94e1d2a8e1070bc0c38c8a3c"}, + {file = "cffi-1.15.1.tar.gz", hash = "sha256:d400bfb9a37b1351253cb402671cea7e89bdecc294e8016a707f6d1d8ac934f9"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.2.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.2.0.tar.gz", hash = "sha256:3bb3d25a8e6c0aedd251753a79ae98a093c7e7b471faa3aa9a93a81431987ace"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b87549028f680ca955556e3bd57013ab47474c3124dc069faa0b6545b6c9710"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7c70087bfee18a42b4040bb9ec1ca15a08242cf5867c58726530bdf3945672ed"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a103b3a7069b62f5d4890ae1b8f0597618f628b286b03d4bc9195230b154bfa9"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94aea8eff76ee6d1cdacb07dd2123a68283cb5569e0250feab1240058f53b623"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:db901e2ac34c931d73054d9797383d0f8009991e723dab15109740a63e7f902a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b0dac0ff919ba34d4df1b6131f59ce95b08b9065233446be7e459f95554c0dc8"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:193cbc708ea3aca45e7221ae58f0fd63f933753a9bfb498a3b474878f12caaad"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09393e1b2a9461950b1c9a45d5fd251dc7c6f228acab64da1c9c0165d9c7765c"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:baacc6aee0b2ef6f3d308e197b5d7a81c0e70b06beae1f1fcacffdbd124fe0e3"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bf420121d4c8dce6b889f0e8e4ec0ca34b7f40186203f06a946fa0276ba54029"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c04a46716adde8d927adb9457bbe39cf473e1e2c2f5d0a16ceb837e5d841ad4f"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:aaf63899c94de41fe3cf934601b0f7ccb6b428c6e4eeb80da72c58eab077b19a"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62e51710986674142526ab9f78663ca2b0726066ae26b78b22e0f5e571238dd"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win32.whl", hash = "sha256:04e57ab9fbf9607b77f7d057974694b4f6b142da9ed4a199859d9d4d5c63fe96"}, + {file = "charset_normalizer-3.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:48021783bdf96e3d6de03a6e39a1171ed5bd7e8bb93fc84cc649d11490f87cea"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4957669ef390f0e6719db3613ab3a7631e68424604a7b448f079bee145da6e09"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:46fb8c61d794b78ec7134a715a3e564aafc8f6b5e338417cb19fe9f57a5a9bf2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f779d3ad205f108d14e99bb3859aa7dd8e9c68874617c72354d7ecaec2a054ac"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f25c229a6ba38a35ae6e25ca1264621cc25d4d38dca2942a7fce0b67a4efe918"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2efb1bd13885392adfda4614c33d3b68dee4921fd0ac1d3988f8cbb7d589e72a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f30b48dd7fa1474554b0b0f3fdfdd4c13b5c737a3c6284d3cdc424ec0ffff3a"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:246de67b99b6851627d945db38147d1b209a899311b1305dd84916f2b88526c6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bd9b3b31adcb054116447ea22caa61a285d92e94d710aa5ec97992ff5eb7cf3"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8c2f5e83493748286002f9369f3e6607c565a6a90425a3a1fef5ae32a36d749d"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:3170c9399da12c9dc66366e9d14da8bf7147e1e9d9ea566067bbce7bb74bd9c2"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7a4826ad2bd6b07ca615c74ab91f32f6c96d08f6fcc3902ceeedaec8cdc3bcd6"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:3b1613dd5aee995ec6d4c69f00378bbd07614702a315a2cf6c1d21461fe17c23"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9e608aafdb55eb9f255034709e20d5a83b6d60c054df0802fa9c9883d0a937aa"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win32.whl", hash = "sha256:f2a1d0fd4242bd8643ce6f98927cf9c04540af6efa92323e9d3124f57727bfc1"}, + {file = "charset_normalizer-3.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:681eb3d7e02e3c3655d1b16059fbfb605ac464c834a0c629048a30fad2b27489"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c57921cda3a80d0f2b8aec7e25c8aa14479ea92b5b51b6876d975d925a2ea346"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:41b25eaa7d15909cf3ac4c96088c1f266a9a93ec44f87f1d13d4a0e86c81b982"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f058f6963fd82eb143c692cecdc89e075fa0828db2e5b291070485390b2f1c9c"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a7647ebdfb9682b7bb97e2a5e7cb6ae735b1c25008a70b906aecca294ee96cf4"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eef9df1eefada2c09a5e7a40991b9fc6ac6ef20b1372abd48d2794a316dc0449"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e03b8895a6990c9ab2cdcd0f2fe44088ca1c65ae592b8f795c3294af00a461c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ee4006268ed33370957f55bf2e6f4d263eaf4dc3cfc473d1d90baff6ed36ce4a"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c4983bf937209c57240cff65906b18bb35e64ae872da6a0db937d7b4af845dd7"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:3bb7fda7260735efe66d5107fb7e6af6a7c04c7fce9b2514e04b7a74b06bf5dd"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:72814c01533f51d68702802d74f77ea026b5ec52793c791e2da806a3844a46c3"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:70c610f6cbe4b9fce272c407dd9d07e33e6bf7b4aa1b7ffb6f6ded8e634e3592"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win32.whl", hash = "sha256:a401b4598e5d3f4a9a811f3daf42ee2291790c7f9d74b18d75d6e21dda98a1a1"}, + {file = "charset_normalizer-3.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:c0b21078a4b56965e2b12f247467b234734491897e99c1d51cee628da9786959"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:95eb302ff792e12aba9a8b8f8474ab229a83c103d74a750ec0bd1c1eea32e669"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1a100c6d595a7f316f1b6f01d20815d916e75ff98c27a01ae817439ea7726329"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6339d047dab2780cc6220f46306628e04d9750f02f983ddb37439ca47ced7149"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4b749b9cc6ee664a3300bb3a273c1ca8068c46be705b6c31cf5d276f8628a94"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a38856a971c602f98472050165cea2cdc97709240373041b69030be15047691f"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f87f746ee241d30d6ed93969de31e5ffd09a2961a051e60ae6bddde9ec3583aa"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:89f1b185a01fe560bc8ae5f619e924407efca2191b56ce749ec84982fc59a32a"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e1c8a2f4c69e08e89632defbfabec2feb8a8d99edc9f89ce33c4b9e36ab63037"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2f4ac36d8e2b4cc1aa71df3dd84ff8efbe3bfb97ac41242fbcfc053c67434f46"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a386ebe437176aab38c041de1260cd3ea459c6ce5263594399880bbc398225b2"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ccd16eb18a849fd8dcb23e23380e2f0a354e8daa0c984b8a732d9cfaba3a776d"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6a5bf2cba5ae1bb80b154ed68a3cfa2fa00fde979a7f50d6598d3e17d9ac20c"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:45de3f87179c1823e6d9e32156fb14c1927fcc9aba21433f088fdfb555b77c10"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win32.whl", hash = "sha256:1000fba1057b92a65daec275aec30586c3de2401ccdcd41f8a5c1e2c87078706"}, + {file = "charset_normalizer-3.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:8b2c760cfc7042b27ebdb4a43a4453bd829a5742503599144d54a032c5dc7e9e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:855eafa5d5a2034b4621c74925d89c5efef61418570e5ef9b37717d9c796419c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:203f0c8871d5a7987be20c72442488a0b8cfd0f43b7973771640fc593f56321f"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e857a2232ba53ae940d3456f7533ce6ca98b81917d47adc3c7fd55dad8fab858"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e86d77b090dbddbe78867a0275cb4df08ea195e660f1f7f13435a4649e954e5"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c4fb39a81950ec280984b3a44f5bd12819953dc5fa3a7e6fa7a80db5ee853952"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2dee8e57f052ef5353cf608e0b4c871aee320dd1b87d351c28764fc0ca55f9f4"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8700f06d0ce6f128de3ccdbc1acaea1ee264d2caa9ca05daaf492fde7c2a7200"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1920d4ff15ce893210c1f0c0e9d19bfbecb7983c76b33f046c13a8ffbd570252"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c1c76a1743432b4b60ab3358c937a3fe1341c828ae6194108a94c69028247f22"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f7560358a6811e52e9c4d142d497f1a6e10103d3a6881f18d04dbce3729c0e2c"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:c8063cf17b19661471ecbdb3df1c84f24ad2e389e326ccaf89e3fb2484d8dd7e"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:cd6dbe0238f7743d0efe563ab46294f54f9bc8f4b9bcf57c3c666cc5bc9d1299"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:1249cbbf3d3b04902ff081ffbb33ce3377fa6e4c7356f759f3cd076cc138d020"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win32.whl", hash = "sha256:6c409c0deba34f147f77efaa67b8e4bb83d2f11c8806405f76397ae5b8c0d1c9"}, + {file = "charset_normalizer-3.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:7095f6fbfaa55defb6b733cfeb14efaae7a29f0b59d8cf213be4e7ca0b857b80"}, + {file = "charset_normalizer-3.2.0-py3-none-any.whl", hash = "sha256:8e098148dd37b4ce3baca71fb394c81dc5d9c7728c95df695d2dca218edf40e6"}, +] + +[[package]] +name = "click" +version = "7.1.2" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, + {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "cryptography" +version = "3.2.1" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "cryptography-3.2.1-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:6dc59630ecce8c1f558277ceb212c751d6730bd12c80ea96b4ac65637c4f55e7"}, + {file = "cryptography-3.2.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:75e8e6684cf0034f6bf2a97095cb95f81537b12b36a8fedf06e73050bb171c2d"}, + {file = "cryptography-3.2.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4e7268a0ca14536fecfdf2b00297d4e407da904718658c1ff1961c713f90fd33"}, + {file = "cryptography-3.2.1-cp27-cp27m-win32.whl", hash = "sha256:7117319b44ed1842c617d0a452383a5a052ec6aa726dfbaffa8b94c910444297"}, + {file = "cryptography-3.2.1-cp27-cp27m-win_amd64.whl", hash = "sha256:a733671100cd26d816eed39507e585c156e4498293a907029969234e5e634bc4"}, + {file = "cryptography-3.2.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a75f306a16d9f9afebfbedc41c8c2351d8e61e818ba6b4c40815e2b5740bb6b8"}, + {file = "cryptography-3.2.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:5849d59358547bf789ee7e0d7a9036b2d29e9a4ddf1ce5e06bb45634f995c53e"}, + {file = "cryptography-3.2.1-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:bd717aa029217b8ef94a7d21632a3bb5a4e7218a4513d2521c2a2fd63011e98b"}, + {file = "cryptography-3.2.1-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:efe15aca4f64f3a7ea0c09c87826490e50ed166ce67368a68f315ea0807a20df"}, + {file = "cryptography-3.2.1-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:32434673d8505b42c0de4de86da8c1620651abd24afe91ae0335597683ed1b77"}, + {file = "cryptography-3.2.1-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:7b8d9d8d3a9bd240f453342981f765346c87ade811519f98664519696f8e6ab7"}, + {file = "cryptography-3.2.1-cp35-cp35m-win32.whl", hash = "sha256:d3545829ab42a66b84a9aaabf216a4dce7f16dbc76eb69be5c302ed6b8f4a29b"}, + {file = "cryptography-3.2.1-cp35-cp35m-win_amd64.whl", hash = "sha256:a4e27ed0b2504195f855b52052eadcc9795c59909c9d84314c5408687f933fc7"}, + {file = "cryptography-3.2.1-cp36-abi3-win32.whl", hash = "sha256:13b88a0bd044b4eae1ef40e265d006e34dbcde0c2f1e15eb9896501b2d8f6c6f"}, + {file = "cryptography-3.2.1-cp36-abi3-win_amd64.whl", hash = "sha256:07ca431b788249af92764e3be9a488aa1d39a0bc3be313d826bbec690417e538"}, + {file = "cryptography-3.2.1-cp36-cp36m-win32.whl", hash = "sha256:a035a10686532b0587d58a606004aa20ad895c60c4d029afa245802347fab57b"}, + {file = "cryptography-3.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:d26a2557d8f9122f9bf445fc7034242f4375bd4e95ecda007667540270965b13"}, + {file = "cryptography-3.2.1-cp37-cp37m-win32.whl", hash = "sha256:545a8550782dda68f8cdc75a6e3bf252017aa8f75f19f5a9ca940772fc0cb56e"}, + {file = "cryptography-3.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:55d0b896631412b6f0c7de56e12eb3e261ac347fbaa5d5e705291a9016e5f8cb"}, + {file = "cryptography-3.2.1-cp38-cp38-win32.whl", hash = "sha256:3cd75a683b15576cfc822c7c5742b3276e50b21a06672dc3a800a2d5da4ecd1b"}, + {file = "cryptography-3.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:d25cecbac20713a7c3bc544372d42d8eafa89799f492a43b79e1dfd650484851"}, + {file = "cryptography-3.2.1.tar.gz", hash = "sha256:d3d5e10be0cf2a12214ddee45c6bd203dab435e3d83b4560c03066eda600bfe3"}, +] + +[package.dependencies] +cffi = ">=1.8,<1.11.3 || >1.11.3" +six = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docstest = ["doc8", "pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=3.6.0,!=3.9.0,!=3.9.1,!=3.9.2)", "pytz"] + +[[package]] +name = "distro" +version = "1.8.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.8.0-py3-none-any.whl", hash = "sha256:99522ca3e365cac527b44bde033f64c6945d90eb9f769703caaec52b09bbd3ff"}, + {file = "distro-1.8.0.tar.gz", hash = "sha256:02e111d1dc6a50abb8eed6bf31c3e48ed8b0830d1ea2a1b78c61765c2513fdd8"}, +] + +[[package]] +name = "docker" +version = "6.1.3" +description = "A Python library for the Docker Engine API." +optional = false +python-versions = ">=3.7" +files = [ + {file = "docker-6.1.3-py3-none-any.whl", hash = "sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9"}, + {file = "docker-6.1.3.tar.gz", hash = "sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20"}, +] + +[package.dependencies] +packaging = ">=14.0" +paramiko = {version = ">=2.4.3", optional = true, markers = "extra == \"ssh\""} +pywin32 = {version = ">=304", markers = "sys_platform == \"win32\""} +requests = ">=2.26.0" +urllib3 = ">=1.26.0" +websocket-client = ">=0.32.0" + +[package.extras] +ssh = ["paramiko (>=2.4.3)"] + +[[package]] +name = "docker-compose" +version = "1.29.2" +description = "Multi-container orchestration for Docker" +optional = false +python-versions = ">=3.4" +files = [ + {file = "docker-compose-1.29.2.tar.gz", hash = "sha256:4c8cd9d21d237412793d18bd33110049ee9af8dab3fe2c213bbd0733959b09b7"}, + {file = "docker_compose-1.29.2-py2.py3-none-any.whl", hash = "sha256:8d5589373b35c8d3b1c8c1182c6e4a4ff14bffa3dd0b605fcd08f73c94cef809"}, +] + +[package.dependencies] +colorama = {version = ">=0.4,<1", markers = "sys_platform == \"win32\""} +distro = ">=1.5.0,<2" +docker = {version = ">=5", extras = ["ssh"]} +dockerpty = ">=0.4.1,<1" +docopt = ">=0.6.1,<1" +jsonschema = ">=2.5.1,<4" +python-dotenv = ">=0.13.0,<1" +PyYAML = ">=3.10,<6" +requests = ">=2.20.0,<3" +texttable = ">=0.9.0,<2" +websocket-client = ">=0.32.0,<1" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2)"] +tests = ["ddt (>=1.2.2,<2)", "pytest (<6)"] + +[[package]] +name = "dockerpty" +version = "0.4.1" +description = "Python library to use the pseudo-tty of a docker container" +optional = false +python-versions = "*" +files = [ + {file = "dockerpty-0.4.1.tar.gz", hash = "sha256:69a9d69d573a0daa31bcd1c0774eeed5c15c295fe719c61aca550ed1393156ce"}, +] + +[package.dependencies] +six = ">=1.3.0" + +[[package]] +name = "docopt" +version = "0.6.2" +description = "Pythonic argument parser, that will make you smile" +optional = false +python-versions = "*" +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] + +[[package]] +name = "dpath" +version = "2.1.6" +description = "Filesystem-like pathing and searching for dictionaries" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dpath-2.1.6-py3-none-any.whl", hash = "sha256:31407395b177ab63ef72e2f6ae268c15e938f2990a8ecf6510f5686c02b6db73"}, + {file = "dpath-2.1.6.tar.gz", hash = "sha256:f1e07c72e8605c6a9e80b64bc8f42714de08a789c7de417e49c3f87a19692e47"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.3" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "fastcore" +version = "1.5.29" +description = "Python supercharged for fastai development" +optional = false +python-versions = ">=3.7" +files = [ + {file = "fastcore-1.5.29-py3-none-any.whl", hash = "sha256:a7d7e89faf968f2d8584df2deca344c3974f6cf476e1299cd3c067d8fa7440e9"}, + {file = "fastcore-1.5.29.tar.gz", hash = "sha256:f1a2eb04eb7933f3f9eb4064852817df44dc96e20fab5658c14c035815269a3f"}, +] + +[package.dependencies] +packaging = "*" +pip = "*" + +[package.extras] +dev = ["jupyterlab", "matplotlib", "nbdev (>=0.2.39)", "numpy", "pandas", "pillow", "torch"] + +[[package]] +name = "flask" +version = "1.1.4" +description = "A simple framework for building complex web applications." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "Flask-1.1.4-py2.py3-none-any.whl", hash = "sha256:c34f04500f2cbbea882b1acb02002ad6fe6b7ffa64a6164577995657f50aed22"}, + {file = "Flask-1.1.4.tar.gz", hash = "sha256:0fbeb6180d383a9186d0d6ed954e0042ad9f18e0e8de088b2b419d526927d196"}, +] + +[package.dependencies] +click = ">=5.1,<8.0" +itsdangerous = ">=0.24,<2.0" +Jinja2 = ">=2.10.1,<3.0" +Werkzeug = ">=0.15,<2.0" + +[package.extras] +dev = ["coverage", "pallets-sphinx-themes", "pytest", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet", "tox"] +docs = ["pallets-sphinx-themes", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet"] +dotenv = ["python-dotenv"] + +[[package]] +name = "frozenlist" +version = "1.4.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, + {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, + {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, + {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, + {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, + {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, + {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, + {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, + {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, + {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, +] + +[[package]] +name = "func-timeout" +version = "4.3.5" +description = "Python module which allows you to specify timeouts when calling any existing function. Also provides support for stoppable-threads" +optional = false +python-versions = "*" +files = [ + {file = "func_timeout-4.3.5.tar.gz", hash = "sha256:74cd3c428ec94f4edfba81f9b2f14904846d5ffccc27c92433b8b5939b5575dd"}, +] + +[[package]] +name = "ghapi" +version = "0.1.23" +description = "A python client for the GitHub API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "ghapi-0.1.23-py3-none-any.whl", hash = "sha256:492b5f82b5d4844a0297c8ae6afda638432cee6c74b0bd0a0458b35d19b92b5e"}, + {file = "ghapi-0.1.23.tar.gz", hash = "sha256:93fa097e394d743c6702e217d588a4123696f62d055f2acc495166676843d59f"}, +] + +[package.dependencies] +fastcore = ">=1.5.4" +packaging = "*" +pip = "*" + +[package.extras] +dev = ["jsonref"] + +[[package]] +name = "goth" +version = "0.15.3" +description = "Golem Test Harness - integration testing framework" +optional = false +python-versions = "^3.10.1" +files = [] +develop = false + +[package.dependencies] +aiohttp = "^3.8.5" +ansicolors = "^1.1.0" +docker = "^6.0" +docker-compose = "^1.29" +dpath = "^2.0" +func_timeout = "4.3.5" +ghapi = "^0.1.16" +markupsafe = "2.0.1" +mitmproxy = "^5.3" +pyyaml = "5.3.1" +transitions = "^0.8" +typing_extensions = "^4.5" +urllib3 = "^1.26" +ya-aioclient = "^0.6" + +[package.source] +type = "git" +url = "https://github.com/golemfactory/goth.git" +reference = "1aa00bf9706de9464af5b06cd44416b54455f0ae" +resolved_reference = "1aa00bf9706de9464af5b06cd44416b54455f0ae" + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "h2" +version = "4.1.0" +description = "HTTP/2 State-Machine based protocol implementation" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, + {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, +] + +[package.dependencies] +hpack = ">=4.0,<5" +hyperframe = ">=6.0,<7" + +[[package]] +name = "hpack" +version = "4.0.0" +description = "Pure-Python HPACK header compression" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, + {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, +] + +[[package]] +name = "hyperframe" +version = "6.0.1" +description = "HTTP/2 framing layer for Python" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, + {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, +] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "itsdangerous" +version = "1.1.0" +description = "Various helpers to pass data to untrusted environments and back." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"}, + {file = "itsdangerous-1.1.0.tar.gz", hash = "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19"}, +] + +[[package]] +name = "jinja2" +version = "2.11.3" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, + {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, +] + +[package.dependencies] +MarkupSafe = ">=0.23" + +[package.extras] +i18n = ["Babel (>=0.8)"] + +[[package]] +name = "jsonschema" +version = "3.2.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = "*" +files = [ + {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, + {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, +] + +[package.dependencies] +attrs = ">=17.4.0" +pyrsistent = ">=0.14.0" +setuptools = "*" +six = ">=1.11.0" + +[package.extras] +format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] +format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] + +[[package]] +name = "kaitaistruct" +version = "0.9" +description = "Kaitai Struct declarative parser generator for binary data: runtime library for Python" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "kaitaistruct-0.9.tar.gz", hash = "sha256:3d5845817ec8a4d5504379cc11bd570b038850ee49c4580bc0998c8fb1d327ad"}, +] + +[[package]] +name = "ldap3" +version = "2.8.1" +description = "A strictly RFC 4510 conforming LDAP V3 pure Python client library" +optional = false +python-versions = "*" +files = [ + {file = "ldap3-2.8.1-py2.py3-none-any.whl", hash = "sha256:7c3738570766f5e5e74a56fade15470f339d5c436d821cf476ef27da0a4de8b0"}, + {file = "ldap3-2.8.1.tar.gz", hash = "sha256:37d633e20fa360c302b1263c96fe932d40622d0119f1bddcb829b03462eeeeb7"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6" + +[[package]] +name = "markupsafe" +version = "2.0.1" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.6" +files = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +] + +[[package]] +name = "mitmproxy" +version = "5.3.0" +description = "An interactive, SSL/TLS-capable intercepting proxy for HTTP/1, HTTP/2, and WebSockets." +optional = false +python-versions = "*" +files = [ + {file = "mitmproxy-5.3.0-py3-none-any.whl", hash = "sha256:481940365fc08fc2318343e530ef01d35084e8b56d1c61b5e1a7b6ed9b664d24"}, +] + +[package.dependencies] +asgiref = ">=3.2.10,<3.4" +blinker = ">=1.4,<1.5" +Brotli = ">=1.0,<1.1" +certifi = ">=2019.9.11" +click = ">=7.0,<8" +cryptography = ">=3.2,<3.3" +flask = ">=1.1.1,<1.2" +h2 = {version = ">=4.0,<5", markers = "python_version >= \"3.6.0\""} +hyperframe = {version = ">=6.0,<7", markers = "python_version >= \"3.6.0\""} +kaitaistruct = ">=0.7,<0.10" +ldap3 = ">=2.8,<2.9" +msgpack = ">=1.0.0,<1.1.0" +passlib = ">=1.6.5,<1.8" +protobuf = ">=3.6.0,<3.14" +publicsuffix2 = ">=2.20190812,<3" +pyasn1 = ">=0.3.1,<0.5" +pydivert = {version = ">=2.0.3,<2.2", markers = "sys_platform == \"win32\""} +pyOpenSSL = ">=19.1.0,<19.2" +pyparsing = ">=2.4.2,<2.5" +pyperclip = ">=1.6.0,<1.9" +"ruamel.yaml" = ">=0.16,<0.17" +sortedcontainers = ">=2.1,<2.3" +tornado = ">=4.3,<7" +urwid = ">=2.1.1,<2.2" +wsproto = ">=0.14,<0.16" +zstandard = ">=0.11,<0.15" + +[package.extras] +dev = ["Flask (>=1.0,<1.2)", "asynctest (>=0.12.0)", "hypothesis (>=5.8,<6)", "parver (>=0.1,<2.0)", "pytest (>=6.1.0,<7)", "pytest-asyncio (>=0.10.0,<0.14)", "pytest-cov (>=2.7.1,<3)", "pytest-timeout (>=1.3.3,<2)", "pytest-xdist (>=2.1.0,<3)", "requests (>=2.9.1,<3)", "tox (>=3.5,<4)"] + +[[package]] +name = "msgpack" +version = "1.0.6" +description = "MessagePack serializer" +optional = false +python-versions = ">=3.8" +files = [ + {file = "msgpack-1.0.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f4321692e7f299277e55f322329b2c972d93bb612d85f3fda8741bec5c6285ce"}, + {file = "msgpack-1.0.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1f0e36a5fa7a182cde391a128a64f437657d2b9371dfa42eda3436245adccbf5"}, + {file = "msgpack-1.0.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b5c8dd9a386a66e50bd7fa22b7a49fb8ead2b3574d6bd69eb1caced6caea0803"}, + {file = "msgpack-1.0.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9f85200ea102276afdd3749ca94747f057bbb868d1c52921ee2446730b508d0f"}, + {file = "msgpack-1.0.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a006c300e82402c0c8f1ded11352a3ba2a61b87e7abb3054c845af2ca8d553c"}, + {file = "msgpack-1.0.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:33bbf47ea5a6ff20c23426106e81863cdbb5402de1825493026ce615039cc99d"}, + {file = "msgpack-1.0.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:04450e4b5e1e662e7c86b6aafb7c230af9334fd0becf5e6b80459a507884241c"}, + {file = "msgpack-1.0.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:b06a5095a79384760625b5de3f83f40b3053a385fb893be8a106fbbd84c14980"}, + {file = "msgpack-1.0.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:3910211b0ab20be3a38e0bb944ed45bd4265d8d9f11a3d1674b95b298e08dd5c"}, + {file = "msgpack-1.0.6-cp310-cp310-win32.whl", hash = "sha256:1dc67b40fe81217b308ab12651adba05e7300b3a2ccf84d6b35a878e308dd8d4"}, + {file = "msgpack-1.0.6-cp310-cp310-win_amd64.whl", hash = "sha256:885de1ed5ea01c1bfe0a34c901152a264c3c1f8f1d382042b92ea354bd14bb0e"}, + {file = "msgpack-1.0.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:099c3d8a027367e1a6fc55d15336f04ff65c60c4f737b5739f7db4525c65fe9e"}, + {file = "msgpack-1.0.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9b88dc97ba86c96b964c3745a445d9a65f76fe21955a953064fe04adb63e9367"}, + {file = "msgpack-1.0.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:00ce5f827d4f26fc094043e6f08b6069c1b148efa2631c47615ae14fb6cafc89"}, + {file = "msgpack-1.0.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bd6af61388be65a8701f5787362cb54adae20007e0cc67ca9221a4b95115583b"}, + {file = "msgpack-1.0.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:652e4b7497825b0af6259e2c54700e6dc33d2fc4ed92b8839435090d4c9cc911"}, + {file = "msgpack-1.0.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b08676a17e3f791daad34d5fcb18479e9c85e7200d5a17cbe8de798643a7e37"}, + {file = "msgpack-1.0.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:229ccb6713c8b941eaa5cf13dc7478eba117f21513b5893c35e44483e2f0c9c8"}, + {file = "msgpack-1.0.6-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:95ade0bd4cf69e04e8b8f8ec2d197d9c9c4a9b6902e048dc7456bf6d82e12a80"}, + {file = "msgpack-1.0.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b16344032a27b2ccfd341f89dadf3e4ef6407d91e4b93563c14644a8abb3ad7"}, + {file = "msgpack-1.0.6-cp311-cp311-win32.whl", hash = "sha256:55bb4a1bf94e39447bc08238a2fb8a767460388a8192f67c103442eb36920887"}, + {file = "msgpack-1.0.6-cp311-cp311-win_amd64.whl", hash = "sha256:ae97504958d0bc58c1152045c170815d5c4f8af906561ce044b6358b43d0c97e"}, + {file = "msgpack-1.0.6-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:7ecf431786019a7bfedc28281531d706627f603e3691d64eccdbce3ecd353823"}, + {file = "msgpack-1.0.6-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:a635aecf1047255576dbb0927cbf9a7aa4a68e9d54110cc3c926652d18f144e0"}, + {file = "msgpack-1.0.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:102cfb54eaefa73e8ca1e784b9352c623524185c98e057e519545131a56fb0af"}, + {file = "msgpack-1.0.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c5e05e4f5756758c58a8088aa10dc70d851c89f842b611fdccfc0581c1846bc"}, + {file = "msgpack-1.0.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:68569509dd015fcdd1e6b2b3ccc8c51fd27d9a97f461ccc909270e220ee09685"}, + {file = "msgpack-1.0.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bf652839d16de91fe1cfb253e0a88db9a548796939533894e07f45d4bdf90a5f"}, + {file = "msgpack-1.0.6-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14db7e1b7a7ed362b2f94897bf2486c899c8bb50f6e34b2db92fe534cdab306f"}, + {file = "msgpack-1.0.6-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:159cfec18a6e125dd4723e2b1de6f202b34b87c850fb9d509acfd054c01135e9"}, + {file = "msgpack-1.0.6-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6a01a072b2219b65a6ff74df208f20b2cac9401c60adb676ee34e53b4c651077"}, + {file = "msgpack-1.0.6-cp312-cp312-win32.whl", hash = "sha256:e36560d001d4ba469d469b02037f2dd404421fd72277d9474efe9f03f83fced5"}, + {file = "msgpack-1.0.6-cp312-cp312-win_amd64.whl", hash = "sha256:5e7fae9ca93258a956551708cf60dc6c8145574e32ce8c8c4d894e63bcb04341"}, + {file = "msgpack-1.0.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:40b801b768f5a765e33c68f30665d3c6ee1c8623a2d2bb78e6e59f2db4e4ceb7"}, + {file = "msgpack-1.0.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:da057d3652e698b00746e47f06dbb513314f847421e857e32e1dc61c46f6c052"}, + {file = "msgpack-1.0.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f75114c05ec56566da6b55122791cf5bb53d5aada96a98c016d6231e03132f76"}, + {file = "msgpack-1.0.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:61213482b5a387ead9e250e9e3cb290292feca39dc83b41c3b1b7b8ffc8d8ecb"}, + {file = "msgpack-1.0.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bae6c561f11b444b258b1b4be2bdd1e1cf93cd1d80766b7e869a79db4543a8a8"}, + {file = "msgpack-1.0.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:619a63753ba9e792fe3c6c0fc2b9ee2cfbd92153dd91bee029a89a71eb2942cd"}, + {file = "msgpack-1.0.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:70843788c85ca385846a2d2f836efebe7bb2687ca0734648bf5c9dc6c55602d2"}, + {file = "msgpack-1.0.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:fb4571efe86545b772a4630fee578c213c91cbcfd20347806e47fd4e782a18fe"}, + {file = "msgpack-1.0.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bbb4448a05d261fae423d5c0b0974ad899f60825bc77eabad5a0c518e78448c2"}, + {file = "msgpack-1.0.6-cp38-cp38-win32.whl", hash = "sha256:5cd67674db3c73026e0a2c729b909780e88bd9cbc8184256f9567640a5d299a8"}, + {file = "msgpack-1.0.6-cp38-cp38-win_amd64.whl", hash = "sha256:a1cf98afa7ad5e7012454ca3fde254499a13f9d92fd50cb46118118a249a1355"}, + {file = "msgpack-1.0.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d6d25b8a5c70e2334ed61a8da4c11cd9b97c6fbd980c406033f06e4463fda006"}, + {file = "msgpack-1.0.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88cdb1da7fdb121dbb3116910722f5acab4d6e8bfcacab8fafe27e2e7744dc6a"}, + {file = "msgpack-1.0.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3b5658b1f9e486a2eec4c0c688f213a90085b9cf2fec76ef08f98fdf6c62f4b9"}, + {file = "msgpack-1.0.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76820f2ece3b0a7c948bbb6a599020e29574626d23a649476def023cbb026787"}, + {file = "msgpack-1.0.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c780d992f5d734432726b92a0c87bf1857c3d85082a8dea29cbf56e44a132b3"}, + {file = "msgpack-1.0.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e0ed35d6d6122d0baa9a1b59ebca4ee302139f4cfb57dab85e4c73ab793ae7ed"}, + {file = "msgpack-1.0.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:32c0aff31f33033f4961abc01f78497e5e07bac02a508632aef394b384d27428"}, + {file = "msgpack-1.0.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:35ad5aed9b52217d4cea739d0ea3a492a18dd86fecb4b132668a69f27fb0363b"}, + {file = "msgpack-1.0.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:47275ff73005a3e5e146e50baa2378e1730cba6e292f0222bc496a8e4c4adfc8"}, + {file = "msgpack-1.0.6-cp39-cp39-win32.whl", hash = "sha256:7baf16fd8908a025c4a8d7b699103e72d41f967e2aee5a2065432bcdbd9fd06e"}, + {file = "msgpack-1.0.6-cp39-cp39-win_amd64.whl", hash = "sha256:fc97aa4b4fb928ff4d3b74da7c30b360d0cb3ede49a5a6e1fd9705f49aea1deb"}, + {file = "msgpack-1.0.6.tar.gz", hash = "sha256:25d3746da40f3c8c59c3b1d001e49fd2aa17904438f980d9a391370366df001e"}, +] + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] + +[[package]] +name = "mypy" +version = "1.5.1" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f33592ddf9655a4894aef22d134de7393e95fcbdc2d15c1ab65828eee5c66c70"}, + {file = "mypy-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:258b22210a4a258ccd077426c7a181d789d1121aca6db73a83f79372f5569ae0"}, + {file = "mypy-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9ec1f695f0c25986e6f7f8778e5ce61659063268836a38c951200c57479cc12"}, + {file = "mypy-1.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:abed92d9c8f08643c7d831300b739562b0a6c9fcb028d211134fc9ab20ccad5d"}, + {file = "mypy-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a156e6390944c265eb56afa67c74c0636f10283429171018446b732f1a05af25"}, + {file = "mypy-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6ac9c21bfe7bc9f7f1b6fae441746e6a106e48fc9de530dea29e8cd37a2c0cc4"}, + {file = "mypy-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51cb1323064b1099e177098cb939eab2da42fea5d818d40113957ec954fc85f4"}, + {file = "mypy-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:596fae69f2bfcb7305808c75c00f81fe2829b6236eadda536f00610ac5ec2243"}, + {file = "mypy-1.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:32cb59609b0534f0bd67faebb6e022fe534bdb0e2ecab4290d683d248be1b275"}, + {file = "mypy-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:159aa9acb16086b79bbb0016145034a1a05360626046a929f84579ce1666b315"}, + {file = "mypy-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f6b0e77db9ff4fda74de7df13f30016a0a663928d669c9f2c057048ba44f09bb"}, + {file = "mypy-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26f71b535dfc158a71264e6dc805a9f8d2e60b67215ca0bfa26e2e1aa4d4d373"}, + {file = "mypy-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc3a600f749b1008cc75e02b6fb3d4db8dbcca2d733030fe7a3b3502902f161"}, + {file = "mypy-1.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:26fb32e4d4afa205b24bf645eddfbb36a1e17e995c5c99d6d00edb24b693406a"}, + {file = "mypy-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:82cb6193de9bbb3844bab4c7cf80e6227d5225cc7625b068a06d005d861ad5f1"}, + {file = "mypy-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a465ea2ca12804d5b34bb056be3a29dc47aea5973b892d0417c6a10a40b2d65"}, + {file = "mypy-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9fece120dbb041771a63eb95e4896791386fe287fefb2837258925b8326d6160"}, + {file = "mypy-1.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d28ddc3e3dfeab553e743e532fb95b4e6afad51d4706dd22f28e1e5e664828d2"}, + {file = "mypy-1.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:57b10c56016adce71fba6bc6e9fd45d8083f74361f629390c556738565af8eeb"}, + {file = "mypy-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff0cedc84184115202475bbb46dd99f8dcb87fe24d5d0ddfc0fe6b8575c88d2f"}, + {file = "mypy-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8f772942d372c8cbac575be99f9cc9d9fb3bd95c8bc2de6c01411e2c84ebca8a"}, + {file = "mypy-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5d627124700b92b6bbaa99f27cbe615c8ea7b3402960f6372ea7d65faf376c14"}, + {file = "mypy-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:361da43c4f5a96173220eb53340ace68cda81845cd88218f8862dfb0adc8cddb"}, + {file = "mypy-1.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:330857f9507c24de5c5724235e66858f8364a0693894342485e543f5b07c8693"}, + {file = "mypy-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:c543214ffdd422623e9fedd0869166c2f16affe4ba37463975043ef7d2ea8770"}, + {file = "mypy-1.5.1-py3-none-any.whl", hash = "sha256:f757063a83970d67c444f6e01d9550a7402322af3557ce7630d3c957386fa8f5"}, + {file = "mypy-1.5.1.tar.gz", hash = "sha256:b031b9601f1060bf1281feab89697324726ba0c0bae9d7cd7ab4b690940f0b92"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=4.1.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "packaging" +version = "23.1" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.1-py3-none-any.whl", hash = "sha256:994793af429502c4ea2ebf6bf664629d07c1a9fe974af92966e4b8d2df7edc61"}, + {file = "packaging-23.1.tar.gz", hash = "sha256:a392980d2b6cffa644431898be54b0045151319d1e7ec34f0cfed48767dd334f"}, +] + +[[package]] +name = "paramiko" +version = "2.12.0" +description = "SSH2 protocol library" +optional = false +python-versions = "*" +files = [ + {file = "paramiko-2.12.0-py2.py3-none-any.whl", hash = "sha256:b2df1a6325f6996ef55a8789d0462f5b502ea83b3c990cbb5bbe57345c6812c4"}, + {file = "paramiko-2.12.0.tar.gz", hash = "sha256:376885c05c5d6aa6e1f4608aac2a6b5b0548b1add40274477324605903d9cd49"}, +] + +[package.dependencies] +bcrypt = ">=3.1.3" +cryptography = ">=2.5" +pynacl = ">=1.0.1" +six = "*" + +[package.extras] +all = ["bcrypt (>=3.1.3)", "gssapi (>=1.4.1)", "invoke (>=1.3)", "pyasn1 (>=0.1.7)", "pynacl (>=1.0.1)", "pywin32 (>=2.1.8)"] +ed25519 = ["bcrypt (>=3.1.3)", "pynacl (>=1.0.1)"] +gssapi = ["gssapi (>=1.4.1)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] +invoke = ["invoke (>=1.3)"] + +[[package]] +name = "passlib" +version = "1.7.4" +description = "comprehensive password hashing framework supporting over 30 schemes" +optional = false +python-versions = "*" +files = [ + {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, + {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, +] + +[package.extras] +argon2 = ["argon2-cffi (>=18.2.0)"] +bcrypt = ["bcrypt (>=3.1.0)"] +build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"] +totp = ["cryptography"] + +[[package]] +name = "pastel" +version = "0.2.1" +description = "Bring colors to your terminal." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, + {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, +] + +[[package]] +name = "pathspec" +version = "0.11.2" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, +] + +[[package]] +name = "pip" +version = "23.2.1" +description = "The PyPA recommended tool for installing Python packages." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pip-23.2.1-py3-none-any.whl", hash = "sha256:7ccf472345f20d35bdc9d1841ff5f313260c2c33fe417f48c30ac46cccabf5be"}, + {file = "pip-23.2.1.tar.gz", hash = "sha256:fb0bd5435b3200c602b5bf61d2d43c2f13c02e29c1707567ae7fbc514eb9faf2"}, +] + +[[package]] +name = "pluggy" +version = "1.3.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poethepoet" +version = "0.22.1" +description = "A task runner that works well with poetry." +optional = false +python-versions = ">=3.8" +files = [ + {file = "poethepoet-0.22.1-py3-none-any.whl", hash = "sha256:1da4cd00d3b2c44b811c91616a744cf71094a26a299ea9956025162d34eef1a5"}, + {file = "poethepoet-0.22.1.tar.gz", hash = "sha256:e758bcac731fa9ac0b812389589541e32b825c4a1894e16fa90aeb1946ba2823"}, +] + +[package.dependencies] +pastel = ">=0.2.1,<0.3.0" +tomli = ">=1.2.2" + +[package.extras] +poetry-plugin = ["poetry (>=1.0,<2.0)"] + +[[package]] +name = "protobuf" +version = "3.13.0" +description = "Protocol Buffers" +optional = false +python-versions = "*" +files = [ + {file = "protobuf-3.13.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9c2e63c1743cba12737169c447374fab3dfeb18111a460a8c1a000e35836b18c"}, + {file = "protobuf-3.13.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1e834076dfef9e585815757a2c7e4560c7ccc5962b9d09f831214c693a91b463"}, + {file = "protobuf-3.13.0-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:df3932e1834a64b46ebc262e951cd82c3cf0fa936a154f0a42231140d8237060"}, + {file = "protobuf-3.13.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8c35bcbed1c0d29b127c886790e9d37e845ffc2725cc1db4bd06d70f4e8359f4"}, + {file = "protobuf-3.13.0-cp35-cp35m-win32.whl", hash = "sha256:339c3a003e3c797bc84499fa32e0aac83c768e67b3de4a5d7a5a9aa3b0da634c"}, + {file = "protobuf-3.13.0-cp35-cp35m-win_amd64.whl", hash = "sha256:361acd76f0ad38c6e38f14d08775514fbd241316cce08deb2ce914c7dfa1184a"}, + {file = "protobuf-3.13.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9edfdc679a3669988ec55a989ff62449f670dfa7018df6ad7f04e8dbacb10630"}, + {file = "protobuf-3.13.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5db9d3e12b6ede5e601b8d8684a7f9d90581882925c96acf8495957b4f1b204b"}, + {file = "protobuf-3.13.0-cp36-cp36m-win32.whl", hash = "sha256:c8abd7605185836f6f11f97b21200f8a864f9cb078a193fe3c9e235711d3ff1e"}, + {file = "protobuf-3.13.0-cp36-cp36m-win_amd64.whl", hash = "sha256:4d1174c9ed303070ad59553f435846a2f877598f59f9afc1b89757bdf846f2a7"}, + {file = "protobuf-3.13.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0bba42f439bf45c0f600c3c5993666fcb88e8441d011fad80a11df6f324eef33"}, + {file = "protobuf-3.13.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c0c5ab9c4b1eac0a9b838f1e46038c3175a95b0f2d944385884af72876bd6bc7"}, + {file = "protobuf-3.13.0-cp37-cp37m-win32.whl", hash = "sha256:f68eb9d03c7d84bd01c790948320b768de8559761897763731294e3bc316decb"}, + {file = "protobuf-3.13.0-cp37-cp37m-win_amd64.whl", hash = "sha256:91c2d897da84c62816e2f473ece60ebfeab024a16c1751aaf31100127ccd93ec"}, + {file = "protobuf-3.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3dee442884a18c16d023e52e32dd34a8930a889e511af493f6dc7d4d9bf12e4f"}, + {file = "protobuf-3.13.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:e7662437ca1e0c51b93cadb988f9b353fa6b8013c0385d63a70c8a77d84da5f9"}, + {file = "protobuf-3.13.0-py2.py3-none-any.whl", hash = "sha256:d69697acac76d9f250ab745b46c725edf3e98ac24763990b24d58c16c642947a"}, + {file = "protobuf-3.13.0.tar.gz", hash = "sha256:6a82e0c8bb2bf58f606040cc5814e07715b2094caeba281e2e7d0b0e2e397db5"}, +] + +[package.dependencies] +setuptools = "*" +six = ">=1.9" + +[[package]] +name = "publicsuffix2" +version = "2.20191221" +description = "Get a public suffix for a domain name using the Public Suffix List. Forked from and using the same API as the publicsuffix package." +optional = false +python-versions = "*" +files = [ + {file = "publicsuffix2-2.20191221-py2.py3-none-any.whl", hash = "sha256:786b5e36205b88758bd3518725ec8cfe7a8173f5269354641f581c6b80a99893"}, + {file = "publicsuffix2-2.20191221.tar.gz", hash = "sha256:00f8cc31aa8d0d5592a5ced19cccba7de428ebca985db26ac852d920ddd6fe7b"}, +] + +[[package]] +name = "pyasn1" +version = "0.4.8" +description = "ASN.1 types and codecs" +optional = false +python-versions = "*" +files = [ + {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, + {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pydivert" +version = "2.1.0" +description = "Python binding to windivert driver" +optional = false +python-versions = "*" +files = [ + {file = "pydivert-2.1.0-py2.py3-none-any.whl", hash = "sha256:382db488e3c37c03ec9ec94e061a0b24334d78dbaeebb7d4e4d32ce4355d9da1"}, + {file = "pydivert-2.1.0.tar.gz", hash = "sha256:f0e150f4ff591b78e35f514e319561dadff7f24a82186a171dd4d465483de5b4"}, +] + +[package.extras] +docs = ["sphinx (>=1.4.8)"] +test = ["codecov (>=2.0.5)", "hypothesis (>=3.5.3)", "mock (>=1.0.1)", "pytest (>=3.0.3)", "pytest-cov (>=2.2.1)", "pytest-faulthandler (>=1.3.0,<2)", "pytest-timeout (>=1.0.0,<2)", "wheel (>=0.29)"] + +[[package]] +name = "pynacl" +version = "1.5.0" +description = "Python binding to the Networking and Cryptography (NaCl) library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, + {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, +] + +[package.dependencies] +cffi = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] +tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] + +[[package]] +name = "pyopenssl" +version = "19.1.0" +description = "Python wrapper module around the OpenSSL library" +optional = false +python-versions = "*" +files = [ + {file = "pyOpenSSL-19.1.0-py2.py3-none-any.whl", hash = "sha256:621880965a720b8ece2f1b2f54ea2071966ab00e2970ad2ce11d596102063504"}, + {file = "pyOpenSSL-19.1.0.tar.gz", hash = "sha256:9a24494b2602aaf402be5c9e30a0b82d4a5c67528fe8fb475e3f3bc00dd69507"}, +] + +[package.dependencies] +cryptography = ">=2.8" +six = ">=1.5.2" + +[package.extras] +docs = ["sphinx", "sphinx-rtd-theme"] +test = ["flaky", "pretend", "pytest (>=3.0.1)"] + +[[package]] +name = "pyparsing" +version = "2.4.7" +description = "Python parsing module" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, + {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, +] + +[[package]] +name = "pyperclip" +version = "1.8.2" +description = "A cross-platform clipboard module for Python. (Only handles plain text for now.)" +optional = false +python-versions = "*" +files = [ + {file = "pyperclip-1.8.2.tar.gz", hash = "sha256:105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57"}, +] + +[[package]] +name = "pyrsistent" +version = "0.19.3" +description = "Persistent/Functional/Immutable data structures" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, + {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, + {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, + {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, + {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, + {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, +] + +[[package]] +name = "pytest" +version = "7.4.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, + {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "0.21.0" +description = "Pytest support for asyncio" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-asyncio-0.21.0.tar.gz", hash = "sha256:2b38a496aef56f56b0e87557ec313e11e1ab9276fc3863f6a7be0f1d0e415e1b"}, + {file = "pytest_asyncio-0.21.0-py3-none-any.whl", hash = "sha256:f2b3366b7cd501a4056858bd39349d5af19742aed2d81660b7998b6341c7eb9c"}, +] + +[package.dependencies] +pytest = ">=7.0.0" + +[package.extras] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] + +[[package]] +name = "pytest-rerunfailures" +version = "10.3" +description = "pytest plugin to re-run tests to eliminate flaky failures" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pytest-rerunfailures-10.3.tar.gz", hash = "sha256:d8244d799f89a6edb5e57301ddaeb3b6f10d6691638d51e80b371311592e28c6"}, + {file = "pytest_rerunfailures-10.3-py3-none-any.whl", hash = "sha256:6be6f96510bf94b54198bf15bc5568fe2cdff88e83875912e22d29810acf65ff"}, +] + +[package.dependencies] +packaging = ">=17.1" +pytest = ">=5.3" + +[[package]] +name = "pytest-split" +version = "0.8.1" +description = "Pytest plugin which splits the test suite to equally sized sub suites based on test execution time." +optional = false +python-versions = ">=3.7.1,<4.0" +files = [ + {file = "pytest_split-0.8.1-py3-none-any.whl", hash = "sha256:74b110ea091bd147cc1c5f9665a59506e5cedfa66f96a89fb03e4ab447c2c168"}, + {file = "pytest_split-0.8.1.tar.gz", hash = "sha256:2d88bd3dc528689a7a3f58fc12ea165c3aa62e90795e420dfad920afe5612d6d"}, +] + +[package.dependencies] +pytest = ">=5,<8" + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "0.21.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python-dotenv-0.21.1.tar.gz", hash = "sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49"}, + {file = "python_dotenv-0.21.1-py3-none-any.whl", hash = "sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pyyaml" +version = "5.3.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = "*" +files = [ + {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, + {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, + {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, + {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, + {file = "PyYAML-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a"}, + {file = "PyYAML-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e"}, + {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, +] + +[[package]] +name = "regex" +version = "2023.8.8" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.6" +files = [ + {file = "regex-2023.8.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:88900f521c645f784260a8d346e12a1590f79e96403971241e64c3a265c8ecdb"}, + {file = "regex-2023.8.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3611576aff55918af2697410ff0293d6071b7e00f4b09e005d614686ac4cd57c"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8a0ccc8f2698f120e9e5742f4b38dc944c38744d4bdfc427616f3a163dd9de5"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c662a4cbdd6280ee56f841f14620787215a171c4e2d1744c9528bed8f5816c96"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cf0633e4a1b667bfe0bb10b5e53fe0d5f34a6243ea2530eb342491f1adf4f739"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:551ad543fa19e94943c5b2cebc54c73353ffff08228ee5f3376bd27b3d5b9800"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:54de2619f5ea58474f2ac211ceea6b615af2d7e4306220d4f3fe690c91988a61"}, + {file = "regex-2023.8.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5ec4b3f0aebbbe2fc0134ee30a791af522a92ad9f164858805a77442d7d18570"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3ae646c35cb9f820491760ac62c25b6d6b496757fda2d51be429e0e7b67ae0ab"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ca339088839582d01654e6f83a637a4b8194d0960477b9769d2ff2cfa0fa36d2"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d9b6627408021452dcd0d2cdf8da0534e19d93d070bfa8b6b4176f99711e7f90"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:bd3366aceedf274f765a3a4bc95d6cd97b130d1dda524d8f25225d14123c01db"}, + {file = "regex-2023.8.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7aed90a72fc3654fba9bc4b7f851571dcc368120432ad68b226bd593f3f6c0b7"}, + {file = "regex-2023.8.8-cp310-cp310-win32.whl", hash = "sha256:80b80b889cb767cc47f31d2b2f3dec2db8126fbcd0cff31b3925b4dc6609dcdb"}, + {file = "regex-2023.8.8-cp310-cp310-win_amd64.whl", hash = "sha256:b82edc98d107cbc7357da7a5a695901b47d6eb0420e587256ba3ad24b80b7d0b"}, + {file = "regex-2023.8.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1e7d84d64c84ad97bf06f3c8cb5e48941f135ace28f450d86af6b6512f1c9a71"}, + {file = "regex-2023.8.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce0f9fbe7d295f9922c0424a3637b88c6c472b75eafeaff6f910494a1fa719ef"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:06c57e14ac723b04458df5956cfb7e2d9caa6e9d353c0b4c7d5d54fcb1325c46"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7a9aaa5a1267125eef22cef3b63484c3241aaec6f48949b366d26c7250e0357"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b7408511fca48a82a119d78a77c2f5eb1b22fe88b0d2450ed0756d194fe7a9a"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14dc6f2d88192a67d708341f3085df6a4f5a0c7b03dec08d763ca2cd86e9f559"}, + {file = "regex-2023.8.8-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:48c640b99213643d141550326f34f0502fedb1798adb3c9eb79650b1ecb2f177"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:964b16dcc10c79a4a2be9f1273fcc2684a9eedb3906439720598029a797b46e6"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7ce606c14bb195b0e5108544b540e2c5faed6843367e4ab3deb5c6aa5e681208"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:40f029d73b10fac448c73d6eb33d57b34607f40116e9f6e9f0d32e9229b147d7"}, + {file = "regex-2023.8.8-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3b8e6ea6be6d64104d8e9afc34c151926f8182f84e7ac290a93925c0db004bfd"}, + {file = "regex-2023.8.8-cp311-cp311-win32.whl", hash = "sha256:942f8b1f3b223638b02df7df79140646c03938d488fbfb771824f3d05fc083a8"}, + {file = "regex-2023.8.8-cp311-cp311-win_amd64.whl", hash = "sha256:51d8ea2a3a1a8fe4f67de21b8b93757005213e8ac3917567872f2865185fa7fb"}, + {file = "regex-2023.8.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:e951d1a8e9963ea51efd7f150450803e3b95db5939f994ad3d5edac2b6f6e2b4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:704f63b774218207b8ccc6c47fcef5340741e5d839d11d606f70af93ee78e4d4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22283c769a7b01c8ac355d5be0715bf6929b6267619505e289f792b01304d898"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:91129ff1bb0619bc1f4ad19485718cc623a2dc433dff95baadbf89405c7f6b57"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de35342190deb7b866ad6ba5cbcccb2d22c0487ee0cbb251efef0843d705f0d4"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b993b6f524d1e274a5062488a43e3f9f8764ee9745ccd8e8193df743dbe5ee61"}, + {file = "regex-2023.8.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3026cbcf11d79095a32d9a13bbc572a458727bd5b1ca332df4a79faecd45281c"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:293352710172239bf579c90a9864d0df57340b6fd21272345222fb6371bf82b3"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d909b5a3fff619dc7e48b6b1bedc2f30ec43033ba7af32f936c10839e81b9217"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:3d370ff652323c5307d9c8e4c62efd1956fb08051b0e9210212bc51168b4ff56"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:b076da1ed19dc37788f6a934c60adf97bd02c7eea461b73730513921a85d4235"}, + {file = "regex-2023.8.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e9941a4ada58f6218694f382e43fdd256e97615db9da135e77359da257a7168b"}, + {file = "regex-2023.8.8-cp36-cp36m-win32.whl", hash = "sha256:a8c65c17aed7e15a0c824cdc63a6b104dfc530f6fa8cb6ac51c437af52b481c7"}, + {file = "regex-2023.8.8-cp36-cp36m-win_amd64.whl", hash = "sha256:aadf28046e77a72f30dcc1ab185639e8de7f4104b8cb5c6dfa5d8ed860e57236"}, + {file = "regex-2023.8.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:423adfa872b4908843ac3e7a30f957f5d5282944b81ca0a3b8a7ccbbfaa06103"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ae594c66f4a7e1ea67232a0846649a7c94c188d6c071ac0210c3e86a5f92109"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e51c80c168074faa793685656c38eb7a06cbad7774c8cbc3ea05552d615393d8"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09b7f4c66aa9d1522b06e31a54f15581c37286237208df1345108fcf4e050c18"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2e73e5243af12d9cd6a9d6a45a43570dbe2e5b1cdfc862f5ae2b031e44dd95a8"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:941460db8fe3bd613db52f05259c9336f5a47ccae7d7def44cc277184030a116"}, + {file = "regex-2023.8.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f0ccf3e01afeb412a1a9993049cb160d0352dba635bbca7762b2dc722aa5742a"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:2e9216e0d2cdce7dbc9be48cb3eacb962740a09b011a116fd7af8c832ab116ca"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:5cd9cd7170459b9223c5e592ac036e0704bee765706445c353d96f2890e816c8"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:4873ef92e03a4309b3ccd8281454801b291b689f6ad45ef8c3658b6fa761d7ac"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:239c3c2a339d3b3ddd51c2daef10874410917cd2b998f043c13e2084cb191684"}, + {file = "regex-2023.8.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1005c60ed7037be0d9dea1f9c53cc42f836188227366370867222bda4c3c6bd7"}, + {file = "regex-2023.8.8-cp37-cp37m-win32.whl", hash = "sha256:e6bd1e9b95bc5614a7a9c9c44fde9539cba1c823b43a9f7bc11266446dd568e3"}, + {file = "regex-2023.8.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9a96edd79661e93327cfeac4edec72a4046e14550a1d22aa0dd2e3ca52aec921"}, + {file = "regex-2023.8.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f2181c20ef18747d5f4a7ea513e09ea03bdd50884a11ce46066bb90fe4213675"}, + {file = "regex-2023.8.8-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a2ad5add903eb7cdde2b7c64aaca405f3957ab34f16594d2b78d53b8b1a6a7d6"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9233ac249b354c54146e392e8a451e465dd2d967fc773690811d3a8c240ac601"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:920974009fb37b20d32afcdf0227a2e707eb83fe418713f7a8b7de038b870d0b"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd2b6c5dfe0929b6c23dde9624483380b170b6e34ed79054ad131b20203a1a63"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96979d753b1dc3b2169003e1854dc67bfc86edf93c01e84757927f810b8c3c93"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ae54a338191e1356253e7883d9d19f8679b6143703086245fb14d1f20196be9"}, + {file = "regex-2023.8.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2162ae2eb8b079622176a81b65d486ba50b888271302190870b8cc488587d280"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c884d1a59e69e03b93cf0dfee8794c63d7de0ee8f7ffb76e5f75be8131b6400a"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:cf9273e96f3ee2ac89ffcb17627a78f78e7516b08f94dc435844ae72576a276e"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:83215147121e15d5f3a45d99abeed9cf1fe16869d5c233b08c56cdf75f43a504"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:3f7454aa427b8ab9101f3787eb178057c5250478e39b99540cfc2b889c7d0586"}, + {file = "regex-2023.8.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f0640913d2c1044d97e30d7c41728195fc37e54d190c5385eacb52115127b882"}, + {file = "regex-2023.8.8-cp38-cp38-win32.whl", hash = "sha256:0c59122ceccb905a941fb23b087b8eafc5290bf983ebcb14d2301febcbe199c7"}, + {file = "regex-2023.8.8-cp38-cp38-win_amd64.whl", hash = "sha256:c12f6f67495ea05c3d542d119d270007090bad5b843f642d418eb601ec0fa7be"}, + {file = "regex-2023.8.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:82cd0a69cd28f6cc3789cc6adeb1027f79526b1ab50b1f6062bbc3a0ccb2dbc3"}, + {file = "regex-2023.8.8-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bb34d1605f96a245fc39790a117ac1bac8de84ab7691637b26ab2c5efb8f228c"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:987b9ac04d0b38ef4f89fbc035e84a7efad9cdd5f1e29024f9289182c8d99e09"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9dd6082f4e2aec9b6a0927202c85bc1b09dcab113f97265127c1dc20e2e32495"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7eb95fe8222932c10d4436e7a6f7c99991e3fdd9f36c949eff16a69246dee2dc"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7098c524ba9f20717a56a8d551d2ed491ea89cbf37e540759ed3b776a4f8d6eb"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b694430b3f00eb02c594ff5a16db30e054c1b9589a043fe9174584c6efa8033"}, + {file = "regex-2023.8.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b2aeab3895d778155054abea5238d0eb9a72e9242bd4b43f42fd911ef9a13470"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:988631b9d78b546e284478c2ec15c8a85960e262e247b35ca5eaf7ee22f6050a"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:67ecd894e56a0c6108ec5ab1d8fa8418ec0cff45844a855966b875d1039a2e34"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:14898830f0a0eb67cae2bbbc787c1a7d6e34ecc06fbd39d3af5fe29a4468e2c9"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:f2200e00b62568cfd920127782c61bc1c546062a879cdc741cfcc6976668dfcf"}, + {file = "regex-2023.8.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9691a549c19c22d26a4f3b948071e93517bdf86e41b81d8c6ac8a964bb71e5a6"}, + {file = "regex-2023.8.8-cp39-cp39-win32.whl", hash = "sha256:6ab2ed84bf0137927846b37e882745a827458689eb969028af8032b1b3dac78e"}, + {file = "regex-2023.8.8-cp39-cp39-win_amd64.whl", hash = "sha256:5543c055d8ec7801901e1193a51570643d6a6ab8751b1f7dd9af71af467538bb"}, + {file = "regex-2023.8.8.tar.gz", hash = "sha256:fcbdc5f2b0f1cd0f6a56cdb46fe41d2cce1e644e3b68832f3eeebc5fb0f7712e"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "ruamel-yaml" +version = "0.16.13" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +optional = false +python-versions = "*" +files = [ + {file = "ruamel.yaml-0.16.13-py2.py3-none-any.whl", hash = "sha256:64b06e7873eb8e1125525ecef7345447d786368cadca92a7cd9b59eae62e95a3"}, + {file = "ruamel.yaml-0.16.13.tar.gz", hash = "sha256:bb48c514222702878759a05af96f4b7ecdba9b33cd4efcf25c86b882cef3a942"}, +] + +[package.extras] +docs = ["ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[[package]] +name = "setuptools" +version = "68.2.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, + {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sortedcontainers" +version = "2.2.2" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +optional = false +python-versions = "*" +files = [ + {file = "sortedcontainers-2.2.2-py2.py3-none-any.whl", hash = "sha256:c633ebde8580f241f274c1f8994a665c0e54a17724fecd0cae2f079e09c36d3f"}, + {file = "sortedcontainers-2.2.2.tar.gz", hash = "sha256:4e73a757831fc3ca4de2859c422564239a31d8213d09a2a666e375807034d2ba"}, +] + +[[package]] +name = "texttable" +version = "1.6.7" +description = "module to create simple ASCII tables" +optional = false +python-versions = "*" +files = [ + {file = "texttable-1.6.7-py2.py3-none-any.whl", hash = "sha256:b7b68139aa8a6339d2c320ca8b1dc42d13a7831a346b446cb9eb385f0c76310c"}, + {file = "texttable-1.6.7.tar.gz", hash = "sha256:290348fb67f7746931bcdfd55ac7584ecd4e5b0846ab164333f0794b121760f2"}, +] + +[[package]] +name = "tomli" +version = "1.2.3" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, + {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, +] + +[[package]] +name = "tornado" +version = "6.3.3" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, + {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, + {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, + {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, +] + +[[package]] +name = "transitions" +version = "0.8.11" +description = "A lightweight, object-oriented Python state machine implementation with many extensions." +optional = false +python-versions = "*" +files = [ + {file = "transitions-0.8.11-py2.py3-none-any.whl", hash = "sha256:9525dd9b708b0a54bb4562a06a483d237e75c94547ba9831c81c6872d0ea1522"}, + {file = "transitions-0.8.11.tar.gz", hash = "sha256:7b20d32906ea4d60ee6f6c1f5dc9c9f178802425c5b155213eb0f25c277f04e4"}, +] + +[package.dependencies] +six = "*" + +[package.extras] +diagrams = ["pygraphviz"] +test = ["pytest"] + +[[package]] +name = "typing-extensions" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] + +[[package]] +name = "urllib3" +version = "1.26.16" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.16-py2.py3-none-any.whl", hash = "sha256:8d36afa7616d8ab714608411b4a3b13e58f463aee519024578e062e141dce20f"}, + {file = "urllib3-1.26.16.tar.gz", hash = "sha256:8f135f6502756bde6b2a9b28989df5fbe87c9970cecaa69041edcce7f0589b14"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "urwid" +version = "2.1.2" +description = "A full-featured console (xterm et al.) user interface library" +optional = false +python-versions = "*" +files = [ + {file = "urwid-2.1.2.tar.gz", hash = "sha256:588bee9c1cb208d0906a9f73c613d2bd32c3ed3702012f51efe318a3f2127eae"}, +] + +[[package]] +name = "websocket-client" +version = "0.59.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "websocket-client-0.59.0.tar.gz", hash = "sha256:d376bd60eace9d437ab6d7ee16f4ab4e821c9dae591e1b783c58ebd8aaf80c5c"}, + {file = "websocket_client-0.59.0-py2.py3-none-any.whl", hash = "sha256:2e50d26ca593f70aba7b13a489435ef88b8fc3b5c5643c1ce8808ff9b40f0b32"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "werkzeug" +version = "1.0.1" +description = "The comprehensive WSGI web application library." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "Werkzeug-1.0.1-py2.py3-none-any.whl", hash = "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43"}, + {file = "Werkzeug-1.0.1.tar.gz", hash = "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c"}, +] + +[package.extras] +dev = ["coverage", "pallets-sphinx-themes", "pytest", "pytest-timeout", "sphinx", "sphinx-issues", "tox"] +watchdog = ["watchdog"] + +[[package]] +name = "wsproto" +version = "0.15.0" +description = "WebSockets state-machine based protocol implementation" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "wsproto-0.15.0-py2.py3-none-any.whl", hash = "sha256:e3d190a11d9307112ba23bbe60055604949b172143969c8f641318476a9b6f1d"}, + {file = "wsproto-0.15.0.tar.gz", hash = "sha256:614798c30e5dc2b3f65acc03d2d50842b97621487350ce79a80a711229edfa9d"}, +] + +[package.dependencies] +h11 = ">=0.8.1" + +[[package]] +name = "ya-aioclient" +version = "0.6.4" +description = "" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "ya-aioclient-0.6.4.tar.gz", hash = "sha256:e5e5926e3a7d834082b05aeb986d8fb2f7fa46a1bd1bca2f3f1c872e1ba479ae"}, + {file = "ya_aioclient-0.6.4-py3-none-any.whl", hash = "sha256:1d36c2544c2d7629a00a2b1f18b4535e836586cae99bfbf5714ed5ca3f9caa0c"}, +] + +[package.dependencies] +aiohttp = ">=3.6.2,<4.0.0" +certifi = ">=2020.6.20,<2021.0.0" +python-dateutil = ">=2.8.1,<3.0.0" + +[[package]] +name = "yarl" +version = "1.9.2" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[[package]] +name = "zstandard" +version = "0.14.1" +description = "Zstandard bindings for Python" +optional = false +python-versions = "*" +files = [ + {file = "zstandard-0.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ec1a20936484f3804fba4f29f7d8ed67c70e44536b0f0191a13eff4dc61c815c"}, + {file = "zstandard-0.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:85b37acd054f8f778e5c9832e17fb651f321a3daafa0eb94360eeffce141b0cf"}, + {file = "zstandard-0.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:95939a7e3972ec20e2e959ee9cd0fd858b25ff3a6f5040c5c78fcab51eeab030"}, + {file = "zstandard-0.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:d3999f92ab7aab2a99ac7f7730b3bee8d6bd3e52953ed0e87ab881ca4244a315"}, + {file = "zstandard-0.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:8df3114dfff411aa9827d754bb8fdcdaa15e63c96d7730778fe322f4c85360d8"}, + {file = "zstandard-0.14.1-cp27-cp27m-win32.whl", hash = "sha256:4e6d6b0e541b00d0096a260d5f6eb32f737bfcdb2e5b87a7b7be77ef669c7a6c"}, + {file = "zstandard-0.14.1-cp27-cp27m-win_amd64.whl", hash = "sha256:064aac12b8e7813fa3870e7479e9cbd3803e33212b68e555b408711ea8f6cb54"}, + {file = "zstandard-0.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:b508a826c4b99835e3d8a8d415a6e516cacad4a95ef5ed01f60f9b067f200a51"}, + {file = "zstandard-0.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a72cb707cc0a9d06e3912fe5b6c1648d70ac512f3e180018c82fe926926be12c"}, + {file = "zstandard-0.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:1c065de617b7367c4da4de687a071932e48ae200d09c0afbc24415d98aec470d"}, + {file = "zstandard-0.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:391c30620e3ad6bc53804f32e3f74cbbaa713d95f46ac5f2e54e735d1dfc51c0"}, + {file = "zstandard-0.14.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:403fa9544ecdedcc5fdc48f5e41e092658ac48222cfe6e75fb5710cb3d14c700"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:657a49b1df5a82985ea6495c6c1497a17e34e41a0bd8ef95a640342a19b8e6a4"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c3c9657417bf1eccb94ad64544e12efa8ea3e16612944b32e253314472a54e5"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:d2db7bcdc9b3e5a782d71df0163a6587b8b2f759cc4a819859e27e6ad2f778e6"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:1be45b237fea45c705d83215450a9381c2787bbf0720824b1fe23ed72f8db0b7"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux2014_i686.whl", hash = "sha256:477db538b596767d036379165a27aa2e19edbae50bec4cea195a986ba50bbad6"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:ac9b88a72f2dcfa3facbe6af96d59e82459e5815c15aa59481cc6080937ee02e"}, + {file = "zstandard-0.14.1-cp35-cp35m-win32.whl", hash = "sha256:2826d664eb84f9efe0fae47cf20c27f3662aae3556fbcc4cecd5318fbc9239f3"}, + {file = "zstandard-0.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:36cd223d7fd0fe0e32e82993240e9a24503269c93431e62369088e2299cf4605"}, + {file = "zstandard-0.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d4a7065d7fc991edb93483dbb7bc37dd091a2bac9572d9b9df243e6565d30522"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6f437168752e50ad6a47d054f4a41933693b1675f65663c117067747d95f057c"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e80ade52a06fb433c9ad7d6c8cfb3dafa34f05bedce543e95a670972ba41d65d"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:0b3ae587556a6f45cd982d7684b1318793430d0ae9e376dbc3d877b48ac6d576"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:d34848645f3507dc85baa8c67426f0685b08583e930fa3a1ab5048c5f0ba8fc1"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:5be097127be1659bc6cffb5d885c781e61947597e2fcd1ecf48713313e53657d"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:e3731e0dc1c200e5c2f56ca36bed6c28903f764769f534fbf9ed4178f193e8aa"}, + {file = "zstandard-0.14.1-cp36-cp36m-win32.whl", hash = "sha256:aab21dd5724aa5bdd0aac16f5d175e5df0715fc614910220a918d50f08321982"}, + {file = "zstandard-0.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:ed14a62f8bf2462f19373c337527ff684deb6d0d6b973fbcaece1f561c30f405"}, + {file = "zstandard-0.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:db1b3442441577d81bdae85fc7a4bd553e3161ec745e9dd1f2f93889248363fe"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:8486a01696e3cdfa47b93caa8f5064c9d277bad1c39eb31947bf2b8f019e3510"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4b054fd8cf274b958a3d7a201f8b42a30ebf8f76d87770075e1aca6017006e97"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:fb5f0d29bcbfba6ef9beccba55f567d089747034add5cd7e8dc58842bb745803"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:90f0bb1adcfea326c6548a45cc35474bec56a34d80310b6e78abab313da780fc"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:0b57df1f9530669d61f8708eb15ded6584db4a6733cc5155eb8561d31f292557"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:3948000d753b9110e1eb43a6cba6fdb64c895faebb47628a96550edc5238b78a"}, + {file = "zstandard-0.14.1-cp37-cp37m-win32.whl", hash = "sha256:17e8f29aae79d870daa3ab48c0dbf83594bf956c2c2125ae45cdfebd2b62d8ed"}, + {file = "zstandard-0.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d7fecb5172dc885665581437fe96bf8f03ffc0022b723964c272accbb62713b4"}, + {file = "zstandard-0.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2fd76d29f4e8d7c4aac42617a0439506144146032b5d7b9b0a42f37f916fdb2"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:7309bf511c8b332be2b5a834efbd7ee0cd43db2c811dd916fd0f48acd43e8722"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:a51a09a3be208e627ebb518a78c639d240584f5d1da8106dcafa31d22103b4df"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a820ef78f39c29469caacb0bf43ffd024b78f242393c605daa748588b3247306"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:e3963c919f65367587cf987a71991e69385f19cec9ad8166249b83e176cdbcd8"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:0e5b8fd428d0d00fb7dabc0898de9e87659cb54738d527becff37d3d90df8e88"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:41eab10e6570e14dd77a346f3dbb1eab3f23a652bce07ba47c8c23116b0cee9c"}, + {file = "zstandard-0.14.1-cp38-cp38-win32.whl", hash = "sha256:fbbe18afb67329577ab6a907f348175d3f6044d179a9b56b02206ff9e67c5b12"}, + {file = "zstandard-0.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:3bd044ef32bd6738c3db2cb2d4bc77812e9a3132df942303bbfcd1a484023b60"}, + {file = "zstandard-0.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:24ab8f1c7c970822bd55dbb091f7eb271b417e777e8b3ae6722e60d67f747c05"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:cf67443d06b88218eb8915da2d968dcf6fdc384fb245f97155617ff3b8d77e92"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d78db92ac27cdcd55333b7e642cd400719842e692e8836f0b249e459b26d384b"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bd4da25cc46e972b029f8aa9f103c5977dbe461e1916ff7edec24065071b4a08"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:2075be64372206af3df40fef0fee657b44845d3e6d98b4cc8aba220be861de2d"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:70dfe74b24971476a6a20d42abb964c9ac0fb1af7b89228e5845748377543bd0"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:3382ce6e44e9e847dce848bc2638403aa9320cb38edcc34b71e13be5793619e0"}, + {file = "zstandard-0.14.1-cp39-cp39-win32.whl", hash = "sha256:7161d71debb94c456cbddd8a239e89219f37f0b1a4c0620a2c1400801aeeec7d"}, + {file = "zstandard-0.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d2ec8309309fc7254d21286d6b3e5c28e4019cd8e266d1a860456a69ea7c2400"}, + {file = "zstandard-0.14.1.tar.gz", hash = "sha256:5dd700e52ec28c64d43f681ccde76b6436c8f89a332d6c9e22a6b629f28daeb5"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10.1" +content-hash = "86a557f07199857f73bd83f8e52d1f3844d7e5101263900f679705732db43761" From 87e75fb1ab255cb486265fe260224254c826e5bc Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Wed, 27 Sep 2023 10:47:37 +0200 Subject: [PATCH 086/123] payment: Add erc20next support in the payment_api example --- core/payment/examples/payment_api.rs | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/core/payment/examples/payment_api.rs b/core/payment/examples/payment_api.rs index f7b4b3c0df..29d890e2e2 100644 --- a/core/payment/examples/payment_api.rs +++ b/core/payment/examples/payment_api.rs @@ -261,9 +261,8 @@ async fn main() -> anyhow::Result<()> { erc20::DRIVER_NAME } Driver::Erc20next => { - //start_erc20next_driver(&db, requestor_account).await?; - //erc20next::DRIVER_NAME - todo!() + start_erc20_next_driver(&db, "./".into(), requestor_account).await?; + erc20next::DRIVER_NAME } }; bus::service(driver_bus_id(driver_name)) From a1955f2d75cf08985e9534ebb95f20df0c974339 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Wed, 4 Oct 2023 17:50:51 +0200 Subject: [PATCH 087/123] remove binaries-x86-64.yml --- .github/workflows/binaries-x86-64.yml | 98 --------------------------- 1 file changed, 98 deletions(-) delete mode 100644 .github/workflows/binaries-x86-64.yml diff --git a/.github/workflows/binaries-x86-64.yml b/.github/workflows/binaries-x86-64.yml deleted file mode 100644 index 0bb9645a94..0000000000 --- a/.github/workflows/binaries-x86-64.yml +++ /dev/null @@ -1,98 +0,0 @@ -name: Build binaries (x86-64) - -on: - workflow_dispatch: - inputs: - rust_flags: - description: 'Rust flags' - required: true - default: '-C opt-level=z -C target-cpu=x86-64 -C debuginfo=1' - rust_version: - description: 'Rust version' - required: true - default: '1.71.1' - strip_binaries: - description: 'Strip binaries' - required: true - default: 'true' - possible_values: ['true', 'false'] - push: - branches: - - master - - payments-dev - - release/* - - p2p-stability - - '**/all-tests' - - '**/integration-tests' - pull_request: - branches: - - master - - payments-dev - - release/* - - p2p-stability - -jobs: - build: - name: Build binaries (x86-64) - env: - RUSTFLAGS: ${{ github.event.inputs.rust_flags || '-C opt-level=z -C target-cpu=x86-64 -C debuginfo=1' }} - runs-on: [ yagna-builder, ubuntu-22.04 ] - steps: - - name: Checkout - uses: actions/checkout@v4 - - - name: Set input variables - id: variables - run: | - echo "branch=${GITHUB_HEAD_REF:-${GITHUB_REF#refs/heads/}}" >> $GITHUB_OUTPUT - echo "rust_version=${{ github.event.inputs.rust_version || '1.71.1' }}" >> $GITHUB_OUTPUT - echo "rust_flags_md5=`echo ${RUSTFLAGS} | md5sum | head -c 10`" >> $GITHUB_OUTPUT - - - name: Musl - run: | - sudo apt-get -y install musl musl-tools - musl-gcc -v - - - name: Install Rust ${{ steps.variables.outputs.rust_version }} - uses: dtolnay/rust-toolchain@master - with: - toolchain: ${{ steps.variables.outputs.rust_version }} - components: rustfmt, clippy - targets: x86_64-unknown-linux-musl - - - name: Load local cache - id: cache_action - env: - cache_dir: /opt/yagna_cache/${{ steps.variables.outputs.rust_version }}/${{ steps.variables.outputs.branch }}/${{ steps.variables.outputs.rust_flags_md5 }}/binaries_x86/target - run: | - # Uncomment line if you want need to clear cache - # rm -rf "$cache_dir" - cp -rp "$cache_dir" target || echo "No local cache found" - echo "cache_dir=$cache_dir" >> $GITHUB_OUTPUT - - - name: Build binaries - run: | - cargo build --features static-openssl --target x86_64-unknown-linux-musl -p yagna - cargo build --features static-openssl --target x86_64-unknown-linux-musl -p ya-exe-unit -p gftp -p golemsp -p ya-provider - - - name: Move target binaries - run: | - mkdir build - mv target/x86_64-unknown-linux-musl/debug/{yagna,ya-provider,exe-unit,golemsp,gftp} build - - - name: Strip binaries - if: ${{ github.event.inputs.strip_binaries != 'false' }} - run: | - strip -x build/* - - - name: Upload binaries - uses: actions/upload-artifact@v3 - with: - name: Yagna ${{ runner.os }} - path: build - - - name: Save local cache - run: | - # copy to /opt/yagna_cache and preserve permissions and timestamps - rsync -a --delete --mkpath target/ "${{ steps.cache_action.outputs.cache_dir }}" - From 729110b52033507a9b7b7ac56ab47899bbb715a2 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 29 Sep 2023 10:36:12 +0200 Subject: [PATCH 088/123] erc20next: Implement /payments/status endpoint --- Cargo.lock | 8 +-- Cargo.toml | 4 +- core/model/src/driver.rs | 14 +++++- core/model/src/payment.rs | 23 ++++++++- core/payment-driver/base/src/bus.rs | 3 ++ core/payment-driver/base/src/driver.rs | 10 ++++ core/payment-driver/erc20next/src/driver.rs | 55 +++++++++++++++++++++ core/payment/src/api/payments.rs | 33 ++++++++++++- core/payment/src/service.rs | 53 ++++++++++++++++++-- 9 files changed, 191 insertions(+), 12 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6ab79ad387..d3b2cde0ce 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1072,9 +1072,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "chrono" -version = "0.4.30" +version = "0.4.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defd4e7873dbddba6c7c91e199c7fcb946abc4a6a4ac3195400bcfb01b5de877" +checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" dependencies = [ "android-tzdata", "iana-time-zone", @@ -7691,7 +7691,7 @@ dependencies = [ [[package]] name = "ya-client" version = "0.7.0" -source = "git+https://github.com/golemfactory/ya-client.git?rev=20590d867dff7bb0662b5fc2abc6b6417cc47fe5#20590d867dff7bb0662b5fc2abc6b6417cc47fe5" +source = "git+https://github.com/golemfactory/ya-client.git?rev=2c1bd58ed13c9195a2fd82e7632f9aa60c52c71e#2c1bd58ed13c9195a2fd82e7632f9aa60c52c71e" dependencies = [ "actix-codec", "awc", @@ -7715,7 +7715,7 @@ dependencies = [ [[package]] name = "ya-client-model" version = "0.5.0" -source = "git+https://github.com/golemfactory/ya-client.git?rev=20590d867dff7bb0662b5fc2abc6b6417cc47fe5#20590d867dff7bb0662b5fc2abc6b6417cc47fe5" +source = "git+https://github.com/golemfactory/ya-client.git?rev=2c1bd58ed13c9195a2fd82e7632f9aa60c52c71e#2c1bd58ed13c9195a2fd82e7632f9aa60c52c71e" dependencies = [ "bigdecimal 0.2.2", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 94fe8cba88..9c4ccae2d4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -270,8 +270,8 @@ ya-sb-util = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = #ya-sb-util = { path = "../ya-service-bus/crates/util" } ## CLIENT -ya-client = { git = "https://github.com/golemfactory/ya-client.git", rev = "20590d867dff7bb0662b5fc2abc6b6417cc47fe5" } -ya-client-model = { git = "https://github.com/golemfactory/ya-client.git", rev = "20590d867dff7bb0662b5fc2abc6b6417cc47fe5" } +ya-client = { git = "https://github.com/golemfactory/ya-client.git", rev = "2c1bd58ed13c9195a2fd82e7632f9aa60c52c71e" } +ya-client-model = { git = "https://github.com/golemfactory/ya-client.git", rev = "2c1bd58ed13c9195a2fd82e7632f9aa60c52c71e" } ## RELAY and networking stack ya-relay-stack = { git = "https://github.com/golemfactory/ya-relay.git", rev = "c92a75b0cf062fcc9dbb3ea2a034d913e5fad8e5" } diff --git a/core/model/src/driver.rs b/core/model/src/driver.rs index a2f25ccbdc..d504688ab1 100644 --- a/core/model/src/driver.rs +++ b/core/model/src/driver.rs @@ -4,7 +4,7 @@ use chrono::{DateTime, Utc}; use serde::{Deserialize, Serialize}; use std::fmt::Display; use std::time::Duration; -use ya_client_model::payment::{Allocation, Payment}; +use ya_client_model::payment::{Allocation, DriverStatusProperty, Payment}; use ya_service_bus::RpcMessage; pub fn driver_bus_id(driver_name: T) -> String { @@ -522,6 +522,18 @@ impl RpcMessage for VerifySignature { type Error = GenericError; } +// ********************* STATUS ******************************** +#[derive(Clone, Debug, Serialize, Deserialize)] +pub struct DriverStatus { + pub network: Option, +} + +impl RpcMessage for DriverStatus { + const ID: &'static str = "DriverStatus"; + type Item = Vec; + type Error = GenericError; +} + // ************************* SHUT DOWN ************************* #[derive(Clone, Debug, Serialize, Deserialize)] diff --git a/core/model/src/payment.rs b/core/model/src/payment.rs index b48dbae434..76934779ad 100644 --- a/core/model/src/payment.rs +++ b/core/model/src/payment.rs @@ -144,7 +144,7 @@ pub mod local { #[derive(Clone, Debug, Serialize, Deserialize, thiserror::Error)] #[error("")] - pub struct NoError {} // This is needed because () doesn't implement Display + pub enum NoError {} // This is needed because () doesn't implement Display #[derive(Clone, Debug, Serialize, Deserialize)] pub struct RegisterDriver { @@ -413,6 +413,27 @@ pub mod local { type Error = NoError; } + // ********************* STATUS ******************************** + #[derive(Clone, Debug, Serialize, Deserialize, thiserror::Error)] + pub enum PaymentDriverStatusError { + #[error("Requested driver not registered")] + NoDriver, + #[error("Internal error: {0}")] + Internal(String), + } + + #[derive(Clone, Debug, Serialize, Deserialize)] + pub struct PaymentDriverStatus { + pub driver: Option, + pub network: Option, + } + + impl RpcMessage for PaymentDriverStatus { + const ID: &'static str = "PaymentDriverStatus"; + type Item = Vec; + type Error = PaymentDriverStatusError; + } + #[derive(Clone, Debug, Serialize, Deserialize)] pub struct ShutDown { pub timeout: Duration, diff --git a/core/payment-driver/base/src/bus.rs b/core/payment-driver/base/src/bus.rs index c6cb111bf4..256cc5a909 100644 --- a/core/payment-driver/base/src/bus.rs +++ b/core/payment-driver/base/src/bus.rs @@ -78,6 +78,9 @@ pub async fn bind_service( .bind_with_processor( move |db, dr, c, m| async move { dr.verify_signature(db, c, m).await } ) + .bind_with_processor( + move |db, dr, c, m| async move { dr.status(db, c, m).await } + ) .bind_with_processor( move |db, dr, c, m| async move { dr.shut_down(db, c, m).await } ); diff --git a/core/payment-driver/base/src/driver.rs b/core/payment-driver/base/src/driver.rs index ceb9ff7207..4072f79ff5 100644 --- a/core/payment-driver/base/src/driver.rs +++ b/core/payment-driver/base/src/driver.rs @@ -6,6 +6,7 @@ use ethsign::Signature; use std::collections::HashMap; use std::convert::TryInto; +use ya_client_model::payment::DriverStatusProperty; // Workspace uses @@ -133,6 +134,15 @@ pub trait PaymentDriver { Ok(pub_key.address() == &msg.payment.payer_id.into_array()) } + async fn status( + &self, + _db: DbExecutor, + _caller: String, + _msg: DriverStatus, + ) -> Result, GenericError> { + Ok(Vec::default()) + } + async fn shut_down( &self, db: DbExecutor, diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index c6cf75b608..cf64501118 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -14,6 +14,7 @@ use std::str::FromStr; use tokio::sync::mpsc::Receiver; use tokio::sync::Mutex; use uuid::Uuid; +use ya_client_model::payment::DriverStatusProperty; // Workspace uses use ya_payment_driver::{ @@ -402,6 +403,60 @@ impl PaymentDriver for Erc20NextDriver { Ok(msg.amount <= account_balance - total_allocated_amount) } + async fn status( + &self, + _db: DbExecutor, + _caller: String, + msg: DriverStatus, + ) -> Result, GenericError> { + use erc20_payment_lib::runtime::StatusProperty as LibStatusProperty; + + // Map chain-id to network + let chain_id_to_net = |id: i64| { + self.payment_runtime + .setup + .chain_setup + .get(&id) + .unwrap() + .network + .clone() + }; + + // check if network matches the filter + let network_filter = |net_candidate: &str| { + msg.network + .as_ref() + .map(|net| net == net_candidate) + .unwrap_or(true) + }; + + Ok(self + .payment_runtime + .get_status() + .await + .into_iter() + .flat_map(|prop| match prop { + LibStatusProperty::InvalidChainId { chain_id } => { + Some(DriverStatusProperty::InvalidChainId { + driver: DRIVER_NAME.into(), + chain_id, + }) + } + LibStatusProperty::NoGas { + chain_id, + missing_gas, + } => { + let network = chain_id_to_net(chain_id); + network_filter(&network).then(|| DriverStatusProperty::InsufficientGas { + driver: DRIVER_NAME.into(), + network, + needed_gas_est: missing_gas.unwrap_or_default().to_string(), + }) + } + }) + .collect()) + } + async fn shut_down( &self, _db: DbExecutor, diff --git a/core/payment/src/api/payments.rs b/core/payment/src/api/payments.rs index c4562a94b7..56555391d0 100644 --- a/core/payment/src/api/payments.rs +++ b/core/payment/src/api/payments.rs @@ -2,10 +2,14 @@ use actix_web::web::{get, Data, Path, Query}; use actix_web::{HttpResponse, Scope}; use std::str::FromStr; +use ya_service_bus::typed::service; // Workspace uses use ya_client_model::payment::*; -use ya_core_model::payment::local::{DriverName, NetworkName}; +use ya_core_model::payment::local::{ + DriverName, NetworkName, PaymentDriverStatus, PaymentDriverStatusError, + BUS_ID as PAYMENT_BUS_ID, +}; use ya_persistence::executor::DbExecutor; use ya_service_api_web::middleware::Identity; @@ -16,6 +20,7 @@ use crate::utils::*; pub fn register_endpoints(scope: Scope) -> Scope { scope .route("/payments", get().to(get_payments)) + .route("/payments/status", get().to(payment_status)) .route("/payments/{payment_id}", get().to(get_payment)) } @@ -84,3 +89,29 @@ async fn get_payment( Err(e) => response::server_error(&e), } } + +async fn payment_status( + db: Data, + query: Query, + id: Identity, +) -> HttpResponse { + let result = service(PAYMENT_BUS_ID) + .call(PaymentDriverStatus { + driver: query.driver.clone(), + network: query.network.clone(), + }) + .await; + + let response = match result { + Ok(resp) => resp, + Err(e) => return response::server_error(&e), + }; + + let status_props = match response { + Ok(props) => props, + Err(PaymentDriverStatusError::NoDriver) => return response::bad_request(&"No such driver"), + Err(PaymentDriverStatusError::Internal(e)) => return response::server_error(&e), + }; + + response::ok(status_props) +} diff --git a/core/payment/src/service.rs b/core/payment/src/service.rs index e2b9c12e49..b8eae422b5 100644 --- a/core/payment/src/service.rs +++ b/core/payment/src/service.rs @@ -4,8 +4,9 @@ use futures::prelude::*; use metrics::counter; use std::collections::HashMap; use std::sync::Arc; +use ya_core_model::payment::local::BUS_ID as PAYMENT_BUS_ID; use ya_persistence::executor::DbExecutor; -use ya_service_bus::typed::ServiceBinder; +use ya_service_bus::typed::{service, ServiceBinder}; pub fn bind_service(db: &DbExecutor, processor: PaymentProcessor) { log::debug!("Binding payment service to service bus"); @@ -22,8 +23,11 @@ mod local { use crate::dao::*; use chrono::NaiveDateTime; use std::collections::BTreeMap; - use ya_client_model::payment::{Account, DocumentStatus, DriverDetails}; - use ya_core_model::payment::local::*; + use ya_client_model::payment::{Account, DocumentStatus, DriverDetails, DriverStatusProperty}; + use ya_core_model::{ + driver::{driver_bus_id, DriverStatus}, + payment::local::*, + }; use ya_persistence::types::Role; pub fn bind_service(db: &DbExecutor, processor: Arc>) { @@ -42,6 +46,7 @@ mod local { .bind_with_processor(validate_allocation) .bind_with_processor(release_allocations) .bind_with_processor(get_drivers) + .bind_with_processor(payment_driver_status) .bind_with_processor(shut_down); // Initialize counters to 0 value. Otherwise they won't appear on metrics endpoint @@ -326,6 +331,48 @@ mod local { Ok(processor.lock().await.get_drivers().await) } + async fn payment_driver_status( + db: DbExecutor, + processor: Arc>, + _caller: String, + msg: PaymentDriverStatus, + ) -> Result, PaymentDriverStatusError> { + let drivers = match &msg.driver { + Some(driver) => vec![driver.clone()], + None => { + // Unwrap is provably safe because NoError can't be instanciated + match service(PAYMENT_BUS_ID).call(GetDrivers {}).await { + Ok(drivers) => drivers, + Err(e) => return Err(PaymentDriverStatusError::Internal(e.to_string())), + } + .unwrap() + .into_iter() + .map(|(driver_name, _)| driver_name) + .collect() + } + }; + + let mut status_props = Vec::new(); + for driver in drivers { + let result = match service(driver_bus_id(driver)) + .call(DriverStatus { + network: msg.network.clone(), + }) + .await + { + Ok(result) => result, + Err(e) => return Err(PaymentDriverStatusError::NoDriver), + }; + + match result { + Ok(status) => status_props.extend(status), + Err(e) => return Err(PaymentDriverStatusError::Internal(e.to_string())), + } + } + + Ok(status_props) + } + async fn shut_down( db: DbExecutor, processor: Arc>, From 294fb63c58ecd40f799e4704939c5eec3595dc41 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 29 Sep 2023 10:36:23 +0200 Subject: [PATCH 089/123] payment status: show rounded balance by default --- core/payment/src/cli.rs | 33 ++++++++++++++++++++++++++++++--- 1 file changed, 30 insertions(+), 3 deletions(-) diff --git a/core/payment/src/cli.rs b/core/payment/src/cli.rs index a5c5b95469..5e0e03e1a2 100644 --- a/core/payment/src/cli.rs +++ b/core/payment/src/cli.rs @@ -42,6 +42,8 @@ pub enum PaymentCli { account: pay::AccountCli, #[structopt(long, help = "Display account balance for the given time period")] last: Option, + #[structopt(long, help = "Show exact balances instead of rounding")] + precise: bool, }, /// Enter layer 2 (deposit funds to layer 2 network) @@ -151,7 +153,11 @@ impl PaymentCli { init_account(account).await?; Ok(CommandOutput::NoOutput) } - PaymentCli::Status { account, last } => { + PaymentCli::Status { + account, + last, + precise, + } => { let address = resolve_address(account.address()).await?; let timestamp = last .map(|d| Utc::now() - chrono::Duration::seconds(d.as_secs() as i64)) @@ -171,10 +177,31 @@ impl PaymentCli { } let gas_info = match status.gas { - Some(details) => format!("{} {}", details.balance, details.currency_short_name), + Some(details) => { + if precise { + format!("{} {}", details.balance, details.currency_short_name) + } else { + format!("{:.4} {}", details.balance, details.currency_short_name) + } + } None => "N/A".to_string(), }; + let token_info = if precise { + format!("{} {}", status.amount, status.token) + } else { + format!("{:.4} {}", status.amount, status.token) + }; + + let driver_status_props = bus::service(pay::BUS_ID) + .call(pay::PaymentDriverStatus { + driver: Some(account.driver()), + network: Some(account.network()), + }) + .await??; + + log::info!("{:#?}", driver_status_props); + Ok(ResponseTable { columns: vec![ "platform".to_owned(), @@ -188,7 +215,7 @@ impl PaymentCli { values: vec![ serde_json::json! {[ format!("driver: {}", status.driver), - format!("{} {}", status.amount, status.token), + token_info, format!("{} {}", status.reserved, status.token), "accepted", format!("{} {}", status.incoming.accepted.total_amount, status.token), From 3a8a168dfd5fa58c1bfd6d0483b770e3176444d3 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 29 Sep 2023 10:36:27 +0200 Subject: [PATCH 090/123] payment cli: add driver-status subcommand and print driver info in status as well --- core/payment/src/cli.rs | 107 +++++++++++++++++++++++++++++++++++++++- 1 file changed, 105 insertions(+), 2 deletions(-) diff --git a/core/payment/src/cli.rs b/core/payment/src/cli.rs index 5e0e03e1a2..74f46ab54e 100644 --- a/core/payment/src/cli.rs +++ b/core/payment/src/cli.rs @@ -1,9 +1,11 @@ // External crates use bigdecimal::BigDecimal; use chrono::{DateTime, Utc}; +use serde_json::to_value; use std::str::FromStr; use std::time::UNIX_EPOCH; use structopt::*; +use ya_client_model::payment::DriverStatusProperty; // Workspace uses use ya_core_model::{identity as id_api, payment::local as pay}; @@ -46,6 +48,12 @@ pub enum PaymentCli { precise: bool, }, + /// Display status of the payment driver + DriverStatus { + #[structopt(flatten)] + account: pay::AccountCli, + }, + /// Enter layer 2 (deposit funds to layer 2 network) Enter { #[structopt(flatten)] @@ -153,6 +161,59 @@ impl PaymentCli { init_account(account).await?; Ok(CommandOutput::NoOutput) } + PaymentCli::DriverStatus { account } => { + let driver_status_props = bus::service(pay::BUS_ID) + .call(pay::PaymentDriverStatus { + driver: Some(account.driver()), + network: Some(account.network()), + }) + .await??; + + if ctx.json_output { + return CommandOutput::object(driver_status_props); + } + + let ok_msg = if driver_status_props.is_empty() { + "\nDriver Status: Ok" + } else { + "" + }; + + Ok(ResponseTable { + columns: vec!["issues".to_owned()], + values: driver_status_props + .into_iter() + .map(|prop| match prop { + DriverStatusProperty::CantSign { address, .. } => { + format!("Can't sign {address}") + } + DriverStatusProperty::InsufficientGas { needed_gas_est, .. } => { + format!("Insufficient gas (need est. {needed_gas_est})") + } + DriverStatusProperty::InsufficientToken { + needed_token_est, .. + } => { + format!("Insufficient token (need est. {needed_token_est})") + } + DriverStatusProperty::InvalidChainId { chain_id, .. } => { + format!("Invalid Chain-Id ({chain_id})") + } + DriverStatusProperty::RpcError { network, .. } => { + format!("Unreliable {network} RPC endpoints") + } + DriverStatusProperty::TxStuck { network, .. } => { + format!("Tx stuck on {network}") + } + }) + .map(|s| to_value(vec![to_value(s).unwrap()]).unwrap()) + .collect::>(), + } + .with_header(format!( + "Status of the {} payment driver{}", + account.driver(), + ok_msg + ))) + } PaymentCli::Status { account, last, @@ -200,7 +261,49 @@ impl PaymentCli { }) .await??; - log::info!("{:#?}", driver_status_props); + let mut header = format!("\nStatus for account: {}\n", address); + if driver_status_props.is_empty() { + header.push_str("Payment Driver status: OK\n"); + } else { + header.push_str("\nPayment Driver status:\n"); + for prop in driver_status_props { + use DriverStatusProperty::*; + + let network = match &prop { + CantSign { network, .. } + | InsufficientGas { network, .. } + | InsufficientToken { network, .. } + | RpcError { network, .. } + | TxStuck { network, .. } => network.clone(), + InvalidChainId { .. } => "unknown network".to_string(), + }; + + header.push_str(&format!("{network}) ")); + + match prop { + CantSign { address, .. } => { + header.push_str(&format!("Outsanding payments for address {address} cannot be signed. Is the relevant identity locked?\n")); + } + InsufficientGas { needed_gas_est, .. } => { + header.push_str(&format!("Not enough gas to send any more transactions. To send out all scheduled transactions approximately {} is needed.\n", needed_gas_est)); + } + InsufficientToken { + needed_token_est, .. + } => { + header.push_str(&format!("Not enough token to send any more transactions. To send out all scheduled transactions approximately {}{} is needed.\n", needed_token_est, status.token)); + } + InvalidChainId { chain_id, .. } => { + header.push_str(&format!("Scheduled transactions on chain with id = {chain_id}, but no such chain is configured.\n")); + } + RpcError { network, .. } => { + header.push_str(&format!("RPC endpoints configured for {network} are unreliable. Consider changing them.\n")); + } + TxStuck { .. } => { + header.push_str(&format!("Sent transactions are stuck. Consider increasing max fee per gas.\n")); + } + } + } + } Ok(ResponseTable { columns: vec![ @@ -242,7 +345,7 @@ impl PaymentCli { ]}, ], } - .with_header(format!("\nStatus for account: {}\n", address))) + .with_header(header)) } PaymentCli::Accounts => { let accounts = bus::service(pay::BUS_ID) From 13a5f43dd89e7de3ea2abc45b7b46dcc2425252c Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 29 Sep 2023 10:36:33 +0200 Subject: [PATCH 091/123] =?UTF-8?q?erc20next:=20move=20chain-id=20?= =?UTF-8?q?=E2=86=92=20network=20mapping=20to=20erc20=5Fpayment=5Flib?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Cargo.lock | 2 +- Cargo.toml | 2 +- core/payment-driver/erc20next/src/driver.rs | 16 +++------------- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d3b2cde0ce..1c9bdd6229 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1869,7 +1869,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.1.9" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=ef91a37a66520ed16577081761f31efb9eea45b3#ef91a37a66520ed16577081761f31efb9eea45b3" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=a40df5dc90577db3843f38041b73331993eddfce#a40df5dc90577db3843f38041b73331993eddfce" dependencies = [ "actix-files", "actix-web", diff --git a/Cargo.toml b/Cargo.toml index 9c4ccae2d4..c9f23e8fab 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ path = "core/serv/src/main.rs" # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "ef91a37a66520ed16577081761f31efb9eea45b3" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "a40df5dc90577db3843f38041b73331993eddfce" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.1.9" } rand = "0.8.5" diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index cf64501118..1abeb28064 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -129,13 +129,11 @@ impl Erc20NextDriver { let chain_id = token_transfer.chain_id; let network_name = &self .payment_runtime - .setup - .chain_setup - .get(&chain_id) + .network_name(chain_id) .ok_or(GenericError::new(format!( "Missing configuration for chain_id {chain_id}" )))? - .network; + .to_string(); let networks = self.get_networks(); let network = networks.get(network_name).ok_or(GenericError::new(format!( @@ -412,15 +410,7 @@ impl PaymentDriver for Erc20NextDriver { use erc20_payment_lib::runtime::StatusProperty as LibStatusProperty; // Map chain-id to network - let chain_id_to_net = |id: i64| { - self.payment_runtime - .setup - .chain_setup - .get(&id) - .unwrap() - .network - .clone() - }; + let chain_id_to_net = |id: i64| self.payment_runtime.network_name(id).unwrap().to_string(); // check if network matches the filter let network_filter = |net_candidate: &str| { From b0cb3ee39f3094aa05385a40ac83e3ba70d00e4c Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 29 Sep 2023 11:00:57 +0200 Subject: [PATCH 092/123] golemsp: payment driver status in golemsp dashboard --- golem_cli/src/command/yagna.rs | 24 ++++++++++++++++ golem_cli/src/status.rs | 51 ++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) diff --git a/golem_cli/src/command/yagna.rs b/golem_cli/src/command/yagna.rs index c5d0dbda30..d238cb4906 100644 --- a/golem_cli/src/command/yagna.rs +++ b/golem_cli/src/command/yagna.rs @@ -7,6 +7,7 @@ use serde::{Deserialize, Serialize}; use std::collections::HashMap; use std::process::Stdio; use strum_macros::{Display, EnumString, EnumVariantNames, IntoStaticStr}; +use ya_client::model::payment::DriverStatusProperty; use crate::setup::RunConfig; use tokio::process::{Child, Command}; @@ -302,6 +303,29 @@ impl YagnaCommand { self.run().await } + pub async fn payment_driver_status( + mut self, + address: Option<&str>, + network: Option<&NetworkName>, + payment_driver: Option<&PaymentDriver>, + ) -> anyhow::Result> { + self.cmd.args(["--json", "payment", "driver-status"]); + if let Some(address) = address { + self.cmd.args(["--account", address]); + } + + if let Some(network) = network { + self.cmd.args(["--network", &network.to_string()]); + + if let Some(payment_driver) = payment_driver { + let payment_platform = payment_driver.platform(network)?; + self.cmd.args(["--driver", payment_platform.driver]); + } + } + + self.run().await + } + pub async fn payment_init( mut self, address: &str, diff --git a/golem_cli/src/status.rs b/golem_cli/src/status.rs index 45a8cf5559..0ca0b71dfc 100644 --- a/golem_cli/src/status.rs +++ b/golem_cli/src/status.rs @@ -7,6 +7,7 @@ use futures::prelude::*; use prettytable::{format, row, Table}; use strum::VariantNames; +use ya_client::model::payment::DriverStatusProperty; use ya_core_model::payment::local::{NetworkName, StatusResult}; use ya_core_model::NodeId; @@ -69,6 +70,8 @@ pub async fn run() -> Result { let (config, is_running) = future::try_join(cmd.ya_provider()?.get_config(), is_yagna_running()).await?; + let mut driver_ok = true; + let status = { let mut table = Table::new(); let format = format::FormatBuilder::new().padding(1, 1).build(); @@ -120,6 +123,51 @@ pub async fn run() -> Result { table.add_row(row!["VM", status]); } + if is_running { + let status_properties = cmd.yagna()?.payment_driver_status(None, None, None).await?; + + table.add_empty_row(); + + if status_properties.is_empty() { + table.add_row(row!["Driver", Style::new().fg(Colour::Green).paint("Ok")]); + } else { + driver_ok = false; + let msg = if status_properties.len() == 1 { + "1 Issue".to_string() + } else { + format!("{} Issues", status_properties.len()) + }; + + table.add_row(row!["Driver", Style::new().fg(Colour::Red).paint(&msg)]); + for prop in status_properties { + use DriverStatusProperty::*; + table.add_row(row![ + match &prop { + InsufficientGas { network, .. } + | InsufficientToken { network, .. } + | CantSign { network, .. } + | TxStuck { network, .. } + | RpcError { network, .. } => network.clone(), + InvalidChainId { .. } => "N/A".to_string(), + }, + match &prop { + InsufficientGas { .. } => "Insufficent Gas".to_string(), + InsufficientToken { .. } => "Insufficient Token".to_string(), + InvalidChainId { chain_id, .. } => + format!("Invalid Chain-Id {chain_id}"), + CantSign { address, .. } => format!( + "Can't Sign {}..{}", + &address[0..6], + &address[address.len() - 4..] + ), + TxStuck { .. } => "Tx Stuck".to_string(), + RpcError { .. } => "RPC Error".to_string(), + } + ]); + } + } + } + table }; let mut table = Table::new(); @@ -228,6 +276,9 @@ pub async fn run() -> Result { if let Some(msg) = kvm_status.problem() { println!("\n VM problem: {}", msg); } + if !driver_ok { + println!("\n Payment Driver issues detected, run yagna payment status for details"); + } Ok(0) } From 1f52ef5064e824290e1926e2753249d754272f14 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Mon, 9 Oct 2023 13:52:36 +0200 Subject: [PATCH 093/123] Goth supporting multipayments (#2825) Goth supporting multipayment transactions --- Cargo.lock | 4 +- Cargo.toml | 2 +- core/model/src/driver.rs | 4 +- core/payment-driver/erc20next/src/driver.rs | 36 +- .../erc20next/src/driver/api.rs | 20 - core/payment-driver/erc20next/src/service.rs | 26 +- core/payment/src/cli.rs | 2 +- core/payment/src/processor.rs | 6 +- core/payment/src/service.rs | 1 + goth_tests/poetry.lock | 4476 ++++++++--------- goth_tests/pyproject.toml | 2 +- 11 files changed, 2310 insertions(+), 2269 deletions(-) delete mode 100644 core/payment-driver/erc20next/src/driver/api.rs diff --git a/Cargo.lock b/Cargo.lock index 1c9bdd6229..dbaa8c413e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1868,8 +1868,8 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" -version = "0.1.9" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=a40df5dc90577db3843f38041b73331993eddfce#a40df5dc90577db3843f38041b73331993eddfce" +version = "0.2.0" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=560ae6c9109ae36a4667586d3d5dab0688500098#560ae6c9109ae36a4667586d3d5dab0688500098" dependencies = [ "actix-files", "actix-web", diff --git a/Cargo.toml b/Cargo.toml index c9f23e8fab..705df1492f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ path = "core/serv/src/main.rs" # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "a40df5dc90577db3843f38041b73331993eddfce" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "560ae6c9109ae36a4667586d3d5dab0688500098" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.1.9" } rand = "0.8.5" diff --git a/core/model/src/driver.rs b/core/model/src/driver.rs index d504688ab1..b3d690c96f 100644 --- a/core/model/src/driver.rs +++ b/core/model/src/driver.rs @@ -166,13 +166,15 @@ impl RpcMessage for GetTransactionBalance { pub struct VerifyPayment { pub confirmation: PaymentConfirmation, pub platform: String, + pub details: Payment, } impl VerifyPayment { - pub fn new(confirmation: PaymentConfirmation, platform: String) -> Self { + pub fn new(confirmation: PaymentConfirmation, platform: String, details: Payment) -> Self { Self { confirmation, platform, + details, } } } diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index 1abeb28064..2d022502eb 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -14,6 +14,7 @@ use std::str::FromStr; use tokio::sync::mpsc::Receiver; use tokio::sync::Mutex; use uuid::Uuid; +use web3::types::H256; use ya_client_model::payment::DriverStatusProperty; // Workspace uses @@ -32,9 +33,9 @@ use ya_payment_driver::{ // Local uses use crate::erc20::utils::{big_dec_to_u256, u256_to_big_dec}; use crate::network::platform_to_currency; +use crate::{driver::PaymentDetails, network}; use crate::{network::SUPPORTED_NETWORKS, DRIVER_NAME, RINKEBY_NETWORK}; -mod api; mod cli; lazy_static::lazy_static! { @@ -363,7 +364,38 @@ impl PaymentDriver for Erc20NextDriver { _caller: String, msg: VerifyPayment, ) -> Result { - api::verify_payment(msg).await + log::debug!("verify_payment: {:?}", msg); + let (network, _) = network::platform_to_network_token(msg.platform())?; + let tx_hash = format!("0x{}", hex::encode(msg.confirmation().confirmation)); + log::info!("Verifying transaction: {} on network {}", tx_hash, network); + let res = self + .payment_runtime + .verify_transaction( + network as i64, + H256::from_str(&tx_hash) + .map_err(|_| GenericError::new("Hash cannot be converted to string"))?, + H160::from_str(&msg.details.payer_addr) + .map_err(|_| GenericError::new("payer_addr"))?, + H160::from_str(&msg.details.payee_addr) + .map_err(|_| GenericError::new("payer_addr"))?, + big_dec_to_u256(&msg.details.amount)?, + ) + .await + .map_err(|err| GenericError::new(format!("Error verifying transaction: {}", err)))?; + + if res.verified { + Ok(PaymentDetails { + recipient: msg.details.payee_addr.clone(), + sender: msg.details.payer_addr.clone(), + amount: msg.details.amount.clone(), + date: None, + }) + } else { + Err(GenericError::new(format!( + "Transaction not found: {}", + tx_hash + ))) + } } async fn validate_allocation( diff --git a/core/payment-driver/erc20next/src/driver/api.rs b/core/payment-driver/erc20next/src/driver/api.rs deleted file mode 100644 index e5850ffe25..0000000000 --- a/core/payment-driver/erc20next/src/driver/api.rs +++ /dev/null @@ -1,20 +0,0 @@ -/* - Driver helper for handling messages from payment_api. -*/ -// Extrnal crates -// use lazy_static::lazy_static; -// use num_bigint::BigInt; - -// Workspace uses -use ya_payment_driver::model::{GenericError, VerifyPayment}; - -// Local uses -use crate::{driver::PaymentDetails, erc20::wallet, network}; - -pub async fn verify_payment(msg: VerifyPayment) -> Result { - log::debug!("verify_payment: {:?}", msg); - let (network, _) = network::platform_to_network_token(msg.platform())?; - let tx_hash = format!("0x{}", hex::encode(msg.confirmation().confirmation)); - log::info!("Verifying transaction: {}", tx_hash); - wallet::verify_tx(&tx_hash, network).await -} diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index 208ab9800c..3b68f7faa2 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -5,7 +5,7 @@ use std::{env, path::PathBuf, str::FromStr}; // External crates use erc20_payment_lib::config; -use erc20_payment_lib::config::AdditionalOptions; +use erc20_payment_lib::config::{AdditionalOptions, MultiContractSettings}; use erc20_payment_lib::misc::load_private_keys; use erc20_payment_lib::runtime::PaymentRuntime; use ethereum_types::H160; @@ -44,6 +44,7 @@ impl Erc20NextService { skip_multi_contract_check: false, contract_use_direct_method: false, contract_use_unpacked_method: false, + use_transfer_for_single_payment: false, }; log::warn!("Loading config"); @@ -59,6 +60,7 @@ impl Erc20NextService { let priority_fee_env = format!("{prefix}_PRIORITY_FEE"); let max_fee_per_gas_env = format!("{prefix}_MAX_FEE_PER_GAS"); let token_addr_env = format!("{prefix}_{symbol}_CONTRACT_ADDRESS"); + let multi_payment_addr_env = format!("{prefix}_MULTI_PAYMENT_CONTRACT_ADDRESS"); let confirmations = format!("ERC20_{prefix}_REQUIRED_CONFIRMATIONS"); if let Ok(addr) = env::var(&rpc_env) { @@ -76,7 +78,7 @@ impl Erc20NextService { chain.priority_fee = fee; } Err(e) => log::warn!( - "Valiue {fee} for {priority_fee_env} is not a valid devimal: {e}" + "Value {fee} for {priority_fee_env} is not a valid decimal: {e}" ), } } @@ -117,6 +119,26 @@ impl Erc20NextService { } }; } + if let Ok(multi_payment_addr) = env::var(&multi_payment_addr_env) { + match H160::from_str(&multi_payment_addr) { + Ok(parsed) => { + log::info!( + "{network} multi payment contract address set to {multi_payment_addr}" + ); + chain.multi_contract = Some(MultiContractSettings { + address: parsed, + max_at_once: 10, + }) + } + Err(e) => { + log::warn!( + "Value {multi_payment_addr} for {multi_payment_addr_env} is not valid H160 address: {e}" + ); + } + }; + } else { + log::debug!("{multi_payment_addr_env} not set"); + } } log::warn!("Starting payment engine: {:#?}", config); diff --git a/core/payment/src/cli.rs b/core/payment/src/cli.rs index 74f46ab54e..faa46de68a 100644 --- a/core/payment/src/cli.rs +++ b/core/payment/src/cli.rs @@ -299,7 +299,7 @@ impl PaymentCli { header.push_str(&format!("RPC endpoints configured for {network} are unreliable. Consider changing them.\n")); } TxStuck { .. } => { - header.push_str(&format!("Sent transactions are stuck. Consider increasing max fee per gas.\n")); + header.push_str("Sent transactions are stuck. Consider increasing max fee per gas.\n"); } } } diff --git a/core/payment/src/processor.rs b/core/payment/src/processor.rs index 1cd9c3dc21..2c45854f66 100644 --- a/core/payment/src/processor.rs +++ b/core/payment/src/processor.rs @@ -505,7 +505,11 @@ impl PaymentProcessor { Err(e) => return Err(VerifyPaymentError::ConfirmationEncoding), }; let details: PaymentDetails = driver_endpoint(&driver) - .send(driver::VerifyPayment::new(confirmation, platform.clone())) + .send(driver::VerifyPayment::new( + confirmation, + platform.clone(), + payment.clone(), + )) .await??; // Verify if amount declared in message matches actual amount transferred on blockchain diff --git a/core/payment/src/service.rs b/core/payment/src/service.rs index b8eae422b5..c5022cb747 100644 --- a/core/payment/src/service.rs +++ b/core/payment/src/service.rs @@ -340,6 +340,7 @@ mod local { let drivers = match &msg.driver { Some(driver) => vec![driver.clone()], None => { + #[allow(clippy::iter_kv_map)] // Unwrap is provably safe because NoError can't be instanciated match service(PAYMENT_BUS_ID).call(GetDrivers {}).await { Ok(drivers) => drivers, diff --git a/goth_tests/poetry.lock b/goth_tests/poetry.lock index cc4a124212..13a0707f60 100644 --- a/goth_tests/poetry.lock +++ b/goth_tests/poetry.lock @@ -1,2238 +1,2238 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. - -[[package]] -name = "aiohttp" -version = "3.8.5" -description = "Async http client/server framework (asyncio)" -optional = false -python-versions = ">=3.6" -files = [ - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, - {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, - {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, - {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, - {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, - {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, - {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, - {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, - {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, - {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, - {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, - {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, - {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, - {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, - {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, - {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, - {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, - {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, - {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, - {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, - {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, - {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, - {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, - {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, - {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, - {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, - {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, - {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, -] - -[package.dependencies] -aiosignal = ">=1.1.2" -async-timeout = ">=4.0.0a3,<5.0" -attrs = ">=17.3.0" -charset-normalizer = ">=2.0,<4.0" -frozenlist = ">=1.1.1" -multidict = ">=4.5,<7.0" -yarl = ">=1.0,<2.0" - -[package.extras] -speedups = ["Brotli", "aiodns", "cchardet"] - -[[package]] -name = "aiosignal" -version = "1.3.1" -description = "aiosignal: a list of registered asynchronous callbacks" -optional = false -python-versions = ">=3.7" -files = [ - {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, - {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, -] - -[package.dependencies] -frozenlist = ">=1.1.0" - -[[package]] -name = "ansicolors" -version = "1.1.8" -description = "ANSI colors for Python" -optional = false -python-versions = "*" -files = [ - {file = "ansicolors-1.1.8-py2.py3-none-any.whl", hash = "sha256:00d2dde5a675579325902536738dd27e4fac1fd68f773fe36c21044eb559e187"}, - {file = "ansicolors-1.1.8.zip", hash = "sha256:99f94f5e3348a0bcd43c82e5fc4414013ccc19d70bd939ad71e0133ce9c372e0"}, -] - -[[package]] -name = "appdirs" -version = "1.4.4" -description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -optional = false -python-versions = "*" -files = [ - {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, - {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, -] - -[[package]] -name = "asgiref" -version = "3.3.4" -description = "ASGI specs, helper code, and adapters" -optional = false -python-versions = ">=3.6" -files = [ - {file = "asgiref-3.3.4-py3-none-any.whl", hash = "sha256:92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee"}, - {file = "asgiref-3.3.4.tar.gz", hash = "sha256:d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78"}, -] - -[package.extras] -tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] - -[[package]] -name = "async-timeout" -version = "4.0.3" -description = "Timeout context manager for asyncio programs" -optional = false -python-versions = ">=3.7" -files = [ - {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, - {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, -] - -[[package]] -name = "attrs" -version = "23.1.0" -description = "Classes Without Boilerplate" -optional = false -python-versions = ">=3.7" -files = [ - {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, - {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, -] - -[package.extras] -cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] -dev = ["attrs[docs,tests]", "pre-commit"] -docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] -tests = ["attrs[tests-no-zope]", "zope-interface"] -tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] - -[[package]] -name = "bcrypt" -version = "4.0.1" -description = "Modern password hashing for your software and your servers" -optional = false -python-versions = ">=3.6" -files = [ - {file = "bcrypt-4.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b1023030aec778185a6c16cf70f359cbb6e0c289fd564a7cfa29e727a1c38f8f"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:08d2947c490093a11416df18043c27abe3921558d2c03e2076ccb28a116cb6d0"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eaa47d4661c326bfc9d08d16debbc4edf78778e6aaba29c1bc7ce67214d4410"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae88eca3024bb34bb3430f964beab71226e761f51b912de5133470b649d82344"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:a522427293d77e1c29e303fc282e2d71864579527a04ddcfda6d4f8396c6c36a"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fbdaec13c5105f0c4e5c52614d04f0bca5f5af007910daa8b6b12095edaa67b3"}, - {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ca3204d00d3cb2dfed07f2d74a25f12fc12f73e606fcaa6975d1f7ae69cacbb2"}, - {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:089098effa1bc35dc055366740a067a2fc76987e8ec75349eb9484061c54f535"}, - {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e9a51bbfe7e9802b5f3508687758b564069ba937748ad7b9e890086290d2f79e"}, - {file = "bcrypt-4.0.1-cp36-abi3-win32.whl", hash = "sha256:2caffdae059e06ac23fce178d31b4a702f2a3264c20bfb5ff541b338194d8fab"}, - {file = "bcrypt-4.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf4fa8b2ca74381bb5442c089350f09a3f17797829d958fad058d6e44d9eb83c"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:67a97e1c405b24f19d08890e7ae0c4f7ce1e56a712a016746c8b2d7732d65d4b"}, - {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b3b85202d95dd568efcb35b53936c5e3b3600c7cdcc6115ba461df3a8e89f38d"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbb03eec97496166b704ed663a53680ab57c5084b2fc98ef23291987b525cb7d"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:5ad4d32a28b80c5fa6671ccfb43676e8c1cc232887759d1cd7b6f56ea4355215"}, - {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b57adba8a1444faf784394de3436233728a1ecaeb6e07e8c22c8848f179b893c"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b2cea8a9ed3d55b4491887ceadb0106acf7c6387699fca771af56b1cdeeda"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:2b3ac11cf45161628f1f3733263e63194f22664bf4d0c0f3ab34099c02134665"}, - {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3100851841186c25f127731b9fa11909ab7b1df6fc4b9f8353f4f1fd952fbf71"}, - {file = "bcrypt-4.0.1.tar.gz", hash = "sha256:27d375903ac8261cfe4047f6709d16f7d18d39b1ec92aaf72af989552a650ebd"}, -] - -[package.extras] -tests = ["pytest (>=3.2.1,!=3.3.0)"] -typecheck = ["mypy"] - -[[package]] -name = "black" -version = "21.7b0" -description = "The uncompromising code formatter." -optional = false -python-versions = ">=3.6.2" -files = [ - {file = "black-21.7b0-py3-none-any.whl", hash = "sha256:1c7aa6ada8ee864db745b22790a32f94b2795c253a75d6d9b5e439ff10d23116"}, - {file = "black-21.7b0.tar.gz", hash = "sha256:c8373c6491de9362e39271630b65b964607bc5c79c83783547d76c839b3aa219"}, -] - -[package.dependencies] -appdirs = "*" -click = ">=7.1.2" -mypy-extensions = ">=0.4.3" -pathspec = ">=0.8.1,<1" -regex = ">=2020.1.8" -tomli = ">=0.2.6,<2.0.0" - -[package.extras] -colorama = ["colorama (>=0.4.3)"] -d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] -python2 = ["typed-ast (>=1.4.2)"] -uvloop = ["uvloop (>=0.15.2)"] - -[[package]] -name = "blinker" -version = "1.4" -description = "Fast, simple object-to-object and broadcast signaling" -optional = false -python-versions = "*" -files = [ - {file = "blinker-1.4.tar.gz", hash = "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"}, -] - -[[package]] -name = "brotli" -version = "1.0.9" -description = "Python bindings for the Brotli compression library" -optional = false -python-versions = "*" -files = [ - {file = "Brotli-1.0.9-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:268fe94547ba25b58ebc724680609c8ee3e5a843202e9a381f6f9c5e8bdb5c70"}, - {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:c2415d9d082152460f2bd4e382a1e85aed233abc92db5a3880da2257dc7daf7b"}, - {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5913a1177fc36e30fcf6dc868ce23b0453952c78c04c266d3149b3d39e1410d6"}, - {file = "Brotli-1.0.9-cp27-cp27m-win32.whl", hash = "sha256:afde17ae04d90fbe53afb628f7f2d4ca022797aa093e809de5c3cf276f61bbfa"}, - {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7cb81373984cc0e4682f31bc3d6be9026006d96eecd07ea49aafb06897746452"}, - {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:db844eb158a87ccab83e868a762ea8024ae27337fc7ddcbfcddd157f841fdfe7"}, - {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9744a863b489c79a73aba014df554b0e7a0fc44ef3f8a0ef2a52919c7d155031"}, - {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a72661af47119a80d82fa583b554095308d6a4c356b2a554fdc2799bc19f2a43"}, - {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ee83d3e3a024a9618e5be64648d6d11c37047ac48adff25f12fa4226cf23d1c"}, - {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:19598ecddd8a212aedb1ffa15763dd52a388518c4550e615aed88dc3753c0f0c"}, - {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:44bb8ff420c1d19d91d79d8c3574b8954288bdff0273bf788954064d260d7ab0"}, - {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e23281b9a08ec338469268f98f194658abfb13658ee98e2b7f85ee9dd06caa91"}, - {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3496fc835370da351d37cada4cf744039616a6db7d13c430035e901443a34daa"}, - {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83bb06a0192cccf1eb8d0a28672a1b79c74c3a8a5f2619625aeb6f28b3a82bb"}, - {file = "Brotli-1.0.9-cp310-cp310-win32.whl", hash = "sha256:26d168aac4aaec9a4394221240e8a5436b5634adc3cd1cdf637f6645cecbf181"}, - {file = "Brotli-1.0.9-cp310-cp310-win_amd64.whl", hash = "sha256:622a231b08899c864eb87e85f81c75e7b9ce05b001e59bbfbf43d4a71f5f32b2"}, - {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cc0283a406774f465fb45ec7efb66857c09ffefbe49ec20b7882eff6d3c86d3a"}, - {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:11d3283d89af7033236fa4e73ec2cbe743d4f6a81d41bd234f24bf63dde979df"}, - {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c1306004d49b84bd0c4f90457c6f57ad109f5cc6067a9664e12b7b79a9948ad"}, - {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1375b5d17d6145c798661b67e4ae9d5496920d9265e2f00f1c2c0b5ae91fbde"}, - {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cab1b5964b39607a66adbba01f1c12df2e55ac36c81ec6ed44f2fca44178bf1a"}, - {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ed6a5b3d23ecc00ea02e1ed8e0ff9a08f4fc87a1f58a2530e71c0f48adf882f"}, - {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cb02ed34557afde2d2da68194d12f5719ee96cfb2eacc886352cb73e3808fc5d"}, - {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b3523f51818e8f16599613edddb1ff924eeb4b53ab7e7197f85cbc321cdca32f"}, - {file = "Brotli-1.0.9-cp311-cp311-win32.whl", hash = "sha256:ba72d37e2a924717990f4d7482e8ac88e2ef43fb95491eb6e0d124d77d2a150d"}, - {file = "Brotli-1.0.9-cp311-cp311-win_amd64.whl", hash = "sha256:3ffaadcaeafe9d30a7e4e1e97ad727e4f5610b9fa2f7551998471e3736738679"}, - {file = "Brotli-1.0.9-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:c83aa123d56f2e060644427a882a36b3c12db93727ad7a7b9efd7d7f3e9cc2c4"}, - {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:6b2ae9f5f67f89aade1fab0f7fd8f2832501311c363a21579d02defa844d9296"}, - {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:68715970f16b6e92c574c30747c95cf8cf62804569647386ff032195dc89a430"}, - {file = "Brotli-1.0.9-cp35-cp35m-win32.whl", hash = "sha256:defed7ea5f218a9f2336301e6fd379f55c655bea65ba2476346340a0ce6f74a1"}, - {file = "Brotli-1.0.9-cp35-cp35m-win_amd64.whl", hash = "sha256:88c63a1b55f352b02c6ffd24b15ead9fc0e8bf781dbe070213039324922a2eea"}, - {file = "Brotli-1.0.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:503fa6af7da9f4b5780bb7e4cbe0c639b010f12be85d02c99452825dd0feef3f"}, - {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:40d15c79f42e0a2c72892bf407979febd9cf91f36f495ffb333d1d04cebb34e4"}, - {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:93130612b837103e15ac3f9cbacb4613f9e348b58b3aad53721d92e57f96d46a"}, - {file = "Brotli-1.0.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87fdccbb6bb589095f413b1e05734ba492c962b4a45a13ff3408fa44ffe6479b"}, - {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:6d847b14f7ea89f6ad3c9e3901d1bc4835f6b390a9c71df999b0162d9bb1e20f"}, - {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:495ba7e49c2db22b046a53b469bbecea802efce200dffb69b93dd47397edc9b6"}, - {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:4688c1e42968ba52e57d8670ad2306fe92e0169c6f3af0089be75bbac0c64a3b"}, - {file = "Brotli-1.0.9-cp36-cp36m-win32.whl", hash = "sha256:61a7ee1f13ab913897dac7da44a73c6d44d48a4adff42a5701e3239791c96e14"}, - {file = "Brotli-1.0.9-cp36-cp36m-win_amd64.whl", hash = "sha256:1c48472a6ba3b113452355b9af0a60da5c2ae60477f8feda8346f8fd48e3e87c"}, - {file = "Brotli-1.0.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b78a24b5fd13c03ee2b7b86290ed20efdc95da75a3557cc06811764d5ad1126"}, - {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:9d12cf2851759b8de8ca5fde36a59c08210a97ffca0eb94c532ce7b17c6a3d1d"}, - {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6c772d6c0a79ac0f414a9f8947cc407e119b8598de7621f39cacadae3cf57d12"}, - {file = "Brotli-1.0.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29d1d350178e5225397e28ea1b7aca3648fcbab546d20e7475805437bfb0a130"}, - {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7bbff90b63328013e1e8cb50650ae0b9bac54ffb4be6104378490193cd60f85a"}, - {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ec1947eabbaf8e0531e8e899fc1d9876c179fc518989461f5d24e2223395a9e3"}, - {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12effe280b8ebfd389022aa65114e30407540ccb89b177d3fbc9a4f177c4bd5d"}, - {file = "Brotli-1.0.9-cp37-cp37m-win32.whl", hash = "sha256:f909bbbc433048b499cb9db9e713b5d8d949e8c109a2a548502fb9aa8630f0b1"}, - {file = "Brotli-1.0.9-cp37-cp37m-win_amd64.whl", hash = "sha256:97f715cf371b16ac88b8c19da00029804e20e25f30d80203417255d239f228b5"}, - {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e16eb9541f3dd1a3e92b89005e37b1257b157b7256df0e36bd7b33b50be73bcb"}, - {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:160c78292e98d21e73a4cc7f76a234390e516afcd982fa17e1422f7c6a9ce9c8"}, - {file = "Brotli-1.0.9-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b663f1e02de5d0573610756398e44c130add0eb9a3fc912a09665332942a2efb"}, - {file = "Brotli-1.0.9-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5b6ef7d9f9c38292df3690fe3e302b5b530999fa90014853dcd0d6902fb59f26"}, - {file = "Brotli-1.0.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a674ac10e0a87b683f4fa2b6fa41090edfd686a6524bd8dedbd6138b309175c"}, - {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e2d9e1cbc1b25e22000328702b014227737756f4b5bf5c485ac1d8091ada078b"}, - {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b336c5e9cf03c7be40c47b5fd694c43c9f1358a80ba384a21969e0b4e66a9b17"}, - {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:85f7912459c67eaab2fb854ed2bc1cc25772b300545fe7ed2dc03954da638649"}, - {file = "Brotli-1.0.9-cp38-cp38-win32.whl", hash = "sha256:35a3edbe18e876e596553c4007a087f8bcfd538f19bc116917b3c7522fca0429"}, - {file = "Brotli-1.0.9-cp38-cp38-win_amd64.whl", hash = "sha256:269a5743a393c65db46a7bb982644c67ecba4b8d91b392403ad8a861ba6f495f"}, - {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2aad0e0baa04517741c9bb5b07586c642302e5fb3e75319cb62087bd0995ab19"}, - {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5cb1e18167792d7d21e21365d7650b72d5081ed476123ff7b8cac7f45189c0c7"}, - {file = "Brotli-1.0.9-cp39-cp39-manylinux1_i686.whl", hash = "sha256:16d528a45c2e1909c2798f27f7bf0a3feec1dc9e50948e738b961618e38b6a7b"}, - {file = "Brotli-1.0.9-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:56d027eace784738457437df7331965473f2c0da2c70e1a1f6fdbae5402e0389"}, - {file = "Brotli-1.0.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bf919756d25e4114ace16a8ce91eb340eb57a08e2c6950c3cebcbe3dff2a5e7"}, - {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e4c4e92c14a57c9bd4cb4be678c25369bf7a092d55fd0866f759e425b9660806"}, - {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e48f4234f2469ed012a98f4b7874e7f7e173c167bed4934912a29e03167cf6b1"}, - {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ed4c92a0665002ff8ea852353aeb60d9141eb04109e88928026d3c8a9e5433c"}, - {file = "Brotli-1.0.9-cp39-cp39-win32.whl", hash = "sha256:cfc391f4429ee0a9370aa93d812a52e1fee0f37a81861f4fdd1f4fb28e8547c3"}, - {file = "Brotli-1.0.9-cp39-cp39-win_amd64.whl", hash = "sha256:854c33dad5ba0fbd6ab69185fec8dab89e13cda6b7d191ba111987df74f38761"}, - {file = "Brotli-1.0.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9749a124280a0ada4187a6cfd1ffd35c350fb3af79c706589d98e088c5044267"}, - {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:73fd30d4ce0ea48010564ccee1a26bfe39323fde05cb34b5863455629db61dc7"}, - {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02177603aaca36e1fd21b091cb742bb3b305a569e2402f1ca38af471777fb019"}, - {file = "Brotli-1.0.9-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:76ffebb907bec09ff511bb3acc077695e2c32bc2142819491579a695f77ffd4d"}, - {file = "Brotli-1.0.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b43775532a5904bc938f9c15b77c613cb6ad6fb30990f3b0afaea82797a402d8"}, - {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5bf37a08493232fbb0f8229f1824b366c2fc1d02d64e7e918af40acd15f3e337"}, - {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:330e3f10cd01da535c70d09c4283ba2df5fb78e915bea0a28becad6e2ac010be"}, - {file = "Brotli-1.0.9-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e1abbeef02962596548382e393f56e4c94acd286bd0c5afba756cffc33670e8a"}, - {file = "Brotli-1.0.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3148362937217b7072cf80a2dcc007f09bb5ecb96dae4617316638194113d5be"}, - {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:336b40348269f9b91268378de5ff44dc6fbaa2268194f85177b53463d313842a"}, - {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b8b09a16a1950b9ef495a0f8b9d0a87599a9d1f179e2d4ac014b2ec831f87e7"}, - {file = "Brotli-1.0.9-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c8e521a0ce7cf690ca84b8cc2272ddaf9d8a50294fd086da67e517439614c755"}, - {file = "Brotli-1.0.9.zip", hash = "sha256:4d1b810aa0ed773f81dceda2cc7b403d01057458730e309856356d4ef4188438"}, -] - -[[package]] -name = "certifi" -version = "2020.12.5" -description = "Python package for providing Mozilla's CA Bundle." -optional = false -python-versions = "*" -files = [ - {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, - {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, -] - -[[package]] -name = "cffi" -version = "1.16.0" -description = "Foreign Function Interface for Python calling C code." -optional = false -python-versions = ">=3.8" -files = [ - {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, - {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, - {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, - {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, - {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, - {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, - {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, - {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, - {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, - {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, - {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, - {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, - {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, - {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, - {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, - {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, - {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, - {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, - {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, - {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, - {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, - {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, - {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, - {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, - {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, - {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, -] - -[package.dependencies] -pycparser = "*" - -[[package]] -name = "charset-normalizer" -version = "3.3.0" -description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -optional = false -python-versions = ">=3.7.0" -files = [ - {file = "charset-normalizer-3.3.0.tar.gz", hash = "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-win32.whl", hash = "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d"}, - {file = "charset_normalizer-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-win32.whl", hash = "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786"}, - {file = "charset_normalizer-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-win32.whl", hash = "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df"}, - {file = "charset_normalizer-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c"}, - {file = "charset_normalizer-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-win32.whl", hash = "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e"}, - {file = "charset_normalizer-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-win32.whl", hash = "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a"}, - {file = "charset_normalizer-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884"}, - {file = "charset_normalizer-3.3.0-py3-none-any.whl", hash = "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2"}, -] - -[[package]] -name = "click" -version = "7.1.2" -description = "Composable command line interface toolkit" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, - {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, -] - -[[package]] -name = "colorama" -version = "0.4.6" -description = "Cross-platform colored terminal text." -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" -files = [ - {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, - {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, -] - -[[package]] -name = "cryptography" -version = "3.2.1" -description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -optional = false -python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" -files = [ - {file = "cryptography-3.2.1-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:6dc59630ecce8c1f558277ceb212c751d6730bd12c80ea96b4ac65637c4f55e7"}, - {file = "cryptography-3.2.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:75e8e6684cf0034f6bf2a97095cb95f81537b12b36a8fedf06e73050bb171c2d"}, - {file = "cryptography-3.2.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4e7268a0ca14536fecfdf2b00297d4e407da904718658c1ff1961c713f90fd33"}, - {file = "cryptography-3.2.1-cp27-cp27m-win32.whl", hash = "sha256:7117319b44ed1842c617d0a452383a5a052ec6aa726dfbaffa8b94c910444297"}, - {file = "cryptography-3.2.1-cp27-cp27m-win_amd64.whl", hash = "sha256:a733671100cd26d816eed39507e585c156e4498293a907029969234e5e634bc4"}, - {file = "cryptography-3.2.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a75f306a16d9f9afebfbedc41c8c2351d8e61e818ba6b4c40815e2b5740bb6b8"}, - {file = "cryptography-3.2.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:5849d59358547bf789ee7e0d7a9036b2d29e9a4ddf1ce5e06bb45634f995c53e"}, - {file = "cryptography-3.2.1-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:bd717aa029217b8ef94a7d21632a3bb5a4e7218a4513d2521c2a2fd63011e98b"}, - {file = "cryptography-3.2.1-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:efe15aca4f64f3a7ea0c09c87826490e50ed166ce67368a68f315ea0807a20df"}, - {file = "cryptography-3.2.1-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:32434673d8505b42c0de4de86da8c1620651abd24afe91ae0335597683ed1b77"}, - {file = "cryptography-3.2.1-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:7b8d9d8d3a9bd240f453342981f765346c87ade811519f98664519696f8e6ab7"}, - {file = "cryptography-3.2.1-cp35-cp35m-win32.whl", hash = "sha256:d3545829ab42a66b84a9aaabf216a4dce7f16dbc76eb69be5c302ed6b8f4a29b"}, - {file = "cryptography-3.2.1-cp35-cp35m-win_amd64.whl", hash = "sha256:a4e27ed0b2504195f855b52052eadcc9795c59909c9d84314c5408687f933fc7"}, - {file = "cryptography-3.2.1-cp36-abi3-win32.whl", hash = "sha256:13b88a0bd044b4eae1ef40e265d006e34dbcde0c2f1e15eb9896501b2d8f6c6f"}, - {file = "cryptography-3.2.1-cp36-abi3-win_amd64.whl", hash = "sha256:07ca431b788249af92764e3be9a488aa1d39a0bc3be313d826bbec690417e538"}, - {file = "cryptography-3.2.1-cp36-cp36m-win32.whl", hash = "sha256:a035a10686532b0587d58a606004aa20ad895c60c4d029afa245802347fab57b"}, - {file = "cryptography-3.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:d26a2557d8f9122f9bf445fc7034242f4375bd4e95ecda007667540270965b13"}, - {file = "cryptography-3.2.1-cp37-cp37m-win32.whl", hash = "sha256:545a8550782dda68f8cdc75a6e3bf252017aa8f75f19f5a9ca940772fc0cb56e"}, - {file = "cryptography-3.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:55d0b896631412b6f0c7de56e12eb3e261ac347fbaa5d5e705291a9016e5f8cb"}, - {file = "cryptography-3.2.1-cp38-cp38-win32.whl", hash = "sha256:3cd75a683b15576cfc822c7c5742b3276e50b21a06672dc3a800a2d5da4ecd1b"}, - {file = "cryptography-3.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:d25cecbac20713a7c3bc544372d42d8eafa89799f492a43b79e1dfd650484851"}, - {file = "cryptography-3.2.1.tar.gz", hash = "sha256:d3d5e10be0cf2a12214ddee45c6bd203dab435e3d83b4560c03066eda600bfe3"}, -] - -[package.dependencies] -cffi = ">=1.8,<1.11.3 || >1.11.3" -six = ">=1.4.1" - -[package.extras] -docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] -docstest = ["doc8", "pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] -pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] -ssh = ["bcrypt (>=3.1.5)"] -test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=3.6.0,!=3.9.0,!=3.9.1,!=3.9.2)", "pytz"] - -[[package]] -name = "distro" -version = "1.8.0" -description = "Distro - an OS platform information API" -optional = false -python-versions = ">=3.6" -files = [ - {file = "distro-1.8.0-py3-none-any.whl", hash = "sha256:99522ca3e365cac527b44bde033f64c6945d90eb9f769703caaec52b09bbd3ff"}, - {file = "distro-1.8.0.tar.gz", hash = "sha256:02e111d1dc6a50abb8eed6bf31c3e48ed8b0830d1ea2a1b78c61765c2513fdd8"}, -] - -[[package]] -name = "docker" -version = "6.1.3" -description = "A Python library for the Docker Engine API." -optional = false -python-versions = ">=3.7" -files = [ - {file = "docker-6.1.3-py3-none-any.whl", hash = "sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9"}, - {file = "docker-6.1.3.tar.gz", hash = "sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20"}, -] - -[package.dependencies] -packaging = ">=14.0" -paramiko = {version = ">=2.4.3", optional = true, markers = "extra == \"ssh\""} -pywin32 = {version = ">=304", markers = "sys_platform == \"win32\""} -requests = ">=2.26.0" -urllib3 = ">=1.26.0" -websocket-client = ">=0.32.0" - -[package.extras] -ssh = ["paramiko (>=2.4.3)"] - -[[package]] -name = "docker-compose" -version = "1.29.2" -description = "Multi-container orchestration for Docker" -optional = false -python-versions = ">=3.4" -files = [ - {file = "docker-compose-1.29.2.tar.gz", hash = "sha256:4c8cd9d21d237412793d18bd33110049ee9af8dab3fe2c213bbd0733959b09b7"}, - {file = "docker_compose-1.29.2-py2.py3-none-any.whl", hash = "sha256:8d5589373b35c8d3b1c8c1182c6e4a4ff14bffa3dd0b605fcd08f73c94cef809"}, -] - -[package.dependencies] -colorama = {version = ">=0.4,<1", markers = "sys_platform == \"win32\""} -distro = ">=1.5.0,<2" -docker = {version = ">=5", extras = ["ssh"]} -dockerpty = ">=0.4.1,<1" -docopt = ">=0.6.1,<1" -jsonschema = ">=2.5.1,<4" -python-dotenv = ">=0.13.0,<1" -PyYAML = ">=3.10,<6" -requests = ">=2.20.0,<3" -texttable = ">=0.9.0,<2" -websocket-client = ">=0.32.0,<1" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2)"] -tests = ["ddt (>=1.2.2,<2)", "pytest (<6)"] - -[[package]] -name = "dockerpty" -version = "0.4.1" -description = "Python library to use the pseudo-tty of a docker container" -optional = false -python-versions = "*" -files = [ - {file = "dockerpty-0.4.1.tar.gz", hash = "sha256:69a9d69d573a0daa31bcd1c0774eeed5c15c295fe719c61aca550ed1393156ce"}, -] - -[package.dependencies] -six = ">=1.3.0" - -[[package]] -name = "docopt" -version = "0.6.2" -description = "Pythonic argument parser, that will make you smile" -optional = false -python-versions = "*" -files = [ - {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, -] - -[[package]] -name = "dpath" -version = "2.1.6" -description = "Filesystem-like pathing and searching for dictionaries" -optional = false -python-versions = ">=3.7" -files = [ - {file = "dpath-2.1.6-py3-none-any.whl", hash = "sha256:31407395b177ab63ef72e2f6ae268c15e938f2990a8ecf6510f5686c02b6db73"}, - {file = "dpath-2.1.6.tar.gz", hash = "sha256:f1e07c72e8605c6a9e80b64bc8f42714de08a789c7de417e49c3f87a19692e47"}, -] - -[[package]] -name = "exceptiongroup" -version = "1.1.3" -description = "Backport of PEP 654 (exception groups)" -optional = false -python-versions = ">=3.7" -files = [ - {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, - {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, -] - -[package.extras] -test = ["pytest (>=6)"] - -[[package]] -name = "fastcore" -version = "1.5.29" -description = "Python supercharged for fastai development" -optional = false -python-versions = ">=3.7" -files = [ - {file = "fastcore-1.5.29-py3-none-any.whl", hash = "sha256:a7d7e89faf968f2d8584df2deca344c3974f6cf476e1299cd3c067d8fa7440e9"}, - {file = "fastcore-1.5.29.tar.gz", hash = "sha256:f1a2eb04eb7933f3f9eb4064852817df44dc96e20fab5658c14c035815269a3f"}, -] - -[package.dependencies] -packaging = "*" -pip = "*" - -[package.extras] -dev = ["jupyterlab", "matplotlib", "nbdev (>=0.2.39)", "numpy", "pandas", "pillow", "torch"] - -[[package]] -name = "flask" -version = "1.1.4" -description = "A simple framework for building complex web applications." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "Flask-1.1.4-py2.py3-none-any.whl", hash = "sha256:c34f04500f2cbbea882b1acb02002ad6fe6b7ffa64a6164577995657f50aed22"}, - {file = "Flask-1.1.4.tar.gz", hash = "sha256:0fbeb6180d383a9186d0d6ed954e0042ad9f18e0e8de088b2b419d526927d196"}, -] - -[package.dependencies] -click = ">=5.1,<8.0" -itsdangerous = ">=0.24,<2.0" -Jinja2 = ">=2.10.1,<3.0" -Werkzeug = ">=0.15,<2.0" - -[package.extras] -dev = ["coverage", "pallets-sphinx-themes", "pytest", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet", "tox"] -docs = ["pallets-sphinx-themes", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet"] -dotenv = ["python-dotenv"] - -[[package]] -name = "frozenlist" -version = "1.4.0" -description = "A list-like structure which implements collections.abc.MutableSequence" -optional = false -python-versions = ">=3.8" -files = [ - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, - {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, - {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, - {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, - {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, - {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, - {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, - {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, - {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, - {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, - {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, - {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, - {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, - {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, - {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, - {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, - {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, - {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, - {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, - {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, - {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, - {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, -] - -[[package]] -name = "func-timeout" -version = "4.3.5" -description = "Python module which allows you to specify timeouts when calling any existing function. Also provides support for stoppable-threads" -optional = false -python-versions = "*" -files = [ - {file = "func_timeout-4.3.5.tar.gz", hash = "sha256:74cd3c428ec94f4edfba81f9b2f14904846d5ffccc27c92433b8b5939b5575dd"}, -] - -[[package]] -name = "ghapi" -version = "0.1.23" -description = "A python client for the GitHub API" -optional = false -python-versions = ">=3.6" -files = [ - {file = "ghapi-0.1.23-py3-none-any.whl", hash = "sha256:492b5f82b5d4844a0297c8ae6afda638432cee6c74b0bd0a0458b35d19b92b5e"}, - {file = "ghapi-0.1.23.tar.gz", hash = "sha256:93fa097e394d743c6702e217d588a4123696f62d055f2acc495166676843d59f"}, -] - -[package.dependencies] -fastcore = ">=1.5.4" -packaging = "*" -pip = "*" - -[package.extras] -dev = ["jsonref"] - -[[package]] -name = "goth" -version = "0.15.8" -description = "Golem Test Harness - integration testing framework" -optional = false -python-versions = ">=3.10.1,<4.0.0" -files = [ - {file = "goth-0.15.8-py3-none-any.whl", hash = "sha256:1a0d8b59e207feab8aaf36c6156eab0cf446f56cb6973c71200c531e35a19de9"}, - {file = "goth-0.15.8.tar.gz", hash = "sha256:16fa44a0a6e4e914064a5bb5cf8d2d0d3af766e97d515a498f66a13723fffd83"}, -] - -[package.dependencies] -aiohttp = ">=3.8.5,<4.0.0" -ansicolors = ">=1.1.0,<2.0.0" -docker = ">=6.0,<7.0" -docker-compose = ">=1.29,<2.0" -dpath = ">=2.0,<3.0" -func_timeout = "4.3.5" -ghapi = ">=0.1.16,<0.2.0" -markupsafe = "2.0.1" -mitmproxy = ">=5.3,<6.0" -pyyaml = "5.3.1" -transitions = ">=0.8,<0.9" -typing_extensions = ">=4.5,<5.0" -urllib3 = ">=1.26,<2.0" -ya-aioclient = ">=0.6,<0.7" - -[[package]] -name = "h11" -version = "0.14.0" -description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -optional = false -python-versions = ">=3.7" -files = [ - {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, - {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, -] - -[[package]] -name = "h2" -version = "4.1.0" -description = "HTTP/2 State-Machine based protocol implementation" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, - {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, -] - -[package.dependencies] -hpack = ">=4.0,<5" -hyperframe = ">=6.0,<7" - -[[package]] -name = "hpack" -version = "4.0.0" -description = "Pure-Python HPACK header compression" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, - {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, -] - -[[package]] -name = "hyperframe" -version = "6.0.1" -description = "HTTP/2 framing layer for Python" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, - {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, -] - -[[package]] -name = "idna" -version = "3.4" -description = "Internationalized Domain Names in Applications (IDNA)" -optional = false -python-versions = ">=3.5" -files = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] - -[[package]] -name = "iniconfig" -version = "2.0.0" -description = "brain-dead simple config-ini parsing" -optional = false -python-versions = ">=3.7" -files = [ - {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, - {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, -] - -[[package]] -name = "itsdangerous" -version = "1.1.0" -description = "Various helpers to pass data to untrusted environments and back." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"}, - {file = "itsdangerous-1.1.0.tar.gz", hash = "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19"}, -] - -[[package]] -name = "jinja2" -version = "2.11.3" -description = "A very fast and expressive template engine." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, - {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, -] - -[package.dependencies] -MarkupSafe = ">=0.23" - -[package.extras] -i18n = ["Babel (>=0.8)"] - -[[package]] -name = "jsonschema" -version = "3.2.0" -description = "An implementation of JSON Schema validation for Python" -optional = false -python-versions = "*" -files = [ - {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, - {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, -] - -[package.dependencies] -attrs = ">=17.4.0" -pyrsistent = ">=0.14.0" -setuptools = "*" -six = ">=1.11.0" - -[package.extras] -format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] -format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] - -[[package]] -name = "kaitaistruct" -version = "0.9" -description = "Kaitai Struct declarative parser generator for binary data: runtime library for Python" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" -files = [ - {file = "kaitaistruct-0.9.tar.gz", hash = "sha256:3d5845817ec8a4d5504379cc11bd570b038850ee49c4580bc0998c8fb1d327ad"}, -] - -[[package]] -name = "ldap3" -version = "2.8.1" -description = "A strictly RFC 4510 conforming LDAP V3 pure Python client library" -optional = false -python-versions = "*" -files = [ - {file = "ldap3-2.8.1-py2.py3-none-any.whl", hash = "sha256:7c3738570766f5e5e74a56fade15470f339d5c436d821cf476ef27da0a4de8b0"}, - {file = "ldap3-2.8.1.tar.gz", hash = "sha256:37d633e20fa360c302b1263c96fe932d40622d0119f1bddcb829b03462eeeeb7"}, -] - -[package.dependencies] -pyasn1 = ">=0.4.6" - -[[package]] -name = "markupsafe" -version = "2.0.1" -description = "Safely add untrusted strings to HTML/XML markup." -optional = false -python-versions = ">=3.6" -files = [ - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, - {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, - {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, - {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, - {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, - {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, - {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, -] - -[[package]] -name = "mitmproxy" -version = "5.3.0" -description = "An interactive, SSL/TLS-capable intercepting proxy for HTTP/1, HTTP/2, and WebSockets." -optional = false -python-versions = "*" -files = [ - {file = "mitmproxy-5.3.0-py3-none-any.whl", hash = "sha256:481940365fc08fc2318343e530ef01d35084e8b56d1c61b5e1a7b6ed9b664d24"}, -] - -[package.dependencies] -asgiref = ">=3.2.10,<3.4" -blinker = ">=1.4,<1.5" -Brotli = ">=1.0,<1.1" -certifi = ">=2019.9.11" -click = ">=7.0,<8" -cryptography = ">=3.2,<3.3" -flask = ">=1.1.1,<1.2" -h2 = {version = ">=4.0,<5", markers = "python_version >= \"3.6.0\""} -hyperframe = {version = ">=6.0,<7", markers = "python_version >= \"3.6.0\""} -kaitaistruct = ">=0.7,<0.10" -ldap3 = ">=2.8,<2.9" -msgpack = ">=1.0.0,<1.1.0" -passlib = ">=1.6.5,<1.8" -protobuf = ">=3.6.0,<3.14" -publicsuffix2 = ">=2.20190812,<3" -pyasn1 = ">=0.3.1,<0.5" -pydivert = {version = ">=2.0.3,<2.2", markers = "sys_platform == \"win32\""} -pyOpenSSL = ">=19.1.0,<19.2" -pyparsing = ">=2.4.2,<2.5" -pyperclip = ">=1.6.0,<1.9" -"ruamel.yaml" = ">=0.16,<0.17" -sortedcontainers = ">=2.1,<2.3" -tornado = ">=4.3,<7" -urwid = ">=2.1.1,<2.2" -wsproto = ">=0.14,<0.16" -zstandard = ">=0.11,<0.15" - -[package.extras] -dev = ["Flask (>=1.0,<1.2)", "asynctest (>=0.12.0)", "hypothesis (>=5.8,<6)", "parver (>=0.1,<2.0)", "pytest (>=6.1.0,<7)", "pytest-asyncio (>=0.10.0,<0.14)", "pytest-cov (>=2.7.1,<3)", "pytest-timeout (>=1.3.3,<2)", "pytest-xdist (>=2.1.0,<3)", "requests (>=2.9.1,<3)", "tox (>=3.5,<4)"] - -[[package]] -name = "msgpack" -version = "1.0.7" -description = "MessagePack serializer" -optional = false -python-versions = ">=3.8" -files = [ - {file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04ad6069c86e531682f9e1e71b71c1c3937d6014a7c3e9edd2aa81ad58842862"}, - {file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cca1b62fe70d761a282496b96a5e51c44c213e410a964bdffe0928e611368329"}, - {file = "msgpack-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e50ebce52f41370707f1e21a59514e3375e3edd6e1832f5e5235237db933c98b"}, - {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b4f35de6a304b5533c238bee86b670b75b03d31b7797929caa7a624b5dda6"}, - {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28efb066cde83c479dfe5a48141a53bc7e5f13f785b92ddde336c716663039ee"}, - {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cb14ce54d9b857be9591ac364cb08dc2d6a5c4318c1182cb1d02274029d590d"}, - {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b573a43ef7c368ba4ea06050a957c2a7550f729c31f11dd616d2ac4aba99888d"}, - {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ccf9a39706b604d884d2cb1e27fe973bc55f2890c52f38df742bc1d79ab9f5e1"}, - {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cb70766519500281815dfd7a87d3a178acf7ce95390544b8c90587d76b227681"}, - {file = "msgpack-1.0.7-cp310-cp310-win32.whl", hash = "sha256:b610ff0f24e9f11c9ae653c67ff8cc03c075131401b3e5ef4b82570d1728f8a9"}, - {file = "msgpack-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:a40821a89dc373d6427e2b44b572efc36a2778d3f543299e2f24eb1a5de65415"}, - {file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:576eb384292b139821c41995523654ad82d1916da6a60cff129c715a6223ea84"}, - {file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:730076207cb816138cf1af7f7237b208340a2c5e749707457d70705715c93b93"}, - {file = "msgpack-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:85765fdf4b27eb5086f05ac0491090fc76f4f2b28e09d9350c31aac25a5aaff8"}, - {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3476fae43db72bd11f29a5147ae2f3cb22e2f1a91d575ef130d2bf49afd21c46"}, - {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d4c80667de2e36970ebf74f42d1088cc9ee7ef5f4e8c35eee1b40eafd33ca5b"}, - {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b0bf0effb196ed76b7ad883848143427a73c355ae8e569fa538365064188b8e"}, - {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f9a7c509542db4eceed3dcf21ee5267ab565a83555c9b88a8109dcecc4709002"}, - {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:84b0daf226913133f899ea9b30618722d45feffa67e4fe867b0b5ae83a34060c"}, - {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ec79ff6159dffcc30853b2ad612ed572af86c92b5168aa3fc01a67b0fa40665e"}, - {file = "msgpack-1.0.7-cp311-cp311-win32.whl", hash = "sha256:3e7bf4442b310ff154b7bb9d81eb2c016b7d597e364f97d72b1acc3817a0fdc1"}, - {file = "msgpack-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:3f0c8c6dfa6605ab8ff0611995ee30d4f9fcff89966cf562733b4008a3d60d82"}, - {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f0936e08e0003f66bfd97e74ee530427707297b0d0361247e9b4f59ab78ddc8b"}, - {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98bbd754a422a0b123c66a4c341de0474cad4a5c10c164ceed6ea090f3563db4"}, - {file = "msgpack-1.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b291f0ee7961a597cbbcc77709374087fa2a9afe7bdb6a40dbbd9b127e79afee"}, - {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebbbba226f0a108a7366bf4b59bf0f30a12fd5e75100c630267d94d7f0ad20e5"}, - {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e2d69948e4132813b8d1131f29f9101bc2c915f26089a6d632001a5c1349672"}, - {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdf38ba2d393c7911ae989c3bbba510ebbcdf4ecbdbfec36272abe350c454075"}, - {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:993584fc821c58d5993521bfdcd31a4adf025c7d745bbd4d12ccfecf695af5ba"}, - {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:52700dc63a4676669b341ba33520f4d6e43d3ca58d422e22ba66d1736b0a6e4c"}, - {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e45ae4927759289c30ccba8d9fdce62bb414977ba158286b5ddaf8df2cddb5c5"}, - {file = "msgpack-1.0.7-cp312-cp312-win32.whl", hash = "sha256:27dcd6f46a21c18fa5e5deed92a43d4554e3df8d8ca5a47bf0615d6a5f39dbc9"}, - {file = "msgpack-1.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:7687e22a31e976a0e7fc99c2f4d11ca45eff652a81eb8c8085e9609298916dcf"}, - {file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5b6ccc0c85916998d788b295765ea0e9cb9aac7e4a8ed71d12e7d8ac31c23c95"}, - {file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:235a31ec7db685f5c82233bddf9858748b89b8119bf4538d514536c485c15fe0"}, - {file = "msgpack-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cab3db8bab4b7e635c1c97270d7a4b2a90c070b33cbc00c99ef3f9be03d3e1f7"}, - {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bfdd914e55e0d2c9e1526de210f6fe8ffe9705f2b1dfcc4aecc92a4cb4b533d"}, - {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36e17c4592231a7dbd2ed09027823ab295d2791b3b1efb2aee874b10548b7524"}, - {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38949d30b11ae5f95c3c91917ee7a6b239f5ec276f271f28638dec9156f82cfc"}, - {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ff1d0899f104f3921d94579a5638847f783c9b04f2d5f229392ca77fba5b82fc"}, - {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dc43f1ec66eb8440567186ae2f8c447d91e0372d793dfe8c222aec857b81a8cf"}, - {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dd632777ff3beaaf629f1ab4396caf7ba0bdd075d948a69460d13d44357aca4c"}, - {file = "msgpack-1.0.7-cp38-cp38-win32.whl", hash = "sha256:4e71bc4416de195d6e9b4ee93ad3f2f6b2ce11d042b4d7a7ee00bbe0358bd0c2"}, - {file = "msgpack-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:8f5b234f567cf76ee489502ceb7165c2a5cecec081db2b37e35332b537f8157c"}, - {file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfef2bb6ef068827bbd021017a107194956918ab43ce4d6dc945ffa13efbc25f"}, - {file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:484ae3240666ad34cfa31eea7b8c6cd2f1fdaae21d73ce2974211df099a95d81"}, - {file = "msgpack-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3967e4ad1aa9da62fd53e346ed17d7b2e922cba5ab93bdd46febcac39be636fc"}, - {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd178c4c80706546702c59529ffc005681bd6dc2ea234c450661b205445a34d"}, - {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ffbc252eb0d229aeb2f9ad051200668fc3a9aaa8994e49f0cb2ffe2b7867e7"}, - {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:822ea70dc4018c7e6223f13affd1c5c30c0f5c12ac1f96cd8e9949acddb48a61"}, - {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:384d779f0d6f1b110eae74cb0659d9aa6ff35aaf547b3955abf2ab4c901c4819"}, - {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f64e376cd20d3f030190e8c32e1c64582eba56ac6dc7d5b0b49a9d44021b52fd"}, - {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5ed82f5a7af3697b1c4786053736f24a0efd0a1b8a130d4c7bfee4b9ded0f08f"}, - {file = "msgpack-1.0.7-cp39-cp39-win32.whl", hash = "sha256:f26a07a6e877c76a88e3cecac8531908d980d3d5067ff69213653649ec0f60ad"}, - {file = "msgpack-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:1dc93e8e4653bdb5910aed79f11e165c85732067614f180f70534f056da97db3"}, - {file = "msgpack-1.0.7.tar.gz", hash = "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87"}, -] - -[[package]] -name = "multidict" -version = "6.0.4" -description = "multidict implementation" -optional = false -python-versions = ">=3.7" -files = [ - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, - {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, - {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, - {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, - {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, - {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, - {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, - {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, - {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, - {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, - {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, - {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, - {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, - {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, - {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, - {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, - {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, - {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, - {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, - {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, - {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, - {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, - {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, - {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, - {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, - {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, - {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, -] - -[[package]] -name = "mypy" -version = "1.5.1" -description = "Optional static typing for Python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "mypy-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f33592ddf9655a4894aef22d134de7393e95fcbdc2d15c1ab65828eee5c66c70"}, - {file = "mypy-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:258b22210a4a258ccd077426c7a181d789d1121aca6db73a83f79372f5569ae0"}, - {file = "mypy-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9ec1f695f0c25986e6f7f8778e5ce61659063268836a38c951200c57479cc12"}, - {file = "mypy-1.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:abed92d9c8f08643c7d831300b739562b0a6c9fcb028d211134fc9ab20ccad5d"}, - {file = "mypy-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a156e6390944c265eb56afa67c74c0636f10283429171018446b732f1a05af25"}, - {file = "mypy-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6ac9c21bfe7bc9f7f1b6fae441746e6a106e48fc9de530dea29e8cd37a2c0cc4"}, - {file = "mypy-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51cb1323064b1099e177098cb939eab2da42fea5d818d40113957ec954fc85f4"}, - {file = "mypy-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:596fae69f2bfcb7305808c75c00f81fe2829b6236eadda536f00610ac5ec2243"}, - {file = "mypy-1.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:32cb59609b0534f0bd67faebb6e022fe534bdb0e2ecab4290d683d248be1b275"}, - {file = "mypy-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:159aa9acb16086b79bbb0016145034a1a05360626046a929f84579ce1666b315"}, - {file = "mypy-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f6b0e77db9ff4fda74de7df13f30016a0a663928d669c9f2c057048ba44f09bb"}, - {file = "mypy-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26f71b535dfc158a71264e6dc805a9f8d2e60b67215ca0bfa26e2e1aa4d4d373"}, - {file = "mypy-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc3a600f749b1008cc75e02b6fb3d4db8dbcca2d733030fe7a3b3502902f161"}, - {file = "mypy-1.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:26fb32e4d4afa205b24bf645eddfbb36a1e17e995c5c99d6d00edb24b693406a"}, - {file = "mypy-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:82cb6193de9bbb3844bab4c7cf80e6227d5225cc7625b068a06d005d861ad5f1"}, - {file = "mypy-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a465ea2ca12804d5b34bb056be3a29dc47aea5973b892d0417c6a10a40b2d65"}, - {file = "mypy-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9fece120dbb041771a63eb95e4896791386fe287fefb2837258925b8326d6160"}, - {file = "mypy-1.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d28ddc3e3dfeab553e743e532fb95b4e6afad51d4706dd22f28e1e5e664828d2"}, - {file = "mypy-1.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:57b10c56016adce71fba6bc6e9fd45d8083f74361f629390c556738565af8eeb"}, - {file = "mypy-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff0cedc84184115202475bbb46dd99f8dcb87fe24d5d0ddfc0fe6b8575c88d2f"}, - {file = "mypy-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8f772942d372c8cbac575be99f9cc9d9fb3bd95c8bc2de6c01411e2c84ebca8a"}, - {file = "mypy-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5d627124700b92b6bbaa99f27cbe615c8ea7b3402960f6372ea7d65faf376c14"}, - {file = "mypy-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:361da43c4f5a96173220eb53340ace68cda81845cd88218f8862dfb0adc8cddb"}, - {file = "mypy-1.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:330857f9507c24de5c5724235e66858f8364a0693894342485e543f5b07c8693"}, - {file = "mypy-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:c543214ffdd422623e9fedd0869166c2f16affe4ba37463975043ef7d2ea8770"}, - {file = "mypy-1.5.1-py3-none-any.whl", hash = "sha256:f757063a83970d67c444f6e01d9550a7402322af3557ce7630d3c957386fa8f5"}, - {file = "mypy-1.5.1.tar.gz", hash = "sha256:b031b9601f1060bf1281feab89697324726ba0c0bae9d7cd7ab4b690940f0b92"}, -] - -[package.dependencies] -mypy-extensions = ">=1.0.0" -tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} -typing-extensions = ">=4.1.0" - -[package.extras] -dmypy = ["psutil (>=4.0)"] -install-types = ["pip"] -reports = ["lxml"] - -[[package]] -name = "mypy-extensions" -version = "1.0.0" -description = "Type system extensions for programs checked with the mypy type checker." -optional = false -python-versions = ">=3.5" -files = [ - {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, - {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, -] - -[[package]] -name = "packaging" -version = "23.2" -description = "Core utilities for Python packages" -optional = false -python-versions = ">=3.7" -files = [ - {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, - {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, -] - -[[package]] -name = "paramiko" -version = "2.12.0" -description = "SSH2 protocol library" -optional = false -python-versions = "*" -files = [ - {file = "paramiko-2.12.0-py2.py3-none-any.whl", hash = "sha256:b2df1a6325f6996ef55a8789d0462f5b502ea83b3c990cbb5bbe57345c6812c4"}, - {file = "paramiko-2.12.0.tar.gz", hash = "sha256:376885c05c5d6aa6e1f4608aac2a6b5b0548b1add40274477324605903d9cd49"}, -] - -[package.dependencies] -bcrypt = ">=3.1.3" -cryptography = ">=2.5" -pynacl = ">=1.0.1" -six = "*" - -[package.extras] -all = ["bcrypt (>=3.1.3)", "gssapi (>=1.4.1)", "invoke (>=1.3)", "pyasn1 (>=0.1.7)", "pynacl (>=1.0.1)", "pywin32 (>=2.1.8)"] -ed25519 = ["bcrypt (>=3.1.3)", "pynacl (>=1.0.1)"] -gssapi = ["gssapi (>=1.4.1)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] -invoke = ["invoke (>=1.3)"] - -[[package]] -name = "passlib" -version = "1.7.4" -description = "comprehensive password hashing framework supporting over 30 schemes" -optional = false -python-versions = "*" -files = [ - {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, - {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, -] - -[package.extras] -argon2 = ["argon2-cffi (>=18.2.0)"] -bcrypt = ["bcrypt (>=3.1.0)"] -build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"] -totp = ["cryptography"] - -[[package]] -name = "pastel" -version = "0.2.1" -description = "Bring colors to your terminal." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, - {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, -] - -[[package]] -name = "pathspec" -version = "0.11.2" -description = "Utility library for gitignore style pattern matching of file paths." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, - {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, -] - -[[package]] -name = "pip" -version = "23.2.1" -description = "The PyPA recommended tool for installing Python packages." -optional = false -python-versions = ">=3.7" -files = [ - {file = "pip-23.2.1-py3-none-any.whl", hash = "sha256:7ccf472345f20d35bdc9d1841ff5f313260c2c33fe417f48c30ac46cccabf5be"}, - {file = "pip-23.2.1.tar.gz", hash = "sha256:fb0bd5435b3200c602b5bf61d2d43c2f13c02e29c1707567ae7fbc514eb9faf2"}, -] - -[[package]] -name = "pluggy" -version = "1.3.0" -description = "plugin and hook calling mechanisms for python" -optional = false -python-versions = ">=3.8" -files = [ - {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, - {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, -] - -[package.extras] -dev = ["pre-commit", "tox"] -testing = ["pytest", "pytest-benchmark"] - -[[package]] -name = "poethepoet" -version = "0.22.1" -description = "A task runner that works well with poetry." -optional = false -python-versions = ">=3.8" -files = [ - {file = "poethepoet-0.22.1-py3-none-any.whl", hash = "sha256:1da4cd00d3b2c44b811c91616a744cf71094a26a299ea9956025162d34eef1a5"}, - {file = "poethepoet-0.22.1.tar.gz", hash = "sha256:e758bcac731fa9ac0b812389589541e32b825c4a1894e16fa90aeb1946ba2823"}, -] - -[package.dependencies] -pastel = ">=0.2.1,<0.3.0" -tomli = ">=1.2.2" - -[package.extras] -poetry-plugin = ["poetry (>=1.0,<2.0)"] - -[[package]] -name = "protobuf" -version = "3.13.0" -description = "Protocol Buffers" -optional = false -python-versions = "*" -files = [ - {file = "protobuf-3.13.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9c2e63c1743cba12737169c447374fab3dfeb18111a460a8c1a000e35836b18c"}, - {file = "protobuf-3.13.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1e834076dfef9e585815757a2c7e4560c7ccc5962b9d09f831214c693a91b463"}, - {file = "protobuf-3.13.0-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:df3932e1834a64b46ebc262e951cd82c3cf0fa936a154f0a42231140d8237060"}, - {file = "protobuf-3.13.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8c35bcbed1c0d29b127c886790e9d37e845ffc2725cc1db4bd06d70f4e8359f4"}, - {file = "protobuf-3.13.0-cp35-cp35m-win32.whl", hash = "sha256:339c3a003e3c797bc84499fa32e0aac83c768e67b3de4a5d7a5a9aa3b0da634c"}, - {file = "protobuf-3.13.0-cp35-cp35m-win_amd64.whl", hash = "sha256:361acd76f0ad38c6e38f14d08775514fbd241316cce08deb2ce914c7dfa1184a"}, - {file = "protobuf-3.13.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9edfdc679a3669988ec55a989ff62449f670dfa7018df6ad7f04e8dbacb10630"}, - {file = "protobuf-3.13.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5db9d3e12b6ede5e601b8d8684a7f9d90581882925c96acf8495957b4f1b204b"}, - {file = "protobuf-3.13.0-cp36-cp36m-win32.whl", hash = "sha256:c8abd7605185836f6f11f97b21200f8a864f9cb078a193fe3c9e235711d3ff1e"}, - {file = "protobuf-3.13.0-cp36-cp36m-win_amd64.whl", hash = "sha256:4d1174c9ed303070ad59553f435846a2f877598f59f9afc1b89757bdf846f2a7"}, - {file = "protobuf-3.13.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0bba42f439bf45c0f600c3c5993666fcb88e8441d011fad80a11df6f324eef33"}, - {file = "protobuf-3.13.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c0c5ab9c4b1eac0a9b838f1e46038c3175a95b0f2d944385884af72876bd6bc7"}, - {file = "protobuf-3.13.0-cp37-cp37m-win32.whl", hash = "sha256:f68eb9d03c7d84bd01c790948320b768de8559761897763731294e3bc316decb"}, - {file = "protobuf-3.13.0-cp37-cp37m-win_amd64.whl", hash = "sha256:91c2d897da84c62816e2f473ece60ebfeab024a16c1751aaf31100127ccd93ec"}, - {file = "protobuf-3.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3dee442884a18c16d023e52e32dd34a8930a889e511af493f6dc7d4d9bf12e4f"}, - {file = "protobuf-3.13.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:e7662437ca1e0c51b93cadb988f9b353fa6b8013c0385d63a70c8a77d84da5f9"}, - {file = "protobuf-3.13.0-py2.py3-none-any.whl", hash = "sha256:d69697acac76d9f250ab745b46c725edf3e98ac24763990b24d58c16c642947a"}, - {file = "protobuf-3.13.0.tar.gz", hash = "sha256:6a82e0c8bb2bf58f606040cc5814e07715b2094caeba281e2e7d0b0e2e397db5"}, -] - -[package.dependencies] -setuptools = "*" -six = ">=1.9" - -[[package]] -name = "publicsuffix2" -version = "2.20191221" -description = "Get a public suffix for a domain name using the Public Suffix List. Forked from and using the same API as the publicsuffix package." -optional = false -python-versions = "*" -files = [ - {file = "publicsuffix2-2.20191221-py2.py3-none-any.whl", hash = "sha256:786b5e36205b88758bd3518725ec8cfe7a8173f5269354641f581c6b80a99893"}, - {file = "publicsuffix2-2.20191221.tar.gz", hash = "sha256:00f8cc31aa8d0d5592a5ced19cccba7de428ebca985db26ac852d920ddd6fe7b"}, -] - -[[package]] -name = "pyasn1" -version = "0.4.8" -description = "ASN.1 types and codecs" -optional = false -python-versions = "*" -files = [ - {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, - {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, -] - -[[package]] -name = "pycparser" -version = "2.21" -description = "C parser in Python" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, - {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, -] - -[[package]] -name = "pydivert" -version = "2.1.0" -description = "Python binding to windivert driver" -optional = false -python-versions = "*" -files = [ - {file = "pydivert-2.1.0-py2.py3-none-any.whl", hash = "sha256:382db488e3c37c03ec9ec94e061a0b24334d78dbaeebb7d4e4d32ce4355d9da1"}, - {file = "pydivert-2.1.0.tar.gz", hash = "sha256:f0e150f4ff591b78e35f514e319561dadff7f24a82186a171dd4d465483de5b4"}, -] - -[package.extras] -docs = ["sphinx (>=1.4.8)"] -test = ["codecov (>=2.0.5)", "hypothesis (>=3.5.3)", "mock (>=1.0.1)", "pytest (>=3.0.3)", "pytest-cov (>=2.2.1)", "pytest-faulthandler (>=1.3.0,<2)", "pytest-timeout (>=1.0.0,<2)", "wheel (>=0.29)"] - -[[package]] -name = "pynacl" -version = "1.5.0" -description = "Python binding to the Networking and Cryptography (NaCl) library" -optional = false -python-versions = ">=3.6" -files = [ - {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, - {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, - {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, - {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, - {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, - {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, - {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, -] - -[package.dependencies] -cffi = ">=1.4.1" - -[package.extras] -docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] -tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] - -[[package]] -name = "pyopenssl" -version = "19.1.0" -description = "Python wrapper module around the OpenSSL library" -optional = false -python-versions = "*" -files = [ - {file = "pyOpenSSL-19.1.0-py2.py3-none-any.whl", hash = "sha256:621880965a720b8ece2f1b2f54ea2071966ab00e2970ad2ce11d596102063504"}, - {file = "pyOpenSSL-19.1.0.tar.gz", hash = "sha256:9a24494b2602aaf402be5c9e30a0b82d4a5c67528fe8fb475e3f3bc00dd69507"}, -] - -[package.dependencies] -cryptography = ">=2.8" -six = ">=1.5.2" - -[package.extras] -docs = ["sphinx", "sphinx-rtd-theme"] -test = ["flaky", "pretend", "pytest (>=3.0.1)"] - -[[package]] -name = "pyparsing" -version = "2.4.7" -description = "Python parsing module" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, - {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, -] - -[[package]] -name = "pyperclip" -version = "1.8.2" -description = "A cross-platform clipboard module for Python. (Only handles plain text for now.)" -optional = false -python-versions = "*" -files = [ - {file = "pyperclip-1.8.2.tar.gz", hash = "sha256:105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57"}, -] - -[[package]] -name = "pyrsistent" -version = "0.19.3" -description = "Persistent/Functional/Immutable data structures" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, - {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, - {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, - {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, - {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, - {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, - {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, - {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, - {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, - {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, - {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, - {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, - {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, - {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, - {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, - {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, - {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, - {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, - {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, - {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, - {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, - {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, - {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, -] - -[[package]] -name = "pytest" -version = "7.4.2" -description = "pytest: simple powerful testing with Python" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, - {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, -] - -[package.dependencies] -colorama = {version = "*", markers = "sys_platform == \"win32\""} -exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} -iniconfig = "*" -packaging = "*" -pluggy = ">=0.12,<2.0" -tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} - -[package.extras] -testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] - -[[package]] -name = "pytest-asyncio" -version = "0.21.0" -description = "Pytest support for asyncio" -optional = false -python-versions = ">=3.7" -files = [ - {file = "pytest-asyncio-0.21.0.tar.gz", hash = "sha256:2b38a496aef56f56b0e87557ec313e11e1ab9276fc3863f6a7be0f1d0e415e1b"}, - {file = "pytest_asyncio-0.21.0-py3-none-any.whl", hash = "sha256:f2b3366b7cd501a4056858bd39349d5af19742aed2d81660b7998b6341c7eb9c"}, -] - -[package.dependencies] -pytest = ">=7.0.0" - -[package.extras] -docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] -testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] - -[[package]] -name = "pytest-split" -version = "0.8.1" -description = "Pytest plugin which splits the test suite to equally sized sub suites based on test execution time." -optional = false -python-versions = ">=3.7.1,<4.0" -files = [ - {file = "pytest_split-0.8.1-py3-none-any.whl", hash = "sha256:74b110ea091bd147cc1c5f9665a59506e5cedfa66f96a89fb03e4ab447c2c168"}, - {file = "pytest_split-0.8.1.tar.gz", hash = "sha256:2d88bd3dc528689a7a3f58fc12ea165c3aa62e90795e420dfad920afe5612d6d"}, -] - -[package.dependencies] -pytest = ">=5,<8" - -[[package]] -name = "python-dateutil" -version = "2.8.2" -description = "Extensions to the standard Python datetime module" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -files = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] - -[package.dependencies] -six = ">=1.5" - -[[package]] -name = "python-dotenv" -version = "0.21.1" -description = "Read key-value pairs from a .env file and set them as environment variables" -optional = false -python-versions = ">=3.7" -files = [ - {file = "python-dotenv-0.21.1.tar.gz", hash = "sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49"}, - {file = "python_dotenv-0.21.1-py3-none-any.whl", hash = "sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a"}, -] - -[package.extras] -cli = ["click (>=5.0)"] - -[[package]] -name = "pywin32" -version = "306" -description = "Python for Window Extensions" -optional = false -python-versions = "*" -files = [ - {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, - {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, - {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, - {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, - {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, - {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, - {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, - {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, - {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, - {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, - {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, - {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, - {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, - {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, -] - -[[package]] -name = "pyyaml" -version = "5.3.1" -description = "YAML parser and emitter for Python" -optional = false -python-versions = "*" -files = [ - {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, - {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, - {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, - {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, - {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, - {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, - {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, - {file = "PyYAML-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a"}, - {file = "PyYAML-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e"}, - {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, -] - -[[package]] -name = "regex" -version = "2023.10.3" -description = "Alternative regular expression module, to replace re." -optional = false -python-versions = ">=3.7" -files = [ - {file = "regex-2023.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc"}, - {file = "regex-2023.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55"}, - {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be"}, - {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5"}, - {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767"}, - {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff"}, - {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a"}, - {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a"}, - {file = "regex-2023.10.3-cp310-cp310-win32.whl", hash = "sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec"}, - {file = "regex-2023.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353"}, - {file = "regex-2023.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e"}, - {file = "regex-2023.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051"}, - {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964"}, - {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc"}, - {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b"}, - {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac"}, - {file = "regex-2023.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58"}, - {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a"}, - {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e"}, - {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0"}, - {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6"}, - {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54"}, - {file = "regex-2023.10.3-cp311-cp311-win32.whl", hash = "sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2"}, - {file = "regex-2023.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c"}, - {file = "regex-2023.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037"}, - {file = "regex-2023.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f"}, - {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41"}, - {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e"}, - {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c"}, - {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841"}, - {file = "regex-2023.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9"}, - {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420"}, - {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9"}, - {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f"}, - {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292"}, - {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a"}, - {file = "regex-2023.10.3-cp312-cp312-win32.whl", hash = "sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a"}, - {file = "regex-2023.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b"}, - {file = "regex-2023.10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf"}, - {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991"}, - {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302"}, - {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971"}, - {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11"}, - {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597"}, - {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb"}, - {file = "regex-2023.10.3-cp37-cp37m-win32.whl", hash = "sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a"}, - {file = "regex-2023.10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed"}, - {file = "regex-2023.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533"}, - {file = "regex-2023.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07"}, - {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c"}, - {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039"}, - {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863"}, - {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f"}, - {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711"}, - {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4"}, - {file = "regex-2023.10.3-cp38-cp38-win32.whl", hash = "sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d"}, - {file = "regex-2023.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b"}, - {file = "regex-2023.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af"}, - {file = "regex-2023.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b"}, - {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588"}, - {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa"}, - {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af"}, - {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528"}, - {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca"}, - {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48"}, - {file = "regex-2023.10.3-cp39-cp39-win32.whl", hash = "sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd"}, - {file = "regex-2023.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988"}, - {file = "regex-2023.10.3.tar.gz", hash = "sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f"}, -] - -[[package]] -name = "requests" -version = "2.31.0" -description = "Python HTTP for Humans." -optional = false -python-versions = ">=3.7" -files = [ - {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, - {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, -] - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<4" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<3" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "ruamel-yaml" -version = "0.16.13" -description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -optional = false -python-versions = "*" -files = [ - {file = "ruamel.yaml-0.16.13-py2.py3-none-any.whl", hash = "sha256:64b06e7873eb8e1125525ecef7345447d786368cadca92a7cd9b59eae62e95a3"}, - {file = "ruamel.yaml-0.16.13.tar.gz", hash = "sha256:bb48c514222702878759a05af96f4b7ecdba9b33cd4efcf25c86b882cef3a942"}, -] - -[package.extras] -docs = ["ryd"] -jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] - -[[package]] -name = "setuptools" -version = "68.2.2" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -optional = false -python-versions = ">=3.8" -files = [ - {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, - {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, -] - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" -files = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] - -[[package]] -name = "sortedcontainers" -version = "2.2.2" -description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -optional = false -python-versions = "*" -files = [ - {file = "sortedcontainers-2.2.2-py2.py3-none-any.whl", hash = "sha256:c633ebde8580f241f274c1f8994a665c0e54a17724fecd0cae2f079e09c36d3f"}, - {file = "sortedcontainers-2.2.2.tar.gz", hash = "sha256:4e73a757831fc3ca4de2859c422564239a31d8213d09a2a666e375807034d2ba"}, -] - -[[package]] -name = "texttable" -version = "1.7.0" -description = "module to create simple ASCII tables" -optional = false -python-versions = "*" -files = [ - {file = "texttable-1.7.0-py2.py3-none-any.whl", hash = "sha256:72227d592c82b3d7f672731ae73e4d1f88cd8e2ef5b075a7a7f01a23a3743917"}, - {file = "texttable-1.7.0.tar.gz", hash = "sha256:2d2068fb55115807d3ac77a4ca68fa48803e84ebb0ee2340f858107a36522638"}, -] - -[[package]] -name = "tomli" -version = "1.2.3" -description = "A lil' TOML parser" -optional = false -python-versions = ">=3.6" -files = [ - {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, - {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, -] - -[[package]] -name = "tornado" -version = "6.3.3" -description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -optional = false -python-versions = ">= 3.8" -files = [ - {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, - {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, - {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, - {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, - {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, - {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, - {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, -] - -[[package]] -name = "transitions" -version = "0.8.11" -description = "A lightweight, object-oriented Python state machine implementation with many extensions." -optional = false -python-versions = "*" -files = [ - {file = "transitions-0.8.11-py2.py3-none-any.whl", hash = "sha256:9525dd9b708b0a54bb4562a06a483d237e75c94547ba9831c81c6872d0ea1522"}, - {file = "transitions-0.8.11.tar.gz", hash = "sha256:7b20d32906ea4d60ee6f6c1f5dc9c9f178802425c5b155213eb0f25c277f04e4"}, -] - -[package.dependencies] -six = "*" - -[package.extras] -diagrams = ["pygraphviz"] -test = ["pytest"] - -[[package]] -name = "typing-extensions" -version = "4.8.0" -description = "Backported and Experimental Type Hints for Python 3.8+" -optional = false -python-versions = ">=3.8" -files = [ - {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, - {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, -] - -[[package]] -name = "urllib3" -version = "1.26.17" -description = "HTTP library with thread-safe connection pooling, file post, and more." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" -files = [ - {file = "urllib3-1.26.17-py2.py3-none-any.whl", hash = "sha256:94a757d178c9be92ef5539b8840d48dc9cf1b2709c9d6b588232a055c524458b"}, - {file = "urllib3-1.26.17.tar.gz", hash = "sha256:24d6a242c28d29af46c3fae832c36db3bbebcc533dd1bb549172cd739c82df21"}, -] - -[package.extras] -brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "urwid" -version = "2.1.2" -description = "A full-featured console (xterm et al.) user interface library" -optional = false -python-versions = "*" -files = [ - {file = "urwid-2.1.2.tar.gz", hash = "sha256:588bee9c1cb208d0906a9f73c613d2bd32c3ed3702012f51efe318a3f2127eae"}, -] - -[[package]] -name = "websocket-client" -version = "0.59.0" -description = "WebSocket client for Python with low level API options" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -files = [ - {file = "websocket-client-0.59.0.tar.gz", hash = "sha256:d376bd60eace9d437ab6d7ee16f4ab4e821c9dae591e1b783c58ebd8aaf80c5c"}, - {file = "websocket_client-0.59.0-py2.py3-none-any.whl", hash = "sha256:2e50d26ca593f70aba7b13a489435ef88b8fc3b5c5643c1ce8808ff9b40f0b32"}, -] - -[package.dependencies] -six = "*" - -[[package]] -name = "werkzeug" -version = "1.0.1" -description = "The comprehensive WSGI web application library." -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -files = [ - {file = "Werkzeug-1.0.1-py2.py3-none-any.whl", hash = "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43"}, - {file = "Werkzeug-1.0.1.tar.gz", hash = "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c"}, -] - -[package.extras] -dev = ["coverage", "pallets-sphinx-themes", "pytest", "pytest-timeout", "sphinx", "sphinx-issues", "tox"] -watchdog = ["watchdog"] - -[[package]] -name = "wsproto" -version = "0.15.0" -description = "WebSockets state-machine based protocol implementation" -optional = false -python-versions = ">=3.6.1" -files = [ - {file = "wsproto-0.15.0-py2.py3-none-any.whl", hash = "sha256:e3d190a11d9307112ba23bbe60055604949b172143969c8f641318476a9b6f1d"}, - {file = "wsproto-0.15.0.tar.gz", hash = "sha256:614798c30e5dc2b3f65acc03d2d50842b97621487350ce79a80a711229edfa9d"}, -] - -[package.dependencies] -h11 = ">=0.8.1" - -[[package]] -name = "ya-aioclient" -version = "0.6.4" -description = "" -optional = false -python-versions = ">=3.6,<4.0" -files = [ - {file = "ya-aioclient-0.6.4.tar.gz", hash = "sha256:e5e5926e3a7d834082b05aeb986d8fb2f7fa46a1bd1bca2f3f1c872e1ba479ae"}, - {file = "ya_aioclient-0.6.4-py3-none-any.whl", hash = "sha256:1d36c2544c2d7629a00a2b1f18b4535e836586cae99bfbf5714ed5ca3f9caa0c"}, -] - -[package.dependencies] -aiohttp = ">=3.6.2,<4.0.0" -certifi = ">=2020.6.20,<2021.0.0" -python-dateutil = ">=2.8.1,<3.0.0" - -[[package]] -name = "yarl" -version = "1.9.2" -description = "Yet another URL library" -optional = false -python-versions = ">=3.7" -files = [ - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, - {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, - {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, - {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, - {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, - {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, - {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, - {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, - {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, - {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, - {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, - {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, - {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, - {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, - {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, - {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, - {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, - {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, - {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, - {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, - {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, - {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, - {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, - {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, - {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, - {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, - {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, -] - -[package.dependencies] -idna = ">=2.0" -multidict = ">=4.0" - -[[package]] -name = "zstandard" -version = "0.14.1" -description = "Zstandard bindings for Python" -optional = false -python-versions = "*" -files = [ - {file = "zstandard-0.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ec1a20936484f3804fba4f29f7d8ed67c70e44536b0f0191a13eff4dc61c815c"}, - {file = "zstandard-0.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:85b37acd054f8f778e5c9832e17fb651f321a3daafa0eb94360eeffce141b0cf"}, - {file = "zstandard-0.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:95939a7e3972ec20e2e959ee9cd0fd858b25ff3a6f5040c5c78fcab51eeab030"}, - {file = "zstandard-0.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:d3999f92ab7aab2a99ac7f7730b3bee8d6bd3e52953ed0e87ab881ca4244a315"}, - {file = "zstandard-0.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:8df3114dfff411aa9827d754bb8fdcdaa15e63c96d7730778fe322f4c85360d8"}, - {file = "zstandard-0.14.1-cp27-cp27m-win32.whl", hash = "sha256:4e6d6b0e541b00d0096a260d5f6eb32f737bfcdb2e5b87a7b7be77ef669c7a6c"}, - {file = "zstandard-0.14.1-cp27-cp27m-win_amd64.whl", hash = "sha256:064aac12b8e7813fa3870e7479e9cbd3803e33212b68e555b408711ea8f6cb54"}, - {file = "zstandard-0.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:b508a826c4b99835e3d8a8d415a6e516cacad4a95ef5ed01f60f9b067f200a51"}, - {file = "zstandard-0.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a72cb707cc0a9d06e3912fe5b6c1648d70ac512f3e180018c82fe926926be12c"}, - {file = "zstandard-0.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:1c065de617b7367c4da4de687a071932e48ae200d09c0afbc24415d98aec470d"}, - {file = "zstandard-0.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:391c30620e3ad6bc53804f32e3f74cbbaa713d95f46ac5f2e54e735d1dfc51c0"}, - {file = "zstandard-0.14.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:403fa9544ecdedcc5fdc48f5e41e092658ac48222cfe6e75fb5710cb3d14c700"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:657a49b1df5a82985ea6495c6c1497a17e34e41a0bd8ef95a640342a19b8e6a4"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c3c9657417bf1eccb94ad64544e12efa8ea3e16612944b32e253314472a54e5"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:d2db7bcdc9b3e5a782d71df0163a6587b8b2f759cc4a819859e27e6ad2f778e6"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:1be45b237fea45c705d83215450a9381c2787bbf0720824b1fe23ed72f8db0b7"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux2014_i686.whl", hash = "sha256:477db538b596767d036379165a27aa2e19edbae50bec4cea195a986ba50bbad6"}, - {file = "zstandard-0.14.1-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:ac9b88a72f2dcfa3facbe6af96d59e82459e5815c15aa59481cc6080937ee02e"}, - {file = "zstandard-0.14.1-cp35-cp35m-win32.whl", hash = "sha256:2826d664eb84f9efe0fae47cf20c27f3662aae3556fbcc4cecd5318fbc9239f3"}, - {file = "zstandard-0.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:36cd223d7fd0fe0e32e82993240e9a24503269c93431e62369088e2299cf4605"}, - {file = "zstandard-0.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d4a7065d7fc991edb93483dbb7bc37dd091a2bac9572d9b9df243e6565d30522"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6f437168752e50ad6a47d054f4a41933693b1675f65663c117067747d95f057c"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e80ade52a06fb433c9ad7d6c8cfb3dafa34f05bedce543e95a670972ba41d65d"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:0b3ae587556a6f45cd982d7684b1318793430d0ae9e376dbc3d877b48ac6d576"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:d34848645f3507dc85baa8c67426f0685b08583e930fa3a1ab5048c5f0ba8fc1"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:5be097127be1659bc6cffb5d885c781e61947597e2fcd1ecf48713313e53657d"}, - {file = "zstandard-0.14.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:e3731e0dc1c200e5c2f56ca36bed6c28903f764769f534fbf9ed4178f193e8aa"}, - {file = "zstandard-0.14.1-cp36-cp36m-win32.whl", hash = "sha256:aab21dd5724aa5bdd0aac16f5d175e5df0715fc614910220a918d50f08321982"}, - {file = "zstandard-0.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:ed14a62f8bf2462f19373c337527ff684deb6d0d6b973fbcaece1f561c30f405"}, - {file = "zstandard-0.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:db1b3442441577d81bdae85fc7a4bd553e3161ec745e9dd1f2f93889248363fe"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:8486a01696e3cdfa47b93caa8f5064c9d277bad1c39eb31947bf2b8f019e3510"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4b054fd8cf274b958a3d7a201f8b42a30ebf8f76d87770075e1aca6017006e97"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:fb5f0d29bcbfba6ef9beccba55f567d089747034add5cd7e8dc58842bb745803"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:90f0bb1adcfea326c6548a45cc35474bec56a34d80310b6e78abab313da780fc"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:0b57df1f9530669d61f8708eb15ded6584db4a6733cc5155eb8561d31f292557"}, - {file = "zstandard-0.14.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:3948000d753b9110e1eb43a6cba6fdb64c895faebb47628a96550edc5238b78a"}, - {file = "zstandard-0.14.1-cp37-cp37m-win32.whl", hash = "sha256:17e8f29aae79d870daa3ab48c0dbf83594bf956c2c2125ae45cdfebd2b62d8ed"}, - {file = "zstandard-0.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d7fecb5172dc885665581437fe96bf8f03ffc0022b723964c272accbb62713b4"}, - {file = "zstandard-0.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2fd76d29f4e8d7c4aac42617a0439506144146032b5d7b9b0a42f37f916fdb2"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:7309bf511c8b332be2b5a834efbd7ee0cd43db2c811dd916fd0f48acd43e8722"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:a51a09a3be208e627ebb518a78c639d240584f5d1da8106dcafa31d22103b4df"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a820ef78f39c29469caacb0bf43ffd024b78f242393c605daa748588b3247306"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:e3963c919f65367587cf987a71991e69385f19cec9ad8166249b83e176cdbcd8"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:0e5b8fd428d0d00fb7dabc0898de9e87659cb54738d527becff37d3d90df8e88"}, - {file = "zstandard-0.14.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:41eab10e6570e14dd77a346f3dbb1eab3f23a652bce07ba47c8c23116b0cee9c"}, - {file = "zstandard-0.14.1-cp38-cp38-win32.whl", hash = "sha256:fbbe18afb67329577ab6a907f348175d3f6044d179a9b56b02206ff9e67c5b12"}, - {file = "zstandard-0.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:3bd044ef32bd6738c3db2cb2d4bc77812e9a3132df942303bbfcd1a484023b60"}, - {file = "zstandard-0.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:24ab8f1c7c970822bd55dbb091f7eb271b417e777e8b3ae6722e60d67f747c05"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:cf67443d06b88218eb8915da2d968dcf6fdc384fb245f97155617ff3b8d77e92"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d78db92ac27cdcd55333b7e642cd400719842e692e8836f0b249e459b26d384b"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bd4da25cc46e972b029f8aa9f103c5977dbe461e1916ff7edec24065071b4a08"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:2075be64372206af3df40fef0fee657b44845d3e6d98b4cc8aba220be861de2d"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:70dfe74b24971476a6a20d42abb964c9ac0fb1af7b89228e5845748377543bd0"}, - {file = "zstandard-0.14.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:3382ce6e44e9e847dce848bc2638403aa9320cb38edcc34b71e13be5793619e0"}, - {file = "zstandard-0.14.1-cp39-cp39-win32.whl", hash = "sha256:7161d71debb94c456cbddd8a239e89219f37f0b1a4c0620a2c1400801aeeec7d"}, - {file = "zstandard-0.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d2ec8309309fc7254d21286d6b3e5c28e4019cd8e266d1a860456a69ea7c2400"}, - {file = "zstandard-0.14.1.tar.gz", hash = "sha256:5dd700e52ec28c64d43f681ccde76b6436c8f89a332d6c9e22a6b629f28daeb5"}, -] - -[metadata] -lock-version = "2.0" -python-versions = "^3.10.1" -content-hash = "2f2cc4545adb5436924a94e2b87e674b5e345b0cfb8e4287961d80605a9a2cd3" +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. + +[[package]] +name = "aiohttp" +version = "3.8.5" +description = "Async http client/server framework (asyncio)" +optional = false +python-versions = ">=3.6" +files = [ + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a94159871304770da4dd371f4291b20cac04e8c94f11bdea1c3478e557fbe0d8"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:13bf85afc99ce6f9ee3567b04501f18f9f8dbbb2ea11ed1a2e079670403a7c84"}, + {file = "aiohttp-3.8.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2ce2ac5708501afc4847221a521f7e4b245abf5178cf5ddae9d5b3856ddb2f3a"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96943e5dcc37a6529d18766597c491798b7eb7a61d48878611298afc1fca946c"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2ad5c3c4590bb3cc28b4382f031f3783f25ec223557124c68754a2231d989e2b"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0c413c633d0512df4dc7fd2373ec06cc6a815b7b6d6c2f208ada7e9e93a5061d"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df72ac063b97837a80d80dec8d54c241af059cc9bb42c4de68bd5b61ceb37caa"}, + {file = "aiohttp-3.8.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c48c5c0271149cfe467c0ff8eb941279fd6e3f65c9a388c984e0e6cf57538e14"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:368a42363c4d70ab52c2c6420a57f190ed3dfaca6a1b19afda8165ee16416a82"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7607ec3ce4993464368505888af5beb446845a014bc676d349efec0e05085905"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0d21c684808288a98914e5aaf2a7c6a3179d4df11d249799c32d1808e79503b5"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:312fcfbacc7880a8da0ae8b6abc6cc7d752e9caa0051a53d217a650b25e9a691"}, + {file = "aiohttp-3.8.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ad093e823df03bb3fd37e7dec9d4670c34f9e24aeace76808fc20a507cace825"}, + {file = "aiohttp-3.8.5-cp310-cp310-win32.whl", hash = "sha256:33279701c04351a2914e1100b62b2a7fdb9a25995c4a104259f9a5ead7ed4802"}, + {file = "aiohttp-3.8.5-cp310-cp310-win_amd64.whl", hash = "sha256:6e4a280e4b975a2e7745573e3fc9c9ba0d1194a3738ce1cbaa80626cc9b4f4df"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ae871a964e1987a943d83d6709d20ec6103ca1eaf52f7e0d36ee1b5bebb8b9b9"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:461908b2578955045efde733719d62f2b649c404189a09a632d245b445c9c975"}, + {file = "aiohttp-3.8.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:72a860c215e26192379f57cae5ab12b168b75db8271f111019509a1196dfc780"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc14be025665dba6202b6a71cfcdb53210cc498e50068bc088076624471f8bb9"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8af740fc2711ad85f1a5c034a435782fbd5b5f8314c9a3ef071424a8158d7f6b"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:841cd8233cbd2111a0ef0a522ce016357c5e3aff8a8ce92bcfa14cef890d698f"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ed1c46fb119f1b59304b5ec89f834f07124cd23ae5b74288e364477641060ff"}, + {file = "aiohttp-3.8.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:84f8ae3e09a34f35c18fa57f015cc394bd1389bce02503fb30c394d04ee6b938"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:62360cb771707cb70a6fd114b9871d20d7dd2163a0feafe43fd115cfe4fe845e"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:23fb25a9f0a1ca1f24c0a371523546366bb642397c94ab45ad3aedf2941cec6a"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:b0ba0d15164eae3d878260d4c4df859bbdc6466e9e6689c344a13334f988bb53"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5d20003b635fc6ae3f96d7260281dfaf1894fc3aa24d1888a9b2628e97c241e5"}, + {file = "aiohttp-3.8.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0175d745d9e85c40dcc51c8f88c74bfbaef9e7afeeeb9d03c37977270303064c"}, + {file = "aiohttp-3.8.5-cp311-cp311-win32.whl", hash = "sha256:2e1b1e51b0774408f091d268648e3d57f7260c1682e7d3a63cb00d22d71bb945"}, + {file = "aiohttp-3.8.5-cp311-cp311-win_amd64.whl", hash = "sha256:043d2299f6dfdc92f0ac5e995dfc56668e1587cea7f9aa9d8a78a1b6554e5755"}, + {file = "aiohttp-3.8.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cae533195e8122584ec87531d6df000ad07737eaa3c81209e85c928854d2195c"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4f21e83f355643c345177a5d1d8079f9f28b5133bcd154193b799d380331d5d3"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a7a75ef35f2df54ad55dbf4b73fe1da96f370e51b10c91f08b19603c64004acc"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e2e9839e14dd5308ee773c97115f1e0a1cb1d75cbeeee9f33824fa5144c7634"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44e65da1de4403d0576473e2344828ef9c4c6244d65cf4b75549bb46d40b8dd"}, + {file = "aiohttp-3.8.5-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:78d847e4cde6ecc19125ccbc9bfac4a7ab37c234dd88fbb3c5c524e8e14da543"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c7a815258e5895d8900aec4454f38dca9aed71085f227537208057853f9d13f2"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:8b929b9bd7cd7c3939f8bcfffa92fae7480bd1aa425279d51a89327d600c704d"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5db3a5b833764280ed7618393832e0853e40f3d3e9aa128ac0ba0f8278d08649"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:a0215ce6041d501f3155dc219712bc41252d0ab76474615b9700d63d4d9292af"}, + {file = "aiohttp-3.8.5-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:fd1ed388ea7fbed22c4968dd64bab0198de60750a25fe8c0c9d4bef5abe13824"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win32.whl", hash = "sha256:6e6783bcc45f397fdebc118d772103d751b54cddf5b60fbcc958382d7dd64f3e"}, + {file = "aiohttp-3.8.5-cp36-cp36m-win_amd64.whl", hash = "sha256:b5411d82cddd212644cf9360879eb5080f0d5f7d809d03262c50dad02f01421a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:01d4c0c874aa4ddfb8098e85d10b5e875a70adc63db91f1ae65a4b04d3344cda"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e5980a746d547a6ba173fd5ee85ce9077e72d118758db05d229044b469d9029a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2a482e6da906d5e6e653be079b29bc173a48e381600161c9932d89dfae5942ef"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80bd372b8d0715c66c974cf57fe363621a02f359f1ec81cba97366948c7fc873"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1161b345c0a444ebcf46bf0a740ba5dcf50612fd3d0528883fdc0eff578006a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd56db019015b6acfaaf92e1ac40eb8434847d9bf88b4be4efe5bfd260aee692"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:153c2549f6c004d2754cc60603d4668899c9895b8a89397444a9c4efa282aaf4"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4a01951fabc4ce26ab791da5f3f24dca6d9a6f24121746eb19756416ff2d881b"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bfb9162dcf01f615462b995a516ba03e769de0789de1cadc0f916265c257e5d8"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7dde0009408969a43b04c16cbbe252c4f5ef4574ac226bc8815cd7342d2028b6"}, + {file = "aiohttp-3.8.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:4149d34c32f9638f38f544b3977a4c24052042affa895352d3636fa8bffd030a"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win32.whl", hash = "sha256:68c5a82c8779bdfc6367c967a4a1b2aa52cd3595388bf5961a62158ee8a59e22"}, + {file = "aiohttp-3.8.5-cp37-cp37m-win_amd64.whl", hash = "sha256:2cf57fb50be5f52bda004b8893e63b48530ed9f0d6c96c84620dc92fe3cd9b9d"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:eca4bf3734c541dc4f374ad6010a68ff6c6748f00451707f39857f429ca36ced"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1274477e4c71ce8cfe6c1ec2f806d57c015ebf84d83373676036e256bc55d690"}, + {file = "aiohttp-3.8.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:28c543e54710d6158fc6f439296c7865b29e0b616629767e685a7185fab4a6b9"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:910bec0c49637d213f5d9877105d26e0c4a4de2f8b1b29405ff37e9fc0ad52b8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5443910d662db951b2e58eb70b0fbe6b6e2ae613477129a5805d0b66c54b6cb7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2e460be6978fc24e3df83193dc0cc4de46c9909ed92dd47d349a452ef49325b7"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fb1558def481d84f03b45888473fc5a1f35747b5f334ef4e7a571bc0dfcb11f8"}, + {file = "aiohttp-3.8.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34dd0c107799dcbbf7d48b53be761a013c0adf5571bf50c4ecad5643fe9cfcd0"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aa1990247f02a54185dc0dff92a6904521172a22664c863a03ff64c42f9b5410"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0e584a10f204a617d71d359fe383406305a4b595b333721fa50b867b4a0a1548"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:a3cf433f127efa43fee6b90ea4c6edf6c4a17109d1d037d1a52abec84d8f2e42"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:c11f5b099adafb18e65c2c997d57108b5bbeaa9eeee64a84302c0978b1ec948b"}, + {file = "aiohttp-3.8.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:84de26ddf621d7ac4c975dbea4c945860e08cccde492269db4e1538a6a6f3c35"}, + {file = "aiohttp-3.8.5-cp38-cp38-win32.whl", hash = "sha256:ab88bafedc57dd0aab55fa728ea10c1911f7e4d8b43e1d838a1739f33712921c"}, + {file = "aiohttp-3.8.5-cp38-cp38-win_amd64.whl", hash = "sha256:5798a9aad1879f626589f3df0f8b79b3608a92e9beab10e5fda02c8a2c60db2e"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a6ce61195c6a19c785df04e71a4537e29eaa2c50fe745b732aa937c0c77169f3"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:773dd01706d4db536335fcfae6ea2440a70ceb03dd3e7378f3e815b03c97ab51"}, + {file = "aiohttp-3.8.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f83a552443a526ea38d064588613aca983d0ee0038801bc93c0c916428310c28"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f7372f7341fcc16f57b2caded43e81ddd18df53320b6f9f042acad41f8e049a"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea353162f249c8097ea63c2169dd1aa55de1e8fecbe63412a9bc50816e87b761"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d47ae48db0b2dcf70bc8a3bc72b3de86e2a590fc299fdbbb15af320d2659de"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d827176898a2b0b09694fbd1088c7a31836d1a505c243811c87ae53a3f6273c1"}, + {file = "aiohttp-3.8.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3562b06567c06439d8b447037bb655ef69786c590b1de86c7ab81efe1c9c15d8"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4e874cbf8caf8959d2adf572a78bba17cb0e9d7e51bb83d86a3697b686a0ab4d"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6809a00deaf3810e38c628e9a33271892f815b853605a936e2e9e5129762356c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:33776e945d89b29251b33a7e7d006ce86447b2cfd66db5e5ded4e5cd0340585c"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:eaeed7abfb5d64c539e2db173f63631455f1196c37d9d8d873fc316470dfbacd"}, + {file = "aiohttp-3.8.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:e91d635961bec2d8f19dfeb41a539eb94bd073f075ca6dae6c8dc0ee89ad6f91"}, + {file = "aiohttp-3.8.5-cp39-cp39-win32.whl", hash = "sha256:00ad4b6f185ec67f3e6562e8a1d2b69660be43070bd0ef6fcec5211154c7df67"}, + {file = "aiohttp-3.8.5-cp39-cp39-win_amd64.whl", hash = "sha256:c0a9034379a37ae42dea7ac1e048352d96286626251862e448933c0f59cbd79c"}, + {file = "aiohttp-3.8.5.tar.gz", hash = "sha256:b9552ec52cc147dbf1944ac7ac98af7602e51ea2dcd076ed194ca3c0d1c7d0bc"}, +] + +[package.dependencies] +aiosignal = ">=1.1.2" +async-timeout = ">=4.0.0a3,<5.0" +attrs = ">=17.3.0" +charset-normalizer = ">=2.0,<4.0" +frozenlist = ">=1.1.1" +multidict = ">=4.5,<7.0" +yarl = ">=1.0,<2.0" + +[package.extras] +speedups = ["Brotli", "aiodns", "cchardet"] + +[[package]] +name = "aiosignal" +version = "1.3.1" +description = "aiosignal: a list of registered asynchronous callbacks" +optional = false +python-versions = ">=3.7" +files = [ + {file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"}, + {file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"}, +] + +[package.dependencies] +frozenlist = ">=1.1.0" + +[[package]] +name = "ansicolors" +version = "1.1.8" +description = "ANSI colors for Python" +optional = false +python-versions = "*" +files = [ + {file = "ansicolors-1.1.8-py2.py3-none-any.whl", hash = "sha256:00d2dde5a675579325902536738dd27e4fac1fd68f773fe36c21044eb559e187"}, + {file = "ansicolors-1.1.8.zip", hash = "sha256:99f94f5e3348a0bcd43c82e5fc4414013ccc19d70bd939ad71e0133ce9c372e0"}, +] + +[[package]] +name = "appdirs" +version = "1.4.4" +description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = "*" +files = [ + {file = "appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128"}, + {file = "appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41"}, +] + +[[package]] +name = "asgiref" +version = "3.3.4" +description = "ASGI specs, helper code, and adapters" +optional = false +python-versions = ">=3.6" +files = [ + {file = "asgiref-3.3.4-py3-none-any.whl", hash = "sha256:92906c611ce6c967347bbfea733f13d6313901d54dcca88195eaeb52b2a8e8ee"}, + {file = "asgiref-3.3.4.tar.gz", hash = "sha256:d1216dfbdfb63826470995d31caed36225dcaf34f182e0fa257a4dd9e86f1b78"}, +] + +[package.extras] +tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] + +[[package]] +name = "async-timeout" +version = "4.0.3" +description = "Timeout context manager for asyncio programs" +optional = false +python-versions = ">=3.7" +files = [ + {file = "async-timeout-4.0.3.tar.gz", hash = "sha256:4640d96be84d82d02ed59ea2b7105a0f7b33abe8703703cd0ab0bf87c427522f"}, + {file = "async_timeout-4.0.3-py3-none-any.whl", hash = "sha256:7405140ff1230c310e51dc27b3145b9092d659ce68ff733fb0cefe3ee42be028"}, +] + +[[package]] +name = "attrs" +version = "23.1.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.1.0-py3-none-any.whl", hash = "sha256:1f28b4522cdc2fb4256ac1a020c78acf9cba2c6b461ccd2c126f3aa8e8335d04"}, + {file = "attrs-23.1.0.tar.gz", hash = "sha256:6279836d581513a26f1bf235f9acd333bc9115683f14f7e8fae46c98fc50e015"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[docs,tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "pytest-xdist[psutil]"] + +[[package]] +name = "bcrypt" +version = "4.0.1" +description = "Modern password hashing for your software and your servers" +optional = false +python-versions = ">=3.6" +files = [ + {file = "bcrypt-4.0.1-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:b1023030aec778185a6c16cf70f359cbb6e0c289fd564a7cfa29e727a1c38f8f"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:08d2947c490093a11416df18043c27abe3921558d2c03e2076ccb28a116cb6d0"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0eaa47d4661c326bfc9d08d16debbc4edf78778e6aaba29c1bc7ce67214d4410"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae88eca3024bb34bb3430f964beab71226e761f51b912de5133470b649d82344"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_24_x86_64.whl", hash = "sha256:a522427293d77e1c29e303fc282e2d71864579527a04ddcfda6d4f8396c6c36a"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:fbdaec13c5105f0c4e5c52614d04f0bca5f5af007910daa8b6b12095edaa67b3"}, + {file = "bcrypt-4.0.1-cp36-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:ca3204d00d3cb2dfed07f2d74a25f12fc12f73e606fcaa6975d1f7ae69cacbb2"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:089098effa1bc35dc055366740a067a2fc76987e8ec75349eb9484061c54f535"}, + {file = "bcrypt-4.0.1-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:e9a51bbfe7e9802b5f3508687758b564069ba937748ad7b9e890086290d2f79e"}, + {file = "bcrypt-4.0.1-cp36-abi3-win32.whl", hash = "sha256:2caffdae059e06ac23fce178d31b4a702f2a3264c20bfb5ff541b338194d8fab"}, + {file = "bcrypt-4.0.1-cp36-abi3-win_amd64.whl", hash = "sha256:8a68f4341daf7522fe8d73874de8906f3a339048ba406be6ddc1b3ccb16fc0d9"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf4fa8b2ca74381bb5442c089350f09a3f17797829d958fad058d6e44d9eb83c"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:67a97e1c405b24f19d08890e7ae0c4f7ce1e56a712a016746c8b2d7732d65d4b"}, + {file = "bcrypt-4.0.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b3b85202d95dd568efcb35b53936c5e3b3600c7cdcc6115ba461df3a8e89f38d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbb03eec97496166b704ed663a53680ab57c5084b2fc98ef23291987b525cb7d"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:5ad4d32a28b80c5fa6671ccfb43676e8c1cc232887759d1cd7b6f56ea4355215"}, + {file = "bcrypt-4.0.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b57adba8a1444faf784394de3436233728a1ecaeb6e07e8c22c8848f179b893c"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:705b2cea8a9ed3d55b4491887ceadb0106acf7c6387699fca771af56b1cdeeda"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_24_x86_64.whl", hash = "sha256:2b3ac11cf45161628f1f3733263e63194f22664bf4d0c0f3ab34099c02134665"}, + {file = "bcrypt-4.0.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3100851841186c25f127731b9fa11909ab7b1df6fc4b9f8353f4f1fd952fbf71"}, + {file = "bcrypt-4.0.1.tar.gz", hash = "sha256:27d375903ac8261cfe4047f6709d16f7d18d39b1ec92aaf72af989552a650ebd"}, +] + +[package.extras] +tests = ["pytest (>=3.2.1,!=3.3.0)"] +typecheck = ["mypy"] + +[[package]] +name = "black" +version = "21.7b0" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.6.2" +files = [ + {file = "black-21.7b0-py3-none-any.whl", hash = "sha256:1c7aa6ada8ee864db745b22790a32f94b2795c253a75d6d9b5e439ff10d23116"}, + {file = "black-21.7b0.tar.gz", hash = "sha256:c8373c6491de9362e39271630b65b964607bc5c79c83783547d76c839b3aa219"}, +] + +[package.dependencies] +appdirs = "*" +click = ">=7.1.2" +mypy-extensions = ">=0.4.3" +pathspec = ">=0.8.1,<1" +regex = ">=2020.1.8" +tomli = ">=0.2.6,<2.0.0" + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.6.0)", "aiohttp-cors (>=0.4.0)"] +python2 = ["typed-ast (>=1.4.2)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "blinker" +version = "1.4" +description = "Fast, simple object-to-object and broadcast signaling" +optional = false +python-versions = "*" +files = [ + {file = "blinker-1.4.tar.gz", hash = "sha256:471aee25f3992bd325afa3772f1063dbdbbca947a041b8b89466dc00d606f8b6"}, +] + +[[package]] +name = "brotli" +version = "1.0.9" +description = "Python bindings for the Brotli compression library" +optional = false +python-versions = "*" +files = [ + {file = "Brotli-1.0.9-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:268fe94547ba25b58ebc724680609c8ee3e5a843202e9a381f6f9c5e8bdb5c70"}, + {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:c2415d9d082152460f2bd4e382a1e85aed233abc92db5a3880da2257dc7daf7b"}, + {file = "Brotli-1.0.9-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5913a1177fc36e30fcf6dc868ce23b0453952c78c04c266d3149b3d39e1410d6"}, + {file = "Brotli-1.0.9-cp27-cp27m-win32.whl", hash = "sha256:afde17ae04d90fbe53afb628f7f2d4ca022797aa093e809de5c3cf276f61bbfa"}, + {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7cb81373984cc0e4682f31bc3d6be9026006d96eecd07ea49aafb06897746452"}, + {file = "Brotli-1.0.9-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:db844eb158a87ccab83e868a762ea8024ae27337fc7ddcbfcddd157f841fdfe7"}, + {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9744a863b489c79a73aba014df554b0e7a0fc44ef3f8a0ef2a52919c7d155031"}, + {file = "Brotli-1.0.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a72661af47119a80d82fa583b554095308d6a4c356b2a554fdc2799bc19f2a43"}, + {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ee83d3e3a024a9618e5be64648d6d11c37047ac48adff25f12fa4226cf23d1c"}, + {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:19598ecddd8a212aedb1ffa15763dd52a388518c4550e615aed88dc3753c0f0c"}, + {file = "Brotli-1.0.9-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:44bb8ff420c1d19d91d79d8c3574b8954288bdff0273bf788954064d260d7ab0"}, + {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e23281b9a08ec338469268f98f194658abfb13658ee98e2b7f85ee9dd06caa91"}, + {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3496fc835370da351d37cada4cf744039616a6db7d13c430035e901443a34daa"}, + {file = "Brotli-1.0.9-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b83bb06a0192cccf1eb8d0a28672a1b79c74c3a8a5f2619625aeb6f28b3a82bb"}, + {file = "Brotli-1.0.9-cp310-cp310-win32.whl", hash = "sha256:26d168aac4aaec9a4394221240e8a5436b5634adc3cd1cdf637f6645cecbf181"}, + {file = "Brotli-1.0.9-cp310-cp310-win_amd64.whl", hash = "sha256:622a231b08899c864eb87e85f81c75e7b9ce05b001e59bbfbf43d4a71f5f32b2"}, + {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cc0283a406774f465fb45ec7efb66857c09ffefbe49ec20b7882eff6d3c86d3a"}, + {file = "Brotli-1.0.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:11d3283d89af7033236fa4e73ec2cbe743d4f6a81d41bd234f24bf63dde979df"}, + {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3c1306004d49b84bd0c4f90457c6f57ad109f5cc6067a9664e12b7b79a9948ad"}, + {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1375b5d17d6145c798661b67e4ae9d5496920d9265e2f00f1c2c0b5ae91fbde"}, + {file = "Brotli-1.0.9-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cab1b5964b39607a66adbba01f1c12df2e55ac36c81ec6ed44f2fca44178bf1a"}, + {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8ed6a5b3d23ecc00ea02e1ed8e0ff9a08f4fc87a1f58a2530e71c0f48adf882f"}, + {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cb02ed34557afde2d2da68194d12f5719ee96cfb2eacc886352cb73e3808fc5d"}, + {file = "Brotli-1.0.9-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:b3523f51818e8f16599613edddb1ff924eeb4b53ab7e7197f85cbc321cdca32f"}, + {file = "Brotli-1.0.9-cp311-cp311-win32.whl", hash = "sha256:ba72d37e2a924717990f4d7482e8ac88e2ef43fb95491eb6e0d124d77d2a150d"}, + {file = "Brotli-1.0.9-cp311-cp311-win_amd64.whl", hash = "sha256:3ffaadcaeafe9d30a7e4e1e97ad727e4f5610b9fa2f7551998471e3736738679"}, + {file = "Brotli-1.0.9-cp35-cp35m-macosx_10_6_intel.whl", hash = "sha256:c83aa123d56f2e060644427a882a36b3c12db93727ad7a7b9efd7d7f3e9cc2c4"}, + {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:6b2ae9f5f67f89aade1fab0f7fd8f2832501311c363a21579d02defa844d9296"}, + {file = "Brotli-1.0.9-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:68715970f16b6e92c574c30747c95cf8cf62804569647386ff032195dc89a430"}, + {file = "Brotli-1.0.9-cp35-cp35m-win32.whl", hash = "sha256:defed7ea5f218a9f2336301e6fd379f55c655bea65ba2476346340a0ce6f74a1"}, + {file = "Brotli-1.0.9-cp35-cp35m-win_amd64.whl", hash = "sha256:88c63a1b55f352b02c6ffd24b15ead9fc0e8bf781dbe070213039324922a2eea"}, + {file = "Brotli-1.0.9-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:503fa6af7da9f4b5780bb7e4cbe0c639b010f12be85d02c99452825dd0feef3f"}, + {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:40d15c79f42e0a2c72892bf407979febd9cf91f36f495ffb333d1d04cebb34e4"}, + {file = "Brotli-1.0.9-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:93130612b837103e15ac3f9cbacb4613f9e348b58b3aad53721d92e57f96d46a"}, + {file = "Brotli-1.0.9-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:87fdccbb6bb589095f413b1e05734ba492c962b4a45a13ff3408fa44ffe6479b"}, + {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:6d847b14f7ea89f6ad3c9e3901d1bc4835f6b390a9c71df999b0162d9bb1e20f"}, + {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:495ba7e49c2db22b046a53b469bbecea802efce200dffb69b93dd47397edc9b6"}, + {file = "Brotli-1.0.9-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:4688c1e42968ba52e57d8670ad2306fe92e0169c6f3af0089be75bbac0c64a3b"}, + {file = "Brotli-1.0.9-cp36-cp36m-win32.whl", hash = "sha256:61a7ee1f13ab913897dac7da44a73c6d44d48a4adff42a5701e3239791c96e14"}, + {file = "Brotli-1.0.9-cp36-cp36m-win_amd64.whl", hash = "sha256:1c48472a6ba3b113452355b9af0a60da5c2ae60477f8feda8346f8fd48e3e87c"}, + {file = "Brotli-1.0.9-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b78a24b5fd13c03ee2b7b86290ed20efdc95da75a3557cc06811764d5ad1126"}, + {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:9d12cf2851759b8de8ca5fde36a59c08210a97ffca0eb94c532ce7b17c6a3d1d"}, + {file = "Brotli-1.0.9-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:6c772d6c0a79ac0f414a9f8947cc407e119b8598de7621f39cacadae3cf57d12"}, + {file = "Brotli-1.0.9-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29d1d350178e5225397e28ea1b7aca3648fcbab546d20e7475805437bfb0a130"}, + {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7bbff90b63328013e1e8cb50650ae0b9bac54ffb4be6104378490193cd60f85a"}, + {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ec1947eabbaf8e0531e8e899fc1d9876c179fc518989461f5d24e2223395a9e3"}, + {file = "Brotli-1.0.9-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:12effe280b8ebfd389022aa65114e30407540ccb89b177d3fbc9a4f177c4bd5d"}, + {file = "Brotli-1.0.9-cp37-cp37m-win32.whl", hash = "sha256:f909bbbc433048b499cb9db9e713b5d8d949e8c109a2a548502fb9aa8630f0b1"}, + {file = "Brotli-1.0.9-cp37-cp37m-win_amd64.whl", hash = "sha256:97f715cf371b16ac88b8c19da00029804e20e25f30d80203417255d239f228b5"}, + {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e16eb9541f3dd1a3e92b89005e37b1257b157b7256df0e36bd7b33b50be73bcb"}, + {file = "Brotli-1.0.9-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:160c78292e98d21e73a4cc7f76a234390e516afcd982fa17e1422f7c6a9ce9c8"}, + {file = "Brotli-1.0.9-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b663f1e02de5d0573610756398e44c130add0eb9a3fc912a09665332942a2efb"}, + {file = "Brotli-1.0.9-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:5b6ef7d9f9c38292df3690fe3e302b5b530999fa90014853dcd0d6902fb59f26"}, + {file = "Brotli-1.0.9-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8a674ac10e0a87b683f4fa2b6fa41090edfd686a6524bd8dedbd6138b309175c"}, + {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e2d9e1cbc1b25e22000328702b014227737756f4b5bf5c485ac1d8091ada078b"}, + {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b336c5e9cf03c7be40c47b5fd694c43c9f1358a80ba384a21969e0b4e66a9b17"}, + {file = "Brotli-1.0.9-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:85f7912459c67eaab2fb854ed2bc1cc25772b300545fe7ed2dc03954da638649"}, + {file = "Brotli-1.0.9-cp38-cp38-win32.whl", hash = "sha256:35a3edbe18e876e596553c4007a087f8bcfd538f19bc116917b3c7522fca0429"}, + {file = "Brotli-1.0.9-cp38-cp38-win_amd64.whl", hash = "sha256:269a5743a393c65db46a7bb982644c67ecba4b8d91b392403ad8a861ba6f495f"}, + {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2aad0e0baa04517741c9bb5b07586c642302e5fb3e75319cb62087bd0995ab19"}, + {file = "Brotli-1.0.9-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5cb1e18167792d7d21e21365d7650b72d5081ed476123ff7b8cac7f45189c0c7"}, + {file = "Brotli-1.0.9-cp39-cp39-manylinux1_i686.whl", hash = "sha256:16d528a45c2e1909c2798f27f7bf0a3feec1dc9e50948e738b961618e38b6a7b"}, + {file = "Brotli-1.0.9-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:56d027eace784738457437df7331965473f2c0da2c70e1a1f6fdbae5402e0389"}, + {file = "Brotli-1.0.9-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9bf919756d25e4114ace16a8ce91eb340eb57a08e2c6950c3cebcbe3dff2a5e7"}, + {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:e4c4e92c14a57c9bd4cb4be678c25369bf7a092d55fd0866f759e425b9660806"}, + {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e48f4234f2469ed012a98f4b7874e7f7e173c167bed4934912a29e03167cf6b1"}, + {file = "Brotli-1.0.9-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9ed4c92a0665002ff8ea852353aeb60d9141eb04109e88928026d3c8a9e5433c"}, + {file = "Brotli-1.0.9-cp39-cp39-win32.whl", hash = "sha256:cfc391f4429ee0a9370aa93d812a52e1fee0f37a81861f4fdd1f4fb28e8547c3"}, + {file = "Brotli-1.0.9-cp39-cp39-win_amd64.whl", hash = "sha256:854c33dad5ba0fbd6ab69185fec8dab89e13cda6b7d191ba111987df74f38761"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9749a124280a0ada4187a6cfd1ffd35c350fb3af79c706589d98e088c5044267"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:73fd30d4ce0ea48010564ccee1a26bfe39323fde05cb34b5863455629db61dc7"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02177603aaca36e1fd21b091cb742bb3b305a569e2402f1ca38af471777fb019"}, + {file = "Brotli-1.0.9-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:76ffebb907bec09ff511bb3acc077695e2c32bc2142819491579a695f77ffd4d"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b43775532a5904bc938f9c15b77c613cb6ad6fb30990f3b0afaea82797a402d8"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5bf37a08493232fbb0f8229f1824b366c2fc1d02d64e7e918af40acd15f3e337"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:330e3f10cd01da535c70d09c4283ba2df5fb78e915bea0a28becad6e2ac010be"}, + {file = "Brotli-1.0.9-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:e1abbeef02962596548382e393f56e4c94acd286bd0c5afba756cffc33670e8a"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3148362937217b7072cf80a2dcc007f09bb5ecb96dae4617316638194113d5be"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:336b40348269f9b91268378de5ff44dc6fbaa2268194f85177b53463d313842a"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b8b09a16a1950b9ef495a0f8b9d0a87599a9d1f179e2d4ac014b2ec831f87e7"}, + {file = "Brotli-1.0.9-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:c8e521a0ce7cf690ca84b8cc2272ddaf9d8a50294fd086da67e517439614c755"}, + {file = "Brotli-1.0.9.zip", hash = "sha256:4d1b810aa0ed773f81dceda2cc7b403d01057458730e309856356d4ef4188438"}, +] + +[[package]] +name = "certifi" +version = "2020.12.5" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = "*" +files = [ + {file = "certifi-2020.12.5-py2.py3-none-any.whl", hash = "sha256:719a74fb9e33b9bd44cc7f3a8d94bc35e4049deebe19ba7d8e108280cfd59830"}, + {file = "certifi-2020.12.5.tar.gz", hash = "sha256:1a4995114262bffbc2413b159f2a1a480c969de6e6eb13ee966d470af86af59c"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "charset-normalizer" +version = "3.3.0" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.0.tar.gz", hash = "sha256:63563193aec44bce707e0c5ca64ff69fa72ed7cf34ce6e11d5127555756fd2f6"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effe5406c9bd748a871dbcaf3ac69167c38d72db8c9baf3ff954c344f31c4cbe"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4162918ef3098851fcd8a628bf9b6a98d10c380725df9e04caf5ca6dd48c847a"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0570d21da019941634a531444364f2482e8db0b3425fcd5ac0c36565a64142c8"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5707a746c6083a3a74b46b3a631d78d129edab06195a92a8ece755aac25a3f3d"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:278c296c6f96fa686d74eb449ea1697f3c03dc28b75f873b65b5201806346a69"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a4b71f4d1765639372a3b32d2638197f5cd5221b19531f9245fcc9ee62d38f56"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5969baeaea61c97efa706b9b107dcba02784b1601c74ac84f2a532ea079403e"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a3f93dab657839dfa61025056606600a11d0b696d79386f974e459a3fbc568ec"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:db756e48f9c5c607b5e33dd36b1d5872d0422e960145b08ab0ec7fd420e9d649"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:232ac332403e37e4a03d209a3f92ed9071f7d3dbda70e2a5e9cff1c4ba9f0678"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e5c1502d4ace69a179305abb3f0bb6141cbe4714bc9b31d427329a95acfc8bdd"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:2502dd2a736c879c0f0d3e2161e74d9907231e25d35794584b1ca5284e43f596"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23e8565ab7ff33218530bc817922fae827420f143479b753104ab801145b1d5b"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-win32.whl", hash = "sha256:1872d01ac8c618a8da634e232f24793883d6e456a66593135aeafe3784b0848d"}, + {file = "charset_normalizer-3.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:557b21a44ceac6c6b9773bc65aa1b4cc3e248a5ad2f5b914b91579a32e22204d"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d7eff0f27edc5afa9e405f7165f85a6d782d308f3b6b9d96016c010597958e63"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a685067d05e46641d5d1623d7c7fdf15a357546cbb2f71b0ebde91b175ffc3e"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0d3d5b7db9ed8a2b11a774db2bbea7ba1884430a205dbd54a32d61d7c2a190fa"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2935ffc78db9645cb2086c2f8f4cfd23d9b73cc0dc80334bc30aac6f03f68f8c"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9fe359b2e3a7729010060fbca442ca225280c16e923b37db0e955ac2a2b72a05"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:380c4bde80bce25c6e4f77b19386f5ec9db230df9f2f2ac1e5ad7af2caa70459"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0d1e3732768fecb052d90d62b220af62ead5748ac51ef61e7b32c266cac9293"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b2919306936ac6efb3aed1fbf81039f7087ddadb3160882a57ee2ff74fd2382"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f8888e31e3a85943743f8fc15e71536bda1c81d5aa36d014a3c0c44481d7db6e"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:82eb849f085624f6a607538ee7b83a6d8126df6d2f7d3b319cb837b289123078"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7b8b8bf1189b3ba9b8de5c8db4d541b406611a71a955bbbd7385bbc45fcb786c"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5adf257bd58c1b8632046bbe43ee38c04e1038e9d37de9c57a94d6bd6ce5da34"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c350354efb159b8767a6244c166f66e67506e06c8924ed74669b2c70bc8735b1"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-win32.whl", hash = "sha256:02af06682e3590ab952599fbadac535ede5d60d78848e555aa58d0c0abbde786"}, + {file = "charset_normalizer-3.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:86d1f65ac145e2c9ed71d8ffb1905e9bba3a91ae29ba55b4c46ae6fc31d7c0d4"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:3b447982ad46348c02cb90d230b75ac34e9886273df3a93eec0539308a6296d7"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:abf0d9f45ea5fb95051c8bfe43cb40cda383772f7e5023a83cc481ca2604d74e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b09719a17a2301178fac4470d54b1680b18a5048b481cb8890e1ef820cb80455"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b3d9b48ee6e3967b7901c052b670c7dda6deb812c309439adaffdec55c6d7b78"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:edfe077ab09442d4ef3c52cb1f9dab89bff02f4524afc0acf2d46be17dc479f5"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3debd1150027933210c2fc321527c2299118aa929c2f5a0a80ab6953e3bd1908"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:86f63face3a527284f7bb8a9d4f78988e3c06823f7bea2bd6f0e0e9298ca0403"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:24817cb02cbef7cd499f7c9a2735286b4782bd47a5b3516a0e84c50eab44b98e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c71f16da1ed8949774ef79f4a0260d28b83b3a50c6576f8f4f0288d109777989"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:9cf3126b85822c4e53aa28c7ec9869b924d6fcfb76e77a45c44b83d91afd74f9"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:b3b2316b25644b23b54a6f6401074cebcecd1244c0b8e80111c9a3f1c8e83d65"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:03680bb39035fbcffe828eae9c3f8afc0428c91d38e7d61aa992ef7a59fb120e"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4cc152c5dd831641e995764f9f0b6589519f6f5123258ccaca8c6d34572fefa8"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win32.whl", hash = "sha256:b8f3307af845803fb0b060ab76cf6dd3a13adc15b6b451f54281d25911eb92df"}, + {file = "charset_normalizer-3.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:8eaf82f0eccd1505cf39a45a6bd0a8cf1c70dcfc30dba338207a969d91b965c0"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:dc45229747b67ffc441b3de2f3ae5e62877a282ea828a5bdb67883c4ee4a8810"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4a0033ce9a76e391542c182f0d48d084855b5fcba5010f707c8e8c34663d77"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ada214c6fa40f8d800e575de6b91a40d0548139e5dc457d2ebb61470abf50186"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b1121de0e9d6e6ca08289583d7491e7fcb18a439305b34a30b20d8215922d43c"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1063da2c85b95f2d1a430f1c33b55c9c17ffaf5e612e10aeaad641c55a9e2b9d"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70f1d09c0d7748b73290b29219e854b3207aea922f839437870d8cc2168e31cc"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:250c9eb0f4600361dd80d46112213dff2286231d92d3e52af1e5a6083d10cad9"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:750b446b2ffce1739e8578576092179160f6d26bd5e23eb1789c4d64d5af7dc7"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:fc52b79d83a3fe3a360902d3f5d79073a993597d48114c29485e9431092905d8"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:588245972aca710b5b68802c8cad9edaa98589b1b42ad2b53accd6910dad3545"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e39c7eb31e3f5b1f88caff88bcff1b7f8334975b46f6ac6e9fc725d829bc35d4"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-win32.whl", hash = "sha256:abecce40dfebbfa6abf8e324e1860092eeca6f7375c8c4e655a8afb61af58f2c"}, + {file = "charset_normalizer-3.3.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a91a981f185721542a0b7c92e9054b7ab4fea0508a795846bc5b0abf8118d4"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:67b8cc9574bb518ec76dc8e705d4c39ae78bb96237cb533edac149352c1f39fe"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ac71b2977fb90c35d41c9453116e283fac47bb9096ad917b8819ca8b943abecd"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3ae38d325b512f63f8da31f826e6cb6c367336f95e418137286ba362925c877e"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:542da1178c1c6af8873e143910e2269add130a299c9106eef2594e15dae5e482"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:30a85aed0b864ac88309b7d94be09f6046c834ef60762a8833b660139cfbad13"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aae32c93e0f64469f74ccc730a7cb21c7610af3a775157e50bbd38f816536b38"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15b26ddf78d57f1d143bdf32e820fd8935d36abe8a25eb9ec0b5a71c82eb3895"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7f5d10bae5d78e4551b7be7a9b29643a95aded9d0f602aa2ba584f0388e7a557"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:249c6470a2b60935bafd1d1d13cd613f8cd8388d53461c67397ee6a0f5dce741"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:c5a74c359b2d47d26cdbbc7845e9662d6b08a1e915eb015d044729e92e7050b7"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b5bcf60a228acae568e9911f410f9d9e0d43197d030ae5799e20dca8df588287"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:187d18082694a29005ba2944c882344b6748d5be69e3a89bf3cc9d878e548d5a"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:81bf654678e575403736b85ba3a7867e31c2c30a69bc57fe88e3ace52fb17b89"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-win32.whl", hash = "sha256:85a32721ddde63c9df9ebb0d2045b9691d9750cb139c161c80e500d210f5e26e"}, + {file = "charset_normalizer-3.3.0-cp38-cp38-win_amd64.whl", hash = "sha256:468d2a840567b13a590e67dd276c570f8de00ed767ecc611994c301d0f8c014f"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e0fc42822278451bc13a2e8626cf2218ba570f27856b536e00cfa53099724828"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:09c77f964f351a7369cc343911e0df63e762e42bac24cd7d18525961c81754f4"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:12ebea541c44fdc88ccb794a13fe861cc5e35d64ed689513a5c03d05b53b7c82"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:805dfea4ca10411a5296bcc75638017215a93ffb584c9e344731eef0dcfb026a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96c2b49eb6a72c0e4991d62406e365d87067ca14c1a729a870d22354e6f68115"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aaf7b34c5bc56b38c931a54f7952f1ff0ae77a2e82496583b247f7c969eb1479"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:619d1c96099be5823db34fe89e2582b336b5b074a7f47f819d6b3a57ff7bdb86"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a0ac5e7015a5920cfce654c06618ec40c33e12801711da6b4258af59a8eff00a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:93aa7eef6ee71c629b51ef873991d6911b906d7312c6e8e99790c0f33c576f89"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7966951325782121e67c81299a031f4c115615e68046f79b85856b86ebffc4cd"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:02673e456dc5ab13659f85196c534dc596d4ef260e4d86e856c3b2773ce09843"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:c2af80fb58f0f24b3f3adcb9148e6203fa67dd3f61c4af146ecad033024dde43"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:153e7b6e724761741e0974fc4dcd406d35ba70b92bfe3fedcb497226c93b9da7"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-win32.whl", hash = "sha256:d47ecf253780c90ee181d4d871cd655a789da937454045b17b5798da9393901a"}, + {file = "charset_normalizer-3.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:d97d85fa63f315a8bdaba2af9a6a686e0eceab77b3089af45133252618e70884"}, + {file = "charset_normalizer-3.3.0-py3-none-any.whl", hash = "sha256:e46cd37076971c1040fc8c41273a8b3e2c624ce4f2be3f5dfcb7a430c1d3acc2"}, +] + +[[package]] +name = "click" +version = "7.1.2" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "click-7.1.2-py2.py3-none-any.whl", hash = "sha256:dacca89f4bfadd5de3d7489b7c8a566eee0d3676333fbb50030263894c38c0dc"}, + {file = "click-7.1.2.tar.gz", hash = "sha256:d2b5255c7c6349bc1bd1e59e08cd12acbbd63ce649f2588755783aa94dfb6b1a"}, +] + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "cryptography" +version = "3.2.1" +description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" +files = [ + {file = "cryptography-3.2.1-cp27-cp27m-macosx_10_10_x86_64.whl", hash = "sha256:6dc59630ecce8c1f558277ceb212c751d6730bd12c80ea96b4ac65637c4f55e7"}, + {file = "cryptography-3.2.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:75e8e6684cf0034f6bf2a97095cb95f81537b12b36a8fedf06e73050bb171c2d"}, + {file = "cryptography-3.2.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:4e7268a0ca14536fecfdf2b00297d4e407da904718658c1ff1961c713f90fd33"}, + {file = "cryptography-3.2.1-cp27-cp27m-win32.whl", hash = "sha256:7117319b44ed1842c617d0a452383a5a052ec6aa726dfbaffa8b94c910444297"}, + {file = "cryptography-3.2.1-cp27-cp27m-win_amd64.whl", hash = "sha256:a733671100cd26d816eed39507e585c156e4498293a907029969234e5e634bc4"}, + {file = "cryptography-3.2.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a75f306a16d9f9afebfbedc41c8c2351d8e61e818ba6b4c40815e2b5740bb6b8"}, + {file = "cryptography-3.2.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:5849d59358547bf789ee7e0d7a9036b2d29e9a4ddf1ce5e06bb45634f995c53e"}, + {file = "cryptography-3.2.1-cp35-abi3-macosx_10_10_x86_64.whl", hash = "sha256:bd717aa029217b8ef94a7d21632a3bb5a4e7218a4513d2521c2a2fd63011e98b"}, + {file = "cryptography-3.2.1-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:efe15aca4f64f3a7ea0c09c87826490e50ed166ce67368a68f315ea0807a20df"}, + {file = "cryptography-3.2.1-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:32434673d8505b42c0de4de86da8c1620651abd24afe91ae0335597683ed1b77"}, + {file = "cryptography-3.2.1-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:7b8d9d8d3a9bd240f453342981f765346c87ade811519f98664519696f8e6ab7"}, + {file = "cryptography-3.2.1-cp35-cp35m-win32.whl", hash = "sha256:d3545829ab42a66b84a9aaabf216a4dce7f16dbc76eb69be5c302ed6b8f4a29b"}, + {file = "cryptography-3.2.1-cp35-cp35m-win_amd64.whl", hash = "sha256:a4e27ed0b2504195f855b52052eadcc9795c59909c9d84314c5408687f933fc7"}, + {file = "cryptography-3.2.1-cp36-abi3-win32.whl", hash = "sha256:13b88a0bd044b4eae1ef40e265d006e34dbcde0c2f1e15eb9896501b2d8f6c6f"}, + {file = "cryptography-3.2.1-cp36-abi3-win_amd64.whl", hash = "sha256:07ca431b788249af92764e3be9a488aa1d39a0bc3be313d826bbec690417e538"}, + {file = "cryptography-3.2.1-cp36-cp36m-win32.whl", hash = "sha256:a035a10686532b0587d58a606004aa20ad895c60c4d029afa245802347fab57b"}, + {file = "cryptography-3.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:d26a2557d8f9122f9bf445fc7034242f4375bd4e95ecda007667540270965b13"}, + {file = "cryptography-3.2.1-cp37-cp37m-win32.whl", hash = "sha256:545a8550782dda68f8cdc75a6e3bf252017aa8f75f19f5a9ca940772fc0cb56e"}, + {file = "cryptography-3.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:55d0b896631412b6f0c7de56e12eb3e261ac347fbaa5d5e705291a9016e5f8cb"}, + {file = "cryptography-3.2.1-cp38-cp38-win32.whl", hash = "sha256:3cd75a683b15576cfc822c7c5742b3276e50b21a06672dc3a800a2d5da4ecd1b"}, + {file = "cryptography-3.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:d25cecbac20713a7c3bc544372d42d8eafa89799f492a43b79e1dfd650484851"}, + {file = "cryptography-3.2.1.tar.gz", hash = "sha256:d3d5e10be0cf2a12214ddee45c6bd203dab435e3d83b4560c03066eda600bfe3"}, +] + +[package.dependencies] +cffi = ">=1.8,<1.11.3 || >1.11.3" +six = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5,!=1.8.0,!=3.1.0,!=3.1.1)", "sphinx-rtd-theme"] +docstest = ["doc8", "pyenchant (>=1.6.11)", "sphinxcontrib-spelling (>=4.0.1)", "twine (>=1.12.0)"] +pep8test = ["black", "flake8", "flake8-import-order", "pep8-naming"] +ssh = ["bcrypt (>=3.1.5)"] +test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=3.6.0,!=3.9.0,!=3.9.1,!=3.9.2)", "pytz"] + +[[package]] +name = "distro" +version = "1.8.0" +description = "Distro - an OS platform information API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "distro-1.8.0-py3-none-any.whl", hash = "sha256:99522ca3e365cac527b44bde033f64c6945d90eb9f769703caaec52b09bbd3ff"}, + {file = "distro-1.8.0.tar.gz", hash = "sha256:02e111d1dc6a50abb8eed6bf31c3e48ed8b0830d1ea2a1b78c61765c2513fdd8"}, +] + +[[package]] +name = "docker" +version = "6.1.3" +description = "A Python library for the Docker Engine API." +optional = false +python-versions = ">=3.7" +files = [ + {file = "docker-6.1.3-py3-none-any.whl", hash = "sha256:aecd2277b8bf8e506e484f6ab7aec39abe0038e29fa4a6d3ba86c3fe01844ed9"}, + {file = "docker-6.1.3.tar.gz", hash = "sha256:aa6d17830045ba5ef0168d5eaa34d37beeb113948c413affe1d5991fc11f9a20"}, +] + +[package.dependencies] +packaging = ">=14.0" +paramiko = {version = ">=2.4.3", optional = true, markers = "extra == \"ssh\""} +pywin32 = {version = ">=304", markers = "sys_platform == \"win32\""} +requests = ">=2.26.0" +urllib3 = ">=1.26.0" +websocket-client = ">=0.32.0" + +[package.extras] +ssh = ["paramiko (>=2.4.3)"] + +[[package]] +name = "docker-compose" +version = "1.29.2" +description = "Multi-container orchestration for Docker" +optional = false +python-versions = ">=3.4" +files = [ + {file = "docker-compose-1.29.2.tar.gz", hash = "sha256:4c8cd9d21d237412793d18bd33110049ee9af8dab3fe2c213bbd0733959b09b7"}, + {file = "docker_compose-1.29.2-py2.py3-none-any.whl", hash = "sha256:8d5589373b35c8d3b1c8c1182c6e4a4ff14bffa3dd0b605fcd08f73c94cef809"}, +] + +[package.dependencies] +colorama = {version = ">=0.4,<1", markers = "sys_platform == \"win32\""} +distro = ">=1.5.0,<2" +docker = {version = ">=5", extras = ["ssh"]} +dockerpty = ">=0.4.1,<1" +docopt = ">=0.6.1,<1" +jsonschema = ">=2.5.1,<4" +python-dotenv = ">=0.13.0,<1" +PyYAML = ">=3.10,<6" +requests = ">=2.20.0,<3" +texttable = ">=0.9.0,<2" +websocket-client = ">=0.32.0,<1" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2)"] +tests = ["ddt (>=1.2.2,<2)", "pytest (<6)"] + +[[package]] +name = "dockerpty" +version = "0.4.1" +description = "Python library to use the pseudo-tty of a docker container" +optional = false +python-versions = "*" +files = [ + {file = "dockerpty-0.4.1.tar.gz", hash = "sha256:69a9d69d573a0daa31bcd1c0774eeed5c15c295fe719c61aca550ed1393156ce"}, +] + +[package.dependencies] +six = ">=1.3.0" + +[[package]] +name = "docopt" +version = "0.6.2" +description = "Pythonic argument parser, that will make you smile" +optional = false +python-versions = "*" +files = [ + {file = "docopt-0.6.2.tar.gz", hash = "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491"}, +] + +[[package]] +name = "dpath" +version = "2.1.6" +description = "Filesystem-like pathing and searching for dictionaries" +optional = false +python-versions = ">=3.7" +files = [ + {file = "dpath-2.1.6-py3-none-any.whl", hash = "sha256:31407395b177ab63ef72e2f6ae268c15e938f2990a8ecf6510f5686c02b6db73"}, + {file = "dpath-2.1.6.tar.gz", hash = "sha256:f1e07c72e8605c6a9e80b64bc8f42714de08a789c7de417e49c3f87a19692e47"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.1.3" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.1.3-py3-none-any.whl", hash = "sha256:343280667a4585d195ca1cf9cef84a4e178c4b6cf2274caef9859782b567d5e3"}, + {file = "exceptiongroup-1.1.3.tar.gz", hash = "sha256:097acd85d473d75af5bb98e41b61ff7fe35efe6675e4f9370ec6ec5126d160e9"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "fastcore" +version = "1.5.29" +description = "Python supercharged for fastai development" +optional = false +python-versions = ">=3.7" +files = [ + {file = "fastcore-1.5.29-py3-none-any.whl", hash = "sha256:a7d7e89faf968f2d8584df2deca344c3974f6cf476e1299cd3c067d8fa7440e9"}, + {file = "fastcore-1.5.29.tar.gz", hash = "sha256:f1a2eb04eb7933f3f9eb4064852817df44dc96e20fab5658c14c035815269a3f"}, +] + +[package.dependencies] +packaging = "*" +pip = "*" + +[package.extras] +dev = ["jupyterlab", "matplotlib", "nbdev (>=0.2.39)", "numpy", "pandas", "pillow", "torch"] + +[[package]] +name = "flask" +version = "1.1.4" +description = "A simple framework for building complex web applications." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "Flask-1.1.4-py2.py3-none-any.whl", hash = "sha256:c34f04500f2cbbea882b1acb02002ad6fe6b7ffa64a6164577995657f50aed22"}, + {file = "Flask-1.1.4.tar.gz", hash = "sha256:0fbeb6180d383a9186d0d6ed954e0042ad9f18e0e8de088b2b419d526927d196"}, +] + +[package.dependencies] +click = ">=5.1,<8.0" +itsdangerous = ">=0.24,<2.0" +Jinja2 = ">=2.10.1,<3.0" +Werkzeug = ">=0.15,<2.0" + +[package.extras] +dev = ["coverage", "pallets-sphinx-themes", "pytest", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet", "tox"] +docs = ["pallets-sphinx-themes", "sphinx", "sphinx-issues", "sphinxcontrib-log-cabinet"] +dotenv = ["python-dotenv"] + +[[package]] +name = "frozenlist" +version = "1.4.0" +description = "A list-like structure which implements collections.abc.MutableSequence" +optional = false +python-versions = ">=3.8" +files = [ + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:764226ceef3125e53ea2cb275000e309c0aa5464d43bd72abd661e27fffc26ab"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d6484756b12f40003c6128bfcc3fa9f0d49a687e171186c2d85ec82e3758c559"}, + {file = "frozenlist-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9ac08e601308e41eb533f232dbf6b7e4cea762f9f84f6357136eed926c15d12c"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d081f13b095d74b67d550de04df1c756831f3b83dc9881c38985834387487f1b"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71932b597f9895f011f47f17d6428252fc728ba2ae6024e13c3398a087c2cdea"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:981b9ab5a0a3178ff413bca62526bb784249421c24ad7381e39d67981be2c326"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e41f3de4df3e80de75845d3e743b3f1c4c8613c3997a912dbf0229fc61a8b963"}, + {file = "frozenlist-1.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6918d49b1f90821e93069682c06ffde41829c346c66b721e65a5c62b4bab0300"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:0e5c8764c7829343d919cc2dfc587a8db01c4f70a4ebbc49abde5d4b158b007b"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8d0edd6b1c7fb94922bf569c9b092ee187a83f03fb1a63076e7774b60f9481a8"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:e29cda763f752553fa14c68fb2195150bfab22b352572cb36c43c47bedba70eb"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:0c7c1b47859ee2cac3846fde1c1dc0f15da6cec5a0e5c72d101e0f83dcb67ff9"}, + {file = "frozenlist-1.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:901289d524fdd571be1c7be054f48b1f88ce8dddcbdf1ec698b27d4b8b9e5d62"}, + {file = "frozenlist-1.4.0-cp310-cp310-win32.whl", hash = "sha256:1a0848b52815006ea6596c395f87449f693dc419061cc21e970f139d466dc0a0"}, + {file = "frozenlist-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:b206646d176a007466358aa21d85cd8600a415c67c9bd15403336c331a10d956"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:de343e75f40e972bae1ef6090267f8260c1446a1695e77096db6cfa25e759a95"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ad2a9eb6d9839ae241701d0918f54c51365a51407fd80f6b8289e2dfca977cc3"}, + {file = "frozenlist-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bd7bd3b3830247580de99c99ea2a01416dfc3c34471ca1298bccabf86d0ff4dc"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bdf1847068c362f16b353163391210269e4f0569a3c166bc6a9f74ccbfc7e839"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:38461d02d66de17455072c9ba981d35f1d2a73024bee7790ac2f9e361ef1cd0c"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5a32087d720c608f42caed0ef36d2b3ea61a9d09ee59a5142d6070da9041b8f"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd65632acaf0d47608190a71bfe46b209719bf2beb59507db08ccdbe712f969b"}, + {file = "frozenlist-1.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:261b9f5d17cac914531331ff1b1d452125bf5daa05faf73b71d935485b0c510b"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b89ac9768b82205936771f8d2eb3ce88503b1556324c9f903e7156669f521472"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:008eb8b31b3ea6896da16c38c1b136cb9fec9e249e77f6211d479db79a4eaf01"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:e74b0506fa5aa5598ac6a975a12aa8928cbb58e1f5ac8360792ef15de1aa848f"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:490132667476f6781b4c9458298b0c1cddf237488abd228b0b3650e5ecba7467"}, + {file = "frozenlist-1.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:76d4711f6f6d08551a7e9ef28c722f4a50dd0fc204c56b4bcd95c6cc05ce6fbb"}, + {file = "frozenlist-1.4.0-cp311-cp311-win32.whl", hash = "sha256:a02eb8ab2b8f200179b5f62b59757685ae9987996ae549ccf30f983f40602431"}, + {file = "frozenlist-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:515e1abc578dd3b275d6a5114030b1330ba044ffba03f94091842852f806f1c1"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:f0ed05f5079c708fe74bf9027e95125334b6978bf07fd5ab923e9e55e5fbb9d3"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca265542ca427bf97aed183c1676e2a9c66942e822b14dc6e5f42e038f92a503"}, + {file = "frozenlist-1.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:491e014f5c43656da08958808588cc6c016847b4360e327a62cb308c791bd2d9"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:17ae5cd0f333f94f2e03aaf140bb762c64783935cc764ff9c82dff626089bebf"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1e78fb68cf9c1a6aa4a9a12e960a5c9dfbdb89b3695197aa7064705662515de2"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5655a942f5f5d2c9ed93d72148226d75369b4f6952680211972a33e59b1dfdc"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c11b0746f5d946fecf750428a95f3e9ebe792c1ee3b1e96eeba145dc631a9672"}, + {file = "frozenlist-1.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e66d2a64d44d50d2543405fb183a21f76b3b5fd16f130f5c99187c3fb4e64919"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:88f7bc0fcca81f985f78dd0fa68d2c75abf8272b1f5c323ea4a01a4d7a614efc"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5833593c25ac59ede40ed4de6d67eb42928cca97f26feea219f21d0ed0959b79"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fec520865f42e5c7f050c2a79038897b1c7d1595e907a9e08e3353293ffc948e"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:b826d97e4276750beca7c8f0f1a4938892697a6bcd8ec8217b3312dad6982781"}, + {file = "frozenlist-1.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:ceb6ec0a10c65540421e20ebd29083c50e6d1143278746a4ef6bcf6153171eb8"}, + {file = "frozenlist-1.4.0-cp38-cp38-win32.whl", hash = "sha256:2b8bcf994563466db019fab287ff390fffbfdb4f905fc77bc1c1d604b1c689cc"}, + {file = "frozenlist-1.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:a6c8097e01886188e5be3e6b14e94ab365f384736aa1fca6a0b9e35bd4a30bc7"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6c38721585f285203e4b4132a352eb3daa19121a035f3182e08e437cface44bf"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a0c6da9aee33ff0b1a451e867da0c1f47408112b3391dd43133838339e410963"}, + {file = "frozenlist-1.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:93ea75c050c5bb3d98016b4ba2497851eadf0ac154d88a67d7a6816206f6fa7f"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f61e2dc5ad442c52b4887f1fdc112f97caeff4d9e6ebe78879364ac59f1663e1"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aa384489fefeb62321b238e64c07ef48398fe80f9e1e6afeff22e140e0850eef"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10ff5faaa22786315ef57097a279b833ecab1a0bfb07d604c9cbb1c4cdc2ed87"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:007df07a6e3eb3e33e9a1fe6a9db7af152bbd8a185f9aaa6ece10a3529e3e1c6"}, + {file = "frozenlist-1.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f4f399d28478d1f604c2ff9119907af9726aed73680e5ed1ca634d377abb087"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:c5374b80521d3d3f2ec5572e05adc94601985cc526fb276d0c8574a6d749f1b3"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ce31ae3e19f3c902de379cf1323d90c649425b86de7bbdf82871b8a2a0615f3d"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7211ef110a9194b6042449431e08c4d80c0481e5891e58d429df5899690511c2"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:556de4430ce324c836789fa4560ca62d1591d2538b8ceb0b4f68fb7b2384a27a"}, + {file = "frozenlist-1.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:7645a8e814a3ee34a89c4a372011dcd817964ce8cb273c8ed6119d706e9613e3"}, + {file = "frozenlist-1.4.0-cp39-cp39-win32.whl", hash = "sha256:19488c57c12d4e8095a922f328df3f179c820c212940a498623ed39160bc3c2f"}, + {file = "frozenlist-1.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:6221d84d463fb110bdd7619b69cb43878a11d51cbb9394ae3105d082d5199167"}, + {file = "frozenlist-1.4.0.tar.gz", hash = "sha256:09163bdf0b2907454042edb19f887c6d33806adc71fbd54afc14908bfdc22251"}, +] + +[[package]] +name = "func-timeout" +version = "4.3.5" +description = "Python module which allows you to specify timeouts when calling any existing function. Also provides support for stoppable-threads" +optional = false +python-versions = "*" +files = [ + {file = "func_timeout-4.3.5.tar.gz", hash = "sha256:74cd3c428ec94f4edfba81f9b2f14904846d5ffccc27c92433b8b5939b5575dd"}, +] + +[[package]] +name = "ghapi" +version = "0.1.23" +description = "A python client for the GitHub API" +optional = false +python-versions = ">=3.6" +files = [ + {file = "ghapi-0.1.23-py3-none-any.whl", hash = "sha256:492b5f82b5d4844a0297c8ae6afda638432cee6c74b0bd0a0458b35d19b92b5e"}, + {file = "ghapi-0.1.23.tar.gz", hash = "sha256:93fa097e394d743c6702e217d588a4123696f62d055f2acc495166676843d59f"}, +] + +[package.dependencies] +fastcore = ">=1.5.4" +packaging = "*" +pip = "*" + +[package.extras] +dev = ["jsonref"] + +[[package]] +name = "goth" +version = "0.15.8" +description = "Golem Test Harness - integration testing framework" +optional = false +python-versions = ">=3.10.1,<4.0.0" +files = [ + {file = "goth-0.15.8-py3-none-any.whl", hash = "sha256:1a0d8b59e207feab8aaf36c6156eab0cf446f56cb6973c71200c531e35a19de9"}, + {file = "goth-0.15.8.tar.gz", hash = "sha256:16fa44a0a6e4e914064a5bb5cf8d2d0d3af766e97d515a498f66a13723fffd83"}, +] + +[package.dependencies] +aiohttp = ">=3.8.5,<4.0.0" +ansicolors = ">=1.1.0,<2.0.0" +docker = ">=6.0,<7.0" +docker-compose = ">=1.29,<2.0" +dpath = ">=2.0,<3.0" +func_timeout = "4.3.5" +ghapi = ">=0.1.16,<0.2.0" +markupsafe = "2.0.1" +mitmproxy = ">=5.3,<6.0" +pyyaml = "5.3.1" +transitions = ">=0.8,<0.9" +typing_extensions = ">=4.5,<5.0" +urllib3 = ">=1.26,<2.0" +ya-aioclient = ">=0.6,<0.7" + +[[package]] +name = "h11" +version = "0.14.0" +description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "h11-0.14.0-py3-none-any.whl", hash = "sha256:e3fe4ac4b851c468cc8363d500db52c2ead036020723024a109d37346efaa761"}, + {file = "h11-0.14.0.tar.gz", hash = "sha256:8f19fbbe99e72420ff35c00b27a34cb9937e902a8b810e2c88300c6f0a3b699d"}, +] + +[[package]] +name = "h2" +version = "4.1.0" +description = "HTTP/2 State-Machine based protocol implementation" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "h2-4.1.0-py3-none-any.whl", hash = "sha256:03a46bcf682256c95b5fd9e9a99c1323584c3eec6440d379b9903d709476bc6d"}, + {file = "h2-4.1.0.tar.gz", hash = "sha256:a83aca08fbe7aacb79fec788c9c0bac936343560ed9ec18b82a13a12c28d2abb"}, +] + +[package.dependencies] +hpack = ">=4.0,<5" +hyperframe = ">=6.0,<7" + +[[package]] +name = "hpack" +version = "4.0.0" +description = "Pure-Python HPACK header compression" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "hpack-4.0.0-py3-none-any.whl", hash = "sha256:84a076fad3dc9a9f8063ccb8041ef100867b1878b25ef0ee63847a5d53818a6c"}, + {file = "hpack-4.0.0.tar.gz", hash = "sha256:fc41de0c63e687ebffde81187a948221294896f6bdc0ae2312708df339430095"}, +] + +[[package]] +name = "hyperframe" +version = "6.0.1" +description = "HTTP/2 framing layer for Python" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "hyperframe-6.0.1-py3-none-any.whl", hash = "sha256:0ec6bafd80d8ad2195c4f03aacba3a8265e57bc4cff261e802bf39970ed02a15"}, + {file = "hyperframe-6.0.1.tar.gz", hash = "sha256:ae510046231dc8e9ecb1a6586f63d2347bf4c8905914aa84ba585ae85f28a914"}, +] + +[[package]] +name = "idna" +version = "3.4" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "itsdangerous" +version = "1.1.0" +description = "Various helpers to pass data to untrusted environments and back." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "itsdangerous-1.1.0-py2.py3-none-any.whl", hash = "sha256:b12271b2047cb23eeb98c8b5622e2e5c5e9abd9784a153e9d8ef9cb4dd09d749"}, + {file = "itsdangerous-1.1.0.tar.gz", hash = "sha256:321b033d07f2a4136d3ec762eac9f16a10ccd60f53c0c91af90217ace7ba1f19"}, +] + +[[package]] +name = "jinja2" +version = "2.11.3" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "Jinja2-2.11.3-py2.py3-none-any.whl", hash = "sha256:03e47ad063331dd6a3f04a43eddca8a966a26ba0c5b7207a9a9e4e08f1b29419"}, + {file = "Jinja2-2.11.3.tar.gz", hash = "sha256:a6d58433de0ae800347cab1fa3043cebbabe8baa9d29e668f1c768cb87a333c6"}, +] + +[package.dependencies] +MarkupSafe = ">=0.23" + +[package.extras] +i18n = ["Babel (>=0.8)"] + +[[package]] +name = "jsonschema" +version = "3.2.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = "*" +files = [ + {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, + {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, +] + +[package.dependencies] +attrs = ">=17.4.0" +pyrsistent = ">=0.14.0" +setuptools = "*" +six = ">=1.11.0" + +[package.extras] +format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] +format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] + +[[package]] +name = "kaitaistruct" +version = "0.9" +description = "Kaitai Struct declarative parser generator for binary data: runtime library for Python" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "kaitaistruct-0.9.tar.gz", hash = "sha256:3d5845817ec8a4d5504379cc11bd570b038850ee49c4580bc0998c8fb1d327ad"}, +] + +[[package]] +name = "ldap3" +version = "2.8.1" +description = "A strictly RFC 4510 conforming LDAP V3 pure Python client library" +optional = false +python-versions = "*" +files = [ + {file = "ldap3-2.8.1-py2.py3-none-any.whl", hash = "sha256:7c3738570766f5e5e74a56fade15470f339d5c436d821cf476ef27da0a4de8b0"}, + {file = "ldap3-2.8.1.tar.gz", hash = "sha256:37d633e20fa360c302b1263c96fe932d40622d0119f1bddcb829b03462eeeeb7"}, +] + +[package.dependencies] +pyasn1 = ">=0.4.6" + +[[package]] +name = "markupsafe" +version = "2.0.1" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.6" +files = [ + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d8446c54dc28c01e5a2dbac5a25f071f6653e6e40f3a8818e8b45d790fe6ef53"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36bc903cbb393720fad60fc28c10de6acf10dc6cc883f3e24ee4012371399a38"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d7d807855b419fc2ed3e631034685db6079889a1f01d5d9dac950f764da3dad"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:add36cb2dbb8b736611303cd3bfcee00afd96471b09cda130da3581cbdc56a6d"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:168cd0a3642de83558a5153c8bd34f175a9a6e7f6dc6384b9655d2697312a646"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4dc8f9fb58f7364b63fd9f85013b780ef83c11857ae79f2feda41e270468dd9b"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:20dca64a3ef2d6e4d5d615a3fd418ad3bde77a47ec8a23d984a12b5b4c74491a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cdfba22ea2f0029c9261a4bd07e830a8da012291fbe44dc794e488b6c9bb353a"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win32.whl", hash = "sha256:99df47edb6bda1249d3e80fdabb1dab8c08ef3975f69aed437cb69d0a5de1e28"}, + {file = "MarkupSafe-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:e0f138900af21926a02425cf736db95be9f4af72ba1bb21453432a07f6082134"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f9081981fe268bd86831e5c75f7de206ef275defcb82bc70740ae6dc507aee51"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:0955295dd5eec6cb6cc2fe1698f4c6d84af2e92de33fbcac4111913cd100a6ff"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:0446679737af14f45767963a1a9ef7620189912317d095f2d9ffa183a4d25d2b"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:f826e31d18b516f653fe296d967d700fddad5901ae07c622bb3705955e1faa94"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:fa130dd50c57d53368c9d59395cb5526eda596d3ffe36666cd81a44d56e48872"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:905fec760bd2fa1388bb5b489ee8ee5f7291d692638ea5f67982d968366bef9f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf5d821ffabf0ef3533c39c518f3357b171a1651c1ff6827325e4489b0e46c3c"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0d4b31cc67ab36e3392bbf3862cfbadac3db12bdd8b02a2731f509ed5b829724"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:baa1a4e8f868845af802979fcdbf0bb11f94f1cb7ced4c4b8a351bb60d108145"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:deb993cacb280823246a026e3b2d81c493c53de6acfd5e6bfe31ab3402bb37dd"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:63f3268ba69ace99cab4e3e3b5840b03340efed0948ab8f78d2fd87ee5442a4f"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:8d206346619592c6200148b01a2142798c989edcb9c896f9ac9722a99d4e77e6"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win32.whl", hash = "sha256:6c4ca60fa24e85fe25b912b01e62cb969d69a23a5d5867682dd3e80b5b02581d"}, + {file = "MarkupSafe-2.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b2f4bf27480f5e5e8ce285a8c8fd176c0b03e93dcc6646477d4630e83440c6a9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0717a7390a68be14b8c793ba258e075c6f4ca819f15edfc2a3a027c823718567"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:6557b31b5e2c9ddf0de32a691f2312a32f77cd7681d8af66c2692efdbef84c18"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:49e3ceeabbfb9d66c3aef5af3a60cc43b85c33df25ce03d0031a608b0a8b2e3f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:d7f9850398e85aba693bb640262d3611788b1f29a79f0c93c565694658f4071f"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:6a7fae0dd14cf60ad5ff42baa2e95727c3d81ded453457771d02b7d2b3f9c0c2"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:b7f2d075102dc8c794cbde1947378051c4e5180d52d276987b8d28a3bd58c17d"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9936f0b261d4df76ad22f8fee3ae83b60d7c3e871292cd42f40b81b70afae85"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2a7d351cbd8cfeb19ca00de495e224dea7e7d919659c2841bbb7f420ad03e2d6"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:60bf42e36abfaf9aff1f50f52644b336d4f0a3fd6d8a60ca0d054ac9f713a864"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d6c7ebd4e944c85e2c3421e612a7057a2f48d478d79e61800d81468a8d842207"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f0567c4dc99f264f49fe27da5f735f414c4e7e7dd850cfd8e69f0862d7c74ea9"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:89c687013cb1cd489a0f0ac24febe8c7a666e6e221b783e53ac50ebf68e45d86"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:a30e67a65b53ea0a5e62fe23682cfe22712e01f453b95233b25502f7c61cb415"}, + {file = "MarkupSafe-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:611d1ad9a4288cf3e3c16014564df047fe08410e628f89805e475368bd304914"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5bb28c636d87e840583ee3adeb78172efc47c8b26127267f54a9c0ec251d41a9"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:be98f628055368795d818ebf93da628541e10b75b41c559fdf36d104c5787066"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:1d609f577dc6e1aa17d746f8bd3c31aa4d258f4070d61b2aa5c4166c1539de35"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:7d91275b0245b1da4d4cfa07e0faedd5b0812efc15b702576d103293e252af1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:01a9b8ea66f1658938f65b93a85ebe8bc016e6769611be228d797c9d998dd298"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:47ab1e7b91c098ab893b828deafa1203de86d0bc6ab587b160f78fe6c4011f75"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:97383d78eb34da7e1fa37dd273c20ad4320929af65d156e35a5e2d89566d9dfb"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6fcf051089389abe060c9cd7caa212c707e58153afa2c649f00346ce6d260f1b"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:5855f8438a7d1d458206a2466bf82b0f104a3724bf96a1c781ab731e4201731a"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3dd007d54ee88b46be476e293f48c85048603f5f516008bee124ddd891398ed6"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:aca6377c0cb8a8253e493c6b451565ac77e98c2951c45f913e0b52facdcff83f"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:04635854b943835a6ea959e948d19dcd311762c5c0c6e1f0e16ee57022669194"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6300b8454aa6930a24b9618fbb54b5a68135092bc666f7b06901f897fa5c2fee"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win32.whl", hash = "sha256:023cb26ec21ece8dc3907c0e8320058b2e0cb3c55cf9564da612bc325bed5e64"}, + {file = "MarkupSafe-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:984d76483eb32f1bcb536dc27e4ad56bba4baa70be32fa87152832cdd9db0833"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2ef54abee730b502252bcdf31b10dacb0a416229b72c18b19e24a4509f273d26"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3c112550557578c26af18a1ccc9e090bfe03832ae994343cfdacd287db6a6ae7"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:53edb4da6925ad13c07b6d26c2a852bd81e364f95301c66e930ab2aef5b5ddd8"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:f5653a225f31e113b152e56f154ccbe59eeb1c7487b39b9d9f9cdb58e6c79dc5"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:4efca8f86c54b22348a5467704e3fec767b2db12fc39c6d963168ab1d3fc9135"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:ab3ef638ace319fa26553db0624c4699e31a28bb2a835c5faca8f8acf6a5a902"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f8ba0e8349a38d3001fae7eadded3f6606f0da5d748ee53cc1dab1d6527b9509"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c47adbc92fc1bb2b3274c4b3a43ae0e4573d9fbff4f54cd484555edbf030baf1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:37205cac2a79194e3750b0af2a5720d95f786a55ce7df90c3af697bfa100eaac"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1f2ade76b9903f39aa442b4aadd2177decb66525062db244b35d71d0ee8599b6"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4296f2b1ce8c86a6aea78613c34bb1a672ea0e3de9c6ba08a960efe0b0a09047"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f02365d4e99430a12647f09b6cc8bab61a6564363f313126f775eb4f6ef798e"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5b6d930f030f8ed98e3e6c98ffa0652bdb82601e7a016ec2ab5d7ff23baa78d1"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win32.whl", hash = "sha256:10f82115e21dc0dfec9ab5c0223652f7197feb168c940f3ef61563fc2d6beb74"}, + {file = "MarkupSafe-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:693ce3f9e70a6cf7d2fb9e6c9d8b204b6b39897a2c4a1aa65728d5ac97dcc1d8"}, + {file = "MarkupSafe-2.0.1.tar.gz", hash = "sha256:594c67807fb16238b30c44bdf74f36c02cdf22d1c8cda91ef8a0ed8dabf5620a"}, +] + +[[package]] +name = "mitmproxy" +version = "5.3.0" +description = "An interactive, SSL/TLS-capable intercepting proxy for HTTP/1, HTTP/2, and WebSockets." +optional = false +python-versions = "*" +files = [ + {file = "mitmproxy-5.3.0-py3-none-any.whl", hash = "sha256:481940365fc08fc2318343e530ef01d35084e8b56d1c61b5e1a7b6ed9b664d24"}, +] + +[package.dependencies] +asgiref = ">=3.2.10,<3.4" +blinker = ">=1.4,<1.5" +Brotli = ">=1.0,<1.1" +certifi = ">=2019.9.11" +click = ">=7.0,<8" +cryptography = ">=3.2,<3.3" +flask = ">=1.1.1,<1.2" +h2 = {version = ">=4.0,<5", markers = "python_version >= \"3.6.0\""} +hyperframe = {version = ">=6.0,<7", markers = "python_version >= \"3.6.0\""} +kaitaistruct = ">=0.7,<0.10" +ldap3 = ">=2.8,<2.9" +msgpack = ">=1.0.0,<1.1.0" +passlib = ">=1.6.5,<1.8" +protobuf = ">=3.6.0,<3.14" +publicsuffix2 = ">=2.20190812,<3" +pyasn1 = ">=0.3.1,<0.5" +pydivert = {version = ">=2.0.3,<2.2", markers = "sys_platform == \"win32\""} +pyOpenSSL = ">=19.1.0,<19.2" +pyparsing = ">=2.4.2,<2.5" +pyperclip = ">=1.6.0,<1.9" +"ruamel.yaml" = ">=0.16,<0.17" +sortedcontainers = ">=2.1,<2.3" +tornado = ">=4.3,<7" +urwid = ">=2.1.1,<2.2" +wsproto = ">=0.14,<0.16" +zstandard = ">=0.11,<0.15" + +[package.extras] +dev = ["Flask (>=1.0,<1.2)", "asynctest (>=0.12.0)", "hypothesis (>=5.8,<6)", "parver (>=0.1,<2.0)", "pytest (>=6.1.0,<7)", "pytest-asyncio (>=0.10.0,<0.14)", "pytest-cov (>=2.7.1,<3)", "pytest-timeout (>=1.3.3,<2)", "pytest-xdist (>=2.1.0,<3)", "requests (>=2.9.1,<3)", "tox (>=3.5,<4)"] + +[[package]] +name = "msgpack" +version = "1.0.7" +description = "MessagePack serializer" +optional = false +python-versions = ">=3.8" +files = [ + {file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04ad6069c86e531682f9e1e71b71c1c3937d6014a7c3e9edd2aa81ad58842862"}, + {file = "msgpack-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cca1b62fe70d761a282496b96a5e51c44c213e410a964bdffe0928e611368329"}, + {file = "msgpack-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e50ebce52f41370707f1e21a59514e3375e3edd6e1832f5e5235237db933c98b"}, + {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a7b4f35de6a304b5533c238bee86b670b75b03d31b7797929caa7a624b5dda6"}, + {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28efb066cde83c479dfe5a48141a53bc7e5f13f785b92ddde336c716663039ee"}, + {file = "msgpack-1.0.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4cb14ce54d9b857be9591ac364cb08dc2d6a5c4318c1182cb1d02274029d590d"}, + {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b573a43ef7c368ba4ea06050a957c2a7550f729c31f11dd616d2ac4aba99888d"}, + {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ccf9a39706b604d884d2cb1e27fe973bc55f2890c52f38df742bc1d79ab9f5e1"}, + {file = "msgpack-1.0.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cb70766519500281815dfd7a87d3a178acf7ce95390544b8c90587d76b227681"}, + {file = "msgpack-1.0.7-cp310-cp310-win32.whl", hash = "sha256:b610ff0f24e9f11c9ae653c67ff8cc03c075131401b3e5ef4b82570d1728f8a9"}, + {file = "msgpack-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:a40821a89dc373d6427e2b44b572efc36a2778d3f543299e2f24eb1a5de65415"}, + {file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:576eb384292b139821c41995523654ad82d1916da6a60cff129c715a6223ea84"}, + {file = "msgpack-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:730076207cb816138cf1af7f7237b208340a2c5e749707457d70705715c93b93"}, + {file = "msgpack-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:85765fdf4b27eb5086f05ac0491090fc76f4f2b28e09d9350c31aac25a5aaff8"}, + {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3476fae43db72bd11f29a5147ae2f3cb22e2f1a91d575ef130d2bf49afd21c46"}, + {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6d4c80667de2e36970ebf74f42d1088cc9ee7ef5f4e8c35eee1b40eafd33ca5b"}, + {file = "msgpack-1.0.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b0bf0effb196ed76b7ad883848143427a73c355ae8e569fa538365064188b8e"}, + {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:f9a7c509542db4eceed3dcf21ee5267ab565a83555c9b88a8109dcecc4709002"}, + {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:84b0daf226913133f899ea9b30618722d45feffa67e4fe867b0b5ae83a34060c"}, + {file = "msgpack-1.0.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ec79ff6159dffcc30853b2ad612ed572af86c92b5168aa3fc01a67b0fa40665e"}, + {file = "msgpack-1.0.7-cp311-cp311-win32.whl", hash = "sha256:3e7bf4442b310ff154b7bb9d81eb2c016b7d597e364f97d72b1acc3817a0fdc1"}, + {file = "msgpack-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:3f0c8c6dfa6605ab8ff0611995ee30d4f9fcff89966cf562733b4008a3d60d82"}, + {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:f0936e08e0003f66bfd97e74ee530427707297b0d0361247e9b4f59ab78ddc8b"}, + {file = "msgpack-1.0.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:98bbd754a422a0b123c66a4c341de0474cad4a5c10c164ceed6ea090f3563db4"}, + {file = "msgpack-1.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b291f0ee7961a597cbbcc77709374087fa2a9afe7bdb6a40dbbd9b127e79afee"}, + {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebbbba226f0a108a7366bf4b59bf0f30a12fd5e75100c630267d94d7f0ad20e5"}, + {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e2d69948e4132813b8d1131f29f9101bc2c915f26089a6d632001a5c1349672"}, + {file = "msgpack-1.0.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdf38ba2d393c7911ae989c3bbba510ebbcdf4ecbdbfec36272abe350c454075"}, + {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:993584fc821c58d5993521bfdcd31a4adf025c7d745bbd4d12ccfecf695af5ba"}, + {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:52700dc63a4676669b341ba33520f4d6e43d3ca58d422e22ba66d1736b0a6e4c"}, + {file = "msgpack-1.0.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:e45ae4927759289c30ccba8d9fdce62bb414977ba158286b5ddaf8df2cddb5c5"}, + {file = "msgpack-1.0.7-cp312-cp312-win32.whl", hash = "sha256:27dcd6f46a21c18fa5e5deed92a43d4554e3df8d8ca5a47bf0615d6a5f39dbc9"}, + {file = "msgpack-1.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:7687e22a31e976a0e7fc99c2f4d11ca45eff652a81eb8c8085e9609298916dcf"}, + {file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5b6ccc0c85916998d788b295765ea0e9cb9aac7e4a8ed71d12e7d8ac31c23c95"}, + {file = "msgpack-1.0.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:235a31ec7db685f5c82233bddf9858748b89b8119bf4538d514536c485c15fe0"}, + {file = "msgpack-1.0.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cab3db8bab4b7e635c1c97270d7a4b2a90c070b33cbc00c99ef3f9be03d3e1f7"}, + {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bfdd914e55e0d2c9e1526de210f6fe8ffe9705f2b1dfcc4aecc92a4cb4b533d"}, + {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36e17c4592231a7dbd2ed09027823ab295d2791b3b1efb2aee874b10548b7524"}, + {file = "msgpack-1.0.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:38949d30b11ae5f95c3c91917ee7a6b239f5ec276f271f28638dec9156f82cfc"}, + {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:ff1d0899f104f3921d94579a5638847f783c9b04f2d5f229392ca77fba5b82fc"}, + {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:dc43f1ec66eb8440567186ae2f8c447d91e0372d793dfe8c222aec857b81a8cf"}, + {file = "msgpack-1.0.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:dd632777ff3beaaf629f1ab4396caf7ba0bdd075d948a69460d13d44357aca4c"}, + {file = "msgpack-1.0.7-cp38-cp38-win32.whl", hash = "sha256:4e71bc4416de195d6e9b4ee93ad3f2f6b2ce11d042b4d7a7ee00bbe0358bd0c2"}, + {file = "msgpack-1.0.7-cp38-cp38-win_amd64.whl", hash = "sha256:8f5b234f567cf76ee489502ceb7165c2a5cecec081db2b37e35332b537f8157c"}, + {file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bfef2bb6ef068827bbd021017a107194956918ab43ce4d6dc945ffa13efbc25f"}, + {file = "msgpack-1.0.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:484ae3240666ad34cfa31eea7b8c6cd2f1fdaae21d73ce2974211df099a95d81"}, + {file = "msgpack-1.0.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3967e4ad1aa9da62fd53e346ed17d7b2e922cba5ab93bdd46febcac39be636fc"}, + {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8dd178c4c80706546702c59529ffc005681bd6dc2ea234c450661b205445a34d"}, + {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6ffbc252eb0d229aeb2f9ad051200668fc3a9aaa8994e49f0cb2ffe2b7867e7"}, + {file = "msgpack-1.0.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:822ea70dc4018c7e6223f13affd1c5c30c0f5c12ac1f96cd8e9949acddb48a61"}, + {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:384d779f0d6f1b110eae74cb0659d9aa6ff35aaf547b3955abf2ab4c901c4819"}, + {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f64e376cd20d3f030190e8c32e1c64582eba56ac6dc7d5b0b49a9d44021b52fd"}, + {file = "msgpack-1.0.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5ed82f5a7af3697b1c4786053736f24a0efd0a1b8a130d4c7bfee4b9ded0f08f"}, + {file = "msgpack-1.0.7-cp39-cp39-win32.whl", hash = "sha256:f26a07a6e877c76a88e3cecac8531908d980d3d5067ff69213653649ec0f60ad"}, + {file = "msgpack-1.0.7-cp39-cp39-win_amd64.whl", hash = "sha256:1dc93e8e4653bdb5910aed79f11e165c85732067614f180f70534f056da97db3"}, + {file = "msgpack-1.0.7.tar.gz", hash = "sha256:572efc93db7a4d27e404501975ca6d2d9775705c2d922390d878fcf768d92c87"}, +] + +[[package]] +name = "multidict" +version = "6.0.4" +description = "multidict implementation" +optional = false +python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b1a97283e0c85772d613878028fec909f003993e1007eafa715b24b377cb9b8"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:eeb6dcc05e911516ae3d1f207d4b0520d07f54484c49dfc294d6e7d63b734171"}, + {file = "multidict-6.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6d635d5209b82a3492508cf5b365f3446afb65ae7ebd755e70e18f287b0adf7"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c048099e4c9e9d615545e2001d3d8a4380bd403e1a0578734e0d31703d1b0c0b"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea20853c6dbbb53ed34cb4d080382169b6f4554d394015f1bef35e881bf83547"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16d232d4e5396c2efbbf4f6d4df89bfa905eb0d4dc5b3549d872ab898451f569"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36c63aaa167f6c6b04ef2c85704e93af16c11d20de1d133e39de6a0e84582a93"}, + {file = "multidict-6.0.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:64bdf1086b6043bf519869678f5f2757f473dee970d7abf6da91ec00acb9cb98"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:43644e38f42e3af682690876cff722d301ac585c5b9e1eacc013b7a3f7b696a0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:7582a1d1030e15422262de9f58711774e02fa80df0d1578995c76214f6954988"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:ddff9c4e225a63a5afab9dd15590432c22e8057e1a9a13d28ed128ecf047bbdc"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:ee2a1ece51b9b9e7752e742cfb661d2a29e7bcdba2d27e66e28a99f1890e4fa0"}, + {file = "multidict-6.0.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a2e4369eb3d47d2034032a26c7a80fcb21a2cb22e1173d761a162f11e562caa5"}, + {file = "multidict-6.0.4-cp310-cp310-win32.whl", hash = "sha256:574b7eae1ab267e5f8285f0fe881f17efe4b98c39a40858247720935b893bba8"}, + {file = "multidict-6.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:4dcbb0906e38440fa3e325df2359ac6cb043df8e58c965bb45f4e406ecb162cc"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0dfad7a5a1e39c53ed00d2dd0c2e36aed4650936dc18fd9a1826a5ae1cad6f03"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:64da238a09d6039e3bd39bb3aee9c21a5e34f28bfa5aa22518581f910ff94af3"}, + {file = "multidict-6.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ff959bee35038c4624250473988b24f846cbeb2c6639de3602c073f10410ceba"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:01a3a55bd90018c9c080fbb0b9f4891db37d148a0a18722b42f94694f8b6d4c9"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c5cb09abb18c1ea940fb99360ea0396f34d46566f157122c92dfa069d3e0e982"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666daae833559deb2d609afa4490b85830ab0dfca811a98b70a205621a6109fe"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:11bdf3f5e1518b24530b8241529d2050014c884cf18b6fc69c0c2b30ca248710"}, + {file = "multidict-6.0.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7d18748f2d30f94f498e852c67d61261c643b349b9d2a581131725595c45ec6c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:458f37be2d9e4c95e2d8866a851663cbc76e865b78395090786f6cd9b3bbf4f4"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:b1a2eeedcead3a41694130495593a559a668f382eee0727352b9a41e1c45759a"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:7d6ae9d593ef8641544d6263c7fa6408cc90370c8cb2bbb65f8d43e5b0351d9c"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:5979b5632c3e3534e42ca6ff856bb24b2e3071b37861c2c727ce220d80eee9ed"}, + {file = "multidict-6.0.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:dcfe792765fab89c365123c81046ad4103fcabbc4f56d1c1997e6715e8015461"}, + {file = "multidict-6.0.4-cp311-cp311-win32.whl", hash = "sha256:3601a3cece3819534b11d4efc1eb76047488fddd0c85a3948099d5da4d504636"}, + {file = "multidict-6.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:81a4f0b34bd92df3da93315c6a59034df95866014ac08535fc819f043bfd51f0"}, + {file = "multidict-6.0.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:67040058f37a2a51ed8ea8f6b0e6ee5bd78ca67f169ce6122f3e2ec80dfe9b78"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:853888594621e6604c978ce2a0444a1e6e70c8d253ab65ba11657659dcc9100f"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:39ff62e7d0f26c248b15e364517a72932a611a9b75f35b45be078d81bdb86603"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:af048912e045a2dc732847d33821a9d84ba553f5c5f028adbd364dd4765092ac"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b1e8b901e607795ec06c9e42530788c45ac21ef3aaa11dbd0c69de543bfb79a9"}, + {file = "multidict-6.0.4-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:62501642008a8b9871ddfccbf83e4222cf8ac0d5aeedf73da36153ef2ec222d2"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:99b76c052e9f1bc0721f7541e5e8c05db3941eb9ebe7b8553c625ef88d6eefde"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:509eac6cf09c794aa27bcacfd4d62c885cce62bef7b2c3e8b2e49d365b5003fe"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:21a12c4eb6ddc9952c415f24eef97e3e55ba3af61f67c7bc388dcdec1404a067"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5cad9430ab3e2e4fa4a2ef4450f548768400a2ac635841bc2a56a2052cdbeb87"}, + {file = "multidict-6.0.4-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ab55edc2e84460694295f401215f4a58597f8f7c9466faec545093045476327d"}, + {file = "multidict-6.0.4-cp37-cp37m-win32.whl", hash = "sha256:5a4dcf02b908c3b8b17a45fb0f15b695bf117a67b76b7ad18b73cf8e92608775"}, + {file = "multidict-6.0.4-cp37-cp37m-win_amd64.whl", hash = "sha256:6ed5f161328b7df384d71b07317f4d8656434e34591f20552c7bcef27b0ab88e"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5fc1b16f586f049820c5c5b17bb4ee7583092fa0d1c4e28b5239181ff9532e0c"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1502e24330eb681bdaa3eb70d6358e818e8e8f908a22a1851dfd4e15bc2f8161"}, + {file = "multidict-6.0.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b692f419760c0e65d060959df05f2a531945af31fda0c8a3b3195d4efd06de11"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45e1ecb0379bfaab5eef059f50115b54571acfbe422a14f668fc8c27ba410e7e"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddd3915998d93fbcd2566ddf9cf62cdb35c9e093075f862935573d265cf8f65d"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:59d43b61c59d82f2effb39a93c48b845efe23a3852d201ed2d24ba830d0b4cf2"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc8e1d0c705233c5dd0c5e6460fbad7827d5d36f310a0fadfd45cc3029762258"}, + {file = "multidict-6.0.4-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d6aa0418fcc838522256761b3415822626f866758ee0bc6632c9486b179d0b52"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6748717bb10339c4760c1e63da040f5f29f5ed6e59d76daee30305894069a660"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4d1a3d7ef5e96b1c9e92f973e43aa5e5b96c659c9bc3124acbbd81b0b9c8a951"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4372381634485bec7e46718edc71528024fcdc6f835baefe517b34a33c731d60"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:fc35cb4676846ef752816d5be2193a1e8367b4c1397b74a565a9d0389c433a1d"}, + {file = "multidict-6.0.4-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4b9d9e4e2b37daddb5c23ea33a3417901fa7c7b3dee2d855f63ee67a0b21e5b1"}, + {file = "multidict-6.0.4-cp38-cp38-win32.whl", hash = "sha256:e41b7e2b59679edfa309e8db64fdf22399eec4b0b24694e1b2104fb789207779"}, + {file = "multidict-6.0.4-cp38-cp38-win_amd64.whl", hash = "sha256:d6c254ba6e45d8e72739281ebc46ea5eb5f101234f3ce171f0e9f5cc86991480"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16ab77bbeb596e14212e7bab8429f24c1579234a3a462105cda4a66904998664"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bc779e9e6f7fda81b3f9aa58e3a6091d49ad528b11ed19f6621408806204ad35"}, + {file = "multidict-6.0.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ceef517eca3e03c1cceb22030a3e39cb399ac86bff4e426d4fc6ae49052cc60"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:281af09f488903fde97923c7744bb001a9b23b039a909460d0f14edc7bf59706"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:52f2dffc8acaba9a2f27174c41c9e57f60b907bb9f096b36b1a1f3be71c6284d"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b41156839806aecb3641f3208c0dafd3ac7775b9c4c422d82ee2a45c34ba81ca"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5e3fc56f88cc98ef8139255cf8cd63eb2c586531e43310ff859d6bb3a6b51f1"}, + {file = "multidict-6.0.4-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8316a77808c501004802f9beebde51c9f857054a0c871bd6da8280e718444449"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f70b98cd94886b49d91170ef23ec5c0e8ebb6f242d734ed7ed677b24d50c82cf"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bf6774e60d67a9efe02b3616fee22441d86fab4c6d335f9d2051d19d90a40063"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:e69924bfcdda39b722ef4d9aa762b2dd38e4632b3641b1d9a57ca9cd18f2f83a"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:6b181d8c23da913d4ff585afd1155a0e1194c0b50c54fcfe286f70cdaf2b7176"}, + {file = "multidict-6.0.4-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:52509b5be062d9eafc8170e53026fbc54cf3b32759a23d07fd935fb04fc22d95"}, + {file = "multidict-6.0.4-cp39-cp39-win32.whl", hash = "sha256:27c523fbfbdfd19c6867af7346332b62b586eed663887392cff78d614f9ec313"}, + {file = "multidict-6.0.4-cp39-cp39-win_amd64.whl", hash = "sha256:33029f5734336aa0d4c0384525da0387ef89148dc7191aae00ca5fb23d7aafc2"}, + {file = "multidict-6.0.4.tar.gz", hash = "sha256:3666906492efb76453c0e7b97f2cf459b0682e7402c0489a95484965dbc1da49"}, +] + +[[package]] +name = "mypy" +version = "1.5.1" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f33592ddf9655a4894aef22d134de7393e95fcbdc2d15c1ab65828eee5c66c70"}, + {file = "mypy-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:258b22210a4a258ccd077426c7a181d789d1121aca6db73a83f79372f5569ae0"}, + {file = "mypy-1.5.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9ec1f695f0c25986e6f7f8778e5ce61659063268836a38c951200c57479cc12"}, + {file = "mypy-1.5.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:abed92d9c8f08643c7d831300b739562b0a6c9fcb028d211134fc9ab20ccad5d"}, + {file = "mypy-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a156e6390944c265eb56afa67c74c0636f10283429171018446b732f1a05af25"}, + {file = "mypy-1.5.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6ac9c21bfe7bc9f7f1b6fae441746e6a106e48fc9de530dea29e8cd37a2c0cc4"}, + {file = "mypy-1.5.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:51cb1323064b1099e177098cb939eab2da42fea5d818d40113957ec954fc85f4"}, + {file = "mypy-1.5.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:596fae69f2bfcb7305808c75c00f81fe2829b6236eadda536f00610ac5ec2243"}, + {file = "mypy-1.5.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:32cb59609b0534f0bd67faebb6e022fe534bdb0e2ecab4290d683d248be1b275"}, + {file = "mypy-1.5.1-cp311-cp311-win_amd64.whl", hash = "sha256:159aa9acb16086b79bbb0016145034a1a05360626046a929f84579ce1666b315"}, + {file = "mypy-1.5.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f6b0e77db9ff4fda74de7df13f30016a0a663928d669c9f2c057048ba44f09bb"}, + {file = "mypy-1.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:26f71b535dfc158a71264e6dc805a9f8d2e60b67215ca0bfa26e2e1aa4d4d373"}, + {file = "mypy-1.5.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2fc3a600f749b1008cc75e02b6fb3d4db8dbcca2d733030fe7a3b3502902f161"}, + {file = "mypy-1.5.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:26fb32e4d4afa205b24bf645eddfbb36a1e17e995c5c99d6d00edb24b693406a"}, + {file = "mypy-1.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:82cb6193de9bbb3844bab4c7cf80e6227d5225cc7625b068a06d005d861ad5f1"}, + {file = "mypy-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4a465ea2ca12804d5b34bb056be3a29dc47aea5973b892d0417c6a10a40b2d65"}, + {file = "mypy-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9fece120dbb041771a63eb95e4896791386fe287fefb2837258925b8326d6160"}, + {file = "mypy-1.5.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d28ddc3e3dfeab553e743e532fb95b4e6afad51d4706dd22f28e1e5e664828d2"}, + {file = "mypy-1.5.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:57b10c56016adce71fba6bc6e9fd45d8083f74361f629390c556738565af8eeb"}, + {file = "mypy-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:ff0cedc84184115202475bbb46dd99f8dcb87fe24d5d0ddfc0fe6b8575c88d2f"}, + {file = "mypy-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8f772942d372c8cbac575be99f9cc9d9fb3bd95c8bc2de6c01411e2c84ebca8a"}, + {file = "mypy-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5d627124700b92b6bbaa99f27cbe615c8ea7b3402960f6372ea7d65faf376c14"}, + {file = "mypy-1.5.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:361da43c4f5a96173220eb53340ace68cda81845cd88218f8862dfb0adc8cddb"}, + {file = "mypy-1.5.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:330857f9507c24de5c5724235e66858f8364a0693894342485e543f5b07c8693"}, + {file = "mypy-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:c543214ffdd422623e9fedd0869166c2f16affe4ba37463975043ef7d2ea8770"}, + {file = "mypy-1.5.1-py3-none-any.whl", hash = "sha256:f757063a83970d67c444f6e01d9550a7402322af3557ce7630d3c957386fa8f5"}, + {file = "mypy-1.5.1.tar.gz", hash = "sha256:b031b9601f1060bf1281feab89697324726ba0c0bae9d7cd7ab4b690940f0b92"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=4.1.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "paramiko" +version = "2.12.0" +description = "SSH2 protocol library" +optional = false +python-versions = "*" +files = [ + {file = "paramiko-2.12.0-py2.py3-none-any.whl", hash = "sha256:b2df1a6325f6996ef55a8789d0462f5b502ea83b3c990cbb5bbe57345c6812c4"}, + {file = "paramiko-2.12.0.tar.gz", hash = "sha256:376885c05c5d6aa6e1f4608aac2a6b5b0548b1add40274477324605903d9cd49"}, +] + +[package.dependencies] +bcrypt = ">=3.1.3" +cryptography = ">=2.5" +pynacl = ">=1.0.1" +six = "*" + +[package.extras] +all = ["bcrypt (>=3.1.3)", "gssapi (>=1.4.1)", "invoke (>=1.3)", "pyasn1 (>=0.1.7)", "pynacl (>=1.0.1)", "pywin32 (>=2.1.8)"] +ed25519 = ["bcrypt (>=3.1.3)", "pynacl (>=1.0.1)"] +gssapi = ["gssapi (>=1.4.1)", "pyasn1 (>=0.1.7)", "pywin32 (>=2.1.8)"] +invoke = ["invoke (>=1.3)"] + +[[package]] +name = "passlib" +version = "1.7.4" +description = "comprehensive password hashing framework supporting over 30 schemes" +optional = false +python-versions = "*" +files = [ + {file = "passlib-1.7.4-py2.py3-none-any.whl", hash = "sha256:aa6bca462b8d8bda89c70b382f0c298a20b5560af6cbfa2dce410c0a2fb669f1"}, + {file = "passlib-1.7.4.tar.gz", hash = "sha256:defd50f72b65c5402ab2c573830a6978e5f202ad0d984793c8dde2c4152ebe04"}, +] + +[package.extras] +argon2 = ["argon2-cffi (>=18.2.0)"] +bcrypt = ["bcrypt (>=3.1.0)"] +build-docs = ["cloud-sptheme (>=1.10.1)", "sphinx (>=1.6)", "sphinxcontrib-fulltoc (>=1.2.0)"] +totp = ["cryptography"] + +[[package]] +name = "pastel" +version = "0.2.1" +description = "Bring colors to your terminal." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pastel-0.2.1-py2.py3-none-any.whl", hash = "sha256:4349225fcdf6c2bb34d483e523475de5bb04a5c10ef711263452cb37d7dd4364"}, + {file = "pastel-0.2.1.tar.gz", hash = "sha256:e6581ac04e973cac858828c6202c1e1e81fee1dc7de7683f3e1ffe0bfd8a573d"}, +] + +[[package]] +name = "pathspec" +version = "0.11.2" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.11.2-py3-none-any.whl", hash = "sha256:1d6ed233af05e679efb96b1851550ea95bbb64b7c490b0f5aa52996c11e92a20"}, + {file = "pathspec-0.11.2.tar.gz", hash = "sha256:e0d8d0ac2f12da61956eb2306b69f9469b42f4deb0f3cb6ed47b9cce9996ced3"}, +] + +[[package]] +name = "pip" +version = "23.2.1" +description = "The PyPA recommended tool for installing Python packages." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pip-23.2.1-py3-none-any.whl", hash = "sha256:7ccf472345f20d35bdc9d1841ff5f313260c2c33fe417f48c30ac46cccabf5be"}, + {file = "pip-23.2.1.tar.gz", hash = "sha256:fb0bd5435b3200c602b5bf61d2d43c2f13c02e29c1707567ae7fbc514eb9faf2"}, +] + +[[package]] +name = "pluggy" +version = "1.3.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "poethepoet" +version = "0.22.1" +description = "A task runner that works well with poetry." +optional = false +python-versions = ">=3.8" +files = [ + {file = "poethepoet-0.22.1-py3-none-any.whl", hash = "sha256:1da4cd00d3b2c44b811c91616a744cf71094a26a299ea9956025162d34eef1a5"}, + {file = "poethepoet-0.22.1.tar.gz", hash = "sha256:e758bcac731fa9ac0b812389589541e32b825c4a1894e16fa90aeb1946ba2823"}, +] + +[package.dependencies] +pastel = ">=0.2.1,<0.3.0" +tomli = ">=1.2.2" + +[package.extras] +poetry-plugin = ["poetry (>=1.0,<2.0)"] + +[[package]] +name = "protobuf" +version = "3.13.0" +description = "Protocol Buffers" +optional = false +python-versions = "*" +files = [ + {file = "protobuf-3.13.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:9c2e63c1743cba12737169c447374fab3dfeb18111a460a8c1a000e35836b18c"}, + {file = "protobuf-3.13.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:1e834076dfef9e585815757a2c7e4560c7ccc5962b9d09f831214c693a91b463"}, + {file = "protobuf-3.13.0-cp35-cp35m-macosx_10_9_intel.whl", hash = "sha256:df3932e1834a64b46ebc262e951cd82c3cf0fa936a154f0a42231140d8237060"}, + {file = "protobuf-3.13.0-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:8c35bcbed1c0d29b127c886790e9d37e845ffc2725cc1db4bd06d70f4e8359f4"}, + {file = "protobuf-3.13.0-cp35-cp35m-win32.whl", hash = "sha256:339c3a003e3c797bc84499fa32e0aac83c768e67b3de4a5d7a5a9aa3b0da634c"}, + {file = "protobuf-3.13.0-cp35-cp35m-win_amd64.whl", hash = "sha256:361acd76f0ad38c6e38f14d08775514fbd241316cce08deb2ce914c7dfa1184a"}, + {file = "protobuf-3.13.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9edfdc679a3669988ec55a989ff62449f670dfa7018df6ad7f04e8dbacb10630"}, + {file = "protobuf-3.13.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5db9d3e12b6ede5e601b8d8684a7f9d90581882925c96acf8495957b4f1b204b"}, + {file = "protobuf-3.13.0-cp36-cp36m-win32.whl", hash = "sha256:c8abd7605185836f6f11f97b21200f8a864f9cb078a193fe3c9e235711d3ff1e"}, + {file = "protobuf-3.13.0-cp36-cp36m-win_amd64.whl", hash = "sha256:4d1174c9ed303070ad59553f435846a2f877598f59f9afc1b89757bdf846f2a7"}, + {file = "protobuf-3.13.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0bba42f439bf45c0f600c3c5993666fcb88e8441d011fad80a11df6f324eef33"}, + {file = "protobuf-3.13.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:c0c5ab9c4b1eac0a9b838f1e46038c3175a95b0f2d944385884af72876bd6bc7"}, + {file = "protobuf-3.13.0-cp37-cp37m-win32.whl", hash = "sha256:f68eb9d03c7d84bd01c790948320b768de8559761897763731294e3bc316decb"}, + {file = "protobuf-3.13.0-cp37-cp37m-win_amd64.whl", hash = "sha256:91c2d897da84c62816e2f473ece60ebfeab024a16c1751aaf31100127ccd93ec"}, + {file = "protobuf-3.13.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3dee442884a18c16d023e52e32dd34a8930a889e511af493f6dc7d4d9bf12e4f"}, + {file = "protobuf-3.13.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:e7662437ca1e0c51b93cadb988f9b353fa6b8013c0385d63a70c8a77d84da5f9"}, + {file = "protobuf-3.13.0-py2.py3-none-any.whl", hash = "sha256:d69697acac76d9f250ab745b46c725edf3e98ac24763990b24d58c16c642947a"}, + {file = "protobuf-3.13.0.tar.gz", hash = "sha256:6a82e0c8bb2bf58f606040cc5814e07715b2094caeba281e2e7d0b0e2e397db5"}, +] + +[package.dependencies] +setuptools = "*" +six = ">=1.9" + +[[package]] +name = "publicsuffix2" +version = "2.20191221" +description = "Get a public suffix for a domain name using the Public Suffix List. Forked from and using the same API as the publicsuffix package." +optional = false +python-versions = "*" +files = [ + {file = "publicsuffix2-2.20191221-py2.py3-none-any.whl", hash = "sha256:786b5e36205b88758bd3518725ec8cfe7a8173f5269354641f581c6b80a99893"}, + {file = "publicsuffix2-2.20191221.tar.gz", hash = "sha256:00f8cc31aa8d0d5592a5ced19cccba7de428ebca985db26ac852d920ddd6fe7b"}, +] + +[[package]] +name = "pyasn1" +version = "0.4.8" +description = "ASN.1 types and codecs" +optional = false +python-versions = "*" +files = [ + {file = "pyasn1-0.4.8-py2.py3-none-any.whl", hash = "sha256:39c7e2ec30515947ff4e87fb6f456dfc6e84857d34be479c9d4a4ba4bf46aa5d"}, + {file = "pyasn1-0.4.8.tar.gz", hash = "sha256:aef77c9fb94a3ac588e87841208bdec464471d9871bd5050a287cc9a475cd0ba"}, +] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pydivert" +version = "2.1.0" +description = "Python binding to windivert driver" +optional = false +python-versions = "*" +files = [ + {file = "pydivert-2.1.0-py2.py3-none-any.whl", hash = "sha256:382db488e3c37c03ec9ec94e061a0b24334d78dbaeebb7d4e4d32ce4355d9da1"}, + {file = "pydivert-2.1.0.tar.gz", hash = "sha256:f0e150f4ff591b78e35f514e319561dadff7f24a82186a171dd4d465483de5b4"}, +] + +[package.extras] +docs = ["sphinx (>=1.4.8)"] +test = ["codecov (>=2.0.5)", "hypothesis (>=3.5.3)", "mock (>=1.0.1)", "pytest (>=3.0.3)", "pytest-cov (>=2.2.1)", "pytest-faulthandler (>=1.3.0,<2)", "pytest-timeout (>=1.0.0,<2)", "wheel (>=0.29)"] + +[[package]] +name = "pynacl" +version = "1.5.0" +description = "Python binding to the Networking and Cryptography (NaCl) library" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyNaCl-1.5.0-cp36-abi3-macosx_10_10_universal2.whl", hash = "sha256:401002a4aaa07c9414132aaed7f6836ff98f59277a234704ff66878c2ee4a0d1"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_24_aarch64.whl", hash = "sha256:52cb72a79269189d4e0dc537556f4740f7f0a9ec41c1322598799b0bdad4ef92"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a36d4a9dda1f19ce6e03c9a784a2921a4b726b02e1c736600ca9c22029474394"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_24_x86_64.whl", hash = "sha256:0c84947a22519e013607c9be43706dd42513f9e6ae5d39d3613ca1e142fba44d"}, + {file = "PyNaCl-1.5.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:06b8f6fa7f5de8d5d2f7573fe8c863c051225a27b61e6860fd047b1775807858"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:a422368fc821589c228f4c49438a368831cb5bbc0eab5ebe1d7fac9dded6567b"}, + {file = "PyNaCl-1.5.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:61f642bf2378713e2c2e1de73444a3778e5f0a38be6fee0fe532fe30060282ff"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win32.whl", hash = "sha256:e46dae94e34b085175f8abb3b0aaa7da40767865ac82c928eeb9e57e1ea8a543"}, + {file = "PyNaCl-1.5.0-cp36-abi3-win_amd64.whl", hash = "sha256:20f42270d27e1b6a29f54032090b972d97f0a1b0948cc52392041ef7831fee93"}, + {file = "PyNaCl-1.5.0.tar.gz", hash = "sha256:8ac7448f09ab85811607bdd21ec2464495ac8b7c66d146bf545b0f08fb9220ba"}, +] + +[package.dependencies] +cffi = ">=1.4.1" + +[package.extras] +docs = ["sphinx (>=1.6.5)", "sphinx-rtd-theme"] +tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] + +[[package]] +name = "pyopenssl" +version = "19.1.0" +description = "Python wrapper module around the OpenSSL library" +optional = false +python-versions = "*" +files = [ + {file = "pyOpenSSL-19.1.0-py2.py3-none-any.whl", hash = "sha256:621880965a720b8ece2f1b2f54ea2071966ab00e2970ad2ce11d596102063504"}, + {file = "pyOpenSSL-19.1.0.tar.gz", hash = "sha256:9a24494b2602aaf402be5c9e30a0b82d4a5c67528fe8fb475e3f3bc00dd69507"}, +] + +[package.dependencies] +cryptography = ">=2.8" +six = ">=1.5.2" + +[package.extras] +docs = ["sphinx", "sphinx-rtd-theme"] +test = ["flaky", "pretend", "pytest (>=3.0.1)"] + +[[package]] +name = "pyparsing" +version = "2.4.7" +description = "Python parsing module" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "pyparsing-2.4.7-py2.py3-none-any.whl", hash = "sha256:ef9d7589ef3c200abe66653d3f1ab1033c3c419ae9b9bdb1240a85b024efc88b"}, + {file = "pyparsing-2.4.7.tar.gz", hash = "sha256:c203ec8783bf771a155b207279b9bccb8dea02d8f0c9e5f8ead507bc3246ecc1"}, +] + +[[package]] +name = "pyperclip" +version = "1.8.2" +description = "A cross-platform clipboard module for Python. (Only handles plain text for now.)" +optional = false +python-versions = "*" +files = [ + {file = "pyperclip-1.8.2.tar.gz", hash = "sha256:105254a8b04934f0bc84e9c24eb360a591aaf6535c9def5f29d92af107a9bf57"}, +] + +[[package]] +name = "pyrsistent" +version = "0.19.3" +description = "Persistent/Functional/Immutable data structures" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyrsistent-0.19.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:20460ac0ea439a3e79caa1dbd560344b64ed75e85d8703943e0b66c2a6150e4a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4c18264cb84b5e68e7085a43723f9e4c1fd1d935ab240ce02c0324a8e01ccb64"}, + {file = "pyrsistent-0.19.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4b774f9288dda8d425adb6544e5903f1fb6c273ab3128a355c6b972b7df39dcf"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win32.whl", hash = "sha256:5a474fb80f5e0d6c9394d8db0fc19e90fa540b82ee52dba7d246a7791712f74a"}, + {file = "pyrsistent-0.19.3-cp310-cp310-win_amd64.whl", hash = "sha256:49c32f216c17148695ca0e02a5c521e28a4ee6c5089f97e34fe24163113722da"}, + {file = "pyrsistent-0.19.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f0774bf48631f3a20471dd7c5989657b639fd2d285b861237ea9e82c36a415a9"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ab2204234c0ecd8b9368dbd6a53e83c3d4f3cab10ecaf6d0e772f456c442393"}, + {file = "pyrsistent-0.19.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e42296a09e83028b3476f7073fcb69ffebac0e66dbbfd1bd847d61f74db30f19"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win32.whl", hash = "sha256:64220c429e42a7150f4bfd280f6f4bb2850f95956bde93c6fda1b70507af6ef3"}, + {file = "pyrsistent-0.19.3-cp311-cp311-win_amd64.whl", hash = "sha256:016ad1afadf318eb7911baa24b049909f7f3bb2c5b1ed7b6a8f21db21ea3faa8"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c4db1bd596fefd66b296a3d5d943c94f4fac5bcd13e99bffe2ba6a759d959a28"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aeda827381f5e5d65cced3024126529ddc4289d944f75e090572c77ceb19adbf"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:42ac0b2f44607eb92ae88609eda931a4f0dfa03038c44c772e07f43e738bcac9"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win32.whl", hash = "sha256:e8f2b814a3dc6225964fa03d8582c6e0b6650d68a232df41e3cc1b66a5d2f8d1"}, + {file = "pyrsistent-0.19.3-cp37-cp37m-win_amd64.whl", hash = "sha256:c9bb60a40a0ab9aba40a59f68214eed5a29c6274c83b2cc206a359c4a89fa41b"}, + {file = "pyrsistent-0.19.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a2471f3f8693101975b1ff85ffd19bb7ca7dd7c38f8a81701f67d6b4f97b87d8"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc5d149f31706762c1f8bda2e8c4f8fead6e80312e3692619a75301d3dbb819a"}, + {file = "pyrsistent-0.19.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3311cb4237a341aa52ab8448c27e3a9931e2ee09561ad150ba94e4cfd3fc888c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win32.whl", hash = "sha256:f0e7c4b2f77593871e918be000b96c8107da48444d57005b6a6bc61fb4331b2c"}, + {file = "pyrsistent-0.19.3-cp38-cp38-win_amd64.whl", hash = "sha256:c147257a92374fde8498491f53ffa8f4822cd70c0d85037e09028e478cababb7"}, + {file = "pyrsistent-0.19.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b735e538f74ec31378f5a1e3886a26d2ca6351106b4dfde376a26fc32a044edc"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99abb85579e2165bd8522f0c0138864da97847875ecbd45f3e7e2af569bfc6f2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3a8cb235fa6d3fd7aae6a4f1429bbb1fec1577d978098da1252f0489937786f3"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win32.whl", hash = "sha256:c74bed51f9b41c48366a286395c67f4e894374306b197e62810e0fdaf2364da2"}, + {file = "pyrsistent-0.19.3-cp39-cp39-win_amd64.whl", hash = "sha256:878433581fc23e906d947a6814336eee031a00e6defba224234169ae3d3d6a98"}, + {file = "pyrsistent-0.19.3-py3-none-any.whl", hash = "sha256:ccf0d6bd208f8111179f0c26fdf84ed7c3891982f2edaeae7422575f47e66b64"}, + {file = "pyrsistent-0.19.3.tar.gz", hash = "sha256:1a2994773706bbb4995c31a97bc94f1418314923bd1048c6d964837040376440"}, +] + +[[package]] +name = "pytest" +version = "7.4.2" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.2-py3-none-any.whl", hash = "sha256:1d881c6124e08ff0a1bb75ba3ec0bfd8b5354a01c194ddd5a0a870a48d99b002"}, + {file = "pytest-7.4.2.tar.gz", hash = "sha256:a766259cfab564a2ad52cb1aae1b881a75c3eb7e34ca3779697c23ed47c47069"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-asyncio" +version = "0.21.0" +description = "Pytest support for asyncio" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-asyncio-0.21.0.tar.gz", hash = "sha256:2b38a496aef56f56b0e87557ec313e11e1ab9276fc3863f6a7be0f1d0e415e1b"}, + {file = "pytest_asyncio-0.21.0-py3-none-any.whl", hash = "sha256:f2b3366b7cd501a4056858bd39349d5af19742aed2d81660b7998b6341c7eb9c"}, +] + +[package.dependencies] +pytest = ">=7.0.0" + +[package.extras] +docs = ["sphinx (>=5.3)", "sphinx-rtd-theme (>=1.0)"] +testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy (>=0.931)", "pytest-trio (>=0.7.0)"] + +[[package]] +name = "pytest-split" +version = "0.8.1" +description = "Pytest plugin which splits the test suite to equally sized sub suites based on test execution time." +optional = false +python-versions = ">=3.7.1,<4.0" +files = [ + {file = "pytest_split-0.8.1-py3-none-any.whl", hash = "sha256:74b110ea091bd147cc1c5f9665a59506e5cedfa66f96a89fb03e4ab447c2c168"}, + {file = "pytest_split-0.8.1.tar.gz", hash = "sha256:2d88bd3dc528689a7a3f58fc12ea165c3aa62e90795e420dfad920afe5612d6d"}, +] + +[package.dependencies] +pytest = ">=5,<8" + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "0.21.1" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.7" +files = [ + {file = "python-dotenv-0.21.1.tar.gz", hash = "sha256:1c93de8f636cde3ce377292818d0e440b6e45a82f215c3744979151fa8151c49"}, + {file = "python_dotenv-0.21.1-py3-none-any.whl", hash = "sha256:41e12e0318bebc859fcc4d97d4db8d20ad21721a6aa5047dd59f090391cb549a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pyyaml" +version = "5.3.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = "*" +files = [ + {file = "PyYAML-5.3.1-cp27-cp27m-win32.whl", hash = "sha256:74809a57b329d6cc0fdccee6318f44b9b8649961fa73144a98735b0aaf029f1f"}, + {file = "PyYAML-5.3.1-cp27-cp27m-win_amd64.whl", hash = "sha256:240097ff019d7c70a4922b6869d8a86407758333f02203e0fc6ff79c5dcede76"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win32.whl", hash = "sha256:4f4b913ca1a7319b33cfb1369e91e50354d6f07a135f3b901aca02aa95940bd2"}, + {file = "PyYAML-5.3.1-cp35-cp35m-win_amd64.whl", hash = "sha256:cc8955cfbfc7a115fa81d85284ee61147059a753344bc51098f3ccd69b0d7e0c"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win32.whl", hash = "sha256:7739fc0fa8205b3ee8808aea45e968bc90082c10aef6ea95e855e10abf4a37b2"}, + {file = "PyYAML-5.3.1-cp36-cp36m-win_amd64.whl", hash = "sha256:69f00dca373f240f842b2931fb2c7e14ddbacd1397d57157a9b005a6a9942648"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win32.whl", hash = "sha256:d13155f591e6fcc1ec3b30685d50bf0711574e2c0dfffd7644babf8b5102ca1a"}, + {file = "PyYAML-5.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:73f099454b799e05e5ab51423c7bcf361c58d3206fa7b0d555426b1f4d9a3eaf"}, + {file = "PyYAML-5.3.1-cp38-cp38-win32.whl", hash = "sha256:06a0d7ba600ce0b2d2fe2e78453a470b5a6e000a985dd4a4e54e436cc36b0e97"}, + {file = "PyYAML-5.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:95f71d2af0ff4227885f7a6605c37fd53d3a106fcab511b8860ecca9fcf400ee"}, + {file = "PyYAML-5.3.1-cp39-cp39-win32.whl", hash = "sha256:ad9c67312c84def58f3c04504727ca879cb0013b2517c85a9a253f0cb6380c0a"}, + {file = "PyYAML-5.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:6034f55dab5fea9e53f436aa68fa3ace2634918e8b5994d82f3621c04ff5ed2e"}, + {file = "PyYAML-5.3.1.tar.gz", hash = "sha256:b8eac752c5e14d3eca0e6dd9199cd627518cb5ec06add0de9d32baeee6fe645d"}, +] + +[[package]] +name = "regex" +version = "2023.10.3" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.7" +files = [ + {file = "regex-2023.10.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4c34d4f73ea738223a094d8e0ffd6d2c1a1b4c175da34d6b0de3d8d69bee6bcc"}, + {file = "regex-2023.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8f4e49fc3ce020f65411432183e6775f24e02dff617281094ba6ab079ef0915"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4cd1bccf99d3ef1ab6ba835308ad85be040e6a11b0977ef7ea8c8005f01a3c29"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:81dce2ddc9f6e8f543d94b05d56e70d03a0774d32f6cca53e978dc01e4fc75b8"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c6b4d23c04831e3ab61717a707a5d763b300213db49ca680edf8bf13ab5d91b"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c15ad0aee158a15e17e0495e1e18741573d04eb6da06d8b84af726cfc1ed02ee"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6239d4e2e0b52c8bd38c51b760cd870069f0bdf99700a62cd509d7a031749a55"}, + {file = "regex-2023.10.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4a8bf76e3182797c6b1afa5b822d1d5802ff30284abe4599e1247be4fd6b03be"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d9c727bbcf0065cbb20f39d2b4f932f8fa1631c3e01fcedc979bd4f51fe051c5"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:3ccf2716add72f80714b9a63899b67fa711b654be3fcdd34fa391d2d274ce767"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:107ac60d1bfdc3edb53be75e2a52aff7481b92817cfdddd9b4519ccf0e54a6ff"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:00ba3c9818e33f1fa974693fb55d24cdc8ebafcb2e4207680669d8f8d7cca79a"}, + {file = "regex-2023.10.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f0a47efb1dbef13af9c9a54a94a0b814902e547b7f21acb29434504d18f36e3a"}, + {file = "regex-2023.10.3-cp310-cp310-win32.whl", hash = "sha256:36362386b813fa6c9146da6149a001b7bd063dabc4d49522a1f7aa65b725c7ec"}, + {file = "regex-2023.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:c65a3b5330b54103e7d21cac3f6bf3900d46f6d50138d73343d9e5b2900b2353"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90a79bce019c442604662d17bf69df99090e24cdc6ad95b18b6725c2988a490e"}, + {file = "regex-2023.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c7964c2183c3e6cce3f497e3a9f49d182e969f2dc3aeeadfa18945ff7bdd7051"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ef80829117a8061f974b2fda8ec799717242353bff55f8a29411794d635d964"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5addc9d0209a9afca5fc070f93b726bf7003bd63a427f65ef797a931782e7edc"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c148bec483cc4b421562b4bcedb8e28a3b84fcc8f0aa4418e10898f3c2c0eb9b"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d1f21af4c1539051049796a0f50aa342f9a27cde57318f2fc41ed50b0dbc4ac"}, + {file = "regex-2023.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b9ac09853b2a3e0d0082104036579809679e7715671cfbf89d83c1cb2a30f58"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ebedc192abbc7fd13c5ee800e83a6df252bec691eb2c4bedc9f8b2e2903f5e2a"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d8a993c0a0ffd5f2d3bda23d0cd75e7086736f8f8268de8a82fbc4bd0ac6791e"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:be6b7b8d42d3090b6c80793524fa66c57ad7ee3fe9722b258aec6d0672543fd0"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4023e2efc35a30e66e938de5aef42b520c20e7eda7bb5fb12c35e5d09a4c43f6"}, + {file = "regex-2023.10.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d47840dc05e0ba04fe2e26f15126de7c755496d5a8aae4a08bda4dd8d646c54"}, + {file = "regex-2023.10.3-cp311-cp311-win32.whl", hash = "sha256:9145f092b5d1977ec8c0ab46e7b3381b2fd069957b9862a43bd383e5c01d18c2"}, + {file = "regex-2023.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:b6104f9a46bd8743e4f738afef69b153c4b8b592d35ae46db07fc28ae3d5fb7c"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:bff507ae210371d4b1fe316d03433ac099f184d570a1a611e541923f78f05037"}, + {file = "regex-2023.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:be5e22bbb67924dea15039c3282fa4cc6cdfbe0cbbd1c0515f9223186fc2ec5f"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4a992f702c9be9c72fa46f01ca6e18d131906a7180950958f766c2aa294d4b41"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7434a61b158be563c1362d9071358f8ab91b8d928728cd2882af060481244c9e"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c2169b2dcabf4e608416f7f9468737583ce5f0a6e8677c4efbf795ce81109d7c"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9e908ef5889cda4de038892b9accc36d33d72fb3e12c747e2799a0e806ec841"}, + {file = "regex-2023.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:12bd4bc2c632742c7ce20db48e0d99afdc05e03f0b4c1af90542e05b809a03d9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bc72c231f5449d86d6c7d9cc7cd819b6eb30134bb770b8cfdc0765e48ef9c420"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bce8814b076f0ce5766dc87d5a056b0e9437b8e0cd351b9a6c4e1134a7dfbda9"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ba7cd6dc4d585ea544c1412019921570ebd8a597fabf475acc4528210d7c4a6f"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b0c7d2f698e83f15228ba41c135501cfe7d5740181d5903e250e47f617eb4292"}, + {file = "regex-2023.10.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:5a8f91c64f390ecee09ff793319f30a0f32492e99f5dc1c72bc361f23ccd0a9a"}, + {file = "regex-2023.10.3-cp312-cp312-win32.whl", hash = "sha256:ad08a69728ff3c79866d729b095872afe1e0557251da4abb2c5faff15a91d19a"}, + {file = "regex-2023.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:39cdf8d141d6d44e8d5a12a8569d5a227f645c87df4f92179bd06e2e2705e76b"}, + {file = "regex-2023.10.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4a3ee019a9befe84fa3e917a2dd378807e423d013377a884c1970a3c2792d293"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:76066d7ff61ba6bf3cb5efe2428fc82aac91802844c022d849a1f0f53820502d"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfe50b61bab1b1ec260fa7cd91106fa9fece57e6beba05630afe27c71259c59b"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fd88f373cb71e6b59b7fa597e47e518282455c2734fd4306a05ca219a1991b0"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3ab05a182c7937fb374f7e946f04fb23a0c0699c0450e9fb02ef567412d2fa3"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dac37cf08fcf2094159922edc7a2784cfcc5c70f8354469f79ed085f0328ebdf"}, + {file = "regex-2023.10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e54ddd0bb8fb626aa1f9ba7b36629564544954fff9669b15da3610c22b9a0991"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:3367007ad1951fde612bf65b0dffc8fd681a4ab98ac86957d16491400d661302"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:16f8740eb6dbacc7113e3097b0a36065a02e37b47c936b551805d40340fb9971"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4f2ca6df64cbdd27f27b34f35adb640b5d2d77264228554e68deda54456eb11"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:39807cbcbe406efca2a233884e169d056c35aa7e9f343d4e78665246a332f597"}, + {file = "regex-2023.10.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7eece6fbd3eae4a92d7c748ae825cbc1ee41a89bb1c3db05b5578ed3cfcfd7cb"}, + {file = "regex-2023.10.3-cp37-cp37m-win32.whl", hash = "sha256:ce615c92d90df8373d9e13acddd154152645c0dc060871abf6bd43809673d20a"}, + {file = "regex-2023.10.3-cp37-cp37m-win_amd64.whl", hash = "sha256:0f649fa32fe734c4abdfd4edbb8381c74abf5f34bc0b3271ce687b23729299ed"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9b98b7681a9437262947f41c7fac567c7e1f6eddd94b0483596d320092004533"}, + {file = "regex-2023.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:91dc1d531f80c862441d7b66c4505cd6ea9d312f01fb2f4654f40c6fdf5cc37a"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:82fcc1f1cc3ff1ab8a57ba619b149b907072e750815c5ba63e7aa2e1163384a4"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7979b834ec7a33aafae34a90aad9f914c41fd6eaa8474e66953f3f6f7cbd4368"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef71561f82a89af6cfcbee47f0fabfdb6e63788a9258e913955d89fdd96902ab"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd829712de97753367153ed84f2de752b86cd1f7a88b55a3a775eb52eafe8a94"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00e871d83a45eee2f8688d7e6849609c2ca2a04a6d48fba3dff4deef35d14f07"}, + {file = "regex-2023.10.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:706e7b739fdd17cb89e1fbf712d9dc21311fc2333f6d435eac2d4ee81985098c"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:cc3f1c053b73f20c7ad88b0d1d23be7e7b3901229ce89f5000a8399746a6e039"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f85739e80d13644b981a88f529d79c5bdf646b460ba190bffcaf6d57b2a9863"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:741ba2f511cc9626b7561a440f87d658aabb3d6b744a86a3c025f866b4d19e7f"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e77c90ab5997e85901da85131fd36acd0ed2221368199b65f0d11bca44549711"}, + {file = "regex-2023.10.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:979c24cbefaf2420c4e377ecd1f165ea08cc3d1fbb44bdc51bccbbf7c66a2cb4"}, + {file = "regex-2023.10.3-cp38-cp38-win32.whl", hash = "sha256:58837f9d221744d4c92d2cf7201c6acd19623b50c643b56992cbd2b745485d3d"}, + {file = "regex-2023.10.3-cp38-cp38-win_amd64.whl", hash = "sha256:c55853684fe08d4897c37dfc5faeff70607a5f1806c8be148f1695be4a63414b"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2c54e23836650bdf2c18222c87f6f840d4943944146ca479858404fedeb9f9af"}, + {file = "regex-2023.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:69c0771ca5653c7d4b65203cbfc5e66db9375f1078689459fe196fe08b7b4930"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ac965a998e1388e6ff2e9781f499ad1eaa41e962a40d11c7823c9952c77123e"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c0e8fae5b27caa34177bdfa5a960c46ff2f78ee2d45c6db15ae3f64ecadde14"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c56c3d47da04f921b73ff9415fbaa939f684d47293f071aa9cbb13c94afc17d"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7ef1e014eed78ab650bef9a6a9cbe50b052c0aebe553fb2881e0453717573f52"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d29338556a59423d9ff7b6eb0cb89ead2b0875e08fe522f3e068b955c3e7b59b"}, + {file = "regex-2023.10.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:9c6d0ced3c06d0f183b73d3c5920727268d2201aa0fe6d55c60d68c792ff3588"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:994645a46c6a740ee8ce8df7911d4aee458d9b1bc5639bc968226763d07f00fa"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:66e2fe786ef28da2b28e222c89502b2af984858091675044d93cb50e6f46d7af"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:11175910f62b2b8c055f2b089e0fedd694fe2be3941b3e2633653bc51064c528"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:06e9abc0e4c9ab4779c74ad99c3fc10d3967d03114449acc2c2762ad4472b8ca"}, + {file = "regex-2023.10.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:fb02e4257376ae25c6dd95a5aec377f9b18c09be6ebdefa7ad209b9137b73d48"}, + {file = "regex-2023.10.3-cp39-cp39-win32.whl", hash = "sha256:3b2c3502603fab52d7619b882c25a6850b766ebd1b18de3df23b2f939360e1bd"}, + {file = "regex-2023.10.3-cp39-cp39-win_amd64.whl", hash = "sha256:adbccd17dcaff65704c856bd29951c58a1bd4b2b0f8ad6b826dbd543fe740988"}, + {file = "regex-2023.10.3.tar.gz", hash = "sha256:3fef4f844d2290ee0ba57addcec17eec9e3df73f10a2748485dfd6a3a188cc0f"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "ruamel-yaml" +version = "0.16.13" +description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +optional = false +python-versions = "*" +files = [ + {file = "ruamel.yaml-0.16.13-py2.py3-none-any.whl", hash = "sha256:64b06e7873eb8e1125525ecef7345447d786368cadca92a7cd9b59eae62e95a3"}, + {file = "ruamel.yaml-0.16.13.tar.gz", hash = "sha256:bb48c514222702878759a05af96f4b7ecdba9b33cd4efcf25c86b882cef3a942"}, +] + +[package.extras] +docs = ["ryd"] +jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] + +[[package]] +name = "setuptools" +version = "68.2.2" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-68.2.2-py3-none-any.whl", hash = "sha256:b454a35605876da60632df1a60f736524eb73cc47bbc9f3f1ef1b644de74fd2a"}, + {file = "setuptools-68.2.2.tar.gz", hash = "sha256:4ac1475276d2f1c48684874089fefcd83bd7162ddaafb81fac866ba0db282a87"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "sortedcontainers" +version = "2.2.2" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +optional = false +python-versions = "*" +files = [ + {file = "sortedcontainers-2.2.2-py2.py3-none-any.whl", hash = "sha256:c633ebde8580f241f274c1f8994a665c0e54a17724fecd0cae2f079e09c36d3f"}, + {file = "sortedcontainers-2.2.2.tar.gz", hash = "sha256:4e73a757831fc3ca4de2859c422564239a31d8213d09a2a666e375807034d2ba"}, +] + +[[package]] +name = "texttable" +version = "1.7.0" +description = "module to create simple ASCII tables" +optional = false +python-versions = "*" +files = [ + {file = "texttable-1.7.0-py2.py3-none-any.whl", hash = "sha256:72227d592c82b3d7f672731ae73e4d1f88cd8e2ef5b075a7a7f01a23a3743917"}, + {file = "texttable-1.7.0.tar.gz", hash = "sha256:2d2068fb55115807d3ac77a4ca68fa48803e84ebb0ee2340f858107a36522638"}, +] + +[[package]] +name = "tomli" +version = "1.2.3" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "tomli-1.2.3-py3-none-any.whl", hash = "sha256:e3069e4be3ead9668e21cb9b074cd948f7b3113fd9c8bba083f48247aab8b11c"}, + {file = "tomli-1.2.3.tar.gz", hash = "sha256:05b6166bff487dc068d322585c7ea4ef78deed501cc124060e0f238e89a9231f"}, +] + +[[package]] +name = "tornado" +version = "6.3.3" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:502fba735c84450974fec147340016ad928d29f1e91f49be168c0a4c18181e1d"}, + {file = "tornado-6.3.3-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:805d507b1f588320c26f7f097108eb4023bbaa984d63176d1652e184ba24270a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1bd19ca6c16882e4d37368e0152f99c099bad93e0950ce55e71daed74045908f"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7ac51f42808cca9b3613f51ffe2a965c8525cb1b00b7b2d56828b8045354f76a"}, + {file = "tornado-6.3.3-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:71a8db65160a3c55d61839b7302a9a400074c9c753040455494e2af74e2501f2"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:ceb917a50cd35882b57600709dd5421a418c29ddc852da8bcdab1f0db33406b0"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:7d01abc57ea0dbb51ddfed477dfe22719d376119844e33c661d873bf9c0e4a16"}, + {file = "tornado-6.3.3-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:9dc4444c0defcd3929d5c1eb5706cbe1b116e762ff3e0deca8b715d14bf6ec17"}, + {file = "tornado-6.3.3-cp38-abi3-win32.whl", hash = "sha256:65ceca9500383fbdf33a98c0087cb975b2ef3bfb874cb35b8de8740cf7f41bd3"}, + {file = "tornado-6.3.3-cp38-abi3-win_amd64.whl", hash = "sha256:22d3c2fa10b5793da13c807e6fc38ff49a4f6e1e3868b0a6f4164768bb8e20f5"}, + {file = "tornado-6.3.3.tar.gz", hash = "sha256:e7d8db41c0181c80d76c982aacc442c0783a2c54d6400fe028954201a2e032fe"}, +] + +[[package]] +name = "transitions" +version = "0.8.11" +description = "A lightweight, object-oriented Python state machine implementation with many extensions." +optional = false +python-versions = "*" +files = [ + {file = "transitions-0.8.11-py2.py3-none-any.whl", hash = "sha256:9525dd9b708b0a54bb4562a06a483d237e75c94547ba9831c81c6872d0ea1522"}, + {file = "transitions-0.8.11.tar.gz", hash = "sha256:7b20d32906ea4d60ee6f6c1f5dc9c9f178802425c5b155213eb0f25c277f04e4"}, +] + +[package.dependencies] +six = "*" + +[package.extras] +diagrams = ["pygraphviz"] +test = ["pytest"] + +[[package]] +name = "typing-extensions" +version = "4.8.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.8.0-py3-none-any.whl", hash = "sha256:8f92fc8806f9a6b641eaa5318da32b44d401efaac0f6678c9bc448ba3605faa0"}, + {file = "typing_extensions-4.8.0.tar.gz", hash = "sha256:df8e4339e9cb77357558cbdbceca33c303714cf861d1eef15e1070055ae8b7ef"}, +] + +[[package]] +name = "urllib3" +version = "1.26.17" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "urllib3-1.26.17-py2.py3-none-any.whl", hash = "sha256:94a757d178c9be92ef5539b8840d48dc9cf1b2709c9d6b588232a055c524458b"}, + {file = "urllib3-1.26.17.tar.gz", hash = "sha256:24d6a242c28d29af46c3fae832c36db3bbebcc533dd1bb549172cd739c82df21"}, +] + +[package.extras] +brotli = ["brotli (==1.0.9)", "brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "urwid" +version = "2.1.2" +description = "A full-featured console (xterm et al.) user interface library" +optional = false +python-versions = "*" +files = [ + {file = "urwid-2.1.2.tar.gz", hash = "sha256:588bee9c1cb208d0906a9f73c613d2bd32c3ed3702012f51efe318a3f2127eae"}, +] + +[[package]] +name = "websocket-client" +version = "0.59.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "websocket-client-0.59.0.tar.gz", hash = "sha256:d376bd60eace9d437ab6d7ee16f4ab4e821c9dae591e1b783c58ebd8aaf80c5c"}, + {file = "websocket_client-0.59.0-py2.py3-none-any.whl", hash = "sha256:2e50d26ca593f70aba7b13a489435ef88b8fc3b5c5643c1ce8808ff9b40f0b32"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "werkzeug" +version = "1.0.1" +description = "The comprehensive WSGI web application library." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "Werkzeug-1.0.1-py2.py3-none-any.whl", hash = "sha256:2de2a5db0baeae7b2d2664949077c2ac63fbd16d98da0ff71837f7d1dea3fd43"}, + {file = "Werkzeug-1.0.1.tar.gz", hash = "sha256:6c80b1e5ad3665290ea39320b91e1be1e0d5f60652b964a3070216de83d2e47c"}, +] + +[package.extras] +dev = ["coverage", "pallets-sphinx-themes", "pytest", "pytest-timeout", "sphinx", "sphinx-issues", "tox"] +watchdog = ["watchdog"] + +[[package]] +name = "wsproto" +version = "0.15.0" +description = "WebSockets state-machine based protocol implementation" +optional = false +python-versions = ">=3.6.1" +files = [ + {file = "wsproto-0.15.0-py2.py3-none-any.whl", hash = "sha256:e3d190a11d9307112ba23bbe60055604949b172143969c8f641318476a9b6f1d"}, + {file = "wsproto-0.15.0.tar.gz", hash = "sha256:614798c30e5dc2b3f65acc03d2d50842b97621487350ce79a80a711229edfa9d"}, +] + +[package.dependencies] +h11 = ">=0.8.1" + +[[package]] +name = "ya-aioclient" +version = "0.6.4" +description = "" +optional = false +python-versions = ">=3.6,<4.0" +files = [ + {file = "ya-aioclient-0.6.4.tar.gz", hash = "sha256:e5e5926e3a7d834082b05aeb986d8fb2f7fa46a1bd1bca2f3f1c872e1ba479ae"}, + {file = "ya_aioclient-0.6.4-py3-none-any.whl", hash = "sha256:1d36c2544c2d7629a00a2b1f18b4535e836586cae99bfbf5714ed5ca3f9caa0c"}, +] + +[package.dependencies] +aiohttp = ">=3.6.2,<4.0.0" +certifi = ">=2020.6.20,<2021.0.0" +python-dateutil = ">=2.8.1,<3.0.0" + +[[package]] +name = "yarl" +version = "1.9.2" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8c2ad583743d16ddbdf6bb14b5cd76bf43b0d0006e918809d5d4ddf7bde8dd82"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:82aa6264b36c50acfb2424ad5ca537a2060ab6de158a5bd2a72a032cc75b9eb8"}, + {file = "yarl-1.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c0c77533b5ed4bcc38e943178ccae29b9bcf48ffd1063f5821192f23a1bd27b9"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ee4afac41415d52d53a9833ebae7e32b344be72835bbb589018c9e938045a560"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bf345c3a4f5ba7f766430f97f9cc1320786f19584acc7086491f45524a551ac"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2a96c19c52ff442a808c105901d0bdfd2e28575b3d5f82e2f5fd67e20dc5f4ea"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:891c0e3ec5ec881541f6c5113d8df0315ce5440e244a716b95f2525b7b9f3608"}, + {file = "yarl-1.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c3a53ba34a636a256d767c086ceb111358876e1fb6b50dfc4d3f4951d40133d5"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:566185e8ebc0898b11f8026447eacd02e46226716229cea8db37496c8cdd26e0"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2b0738fb871812722a0ac2154be1f049c6223b9f6f22eec352996b69775b36d4"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:32f1d071b3f362c80f1a7d322bfd7b2d11e33d2adf395cc1dd4df36c9c243095"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e9fdc7ac0d42bc3ea78818557fab03af6181e076a2944f43c38684b4b6bed8e3"}, + {file = "yarl-1.9.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:56ff08ab5df8429901ebdc5d15941b59f6253393cb5da07b4170beefcf1b2528"}, + {file = "yarl-1.9.2-cp310-cp310-win32.whl", hash = "sha256:8ea48e0a2f931064469bdabca50c2f578b565fc446f302a79ba6cc0ee7f384d3"}, + {file = "yarl-1.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:50f33040f3836e912ed16d212f6cc1efb3231a8a60526a407aeb66c1c1956dde"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:646d663eb2232d7909e6601f1a9107e66f9791f290a1b3dc7057818fe44fc2b6"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aff634b15beff8902d1f918012fc2a42e0dbae6f469fce134c8a0dc51ca423bb"}, + {file = "yarl-1.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a83503934c6273806aed765035716216cc9ab4e0364f7f066227e1aaea90b8d0"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b25322201585c69abc7b0e89e72790469f7dad90d26754717f3310bfe30331c2"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:22a94666751778629f1ec4280b08eb11815783c63f52092a5953faf73be24191"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8ec53a0ea2a80c5cd1ab397925f94bff59222aa3cf9c6da938ce05c9ec20428d"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:159d81f22d7a43e6eabc36d7194cb53f2f15f498dbbfa8edc8a3239350f59fe7"}, + {file = "yarl-1.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:832b7e711027c114d79dffb92576acd1bd2decc467dec60e1cac96912602d0e6"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:95d2ecefbcf4e744ea952d073c6922e72ee650ffc79028eb1e320e732898d7e8"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d4e2c6d555e77b37288eaf45b8f60f0737c9efa3452c6c44626a5455aeb250b9"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:783185c75c12a017cc345015ea359cc801c3b29a2966c2655cd12b233bf5a2be"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:b8cc1863402472f16c600e3e93d542b7e7542a540f95c30afd472e8e549fc3f7"}, + {file = "yarl-1.9.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:822b30a0f22e588b32d3120f6d41e4ed021806418b4c9f0bc3048b8c8cb3f92a"}, + {file = "yarl-1.9.2-cp311-cp311-win32.whl", hash = "sha256:a60347f234c2212a9f0361955007fcf4033a75bf600a33c88a0a8e91af77c0e8"}, + {file = "yarl-1.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:be6b3fdec5c62f2a67cb3f8c6dbf56bbf3f61c0f046f84645cd1ca73532ea051"}, + {file = "yarl-1.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:38a3928ae37558bc1b559f67410df446d1fbfa87318b124bf5032c31e3447b74"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac9bb4c5ce3975aeac288cfcb5061ce60e0d14d92209e780c93954076c7c4367"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3da8a678ca8b96c8606bbb8bfacd99a12ad5dd288bc6f7979baddd62f71c63ef"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:13414591ff516e04fcdee8dc051c13fd3db13b673c7a4cb1350e6b2ad9639ad3"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf74d08542c3a9ea97bb8f343d4fcbd4d8f91bba5ec9d5d7f792dbe727f88938"}, + {file = "yarl-1.9.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e7221580dc1db478464cfeef9b03b95c5852cc22894e418562997df0d074ccc"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:494053246b119b041960ddcd20fd76224149cfea8ed8777b687358727911dd33"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:52a25809fcbecfc63ac9ba0c0fb586f90837f5425edfd1ec9f3372b119585e45"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:e65610c5792870d45d7b68c677681376fcf9cc1c289f23e8e8b39c1485384185"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:1b1bba902cba32cdec51fca038fd53f8beee88b77efc373968d1ed021024cc04"}, + {file = "yarl-1.9.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:662e6016409828ee910f5d9602a2729a8a57d74b163c89a837de3fea050c7582"}, + {file = "yarl-1.9.2-cp37-cp37m-win32.whl", hash = "sha256:f364d3480bffd3aa566e886587eaca7c8c04d74f6e8933f3f2c996b7f09bee1b"}, + {file = "yarl-1.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6a5883464143ab3ae9ba68daae8e7c5c95b969462bbe42e2464d60e7e2698368"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5610f80cf43b6202e2c33ba3ec2ee0a2884f8f423c8f4f62906731d876ef4fac"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b9a4e67ad7b646cd6f0938c7ebfd60e481b7410f574c560e455e938d2da8e0f4"}, + {file = "yarl-1.9.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:83fcc480d7549ccebe9415d96d9263e2d4226798c37ebd18c930fce43dfb9574"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fcd436ea16fee7d4207c045b1e340020e58a2597301cfbcfdbe5abd2356c2fb"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:84e0b1599334b1e1478db01b756e55937d4614f8654311eb26012091be109d59"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3458a24e4ea3fd8930e934c129b676c27452e4ebda80fbe47b56d8c6c7a63a9e"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:838162460b3a08987546e881a2bfa573960bb559dfa739e7800ceeec92e64417"}, + {file = "yarl-1.9.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f4e2d08f07a3d7d3e12549052eb5ad3eab1c349c53ac51c209a0e5991bbada78"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:de119f56f3c5f0e2fb4dee508531a32b069a5f2c6e827b272d1e0ff5ac040333"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:149ddea5abf329752ea5051b61bd6c1d979e13fbf122d3a1f9f0c8be6cb6f63c"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:674ca19cbee4a82c9f54e0d1eee28116e63bc6fd1e96c43031d11cbab8b2afd5"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:9b3152f2f5677b997ae6c804b73da05a39daa6a9e85a512e0e6823d81cdad7cc"}, + {file = "yarl-1.9.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:5415d5a4b080dc9612b1b63cba008db84e908b95848369aa1da3686ae27b6d2b"}, + {file = "yarl-1.9.2-cp38-cp38-win32.whl", hash = "sha256:f7a3d8146575e08c29ed1cd287068e6d02f1c7bdff8970db96683b9591b86ee7"}, + {file = "yarl-1.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:63c48f6cef34e6319a74c727376e95626f84ea091f92c0250a98e53e62c77c72"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:75df5ef94c3fdc393c6b19d80e6ef1ecc9ae2f4263c09cacb178d871c02a5ba9"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c027a6e96ef77d401d8d5a5c8d6bc478e8042f1e448272e8d9752cb0aff8b5c8"}, + {file = "yarl-1.9.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3b078dbe227f79be488ffcfc7a9edb3409d018e0952cf13f15fd6512847f3f7"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59723a029760079b7d991a401386390c4be5bfec1e7dd83e25a6a0881859e716"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b03917871bf859a81ccb180c9a2e6c1e04d2f6a51d953e6a5cdd70c93d4e5a2a"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c1012fa63eb6c032f3ce5d2171c267992ae0c00b9e164efe4d73db818465fac3"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74dcbfe780e62f4b5a062714576f16c2f3493a0394e555ab141bf0d746bb955"}, + {file = "yarl-1.9.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c56986609b057b4839968ba901944af91b8e92f1725d1a2d77cbac6972b9ed1"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:2c315df3293cd521033533d242d15eab26583360b58f7ee5d9565f15fee1bef4"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:b7232f8dfbd225d57340e441d8caf8652a6acd06b389ea2d3222b8bc89cbfca6"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:53338749febd28935d55b41bf0bcc79d634881195a39f6b2f767870b72514caf"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:066c163aec9d3d073dc9ffe5dd3ad05069bcb03fcaab8d221290ba99f9f69ee3"}, + {file = "yarl-1.9.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8288d7cd28f8119b07dd49b7230d6b4562f9b61ee9a4ab02221060d21136be80"}, + {file = "yarl-1.9.2-cp39-cp39-win32.whl", hash = "sha256:b124e2a6d223b65ba8768d5706d103280914d61f5cae3afbc50fc3dfcc016623"}, + {file = "yarl-1.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:61016e7d582bc46a5378ffdd02cd0314fb8ba52f40f9cf4d9a5e7dbef88dee18"}, + {file = "yarl-1.9.2.tar.gz", hash = "sha256:04ab9d4b9f587c06d801c2abfe9317b77cdf996c65a90d5e84ecc45010823571"}, +] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[[package]] +name = "zstandard" +version = "0.14.1" +description = "Zstandard bindings for Python" +optional = false +python-versions = "*" +files = [ + {file = "zstandard-0.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ec1a20936484f3804fba4f29f7d8ed67c70e44536b0f0191a13eff4dc61c815c"}, + {file = "zstandard-0.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:85b37acd054f8f778e5c9832e17fb651f321a3daafa0eb94360eeffce141b0cf"}, + {file = "zstandard-0.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:95939a7e3972ec20e2e959ee9cd0fd858b25ff3a6f5040c5c78fcab51eeab030"}, + {file = "zstandard-0.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:d3999f92ab7aab2a99ac7f7730b3bee8d6bd3e52953ed0e87ab881ca4244a315"}, + {file = "zstandard-0.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:8df3114dfff411aa9827d754bb8fdcdaa15e63c96d7730778fe322f4c85360d8"}, + {file = "zstandard-0.14.1-cp27-cp27m-win32.whl", hash = "sha256:4e6d6b0e541b00d0096a260d5f6eb32f737bfcdb2e5b87a7b7be77ef669c7a6c"}, + {file = "zstandard-0.14.1-cp27-cp27m-win_amd64.whl", hash = "sha256:064aac12b8e7813fa3870e7479e9cbd3803e33212b68e555b408711ea8f6cb54"}, + {file = "zstandard-0.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:b508a826c4b99835e3d8a8d415a6e516cacad4a95ef5ed01f60f9b067f200a51"}, + {file = "zstandard-0.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:a72cb707cc0a9d06e3912fe5b6c1648d70ac512f3e180018c82fe926926be12c"}, + {file = "zstandard-0.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:1c065de617b7367c4da4de687a071932e48ae200d09c0afbc24415d98aec470d"}, + {file = "zstandard-0.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:391c30620e3ad6bc53804f32e3f74cbbaa713d95f46ac5f2e54e735d1dfc51c0"}, + {file = "zstandard-0.14.1-cp35-cp35m-macosx_10_9_x86_64.whl", hash = "sha256:403fa9544ecdedcc5fdc48f5e41e092658ac48222cfe6e75fb5710cb3d14c700"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:657a49b1df5a82985ea6495c6c1497a17e34e41a0bd8ef95a640342a19b8e6a4"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:7c3c9657417bf1eccb94ad64544e12efa8ea3e16612944b32e253314472a54e5"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:d2db7bcdc9b3e5a782d71df0163a6587b8b2f759cc4a819859e27e6ad2f778e6"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:1be45b237fea45c705d83215450a9381c2787bbf0720824b1fe23ed72f8db0b7"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux2014_i686.whl", hash = "sha256:477db538b596767d036379165a27aa2e19edbae50bec4cea195a986ba50bbad6"}, + {file = "zstandard-0.14.1-cp35-cp35m-manylinux2014_x86_64.whl", hash = "sha256:ac9b88a72f2dcfa3facbe6af96d59e82459e5815c15aa59481cc6080937ee02e"}, + {file = "zstandard-0.14.1-cp35-cp35m-win32.whl", hash = "sha256:2826d664eb84f9efe0fae47cf20c27f3662aae3556fbcc4cecd5318fbc9239f3"}, + {file = "zstandard-0.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:36cd223d7fd0fe0e32e82993240e9a24503269c93431e62369088e2299cf4605"}, + {file = "zstandard-0.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d4a7065d7fc991edb93483dbb7bc37dd091a2bac9572d9b9df243e6565d30522"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:6f437168752e50ad6a47d054f4a41933693b1675f65663c117067747d95f057c"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:e80ade52a06fb433c9ad7d6c8cfb3dafa34f05bedce543e95a670972ba41d65d"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:0b3ae587556a6f45cd982d7684b1318793430d0ae9e376dbc3d877b48ac6d576"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:d34848645f3507dc85baa8c67426f0685b08583e930fa3a1ab5048c5f0ba8fc1"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:5be097127be1659bc6cffb5d885c781e61947597e2fcd1ecf48713313e53657d"}, + {file = "zstandard-0.14.1-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:e3731e0dc1c200e5c2f56ca36bed6c28903f764769f534fbf9ed4178f193e8aa"}, + {file = "zstandard-0.14.1-cp36-cp36m-win32.whl", hash = "sha256:aab21dd5724aa5bdd0aac16f5d175e5df0715fc614910220a918d50f08321982"}, + {file = "zstandard-0.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:ed14a62f8bf2462f19373c337527ff684deb6d0d6b973fbcaece1f561c30f405"}, + {file = "zstandard-0.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:db1b3442441577d81bdae85fc7a4bd553e3161ec745e9dd1f2f93889248363fe"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:8486a01696e3cdfa47b93caa8f5064c9d277bad1c39eb31947bf2b8f019e3510"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:4b054fd8cf274b958a3d7a201f8b42a30ebf8f76d87770075e1aca6017006e97"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:fb5f0d29bcbfba6ef9beccba55f567d089747034add5cd7e8dc58842bb745803"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:90f0bb1adcfea326c6548a45cc35474bec56a34d80310b6e78abab313da780fc"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:0b57df1f9530669d61f8708eb15ded6584db4a6733cc5155eb8561d31f292557"}, + {file = "zstandard-0.14.1-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:3948000d753b9110e1eb43a6cba6fdb64c895faebb47628a96550edc5238b78a"}, + {file = "zstandard-0.14.1-cp37-cp37m-win32.whl", hash = "sha256:17e8f29aae79d870daa3ab48c0dbf83594bf956c2c2125ae45cdfebd2b62d8ed"}, + {file = "zstandard-0.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d7fecb5172dc885665581437fe96bf8f03ffc0022b723964c272accbb62713b4"}, + {file = "zstandard-0.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2fd76d29f4e8d7c4aac42617a0439506144146032b5d7b9b0a42f37f916fdb2"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:7309bf511c8b332be2b5a834efbd7ee0cd43db2c811dd916fd0f48acd43e8722"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:a51a09a3be208e627ebb518a78c639d240584f5d1da8106dcafa31d22103b4df"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:a820ef78f39c29469caacb0bf43ffd024b78f242393c605daa748588b3247306"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:e3963c919f65367587cf987a71991e69385f19cec9ad8166249b83e176cdbcd8"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:0e5b8fd428d0d00fb7dabc0898de9e87659cb54738d527becff37d3d90df8e88"}, + {file = "zstandard-0.14.1-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:41eab10e6570e14dd77a346f3dbb1eab3f23a652bce07ba47c8c23116b0cee9c"}, + {file = "zstandard-0.14.1-cp38-cp38-win32.whl", hash = "sha256:fbbe18afb67329577ab6a907f348175d3f6044d179a9b56b02206ff9e67c5b12"}, + {file = "zstandard-0.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:3bd044ef32bd6738c3db2cb2d4bc77812e9a3132df942303bbfcd1a484023b60"}, + {file = "zstandard-0.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:24ab8f1c7c970822bd55dbb091f7eb271b417e777e8b3ae6722e60d67f747c05"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:cf67443d06b88218eb8915da2d968dcf6fdc384fb245f97155617ff3b8d77e92"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:d78db92ac27cdcd55333b7e642cd400719842e692e8836f0b249e459b26d384b"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:bd4da25cc46e972b029f8aa9f103c5977dbe461e1916ff7edec24065071b4a08"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:2075be64372206af3df40fef0fee657b44845d3e6d98b4cc8aba220be861de2d"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:70dfe74b24971476a6a20d42abb964c9ac0fb1af7b89228e5845748377543bd0"}, + {file = "zstandard-0.14.1-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:3382ce6e44e9e847dce848bc2638403aa9320cb38edcc34b71e13be5793619e0"}, + {file = "zstandard-0.14.1-cp39-cp39-win32.whl", hash = "sha256:7161d71debb94c456cbddd8a239e89219f37f0b1a4c0620a2c1400801aeeec7d"}, + {file = "zstandard-0.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:d2ec8309309fc7254d21286d6b3e5c28e4019cd8e266d1a860456a69ea7c2400"}, + {file = "zstandard-0.14.1.tar.gz", hash = "sha256:5dd700e52ec28c64d43f681ccde76b6436c8f89a332d6c9e22a6b629f28daeb5"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10.1" +content-hash = "2f2cc4545adb5436924a94e2b87e674b5e345b0cfb8e4287961d80605a9a2cd3" diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index dedf475ff0..e2e909ab46 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -30,7 +30,7 @@ pytest-asyncio = "0.21" pytest-split = "^0.8.1" goth = "0.15.8" # to use development goth version uncomment below -# goth = { git = "https://github.com/golemfactory/goth.git", rev = "0845cad9a4d590b06849c6888db7f060788eb7d7" } +# goth = { git = "https://github.com/golemfactory/goth.git", rev = "7b2c1eca74ebfd1fc6bf25322ad26a0b4b7467c6" } [tool.poetry.dev-dependencies] black = "21.7b0" From 245f15e78f7499ebdc88f96a0956ebbe97411fa5 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Mon, 9 Oct 2023 14:29:56 +0200 Subject: [PATCH 094/123] /payment/status should return 404 for invalid network / driver --- Cargo.lock | 6 +++--- Cargo.toml | 6 +++--- core/model/src/driver.rs | 8 +++++++- core/model/src/payment.rs | 6 ++++-- core/payment-driver/base/src/driver.rs | 4 +--- core/payment-driver/erc20/src/driver.rs | 18 ++++++++++++++++++ core/payment-driver/erc20next/src/driver.rs | 14 +++++++++++++- core/payment/src/api/payments.rs | 4 +++- core/payment/src/service.rs | 10 ++++++---- core/payment/src/utils.rs | 6 ++++++ 10 files changed, 64 insertions(+), 18 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index dbaa8c413e..8051cb9a25 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1869,7 +1869,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.2.0" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=560ae6c9109ae36a4667586d3d5dab0688500098#560ae6c9109ae36a4667586d3d5dab0688500098" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=75dc8f7e7d40b7630e47257500df0cf864e87929#75dc8f7e7d40b7630e47257500df0cf864e87929" dependencies = [ "actix-files", "actix-web", @@ -7691,7 +7691,7 @@ dependencies = [ [[package]] name = "ya-client" version = "0.7.0" -source = "git+https://github.com/golemfactory/ya-client.git?rev=2c1bd58ed13c9195a2fd82e7632f9aa60c52c71e#2c1bd58ed13c9195a2fd82e7632f9aa60c52c71e" +source = "git+https://github.com/golemfactory/ya-client.git?rev=2bb679e3bb1d61eddd713d7f19ee127595f27162#2bb679e3bb1d61eddd713d7f19ee127595f27162" dependencies = [ "actix-codec", "awc", @@ -7715,7 +7715,7 @@ dependencies = [ [[package]] name = "ya-client-model" version = "0.5.0" -source = "git+https://github.com/golemfactory/ya-client.git?rev=2c1bd58ed13c9195a2fd82e7632f9aa60c52c71e#2c1bd58ed13c9195a2fd82e7632f9aa60c52c71e" +source = "git+https://github.com/golemfactory/ya-client.git?rev=2bb679e3bb1d61eddd713d7f19ee127595f27162#2bb679e3bb1d61eddd713d7f19ee127595f27162" dependencies = [ "bigdecimal 0.2.2", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 705df1492f..486f203c10 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ path = "core/serv/src/main.rs" # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "560ae6c9109ae36a4667586d3d5dab0688500098" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "75dc8f7e7d40b7630e47257500df0cf864e87929" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.1.9" } rand = "0.8.5" @@ -270,8 +270,8 @@ ya-sb-util = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = #ya-sb-util = { path = "../ya-service-bus/crates/util" } ## CLIENT -ya-client = { git = "https://github.com/golemfactory/ya-client.git", rev = "2c1bd58ed13c9195a2fd82e7632f9aa60c52c71e" } -ya-client-model = { git = "https://github.com/golemfactory/ya-client.git", rev = "2c1bd58ed13c9195a2fd82e7632f9aa60c52c71e" } +ya-client = { git = "https://github.com/golemfactory/ya-client.git", rev = "2bb679e3bb1d61eddd713d7f19ee127595f27162" } +ya-client-model = { git = "https://github.com/golemfactory/ya-client.git", rev = "2bb679e3bb1d61eddd713d7f19ee127595f27162" } ## RELAY and networking stack ya-relay-stack = { git = "https://github.com/golemfactory/ya-relay.git", rev = "c92a75b0cf062fcc9dbb3ea2a034d913e5fad8e5" } diff --git a/core/model/src/driver.rs b/core/model/src/driver.rs index b3d690c96f..05e669a152 100644 --- a/core/model/src/driver.rs +++ b/core/model/src/driver.rs @@ -533,7 +533,13 @@ pub struct DriverStatus { impl RpcMessage for DriverStatus { const ID: &'static str = "DriverStatus"; type Item = Vec; - type Error = GenericError; + type Error = DriverStatusError; +} + +#[derive(Clone, Debug, Serialize, Deserialize, thiserror::Error)] +pub enum DriverStatusError { + #[error("No such network '{0}'")] + NetworkNotFound(String), } // ************************* SHUT DOWN ************************* diff --git a/core/model/src/payment.rs b/core/model/src/payment.rs index 76934779ad..6409e79b80 100644 --- a/core/model/src/payment.rs +++ b/core/model/src/payment.rs @@ -416,8 +416,10 @@ pub mod local { // ********************* STATUS ******************************** #[derive(Clone, Debug, Serialize, Deserialize, thiserror::Error)] pub enum PaymentDriverStatusError { - #[error("Requested driver not registered")] - NoDriver, + #[error("Requested driver not registered {0}")] + NoDriver(String), + #[error("Requested network not supported {0}")] + NoNetwork(String), #[error("Internal error: {0}")] Internal(String), } diff --git a/core/payment-driver/base/src/driver.rs b/core/payment-driver/base/src/driver.rs index 4072f79ff5..b34b266560 100644 --- a/core/payment-driver/base/src/driver.rs +++ b/core/payment-driver/base/src/driver.rs @@ -139,9 +139,7 @@ pub trait PaymentDriver { _db: DbExecutor, _caller: String, _msg: DriverStatus, - ) -> Result, GenericError> { - Ok(Vec::default()) - } + ) -> Result, DriverStatusError>; async fn shut_down( &self, diff --git a/core/payment-driver/erc20/src/driver.rs b/core/payment-driver/erc20/src/driver.rs index 10cbd5c1dc..f3aec71799 100644 --- a/core/payment-driver/erc20/src/driver.rs +++ b/core/payment-driver/erc20/src/driver.rs @@ -8,6 +8,7 @@ use chrono::{Duration, Utc}; use futures::lock::Mutex; use std::collections::HashMap; use std::str::FromStr; +use ya_client_model::payment::DriverStatusProperty; // Workspace uses use ya_payment_driver::{ @@ -204,6 +205,23 @@ impl PaymentDriver for Erc20Driver { api::validate_allocation(msg).await } + async fn status( + &self, + _db: DbExecutor, + _caller: String, + msg: DriverStatus, + ) -> Result, DriverStatusError> { + if let Some(network) = msg.network { + let found_net = self.get_networks().keys().any(|net| net == &network); + + if !found_net { + return Err(DriverStatusError::NetworkNotFound(network.clone())); + } + } + + Ok(Vec::new()) + } + async fn shut_down( &self, _db: DbExecutor, diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index 2d022502eb..4ae4a70574 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -438,7 +438,7 @@ impl PaymentDriver for Erc20NextDriver { _db: DbExecutor, _caller: String, msg: DriverStatus, - ) -> Result, GenericError> { + ) -> Result, DriverStatusError> { use erc20_payment_lib::runtime::StatusProperty as LibStatusProperty; // Map chain-id to network @@ -452,6 +452,18 @@ impl PaymentDriver for Erc20NextDriver { .unwrap_or(true) }; + if let Some(network) = msg.network.as_ref() { + let found_net = self + .payment_runtime + .chains() + .into_iter() + .any(|id| &chain_id_to_net(id) == network); + + if !found_net { + return Err(DriverStatusError::NetworkNotFound(network.clone())); + } + } + Ok(self .payment_runtime .get_status() diff --git a/core/payment/src/api/payments.rs b/core/payment/src/api/payments.rs index 56555391d0..511311421e 100644 --- a/core/payment/src/api/payments.rs +++ b/core/payment/src/api/payments.rs @@ -109,7 +109,9 @@ async fn payment_status( let status_props = match response { Ok(props) => props, - Err(PaymentDriverStatusError::NoDriver) => return response::bad_request(&"No such driver"), + Err( + e @ (PaymentDriverStatusError::NoDriver(_) | PaymentDriverStatusError::NoNetwork(_)), + ) => return response::not_found_with_messsage(&e), Err(PaymentDriverStatusError::Internal(e)) => return response::server_error(&e), }; diff --git a/core/payment/src/service.rs b/core/payment/src/service.rs index c5022cb747..5d7df6cf2e 100644 --- a/core/payment/src/service.rs +++ b/core/payment/src/service.rs @@ -25,7 +25,7 @@ mod local { use std::collections::BTreeMap; use ya_client_model::payment::{Account, DocumentStatus, DriverDetails, DriverStatusProperty}; use ya_core_model::{ - driver::{driver_bus_id, DriverStatus}, + driver::{driver_bus_id, DriverStatus, DriverStatusError}, payment::local::*, }; use ya_persistence::types::Role; @@ -355,19 +355,21 @@ mod local { let mut status_props = Vec::new(); for driver in drivers { - let result = match service(driver_bus_id(driver)) + let result = match service(driver_bus_id(&driver)) .call(DriverStatus { network: msg.network.clone(), }) .await { Ok(result) => result, - Err(e) => return Err(PaymentDriverStatusError::NoDriver), + Err(e) => return Err(PaymentDriverStatusError::NoDriver(driver)), }; match result { Ok(status) => status_props.extend(status), - Err(e) => return Err(PaymentDriverStatusError::Internal(e.to_string())), + Err(DriverStatusError::NetworkNotFound(network)) => { + return Err(PaymentDriverStatusError::NoNetwork(network)) + } } } diff --git a/core/payment/src/utils.rs b/core/payment/src/utils.rs index 924f1904c1..9f6346c5fb 100644 --- a/core/payment/src/utils.rs +++ b/core/payment/src/utils.rs @@ -194,6 +194,12 @@ pub mod response { HttpResponse::NotFound().json(ErrorMessage { message: None }) } + pub fn not_found_with_messsage(e: &impl ToString) -> HttpResponse { + HttpResponse::NotFound().json(ErrorMessage { + message: Some(e.to_string()), + }) + } + pub fn unauthorized() -> HttpResponse { HttpResponse::Unauthorized().json(ErrorMessage { message: None }) } From 917ded041111ab1e8fe52fe969f0f8e51d684ec8 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Mon, 9 Oct 2023 19:13:10 +0200 Subject: [PATCH 095/123] erc20next: Implement CantSign status (#2834) --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- core/payment-driver/erc20next/src/driver.rs | 8 ++++++++ 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 8051cb9a25..887a91764d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1868,8 +1868,8 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" -version = "0.2.0" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=75dc8f7e7d40b7630e47257500df0cf864e87929#75dc8f7e7d40b7630e47257500df0cf864e87929" +version = "0.2.1" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=d9ec1ac66778e2d02a8ed2eacccc9b02a62ead97#d9ec1ac66778e2d02a8ed2eacccc9b02a62ead97" dependencies = [ "actix-files", "actix-web", diff --git a/Cargo.toml b/Cargo.toml index 486f203c10..3d4272a567 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -35,7 +35,7 @@ path = "core/serv/src/main.rs" # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "75dc8f7e7d40b7630e47257500df0cf864e87929" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "d9ec1ac66778e2d02a8ed2eacccc9b02a62ead97" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.1.9" } rand = "0.8.5" diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index 4ae4a70574..8dcf111da5 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -476,6 +476,14 @@ impl PaymentDriver for Erc20NextDriver { chain_id, }) } + LibStatusProperty::CantSign { chain_id, address } => { + let network = chain_id_to_net(chain_id); + Some(DriverStatusProperty::CantSign { + driver: DRIVER_NAME.into(), + network, + address, + }) + } LibStatusProperty::NoGas { chain_id, missing_gas, From 93b91fefca2a3dd9b453c98e5b410edde2994e23 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Mon, 9 Oct 2023 23:25:07 +0200 Subject: [PATCH 096/123] Overwrite config if given file --- core/payment-driver/erc20next/src/service.rs | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index 3b68f7faa2..ae893ef835 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -51,6 +51,13 @@ impl Erc20NextService { let mut config = config::Config::load_from_str(include_str!("../config-payments.toml")) .expect("Default erc20next config doesn't parse"); + // Load config from file if it exists giving the possibility of overwriting the default config + if let Ok(config_from_file) = + config::Config::load(&path.join("config-payments.toml")).await + { + config = config_from_file; + } + for (network, chain) in &mut config.chain { let prefix = network.to_ascii_uppercase(); let Some(token) = &mut chain.token else { continue }; From 86dcfb2849c1fe5ce598b1c694a6ae035408203c Mon Sep 17 00:00:00 2001 From: scx1332 Date: Tue, 10 Oct 2023 12:56:01 +0200 Subject: [PATCH 097/123] Scx1332/possibility of config overwrite (#2836) --- core/payment-driver/erc20next/src/service.rs | 32 +++++++++++++++----- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index ae893ef835..5400a846a9 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -47,15 +47,35 @@ impl Erc20NextService { use_transfer_for_single_payment: false, }; - log::warn!("Loading config"); let mut config = config::Config::load_from_str(include_str!("../config-payments.toml")) .expect("Default erc20next config doesn't parse"); // Load config from file if it exists giving the possibility of overwriting the default config - if let Ok(config_from_file) = - config::Config::load(&path.join("config-payments.toml")).await + if tokio::fs::try_exists(&path.join("config-payments.toml")) + .await + .unwrap_or(false) { - config = config_from_file; + log::warn!( + "Config file found in {}", + &path.join("config-payments.toml").display() + ); + log::warn!( + "Format of the file may change in the future releases, use with caution!" + ); + match config::Config::load(&path.join("config-payments.toml")).await { + Ok(config_from_file) => { + log::info!("Config file loaded successfully, overwriting default config"); + config = config_from_file; + } + Err(err) => { + log::error!("Config file found but failed to load from file - using default config. Error: {}", err) + } + } + } else { + log::debug!( + "Config file not found in {}, using default config", + &path.join("config-payments.toml").display() + ); } for (network, chain) in &mut config.chain { @@ -96,7 +116,7 @@ impl Erc20NextService { chain.max_fee_per_gas = max_fee; } Err(e) => log::warn!( - "Valiue {max_fee} for {max_fee_per_gas_env} is not a valid devimal: {e}" + "Value {max_fee} for {max_fee_per_gas_env} is not a valid decimal: {e}" ), } } @@ -143,8 +163,6 @@ impl Erc20NextService { ); } }; - } else { - log::debug!("{multi_payment_addr_env} not set"); } } From 64b2605a2c1bdd4ce16eedf4ee8ba4c2eef71cc4 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Wed, 11 Oct 2023 20:48:42 +0200 Subject: [PATCH 098/123] Change default settings --- core/payment-driver/erc20next/src/service.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index 5400a846a9..c7d246ea17 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -42,9 +42,9 @@ impl Erc20NextService { keep_running: true, generate_tx_only: false, skip_multi_contract_check: false, - contract_use_direct_method: false, + contract_use_direct_method: true, contract_use_unpacked_method: false, - use_transfer_for_single_payment: false, + use_transfer_for_single_payment: true, }; let mut config = config::Config::load_from_str(include_str!("../config-payments.toml")) From 9119c245406cb1119393ff2aa435877cae81f84a Mon Sep 17 00:00:00 2001 From: scx1332 Date: Thu, 12 Oct 2023 15:36:41 +0200 Subject: [PATCH 099/123] Fix Cargo.lock dependencies --- Cargo.lock | 1117 ++++++++++++++++++++++++---------------------------- 1 file changed, 520 insertions(+), 597 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index bf16d6ce91..887a91764d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,15 +4,14 @@ version = 3 [[package]] name = "actix" -version = "0.13.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cba56612922b907719d4a01cf11c8d5b458e7d3dba946d0435f20f58d6795ed2" +checksum = "f728064aca1c318585bf4bb04ffcfac9e75e508ab4e8b1bd9ba5dfe04e2cbed5" dependencies = [ - "actix-macros", "actix-rt", "actix_derive", - "bitflags 2.4.0", - "bytes 1.5.0", + "bitflags 1.3.2", + "bytes 1.4.0", "crossbeam-channel 0.5.8", "futures-core", "futures-sink", @@ -21,10 +20,10 @@ dependencies = [ "log", "once_cell", "parking_lot 0.12.1", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "smallvec", - "tokio 1.33.0", - "tokio-util 0.7.9", + "tokio 1.32.0", + "tokio-util 0.7.8", ] [[package]] @@ -34,13 +33,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "617a8268e3537fe1d8c9ead925fca49ef6400927ee7bc26750e90ecee14ce4b8" dependencies = [ "bitflags 1.3.2", - "bytes 1.5.0", + "bytes 1.4.0", "futures-core", "futures-sink", "memchr", - "pin-project-lite 0.2.13", - "tokio 1.33.0", - "tokio-util 0.7.9", + "pin-project-lite 0.2.12", + "tokio 1.32.0", + "tokio-util 0.7.8", "tracing", ] @@ -71,7 +70,7 @@ dependencies = [ "actix-web", "askama_escape", "bitflags 1.3.2", - "bytes 1.5.0", + "bytes 1.4.0", "derive_more", "futures-core", "http-range", @@ -79,14 +78,14 @@ dependencies = [ "mime", "mime_guess", "percent-encoding", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", ] [[package]] name = "actix-http" -version = "3.4.0" +version = "3.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92ef85799cba03f76e4f7c10f533e66d87c9a7e7055f3391f09000ad8351bc9" +checksum = "c2079246596c18b4a33e274ae10c0e50613f4d32a4198e09c7b93771013fed74" dependencies = [ "actix-codec", "actix-rt", @@ -94,16 +93,16 @@ dependencies = [ "actix-tls", "actix-utils", "ahash 0.8.3", - "base64 0.21.4", - "bitflags 2.4.0", + "base64 0.21.3", + "bitflags 1.3.2", "brotli", - "bytes 1.5.0", + "bytes 1.4.0", "bytestring", "derive_more", "encoding_rs", "flate2", "futures-core", - "h2 0.3.21", + "h2 0.3.20", "http", "httparse", "httpdate 1.0.3", @@ -112,12 +111,12 @@ dependencies = [ "local-channel", "mime", "percent-encoding", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "rand 0.8.5", "sha1", "smallvec", - "tokio 1.33.0", - "tokio-util 0.7.9", + "tokio 1.32.0", + "tokio-util 0.7.8", "tracing", "zstd", ] @@ -135,7 +134,7 @@ dependencies = [ "actix-tls", "actix-utils", "awc", - "bytes 1.5.0", + "bytes 1.4.0", "futures-core", "http", "log", @@ -144,7 +143,7 @@ dependencies = [ "serde_urlencoded", "slab", "socket2 0.4.9", - "tokio 1.33.0", + "tokio 1.32.0", ] [[package]] @@ -154,7 +153,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] @@ -172,20 +171,20 @@ dependencies = [ [[package]] name = "actix-rt" -version = "2.9.0" +version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28f32d40287d3f402ae0028a9d54bef51af15c8769492826a69d28f81893151d" +checksum = "15265b6b8e2347670eb363c47fc8c75208b4a4994b27192f345fcbe707804f3e" dependencies = [ "actix-macros", "futures-core", - "tokio 1.33.0", + "tokio 1.32.0", ] [[package]] name = "actix-server" -version = "2.3.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3eb13e7eef0423ea6eab0e59f6c72e7cb46d33691ad56a726b3cd07ddec2c2d4" +checksum = "3e8613a75dd50cc45f473cee3c34d59ed677c0f7b44480ce3b8247d7dc519327" dependencies = [ "actix-rt", "actix-service", @@ -193,8 +192,9 @@ dependencies = [ "futures-core", "futures-util", "mio 0.8.8", - "socket2 0.5.4", - "tokio 1.33.0", + "num_cpus", + "socket2 0.4.9", + "tokio 1.32.0", "tracing", ] @@ -206,14 +206,14 @@ checksum = "3b894941f818cfdc7ccc4b9e60fa7e53b5042a2e8567270f9147d5591893373a" dependencies = [ "futures-core", "paste", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", ] [[package]] name = "actix-test" -version = "0.1.2" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2173910d0c7d0a21730d3e1304576d9c969eead2b91f3257a7435f7face702e0" +checksum = "a7c7d37a955bfa3ccde83c12bc8987262abaf6c90ae9dd24fcdbd78c6c01ffaf" dependencies = [ "actix-codec", "actix-http", @@ -229,29 +229,26 @@ dependencies = [ "serde", "serde_json", "serde_urlencoded", - "tokio 1.33.0", + "tokio 1.32.0", ] [[package]] name = "actix-tls" -version = "3.1.1" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72616e7fbec0aa99c6f3164677fa48ff5a60036d0799c98cab894a44f3e0efc3" +checksum = "9fde0cf292f7cdc7f070803cb9a0d45c018441321a78b1042ffbbb81ec333297" dependencies = [ + "actix-codec", "actix-rt", "actix-service", "actix-utils", "futures-core", "http", - "impl-more", + "log", "openssl", - "pin-project-lite 0.2.13", - "rustls", - "rustls-webpki", - "tokio 1.33.0", + "pin-project-lite 0.2.12", "tokio-openssl", - "tokio-util 0.7.9", - "tracing", + "tokio-util 0.7.8", ] [[package]] @@ -261,14 +258,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "88a1dcdff1466e3c2488e1cb5c36a71822750ad43839937f85d2f4d9f8b705d8" dependencies = [ "local-waker", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", ] [[package]] name = "actix-web" -version = "4.4.0" +version = "4.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e4a5b5e29603ca8c94a77c65cf874718ceb60292c5a5c3e5f4ace041af462b9" +checksum = "cd3cb42f9566ab176e1ef0b8b3a896529062b4efc6be0123046095914c4c1c96" dependencies = [ "actix-codec", "actix-http", @@ -280,8 +277,8 @@ dependencies = [ "actix-tls", "actix-utils", "actix-web-codegen", - "ahash 0.8.3", - "bytes 1.5.0", + "ahash 0.7.6", + "bytes 1.4.0", "bytestring", "cfg-if 1.0.0", "cookie", @@ -289,18 +286,19 @@ dependencies = [ "encoding_rs", "futures-core", "futures-util", + "http", "itoa 1.0.9", "language-tags", "log", "mime", "once_cell", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "regex", "serde", "serde_json", "serde_urlencoded", "smallvec", - "socket2 0.5.4", + "socket2 0.4.9", "time 0.3.9", "url", ] @@ -315,24 +313,24 @@ dependencies = [ "actix-codec", "actix-http", "actix-web", - "bytes 1.5.0", + "bytes 1.4.0", "bytestring", "futures-core", - "pin-project-lite 0.2.13", - "tokio 1.33.0", - "tokio-util 0.7.9", + "pin-project-lite 0.2.12", + "tokio 1.32.0", + "tokio-util 0.7.8", ] [[package]] name = "actix-web-codegen" -version = "4.2.2" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1f50ebbb30eca122b188319a4398b3f7bb4a8cdf50ecfb73bfc6a3c3ce54f5" +checksum = "2262160a7ae29e3415554a3f1fc04c764b1540c116aa524683208078b7a75bc9" dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.38", + "syn 1.0.109", ] [[package]] @@ -347,25 +345,25 @@ dependencies = [ "base64 0.13.1", "futures-core", "futures-util", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", ] [[package]] name = "actix_derive" -version = "0.6.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c7db3d5a9718568e4cf4a537cfd7070e6e6ff7481510d0237fb529ac850f6d3" +checksum = "6d44b8fee1ced9671ba043476deddef739dd0959bf77030b26b738cc591737a7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 1.0.109", ] [[package]] name = "addr2line" -version = "0.21.0" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3" dependencies = [ "gimli", ] @@ -450,9 +448,9 @@ dependencies = [ [[package]] name = "aho-corasick" -version = "1.1.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +checksum = "6748e8def348ed4d14996fa801f4122cd763fff530258cdc03f64b25f89d3a5a" dependencies = [ "memchr", ] @@ -510,9 +508,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "3a30da5c5f2d5e72842e00bcb57657162cdabef0931f40e2deb9b4140440cecd" [[package]] name = "anyhow" @@ -573,7 +571,7 @@ dependencies = [ "anstyle", "bstr", "doc-comment", - "predicates 3.0.4", + "predicates 3.0.3", "predicates-core", "predicates-tree", "wait-timeout", @@ -591,8 +589,8 @@ dependencies = [ "futures-core", "futures-io", "memchr", - "pin-project-lite 0.2.13", - "tokio 1.33.0", + "pin-project-lite 0.2.12", + "tokio 1.32.0", "xz2", ] @@ -604,7 +602,7 @@ checksum = "bc00ceb34980c03614e35a3a4e218276a0a824e911d07651cd0d858a51e8c0f0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] @@ -644,9 +642,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "awc" -version = "3.2.0" +version = "3.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fa3c705a9c7917ac0f41c0757a0a747b43bbc29b0b364b081bd7c5fc67fb223" +checksum = "87ef547a81796eb2dfe9b345aba34c2e08391a0502493711395b36dd64052b69" dependencies = [ "actix-codec", "actix-http", @@ -654,26 +652,27 @@ dependencies = [ "actix-service", "actix-tls", "actix-utils", - "base64 0.21.4", - "bytes 1.5.0", + "ahash 0.7.6", + "base64 0.21.3", + "bytes 1.4.0", "cfg-if 1.0.0", "cookie", "derive_more", "futures-core", "futures-util", - "h2 0.3.21", + "h2 0.3.20", "http", "itoa 1.0.9", "log", "mime", "openssl", "percent-encoding", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "rand 0.8.5", "serde", "serde_json", "serde_urlencoded", - "tokio 1.33.0", + "tokio 1.32.0", ] [[package]] @@ -688,9 +687,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.69" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837" +checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12" dependencies = [ "addr2line", "cc", @@ -721,9 +720,9 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.4" +version = "0.21.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ba43ea6f343b788c8764558649e08df62f86c6ef251fdaeb1ffd010a9ae50a2" +checksum = "414dcefbc63d77c526a76b3afcf6fbb9b5e2791c19c3aa2297733208750c6e53" [[package]] name = "base64ct" @@ -865,7 +864,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4114279215a005bc675e386011e594e1d9b800918cea18fcadadcce864a2046b" dependencies = [ "borsh-derive", - "hashbrown 0.13.2", + "hashbrown 0.12.3", ] [[package]] @@ -905,9 +904,9 @@ dependencies = [ [[package]] name = "brotli" -version = "3.4.0" +version = "3.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "516074a47ef4bce09577a3b379392300159ce5b1ba2e501ff1c819950066100f" +checksum = "a1a0b1dbcc8ae29329621f8d4f0d835787c1c38bb1401979b49d13b0b305ff68" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -916,9 +915,9 @@ dependencies = [ [[package]] name = "brotli-decompressor" -version = "2.5.0" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da74e2b81409b1b743f8f0c62cc6254afefb8b8e50bbfe3735550f7aeefa3448" +checksum = "4b6561fd3f895a11e8f72af2cb7d22e08366bebc2b6b57f7744c4bda27034744" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -926,9 +925,9 @@ dependencies = [ [[package]] name = "bstr" -version = "1.7.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c79ad7fb2dd38f3dabd76b09c6a5a20c038fc0213ef1e9afd30eb777f120f019" +checksum = "6798148dccfbff0fae41c7574d2fa8f1ef3492fba0face179de5d8d447d67b05" dependencies = [ "memchr", "regex-automata", @@ -937,9 +936,9 @@ dependencies = [ [[package]] name = "bumpalo" -version = "3.14.0" +version = "3.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f30e7476521f6f8af1a1c4c0b8cc94f0bee37d91763d0ca2665f299b6cd8aec" +checksum = "a3e2c3daef883ecc1b5d58c15adae93470a91d425f3532ba1695849656af3fc1" [[package]] name = "byte-slice-cast" @@ -987,9 +986,9 @@ dependencies = [ [[package]] name = "byteorder" -version = "1.5.0" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" [[package]] name = "bytes" @@ -999,15 +998,15 @@ checksum = "0e4cec68f03f32e44924783795810fa50a7035d8c8ebe78580ad7e6c703fba38" [[package]] name = "bytes" -version = "1.5.0" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" [[package]] name = "bytesize" -version = "1.3.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e368af43e418a04d52505cf3dbc23dda4e3407ae2fa99fd0e4f308ce546acc" +checksum = "38fcc2979eff34a4b84e1cf9a1e3da42a7d44b3b690a40cdcb23e3d556cfb2e5" [[package]] name = "bytestring" @@ -1015,7 +1014,7 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "238e4886760d98c4f899360c834fa93e62cf7f721ac3c2da375cbdf4b8679aae" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", ] [[package]] @@ -1051,9 +1050,9 @@ dependencies = [ [[package]] name = "cc" -version = "1.0.83" +version = "1.0.82" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1174fb0b6ec23863f8b971027804a42614e347eafb0a95bf0b12cdae21fc4d0" +checksum = "305fe645edc1442a0fa8b6726ba61d422798d37a52e12eaecf4b022ebbb88f01" dependencies = [ "jobserver", "libc", @@ -1083,7 +1082,7 @@ dependencies = [ "num-traits", "serde", "wasm-bindgen", - "windows-targets 0.48.5", + "windows-targets 0.48.4", ] [[package]] @@ -1423,9 +1422,9 @@ dependencies = [ [[package]] name = "csv" -version = "1.3.0" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac574ff4d437a7b5ad237ef331c17ccca63c46479e5b5453eb8e10bb99a759fe" +checksum = "626ae34994d3d8d668f4269922248239db4ae42d538b14c398b74a52208e8086" dependencies = [ "csv-core", "itoa 1.0.9", @@ -1435,9 +1434,9 @@ dependencies = [ [[package]] name = "csv-core" -version = "0.1.11" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5efa2b3d7902f4b634a20cae3c9c4e6209dc4779feb6863329607560143efa70" +checksum = "2b2466559f260f48ad25fe6317b3c8dac77b5bdb5763ac7d9d6103530663bc90" dependencies = [ "memchr", ] @@ -1463,11 +1462,11 @@ dependencies = [ [[package]] name = "ctrlc" -version = "3.4.1" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82e95fbd621905b854affdc67943b043a0fbb6ed7385fd5a25650d19a8a6cfdf" +checksum = "2a011bbe2c35ce9c1f143b7af6f94f29a167beb4cd1d29e6740ce836f723120e" dependencies = [ - "nix 0.27.1", + "nix 0.26.2", "windows-sys 0.48.0", ] @@ -1531,12 +1530,12 @@ dependencies = [ [[package]] name = "dashmap" -version = "5.5.3" +version = "5.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "978747c1d849a7d2ee5e8adc0159961c48fb7e5db2f06af6723b80123bb53856" +checksum = "6943ae99c34386c84a470c499d3414f66502a41340aa895406e0d2e4a207b91d" dependencies = [ "cfg-if 1.0.0", - "hashbrown 0.14.1", + "hashbrown 0.14.0", "lock_api 0.4.10", "once_cell", "parking_lot_core 0.9.8", @@ -1742,9 +1741,9 @@ checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" [[package]] name = "dyn-clone" -version = "1.0.14" +version = "1.0.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23d2f3407d9a573d666de4b5bdf10569d73ca9478087346697dcbae6244bfbcd" +checksum = "bbfc4744c1b8f2a09adc0e55242f60b1af195d88596bd8700be74418c056c555" [[package]] name = "ed25519" @@ -1792,9 +1791,9 @@ checksum = "34aa73646ffb006b8f5147f3dc182bd4bcb190227ce861fc4a4844bf8e3cb2c0" [[package]] name = "encoding_rs" -version = "0.8.33" +version = "0.8.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7268b386296a025e474d5140678f75d6de9493ae55a5d709eeb9dd08149945e1" +checksum = "071a31f4ee85403370b58aca746f01041ede6f0da2730960ad001edc2b71b394" dependencies = [ "cfg-if 1.0.0", ] @@ -1817,18 +1816,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "enum-as-inner" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ffccbb6966c05b32ef8fbac435df276c4ae4d3dc55a8cd0eb9745e6c12f546a" -dependencies = [ - "heck 0.4.1", - "proc-macro2", - "quote", - "syn 2.0.38", -] - [[package]] name = "env_logger" version = "0.7.1" @@ -1904,7 +1891,7 @@ dependencies = [ "sha3 0.10.8", "sqlx", "structopt", - "tokio 1.33.0", + "tokio 1.32.0", "toml", "uuid 1.4.1", "web3", @@ -1923,14 +1910,25 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.5" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" +checksum = "6b30f669a7961ef1631673d2766cc92f52d64f7ef354d4fe0ddfd30ed52f0f4f" dependencies = [ + "errno-dragonfly", "libc", "windows-sys 0.48.0", ] +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "error-code" version = "2.3.1" @@ -2034,7 +2032,7 @@ dependencies = [ "fixed-hash 0.8.0", "impl-rlp", "impl-serde 0.4.0", - "primitive-types 0.12.2", + "primitive-types 0.12.1", "uint 0.9.5", ] @@ -2066,9 +2064,9 @@ checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" [[package]] name = "fastrand" -version = "2.0.1" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" +checksum = "6999dc1837253364c2ebb0704ba97994bd874e8f195d665c50b7548f6ea92764" [[package]] name = "fd-lock" @@ -2103,12 +2101,6 @@ dependencies = [ "windows-sys 0.48.0", ] -[[package]] -name = "finl_unicode" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fcfdc7a0362c9f4444381a9e697c79d435fe65b52a37466fc2c1184cee9edc6" - [[package]] name = "fixed-hash" version = "0.7.0" @@ -2213,12 +2205,13 @@ dependencies = [ [[package]] name = "flume" -version = "0.11.0" +version = "0.10.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +checksum = "1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577" dependencies = [ "futures-core", "futures-sink", + "pin-project 1.1.3", "spin 0.9.8", ] @@ -2388,7 +2381,7 @@ checksum = "89ca545a94061b6365f2c7355b4b32bd20df3ff95f02da9329b34ccc3bd6ee72" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] @@ -2423,7 +2416,7 @@ dependencies = [ "futures-sink", "futures-task", "memchr", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "pin-utils", "slab", ] @@ -2496,7 +2489,7 @@ dependencies = [ "structopt", "tempdir", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "url", "ya-compile-time-utils", "ya-core-model", @@ -2505,9 +2498,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.27.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e" [[package]] name = "git-version" @@ -2565,7 +2558,7 @@ dependencies = [ "serde", "serde_json", "serde_json_canonicalizer", - "sha2 0.10.8", + "sha2 0.10.7", "sha3 0.10.8", "thiserror", "url", @@ -2601,7 +2594,7 @@ dependencies = [ "structopt", "strum", "strum_macros", - "tokio 1.33.0", + "tokio 1.32.0", "url", "ya-client", "ya-compile-time-utils", @@ -2670,11 +2663,11 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.21" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "97ec8491ebaf99c8eaa73058b045fe58073cd6be7f596ac993ced0b0a0c01049" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "fnv", "futures-core", "futures-sink", @@ -2682,8 +2675,8 @@ dependencies = [ "http", "indexmap 1.9.3", "slab", - "tokio 1.33.0", - "tokio-util 0.7.9", + "tokio 1.32.0", + "tokio-util 0.7.8", "tracing", ] @@ -2708,18 +2701,9 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.13.2" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" -dependencies = [ - "ahash 0.8.3", -] - -[[package]] -name = "hashbrown" -version = "0.14.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7dfda62a12f55daeae5015f81b0baea145391cb4520f86c248fc615d72640d12" +checksum = "2c6201b9ff9fd90a5a3bac2e56a830d0caa509576f0e503818ee82c181b3437a" dependencies = [ "ahash 0.8.3", "allocator-api2", @@ -2727,11 +2711,11 @@ dependencies = [ [[package]] name = "hashlink" -version = "0.8.4" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8094feaf31ff591f651a2664fb9cfd92bba7a60ce3197265e9482ebe753c8f7" +checksum = "312f66718a2d7789ffef4f4b7b213138ed9f1eb3aa1d0d82fc99f88fb3ffd26f" dependencies = [ - "hashbrown 0.14.1", + "hashbrown 0.14.0", ] [[package]] @@ -2746,12 +2730,13 @@ dependencies = [ [[package]] name = "headers" -version = "0.3.9" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06683b93020a07e3dbcf5f8c0f6d40080d725bea7936fc01ad345c01b97dc270" +checksum = "f3e372db8e5c0d213e0cd0b9be18be2aca3d44cf2fe30a9d46a65581cd454584" dependencies = [ - "base64 0.21.4", - "bytes 1.5.0", + "base64 0.13.1", + "bitflags 1.3.2", + "bytes 1.4.0", "headers-core", "http", "httpdate 1.0.3", @@ -2797,9 +2782,9 @@ dependencies = [ [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "443144c8cdadd93ebf52ddb4056d257f5b52c04d3c804e657d19eb73fc33668b" [[package]] name = "hex" @@ -2861,7 +2846,7 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "fnv", "itoa 1.0.9", ] @@ -2882,9 +2867,9 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "http", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", ] [[package]] @@ -2956,19 +2941,19 @@ version = "0.14.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "futures-channel", "futures-core", "futures-util", - "h2 0.3.21", + "h2 0.3.20", "http", "http-body 0.4.5", "httparse", "httpdate 1.0.3", "itoa 1.0.9", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "socket2 0.4.9", - "tokio 1.33.0", + "tokio 1.32.0", "tower-service", "tracing", "want", @@ -2984,7 +2969,7 @@ dependencies = [ "http", "hyper 0.14.27", "rustls", - "tokio 1.33.0", + "tokio 1.32.0", "tokio-rustls", ] @@ -2994,10 +2979,10 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "hyper 0.14.27", "native-tls", - "tokio 1.33.0", + "tokio 1.32.0", "tokio-native-tls", ] @@ -3080,15 +3065,9 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" dependencies = [ - "parity-scale-codec 3.6.5", + "parity-scale-codec 3.6.4", ] -[[package]] -name = "impl-more" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "206ca75c9c03ba3d4ace2460e57b189f39f43de612c2f85836e65c929701bb2d" - [[package]] name = "impl-rlp" version = "0.3.0" @@ -3140,12 +3119,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.0.2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8adf3ddd720272c6ea8bf59463c04e0f93d0bbf7c5439b691bca2987e0270897" +checksum = "d5477fe2230a79769d8dc68e0eabf5437907c0457a5614a9e8dddb67f65eb65d" dependencies = [ "equivalent", - "hashbrown 0.14.1", + "hashbrown 0.14.0", ] [[package]] @@ -3204,10 +3183,10 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f" dependencies = [ - "socket2 0.5.4", + "socket2 0.5.3", "widestring", "windows-sys 0.48.0", - "winreg", + "winreg 0.50.0", ] [[package]] @@ -3222,7 +3201,7 @@ version = "0.4.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.3.2", "rustix", "windows-sys 0.48.0", ] @@ -3245,15 +3224,6 @@ dependencies = [ "either", ] -[[package]] -name = "itertools" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "0.4.8" @@ -3268,9 +3238,9 @@ checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" dependencies = [ "libc", ] @@ -3341,15 +3311,15 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.149" +version = "0.2.147" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a08173bc88b7955d1b3145aa561539096c421ac8debde8cbc3612ec635fee29b" +checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3" [[package]] name = "libm" -version = "0.2.8" +version = "0.2.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" +checksum = "f7012b1bbb0719e1097c47611d3898568c546d597c2e74d66f6087edd5233ff4" [[package]] name = "libproc" @@ -3380,18 +3350,19 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.10" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" +checksum = "57bcfdad1b858c2db7c38303a6d2ad4dfaf5eb53dfeb0910128b2c26d6158503" [[package]] name = "local-channel" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a493488de5f18c8ffcba89eebb8532ffc562dc400490eb65b84893fae0b178" +checksum = "7f303ec0e94c6c54447f84f3b0ef7af769858a9c4ef56ef2a986d3dcd4c3fc9c" dependencies = [ "futures-core", "futures-sink", + "futures-util", "local-waker", ] @@ -3490,19 +3461,18 @@ checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] name = "md-5" -version = "0.10.6" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +checksum = "6365506850d44bff6e2fbcb5176cf63650e48bd45ef2fe2665ae1570e0f4b9ca" dependencies = [ - "cfg-if 1.0.0", "digest 0.10.7", ] [[package]] name = "memchr" -version = "2.6.4" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" [[package]] name = "memoffset" @@ -3915,13 +3885,14 @@ dependencies = [ [[package]] name = "nix" -version = "0.27.1" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" dependencies = [ - "bitflags 2.4.0", + "bitflags 1.3.2", "cfg-if 1.0.0", "libc", + "static_assertions", ] [[package]] @@ -4053,9 +4024,9 @@ dependencies = [ [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "f30b0abd723be7e2ffca1272140fac1a2f084c77ec3e123c192b66af1ee9e6c2" dependencies = [ "autocfg", "libm", @@ -4067,7 +4038,7 @@ version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" dependencies = [ - "hermit-abi 0.3.3", + "hermit-abi 0.3.2", "libc", ] @@ -4109,9 +4080,9 @@ checksum = "17b02fc0ff9a9e4b35b3342880f48e896ebf69f2967921fe8646bf5b7125956a" [[package]] name = "object" -version = "0.32.1" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1" dependencies = [ "memchr", ] @@ -4146,11 +4117,11 @@ checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" [[package]] name = "openssl" -version = "0.10.57" +version = "0.10.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bac25ee399abb46215765b1cb35bc0212377e58a061560d8b29b024fd0430e7c" +checksum = "729b745ad4a5575dd06a3e1af1414bd330ee561c01b3899eb584baeaa8def17e" dependencies = [ - "bitflags 2.4.0", + "bitflags 1.3.2", "cfg-if 1.0.0", "foreign-types", "libc", @@ -4167,7 +4138,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] @@ -4178,18 +4149,18 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-src" -version = "300.1.5+3.1.3" +version = "111.27.0+1.1.1v" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "559068e4c12950d7dcaa1857a61725c0d38d4fc03ff8e070ab31a75d6e316491" +checksum = "06e8f197c82d7511c5b014030c9b1efeda40d7d5f99d23b4ceed3524a5e63f02" dependencies = [ "cc", ] [[package]] name = "openssl-sys" -version = "0.9.93" +version = "0.9.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "db4d56a4c0478783083cfafcc42493dd4a981d41669da64b4572a2a089b51b1d" +checksum = "866b5f16f90776b9bb8dc1e1802ac6f0513de3a7a7465867bfbc563dc737faac" dependencies = [ "cc", "libc", @@ -4234,15 +4205,15 @@ dependencies = [ [[package]] name = "parity-scale-codec" -version = "3.6.5" +version = "3.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dec8a8073036902368c2cdc0387e85ff9a37054d7e7c98e592145e0c92cd4fb" +checksum = "dd8e946cc0cc711189c0b0249fb8b599cbeeab9784d83c415719368bb8d4ac64" dependencies = [ "arrayvec 0.7.4", "bitvec 1.0.1", "byte-slice-cast", "impl-trait-for-tuples", - "parity-scale-codec-derive 3.6.5", + "parity-scale-codec-derive 3.6.4", "serde", ] @@ -4260,9 +4231,9 @@ dependencies = [ [[package]] name = "parity-scale-codec-derive" -version = "3.6.5" +version = "3.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "312270ee71e1cd70289dacf597cab7b207aa107d2f28191c2ae45b2ece18a260" +checksum = "2a296c3079b5fefbc499e1de58dc26c09b1b9a5952d26694ee89f04a43ebbb3e" dependencies = [ "proc-macro-crate 1.3.1", "proc-macro2", @@ -4339,7 +4310,7 @@ dependencies = [ "libc", "redox_syscall 0.3.5", "smallvec", - "windows-targets 0.48.5", + "windows-targets 0.48.4", ] [[package]] @@ -4386,11 +4357,10 @@ checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" [[package]] name = "pest" -version = "2.7.4" +version = "2.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c022f1e7b65d6a24c0dbbd5fb344c66881bc01f3e5ae74a1c8100f2f985d98a4" +checksum = "1acb4a4365a13f749a93f1a094a7805e5cfa0955373a9de860d962eaa3a5fe5a" dependencies = [ - "memchr", "thiserror", "ucd-trie", ] @@ -4407,12 +4377,12 @@ dependencies = [ [[package]] name = "petgraph" -version = "0.6.4" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1d3afd2628e69da2be385eb6f2fd57c8ac7977ceeff6dc166ff1657b0e386a9" +checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4" dependencies = [ "fixedbitset 0.4.2", - "indexmap 2.0.2", + "indexmap 1.9.3", ] [[package]] @@ -4452,7 +4422,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] @@ -4463,9 +4433,9 @@ checksum = "257b64915a082f7811703966789728173279bdebb956b143dbcd23f6f970a777" [[package]] name = "pin-project-lite" -version = "0.2.13" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" +checksum = "12cc1b0bf1727a77a54b6654e7b5f1af8604923edc8b81885f8ec92f9e3f0a05" [[package]] name = "pin-utils" @@ -4522,13 +4492,13 @@ dependencies = [ [[package]] name = "predicates" -version = "3.0.4" +version = "3.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dfc28575c2e3f19cb3c73b93af36460ae898d426eba6fc15b9bd2a5220758a0" +checksum = "09963355b9f467184c04017ced4a2ba2d75cbcb4e7462690d388233253d4b1a9" dependencies = [ "anstyle", "difflib", - "itertools 0.11.0", + "itertools 0.10.5", "predicates-core", ] @@ -4587,9 +4557,9 @@ dependencies = [ [[package]] name = "primitive-types" -version = "0.12.2" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b34d9fd68ae0b74a41b21c03c2f62847aa0ffea044eee893b4c140b37e244e2" +checksum = "9f3486ccba82358b11a77516035647c34ba167dfa53312630de83b12bd4f3d66" dependencies = [ "fixed-hash 0.8.0", "impl-codec 0.6.0", @@ -4649,9 +4619,9 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.66" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9" dependencies = [ "unicode-ident", ] @@ -4671,7 +4641,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e6984d2f1a23009bd270b8bb56d0926810a3d483f59c987d77969e9d8e840b2" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "prost-derive 0.7.0", ] @@ -4681,7 +4651,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "71adf41db68aa0daaefc69bb30bcd68ded9b9abaad5d1fbb6304c4fb390e083e" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "prost-derive 0.10.1", ] @@ -4691,7 +4661,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "32d3ebd75ac2679c2af3a92246639f9fcc8a442ee420719cc4fe195b98dd5fa3" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "heck 0.3.3", "itertools 0.9.0", "log", @@ -4709,7 +4679,7 @@ version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ae5a4388762d5815a9fc0dea33c56b021cdc8dde0c55e0c9ca57197254b0cab" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "cfg-if 1.0.0", "cmake", "heck 0.4.1", @@ -4717,7 +4687,7 @@ dependencies = [ "lazy_static", "log", "multimap", - "petgraph 0.6.4", + "petgraph 0.6.3", "prost 0.10.4", "prost-types 0.10.1", "regex", @@ -4757,7 +4727,7 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b518d7cdd93dab1d1122cf07fa9a60771836c668dde9d9e2a139f957f0d9f1bb" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "prost 0.7.0", ] @@ -4767,7 +4737,7 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d0a014229361011dc8e69c8a1ec6c2e8d0f2af7c91e3ea3f5b2170298461e68" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "prost 0.10.4", ] @@ -5034,9 +5004,9 @@ dependencies = [ [[package]] name = "regex" -version = "1.10.0" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d119d7c7ca818f8a53c300863d4f87566aac09943aef5b355bb83969dae75d87" +checksum = "81bc1d4caf89fac26a70747fe603c130093b53c773888797a6329091246d651a" dependencies = [ "aho-corasick", "memchr", @@ -5046,9 +5016,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.1" +version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "465c6fc0621e4abc4187a2bda0937bfd4f722c2730b29562e19689ea796c9a4b" +checksum = "fed1ceff11a1dddaee50c9dc8e4938bd106e9d89ae372f192311e7da498e3b69" dependencies = [ "aho-corasick", "memchr", @@ -5057,9 +5027,9 @@ dependencies = [ [[package]] name = "regex-syntax" -version = "0.8.1" +version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56d84fdd47036b038fc80dd333d10b6aab10d5d31f4a366e20014def75328d33" +checksum = "e5ea92a5b6195c6ef2a0295ea818b312502c6fc94dde986c5553242e18fd4ce2" [[package]] name = "remove_dir_all" @@ -5072,25 +5042,25 @@ dependencies = [ [[package]] name = "rend" -version = "0.4.1" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2571463863a6bd50c32f94402933f03457a3fbaf697a707c5be741e459f08fd" +checksum = "581008d2099240d37fb08d77ad713bcaec2c4d89d50b5b21a8bb1996bbab68ab" dependencies = [ "bytecheck", ] [[package]] name = "reqwest" -version = "0.11.22" +version = "0.11.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +checksum = "cde824a14b7c14f85caff81225f411faacc04a2013f41670f41443742b1c1c55" dependencies = [ - "base64 0.21.4", - "bytes 1.5.0", + "base64 0.21.3", + "bytes 1.4.0", "encoding_rs", "futures-core", "futures-util", - "h2 0.3.21", + "h2 0.3.20", "http", "http-body 0.4.5", "hyper 0.14.27", @@ -5103,24 +5073,23 @@ dependencies = [ "native-tls", "once_cell", "percent-encoding", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "rustls", "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", - "system-configuration", - "tokio 1.33.0", + "tokio 1.32.0", "tokio-native-tls", "tokio-rustls", "tower-service", - "trust-dns-resolver 0.23.0", + "trust-dns-resolver", "url", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", "webpki-roots", - "winreg", + "winreg 0.10.1", ] [[package]] @@ -5193,7 +5162,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bb919243f34364b6bd2fc10ef797edbfa75f33c252e7998527479c6d6b47e1ec" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "rustc-hex", ] @@ -5238,7 +5207,7 @@ checksum = "a4c4216490d5a413bc6d10fa4742bd7d4955941d062c0ef873141d6b0e7b30fd" dependencies = [ "arrayvec 0.7.4", "borsh", - "bytes 1.5.0", + "bytes 1.4.0", "num-traits", "rand 0.8.5", "rkyv", @@ -5273,17 +5242,17 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" dependencies = [ - "semver 1.0.20", + "semver 1.0.18", ] [[package]] name = "rustix" -version = "0.38.18" +version = "0.38.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a74ee2d7c2581cd139b42447d7d9389b889bdaad3a73f1ebb16f2a3237bb19c" +checksum = "19ed4fa021d81c8392ce04db050a3da9a60299050b7ae1cf482d862b54a7218f" dependencies = [ "bitflags 2.4.0", - "errno 0.3.5", + "errno 0.3.2", "libc", "linux-raw-sys", "windows-sys 0.48.0", @@ -5291,9 +5260,9 @@ dependencies = [ [[package]] name = "rustls" -version = "0.21.7" +version = "0.21.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd8d6c9f025a446bc4d18ad9632e69aec8f287aa84499ee335599fabd20c3fd8" +checksum = "1d1feddffcfcc0b33f5c6ce9a29e341e4cd59c3f78e7ee45f4a40c038b1d6cbb" dependencies = [ "log", "ring", @@ -5307,14 +5276,14 @@ version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2d3987094b1d07b653b7dfdc3f70ce9a1da9c51ac18c1b06b662e4f9a0e9f4b2" dependencies = [ - "base64 0.21.4", + "base64 0.21.3", ] [[package]] name = "rustls-webpki" -version = "0.101.6" +version = "0.101.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c7d5dece342910d9ba34d259310cae3e0154b873b35408b787b59bce53d34fe" +checksum = "7d93931baf2d282fff8d3a532bbfd7653f734643161b87e3e01e59a04439bf0d" dependencies = [ "ring", "untrusted", @@ -5440,9 +5409,9 @@ dependencies = [ [[package]] name = "schemars" -version = "0.8.15" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f7b0ce13155372a76ee2e1c5ffba1fe61ede73fbea5630d61eee6fac4929c0c" +checksum = "02c613288622e5f0c3fdc5dbd4db1c5fbe752746b1d1a56a0630b78fd00de44f" dependencies = [ "chrono", "dyn-clone", @@ -5455,9 +5424,9 @@ dependencies = [ [[package]] name = "schemars_derive" -version = "0.8.15" +version = "0.8.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e85e2a16b12bdb763244c69ab79363d71db2b4b918a2def53f80b02e0574b13c" +checksum = "109da1e6b197438deb6db99952990c7f959572794b80ff93707d55a232545e7c" dependencies = [ "proc-macro2", "quote", @@ -5620,9 +5589,9 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.20" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "b0293b4b29daaf487284529cc2f5675b8e57c61f70167ba415a463651fd6a918" dependencies = [ "serde", ] @@ -5644,9 +5613,9 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.188" +version = "1.0.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" +checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c" dependencies = [ "serde_derive", ] @@ -5662,13 +5631,13 @@ dependencies = [ [[package]] name = "serde_derive" -version = "1.0.188" +version = "1.0.183" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" +checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] @@ -5684,9 +5653,9 @@ dependencies = [ [[package]] name = "serde_json" -version = "1.0.107" +version = "1.0.105" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b420ce6e3d8bd882e9b243c6eed35dbc9a6110c9769e74b584e0d68d1f20c65" +checksum = "693151e1ac27563d6dbcec9dee9fbd5da8539b20fa14ad3752b2e6d363ace360" dependencies = [ "itoa 1.0.9", "ryu", @@ -5745,7 +5714,7 @@ version = "0.9.25" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a49e178e4452f45cb61d0cd8cebc1b0fafd3e41929e996cef79aa3aca91f574" dependencies = [ - "indexmap 2.0.2", + "indexmap 2.0.0", "itoa 1.0.9", "ryu", "serde", @@ -5768,7 +5737,7 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92761393ee4dc3ff8f4af487bd58f4307c9329bbedea02cac0089ad9c411e153" dependencies = [ - "dashmap 5.5.3", + "dashmap 5.5.0", "futures 0.3.28", "lazy_static", "log", @@ -5782,7 +5751,7 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "538c30747ae860d6fb88330addbbd3e0ddbe46d662d032855596d8a8ca260611" dependencies = [ - "dashmap 5.5.3", + "dashmap 5.5.0", "futures 0.3.28", "lazy_static", "log", @@ -5796,7 +5765,7 @@ version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0e56dd856803e253c8f298af3f4d7eb0ae5e23a737252cd90bb4f3b435033b2d" dependencies = [ - "dashmap 5.5.3", + "dashmap 5.5.0", "futures 0.3.28", "lazy_static", "log", @@ -5845,7 +5814,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] @@ -5863,9 +5832,9 @@ dependencies = [ [[package]] name = "sha1" -version = "0.10.6" +version = "0.10.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +checksum = "f04293dc80c3993519f2d7f6f511707ee7094fe0c6d3406feb330cdb3540eba3" dependencies = [ "cfg-if 1.0.0", "cpufeatures", @@ -5899,9 +5868,9 @@ dependencies = [ [[package]] name = "sha2" -version = "0.10.8" +version = "0.10.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +checksum = "479fb9d862239e610720565ca91403019f2f00410f1864c5aa7479b950a76ed8" dependencies = [ "cfg-if 1.0.0", "cpufeatures", @@ -5977,9 +5946,9 @@ checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" [[package]] name = "shlex" -version = "1.2.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" +checksum = "43b2853a4d09f215c24cc5489c992ce46052d359b5109343cbafbf26bc62f8a3" [[package]] name = "signal-hook" @@ -6045,18 +6014,18 @@ dependencies = [ [[package]] name = "slab" -version = "0.4.9" +version = "0.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d" dependencies = [ "autocfg", ] [[package]] name = "smallvec" -version = "1.11.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9" [[package]] name = "snailquote" @@ -6091,9 +6060,9 @@ dependencies = [ [[package]] name = "socket2" -version = "0.5.4" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4031e820eb552adee9295814c0ced9e5cf38ddf1e8b7d566d6de8e2538ea989e" +checksum = "2538b18701741680e0322a2302176d3253a35388e2e62f172f64f4f16605f877" dependencies = [ "libc", "windows-sys 0.48.0", @@ -6106,7 +6075,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41d1c5305e39e09653383c2c7244f2f78b3bcae37cf50c64cb4789c9f5096ec2" dependencies = [ "base64 0.13.1", - "bytes 1.5.0", + "bytes 1.4.0", "futures 0.3.28", "httparse", "log", @@ -6141,20 +6110,20 @@ dependencies = [ [[package]] name = "sqlformat" -version = "0.2.2" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b7b278788e7be4d0d29c0f39497a0eef3fba6bbc8e70d8bf7fde46edeaa9e85" +checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e" dependencies = [ - "itertools 0.11.0", + "itertools 0.10.5", "nom 7.1.3", "unicode_categories", ] [[package]] name = "sqlx" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e50c216e3624ec8e7ecd14c6a6a6370aad6ee5d8cfc3ab30b5162eeeef2ed33" +checksum = "8e58421b6bc416714d5115a2ca953718f6c621a51b68e4f4922aea5a4391a721" dependencies = [ "sqlx-core", "sqlx-macros", @@ -6165,14 +6134,14 @@ dependencies = [ [[package]] name = "sqlx-core" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d6753e460c998bbd4cd8c6f0ed9a64346fcca0723d6e75e52fdc351c5d2169d" +checksum = "dd4cef4251aabbae751a3710927945901ee1d97ee96d757f6880ebb9a79bfd53" dependencies = [ "ahash 0.8.3", "atoi", "byteorder", - "bytes 1.5.0", + "bytes 1.4.0", "chrono", "crc", "crossbeam-queue 0.3.8", @@ -6186,7 +6155,7 @@ dependencies = [ "futures-util", "hashlink", "hex", - "indexmap 2.0.2", + "indexmap 2.0.0", "log", "memchr", "once_cell", @@ -6194,11 +6163,11 @@ dependencies = [ "percent-encoding", "serde", "serde_json", - "sha2 0.10.8", + "sha2 0.10.7", "smallvec", "sqlformat", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "tokio-stream", "tracing", "url", @@ -6206,9 +6175,9 @@ dependencies = [ [[package]] name = "sqlx-macros" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a793bb3ba331ec8359c1853bd39eed32cdd7baaf22c35ccf5c92a7e8d1189ec" +checksum = "208e3165167afd7f3881b16c1ef3f2af69fa75980897aac8874a0696516d12c2" dependencies = [ "proc-macro2", "quote", @@ -6219,9 +6188,9 @@ dependencies = [ [[package]] name = "sqlx-macros-core" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a4ee1e104e00dedb6aa5ffdd1343107b0a4702e862a84320ee7cc74782d96fc" +checksum = "8a4a8336d278c62231d87f24e8a7a74898156e34c1c18942857be2acb29c7dfc" dependencies = [ "dotenvy", "either", @@ -6232,28 +6201,28 @@ dependencies = [ "quote", "serde", "serde_json", - "sha2 0.10.8", + "sha2 0.10.7", "sqlx-core", "sqlx-mysql", "sqlx-postgres", "sqlx-sqlite", "syn 1.0.109", "tempfile", - "tokio 1.33.0", + "tokio 1.32.0", "url", ] [[package]] name = "sqlx-mysql" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864b869fdf56263f4c95c45483191ea0af340f9f3e3e7b4d57a61c7c87a970db" +checksum = "8ca69bf415b93b60b80dc8fda3cb4ef52b2336614d8da2de5456cc942a110482" dependencies = [ "atoi", - "base64 0.21.4", + "base64 0.21.3", "bitflags 2.4.0", "byteorder", - "bytes 1.5.0", + "bytes 1.4.0", "chrono", "crc", "digest 0.10.7", @@ -6277,7 +6246,7 @@ dependencies = [ "rsa", "serde", "sha1", - "sha2 0.10.8", + "sha2 0.10.7", "smallvec", "sqlx-core", "stringprep", @@ -6288,12 +6257,12 @@ dependencies = [ [[package]] name = "sqlx-postgres" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb7ae0e6a97fb3ba33b23ac2671a5ce6e3cabe003f451abd5a56e7951d975624" +checksum = "a0db2df1b8731c3651e204629dd55e52adbae0462fa1bdcbed56a2302c18181e" dependencies = [ "atoi", - "base64 0.21.4", + "base64 0.21.3", "bitflags 2.4.0", "byteorder", "chrono", @@ -6317,7 +6286,7 @@ dependencies = [ "serde", "serde_json", "sha1", - "sha2 0.10.8", + "sha2 0.10.7", "smallvec", "sqlx-core", "stringprep", @@ -6328,9 +6297,9 @@ dependencies = [ [[package]] name = "sqlx-sqlite" -version = "0.7.2" +version = "0.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d59dc83cf45d89c555a577694534fcd1b55c545a816c816ce51f20bbe56a4f3f" +checksum = "be4c21bf34c7cae5b283efb3ac1bcc7670df7561124dc2f8bdc0b59be40f79a2" dependencies = [ "atoi", "chrono", @@ -6363,11 +6332,10 @@ checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" [[package]] name = "stringprep" -version = "0.1.4" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb41d74e231a107a1b4ee36bd1214b11285b77768d2e3824aedafa988fd36ee6" +checksum = "db3737bde7edce97102e0e2b15365bf7a20bfdb5f60f4f9e8d7004258a51a8da" dependencies = [ - "finl_unicode", "unicode-bidi", "unicode-normalization", ] @@ -6458,9 +6426,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.38" +version = "2.0.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e96b79aaa137db8f61e26363a0c9b47d8b4ec75da28b7d1d614c2303e232408b" +checksum = "c324c494eba9d92503e6f1ef2e6df781e78f6a7705a0202d9801b198807d518a" dependencies = [ "proc-macro2", "quote", @@ -6477,27 +6445,6 @@ dependencies = [ "libc", ] -[[package]] -name = "system-configuration" -version = "0.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" -dependencies = [ - "bitflags 1.3.2", - "core-foundation", - "system-configuration-sys", -] - -[[package]] -name = "system-configuration-sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" -dependencies = [ - "core-foundation-sys", - "libc", -] - [[package]] name = "t1ha" version = "0.1.0" @@ -6539,9 +6486,9 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.8.0" +version = "3.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb94d2f3cc536af71caac6b6fcebf65860b347e7ce0cc9ebe8f70d3e521054ef" +checksum = "dc02fddf48964c42031a0b3fe0428320ecf3a73c401040fc0096f97794310651" dependencies = [ "cfg-if 1.0.0", "fastrand", @@ -6563,9 +6510,9 @@ dependencies = [ [[package]] name = "termcolor" -version = "1.3.0" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" dependencies = [ "winapi-util", ] @@ -6606,24 +6553,24 @@ dependencies = [ [[package]] name = "test-case" -version = "3.2.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c8f1e820b7f1d95a0cdbf97a5df9de10e1be731983ab943e56703ac1b8e9d425" +checksum = "2a1d6e7bde536b0412f20765b76e921028059adfd1b90d8974d33fd3c91b25df" dependencies = [ - "test-case-macros 3.2.1", + "test-case-macros 3.1.0", ] [[package]] name = "test-case-core" -version = "3.2.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c25e2cb8f5fcd7318157634e8838aa6f7e4715c96637f969fabaccd1ef5462" +checksum = "d10394d5d1e27794f772b6fc854c7e91a2dc26e2cbf807ad523370c2a59c0cee" dependencies = [ "cfg-if 1.0.0", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.38", + "syn 1.0.109", ] [[package]] @@ -6641,14 +6588,14 @@ dependencies = [ [[package]] name = "test-case-macros" -version = "3.2.1" +version = "3.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37cfd7bbc88a0104e304229fba519bdc45501a30b760fb72240342f1289ad257" +checksum = "eeb9a44b1c6a54c1ba58b152797739dba2a83ca74e18168a68c980eb142f9404" dependencies = [ "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.38", + "syn 1.0.109", "test-case-core", ] @@ -6663,22 +6610,22 @@ dependencies = [ [[package]] name = "thiserror" -version = "1.0.49" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1177e8c6d7ede7afde3585fd2513e611227efd6481bd78d2e82ba1ce16557ed4" +checksum = "97a802ec30afc17eee47b2855fc72e0c4cd62be9b4efe6591edde0ec5bd68d8f" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.49" +version = "1.0.47" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10712f02019e9288794769fba95cd6847df9874d49d871d062172f9dd41bc4cc" +checksum = "6bb623b56e39ab7dcd4b1b98bb6c8f8d907ed255b18de254088016b27a8ee19b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] @@ -6753,19 +6700,19 @@ dependencies = [ [[package]] name = "tokio" -version = "1.33.0" +version = "1.32.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "17ed6077ed6cd6c74735e21f37eb16dc3935f96878b1fe961074089cc80893f9" dependencies = [ "backtrace", - "bytes 1.5.0", + "bytes 1.4.0", "libc", "mio 0.8.8", "num_cpus", "parking_lot 0.12.1", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "signal-hook-registry", - "socket2 0.5.4", + "socket2 0.5.3", "tokio-macros", "windows-sys 0.48.0", ] @@ -6777,7 +6724,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cf347e8ae1d1ffd16c8aed569172a71bd81098a001d0f4964d476c0097aba4a" dependencies = [ "byteorder", - "tokio 1.33.0", + "tokio 1.32.0", ] [[package]] @@ -6788,7 +6735,7 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] @@ -6798,7 +6745,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbae76ab933c85776efabc971569dd6119c580d8f5d448769dec1764bf796ef2" dependencies = [ "native-tls", - "tokio 1.33.0", + "tokio 1.32.0", ] [[package]] @@ -6810,7 +6757,7 @@ dependencies = [ "futures-util", "openssl", "openssl-sys", - "tokio 1.33.0", + "tokio 1.32.0", ] [[package]] @@ -6819,7 +6766,7 @@ version = "0.2.0" dependencies = [ "libc", "nix 0.22.3", - "tokio 1.33.0", + "tokio 1.32.0", ] [[package]] @@ -6829,7 +6776,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c28327cf380ac148141087fbfb9de9d7bd4e84ab5d2c28fbc911d753de8a7081" dependencies = [ "rustls", - "tokio 1.33.0", + "tokio 1.32.0", ] [[package]] @@ -6839,9 +6786,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842" dependencies = [ "futures-core", - "pin-project-lite 0.2.13", - "tokio 1.33.0", - "tokio-util 0.7.9", + "pin-project-lite 0.2.12", + "tokio 1.32.0", + "tokio-util 0.7.8", ] [[package]] @@ -6854,7 +6801,7 @@ dependencies = [ "futures-core", "libc", "redox_syscall 0.3.5", - "tokio 1.33.0", + "tokio 1.32.0", "tokio-stream", "xattr", ] @@ -6875,18 +6822,18 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.9" +version = "0.7.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" +checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "futures-core", "futures-io", "futures-sink", "futures-util", "hashbrown 0.12.3", - "pin-project-lite 0.2.13", - "tokio 1.33.0", + "pin-project-lite 0.2.12", + "tokio 1.32.0", "tracing", ] @@ -6907,11 +6854,11 @@ checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" [[package]] name = "toml_edit" -version = "0.19.15" +version = "0.19.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +checksum = "f8123f27e969974a3dfba720fdb560be359f57b44302d280ba72e76a74480e8a" dependencies = [ - "indexmap 2.0.2", + "indexmap 2.0.0", "toml_datetime", "winnow", ] @@ -6930,7 +6877,7 @@ checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" dependencies = [ "cfg-if 1.0.0", "log", - "pin-project-lite 0.2.13", + "pin-project-lite 0.2.12", "tracing-attributes", "tracing-core", ] @@ -6943,7 +6890,7 @@ checksum = "5f4f31f56159e98206da9efd823404b79b6ef3143b4a7ab76e67b1751b25a4ab" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] @@ -6974,7 +6921,7 @@ dependencies = [ "async-trait", "cfg-if 1.0.0", "data-encoding", - "enum-as-inner 0.5.1", + "enum-as-inner", "futures-channel", "futures-io", "futures-util", @@ -6985,32 +6932,7 @@ dependencies = [ "smallvec", "thiserror", "tinyvec", - "tokio 1.33.0", - "tracing", - "url", -] - -[[package]] -name = "trust-dns-proto" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0dc775440033cb114085f6f2437682b194fa7546466024b1037e82a48a052a69" -dependencies = [ - "async-trait", - "cfg-if 1.0.0", - "data-encoding", - "enum-as-inner 0.6.0", - "futures-channel", - "futures-io", - "futures-util", - "idna 0.4.0", - "ipnet", - "once_cell", - "rand 0.8.5", - "smallvec", - "thiserror", - "tinyvec", - "tokio 1.33.0", + "tokio 1.32.0", "tracing", "url", ] @@ -7030,31 +6952,10 @@ dependencies = [ "resolv-conf", "smallvec", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "tokio-openssl", "tracing", - "trust-dns-proto 0.22.0", -] - -[[package]] -name = "trust-dns-resolver" -version = "0.23.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2dff7aed33ef3e8bf2c9966fccdfed93f93d46f432282ea875cd66faabc6ef2f" -dependencies = [ - "cfg-if 1.0.0", - "futures-util", - "ipconfig", - "lru-cache", - "once_cell", - "parking_lot 0.12.1", - "rand 0.8.5", - "resolv-conf", - "smallvec", - "thiserror", - "tokio 1.33.0", - "tracing", - "trust-dns-proto 0.23.0", + "trust-dns-proto", ] [[package]] @@ -7065,9 +6966,9 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" [[package]] name = "typenum" -version = "1.17.0" +version = "1.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" [[package]] name = "ucd-trie" @@ -7100,9 +7001,9 @@ dependencies = [ [[package]] name = "unicase" -version = "2.7.0" +version = "2.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +checksum = "50f37be617794602aabbeee0be4f259dc1778fabe05e2d67ee8f79326d5cb4f6" dependencies = [ "version_check", ] @@ -7115,9 +7016,9 @@ checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "301abaae475aa91687eb82514b328ab47a211a533026cb25fc3e519b86adfc3c" [[package]] name = "unicode-normalization" @@ -7136,9 +7037,9 @@ checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" [[package]] name = "unicode-width" -version = "0.1.11" +version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" [[package]] name = "unicode_categories" @@ -7160,9 +7061,9 @@ checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" [[package]] name = "url" -version = "2.4.1" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "50bff7831e19200a85b17131d085c25d7811bc4e186efdaf54bbd132994a88cb" dependencies = [ "form_urlencoded", "idna 0.4.0", @@ -7222,7 +7123,7 @@ checksum = "e7141e445af09c8919f1d5f8a20dae0b20c3b57a45dee0d5823c6ed5d237f15a" dependencies = [ "bitflags 1.3.2", "chrono", - "rustc_version 0.4.0", + "rustc_version 0.2.3", ] [[package]] @@ -7263,9 +7164,9 @@ dependencies = [ [[package]] name = "walkdir" -version = "2.4.0" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71d857dc86794ca4c280d616f7da00d2dbfd8cd788846559a6813e6aa4b54ee" +checksum = "36df944cda56c7d8d8b7496af378e6b16de9284591917d307c9b4d313c44e698" dependencies = [ "same-file", "winapi-util", @@ -7319,7 +7220,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", "wasm-bindgen-shared", ] @@ -7353,7 +7254,7 @@ checksum = "54681b18a46765f095758388f2d0cf16eb8d4169b639ab575a8f5693af210c7b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -7381,8 +7282,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5388522c899d1e1c96a4c307e3797e0f697ba7c77dd8e0e625ecba9dd0342937" dependencies = [ "arrayvec 0.7.4", - "base64 0.21.4", - "bytes 1.5.0", + "base64 0.21.3", + "bytes 1.4.0", "derive_more", "ethabi", "ethereum-types 0.14.1", @@ -7403,8 +7304,8 @@ dependencies = [ "serde_json", "soketto", "tiny-keccak", - "tokio 1.33.0", - "tokio-util 0.7.9", + "tokio 1.32.0", + "tokio-util 0.7.8", "url", "web3-async-native-tls", ] @@ -7417,26 +7318,38 @@ checksum = "1f6d8d1636b2627fe63518d5a9b38a569405d9c9bc665c43c9c341de57227ebb" dependencies = [ "native-tls", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "url", ] +[[package]] +name = "webpki" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f095d78192e208183081cc07bc5515ef55216397af48b873e5edcd72637fa1bd" +dependencies = [ + "ring", + "untrusted", +] + [[package]] name = "webpki-roots" -version = "0.25.2" +version = "0.22.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14247bb57be4f377dfb94c72830b8ce8fc6beac03cf4bf7b9732eadd414123fc" +checksum = "b6c71e40d7d2c34a5106301fb632274ca37242cd0c9d3e64dbece371a40a2d87" +dependencies = [ + "webpki", +] [[package]] name = "which" -version = "4.4.2" +version = "4.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" dependencies = [ "either", - "home", + "libc", "once_cell", - "rustix", ] [[package]] @@ -7481,9 +7394,9 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.6" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" dependencies = [ "winapi 0.3.9", ] @@ -7500,7 +7413,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" dependencies = [ - "windows-targets 0.48.5", + "windows-targets 0.48.4", ] [[package]] @@ -7518,7 +7431,7 @@ version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" dependencies = [ - "windows-targets 0.48.5", + "windows-targets 0.48.4", ] [[package]] @@ -7538,17 +7451,17 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.48.5" +version = "0.48.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +checksum = "d92ecb8ae0317859f509f17b19adc74b0763b0fa3b085dea8ed01085c8dac222" dependencies = [ - "windows_aarch64_gnullvm 0.48.5", - "windows_aarch64_msvc 0.48.5", - "windows_i686_gnu 0.48.5", - "windows_i686_msvc 0.48.5", - "windows_x86_64_gnu 0.48.5", - "windows_x86_64_gnullvm 0.48.5", - "windows_x86_64_msvc 0.48.5", + "windows_aarch64_gnullvm 0.48.4", + "windows_aarch64_msvc 0.48.4", + "windows_i686_gnu 0.48.4", + "windows_i686_msvc 0.48.4", + "windows_x86_64_gnu 0.48.4", + "windows_x86_64_gnullvm 0.48.4", + "windows_x86_64_msvc 0.48.4", ] [[package]] @@ -7559,9 +7472,9 @@ checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" [[package]] name = "windows_aarch64_gnullvm" -version = "0.48.5" +version = "0.48.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +checksum = "d14b0ee96970be7108701212f097ce67ca772fd84cb0ffbc86d26a94e77ba929" [[package]] name = "windows_aarch64_msvc" @@ -7571,9 +7484,9 @@ checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" [[package]] name = "windows_aarch64_msvc" -version = "0.48.5" +version = "0.48.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +checksum = "1332277d49f440c8fc6014941e320ee47ededfcce10cb272728470f56cc092c9" [[package]] name = "windows_i686_gnu" @@ -7583,9 +7496,9 @@ checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" [[package]] name = "windows_i686_gnu" -version = "0.48.5" +version = "0.48.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +checksum = "d992130ac399d56f02c20564e9975ac5ba08cb25cb832849bbc0d736a101abe5" [[package]] name = "windows_i686_msvc" @@ -7595,9 +7508,9 @@ checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" [[package]] name = "windows_i686_msvc" -version = "0.48.5" +version = "0.48.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +checksum = "962e96d0fa4b4773c63977977ea6564f463fb10e34a6e07360428b53ae7a3f71" [[package]] name = "windows_x86_64_gnu" @@ -7607,9 +7520,9 @@ checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" [[package]] name = "windows_x86_64_gnu" -version = "0.48.5" +version = "0.48.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +checksum = "30652a53018a48a9735fbc2986ff0446c37bc8bed0d3f98a0ed4d04cdb80027e" [[package]] name = "windows_x86_64_gnullvm" @@ -7619,9 +7532,9 @@ checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" [[package]] name = "windows_x86_64_gnullvm" -version = "0.48.5" +version = "0.48.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +checksum = "b5bb3f0331abfe1a95af56067f1e64b3791b55b5373b03869560b6025de809bf" [[package]] name = "windows_x86_64_msvc" @@ -7631,19 +7544,28 @@ checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" [[package]] name = "windows_x86_64_msvc" -version = "0.48.5" +version = "0.48.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +checksum = "bd1df36d9fd0bbe4849461de9b969f765170f4e0f90497d580a235d515722b10" [[package]] name = "winnow" -version = "0.5.16" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "037711d82167854aff2018dfd193aa0fef5370f456732f0d5a0c59b0f1b4b907" +checksum = "d09770118a7eb1ccaf4a594a221334119a44a814fcb0d31c5b85e83e97227a97" dependencies = [ "memchr", ] +[[package]] +name = "winreg" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d0f4e272c85def139476380b12f9ac60926689dd2e01d4923222f40580869d" +dependencies = [ + "winapi 0.3.9", +] + [[package]] name = "winreg" version = "0.50.0" @@ -7722,7 +7644,7 @@ dependencies = [ "shlex 0.1.1", "structopt", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "tokio-stream", "uuid 0.8.2", "ya-client-model", @@ -7760,7 +7682,7 @@ dependencies = [ "serde", "serde_json", "serde_yaml 0.9.25", - "shlex 1.2.0", + "shlex 1.1.0", "tempdir", "thiserror", "ya-client-model", @@ -7773,7 +7695,7 @@ source = "git+https://github.com/golemfactory/ya-client.git?rev=2bb679e3bb1d61ed dependencies = [ "actix-codec", "awc", - "bytes 1.5.0", + "bytes 1.4.0", "chrono", "envy", "futures 0.3.28", @@ -7862,7 +7784,7 @@ dependencies = [ "log", "maplit", "serde_json", - "tokio 1.33.0", + "tokio 1.32.0", "uuid 0.8.2", "ya-client-model", "ya-core-model", @@ -7902,11 +7824,11 @@ dependencies = [ "serde_json", "sha3 0.8.2", "structopt", - "test-case 3.2.1", + "test-case 3.1.0", "thiserror", "tiny-keccak", - "tokio 1.33.0", - "trust-dns-resolver 0.22.0", + "tokio 1.32.0", + "trust-dns-resolver", "url", "uuid 0.8.2", "web3", @@ -7949,8 +7871,8 @@ dependencies = [ "structopt", "thiserror", "tiny-keccak", - "tokio 1.33.0", - "tokio-util 0.7.9", + "tokio 1.32.0", + "tokio-util 0.7.8", "uuid 0.8.2", "web3", "ya-client-model", @@ -7970,7 +7892,7 @@ dependencies = [ "actix-web", "anyhow", "async-trait", - "bytes 1.5.0", + "bytes 1.4.0", "chrono", "derivative", "derive_more", @@ -8001,9 +7923,9 @@ dependencies = [ "structopt", "tempdir", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "tokio-stream", - "tokio-util 0.7.9", + "tokio-util 0.7.8", "url", "winapi 0.3.9", "ya-agreement-utils 0.4.1", @@ -8061,8 +7983,8 @@ dependencies = [ "actix-web-actors", "anyhow", "awc", - "base64 0.21.4", - "bytes 1.5.0", + "base64 0.21.3", + "bytes 1.4.0", "ctor", "env_logger 0.10.0", "flexbuffers", @@ -8072,9 +7994,9 @@ dependencies = [ "serde", "serde_json", "serial_test 1.0.0", - "test-case 3.2.1", + "test-case 3.1.0", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "uuid 1.4.1", "ya-client-model", "ya-core-model", @@ -8114,7 +8036,7 @@ dependencies = [ "sha2 0.9.9", "structopt", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "uuid 0.8.2", "ya-client-model", "ya-core-model", @@ -8143,7 +8065,7 @@ name = "ya-manifest-utils" version = "0.2.0" dependencies = [ "anyhow", - "base64 0.21.4", + "base64 0.21.3", "chrono", "golem-certificate", "hex", @@ -8154,18 +8076,18 @@ dependencies = [ "pretty_assertions", "regex", "schemars", - "semver 1.0.20", + "semver 1.0.18", "serde", "serde_json", "serde_yaml 0.9.25", "serial_test 2.0.0", - "shlex 1.2.0", + "shlex 1.1.0", "snailquote", "structopt", "strum", "tar", "tempfile", - "test-case 3.2.1", + "test-case 3.1.0", "thiserror", "url", "ya-agreement-utils 0.4.1", @@ -8212,7 +8134,7 @@ dependencies = [ "strum", "strum_macros", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "uuid 0.8.2", "ya-agreement-utils 0.5.0", "ya-client", @@ -8262,7 +8184,7 @@ dependencies = [ "metrics-runtime", "percent-encoding", "structopt", - "tokio 1.33.0", + "tokio 1.32.0", "url", "ya-core-model", "ya-service-api", @@ -8277,7 +8199,7 @@ dependencies = [ "actix", "actix-web", "anyhow", - "bytes 1.5.0", + "bytes 1.4.0", "chrono", "env_logger 0.7.1", "ethsign", @@ -8294,9 +8216,9 @@ dependencies = [ "strum", "test-case 2.2.2", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "tokio-stream", - "tokio-util 0.7.9", + "tokio-util 0.7.8", "url", "ya-client-model", "ya-core-model", @@ -8362,7 +8284,7 @@ dependencies = [ "serde_json", "structopt", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "uint 0.7.1", "uuid 0.8.2", "ya-agreement-utils 0.5.0", @@ -8404,7 +8326,7 @@ dependencies = [ "r2d2", "sha3 0.9.1", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "ya-client-model", "ya-core-model", "ya-persistence", @@ -8428,7 +8350,7 @@ dependencies = [ "tempdir", "test-case 2.2.2", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "ya-client-model", "ya-core-model", "ya-service-api", @@ -8477,7 +8399,7 @@ dependencies = [ "serde_json", "serial_test 0.9.0", "shared_child", - "shlex 1.2.0", + "shlex 1.1.0", "signal-hook", "structopt", "strum", @@ -8487,7 +8409,7 @@ dependencies = [ "tempfile", "test-case 2.2.2", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "tokio-stream", "url", "walkdir", @@ -8521,7 +8443,7 @@ dependencies = [ "humantime 2.1.0", "log", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "tokio-stream", "url", "ya-packet-trace 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -8552,8 +8474,8 @@ dependencies = [ "sha2 0.9.9", "sha3 0.9.1", "thiserror", - "tokio 1.33.0", - "tokio-util 0.7.9", + "tokio 1.32.0", + "tokio-util 0.7.8", "url", "uuid 0.8.2", "ya-client-model", @@ -8568,15 +8490,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5d0d9cf0deab658d8efc643fec135e1aa37856aa6a68ee6387e039f568a7dc27" dependencies = [ "anyhow", - "bytes 1.5.0", + "bytes 1.4.0", "derive_more", "futures 0.3.28", "prost 0.10.4", "prost-build 0.10.4", "rand 0.8.5", "thiserror", - "tokio 1.33.0", - "tokio-util 0.7.9", + "tokio 1.32.0", + "tokio-util 0.7.8", "ya-relay-util", ] @@ -8594,7 +8516,7 @@ dependencies = [ "num-traits", "rand 0.8.5", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "tokio-stream", "ya-relay-util", "ya-smoltcp", @@ -8606,7 +8528,7 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "306a73f6ce2286987c9da25bc0c2ef81f4f0b2b58bb8d9aeedc34d27407603ff" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "derive_more", ] @@ -8615,7 +8537,7 @@ name = "ya-runtime-api" version = "0.7.1" dependencies = [ "anyhow", - "bytes 1.5.0", + "bytes 1.4.0", "env_logger 0.7.1", "futures 0.3.28", "log", @@ -8623,8 +8545,8 @@ dependencies = [ "prost-build 0.10.4", "serde", "serde_json", - "tokio 1.33.0", - "tokio-util 0.7.9", + "tokio 1.32.0", + "tokio-util 0.7.8", "url", ] @@ -8633,12 +8555,12 @@ name = "ya-sb-proto" version = "0.6.1" source = "git+https://github.com/golemfactory/ya-service-bus.git?rev=190f0d772f7ed0830d54a2cef77d7a177f276c68#190f0d772f7ed0830d54a2cef77d7a177f276c68" dependencies = [ - "bytes 1.5.0", + "bytes 1.4.0", "prost 0.10.4", "prost-build 0.7.0", "thiserror", - "tokio 1.33.0", - "tokio-util 0.7.9", + "tokio 1.32.0", + "tokio-util 0.7.8", "url", ] @@ -8661,9 +8583,9 @@ dependencies = [ "pin-project 1.1.3", "prost 0.10.4", "structopt", - "tokio 1.33.0", + "tokio 1.32.0", "tokio-stream", - "tokio-util 0.7.9", + "tokio-util 0.7.8", "url", "uuid 0.8.2", "ya-sb-proto", @@ -8764,8 +8686,8 @@ dependencies = [ "semver 0.11.0", "serde", "thiserror", - "tokio 1.33.0", - "tokio-util 0.7.9", + "tokio 1.32.0", + "tokio-util 0.7.8", "url", "uuid 0.8.2", "ya-packet-trace 0.1.0 (git+https://github.com/golemfactory/ya-packet-trace)", @@ -8818,7 +8740,7 @@ dependencies = [ "serde", "serde_json", "serial_test 0.5.1", - "tokio 1.33.0", + "tokio 1.32.0", "url", "ya-framework-macro", "ya-utils-process", @@ -8834,13 +8756,13 @@ dependencies = [ "anyhow", "async-compression", "awc", - "bytes 1.5.0", + "bytes 1.4.0", "crossterm 0.26.1", "env_logger 0.7.1", "futures 0.3.28", "gftp", "globset", - "h2 0.3.21", + "h2 0.3.20", "hex", "lazy_static", "log", @@ -8853,9 +8775,9 @@ dependencies = [ "structopt", "tempdir", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "tokio-tar", - "tokio-util 0.7.9", + "tokio-util 0.7.8", "url", "walkdir", "ya-client-model", @@ -8875,7 +8797,7 @@ dependencies = [ "chrono", "futures 0.3.28", "log", - "tokio 1.33.0", + "tokio 1.32.0", ] [[package]] @@ -8895,7 +8817,7 @@ name = "ya-utils-futures" version = "0.2.0" dependencies = [ "futures 0.3.28", - "tokio 1.33.0", + "tokio 1.32.0", ] [[package]] @@ -8909,7 +8831,7 @@ dependencies = [ "log", "regex", "thiserror", - "trust-dns-resolver 0.22.0", + "trust-dns-resolver", "url", "ya-relay-stack", ] @@ -8936,7 +8858,7 @@ dependencies = [ "libc", "nix 0.22.3", "shared_child", - "tokio 1.33.0", + "tokio 1.32.0", ] [[package]] @@ -8962,7 +8884,7 @@ dependencies = [ "serde_json", "structopt", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "ya-client", "ya-compile-time-utils", "ya-core-model", @@ -8981,7 +8903,7 @@ dependencies = [ "actix-web", "actix-web-actors", "anyhow", - "bytes 1.5.0", + "bytes 1.4.0", "env_logger 0.7.1", "futures 0.3.28", "hex", @@ -8995,7 +8917,7 @@ dependencies = [ "sha3 0.8.2", "structopt", "thiserror", - "tokio 1.33.0", + "tokio 1.32.0", "tokio-stream", "url", "uuid 0.8.2", @@ -9035,9 +8957,9 @@ dependencies = [ "serde", "serde_json", "structopt", - "tokio 1.33.0", + "tokio 1.32.0", "tokio-stream", - "tokio-util 0.7.9", + "tokio-util 0.7.8", "url", "ya-activity", "ya-client", @@ -9106,7 +9028,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.38", + "syn 2.0.29", ] [[package]] @@ -9121,7 +9043,7 @@ dependencies = [ "flate2", "thiserror", "time 0.1.45", - "tokio 1.33.0", + "tokio 1.32.0", "tokio-byteorder", ] @@ -9146,10 +9068,11 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.9+zstd.1.5.5" +version = "2.0.8+zstd.1.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e16efa8a874a0481a574084d34cc26fdb3b99627480f785888deb6386506656" +checksum = "5556e6ee25d32df2586c098bbfa278803692a20d0ab9565e049480d52707ec8c" dependencies = [ "cc", + "libc", "pkg-config", ] From 0dca7fcadbe4d1a569d66eebe3b56d8606b22e03 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Thu, 12 Oct 2023 15:54:52 +0200 Subject: [PATCH 100/123] Updated erc20lib version to 0.2.2 --- Cargo.lock | 7 ++++--- Cargo.toml | 4 ++-- core/payment-driver/erc20next/src/service.rs | 1 + 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 887a91764d..b93cdff392 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1868,8 +1868,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" -version = "0.2.1" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=d9ec1ac66778e2d02a8ed2eacccc9b02a62ead97#d9ec1ac66778e2d02a8ed2eacccc9b02a62ead97" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16d9de2b71b7965e559c531299953f7b4b54686f823796ad83d634a178a549d" dependencies = [ "actix-files", "actix-web", @@ -7123,7 +7124,7 @@ checksum = "e7141e445af09c8919f1d5f8a20dae0b20c3b57a45dee0d5823c6ed5d237f15a" dependencies = [ "bitflags 1.3.2", "chrono", - "rustc_version 0.2.3", + "rustc_version 0.4.0", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 068f62a401..f4bf7d4fbb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -224,9 +224,9 @@ members = [ # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "d9ec1ac66778e2d02a8ed2eacccc9b02a62ead97" } +#erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "d9ec1ac66778e2d02a8ed2eacccc9b02a62ead97" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } -#erc20_payment_lib = { version = "=0.1.9" } +erc20_payment_lib = { version = "=0.2.2" } rand = "0.8.5" url = "2.3.1" trust-dns-resolver = "0.22" diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index c7d246ea17..8124610c6d 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -45,6 +45,7 @@ impl Erc20NextService { contract_use_direct_method: true, contract_use_unpacked_method: false, use_transfer_for_single_payment: true, + skip_service_loop: false, }; let mut config = config::Config::load_from_str(include_str!("../config-payments.toml")) From c125d50fa53d6895d45706af433cfe3b7b0f77e9 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Wed, 18 Oct 2023 19:11:21 +0200 Subject: [PATCH 101/123] Include fix in erc20payment lib --- Cargo.lock | 3 +-- Cargo.toml | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index b93cdff392..3997b62ba8 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1869,8 +1869,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d16d9de2b71b7965e559c531299953f7b4b54686f823796ad83d634a178a549d" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=db687bd081e628e4301c61b4c4891e860fe85e69#db687bd081e628e4301c61b4c4891e860fe85e69" dependencies = [ "actix-files", "actix-web", diff --git a/Cargo.toml b/Cargo.toml index f4bf7d4fbb..e5ae260554 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -224,9 +224,9 @@ members = [ # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -#erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "d9ec1ac66778e2d02a8ed2eacccc9b02a62ead97" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "db687bd081e628e4301c61b4c4891e860fe85e69" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } -erc20_payment_lib = { version = "=0.2.2" } +#erc20_payment_lib = { version = "=0.2.2" } rand = "0.8.5" url = "2.3.1" trust-dns-resolver = "0.22" From a216a2af59664feb438f9336d7aafb88bd47c283 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Wed, 18 Oct 2023 20:31:50 +0200 Subject: [PATCH 102/123] Update lib version --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3997b62ba8..aa435e3c28 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1869,7 +1869,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.2.2" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=db687bd081e628e4301c61b4c4891e860fe85e69#db687bd081e628e4301c61b4c4891e860fe85e69" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=9043ceafacdfaced80c3717c76a87d1ea91294df#9043ceafacdfaced80c3717c76a87d1ea91294df" dependencies = [ "actix-files", "actix-web", diff --git a/Cargo.toml b/Cargo.toml index e5ae260554..174b362172 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -224,7 +224,7 @@ members = [ # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "db687bd081e628e4301c61b4c4891e860fe85e69" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "9043ceafacdfaced80c3717c76a87d1ea91294df" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.2.2" } rand = "0.8.5" From 35342b692a8c6bb3f28bcc604658b46bc0ace382 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Wed, 18 Oct 2023 20:48:23 +0200 Subject: [PATCH 103/123] update lib --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aa435e3c28..b7e0e3960a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1869,7 +1869,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.2.2" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=9043ceafacdfaced80c3717c76a87d1ea91294df#9043ceafacdfaced80c3717c76a87d1ea91294df" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=eca355f270f55cfa7f9551b4b8690e84f7834138#eca355f270f55cfa7f9551b4b8690e84f7834138" dependencies = [ "actix-files", "actix-web", diff --git a/Cargo.toml b/Cargo.toml index 174b362172..4ce8220b3d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -224,7 +224,7 @@ members = [ # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "9043ceafacdfaced80c3717c76a87d1ea91294df" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "eca355f270f55cfa7f9551b4b8690e84f7834138" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.2.2" } rand = "0.8.5" From b743116cf2c92801ccba9217660624171ed23189 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 20 Oct 2023 11:21:03 +0200 Subject: [PATCH 104/123] Fix accept Invoice for unreachable Providers (#2855) payment: Send payments ignoring Accept GSB call failures This change adds the following features: * Accepting payments proceeds even if GSB calls fail. * AcceptInvoice, AcceptDebitNote and SendPayment calls will be batched and sent to provider later on if they fail. * Provider requests synchronization from requestors who have outstanding invoices on startup. Changelog: * Database changes: * Add send_accept column to pay_{invoice,debit_note}. * Add send_payment to pay_payment. * Add indices for quick searching of those tables by the new columns. * Add pay_sync_needed_notifs table: * node id * last sent timestamp * number of retries * Model changes: * PaymentSync message for pushing unsend messages from requestor to provider. * PaymentSyncRequest so that the provider can request sync from requestor. * Modify accept endpoint to proceed with payment and only then send the Accept messages. If sending the message fails, it will remain marked as not sent. * Modify notify_payment so that the SendPayment messages will be marked as not sent on failure. * Implement periodic sending of PaymentSync messages from requestor to providers who couldn't be reached earlier. The backoff on failure is exponential. * Implement a startup job which notifies requestors with outstanding invoices/debit_notes using the PaymentSyncRequest message. --- Cargo.lock | 43 ++-- core/model/src/payment.rs | 56 +++++ core/payment/Cargo.toml | 1 + .../2023-10-16-123456_send_accept/down.sql | 9 + .../2023-10-16-123456_send_accept/up.sql | 13 + core/payment/src/api/debit_notes.rs | 36 ++- core/payment/src/api/invoices.rs | 30 ++- core/payment/src/dao.rs | 2 + core/payment/src/dao/debit_note.rs | 101 +++++++- core/payment/src/dao/invoice.rs | 83 +++++++ core/payment/src/dao/payment.rs | 38 +++ core/payment/src/dao/sync_notifs.rs | 71 ++++++ core/payment/src/lib.rs | 1 + core/payment/src/models.rs | 1 + core/payment/src/models/payment.rs | 4 + core/payment/src/models/sync_notifs.rs | 37 +++ core/payment/src/payment_sync.rs | 226 ++++++++++++++++++ core/payment/src/processor.rs | 64 ++++- core/payment/src/schema.rs | 11 + core/payment/src/service.rs | 82 ++++++- 20 files changed, 855 insertions(+), 54 deletions(-) create mode 100644 core/payment/migrations/2023-10-16-123456_send_accept/down.sql create mode 100644 core/payment/migrations/2023-10-16-123456_send_accept/up.sql create mode 100644 core/payment/src/dao/sync_notifs.rs create mode 100644 core/payment/src/models/sync_notifs.rs create mode 100644 core/payment/src/payment_sync.rs diff --git a/Cargo.lock b/Cargo.lock index b7e0e3960a..aa8b800d71 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -23,7 +23,7 @@ dependencies = [ "pin-project-lite 0.2.12", "smallvec", "tokio 1.32.0", - "tokio-util 0.7.8", + "tokio-util 0.7.9", ] [[package]] @@ -39,7 +39,7 @@ dependencies = [ "memchr", "pin-project-lite 0.2.12", "tokio 1.32.0", - "tokio-util 0.7.8", + "tokio-util 0.7.9", "tracing", ] @@ -116,7 +116,7 @@ dependencies = [ "sha1", "smallvec", "tokio 1.32.0", - "tokio-util 0.7.8", + "tokio-util 0.7.9", "tracing", "zstd", ] @@ -248,7 +248,7 @@ dependencies = [ "openssl", "pin-project-lite 0.2.12", "tokio-openssl", - "tokio-util 0.7.8", + "tokio-util 0.7.9", ] [[package]] @@ -318,7 +318,7 @@ dependencies = [ "futures-core", "pin-project-lite 0.2.12", "tokio 1.32.0", - "tokio-util 0.7.8", + "tokio-util 0.7.9", ] [[package]] @@ -2676,7 +2676,7 @@ dependencies = [ "indexmap 1.9.3", "slab", "tokio 1.32.0", - "tokio-util 0.7.8", + "tokio-util 0.7.9", "tracing", ] @@ -6788,7 +6788,7 @@ dependencies = [ "futures-core", "pin-project-lite 0.2.12", "tokio 1.32.0", - "tokio-util 0.7.8", + "tokio-util 0.7.9", ] [[package]] @@ -6822,9 +6822,9 @@ dependencies = [ [[package]] name = "tokio-util" -version = "0.7.8" +version = "0.7.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d" +checksum = "1d68074620f57a0b21594d9735eb2e98ab38b17f80d3fcb189fca266771ca60d" dependencies = [ "bytes 1.4.0", "futures-core", @@ -7305,7 +7305,7 @@ dependencies = [ "soketto", "tiny-keccak", "tokio 1.32.0", - "tokio-util 0.7.8", + "tokio-util 0.7.9", "url", "web3-async-native-tls", ] @@ -7872,7 +7872,7 @@ dependencies = [ "thiserror", "tiny-keccak", "tokio 1.32.0", - "tokio-util 0.7.8", + "tokio-util 0.7.9", "uuid 0.8.2", "web3", "ya-client-model", @@ -7925,7 +7925,7 @@ dependencies = [ "thiserror", "tokio 1.32.0", "tokio-stream", - "tokio-util 0.7.8", + "tokio-util 0.7.9", "url", "winapi 0.3.9", "ya-agreement-utils 0.4.1", @@ -8218,7 +8218,7 @@ dependencies = [ "thiserror", "tokio 1.32.0", "tokio-stream", - "tokio-util 0.7.8", + "tokio-util 0.7.9", "url", "ya-client-model", "ya-core-model", @@ -8285,6 +8285,7 @@ dependencies = [ "structopt", "thiserror", "tokio 1.32.0", + "tokio-util 0.7.9", "uint 0.7.1", "uuid 0.8.2", "ya-agreement-utils 0.5.0", @@ -8475,7 +8476,7 @@ dependencies = [ "sha3 0.9.1", "thiserror", "tokio 1.32.0", - "tokio-util 0.7.8", + "tokio-util 0.7.9", "url", "uuid 0.8.2", "ya-client-model", @@ -8498,7 +8499,7 @@ dependencies = [ "rand 0.8.5", "thiserror", "tokio 1.32.0", - "tokio-util 0.7.8", + "tokio-util 0.7.9", "ya-relay-util", ] @@ -8546,7 +8547,7 @@ dependencies = [ "serde", "serde_json", "tokio 1.32.0", - "tokio-util 0.7.8", + "tokio-util 0.7.9", "url", ] @@ -8560,7 +8561,7 @@ dependencies = [ "prost-build 0.7.0", "thiserror", "tokio 1.32.0", - "tokio-util 0.7.8", + "tokio-util 0.7.9", "url", ] @@ -8585,7 +8586,7 @@ dependencies = [ "structopt", "tokio 1.32.0", "tokio-stream", - "tokio-util 0.7.8", + "tokio-util 0.7.9", "url", "uuid 0.8.2", "ya-sb-proto", @@ -8687,7 +8688,7 @@ dependencies = [ "serde", "thiserror", "tokio 1.32.0", - "tokio-util 0.7.8", + "tokio-util 0.7.9", "url", "uuid 0.8.2", "ya-packet-trace 0.1.0 (git+https://github.com/golemfactory/ya-packet-trace)", @@ -8777,7 +8778,7 @@ dependencies = [ "thiserror", "tokio 1.32.0", "tokio-tar", - "tokio-util 0.7.8", + "tokio-util 0.7.9", "url", "walkdir", "ya-client-model", @@ -8959,7 +8960,7 @@ dependencies = [ "structopt", "tokio 1.32.0", "tokio-stream", - "tokio-util 0.7.8", + "tokio-util 0.7.9", "url", "ya-activity", "ya-client", diff --git a/core/model/src/payment.rs b/core/model/src/payment.rs index 6409e79b80..916e81e324 100644 --- a/core/model/src/payment.rs +++ b/core/model/src/payment.rs @@ -729,4 +729,60 @@ pub mod public { type Item = Ack; type Error = SendError; } + + // **************************** SYNC ***************************** + + /// Push unsynchronized state + #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] + pub struct PaymentSync { + /// Payment confirmations. + pub payments: Vec, + /// Invoice acceptances. + pub invoice_accepts: Vec, + /// Debit note acceptances. + /// + /// Only last debit note in chain is included per agreement. + pub debit_note_accepts: Vec, + } + + /// Sync error + #[derive(Clone, Debug, Default, Serialize, Deserialize)] + pub struct PaymentSyncError { + pub payment_send_errors: Vec, + pub accept_errors: Vec, + } + + impl std::fmt::Display for PaymentSyncError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.write_str("PaymentSend errors: ")?; + for send_e in &self.payment_send_errors { + write!(f, "{}, ", send_e)?; + } + + f.write_str("Acceptance errors: ")?; + for accept_e in &self.accept_errors { + write!(f, "{}, ", accept_e)?; + } + + Ok(()) + } + } + + impl std::error::Error for PaymentSyncError {} + + impl RpcMessage for PaymentSync { + const ID: &'static str = "PaymentSync"; + type Item = Ack; + type Error = PaymentSyncError; + } + + /// Informs the other side that it should request [`PaymentSync`] + #[derive(Clone, Debug, PartialEq, Serialize, Deserialize)] + pub struct PaymentSyncRequest; + + impl RpcMessage for PaymentSyncRequest { + const ID: &'static str = "PaymentSyncNeeded"; + type Item = Ack; + type Error = SendError; + } } diff --git a/core/payment/Cargo.toml b/core/payment/Cargo.toml index 00388cbda6..0232b9f8f2 100644 --- a/core/payment/Cargo.toml +++ b/core/payment/Cargo.toml @@ -52,6 +52,7 @@ serde_json = "1.0" structopt = "0.3" thiserror = "1.0" tokio = { version = "1", features = ["fs", "signal", "macros"] } +tokio-util = { version = "0.7.9", features = ["rt"] } uint = "0.7" uuid = { version = "0.8", features = ["v4"] } humantime = "2.0.1" diff --git a/core/payment/migrations/2023-10-16-123456_send_accept/down.sql b/core/payment/migrations/2023-10-16-123456_send_accept/down.sql new file mode 100644 index 0000000000..00c2b3c9b0 --- /dev/null +++ b/core/payment/migrations/2023-10-16-123456_send_accept/down.sql @@ -0,0 +1,9 @@ +DROP INDEX pay_invoice_send_accept_idx; +DROP INDEX pay_debit_note_send_accept_idx; +DROP INDEX pay_payment_send_payment_idx; + +ALTER TABLE pay_invoice REMOVE COLUMN send_accept; +ALTER TABLE pay_debit_note REMOVE COLUMN send_accept; +ALTER TABLE pay_payment REMOVE COLUMN send_payment; + +DROP TABLE pay_sync_needed_notifs; \ No newline at end of file diff --git a/core/payment/migrations/2023-10-16-123456_send_accept/up.sql b/core/payment/migrations/2023-10-16-123456_send_accept/up.sql new file mode 100644 index 0000000000..27ce331d9f --- /dev/null +++ b/core/payment/migrations/2023-10-16-123456_send_accept/up.sql @@ -0,0 +1,13 @@ +ALTER TABLE pay_invoice ADD COLUMN send_accept BOOLEAN NOT NULL DEFAULT FALSE; +ALTER TABLE pay_debit_note ADD COLUMN send_accept BOOLEAN NOT NULL DEFAULT FALSE; +ALTER TABLE pay_payment ADD COLUMN send_payment BOOLEAN NOT NULL DEFAULT FALSE; + +CREATE INDEX pay_invoice_send_accept_idx ON pay_invoice (send_accept); +CREATE INDEX pay_debit_note_send_accept_idx ON pay_debit_note (send_accept); +CREATE INDEX pay_payment_send_payment_idx ON pay_payment (send_payment); + +CREATE TABLE pay_sync_needed_notifs( + id VARCHAR(50) NOT NULL PRIMARY KEY, + last_ping DATETIME NOT NULL DEFAULT(STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW')), + retries INT NOT NULL DEFAULT(0) +); \ No newline at end of file diff --git a/core/payment/src/api/debit_notes.rs b/core/payment/src/api/debit_notes.rs index a617d7912c..e37b207732 100644 --- a/core/payment/src/api/debit_notes.rs +++ b/core/payment/src/api/debit_notes.rs @@ -23,6 +23,7 @@ use ya_service_bus::{typed as bus, RpcEndpoint}; // Local uses use crate::dao::*; use crate::error::{DbError, Error}; +use crate::payment_sync::SYNC_NOTIFS_NOTIFY; use crate::utils::provider::get_agreement_for_activity; use crate::utils::*; @@ -302,6 +303,8 @@ async fn accept_debit_note( counter!("payment.debit_notes.requestor.accepted.call", 1); let dao: DebitNoteDao = db.as_dao(); + let sync_dao: SyncNotifsDao = db.as_dao(); + log::trace!("Querying DB for Debit Note [{}]", debit_note_id); let debit_note: DebitNote = match dao.get(debit_note_id.clone(), node_id).await { Ok(Some(debit_note)) => debit_note, @@ -377,23 +380,38 @@ async fn accept_debit_note( let schedule_msg = SchedulePayment::from_debit_note(debit_note, allocation_id, amount_to_pay); match async move { - log::trace!( + // Schedule payment (will be none for amount=0, which is OK) + if let Some(msg) = schedule_msg { + log::trace!("Calling SchedulePayment [{}] locally", debit_note_id); + bus::service(LOCAL_SERVICE).send(msg).await??; + } + + // Mark the debit note as accepted in DB + log::trace!("Accepting DebitNote [{}] in DB", debit_note_id); + dao.accept(debit_note_id.clone(), node_id).await?; + log::trace!("DebitNote accepted successfully for [{}]", debit_note_id); + + log::debug!( "Sending AcceptDebitNote [{}] to [{}]", debit_note_id, issuer_id ); - ya_net::from(node_id) + let send_result = ya_net::from(node_id) .to(issuer_id) .service(PUBLIC_SERVICE) .call(accept_msg) - .await??; - if let Some(msg) = schedule_msg { - log::trace!("Calling SchedulePayment [{}] locally", debit_note_id); - bus::service(LOCAL_SERVICE).send(msg).await??; + .await; + + if let Ok(response) = send_result { + log::debug!("AcceptDebitNote delivered"); + dao.mark_accept_sent(debit_note_id.clone(), node_id).await?; + response?; + } else { + log::debug!("AcceptDebitNote not delivered"); + sync_dao.upsert(node_id).await?; + SYNC_NOTIFS_NOTIFY.notify_one(); } - log::trace!("Accepting Debit Note [{}] in DB", debit_note_id); - dao.accept(debit_note_id.clone(), node_id).await?; - log::trace!("Debit Note accepted successfully for [{}]", debit_note_id); + Ok(()) } .timeout(Some(timeout)) diff --git a/core/payment/src/api/invoices.rs b/core/payment/src/api/invoices.rs index 798c6c03ab..0b2aaff367 100644 --- a/core/payment/src/api/invoices.rs +++ b/core/payment/src/api/invoices.rs @@ -24,6 +24,7 @@ use ya_service_bus::{typed as bus, RpcEndpoint}; // Local uses use crate::dao::*; use crate::error::{DbError, Error}; +use crate::payment_sync::SYNC_NOTIFS_NOTIFY; use crate::utils::provider::get_agreement_id; use crate::utils::*; @@ -366,6 +367,7 @@ async fn accept_invoice( counter!("payment.invoices.requestor.accepted.call", 1); let dao: InvoiceDao = db.as_dao(); + let sync_dao: SyncNotifsDao = db.as_dao(); log::trace!("Querying DB for Invoice [{}]", invoice_id); let invoice = match dao.get(invoice_id.clone(), node_id).await { @@ -455,20 +457,34 @@ async fn accept_invoice( let accept_msg = AcceptInvoice::new(invoice_id.clone(), acceptance, issuer_id); let schedule_msg = SchedulePayment::from_invoice(invoice, allocation_id, amount_to_pay); match async move { - log::debug!("Sending AcceptInvoice [{}] to [{}]", invoice_id, issuer_id); - ya_net::from(node_id) - .to(issuer_id) - .service(PUBLIC_SERVICE) - .call(accept_msg) - .await??; - // Skip calling SchedulePayment for 0 amount invoices + // Schedule payment (will be none for amount=0, which is OK) if let Some(msg) = schedule_msg { log::trace!("Calling SchedulePayment [{}] locally", invoice_id); bus::service(LOCAL_SERVICE).send(msg).await??; } + + // Mark the invoice as accepted in DB log::trace!("Accepting Invoice [{}] in DB", invoice_id); dao.accept(invoice_id.clone(), node_id).await?; log::trace!("Invoice accepted successfully for [{}]", invoice_id); + + log::debug!("Sending AcceptInvoice [{}] to [{}]", invoice_id, issuer_id); + let send_result = ya_net::from(node_id) + .to(issuer_id) + .service(PUBLIC_SERVICE) + .call(accept_msg) + .await; + + if let Ok(response) = send_result { + log::debug!("AcceptInvoice delivered"); + dao.mark_accept_sent(invoice_id.clone(), node_id).await?; + response?; + } else { + log::debug!("AcceptInvoice not delivered"); + sync_dao.upsert(node_id).await?; + SYNC_NOTIFS_NOTIFY.notify_one(); + } + Ok(()) } .timeout(Some(timeout)) diff --git a/core/payment/src/dao.rs b/core/payment/src/dao.rs index cc258879db..f694c9f650 100644 --- a/core/payment/src/dao.rs +++ b/core/payment/src/dao.rs @@ -7,6 +7,7 @@ mod invoice; mod invoice_event; mod order; mod payment; +mod sync_notifs; pub use self::activity::ActivityDao; pub use self::agreement::AgreementDao; @@ -19,3 +20,4 @@ pub use self::invoice::InvoiceDao; pub use self::invoice_event::InvoiceEventDao; pub use self::order::OrderDao; pub use self::payment::PaymentDao; +pub use self::sync_notifs::SyncNotifsDao; diff --git a/core/payment/src/dao/debit_note.rs b/core/payment/src/dao/debit_note.rs index cb6b1cf0c8..4543d0e992 100644 --- a/core/payment/src/dao/debit_note.rs +++ b/core/payment/src/dao/debit_note.rs @@ -1,5 +1,5 @@ use crate::dao::{activity, debit_note_event}; -use crate::error::DbResult; +use crate::error::{DbError, DbResult}; use crate::models::debit_note::{ReadObj, WriteObj}; use crate::schema::pay_activity::dsl as activity_dsl; use crate::schema::pay_agreement::dsl as agreement_dsl; @@ -256,6 +256,19 @@ impl<'c> DebitNoteDao<'c> { DocumentStatus::Accepted }; + // Accept called on provider is invoked by the requestor, meaning the status must by synchronized. + // For requestor, a separate `mark_accept_sent` call is required to mark synchronization when the information + // is delivered to the Provider. + if role == Role::Requestor { + diesel::update( + dsl::pay_debit_note + .filter(dsl::id.eq(debit_note_id.clone())) + .filter(dsl::owner_id.eq(owner_id)), + ) + .set(dsl::send_accept.eq(true)) + .execute(conn)?; + } + update_status(&vec![debit_note_id.clone()], &owner_id, &status, conn)?; activity::set_amount_accepted(&activity_id, &owner_id, &amount, conn)?; for event in events { @@ -267,6 +280,92 @@ impl<'c> DebitNoteDao<'c> { .await } + /// Mark the debit-note as synchronized with the other side. + /// + /// Automatically marks all previous debit notes as accept-sent if that's not already the case. + /// + /// Err(_) is only produced by DB issues. + pub async fn mark_accept_sent( + &self, + mut debit_note_id: String, + owner_id: NodeId, + ) -> DbResult<()> { + do_with_transaction(self.pool, move |conn| loop { + // Mark debit note as accept-sent + let n = diesel::update( + dsl::pay_debit_note + .filter(dsl::id.eq(debit_note_id.clone())) + .filter(dsl::owner_id.eq(owner_id)) + .filter(dsl::send_accept.eq(true)), + ) + .set(dsl::send_accept.eq(false)) + .execute(conn) + .map_err(DbError::from)?; + + // Debit note was already marked as accept-sent + if n == 0 { + break Ok(()); + } + + // Get id of previous debit note + let previous = dsl::pay_debit_note + .select(dsl::previous_debit_note_id) + .filter(dsl::id.eq(debit_note_id)) + .filter(dsl::owner_id.eq(owner_id)) + .load::>(conn)?; + + // Continue with the previous debit-note + if let Some(Some(id)) = previous.first() { + debit_note_id = id.into(); + } else { + break Ok(()); + } + }) + .await + } + + /// Lists debit notes with send_accept + pub async fn unsent_accepted(&self, owner_id: NodeId) -> DbResult> { + readonly_transaction(self.pool, move |conn| { + let read: Vec = query!() + .filter(dsl::owner_id.eq(owner_id)) + .filter(dsl::send_accept.eq(true)) + .filter(dsl::status.eq(DocumentStatus::Accepted.to_string())) + .order_by(dsl::timestamp.desc()) + .load(conn)?; + let mut debit_notes = Vec::new(); + for obj in read { + debit_notes.push(obj.try_into()?); + } + + Ok(debit_notes) + }) + .await + } + + /// All debit notes with status Issued or Accepted and provider role + pub async fn dangling(&self, owner_id: NodeId) -> DbResult> { + readonly_transaction(self.pool, move |conn| { + let read: Vec = query!() + .filter(dsl::owner_id.eq(owner_id)) + .filter(dsl::role.eq(Role::Provider.to_string())) + .filter( + dsl::status + .eq(&DocumentStatus::Issued.to_string()) + .or(dsl::status.eq(&DocumentStatus::Accepted.to_string())), + ) + .load(conn)?; + + let mut debit_notes = Vec::new(); + for obj in read { + debit_notes.push(obj.try_into()?); + } + + Ok(debit_notes) + }) + .await + } + // TODO: Implement reject debit note // pub async fn reject(&self, debit_note_id: String, owner_id: NodeId) -> DbResult<()> { // do_with_transaction(self.pool, move |conn| { diff --git a/core/payment/src/dao/invoice.rs b/core/payment/src/dao/invoice.rs index 7be532eaa3..8b1e4c13c1 100644 --- a/core/payment/src/dao/invoice.rs +++ b/core/payment/src/dao/invoice.rs @@ -256,6 +256,19 @@ impl<'c> InvoiceDao<'c> { DocumentStatus::Accepted }; + // Accept called on provider is invoked by the requestor, meaning the status must by synchronized. + // For requestor, a separate `mark_accept_sent` call is required to mark synchronization when the information + // is delivered to the Provider. + if role == Role::Requestor { + diesel::update( + dsl::pay_invoice + .filter(dsl::id.eq(invoice_id.clone())) + .filter(dsl::owner_id.eq(owner_id)), + ) + .set(dsl::send_accept.eq(true)) + .execute(conn)?; + } + update_status(&invoice_id, &owner_id, &status, conn)?; agreement::set_amount_accepted(&agreement_id, &owner_id, &amount, conn)?; @@ -268,6 +281,76 @@ impl<'c> InvoiceDao<'c> { .await } + /// Mark the invoice as synchronized with the other side. + /// + /// If the status in DB matches expected_status, `sync` is set to `true` and Ok(true) is returned. + /// Otherwise, DB is not modified and Ok(false) is returned. + /// + /// Err(_) is only produced by DB issues. + pub async fn mark_accept_sent(&self, invoice_id: String, owner_id: NodeId) -> DbResult<()> { + do_with_transaction(self.pool, move |conn| { + diesel::update( + dsl::pay_invoice + .filter(dsl::id.eq(invoice_id)) + .filter(dsl::owner_id.eq(owner_id)), + ) + .set(dsl::send_accept.eq(false)) + .execute(conn)?; + Ok(()) + }) + .await + } + + /// Lists invoices with send_accept + pub async fn unsent_accepted(&self, owner_id: NodeId) -> DbResult> { + readonly_transaction(self.pool, move |conn| { + let invoices: Vec = query!() + .filter(dsl::owner_id.eq(owner_id)) + .filter(dsl::send_accept.eq(true)) + .filter(dsl::status.eq(DocumentStatus::Accepted.to_string())) + .load(conn)?; + + let activities = activity_dsl::pay_invoice_x_activity + .inner_join( + dsl::pay_invoice.on(activity_dsl::owner_id + .eq(dsl::owner_id) + .and(activity_dsl::invoice_id.eq(dsl::id))), + ) + .filter(dsl::owner_id.eq(owner_id)) + .select(crate::schema::pay_invoice_x_activity::all_columns) + .load(conn)?; + join_invoices_with_activities(invoices, activities) + }) + .await + } + + /// All invoices with status Issued or Accepted and provider role + pub async fn dangling(&self, owner_id: NodeId) -> DbResult> { + readonly_transaction(self.pool, move |conn| { + let invoices: Vec = query!() + .filter(dsl::owner_id.eq(owner_id)) + .filter(dsl::role.eq(Role::Provider.to_string())) + .filter( + dsl::status + .eq(&DocumentStatus::Issued.to_string()) + .or(dsl::status.eq(&DocumentStatus::Accepted.to_string())), + ) + .load(conn)?; + + let activities = activity_dsl::pay_invoice_x_activity + .inner_join( + dsl::pay_invoice.on(activity_dsl::owner_id + .eq(dsl::owner_id) + .and(activity_dsl::invoice_id.eq(dsl::id))), + ) + .filter(dsl::owner_id.eq(owner_id)) + .select(crate::schema::pay_invoice_x_activity::all_columns) + .load(conn)?; + join_invoices_with_activities(invoices, activities) + }) + .await + } + // TODO: Implement reject invoice // pub async fn reject(&self, invoice_id: String, owner_id: NodeId) -> DbResult<()> { // do_with_transaction(self.pool, move |conn| { diff --git a/core/payment/src/dao/payment.rs b/core/payment/src/dao/payment.rs index f03299dd15..834530c157 100644 --- a/core/payment/src/dao/payment.rs +++ b/core/payment/src/dao/payment.rs @@ -150,6 +150,16 @@ impl<'c> PaymentDao<'c> { .await } + pub async fn mark_sent(&self, payment_id: String) -> DbResult<()> { + do_with_transaction(self.pool, move |conn| { + diesel::update(dsl::pay_payment.filter(dsl::id.eq(payment_id))) + .set(dsl::send_payment.eq(false)) + .execute(conn)?; + Ok(()) + }) + .await + } + pub async fn get(&self, payment_id: String, owner_id: NodeId) -> DbResult> { readonly_transaction(self.pool, move |conn| { let payment: Option = dsl::pay_payment @@ -274,6 +284,34 @@ impl<'c> PaymentDao<'c> { }) .await } + + pub async fn list_unsent(&self, peer_id: Option) -> DbResult> { + readonly_transaction(self.pool, move |conn| { + let mut query = dsl::pay_payment + .filter(dsl::send_payment.eq(true)) + .into_boxed(); + if let Some(peer_id) = peer_id { + query = query.filter(dsl::peer_id.eq(&peer_id)); + } + + let read: Vec = query.load(conn)?; + + let mut payments = Vec::default(); + for payment in read { + let activity_payments = activity_pay_dsl::pay_activity_payment + .filter(activity_pay_dsl::payment_id.eq(&payment.id)) + .load(conn)?; + let agreement_payments = agreement_pay_dsl::pay_agreement_payment + .filter(agreement_pay_dsl::payment_id.eq(&payment.id)) + .load(conn)?; + + payments.push(payment.into_api_model(activity_payments, agreement_payments)) + } + + Ok(payments) + }) + .await + } } fn join_activity_and_agreement_payments( diff --git a/core/payment/src/dao/sync_notifs.rs b/core/payment/src/dao/sync_notifs.rs new file mode 100644 index 0000000000..2f2f3603f1 --- /dev/null +++ b/core/payment/src/dao/sync_notifs.rs @@ -0,0 +1,71 @@ +use crate::error::DbResult; +use crate::models::sync_notifs::{ReadObj, WriteObj}; +use crate::schema::pay_sync_needed_notifs::dsl; +use chrono::NaiveDateTime; +use diesel::{self, QueryDsl, RunQueryDsl}; + +use ya_client_model::NodeId; +use ya_persistence::executor::{do_with_transaction, readonly_transaction, AsDao, PoolType}; + +pub struct SyncNotifsDao<'c> { + pool: &'c PoolType, +} + +impl<'c> AsDao<'c> for SyncNotifsDao<'c> { + fn as_dao(pool: &'c PoolType) -> Self { + Self { pool } + } +} + +impl<'c> SyncNotifsDao<'c> { + /// Creates a new sync notif tracking entry for given node-id + pub async fn upsert(&self, peer_id: NodeId) -> DbResult<()> { + let sync_notif = WriteObj::new(peer_id); + do_with_transaction(self.pool, move |conn| { + diesel::delete(dsl::pay_sync_needed_notifs.find(peer_id)) + .execute(conn) + .ok(); + + diesel::insert_into(dsl::pay_sync_needed_notifs) + .values(sync_notif) + .execute(conn)?; + Ok(()) + }) + .await + } + + /// Bump retry by 1 and update timestamp + pub async fn increment_retry(&self, peer_id: NodeId, ts: NaiveDateTime) -> DbResult<()> { + do_with_transaction(self.pool, move |conn| { + let mut read: ReadObj = dsl::pay_sync_needed_notifs.find(peer_id).first(conn)?; + read.retries += 1; + read.timestamp = ts; + + diesel::update(dsl::pay_sync_needed_notifs.find(peer_id)) + .set(WriteObj::from_read(read)) + .execute(conn)?; + + Ok(()) + }) + .await + } + + /// Remove entry + pub async fn drop(&self, peer_id: NodeId) -> DbResult<()> { + do_with_transaction(self.pool, move |conn| { + diesel::delete(dsl::pay_sync_needed_notifs.find(peer_id)).execute(conn)?; + Ok(()) + }) + .await + } + + /// List all planned syncs + pub async fn list(&self) -> DbResult> { + readonly_transaction(self.pool, move |conn| { + let sync_notif = dsl::pay_sync_needed_notifs.load(conn)?; + + Ok(sync_notif) + }) + .await + } +} diff --git a/core/payment/src/lib.rs b/core/payment/src/lib.rs index 1f116c209f..654644468c 100644 --- a/core/payment/src/lib.rs +++ b/core/payment/src/lib.rs @@ -17,6 +17,7 @@ mod cli; pub mod dao; pub mod error; pub mod models; +pub mod payment_sync; pub mod processor; pub mod schema; pub mod service; diff --git a/core/payment/src/models.rs b/core/payment/src/models.rs index a0a80b8702..0ed350e6d9 100644 --- a/core/payment/src/models.rs +++ b/core/payment/src/models.rs @@ -7,3 +7,4 @@ pub mod invoice; pub mod invoice_event; pub mod order; pub mod payment; +pub mod sync_notifs; diff --git a/core/payment/src/models/payment.rs b/core/payment/src/models/payment.rs index 50982a84d7..5ba18cb3fc 100644 --- a/core/payment/src/models/payment.rs +++ b/core/payment/src/models/payment.rs @@ -19,6 +19,7 @@ pub struct WriteObj { pub role: Role, pub amount: BigDecimalField, pub details: Vec, + pub send_payment: bool, } impl WriteObj { @@ -41,6 +42,7 @@ impl WriteObj { role: Role::Requestor, amount: amount.into(), details, + send_payment: true, } } @@ -57,6 +59,7 @@ impl WriteObj { role: Role::Provider, amount: payment.amount.into(), details, + send_payment: false, }) } } @@ -75,6 +78,7 @@ pub struct ReadObj { pub amount: BigDecimalField, pub timestamp: NaiveDateTime, pub details: Vec, + pub send_payment: bool, } impl ReadObj { diff --git a/core/payment/src/models/sync_notifs.rs b/core/payment/src/models/sync_notifs.rs new file mode 100644 index 0000000000..8ed3624c7a --- /dev/null +++ b/core/payment/src/models/sync_notifs.rs @@ -0,0 +1,37 @@ +use crate::schema::pay_sync_needed_notifs; +use chrono::NaiveDateTime; +use ya_client_model::NodeId; + +#[derive(Queryable, Debug, Identifiable, Insertable, AsChangeset)] +#[table_name = "pay_sync_needed_notifs"] +pub struct WriteObj { + pub id: NodeId, + pub timestamp: Option, + pub retries: Option, +} + +impl WriteObj { + pub fn new(id: NodeId) -> Self { + WriteObj { + id, + timestamp: None, + retries: None, + } + } + + pub fn from_read(read: ReadObj) -> Self { + WriteObj { + id: read.id, + timestamp: Some(read.timestamp), + retries: Some(read.retries), + } + } +} + +#[derive(Queryable, Debug, Identifiable)] +#[table_name = "pay_sync_needed_notifs"] +pub struct ReadObj { + pub id: NodeId, + pub timestamp: NaiveDateTime, + pub retries: i32, +} diff --git a/core/payment/src/payment_sync.rs b/core/payment/src/payment_sync.rs new file mode 100644 index 0000000000..d7af672915 --- /dev/null +++ b/core/payment/src/payment_sync.rs @@ -0,0 +1,226 @@ +use std::{collections::HashSet, time::Duration}; + +use chrono::Utc; +use tokio::sync::Notify; +use tokio_util::task::LocalPoolHandle; +use ya_client_model::{payment::Acceptance, NodeId}; +use ya_core_model::{ + driver::{driver_bus_id, SignPayment}, + identity::{self, IdentityInfo}, + payment::{ + self, + public::{AcceptDebitNote, AcceptInvoice, PaymentSync, PaymentSyncRequest, SendPayment}, + }, +}; +use ya_net::RemoteEndpoint; +use ya_persistence::executor::DbExecutor; +use ya_service_bus::{typed, RpcEndpoint}; + +use crate::dao::{DebitNoteDao, InvoiceDao, PaymentDao, SyncNotifsDao}; + +const SYNC_NOTIF_DELAY_0: Duration = Duration::from_secs(30); +const SYNC_NOTIF_RATIO: u32 = 6; +const SYNC_NOTIF_MAX_RETRIES: u32 = 7; + +async fn payment_sync(db: &DbExecutor, peer_id: NodeId) -> anyhow::Result { + let payment_dao: PaymentDao = db.as_dao(); + let invoice_dao: InvoiceDao = db.as_dao(); + let debit_note_dao: DebitNoteDao = db.as_dao(); + + let mut payments = Vec::default(); + for payment in payment_dao.list_unsent(Some(peer_id)).await? { + let platform_components = payment.payment_platform.split('-').collect::>(); + let driver = &platform_components[0]; + + let signature = typed::service(driver_bus_id(driver)) + .send(SignPayment(payment.clone())) + .await??; + + payments.push(SendPayment::new(payment, signature)); + } + + let mut invoice_accepts = Vec::default(); + for invoice in invoice_dao.unsent_accepted(peer_id).await? { + invoice_accepts.push(AcceptInvoice::new( + invoice.invoice_id, + Acceptance { + total_amount_accepted: invoice.amount, + allocation_id: String::new(), + }, + peer_id, + )); + } + + let mut debit_note_accepts = Vec::default(); + for debit_note in debit_note_dao.unsent_accepted(peer_id).await? { + debit_note_accepts.push(AcceptDebitNote::new( + debit_note.debit_note_id, + Acceptance { + total_amount_accepted: debit_note.total_amount_due, + allocation_id: String::new(), + }, + peer_id, + )); + } + + Ok(PaymentSync { + payments: payments, + invoice_accepts, + debit_note_accepts, + }) +} + +async fn mark_all_sent(db: &DbExecutor, msg: PaymentSync) -> anyhow::Result<()> { + let payment_dao: PaymentDao = db.as_dao(); + let invoice_dao: InvoiceDao = db.as_dao(); + let debit_note_dao: DebitNoteDao = db.as_dao(); + + for payment_send in msg.payments { + payment_dao + .mark_sent(payment_send.payment.payment_id) + .await?; + } + + for invoice_accept in msg.invoice_accepts { + invoice_dao + .mark_accept_sent(invoice_accept.invoice_id, invoice_accept.issuer_id) + .await?; + } + + for debit_note_accept in msg.debit_note_accepts { + debit_note_dao + .mark_accept_sent(debit_note_accept.debit_note_id, debit_note_accept.issuer_id) + .await?; + } + + Ok(()) +} + +async fn send_sync_notifs(db: &DbExecutor) -> anyhow::Result> { + let dao: SyncNotifsDao = db.as_dao(); + + let exp_backoff = |n| SYNC_NOTIF_DELAY_0 * SYNC_NOTIF_RATIO.pow(n); + let cutoff = Utc::now(); + + let default_identity = typed::service(identity::BUS_ID) + .call(ya_core_model::identity::Get::ByDefault {}) + .await?? + .ok_or_else(|| anyhow::anyhow!("No default identity"))? + .node_id; + + let all_notifs = dao.list().await?; + + let next_wakeup = all_notifs + .iter() + .map(|entry| { + let next_deadline = entry.timestamp + exp_backoff(entry.retries as _); + next_deadline.and_utc() + }) + .filter(|deadline| deadline > &cutoff) + .min() + .map(|ts| ts - cutoff) + .and_then(|dur| dur.to_std().ok()); + + let peers_to_notify = dao + .list() + .await? + .into_iter() + .filter(|entry| { + let next_deadline = entry.timestamp + exp_backoff(entry.retries as _); + next_deadline.and_utc() < cutoff && entry.retries <= SYNC_NOTIF_MAX_RETRIES as i32 + }) + .map(|entry| entry.id) + .collect::>(); + + for peer in peers_to_notify { + let msg = payment_sync(db, peer).await?; + + let result = ya_net::from(default_identity) + .to(peer) + .service(ya_core_model::payment::public::BUS_ID) + .call(msg.clone()) + .await; + + if matches!(&result, Ok(Ok(_))) { + mark_all_sent(db, msg).await?; + dao.drop(peer).await?; + } else { + dao.increment_retry(peer, cutoff.naive_utc()).await?; + } + } + + Ok(next_wakeup) +} + +lazy_static::lazy_static! { + pub static ref SYNC_NOTIFS_NOTIFY: Notify = Notify::new(); +} + +pub fn send_sync_notifs_job(db: DbExecutor) { + let pool = LocalPoolHandle::new(1); + let default_sleep = Duration::from_secs(3600); + + pool.spawn_pinned(move || async move { + loop { + let sleep_for = match send_sync_notifs(&db).await { + Err(e) => { + log::error!("PaymentSyncNeeded sendout job failed: {e}"); + default_sleep + } + Ok(duration) => { + log::trace!("PaymentSyncNeeded sendout job done"); + duration.unwrap_or(default_sleep) + } + }; + + tokio::select! { + _ = tokio::time::sleep(sleep_for) => { }, + _ = SYNC_NOTIFS_NOTIFY.notified() => { }, + } + } + }); +} + +async fn send_sync_requests_impl(db: DbExecutor) -> anyhow::Result<()> { + let invoice_dao: InvoiceDao = db.as_dao(); + let debit_note_dao: DebitNoteDao = db.as_dao(); + + let identities = typed::service(identity::BUS_ID) + .call(ya_core_model::identity::List {}) + .await??; + + for IdentityInfo { node_id, .. } in identities { + let mut peers = HashSet::::default(); + + for invoice in invoice_dao.dangling(node_id).await? { + peers.insert(invoice.recipient_id); + } + + for debit_note in debit_note_dao.dangling(node_id).await? { + peers.insert(debit_note.recipient_id); + } + + for peer_id in peers { + tokio::time::sleep(std::time::Duration::from_secs(30)).await; + + log::debug!("Sending PaymentSyncRequest to [{peer_id}]"); + ya_net::from(node_id) + .to(peer_id) + .service(payment::public::BUS_ID) + .call(PaymentSyncRequest) + .await??; + } + } + + Ok(()) +} + +pub fn send_sync_requests(db: DbExecutor) { + let pool = LocalPoolHandle::new(1); + + pool.spawn_pinned(move || async move { + if let Err(e) = send_sync_requests_impl(db).await { + log::error!("Failed to send PaymentSyncRequest: {e}"); + } + }); +} diff --git a/core/payment/src/processor.rs b/core/payment/src/processor.rs index 2c45854f66..2c895136fc 100644 --- a/core/payment/src/processor.rs +++ b/core/payment/src/processor.rs @@ -1,10 +1,11 @@ use crate::api::allocations::{forced_release_allocation, release_allocation_after}; -use crate::dao::{ActivityDao, AgreementDao, AllocationDao, OrderDao, PaymentDao}; +use crate::dao::{ActivityDao, AgreementDao, AllocationDao, OrderDao, PaymentDao, SyncNotifsDao}; use crate::error::processor::{ AccountNotRegistered, GetStatusError, NotifyPaymentError, OrderValidationError, SchedulePaymentError, ValidateAllocationError, VerifyPaymentError, }; use crate::models::order::ReadObj as DbOrder; +use crate::payment_sync::SYNC_NOTIFS_NOTIFY; use actix_web::web::Data; use bigdecimal::{BigDecimal, Zero}; use futures::FutureExt; @@ -413,7 +414,10 @@ impl PaymentProcessor { ) .await?; - let mut payment = payment_dao.get(payment_id, payer_id).await?.unwrap(); + let mut payment = payment_dao + .get(payment_id.clone(), payer_id) + .await? + .unwrap(); // Allocation IDs are requestor's private matter and should not be sent to provider for agreement_payment in payment.agreement_payments.iter_mut() { agreement_payment.allocation_id = None; @@ -428,23 +432,59 @@ impl PaymentProcessor { log::warn!("####### payment: {:?}, signature {:?}", payment, signature); counter!("payment.amount.sent", ya_metrics::utils::cryptocurrency_to_u64(&msg.amount), "platform" => payment_platform); + // This is unconditional because at this point the invoice *has been paid*. + // Whether the provider was correctly notified of this fact is another matter. + counter!("payment.invoices.requestor.paid", 1); let msg = SendPayment::new(payment, signature); - // Spawning to avoid deadlock in a case that payee is the same node as payer - tokio::task::spawn_local( - ya_net::from(payer_id) + if payer_id != payee_id { + let mark_sent = ya_net::from(payer_id) .to(payee_id) .service(BUS_ID) .call(msg) .map(|res| match res { - Ok(Ok(_)) => (), - Err(err) => log::error!("Error sending payment message to provider: {:?}", err), - Ok(Err(err)) => log::error!("Provider rejected payment: {:?}", err), - }), - ); - // TODO: Implement re-sending mechanism in case SendPayment fails + Ok(Ok(_)) => true, + Err(err) => { + log::error!("Error sending payment message to provider: {:?}", err); + false + } + Ok(Err(err)) => { + log::error!("Provider rejected payment: {:?}", err); + true + } + }) + .await; + + if mark_sent { + payment_dao.mark_sent(payment_id).await.ok(); + } else { + let sync_dao: SyncNotifsDao = self.db_executor.as_dao(); + sync_dao.upsert(payee_id).await?; + SYNC_NOTIFS_NOTIFY.notify_one(); + log::debug!("Failed to call SendPayment on [{payee_id}]"); + } + } else { + // Spawning to avoid deadlock in a case that payee is the same node as payer + tokio::task::spawn_local( + ya_net::from(payer_id) + .to(payee_id) + .service(BUS_ID) + .call(msg) + .map(|res| match res { + Ok(Ok(_)) => (), + Err(err) => { + log::error!("Error sending payment message to provider: {:?}", err) + } + Ok(Err(err)) => { + log::error!("Provider rejected payment: {:?}", err) + } + }), + ); + + // Assume payments are OK when requesting from self + payment_dao.mark_sent(payment_id).await?; + } - counter!("payment.invoices.requestor.paid", 1); Ok(()) } diff --git a/core/payment/src/schema.rs b/core/payment/src/schema.rs index 4e711be87a..f042ee7a84 100644 --- a/core/payment/src/schema.rs +++ b/core/payment/src/schema.rs @@ -73,6 +73,7 @@ table! { activity_id -> Text, status -> Text, timestamp -> Timestamp, + send_accept -> Bool, total_amount_due -> Text, usage_counter_vector -> Nullable, payment_due_date -> Nullable, @@ -122,6 +123,7 @@ table! { agreement_id -> Text, status -> Text, timestamp -> Timestamp, + send_accept -> Bool, amount -> Text, payment_due_date -> Timestamp, } @@ -186,6 +188,15 @@ table! { amount -> Text, timestamp -> Timestamp, details -> Binary, + send_payment -> Bool, + } +} + +table! { + pay_sync_needed_notifs (id) { + id -> Text, + timestamp -> Timestamp, + retries -> Integer, } } diff --git a/core/payment/src/service.rs b/core/payment/src/service.rs index 5d7df6cf2e..38e5165408 100644 --- a/core/payment/src/service.rs +++ b/core/payment/src/service.rs @@ -1,10 +1,15 @@ +use crate::dao::{DebitNoteDao, InvoiceDao}; use crate::processor::PaymentProcessor; + use futures::lock::Mutex; use futures::prelude::*; use metrics::counter; use std::collections::HashMap; use std::sync::Arc; -use ya_core_model::payment::local::BUS_ID as PAYMENT_BUS_ID; + +use ya_core_model::payment::local::{GenericError, BUS_ID as PAYMENT_BUS_ID}; +use ya_core_model::payment::public::{AcceptDebitNote, AcceptInvoice, PaymentSync, SendPayment}; + use ya_persistence::executor::DbExecutor; use ya_service_bus::typed::{service, ServiceBinder}; @@ -391,14 +396,17 @@ mod local { } mod public { + use std::str::FromStr; + use super::*; - use crate::dao::*; use crate::error::DbError; + use crate::payment_sync::{send_sync_notifs_job, send_sync_requests}; use crate::utils::*; + use crate::{dao::*, payment_sync::SYNC_NOTIFS_NOTIFY}; // use crate::error::processor::VerifyPaymentError; - use ya_client_model::payment::*; + use ya_client_model::{payment::*, NodeId}; use ya_core_model::payment::public::*; use ya_persistence::types::Role; @@ -414,7 +422,12 @@ mod public { .bind(accept_invoice) .bind(reject_invoice) .bind(cancel_invoice) - .bind_with_processor(send_payment); + .bind(sync_request) + .bind_with_processor(send_payment) + .bind_with_processor(sync_payment); + + send_sync_notifs_job(db.clone()); + send_sync_requests(db.clone()); log::debug!("Successfully bound payment public service to service bus"); } @@ -819,4 +832,65 @@ mod public { //}, } } + + // **************************** SYNC ***************************** + async fn sync_request( + db: DbExecutor, + sender_id: String, + msg: PaymentSyncRequest, + ) -> Result { + let dao: SyncNotifsDao = db.as_dao(); + + let peer_id = + NodeId::from_str(&sender_id).expect("sender_id supplied by ya_service_bus is invalid"); + dao.upsert(peer_id) + .await + .map_err(|e| SendError::BadRequest(e.to_string()))?; + SYNC_NOTIFS_NOTIFY.notify_one(); + + Ok(Ack {}) + } + + async fn sync_payment( + db: DbExecutor, + processor: Arc>, + sender_id: String, + msg: PaymentSync, + ) -> Result { + let mut errors = PaymentSyncError::default(); + + for payment_send in msg.payments { + let result = send_payment( + db.clone(), + Arc::clone(&processor), + sender_id.clone(), + payment_send, + ) + .await; + + if let Err(e) = result { + errors.payment_send_errors.push(e); + } + } + + for invoice_accept in msg.invoice_accepts { + let result = accept_invoice(db.clone(), sender_id.clone(), invoice_accept).await; + if let Err(e) = result { + errors.accept_errors.push(e); + } + } + + for debit_note_accept in msg.debit_note_accepts { + let result = accept_debit_note(db.clone(), sender_id.clone(), debit_note_accept).await; + if let Err(e) = result { + errors.accept_errors.push(e); + } + } + + if errors.accept_errors.is_empty() && errors.payment_send_errors.is_empty() { + Ok(Ack {}) + } else { + Err(errors) + } + } } From 6ee2bca4a4f649f0069a2e8067fa686b02005636 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 20 Oct 2023 11:28:19 +0200 Subject: [PATCH 105/123] payment-driver: Rename erc20legacy->erc20, erc20->erc20next --- core/model/src/payment.rs | 2 +- core/payment-driver/erc20/src/lib.rs | 12 +++--- core/payment-driver/erc20next/Readme.md | 4 +- core/payment-driver/erc20next/src/driver.rs | 2 +- .../payment-driver/erc20next/src/erc20/mod.rs | 2 +- .../erc20next/src/erc20/wallet.rs | 2 +- core/payment-driver/erc20next/src/lib.rs | 14 +++---- core/payment/README.md | 4 +- core/payment/examples/payment_api.rs | 8 ++-- golem_cli/src/command/yagna.rs | 42 +++++++++---------- 10 files changed, 46 insertions(+), 46 deletions(-) diff --git a/core/model/src/payment.rs b/core/model/src/payment.rs index 916e81e324..d92e4a8fba 100644 --- a/core/model/src/payment.rs +++ b/core/model/src/payment.rs @@ -500,8 +500,8 @@ pub mod local { #[serde(rename_all = "lowercase")] #[non_exhaustive] pub enum DriverName { + Erc20Next, Erc20, - Erc20legacy, } #[derive(StructOpt, Debug, Clone)] diff --git a/core/payment-driver/erc20/src/lib.rs b/core/payment-driver/erc20/src/lib.rs index aaa7532d90..4cbe2ce4cd 100644 --- a/core/payment-driver/erc20/src/lib.rs +++ b/core/payment-driver/erc20/src/lib.rs @@ -5,35 +5,35 @@ */ // Public -pub const DRIVER_NAME: &str = "erc20legacy"; +pub const DRIVER_NAME: &str = "erc20"; pub const RINKEBY_NETWORK: &str = "rinkeby"; pub const RINKEBY_TOKEN: &str = "tGLM"; -pub const RINKEBY_PLATFORM: &str = "erc20legacy-rinkeby-tglm"; +pub const RINKEBY_PLATFORM: &str = "erc20-rinkeby-tglm"; pub const RINKEBY_CURRENCY_SHORT: &str = "tETH"; pub const RINKEBY_CURRENCY_LONG: &str = "Rinkeby Ether"; pub const GOERLI_NETWORK: &str = "goerli"; pub const GOERLI_TOKEN: &str = "tGLM"; -pub const GOERLI_PLATFORM: &str = "erc20legacy-goerli-tglm"; +pub const GOERLI_PLATFORM: &str = "erc20-goerli-tglm"; pub const GOERLI_CURRENCY_SHORT: &str = "tETH"; pub const GOERLI_CURRENCY_LONG: &str = "Goerli Ether"; pub const MUMBAI_NETWORK: &str = "mumbai"; pub const MUMBAI_TOKEN: &str = "tGLM"; -pub const MUMBAI_PLATFORM: &str = "erc20legacy-mumbai-tglm"; +pub const MUMBAI_PLATFORM: &str = "erc20-mumbai-tglm"; pub const MUMBAI_CURRENCY_SHORT: &str = "tMATIC"; pub const MUMBAI_CURRENCY_LONG: &str = "Test MATIC"; pub const MAINNET_NETWORK: &str = "mainnet"; pub const MAINNET_TOKEN: &str = "GLM"; -pub const MAINNET_PLATFORM: &str = "erc20legacy-mainnet-glm"; +pub const MAINNET_PLATFORM: &str = "erc20-mainnet-glm"; pub const MAINNET_CURRENCY_SHORT: &str = "ETH"; pub const MAINNET_CURRENCY_LONG: &str = "Ether"; pub const POLYGON_MAINNET_NETWORK: &str = "polygon"; pub const POLYGON_MAINNET_TOKEN: &str = "GLM"; -pub const POLYGON_MAINNET_PLATFORM: &str = "erc20legacy-polygon-glm"; +pub const POLYGON_MAINNET_PLATFORM: &str = "erc20-polygon-glm"; pub const POLYGON_MAINNET_CURRENCY_SHORT: &str = "MATIC"; pub const POLYGON_MAINNET_CURRENCY_LONG: &str = "Polygon"; diff --git a/core/payment-driver/erc20next/Readme.md b/core/payment-driver/erc20next/Readme.md index f5434615af..e44e2b8330 100644 --- a/core/payment-driver/erc20next/Readme.md +++ b/core/payment-driver/erc20next/Readme.md @@ -8,7 +8,7 @@ This command will send 0.0001 GLMs from internal wallet to address 0x89Ef977db64 Note that service have to be running otherwise you get no connection error. ``` -yagna.exe payment transfer --amount 0.0001 --driver erc20 --network mumbai --to-address 0x89Ef977db64A2597bA57E3eb4b717D3bAAeBaeC3 +yagna.exe payment transfer --amount 0.0001 --driver erc20next --network mumbai --to-address 0x89Ef977db64A2597bA57E3eb4b717D3bAAeBaeC3 ``` You can specify extra options @@ -17,7 +17,7 @@ You can specify extra options * --gas-limit (limit of gas used in transaction). Better to leave default as it is not affecting cost of transaction. This is convenient for testing errors on blockchain. ``` -yagna.exe payment transfer --amount 0.0001 --gas-price 1.1 --max-gas-price 60.4 --gas-limit 80000 --driver erc20 --network mumbai --to-address 0x89Ef977db64A2597bA57E3eb4b717D3bAAeBaeC3 +yagna.exe payment transfer --amount 0.0001 --gas-price 1.1 --max-gas-price 60.4 --gas-limit 80000 --driver erc20next --network mumbai --to-address 0x89Ef977db64A2597bA57E3eb4b717D3bAAeBaeC3 ``` Networks currently supported: diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index 8dcf111da5..91db7f5552 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -1,5 +1,5 @@ /* - Erc20Driver to handle payments on the erc20 network. + Erc20Driver to handle payments on the erc20next network. Please limit the logic in this file, use local mods to handle the calls. */ diff --git a/core/payment-driver/erc20next/src/erc20/mod.rs b/core/payment-driver/erc20next/src/erc20/mod.rs index 5900681925..20cad822d0 100644 --- a/core/payment-driver/erc20next/src/erc20/mod.rs +++ b/core/payment-driver/erc20next/src/erc20/mod.rs @@ -1,5 +1,5 @@ /* - Private mod to encapsulate all erc20 logic, revealed from the `wallet`. + Private mod to encapsulate all erc20next logic, revealed from the `wallet`. */ pub mod ethereum; diff --git a/core/payment-driver/erc20next/src/erc20/wallet.rs b/core/payment-driver/erc20next/src/erc20/wallet.rs index 5f15af6517..2d40040316 100644 --- a/core/payment-driver/erc20next/src/erc20/wallet.rs +++ b/core/payment-driver/erc20next/src/erc20/wallet.rs @@ -1,5 +1,5 @@ /* - Wallet functions on erc20. + Wallet functions on erc20next. */ // External crates diff --git a/core/payment-driver/erc20next/src/lib.rs b/core/payment-driver/erc20next/src/lib.rs index d504ff5926..f94eb5ce85 100644 --- a/core/payment-driver/erc20next/src/lib.rs +++ b/core/payment-driver/erc20next/src/lib.rs @@ -1,39 +1,39 @@ /* - Payment driver for yagna using erc20. + Payment driver for yagna using erc20next. This file only contains constants and imports. */ // Public -pub const DRIVER_NAME: &str = "erc20"; +pub const DRIVER_NAME: &str = "erc20next"; pub const RINKEBY_NETWORK: &str = "rinkeby"; pub const RINKEBY_TOKEN: &str = "tGLM"; -pub const RINKEBY_PLATFORM: &str = "erc20-rinkeby-tglm"; +pub const RINKEBY_PLATFORM: &str = "erc20next-rinkeby-tglm"; pub const RINKEBY_CURRENCY_SHORT: &str = "tETH"; pub const RINKEBY_CURRENCY_LONG: &str = "Rinkeby Ether"; pub const GOERLI_NETWORK: &str = "goerli"; pub const GOERLI_TOKEN: &str = "tGLM"; -pub const GOERLI_PLATFORM: &str = "erc20-goerli-tglm"; +pub const GOERLI_PLATFORM: &str = "erc20next-goerli-tglm"; pub const GOERLI_CURRENCY_SHORT: &str = "tETH"; pub const GOERLI_CURRENCY_LONG: &str = "Goerli Ether"; pub const MUMBAI_NETWORK: &str = "mumbai"; pub const MUMBAI_TOKEN: &str = "tGLM"; -pub const MUMBAI_PLATFORM: &str = "erc20-mumbai-tglm"; +pub const MUMBAI_PLATFORM: &str = "erc20next-mumbai-tglm"; pub const MUMBAI_CURRENCY_SHORT: &str = "tMATIC"; pub const MUMBAI_CURRENCY_LONG: &str = "Test MATIC"; pub const MAINNET_NETWORK: &str = "mainnet"; pub const MAINNET_TOKEN: &str = "GLM"; -pub const MAINNET_PLATFORM: &str = "erc20-mainnet-glm"; +pub const MAINNET_PLATFORM: &str = "erc20next=mainnet-glm"; pub const MAINNET_CURRENCY_SHORT: &str = "ETH"; pub const MAINNET_CURRENCY_LONG: &str = "Ether"; pub const POLYGON_MAINNET_NETWORK: &str = "polygon"; pub const POLYGON_MAINNET_TOKEN: &str = "GLM"; -pub const POLYGON_MAINNET_PLATFORM: &str = "erc20-polygon-glm"; +pub const POLYGON_MAINNET_PLATFORM: &str = "erc20next-polygon-glm"; pub const POLYGON_MAINNET_CURRENCY_SHORT: &str = "MATIC"; pub const POLYGON_MAINNET_CURRENCY_LONG: &str = "Polygon"; diff --git a/core/payment/README.md b/core/payment/README.md index ed154e566b..f993a69fdb 100644 --- a/core/payment/README.md +++ b/core/payment/README.md @@ -7,8 +7,8 @@ The payments are made by drivers loaded in the service. ### Drivers Currently these drivers are available to use: +- Erc20Next - Erc20 -- Erc20Legacy - Dummy By default only the Erc20 & Erc20Next drivers are enabled, extra drivers need to be specifically loaded with a feature flag. @@ -25,7 +25,7 @@ You can enable multiple drivers at the same time, use this table for the require ### Examples: -Build with erc20 and erc20legacy drivers: +Build with erc20next and erc20 drivers: ``` cargo build --release ``` \ No newline at end of file diff --git a/core/payment/examples/payment_api.rs b/core/payment/examples/payment_api.rs index 29d890e2e2..5c98c669e2 100644 --- a/core/payment/examples/payment_api.rs +++ b/core/payment/examples/payment_api.rs @@ -46,8 +46,8 @@ impl FromStr for Driver { fn from_str(s: &str) -> anyhow::Result { match s.to_lowercase().as_str() { "dummy" => Ok(Driver::Dummy), - "erc20legacy" => Ok(Driver::Erc20), - "erc20" => Ok(Driver::Erc20next), + "erc20" => Ok(Driver::Erc20), + "erc20next" => Ok(Driver::Erc20next), s => Err(anyhow::Error::msg(format!("Invalid driver: {}", s))), } } @@ -57,8 +57,8 @@ impl std::fmt::Display for Driver { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Driver::Dummy => write!(f, "dummy"), - Driver::Erc20 => write!(f, "erc20legacy"), - Driver::Erc20next => write!(f, "erc20"), + Driver::Erc20 => write!(f, "erc20"), + Driver::Erc20next => write!(f, "erc20next"), } } } diff --git a/golem_cli/src/command/yagna.rs b/golem_cli/src/command/yagna.rs index d238cb4906..14aa09f237 100644 --- a/golem_cli/src/command/yagna.rs +++ b/golem_cli/src/command/yagna.rs @@ -33,40 +33,40 @@ lazy_static! { erc20.insert( NetworkName::Mainnet.into(), PaymentPlatform { - platform: "erc20legacy-mainnet-glm", - driver: "erc20legacy", + platform: "erc20-mainnet-glm", + driver: "erc20", token: "GLM", }, ); erc20.insert( NetworkName::Rinkeby.into(), PaymentPlatform { - platform: "erc20legacy-rinkeby-tglm", - driver: "erc20legacy", + platform: "erc20-rinkeby-tglm", + driver: "erc20", token: "tGLM", }, ); erc20.insert( NetworkName::Goerli.into(), PaymentPlatform { - platform: "erc20legacy-goerli-tglm", - driver: "erc20legacy", + platform: "erc20-goerli-tglm", + driver: "erc20", token: "tGLM", }, ); erc20.insert( NetworkName::Mumbai.into(), PaymentPlatform { - platform: "erc20legacy-mumbai-tglm", - driver: "erc20legacy", + platform: "erc20-mumbai-tglm", + driver: "erc20", token: "tGLM", }, ); erc20.insert( NetworkName::Polygon.into(), PaymentPlatform { - platform: "erc20legacy-polygon-glm", - driver: "erc20legacy", + platform: "erc20-polygon-glm", + driver: "erc20", token: "GLM", }, ); @@ -81,47 +81,47 @@ lazy_static! { erc20next.insert( NetworkName::Mainnet.into(), PaymentPlatform { - platform: "erc20-mainnet-glm", - driver: "erc20", + platform: "erc20next-mainnet-glm", + driver: "erc20next", token: "GLM", }, ); erc20next.insert( NetworkName::Rinkeby.into(), PaymentPlatform { - platform: "erc20-rinkeby-tglm", - driver: "erc20", + platform: "erc20next-rinkeby-tglm", + driver: "erc20next", token: "tGLM", }, ); erc20next.insert( NetworkName::Goerli.into(), PaymentPlatform { - platform: "erc20-goerli-tglm", - driver: "erc20", + platform: "erc20next-goerli-tglm", + driver: "erc20next", token: "tGLM", }, ); erc20next.insert( NetworkName::Mumbai.into(), PaymentPlatform { - platform: "erc20-mumbai-tglm", - driver: "erc20", + platform: "erc20next-mumbai-tglm", + driver: "erc20next", token: "tGLM", }, ); erc20next.insert( NetworkName::Polygon.into(), PaymentPlatform { - platform: "erc20-polygon-glm", - driver: "erc20", + platform: "erc20next-polygon-glm", + driver: "erc20next", token: "GLM", }, ); PaymentDriver { platforms: erc20next, - name: "erc20", + name: "erc20next", } }; pub static ref DRIVERS: Vec<&'static PaymentDriver> = vec![&ERC20_DRIVER]; From de31014e7d0ef52a42330bc1e21d9f6ca643e103 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 20 Oct 2023 14:29:06 +0200 Subject: [PATCH 106/123] bump erc20_payment_lib --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aa8b800d71..6cfafe9f93 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1869,7 +1869,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.2.2" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=eca355f270f55cfa7f9551b4b8690e84f7834138#eca355f270f55cfa7f9551b4b8690e84f7834138" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=7d732f4ba0117613273b9857f0d16518449c26f8#7d732f4ba0117613273b9857f0d16518449c26f8" dependencies = [ "actix-files", "actix-web", diff --git a/Cargo.toml b/Cargo.toml index 4ce8220b3d..af4b45850f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -224,7 +224,7 @@ members = [ # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "eca355f270f55cfa7f9551b4b8690e84f7834138" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "7d732f4ba0117613273b9857f0d16518449c26f8" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.2.2" } rand = "0.8.5" From e7a9db85bc469d7558ab75eab47be8446fee833b Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 20 Oct 2023 16:05:11 +0200 Subject: [PATCH 107/123] bump goth (tests on erc20next) --- goth_tests/poetry.lock | 133 ++++++++++++++++++++++++++++++++------ goth_tests/pyproject.toml | 9 +-- 2 files changed, 117 insertions(+), 25 deletions(-) diff --git a/goth_tests/poetry.lock b/goth_tests/poetry.lock index 13a0707f60..0ce98aa9ee 100644 --- a/goth_tests/poetry.lock +++ b/goth_tests/poetry.lock @@ -1,9 +1,10 @@ -# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. [[package]] name = "aiohttp" version = "3.8.5" description = "Async http client/server framework (asyncio)" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -112,6 +113,7 @@ speedups = ["Brotli", "aiodns", "cchardet"] name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -126,6 +128,7 @@ frozenlist = ">=1.1.0" name = "ansicolors" version = "1.1.8" description = "ANSI colors for Python" +category = "main" optional = false python-versions = "*" files = [ @@ -137,6 +140,7 @@ files = [ name = "appdirs" version = "1.4.4" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +category = "dev" optional = false python-versions = "*" files = [ @@ -148,6 +152,7 @@ files = [ name = "asgiref" version = "3.3.4" description = "ASGI specs, helper code, and adapters" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -162,6 +167,7 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] name = "async-timeout" version = "4.0.3" description = "Timeout context manager for asyncio programs" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -173,6 +179,7 @@ files = [ name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -191,6 +198,7 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte name = "bcrypt" version = "4.0.1" description = "Modern password hashing for your software and your servers" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -225,6 +233,7 @@ typecheck = ["mypy"] name = "black" version = "21.7b0" description = "The uncompromising code formatter." +category = "dev" optional = false python-versions = ">=3.6.2" files = [ @@ -250,6 +259,7 @@ uvloop = ["uvloop (>=0.15.2)"] name = "blinker" version = "1.4" description = "Fast, simple object-to-object and broadcast signaling" +category = "main" optional = false python-versions = "*" files = [ @@ -260,6 +270,7 @@ files = [ name = "brotli" version = "1.0.9" description = "Python bindings for the Brotli compression library" +category = "main" optional = false python-versions = "*" files = [ @@ -351,6 +362,7 @@ files = [ name = "certifi" version = "2020.12.5" description = "Python package for providing Mozilla's CA Bundle." +category = "main" optional = false python-versions = "*" files = [ @@ -362,6 +374,7 @@ files = [ name = "cffi" version = "1.16.0" description = "Foreign Function Interface for Python calling C code." +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -426,6 +439,7 @@ pycparser = "*" name = "charset-normalizer" version = "3.3.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -525,6 +539,7 @@ files = [ name = "click" version = "7.1.2" description = "Composable command line interface toolkit" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -536,6 +551,7 @@ files = [ name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -547,6 +563,7 @@ files = [ name = "cryptography" version = "3.2.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." +category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" files = [ @@ -589,6 +606,7 @@ test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=3.6.0 name = "distro" version = "1.8.0" description = "Distro - an OS platform information API" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -600,6 +618,7 @@ files = [ name = "docker" version = "6.1.3" description = "A Python library for the Docker Engine API." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -622,6 +641,7 @@ ssh = ["paramiko (>=2.4.3)"] name = "docker-compose" version = "1.29.2" description = "Multi-container orchestration for Docker" +category = "main" optional = false python-versions = ">=3.4" files = [ @@ -650,6 +670,7 @@ tests = ["ddt (>=1.2.2,<2)", "pytest (<6)"] name = "dockerpty" version = "0.4.1" description = "Python library to use the pseudo-tty of a docker container" +category = "main" optional = false python-versions = "*" files = [ @@ -663,6 +684,7 @@ six = ">=1.3.0" name = "docopt" version = "0.6.2" description = "Pythonic argument parser, that will make you smile" +category = "main" optional = false python-versions = "*" files = [ @@ -673,6 +695,7 @@ files = [ name = "dpath" version = "2.1.6" description = "Filesystem-like pathing and searching for dictionaries" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -684,6 +707,7 @@ files = [ name = "exceptiongroup" version = "1.1.3" description = "Backport of PEP 654 (exception groups)" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -698,6 +722,7 @@ test = ["pytest (>=6)"] name = "fastcore" version = "1.5.29" description = "Python supercharged for fastai development" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -716,6 +741,7 @@ dev = ["jupyterlab", "matplotlib", "nbdev (>=0.2.39)", "numpy", "pandas", "pillo name = "flask" version = "1.1.4" description = "A simple framework for building complex web applications." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -738,6 +764,7 @@ dotenv = ["python-dotenv"] name = "frozenlist" version = "1.4.0" description = "A list-like structure which implements collections.abc.MutableSequence" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -808,6 +835,7 @@ files = [ name = "func-timeout" version = "4.3.5" description = "Python module which allows you to specify timeouts when calling any existing function. Also provides support for stoppable-threads" +category = "main" optional = false python-versions = "*" files = [ @@ -818,6 +846,7 @@ files = [ name = "ghapi" version = "0.1.23" description = "A python client for the GitHub API" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -835,35 +864,41 @@ dev = ["jsonref"] [[package]] name = "goth" -version = "0.15.8" +version = "0.15.9" description = "Golem Test Harness - integration testing framework" +category = "main" optional = false -python-versions = ">=3.10.1,<4.0.0" -files = [ - {file = "goth-0.15.8-py3-none-any.whl", hash = "sha256:1a0d8b59e207feab8aaf36c6156eab0cf446f56cb6973c71200c531e35a19de9"}, - {file = "goth-0.15.8.tar.gz", hash = "sha256:16fa44a0a6e4e914064a5bb5cf8d2d0d3af766e97d515a498f66a13723fffd83"}, -] +python-versions = "^3.10.1" +files = [] +develop = false [package.dependencies] -aiohttp = ">=3.8.5,<4.0.0" -ansicolors = ">=1.1.0,<2.0.0" -docker = ">=6.0,<7.0" -docker-compose = ">=1.29,<2.0" -dpath = ">=2.0,<3.0" +aiohttp = "^3.8.5" +ansicolors = "^1.1.0" +docker = "^6.0" +docker-compose = "^1.29" +dpath = "^2.0" func_timeout = "4.3.5" -ghapi = ">=0.1.16,<0.2.0" +ghapi = "^0.1.16" markupsafe = "2.0.1" -mitmproxy = ">=5.3,<6.0" +mitmproxy = "^5.3" pyyaml = "5.3.1" -transitions = ">=0.8,<0.9" -typing_extensions = ">=4.5,<5.0" -urllib3 = ">=1.26,<2.0" -ya-aioclient = ">=0.6,<0.7" +transitions = "^0.8" +typing_extensions = "^4.5" +urllib3 = "^1.26" +ya-aioclient = "^0.6" + +[package.source] +type = "git" +url = "https://github.com/golemfactory/goth.git" +reference = "2c2c8a8b01324350eb5968171fe9e38d333b90f4" +resolved_reference = "2c2c8a8b01324350eb5968171fe9e38d333b90f4" [[package]] name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -875,6 +910,7 @@ files = [ name = "h2" version = "4.1.0" description = "HTTP/2 State-Machine based protocol implementation" +category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -890,6 +926,7 @@ hyperframe = ">=6.0,<7" name = "hpack" version = "4.0.0" description = "Pure-Python HPACK header compression" +category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -901,6 +938,7 @@ files = [ name = "hyperframe" version = "6.0.1" description = "HTTP/2 framing layer for Python" +category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -912,6 +950,7 @@ files = [ name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" +category = "main" optional = false python-versions = ">=3.5" files = [ @@ -923,6 +962,7 @@ files = [ name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -934,6 +974,7 @@ files = [ name = "itsdangerous" version = "1.1.0" description = "Various helpers to pass data to untrusted environments and back." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -945,6 +986,7 @@ files = [ name = "jinja2" version = "2.11.3" description = "A very fast and expressive template engine." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -962,6 +1004,7 @@ i18n = ["Babel (>=0.8)"] name = "jsonschema" version = "3.2.0" description = "An implementation of JSON Schema validation for Python" +category = "main" optional = false python-versions = "*" files = [ @@ -983,6 +1026,7 @@ format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-va name = "kaitaistruct" version = "0.9" description = "Kaitai Struct declarative parser generator for binary data: runtime library for Python" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" files = [ @@ -993,6 +1037,7 @@ files = [ name = "ldap3" version = "2.8.1" description = "A strictly RFC 4510 conforming LDAP V3 pure Python client library" +category = "main" optional = false python-versions = "*" files = [ @@ -1007,6 +1052,7 @@ pyasn1 = ">=0.4.6" name = "markupsafe" version = "2.0.1" description = "Safely add untrusted strings to HTML/XML markup." +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1085,6 +1131,7 @@ files = [ name = "mitmproxy" version = "5.3.0" description = "An interactive, SSL/TLS-capable intercepting proxy for HTTP/1, HTTP/2, and WebSockets." +category = "main" optional = false python-versions = "*" files = [ @@ -1126,6 +1173,7 @@ dev = ["Flask (>=1.0,<1.2)", "asynctest (>=0.12.0)", "hypothesis (>=5.8,<6)", "p name = "msgpack" version = "1.0.7" description = "MessagePack serializer" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1191,6 +1239,7 @@ files = [ name = "multidict" version = "6.0.4" description = "multidict implementation" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1274,6 +1323,7 @@ files = [ name = "mypy" version = "1.5.1" description = "Optional static typing for Python" +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1320,6 +1370,7 @@ reports = ["lxml"] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." +category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1331,6 +1382,7 @@ files = [ name = "packaging" version = "23.2" description = "Core utilities for Python packages" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1342,6 +1394,7 @@ files = [ name = "paramiko" version = "2.12.0" description = "SSH2 protocol library" +category = "main" optional = false python-versions = "*" files = [ @@ -1365,6 +1418,7 @@ invoke = ["invoke (>=1.3)"] name = "passlib" version = "1.7.4" description = "comprehensive password hashing framework supporting over 30 schemes" +category = "main" optional = false python-versions = "*" files = [ @@ -1382,6 +1436,7 @@ totp = ["cryptography"] name = "pastel" version = "0.2.1" description = "Bring colors to your terminal." +category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1393,6 +1448,7 @@ files = [ name = "pathspec" version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1404,6 +1460,7 @@ files = [ name = "pip" version = "23.2.1" description = "The PyPA recommended tool for installing Python packages." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1415,6 +1472,7 @@ files = [ name = "pluggy" version = "1.3.0" description = "plugin and hook calling mechanisms for python" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1430,6 +1488,7 @@ testing = ["pytest", "pytest-benchmark"] name = "poethepoet" version = "0.22.1" description = "A task runner that works well with poetry." +category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1448,6 +1507,7 @@ poetry-plugin = ["poetry (>=1.0,<2.0)"] name = "protobuf" version = "3.13.0" description = "Protocol Buffers" +category = "main" optional = false python-versions = "*" files = [ @@ -1479,6 +1539,7 @@ six = ">=1.9" name = "publicsuffix2" version = "2.20191221" description = "Get a public suffix for a domain name using the Public Suffix List. Forked from and using the same API as the publicsuffix package." +category = "main" optional = false python-versions = "*" files = [ @@ -1490,6 +1551,7 @@ files = [ name = "pyasn1" version = "0.4.8" description = "ASN.1 types and codecs" +category = "main" optional = false python-versions = "*" files = [ @@ -1501,6 +1563,7 @@ files = [ name = "pycparser" version = "2.21" description = "C parser in Python" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1512,6 +1575,7 @@ files = [ name = "pydivert" version = "2.1.0" description = "Python binding to windivert driver" +category = "main" optional = false python-versions = "*" files = [ @@ -1527,6 +1591,7 @@ test = ["codecov (>=2.0.5)", "hypothesis (>=3.5.3)", "mock (>=1.0.1)", "pytest ( name = "pynacl" version = "1.5.0" description = "Python binding to the Networking and Cryptography (NaCl) library" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1553,6 +1618,7 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] name = "pyopenssl" version = "19.1.0" description = "Python wrapper module around the OpenSSL library" +category = "main" optional = false python-versions = "*" files = [ @@ -1572,6 +1638,7 @@ test = ["flaky", "pretend", "pytest (>=3.0.1)"] name = "pyparsing" version = "2.4.7" description = "Python parsing module" +category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1583,6 +1650,7 @@ files = [ name = "pyperclip" version = "1.8.2" description = "A cross-platform clipboard module for Python. (Only handles plain text for now.)" +category = "main" optional = false python-versions = "*" files = [ @@ -1593,6 +1661,7 @@ files = [ name = "pyrsistent" version = "0.19.3" description = "Persistent/Functional/Immutable data structures" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1629,6 +1698,7 @@ files = [ name = "pytest" version = "7.4.2" description = "pytest: simple powerful testing with Python" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1651,6 +1721,7 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-asyncio" version = "0.21.0" description = "Pytest support for asyncio" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1669,6 +1740,7 @@ testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy name = "pytest-split" version = "0.8.1" description = "Pytest plugin which splits the test suite to equally sized sub suites based on test execution time." +category = "main" optional = false python-versions = ">=3.7.1,<4.0" files = [ @@ -1683,6 +1755,7 @@ pytest = ">=5,<8" name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" +category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -1697,6 +1770,7 @@ six = ">=1.5" name = "python-dotenv" version = "0.21.1" description = "Read key-value pairs from a .env file and set them as environment variables" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1711,6 +1785,7 @@ cli = ["click (>=5.0)"] name = "pywin32" version = "306" description = "Python for Window Extensions" +category = "main" optional = false python-versions = "*" files = [ @@ -1734,6 +1809,7 @@ files = [ name = "pyyaml" version = "5.3.1" description = "YAML parser and emitter for Python" +category = "main" optional = false python-versions = "*" files = [ @@ -1756,6 +1832,7 @@ files = [ name = "regex" version = "2023.10.3" description = "Alternative regular expression module, to replace re." +category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1853,6 +1930,7 @@ files = [ name = "requests" version = "2.31.0" description = "Python HTTP for Humans." +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1874,6 +1952,7 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "ruamel-yaml" version = "0.16.13" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" +category = "main" optional = false python-versions = "*" files = [ @@ -1889,6 +1968,7 @@ jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] name = "setuptools" version = "68.2.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1905,6 +1985,7 @@ testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jar name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1916,6 +1997,7 @@ files = [ name = "sortedcontainers" version = "2.2.2" description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +category = "main" optional = false python-versions = "*" files = [ @@ -1927,6 +2009,7 @@ files = [ name = "texttable" version = "1.7.0" description = "module to create simple ASCII tables" +category = "main" optional = false python-versions = "*" files = [ @@ -1938,6 +2021,7 @@ files = [ name = "tomli" version = "1.2.3" description = "A lil' TOML parser" +category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1949,6 +2033,7 @@ files = [ name = "tornado" version = "6.3.3" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +category = "main" optional = false python-versions = ">= 3.8" files = [ @@ -1969,6 +2054,7 @@ files = [ name = "transitions" version = "0.8.11" description = "A lightweight, object-oriented Python state machine implementation with many extensions." +category = "main" optional = false python-versions = "*" files = [ @@ -1987,6 +2073,7 @@ test = ["pytest"] name = "typing-extensions" version = "4.8.0" description = "Backported and Experimental Type Hints for Python 3.8+" +category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1998,6 +2085,7 @@ files = [ name = "urllib3" version = "1.26.17" description = "HTTP library with thread-safe connection pooling, file post, and more." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ @@ -2014,6 +2102,7 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] name = "urwid" version = "2.1.2" description = "A full-featured console (xterm et al.) user interface library" +category = "main" optional = false python-versions = "*" files = [ @@ -2024,6 +2113,7 @@ files = [ name = "websocket-client" version = "0.59.0" description = "WebSocket client for Python with low level API options" +category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2038,6 +2128,7 @@ six = "*" name = "werkzeug" version = "1.0.1" description = "The comprehensive WSGI web application library." +category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -2053,6 +2144,7 @@ watchdog = ["watchdog"] name = "wsproto" version = "0.15.0" description = "WebSockets state-machine based protocol implementation" +category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -2067,6 +2159,7 @@ h11 = ">=0.8.1" name = "ya-aioclient" version = "0.6.4" description = "" +category = "main" optional = false python-versions = ">=3.6,<4.0" files = [ @@ -2083,6 +2176,7 @@ python-dateutil = ">=2.8.1,<3.0.0" name = "yarl" version = "1.9.2" description = "Yet another URL library" +category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2170,6 +2264,7 @@ multidict = ">=4.0" name = "zstandard" version = "0.14.1" description = "Zstandard bindings for Python" +category = "main" optional = false python-versions = "*" files = [ @@ -2235,4 +2330,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10.1" -content-hash = "2f2cc4545adb5436924a94e2b87e674b5e345b0cfb8e4287961d80605a9a2cd3" +content-hash = "7f6d6a57c42e258a855f4ad9dc622726c9f43fbf5138e8f5d371c6cf9f4c0d5a" diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index e2e909ab46..43c0adec4b 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -8,10 +8,7 @@ version = "0.1.1" description = "Integration tests for yagna" authors = ["GolemFactory "] license = "LGPL-3.0-or-later" -classifiers = [ - "Development Status :: 3 - Alpha", - "Framework :: AsyncIO", -] +classifiers = ["Development Status :: 3 - Alpha", "Framework :: AsyncIO"] repository = "https://github.com/golemfactory/yagna" documentation = "https://handbook.golem.network" readme = "README.md" @@ -28,9 +25,9 @@ python = "^3.10.1" pytest = "^7.4" pytest-asyncio = "0.21" pytest-split = "^0.8.1" -goth = "0.15.8" +# goth = "0.15.8" # to use development goth version uncomment below -# goth = { git = "https://github.com/golemfactory/goth.git", rev = "7b2c1eca74ebfd1fc6bf25322ad26a0b4b7467c6" } +goth = { git = "https://github.com/golemfactory/goth.git", rev = "2c2c8a8b01324350eb5968171fe9e38d333b90f4" } [tool.poetry.dev-dependencies] black = "21.7b0" From 42828e7cdd205cf4cce1b609723587474b7979f9 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Fri, 20 Oct 2023 20:10:34 +0200 Subject: [PATCH 108/123] Updated payment lib --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index aa8b800d71..6cb6c563de 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1869,7 +1869,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.2.2" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=eca355f270f55cfa7f9551b4b8690e84f7834138#eca355f270f55cfa7f9551b4b8690e84f7834138" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=0d6887c9150e37159e08763016320d7e854f0697#0d6887c9150e37159e08763016320d7e854f0697" dependencies = [ "actix-files", "actix-web", diff --git a/Cargo.toml b/Cargo.toml index 4ce8220b3d..73230b9a1a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -224,7 +224,7 @@ members = [ # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "eca355f270f55cfa7f9551b4b8690e84f7834138" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "0d6887c9150e37159e08763016320d7e854f0697" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.2.2" } rand = "0.8.5" From dd3c6e0672fd0a6d0f5c1864b262fb8eb3229859 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Mon, 23 Oct 2023 18:43:49 +0200 Subject: [PATCH 109/123] payment: Proceed with sending PaymentSyncRequest-s even if one fails --- core/payment/src/payment_sync.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/core/payment/src/payment_sync.rs b/core/payment/src/payment_sync.rs index d7af672915..3b04a5d6e6 100644 --- a/core/payment/src/payment_sync.rs +++ b/core/payment/src/payment_sync.rs @@ -204,11 +204,15 @@ async fn send_sync_requests_impl(db: DbExecutor) -> anyhow::Result<()> { tokio::time::sleep(std::time::Duration::from_secs(30)).await; log::debug!("Sending PaymentSyncRequest to [{peer_id}]"); - ya_net::from(node_id) + let result = ya_net::from(node_id) .to(peer_id) .service(payment::public::BUS_ID) .call(PaymentSyncRequest) - .await??; + .await; + + if let Err(e) = result { + log::debug!("Couldn't deliver PaymentSyncRequest to [{peer_id}]: {e}"); + } } } From 455d211e230951e36a63593ec39ff780be55bc84 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Wed, 25 Oct 2023 19:08:24 +0200 Subject: [PATCH 110/123] Update to new erc20lib --- Cargo.lock | 4 ++-- Cargo.toml | 2 +- .../erc20next/config-payments.toml | 19 +++++++++++++++++-- core/payment-driver/erc20next/src/service.rs | 2 +- core/payment/src/payment_sync.rs | 2 +- 5 files changed, 22 insertions(+), 7 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6cb6c563de..51cb0b0e1f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1868,8 +1868,8 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" -version = "0.2.2" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=0d6887c9150e37159e08763016320d7e854f0697#0d6887c9150e37159e08763016320d7e854f0697" +version = "0.3.0" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=84941d52ed78053ce605e4a36f986b01f05beb0f#84941d52ed78053ce605e4a36f986b01f05beb0f" dependencies = [ "actix-files", "actix-web", diff --git a/Cargo.toml b/Cargo.toml index 73230b9a1a..5de53e2546 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -224,7 +224,7 @@ members = [ # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "0d6887c9150e37159e08763016320d7e854f0697" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "84941d52ed78053ce605e4a36f986b01f05beb0f" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.2.2" } rand = "0.8.5" diff --git a/core/payment-driver/erc20next/config-payments.toml b/core/payment-driver/erc20next/config-payments.toml index 1f35d688cf..178b868776 100644 --- a/core/payment-driver/erc20next/config-payments.toml +++ b/core/payment-driver/erc20next/config-payments.toml @@ -1,6 +1,21 @@ [engine] -service-sleep = 1 -process-sleep = 1 +# proces interval (in seconds) is to set how often we want to recheck transaction status +# minimum 1 second, sensible maximum around 60 seconds +process-interval = 15 +# proces interval after send (in seconds) is to set how long to wait after sending transaction before checking for confirmation +# sensible minimum 20 seconds, sensible maximum around 60 seconds +process-interval-after-send = 30 +# proces interval after error (in seconds) is to set how long to wait after encountering error before trying again +# minimum 1 second, sensible maximum around 60 seconds +process-interval-after-error = 25 +# report alive interval (in seconds) is to set how often we want to report that we are alive +# minimum 1 second, maximum is capped by gather-interval +report-alive-interval = 30 +# gather interval (in seconds) is to set how often payments are gathered +# minimum 1 second, no maximum limit +gather-interval = 60 +# gather payments on payment driver start (otherwise wait for first gather-interval) +gather-at-start = true automatic-recover = false [chain.goerli] diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index 8124610c6d..d5548454da 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -81,7 +81,7 @@ impl Erc20NextService { for (network, chain) in &mut config.chain { let prefix = network.to_ascii_uppercase(); - let Some(token) = &mut chain.token else { continue }; + let mut token = chain.token.clone(); let symbol = token.symbol.to_ascii_uppercase(); let rpc_env = format!("{prefix}_GETH_ADDR"); diff --git a/core/payment/src/payment_sync.rs b/core/payment/src/payment_sync.rs index 3b04a5d6e6..986f4db03c 100644 --- a/core/payment/src/payment_sync.rs +++ b/core/payment/src/payment_sync.rs @@ -64,7 +64,7 @@ async fn payment_sync(db: &DbExecutor, peer_id: NodeId) -> anyhow::Result Date: Wed, 25 Oct 2023 19:18:05 +0200 Subject: [PATCH 111/123] Updated erc20lib version --- Cargo.lock | 2 +- Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 51cb0b0e1f..4fce68541c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1869,7 +1869,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.3.0" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=84941d52ed78053ce605e4a36f986b01f05beb0f#84941d52ed78053ce605e4a36f986b01f05beb0f" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=f75d7a6819c64c1701c38e6551d29f15bb16e164#f75d7a6819c64c1701c38e6551d29f15bb16e164" dependencies = [ "actix-files", "actix-web", diff --git a/Cargo.toml b/Cargo.toml index 5de53e2546..67e9fd8844 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -224,7 +224,7 @@ members = [ # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "84941d52ed78053ce605e4a36f986b01f05beb0f" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "f75d7a6819c64c1701c38e6551d29f15bb16e164" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.2.2" } rand = "0.8.5" From 09ff5e30c614ef25d58049c2cdb25dd6d7ad0302 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Thu, 26 Oct 2023 11:51:56 +0200 Subject: [PATCH 112/123] erc20_payment_lib = { version = "=0.3.1" } --- Cargo.lock | 5 +++-- Cargo.toml | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4fce68541c..6c1e4160fc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1868,8 +1868,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" -version = "0.3.0" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=f75d7a6819c64c1701c38e6551d29f15bb16e164#f75d7a6819c64c1701c38e6551d29f15bb16e164" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87089d68e729591f5fe8a4d2c9d4cb565fd552af42d97161bbabe3cf6fa65a2d" dependencies = [ "actix-files", "actix-web", diff --git a/Cargo.toml b/Cargo.toml index 67e9fd8844..3cd3a3ca0c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -224,9 +224,9 @@ members = [ # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "f75d7a6819c64c1701c38e6551d29f15bb16e164" } +#erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "f75d7a6819c64c1701c38e6551d29f15bb16e164" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } -#erc20_payment_lib = { version = "=0.2.2" } +erc20_payment_lib = { version = "=0.3.1" } rand = "0.8.5" url = "2.3.1" trust-dns-resolver = "0.22" From 6916faf029c6a5fa8e5f992503598971c5d2011d Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Fri, 27 Oct 2023 10:05:53 +0200 Subject: [PATCH 113/123] payment: Fix PaymentSyncNotifs schema --- Cargo.lock | 2 +- core/payment/src/dao/sync_notifs.rs | 2 +- core/payment/src/models/sync_notifs.rs | 8 ++++---- core/payment/src/payment_sync.rs | 4 ++-- core/payment/src/schema.rs | 2 +- 5 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 6c1e4160fc..73a60ba0a6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -7124,7 +7124,7 @@ checksum = "e7141e445af09c8919f1d5f8a20dae0b20c3b57a45dee0d5823c6ed5d237f15a" dependencies = [ "bitflags 1.3.2", "chrono", - "rustc_version 0.4.0", + "rustc_version 0.2.3", ] [[package]] diff --git a/core/payment/src/dao/sync_notifs.rs b/core/payment/src/dao/sync_notifs.rs index 2f2f3603f1..941cf5e9aa 100644 --- a/core/payment/src/dao/sync_notifs.rs +++ b/core/payment/src/dao/sync_notifs.rs @@ -39,7 +39,7 @@ impl<'c> SyncNotifsDao<'c> { do_with_transaction(self.pool, move |conn| { let mut read: ReadObj = dsl::pay_sync_needed_notifs.find(peer_id).first(conn)?; read.retries += 1; - read.timestamp = ts; + read.last_ping = ts; diesel::update(dsl::pay_sync_needed_notifs.find(peer_id)) .set(WriteObj::from_read(read)) diff --git a/core/payment/src/models/sync_notifs.rs b/core/payment/src/models/sync_notifs.rs index 8ed3624c7a..e2998d1366 100644 --- a/core/payment/src/models/sync_notifs.rs +++ b/core/payment/src/models/sync_notifs.rs @@ -6,7 +6,7 @@ use ya_client_model::NodeId; #[table_name = "pay_sync_needed_notifs"] pub struct WriteObj { pub id: NodeId, - pub timestamp: Option, + pub last_ping: Option, pub retries: Option, } @@ -14,7 +14,7 @@ impl WriteObj { pub fn new(id: NodeId) -> Self { WriteObj { id, - timestamp: None, + last_ping: None, retries: None, } } @@ -22,7 +22,7 @@ impl WriteObj { pub fn from_read(read: ReadObj) -> Self { WriteObj { id: read.id, - timestamp: Some(read.timestamp), + last_ping: Some(read.last_ping), retries: Some(read.retries), } } @@ -32,6 +32,6 @@ impl WriteObj { #[table_name = "pay_sync_needed_notifs"] pub struct ReadObj { pub id: NodeId, - pub timestamp: NaiveDateTime, + pub last_ping: NaiveDateTime, pub retries: i32, } diff --git a/core/payment/src/payment_sync.rs b/core/payment/src/payment_sync.rs index 986f4db03c..9f52e22ace 100644 --- a/core/payment/src/payment_sync.rs +++ b/core/payment/src/payment_sync.rs @@ -113,7 +113,7 @@ async fn send_sync_notifs(db: &DbExecutor) -> anyhow::Result> { let next_wakeup = all_notifs .iter() .map(|entry| { - let next_deadline = entry.timestamp + exp_backoff(entry.retries as _); + let next_deadline = entry.last_ping + exp_backoff(entry.retries as _); next_deadline.and_utc() }) .filter(|deadline| deadline > &cutoff) @@ -126,7 +126,7 @@ async fn send_sync_notifs(db: &DbExecutor) -> anyhow::Result> { .await? .into_iter() .filter(|entry| { - let next_deadline = entry.timestamp + exp_backoff(entry.retries as _); + let next_deadline = entry.last_ping + exp_backoff(entry.retries as _); next_deadline.and_utc() < cutoff && entry.retries <= SYNC_NOTIF_MAX_RETRIES as i32 }) .map(|entry| entry.id) diff --git a/core/payment/src/schema.rs b/core/payment/src/schema.rs index f042ee7a84..0d059d7ed7 100644 --- a/core/payment/src/schema.rs +++ b/core/payment/src/schema.rs @@ -195,7 +195,7 @@ table! { table! { pay_sync_needed_notifs (id) { id -> Text, - timestamp -> Timestamp, + last_ping -> Timestamp, retries -> Integer, } } From 446877d885a52a5b1c8b01c68ef19cbd03e46719 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Mon, 30 Oct 2023 14:58:48 +0100 Subject: [PATCH 114/123] Fix payment status in golemsp for multiple drivers (#2860) * Add ERC20NEXT_DRIVER to DRIVER * Prefer erc20 over erc20next for checking driver status. --- golem_cli/src/command/yagna.rs | 5 ++++- golem_cli/src/status.rs | 19 +++++++++++++------ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/golem_cli/src/command/yagna.rs b/golem_cli/src/command/yagna.rs index 14aa09f237..93698b205f 100644 --- a/golem_cli/src/command/yagna.rs +++ b/golem_cli/src/command/yagna.rs @@ -124,7 +124,10 @@ lazy_static! { name: "erc20next", } }; - pub static ref DRIVERS: Vec<&'static PaymentDriver> = vec![&ERC20_DRIVER]; + + // Drivers are searched in order when more than one supports a given network, + // so erc20next should be preferred over erc20. + pub static ref DRIVERS: Vec<&'static PaymentDriver> = vec![&ERC20NEXT_DRIVER, &ERC20_DRIVER]; } impl PaymentDriver { diff --git a/golem_cli/src/status.rs b/golem_cli/src/status.rs index 0ca0b71dfc..ac32ac17f0 100644 --- a/golem_cli/src/status.rs +++ b/golem_cli/src/status.rs @@ -13,11 +13,20 @@ use ya_core_model::NodeId; use crate::appkey; use crate::command::{ - NetworkGroup, PaymentSummary, YaCommand, DRIVERS, ERC20_DRIVER, NETWORK_GROUP_MAP, + NetworkGroup, PaymentDriver, PaymentSummary, YaCommand, DRIVERS, ERC20_DRIVER, + NETWORK_GROUP_MAP, }; use crate::platform::Status as KvmStatus; use crate::utils::{is_yagna_running, payment_account}; +fn get_driver_for_network(network: &NetworkName) -> Option<&PaymentDriver> { + DRIVERS + .iter() + .find(|drv| drv.platform(network).is_ok()) + .as_deref() + .copied() +} + async fn payment_status( cmd: &YaCommand, network: &NetworkName, @@ -32,11 +41,9 @@ async fn payment_status( let mut f = vec![]; let mut l = vec![]; for nn in NETWORK_GROUP_MAP[&network_group].iter() { - for driver in DRIVERS.iter() { - if driver.platform(nn).is_ok() { - l.push(driver.status_label(nn)); - f.push(cmd.yagna()?.payment_status(&address, nn, driver)); - } + if let Some(driver) = get_driver_for_network(nn) { + l.push(driver.status_label(nn)); + f.push(cmd.yagna()?.payment_status(&address, nn, driver)); } } (f, l) From 6518402f93c23823ae7b7a6cd7e0590988cb044b Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 31 Oct 2023 10:42:59 +0100 Subject: [PATCH 115/123] General erc20next driver cleanup (#2868) * Bump goth * erc20next: Fix env config overrides * erc20next: handle TransferFinished events asynchronously * erc20next: add gather interval override log * erc20next: remove PaymentDriverCron usage * erc20next: fix confirmations env and update .env-template * erc20next: start payment_confirm_job in Erc20NextDriver::new --- .env-template | 17 ++- core/payment-driver/base/src/account.rs | 10 +- core/payment-driver/erc20/src/driver.rs | 24 ++-- core/payment-driver/erc20/src/driver/cli.rs | 2 +- core/payment-driver/erc20next/src/driver.rs | 133 ++++++++---------- .../erc20next/src/driver/cli.rs | 2 +- core/payment-driver/erc20next/src/service.rs | 38 ++--- goth_tests/domain/payments/goth-config.yml | 7 - goth_tests/pyproject.toml | 2 +- 9 files changed, 111 insertions(+), 124 deletions(-) diff --git a/.env-template b/.env-template index 108dda5d11..8d7f0792c2 100644 --- a/.env-template +++ b/.env-template @@ -53,15 +53,24 @@ YAGNA_DATADIR="." #POLYGON_GETH_ADDR=https://bor.golem.network,https://polygon-rpc.com #MUMBAI_GETH_ADDR=https://matic-mumbai.chainstacklabs.com -## ERC20 driver. -#ETH_FAUCET_ADDRESS=http://faucet.testnet.golem.network:4000/donate -#ERC20_RINKEBY_REQUIRED_CONFIRMATIONS=3 -#ERC20_MAINNET_REQUIRED_CONFIRMATIONS=5 +## T/GLM contract addresses #RINKEBY_TGLM_CONTRACT_ADDRESS=0xd94e3DC39d4Cad1DAd634e7eb585A57A19dC7EFE #RINKEBY_TGLM_FAUCET_ADDRESS=0x59259943616265A03d775145a2eC371732E2B06C #MAINNET_GLM_CONTRACT_ADDRESS=0x7DD9c5Cba05E151C895FDe1CF355C9A1D5DA6429 + +## Eth faucet address +#ETH_FAUCET_ADDRESS=http://faucet.testnet.golem.network:4000/donate + +## ERC20 driver. #ERC20_SENDOUT_INTERVAL_SECS=10 #ERC20_CONFIRMATION_INTERVAL_SECS=5 +#ERC20_RINKEBY_REQUIRED_CONFIRMATIONS=3 +#ERC20_MAINNET_REQUIRED_CONFIRMATIONS=5 + +## ERC20Next driver. +#ERC20NEXT_SENDOUT_INTERVAL_SECS=10 +#ERC20NEXT_RINKEBY_REQUIRED_CONFIRMATIONS=3 +#ERC20NEXT_MAINNET_REQUIRED_CONFIRMATIONS=5 ## Activity Service diff --git a/core/payment-driver/base/src/account.rs b/core/payment-driver/base/src/account.rs index 515a096f5a..66e7e8e185 100644 --- a/core/payment-driver/base/src/account.rs +++ b/core/payment-driver/base/src/account.rs @@ -3,10 +3,10 @@ */ // External crates -use std::cell::RefCell; use std::collections::HashMap; -use std::rc::Rc; +use std::sync::Arc; +use tokio::sync::Mutex; // Workspace uses use ya_core_model::identity::event::Event as IdentityEvent; @@ -14,15 +14,15 @@ use ya_core_model::identity::event::Event as IdentityEvent; use crate::driver::NodeId; // Public types -pub type AccountsRc = Rc>; +pub type AccountsArc = Arc>; pub struct Accounts { accounts: HashMap, } impl Accounts { - pub fn new_rc() -> AccountsRc { - Rc::new(RefCell::new(Self::new())) + pub fn new_rc() -> AccountsArc { + Arc::new(Mutex::new(Self::new())) } pub fn handle_event(&mut self, msg: IdentityEvent) { diff --git a/core/payment-driver/erc20/src/driver.rs b/core/payment-driver/erc20/src/driver.rs index f3aec71799..c32e5452ab 100644 --- a/core/payment-driver/erc20/src/driver.rs +++ b/core/payment-driver/erc20/src/driver.rs @@ -12,7 +12,7 @@ use ya_client_model::payment::DriverStatusProperty; // Workspace uses use ya_payment_driver::{ - account::{Accounts, AccountsRc}, + account::{Accounts, AccountsArc}, bus, cron::PaymentDriverCron, dao::DbExecutor, @@ -48,7 +48,7 @@ lazy_static::lazy_static! { } pub struct Erc20Driver { - active_accounts: AccountsRc, + active_accounts: AccountsArc, dao: Erc20Dao, sendout_lock: Mutex<()>, confirmation_lock: Mutex<()>, @@ -67,15 +67,21 @@ impl Erc20Driver { pub async fn load_active_accounts(&self) { log::debug!("load_active_accounts"); let unlocked_accounts = bus::list_unlocked_identities().await.unwrap(); - let mut accounts = self.active_accounts.borrow_mut(); + let mut accounts = self.active_accounts.lock().await; for account in unlocked_accounts { log::debug!("account={}", account); accounts.add_account(account) } } - fn is_account_active(&self, address: &str) -> Result<(), GenericError> { - match self.active_accounts.as_ref().borrow().get_node_id(address) { + async fn is_account_active(&self, address: &str) -> Result<(), GenericError> { + match self + .active_accounts + .as_ref() + .lock() + .await + .get_node_id(address) + { Some(_) => Ok(()), None => Err(GenericError::new(format!( "Account not active: {}", @@ -93,7 +99,7 @@ impl PaymentDriver for Erc20Driver { _caller: String, msg: IdentityEvent, ) -> Result<(), IdentityError> { - self.active_accounts.borrow_mut().handle_event(msg); + self.active_accounts.lock().await.handle_event(msg); Ok(()) } @@ -171,7 +177,7 @@ impl PaymentDriver for Erc20Driver { _caller: String, msg: Transfer, ) -> Result { - self.is_account_active(&msg.sender)?; + self.is_account_active(&msg.sender).await?; cli::transfer(&self.dao, msg).await } @@ -183,7 +189,7 @@ impl PaymentDriver for Erc20Driver { ) -> Result { log::debug!("schedule_payment: {:?}", msg); - self.is_account_active(&msg.sender())?; + self.is_account_active(&msg.sender()).await?; api::schedule_payment(&self.dao, msg).await } @@ -267,7 +273,7 @@ impl PaymentDriverCron for Erc20Driver { 'outer: for network_key in self.get_networks().keys() { let network = Network::from_str(network_key).unwrap(); // Process payment rows - let accounts = self.active_accounts.borrow().list_accounts(); + let accounts = self.active_accounts.lock().await.list_accounts(); for node_id in accounts { if let Err(e) = cron::process_payments_for_account(&self.dao, &node_id, network).await diff --git a/core/payment-driver/erc20/src/driver/cli.rs b/core/payment-driver/erc20/src/driver/cli.rs index 9453b0b38c..4b7bc453d8 100644 --- a/core/payment-driver/erc20/src/driver/cli.rs +++ b/core/payment-driver/erc20/src/driver/cli.rs @@ -30,7 +30,7 @@ pub async fn init(driver: &Erc20Driver, msg: Init) -> Result<(), GenericError> { // Ensure account is unlock before initialising send mode if mode.contains(AccountMode::SEND) { - driver.is_account_active(&address)? + driver.is_account_active(&address).await? } wallet::init_wallet( diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index 91db7f5552..c2ab5563ca 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -11,17 +11,17 @@ use ethereum_types::U256; use num_bigint::BigInt; use std::collections::HashMap; use std::str::FromStr; +use std::sync::Arc; use tokio::sync::mpsc::Receiver; -use tokio::sync::Mutex; +use tokio_util::task::LocalPoolHandle; use uuid::Uuid; use web3::types::H256; use ya_client_model::payment::DriverStatusProperty; // Workspace uses use ya_payment_driver::{ - account::{Accounts, AccountsRc}, + account::{Accounts, AccountsArc}, bus, - cron::PaymentDriverCron, dao::DbExecutor, driver::{ async_trait, BigDecimal, IdentityError, IdentityEvent, Network as NetworkConfig, @@ -38,49 +38,42 @@ use crate::{network::SUPPORTED_NETWORKS, DRIVER_NAME, RINKEBY_NETWORK}; mod cli; -lazy_static::lazy_static! { - static ref TX_SENDOUT_INTERVAL: std::time::Duration = std::time::Duration::from_secs( - std::env::var("ERC20NEXT_SENDOUT_INTERVAL_SECS") - .ok() - .and_then(|x| x.parse().ok()) - .unwrap_or(30), - ); - - static ref TX_CONFIRMATION_INTERVAL: std::time::Duration = std::time::Duration::from_secs( - std::env::var("ERC20NEXT_CONFIRMATION_INTERVAL_SECS") - .ok() - .and_then(|x| x.parse().ok()) - .unwrap_or(30), - ); -} - pub struct Erc20NextDriver { - active_accounts: AccountsRc, + active_accounts: AccountsArc, payment_runtime: PaymentRuntime, - events: Mutex>, } impl Erc20NextDriver { - pub fn new(payment_runtime: PaymentRuntime, events: Receiver) -> Self { - Self { + pub fn new(payment_runtime: PaymentRuntime, recv: Receiver) -> Arc { + let this = Arc::new(Self { active_accounts: Accounts::new_rc(), payment_runtime, - events: Mutex::new(events), - } + }); + + let this_ = Arc::clone(&this); + LocalPoolHandle::new(1).spawn_pinned(move || Self::payment_confirm_job(this_, recv)); + + this } pub async fn load_active_accounts(&self) { log::debug!("load_active_accounts"); let unlocked_accounts = bus::list_unlocked_identities().await.unwrap(); - let mut accounts = self.active_accounts.borrow_mut(); + let mut accounts = self.active_accounts.lock().await; for account in unlocked_accounts { log::debug!("account={}", account); accounts.add_account(account) } } - fn is_account_active(&self, address: &str) -> Result<(), GenericError> { - match self.active_accounts.as_ref().borrow().get_node_id(address) { + async fn is_account_active(&self, address: &str) -> Result<(), GenericError> { + match self + .active_accounts + .as_ref() + .lock() + .await + .get_node_id(address) + { Some(_) => Ok(()), None => Err(GenericError::new(format!( "Account not active: {}", @@ -96,7 +89,7 @@ impl Erc20NextDriver { amount: &BigDecimal, network: &str, ) -> Result { - self.is_account_active(sender)?; + self.is_account_active(sender).await?; let sender = H160::from_str(sender) .map_err(|err| GenericError::new(format!("Error when parsing sender {err:?}")))?; let receiver = H160::from_str(to) @@ -120,6 +113,38 @@ impl Erc20NextDriver { Ok(payment_id) } + async fn payment_confirm_job(this: Arc, mut events: Receiver) { + while let Some(event) = events.recv().await { + if let DriverEventContent::TransferFinished(transfer_finished) = &event.content { + match this + ._confirm_payments( + &transfer_finished.token_transfer_dao, + &transfer_finished.tx_dao, + ) + .await + { + Ok(_) => log::info!( + "Payment confirmed: {}", + transfer_finished + .token_transfer_dao + .payment_id + .clone() + .unwrap_or_default() + ), + Err(e) => log::error!( + "Error confirming payment: {}, error: {}", + transfer_finished + .token_transfer_dao + .payment_id + .clone() + .unwrap_or_default(), + e + ), + } + } + } + } + async fn _confirm_payments( &self, token_transfer: &TokenTransferDao, @@ -204,7 +229,7 @@ impl PaymentDriver for Erc20NextDriver { _caller: String, msg: IdentityEvent, ) -> Result<(), IdentityError> { - self.active_accounts.borrow_mut().handle_event(msg); + self.active_accounts.lock().await.handle_event(msg); Ok(()) } @@ -509,51 +534,3 @@ impl PaymentDriver for Erc20NextDriver { Ok(()) } } - -#[async_trait(?Send)] -impl PaymentDriverCron for Erc20NextDriver { - fn sendout_interval(&self) -> std::time::Duration { - *TX_SENDOUT_INTERVAL - } - - fn confirmation_interval(&self) -> std::time::Duration { - *TX_CONFIRMATION_INTERVAL - } - - async fn send_out_payments(&self) { - // no-op, handled by erc20_payment_lib internally - } - - async fn confirm_payments(&self) { - let mut events = self.events.lock().await; - while let Ok(event) = events.try_recv() { - if let DriverEventContent::TransferFinished(transfer_finished) = &event.content { - match self - ._confirm_payments( - &transfer_finished.token_transfer_dao, - &transfer_finished.tx_dao, - ) - .await - { - Ok(_) => log::info!( - "Payment confirmed: {}", - transfer_finished - .token_transfer_dao - .payment_id - .clone() - .unwrap_or_default() - ), - Err(e) => log::error!( - "Error confirming payment: {}, error: {}", - transfer_finished - .token_transfer_dao - .payment_id - .clone() - .unwrap_or_default(), - e - ), - } - } - } - } -} diff --git a/core/payment-driver/erc20next/src/driver/cli.rs b/core/payment-driver/erc20next/src/driver/cli.rs index e53c0bf3f8..c2ef6ebc5d 100644 --- a/core/payment-driver/erc20next/src/driver/cli.rs +++ b/core/payment-driver/erc20next/src/driver/cli.rs @@ -21,7 +21,7 @@ pub async fn init(driver: &Erc20NextDriver, msg: Init) -> Result<(), GenericErro // Ensure account is unlock before initialising send mode if mode.contains(AccountMode::SEND) { - driver.is_account_active(&address)? + driver.is_account_active(&address).await? } let network = network::network_like_to_network(msg.network()); diff --git a/core/payment-driver/erc20next/src/service.rs b/core/payment-driver/erc20next/src/service.rs index d5548454da..bf1cc1797b 100644 --- a/core/payment-driver/erc20next/src/service.rs +++ b/core/payment-driver/erc20next/src/service.rs @@ -9,10 +9,8 @@ use erc20_payment_lib::config::{AdditionalOptions, MultiContractSettings}; use erc20_payment_lib::misc::load_private_keys; use erc20_payment_lib::runtime::PaymentRuntime; use ethereum_types::H160; -use std::sync::Arc; // Workspace uses -use ya_payment_driver::cron::Cron; use ya_payment_driver::{ bus, dao::{init, DbExecutor}, @@ -63,13 +61,14 @@ impl Erc20NextService { log::warn!( "Format of the file may change in the future releases, use with caution!" ); + match config::Config::load(&path.join("config-payments.toml")).await { Ok(config_from_file) => { log::info!("Config file loaded successfully, overwriting default config"); config = config_from_file; } Err(err) => { - log::error!("Config file found but failed to load from file - using default config. Error: {}", err) + log::error!("Config file found but failed to load from file - using default config. Error: {err}") } } } else { @@ -79,17 +78,27 @@ impl Erc20NextService { ); } + let sendout_interval_env = "ERC20NEXT_SENDOUT_INTERVAL_SECS"; + if let Ok(sendout_interval) = env::var(sendout_interval_env) { + match sendout_interval.parse::() { + Ok(sendout_interval_secs) => { + log::info!("erc20next gather interval set to {sendout_interval_secs}s"); + config.engine.gather_interval = sendout_interval_secs; + }, + Err(e) => log::warn!("Value {sendout_interval} for {sendout_interval_env} is not a valid integer: {e}"), + } + } + for (network, chain) in &mut config.chain { let prefix = network.to_ascii_uppercase(); - let mut token = chain.token.clone(); - let symbol = token.symbol.to_ascii_uppercase(); + let symbol = chain.token.symbol.to_ascii_uppercase(); let rpc_env = format!("{prefix}_GETH_ADDR"); let priority_fee_env = format!("{prefix}_PRIORITY_FEE"); let max_fee_per_gas_env = format!("{prefix}_MAX_FEE_PER_GAS"); let token_addr_env = format!("{prefix}_{symbol}_CONTRACT_ADDRESS"); let multi_payment_addr_env = format!("{prefix}_MULTI_PAYMENT_CONTRACT_ADDRESS"); - let confirmations = format!("ERC20_{prefix}_REQUIRED_CONFIRMATIONS"); + let confirmations_env = format!("ERC20NEXT_{prefix}_REQUIRED_CONFIRMATIONS"); if let Ok(addr) = env::var(&rpc_env) { chain.rpc_endpoints = addr.split(',').map(ToOwned::to_owned).collect(); @@ -125,7 +134,7 @@ impl Erc20NextService { match H160::from_str(&addr) { Ok(parsed) => { log::info!("{network} token address set to {addr}"); - token.address = parsed; + chain.token.address = parsed; } Err(e) => { log::warn!( @@ -134,7 +143,7 @@ impl Erc20NextService { } }; } - if let Ok(confirmations) = env::var(&confirmations) { + if let Ok(confirmations) = env::var(&confirmations_env) { match confirmations.parse::() { Ok(parsed) => { log::info!("{network} required confirmations set to {parsed}"); @@ -167,7 +176,7 @@ impl Erc20NextService { } } - log::warn!("Starting payment engine: {:#?}", config); + log::debug!("Starting payment engine: {:#?}", config); let signer = IdentitySigner::new(); let (sender, recv) = tokio::sync::mpsc::channel(16); @@ -185,17 +194,10 @@ impl Erc20NextService { .await .unwrap(); - log::warn!("Payment engine started - outside task"); + log::debug!("Bind erc20next driver"); let driver = Erc20NextDriver::new(pr, recv); - driver.load_active_accounts().await; - let driver_rc = Arc::new(driver); - - bus::bind_service(db, driver_rc.clone()).await?; - - // Start cron - Cron::new(driver_rc); - log::debug!("Cron started"); + bus::bind_service(db, driver).await?; log::info!("Successfully connected Erc20NextService to gsb."); Ok(()) diff --git a/goth_tests/domain/payments/goth-config.yml b/goth_tests/domain/payments/goth-config.yml index 91536ef20d..2cd99a6097 100644 --- a/goth_tests/domain/payments/goth-config.yml +++ b/goth_tests/domain/payments/goth-config.yml @@ -4,7 +4,6 @@ # home directory. docker-compose: - # Path to compose file to be used, relative to `docker-dir` compose-file: "docker-compose.yml" docker-dir: "../../assets/docker/" @@ -26,13 +25,10 @@ docker-compose: ethereum-goerli: ".*Wallets supplied." ethereum-polygon: ".*Wallets supplied." - key-dir: "../../assets/keys" - web-root: "../../assets/web-root" - node-types: # Each node type is a collection of attributes common to a group of nodes. # Required attributes are "name" and "class". @@ -43,7 +39,6 @@ node-types: - "ERC20_SENDOUT_INTERVAL_SECS=1" - "ERC20_CONFIRMATION_INTERVAL_SECS=1" - "ERC20NEXT_SENDOUT_INTERVAL_SECS=1" - - "ERC20NEXT_CONFIRMATION_INTERVAL_SECS=1" - name: "Provider" class: "goth_tests.helpers.probe.ProviderProbe" @@ -59,10 +54,8 @@ node-types: - "DEBIT_NOTE_INTERVAL=3s" - "PAYMENT_TIMEOUT=5s" - "ERC20_CONFIRMATION_INTERVAL_SECS=1" - - "ERC20NEXT_CONFIRMATION_INTERVAL_SECS=1" nodes: - - name: "requestor" type: "Requestor" payment-config: "erc20" diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index 43c0adec4b..d1674945da 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -27,7 +27,7 @@ pytest-asyncio = "0.21" pytest-split = "^0.8.1" # goth = "0.15.8" # to use development goth version uncomment below -goth = { git = "https://github.com/golemfactory/goth.git", rev = "2c2c8a8b01324350eb5968171fe9e38d333b90f4" } +goth = { git = "https://github.com/golemfactory/goth.git", rev = "2d506620acfd843e60a0ba68dcfdfda966e4472a" } [tool.poetry.dev-dependencies] black = "21.7b0" From 0531aa5467e8953e4d09f845676bf768bf9bf75b Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 31 Oct 2023 10:49:57 +0100 Subject: [PATCH 116/123] payment: Detect tx overspending (#2867) A provider will now detect if a transaction will be used for multiple SendPayment instances exceeding the actual tx amount. --- core/payment/src/dao/payment.rs | 26 ++++++++++++++++++++++++++ core/payment/src/error.rs | 4 ++++ core/payment/src/processor.rs | 32 ++++++++++++++++++++++++++++++-- 3 files changed, 60 insertions(+), 2 deletions(-) diff --git a/core/payment/src/dao/payment.rs b/core/payment/src/dao/payment.rs index 834530c157..958ade449f 100644 --- a/core/payment/src/dao/payment.rs +++ b/core/payment/src/dao/payment.rs @@ -188,6 +188,32 @@ impl<'c> PaymentDao<'c> { .await } + pub async fn get_for_confirmation(&self, details: Vec) -> DbResult> { + readonly_transaction(self.pool, move |conn| { + let mut result = Vec::new(); + + let payments: Vec = dsl::pay_payment + .filter(dsl::details.eq(&details)) + .load(conn)?; + + for payment in payments { + let activity_payments = activity_pay_dsl::pay_activity_payment + .filter(activity_pay_dsl::payment_id.eq(&payment.id)) + .filter(activity_pay_dsl::owner_id.eq(&payment.owner_id)) + .load(conn)?; + let agreement_payments = agreement_pay_dsl::pay_agreement_payment + .filter(agreement_pay_dsl::payment_id.eq(&payment.id)) + .filter(agreement_pay_dsl::owner_id.eq(&payment.owner_id)) + .load(conn)?; + + result.push(payment.into_api_model(activity_payments, agreement_payments)) + } + + Ok(result) + }) + .await + } + pub async fn get_for_node_id( &self, node_id: NodeId, diff --git a/core/payment/src/error.rs b/core/payment/src/error.rs index 1d2984959f..0b28a511cf 100644 --- a/core/payment/src/error.rs +++ b/core/payment/src/error.rs @@ -355,6 +355,10 @@ pub mod processor { "Transaction balance too low (probably tx hash re-used)".to_owned(), )) } + + pub fn overspending(tx_amount: &BigDecimal, total_amount: &BigDecimal) -> Result<(), Self> { + Err(Self::Validation(format!("Transaction for {tx_amount} used for multiple payments amounting to {total_amount}"))) + } } #[derive(thiserror::Error, Debug)] diff --git a/core/payment/src/processor.rs b/core/payment/src/processor.rs index 2c895136fc..db6e6407a2 100644 --- a/core/payment/src/processor.rs +++ b/core/payment/src/processor.rs @@ -546,7 +546,7 @@ impl PaymentProcessor { }; let details: PaymentDetails = driver_endpoint(&driver) .send(driver::VerifyPayment::new( - confirmation, + confirmation.clone(), platform.clone(), payment.clone(), )) @@ -623,9 +623,37 @@ impl PaymentProcessor { } } - // Insert payment into database (this operation creates and updates all related entities) + // Verify totals for all agreements and activities with the same confirmation let payment_dao: PaymentDao = self.db_executor.as_dao(); + let shared_payments = payment_dao + .get_for_confirmation(confirmation.confirmation) + .await?; + let all_payment_sum = shared_payments + .iter() + .map(|payment| { + let agreement_total = payment + .agreement_payments + .iter() + .map(|ap| &ap.amount) + .sum::(); + + let activity_total = payment + .activity_payments + .iter() + .map(|ap| &ap.amount) + .sum::(); + + agreement_total + activity_total + }) + .sum::(); + + if &all_payment_sum + agreement_sum + activity_sum > details.amount { + return VerifyPaymentError::overspending(&details.amount, &all_payment_sum); + } + + // Insert payment into database (this operation creates and updates all related entities) payment_dao.insert_received(payment, payee_id).await?; + Ok(()) } From 08bb8d57295ae4fab9400a6567e635f7d5be3a75 Mon Sep 17 00:00:00 2001 From: scx1332 Date: Tue, 31 Oct 2023 12:06:06 +0100 Subject: [PATCH 117/123] fix unneeded deref --- golem_cli/src/status.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/golem_cli/src/status.rs b/golem_cli/src/status.rs index ac32ac17f0..a6a0ad2c1b 100644 --- a/golem_cli/src/status.rs +++ b/golem_cli/src/status.rs @@ -23,7 +23,6 @@ fn get_driver_for_network(network: &NetworkName) -> Option<&PaymentDriver> { DRIVERS .iter() .find(|drv| drv.platform(network).is_ok()) - .as_deref() .copied() } From 5f969fa6bd680b56547da1120e2215c4479eb183 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 31 Oct 2023 22:11:20 +0100 Subject: [PATCH 118/123] Bump erc20_payment_lib (#2869) * Bump erc20_payment_lib. * Handle NoToken status property. * Respect payment deadlines. * Enable payment verification. * Use total tx amount for verification, not the declared amount. * Update default configuration. * goth: remove sendout interval. --------- Co-authored-by: scx1332 --- Cargo.lock | 3 +- Cargo.toml | 4 +- .../erc20next/config-payments.toml | 35 +++++----- core/payment-driver/erc20next/src/driver.rs | 68 ++++++++++++++----- core/payment/src/processor.rs | 7 +- core/payment/src/service.rs | 17 ++--- goth_tests/domain/payments/goth-config.yml | 1 - 7 files changed, 84 insertions(+), 51 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 73a60ba0a6..4684ce228f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1869,8 +1869,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87089d68e729591f5fe8a4d2c9d4cb565fd552af42d97161bbabe3cf6fa65a2d" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=101e6bf331db3fd6b2b55813abc9ccccbc4960b7#101e6bf331db3fd6b2b55813abc9ccccbc4960b7" dependencies = [ "actix-files", "actix-web", diff --git a/Cargo.toml b/Cargo.toml index 3cd3a3ca0c..1412878372 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -224,9 +224,9 @@ members = [ # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -#erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "f75d7a6819c64c1701c38e6551d29f15bb16e164" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "101e6bf331db3fd6b2b55813abc9ccccbc4960b7" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } -erc20_payment_lib = { version = "=0.3.1" } +#erc20_payment_lib = { version = "=0.3.1" } rand = "0.8.5" url = "2.3.1" trust-dns-resolver = "0.22" diff --git a/core/payment-driver/erc20next/config-payments.toml b/core/payment-driver/erc20next/config-payments.toml index 178b868776..68602e4f6c 100644 --- a/core/payment-driver/erc20next/config-payments.toml +++ b/core/payment-driver/erc20next/config-payments.toml @@ -17,39 +17,39 @@ gather-interval = 60 # gather payments on payment driver start (otherwise wait for first gather-interval) gather-at-start = true automatic-recover = false +# set to true to not respect deadlines attached to payments +ignore-deadlines = false [chain.goerli] chain-name = "Goerli" chain-id = 5 -rpc-endpoints = [ - "https://ethereum-goerli-rpc.allthatnode.com", +rpc-endpoints = ["https://ethereum-goerli-rpc.allthatnode.com", + "https://rpc.goerli.mudit.blog", "https://rpc.slock.it/goerli", - "https://rpc.ankr.com/eth_goerli", -] + "https://www.ethercluster.com/goerli", + "https://rpc.ankr.com/eth_goerli"] currency-symbol = "tETH" -priority-fee = 1.5111 -max-fee-per-gas = 10.0 +priority-fee = 1.01 +max-fee-per-gas = 300.0 gas-left-warning-limit = 1000000 -transaction-timeout = 100 +transaction-timeout = 60 token = { address = "0x33af15c79d64b85ba14aaffaa4577949104b22e8", symbol = "tGLM" } -# multi-contract = { address = "0x7777784f803a7bf1d7f115f849d29ce5706da64a", max-at-once = 10 } +multi-contract = { address = "0x7777784f803a7bf1d7f115f849d29ce5706da64a", max-at-once = 10 } confirmation-blocks = 1 block-explorer-url = "https://goerli.etherscan.io" [chain.mumbai] chain-name = "Mumbai testnet" chain-id = 80001 -rpc-endpoints = [ - "https://rpc-mumbai.maticvigil.com/v1/fd04db1066cae0f44d3461ae6d6a7cbbdd46e4a5", -] +rpc-endpoints = ["https://rpc-mumbai.maticvigil.com/v1/fd04db1066cae0f44d3461ae6d6a7cbbdd46e4a5"] # rpc-endpoints = ["http://127.0.0.1:8545"] currency-symbol = "tMATIC" -priority-fee = 1.5111 -max-fee-per-gas = 500.0 +priority-fee = 1.01 +max-fee-per-gas = 300.0 gas-left-warning-limit = 1000000 -transaction-timeout = 100 +transaction-timeout = 60 token = { address = "0x2036807B0B3aaf5b1858EE822D0e111fDdac7018", symbol = "tGLM" } -# multi-contract = { address = "0x800010D7d0d315DCA795110ecCf0127cBd76b89f", max-at-once = 10 } +multi-contract = { address = "0x800010D7d0d315DCA795110ecCf0127cBd76b89f", max-at-once = 10 } confirmation-blocks = 1 block-explorer-url = "https://mumbai.polygonscan.com" @@ -61,8 +61,9 @@ currency-symbol = "MATIC" priority-fee = 30.111 max-fee-per-gas = 500.0 gas-left-warning-limit = 1000000 -transaction-timeout = 100 -token = { address = "0x2036807B0B3aaf5b1858EE822D0e111fDdac7018", symbol = "tGLM" } +transaction-timeout = 120 +token = { address = "0x0B220b82F3eA3B7F6d9A1D8ab58930C064A2b5Bf", symbol = "GLM" } # multi-contract = { address = "0x50100d4faf5f3b09987dea36dc2eddd57a3e561b", max-at-once = 10 } confirmation-blocks = 1 block-explorer-url = "https://polygonscan.com" + diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index c2ab5563ca..dd19b97f70 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -1,3 +1,4 @@ +use chrono::{DateTime, Duration, Utc}; /* Erc20Driver to handle payments on the erc20next network. @@ -5,7 +6,9 @@ */ // Extrnal crates use erc20_payment_lib::db::model::{TokenTransferDao, TxDao}; -use erc20_payment_lib::runtime::{DriverEvent, DriverEventContent, PaymentRuntime, TransferType}; +use erc20_payment_lib::runtime::{ + DriverEvent, DriverEventContent, PaymentRuntime, TransferType, VerifyTransactionResult, +}; use ethereum_types::H160; use ethereum_types::U256; use num_bigint::BigInt; @@ -88,6 +91,7 @@ impl Erc20NextDriver { to: &str, amount: &BigDecimal, network: &str, + deadline: Option>, ) -> Result { self.is_account_active(sender).await?; let sender = H160::from_str(sender) @@ -106,6 +110,7 @@ impl Erc20NextDriver { TransferType::Token, amount, &payment_id, + deadline, ) .await .map_err(|err| GenericError::new(format!("Error when inserting transfer {err:?}")))?; @@ -361,8 +366,14 @@ impl PaymentDriver for Erc20NextDriver { .network .ok_or(GenericError::new("Network not specified".to_string()))?; - self.do_transfer(&msg.sender, &msg.to, &msg.amount, &network) - .await + self.do_transfer( + &msg.sender, + &msg.to, + &msg.amount, + &network, + Some(Utc::now()), + ) + .await } async fn schedule_payment( @@ -379,8 +390,16 @@ impl PaymentDriver for Erc20NextDriver { msg.platform() )))?; - self.do_transfer(&msg.sender(), &msg.recipient(), &msg.amount(), network) - .await + let transfer_margin = Duration::minutes(2); + + self.do_transfer( + &msg.sender(), + &msg.recipient(), + &msg.amount(), + network, + Some(msg.due_date() - transfer_margin), + ) + .await } async fn verify_payment( @@ -393,7 +412,7 @@ impl PaymentDriver for Erc20NextDriver { let (network, _) = network::platform_to_network_token(msg.platform())?; let tx_hash = format!("0x{}", hex::encode(msg.confirmation().confirmation)); log::info!("Verifying transaction: {} on network {}", tx_hash, network); - let res = self + let verify_res = self .payment_runtime .verify_transaction( network as i64, @@ -408,18 +427,20 @@ impl PaymentDriver for Erc20NextDriver { .await .map_err(|err| GenericError::new(format!("Error verifying transaction: {}", err)))?; - if res.verified { - Ok(PaymentDetails { - recipient: msg.details.payee_addr.clone(), - sender: msg.details.payer_addr.clone(), - amount: msg.details.amount.clone(), - date: None, - }) - } else { - Err(GenericError::new(format!( - "Transaction not found: {}", - tx_hash - ))) + match verify_res { + VerifyTransactionResult::Verified { amount } => { + let amount_int = BigInt::from_str(&format!("{amount}")).unwrap(); + let amount = BigDecimal::new(amount_int, 18); + Ok(PaymentDetails { + recipient: msg.details.payee_addr.clone(), + sender: msg.details.payer_addr.clone(), + amount, + date: None, + }) + } + VerifyTransactionResult::Rejected(reason) => Err(GenericError::new(format!( + "Payment {tx_hash} rejected: {reason}", + ))), } } @@ -520,6 +541,17 @@ impl PaymentDriver for Erc20NextDriver { needed_gas_est: missing_gas.unwrap_or_default().to_string(), }) } + LibStatusProperty::NoToken { + chain_id, + missing_token, + } => { + let network = chain_id_to_net(chain_id); + network_filter(&network).then(|| DriverStatusProperty::InsufficientToken { + driver: DRIVER_NAME.into(), + network, + needed_token_est: missing_token.unwrap_or_default().to_string(), + }) + } }) .collect()) } diff --git a/core/payment/src/processor.rs b/core/payment/src/processor.rs index db6e6407a2..63268ee0fe 100644 --- a/core/payment/src/processor.rs +++ b/core/payment/src/processor.rs @@ -628,7 +628,7 @@ impl PaymentProcessor { let shared_payments = payment_dao .get_for_confirmation(confirmation.confirmation) .await?; - let all_payment_sum = shared_payments + let other_payment_total = shared_payments .iter() .map(|payment| { let agreement_total = payment @@ -647,8 +647,9 @@ impl PaymentProcessor { }) .sum::(); - if &all_payment_sum + agreement_sum + activity_sum > details.amount { - return VerifyPaymentError::overspending(&details.amount, &all_payment_sum); + let all_payment_total = &other_payment_total + agreement_sum + activity_sum; + if all_payment_total > details.amount { + return VerifyPaymentError::overspending(&details.amount, &all_payment_total); } // Insert payment into database (this operation creates and updates all related entities) diff --git a/core/payment/src/service.rs b/core/payment/src/service.rs index 38e5165408..ea239d8765 100644 --- a/core/payment/src/service.rs +++ b/core/payment/src/service.rs @@ -400,6 +400,7 @@ mod public { use super::*; + use crate::error::processor::VerifyPaymentError; use crate::error::DbError; use crate::payment_sync::{send_sync_notifs_job, send_sync_requests}; use crate::utils::*; @@ -818,18 +819,18 @@ mod public { .verify_payment(payment, signature) .await { - Ok(_) | Err(_) => { + Ok(_) => { counter!("payment.amount.received", ya_metrics::utils::cryptocurrency_to_u64(&amount), "platform" => platform); counter!("payment.invoices.provider.paid", num_paid_invoices); Ok(Ack {}) } - // Err(e) => match e { - // VerifyPaymentError::ConfirmationEncoding => { - // Err(SendError::BadRequest(e.to_string())) - // } - // VerifyPaymentError::Validation(e) => Err(SendError::BadRequest(e)), - // _ => Err(SendError::ServiceError(e.to_string())), - //}, + Err(e) => match e { + VerifyPaymentError::ConfirmationEncoding => { + Err(SendError::BadRequest(e.to_string())) + } + VerifyPaymentError::Validation(e) => Err(SendError::BadRequest(e)), + _ => Err(SendError::ServiceError(e.to_string())), + }, } } diff --git a/goth_tests/domain/payments/goth-config.yml b/goth_tests/domain/payments/goth-config.yml index 2cd99a6097..511ff1ce61 100644 --- a/goth_tests/domain/payments/goth-config.yml +++ b/goth_tests/domain/payments/goth-config.yml @@ -38,7 +38,6 @@ node-types: environment: - "ERC20_SENDOUT_INTERVAL_SECS=1" - "ERC20_CONFIRMATION_INTERVAL_SECS=1" - - "ERC20NEXT_SENDOUT_INTERVAL_SECS=1" - name: "Provider" class: "goth_tests.helpers.probe.ProviderProbe" From 74dfb7a46fc55cbd546615fe9ceea6e42ad27b7e Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 14 Nov 2023 10:45:57 +0100 Subject: [PATCH 119/123] payment: erc20next: add driver status events to debit notes & invoices (#2880) * payment: add driver status events to payable debit notes & invoices * Fix details ser/de for events. * General refactor. * erc20next: remove rpc.goerli.mudit.blog endpoint * erc20next: update readme.md * erc20next: add driver address to InsufficientGas and InsufficientToken statuses * payment: fix driver status events for was_already_ok case * payment: Add indexes on status columnt for pay_{invoice,debit_note} --- Cargo.lock | 8 +- Cargo.toml | 6 +- core/model/src/payment.rs | 13 +- core/payment-driver/base/src/bus.rs | 13 +- core/payment-driver/erc20next/Readme.md | 213 +++++------------ .../erc20next/config-payments.toml | 12 +- core/payment-driver/erc20next/src/driver.rs | 208 ++++++++-------- .../drop.sql | 3 + .../up.sql | 3 + core/payment/src/dao/activity.rs | 3 +- core/payment/src/dao/agreement.rs | 3 +- core/payment/src/dao/debit_note.rs | 33 ++- core/payment/src/dao/debit_note_event.rs | 50 +++- core/payment/src/dao/invoice.rs | 39 ++- core/payment/src/dao/invoice_event.rs | 50 +++- core/payment/src/models/debit_note_event.rs | 35 +-- core/payment/src/models/invoice_event.rs | 34 +-- core/payment/src/service.rs | 224 ++++++++++++++++++ 18 files changed, 619 insertions(+), 331 deletions(-) create mode 100644 core/payment/migrations/2023-11-13-123456_index_on_doc_status/drop.sql create mode 100644 core/payment/migrations/2023-11-13-123456_index_on_doc_status/up.sql diff --git a/Cargo.lock b/Cargo.lock index 4684ce228f..31e801a818 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1869,7 +1869,7 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "erc20_payment_lib" version = "0.3.1" -source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=101e6bf331db3fd6b2b55813abc9ccccbc4960b7#101e6bf331db3fd6b2b55813abc9ccccbc4960b7" +source = "git+https://github.com/golemfactory/erc20_payment_lib?rev=f3559980c8998f2865e593be73766ad2abcc11ca#f3559980c8998f2865e593be73766ad2abcc11ca" dependencies = [ "actix-files", "actix-web", @@ -7123,7 +7123,7 @@ checksum = "e7141e445af09c8919f1d5f8a20dae0b20c3b57a45dee0d5823c6ed5d237f15a" dependencies = [ "bitflags 1.3.2", "chrono", - "rustc_version 0.2.3", + "rustc_version 0.4.0", ] [[package]] @@ -7691,7 +7691,7 @@ dependencies = [ [[package]] name = "ya-client" version = "0.7.0" -source = "git+https://github.com/golemfactory/ya-client.git?rev=2bb679e3bb1d61eddd713d7f19ee127595f27162#2bb679e3bb1d61eddd713d7f19ee127595f27162" +source = "git+https://github.com/golemfactory/ya-client.git?rev=afdc1daf1f17a5128d911f8fff9d55c4f213e9af#afdc1daf1f17a5128d911f8fff9d55c4f213e9af" dependencies = [ "actix-codec", "awc", @@ -7715,7 +7715,7 @@ dependencies = [ [[package]] name = "ya-client-model" version = "0.5.0" -source = "git+https://github.com/golemfactory/ya-client.git?rev=2bb679e3bb1d61eddd713d7f19ee127595f27162#2bb679e3bb1d61eddd713d7f19ee127595f27162" +source = "git+https://github.com/golemfactory/ya-client.git?rev=afdc1daf1f17a5128d911f8fff9d55c4f213e9af#afdc1daf1f17a5128d911f8fff9d55c4f213e9af" dependencies = [ "bigdecimal 0.2.2", "chrono", diff --git a/Cargo.toml b/Cargo.toml index 1412878372..7eba711be2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -224,7 +224,7 @@ members = [ # diesel 1.4.* supports up to 0.23.0, but sqlx 0.5.9 requires 0.22.0 # sqlx 0.5.10 need 0.23.2, so 0.5.9 is last version possible libsqlite3-sys = { version = "0.26.0", features = ["bundled"] } -erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "101e6bf331db3fd6b2b55813abc9ccccbc4960b7" } +erc20_payment_lib = { git = "https://github.com/golemfactory/erc20_payment_lib", rev = "f3559980c8998f2865e593be73766ad2abcc11ca" } #erc20_payment_lib = { path = "../../payments/erc20_payment_lib/crates/erc20_payment_lib" } #erc20_payment_lib = { version = "=0.3.1" } rand = "0.8.5" @@ -270,8 +270,8 @@ ya-sb-util = { git = "https://github.com/golemfactory/ya-service-bus.git", rev = #ya-sb-util = { path = "../ya-service-bus/crates/util" } ## CLIENT -ya-client = { git = "https://github.com/golemfactory/ya-client.git", rev = "2bb679e3bb1d61eddd713d7f19ee127595f27162" } -ya-client-model = { git = "https://github.com/golemfactory/ya-client.git", rev = "2bb679e3bb1d61eddd713d7f19ee127595f27162" } +ya-client = { git = "https://github.com/golemfactory/ya-client.git", rev = "afdc1daf1f17a5128d911f8fff9d55c4f213e9af" } +ya-client-model = { git = "https://github.com/golemfactory/ya-client.git", rev = "afdc1daf1f17a5128d911f8fff9d55c4f213e9af" } ## RELAY and networking stack ya-relay-stack = { git = "https://github.com/golemfactory/ya-relay.git", rev = "c92a75b0cf062fcc9dbb3ea2a034d913e5fad8e5" } diff --git a/core/model/src/payment.rs b/core/model/src/payment.rs index d92e4a8fba..caf60c3a66 100644 --- a/core/model/src/payment.rs +++ b/core/model/src/payment.rs @@ -18,7 +18,7 @@ pub enum RpcMessageError { } pub mod local { - use super::*; + use super::{public::Ack, *}; use crate::driver::{AccountMode, GasDetails, PaymentConfirmation}; use bigdecimal::{BigDecimal, Zero}; use chrono::{DateTime, Utc}; @@ -424,6 +424,17 @@ pub mod local { Internal(String), } + #[derive(Clone, Debug, Serialize, Deserialize)] + pub struct PaymentDriverStatusChange { + pub properties: Vec, + } + + impl RpcMessage for PaymentDriverStatusChange { + const ID: &'static str = "PaymentDriverStatusChange"; + type Item = Ack; + type Error = GenericError; + } + #[derive(Clone, Debug, Serialize, Deserialize)] pub struct PaymentDriverStatus { pub driver: Option, diff --git a/core/payment-driver/base/src/bus.rs b/core/payment-driver/base/src/bus.rs index 256cc5a909..3edaff4214 100644 --- a/core/payment-driver/base/src/bus.rs +++ b/core/payment-driver/base/src/bus.rs @@ -7,6 +7,7 @@ // External crates use std::sync::Arc; +use ya_client_model::payment::DriverStatusProperty; // Workspace uses use ya_client_model::payment::driver_details::DriverDetails; use ya_client_model::NodeId; @@ -14,7 +15,7 @@ use ya_core_model::driver::{ driver_bus_id, AccountMode, GenericError, PaymentConfirmation, PaymentDetails, }; use ya_core_model::identity; -use ya_core_model::payment::local as payment_srv; +use ya_core_model::payment::local::{self as payment_srv, PaymentDriverStatusChange}; use ya_service_bus::{ typed::{service, ServiceBinder}, RpcEndpoint, @@ -191,3 +192,13 @@ pub async fn notify_payment( .map_err(GenericError::new)?; Ok(()) } + +pub async fn status_changed(properties: Vec) -> Result<(), GenericError> { + let msg = PaymentDriverStatusChange { properties }; + service(payment_srv::BUS_ID) + .send(msg) + .await + .map_err(GenericError::new)? + .map_err(GenericError::new)?; + Ok(()) +} diff --git a/core/payment-driver/erc20next/Readme.md b/core/payment-driver/erc20next/Readme.md index e44e2b8330..fd76dcf889 100644 --- a/core/payment-driver/erc20next/Readme.md +++ b/core/payment-driver/erc20next/Readme.md @@ -1,163 +1,56 @@ -## Current ERC20 transactions flow -Date: 2021-10-22 +# Erc20Next Payment driver +## Functionality +A payment driver is an abstraction over any operations relating to funds, which includes: +* Scheduling transfers to run at any point in the future. +* Verifying transfers done by other parties. +* Checking acount balance. +* Reporting status of scheduled transactions and the account. -Disclaimer: This is dev documentation not officially maintained, it is intended for internal development. - -Testing transfers: -This command will send 0.0001 GLMs from internal wallet to address 0x89Ef977db64A2597bA57E3eb4b717D3bAAeBaeC3 (use your own address for testing) -Note that service have to be running otherwise you get no connection error. - -``` -yagna.exe payment transfer --amount 0.0001 --driver erc20next --network mumbai --to-address 0x89Ef977db64A2597bA57E3eb4b717D3bAAeBaeC3 -``` - -You can specify extra options -* --gas-price (starting gas price in gwei) -* --max-gas-price (maximum allowed gas price in gwei) -* --gas-limit (limit of gas used in transaction). Better to leave default as it is not affecting cost of transaction. This is convenient for testing errors on blockchain. - -``` -yagna.exe payment transfer --amount 0.0001 --gas-price 1.1 --max-gas-price 60.4 --gas-limit 80000 --driver erc20next --network mumbai --to-address 0x89Ef977db64A2597bA57E3eb4b717D3bAAeBaeC3 -``` - -Networks currently supported: -* mainnnet (ETH mainnet, do not use) -* rinkeby (ETH testnet, good support) -* goerli (ETH testnet) -* mumbai (Polygon testnet) -* polygon (Polygon mainnet) +The Erc20Next driver is such an abstraction built on top of the [ERC20 standard](https://ethereum.org/en/developers/docs/standards/tokens/erc-20/). ## Implementation - -DB fields explained - -```sql - tx_id TEXT NOT NULL PRIMARY KEY, - sender TEXT NOT NULL, - nonce INTEGER NOT NULL DEFAULT -1, - status INTEGER NOT NULL, - tx_type INTEGER NOT NULL, - tmp_onchain_txs TEXT NULL, - final_tx TEXT NULL, - starting_gas_price DOUBLE NULL, - current_gas_price DOUBLE NULL, - max_gas_price DOUBLE NULL, - final_gas_price DOUBLE NULL, - final_gas_used INTEGER NULL, - gas_limit INTEGER NULL, - time_created DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - time_last_action DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, - time_sent DATETIME NULL, - time_confirmed DATETIME NULL, - network INTEGER NOT NULL DEFAULT 4, - last_error_msg TEXT NULL, - resent_times INT DEFAULT 0, - signature TEXT NULL, - encoded TEXT NOT NULL, -``` - -* tx_id - unique UUID4 generated for trasnsaction -* sender - internal yagna address used for sending transaction -* nonce - Ethereum nonce assigned to transaction -* status - status of the transaction: - * CREATED(1) - the transaction is submitted to db and wait to be sent - * SENT(2) - the transaction is successfully sent to the blockchain network - * PENDING(3) - the transaction is found on blockchain but waiting for execution - * CONFIRMED(4) - the transaction is confirmed and succeeded - * ERRORSENT(10) - transaction failed to be sent on-chain (not consuming nonce, has to be repeated) - * ERRORONCHAIN(11) - transaction is confirmed but failed on-chain (consuming nonce, cannot be repeated until new transaction is assigned to payment) -* tx_type (transfer or faucet transaction) -* tmp_onchain_txs - hashes of all transactions that are sent to the chain (important for checking transaction status when gas is increased) -* final_tx - onchain transaction hash only when transaction is CONFIRMED or ERRORONCHAIN. tmp_onchain_txs are removed to reduce clutter. -* starting_gas_price - gas in Gwei -* current_gas_price - starts with null then it has assigned higher level of gas until transaction is processed -* max_gas_price - limit for current_gas_price -* final_gas_price - assigned after transaction is CONFIRMED or ERRORONCHAIN. -* final_gas_used - assigned after transaction is CONFIRMED or ERRORONCHAIN. use final_gas_used * final_gas_price to have transaction cost in Gwei -* gas_limit - assigned max gas for transaction. If set to low ends with error during transaction sent or error on chain depending on set value. -* time_created - UTC time when entry is created. -* time_last_action - UTC time of last change of the entry. -* time_sent - UTC time of last succesfull sent. -* time_confirmed - UTC time of transaction confirmation (can be also when error on-chain) -* network - id of the Network (for example: 80001 is Mumbai, 137 is Polygon) -* last_error_msg - last error during sending or error onchain, Nulled when trasnaction is successfull -* resent_times - not used right now, intended to limit transaction retries -* signature - transaction signature -* encoded - YagnaRawTransaction encoded in json - -## Assigning nonces - -To process transaction in ethereum network you have to assign nonce which has to be strictly one greater than previous nonce. -This makes process of sending transaction tricky and complicated, because when you send two transactions with the same nonce one of them will fail. Other case is when one transaction is blocked or waiting others with higher nonce will get stuck too. -Currently for every transaction nonce is assigned and not changed until transaction will consume nonce on chain. - -Huge issue: When transaction is malformed and it get stuck, resend will not help and all transactions are blocked. - -With the implementation of the driver we are trying to resolve cases automatically but the process is complicated and not perfect right now. - -Good news: Nonce prevents double spending so we don't have to worry about that (unless we change the nonce) - -Note: Error on chain will consume nonce and gas and new nonce has to be assigned to proceed with transaction, which is currently not handled. - -## Bumping gas prices - -Problem on Ethereum network is as follows: -If you sent transaction you have only vague idea when transaction will be performed. -There is function that is estimating current gas price but it is far from perfect. -Also we want to pay for gas as little as possible. -For example on Polygon Network if you sent transaction for 30.01Gwei you can be pretty sure it get proceeded fairly smoothly -right now, but when the network is congested transaction can get stuck for indefinite amount of time. -When network usage is lower you can try to make transaction for lower gas fee (for example 20Gwei). -To resolve this issue we implemented automatic gas bumping. Every set amount of time gas is increased to increase probability of transaction getting processed. -That way we can save money on gas and also have bigger chance of transactions not getting stuck. - -Currently we proposed following gas levels for polygon network: -``` -10.011, //LOW PRIORITY -15.011, //LOW PRIORITY -20.011, //LOW PRIORITY -25.011, //LOW PRIORITY -30.011, //minimum suggested gas price - FAST PRIORITY -33.011, //not used -36.011, //not used -40.011, //not used -50.011, //not used -60.011, //EXPRESS PRIORITY -80.011, -100.011 -``` -Note that we add 0.011 to increase the chance of getting inline of someone setting whole number as gas price (which people tend to do). It costs almost nothing but significally increase your chance of transaction beeing processed. - -Note that on test networks gas doesn't matter and transaction is processed instantly regardless of gas set. So to test this -feature you have to use Polygon network and pay some Matic for gas. - -## VARIABLES: - -POLYGON_PRIORITY: -possible values: -slow - normal, low priority, economic mode, -fast - fast transaction (for testing or normal mode) -express - express transaction (for testing) - -ERC20_WAIT_FOR_PENDING_ON_NETWORK: (duration) -after that time transaction is resent with higher gas - -## List of known errors: - -Error when sending when gas-limit set too low -``` -RPC error: Error { code: ServerError(-32000), message: "intrinsic gas too low", data: None } -``` -``` -RPC error: Error { code: ServerError(-32000), message: "already known", data: None } -``` -``` -RPC error: Error { code: ServerError(-32000), message: "nonce too low", data: None } -``` - - - - - - - +The core implementation is in [erc20_payment_lib](https://github.com/golemfactory/erc20_payment_lib), this crate only serves as an interface connecting +it to yagna. + +## Configuration +### Via environment variables +#### Global settings +* `ERC20NEXT_SENDOUT_INTERVAL_SECS` -- The maximum interval at which transactions are batched and processed. A longer duration may conserve gas at the expense +of delivering payments at a later date. +#### Per-chain settings +In environment variables below, substitute `{CHAIN}` for the actual chain you wish to configure and `{GLM}` for the GLM symbol used on the chain. +To avoid confusion, `TGLM` is used on test chains that can mint GLM and `GLM` on non-test chains. +See `config-payments.toml` for the list of supported chains and token symbols. +* `{CHAIN}_GETH_ADDR` -- List of comma-separated RPC endpoints to be used. +* `{CHAIN}_PRIORITY_FEE` -- [priority fee](https://ethereum.org/nl/developers/docs/gas/#priority-fee). +* `{CHAIN}_MAX_FEE_PER_GAS` -- [max fee per gas](https://ethereum.org/nl/developers/docs/gas/#maxfee). +* `{CHAIN}_{SYMBOL}_CONTRACT_ADDRESS` -- Address of the GLM contract. +* `{CHAIN}_MULTI_PAYMENT_CONTRACT_ADDRESS` -- Address of a custom Golem contract allowing for executing multiple transfers at once. +* `ERC20NEXT_{CHAIN}_REQUIRED_CONFIRMATIONS` -- The number of confirmation blocks required to consider a transaction complete. + +Be aware that options not prefixed with `ERC20NEXT` are also applicable to the old Erc20 driver. + +### Via TOML file +* The default configuration can be seen in `config-payments.toml`. +* It can be overriden by placing a `config-payments.toml` file in yagna data directory. This is not recommended and is not guaranteed to work across versions. + +## Statuses +The Erc20Next driver can report a selection of statuses which indicate possible issues. +* `InsufficientGas`: + * An account does not have sufficient gas to execute further transactions. + * Contains: `driver`, `network`, `address`, `neededGasEst`. +* `InsufficientToken`: + * An account does not have sufficient funds to execute further transactions. + * Contains: `driver`, `network`, `address`, `neededTokenEst`. +* `InvalidChainId`: + * A transaction has been scheduled on a chain that is not present in the configuration. This can only happen if `payments-config.toml` has been changed in an incorrect manner. + * Contains: `driver`, `chainId`. +* `CantSign`: + * The transaction cannot be signed. This means that yagna cannot access the identitiy used for this transfer, which can be caused by it being removed or locked. + * Contains: `driver`, `network`, `address`. +* `TxStuck`: + * A transaction cannot proceed despite being sent to the blockchain. The most likely reason is too low `max fee` setting. + * Contains: `driver`, `network`. +* `RpcError`: + * An RPC endpoint is unreliable. Consider using a better selection of endpoints. + * `driver`, `network` \ No newline at end of file diff --git a/core/payment-driver/erc20next/config-payments.toml b/core/payment-driver/erc20next/config-payments.toml index 68602e4f6c..8f7e09a642 100644 --- a/core/payment-driver/erc20next/config-payments.toml +++ b/core/payment-driver/erc20next/config-payments.toml @@ -23,11 +23,12 @@ ignore-deadlines = false [chain.goerli] chain-name = "Goerli" chain-id = 5 -rpc-endpoints = ["https://ethereum-goerli-rpc.allthatnode.com", - "https://rpc.goerli.mudit.blog", +rpc-endpoints = [ + "https://ethereum-goerli-rpc.allthatnode.com", "https://rpc.slock.it/goerli", "https://www.ethercluster.com/goerli", - "https://rpc.ankr.com/eth_goerli"] + "https://rpc.ankr.com/eth_goerli", +] currency-symbol = "tETH" priority-fee = 1.01 max-fee-per-gas = 300.0 @@ -41,7 +42,9 @@ block-explorer-url = "https://goerli.etherscan.io" [chain.mumbai] chain-name = "Mumbai testnet" chain-id = 80001 -rpc-endpoints = ["https://rpc-mumbai.maticvigil.com/v1/fd04db1066cae0f44d3461ae6d6a7cbbdd46e4a5"] +rpc-endpoints = [ + "https://rpc-mumbai.maticvigil.com/v1/fd04db1066cae0f44d3461ae6d6a7cbbdd46e4a5", +] # rpc-endpoints = ["http://127.0.0.1:8545"] currency-symbol = "tMATIC" priority-fee = 1.01 @@ -66,4 +69,3 @@ token = { address = "0x0B220b82F3eA3B7F6d9A1D8ab58930C064A2b5Bf", symbol = "GLM" # multi-contract = { address = "0x50100d4faf5f3b09987dea36dc2eddd57a3e561b", max-at-once = 10 } confirmation-blocks = 1 block-explorer-url = "https://polygonscan.com" - diff --git a/core/payment-driver/erc20next/src/driver.rs b/core/payment-driver/erc20next/src/driver.rs index dd19b97f70..a2c7649fc7 100644 --- a/core/payment-driver/erc20next/src/driver.rs +++ b/core/payment-driver/erc20next/src/driver.rs @@ -120,34 +120,122 @@ impl Erc20NextDriver { async fn payment_confirm_job(this: Arc, mut events: Receiver) { while let Some(event) = events.recv().await { - if let DriverEventContent::TransferFinished(transfer_finished) = &event.content { - match this - ._confirm_payments( - &transfer_finished.token_transfer_dao, - &transfer_finished.tx_dao, - ) - .await - { - Ok(_) => log::info!( - "Payment confirmed: {}", - transfer_finished - .token_transfer_dao - .payment_id - .clone() - .unwrap_or_default() - ), - Err(e) => log::error!( - "Error confirming payment: {}, error: {}", - transfer_finished - .token_transfer_dao - .payment_id - .clone() - .unwrap_or_default(), - e - ), + match &event.content { + DriverEventContent::TransferFinished(transfer_finished) => { + match this + ._confirm_payments( + &transfer_finished.token_transfer_dao, + &transfer_finished.tx_dao, + ) + .await + { + Ok(_) => log::info!( + "Payment confirmed: {}", + transfer_finished + .token_transfer_dao + .payment_id + .clone() + .unwrap_or_default() + ), + Err(e) => log::error!( + "Error confirming payment: {}, error: {}", + transfer_finished + .token_transfer_dao + .payment_id + .clone() + .unwrap_or_default(), + e + ), + } } + DriverEventContent::StatusChanged(_) => { + if let Ok(status) = this._status(DriverStatus { network: None }).await { + log::info!("Payment driver [{DRIVER_NAME}] status changed: {status:#?}"); + bus::status_changed(status).await.ok(); + } + } + _ => {} + } + } + } + + async fn _status( + &self, + msg: DriverStatus, + ) -> Result, DriverStatusError> { + use erc20_payment_lib::runtime::StatusProperty as LibStatusProperty; + + // Map chain-id to network + let chain_id_to_net = |id: i64| self.payment_runtime.network_name(id).unwrap().to_string(); + + // check if network matches the filter + let network_filter = |net_candidate: &str| { + msg.network + .as_ref() + .map(|net| net == net_candidate) + .unwrap_or(true) + }; + + if let Some(network) = msg.network.as_ref() { + let found_net = self + .payment_runtime + .chains() + .into_iter() + .any(|id| &chain_id_to_net(id) == network); + + if !found_net { + return Err(DriverStatusError::NetworkNotFound(network.clone())); } } + + Ok(self + .payment_runtime + .get_status() + .await + .into_iter() + .flat_map(|prop| match prop { + LibStatusProperty::InvalidChainId { chain_id } => { + Some(DriverStatusProperty::InvalidChainId { + driver: DRIVER_NAME.into(), + chain_id, + }) + } + LibStatusProperty::CantSign { chain_id, address } => { + let network = chain_id_to_net(chain_id); + Some(DriverStatusProperty::CantSign { + driver: DRIVER_NAME.into(), + network, + address, + }) + } + LibStatusProperty::NoGas { + chain_id, + address, + missing_gas, + } => { + let network = chain_id_to_net(chain_id); + network_filter(&network).then(|| DriverStatusProperty::InsufficientGas { + driver: DRIVER_NAME.into(), + address, + network, + needed_gas_est: missing_gas.to_string(), + }) + } + LibStatusProperty::NoToken { + chain_id, + address, + missing_token, + } => { + let network = chain_id_to_net(chain_id); + network_filter(&network).then(|| DriverStatusProperty::InsufficientToken { + driver: DRIVER_NAME.into(), + address, + network, + needed_token_est: missing_token.to_string(), + }) + } + }) + .collect()) } async fn _confirm_payments( @@ -485,75 +573,7 @@ impl PaymentDriver for Erc20NextDriver { _caller: String, msg: DriverStatus, ) -> Result, DriverStatusError> { - use erc20_payment_lib::runtime::StatusProperty as LibStatusProperty; - - // Map chain-id to network - let chain_id_to_net = |id: i64| self.payment_runtime.network_name(id).unwrap().to_string(); - - // check if network matches the filter - let network_filter = |net_candidate: &str| { - msg.network - .as_ref() - .map(|net| net == net_candidate) - .unwrap_or(true) - }; - - if let Some(network) = msg.network.as_ref() { - let found_net = self - .payment_runtime - .chains() - .into_iter() - .any(|id| &chain_id_to_net(id) == network); - - if !found_net { - return Err(DriverStatusError::NetworkNotFound(network.clone())); - } - } - - Ok(self - .payment_runtime - .get_status() - .await - .into_iter() - .flat_map(|prop| match prop { - LibStatusProperty::InvalidChainId { chain_id } => { - Some(DriverStatusProperty::InvalidChainId { - driver: DRIVER_NAME.into(), - chain_id, - }) - } - LibStatusProperty::CantSign { chain_id, address } => { - let network = chain_id_to_net(chain_id); - Some(DriverStatusProperty::CantSign { - driver: DRIVER_NAME.into(), - network, - address, - }) - } - LibStatusProperty::NoGas { - chain_id, - missing_gas, - } => { - let network = chain_id_to_net(chain_id); - network_filter(&network).then(|| DriverStatusProperty::InsufficientGas { - driver: DRIVER_NAME.into(), - network, - needed_gas_est: missing_gas.unwrap_or_default().to_string(), - }) - } - LibStatusProperty::NoToken { - chain_id, - missing_token, - } => { - let network = chain_id_to_net(chain_id); - network_filter(&network).then(|| DriverStatusProperty::InsufficientToken { - driver: DRIVER_NAME.into(), - network, - needed_token_est: missing_token.unwrap_or_default().to_string(), - }) - } - }) - .collect()) + self._status(msg).await } async fn shut_down( diff --git a/core/payment/migrations/2023-11-13-123456_index_on_doc_status/drop.sql b/core/payment/migrations/2023-11-13-123456_index_on_doc_status/drop.sql new file mode 100644 index 0000000000..89726cac49 --- /dev/null +++ b/core/payment/migrations/2023-11-13-123456_index_on_doc_status/drop.sql @@ -0,0 +1,3 @@ +drop index pay_invoice_status; +drop index pay_debit_note_status; +drop index pay_debit_note_due_date; diff --git a/core/payment/migrations/2023-11-13-123456_index_on_doc_status/up.sql b/core/payment/migrations/2023-11-13-123456_index_on_doc_status/up.sql new file mode 100644 index 0000000000..1ebbce112d --- /dev/null +++ b/core/payment/migrations/2023-11-13-123456_index_on_doc_status/up.sql @@ -0,0 +1,3 @@ +create index if not exists pay_invoice_status on pay_invoice ("status"); +create index if not exists pay_debit_note_status on pay_debit_note ("status"); +create index if not exists pay_debit_note_due_date on pay_debit_note (payment_due_date); diff --git a/core/payment/src/dao/activity.rs b/core/payment/src/dao/activity.rs index ccf27c4700..5d2134e4be 100644 --- a/core/payment/src/dao/activity.rs +++ b/core/payment/src/dao/activity.rs @@ -103,11 +103,10 @@ pub fn increase_amount_paid( debit_note::update_status(&debit_note_ids, owner_id, &DocumentStatus::Settled, conn)?; for debit_note_id in debit_note_ids { - debit_note_event::create::<()>( + debit_note_event::create( debit_note_id, *owner_id, DebitNoteEventType::DebitNoteSettledEvent, - None, conn, )?; } diff --git a/core/payment/src/dao/agreement.rs b/core/payment/src/dao/agreement.rs index bea9b1c50c..944c4f5687 100644 --- a/core/payment/src/dao/agreement.rs +++ b/core/payment/src/dao/agreement.rs @@ -148,11 +148,10 @@ pub fn increase_amount_paid( if let Some((invoice_id, role)) = invoice_query { invoice::update_status(&invoice_id, owner_id, &DocumentStatus::Settled, conn)?; - invoice_event::create::<()>( + invoice_event::create( invoice_id, *owner_id, InvoiceEventType::InvoiceSettledEvent, - None, conn, )?; } diff --git a/core/payment/src/dao/debit_note.rs b/core/payment/src/dao/debit_note.rs index 4543d0e992..1bcaa4e676 100644 --- a/core/payment/src/dao/debit_note.rs +++ b/core/payment/src/dao/debit_note.rs @@ -138,11 +138,10 @@ impl<'c> DebitNoteDao<'c> { diesel::insert_into(dsl::pay_debit_note) .values(debit_note) .execute(conn)?; - debit_note_event::create::<()>( + debit_note_event::create( debit_note_id.clone(), owner_id, DebitNoteEventType::DebitNoteReceivedEvent, - None, conn, )?; Ok(debit_note_id) @@ -170,11 +169,10 @@ impl<'c> DebitNoteDao<'c> { diesel::insert_into(dsl::pay_debit_note) .values(debit_note) .execute(conn)?; - debit_note_event::create::<()>( + debit_note_event::create( debit_note_id, owner_id, DebitNoteEventType::DebitNoteReceivedEvent, - None, conn, )?; Ok(()) @@ -201,9 +199,30 @@ impl<'c> DebitNoteDao<'c> { .await } - pub async fn get_all(&self) -> DbResult> { + pub async fn list( + &self, + role: Option, + status: Option, + payable: Option, + ) -> DbResult> { readonly_transaction(self.pool, move |conn| { - let debit_notes: Vec = query!().order_by(dsl::timestamp.desc()).load(conn)?; + let mut query = query!().into_boxed(); + if let Some(role) = role { + query = query.filter(dsl::role.eq(role.to_string())); + } + if let Some(status) = status { + query = query.filter(dsl::status.eq(status.to_string())); + } + if let Some(payable) = payable { + // Payable debit notes have not-null payment_due_date. + if payable { + query = query.filter(dsl::payment_due_date.is_not_null()); + } else { + query = query.filter(dsl::payment_due_date.is_null()); + } + } + + let debit_notes: Vec = query.order_by(dsl::timestamp.desc()).load(conn)?; debit_notes.into_iter().map(TryInto::try_into).collect() }) .await @@ -272,7 +291,7 @@ impl<'c> DebitNoteDao<'c> { update_status(&vec![debit_note_id.clone()], &owner_id, &status, conn)?; activity::set_amount_accepted(&activity_id, &owner_id, &amount, conn)?; for event in events { - debit_note_event::create::<()>(debit_note_id.clone(), owner_id, event, None, conn)?; + debit_note_event::create(debit_note_id.clone(), owner_id, event, conn)?; } Ok(()) diff --git a/core/payment/src/dao/debit_note_event.rs b/core/payment/src/dao/debit_note_event.rs index c96f754ad7..4b0ddf6d19 100644 --- a/core/payment/src/dao/debit_note_event.rs +++ b/core/payment/src/dao/debit_note_event.rs @@ -4,7 +4,6 @@ use crate::schema::pay_debit_note_event::dsl as write_dsl; use crate::schema::pay_debit_note_event_read::dsl as read_dsl; use chrono::NaiveDateTime; use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl}; -use serde::Serialize; use std::borrow::Cow; use std::collections::HashSet; use std::convert::TryInto; @@ -15,14 +14,13 @@ use ya_persistence::executor::{ }; use ya_persistence::types::{AdaptTimestamp, Role}; -pub fn create( +pub fn create( debit_note_id: String, owner_id: NodeId, event_type: DebitNoteEventType, - details: Option, conn: &ConnType, ) -> DbResult<()> { - let event = WriteObj::new(debit_note_id, owner_id, event_type, details)?; + let event = WriteObj::new(debit_note_id, owner_id, event_type)?; diesel::insert_into(write_dsl::pay_debit_note_event) .values(event) .execute(conn)?; @@ -40,15 +38,53 @@ impl<'c> AsDao<'c> for DebitNoteEventDao<'c> { } impl<'c> DebitNoteEventDao<'c> { - pub async fn create( + pub async fn create( &self, debit_note_id: String, owner_id: NodeId, event_type: DebitNoteEventType, - details: Option, ) -> DbResult<()> { do_with_transaction(self.pool, move |conn| { - create(debit_note_id, owner_id, event_type, details, conn) + create(debit_note_id, owner_id, event_type, conn) + }) + .await + } + + pub async fn get_for_debit_note_id( + &self, + debit_note_id: String, + after_timestamp: Option, + max_events: Option, + app_session_id: Option, + requestor_events: Vec>, + provider_events: Vec>, + ) -> DbResult> { + readonly_transaction(self.pool, move |conn| { + let mut query = read_dsl::pay_debit_note_event_read + .filter(read_dsl::debit_note_id.eq(debit_note_id)) + .order_by(read_dsl::timestamp.asc()) + .into_boxed(); + if let Some(timestamp) = after_timestamp { + query = query.filter(read_dsl::timestamp.gt(timestamp.adapt())); + } + if let Some(app_session_id) = app_session_id { + query = query.filter(read_dsl::app_session_id.eq(app_session_id)); + } + if let Some(limit) = max_events { + query = query.limit(limit.into()); + } + let events: Vec = query.load(conn)?; + let requestor_events: HashSet> = + requestor_events.into_iter().collect(); + let provider_events: HashSet> = provider_events.into_iter().collect(); + events + .into_iter() + .filter(|e| match e.role { + Role::Requestor => requestor_events.contains(e.event_type.as_str()), + Role::Provider => provider_events.contains(e.event_type.as_str()), + }) + .map(TryInto::try_into) + .collect() }) .await } diff --git a/core/payment/src/dao/invoice.rs b/core/payment/src/dao/invoice.rs index 8b1e4c13c1..e4463519d8 100644 --- a/core/payment/src/dao/invoice.rs +++ b/core/payment/src/dao/invoice.rs @@ -112,11 +112,10 @@ impl<'c> InvoiceDao<'c> { .map(|_| ()) })?; - invoice_event::create::<()>( + invoice_event::create( invoice_id, owner_id, InvoiceEventType::InvoiceReceivedEvent, - None, conn, )?; @@ -139,6 +138,37 @@ impl<'c> InvoiceDao<'c> { self.insert(invoice, activity_ids).await } + pub async fn list( + &self, + role: Option, + status: Option, + ) -> DbResult> { + readonly_transaction(self.pool, move |conn| { + let mut query = query!().into_boxed(); + if let Some(role) = role { + query = query.filter(dsl::role.eq(role.to_string())); + } + if let Some(status) = status { + query = query.filter(dsl::status.eq(status.to_string())); + } + + let read_objs: Vec = query.order_by(dsl::timestamp.desc()).load(conn)?; + let mut invoices = Vec::::new(); + + for read_obj in read_objs { + let activity_ids = activity_dsl::pay_invoice_x_activity + .select(activity_dsl::activity_id) + .filter(activity_dsl::invoice_id.eq(&read_obj.id)) + .filter(activity_dsl::owner_id.eq(read_obj.owner_id)) + .load(conn)?; + invoices.push(read_obj.into_api_model(activity_ids)?); + } + + Ok(invoices) + }) + .await + } + pub async fn get(&self, invoice_id: String, owner_id: NodeId) -> DbResult> { readonly_transaction(self.pool, move |conn| { let invoice: Option = query!() @@ -273,7 +303,7 @@ impl<'c> InvoiceDao<'c> { agreement::set_amount_accepted(&agreement_id, &owner_id, &amount, conn)?; for event in events { - invoice_event::create::<()>(invoice_id.clone(), owner_id, event, None, conn)?; + invoice_event::create(invoice_id.clone(), owner_id, event, conn)?; } Ok(()) @@ -376,11 +406,10 @@ impl<'c> InvoiceDao<'c> { agreement::compute_amount_due(&agreement_id, &owner_id, conn)?; update_status(&invoice_id, &owner_id, &DocumentStatus::Cancelled, conn)?; - invoice_event::create::<()>( + invoice_event::create( invoice_id, owner_id, InvoiceEventType::InvoiceCancelledEvent, - None, conn, )?; diff --git a/core/payment/src/dao/invoice_event.rs b/core/payment/src/dao/invoice_event.rs index 46e7b302ca..3e50fa2b50 100644 --- a/core/payment/src/dao/invoice_event.rs +++ b/core/payment/src/dao/invoice_event.rs @@ -4,7 +4,6 @@ use crate::schema::pay_invoice_event::dsl as write_dsl; use crate::schema::pay_invoice_event_read::dsl as read_dsl; use chrono::NaiveDateTime; use diesel::{ExpressionMethods, QueryDsl, RunQueryDsl}; -use serde::Serialize; use std::borrow::Cow; use std::collections::HashSet; use std::convert::TryInto; @@ -15,14 +14,13 @@ use ya_persistence::executor::{ }; use ya_persistence::types::{AdaptTimestamp, Role}; -pub fn create( +pub fn create( invoice_id: String, owner_id: NodeId, event_type: InvoiceEventType, - details: Option, conn: &ConnType, ) -> DbResult<()> { - let event = WriteObj::new(invoice_id, owner_id, event_type, details)?; + let event = WriteObj::new(invoice_id, owner_id, event_type)?; diesel::insert_into(write_dsl::pay_invoice_event) .values(event) .execute(conn)?; @@ -40,15 +38,53 @@ impl<'c> AsDao<'c> for InvoiceEventDao<'c> { } impl<'c> InvoiceEventDao<'c> { - pub async fn create( + pub async fn create( &self, invoice_id: String, owner_id: NodeId, event_type: InvoiceEventType, - details: Option, ) -> DbResult<()> { do_with_transaction(self.pool, move |conn| { - create(invoice_id, owner_id, event_type, details, conn) + create(invoice_id, owner_id, event_type, conn) + }) + .await + } + + pub async fn get_for_invoice_id( + &self, + invoice_id: String, + after_timestamp: Option, + max_events: Option, + app_session_id: Option, + requestor_events: Vec>, + provider_events: Vec>, + ) -> DbResult> { + readonly_transaction(self.pool, move |conn| { + let mut query = read_dsl::pay_invoice_event_read + .filter(read_dsl::invoice_id.eq(invoice_id)) + .order_by(read_dsl::timestamp.asc()) + .into_boxed(); + if let Some(timestamp) = after_timestamp { + query = query.filter(read_dsl::timestamp.gt(timestamp.adapt())); + } + if let Some(app_session_id) = app_session_id { + query = query.filter(read_dsl::app_session_id.eq(app_session_id)); + } + if let Some(limit) = max_events { + query = query.limit(limit.into()); + } + let events: Vec = query.load(conn)?; + let requestor_events: HashSet> = + requestor_events.into_iter().collect(); + let provider_events: HashSet> = provider_events.into_iter().collect(); + events + .into_iter() + .filter(|e| match e.role { + Role::Requestor => requestor_events.contains(e.event_type.as_str()), + Role::Provider => provider_events.contains(e.event_type.as_str()), + }) + .map(TryInto::try_into) + .collect() }) .await } diff --git a/core/payment/src/models/debit_note_event.rs b/core/payment/src/models/debit_note_event.rs index 7e03dd38bd..1f8704b044 100644 --- a/core/payment/src/models/debit_note_event.rs +++ b/core/payment/src/models/debit_note_event.rs @@ -1,8 +1,6 @@ use crate::error::{DbError, DbResult}; use crate::schema::{pay_debit_note_event, pay_debit_note_event_read}; -use crate::utils::{json_from_str, json_to_string}; use chrono::{NaiveDateTime, TimeZone, Utc}; -use serde::Serialize; use std::convert::TryFrom; use ya_client_model::payment::{DebitNoteEvent, DebitNoteEventType}; use ya_client_model::NodeId; @@ -20,20 +18,20 @@ pub struct WriteObj { } impl WriteObj { - pub fn new( + pub fn new( debit_note_id: String, owner_id: NodeId, event_type: DebitNoteEventType, - details: Option, ) -> DbResult { - let details = match details { - Some(details) => Some(json_to_string(&details)?), + let details = match event_type.details() { + Some(details) => Some(serde_json::to_string(&details)?), None => None, }; + Ok(Self { debit_note_id, owner_id, - event_type: event_type.to_string(), + event_type: event_type.discriminant().to_owned(), details, timestamp: Utc::now().adapt(), }) @@ -57,17 +55,22 @@ impl TryFrom for DebitNoteEvent { type Error = DbError; fn try_from(event: ReadObj) -> DbResult { - let event_type = event.event_type.parse().map_err(|e| { - DbError::Integrity(format!( - "DebitNoteEvent type `{}` parsing failed: {}", - &event.event_type, e - )) - })?; - // TODO Attach details when event_type=REJECTED - let _details = match event.details { - Some(s) => Some(json_from_str(&s)?), + let details = match &event.details { + Some(text) => Some( + serde_json::from_str::(text) + .map_err(|e| DbError::Integrity(e.to_string()))?, + ), None => None, }; + let event_type = + DebitNoteEventType::from_discriminant_and_details(&event.event_type, details.clone()) + .ok_or_else(|| { + DbError::Integrity(format!( + "event = {}, details = {:#?} is not valid DebitNoteEventType", + &event.event_type, details + )) + })?; + Ok(Self { debit_note_id: event.debit_note_id, event_date: Utc.from_utc_datetime(&event.timestamp), diff --git a/core/payment/src/models/invoice_event.rs b/core/payment/src/models/invoice_event.rs index 441dedc4d6..46cb6e35c1 100644 --- a/core/payment/src/models/invoice_event.rs +++ b/core/payment/src/models/invoice_event.rs @@ -1,8 +1,6 @@ use crate::error::{DbError, DbResult}; use crate::schema::{pay_invoice_event, pay_invoice_event_read}; -use crate::utils::{json_from_str, json_to_string}; use chrono::{NaiveDateTime, TimeZone, Utc}; -use serde::Serialize; use std::convert::TryFrom; use ya_client_model::payment::{InvoiceEvent, InvoiceEventType}; use ya_client_model::NodeId; @@ -20,21 +18,20 @@ pub struct WriteObj { } impl WriteObj { - pub fn new( + pub fn new( invoice_id: String, owner_id: NodeId, event_type: InvoiceEventType, - details: Option, ) -> DbResult { - let details = match details { - Some(details) => Some(json_to_string(&details)?), + let details = match event_type.details() { + Some(details) => Some(serde_json::to_string(&details)?), None => None, }; Ok(Self { invoice_id, owner_id, - event_type: event_type.to_string(), + event_type: event_type.discriminant().to_owned(), details, timestamp: Utc::now().adapt(), }) @@ -58,18 +55,21 @@ impl TryFrom for InvoiceEvent { type Error = DbError; fn try_from(event: ReadObj) -> DbResult { - let event_type = event.event_type.parse().map_err(|e| { - DbError::Integrity(format!( - "InvoiceEvent type `{}` parsing failed: {}", - event.event_type, e - )) - })?; - - // TODO Attach details when event_type=REJECTED - let _details = match event.details { - Some(s) => Some(json_from_str(&s)?), + let details = match &event.details { + Some(text) => Some( + serde_json::from_str::(text) + .map_err(|e| DbError::Integrity(e.to_string()))?, + ), None => None, }; + let event_type = + InvoiceEventType::from_discriminant_and_details(&event.event_type, details.clone()) + .ok_or_else(|| { + DbError::Integrity(format!( + "event = {}, details = {:#?} is not valid DebitNoteEventType", + &event.event_type, details + )) + })?; Ok(Self { invoice_id: event.invoice_id, diff --git a/core/payment/src/service.rs b/core/payment/src/service.rs index ea239d8765..7b16ebb7b4 100644 --- a/core/payment/src/service.rs +++ b/core/payment/src/service.rs @@ -396,6 +396,7 @@ mod local { } mod public { + use std::convert::TryInto; use std::str::FromStr; use super::*; @@ -408,6 +409,7 @@ mod public { // use crate::error::processor::VerifyPaymentError; use ya_client_model::{payment::*, NodeId}; + use ya_core_model::payment::local::PaymentDriverStatusChange; use ya_core_model::payment::public::*; use ya_persistence::types::Role; @@ -797,6 +799,228 @@ mod public { } // *************************** PAYMENT **************************** + async fn handle_status_change( + db: DbExecutor, + msg: PaymentDriverStatusChange, + ) -> Result { + /// Payment platform affected by status + /// + /// It doesn't contain the token because we don't actually + /// support multiple tokens on one chain. + /// + /// TODO: remove references to token stuff in yagna and ideally + /// make payment platforms properly typed along the way. + #[derive(Hash, PartialEq, Eq)] + struct Platform { + driver: String, + network: String, + } + + impl Platform { + fn new(driver: impl Into, network: impl Into) -> Self { + Platform { + driver: driver.into(), + network: network.into(), + } + } + } + + let platform_str_to_platform = |platform: &str| -> Result { + let parts = platform.split("-").collect::>(); + let [driver, network, _]: [_; 3] = parts.try_into().map_err(|_| { + GenericError::new("Payment platform must be of the form {driver}-{network}-{token}") + })?; + + Ok(Platform::new(driver, network)) + }; + + /// Event broadcast information + /// + /// Each status property shall be broadcasted to all debit notes + /// and invoices affected. + /// + /// If properties are empty, a PaymentOkEvent will be sent. + #[derive(Default)] + struct Broadcast { + debit_notes: Vec<(String, NodeId)>, + invoices: Vec<(String, NodeId)>, + properties: Vec, + } + + // Create a mapping between platforms and relevant properties. + // + // This relies on the fact that a given payment driver status property + // can only affect one platform. + let mut broadcast = HashMap::::default(); + for prop in msg.properties { + let Some(network) = prop.network() else { + continue; + }; + + let value = broadcast + .entry(Platform::new(prop.driver(), network)) + .or_default(); + value.properties.push(prop); + } + + // All DAOs + let debit_note_dao: DebitNoteDao = db.as_dao(); + let debit_note_ev_dao: DebitNoteEventDao = db.as_dao(); + let invoice_dao: InvoiceDao = db.as_dao(); + let invoice_ev_dao: InvoiceEventDao = db.as_dao(); + + let accepted_notes = debit_note_dao + .list( + Some(Role::Requestor), + Some(DocumentStatus::Accepted), + Some(true), + ) + .await + .map_err(GenericError::new)?; + + // Populate broadcasts with affected debit_notes + for debit_note in accepted_notes { + let platform = platform_str_to_platform(&debit_note.payment_platform)?; + + // checks if the last payment-status event was PAYMENT_OK or no such event was emitted + let was_already_ok = debit_note_ev_dao + .get_for_debit_note_id( + debit_note.debit_note_id.clone(), + None, + None, + None, + vec!["PAYMENT_EVENT".into(), "PAYMENT_OK".into()], + vec![], + ) + .await + .map_err(GenericError::new)? + .last() + .map(|ev_type| { + matches!( + &ev_type.event_type, + DebitNoteEventType::DebitNotePaymentOkEvent + ) + }) + .unwrap_or(true); + + if !was_already_ok { + // If debit note has reported driver errors before, we *must* send a broadcast on status change. + // This will either be a new problem, or PaymentOkEvent if no errors are found. + broadcast + .entry(platform) + .or_default() + .debit_notes + .push((debit_note.debit_note_id, debit_note.issuer_id)); + } else { + if let Some(broadcast) = broadcast.get_mut(&platform) { + broadcast + .debit_notes + .push((debit_note.debit_note_id, debit_note.issuer_id)); + } + } + } + + let accepted_invoices = invoice_dao + .list(Some(Role::Requestor), Some(DocumentStatus::Accepted)) + .await + .map_err(GenericError::new)?; + + // Populate broadcasts with affected invoices + for invoice in accepted_invoices { + let platform = platform_str_to_platform(&invoice.payment_platform)?; + + // checks if the last payment-status event was PAYMENT_OK or no such event was emitted + let was_already_ok = invoice_ev_dao + .get_for_invoice_id( + invoice.invoice_id.clone(), + None, + None, + None, + vec!["PAYMENT_EVENT".into(), "PAYMENT_OK".into()], + vec![], + ) + .await + .map_err(GenericError::new)? + .last() + .map(|ev_type| { + matches!(&ev_type.event_type, InvoiceEventType::InvoicePaymentOkEvent) + }) + .unwrap_or(true); + + if !was_already_ok { + // If invoice has reported driver errors before, we *must* send a broadcast on status change. + // This will either be a new problem, or PaymentOkEvent if no errors are found. + broadcast + .entry(platform) + .or_default() + .invoices + .push((invoice.invoice_id, invoice.issuer_id)); + } else { + if let Some(broadcast) = broadcast.get_mut(&platform) { + broadcast + .invoices + .push((invoice.invoice_id, invoice.issuer_id)); + } + } + } + + // Emit debit note & invoice events. + for broadcast in broadcast.into_values() { + // If properties are empty, send OkEvents. Otherwise send the wrapped properties. + if broadcast.properties.is_empty() { + for (debit_note_id, owner_id) in &broadcast.debit_notes { + debit_note_ev_dao + .create( + debit_note_id.clone(), + *owner_id, + DebitNoteEventType::DebitNotePaymentOkEvent, + ) + .await + .map_err(GenericError::new)?; + } + + for (invoice_id, owner_id) in &broadcast.invoices { + invoice_ev_dao + .create( + invoice_id.clone(), + *owner_id, + InvoiceEventType::InvoicePaymentOkEvent, + ) + .await + .map_err(GenericError::new)?; + } + } else { + for prop in broadcast.properties { + for (invoice_id, owner_id) in &broadcast.invoices { + invoice_ev_dao + .create( + invoice_id.clone(), + *owner_id, + InvoiceEventType::InvoicePaymentStatusEvent { + property: prop.clone(), + }, + ) + .await + .map_err(GenericError::new)?; + } + for (debit_note_id, owner_id) in &broadcast.debit_notes { + debit_note_ev_dao + .create( + debit_note_id.clone(), + *owner_id, + DebitNoteEventType::DebitNotePaymentStatusEvent { + property: prop.clone(), + }, + ) + .await + .map_err(GenericError::new)?; + } + } + } + } + + Ok(Ack {}) + } async fn send_payment( db: DbExecutor, From cdcdd68c859bfc1d0fbec4ec23068c259b9b156f Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 14 Nov 2023 10:50:52 +0100 Subject: [PATCH 120/123] pre-merge: Revert "bump goth (tests on erc20next)" This reverts commit e7a9db85bc469d7558ab75eab47be8446fee833b. --- goth_tests/poetry.lock | 133 ++++++-------------------------------- goth_tests/pyproject.toml | 7 +- 2 files changed, 24 insertions(+), 116 deletions(-) diff --git a/goth_tests/poetry.lock b/goth_tests/poetry.lock index 0ce98aa9ee..13a0707f60 100644 --- a/goth_tests/poetry.lock +++ b/goth_tests/poetry.lock @@ -1,10 +1,9 @@ -# This file is automatically @generated by Poetry 1.4.1 and should not be changed by hand. +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. [[package]] name = "aiohttp" version = "3.8.5" description = "Async http client/server framework (asyncio)" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -113,7 +112,6 @@ speedups = ["Brotli", "aiodns", "cchardet"] name = "aiosignal" version = "1.3.1" description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -128,7 +126,6 @@ frozenlist = ">=1.1.0" name = "ansicolors" version = "1.1.8" description = "ANSI colors for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -140,7 +137,6 @@ files = [ name = "appdirs" version = "1.4.4" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "dev" optional = false python-versions = "*" files = [ @@ -152,7 +148,6 @@ files = [ name = "asgiref" version = "3.3.4" description = "ASGI specs, helper code, and adapters" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -167,7 +162,6 @@ tests = ["mypy (>=0.800)", "pytest", "pytest-asyncio"] name = "async-timeout" version = "4.0.3" description = "Timeout context manager for asyncio programs" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -179,7 +173,6 @@ files = [ name = "attrs" version = "23.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -198,7 +191,6 @@ tests-no-zope = ["cloudpickle", "hypothesis", "mypy (>=1.1.1)", "pympler", "pyte name = "bcrypt" version = "4.0.1" description = "Modern password hashing for your software and your servers" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -233,7 +225,6 @@ typecheck = ["mypy"] name = "black" version = "21.7b0" description = "The uncompromising code formatter." -category = "dev" optional = false python-versions = ">=3.6.2" files = [ @@ -259,7 +250,6 @@ uvloop = ["uvloop (>=0.15.2)"] name = "blinker" version = "1.4" description = "Fast, simple object-to-object and broadcast signaling" -category = "main" optional = false python-versions = "*" files = [ @@ -270,7 +260,6 @@ files = [ name = "brotli" version = "1.0.9" description = "Python bindings for the Brotli compression library" -category = "main" optional = false python-versions = "*" files = [ @@ -362,7 +351,6 @@ files = [ name = "certifi" version = "2020.12.5" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = "*" files = [ @@ -374,7 +362,6 @@ files = [ name = "cffi" version = "1.16.0" description = "Foreign Function Interface for Python calling C code." -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -439,7 +426,6 @@ pycparser = "*" name = "charset-normalizer" version = "3.3.0" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.7.0" files = [ @@ -539,7 +525,6 @@ files = [ name = "click" version = "7.1.2" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -551,7 +536,6 @@ files = [ name = "colorama" version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" files = [ @@ -563,7 +547,6 @@ files = [ name = "cryptography" version = "3.2.1" description = "cryptography is a package which provides cryptographic recipes and primitives to Python developers." -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*" files = [ @@ -606,7 +589,6 @@ test = ["hypothesis (>=1.11.4,!=3.79.2)", "iso8601", "pretend", "pytest (>=3.6.0 name = "distro" version = "1.8.0" description = "Distro - an OS platform information API" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -618,7 +600,6 @@ files = [ name = "docker" version = "6.1.3" description = "A Python library for the Docker Engine API." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -641,7 +622,6 @@ ssh = ["paramiko (>=2.4.3)"] name = "docker-compose" version = "1.29.2" description = "Multi-container orchestration for Docker" -category = "main" optional = false python-versions = ">=3.4" files = [ @@ -670,7 +650,6 @@ tests = ["ddt (>=1.2.2,<2)", "pytest (<6)"] name = "dockerpty" version = "0.4.1" description = "Python library to use the pseudo-tty of a docker container" -category = "main" optional = false python-versions = "*" files = [ @@ -684,7 +663,6 @@ six = ">=1.3.0" name = "docopt" version = "0.6.2" description = "Pythonic argument parser, that will make you smile" -category = "main" optional = false python-versions = "*" files = [ @@ -695,7 +673,6 @@ files = [ name = "dpath" version = "2.1.6" description = "Filesystem-like pathing and searching for dictionaries" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -707,7 +684,6 @@ files = [ name = "exceptiongroup" version = "1.1.3" description = "Backport of PEP 654 (exception groups)" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -722,7 +698,6 @@ test = ["pytest (>=6)"] name = "fastcore" version = "1.5.29" description = "Python supercharged for fastai development" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -741,7 +716,6 @@ dev = ["jupyterlab", "matplotlib", "nbdev (>=0.2.39)", "numpy", "pandas", "pillo name = "flask" version = "1.1.4" description = "A simple framework for building complex web applications." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -764,7 +738,6 @@ dotenv = ["python-dotenv"] name = "frozenlist" version = "1.4.0" description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -835,7 +808,6 @@ files = [ name = "func-timeout" version = "4.3.5" description = "Python module which allows you to specify timeouts when calling any existing function. Also provides support for stoppable-threads" -category = "main" optional = false python-versions = "*" files = [ @@ -846,7 +818,6 @@ files = [ name = "ghapi" version = "0.1.23" description = "A python client for the GitHub API" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -864,41 +835,35 @@ dev = ["jsonref"] [[package]] name = "goth" -version = "0.15.9" +version = "0.15.8" description = "Golem Test Harness - integration testing framework" -category = "main" optional = false -python-versions = "^3.10.1" -files = [] -develop = false +python-versions = ">=3.10.1,<4.0.0" +files = [ + {file = "goth-0.15.8-py3-none-any.whl", hash = "sha256:1a0d8b59e207feab8aaf36c6156eab0cf446f56cb6973c71200c531e35a19de9"}, + {file = "goth-0.15.8.tar.gz", hash = "sha256:16fa44a0a6e4e914064a5bb5cf8d2d0d3af766e97d515a498f66a13723fffd83"}, +] [package.dependencies] -aiohttp = "^3.8.5" -ansicolors = "^1.1.0" -docker = "^6.0" -docker-compose = "^1.29" -dpath = "^2.0" +aiohttp = ">=3.8.5,<4.0.0" +ansicolors = ">=1.1.0,<2.0.0" +docker = ">=6.0,<7.0" +docker-compose = ">=1.29,<2.0" +dpath = ">=2.0,<3.0" func_timeout = "4.3.5" -ghapi = "^0.1.16" +ghapi = ">=0.1.16,<0.2.0" markupsafe = "2.0.1" -mitmproxy = "^5.3" +mitmproxy = ">=5.3,<6.0" pyyaml = "5.3.1" -transitions = "^0.8" -typing_extensions = "^4.5" -urllib3 = "^1.26" -ya-aioclient = "^0.6" - -[package.source] -type = "git" -url = "https://github.com/golemfactory/goth.git" -reference = "2c2c8a8b01324350eb5968171fe9e38d333b90f4" -resolved_reference = "2c2c8a8b01324350eb5968171fe9e38d333b90f4" +transitions = ">=0.8,<0.9" +typing_extensions = ">=4.5,<5.0" +urllib3 = ">=1.26,<2.0" +ya-aioclient = ">=0.6,<0.7" [[package]] name = "h11" version = "0.14.0" description = "A pure-Python, bring-your-own-I/O implementation of HTTP/1.1" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -910,7 +875,6 @@ files = [ name = "h2" version = "4.1.0" description = "HTTP/2 State-Machine based protocol implementation" -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -926,7 +890,6 @@ hyperframe = ">=6.0,<7" name = "hpack" version = "4.0.0" description = "Pure-Python HPACK header compression" -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -938,7 +901,6 @@ files = [ name = "hyperframe" version = "6.0.1" description = "HTTP/2 framing layer for Python" -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -950,7 +912,6 @@ files = [ name = "idna" version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" files = [ @@ -962,7 +923,6 @@ files = [ name = "iniconfig" version = "2.0.0" description = "brain-dead simple config-ini parsing" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -974,7 +934,6 @@ files = [ name = "itsdangerous" version = "1.1.0" description = "Various helpers to pass data to untrusted environments and back." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -986,7 +945,6 @@ files = [ name = "jinja2" version = "2.11.3" description = "A very fast and expressive template engine." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -1004,7 +962,6 @@ i18n = ["Babel (>=0.8)"] name = "jsonschema" version = "3.2.0" description = "An implementation of JSON Schema validation for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -1026,7 +983,6 @@ format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-va name = "kaitaistruct" version = "0.9" description = "Kaitai Struct declarative parser generator for binary data: runtime library for Python" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" files = [ @@ -1037,7 +993,6 @@ files = [ name = "ldap3" version = "2.8.1" description = "A strictly RFC 4510 conforming LDAP V3 pure Python client library" -category = "main" optional = false python-versions = "*" files = [ @@ -1052,7 +1007,6 @@ pyasn1 = ">=0.4.6" name = "markupsafe" version = "2.0.1" description = "Safely add untrusted strings to HTML/XML markup." -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1131,7 +1085,6 @@ files = [ name = "mitmproxy" version = "5.3.0" description = "An interactive, SSL/TLS-capable intercepting proxy for HTTP/1, HTTP/2, and WebSockets." -category = "main" optional = false python-versions = "*" files = [ @@ -1173,7 +1126,6 @@ dev = ["Flask (>=1.0,<1.2)", "asynctest (>=0.12.0)", "hypothesis (>=5.8,<6)", "p name = "msgpack" version = "1.0.7" description = "MessagePack serializer" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1239,7 +1191,6 @@ files = [ name = "multidict" version = "6.0.4" description = "multidict implementation" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1323,7 +1274,6 @@ files = [ name = "mypy" version = "1.5.1" description = "Optional static typing for Python" -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1370,7 +1320,6 @@ reports = ["lxml"] name = "mypy-extensions" version = "1.0.0" description = "Type system extensions for programs checked with the mypy type checker." -category = "dev" optional = false python-versions = ">=3.5" files = [ @@ -1382,7 +1331,6 @@ files = [ name = "packaging" version = "23.2" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1394,7 +1342,6 @@ files = [ name = "paramiko" version = "2.12.0" description = "SSH2 protocol library" -category = "main" optional = false python-versions = "*" files = [ @@ -1418,7 +1365,6 @@ invoke = ["invoke (>=1.3)"] name = "passlib" version = "1.7.4" description = "comprehensive password hashing framework supporting over 30 schemes" -category = "main" optional = false python-versions = "*" files = [ @@ -1436,7 +1382,6 @@ totp = ["cryptography"] name = "pastel" version = "0.2.1" description = "Bring colors to your terminal." -category = "dev" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1448,7 +1393,6 @@ files = [ name = "pathspec" version = "0.11.2" description = "Utility library for gitignore style pattern matching of file paths." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1460,7 +1404,6 @@ files = [ name = "pip" version = "23.2.1" description = "The PyPA recommended tool for installing Python packages." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1472,7 +1415,6 @@ files = [ name = "pluggy" version = "1.3.0" description = "plugin and hook calling mechanisms for python" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1488,7 +1430,6 @@ testing = ["pytest", "pytest-benchmark"] name = "poethepoet" version = "0.22.1" description = "A task runner that works well with poetry." -category = "dev" optional = false python-versions = ">=3.8" files = [ @@ -1507,7 +1448,6 @@ poetry-plugin = ["poetry (>=1.0,<2.0)"] name = "protobuf" version = "3.13.0" description = "Protocol Buffers" -category = "main" optional = false python-versions = "*" files = [ @@ -1539,7 +1479,6 @@ six = ">=1.9" name = "publicsuffix2" version = "2.20191221" description = "Get a public suffix for a domain name using the Public Suffix List. Forked from and using the same API as the publicsuffix package." -category = "main" optional = false python-versions = "*" files = [ @@ -1551,7 +1490,6 @@ files = [ name = "pyasn1" version = "0.4.8" description = "ASN.1 types and codecs" -category = "main" optional = false python-versions = "*" files = [ @@ -1563,7 +1501,6 @@ files = [ name = "pycparser" version = "2.21" description = "C parser in Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -1575,7 +1512,6 @@ files = [ name = "pydivert" version = "2.1.0" description = "Python binding to windivert driver" -category = "main" optional = false python-versions = "*" files = [ @@ -1591,7 +1527,6 @@ test = ["codecov (>=2.0.5)", "hypothesis (>=3.5.3)", "mock (>=1.0.1)", "pytest ( name = "pynacl" version = "1.5.0" description = "Python binding to the Networking and Cryptography (NaCl) library" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -1618,7 +1553,6 @@ tests = ["hypothesis (>=3.27.0)", "pytest (>=3.2.1,!=3.3.0)"] name = "pyopenssl" version = "19.1.0" description = "Python wrapper module around the OpenSSL library" -category = "main" optional = false python-versions = "*" files = [ @@ -1638,7 +1572,6 @@ test = ["flaky", "pretend", "pytest (>=3.0.1)"] name = "pyparsing" version = "2.4.7" description = "Python parsing module" -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1650,7 +1583,6 @@ files = [ name = "pyperclip" version = "1.8.2" description = "A cross-platform clipboard module for Python. (Only handles plain text for now.)" -category = "main" optional = false python-versions = "*" files = [ @@ -1661,7 +1593,6 @@ files = [ name = "pyrsistent" version = "0.19.3" description = "Persistent/Functional/Immutable data structures" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1698,7 +1629,6 @@ files = [ name = "pytest" version = "7.4.2" description = "pytest: simple powerful testing with Python" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1721,7 +1651,6 @@ testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "no name = "pytest-asyncio" version = "0.21.0" description = "Pytest support for asyncio" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1740,7 +1669,6 @@ testing = ["coverage (>=6.2)", "flaky (>=3.5.0)", "hypothesis (>=5.7.1)", "mypy name = "pytest-split" version = "0.8.1" description = "Pytest plugin which splits the test suite to equally sized sub suites based on test execution time." -category = "main" optional = false python-versions = ">=3.7.1,<4.0" files = [ @@ -1755,7 +1683,6 @@ pytest = ">=5,<8" name = "python-dateutil" version = "2.8.2" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" files = [ @@ -1770,7 +1697,6 @@ six = ">=1.5" name = "python-dotenv" version = "0.21.1" description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1785,7 +1711,6 @@ cli = ["click (>=5.0)"] name = "pywin32" version = "306" description = "Python for Window Extensions" -category = "main" optional = false python-versions = "*" files = [ @@ -1809,7 +1734,6 @@ files = [ name = "pyyaml" version = "5.3.1" description = "YAML parser and emitter for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -1832,7 +1756,6 @@ files = [ name = "regex" version = "2023.10.3" description = "Alternative regular expression module, to replace re." -category = "dev" optional = false python-versions = ">=3.7" files = [ @@ -1930,7 +1853,6 @@ files = [ name = "requests" version = "2.31.0" description = "Python HTTP for Humans." -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -1952,7 +1874,6 @@ use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] name = "ruamel-yaml" version = "0.16.13" description = "ruamel.yaml is a YAML parser/emitter that supports roundtrip preservation of comments, seq/map flow style, and map key order" -category = "main" optional = false python-versions = "*" files = [ @@ -1968,7 +1889,6 @@ jinja2 = ["ruamel.yaml.jinja2 (>=0.2)"] name = "setuptools" version = "68.2.2" description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -1985,7 +1905,6 @@ testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jar name = "six" version = "1.16.0" description = "Python 2 and 3 compatibility utilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" files = [ @@ -1997,7 +1916,6 @@ files = [ name = "sortedcontainers" version = "2.2.2" description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -category = "main" optional = false python-versions = "*" files = [ @@ -2009,7 +1927,6 @@ files = [ name = "texttable" version = "1.7.0" description = "module to create simple ASCII tables" -category = "main" optional = false python-versions = "*" files = [ @@ -2021,7 +1938,6 @@ files = [ name = "tomli" version = "1.2.3" description = "A lil' TOML parser" -category = "main" optional = false python-versions = ">=3.6" files = [ @@ -2033,7 +1949,6 @@ files = [ name = "tornado" version = "6.3.3" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." -category = "main" optional = false python-versions = ">= 3.8" files = [ @@ -2054,7 +1969,6 @@ files = [ name = "transitions" version = "0.8.11" description = "A lightweight, object-oriented Python state machine implementation with many extensions." -category = "main" optional = false python-versions = "*" files = [ @@ -2073,7 +1987,6 @@ test = ["pytest"] name = "typing-extensions" version = "4.8.0" description = "Backported and Experimental Type Hints for Python 3.8+" -category = "main" optional = false python-versions = ">=3.8" files = [ @@ -2085,7 +1998,6 @@ files = [ name = "urllib3" version = "1.26.17" description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" files = [ @@ -2102,7 +2014,6 @@ socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] name = "urwid" version = "2.1.2" description = "A full-featured console (xterm et al.) user interface library" -category = "main" optional = false python-versions = "*" files = [ @@ -2113,7 +2024,6 @@ files = [ name = "websocket-client" version = "0.59.0" description = "WebSocket client for Python with low level API options" -category = "main" optional = false python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" files = [ @@ -2128,7 +2038,6 @@ six = "*" name = "werkzeug" version = "1.0.1" description = "The comprehensive WSGI web application library." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" files = [ @@ -2144,7 +2053,6 @@ watchdog = ["watchdog"] name = "wsproto" version = "0.15.0" description = "WebSockets state-machine based protocol implementation" -category = "main" optional = false python-versions = ">=3.6.1" files = [ @@ -2159,7 +2067,6 @@ h11 = ">=0.8.1" name = "ya-aioclient" version = "0.6.4" description = "" -category = "main" optional = false python-versions = ">=3.6,<4.0" files = [ @@ -2176,7 +2083,6 @@ python-dateutil = ">=2.8.1,<3.0.0" name = "yarl" version = "1.9.2" description = "Yet another URL library" -category = "main" optional = false python-versions = ">=3.7" files = [ @@ -2264,7 +2170,6 @@ multidict = ">=4.0" name = "zstandard" version = "0.14.1" description = "Zstandard bindings for Python" -category = "main" optional = false python-versions = "*" files = [ @@ -2330,4 +2235,4 @@ files = [ [metadata] lock-version = "2.0" python-versions = "^3.10.1" -content-hash = "7f6d6a57c42e258a855f4ad9dc622726c9f43fbf5138e8f5d371c6cf9f4c0d5a" +content-hash = "2f2cc4545adb5436924a94e2b87e674b5e345b0cfb8e4287961d80605a9a2cd3" diff --git a/goth_tests/pyproject.toml b/goth_tests/pyproject.toml index d1674945da..b2d1b69db5 100644 --- a/goth_tests/pyproject.toml +++ b/goth_tests/pyproject.toml @@ -8,7 +8,10 @@ version = "0.1.1" description = "Integration tests for yagna" authors = ["GolemFactory "] license = "LGPL-3.0-or-later" -classifiers = ["Development Status :: 3 - Alpha", "Framework :: AsyncIO"] +classifiers = [ + "Development Status :: 3 - Alpha", + "Framework :: AsyncIO", +] repository = "https://github.com/golemfactory/yagna" documentation = "https://handbook.golem.network" readme = "README.md" @@ -27,7 +30,7 @@ pytest-asyncio = "0.21" pytest-split = "^0.8.1" # goth = "0.15.8" # to use development goth version uncomment below -goth = { git = "https://github.com/golemfactory/goth.git", rev = "2d506620acfd843e60a0ba68dcfdfda966e4472a" } +# goth = { git = "https://github.com/golemfactory/goth.git", rev = "7b2c1eca74ebfd1fc6bf25322ad26a0b4b7467c6" } [tool.poetry.dev-dependencies] black = "21.7b0" From 270ca818ec94989e69632c938344e488fe3c9be2 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Tue, 14 Nov 2023 10:53:40 +0100 Subject: [PATCH 121/123] pre-merge: Remove erc20next support from golemsp --- golem_cli/src/command/yagna.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/golem_cli/src/command/yagna.rs b/golem_cli/src/command/yagna.rs index 93698b205f..e1cf8e9f06 100644 --- a/golem_cli/src/command/yagna.rs +++ b/golem_cli/src/command/yagna.rs @@ -127,7 +127,10 @@ lazy_static! { // Drivers are searched in order when more than one supports a given network, // so erc20next should be preferred over erc20. - pub static ref DRIVERS: Vec<&'static PaymentDriver> = vec![&ERC20NEXT_DRIVER, &ERC20_DRIVER]; + // + // If ERC20NEXT_DRIVER isn't here, that's because we wish to use ERC20 on master only. This will + // be re-enabled shortly. + pub static ref DRIVERS: Vec<&'static PaymentDriver> = vec![&ERC20_DRIVER]; } impl PaymentDriver { From 1b7dd67a805fd368e081184921a4ffaa14896d36 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Wed, 15 Nov 2023 11:03:51 +0100 Subject: [PATCH 122/123] chore: fix clippy --- core/payment/src/service.rs | 22 +++++++++------------- 1 file changed, 9 insertions(+), 13 deletions(-) diff --git a/core/payment/src/service.rs b/core/payment/src/service.rs index 7b16ebb7b4..8ae75bb272 100644 --- a/core/payment/src/service.rs +++ b/core/payment/src/service.rs @@ -826,7 +826,7 @@ mod public { } let platform_str_to_platform = |platform: &str| -> Result { - let parts = platform.split("-").collect::>(); + let parts = platform.split('-').collect::>(); let [driver, network, _]: [_; 3] = parts.try_into().map_err(|_| { GenericError::new("Payment platform must be of the form {driver}-{network}-{token}") })?; @@ -911,12 +911,10 @@ mod public { .or_default() .debit_notes .push((debit_note.debit_note_id, debit_note.issuer_id)); - } else { - if let Some(broadcast) = broadcast.get_mut(&platform) { - broadcast - .debit_notes - .push((debit_note.debit_note_id, debit_note.issuer_id)); - } + } else if let Some(broadcast) = broadcast.get_mut(&platform) { + broadcast + .debit_notes + .push((debit_note.debit_note_id, debit_note.issuer_id)); } } @@ -955,12 +953,10 @@ mod public { .or_default() .invoices .push((invoice.invoice_id, invoice.issuer_id)); - } else { - if let Some(broadcast) = broadcast.get_mut(&platform) { - broadcast - .invoices - .push((invoice.invoice_id, invoice.issuer_id)); - } + } else if let Some(broadcast) = broadcast.get_mut(&platform) { + broadcast + .invoices + .push((invoice.invoice_id, invoice.issuer_id)); } } From 79bd3b8b1c0e89d14d80a442a8d2a92ccb6a6a18 Mon Sep 17 00:00:00 2001 From: Kamil Koczurek Date: Thu, 16 Nov 2023 16:13:04 +0100 Subject: [PATCH 123/123] market: replace external asnom dep with golemfactory one --- Cargo.lock | 2 +- core/market/resolver/Cargo.toml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 31e801a818..896b3f506c 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -556,7 +556,7 @@ checksum = "619743e34b5ba4e9703bba34deac3427c72507c7159f5fd030aea8cac0cfe341" [[package]] name = "asnom" version = "0.1.1" -source = "git+https://github.com/dequbed/asnom.git#06696cefca408a56431922f95293330ed293dbda" +source = "git+https://github.com/golemfactory/asnom.git#06696cefca408a56431922f95293330ed293dbda" dependencies = [ "byteorder", "nom 2.2.1", diff --git a/core/market/resolver/Cargo.toml b/core/market/resolver/Cargo.toml index 38527fe28d..491aa2c810 100644 --- a/core/market/resolver/Cargo.toml +++ b/core/market/resolver/Cargo.toml @@ -7,7 +7,7 @@ edition = "2018" [dependencies] ya-agreement-utils = "0.5.0" -asnom = { git = "https://github.com/dequbed/asnom.git" } +asnom = { git = "https://github.com/golemfactory/asnom.git" } bigdecimal = "0.2" chrono = "0.4" log = "0.4"