diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml new file mode 100644 index 00000000..13b12d25 --- /dev/null +++ b/.github/workflows/pre-commit.yml @@ -0,0 +1,32 @@ +name: pre-commit +on: + pull_request: + push: + branches: [master, dev] + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Install Python + uses: actions/setup-python@v4 + + - name: Install poetry + run: python -m pip install poetry + - name: Cache the virtualenv + id: cache-venv + uses: actions/cache@v3 + with: + path: ./.venv + key: ${{ runner.os }}-venv-${{ hashFiles('**/poetry.lock') }} + + - name: Install dependencies + if: steps.cache-venv.outputs.cache-hit != 'true' + run: python -m poetry install + + - name: Run pre-commit + run: | + python -m poetry run pre-commit run --show-diff-on-failure --color=always --all-files + shell: bash diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index dfa03d4e..f3d31554 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,26 +2,22 @@ name: Publish Python 🐍 distribution 📦 to PyPI on: release: - types: [created] + types: [published] jobs: deploy: - runs-on: ubuntu-20.04 + runs-on: ubuntu-latest steps: - - uses: actions/checkout@master - - name: Set up Python 3.7 - uses: actions/setup-python@v2 - with: - python-version: 3.7 - - name: Install dependencies - run: | - python -m pip install --upgrade pip - pip install setuptools wheel twine - - name: Build and publish - env: - TWINE_USERNAME: __token__ - TWINE_PASSWORD: ${{ secrets.PYPI_API_TOKEN }} - run: | - python setup.py sdist bdist_wheel - twine upload --skip-existing dist/* \ No newline at end of file + - name: Checkout + uses: actions/checkout@v3 + - name: Install Python + uses: actions/setup-python@v3 + - name: Install poetry + run: python -m pip install poetry + - name: Publish package + env: + PYPI_TOKEN: ${{ secrets.PYPI_API_TOKEN }} + run: | + poetry config pypi-token.pypi $PYPI_TOKEN + poetry publish --build diff --git a/.github/workflows/run-tests.yml b/.github/workflows/run-tests.yml new file mode 100644 index 00000000..ccde1d03 --- /dev/null +++ b/.github/workflows/run-tests.yml @@ -0,0 +1,45 @@ +name: run-tests +on: + pull_request: + push: + branches: [master, dev] + +jobs: + run-tests: + strategy: + matrix: + python: ["3.9", "3.10", "3.11"] + os: [ubuntu-latest, macos-latest, windows-latest] + runs-on: ${{ matrix.os }} + env: + OS: ${{ matrix.os }} + PYTHON: ${{ matrix.python }} + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Install Python + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python }} + + - name: Install poetry + run: python -m pip install poetry + - name: Cache the virtualenv + id: cache-venv + uses: actions/cache@v3 + with: + path: ./.venv + key: ${{ runner.os }}-${{ matrix.python }}-venv-${{ hashFiles('**/poetry.lock') }} + + - name: Install dependencies + if: steps.cache-venv.outputs.cache-hit != 'true' + run: python -m poetry install + + - name: Run tests and Generate coverage + run: | + poetry run pytest --cov --cov-report=xml + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v3 + with: + env_vars: OS,PYTHON diff --git a/.gitignore b/.gitignore index 39bf0a94..0afa586b 100644 --- a/.gitignore +++ b/.gitignore @@ -143,3 +143,5 @@ cython_debug/ .chain_cookie .exchange_cookie + +.flakeheaven_cache diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 00000000..a1388bd3 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,28 @@ +exclude: '^pyinjective/proto/.*' +repos: +- repo: https://github.com/pre-commit/pre-commit-hooks + rev: v3.2.0 + hooks: + - id: trailing-whitespace + - id: end-of-file-fixer + - id: check-yaml +- repo: https://github.com/flakeheaven/flakeheaven + rev: 3.3.0 + hooks: + - id: flakeheaven + name: flakeheaven + description: '`flakeheaven` is a `flake8` wrapper.' + entry: flakeheaven lint + language: python + types_or: [ python, jupyter, markdown, rst, yaml ] + require_serial: true + minimum_pre_commit_version: 2.9.0 +- repo: https://github.com/pycqa/isort + rev: 5.12.0 + hooks: + - id: isort + name: isort (python) +- repo: https://github.com/psf/black-pre-commit-mirror + rev: 23.9.1 + hooks: + - id: black diff --git a/LICENSE.md b/LICENSE.md index 84301b20..34a77c27 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -200,4 +200,4 @@ Copyright © 2021 - 2022 Injective Labs Inc. (https://injectivelabs.org/) distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and - limitations under the License. \ No newline at end of file + limitations under the License. diff --git a/Makefile b/Makefile index 2485ee70..40b12f77 100644 --- a/Makefile +++ b/Makefile @@ -35,6 +35,6 @@ copy-proto: done tests: - pytest -v + poetry run pytest -v .PHONY: all gen gen-client copy-proto tests diff --git a/NOTICE.md b/NOTICE.md index f8c4b84b..a8a99b61 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -5,4 +5,4 @@ Copyright © 2021 - 2022 Injective Labs Inc. (https://injectivelabs.org/) Originally released by Injective Labs Inc. under:
Apache License
Version 2.0, January 2004
-http://www.apache.org/licenses/ +http://www.apache.org/licenses/ diff --git a/Pipfile b/Pipfile index 97f04274..70e12f3e 100644 --- a/Pipfile +++ b/Pipfile @@ -20,6 +20,7 @@ protobuf = "*" requests = "*" safe-pysha3 = "*" urllib3 = "<2" +web3 = ">=6.0.0" websockets = "*" [dev-packages] diff --git a/Pipfile.lock b/Pipfile.lock index 58fc968b..ba945e21 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -1,7 +1,7 @@ { "_meta": { "hash": { - "sha256": "414c3e95a8abb1f4986d0ae4814e25f8c7eba47e5343b5c67cf0bab32b21eadc" + "sha256": "863f3bc0eb1616bbcfb14b66bc516e4ed6fcb0e13e0283b4f3ea0a1f16484dc1" }, "pipfile-spec": 6, "requires": { @@ -619,7 +619,7 @@ "sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd" ], "index": "pypi", - "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==0.18.0" }, "eip712": { @@ -636,7 +636,7 @@ "sha256:0d50469de2f9948bacd764fc3f8f337a090bbb6ac3a759ef22c094bf56c1e6d9", "sha256:a9adae5e0c2b9a35703b76856d6db3a0498effdf1243011b2d56280165db1cdd" ], - "markers": "python_full_version >= '3.7.2' and python_version < '4'", + "markers": "python_version < '4' and python_full_version >= '3.7.2'", "version": "==4.2.0" }, "eth-account": { @@ -685,7 +685,7 @@ "sha256:347d50713dd58ab50063b228d8271624ab2de3071bfa32d467b05f0ea31ab4c5", "sha256:7f49610469811ee97ac43eaf6baa294778ce74042d41e61ecf22e5ebe385590f" ], - "markers": "python_full_version >= '3.7.2' and python_version < '4'", + "markers": "python_version < '4' and python_full_version >= '3.7.2'", "version": "==3.4.0" }, "eth-utils": { @@ -892,6 +892,109 @@ "markers": "python_version >= '3.5'", "version": "==3.4" }, + "jsonschema": { + "hashes": [ + "sha256:043dc26a3845ff09d20e4420d6012a9c91c9aa8999fa184e7efcfeccb41e32cb", + "sha256:6e1e7569ac13be8139b2dd2c21a55d350066ee3f80df06c608b398cdc6f30e8f" + ], + "markers": "python_version >= '3.8'", + "version": "==4.19.0" + }, + "jsonschema-specifications": { + "hashes": [ + "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1", + "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb" + ], + "markers": "python_version >= '3.8'", + "version": "==2023.7.1" + }, + "lru-dict": { + "hashes": [ + "sha256:00f6e8a3fc91481b40395316a14c94daa0f0a5de62e7e01a7d589f8d29224052", + "sha256:020b93870f8c7195774cbd94f033b96c14f51c57537969965c3af300331724fe", + "sha256:05fb8744f91f58479cbe07ed80ada6696ec7df21ea1740891d4107a8dd99a970", + "sha256:086ce993414f0b28530ded7e004c77dc57c5748fa6da488602aa6e7f79e6210e", + "sha256:0c316dfa3897fabaa1fe08aae89352a3b109e5f88b25529bc01e98ac029bf878", + "sha256:0facf49b053bf4926d92d8d5a46fe07eecd2af0441add0182c7432d53d6da667", + "sha256:1171ad3bff32aa8086778be4a3bdff595cc2692e78685bcce9cb06b96b22dcc2", + "sha256:1184d91cfebd5d1e659d47f17a60185bbf621635ca56dcdc46c6a1745d25df5c", + "sha256:13c56782f19d68ddf4d8db0170041192859616514c706b126d0df2ec72a11bd7", + "sha256:18ee88ada65bd2ffd483023be0fa1c0a6a051ef666d1cd89e921dcce134149f2", + "sha256:203b3e78d03d88f491fa134f85a42919020686b6e6f2d09759b2f5517260c651", + "sha256:20f5f411f7751ad9a2c02e80287cedf69ae032edd321fe696e310d32dd30a1f8", + "sha256:21b3090928c7b6cec509e755cc3ab742154b33660a9b433923bd12c37c448e3e", + "sha256:22147367b296be31cc858bf167c448af02435cac44806b228c9be8117f1bfce4", + "sha256:231d7608f029dda42f9610e5723614a35b1fff035a8060cf7d2be19f1711ace8", + "sha256:25f9e0bc2fe8f41c2711ccefd2871f8a5f50a39e6293b68c3dec576112937aad", + "sha256:287c2115a59c1c9ed0d5d8ae7671e594b1206c36ea9df2fca6b17b86c468ff99", + "sha256:291d13f85224551913a78fe695cde04cbca9dcb1d84c540167c443eb913603c9", + "sha256:312b6b2a30188586fe71358f0f33e4bac882d33f5e5019b26f084363f42f986f", + "sha256:34a3091abeb95e707f381a8b5b7dc8e4ee016316c659c49b726857b0d6d1bd7a", + "sha256:35a142a7d1a4fd5d5799cc4f8ab2fff50a598d8cee1d1c611f50722b3e27874f", + "sha256:3838e33710935da2ade1dd404a8b936d571e29268a70ff4ca5ba758abb3850df", + "sha256:5345bf50e127bd2767e9fd42393635bbc0146eac01f6baf6ef12c332d1a6a329", + "sha256:5919dd04446bc1ee8d6ecda2187deeebfff5903538ae71083e069bc678599446", + "sha256:59f3df78e94e07959f17764e7fa7ca6b54e9296953d2626a112eab08e1beb2db", + "sha256:5b172fce0a0ffc0fa6d282c14256d5a68b5db1e64719c2915e69084c4b6bf555", + "sha256:5c6acbd097b15bead4de8e83e8a1030bb4d8257723669097eac643a301a952f0", + "sha256:5d90a70c53b0566084447c3ef9374cc5a9be886e867b36f89495f211baabd322", + "sha256:604d07c7604b20b3130405d137cae61579578b0e8377daae4125098feebcb970", + "sha256:6b7a031e47421d4b7aa626b8c91c180a9f037f89e5d0a71c4bb7afcf4036c774", + "sha256:6da5b8099766c4da3bf1ed6e7d7f5eff1681aff6b5987d1258a13bd2ed54f0c9", + "sha256:712e71b64da181e1c0a2eaa76cd860265980cd15cb0e0498602b8aa35d5db9f8", + "sha256:71da89e134747e20ed5b8ad5b4ee93fc5b31022c2b71e8176e73c5a44699061b", + "sha256:756230c22257597b7557eaef7f90484c489e9ba78e5bb6ab5a5bcfb6b03cb075", + "sha256:7d3336e901acec897bcd318c42c2b93d5f1d038e67688f497045fc6bad2c0be7", + "sha256:7e51fa6a203fa91d415f3b2900e5748ec8e06ad75777c98cc3aeb3983ca416d7", + "sha256:877801a20f05c467126b55338a4e9fa30e2a141eb7b0b740794571b7d619ee11", + "sha256:87bbad3f5c3de8897b8c1263a9af73bbb6469fb90e7b57225dad89b8ef62cd8d", + "sha256:8bda3a9afd241ee0181661decaae25e5336ce513ac268ab57da737eacaa7871f", + "sha256:8dafc481d2defb381f19b22cc51837e8a42631e98e34b9e0892245cc96593deb", + "sha256:91d577a11b84387013815b1ad0bb6e604558d646003b44c92b3ddf886ad0f879", + "sha256:981ef3edc82da38d39eb60eae225b88a538d47b90cce2e5808846fd2cf64384b", + "sha256:987b73a06bcf5a95d7dc296241c6b1f9bc6cda42586948c9dabf386dc2bef1cd", + "sha256:9e4c85aa8844bdca3c8abac3b7f78da1531c74e9f8b3e4890c6e6d86a5a3f6c0", + "sha256:a3ea7571b6bf2090a85ff037e6593bbafe1a8598d5c3b4560eb56187bcccb4dc", + "sha256:a87bdc291718bbdf9ea4be12ae7af26cbf0706fa62c2ac332748e3116c5510a7", + "sha256:aaecd7085212d0aa4cd855f38b9d61803d6509731138bf798a9594745953245b", + "sha256:ae301c282a499dc1968dd633cfef8771dd84228ae9d40002a3ea990e4ff0c469", + "sha256:afdadd73304c9befaed02eb42f5f09fdc16288de0a08b32b8080f0f0f6350aa6", + "sha256:b20b7c9beb481e92e07368ebfaa363ed7ef61e65ffe6e0edbdbaceb33e134124", + "sha256:b30122e098c80e36d0117810d46459a46313421ce3298709170b687dc1240b02", + "sha256:b55753ee23028ba8644fd22e50de7b8f85fa60b562a0fafaad788701d6131ff8", + "sha256:b5ccfd2291c93746a286c87c3f895165b697399969d24c54804ec3ec559d4e43", + "sha256:b6613daa851745dd22b860651de930275be9d3e9373283a2164992abacb75b62", + "sha256:b710f0f4d7ec4f9fa89dfde7002f80bcd77de8024017e70706b0911ea086e2ef", + "sha256:b9ec7a4a0d6b8297102aa56758434fb1fca276a82ed7362e37817407185c3abb", + "sha256:bb12f19cdf9c4f2d9aa259562e19b188ff34afab28dd9509ff32a3f1c2c29326", + "sha256:bd2cd1b998ea4c8c1dad829fc4fa88aeed4dee555b5e03c132fc618e6123f168", + "sha256:c4da599af36618881748b5db457d937955bb2b4800db891647d46767d636c408", + "sha256:c53b12b89bd7a6c79f0536ff0d0a84fdf4ab5f6252d94b24b9b753bd9ada2ddf", + "sha256:c9617583173a29048e11397f165501edc5ae223504a404b2532a212a71ecc9ed", + "sha256:cd46c94966f631a81ffe33eee928db58e9fbee15baba5923d284aeadc0e0fa76", + "sha256:cd6806313606559e6c7adfa0dbeb30fc5ab625f00958c3d93f84831e7a32b71e", + "sha256:d0dd4cd58220351233002f910e35cc01d30337696b55c6578f71318b137770f9", + "sha256:d0f7ec902a0097ac39f1922c89be9eaccf00eb87751e28915320b4f72912d057", + "sha256:d5bb41bc74b321789803d45b124fc2145c1b3353b4ad43296d9d1d242574969b", + "sha256:d7ab0c10c4fa99dc9e26b04e6b62ac32d2bcaea3aad9b81ec8ce9a7aa32b7b1b", + "sha256:de24b47159e07833aeab517d9cb1c3c5c2d6445cc378b1c2f1d8d15fb4841d63", + "sha256:de906e5486b5c053d15b7731583c25e3c9147c288ac8152a6d1f9bccdec72641", + "sha256:df25a426446197488a6702954dcc1de511deee20c9db730499a2aa83fddf0df1", + "sha256:e25b2e90a032dc248213af7f3f3e975e1934b204f3b16aeeaeaff27a3b65e128", + "sha256:e707d93bae8f0a14e6df1ae8b0f076532b35f00e691995f33132d806a88e5c18", + "sha256:ea2ac3f7a7a2f32f194c84d82a034e66780057fd908b421becd2f173504d040e", + "sha256:ead83ac59a29d6439ddff46e205ce32f8b7f71a6bd8062347f77e232825e3d0a", + "sha256:edad398d5d402c43d2adada390dd83c74e46e020945ff4df801166047013617e", + "sha256:f010cfad3ab10676e44dc72a813c968cd586f37b466d27cde73d1f7f1ba158c2", + "sha256:f404dcc8172da1f28da9b1f0087009578e608a4899b96d244925c4f463201f2a", + "sha256:f54908bf91280a9b8fa6a8c8f3c2f65850ce6acae2852bbe292391628ebca42f", + "sha256:f5d5a5f976b39af73324f2b793862859902ccb9542621856d51a5993064f25e4", + "sha256:f9484016e6765bd295708cccc9def49f708ce07ac003808f69efa386633affb9", + "sha256:fbf36c5a220a85187cacc1fcb7dd87070e04b5fc28df7a43f6842f7c8224a388", + "sha256:fc42882b554a86e564e0b662da47b8a4b32fa966920bd165e27bb8079a323bc1" + ], + "version": "==1.2.0" + }, "mnemonic": { "hashes": [ "sha256:7c6fb5639d779388027a77944680aee4870f0fcd09b1e42a5525ee2ce4c625f6", @@ -1056,9 +1159,24 @@ "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86", "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==2.8.2" }, + "pyunormalize": { + "hashes": [ + "sha256:e63fdba0d85ea04579dde2fc29a072dba773dcae600b04faf6cc90714c8b1302" + ], + "markers": "python_version >= '3.6'", + "version": "==15.0.0" + }, + "referencing": { + "hashes": [ + "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf", + "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0" + ], + "markers": "python_version >= '3.8'", + "version": "==0.30.2" + }, "regex": { "hashes": [ "sha256:0085da0f6c6393428bf0d9c08d8b1874d805bb55e17cb1dfa5ddb7cfb11140bf", @@ -1169,6 +1287,109 @@ ], "version": "==3.0.0" }, + "rpds-py": { + "hashes": [ + "sha256:00e97d43a36811b78fa9ad9d3329bf34f76a31e891a7031a2ac01450c9b168ab", + "sha256:013d6c784150d10236a74b4094a79d96a256b814457e388fc5a4ba9efe24c402", + "sha256:0188b580c490bccb031e9b67e9e8c695a3c44ac5e06218b152361eca847317c3", + "sha256:02945ae38fd78efc40900f509890de84cfd5ffe2cd2939eeb3a8800dc68b87cb", + "sha256:02b4a2e28eb24dac4ef43dda4f6a6f7766e355179b143f7d0c76a1c5488a307b", + "sha256:0527c97dcd8bb983822ee31d3760187083fd3ba18ac4dd22cf5347c89d5628f4", + "sha256:05a1382905026bdd560f806c8c7c16e0f3e3fb359ba8868203ca6e5799884968", + "sha256:0b309908b6ff5ffbf6394818cb73b5a2a74073acee2c57fe8719046389aeff0d", + "sha256:0fc625059b83695fbb4fc8b7a8b66fa94ff9c7b78c84fb9986cd53ff88a28d80", + "sha256:177c033e467a66a054dd3a9534167234a3d0b2e41445807b13b626e01da25d92", + "sha256:18909093944727e068ebfc92e2e6ed1c4fa44135507c1c0555213ce211c53214", + "sha256:1adb04e4b4e41bf30aaa77eeb169c1b9ba9e5010e2e6ce8d6c17e1446edc9b68", + "sha256:1ed3d5385d14be894e12a9033be989e012214a9811e7194849c94032ad69682a", + "sha256:203eb1532d51591d32e8dfafd60b5d31347ea7278c8da02b4b550287f6abe28b", + "sha256:213f9ef5c02ec2f883c1075d25a873149daadbaea50d18d622e9db55ec9849c2", + "sha256:2275f1a022e2383da5d2d101fe11ccdcbae799148c4b83260a4b9309fa3e1fc2", + "sha256:22e6de18f00583f06928cc8d0993104ecc62f7c6da6478db2255de89a30e45d1", + "sha256:289073f68452b96e70990085324be7223944c7409973d13ddfe0eea1c1b5663b", + "sha256:29ec8507664f94cc08457d98cfc41c3cdbddfa8952438e644177a29b04937876", + "sha256:2a55631b93e47956fbc97d69ba2054a8c6a4016f9a3064ec4e031f5f1030cb90", + "sha256:2a86d246a160d98d820ee7d02dc18c923c228de095be362e57b9fd8970b2c4a1", + "sha256:2bca97521ee786087f0c5ef318fef3eef0266a9c3deff88205523cf353af7394", + "sha256:2c8fc6c841ada60a86d29c9ebe2e8757c47eda6553f3596c560e59ca6e9b6fa1", + "sha256:2cd0c9fb5d40887500b4ed818770c68ab4fa6e0395d286f9704be6751b1b7d98", + "sha256:2d27d08056fcd61ff47a0cd8407eff4d3e816c82cb6b9c6f0ce9a0ad49225f81", + "sha256:2ffbf1b38c88d0466de542e91b08225d51782282512f8e2b11715126c41fda48", + "sha256:3fd503c27e7b7034128e30847ecdb4bff4ca5e60f29ad022a9f66ae8940d54ac", + "sha256:3ff1f585a0fdc1415bd733b804f33d386064a308672249b14828130dd43e7c31", + "sha256:41bd430b7b63aa802c02964e331ac0b177148fef5f807d2c90d05ce71a52b4d4", + "sha256:43e9b1531d6a898bdf086acb75c41265c7ec4331267d7619148d407efc72bd24", + "sha256:46af4a742b90c7460e94214f923452c2c1d050a9da1d2b8d4c70cbc045e692b7", + "sha256:46c4c550bf59ce05d6bff2c98053822549aaf9fbaf81103edea325e03350bca1", + "sha256:4969592e3cdeefa4cbb15a26cec102cbd4a1d6e5b695fac9fa026e19741138c8", + "sha256:4a0536ed2b9297c75104e1a3da330828ba1b2639fa53b38d396f98bf7e3c68df", + "sha256:4a96147791e49e84207dd1530109aa0e9eeaf1c8b7a59f150047fc0fcdf9bb64", + "sha256:4c7f9d70f99e1fbcbf57c75328b80e1c0a7f6cad43e75efa90a97221be5efe15", + "sha256:4e8474f7233fe1949ce4e03bea698a600c2d5d6b51dab6d6e6336dbe69acf23e", + "sha256:4f1b804cfad04f862d6a84af9d1ad941b06f671878f0f7ecad6c92007d423de6", + "sha256:529aab727f54a937085184e7436e1d0e19975cf10115eda12d37a683e4ee5342", + "sha256:5612b0b1de8d5114520094bd5fc3d04eb8af6f3e10d48ef05b7c8e77c1fd9545", + "sha256:56777c57246e048908b550af9b81b0ec9cf804fd47cb7502ccd93238bd6025c2", + "sha256:56ba7c1100ed079527f2b995bf5486a2e557e6d5b733c52e8947476338815b69", + "sha256:59d222086daa55421d599609b32d0ebe544e57654c4a0a1490c54a7ebaa67561", + "sha256:5aba767e64b494483ad60c4873bec78d16205a21f8247c99749bd990d9c846c2", + "sha256:5d5eaf988951f6ecb6854ca3300b87123599c711183c83da7ce39717a7cbdbce", + "sha256:73da69e1f612c3e682e34dcb971272d90d6f27b2c99acff444ca455a89978574", + "sha256:75c8766734ac0053e1d683567e65e85306c4ec62631b0591caeb287ac8f72e08", + "sha256:75eea40355a8690459c7291ce6c8ce39c27bd223675c7da6619f510c728feb97", + "sha256:80c3cf46511653f94dfe07c7c79ab105c4164d6e1dfcb35b7214fb9af53eaef4", + "sha256:8557c807388e6617161fe51b1a4747ea8d1133f2d2ad8e79583439abebe58fbd", + "sha256:89438e8885a186c69fe31f7ef98bb2bf29688c466c3caf9060f404c0be89ae80", + "sha256:899b03a3be785a7e1ff84b237da71f0efa2f021512f147dd34ffdf7aa82cb678", + "sha256:8de9b88f0cbac73cfed34220d13c57849e62a7099a714b929142425e926d223a", + "sha256:8f4d561f4728f825e3b793a53064b606ca0b6fc264f67d09e54af452aafc5b82", + "sha256:907b214da5d2fcff0b6ddb83de1333890ca92abaf4bbf8d9c61dc1b95c87fd6e", + "sha256:9118de88c16947eaf5b92f749e65b0501ea69e7c2be7bd6aefc12551622360e1", + "sha256:9568764e72d85cf7855ca78b48e07ed1be47bf230e2cea8dabda3c95f660b0ff", + "sha256:9c74cbee9e532dc34371127f7686d6953e5153a1f22beab7f953d95ee4a0fe09", + "sha256:9cdfd649011ce2d90cb0dd304c5aba1190fac0c266d19a9e2b96b81cfd150a09", + "sha256:9f00d54b18dd837f1431d66b076737deb7c29ce3ebb8412ceaf44d5e1954ac0c", + "sha256:a2f416cdfe92f5fbb77177f5f3f7830059d1582db05f2c7119bf80069d1ab69b", + "sha256:a4cb372e22e9c879bd9a9cc9b20b7c1fbf30a605ac953da45ecec05d8a6e1c77", + "sha256:a65de5c02884760a14a58304fb6303f9ddfc582e630f385daea871e1bdb18686", + "sha256:aa3b3a43dabc4cc57a7800f526cbe03f71c69121e21b863fdf497b59b462b163", + "sha256:ab0f7aabdbce4a202e013083eeab71afdb85efa405dc4a06fea98cde81204675", + "sha256:abe081453166e206e3a8c6d8ace57214c17b6d9477d7601ac14a365344dbc1f4", + "sha256:ae141c9017f8f473a6ee07a9425da021816a9f8c0683c2e5442f0ccf56b0fc62", + "sha256:af52078719209bef33e38131486fd784832dd8d1dc9b85f00a44f6e7437dd021", + "sha256:b00150a9a3fd0a8efaa90bc2696c105b04039d50763dd1c95a34c88c5966cb57", + "sha256:b2660000e1a113869c86eb5cc07f3343467490f3cd9d0299f81da9ddae7137b7", + "sha256:b3eb1a0d2b6d232d1bcdfc3fcc5f7b004ab3fbd9203011a3172f051d4527c0b6", + "sha256:b589d93a60e78fe55d5bc76ee8c2bf945dbdbb7cd16044c53e0307604e448de1", + "sha256:b8578fc6c8bdd0201327503720fa581000b4bd3934abbf07e2628d1ad3de157d", + "sha256:ba1b28e44f611f3f2b436bd8290050a61db4b59a8e24be4465f44897936b3824", + "sha256:bb44644371eaa29a3aba7b69b1862d0d56f073bb7585baa32e4271a71a91ee82", + "sha256:bcde80aefe7054fad6277762fb7e9d35c72ea479a485ae1bb14629c640987b30", + "sha256:bd1142d22fdb183a0fff66d79134bf644401437fed874f81066d314c67ee193c", + "sha256:bf77f9017fcfa1232f98598a637406e6c33982ccba8a5922339575c3e2b90ea5", + "sha256:c2772bb95062e3f9774140205cd65d8997e39620715486cf5f843cf4ad8f744c", + "sha256:c4ecc4e9a5d73a816cae36ee6b5d8b7a0c72013cae1e101406e832887c3dc2d8", + "sha256:c86231c66e4f422e7c13ea6200bb4048b3016c8bfd11b4fd0dabd04d2c8e3501", + "sha256:c8f6526df47953b07c45b95c4d1da6b9a0861c0e5da0271db96bb1d807825412", + "sha256:ccfb77f6dc8abffa6f1c7e3975ed9070a41ce5fcc11154d2bead8c1baa940f09", + "sha256:d9d7efaad48b859053b90dedd69bc92f2095084251e732e4c57ac9726bcb1e64", + "sha256:dd91a7d7a9ce7f4983097c91ce211f3e5569cc21caa16f2692298a07e396f82b", + "sha256:de4a2fd524993578fe093044f291b4b24aab134390030b3b9b5f87fd41ab7e75", + "sha256:df61f818edf7c8626bfa392f825860fb670b5f8336e238eb0ec7e2a5689cdded", + "sha256:e1147bc3d0dd1e549d991110d0a09557ec9f925dbc1ca62871fcdab2ec9d716b", + "sha256:e1954f4b239d1a92081647eecfd51cbfd08ea16eb743b8af1cd0113258feea14", + "sha256:e281b71922208e00886e4b7ffbfcf27874486364f177418ab676f102130e7ec9", + "sha256:e69737bd56006a86fd5a78b2b85447580a6138c930a75eb9ef39fe03d90782b1", + "sha256:e82b4a70cc67094f3f3fd77579702f48fcf1de7bdc67d79b8f1e24d089a6162c", + "sha256:e92e5817eb6bfed23aa5e45bfe30647b83602bdd6f9e25d63524d4e6258458b0", + "sha256:eaba0613c759ebf95988a84f766ca6b7432d55ce399194f95dde588ad1be0878", + "sha256:edd74b760a6bb950397e7a7bd2f38e6700f6525062650b1d77c6d851b82f02c2", + "sha256:f40abbcc0a7d9a8a80870af839d317e6932533f98682aabd977add6c53beeb23", + "sha256:fce7a8ee8d0f682c953c0188735d823f0fcb62779bf92cd6ba473a8e730e26ad" + ], + "markers": "python_version >= '3.8'", + "version": "==0.10.2" + }, "safe-pysha3": { "hashes": [ "sha256:e429146b1edd198b2ca934a2046a65656c5d31b0ec894bbd6055127f4deaff17" @@ -1178,18 +1399,18 @@ }, "setuptools": { "hashes": [ - "sha256:3d4dfa6d95f1b101d695a6160a7626e15583af71a5f52176efa5d39a054d475d", - "sha256:3d8083eed2d13afc9426f227b24fd1659489ec107c0e86cec2ffdde5c92e790b" + "sha256:00478ca80aeebeecb2f288d3206b0de568df5cd2b8fada1209843cc9a8d88a48", + "sha256:af3d5949030c3f493f550876b2fd1dd5ec66689c4ee5d5344f009746f71fd5a8" ], "markers": "python_version >= '3.8'", - "version": "==68.1.2" + "version": "==68.2.0" }, "six": { "hashes": [ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, "toolz": { @@ -1200,6 +1421,14 @@ "markers": "python_version >= '3.5'", "version": "==0.12.0" }, + "typing-extensions": { + "hashes": [ + "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", + "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2" + ], + "markers": "python_version >= '3.7'", + "version": "==4.7.1" + }, "tzlocal": { "hashes": [ "sha256:46eb99ad4bdb71f3f72b7d24f4267753e240944ecfc16f25d2719ba89827a803", @@ -1217,6 +1446,15 @@ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", "version": "==1.26.16" }, + "web3": { + "hashes": [ + "sha256:3bc95043ee9fc6ee0b13a4766d4975b9f7cae069db136430a3799ed18743e608", + "sha256:cb454d0180e63ba1d83143dccf7c623581ba58e222edb006f48252d8a7b948e0" + ], + "index": "pypi", + "markers": "python_full_version >= '3.7.2'", + "version": "==6.9.0" + }, "websockets": { "hashes": [ "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd", @@ -1499,12 +1737,12 @@ }, "pytest": { "hashes": [ - "sha256:78bf16451a2eb8c7a2ea98e32dc119fd2aa758f1d5d66dbf0a59d69a3969df32", - "sha256:b4bf8c45bd59934ed84001ad51e11b4ee40d40a1229d2c79f9c592b0a3f6bd8a" + "sha256:2f2301e797521b23e4d2585a0a3d7b5e50fdddaaf7e7d6773ea26ddb17c213ab", + "sha256:460c9a59b14e27c602eb5ece2e47bec99dc5fc5f6513cf924a7d03a578991b1f" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==7.4.0" + "version": "==7.4.1" }, "pytest-asyncio": { "hashes": [ @@ -1545,7 +1783,7 @@ "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", "version": "==1.16.0" }, "urllib3": { diff --git a/README.md b/README.md index 381d3401..d3dcc206 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ ## Injective Python SDK +[![codecov](https://codecov.io/gh/InjectiveLabs/sdk-python/graph/badge.svg?token=RBGK98G6F1)](https://codecov.io/gh/InjectiveLabs/sdk-python) + ### Dependencies **Ubuntu** @@ -24,20 +26,20 @@ pip install injective-py ``` ### Usage -Requires Python 3.7+ +Requires Python 3.9+ +Please install `poetry` following the steps described in the [documentation](https://python-poetry.org/docs/#installation) [Examples](https://github.com/InjectiveLabs/sdk-python/tree/master/examples) ```bash -$ pipenv shell -$ pipenv install +$ poetry install # connecting to Injective Exchange API # and listening for new orders from a specific spot market -$ python examples/exchange_client/spot_exchange_rpc/8_StreamOrders.py +$ poetry run python examples/exchange_client/spot_exchange_rpc/8_StreamOrders.py # sending a msg with bank transfer # signs and posts a transaction to the Injective Chain -$ python examples/chain_client/1_MsgSend.py +$ poetry run python examples/chain_client/1_MsgSend.py ``` Upgrade `pip` to the latest version, if you see these warnings: ``` @@ -49,16 +51,10 @@ Upgrade `pip` to the latest version, if you see these warnings: 1. Generate proto binding & build ``` make gen - python -m build - ``` - -2. Enable dev env - ``` - pipenv shell - pipenv install --dev + poetry build ``` -3. Install pkg +2. Install pkg ``` # from local build pip uninstall injective-py @@ -69,24 +65,36 @@ Upgrade `pip` to the latest version, if you see these warnings: pip install injective-py ``` -4. Fetch latest denom config +3. Fetch latest denom config ``` -python pyinjective/fetch_metadata.py +poetry run python pyinjective/fetch_metadata.py ``` Note that the [sync client](https://github.com/InjectiveLabs/sdk-python/blob/master/pyinjective/client.py) has been deprecated as of April 18, 2022. If you are using the sync client please make sure to transition to the [async client](https://github.com/InjectiveLabs/sdk-python/blob/master/pyinjective/async_client.py), for more information read [here](https://github.com/InjectiveLabs/sdk-python/issues/101) -5. Install the development environment (requires `pipenv`) -``` -pipenv install -d -``` - -6. Run all unit tests in a development environment +4. Run all unit tests in a development environment ``` -make tests +poetry run pytest -v ``` ### Changelogs +**0.9** +* Replace Pipenv with Poetry +* Add pre-commit validations to the project +* Add a GitHub workflow to run all tests and calculate coverage for each PR + +**0.8.5** +* Added NEOK/USDT and ORAI/USDT spot markets to the mainnet .ini file + +**0.8.4** +* Added methods to SpotMarket, DerivativeMarket and BianaryOptionMarket to translate chain prices and quantities to human-readable format. + +**0.8.3** +* Fix dependency issue in setup.py. + +**0.8.2** +* Add web3 library as a dependency for the project. + **0.8.1** * Moved the configuration to use a secure or insecure connection inside the Network class. The AsyncClient's `insecure` parameter is no longer used for anything and will be removed in the future. * Made the new load balanced bare-metal node the default one for mainnet (it is called `lb`). The legacy one (load balanced k8s node) is called `lb_k8s` @@ -252,5 +260,4 @@ Copyright © 2021 - 2022 Injective Labs Inc. (https://injectivelabs.org/) Originally released by Injective Labs Inc. under:
Apache License
Version 2.0, January 2004
-http://www.apache.org/licenses/ - +http://www.apache.org/licenses/ diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 00000000..e69de29b diff --git a/compatibility-tests/README.md b/compatibility-tests/README.md index 25abb93e..b9177a06 100644 --- a/compatibility-tests/README.md +++ b/compatibility-tests/README.md @@ -38,6 +38,6 @@ API users must also install the typing_extensions library with the below command ```bash pip3 install typing_extensions -``` +``` The Python 3.7 stdlib has an older version of typing.py so the above change in the code will fix the compatibility issue by importing Literal from typing_extensions diff --git a/compatibility-tests/tests.py b/compatibility-tests/tests.py index aba3b682..c1872378 100644 --- a/compatibility-tests/tests.py +++ b/compatibility-tests/tests.py @@ -1,32 +1,21 @@ import asyncio -import aiohttp -import logging -import json import base64 -import hashlib import json +from typing import Any, Dict, List + +import aiohttp import ecdsa -import sha3 import grpc - -from typing import Any, Dict, List -from injective.chain_client._wallet import ( - generate_wallet, - privkey_to_address, - privkey_to_pubkey, - pubkey_to_address, - seed_to_privkey, - DEFAULT_BECH32_HRP, -) -from injective.chain_client._typings import SyncMode import injective.exchange_api.injective_accounts_rpc_pb2 as accounts_rpc_pb import injective.exchange_api.injective_accounts_rpc_pb2_grpc as accounts_rpc_grpc - +import sha3 +from injective.chain_client._typings import SyncMode +from injective.chain_client._wallet import DEFAULT_BECH32_HRP, privkey_to_address, privkey_to_pubkey, seed_to_privkey MIN_GAS_PRICE = 500000000 -class Transaction: +class Transaction: def __init__( self, *, @@ -104,17 +93,14 @@ def get_signed(self) -> str: return json.dumps(signed_tx, separators=(",", ":")) def _sign(self) -> str: - message_str = json.dumps( - self._get_sign_message(), separators=(",", ":"), sort_keys=True) + message_str = json.dumps(self._get_sign_message(), separators=(",", ":"), sort_keys=True) message_bytes = message_str.encode("utf-8") - privkey = ecdsa.SigningKey.from_string( - self._privkey, curve=ecdsa.SECP256k1) + privkey = ecdsa.SigningKey.from_string(self._privkey, curve=ecdsa.SECP256k1) signature_compact_keccak = privkey.sign_deterministic( message_bytes, hashfunc=sha3.keccak_256, sigencode=ecdsa.util.sigencode_string_canonize ) - signature_base64_str = base64.b64encode( - signature_compact_keccak).decode("utf-8") + signature_base64_str = base64.b64encode(signature_compact_keccak).decode("utf-8") return signature_base64_str def _get_sign_message(self) -> Dict[str, Any]: @@ -130,20 +116,21 @@ def _get_sign_message(self) -> Dict[str, Any]: "msgs": self._msgs, } + async def main() -> None: - sender_pk = seed_to_privkey( - "physical page glare junk return scale subject river token door mirror title" - ) + sender_pk = seed_to_privkey("physical page glare junk return scale subject river token door mirror title") sender_acc_addr = privkey_to_address(sender_pk) print("Sender Account:", sender_acc_addr) acc_num, acc_seq = await get_account_num_seq(sender_acc_addr) - async with grpc.aio.insecure_channel('testnet-sentry0.injective.network:9910') as channel: + async with grpc.aio.insecure_channel("testnet-sentry0.injective.network:9910") as channel: accounts_rpc = accounts_rpc_grpc.InjectiveAccountsRPCStub(channel) account_addr = "inj14au322k9munkmx5wrchz9q30juf5wjgz2cfqku" - subacc = await accounts_rpc.SubaccountsList(accounts_rpc_pb.SubaccountsListRequest(account_address = account_addr)) + subacc = await accounts_rpc.SubaccountsList( + accounts_rpc_pb.SubaccountsListRequest(account_address=account_addr) + ) for sub in subacc.subaccounts: print("Primary subaccount:", sub) break @@ -162,7 +149,7 @@ async def main() -> None: denom="inj", ) tx.add_exchange_msg_deposit( - subaccount= sub, + subaccount=sub, amount=10000000000000000, denom="inj", ) @@ -172,36 +159,42 @@ async def main() -> None: print("Signed Tx:", tx_json) print("Sent Tx:", await post_tx(tx_json)) + async def get_account_num_seq(address: str) -> (int, int): async with aiohttp.ClientSession() as session: async with session.request( - 'GET', 'http://staking-lcd-testnet.injective.network/cosmos/auth/v1beta1/accounts/' + address, - headers={'Accept-Encoding': 'application/json'}, + "GET", + "http://staking-lcd-testnet.injective.network/cosmos/auth/v1beta1/accounts/" + address, + headers={"Accept-Encoding": "application/json"}, ) as response: if response.status != 200: print(await response.text()) raise ValueError("HTTP response status", response.status) resp = json.loads(await response.text()) - acc = resp['account']['base_account'] - return acc['account_number'], acc['sequence'] + acc = resp["account"]["base_account"] + return acc["account_number"], acc["sequence"] + async def post_tx(tx_json: str): async with aiohttp.ClientSession() as session: async with session.request( - 'POST', 'http://staking-lcd-testnet.injective.network/txs', data=tx_json, - headers={'Content-Type': 'application/json'}, + "POST", + "http://staking-lcd-testnet.injective.network/txs", + data=tx_json, + headers={"Content-Type": "application/json"}, ) as response: if response.status != 200: print(await response.text()) raise ValueError("HTTP response status", response.status) resp = json.loads(await response.text()) - if 'code' in resp: + if "code" in resp: print("Response:", resp) - raise ValueError('sdk error %d: %s' % (resp['code'], resp['raw_log'])) + raise ValueError("sdk error %d: %s" % (resp["code"], resp["raw_log"])) + + return resp["txhash"] - return resp['txhash'] if __name__ == "__main__": - asyncio.get_event_loop().run_until_complete(main()) \ No newline at end of file + asyncio.get_event_loop().run_until_complete(main()) diff --git a/compatibility-tests/unit_tests.py b/compatibility-tests/unit_tests.py index 31314aea..7c19a28c 100644 --- a/compatibility-tests/unit_tests.py +++ b/compatibility-tests/unit_tests.py @@ -1,29 +1,21 @@ -import pytest -import aiohttp -import json -import ecdsa -import sha3 -import grpc import base64 - +import json from typing import Any, Dict, List -from injective.chain_client._wallet import ( - generate_wallet, - privkey_to_address, - privkey_to_pubkey, - pubkey_to_address, - seed_to_privkey, - DEFAULT_BECH32_HRP, -) -from injective.chain_client._typings import SyncMode +import aiohttp +import ecdsa +import grpc import injective.exchange_api.injective_accounts_rpc_pb2 as accounts_rpc_pb import injective.exchange_api.injective_accounts_rpc_pb2_grpc as accounts_rpc_grpc +import pytest +import sha3 +from injective.chain_client._typings import SyncMode +from injective.chain_client._wallet import DEFAULT_BECH32_HRP, privkey_to_address, privkey_to_pubkey, seed_to_privkey MIN_GAS_PRICE = 500000000 -class Transaction: +class Transaction: def __init__( self, *, @@ -50,7 +42,6 @@ def __init__( self._sync_mode = sync_mode self._msgs: List[dict] = [] - def add_cosmos_bank_msg_send(self, recipient: str, amount: int, denom: str = "inj") -> None: msg = { "type": "cosmos-sdk/MsgSend", @@ -100,17 +91,14 @@ def get_signed(self) -> str: return json.dumps(signed_tx, separators=(",", ":")) def _sign(self) -> str: - message_str = json.dumps( - self._get_sign_message(), separators=(",", ":"), sort_keys=True) + message_str = json.dumps(self._get_sign_message(), separators=(",", ":"), sort_keys=True) message_bytes = message_str.encode("utf-8") - privkey = ecdsa.SigningKey.from_string( - self._privkey, curve=ecdsa.SECP256k1) + privkey = ecdsa.SigningKey.from_string(self._privkey, curve=ecdsa.SECP256k1) signature_compact_keccak = privkey.sign_deterministic( message_bytes, hashfunc=sha3.keccak_256, sigencode=ecdsa.util.sigencode_string_canonize ) - signature_base64_str = base64.b64encode( - signature_compact_keccak).decode("utf-8") + signature_base64_str = base64.b64encode(signature_compact_keccak).decode("utf-8") return signature_base64_str def _get_sign_message(self) -> Dict[str, Any]: @@ -130,49 +118,54 @@ def _get_sign_message(self) -> Dict[str, Any]: async def get_account_num_seq(address: str) -> (int, int): async with aiohttp.ClientSession() as session: async with session.request( - 'GET', 'http://staking-lcd-testnet.injective.network/cosmos/auth/v1beta1/accounts/' + address, - headers={'Accept-Encoding': 'application/json'}, + "GET", + "http://staking-lcd-testnet.injective.network/cosmos/auth/v1beta1/accounts/" + address, + headers={"Accept-Encoding": "application/json"}, ) as response: if response.status != 200: print(await response.text()) raise ValueError("HTTP response status", response.status) resp = json.loads(await response.text()) - acc = resp['account']['base_account'] - return acc['account_number'], acc['sequence'] + acc = resp["account"]["base_account"] + return acc["account_number"], acc["sequence"] + async def post_tx(tx_json: str): async with aiohttp.ClientSession() as session: async with session.request( - 'POST', 'http://staking-lcd-testnet.injective.network/txs', data=tx_json, - headers={'Content-Type': 'application/json'}, + "POST", + "http://staking-lcd-testnet.injective.network/txs", + data=tx_json, + headers={"Content-Type": "application/json"}, ) as response: if response.status != 200: print(await response.text()) raise ValueError("HTTP response status", response.status) resp = json.loads(await response.text()) - if 'code' in resp: + if "code" in resp: print("Response:", resp) - raise ValueError('sdk error %d: %s' % (resp['code'], resp['raw_log'])) + raise ValueError("sdk error %d: %s" % (resp["code"], resp["raw_log"])) + + return resp["txhash"] - return resp['txhash'] @pytest.fixture async def msg_send(): - sender_pk = seed_to_privkey( - "physical page glare junk return scale subject river token door mirror title" - ) + sender_pk = seed_to_privkey("physical page glare junk return scale subject river token door mirror title") sender_acc_addr = privkey_to_address(sender_pk) print("Sender Account:", sender_acc_addr) acc_num, acc_seq = await get_account_num_seq(sender_acc_addr) - async with grpc.aio.insecure_channel('testnet-sentry0.injective.network:9910') as channel: + async with grpc.aio.insecure_channel("testnet-sentry0.injective.network:9910") as channel: accounts_rpc = accounts_rpc_grpc.InjectiveAccountsRPCStub(channel) account_addr = "inj14au322k9munkmx5wrchz9q30juf5wjgz2cfqku" - subacc = await accounts_rpc.SubaccountsList(accounts_rpc_pb.SubaccountsListRequest(account_address = account_addr)) + subacc = await accounts_rpc.SubaccountsList( + accounts_rpc_pb.SubaccountsListRequest(account_address=account_addr) + ) for sub in subacc.subaccounts: print("Primary subaccount:", sub) break @@ -191,7 +184,7 @@ async def msg_send(): denom="inj", ) tx.add_exchange_msg_deposit( - subaccount= sub, + subaccount=sub, amount=10000000000000000, denom="inj", ) @@ -204,6 +197,7 @@ async def msg_send(): return len(tx_result) + @pytest.mark.asyncio async def test_msg_send(msg_send): - assert msg_send == 64 \ No newline at end of file + assert msg_send == 64 diff --git a/examples/SendToInjective.py b/examples/SendToInjective.py index 5d0d1072..b03988b4 100644 --- a/examples/SendToInjective.py +++ b/examples/SendToInjective.py @@ -1,14 +1,9 @@ -import json -import requests - import asyncio -import logging +import json from pyinjective.core.network import Network from pyinjective.sendtocosmos import Peggo -import importlib.resources as pkg_resources -import pyinjective async def main() -> None: # select network: testnet, mainnet @@ -25,13 +20,29 @@ async def main() -> None: receiver = "inj14au322k9munkmx5wrchz9q30juf5wjgz2cfqku" amount = 1 - data = '{"@type": "/injective.exchange.v1beta1.MsgDeposit","sender": "inj14au322k9munkmx5wrchz9q30juf5wjgz2cfqku","subaccountId": "0xaf79152ac5df276d9a8e1e2e22822f9713474902000000000000000000000000","amount": {"denom": "inj","amount": "1000000000000000000"}}' - - import_peggo = pkg_resources.read_text(pyinjective, 'Peggo_ABI.json') - peggo_abi = json.loads(import_peggo) + data = ( + '{"@type": "/injective.exchange.v1beta1.MsgDeposit",' + '"sender": "inj14au322k9munkmx5wrchz9q30juf5wjgz2cfqku",' + '"subaccountId": "0xaf79152ac5df276d9a8e1e2e22822f9713474902000000000000000000000000",' + '"amount": {"denom": "inj","amount": "1000000000000000000"}}' + ) + + with open("../pyinjective/Peggo_ABI.json") as pego_file: + peggo_data = pego_file.read() + peggo_abi = json.loads(peggo_data) + + peggo_composer.sendToInjective( + ethereum_endpoint=ethereum_endpoint, + private_key=private_key, + token_contract=token_contract, + receiver=receiver, + amount=amount, + maxFeePerGas=maxFeePerGas_Gwei, + maxPriorityFeePerGas=maxPriorityFeePerGas_Gwei, + data=data, + peggo_abi=peggo_abi, + ) - peggo_composer.sendToInjective(ethereum_endpoint=ethereum_endpoint, private_key=private_key, token_contract=token_contract, - receiver=receiver, amount=amount, maxFeePerGas=maxFeePerGas_Gwei, maxPriorityFeePerGas=maxPriorityFeePerGas_Gwei, data=data, peggo_abi=peggo_abi) if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/0_LocalOrderHash.py b/examples/chain_client/0_LocalOrderHash.py index 0e20049b..e25d695c 100644 --- a/examples/chain_client/0_LocalOrderHash.py +++ b/examples/chain_client/0_LocalOrderHash.py @@ -1,11 +1,11 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.composer import Composer -from pyinjective.transaction import Transaction from pyinjective.core.network import Network -from pyinjective.wallet import PrivateKey from pyinjective.orderhash import OrderHashManager +from pyinjective.transaction import Transaction +from pyinjective.wallet import PrivateKey + async def main() -> None: # select network: local, testnet, mainnet @@ -20,15 +20,11 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) subaccount_id = address.get_subaccount_id(index=0) subaccount_id_2 = address.get_subaccount_id(index=1) - order_hash_manager = OrderHashManager( - address=address, - network=network, - subaccount_indexes=[0,1,2,7] - ) + order_hash_manager = OrderHashManager(address=address, network=network, subaccount_indexes=[0, 1, 2, 7]) # prepare trade info spot_market_id = "0x0611780ba69656949525013d947713300f56c37b6175e02f26bffa495c3208fe" @@ -43,7 +39,7 @@ async def main() -> None: price=0.524, quantity=0.01, is_buy=True, - is_po=False + is_po=False, ), composer.SpotOrder( market_id=spot_market_id, @@ -52,7 +48,7 @@ async def main() -> None: price=27.92, quantity=0.01, is_buy=False, - is_po=False + is_po=False, ), ] @@ -65,7 +61,7 @@ async def main() -> None: quantity=0.01, leverage=1.5, is_buy=True, - is_po=False + is_po=False, ), composer.DerivativeOrder( market_id=deriv_market_id, @@ -75,23 +71,19 @@ async def main() -> None: quantity=0.01, leverage=2, is_buy=False, - is_reduce_only=False + is_reduce_only=False, ), ] # prepare tx msg - spot_msg = composer.MsgBatchCreateSpotLimitOrders( - sender=address.to_acc_bech32(), - orders=spot_orders - ) + spot_msg = composer.MsgBatchCreateSpotLimitOrders(sender=address.to_acc_bech32(), orders=spot_orders) - deriv_msg = composer.MsgBatchCreateDerivativeLimitOrders( - sender=address.to_acc_bech32(), - orders=derivative_orders - ) + deriv_msg = composer.MsgBatchCreateDerivativeLimitOrders(sender=address.to_acc_bech32(), orders=derivative_orders) # compute order hashes - order_hashes = order_hash_manager.compute_order_hashes(spot_orders=spot_orders, derivative_orders=derivative_orders, subaccount_index=0) + order_hashes = order_hash_manager.compute_order_hashes( + spot_orders=spot_orders, derivative_orders=derivative_orders, subaccount_index=0 + ) print("computed spot order hashes", order_hashes.spot) print("computed derivative order hashes", order_hashes.derivative) @@ -107,12 +99,14 @@ async def main() -> None: gas_price = 500000000 base_gas = 85000 gas_limit = base_gas + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -123,9 +117,10 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) - # compute order hashes - order_hashes = order_hash_manager.compute_order_hashes(spot_orders=spot_orders, derivative_orders=derivative_orders, subaccount_index=0) + order_hashes = order_hash_manager.compute_order_hashes( + spot_orders=spot_orders, derivative_orders=derivative_orders, subaccount_index=0 + ) print("computed spot order hashes", order_hashes.spot) print("computed derivative order hashes", order_hashes.derivative) @@ -141,12 +136,14 @@ async def main() -> None: gas_price = 500000000 base_gas = 85000 gas_limit = base_gas + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -165,7 +162,7 @@ async def main() -> None: price=1.524, quantity=0.01, is_buy=True, - is_po=True + is_po=True, ), composer.SpotOrder( market_id=spot_market_id, @@ -174,7 +171,7 @@ async def main() -> None: price=27.92, quantity=0.01, is_buy=False, - is_po=False + is_po=False, ), ] @@ -187,7 +184,7 @@ async def main() -> None: quantity=0.01, leverage=1.5, is_buy=True, - is_po=False + is_po=False, ), composer.DerivativeOrder( market_id=deriv_market_id, @@ -197,23 +194,19 @@ async def main() -> None: quantity=0.01, leverage=2, is_buy=False, - is_reduce_only=False + is_reduce_only=False, ), ] # prepare tx msg - spot_msg = composer.MsgBatchCreateSpotLimitOrders( - sender=address.to_acc_bech32(), - orders=spot_orders - ) + spot_msg = composer.MsgBatchCreateSpotLimitOrders(sender=address.to_acc_bech32(), orders=spot_orders) - deriv_msg = composer.MsgBatchCreateDerivativeLimitOrders( - sender=address.to_acc_bech32(), - orders=derivative_orders - ) + deriv_msg = composer.MsgBatchCreateDerivativeLimitOrders(sender=address.to_acc_bech32(), orders=derivative_orders) # compute order hashes - order_hashes = order_hash_manager.compute_order_hashes(spot_orders=spot_orders, derivative_orders=derivative_orders, subaccount_index=1) + order_hashes = order_hash_manager.compute_order_hashes( + spot_orders=spot_orders, derivative_orders=derivative_orders, subaccount_index=1 + ) print("computed spot order hashes", order_hashes.spot) print("computed derivative order hashes", order_hashes.derivative) @@ -229,12 +222,14 @@ async def main() -> None: gas_price = 500000000 base_gas = 85000 gas_limit = base_gas + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -245,5 +240,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/13_MsgIncreasePositionMargin.py b/examples/chain_client/13_MsgIncreasePositionMargin.py index d5e1d7cd..a2556f78 100644 --- a/examples/chain_client/13_MsgIncreasePositionMargin.py +++ b/examples/chain_client/13_MsgIncreasePositionMargin.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,7 +19,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) subaccount_id = address.get_subaccount_id(index=0) # prepare trade info @@ -31,7 +31,7 @@ async def main() -> None: market_id=market_id, source_subaccount_id=subaccount_id, destination_subaccount_id=subaccount_id, - amount=2 + amount=2, ) # build sim tx @@ -55,12 +55,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -71,5 +73,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/15_MsgWithdraw.py b/examples/chain_client/15_MsgWithdraw.py index fb585719..437d0037 100644 --- a/examples/chain_client/15_MsgWithdraw.py +++ b/examples/chain_client/15_MsgWithdraw.py @@ -15,8 +15,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -33,16 +33,11 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) subaccount_id = address.get_subaccount_id(index=0) # prepare tx msg - msg = composer.MsgWithdraw( - sender=address.to_acc_bech32(), - subaccount_id=subaccount_id, - amount=1, - denom="USDT" - ) + msg = composer.MsgWithdraw(sender=address.to_acc_bech32(), subaccount_id=subaccount_id, amount=1, denom="USDT") # build sim tx tx = ( @@ -65,12 +60,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -81,5 +78,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/16_MsgSubaccountTransfer.py b/examples/chain_client/16_MsgSubaccountTransfer.py index e3dbde9b..bc2e5baf 100644 --- a/examples/chain_client/16_MsgSubaccountTransfer.py +++ b/examples/chain_client/16_MsgSubaccountTransfer.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,7 +19,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) subaccount_id = address.get_subaccount_id(index=0) dest_subaccount_id = address.get_subaccount_id(index=1) @@ -29,7 +29,7 @@ async def main() -> None: source_subaccount_id=subaccount_id, destination_subaccount_id=dest_subaccount_id, amount=100, - denom="INJ" + denom="INJ", ) # build sim tx @@ -53,12 +53,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -69,5 +71,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/17_MsgBatchUpdateOrders.py b/examples/chain_client/17_MsgBatchUpdateOrders.py index 853b85ee..3b3e7f77 100644 --- a/examples/chain_client/17_MsgBatchUpdateOrders.py +++ b/examples/chain_client/17_MsgBatchUpdateOrders.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,7 +19,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) subaccount_id = address.get_subaccount_id(index=0) # prepare trade info @@ -37,26 +37,26 @@ async def main() -> None: composer.OrderData( market_id=derivative_market_id_cancel, subaccount_id=subaccount_id, - order_hash="0x48690013c382d5dbaff9989db04629a16a5818d7524e027d517ccc89fd068103" + order_hash="0x48690013c382d5dbaff9989db04629a16a5818d7524e027d517ccc89fd068103", ), composer.OrderData( market_id=derivative_market_id_cancel_2, subaccount_id=subaccount_id, - order_hash="0x7ee76255d7ca763c56b0eab9828fca89fdd3739645501c8a80f58b62b4f76da5" - ) + order_hash="0x7ee76255d7ca763c56b0eab9828fca89fdd3739645501c8a80f58b62b4f76da5", + ), ] spot_orders_to_cancel = [ composer.OrderData( market_id=spot_market_id_cancel, subaccount_id=subaccount_id, - order_hash="0x3870fbdd91f07d54425147b1bb96404f4f043ba6335b422a6d494d285b387f2d" + order_hash="0x3870fbdd91f07d54425147b1bb96404f4f043ba6335b422a6d494d285b387f2d", ), composer.OrderData( market_id=spot_market_id_cancel_2, subaccount_id=subaccount_id, - order_hash="0x222daa22f60fe9f075ed0ca583459e121c23e64431c3fbffdedda04598ede0d2" - ) + order_hash="0x222daa22f60fe9f075ed0ca583459e121c23e64431c3fbffdedda04598ede0d2", + ), ] derivative_orders_to_create = [ @@ -68,7 +68,7 @@ async def main() -> None: quantity=0.1, leverage=1, is_buy=True, - is_po=False + is_po=False, ), composer.DerivativeOrder( market_id=derivative_market_id_create, @@ -78,7 +78,7 @@ async def main() -> None: quantity=0.01, leverage=1, is_buy=False, - is_po=False + is_po=False, ), ] @@ -90,7 +90,7 @@ async def main() -> None: price=3, quantity=55, is_buy=True, - is_po=False + is_po=False, ), composer.SpotOrder( market_id=spot_market_id_create, @@ -99,7 +99,7 @@ async def main() -> None: price=300, quantity=55, is_buy=False, - is_po=False + is_po=False, ), ] @@ -109,7 +109,7 @@ async def main() -> None: derivative_orders_to_create=derivative_orders_to_create, spot_orders_to_create=spot_orders_to_create, derivative_orders_to_cancel=derivative_orders_to_cancel, - spot_orders_to_cancel=spot_orders_to_cancel + spot_orders_to_cancel=spot_orders_to_cancel, ) # build sim tx @@ -136,13 +136,15 @@ async def main() -> None: # build tx gas_price = 500000000 - gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -154,5 +156,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/18_MsgBid.py b/examples/chain_client/18_MsgBid.py index 001fde7c..5a23f172 100644 --- a/examples/chain_client/18_MsgBid.py +++ b/examples/chain_client/18_MsgBid.py @@ -1,10 +1,11 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey + async def main() -> None: # select network: local, testnet, mainnet network = Network.testnet() @@ -18,14 +19,10 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) # prepare tx msg - msg = composer.MsgBid( - sender=address.to_acc_bech32(), - round=16250, - bid_amount=1 - ) + msg = composer.MsgBid(sender=address.to_acc_bech32(), round=16250, bid_amount=1) # build sim tx tx = ( @@ -48,12 +45,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -64,5 +63,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/19_MsgGrant.py b/examples/chain_client/19_MsgGrant.py index 17a8ffee..548af1a5 100644 --- a/examples/chain_client/19_MsgGrant.py +++ b/examples/chain_client/19_MsgGrant.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,21 +19,21 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) - subaccount_id = address.get_subaccount_id(index=0) - market_ids = ["0x0511ddc4e6586f3bfe1acb2dd905f8b8a82c97e1edaef654b12ca7e6031ca0fa"] + await client.get_account(address.to_acc_bech32()) + # subaccount_id = address.get_subaccount_id(index=0) + # market_ids = ["0x0511ddc4e6586f3bfe1acb2dd905f8b8a82c97e1edaef654b12ca7e6031ca0fa"] # prepare tx msg - #GENERIC AUTHZ + # GENERIC AUTHZ msg = composer.MsgGrantGeneric( - granter = "inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r", - grantee = "inj14au322k9munkmx5wrchz9q30juf5wjgz2cfqku", - msg_type = "/injective.exchange.v1beta1.MsgCreateSpotLimitOrder", - expire_in=31536000 # 1 year + granter="inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r", + grantee="inj14au322k9munkmx5wrchz9q30juf5wjgz2cfqku", + msg_type="/injective.exchange.v1beta1.MsgCreateSpotLimitOrder", + expire_in=31536000, # 1 year ) - #TYPED AUTHZ + # TYPED AUTHZ # msg = composer.MsgGrantTyped( # granter = "inj14au322k9munkmx5wrchz9q30juf5wjgz2cfqku", # grantee = "inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r", @@ -63,13 +63,15 @@ async def main() -> None: # build tx gas_price = 500000000 - gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) diff --git a/examples/chain_client/1_MsgSend.py b/examples/chain_client/1_MsgSend.py index f4894b4d..1d3c28a6 100644 --- a/examples/chain_client/1_MsgSend.py +++ b/examples/chain_client/1_MsgSend.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,14 +19,14 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) # prepare tx msg msg = composer.MsgSend( from_address=address.to_acc_bech32(), - to_address='inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r', + to_address="inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r", amount=0.000000000000000001, - denom='INJ' + denom="INJ", ) # build sim tx @@ -50,12 +50,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -66,5 +68,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/20_MsgExec.py b/examples/chain_client/20_MsgExec.py index e0f6854e..c940523c 100644 --- a/examples/chain_client/20_MsgExec.py +++ b/examples/chain_client/20_MsgExec.py @@ -1,9 +1,9 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network -from pyinjective.wallet import PrivateKey, Address +from pyinjective.transaction import Transaction +from pyinjective.wallet import Address, PrivateKey async def main() -> None: @@ -19,7 +19,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("5d386fbdbf11f1141010f81a46b40f94887367562bd33b452bbaa6ce1cd1381e") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) # prepare tx msg market_id = "0x0611780ba69656949525013d947713300f56c37b6175e02f26bffa495c3208fe" @@ -35,13 +35,10 @@ async def main() -> None: price=7.523, quantity=0.01, is_buy=True, - is_po=False + is_po=False, ) - msg = composer.MsgExec( - grantee=grantee, - msgs=[msg0] - ) + msg = composer.MsgExec(grantee=grantee, msgs=[msg0]) # build sim tx tx = ( @@ -62,23 +59,22 @@ async def main() -> None: return sim_res_msg = composer.MsgResponses(sim_res, simulation=True) - data=sim_res_msg[0] - unpacked_msg_res = composer.UnpackMsgExecResponse( - msg_type=msg0.__class__.__name__, - data=data - ) + data = sim_res_msg[0] + unpacked_msg_res = composer.UnpackMsgExecResponse(msg_type=msg0.__class__.__name__, data=data) print("simulation msg response") print(unpacked_msg_res) # build tx gas_price = 500000000 - gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -89,5 +85,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/21_MsgRevoke.py b/examples/chain_client/21_MsgRevoke.py index 51b23f8b..7c040810 100644 --- a/examples/chain_client/21_MsgRevoke.py +++ b/examples/chain_client/21_MsgRevoke.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,14 +19,13 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) - subaccount_id = address.get_subaccount_id(index=0) + await client.get_account(address.to_acc_bech32()) # prepare tx msg msg = composer.MsgRevoke( - granter = "inj14au322k9munkmx5wrchz9q30juf5wjgz2cfqku", - grantee = "inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r", - msg_type = "/injective.exchange.v1beta1.MsgCreateSpotLimitOrder" + granter="inj14au322k9munkmx5wrchz9q30juf5wjgz2cfqku", + grantee="inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r", + msg_type="/injective.exchange.v1beta1.MsgCreateSpotLimitOrder", ) # build sim tx @@ -49,13 +48,15 @@ async def main() -> None: # build tx gas_price = 500000000 - gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -66,5 +67,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/22_MsgSendToEth.py b/examples/chain_client/22_MsgSendToEth.py index aed1442f..96f6e435 100644 --- a/examples/chain_client/22_MsgSendToEth.py +++ b/examples/chain_client/22_MsgSendToEth.py @@ -1,11 +1,13 @@ import asyncio + import requests from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey + async def main() -> None: # select network: local, testnet, mainnet network = Network.testnet() @@ -19,8 +21,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) - subaccount_id = address.get_subaccount_id(index=0) + await client.get_account(address.to_acc_bech32()) # prepare msg asset = "injective-protocol" @@ -35,7 +36,7 @@ async def main() -> None: denom="INJ", eth_dest="0xaf79152ac5df276d9a8e1e2e22822f9713474902", amount=23, - bridge_fee=bridge_fee + bridge_fee=bridge_fee, ) # build sim tx @@ -59,12 +60,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -75,5 +78,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/23_MsgRelayPriceFeedPrice.py b/examples/chain_client/23_MsgRelayPriceFeedPrice.py index d0a96996..f55c8c72 100644 --- a/examples/chain_client/23_MsgRelayPriceFeedPrice.py +++ b/examples/chain_client/23_MsgRelayPriceFeedPrice.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,20 +19,15 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) price = 100 - price_to_send = [str(int(price * 10 ** 18))] + price_to_send = [str(int(price * 10**18))] base = ["BAYC"] quote = ["WETH"] # prepare tx msg - msg = composer.MsgRelayPriceFeedPrice( - sender=address.to_acc_bech32(), - price=price_to_send, - base=base, - quote=quote - ) + msg = composer.MsgRelayPriceFeedPrice(sender=address.to_acc_bech32(), price=price_to_send, base=base, quote=quote) # build sim tx tx = ( @@ -54,13 +49,15 @@ async def main() -> None: # build tx gas_price = 500000000 - gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -71,5 +68,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/24_MsgRewardsOptOut.py b/examples/chain_client/24_MsgRewardsOptOut.py index ef876c35..abf63829 100644 --- a/examples/chain_client/24_MsgRewardsOptOut.py +++ b/examples/chain_client/24_MsgRewardsOptOut.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,12 +19,10 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) # prepare tx msg - msg = composer.MsgRewardsOptOut( - sender=address.to_acc_bech32() - ) + msg = composer.MsgRewardsOptOut(sender=address.to_acc_bech32()) # build sim tx tx = ( @@ -46,13 +44,15 @@ async def main() -> None: # build tx gas_price = 500000000 - gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -63,5 +63,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/25_MsgDelegate.py b/examples/chain_client/25_MsgDelegate.py index 7df4eb17..9243b6d4 100644 --- a/examples/chain_client/25_MsgDelegate.py +++ b/examples/chain_client/25_MsgDelegate.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,16 +19,14 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) # prepare tx msg validator_address = "injvaloper1ultw9r29l8nxy5u6thcgusjn95vsy2caw722q5" amount = 100 msg = composer.MsgDelegate( - delegator_address=address.to_acc_bech32(), - validator_address=validator_address, - amount=amount + delegator_address=address.to_acc_bech32(), validator_address=validator_address, amount=amount ) # build sim tx @@ -51,13 +49,15 @@ async def main() -> None: # build tx gas_price = 500000000 - gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -68,5 +68,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/26_MsgWithdrawDelegatorReward.py b/examples/chain_client/26_MsgWithdrawDelegatorReward.py index 2ee30e32..61b9fbef 100644 --- a/examples/chain_client/26_MsgWithdrawDelegatorReward.py +++ b/examples/chain_client/26_MsgWithdrawDelegatorReward.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,14 +19,13 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) # prepare tx msg validator_address = "injvaloper1ultw9r29l8nxy5u6thcgusjn95vsy2caw722q5" msg = composer.MsgWithdrawDelegatorReward( - delegator_address=address.to_acc_bech32(), - validator_address=validator_address + delegator_address=address.to_acc_bech32(), validator_address=validator_address ) # build sim tx @@ -49,13 +48,15 @@ async def main() -> None: # build tx gas_price = 500000000 - gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -66,5 +67,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/27_Grants.py b/examples/chain_client/27_Grants.py index e94ce9b8..dca8ea42 100644 --- a/examples/chain_client/27_Grants.py +++ b/examples/chain_client/27_Grants.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -14,5 +13,6 @@ async def main() -> None: authorizations = await client.get_grants(granter=granter, grantee=grantee, msg_type_url=msg_type_url) print(authorizations) -if __name__ == '__main__': - asyncio.get_event_loop().run_until_complete(main()) \ No newline at end of file + +if __name__ == "__main__": + asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/28_BankBalances.py b/examples/chain_client/28_BankBalances.py index 5a52939f..4e6ec895 100644 --- a/examples/chain_client/28_BankBalances.py +++ b/examples/chain_client/28_BankBalances.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -12,5 +11,6 @@ async def main() -> None: all_bank_balances = await client.get_bank_balances(address=address) print(all_bank_balances) -if __name__ == '__main__': - asyncio.get_event_loop().run_until_complete(main()) \ No newline at end of file + +if __name__ == "__main__": + asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/29_BankBalance.py b/examples/chain_client/29_BankBalance.py index d5d2d533..959d1c72 100644 --- a/examples/chain_client/29_BankBalance.py +++ b/examples/chain_client/29_BankBalance.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -13,5 +12,6 @@ async def main() -> None: bank_balance = await client.get_bank_balance(address=address, denom=denom) print(bank_balance) -if __name__ == '__main__': - asyncio.get_event_loop().run_until_complete(main()) \ No newline at end of file + +if __name__ == "__main__": + asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/2_MsgDeposit.py b/examples/chain_client/2_MsgDeposit.py index 1484b1ed..13febc04 100644 --- a/examples/chain_client/2_MsgDeposit.py +++ b/examples/chain_client/2_MsgDeposit.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,16 +19,11 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) subaccount_id = address.get_subaccount_id(index=0) # prepare tx msg - msg = composer.MsgDeposit( - sender=address.to_acc_bech32(), - subaccount_id=subaccount_id, - amount=0.000001, - denom='INJ' - ) + msg = composer.MsgDeposit(sender=address.to_acc_bech32(), subaccount_id=subaccount_id, amount=0.000001, denom="INJ") # build sim tx tx = ( @@ -51,12 +46,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -67,5 +64,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/30_ExternalTransfer.py b/examples/chain_client/30_ExternalTransfer.py index a973e4b2..c5dbcc53 100644 --- a/examples/chain_client/30_ExternalTransfer.py +++ b/examples/chain_client/30_ExternalTransfer.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,7 +19,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) subaccount_id = address.get_subaccount_id(index=0) dest_subaccount_id = "0xaf79152ac5df276d9a8e1e2e22822f9713474902000000000000000000000000" @@ -29,7 +29,7 @@ async def main() -> None: source_subaccount_id=subaccount_id, destination_subaccount_id=dest_subaccount_id, amount=100, - denom="INJ" + denom="INJ", ) # build sim tx @@ -53,12 +53,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -69,5 +71,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/31_MsgCreateBinaryOptionsLimitOrder.py b/examples/chain_client/31_MsgCreateBinaryOptionsLimitOrder.py index 25652212..fb2a9d24 100644 --- a/examples/chain_client/31_MsgCreateBinaryOptionsLimitOrder.py +++ b/examples/chain_client/31_MsgCreateBinaryOptionsLimitOrder.py @@ -1,11 +1,12 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.constant import Denom from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey + async def main() -> None: # select network: local, testnet, mainnet network = Network.testnet() @@ -19,7 +20,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) subaccount_id = address.get_subaccount_id(index=0) # prepare trade info @@ -27,8 +28,7 @@ async def main() -> None: fee_recipient = "inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r" # set custom denom to bypass ini file load (optional) - denom = Denom(description="desc", base=0, quote=6, - min_price_tick_size=1000, min_quantity_tick_size=0.0001) + denom = Denom(description="desc", base=0, quote=6, min_price_tick_size=1000, min_quantity_tick_size=0.0001) # prepare tx msg msg = composer.MsgCreateBinaryOptionsLimitOrder( @@ -40,7 +40,7 @@ async def main() -> None: quantity=1, is_buy=False, is_reduce_only=False, - denom=denom + denom=denom, ) # build sim tx @@ -68,12 +68,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -85,5 +87,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/32_MsgCreateBinaryOptionsMarketOrder.py b/examples/chain_client/32_MsgCreateBinaryOptionsMarketOrder.py index 8bd5ae77..2408b865 100644 --- a/examples/chain_client/32_MsgCreateBinaryOptionsMarketOrder.py +++ b/examples/chain_client/32_MsgCreateBinaryOptionsMarketOrder.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,7 +19,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) subaccount_id = address.get_subaccount_id(index=0) # prepare trade info @@ -35,7 +35,7 @@ async def main() -> None: price=0.5, quantity=1, is_buy=True, - is_reduce_only=False + is_reduce_only=False, ) # build sim tx tx = ( @@ -62,12 +62,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -79,5 +81,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/33_MsgCancelBinaryOptionsOrder.py b/examples/chain_client/33_MsgCancelBinaryOptionsOrder.py index f3e534b7..9daaf419 100644 --- a/examples/chain_client/33_MsgCancelBinaryOptionsOrder.py +++ b/examples/chain_client/33_MsgCancelBinaryOptionsOrder.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,7 +19,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) subaccount_id = address.get_subaccount_id(index=0) # prepare trade info @@ -28,10 +28,7 @@ async def main() -> None: # prepare tx msg msg = composer.MsgCancelBinaryOptionsOrder( - sender=address.to_acc_bech32(), - market_id=market_id, - subaccount_id=subaccount_id, - order_hash=order_hash + sender=address.to_acc_bech32(), market_id=market_id, subaccount_id=subaccount_id, order_hash=order_hash ) # build sim tx tx = ( @@ -58,12 +55,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -75,5 +74,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/34_MsgAdminUpdateBinaryOptionsMarket.py b/examples/chain_client/34_MsgAdminUpdateBinaryOptionsMarket.py index 073529ae..da3966e0 100644 --- a/examples/chain_client/34_MsgAdminUpdateBinaryOptionsMarket.py +++ b/examples/chain_client/34_MsgAdminUpdateBinaryOptionsMarket.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,7 +19,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) # prepare trade info market_id = "0xfafec40a7b93331c1fc89c23f66d11fbb48f38dfdd78f7f4fc4031fad90f6896" @@ -35,7 +35,7 @@ async def main() -> None: settlement_price=settlement_price, expiration_timestamp=expiration_timestamp, settlement_timestamp=settlement_timestamp, - status=status + status=status, ) # build sim tx @@ -63,12 +63,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -80,5 +82,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/35_MsgInstantBinaryOptionsMarketLaunch.py b/examples/chain_client/35_MsgInstantBinaryOptionsMarketLaunch.py index 35c30c39..1116a669 100644 --- a/examples/chain_client/35_MsgInstantBinaryOptionsMarketLaunch.py +++ b/examples/chain_client/35_MsgInstantBinaryOptionsMarketLaunch.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,7 +19,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) # prepare tx msg msg = composer.MsgInstantBinaryOptionsMarketLaunch( @@ -32,12 +32,12 @@ async def main() -> None: quote_denom="peggy0xdAC17F958D2ee523a2206206994597C13D831ec7", quote_decimals=6, oracle_scale_factor=6, - maker_fee_rate=0.0005, # 0.05% - taker_fee_rate=0.0010, # 0.10% + maker_fee_rate=0.0005, # 0.05% + taker_fee_rate=0.0010, # 0.10% expiration_timestamp=1680730982, settlement_timestamp=1690730982, min_price_tick_size=0.01, - min_quantity_tick_size=0.01 + min_quantity_tick_size=0.01, ) # build sim tx @@ -65,12 +65,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -82,5 +84,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/36_MsgRelayProviderPrices.py b/examples/chain_client/36_MsgRelayProviderPrices.py index 23c9ac94..2068c572 100644 --- a/examples/chain_client/36_MsgRelayProviderPrices.py +++ b/examples/chain_client/36_MsgRelayProviderPrices.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,7 +19,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) provider = "ufc" symbols = ["KHABIB-TKO-05/30/2023", "KHABIB-TKO-05/26/2023"] @@ -27,10 +27,7 @@ async def main() -> None: # prepare tx msg msg = composer.MsgRelayProviderPrices( - sender=address.to_acc_bech32(), - provider=provider, - symbols=symbols, - prices=prices + sender=address.to_acc_bech32(), provider=provider, symbols=symbols, prices=prices ) # build sim tx @@ -58,12 +55,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -75,5 +74,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/37_GetTx.py b/examples/chain_client/37_GetTx.py index 77d13eb9..ece40b65 100644 --- a/examples/chain_client/37_GetTx.py +++ b/examples/chain_client/37_GetTx.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -12,5 +11,6 @@ async def main() -> None: tx_logs = await client.get_tx(tx_hash=tx_hash) print(tx_logs) -if __name__ == '__main__': - asyncio.get_event_loop().run_until_complete(main()) \ No newline at end of file + +if __name__ == "__main__": + asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/38_StreamEventOrderFail.py b/examples/chain_client/38_StreamEventOrderFail.py index e453fd12..62aed601 100644 --- a/examples/chain_client/38_StreamEventOrderFail.py +++ b/examples/chain_client/38_StreamEventOrderFail.py @@ -1,23 +1,27 @@ import asyncio -import logging +import base64 import json + import websockets -import base64 from pyinjective.core.network import Network async def main() -> None: network = Network.mainnet() - event_filter = "tm.event='Tx' AND message.sender='inj1rwv4zn3jptsqs7l8lpa3uvzhs57y8duemete9e' AND message.action='/injective.exchange.v1beta1.MsgBatchUpdateOrders' AND injective.exchange.v1beta1.EventOrderFail.flags EXISTS" - query = json.dumps({ - "jsonrpc": "2.0", - "method": "subscribe", - "id": "0", - "params": { - "query": event_filter - }, - }) + event_filter = ( + "tm.event='Tx' AND message.sender='inj1rwv4zn3jptsqs7l8lpa3uvzhs57y8duemete9e' " + "AND message.action='/injective.exchange.v1beta1.MsgBatchUpdateOrders' " + "AND injective.exchange.v1beta1.EventOrderFail.flags EXISTS" + ) + query = json.dumps( + { + "jsonrpc": "2.0", + "method": "subscribe", + "id": "0", + "params": {"query": event_filter}, + } + ) async with websockets.connect(network.tm_websocket_endpoint) as ws: await ws.send(query) @@ -38,5 +42,6 @@ async def main() -> None: print(dict) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/39_Account.py b/examples/chain_client/39_Account.py index 4089a5dd..43692ba2 100644 --- a/examples/chain_client/39_Account.py +++ b/examples/chain_client/39_Account.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -12,5 +11,6 @@ async def main() -> None: acc = await client.get_account(address=address) print(acc) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/3_MsgCreateSpotLimitOrder.py b/examples/chain_client/3_MsgCreateSpotLimitOrder.py index 34466874..a480e817 100644 --- a/examples/chain_client/3_MsgCreateSpotLimitOrder.py +++ b/examples/chain_client/3_MsgCreateSpotLimitOrder.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,7 +19,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) subaccount_id = address.get_subaccount_id(index=0) # prepare trade info @@ -35,7 +35,7 @@ async def main() -> None: price=7.523, quantity=0.01, is_buy=True, - is_po=False + is_po=False, ) # build sim tx @@ -63,12 +63,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -80,5 +82,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/40_MsgExecuteContract.py b/examples/chain_client/40_MsgExecuteContract.py index cde8c480..3d92b825 100644 --- a/examples/chain_client/40_MsgExecuteContract.py +++ b/examples/chain_client/40_MsgExecuteContract.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -20,20 +20,23 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) # prepare tx msg # NOTE: COIN MUST BE SORTED IN ALPHABETICAL ORDER BY DENOMS funds = [ - composer.Coin(amount=69, denom='factory/inj1hdvy6tl89llqy3ze8lv6mz5qh66sx9enn0jxg6/inj12ngevx045zpvacus9s6anr258gkwpmthnz80e9'), - composer.Coin(amount=420, denom='peggy0x44C21afAaF20c270EBbF5914Cfc3b5022173FEB7'), - composer.Coin(amount=1, denom='peggy0x87aB3B4C8661e07D6372361211B96ed4Dc36B1B5'), + composer.Coin( + amount=69, + denom="factory/inj1hdvy6tl89llqy3ze8lv6mz5qh66sx9enn0jxg6/inj12ngevx045zpvacus9s6anr258gkwpmthnz80e9", + ), + composer.Coin(amount=420, denom="peggy0x44C21afAaF20c270EBbF5914Cfc3b5022173FEB7"), + composer.Coin(amount=1, denom="peggy0x87aB3B4C8661e07D6372361211B96ed4Dc36B1B5"), ] msg = composer.MsgExecuteContract( sender=address.to_acc_bech32(), contract="inj1ady3s7whq30l4fx8sj3x6muv5mx4dfdlcpv8n7", msg='{"increment":{}}', - funds=funds + funds=funds, ) # build sim tx @@ -57,12 +60,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -73,5 +78,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": - asyncio.get_event_loop().run_until_complete(main()) \ No newline at end of file + asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/41_MsgCreateInsuranceFund.py b/examples/chain_client/41_MsgCreateInsuranceFund.py index 89007e23..86f7b0b6 100644 --- a/examples/chain_client/41_MsgCreateInsuranceFund.py +++ b/examples/chain_client/41_MsgCreateInsuranceFund.py @@ -1,10 +1,11 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey + async def main() -> None: # select network: local, testnet, mainnet network = Network.testnet() @@ -19,7 +20,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) msg = composer.MsgCreateInsuranceFund( sender=address.to_acc_bech32(), @@ -29,7 +30,7 @@ async def main() -> None: oracle_quote="Frontrunner", oracle_type=11, expiry=-2, - initial_deposit=1000 + initial_deposit=1000, ) # build sim tx @@ -53,12 +54,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -69,5 +72,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": - asyncio.get_event_loop().run_until_complete(main()) \ No newline at end of file + asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/42_MsgUnderwrite.py b/examples/chain_client/42_MsgUnderwrite.py index 7c143e51..087aae33 100644 --- a/examples/chain_client/42_MsgUnderwrite.py +++ b/examples/chain_client/42_MsgUnderwrite.py @@ -1,10 +1,11 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey + async def main() -> None: # select network: local, testnet, mainnet network = Network.testnet() @@ -19,13 +20,13 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) msg = composer.MsgUnderwrite( sender=address.to_acc_bech32(), market_id="0x141e3c92ed55107067ceb60ee412b86256cedef67b1227d6367b4cdf30c55a74", quote_denom="USDT", - amount=100 + amount=100, ) # build sim tx @@ -49,12 +50,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -65,5 +68,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": - asyncio.get_event_loop().run_until_complete(main()) \ No newline at end of file + asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/43_MsgRequestRedemption.py b/examples/chain_client/43_MsgRequestRedemption.py index a32add66..7379f055 100644 --- a/examples/chain_client/43_MsgRequestRedemption.py +++ b/examples/chain_client/43_MsgRequestRedemption.py @@ -1,10 +1,11 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey + async def main() -> None: # select network: local, testnet, mainnet network = Network.testnet() @@ -19,13 +20,13 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) msg = composer.MsgRequestRedemption( sender=address.to_acc_bech32(), market_id="0x141e3c92ed55107067ceb60ee412b86256cedef67b1227d6367b4cdf30c55a74", share_denom="share15", - amount=100 # raw chain value + amount=100, # raw chain value ) # build sim tx @@ -49,12 +50,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -65,5 +68,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": - asyncio.get_event_loop().run_until_complete(main()) \ No newline at end of file + asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/44_MessageBroadcaster.py b/examples/chain_client/44_MessageBroadcaster.py index 4fbeb719..6b948578 100644 --- a/examples/chain_client/44_MessageBroadcaster.py +++ b/examples/chain_client/44_MessageBroadcaster.py @@ -35,7 +35,7 @@ async def main() -> None: price=3, quantity=55, is_buy=True, - is_po=False + is_po=False, ), composer.SpotOrder( market_id=spot_market_id_create, @@ -44,7 +44,7 @@ async def main() -> None: price=300, quantity=55, is_buy=False, - is_po=False + is_po=False, ), ] @@ -59,5 +59,6 @@ async def main() -> None: print("---Transaction Response---") print(result) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/45_MessageBroadcasterWithGranteeAccount.py b/examples/chain_client/45_MessageBroadcasterWithGranteeAccount.py index dc017f3f..860b91e0 100644 --- a/examples/chain_client/45_MessageBroadcasterWithGranteeAccount.py +++ b/examples/chain_client/45_MessageBroadcasterWithGranteeAccount.py @@ -1,10 +1,10 @@ import asyncio -from pyinjective.composer import Composer as ProtoMsgComposer from pyinjective.async_client import AsyncClient +from pyinjective.composer import Composer as ProtoMsgComposer from pyinjective.core.broadcaster import MsgBroadcasterWithPk from pyinjective.core.network import Network -from pyinjective.wallet import PrivateKey, Address +from pyinjective.wallet import Address, PrivateKey async def main() -> None: @@ -41,7 +41,7 @@ async def main() -> None: price=7.523, quantity=0.01, is_buy=True, - is_po=False + is_po=False, ) # broadcast the transaction @@ -49,5 +49,6 @@ async def main() -> None: print("---Transaction Response---") print(result) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/46_MessageBroadcasterWithoutSimulation.py b/examples/chain_client/46_MessageBroadcasterWithoutSimulation.py index dc804b24..1aa19990 100644 --- a/examples/chain_client/46_MessageBroadcasterWithoutSimulation.py +++ b/examples/chain_client/46_MessageBroadcasterWithoutSimulation.py @@ -35,7 +35,7 @@ async def main() -> None: price=3, quantity=55, is_buy=True, - is_po=False + is_po=False, ), composer.SpotOrder( market_id=spot_market_id_create, @@ -44,7 +44,7 @@ async def main() -> None: price=300, quantity=55, is_buy=False, - is_po=False + is_po=False, ), ] @@ -59,5 +59,6 @@ async def main() -> None: print("---Transaction Response---") print(result) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/47_MessageBroadcasterWithGranteeAccountWithoutSimulation.py b/examples/chain_client/47_MessageBroadcasterWithGranteeAccountWithoutSimulation.py index 4221d795..ccb41de5 100644 --- a/examples/chain_client/47_MessageBroadcasterWithGranteeAccountWithoutSimulation.py +++ b/examples/chain_client/47_MessageBroadcasterWithGranteeAccountWithoutSimulation.py @@ -1,10 +1,10 @@ import asyncio -from pyinjective.composer import Composer as ProtoMsgComposer from pyinjective.async_client import AsyncClient +from pyinjective.composer import Composer as ProtoMsgComposer from pyinjective.core.broadcaster import MsgBroadcasterWithPk from pyinjective.core.network import Network -from pyinjective.wallet import PrivateKey, Address +from pyinjective.wallet import Address, PrivateKey async def main() -> None: @@ -41,7 +41,7 @@ async def main() -> None: price=7.523, quantity=0.01, is_buy=True, - is_po=False + is_po=False, ) # broadcast the transaction @@ -49,5 +49,6 @@ async def main() -> None: print("---Transaction Response---") print(result) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/48_WithdrawValidatorCommission_Rewards b/examples/chain_client/48_WithdrawValidatorCommissionAndRewards.py similarity index 76% rename from examples/chain_client/48_WithdrawValidatorCommission_Rewards rename to examples/chain_client/48_WithdrawValidatorCommissionAndRewards.py index 7d360790..4ab89394 100644 --- a/examples/chain_client/48_WithdrawValidatorCommission_Rewards +++ b/examples/chain_client/48_WithdrawValidatorCommissionAndRewards.py @@ -1,11 +1,9 @@ - import asyncio -import logging -from pyinjective.composer import Composer as ProtoMsgComposer from pyinjective.async_client import AsyncClient +from pyinjective.composer import Composer as ProtoMsgComposer +from pyinjective.core.network import Network from pyinjective.transaction import Transaction -from pyinjective.constant import Network from pyinjective.wallet import PrivateKey @@ -24,19 +22,16 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) # prepare tx msg validator_address = "injvaloper1ultw9r29l8nxy5u6thcgusjn95vsy2caw722q5" msg0 = composer.MsgWithdrawDelegatorReward( - delegator_address=address.to_acc_bech32(), - validator_address=validator_address + delegator_address=address.to_acc_bech32(), validator_address=validator_address ) - msg1 = composer.MsgWithdrawValidatorCommission( - validator_address=validator_address - ) + msg1 = composer.MsgWithdrawValidatorCommission(validator_address=validator_address) # build sim tx tx = ( @@ -58,13 +53,15 @@ async def main() -> None: # build tx gas_price = 500000000 - gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -75,5 +72,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/4_MsgCreateSpotMarketOrder.py b/examples/chain_client/4_MsgCreateSpotMarketOrder.py index 3185cafa..293b5145 100644 --- a/examples/chain_client/4_MsgCreateSpotMarketOrder.py +++ b/examples/chain_client/4_MsgCreateSpotMarketOrder.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,7 +19,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) subaccount_id = address.get_subaccount_id(index=0) # prepare trade info @@ -34,7 +34,7 @@ async def main() -> None: fee_recipient=fee_recipient, price=10.522, quantity=0.01, - is_buy=True + is_buy=True, ) # build sim tx @@ -62,12 +62,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -79,5 +81,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/5_MsgCancelSpotOrder.py b/examples/chain_client/5_MsgCancelSpotOrder.py index 93030ecd..f94638bd 100644 --- a/examples/chain_client/5_MsgCancelSpotOrder.py +++ b/examples/chain_client/5_MsgCancelSpotOrder.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,7 +19,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) subaccount_id = address.get_subaccount_id(index=0) # prepare trade info @@ -28,10 +28,7 @@ async def main() -> None: # prepare tx msg msg = composer.MsgCancelSpotOrder( - sender=address.to_acc_bech32(), - market_id=market_id, - subaccount_id=subaccount_id, - order_hash=order_hash + sender=address.to_acc_bech32(), market_id=market_id, subaccount_id=subaccount_id, order_hash=order_hash ) # build sim tx @@ -55,12 +52,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -71,5 +70,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/6_MsgCreateDerivativeLimitOrder.py b/examples/chain_client/6_MsgCreateDerivativeLimitOrder.py index add38833..865400b4 100644 --- a/examples/chain_client/6_MsgCreateDerivativeLimitOrder.py +++ b/examples/chain_client/6_MsgCreateDerivativeLimitOrder.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,7 +19,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) subaccount_id = address.get_subaccount_id(index=0) # prepare trade info @@ -36,7 +36,7 @@ async def main() -> None: quantity=0.1, leverage=1, is_buy=False, - is_reduce_only=False + is_reduce_only=False, ) # build sim tx @@ -64,12 +64,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -81,5 +83,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/7_MsgCreateDerivativeMarketOrder.py b/examples/chain_client/7_MsgCreateDerivativeMarketOrder.py index f1e71b1c..db69d7c1 100644 --- a/examples/chain_client/7_MsgCreateDerivativeMarketOrder.py +++ b/examples/chain_client/7_MsgCreateDerivativeMarketOrder.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,7 +19,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) subaccount_id = address.get_subaccount_id(index=0) # prepare trade info @@ -35,7 +35,7 @@ async def main() -> None: price=50000, quantity=0.01, leverage=3, - is_buy=True + is_buy=True, ) # build sim tx @@ -63,12 +63,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -80,5 +82,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/chain_client/8_MsgCancelDerivativeOrder.py b/examples/chain_client/8_MsgCancelDerivativeOrder.py index 1ea9001c..f2cda909 100644 --- a/examples/chain_client/8_MsgCancelDerivativeOrder.py +++ b/examples/chain_client/8_MsgCancelDerivativeOrder.py @@ -1,8 +1,8 @@ import asyncio from pyinjective.async_client import AsyncClient -from pyinjective.transaction import Transaction from pyinjective.core.network import Network +from pyinjective.transaction import Transaction from pyinjective.wallet import PrivateKey @@ -19,7 +19,7 @@ async def main() -> None: priv_key = PrivateKey.from_hex("f9db9bf330e23cb7839039e944adef6e9df447b90b503d5b4464c90bea9022f3") pub_key = priv_key.to_public_key() address = pub_key.to_address() - account = await client.get_account(address.to_acc_bech32()) + await client.get_account(address.to_acc_bech32()) subaccount_id = address.get_subaccount_id(index=0) # prepare trade info @@ -28,10 +28,7 @@ async def main() -> None: # prepare tx msg msg = composer.MsgCancelDerivativeOrder( - sender=address.to_acc_bech32(), - market_id=market_id, - subaccount_id=subaccount_id, - order_hash=order_hash + sender=address.to_acc_bech32(), market_id=market_id, subaccount_id=subaccount_id, order_hash=order_hash ) # build sim tx @@ -55,12 +52,14 @@ async def main() -> None: # build tx gas_price = 500000000 gas_limit = sim_res.gas_info.gas_used + 20000 # add 20k for gas, fee computation - gas_fee = '{:.18f}'.format((gas_price * gas_limit) / pow(10, 18)).rstrip('0') - fee = [composer.Coin( - amount=gas_price * gas_limit, - denom=network.fee_denom, - )] - tx = tx.with_gas(gas_limit).with_fee(fee).with_memo('').with_timeout_height(client.timeout_height) + gas_fee = "{:.18f}".format((gas_price * gas_limit) / pow(10, 18)).rstrip("0") + fee = [ + composer.Coin( + amount=gas_price * gas_limit, + denom=network.fee_denom, + ) + ] + tx = tx.with_gas(gas_limit).with_fee(fee).with_memo("").with_timeout_height(client.timeout_height) sign_doc = tx.get_sign_doc(pub_key) sig = priv_key.sign(sign_doc.SerializeToString()) tx_raw_bytes = tx.get_tx_data(sig, pub_key) @@ -71,5 +70,6 @@ async def main() -> None: print("gas wanted: {}".format(gas_limit)) print("gas fee: {} INJ".format(gas_fee)) + if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/accounts_rpc/1_StreamSubaccountBalance.py b/examples/exchange_client/accounts_rpc/1_StreamSubaccountBalance.py index 25c6163c..9a0364eb 100644 --- a/examples/exchange_client/accounts_rpc/1_StreamSubaccountBalance.py +++ b/examples/exchange_client/accounts_rpc/1_StreamSubaccountBalance.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -10,13 +9,11 @@ async def main() -> None: client = AsyncClient(network) subaccount_id = "0xc7dca7c15c364865f77a4fb67ab11dc95502e6fe000000000000000000000001" denoms = ["inj", "peggy0x87aB3B4C8661e07D6372361211B96ed4Dc36B1B5"] - subaccount = await client.stream_subaccount_balance( - subaccount_id=subaccount_id, - denoms=denoms - ) + subaccount = await client.stream_subaccount_balance(subaccount_id=subaccount_id, denoms=denoms) async for balance in subaccount: print("Subaccount balance Update:\n") print(balance) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/accounts_rpc/2_SubaccountBalance.py b/examples/exchange_client/accounts_rpc/2_SubaccountBalance.py index 13a5bfba..dd48b9f3 100644 --- a/examples/exchange_client/accounts_rpc/2_SubaccountBalance.py +++ b/examples/exchange_client/accounts_rpc/2_SubaccountBalance.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -10,11 +9,9 @@ async def main() -> None: client = AsyncClient(network) subaccount_id = "0xaf79152ac5df276d9a8e1e2e22822f9713474902000000000000000000000000" denom = "inj" - balance = await client.get_subaccount_balance( - subaccount_id=subaccount_id, - denom=denom - ) + balance = await client.get_subaccount_balance(subaccount_id=subaccount_id, denom=denom) print(balance) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/accounts_rpc/3_SubaccountsList.py b/examples/exchange_client/accounts_rpc/3_SubaccountsList.py index 390200e1..af523e2d 100644 --- a/examples/exchange_client/accounts_rpc/3_SubaccountsList.py +++ b/examples/exchange_client/accounts_rpc/3_SubaccountsList.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -12,5 +11,6 @@ async def main() -> None: subacc_list = await client.get_subaccount_list(account_address) print(subacc_list) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/accounts_rpc/4_SubaccountBalancesList.py b/examples/exchange_client/accounts_rpc/4_SubaccountBalancesList.py index 1bb746b5..501d327e 100644 --- a/examples/exchange_client/accounts_rpc/4_SubaccountBalancesList.py +++ b/examples/exchange_client/accounts_rpc/4_SubaccountBalancesList.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -10,11 +9,9 @@ async def main() -> None: client = AsyncClient(network) subaccount = "0xaf79152ac5df276d9a8e1e2e22822f9713474902000000000000000000000000" denoms = ["inj", "peggy0x87aB3B4C8661e07D6372361211B96ed4Dc36B1B5"] - subacc_balances_list = await client.get_subaccount_balances_list( - subaccount_id=subaccount, - denoms=denoms - ) + subacc_balances_list = await client.get_subaccount_balances_list(subaccount_id=subaccount, denoms=denoms) print(subacc_balances_list) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/accounts_rpc/5_SubaccountHistory.py b/examples/exchange_client/accounts_rpc/5_SubaccountHistory.py index fa871b7f..e67d2ab6 100644 --- a/examples/exchange_client/accounts_rpc/5_SubaccountHistory.py +++ b/examples/exchange_client/accounts_rpc/5_SubaccountHistory.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -15,14 +14,10 @@ async def main() -> None: limit = 15 end_time = 1665118340224 subacc_history = await client.get_subaccount_history( - subaccount_id=subaccount, - denom=denom, - transfer_types=transfer_types, - skip=skip, - limit=limit, - end_time=end_time + subaccount_id=subaccount, denom=denom, transfer_types=transfer_types, skip=skip, limit=limit, end_time=end_time ) print(subacc_history) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/accounts_rpc/6_SubaccountOrderSummary.py b/examples/exchange_client/accounts_rpc/6_SubaccountOrderSummary.py index 606e75a3..9026e4e1 100644 --- a/examples/exchange_client/accounts_rpc/6_SubaccountOrderSummary.py +++ b/examples/exchange_client/accounts_rpc/6_SubaccountOrderSummary.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -12,11 +11,10 @@ async def main() -> None: order_direction = "buy" market_id = "0x17ef48032cb24375ba7c2e39f384e56433bcab20cbee9a7357e4cba2eb00abe6" subacc_order_summary = await client.get_subaccount_order_summary( - subaccount_id=subaccount, - # order_direction=order_direction, - # market_id=market_id - ) + subaccount_id=subaccount, order_direction=order_direction, market_id=market_id + ) print(subacc_order_summary) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/accounts_rpc/7_OrderStates.py b/examples/exchange_client/accounts_rpc/7_OrderStates.py index 1c4117e8..e78dc842 100644 --- a/examples/exchange_client/accounts_rpc/7_OrderStates.py +++ b/examples/exchange_client/accounts_rpc/7_OrderStates.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -8,10 +7,19 @@ async def main() -> None: network = Network.testnet() client = AsyncClient(network) - spot_order_hashes = ["0xce0d9b701f77cd6ddfda5dd3a4fe7b2d53ba83e5d6c054fb2e9e886200b7b7bb", "0x2e2245b5431638d76c6e0cc6268970418a1b1b7df60a8e94b8cf37eae6105542"] - derivative_order_hashes = ["0x82113f3998999bdc3892feaab2c4e53ba06c5fe887a2d5f9763397240f24da50", "0xbb1f036001378cecb5fff1cc69303919985b5bf058c32f37d5aaf9b804c07a06"] - orders = await client.get_order_states(spot_order_hashes=spot_order_hashes, derivative_order_hashes=derivative_order_hashes) + spot_order_hashes = [ + "0xce0d9b701f77cd6ddfda5dd3a4fe7b2d53ba83e5d6c054fb2e9e886200b7b7bb", + "0x2e2245b5431638d76c6e0cc6268970418a1b1b7df60a8e94b8cf37eae6105542", + ] + derivative_order_hashes = [ + "0x82113f3998999bdc3892feaab2c4e53ba06c5fe887a2d5f9763397240f24da50", + "0xbb1f036001378cecb5fff1cc69303919985b5bf058c32f37d5aaf9b804c07a06", + ] + orders = await client.get_order_states( + spot_order_hashes=spot_order_hashes, derivative_order_hashes=derivative_order_hashes + ) print(orders) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/accounts_rpc/8_Portfolio.py b/examples/exchange_client/accounts_rpc/8_Portfolio.py index 04e709bc..0a922054 100644 --- a/examples/exchange_client/accounts_rpc/8_Portfolio.py +++ b/examples/exchange_client/accounts_rpc/8_Portfolio.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -12,5 +11,6 @@ async def main() -> None: portfolio = await client.get_portfolio(account_address=account_address) print(portfolio) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/accounts_rpc/9_Rewards.py b/examples/exchange_client/accounts_rpc/9_Rewards.py index 687f3a1a..b3a486cf 100644 --- a/examples/exchange_client/accounts_rpc/9_Rewards.py +++ b/examples/exchange_client/accounts_rpc/9_Rewards.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -12,8 +11,10 @@ async def main() -> None: epoch = -1 rewards = await client.get_rewards( # account_address=account_address, - epoch=epoch) + epoch=epoch + ) print(rewards) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/auctions_rpc/1_Auction.py b/examples/exchange_client/auctions_rpc/1_Auction.py index 02307e00..94f73e16 100644 --- a/examples/exchange_client/auctions_rpc/1_Auction.py +++ b/examples/exchange_client/auctions_rpc/1_Auction.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -13,5 +12,6 @@ async def main() -> None: auction = await client.get_auction(bid_round=bid_round) print(auction) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/auctions_rpc/2_Auctions.py b/examples/exchange_client/auctions_rpc/2_Auctions.py index 5f161f5d..30576a89 100644 --- a/examples/exchange_client/auctions_rpc/2_Auctions.py +++ b/examples/exchange_client/auctions_rpc/2_Auctions.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -12,5 +11,6 @@ async def main() -> None: auctions = await client.get_auctions() print(auctions) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/auctions_rpc/3_StreamBids.py b/examples/exchange_client/auctions_rpc/3_StreamBids.py index 3119670d..8306becb 100644 --- a/examples/exchange_client/auctions_rpc/3_StreamBids.py +++ b/examples/exchange_client/auctions_rpc/3_StreamBids.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -13,5 +12,6 @@ async def main() -> None: async for bid in bids: print(bid) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/10_StreamHistoricalOrders.py b/examples/exchange_client/derivative_exchange_rpc/10_StreamHistoricalOrders.py index 429862d1..b58448d2 100644 --- a/examples/exchange_client/derivative_exchange_rpc/10_StreamHistoricalOrders.py +++ b/examples/exchange_client/derivative_exchange_rpc/10_StreamHistoricalOrders.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -10,13 +9,10 @@ async def main() -> None: network = Network.testnet() client = AsyncClient(network) market_id = "0x17ef48032cb24375ba7c2e39f384e56433bcab20cbee9a7357e4cba2eb00abe6" - order_side = "sell" - subaccount_id = "0xc6fe5d33615a1c52c08018c47e8bc53646a0e101000000000000000000000000" - orders = await client.stream_historical_derivative_orders( - market_id=market_id - ) + orders = await client.stream_historical_derivative_orders(market_id=market_id) async for order in orders: print(order) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/11_Trades.py b/examples/exchange_client/derivative_exchange_rpc/11_Trades.py index f822babb..5ae822a9 100644 --- a/examples/exchange_client/derivative_exchange_rpc/11_Trades.py +++ b/examples/exchange_client/derivative_exchange_rpc/11_Trades.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -11,11 +10,9 @@ async def main() -> None: client = AsyncClient(network) market_id = "0x17ef48032cb24375ba7c2e39f384e56433bcab20cbee9a7357e4cba2eb00abe6" subaccount_id = "0xc6fe5d33615a1c52c08018c47e8bc53646a0e101000000000000000000000000" - trades = await client.get_derivative_trades( - market_id=market_id, - subaccount_id=subaccount_id - ) + trades = await client.get_derivative_trades(market_id=market_id, subaccount_id=subaccount_id) print(trades) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/12_StreamTrades.py b/examples/exchange_client/derivative_exchange_rpc/12_StreamTrades.py index 03136700..8d6246bb 100644 --- a/examples/exchange_client/derivative_exchange_rpc/12_StreamTrades.py +++ b/examples/exchange_client/derivative_exchange_rpc/12_StreamTrades.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -11,15 +10,13 @@ async def main() -> None: client = AsyncClient(network) market_ids = [ "0x17ef48032cb24375ba7c2e39f384e56433bcab20cbee9a7357e4cba2eb00abe6", - "0xd5e4b12b19ecf176e4e14b42944731c27677819d2ed93be4104ad7025529c7ff" + "0xd5e4b12b19ecf176e4e14b42944731c27677819d2ed93be4104ad7025529c7ff", ] subaccount_id = "0xc6fe5d33615a1c52c08018c47e8bc53646a0e101000000000000000000000000" - trades = await client.stream_derivative_trades( - market_id=market_ids[0], - subaccount_id=subaccount_id - ) + trades = await client.stream_derivative_trades(market_id=market_ids[0], subaccount_id=subaccount_id) async for trade in trades: print(trade) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/13_SubaccountOrdersList.py b/examples/exchange_client/derivative_exchange_rpc/13_SubaccountOrdersList.py index 62609850..a7f06db7 100644 --- a/examples/exchange_client/derivative_exchange_rpc/13_SubaccountOrdersList.py +++ b/examples/exchange_client/derivative_exchange_rpc/13_SubaccountOrdersList.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -14,13 +13,10 @@ async def main() -> None: skip = 1 limit = 2 orders = await client.get_derivative_subaccount_orders( - subaccount_id=subaccount_id, - market_id=market_id, - skip=skip, - limit=limit + subaccount_id=subaccount_id, market_id=market_id, skip=skip, limit=limit ) print(orders) -if __name__ == '__main__': +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/14_SubaccountTradesList.py b/examples/exchange_client/derivative_exchange_rpc/14_SubaccountTradesList.py index d6b0bf81..4cd55f06 100644 --- a/examples/exchange_client/derivative_exchange_rpc/14_SubaccountTradesList.py +++ b/examples/exchange_client/derivative_exchange_rpc/14_SubaccountTradesList.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -21,10 +20,10 @@ async def main() -> None: execution_type=execution_type, direction=direction, skip=skip, - limit=limit + limit=limit, ) print(trades) -if __name__ == '__main__': +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/15_FundingPayments.py b/examples/exchange_client/derivative_exchange_rpc/15_FundingPayments.py index 4ff983c5..8f352c9e 100644 --- a/examples/exchange_client/derivative_exchange_rpc/15_FundingPayments.py +++ b/examples/exchange_client/derivative_exchange_rpc/15_FundingPayments.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -11,17 +10,14 @@ async def main() -> None: client = AsyncClient(network) market_id = "0x17ef48032cb24375ba7c2e39f384e56433bcab20cbee9a7357e4cba2eb00abe6" subaccount_id = "0xc6fe5d33615a1c52c08018c47e8bc53646a0e101000000000000000000000000" - skip=0 - limit=3 - end_time=1676426400125 + skip = 0 + limit = 3 + end_time = 1676426400125 funding = await client.get_funding_payments( - market_id=market_id, - subaccount_id=subaccount_id, - skip=skip, - limit=limit, - end_time=end_time + market_id=market_id, subaccount_id=subaccount_id, skip=skip, limit=limit, end_time=end_time ) print(funding) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/17_FundingRates.py b/examples/exchange_client/derivative_exchange_rpc/17_FundingRates.py index 47a14794..2a8cbcd1 100644 --- a/examples/exchange_client/derivative_exchange_rpc/17_FundingRates.py +++ b/examples/exchange_client/derivative_exchange_rpc/17_FundingRates.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -10,16 +9,12 @@ async def main() -> None: network = Network.testnet() client = AsyncClient(network) market_id = "0x17ef48032cb24375ba7c2e39f384e56433bcab20cbee9a7357e4cba2eb00abe6" - skip=0 - limit=3 - end_time=1675717201465 - funding_rates = await client.get_funding_rates( - market_id=market_id, - skip=skip, - limit=limit, - end_time=end_time - ) + skip = 0 + limit = 3 + end_time = 1675717201465 + funding_rates = await client.get_funding_rates(market_id=market_id, skip=skip, limit=limit, end_time=end_time) print(funding_rates) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/18_Orderbooks.py b/examples/exchange_client/derivative_exchange_rpc/18_Orderbooks.py index d3583aff..49b00e02 100644 --- a/examples/exchange_client/derivative_exchange_rpc/18_Orderbooks.py +++ b/examples/exchange_client/derivative_exchange_rpc/18_Orderbooks.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -11,10 +10,11 @@ async def main() -> None: client = AsyncClient(network) market_ids = [ "0x17ef48032cb24375ba7c2e39f384e56433bcab20cbee9a7357e4cba2eb00abe6", - "0xd5e4b12b19ecf176e4e14b42944731c27677819d2ed93be4104ad7025529c7ff" + "0xd5e4b12b19ecf176e4e14b42944731c27677819d2ed93be4104ad7025529c7ff", ] markets = await client.get_derivative_orderbooks(market_ids=market_ids) print(markets) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/19_Binary_Options_Markets.py b/examples/exchange_client/derivative_exchange_rpc/19_Binary_Options_Markets.py index 233dce5f..9ed36e38 100644 --- a/examples/exchange_client/derivative_exchange_rpc/19_Binary_Options_Markets.py +++ b/examples/exchange_client/derivative_exchange_rpc/19_Binary_Options_Markets.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -10,12 +9,10 @@ async def main() -> None: client = AsyncClient(network) market_status = "active" quote_denom = "peggy0xdAC17F958D2ee523a2206206994597C13D831ec7" - market = await client.get_binary_options_markets( - market_status=market_status, - quote_denom=quote_denom - ) + market = await client.get_binary_options_markets(market_status=market_status, quote_denom=quote_denom) print(market) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/1_Market.py b/examples/exchange_client/derivative_exchange_rpc/1_Market.py index 520f55c8..f0cdf499 100644 --- a/examples/exchange_client/derivative_exchange_rpc/1_Market.py +++ b/examples/exchange_client/derivative_exchange_rpc/1_Market.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -13,5 +12,6 @@ async def main() -> None: market = await client.get_derivative_market(market_id=market_id) print(market) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/20_Binary_Options_Market.py b/examples/exchange_client/derivative_exchange_rpc/20_Binary_Options_Market.py index 7cbf0924..6c14d93a 100644 --- a/examples/exchange_client/derivative_exchange_rpc/20_Binary_Options_Market.py +++ b/examples/exchange_client/derivative_exchange_rpc/20_Binary_Options_Market.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -12,5 +11,6 @@ async def main() -> None: market = await client.get_binary_options_market(market_id=market_id) print(market) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/21_Historical_Orders.py b/examples/exchange_client/derivative_exchange_rpc/21_Historical_Orders.py index ea864397..9dc22f6f 100644 --- a/examples/exchange_client/derivative_exchange_rpc/21_Historical_Orders.py +++ b/examples/exchange_client/derivative_exchange_rpc/21_Historical_Orders.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -23,5 +22,6 @@ async def main() -> None: ) print(orders) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/22_OrderbooksV2.py b/examples/exchange_client/derivative_exchange_rpc/22_OrderbooksV2.py index 2a21d145..40ae4598 100644 --- a/examples/exchange_client/derivative_exchange_rpc/22_OrderbooksV2.py +++ b/examples/exchange_client/derivative_exchange_rpc/22_OrderbooksV2.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -11,10 +10,11 @@ async def main() -> None: client = AsyncClient(network) market_ids = [ "0x17ef48032cb24375ba7c2e39f384e56433bcab20cbee9a7357e4cba2eb00abe6", - "0xd5e4b12b19ecf176e4e14b42944731c27677819d2ed93be4104ad7025529c7ff" + "0xd5e4b12b19ecf176e4e14b42944731c27677819d2ed93be4104ad7025529c7ff", ] orderbooks = await client.get_derivative_orderbooksV2(market_ids=market_ids) print(orderbooks) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/2_Markets.py b/examples/exchange_client/derivative_exchange_rpc/2_Markets.py index 275d372f..949695e1 100644 --- a/examples/exchange_client/derivative_exchange_rpc/2_Markets.py +++ b/examples/exchange_client/derivative_exchange_rpc/2_Markets.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -11,11 +10,9 @@ async def main() -> None: client = AsyncClient(network) market_status = "active" quote_denom = "peggy0x87aB3B4C8661e07D6372361211B96ed4Dc36B1B5" - market = await client.get_derivative_markets( - market_status=market_status, - quote_denom=quote_denom - ) + market = await client.get_derivative_markets(market_status=market_status, quote_denom=quote_denom) print(market) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/3_StreamMarket.py b/examples/exchange_client/derivative_exchange_rpc/3_StreamMarket.py index d3b15a71..b5b7cbb0 100644 --- a/examples/exchange_client/derivative_exchange_rpc/3_StreamMarket.py +++ b/examples/exchange_client/derivative_exchange_rpc/3_StreamMarket.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -13,5 +12,6 @@ async def main() -> None: async for market in markets: print(market) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/4_Orderbook.py b/examples/exchange_client/derivative_exchange_rpc/4_Orderbook.py index 9020a949..49602701 100644 --- a/examples/exchange_client/derivative_exchange_rpc/4_Orderbook.py +++ b/examples/exchange_client/derivative_exchange_rpc/4_Orderbook.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -13,5 +12,6 @@ async def main() -> None: market = await client.get_derivative_orderbook(market_id=market_id) print(market) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/5_StreamOrderbooks.py b/examples/exchange_client/derivative_exchange_rpc/5_StreamOrderbooks.py index 8a5a88f6..ab9c5927 100644 --- a/examples/exchange_client/derivative_exchange_rpc/5_StreamOrderbooks.py +++ b/examples/exchange_client/derivative_exchange_rpc/5_StreamOrderbooks.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -14,5 +13,6 @@ async def main() -> None: async for market in markets: print(market) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/6_StreamOrderbookUpdate.py b/examples/exchange_client/derivative_exchange_rpc/6_StreamOrderbookUpdate.py index 4dd446db..235e75d2 100644 --- a/examples/exchange_client/derivative_exchange_rpc/6_StreamOrderbookUpdate.py +++ b/examples/exchange_client/derivative_exchange_rpc/6_StreamOrderbookUpdate.py @@ -1,6 +1,5 @@ import asyncio -import logging -from decimal import * +from decimal import Decimal from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -80,8 +79,11 @@ def apply_orderbook_update(orderbook: Orderbook, updates): # ensure we have not missed any update if updates.sequence > (orderbook.sequence + 1): - raise Exception("missing orderbook update events from stream, must restart: {} vs {}".format( - updates.sequence, (orderbook.sequence + 1))) + raise Exception( + "missing orderbook update events from stream, must restart: {} vs {}".format( + updates.sequence, (orderbook.sequence + 1) + ) + ) print("updating orderbook with updates at sequence {}".format(updates.sequence)) @@ -92,9 +94,8 @@ def apply_orderbook_update(orderbook: Orderbook, updates): if level.is_active: # upsert level orderbook.levels[direction][level.price] = PriceLevel( - price=Decimal(level.price), - quantity=Decimal(level.quantity), - timestamp=level.timestamp) + price=Decimal(level.price), quantity=Decimal(level.quantity), timestamp=level.timestamp + ) else: if level.price in orderbook.levels[direction]: del orderbook.levels[direction][level.price] @@ -122,5 +123,5 @@ def apply_orderbook_update(orderbook: Orderbook, updates): print("====================================") -if __name__ == '__main__': +if __name__ == "__main__": asyncio.run(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/7_Positions.py b/examples/exchange_client/derivative_exchange_rpc/7_Positions.py index 50500c14..fddd7b3a 100644 --- a/examples/exchange_client/derivative_exchange_rpc/7_Positions.py +++ b/examples/exchange_client/derivative_exchange_rpc/7_Positions.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -11,7 +10,7 @@ async def main() -> None: client = AsyncClient(network) market_ids = [ "0x17ef48032cb24375ba7c2e39f384e56433bcab20cbee9a7357e4cba2eb00abe6", - "0xd97d0da6f6c11710ef06315971250e4e9aed4b7d4cd02059c9477ec8cf243782" + "0xd97d0da6f6c11710ef06315971250e4e9aed4b7d4cd02059c9477ec8cf243782", ] subaccount_id = "0xc6fe5d33615a1c52c08018c47e8bc53646a0e101000000000000000000000000" direction = "short" @@ -20,13 +19,14 @@ async def main() -> None: limit = 4 positions = await client.get_derivative_positions( market_ids=market_ids, - # subaccount_id=subaccount_id, + ubaccount_id=subaccount_id, direction=direction, subaccount_total_positions=subaccount_total_positions, skip=skip, - limit=limit + limit=limit, ) print(positions) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/derivative_exchange_rpc/9_StreamPositions.py b/examples/exchange_client/derivative_exchange_rpc/9_StreamPositions.py index 425363ff..cc808a7e 100644 --- a/examples/exchange_client/derivative_exchange_rpc/9_StreamPositions.py +++ b/examples/exchange_client/derivative_exchange_rpc/9_StreamPositions.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -11,12 +10,10 @@ async def main() -> None: client = AsyncClient(network) market_id = "0x17ef48032cb24375ba7c2e39f384e56433bcab20cbee9a7357e4cba2eb00abe6" subaccount_id = "0xea98e3aa091a6676194df40ac089e40ab4604bf9000000000000000000000000" - positions = await client.stream_derivative_positions( - market_id=market_id, - subaccount_id=subaccount_id - ) + positions = await client.stream_derivative_positions(market_id=market_id, subaccount_id=subaccount_id) async for position in positions: print(position) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/explorer_rpc/10_GetIBCTransfers.py b/examples/exchange_client/explorer_rpc/10_GetIBCTransfers.py index 68daf8d9..62ca0c24 100644 --- a/examples/exchange_client/explorer_rpc/10_GetIBCTransfers.py +++ b/examples/exchange_client/explorer_rpc/10_GetIBCTransfers.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -24,10 +23,11 @@ async def main() -> None: src_port=src_port, destination_channel=destination_channel, dest_port=dest_port, - # limit=limit, - # skip=skip + limit=limit, + skip=skip, ) print(ibc_transfers) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/explorer_rpc/1_GetTxByHash.py b/examples/exchange_client/explorer_rpc/1_GetTxByHash.py index 7fd480f8..33e6abe4 100644 --- a/examples/exchange_client/explorer_rpc/1_GetTxByHash.py +++ b/examples/exchange_client/explorer_rpc/1_GetTxByHash.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.composer import Composer @@ -20,5 +19,6 @@ async def main() -> None: first_message = transaction_messages[0] print(first_message) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/explorer_rpc/2_AccountTxs.py b/examples/exchange_client/explorer_rpc/2_AccountTxs.py index 2fc3958b..b1e39445 100644 --- a/examples/exchange_client/explorer_rpc/2_AccountTxs.py +++ b/examples/exchange_client/explorer_rpc/2_AccountTxs.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.composer import Composer @@ -21,5 +20,6 @@ async def main() -> None: first_message = first_transaction_messages[0] print(first_message) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/explorer_rpc/3_Blocks.py b/examples/exchange_client/explorer_rpc/3_Blocks.py index 23d30dba..72739096 100644 --- a/examples/exchange_client/explorer_rpc/3_Blocks.py +++ b/examples/exchange_client/explorer_rpc/3_Blocks.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -13,5 +12,6 @@ async def main() -> None: block = await client.get_blocks(limit=limit) print(block) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/explorer_rpc/4_Block.py b/examples/exchange_client/explorer_rpc/4_Block.py index 92b17b12..e043bdcd 100644 --- a/examples/exchange_client/explorer_rpc/4_Block.py +++ b/examples/exchange_client/explorer_rpc/4_Block.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -13,5 +12,6 @@ async def main() -> None: block = await client.get_block(block_height=block_height) print(block) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/explorer_rpc/5_TxsRequest.py b/examples/exchange_client/explorer_rpc/5_TxsRequest.py index 434b0779..8282816b 100644 --- a/examples/exchange_client/explorer_rpc/5_TxsRequest.py +++ b/examples/exchange_client/explorer_rpc/5_TxsRequest.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -13,5 +12,6 @@ async def main() -> None: txs = await client.get_txs(limit=limit) print(txs) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/explorer_rpc/6_StreamTxs.py b/examples/exchange_client/explorer_rpc/6_StreamTxs.py index 6c173091..f96a595e 100644 --- a/examples/exchange_client/explorer_rpc/6_StreamTxs.py +++ b/examples/exchange_client/explorer_rpc/6_StreamTxs.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -9,10 +8,10 @@ async def main() -> None: # select network: local, testnet, mainnet network = Network.testnet() client = AsyncClient(network) - stream_txs = await client.stream_txs( - ) + stream_txs = await client.stream_txs() async for tx in stream_txs: print(tx) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/explorer_rpc/7_StreamBlocks.py b/examples/exchange_client/explorer_rpc/7_StreamBlocks.py index 96b83935..f5169511 100644 --- a/examples/exchange_client/explorer_rpc/7_StreamBlocks.py +++ b/examples/exchange_client/explorer_rpc/7_StreamBlocks.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -9,10 +8,10 @@ async def main() -> None: # select network: local, testnet, mainnet network = Network.testnet() client = AsyncClient(network) - stream_blocks = await client.stream_blocks( - ) + stream_blocks = await client.stream_blocks() async for block in stream_blocks: print(block) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/explorer_rpc/8_GetPeggyDeposits.py b/examples/exchange_client/explorer_rpc/8_GetPeggyDeposits.py index 97a8ab10..4fde668f 100644 --- a/examples/exchange_client/explorer_rpc/8_GetPeggyDeposits.py +++ b/examples/exchange_client/explorer_rpc/8_GetPeggyDeposits.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -13,5 +12,6 @@ async def main() -> None: peggy_deposits = await client.get_peggy_deposits(receiver=receiver) print(peggy_deposits) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/explorer_rpc/9_GetPeggyWithdrawals.py b/examples/exchange_client/explorer_rpc/9_GetPeggyWithdrawals.py index 12264475..def1fedf 100644 --- a/examples/exchange_client/explorer_rpc/9_GetPeggyWithdrawals.py +++ b/examples/exchange_client/explorer_rpc/9_GetPeggyWithdrawals.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -11,11 +10,9 @@ async def main() -> None: client = AsyncClient(network) sender = "inj14au322k9munkmx5wrchz9q30juf5wjgz2cfqku" limit = 2 - peggy_deposits = await client.get_peggy_withdrawals( - sender=sender, - limit=limit - ) + peggy_deposits = await client.get_peggy_withdrawals(sender=sender, limit=limit) print(peggy_deposits) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/insurance_rpc/1_InsuranceFunds.py b/examples/exchange_client/insurance_rpc/1_InsuranceFunds.py index 487e64df..167cae93 100644 --- a/examples/exchange_client/insurance_rpc/1_InsuranceFunds.py +++ b/examples/exchange_client/insurance_rpc/1_InsuranceFunds.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -12,5 +11,6 @@ async def main() -> None: insurance_funds = await client.get_insurance_funds() print(insurance_funds) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/insurance_rpc/2_Redemptions.py b/examples/exchange_client/insurance_rpc/2_Redemptions.py index 8db3238b..794e4b02 100644 --- a/examples/exchange_client/insurance_rpc/2_Redemptions.py +++ b/examples/exchange_client/insurance_rpc/2_Redemptions.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -13,11 +12,10 @@ async def main() -> None: redemption_denom = "share4" status = "disbursed" insurance_redemptions = await client.get_redemptions( - redeemer=redeemer, - redemption_denom=redemption_denom, - status=status + redeemer=redeemer, redemption_denom=redemption_denom, status=status ) print(insurance_redemptions) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/meta_rpc/1_Ping.py b/examples/exchange_client/meta_rpc/1_Ping.py index dc505a7a..3b75cbae 100644 --- a/examples/exchange_client/meta_rpc/1_Ping.py +++ b/examples/exchange_client/meta_rpc/1_Ping.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -10,7 +9,8 @@ async def main() -> None: network = Network.testnet() client = AsyncClient(network) resp = await client.ping() - print('Health OK?', resp) + print("Health OK?", resp) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/meta_rpc/2_Version.py b/examples/exchange_client/meta_rpc/2_Version.py index 48cb0b4c..025a931b 100644 --- a/examples/exchange_client/meta_rpc/2_Version.py +++ b/examples/exchange_client/meta_rpc/2_Version.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -10,7 +9,8 @@ async def main() -> None: network = Network.testnet() client = AsyncClient(network) resp = await client.version() - print('Version:', resp) + print("Version:", resp) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/meta_rpc/3_Info.py b/examples/exchange_client/meta_rpc/3_Info.py index 9c3c2693..8f799da7 100644 --- a/examples/exchange_client/meta_rpc/3_Info.py +++ b/examples/exchange_client/meta_rpc/3_Info.py @@ -1,5 +1,4 @@ import asyncio -import logging import time from pyinjective.async_client import AsyncClient @@ -11,11 +10,11 @@ async def main() -> None: network = Network.testnet() client = AsyncClient(network) resp = await client.info() - print('[!] Info:') + print("[!] Info:") print(resp) latency = int(round(time.time() * 1000)) - resp.timestamp - print(f'Server Latency: {latency}ms') + print(f"Server Latency: {latency}ms") -if __name__ == '__main__': +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/meta_rpc/4_StreamKeepAlive.py b/examples/exchange_client/meta_rpc/4_StreamKeepAlive.py index 5d3c531b..789cabc7 100644 --- a/examples/exchange_client/meta_rpc/4_StreamKeepAlive.py +++ b/examples/exchange_client/meta_rpc/4_StreamKeepAlive.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -31,11 +30,11 @@ async def get_markets(client): async def keepalive(client, tasks: list): stream = await client.stream_keepalive() async for announce in stream: - print('Server announce:', announce) + print("Server announce:", announce) async for task in tasks: task.cancel() - print('Cancelled all tasks') + print("Cancelled all tasks") -if __name__ == '__main__': +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/oracle_rpc/1_StreamPrices.py b/examples/exchange_client/oracle_rpc/1_StreamPrices.py index 788f02f2..ca7f9de5 100644 --- a/examples/exchange_client/oracle_rpc/1_StreamPrices.py +++ b/examples/exchange_client/oracle_rpc/1_StreamPrices.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -9,16 +8,15 @@ async def main() -> None: # select network: local, testnet, mainnet network = Network.testnet() client = AsyncClient(network) - base_symbol = 'BTC' - quote_symbol = 'USDT' - oracle_type = 'bandibc' + base_symbol = "BTC" + quote_symbol = "USDT" + oracle_type = "bandibc" oracle_prices = await client.stream_oracle_prices( - base_symbol=base_symbol, - quote_symbol=quote_symbol, - oracle_type=oracle_type + base_symbol=base_symbol, quote_symbol=quote_symbol, oracle_type=oracle_type ) async for oracle in oracle_prices: print(oracle) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/oracle_rpc/2_Price.py b/examples/exchange_client/oracle_rpc/2_Price.py index 094d82d7..f3a5921e 100644 --- a/examples/exchange_client/oracle_rpc/2_Price.py +++ b/examples/exchange_client/oracle_rpc/2_Price.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -9,17 +8,18 @@ async def main() -> None: # select network: local, testnet, mainnet network = Network.testnet() client = AsyncClient(network) - base_symbol = 'BTC' - quote_symbol = 'USDT' - oracle_type = 'bandibc' + base_symbol = "BTC" + quote_symbol = "USDT" + oracle_type = "bandibc" oracle_scale_factor = 6 oracle_prices = await client.get_oracle_prices( base_symbol=base_symbol, quote_symbol=quote_symbol, oracle_type=oracle_type, - oracle_scale_factor=oracle_scale_factor + oracle_scale_factor=oracle_scale_factor, ) print(oracle_prices) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/oracle_rpc/3_OracleList.py b/examples/exchange_client/oracle_rpc/3_OracleList.py index 94cbd70b..558ac66d 100644 --- a/examples/exchange_client/oracle_rpc/3_OracleList.py +++ b/examples/exchange_client/oracle_rpc/3_OracleList.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -12,5 +11,6 @@ async def main() -> None: oracle_list = await client.get_oracle_list() print(oracle_list) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/portfolio_rpc/1_AccountPortfolio.py b/examples/exchange_client/portfolio_rpc/1_AccountPortfolio.py index 707f602a..965d40c7 100644 --- a/examples/exchange_client/portfolio_rpc/1_AccountPortfolio.py +++ b/examples/exchange_client/portfolio_rpc/1_AccountPortfolio.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -10,10 +9,9 @@ async def main() -> None: network = Network.testnet() client = AsyncClient(network) account_address = "inj1clw20s2uxeyxtam6f7m84vgae92s9eh7vygagt" - portfolio = await client.get_account_portfolio( - account_address=account_address - ) + portfolio = await client.get_account_portfolio(account_address=account_address) print(portfolio) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/portfolio_rpc/2_StreamAccountPortfolio.py b/examples/exchange_client/portfolio_rpc/2_StreamAccountPortfolio.py index 33c064f8..53d7c4da 100644 --- a/examples/exchange_client/portfolio_rpc/2_StreamAccountPortfolio.py +++ b/examples/exchange_client/portfolio_rpc/2_StreamAccountPortfolio.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -15,5 +14,5 @@ async def main() -> None: print(update) -if __name__ == '__main__': +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/spot_exchange_rpc/10_StreamTrades.py b/examples/exchange_client/spot_exchange_rpc/10_StreamTrades.py index 8f488d9b..8bf4a82a 100644 --- a/examples/exchange_client/spot_exchange_rpc/10_StreamTrades.py +++ b/examples/exchange_client/spot_exchange_rpc/10_StreamTrades.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -10,7 +9,7 @@ async def main() -> None: client = AsyncClient(network) market_ids = [ "0x0611780ba69656949525013d947713300f56c37b6175e02f26bffa495c3208fe", - "0x7a57e705bb4e09c88aecfc295569481dbf2fe1d5efe364651fbe72385938e9b0" + "0x7a57e705bb4e09c88aecfc295569481dbf2fe1d5efe364651fbe72385938e9b0", ] execution_side = "maker" direction = "sell" @@ -21,11 +20,11 @@ async def main() -> None: execution_side=execution_side, direction=direction, subaccount_id=subaccount_id, - execution_types=execution_types + execution_types=execution_types, ) async for trade in trades: print(trade) -if __name__ == '__main__': +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/spot_exchange_rpc/11_SubaccountOrdersList.py b/examples/exchange_client/spot_exchange_rpc/11_SubaccountOrdersList.py index 40a198db..03e901e9 100644 --- a/examples/exchange_client/spot_exchange_rpc/11_SubaccountOrdersList.py +++ b/examples/exchange_client/spot_exchange_rpc/11_SubaccountOrdersList.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -14,12 +13,10 @@ async def main() -> None: skip = 10 limit = 10 orders = await client.get_spot_subaccount_orders( - subaccount_id=subaccount_id, - market_id=market_id, - skip=skip, - limit=limit + subaccount_id=subaccount_id, market_id=market_id, skip=skip, limit=limit ) print(orders) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/spot_exchange_rpc/12_SubaccountTradesList.py b/examples/exchange_client/spot_exchange_rpc/12_SubaccountTradesList.py index 9c6fbd5b..a9670e58 100644 --- a/examples/exchange_client/spot_exchange_rpc/12_SubaccountTradesList.py +++ b/examples/exchange_client/spot_exchange_rpc/12_SubaccountTradesList.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -21,9 +20,10 @@ async def main() -> None: execution_type=execution_type, direction=direction, skip=skip, - limit=limit + limit=limit, ) print(trades) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/spot_exchange_rpc/13_StreamOrderbooks.py b/examples/exchange_client/spot_exchange_rpc/13_StreamOrderbooks.py index 5592878b..82fe35e7 100644 --- a/examples/exchange_client/spot_exchange_rpc/13_StreamOrderbooks.py +++ b/examples/exchange_client/spot_exchange_rpc/13_StreamOrderbooks.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -10,11 +9,12 @@ async def main() -> None: client = AsyncClient(network) market_ids = [ "0x0611780ba69656949525013d947713300f56c37b6175e02f26bffa495c3208fe", - "0x7a57e705bb4e09c88aecfc295569481dbf2fe1d5efe364651fbe72385938e9b0" + "0x7a57e705bb4e09c88aecfc295569481dbf2fe1d5efe364651fbe72385938e9b0", ] orderbook = await client.stream_spot_orderbook_snapshot(market_ids=market_ids) async for orders in orderbook: print(orders) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/spot_exchange_rpc/14_Orderbooks.py b/examples/exchange_client/spot_exchange_rpc/14_Orderbooks.py index 82f59a69..2a99f818 100644 --- a/examples/exchange_client/spot_exchange_rpc/14_Orderbooks.py +++ b/examples/exchange_client/spot_exchange_rpc/14_Orderbooks.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -10,10 +9,11 @@ async def main() -> None: client = AsyncClient(network) market_ids = [ "0x0611780ba69656949525013d947713300f56c37b6175e02f26bffa495c3208fe", - "0x7a57e705bb4e09c88aecfc295569481dbf2fe1d5efe364651fbe72385938e9b0" + "0x7a57e705bb4e09c88aecfc295569481dbf2fe1d5efe364651fbe72385938e9b0", ] orderbooks = await client.get_spot_orderbooksV2(market_ids=market_ids) print(orderbooks) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/spot_exchange_rpc/15_HistoricalOrders.py b/examples/exchange_client/spot_exchange_rpc/15_HistoricalOrders.py index a2ff4cec..0a39f80d 100644 --- a/examples/exchange_client/spot_exchange_rpc/15_HistoricalOrders.py +++ b/examples/exchange_client/spot_exchange_rpc/15_HistoricalOrders.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -14,13 +13,10 @@ async def main() -> None: limit = 3 order_types = ["buy_po"] orders = await client.get_historical_spot_orders( - market_id=market_id, - subaccount_id=subaccount_id, - skip=skip, - limit=limit, - order_types=order_types + market_id=market_id, subaccount_id=subaccount_id, skip=skip, limit=limit, order_types=order_types ) print(orders) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/spot_exchange_rpc/1_Market.py b/examples/exchange_client/spot_exchange_rpc/1_Market.py index e96f8d57..d926e97c 100644 --- a/examples/exchange_client/spot_exchange_rpc/1_Market.py +++ b/examples/exchange_client/spot_exchange_rpc/1_Market.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -12,5 +11,6 @@ async def main() -> None: market = await client.get_spot_market(market_id=market_id) print(market) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/spot_exchange_rpc/2_Markets.py b/examples/exchange_client/spot_exchange_rpc/2_Markets.py index 36f90f86..dc37d25f 100644 --- a/examples/exchange_client/spot_exchange_rpc/2_Markets.py +++ b/examples/exchange_client/spot_exchange_rpc/2_Markets.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -11,13 +10,9 @@ async def main() -> None: market_status = "active" base_denom = "inj" quote_denom = "peggy0x87aB3B4C8661e07D6372361211B96ed4Dc36B1B5" - market = await client.get_spot_markets( - market_status=market_status, - base_denom=base_denom, - quote_denom=quote_denom - ) + market = await client.get_spot_markets(market_status=market_status, base_denom=base_denom, quote_denom=quote_denom) print(market) -if __name__ == '__main__': +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/spot_exchange_rpc/3_StreamMarkets.py b/examples/exchange_client/spot_exchange_rpc/3_StreamMarkets.py index d5e37a55..16633271 100644 --- a/examples/exchange_client/spot_exchange_rpc/3_StreamMarkets.py +++ b/examples/exchange_client/spot_exchange_rpc/3_StreamMarkets.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -13,5 +12,6 @@ async def main() -> None: async for market in markets: print(market) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/spot_exchange_rpc/4_Orderbook.py b/examples/exchange_client/spot_exchange_rpc/4_Orderbook.py index 60822926..1de0c539 100644 --- a/examples/exchange_client/spot_exchange_rpc/4_Orderbook.py +++ b/examples/exchange_client/spot_exchange_rpc/4_Orderbook.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -12,5 +11,6 @@ async def main() -> None: orderbook = await client.get_spot_orderbookV2(market_id=market_id) print(orderbook) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/spot_exchange_rpc/6_Trades.py b/examples/exchange_client/spot_exchange_rpc/6_Trades.py index 4745296f..6c035553 100644 --- a/examples/exchange_client/spot_exchange_rpc/6_Trades.py +++ b/examples/exchange_client/spot_exchange_rpc/6_Trades.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -18,9 +17,10 @@ async def main() -> None: execution_side=execution_side, direction=direction, subaccount_id=subaccount_id, - execution_types=execution_types + execution_types=execution_types, ) print(orders) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/spot_exchange_rpc/7_StreamOrderbookSnapshot.py b/examples/exchange_client/spot_exchange_rpc/7_StreamOrderbookSnapshot.py index e46a8ca8..5c4ed593 100644 --- a/examples/exchange_client/spot_exchange_rpc/7_StreamOrderbookSnapshot.py +++ b/examples/exchange_client/spot_exchange_rpc/7_StreamOrderbookSnapshot.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -14,5 +13,6 @@ async def main() -> None: async for orderbook in orderbooks: print(orderbook) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/examples/exchange_client/spot_exchange_rpc/8_StreamOrderbookUpdate.py b/examples/exchange_client/spot_exchange_rpc/8_StreamOrderbookUpdate.py index bd5fc5fc..13a789fd 100644 --- a/examples/exchange_client/spot_exchange_rpc/8_StreamOrderbookUpdate.py +++ b/examples/exchange_client/spot_exchange_rpc/8_StreamOrderbookUpdate.py @@ -1,6 +1,5 @@ import asyncio -import logging -from decimal import * +from decimal import Decimal from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -61,7 +60,7 @@ async def main() -> None: async for update in stream: first_update = update.orderbook_level_updates break - + # load the snapshot once we are already receiving updates, so we don't miss any await load_orderbook_snapshot(async_client=async_client, orderbook=orderbook) @@ -80,8 +79,11 @@ def apply_orderbook_update(orderbook: Orderbook, updates): # ensure we have not missed any update if updates.sequence > (orderbook.sequence + 1): - raise Exception("missing orderbook update events from stream, must restart: {} vs {}".format( - updates.sequence, (orderbook.sequence + 1))) + raise Exception( + "missing orderbook update events from stream, must restart: {} vs {}".format( + updates.sequence, (orderbook.sequence + 1) + ) + ) print("updating orderbook with updates at sequence {}".format(updates.sequence)) @@ -92,9 +94,8 @@ def apply_orderbook_update(orderbook: Orderbook, updates): if level.is_active: # upsert level orderbook.levels[direction][level.price] = PriceLevel( - price=Decimal(level.price), - quantity=Decimal(level.quantity), - timestamp=level.timestamp) + price=Decimal(level.price), quantity=Decimal(level.quantity), timestamp=level.timestamp + ) else: if level.price in orderbook.levels[direction]: del orderbook.levels[direction][level.price] @@ -122,5 +123,5 @@ def apply_orderbook_update(orderbook: Orderbook, updates): print("====================================") -if __name__ == '__main__': +if __name__ == "__main__": asyncio.run(main()) diff --git a/examples/exchange_client/spot_exchange_rpc/9_StreamHistoricalOrders.py b/examples/exchange_client/spot_exchange_rpc/9_StreamHistoricalOrders.py index 96d0898c..95dcdb43 100644 --- a/examples/exchange_client/spot_exchange_rpc/9_StreamHistoricalOrders.py +++ b/examples/exchange_client/spot_exchange_rpc/9_StreamHistoricalOrders.py @@ -1,5 +1,4 @@ import asyncio -import logging from pyinjective.async_client import AsyncClient from pyinjective.core.network import Network @@ -10,13 +9,10 @@ async def main() -> None: client = AsyncClient(network) market_id = "0x0611780ba69656949525013d947713300f56c37b6175e02f26bffa495c3208fe" order_side = "buy" - subaccount_id = "0xc6fe5d33615a1c52c08018c47e8bc53646a0e101000000000000000000000000" - orders = await client.stream_historical_spot_orders( - market_id=market_id, - order_side=order_side - ) + orders = await client.stream_historical_spot_orders(market_id=market_id, order_side=order_side) async for order in orders: print(order) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 00000000..28358a9f --- /dev/null +++ b/poetry.lock @@ -0,0 +1,2696 @@ +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. + +[[package]] +name = "aiocron" +version = "1.8" +description = "Crontabs for asyncio" +optional = false +python-versions = "*" +files = [ + {file = "aiocron-1.8-py3-none-any.whl", hash = "sha256:b6313214c311b62aa2220e872b94139b648631b3103d062ef29e5d3230ddce6d"}, + {file = "aiocron-1.8.tar.gz", hash = "sha256:48546513faf2eb7901e65a64eba7b653c80106ed00ed9ca3419c3d10b6555a01"}, +] + +[package.dependencies] +croniter = "*" +tzlocal = "*" + +[package.extras] +test = ["coverage"] + +[[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 = "asn1crypto" +version = "1.5.1" +description = "Fast ASN.1 parser and serializer with definitions for private keys, public keys, certificates, CRL, OCSP, CMS, PKCS#3, PKCS#7, PKCS#8, PKCS#12, PKCS#5, X.509 and TSP" +optional = false +python-versions = "*" +files = [ + {file = "asn1crypto-1.5.1-py2.py3-none-any.whl", hash = "sha256:db4e40728b728508912cbb3d44f19ce188f218e9eba635821bb4b68564f8fd67"}, + {file = "asn1crypto-1.5.1.tar.gz", hash = "sha256:13ae38502be632115abf8a24cbe5f4da52e3b5231990aff31123c805306ccb9c"}, +] + +[[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 = "asyncio" +version = "3.4.3" +description = "reference implementation of PEP 3156" +optional = false +python-versions = "*" +files = [ + {file = "asyncio-3.4.3-cp33-none-win32.whl", hash = "sha256:b62c9157d36187eca799c378e572c969f0da87cd5fc42ca372d92cdb06e7e1de"}, + {file = "asyncio-3.4.3-cp33-none-win_amd64.whl", hash = "sha256:c46a87b48213d7464f22d9a497b9eef8c1928b68320a2fa94240f969f6fec08c"}, + {file = "asyncio-3.4.3-py3-none-any.whl", hash = "sha256:c4d18b22701821de07bd6aea8b53d21449ec0ec5680645e5317062ea21817d2d"}, + {file = "asyncio-3.4.3.tar.gz", hash = "sha256:83360ff8bc97980e4ff25c964c7bd3923d333d177aa4f7fb736b019f26c7cb41"}, +] + +[[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 = "base58" +version = "2.1.1" +description = "Base58 and Base58Check implementation." +optional = false +python-versions = ">=3.5" +files = [ + {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"}, + {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"}, +] + +[package.extras] +tests = ["PyHamcrest (>=2.0.2)", "mypy", "pytest (>=4.6)", "pytest-benchmark", "pytest-cov", "pytest-flake8"] + +[[package]] +name = "bech32" +version = "1.2.0" +description = "Reference implementation for Bech32 and segwit addresses." +optional = false +python-versions = ">=3.5" +files = [ + {file = "bech32-1.2.0-py3-none-any.whl", hash = "sha256:990dc8e5a5e4feabbdf55207b5315fdd9b73db40be294a19b3752cde9e79d981"}, + {file = "bech32-1.2.0.tar.gz", hash = "sha256:7d6db8214603bd7871fcfa6c0826ef68b85b0abd90fa21c285a9c5e21d2bd899"}, +] + +[[package]] +name = "bip32" +version = "3.4" +description = "Minimalistic implementation of the BIP32 key derivation scheme" +optional = false +python-versions = "*" +files = [ + {file = "bip32-3.4-py3-none-any.whl", hash = "sha256:c18099c25cabc087d081142d040eacb6fdf09f2c61fde3247e1f61313d1c0d26"}, + {file = "bip32-3.4.tar.gz", hash = "sha256:09213225d99ede936c39a4f5a520549d8ecc49ebe3fa15608a17ea4aa9f61a10"}, +] + +[package.dependencies] +base58 = ">=2.0,<3.0" +coincurve = ">=15.0,<19" + +[[package]] +name = "bitarray" +version = "2.8.1" +description = "efficient arrays of booleans -- C extension" +optional = false +python-versions = "*" +files = [ + {file = "bitarray-2.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6be965028785413a6163dd55a639b898b22f67f9b6ed554081c23e94a602031e"}, + {file = "bitarray-2.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29e19cb80a69f6d1a64097bfbe1766c418e1a785d901b583ef0328ea10a30399"}, + {file = "bitarray-2.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a0f6d705860f59721d7282496a4d29b5fd78690e1c1473503832c983e762b01b"}, + {file = "bitarray-2.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6df04efdba4e1bf9d93a1735e42005f8fcf812caf40c03934d9322412d563499"}, + {file = "bitarray-2.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:18530ed3ddd71e9ff95440afce531efc3df7a3e0657f1c201c2c3cb41dd65869"}, + {file = "bitarray-2.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e4cd81ffd2d58ef68c22c825aff89f4a47bd721e2ada0a3a96793169f370ae21"}, + {file = "bitarray-2.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8367768ab797105eb97dfbd4577fcde281618de4d8d3b16ad62c477bb065f347"}, + {file = "bitarray-2.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:848af80518d0ed2aee782018588c7c88805f51b01271935df5b256c8d81c726e"}, + {file = "bitarray-2.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:c54b0af16be45de534af9d77e8a180126cd059f72db8b6550f62dda233868942"}, + {file = "bitarray-2.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f30cdce22af3dc7c73e70af391bfd87c4574cc40c74d651919e20efc26e014b5"}, + {file = "bitarray-2.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:bc03bb358ae3917247d257207c79162e666d407ac473718d1b95316dac94162b"}, + {file = "bitarray-2.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:cf38871ed4cd89df9db7c70f729b948fa3e2848a07c69f78e4ddfbe4f23db63c"}, + {file = "bitarray-2.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:4a637bcd199c1366c65b98f18884f0d0b87403f04676b21e4635831660d722a7"}, + {file = "bitarray-2.8.1-cp310-cp310-win32.whl", hash = "sha256:904719fb7304d4115228b63c178f0cc725ad3b73e285c4b328e45a99a8e3fad6"}, + {file = "bitarray-2.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:1e859c664500d57526fe07140889a3b58dca54ff3b16ac6dc6d534a65c933084"}, + {file = "bitarray-2.8.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2d3f28a80f2e6bb96e9360a4baf3fbacb696b5aba06a14c18a15488d4b6f398f"}, + {file = "bitarray-2.8.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4677477a406f2a9e064920463f69172b865e4d69117e1f2160064d3f5912b0bd"}, + {file = "bitarray-2.8.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9061c0a50216f24c97fb2325de84200e5ad5555f25c854ddcb3ceb6f12136055"}, + {file = "bitarray-2.8.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:843af12991161b358b6379a8dc5f6636798f3dacdae182d30995b6a2df3b263e"}, + {file = "bitarray-2.8.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9336300fd0acf07ede92e424930176dc4b43ef1b298489e93ba9a1695e8ea752"}, + {file = "bitarray-2.8.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f0af01e1f61fe627f63648c0c6f52de8eac56710a2ef1dbce4851d867084cc7e"}, + {file = "bitarray-2.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ab81c74a1805fe74330859b38e70d7525cdd80953461b59c06660046afaffcf"}, + {file = "bitarray-2.8.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b2015a9dd718393e814ff7b9e80c58190eb1cef7980f86a97a33e8440e158ce2"}, + {file = "bitarray-2.8.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:5b0493ab66c6b8e17e9fde74c646b39ee09c236cf28a787cb8cbd3a83c05bff7"}, + {file = "bitarray-2.8.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:81e83ed7e0b1c09c5a33b97712da89e7a21fd3e5598eff3975c39540f5619792"}, + {file = "bitarray-2.8.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:741c3a2c0997c8f8878edfc65a4a8f7aa72eede337c9bc0b7bd8a45cf6e70dbc"}, + {file = "bitarray-2.8.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:57aeab27120a8a50917845bb81b0976e33d4759f2156b01359e2b43d445f5127"}, + {file = "bitarray-2.8.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:17c32ba584e8fb9322419390e0e248769ed7d59de3ffa7432562a4c0ec4f1f82"}, + {file = "bitarray-2.8.1-cp311-cp311-win32.whl", hash = "sha256:b67733a240a96f09b7597af97ac4d60c59140cfcfd180f11a7221863b82f023a"}, + {file = "bitarray-2.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:7b29d4bf3d3da1847f2be9e30105bf51caaf5922e94dc827653e250ed33f4e8a"}, + {file = "bitarray-2.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:5f6175c1cf07dadad3213d60075704cf2e2f1232975cfd4ac8328c24a05e8f78"}, + {file = "bitarray-2.8.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cc066c7290151600b8872865708d2d00fb785c5db8a0df20d70d518e02f172b"}, + {file = "bitarray-2.8.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ce2ef9291a193a0e0cd5e23970bf3b682cc8b95220561d05b775b8d616d665f"}, + {file = "bitarray-2.8.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c5582dd7d906e6f9ec1704f99d56d812f7d395d28c02262bc8b50834d51250c3"}, + {file = "bitarray-2.8.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2aa2267eb6d2b88ef7d139e79a6daaa84cd54d241b9797478f10dcb95a9cd620"}, + {file = "bitarray-2.8.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a04d4851e83730f03c4a6aac568c7d8b42f78f0f9cc8231d6db66192b030ce1e"}, + {file = "bitarray-2.8.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f7d2ec2174d503cbb092f8353527842633c530b4e03b9922411640ac9c018a19"}, + {file = "bitarray-2.8.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:b65a04b2e029b0694b52d60786732afd15b1ec6517de61a36afbb7808a2ffac1"}, + {file = "bitarray-2.8.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:55020d6fb9b72bd3606969f5431386c592ed3666133bd475af945aa0fa9e84ec"}, + {file = "bitarray-2.8.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:797de3465f5f6c6be9a412b4e99eb6e8cdb86b83b6756655c4d83a65d0b9a376"}, + {file = "bitarray-2.8.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:f9a66745682e175e143a180524a63e692acb2b8c86941073f6dd4ee906e69608"}, + {file = "bitarray-2.8.1-cp36-cp36m-win32.whl", hash = "sha256:443726af4bd60515e4e41ea36c5dbadb29a59bc799bcbf431011d1c6fd4363e3"}, + {file = "bitarray-2.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:2b0f754a5791635b8239abdcc0258378111b8ee7a8eb3e2bbc24bcc48a0f0b08"}, + {file = "bitarray-2.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d175e16419a52d54c0ac44c93309ba76dc2cfd33ee9d20624f1a5eb86b8e162e"}, + {file = "bitarray-2.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3128234bde3629ab301a501950587e847d30031a9cbf04d95f35cbf44469a9e"}, + {file = "bitarray-2.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:75104c3076676708c1ac2484ebf5c26464fb3850312de33a5b5bf61bfa7dbec5"}, + {file = "bitarray-2.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:82bfb6ab9b1b5451a5483c9a2ae2a8f83799d7503b384b54f6ab56ea74abb305"}, + {file = "bitarray-2.8.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2dc064a63445366f6b26eaf77230d326b9463e903ba59d6ff5efde0c5ec1ea0e"}, + {file = "bitarray-2.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cbe54685cf6b17b3e15faf6c4b76773bc1c484bc447020737d2550a9dde5f6e6"}, + {file = "bitarray-2.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9fed8aba8d1b09cf641b50f1e6dd079c31677106ea4b63ec29f4c49adfabd63f"}, + {file = "bitarray-2.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:7c17dd8fb146c2c680bf1cb28b358f9e52a14076e44141c5442148863ee95d7d"}, + {file = "bitarray-2.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:c9efcee311d9ba0c619743060585af9a9b81496e97b945843d5e954c67722a75"}, + {file = "bitarray-2.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:dc7acffee09822b334d1b46cd384e969804abdf18f892c82c05c2328066cd2ae"}, + {file = "bitarray-2.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ea71e0a50060f96ad0821e0ac785e91e44807f8b69555970979d81934961d5bd"}, + {file = "bitarray-2.8.1-cp37-cp37m-win32.whl", hash = "sha256:69ab51d551d50e4d6ca35abc95c9d04b33ad28418019bb5481ab09bdbc0df15c"}, + {file = "bitarray-2.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:3024ab4c4906c3681408ca17c35833237d18813ebb9f24ae9f9e3157a4a66939"}, + {file = "bitarray-2.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:46fdd27c8fa4186d8b290bf74a28cbd91b94127b1b6a35c265a002e394fa9324"}, + {file = "bitarray-2.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d32ccd2c0d906eae103ef84015f0545a395052b0b6eb0e02e9023ca0132557f6"}, + {file = "bitarray-2.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:9186cf8135ca170cd907d8c4df408a87747570d192d89ec4ff23805611c702a0"}, + {file = "bitarray-2.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b8d6e5ff385fea25caf26fd58b43f087deb763dcaddd18d3df2895235cf1b484"}, + {file = "bitarray-2.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d6a9c72354327c7aa9890ff87904cbe86830cb1fb58c39750a0afac8df5e051"}, + {file = "bitarray-2.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d2f13b7d0694ce2024c82fc595e6ccc3918e7f069747c3de41b1ce72a9a1e346"}, + {file = "bitarray-2.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d38ceca90ed538706e3f111513073590f723f90659a7af0b992b29776a6e816"}, + {file = "bitarray-2.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b977c39e3734e73540a2e3a71501c2c6261c70c6ce59d427bb7c4ecf6331c7e"}, + {file = "bitarray-2.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:214c05a7642040f6174e29f3e099549d3c40ac44616405081bf230dcafb38767"}, + {file = "bitarray-2.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ad440c17ef2ff42e94286186b5bcf82bf87c4026f91822675239102ebe1f7035"}, + {file = "bitarray-2.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:28dee92edd0d21655e56e1870c22468d0dabe557df18aa69f6d06b1543614180"}, + {file = "bitarray-2.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:df9d8a9a46c46950f306394705512553c552b633f8bf3c11359c4204289f11e3"}, + {file = "bitarray-2.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1a0d27aad02d8abcb1d3b7d85f463877c4937e71adf9b6adb9367f2cdad91a52"}, + {file = "bitarray-2.8.1-cp38-cp38-win32.whl", hash = "sha256:6033303431a7c85a535b3f1b0ec28abc2ebc2167c263f244993b56ccb87cae6b"}, + {file = "bitarray-2.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:9b65d487451e0e287565c8436cf4da45260f958f911299f6122a20d7ec76525c"}, + {file = "bitarray-2.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9aad7b4670f090734b272c072c9db375c63bd503512be9a9393e657dcacfc7e2"}, + {file = "bitarray-2.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bf80804014e3736515b84044c2be0e70080616b4ceddd4e38d85f3167aeb8165"}, + {file = "bitarray-2.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7f7231ef349e8f4955d9b39561f4683a418a73443cfce797a4eddbee1ba9664"}, + {file = "bitarray-2.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67e8fb18df51e649adbc81359e1db0f202d72708fba61b06f5ac8db47c08d107"}, + {file = "bitarray-2.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9d5df3d6358425c9dfb6bdbd4f576563ec4173d24693a9042d05aadcb23c0b98"}, + {file = "bitarray-2.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6ea51ba4204d086d5b76e84c31d2acbb355ed1b075ded54eb9b7070b0b95415d"}, + {file = "bitarray-2.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1414582b3b7516d2282433f0914dd9846389b051b2aea592ae7cc165806c24ac"}, + {file = "bitarray-2.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5934e3a623a1d485e1dcfc1990246e3c32c6fc6e7f0fd894750800d35fdb5794"}, + {file = "bitarray-2.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:aa08a9b03888c768b9b2383949a942804d50d8164683b39fe62f0bfbfd9b4204"}, + {file = "bitarray-2.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:00ff372dfaced7dd6cc2dffd052fafc118053cf81a442992b9a23367479d77d7"}, + {file = "bitarray-2.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:dd76bbf5a4b2ab84b8ffa229f5648e80038ba76bf8d7acc5de9dd06031b38117"}, + {file = "bitarray-2.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:e88a706f92ad1e0e1e66f6811d10b6155d5f18f0de9356ee899a7966a4e41992"}, + {file = "bitarray-2.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:b2560475c5a1ff96fcab01fae7cf6b9a6da590f02659556b7fccc7991e401884"}, + {file = "bitarray-2.8.1-cp39-cp39-win32.whl", hash = "sha256:74cd1725d08325b6669e6e9a5d09cec29e7c41f7d58e082286af5387414d046d"}, + {file = "bitarray-2.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:e48c45ea7944225bcee026c457a70eaea61db3659d9603f07fc8a643ab7e633b"}, + {file = "bitarray-2.8.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c2426dc7a0d92d8254def20ab7a231626397ce5b6fb3d4f44be74cc1370a60c3"}, + {file = "bitarray-2.8.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d34790a919f165b6f537935280ef5224957d9ce8ab11d339f5e6d0319a683ccc"}, + {file = "bitarray-2.8.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c26a923080bc211cab8f5a5e242e3657b32951fec8980db0616e9239aade482"}, + {file = "bitarray-2.8.1-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0de1bc5f971aba46de88a4eb0dbb5779e30bbd7514f4dcbff743c209e0c02667"}, + {file = "bitarray-2.8.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:3bb5f2954dd897b0bac13b5449e5c977534595b688120c8af054657a08b01f46"}, + {file = "bitarray-2.8.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:62ac31059a3c510ef64ed93d930581b262fd4592e6d95ede79fca91e8d3d3ef6"}, + {file = "bitarray-2.8.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ae32ac7217e83646b9f64d7090bf7b737afaa569665621f110a05d9738ca841a"}, + {file = "bitarray-2.8.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3994f7dc48d21af40c0d69fca57d8040b02953f4c7c3652c2341d8947e9cbedf"}, + {file = "bitarray-2.8.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c361201e1c3ee6d6b2266f8b7a645389880bccab1b29e22e7a6b7b6e7831ad5"}, + {file = "bitarray-2.8.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:861850d6a58e7b6a7096d0b0efed9c6d993a6ab8b9d01e781df1f4d80cc00efa"}, + {file = "bitarray-2.8.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ee772c20dcb56b03d666a4e4383d0b5b942b0ccc27815e42fe0737b34cba2082"}, + {file = "bitarray-2.8.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:63fa75e87ad8c57d5722cc87902ca148ef8bbbba12b5c5b3c3730a1bc9ac2886"}, + {file = "bitarray-2.8.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b999fb66980f885961d197d97d7ff5a13b7ab524ccf45ccb4704f4b82ce02e3"}, + {file = "bitarray-2.8.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3243e4b8279ff2fe4c6e7869f0e6930c17799ee9f8d07317f68d44a66b46281e"}, + {file = "bitarray-2.8.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:542358b178b025dcc95e7fb83389e9954f701c41d312cbb66bdd763cbe5414b5"}, + {file = "bitarray-2.8.1.tar.gz", hash = "sha256:e68ceef35a88625d16169550768fcc8d3894913e363c24ecbf6b8c07eb02c8f3"}, +] + +[[package]] +name = "black" +version = "23.9.1" +description = "The uncompromising code formatter." +optional = false +python-versions = ">=3.8" +files = [ + {file = "black-23.9.1-cp310-cp310-macosx_10_16_arm64.whl", hash = "sha256:d6bc09188020c9ac2555a498949401ab35bb6bf76d4e0f8ee251694664df6301"}, + {file = "black-23.9.1-cp310-cp310-macosx_10_16_universal2.whl", hash = "sha256:13ef033794029b85dfea8032c9d3b92b42b526f1ff4bf13b2182ce4e917f5100"}, + {file = "black-23.9.1-cp310-cp310-macosx_10_16_x86_64.whl", hash = "sha256:75a2dc41b183d4872d3a500d2b9c9016e67ed95738a3624f4751a0cb4818fe71"}, + {file = "black-23.9.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13a2e4a93bb8ca74a749b6974925c27219bb3df4d42fc45e948a5d9feb5122b7"}, + {file = "black-23.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:adc3e4442eef57f99b5590b245a328aad19c99552e0bdc7f0b04db6656debd80"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_arm64.whl", hash = "sha256:8431445bf62d2a914b541da7ab3e2b4f3bc052d2ccbf157ebad18ea126efb91f"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_universal2.whl", hash = "sha256:8fc1ddcf83f996247505db6b715294eba56ea9372e107fd54963c7553f2b6dfe"}, + {file = "black-23.9.1-cp311-cp311-macosx_10_16_x86_64.whl", hash = "sha256:7d30ec46de88091e4316b17ae58bbbfc12b2de05e069030f6b747dfc649ad186"}, + {file = "black-23.9.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:031e8c69f3d3b09e1aa471a926a1eeb0b9071f80b17689a655f7885ac9325a6f"}, + {file = "black-23.9.1-cp311-cp311-win_amd64.whl", hash = "sha256:538efb451cd50f43aba394e9ec7ad55a37598faae3348d723b59ea8e91616300"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_arm64.whl", hash = "sha256:638619a559280de0c2aa4d76f504891c9860bb8fa214267358f0a20f27c12948"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_universal2.whl", hash = "sha256:a732b82747235e0542c03bf352c126052c0fbc458d8a239a94701175b17d4855"}, + {file = "black-23.9.1-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:cf3a4d00e4cdb6734b64bf23cd4341421e8953615cba6b3670453737a72ec204"}, + {file = "black-23.9.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cf99f3de8b3273a8317681d8194ea222f10e0133a24a7548c73ce44ea1679377"}, + {file = "black-23.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:14f04c990259576acd093871e7e9b14918eb28f1866f91968ff5524293f9c573"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_arm64.whl", hash = "sha256:c619f063c2d68f19b2d7270f4cf3192cb81c9ec5bc5ba02df91471d0b88c4c5c"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_universal2.whl", hash = "sha256:6a3b50e4b93f43b34a9d3ef00d9b6728b4a722c997c99ab09102fd5efdb88325"}, + {file = "black-23.9.1-cp39-cp39-macosx_10_16_x86_64.whl", hash = "sha256:c46767e8df1b7beefb0899c4a95fb43058fa8500b6db144f4ff3ca38eb2f6393"}, + {file = "black-23.9.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50254ebfa56aa46a9fdd5d651f9637485068a1adf42270148cd101cdf56e0ad9"}, + {file = "black-23.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:403397c033adbc45c2bd41747da1f7fc7eaa44efbee256b53842470d4ac5a70f"}, + {file = "black-23.9.1-py3-none-any.whl", hash = "sha256:6ccd59584cc834b6d127628713e4b6b968e5f79572da66284532525a042549f9"}, + {file = "black-23.9.1.tar.gz", hash = "sha256:24b6b3ff5c6d9ea08a8888f6977eae858e1f340d7260cf56d70a49823236b62d"}, +] + +[package.dependencies] +click = ">=8.0.0" +mypy-extensions = ">=0.4.3" +packaging = ">=22.0" +pathspec = ">=0.9.0" +platformdirs = ">=2" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} + +[package.extras] +colorama = ["colorama (>=0.4.3)"] +d = ["aiohttp (>=3.7.4)"] +jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] +uvloop = ["uvloop (>=0.15.2)"] + +[[package]] +name = "certifi" +version = "2023.7.22" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.7.22-py3-none-any.whl", hash = "sha256:92d6037539857d8206b8f6ae472e8b77db8058fec5937a1ef3f54304089edbb9"}, + {file = "certifi-2023.7.22.tar.gz", hash = "sha256:539cc1d13202e33ca466e88b2807e29f4c13049d6d87031a3c110744495cb082"}, +] + +[[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 = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + +[[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 = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "coincurve" +version = "18.0.0" +description = "Cross-platform Python CFFI bindings for libsecp256k1" +optional = false +python-versions = ">=3.7" +files = [ + {file = "coincurve-18.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0b1a42eba91b9e4f833309e94bc6a270b1700cb4567d4809ef91f00968b57925"}, + {file = "coincurve-18.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:116bf1b60a6e72e23c6b153d7c79f0e565d82973d917a3cecf655ffb29263163"}, + {file = "coincurve-18.0.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d53e2a268142924c24e9b786b3e6c3603fae54bb8211560036b0e9ce6a9f2dbc"}, + {file = "coincurve-18.0.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b31ab366fadff16ecfdde96ffc07e70fee83850f88bd1f985a8b4977a68bbfb"}, + {file = "coincurve-18.0.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e3c37cfadac6896668a130ea46296a3dfdeea0160fd66a51e377ad00795269"}, + {file = "coincurve-18.0.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f3e5f2a2d774050b3ea8bf2167f2d598fde58d7690779931516714d98b65d884"}, + {file = "coincurve-18.0.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:83379dd70291480df2052554851bfd17444c003aef7c4bb02d96d73eec69fe28"}, + {file = "coincurve-18.0.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:33678f6b43edbeab6605584c725305f4f814239780c53eba0f8e4bc4a52b1d1a"}, + {file = "coincurve-18.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f40646d5f29ac9026f8cc1b368bc9ab68710fad055b64fbec020f9bbfc99b242"}, + {file = "coincurve-18.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:779da694dea1b1d09e16b00e079f6a1195290ce9568f39c95cddf35f1f49ec49"}, + {file = "coincurve-18.0.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7844f01904e32317a00696a27fd771860e53a2fa62e5c66eace9337d2742c9e6"}, + {file = "coincurve-18.0.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257c6171cd0301c119ef41360f0d0c2fb5cc288717b33d3bd5482a4c9ae04551"}, + {file = "coincurve-18.0.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f8bcb9c40fd730cf377fa448f1304355d6497fb3d00b7b0a69a10dfcc14a6d28"}, + {file = "coincurve-18.0.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e3abb7f65e2b5fb66a15e374faeaafe6700fdb83fb66d1873ddff91c395a3b74"}, + {file = "coincurve-18.0.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f44b9ba588b34795d1b4074f9a9fa372adef3fde58300bf32f40a69e8cd72a23"}, + {file = "coincurve-18.0.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:908467330cd3047c71105a08394c4f3e7dce76e4371b030ba8b0ef863013e3ca"}, + {file = "coincurve-18.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:599b1b3cf097cae920d97f31a5b8e8aff185ca8fa5d8a785b2edf7b199fb9731"}, + {file = "coincurve-18.0.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2d2c20d108580bce5efedb980688031462168f4de2446de95898b48a249127a2"}, + {file = "coincurve-18.0.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eba563f7f70c10323227d1890072172bd84df6f814c9a6b012033b214426b6cf"}, + {file = "coincurve-18.0.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:412a06b7d1b8229f25318f05e76310298da5ad55d73851eabac7ddfdcdc5bff4"}, + {file = "coincurve-18.0.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:286969b6f789bbd9d744d28350a3630c1cb3ee045263469a28892f70a4a6654a"}, + {file = "coincurve-18.0.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:14700463009c7d799a746929728223aa53ff1ece394ea408516d98d637434883"}, + {file = "coincurve-18.0.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7f1142252e870f091b2c2c21cc1fadfdd29af23d02e99f29add0f14d1ba94b4c"}, + {file = "coincurve-18.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:cd11d2ca5b7e989c5ce1af217a2ad78c19c21afca786f198d1b1a408d6f408dc"}, + {file = "coincurve-18.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1bce17d7475cee9db2c2fa7af07eaab582732b378acf6dcaee417de1df2d8661"}, + {file = "coincurve-18.0.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ab662b67454fea7f0a5ae855ba6ad9410bcaebe68b97f4dade7b5944dec3a11"}, + {file = "coincurve-18.0.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:23b9ced9cce32dabb4bc15fa6449252fa51efddf0268481973e4c3772a5a68c6"}, + {file = "coincurve-18.0.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d05641cf31d68514c47cb54105d20acbae79fc3ee3942454eaaf411babb3f880"}, + {file = "coincurve-18.0.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a7b31efe56b3f6434828ad5f6ecde4a95747bb69b59032746482eebb8f3456a4"}, + {file = "coincurve-18.0.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:2d95103ed43df855121cd925869ae2589360a8d94fcd61b236958deacfb9a359"}, + {file = "coincurve-18.0.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:abeb4c1d78e1a81a3f1c99a406cd858669582ada2d976e876ef694f57dec95ca"}, + {file = "coincurve-18.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fceca9d6ecaa1e8f891675e4f4ff530d54e41c648fc6e8a816835ffa640fa899"}, + {file = "coincurve-18.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e009f06287507158f16c82cc313c0f3bfd0e9ec1e82d1a4d5fa1c5b6c0060f69"}, + {file = "coincurve-18.0.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a0c0c1e492ef08efe99d25a23d535e2bff667bbef43d71a6f8893ae811b3d81"}, + {file = "coincurve-18.0.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3caf58877bcf41eb4c1be7a2d54317f0b31541d99ba248dae28821b19c52a0db"}, + {file = "coincurve-18.0.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8964e680c622a2b5eea940abdf51c77c1bd3d4fde2a04cec2420bf91981b198a"}, + {file = "coincurve-18.0.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:73e464e0ace77c686fdc54590e5592905b6802f9fc20a0c023f0b1585669d6a3"}, + {file = "coincurve-18.0.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:ba9eaddd50a2ce0d891af7cee11c2e048d1f0f44bf87db00a5c4b1eee7e3391b"}, + {file = "coincurve-18.0.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8290903d4629f27f9f3cdeec72ffa97536c5a6ed5ba7e3413b2707991c650fbe"}, + {file = "coincurve-18.0.0-py3-none-win32.whl", hash = "sha256:c60690bd7704d8563968d2dded33eb514875a52b5964f085409965ad041b2555"}, + {file = "coincurve-18.0.0-py3-none-win_amd64.whl", hash = "sha256:704d1abf2e78def33988368592233a8ec9b98bfc45dfa2ec9e898adfad46e5ad"}, + {file = "coincurve-18.0.0.tar.gz", hash = "sha256:c86626afe417a09d8e80e56780efcae3ae516203b23b5ade84813916e1c94fc1"}, +] + +[package.dependencies] +asn1crypto = "*" +cffi = ">=1.3.0" + +[[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 = "coverage" +version = "7.3.1" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "coverage-7.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cd0f7429ecfd1ff597389907045ff209c8fdb5b013d38cfa7c60728cb484b6e3"}, + {file = "coverage-7.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:966f10df9b2b2115da87f50f6a248e313c72a668248be1b9060ce935c871f276"}, + {file = "coverage-7.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0575c37e207bb9b98b6cf72fdaaa18ac909fb3d153083400c2d48e2e6d28bd8e"}, + {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:245c5a99254e83875c7fed8b8b2536f040997a9b76ac4c1da5bff398c06e860f"}, + {file = "coverage-7.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4c96dd7798d83b960afc6c1feb9e5af537fc4908852ef025600374ff1a017392"}, + {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:de30c1aa80f30af0f6b2058a91505ea6e36d6535d437520067f525f7df123887"}, + {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:50dd1e2dd13dbbd856ffef69196781edff26c800a74f070d3b3e3389cab2600d"}, + {file = "coverage-7.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:b9c0c19f70d30219113b18fe07e372b244fb2a773d4afde29d5a2f7930765136"}, + {file = "coverage-7.3.1-cp310-cp310-win32.whl", hash = "sha256:770f143980cc16eb601ccfd571846e89a5fe4c03b4193f2e485268f224ab602f"}, + {file = "coverage-7.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:cdd088c00c39a27cfa5329349cc763a48761fdc785879220d54eb785c8a38520"}, + {file = "coverage-7.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:74bb470399dc1989b535cb41f5ca7ab2af561e40def22d7e188e0a445e7639e3"}, + {file = "coverage-7.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:025ded371f1ca280c035d91b43252adbb04d2aea4c7105252d3cbc227f03b375"}, + {file = "coverage-7.3.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a6191b3a6ad3e09b6cfd75b45c6aeeffe7e3b0ad46b268345d159b8df8d835f9"}, + {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7eb0b188f30e41ddd659a529e385470aa6782f3b412f860ce22b2491c89b8593"}, + {file = "coverage-7.3.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:75c8f0df9dfd8ff745bccff75867d63ef336e57cc22b2908ee725cc552689ec8"}, + {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7eb3cd48d54b9bd0e73026dedce44773214064be93611deab0b6a43158c3d5a0"}, + {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:ac3c5b7e75acac31e490b7851595212ed951889918d398b7afa12736c85e13ce"}, + {file = "coverage-7.3.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5b4ee7080878077af0afa7238df1b967f00dc10763f6e1b66f5cced4abebb0a3"}, + {file = "coverage-7.3.1-cp311-cp311-win32.whl", hash = "sha256:229c0dd2ccf956bf5aeede7e3131ca48b65beacde2029f0361b54bf93d36f45a"}, + {file = "coverage-7.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:c6f55d38818ca9596dc9019eae19a47410d5322408140d9a0076001a3dcb938c"}, + {file = "coverage-7.3.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5289490dd1c3bb86de4730a92261ae66ea8d44b79ed3cc26464f4c2cde581fbc"}, + {file = "coverage-7.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ca833941ec701fda15414be400c3259479bfde7ae6d806b69e63b3dc423b1832"}, + {file = "coverage-7.3.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd694e19c031733e446c8024dedd12a00cda87e1c10bd7b8539a87963685e969"}, + {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aab8e9464c00da5cb9c536150b7fbcd8850d376d1151741dd0d16dfe1ba4fd26"}, + {file = "coverage-7.3.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87d38444efffd5b056fcc026c1e8d862191881143c3aa80bb11fcf9dca9ae204"}, + {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:8a07b692129b8a14ad7a37941a3029c291254feb7a4237f245cfae2de78de037"}, + {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:2829c65c8faaf55b868ed7af3c7477b76b1c6ebeee99a28f59a2cb5907a45760"}, + {file = "coverage-7.3.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:1f111a7d85658ea52ffad7084088277135ec5f368457275fc57f11cebb15607f"}, + {file = "coverage-7.3.1-cp312-cp312-win32.whl", hash = "sha256:c397c70cd20f6df7d2a52283857af622d5f23300c4ca8e5bd8c7a543825baa5a"}, + {file = "coverage-7.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:5ae4c6da8b3d123500f9525b50bf0168023313963e0e2e814badf9000dd6ef92"}, + {file = "coverage-7.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ca70466ca3a17460e8fc9cea7123c8cbef5ada4be3140a1ef8f7b63f2f37108f"}, + {file = "coverage-7.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f2781fd3cabc28278dc982a352f50c81c09a1a500cc2086dc4249853ea96b981"}, + {file = "coverage-7.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6407424621f40205bbe6325686417e5e552f6b2dba3535dd1f90afc88a61d465"}, + {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:04312b036580ec505f2b77cbbdfb15137d5efdfade09156961f5277149f5e344"}, + {file = "coverage-7.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac9ad38204887349853d7c313f53a7b1c210ce138c73859e925bc4e5d8fc18e7"}, + {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:53669b79f3d599da95a0afbef039ac0fadbb236532feb042c534fbb81b1a4e40"}, + {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:614f1f98b84eb256e4f35e726bfe5ca82349f8dfa576faabf8a49ca09e630086"}, + {file = "coverage-7.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:f1a317fdf5c122ad642db8a97964733ab7c3cf6009e1a8ae8821089993f175ff"}, + {file = "coverage-7.3.1-cp38-cp38-win32.whl", hash = "sha256:defbbb51121189722420a208957e26e49809feafca6afeef325df66c39c4fdb3"}, + {file = "coverage-7.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:f4f456590eefb6e1b3c9ea6328c1e9fa0f1006e7481179d749b3376fc793478e"}, + {file = "coverage-7.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f12d8b11a54f32688b165fd1a788c408f927b0960984b899be7e4c190ae758f1"}, + {file = "coverage-7.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f09195dda68d94a53123883de75bb97b0e35f5f6f9f3aa5bf6e496da718f0cb6"}, + {file = "coverage-7.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6601a60318f9c3945be6ea0f2a80571f4299b6801716f8a6e4846892737ebe4"}, + {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07d156269718670d00a3b06db2288b48527fc5f36859425ff7cec07c6b367745"}, + {file = "coverage-7.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:636a8ac0b044cfeccae76a36f3b18264edcc810a76a49884b96dd744613ec0b7"}, + {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5d991e13ad2ed3aced177f524e4d670f304c8233edad3210e02c465351f785a0"}, + {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:586649ada7cf139445da386ab6f8ef00e6172f11a939fc3b2b7e7c9082052fa0"}, + {file = "coverage-7.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4aba512a15a3e1e4fdbfed2f5392ec221434a614cc68100ca99dcad7af29f3f8"}, + {file = "coverage-7.3.1-cp39-cp39-win32.whl", hash = "sha256:6bc6f3f4692d806831c136c5acad5ccedd0262aa44c087c46b7101c77e139140"}, + {file = "coverage-7.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:553d7094cb27db58ea91332e8b5681bac107e7242c23f7629ab1316ee73c4981"}, + {file = "coverage-7.3.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:220eb51f5fb38dfdb7e5d54284ca4d0cd70ddac047d750111a68ab1798945194"}, + {file = "coverage-7.3.1.tar.gz", hash = "sha256:6cb7fe1581deb67b782c153136541e20901aa312ceedaf1467dcb35255787952"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "croniter" +version = "1.4.1" +description = "croniter provides iteration for datetime object with cron like format" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "croniter-1.4.1-py2.py3-none-any.whl", hash = "sha256:9595da48af37ea06ec3a9f899738f1b2c1c13da3c38cea606ef7cd03ea421128"}, + {file = "croniter-1.4.1.tar.gz", hash = "sha256:1a6df60eacec3b7a0aa52a8f2ef251ae3dd2a7c7c8b9874e73e791636d55a361"}, +] + +[package.dependencies] +python-dateutil = "*" + +[[package]] +name = "cytoolz" +version = "0.12.2" +description = "Cython implementation of Toolz: High performance functional utilities" +optional = false +python-versions = ">=3.6" +files = [ + {file = "cytoolz-0.12.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4bff49986c9bae127928a2f9fd6313146a342bfae8292f63e562f872bd01b871"}, + {file = "cytoolz-0.12.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:908c13f305d34322e11b796de358edaeea47dd2d115c33ca22909c5e8fb036fd"}, + {file = "cytoolz-0.12.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:735147aa41b8eeb104da186864b55e2a6623c758000081d19c93d759cd9523e3"}, + {file = "cytoolz-0.12.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7d352d4de060604e605abdc5c8a5d0429d5f156cb9866609065d3003454d4cea"}, + {file = "cytoolz-0.12.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89247ac220031a4f9f689688bcee42b38fd770d4cce294e5d914afc53b630abe"}, + {file = "cytoolz-0.12.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9070ae35c410d644e6df98a8f69f3ed2807e657d0df2a26b2643127cbf6944a5"}, + {file = "cytoolz-0.12.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:843500cd3e4884b92fd4037912bc42d5f047108d2c986d36352e880196d465b0"}, + {file = "cytoolz-0.12.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6a93644d7996fd696ab7f1f466cd75d718d0a00d5c8118b9fe8c64231dc1f85e"}, + {file = "cytoolz-0.12.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:96796594c770bc6587376e74ddc7d9c982d68f47116bb69d90873db5e0ea88b6"}, + {file = "cytoolz-0.12.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:48425107fbb1af3f0f2410c004f16be10ffc9374358e5600b57fa543f46f8def"}, + {file = "cytoolz-0.12.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:cde6dbb788a4cbc4a80a72aa96386ba4c2b17bdfff3ace0709799adbe16d6476"}, + {file = "cytoolz-0.12.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:68ae7091cc73a752f0b938f15bb193de80ca5edf5ae2ea6360d93d3e9228357b"}, + {file = "cytoolz-0.12.2-cp310-cp310-win32.whl", hash = "sha256:997b7e0960072f6bb445402da162f964ea67387b9f18bda2361edcc026e13597"}, + {file = "cytoolz-0.12.2-cp310-cp310-win_amd64.whl", hash = "sha256:663911786dcde3e4a5d88215c722c531c7548903dc07d418418c0d1c768072c0"}, + {file = "cytoolz-0.12.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4a7d8b869ded171f6cdf584fc2fc6ae03b30a0e1e37a9daf213a59857a62ed90"}, + {file = "cytoolz-0.12.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9b28787eaf2174e68f0acb3c66f9c6b98bdfeb0930c0d0b08e1941c7aedc8d27"}, + {file = "cytoolz-0.12.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00547da587f124b32b072ce52dd5e4b37cf199fedcea902e33c67548523e4678"}, + {file = "cytoolz-0.12.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:275d53fd769df2102d6c9fc98e553bd8a9a38926f54d6b20cf29f0dd00bf3b75"}, + {file = "cytoolz-0.12.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5556acde785a61d4cf8b8534ae109b023cbd2f9df65ee2afbe070be47c410f8c"}, + {file = "cytoolz-0.12.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b41a85b9b9a2530b72b0d3d10e383fc3c2647ae88169d557d5e216f881860318"}, + {file = "cytoolz-0.12.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:673d6e9e3aa86949343b46ac2b7be266c36e07ce77fa1d40f349e6987a814d6e"}, + {file = "cytoolz-0.12.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:81e6a9a8fda78a2f4901d2915b25bf620f372997ca1f20a14f7cefef5ad6f6f4"}, + {file = "cytoolz-0.12.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:fa44215bc31675a6380cd896dadb7f2054a7b94cfb87e53e52af844c65406a54"}, + {file = "cytoolz-0.12.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:a08b4346350660799d81d4016e748bcb134a9083301d41f9618f64a6077f89f2"}, + {file = "cytoolz-0.12.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:2fb740482794a72e2e5fec58e4d9b00dcd5a60a8cef68431ff12f2ba0e0d9a7e"}, + {file = "cytoolz-0.12.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9007bb1290c79402be6b84bcf9e7a622a073859d61fcee146dc7bc47afe328f3"}, + {file = "cytoolz-0.12.2-cp311-cp311-win32.whl", hash = "sha256:a973f5286758f76824ecf19ae1999f6697371a9121c8f163295d181d19a819d7"}, + {file = "cytoolz-0.12.2-cp311-cp311-win_amd64.whl", hash = "sha256:1ce324d1b413636ea5ee929f79637821f13c9e55e9588f38228947294944d2ed"}, + {file = "cytoolz-0.12.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c08094b9e5d1b6dfb0845a0253cc2655ca64ce70d15162dfdb102e28c8993493"}, + {file = "cytoolz-0.12.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:baf020f4b708f800b353259cd7575e335a79f1ac912d9dda55b2aa0bf3616e42"}, + {file = "cytoolz-0.12.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4416ee86a87180b6a28e7483102c92debc077bec59c67eda8cc63fc52a218ac0"}, + {file = "cytoolz-0.12.2-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6ee222671eed5c5b16a5ad2aea07f0a715b8b199ee534834bc1dd2798f1ade7"}, + {file = "cytoolz-0.12.2-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad92e37be0b106fdbc575a3a669b43b364a5ef334495c9764de4c2d7541f7a99"}, + {file = "cytoolz-0.12.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:460c05238fbfe6d848141669d17a751a46c923f9f0c9fd8a3a462ab737623a44"}, + {file = "cytoolz-0.12.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9e5075e30be626ef0f9bedf7a15f55ed4d7209e832bc314fdc232dbd61dcbf44"}, + {file = "cytoolz-0.12.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:03b58f843f09e73414e82e57f7e8d88f087eaabf8f276b866a40661161da6c51"}, + {file = "cytoolz-0.12.2-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:5e4e612b7ecc9596e7c859cd9e0cd085e6d0c576b4f0d917299595eb56bf9c05"}, + {file = "cytoolz-0.12.2-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:08a0e03f287e45eb694998bb55ac1643372199c659affa8319dfbbdec7f7fb3c"}, + {file = "cytoolz-0.12.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:b029bdd5a8b6c9a7c0e8fdbe4fc25ffaa2e09b77f6f3462314696e3a20511829"}, + {file = "cytoolz-0.12.2-cp36-cp36m-win32.whl", hash = "sha256:18580d060fa637ff01541640ecde6de832a248df02b8fb57e6dd578f189d62c7"}, + {file = "cytoolz-0.12.2-cp36-cp36m-win_amd64.whl", hash = "sha256:97cf514a9f3426228d8daf880f56488330e4b2948a6d183a106921217850d9eb"}, + {file = "cytoolz-0.12.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:18a0f838677f9510aef0330c0096778dd6406d21d4ff9504bf79d85235a18460"}, + {file = "cytoolz-0.12.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb081b2b02bf4405c804de1ece6f904916838ab0e057f1446e4ac12fac827960"}, + {file = "cytoolz-0.12.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57233e1600560ceb719bed759dc78393edd541b9a3e7fefc3079abd83c26a6ea"}, + {file = "cytoolz-0.12.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0295289c4510efa41174850e75bc9188f82b72b1b54d0ea57d1781729c2924d5"}, + {file = "cytoolz-0.12.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a92aab8dd1d427ac9bc7480cfd3481dbab0ef024558f2f5a47de672d8a5ffaa"}, + {file = "cytoolz-0.12.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:51d3495235af09f21aa92a7cdd51504bda640b108b6be834448b774f52852c09"}, + {file = "cytoolz-0.12.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:f9c690b359f503f18bf1c46a6456370e4f6f3fc4320b8774ae69c4f85ecc6c94"}, + {file = "cytoolz-0.12.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:481e3129a76ea01adcc0e7097ccb8dbddab1cfc40b6f0e32c670153512957c0f"}, + {file = "cytoolz-0.12.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:55e94124af9c8fbb1df54195cc092688fdad0765641b738970b6f1d5ea72e776"}, + {file = "cytoolz-0.12.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5616d386dfbfba7c39e9418ba668c734f6ceaacc0130877e8a100cad11e6838b"}, + {file = "cytoolz-0.12.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:732d08228fa8d366fec284f7032cc868d28a99fa81fc71e3adf7ecedbcf33a0f"}, + {file = "cytoolz-0.12.2-cp37-cp37m-win32.whl", hash = "sha256:f039c5373f7b314b151432c73219216857b19ab9cb834f0eb5d880f74fc7851c"}, + {file = "cytoolz-0.12.2-cp37-cp37m-win_amd64.whl", hash = "sha256:246368e983eaee9851b15d7755f82030eab4aa82098d2a34f6bef9c689d33fcc"}, + {file = "cytoolz-0.12.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:81074edf3c74bc9bd250d223408a5df0ff745d1f7a462597536cd26b9390e2d6"}, + {file = "cytoolz-0.12.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:960d85ebaa974ecea4e71fa56d098378fa51fd670ee744614cbb95bf95e28fc7"}, + {file = "cytoolz-0.12.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6c8d0dff4865da54ae825d43e1721925721b19f3b9aca8e730c2ce73dee2c630"}, + {file = "cytoolz-0.12.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0a9d12436fd64937bd2c9609605f527af7f1a8db6e6637639b44121c0fe715d6"}, + {file = "cytoolz-0.12.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd461e402e24929d866f05061d2f8337e3a8456e75e21b72c125abff2477c7f7"}, + {file = "cytoolz-0.12.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0568d4da0a9ee9f9f5ab318f6501557f1cfe26d18c96c8e0dac7332ae04c6717"}, + {file = "cytoolz-0.12.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:101b5bd32badfc8b1f9c7be04ba3ae04fb47f9c8736590666ce9449bff76e0b1"}, + {file = "cytoolz-0.12.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8bb624dbaef4661f5e3625c1e39ad98ecceef281d1380e2774d8084ad0810275"}, + {file = "cytoolz-0.12.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:3e993804e6b04113d61fdb9541b6df2f096ec265a506dad7437517470919c90f"}, + {file = "cytoolz-0.12.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:ab911033e5937fc221a2c165acce7f66ae5ac9d3e54bec56f3c9c197a96be574"}, + {file = "cytoolz-0.12.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:e6de6a4bdfaee382c2de2a3580b3ae76fce6105da202bbd835e5efbeae6a9c6e"}, + {file = "cytoolz-0.12.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:9480b4b327be83c4d29cb88bcace761b11f5e30198ffe2287889455c6819e934"}, + {file = "cytoolz-0.12.2-cp38-cp38-win32.whl", hash = "sha256:4180b2785d1278e6abb36a72ac97c92432db53fa2df00ee943d2c15a33627d31"}, + {file = "cytoolz-0.12.2-cp38-cp38-win_amd64.whl", hash = "sha256:d0086ba8d41d73647b13087a3ca9c020f6bfec338335037e8f5172b4c7c8dce5"}, + {file = "cytoolz-0.12.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d29988bde28a90a00367edcf92afa1a2f7ecf43ea3ae383291b7da6d380ccc25"}, + {file = "cytoolz-0.12.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:24c0d71e9ac91f4466b1bd280f7de43aa4d94682daaf34d85d867a9b479b87cc"}, + {file = "cytoolz-0.12.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa436abd4ac9ca71859baf5794614e6ec8fa27362f0162baedcc059048da55f7"}, + {file = "cytoolz-0.12.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:45c7b4eac7571707269ebc2893facdf87e359cd5c7cfbfa9e6bd8b33fb1079c5"}, + {file = "cytoolz-0.12.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:294d24edc747ef4e1b28e54365f713becb844e7898113fafbe3e9165dc44aeea"}, + {file = "cytoolz-0.12.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:478051e5ef8278b2429864c8d148efcebdc2be948a61c9a44757cd8c816c98f5"}, + {file = "cytoolz-0.12.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14108cafb140dd68fdda610c2bbc6a37bf052cd48cfebf487ed44145f7a2b67f"}, + {file = "cytoolz-0.12.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5fef7b602ccf8a3c77ab483479ccd7a952a8c5bb1c263156671ba7aaa24d1035"}, + {file = "cytoolz-0.12.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9bf51354e15520715f068853e6ab8190e77139940e8b8b633bdb587956a08fb0"}, + {file = "cytoolz-0.12.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:388f840fd911d61a96e9e595eaf003f9dc39e847c9060b8e623ab29e556f009b"}, + {file = "cytoolz-0.12.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:a67f75cc51a2dc7229a8ac84291e4d61dc5abfc8940befcf37a2836d95873340"}, + {file = "cytoolz-0.12.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:63b31345e20afda2ae30dba246955517a4264464d75e071fc2fa641e88c763ec"}, + {file = "cytoolz-0.12.2-cp39-cp39-win32.whl", hash = "sha256:f6e86ac2b45a95f75c6f744147483e0fc9697ce7dfe1726083324c236f873f8b"}, + {file = "cytoolz-0.12.2-cp39-cp39-win_amd64.whl", hash = "sha256:5998f81bf6a2b28a802521efe14d9fc119f74b64e87b62ad1b0e7c3d8366d0c7"}, + {file = "cytoolz-0.12.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:593e89e2518eaf81e96edcc9ef2c5fca666e8fc922b03d5cb7a7b8964dbee336"}, + {file = "cytoolz-0.12.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff451d614ca1d4227db0ffa627fb51df71968cf0d9baf0210528dad10fdbc3ab"}, + {file = "cytoolz-0.12.2-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ad9ea4a50d2948738351790047d45f2b1a023facc01bf0361988109b177e8b2f"}, + {file = "cytoolz-0.12.2-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cbe038bb78d599b5a29d09c438905defaa615a522bc7e12f8016823179439497"}, + {file = "cytoolz-0.12.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d494befe648c13c98c0f3d56d05489c839c9228a32f58e9777305deb6c2c1cee"}, + {file = "cytoolz-0.12.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c26805b6c8dc8565ed91045c44040bf6c0fe5cb5b390c78cd1d9400d08a6cd39"}, + {file = "cytoolz-0.12.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df4e32badb2ccf1773e1e74020b7e3b8caf9e92f842c6be7d14888ecdefc2c6c"}, + {file = "cytoolz-0.12.2-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ce7889dc3701826d519ede93cdff11940fb5567dbdc165dce0e78047eece02b7"}, + {file = "cytoolz-0.12.2-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c820608e7077416f766b148d75e158e454881961881b657cff808529d261dd24"}, + {file = "cytoolz-0.12.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:698da4fa1f7baeea0607738cb1f9877ed1ba50342b29891b0223221679d6f729"}, + {file = "cytoolz-0.12.2.tar.gz", hash = "sha256:31d4b0455d72d914645f803d917daf4f314d115c70de0578d3820deb8b101f66"}, +] + +[package.dependencies] +toolz = ">=0.8.0" + +[package.extras] +cython = ["cython"] + +[[package]] +name = "dataclassy" +version = "0.11.1" +description = "A fast and flexible reimplementation of data classes" +optional = false +python-versions = ">=3.6" +files = [ + {file = "dataclassy-0.11.1-py3-none-any.whl", hash = "sha256:bcb030d3d700cf9b1597042bbc8375b92773e6f68f65675a7071862c0ddb87f5"}, + {file = "dataclassy-0.11.1.tar.gz", hash = "sha256:ad6622cb91e644d13f68768558983fbc22c90a8ff7e355638485d18b9baf1198"}, +] + +[[package]] +name = "distlib" +version = "0.3.7" +description = "Distribution utilities" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.7-py2.py3-none-any.whl", hash = "sha256:2e24928bc811348f0feb63014e97aaae3037f2cf48712d51ae61df7fd6075057"}, + {file = "distlib-0.3.7.tar.gz", hash = "sha256:9dafe54b34a028eafd95039d5e5d4851a13734540f1331060d31c9916e7147a8"}, +] + +[[package]] +name = "ecdsa" +version = "0.18.0" +description = "ECDSA cryptographic signature library (pure python)" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "ecdsa-0.18.0-py2.py3-none-any.whl", hash = "sha256:80600258e7ed2f16b9aa1d7c295bd70194109ad5a30fdee0eaeefef1d4c559dd"}, + {file = "ecdsa-0.18.0.tar.gz", hash = "sha256:190348041559e21b22a1d65cee485282ca11a6f81d503fddb84d5017e9ed1e49"}, +] + +[package.dependencies] +six = ">=1.9.0" + +[package.extras] +gmpy = ["gmpy"] +gmpy2 = ["gmpy2"] + +[[package]] +name = "eip712" +version = "0.2.1" +description = "eip712: Message classes for typed structured data hashing and signing in Ethereum" +optional = false +python-versions = ">=3.8,<4" +files = [ + {file = "eip712-0.2.1-py3-none-any.whl", hash = "sha256:c984c577358d1c7e5d4e52802bf4bd0432e965ba7326448998f95fcc1b6d5269"}, + {file = "eip712-0.2.1.tar.gz", hash = "sha256:3997dace7e581b66a84d106a10baac47a3f6c94095d79c7d0971ca0ede1926ad"}, +] + +[package.dependencies] +dataclassy = ">=0.8.2,<1" +eth-abi = ">=4.0.0,<5" +eth-account = ">=0.8.0,<0.9" +eth-hash = {version = "*", extras = ["pycryptodome"]} +eth-typing = ">=3.3.0,<4" +eth-utils = ">=2.1.0,<3" +hexbytes = ">=0.3.0,<1" + +[package.extras] +dev = ["IPython", "Sphinx (>=5.3.0,<6)", "black (>=23.1.0,<24)", "commitizen (>=2.42,<3)", "flake8 (>=6.0.0,<7)", "hypothesis (>=6.70.0,<7)", "ipdb", "isort (>=5.12.0,<6)", "mdformat (>=0.7.16,<0.8)", "mdformat-frontmatter (>=0.4.1,<0.5)", "mdformat-gfm (>=0.3.5,<0.4)", "mypy (>=1.1.1,<2)", "myst-parser (>=0.18.1,<0.19)", "pre-commit", "pytest (>=6.0,<8)", "pytest-cov", "pytest-watch", "pytest-xdist", "setuptools", "sphinx-rtd-theme (>=1.2.0,<2)", "sphinxcontrib-napoleon (>=0.7)", "twine", "types-setuptools", "wheel"] +doc = ["Sphinx (>=5.3.0,<6)", "myst-parser (>=0.18.1,<0.19)", "sphinx-rtd-theme (>=1.2.0,<2)", "sphinxcontrib-napoleon (>=0.7)"] +lint = ["black (>=23.1.0,<24)", "flake8 (>=6.0.0,<7)", "isort (>=5.12.0,<6)", "mdformat (>=0.7.16,<0.8)", "mdformat-frontmatter (>=0.4.1,<0.5)", "mdformat-gfm (>=0.3.5,<0.4)", "mypy (>=1.1.1,<2)", "types-setuptools"] +release = ["setuptools", "twine", "wheel"] +test = ["hypothesis (>=6.70.0,<7)", "pytest (>=6.0,<8)", "pytest-cov", "pytest-xdist"] + +[[package]] +name = "entrypoints" +version = "0.4" +description = "Discover and load entry points from installed packages." +optional = false +python-versions = ">=3.6" +files = [ + {file = "entrypoints-0.4-py3-none-any.whl", hash = "sha256:f174b5ff827504fd3cd97cc3f8649f3693f51538c7e4bdf3ef002c8429d42f9f"}, + {file = "entrypoints-0.4.tar.gz", hash = "sha256:b706eddaa9218a19ebcd67b56818f05bb27589b1ca9e8d797b74affad4ccacd4"}, +] + +[[package]] +name = "eth-abi" +version = "4.2.1" +description = "eth_abi: Python utilities for working with Ethereum ABI definitions, especially encoding and decoding" +optional = false +python-versions = ">=3.7.2, <4" +files = [ + {file = "eth_abi-4.2.1-py3-none-any.whl", hash = "sha256:abd83410a5326145bf178675c276de0ed154f6dc695dcad1beafaa44d97f44ae"}, + {file = "eth_abi-4.2.1.tar.gz", hash = "sha256:60d88788d53725794cdb07c0f0bb0df2a31a6e1ad19644313fe6117ac24eeeb0"}, +] + +[package.dependencies] +eth-typing = ">=3.0.0" +eth-utils = ">=2.0.0" +parsimonious = ">=0.9.0,<0.10.0" + +[package.extras] +dev = ["black (>=23)", "build (>=0.9.0)", "bumpversion (>=0.5.3)", "eth-hash[pycryptodome]", "flake8 (==6.0.0)", "flake8-bugbear (==23.3.23)", "hypothesis (>=4.18.2,<5.0.0)", "ipython", "isort (>=5.10.1)", "mypy (==0.971)", "pydocstyle (>=6.0.0)", "pytest (>=7.0.0)", "pytest-pythonpath (>=0.7.1)", "pytest-watch (>=4.1.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +doc = ["sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +lint = ["black (>=23)", "flake8 (==6.0.0)", "flake8-bugbear (==23.3.23)", "isort (>=5.10.1)", "mypy (==0.971)", "pydocstyle (>=6.0.0)"] +test = ["eth-hash[pycryptodome]", "hypothesis (>=4.18.2,<5.0.0)", "pytest (>=7.0.0)", "pytest-pythonpath (>=0.7.1)", "pytest-xdist (>=2.4.0)"] +tools = ["hypothesis (>=4.18.2,<5.0.0)"] + +[[package]] +name = "eth-account" +version = "0.8.0" +description = "eth-account: Sign Ethereum transactions and messages with local private keys" +optional = false +python-versions = ">=3.6, <4" +files = [ + {file = "eth-account-0.8.0.tar.gz", hash = "sha256:ccb2d90a16c81c8ea4ca4dc76a70b50f1d63cea6aff3c5a5eddedf9e45143eca"}, + {file = "eth_account-0.8.0-py3-none-any.whl", hash = "sha256:0ccc0edbb17021004356ae6e37887528b6e59e6ae6283f3917b9759a5887203b"}, +] + +[package.dependencies] +bitarray = ">=2.4.0,<3" +eth-abi = ">=3.0.1" +eth-keyfile = ">=0.6.0,<0.7.0" +eth-keys = ">=0.4.0,<0.5" +eth-rlp = ">=0.3.0,<1" +eth-utils = ">=2.0.0,<3" +hexbytes = ">=0.1.0,<1" +rlp = ">=1.0.0,<4" + +[package.extras] +dev = ["Sphinx (>=1.6.5,<5)", "black (>=22,<23)", "bumpversion (>=0.5.3,<1)", "coverage", "flake8 (==3.7.9)", "hypothesis (>=4.18.0,<5)", "ipython", "isort (>=4.2.15,<5)", "jinja2 (>=3.0.0,<3.1.0)", "mypy (==0.910)", "pydocstyle (>=5.0.0,<6)", "pytest (>=6.2.5,<7)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=21,<22)", "tox (==3.25.0)", "twine", "wheel"] +doc = ["Sphinx (>=1.6.5,<5)", "jinja2 (>=3.0.0,<3.1.0)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=21,<22)"] +lint = ["black (>=22,<23)", "flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.910)", "pydocstyle (>=5.0.0,<6)"] +test = ["coverage", "hypothesis (>=4.18.0,<5)", "pytest (>=6.2.5,<7)", "pytest-xdist", "tox (==3.25.0)"] + +[[package]] +name = "eth-hash" +version = "0.5.2" +description = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" +optional = false +python-versions = ">=3.7, <4" +files = [ + {file = "eth-hash-0.5.2.tar.gz", hash = "sha256:1b5f10eca7765cc385e1430eefc5ced6e2e463bb18d1365510e2e539c1a6fe4e"}, + {file = "eth_hash-0.5.2-py3-none-any.whl", hash = "sha256:251f62f6579a1e247561679d78df37548bd5f59908da0b159982bf8293ad32f0"}, +] + +[package.dependencies] +pycryptodome = {version = ">=3.6.6,<4", optional = true, markers = "extra == \"pycryptodome\""} + +[package.extras] +dev = ["black (>=23)", "build (>=0.9.0)", "bumpversion (>=0.5.3)", "flake8 (==6.0.0)", "flake8-bugbear (==23.3.23)", "ipython", "isort (>=5.10.1)", "mypy (==0.971)", "pydocstyle (>=6.0.0)", "pytest (>=7.0.0)", "pytest-watch (>=4.1.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +doc = ["sphinx (>=6.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +lint = ["black (>=23)", "flake8 (==6.0.0)", "flake8-bugbear (==23.3.23)", "isort (>=5.10.1)", "mypy (==0.971)", "pydocstyle (>=6.0.0)"] +pycryptodome = ["pycryptodome (>=3.6.6,<4)"] +pysha3 = ["pysha3 (>=1.0.0,<2.0.0)", "safe-pysha3 (>=1.0.0)"] +test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] + +[[package]] +name = "eth-keyfile" +version = "0.6.1" +description = "A library for handling the encrypted keyfiles used to store ethereum private keys." +optional = false +python-versions = "*" +files = [ + {file = "eth-keyfile-0.6.1.tar.gz", hash = "sha256:471be6e5386fce7b22556b3d4bde5558dbce46d2674f00848027cb0a20abdc8c"}, + {file = "eth_keyfile-0.6.1-py3-none-any.whl", hash = "sha256:609773a1ad5956944a33348413cad366ec6986c53357a806528c8f61c4961560"}, +] + +[package.dependencies] +eth-keys = ">=0.4.0,<0.5.0" +eth-utils = ">=2,<3" +pycryptodome = ">=3.6.6,<4" + +[package.extras] +dev = ["bumpversion (>=0.5.3,<1)", "eth-keys (>=0.4.0,<0.5.0)", "eth-utils (>=2,<3)", "flake8 (==4.0.1)", "idna (==2.7)", "pluggy (>=1.0.0,<2)", "pycryptodome (>=3.6.6,<4)", "pytest (>=6.2.5,<7)", "requests (>=2.20,<3)", "setuptools (>=38.6.0)", "tox (>=2.7.0)", "twine", "wheel"] +keyfile = ["eth-keys (>=0.4.0,<0.5.0)", "eth-utils (>=2,<3)", "pycryptodome (>=3.6.6,<4)"] +lint = ["flake8 (==4.0.1)"] +test = ["pytest (>=6.2.5,<7)"] + +[[package]] +name = "eth-keys" +version = "0.4.0" +description = "Common API for Ethereum key operations." +optional = false +python-versions = "*" +files = [ + {file = "eth-keys-0.4.0.tar.gz", hash = "sha256:7d18887483bc9b8a3fdd8e32ddcb30044b9f08fcb24a380d93b6eee3a5bb3216"}, + {file = "eth_keys-0.4.0-py3-none-any.whl", hash = "sha256:e07915ffb91277803a28a379418bdd1fad1f390c38ad9353a0f189789a440d5d"}, +] + +[package.dependencies] +eth-typing = ">=3.0.0,<4" +eth-utils = ">=2.0.0,<3.0.0" + +[package.extras] +coincurve = ["coincurve (>=7.0.0,<16.0.0)"] +dev = ["asn1tools (>=0.146.2,<0.147)", "bumpversion (==0.5.3)", "eth-hash[pycryptodome]", "eth-hash[pysha3]", "eth-typing (>=3.0.0,<4)", "eth-utils (>=2.0.0,<3.0.0)", "factory-boy (>=3.0.1,<3.1)", "flake8 (==3.0.4)", "hypothesis (>=5.10.3,<6.0.0)", "mypy (==0.782)", "pyasn1 (>=0.4.5,<0.5)", "pytest (==6.2.5)", "tox (==3.20.0)", "twine"] +eth-keys = ["eth-typing (>=3.0.0,<4)", "eth-utils (>=2.0.0,<3.0.0)"] +lint = ["flake8 (==3.0.4)", "mypy (==0.782)"] +test = ["asn1tools (>=0.146.2,<0.147)", "eth-hash[pycryptodome]", "eth-hash[pysha3]", "factory-boy (>=3.0.1,<3.1)", "hypothesis (>=5.10.3,<6.0.0)", "pyasn1 (>=0.4.5,<0.5)", "pytest (==6.2.5)"] + +[[package]] +name = "eth-rlp" +version = "0.3.0" +description = "eth-rlp: RLP definitions for common Ethereum objects in Python" +optional = false +python-versions = ">=3.7, <4" +files = [ + {file = "eth-rlp-0.3.0.tar.gz", hash = "sha256:f3263b548df718855d9a8dbd754473f383c0efc82914b0b849572ce3e06e71a6"}, + {file = "eth_rlp-0.3.0-py3-none-any.whl", hash = "sha256:e88e949a533def85c69fa94224618bbbd6de00061f4cff645c44621dab11cf33"}, +] + +[package.dependencies] +eth-utils = ">=2.0.0,<3" +hexbytes = ">=0.1.0,<1" +rlp = ">=0.6.0,<4" + +[package.extras] +dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "eth-hash[pycryptodome]", "flake8 (==3.7.9)", "ipython", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=3.0.0,<4)", "pytest (>=6.2.5,<7)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=19.2.0,<20)", "tox (==3.14.6)", "twine", "wheel"] +doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=19.2.0,<20)"] +lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=3.0.0,<4)"] +test = ["eth-hash[pycryptodome]", "pytest (>=6.2.5,<7)", "pytest-xdist", "tox (==3.14.6)"] + +[[package]] +name = "eth-typing" +version = "3.4.0" +description = "eth-typing: Common type annotations for ethereum python packages" +optional = false +python-versions = ">=3.7.2, <4" +files = [ + {file = "eth-typing-3.4.0.tar.gz", hash = "sha256:7f49610469811ee97ac43eaf6baa294778ce74042d41e61ecf22e5ebe385590f"}, + {file = "eth_typing-3.4.0-py3-none-any.whl", hash = "sha256:347d50713dd58ab50063b228d8271624ab2de3071bfa32d467b05f0ea31ab4c5"}, +] + +[package.extras] +dev = ["black (>=23)", "build (>=0.9.0)", "bumpversion (>=0.5.3)", "flake8 (==6.0.0)", "flake8-bugbear (==23.3.23)", "ipython", "isort (>=5.10.1)", "mypy (==0.971)", "pydocstyle (>=6.0.0)", "pytest (>=7.0.0)", "pytest-watch (>=4.1.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +doc = ["sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +lint = ["black (>=23)", "flake8 (==6.0.0)", "flake8-bugbear (==23.3.23)", "isort (>=5.10.1)", "mypy (==0.971)", "pydocstyle (>=6.0.0)"] +test = ["pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] + +[[package]] +name = "eth-utils" +version = "2.2.1" +description = "eth-utils: Common utility functions for python code that interacts with Ethereum" +optional = false +python-versions = ">=3.7,<4" +files = [ + {file = "eth-utils-2.2.1.tar.gz", hash = "sha256:f79a95f86dd991344697c763db40271dbe43fbbcd5776f49b0c4fb7b645ee1c4"}, + {file = "eth_utils-2.2.1-py3-none-any.whl", hash = "sha256:60fc999c1b4ae011ab600b01a3eb5375156f3bc46e7cd1a83ca9e6e14bb9b13c"}, +] + +[package.dependencies] +cytoolz = {version = ">=0.10.1", markers = "implementation_name == \"cpython\""} +eth-hash = ">=0.3.1" +eth-typing = ">=3.0.0" +toolz = {version = ">0.8.2", markers = "implementation_name == \"pypy\""} + +[package.extras] +dev = ["black (>=23)", "build (>=0.9.0)", "bumpversion (>=0.5.3)", "eth-hash[pycryptodome]", "flake8 (==3.8.3)", "hypothesis (>=4.43.0)", "ipython", "isort (>=5.11.0)", "mypy (==0.971)", "pydocstyle (>=5.0.0)", "pytest (>=7.0.0)", "pytest-watch (>=4.1.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "types-setuptools", "wheel"] +doc = ["sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +lint = ["black (>=23)", "flake8 (==3.8.3)", "isort (>=5.11.0)", "mypy (==0.971)", "pydocstyle (>=5.0.0)", "types-setuptools"] +test = ["hypothesis (>=4.43.0)", "mypy (==0.971)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)", "types-setuptools"] + +[[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 = "filelock" +version = "3.12.4" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.12.4-py3-none-any.whl", hash = "sha256:08c21d87ded6e2b9da6728c3dff51baf1dcecf973b768ef35bcbc3447edb9ad4"}, + {file = "filelock-3.12.4.tar.gz", hash = "sha256:2e6f249f1f3654291606e046b09f1fd5eac39b360664c27f5aad072012f8bcbd"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "sphinx (>=7.1.2)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3)", "diff-cover (>=7.7)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)", "pytest-timeout (>=2.1)"] +typing = ["typing-extensions (>=4.7.1)"] + +[[package]] +name = "flake8" +version = "4.0.1" +description = "the modular source code checker: pep8 pyflakes and co" +optional = false +python-versions = ">=3.6" +files = [ + {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, + {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, +] + +[package.dependencies] +mccabe = ">=0.6.0,<0.7.0" +pycodestyle = ">=2.8.0,<2.9.0" +pyflakes = ">=2.4.0,<2.5.0" + +[[package]] +name = "flakeheaven" +version = "3.3.0" +description = "FlakeHeaven is a [Flake8](https://gitlab.com/pycqa/flake8) wrapper to make it cool." +optional = false +python-versions = ">=3.7,<4.0" +files = [ + {file = "flakeheaven-3.3.0-py3-none-any.whl", hash = "sha256:ae246197a178845b30b63fc03023f7ba925cc84cc96314ec19807dafcd6b39a3"}, + {file = "flakeheaven-3.3.0.tar.gz", hash = "sha256:eb07860e028ff8dd56cce742c4766624a37a4ce397fd34300254ab623d13047b"}, +] + +[package.dependencies] +colorama = "*" +entrypoints = "*" +flake8 = ">=4.0.1,<5.0.0" +pygments = "*" +toml = "*" +urllib3 = "*" + +[package.extras] +docs = ["alabaster", "myst-parser (>=0.18.0,<0.19.0)", "pygments-github-lexers", "sphinx"] + +[[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 = "grpcio" +version = "1.58.0" +description = "HTTP/2-based RPC framework" +optional = false +python-versions = ">=3.7" +files = [ + {file = "grpcio-1.58.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:3e6bebf1dfdbeb22afd95650e4f019219fef3ab86d3fca8ebade52e4bc39389a"}, + {file = "grpcio-1.58.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:cde11577d5b6fd73a00e6bfa3cf5f428f3f33c2d2878982369b5372bbc4acc60"}, + {file = "grpcio-1.58.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:a2d67ff99e70e86b2be46c1017ae40b4840d09467d5455b2708de6d4c127e143"}, + {file = "grpcio-1.58.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1ed979b273a81de36fc9c6716d9fb09dd3443efa18dcc8652501df11da9583e9"}, + {file = "grpcio-1.58.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:458899d2ebd55d5ca2350fd3826dfd8fcb11fe0f79828ae75e2b1e6051d50a29"}, + {file = "grpcio-1.58.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bc7ffef430b80345729ff0a6825e9d96ac87efe39216e87ac58c6c4ef400de93"}, + {file = "grpcio-1.58.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5b23d75e5173faa3d1296a7bedffb25afd2fddb607ef292dfc651490c7b53c3d"}, + {file = "grpcio-1.58.0-cp310-cp310-win32.whl", hash = "sha256:fad9295fe02455d4f158ad72c90ef8b4bcaadfdb5efb5795f7ab0786ad67dd58"}, + {file = "grpcio-1.58.0-cp310-cp310-win_amd64.whl", hash = "sha256:bc325fed4d074367bebd465a20763586e5e1ed5b943e9d8bc7c162b1f44fd602"}, + {file = "grpcio-1.58.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:652978551af02373a5a313e07bfef368f406b5929cf2d50fa7e4027f913dbdb4"}, + {file = "grpcio-1.58.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:9f13a171281ebb4d7b1ba9f06574bce2455dcd3f2f6d1fbe0fd0d84615c74045"}, + {file = "grpcio-1.58.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:8774219e21b05f750eef8adc416e9431cf31b98f6ce9def288e4cea1548cbd22"}, + {file = "grpcio-1.58.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:09206106848462763f7f273ca93d2d2d4d26cab475089e0de830bb76be04e9e8"}, + {file = "grpcio-1.58.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:62831d5e251dd7561d9d9e83a0b8655084b2a1f8ea91e4bd6b3cedfefd32c9d2"}, + {file = "grpcio-1.58.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:212f38c6a156862098f6bdc9a79bf850760a751d259d8f8f249fc6d645105855"}, + {file = "grpcio-1.58.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:4b12754af201bb993e6e2efd7812085ddaaef21d0a6f0ff128b97de1ef55aa4a"}, + {file = "grpcio-1.58.0-cp311-cp311-win32.whl", hash = "sha256:3886b4d56bd4afeac518dbc05933926198aa967a7d1d237a318e6fbc47141577"}, + {file = "grpcio-1.58.0-cp311-cp311-win_amd64.whl", hash = "sha256:002f228d197fea12797a14e152447044e14fb4fdb2eb5d6cfa496f29ddbf79ef"}, + {file = "grpcio-1.58.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:b5e8db0aff0a4819946215f156bd722b6f6c8320eb8419567ffc74850c9fd205"}, + {file = "grpcio-1.58.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:201e550b7e2ede113b63e718e7ece93cef5b0fbf3c45e8fe4541a5a4305acd15"}, + {file = "grpcio-1.58.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:d79b660681eb9bc66cc7cbf78d1b1b9e335ee56f6ea1755d34a31108b80bd3c8"}, + {file = "grpcio-1.58.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ef8d4a76d2c7d8065aba829f8d0bc0055495c998dce1964ca5b302d02514fb3"}, + {file = "grpcio-1.58.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6cba491c638c76d3dc6c191d9c75041ca5b8f5c6de4b8327ecdcab527f130bb4"}, + {file = "grpcio-1.58.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:6801ff6652ecd2aae08ef994a3e49ff53de29e69e9cd0fd604a79ae4e545a95c"}, + {file = "grpcio-1.58.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:24edec346e69e672daf12b2c88e95c6f737f3792d08866101d8c5f34370c54fd"}, + {file = "grpcio-1.58.0-cp37-cp37m-win_amd64.whl", hash = "sha256:7e473a7abad9af48e3ab5f3b5d237d18208024d28ead65a459bd720401bd2f8f"}, + {file = "grpcio-1.58.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:4891bbb4bba58acd1d620759b3be11245bfe715eb67a4864c8937b855b7ed7fa"}, + {file = "grpcio-1.58.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:e9f995a8a421405958ff30599b4d0eec244f28edc760de82f0412c71c61763d2"}, + {file = "grpcio-1.58.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:2f85f87e2f087d9f632c085b37440a3169fda9cdde80cb84057c2fc292f8cbdf"}, + {file = "grpcio-1.58.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb6b92036ff312d5b4182fa72e8735d17aceca74d0d908a7f08e375456f03e07"}, + {file = "grpcio-1.58.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d81c2b2b24c32139dd2536972f1060678c6b9fbd106842a9fcdecf07b233eccd"}, + {file = "grpcio-1.58.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:fbcecb6aedd5c1891db1d70efbfbdc126c986645b5dd616a045c07d6bd2dfa86"}, + {file = "grpcio-1.58.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:92ae871a902cf19833328bd6498ec007b265aabf2fda845ab5bd10abcaf4c8c6"}, + {file = "grpcio-1.58.0-cp38-cp38-win32.whl", hash = "sha256:dc72e04620d49d3007771c0e0348deb23ca341c0245d610605dddb4ac65a37cb"}, + {file = "grpcio-1.58.0-cp38-cp38-win_amd64.whl", hash = "sha256:1c1c5238c6072470c7f1614bf7c774ffde6b346a100521de9ce791d1e4453afe"}, + {file = "grpcio-1.58.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:fe643af248442221db027da43ed43e53b73e11f40c9043738de9a2b4b6ca7697"}, + {file = "grpcio-1.58.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:128eb1f8e70676d05b1b0c8e6600320fc222b3f8c985a92224248b1367122188"}, + {file = "grpcio-1.58.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:039003a5e0ae7d41c86c768ef8b3ee2c558aa0a23cf04bf3c23567f37befa092"}, + {file = "grpcio-1.58.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8f061722cad3f9aabb3fbb27f3484ec9d4667b7328d1a7800c3c691a98f16bb0"}, + {file = "grpcio-1.58.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba0af11938acf8cd4cf815c46156bcde36fa5850518120920d52620cc3ec1830"}, + {file = "grpcio-1.58.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d4cef77ad2fed42b1ba9143465856d7e737279854e444925d5ba45fc1f3ba727"}, + {file = "grpcio-1.58.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:24765a627eb4d9288ace32d5104161c3654128fe27f2808ecd6e9b0cfa7fc8b9"}, + {file = "grpcio-1.58.0-cp39-cp39-win32.whl", hash = "sha256:f0241f7eb0d2303a545136c59bc565a35c4fc3b924ccbd69cb482f4828d6f31c"}, + {file = "grpcio-1.58.0-cp39-cp39-win_amd64.whl", hash = "sha256:dcfba7befe3a55dab6fe1eb7fc9359dc0c7f7272b30a70ae0af5d5b063842f28"}, + {file = "grpcio-1.58.0.tar.gz", hash = "sha256:532410c51ccd851b706d1fbc00a87be0f5312bd6f8e5dbf89d4e99c7f79d7499"}, +] + +[package.extras] +protobuf = ["grpcio-tools (>=1.58.0)"] + +[[package]] +name = "grpcio-tools" +version = "1.58.0" +description = "Protobuf code generator for gRPC" +optional = false +python-versions = ">=3.7" +files = [ + {file = "grpcio-tools-1.58.0.tar.gz", hash = "sha256:6f4d80ceb591e31ca4dceec747dbe56132e1392a0a9bb1c8fe001d1b5cac898a"}, + {file = "grpcio_tools-1.58.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:60c874908f3b40f32f1bb0221f7b3ab65ecb53a4d0a9f0a394f031f1b292c177"}, + {file = "grpcio_tools-1.58.0-cp310-cp310-macosx_12_0_universal2.whl", hash = "sha256:1852e798f31e5437ca7b37abc910e028b34732fb19364862cedb87b1dab66fad"}, + {file = "grpcio_tools-1.58.0-cp310-cp310-manylinux_2_17_aarch64.whl", hash = "sha256:149fb48f53cb691a6328f68bed8e4036c730f7106b7f98e92c2c0403f0b9e93c"}, + {file = "grpcio_tools-1.58.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba3d383e5ca93826038b70f326fce8e8d12dd9b2f64d363a3d612f7475f12dd2"}, + {file = "grpcio_tools-1.58.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6997511e9d2979f7a2389479682dbb06823f21a904e8fb0a5c6baaf1b4b4a863"}, + {file = "grpcio_tools-1.58.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:8de0b701da479643f71fad71fe66885cddd89441ae16e2c724939b47742dc72e"}, + {file = "grpcio_tools-1.58.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:43cc23908b63fcaefe690b10f68a2d8652c994b5b36ab77d2271d9608c895320"}, + {file = "grpcio_tools-1.58.0-cp310-cp310-win32.whl", hash = "sha256:2c2221123d010dc6231799e63a37f2f4786bf614ef65b23009c387cd20d8b193"}, + {file = "grpcio_tools-1.58.0-cp310-cp310-win_amd64.whl", hash = "sha256:df2788736bdf58abe7b0e4d6b1ff806f7686c98c5ad900da312252e3322d91c4"}, + {file = "grpcio_tools-1.58.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:b6ea5578712cdb29b0ff60bfc6405bf0e8d681b9c71d106dd1cda54fe7fe4e55"}, + {file = "grpcio_tools-1.58.0-cp311-cp311-macosx_10_10_universal2.whl", hash = "sha256:c29880f491581c83181c0a84a4d11402af2b13166a5266f64e246adf1da7aa66"}, + {file = "grpcio_tools-1.58.0-cp311-cp311-manylinux_2_17_aarch64.whl", hash = "sha256:32d51e933c3565414dd0835f930bb28a1cdeba435d9d2c87fa3cf8b1d284db3c"}, + {file = "grpcio_tools-1.58.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ad9d77f25514584b1ddc981d70c9e50dfcfc388aa5ba943eee67520c5267ed9"}, + {file = "grpcio_tools-1.58.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4882382631e6352819059278a5c878ce0b067008dd490911d16d5616e8a36d85"}, + {file = "grpcio_tools-1.58.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:d84091a189d848d94645b7c48b61734c12ec03b0d46e5fc0049343a26989ac5c"}, + {file = "grpcio_tools-1.58.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:85ac28a9621e9b92a3fc416288c4ce45542db0b4c31b3e23031dd8e0a0ec5590"}, + {file = "grpcio_tools-1.58.0-cp311-cp311-win32.whl", hash = "sha256:7371d8ea80234b29affec145e25569523f549520ed7e53b2aa92bed412cdecfd"}, + {file = "grpcio_tools-1.58.0-cp311-cp311-win_amd64.whl", hash = "sha256:6997df6e7c5cf4d3ddc764240c1ff6a04b45d70ec28913b38fbc6396ef743e12"}, + {file = "grpcio_tools-1.58.0-cp37-cp37m-linux_armv7l.whl", hash = "sha256:ac65b8d6e3acaf88b815edf9af88ff844b6600ff3d2591c05ba4f655b45d5fb4"}, + {file = "grpcio_tools-1.58.0-cp37-cp37m-macosx_10_10_universal2.whl", hash = "sha256:88e8191d0dd789bebf42533808728f5ce75d2c51e2a72bdf20abe5b5e3fbec42"}, + {file = "grpcio_tools-1.58.0-cp37-cp37m-manylinux_2_17_aarch64.whl", hash = "sha256:a3dbece2a121761499a659b799979d4b738586d1065439053de553773eee11ca"}, + {file = "grpcio_tools-1.58.0-cp37-cp37m-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1086fe240c4c879b9721952b47d46996deb283c2d9355a8dc24a804811aacf70"}, + {file = "grpcio_tools-1.58.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7ae3dca059d5b358dd03fb63277428fa7d771605d4074a019138dd38d70719a"}, + {file = "grpcio_tools-1.58.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3f8904ac7fc3da2e874f00b3a986e8b7e004f499344a8e7eb213c26dfb025041"}, + {file = "grpcio_tools-1.58.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:aadbd8393ae332e49731adb31e741f2e689989150569b7acc939f5ea43124e2d"}, + {file = "grpcio_tools-1.58.0-cp37-cp37m-win_amd64.whl", hash = "sha256:1cb6e24194786687d4f23c64de1f0ce553af51de22746911bc37340f85f9783e"}, + {file = "grpcio_tools-1.58.0-cp38-cp38-linux_armv7l.whl", hash = "sha256:6ec43909095c630df3e479e77469bdad367067431f4af602f6ccb978a3b78afd"}, + {file = "grpcio_tools-1.58.0-cp38-cp38-macosx_10_10_universal2.whl", hash = "sha256:4be49ed320b0ebcbc21d19ef555fbf229c1c452105522b728e1171ee2052078e"}, + {file = "grpcio_tools-1.58.0-cp38-cp38-manylinux_2_17_aarch64.whl", hash = "sha256:28eefebddec3d3adf19baca78f8b82a2287d358e1b1575ae018cdca8eacc6269"}, + {file = "grpcio_tools-1.58.0-cp38-cp38-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2ef8c696e9d78676cc3f583a92bbbf2c84e94e350f7ad22f150a52559f4599d1"}, + {file = "grpcio_tools-1.58.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9aeb5949e46558d21c51fd3ec3eeecc59c94dbca76c67c0a80d3da6b7437930c"}, + {file = "grpcio_tools-1.58.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:6f7144aad9396d35fb1b80429600a970b559c2ad4d07020eeb180fe83cea2bee"}, + {file = "grpcio_tools-1.58.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:4ee26e9253a721fff355737649678535f76cf5d642aa3ac0cd937832559b90af"}, + {file = "grpcio_tools-1.58.0-cp38-cp38-win32.whl", hash = "sha256:343f572312039059a8797d6e29a7fc62196e73131ab01755660a9d48202267c1"}, + {file = "grpcio_tools-1.58.0-cp38-cp38-win_amd64.whl", hash = "sha256:cd7acfbb43b7338a78cf4a67528d05530d574d92b7c829d185b78dfc451d158f"}, + {file = "grpcio_tools-1.58.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:46628247fbce86d18232eead24bd22ed0826c79f3fe2fc2fbdbde45971361049"}, + {file = "grpcio_tools-1.58.0-cp39-cp39-macosx_10_10_universal2.whl", hash = "sha256:51587842a54e025a3d0d37afcf4ef2b7ac1def9a5d17448665cb424b53d6c287"}, + {file = "grpcio_tools-1.58.0-cp39-cp39-manylinux_2_17_aarch64.whl", hash = "sha256:a062ae3072a2a39a3c057f4d68b57b021f1dd2956cd09aab39709f6af494e1de"}, + {file = "grpcio_tools-1.58.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eec3c93a08df11c80ef1c29a616bcbb0d83dbc6ea41b48306fcacc720416dfa7"}, + {file = "grpcio_tools-1.58.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b63f823ac991ff77104da614d2a2485a59d37d57830eb2e387a6e2a3edc7fa2b"}, + {file = "grpcio_tools-1.58.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:579c11a9f198847ed48dbc4f211c67fe96a73320b87c81f01b044b72e24a7d77"}, + {file = "grpcio_tools-1.58.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6ca2fc1dd8049d417a5034d944c9df05cee76f855b3e431627ab4292e7c01c47"}, + {file = "grpcio_tools-1.58.0-cp39-cp39-win32.whl", hash = "sha256:453023120114c35d3d9d6717ea0820e5d5c140f51f9d0b621de4397ff854471b"}, + {file = "grpcio_tools-1.58.0-cp39-cp39-win_amd64.whl", hash = "sha256:b6c896f1df99c35cf062d4803c15663ff00a33ff09add28baa6e475cf6b5e258"}, +] + +[package.dependencies] +grpcio = ">=1.58.0" +protobuf = ">=4.21.6,<5.0dev" +setuptools = "*" + +[[package]] +name = "hdwallets" +version = "0.1.2" +description = "Python implementation of the BIP32 key derivation scheme" +optional = false +python-versions = ">=3.6" +files = [ + {file = "hdwallets-0.1.2-py3-none-any.whl", hash = "sha256:455b55b061f2b356a93e305b0c2263a6007d2ed45e48749975f09308499a2fdb"}, + {file = "hdwallets-0.1.2.tar.gz", hash = "sha256:c85d08b59c3fd3bc5b29398583d7d7dc46f95456f69ff15a3ab0353084ee7529"}, +] + +[package.dependencies] +ecdsa = ">=0.14.0" + +[[package]] +name = "hexbytes" +version = "0.3.1" +description = "hexbytes: Python `bytes` subclass that decodes hex, with a readable console output" +optional = false +python-versions = ">=3.7, <4" +files = [ + {file = "hexbytes-0.3.1-py3-none-any.whl", hash = "sha256:383595ad75026cf00abd570f44b368c6cdac0c6becfae5c39ff88829877f8a59"}, + {file = "hexbytes-0.3.1.tar.gz", hash = "sha256:a3fe35c6831ee8fafd048c4c086b986075fc14fd46258fa24ecb8d65745f9a9d"}, +] + +[package.extras] +dev = ["black (>=22)", "bumpversion (>=0.5.3)", "eth-utils (>=1.0.1,<3)", "flake8 (==6.0.0)", "flake8-bugbear (==23.3.23)", "hypothesis (>=3.44.24,<=6.31.6)", "ipython", "isort (>=5.10.1)", "mypy (==0.971)", "pydocstyle (>=5.0.0)", "pytest (>=7.0.0)", "pytest-watch (>=4.1.0)", "pytest-xdist (>=2.4.0)", "sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=4.0.0)", "twine", "wheel"] +doc = ["sphinx (>=5.0.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +lint = ["black (>=22)", "flake8 (==6.0.0)", "flake8-bugbear (==23.3.23)", "isort (>=5.10.1)", "mypy (==0.971)", "pydocstyle (>=5.0.0)"] +test = ["eth-utils (>=1.0.1,<3)", "hypothesis (>=3.44.24,<=6.31.6)", "pytest (>=7.0.0)", "pytest-xdist (>=2.4.0)"] + +[[package]] +name = "identify" +version = "2.5.29" +description = "File identification library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "identify-2.5.29-py2.py3-none-any.whl", hash = "sha256:24437fbf6f4d3fe6efd0eb9d67e24dd9106db99af5ceb27996a5f7895f24bf1b"}, + {file = "identify-2.5.29.tar.gz", hash = "sha256:d43d52b86b15918c137e3a74fff5224f60385cd0e9c38e99d07c257f02f151a5"}, +] + +[package.extras] +license = ["ukkonen"] + +[[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 = "isort" +version = "5.12.0" +description = "A Python utility / library to sort Python imports." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "isort-5.12.0-py3-none-any.whl", hash = "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6"}, + {file = "isort-5.12.0.tar.gz", hash = "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504"}, +] + +[package.extras] +colors = ["colorama (>=0.4.3)"] +pipfile-deprecated-finder = ["pip-shims (>=0.5.2)", "pipreqs", "requirementslib"] +plugins = ["setuptools"] +requirements-deprecated-finder = ["pip-api", "pipreqs"] + +[[package]] +name = "jsonschema" +version = "4.19.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.19.0-py3-none-any.whl", hash = "sha256:043dc26a3845ff09d20e4420d6012a9c91c9aa8999fa184e7efcfeccb41e32cb"}, + {file = "jsonschema-4.19.0.tar.gz", hash = "sha256:6e1e7569ac13be8139b2dd2c21a55d350066ee3f80df06c608b398cdc6f30e8f"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +jsonschema-specifications = ">=2023.03.6" +referencing = ">=0.28.4" +rpds-py = ">=0.7.1" + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.7.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.7.1-py3-none-any.whl", hash = "sha256:05adf340b659828a004220a9613be00fa3f223f2b82002e273dee62fd50524b1"}, + {file = "jsonschema_specifications-2023.7.1.tar.gz", hash = "sha256:c91a50404e88a1f6ba40636778e2ee08f6e24c5613fe4c53ac24578a5a7f72bb"}, +] + +[package.dependencies] +referencing = ">=0.28.0" + +[[package]] +name = "lru-dict" +version = "1.2.0" +description = "An Dict like LRU container." +optional = false +python-versions = "*" +files = [ + {file = "lru-dict-1.2.0.tar.gz", hash = "sha256:13c56782f19d68ddf4d8db0170041192859616514c706b126d0df2ec72a11bd7"}, + {file = "lru_dict-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:de906e5486b5c053d15b7731583c25e3c9147c288ac8152a6d1f9bccdec72641"}, + {file = "lru_dict-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:604d07c7604b20b3130405d137cae61579578b0e8377daae4125098feebcb970"}, + {file = "lru_dict-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:203b3e78d03d88f491fa134f85a42919020686b6e6f2d09759b2f5517260c651"}, + {file = "lru_dict-1.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:020b93870f8c7195774cbd94f033b96c14f51c57537969965c3af300331724fe"}, + {file = "lru_dict-1.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1184d91cfebd5d1e659d47f17a60185bbf621635ca56dcdc46c6a1745d25df5c"}, + {file = "lru_dict-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fc42882b554a86e564e0b662da47b8a4b32fa966920bd165e27bb8079a323bc1"}, + {file = "lru_dict-1.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:18ee88ada65bd2ffd483023be0fa1c0a6a051ef666d1cd89e921dcce134149f2"}, + {file = "lru_dict-1.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:756230c22257597b7557eaef7f90484c489e9ba78e5bb6ab5a5bcfb6b03cb075"}, + {file = "lru_dict-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c4da599af36618881748b5db457d937955bb2b4800db891647d46767d636c408"}, + {file = "lru_dict-1.2.0-cp310-cp310-win32.whl", hash = "sha256:35a142a7d1a4fd5d5799cc4f8ab2fff50a598d8cee1d1c611f50722b3e27874f"}, + {file = "lru_dict-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:6da5b8099766c4da3bf1ed6e7d7f5eff1681aff6b5987d1258a13bd2ed54f0c9"}, + {file = "lru_dict-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b20b7c9beb481e92e07368ebfaa363ed7ef61e65ffe6e0edbdbaceb33e134124"}, + {file = "lru_dict-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22147367b296be31cc858bf167c448af02435cac44806b228c9be8117f1bfce4"}, + {file = "lru_dict-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:34a3091abeb95e707f381a8b5b7dc8e4ee016316c659c49b726857b0d6d1bd7a"}, + {file = "lru_dict-1.2.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:877801a20f05c467126b55338a4e9fa30e2a141eb7b0b740794571b7d619ee11"}, + {file = "lru_dict-1.2.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d3336e901acec897bcd318c42c2b93d5f1d038e67688f497045fc6bad2c0be7"}, + {file = "lru_dict-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:8dafc481d2defb381f19b22cc51837e8a42631e98e34b9e0892245cc96593deb"}, + {file = "lru_dict-1.2.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:87bbad3f5c3de8897b8c1263a9af73bbb6469fb90e7b57225dad89b8ef62cd8d"}, + {file = "lru_dict-1.2.0-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:25f9e0bc2fe8f41c2711ccefd2871f8a5f50a39e6293b68c3dec576112937aad"}, + {file = "lru_dict-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ae301c282a499dc1968dd633cfef8771dd84228ae9d40002a3ea990e4ff0c469"}, + {file = "lru_dict-1.2.0-cp311-cp311-win32.whl", hash = "sha256:c9617583173a29048e11397f165501edc5ae223504a404b2532a212a71ecc9ed"}, + {file = "lru_dict-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6b7a031e47421d4b7aa626b8c91c180a9f037f89e5d0a71c4bb7afcf4036c774"}, + {file = "lru_dict-1.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ea2ac3f7a7a2f32f194c84d82a034e66780057fd908b421becd2f173504d040e"}, + {file = "lru_dict-1.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cd46c94966f631a81ffe33eee928db58e9fbee15baba5923d284aeadc0e0fa76"}, + {file = "lru_dict-1.2.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:086ce993414f0b28530ded7e004c77dc57c5748fa6da488602aa6e7f79e6210e"}, + {file = "lru_dict-1.2.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df25a426446197488a6702954dcc1de511deee20c9db730499a2aa83fddf0df1"}, + {file = "lru_dict-1.2.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c53b12b89bd7a6c79f0536ff0d0a84fdf4ab5f6252d94b24b9b753bd9ada2ddf"}, + {file = "lru_dict-1.2.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:f9484016e6765bd295708cccc9def49f708ce07ac003808f69efa386633affb9"}, + {file = "lru_dict-1.2.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:d0f7ec902a0097ac39f1922c89be9eaccf00eb87751e28915320b4f72912d057"}, + {file = "lru_dict-1.2.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:981ef3edc82da38d39eb60eae225b88a538d47b90cce2e5808846fd2cf64384b"}, + {file = "lru_dict-1.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:e25b2e90a032dc248213af7f3f3e975e1934b204f3b16aeeaeaff27a3b65e128"}, + {file = "lru_dict-1.2.0-cp36-cp36m-win32.whl", hash = "sha256:59f3df78e94e07959f17764e7fa7ca6b54e9296953d2626a112eab08e1beb2db"}, + {file = "lru_dict-1.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:de24b47159e07833aeab517d9cb1c3c5c2d6445cc378b1c2f1d8d15fb4841d63"}, + {file = "lru_dict-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d0dd4cd58220351233002f910e35cc01d30337696b55c6578f71318b137770f9"}, + {file = "lru_dict-1.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a87bdc291718bbdf9ea4be12ae7af26cbf0706fa62c2ac332748e3116c5510a7"}, + {file = "lru_dict-1.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:05fb8744f91f58479cbe07ed80ada6696ec7df21ea1740891d4107a8dd99a970"}, + {file = "lru_dict-1.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:00f6e8a3fc91481b40395316a14c94daa0f0a5de62e7e01a7d589f8d29224052"}, + {file = "lru_dict-1.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5b172fce0a0ffc0fa6d282c14256d5a68b5db1e64719c2915e69084c4b6bf555"}, + {file = "lru_dict-1.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:e707d93bae8f0a14e6df1ae8b0f076532b35f00e691995f33132d806a88e5c18"}, + {file = "lru_dict-1.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b9ec7a4a0d6b8297102aa56758434fb1fca276a82ed7362e37817407185c3abb"}, + {file = "lru_dict-1.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:f404dcc8172da1f28da9b1f0087009578e608a4899b96d244925c4f463201f2a"}, + {file = "lru_dict-1.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:1171ad3bff32aa8086778be4a3bdff595cc2692e78685bcce9cb06b96b22dcc2"}, + {file = "lru_dict-1.2.0-cp37-cp37m-win32.whl", hash = "sha256:0c316dfa3897fabaa1fe08aae89352a3b109e5f88b25529bc01e98ac029bf878"}, + {file = "lru_dict-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:5919dd04446bc1ee8d6ecda2187deeebfff5903538ae71083e069bc678599446"}, + {file = "lru_dict-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fbf36c5a220a85187cacc1fcb7dd87070e04b5fc28df7a43f6842f7c8224a388"}, + {file = "lru_dict-1.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:712e71b64da181e1c0a2eaa76cd860265980cd15cb0e0498602b8aa35d5db9f8"}, + {file = "lru_dict-1.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f54908bf91280a9b8fa6a8c8f3c2f65850ce6acae2852bbe292391628ebca42f"}, + {file = "lru_dict-1.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3838e33710935da2ade1dd404a8b936d571e29268a70ff4ca5ba758abb3850df"}, + {file = "lru_dict-1.2.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5d5a5f976b39af73324f2b793862859902ccb9542621856d51a5993064f25e4"}, + {file = "lru_dict-1.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8bda3a9afd241ee0181661decaae25e5336ce513ac268ab57da737eacaa7871f"}, + {file = "lru_dict-1.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:bd2cd1b998ea4c8c1dad829fc4fa88aeed4dee555b5e03c132fc618e6123f168"}, + {file = "lru_dict-1.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:b55753ee23028ba8644fd22e50de7b8f85fa60b562a0fafaad788701d6131ff8"}, + {file = "lru_dict-1.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7e51fa6a203fa91d415f3b2900e5748ec8e06ad75777c98cc3aeb3983ca416d7"}, + {file = "lru_dict-1.2.0-cp38-cp38-win32.whl", hash = "sha256:cd6806313606559e6c7adfa0dbeb30fc5ab625f00958c3d93f84831e7a32b71e"}, + {file = "lru_dict-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:5d90a70c53b0566084447c3ef9374cc5a9be886e867b36f89495f211baabd322"}, + {file = "lru_dict-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3ea7571b6bf2090a85ff037e6593bbafe1a8598d5c3b4560eb56187bcccb4dc"}, + {file = "lru_dict-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:287c2115a59c1c9ed0d5d8ae7671e594b1206c36ea9df2fca6b17b86c468ff99"}, + {file = "lru_dict-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5ccfd2291c93746a286c87c3f895165b697399969d24c54804ec3ec559d4e43"}, + {file = "lru_dict-1.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b710f0f4d7ec4f9fa89dfde7002f80bcd77de8024017e70706b0911ea086e2ef"}, + {file = "lru_dict-1.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5345bf50e127bd2767e9fd42393635bbc0146eac01f6baf6ef12c332d1a6a329"}, + {file = "lru_dict-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:291d13f85224551913a78fe695cde04cbca9dcb1d84c540167c443eb913603c9"}, + {file = "lru_dict-1.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:d5bb41bc74b321789803d45b124fc2145c1b3353b4ad43296d9d1d242574969b"}, + {file = "lru_dict-1.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:0facf49b053bf4926d92d8d5a46fe07eecd2af0441add0182c7432d53d6da667"}, + {file = "lru_dict-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:987b73a06bcf5a95d7dc296241c6b1f9bc6cda42586948c9dabf386dc2bef1cd"}, + {file = "lru_dict-1.2.0-cp39-cp39-win32.whl", hash = "sha256:231d7608f029dda42f9610e5723614a35b1fff035a8060cf7d2be19f1711ace8"}, + {file = "lru_dict-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:71da89e134747e20ed5b8ad5b4ee93fc5b31022c2b71e8176e73c5a44699061b"}, + {file = "lru_dict-1.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:21b3090928c7b6cec509e755cc3ab742154b33660a9b433923bd12c37c448e3e"}, + {file = "lru_dict-1.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aaecd7085212d0aa4cd855f38b9d61803d6509731138bf798a9594745953245b"}, + {file = "lru_dict-1.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ead83ac59a29d6439ddff46e205ce32f8b7f71a6bd8062347f77e232825e3d0a"}, + {file = "lru_dict-1.2.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:312b6b2a30188586fe71358f0f33e4bac882d33f5e5019b26f084363f42f986f"}, + {file = "lru_dict-1.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:b30122e098c80e36d0117810d46459a46313421ce3298709170b687dc1240b02"}, + {file = "lru_dict-1.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f010cfad3ab10676e44dc72a813c968cd586f37b466d27cde73d1f7f1ba158c2"}, + {file = "lru_dict-1.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20f5f411f7751ad9a2c02e80287cedf69ae032edd321fe696e310d32dd30a1f8"}, + {file = "lru_dict-1.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:afdadd73304c9befaed02eb42f5f09fdc16288de0a08b32b8080f0f0f6350aa6"}, + {file = "lru_dict-1.2.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7ab0c10c4fa99dc9e26b04e6b62ac32d2bcaea3aad9b81ec8ce9a7aa32b7b1b"}, + {file = "lru_dict-1.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:edad398d5d402c43d2adada390dd83c74e46e020945ff4df801166047013617e"}, + {file = "lru_dict-1.2.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:91d577a11b84387013815b1ad0bb6e604558d646003b44c92b3ddf886ad0f879"}, + {file = "lru_dict-1.2.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb12f19cdf9c4f2d9aa259562e19b188ff34afab28dd9509ff32a3f1c2c29326"}, + {file = "lru_dict-1.2.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e4c85aa8844bdca3c8abac3b7f78da1531c74e9f8b3e4890c6e6d86a5a3f6c0"}, + {file = "lru_dict-1.2.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5c6acbd097b15bead4de8e83e8a1030bb4d8257723669097eac643a301a952f0"}, + {file = "lru_dict-1.2.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:b6613daa851745dd22b860651de930275be9d3e9373283a2164992abacb75b62"}, +] + +[package.extras] +test = ["pytest"] + +[[package]] +name = "mccabe" +version = "0.6.1" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = "*" +files = [ + {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, + {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, +] + +[[package]] +name = "mnemonic" +version = "0.20" +description = "Implementation of Bitcoin BIP-0039" +optional = false +python-versions = ">=3.5" +files = [ + {file = "mnemonic-0.20-py3-none-any.whl", hash = "sha256:acd2168872d0379e7a10873bb3e12bf6c91b35de758135c4fbd1015ef18fafc5"}, + {file = "mnemonic-0.20.tar.gz", hash = "sha256:7c6fb5639d779388027a77944680aee4870f0fcd09b1e42a5525ee2ce4c625f6"}, +] + +[[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-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 = "nodeenv" +version = "1.8.0" +description = "Node.js virtual environment builder" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] + +[package.dependencies] +setuptools = "*" + +[[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 = "parsimonious" +version = "0.9.0" +description = "(Soon to be) the fastest pure-Python PEG parser I could muster" +optional = false +python-versions = "*" +files = [ + {file = "parsimonious-0.9.0.tar.gz", hash = "sha256:b2ad1ae63a2f65bd78f5e0a8ac510a98f3607a43f1db2a8d46636a5d9e4a30c1"}, +] + +[package.dependencies] +regex = ">=2022.3.15" + +[[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 = "platformdirs" +version = "3.10.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.7" +files = [ + {file = "platformdirs-3.10.0-py3-none-any.whl", hash = "sha256:d7c24979f292f916dc9cbf8648319032f551ea8c49a4c9bf2fb556a02070ec1d"}, + {file = "platformdirs-3.10.0.tar.gz", hash = "sha256:b45696dab2d7cc691a3226759c0d3b00c47c8b6e293d96f6436f733303f77f6d"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] + +[[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 = "pre-commit" +version = "3.4.0" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pre_commit-3.4.0-py2.py3-none-any.whl", hash = "sha256:96d529a951f8b677f730a7212442027e8ba53f9b04d217c4c67dc56c393ad945"}, + {file = "pre_commit-3.4.0.tar.gz", hash = "sha256:6bbd5129a64cad4c0dfaeeb12cd8f7ea7e15b77028d985341478c8af3c759522"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "protobuf" +version = "4.24.3" +description = "" +optional = false +python-versions = ">=3.7" +files = [ + {file = "protobuf-4.24.3-cp310-abi3-win32.whl", hash = "sha256:20651f11b6adc70c0f29efbe8f4a94a74caf61b6200472a9aea6e19898f9fcf4"}, + {file = "protobuf-4.24.3-cp310-abi3-win_amd64.whl", hash = "sha256:3d42e9e4796a811478c783ef63dc85b5a104b44aaaca85d4864d5b886e4b05e3"}, + {file = "protobuf-4.24.3-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:6e514e8af0045be2b56e56ae1bb14f43ce7ffa0f68b1c793670ccbe2c4fc7d2b"}, + {file = "protobuf-4.24.3-cp37-abi3-manylinux2014_aarch64.whl", hash = "sha256:ba53c2f04798a326774f0e53b9c759eaef4f6a568ea7072ec6629851c8435959"}, + {file = "protobuf-4.24.3-cp37-abi3-manylinux2014_x86_64.whl", hash = "sha256:f6ccbcf027761a2978c1406070c3788f6de4a4b2cc20800cc03d52df716ad675"}, + {file = "protobuf-4.24.3-cp37-cp37m-win32.whl", hash = "sha256:1b182c7181a2891e8f7f3a1b5242e4ec54d1f42582485a896e4de81aa17540c2"}, + {file = "protobuf-4.24.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b0271a701e6782880d65a308ba42bc43874dabd1a0a0f41f72d2dac3b57f8e76"}, + {file = "protobuf-4.24.3-cp38-cp38-win32.whl", hash = "sha256:e29d79c913f17a60cf17c626f1041e5288e9885c8579832580209de8b75f2a52"}, + {file = "protobuf-4.24.3-cp38-cp38-win_amd64.whl", hash = "sha256:067f750169bc644da2e1ef18c785e85071b7c296f14ac53e0900e605da588719"}, + {file = "protobuf-4.24.3-cp39-cp39-win32.whl", hash = "sha256:2da777d34b4f4f7613cdf85c70eb9a90b1fbef9d36ae4a0ccfe014b0b07906f1"}, + {file = "protobuf-4.24.3-cp39-cp39-win_amd64.whl", hash = "sha256:f631bb982c5478e0c1c70eab383af74a84be66945ebf5dd6b06fc90079668d0b"}, + {file = "protobuf-4.24.3-py3-none-any.whl", hash = "sha256:f6f8dc65625dadaad0c8545319c2e2f0424fede988368893ca3844261342c11a"}, + {file = "protobuf-4.24.3.tar.gz", hash = "sha256:12e9ad2ec079b833176d2921be2cb24281fa591f0b119b208b788adc48c2561d"}, +] + +[[package]] +name = "pycodestyle" +version = "2.8.0" +description = "Python style guide checker" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, + {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, +] + +[[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 = "pycryptodome" +version = "3.19.0" +description = "Cryptographic library for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodome-3.19.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3006c44c4946583b6de24fe0632091c2653d6256b99a02a3db71ca06472ea1e4"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:7c760c8a0479a4042111a8dd2f067d3ae4573da286c53f13cf6f5c53a5c1f631"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:08ce3558af5106c632baf6d331d261f02367a6bc3733086ae43c0f988fe042db"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45430dfaf1f421cf462c0dd824984378bef32b22669f2635cb809357dbaab405"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:a9bcd5f3794879e91970f2bbd7d899780541d3ff439d8f2112441769c9f2ccea"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-win32.whl", hash = "sha256:190c53f51e988dceb60472baddce3f289fa52b0ec38fbe5fd20dd1d0f795c551"}, + {file = "pycryptodome-3.19.0-cp27-cp27m-win_amd64.whl", hash = "sha256:22e0ae7c3a7f87dcdcf302db06ab76f20e83f09a6993c160b248d58274473bfa"}, + {file = "pycryptodome-3.19.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:7822f36d683f9ad7bc2145b2c2045014afdbbd1d9922a6d4ce1cbd6add79a01e"}, + {file = "pycryptodome-3.19.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:05e33267394aad6db6595c0ce9d427fe21552f5425e116a925455e099fdf759a"}, + {file = "pycryptodome-3.19.0-cp27-cp27mu-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:829b813b8ee00d9c8aba417621b94bc0b5efd18c928923802ad5ba4cf1ec709c"}, + {file = "pycryptodome-3.19.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:fc7a79590e2b5d08530175823a242de6790abc73638cc6dc9d2684e7be2f5e49"}, + {file = "pycryptodome-3.19.0-cp35-abi3-macosx_10_9_universal2.whl", hash = "sha256:542f99d5026ac5f0ef391ba0602f3d11beef8e65aae135fa5b762f5ebd9d3bfb"}, + {file = "pycryptodome-3.19.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:61bb3ccbf4bf32ad9af32da8badc24e888ae5231c617947e0f5401077f8b091f"}, + {file = "pycryptodome-3.19.0-cp35-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d49a6c715d8cceffedabb6adb7e0cbf41ae1a2ff4adaeec9432074a80627dea1"}, + {file = "pycryptodome-3.19.0-cp35-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e249a784cc98a29c77cea9df54284a44b40cafbfae57636dd2f8775b48af2434"}, + {file = "pycryptodome-3.19.0-cp35-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d033947e7fd3e2ba9a031cb2d267251620964705a013c5a461fa5233cc025270"}, + {file = "pycryptodome-3.19.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:84c3e4fffad0c4988aef0d5591be3cad4e10aa7db264c65fadbc633318d20bde"}, + {file = "pycryptodome-3.19.0-cp35-abi3-musllinux_1_1_i686.whl", hash = "sha256:139ae2c6161b9dd5d829c9645d781509a810ef50ea8b657e2257c25ca20efe33"}, + {file = "pycryptodome-3.19.0-cp35-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:5b1986c761258a5b4332a7f94a83f631c1ffca8747d75ab8395bf2e1b93283d9"}, + {file = "pycryptodome-3.19.0-cp35-abi3-win32.whl", hash = "sha256:536f676963662603f1f2e6ab01080c54d8cd20f34ec333dcb195306fa7826997"}, + {file = "pycryptodome-3.19.0-cp35-abi3-win_amd64.whl", hash = "sha256:04dd31d3b33a6b22ac4d432b3274588917dcf850cc0c51c84eca1d8ed6933810"}, + {file = "pycryptodome-3.19.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:8999316e57abcbd8085c91bc0ef75292c8618f41ca6d2b6132250a863a77d1e7"}, + {file = "pycryptodome-3.19.0-pp27-pypy_73-win32.whl", hash = "sha256:a0ab84755f4539db086db9ba9e9f3868d2e3610a3948cbd2a55e332ad83b01b0"}, + {file = "pycryptodome-3.19.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0101f647d11a1aae5a8ce4f5fad6644ae1b22bb65d05accc7d322943c69a74a6"}, + {file = "pycryptodome-3.19.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c1601e04d32087591d78e0b81e1e520e57a92796089864b20e5f18c9564b3fa"}, + {file = "pycryptodome-3.19.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:506c686a1eee6c00df70010be3b8e9e78f406af4f21b23162bbb6e9bdf5427bc"}, + {file = "pycryptodome-3.19.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:7919ccd096584b911f2a303c593280869ce1af9bf5d36214511f5e5a1bed8c34"}, + {file = "pycryptodome-3.19.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:560591c0777f74a5da86718f70dfc8d781734cf559773b64072bbdda44b3fc3e"}, + {file = "pycryptodome-3.19.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c1cc2f2ae451a676def1a73c1ae9120cd31af25db3f381893d45f75e77be2400"}, + {file = "pycryptodome-3.19.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:17940dcf274fcae4a54ec6117a9ecfe52907ed5e2e438fe712fe7ca502672ed5"}, + {file = "pycryptodome-3.19.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d04f5f623a280fbd0ab1c1d8ecbd753193ab7154f09b6161b0f857a1a676c15f"}, + {file = "pycryptodome-3.19.0.tar.gz", hash = "sha256:bc35d463222cdb4dbebd35e0784155c81e161b9284e567e7e933d722e533331e"}, +] + +[[package]] +name = "pyflakes" +version = "2.4.0" +description = "passive checker of Python programs" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, + {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, +] + +[[package]] +name = "pygments" +version = "2.16.1" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Pygments-2.16.1-py3-none-any.whl", hash = "sha256:13fc09fa63bc8d8671a6d247e1eb303c4b343eaee81d861f3404db2935653692"}, + {file = "Pygments-2.16.1.tar.gz", hash = "sha256:1daff0494820c69bc8941e407aa20f577374ee88364ee10a98fdbe0aece96e29"}, +] + +[package.extras] +plugins = ["importlib-metadata"] + +[[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.1" +description = "Pytest support for asyncio" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-asyncio-0.21.1.tar.gz", hash = "sha256:40a7eae6dded22c7b604986855ea48400ab15b069ae38116e8c01238e9eeb64d"}, + {file = "pytest_asyncio-0.21.1-py3-none-any.whl", hash = "sha256:8666c1c8ac02631d7c51ba282e0c69a8a452b211ffedf2599099845da5c5c37b"}, +] + +[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-cov" +version = "4.1.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + +[[package]] +name = "pytest-grpc" +version = "0.8.0" +description = "pytest plugin for grpc" +optional = false +python-versions = "*" +files = [ + {file = "pytest-grpc-0.8.0.tar.gz", hash = "sha256:0bd2683ffd34199444d707c0ab01970b22e0afbba6cb1ddb6d578c85ebfe09bd"}, + {file = "pytest_grpc-0.8.0-py3-none-any.whl", hash = "sha256:5b062cf498e59995e84b3051da76f7bcff8cfe307927869f7bdc27ab967eee35"}, +] + +[package.dependencies] +pytest = ">=3.6.0" + +[[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 = "pyunormalize" +version = "15.0.0" +description = "Unicode normalization forms (NFC, NFKC, NFD, NFKD). A library independent from the Python core Unicode database." +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyunormalize-15.0.0.tar.gz", hash = "sha256:e63fdba0d85ea04579dde2fc29a072dba773dcae600b04faf6cc90714c8b1302"}, +] + +[[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 = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "referencing" +version = "0.30.2" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.30.2-py3-none-any.whl", hash = "sha256:449b6669b6121a9e96a7f9e410b245d471e8d48964c67113ce9afe50c8dd7bdf"}, + {file = "referencing-0.30.2.tar.gz", hash = "sha256:794ad8003c65938edcdbc027f1933215e0d0ccc0291e3ce20a4d87432b59efc0"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + +[[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 = "requests-mock" +version = "1.11.0" +description = "Mock out responses from the requests package" +optional = false +python-versions = "*" +files = [ + {file = "requests-mock-1.11.0.tar.gz", hash = "sha256:ef10b572b489a5f28e09b708697208c4a3b2b89ef80a9f01584340ea357ec3c4"}, + {file = "requests_mock-1.11.0-py2.py3-none-any.whl", hash = "sha256:f7fae383f228633f6bececebdab236c478ace2284d6292c6e7e2867b9ab74d15"}, +] + +[package.dependencies] +requests = ">=2.3,<3" +six = "*" + +[package.extras] +fixture = ["fixtures"] +test = ["fixtures", "mock", "purl", "pytest", "requests-futures", "sphinx", "testtools"] + +[[package]] +name = "rlp" +version = "3.0.0" +description = "A package for Recursive Length Prefix encoding and decoding" +optional = false +python-versions = "*" +files = [ + {file = "rlp-3.0.0-py2.py3-none-any.whl", hash = "sha256:d2a963225b3f26795c5b52310e0871df9824af56823d739511583ef459895a7d"}, + {file = "rlp-3.0.0.tar.gz", hash = "sha256:63b0465d2948cd9f01de449d7adfb92d207c1aef3982f20310f8009be4a507e8"}, +] + +[package.dependencies] +eth-utils = ">=2.0.0,<3" + +[package.extras] +dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "flake8 (==3.4.1)", "hypothesis (==5.19.0)", "ipython", "pytest (>=6.2.5,<7)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "setuptools (>=36.2.0)", "sphinx-rtd-theme (>=0.1.9)", "tox (>=2.9.1,<3)", "twine", "wheel"] +doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)"] +lint = ["flake8 (==3.4.1)"] +rust-backend = ["rusty-rlp (>=0.2.1,<0.3)"] +test = ["hypothesis (==5.19.0)", "pytest (>=6.2.5,<7)", "tox (>=2.9.1,<3)"] + +[[package]] +name = "rpds-py" +version = "0.10.3" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.10.3-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:485747ee62da83366a44fbba963c5fe017860ad408ccd6cd99aa66ea80d32b2e"}, + {file = "rpds_py-0.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c55f9821f88e8bee4b7a72c82cfb5ecd22b6aad04033334f33c329b29bfa4da0"}, + {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3b52a67ac66a3a64a7e710ba629f62d1e26ca0504c29ee8cbd99b97df7079a8"}, + {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3aed39db2f0ace76faa94f465d4234aac72e2f32b009f15da6492a561b3bbebd"}, + {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:271c360fdc464fe6a75f13ea0c08ddf71a321f4c55fc20a3fe62ea3ef09df7d9"}, + {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ef5fddfb264e89c435be4adb3953cef5d2936fdeb4463b4161a6ba2f22e7b740"}, + {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a771417c9c06c56c9d53d11a5b084d1de75de82978e23c544270ab25e7c066ff"}, + {file = "rpds_py-0.10.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:52b5cbc0469328e58180021138207e6ec91d7ca2e037d3549cc9e34e2187330a"}, + {file = "rpds_py-0.10.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6ac3fefb0d168c7c6cab24fdfc80ec62cd2b4dfd9e65b84bdceb1cb01d385c33"}, + {file = "rpds_py-0.10.3-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:8d54bbdf5d56e2c8cf81a1857250f3ea132de77af543d0ba5dce667183b61fec"}, + {file = "rpds_py-0.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cd2163f42868865597d89399a01aa33b7594ce8e2c4a28503127c81a2f17784e"}, + {file = "rpds_py-0.10.3-cp310-none-win32.whl", hash = "sha256:ea93163472db26ac6043e8f7f93a05d9b59e0505c760da2a3cd22c7dd7111391"}, + {file = "rpds_py-0.10.3-cp310-none-win_amd64.whl", hash = "sha256:7cd020b1fb41e3ab7716d4d2c3972d4588fdfbab9bfbbb64acc7078eccef8860"}, + {file = "rpds_py-0.10.3-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:1d9b5ee46dcb498fa3e46d4dfabcb531e1f2e76b477e0d99ef114f17bbd38453"}, + {file = "rpds_py-0.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:563646d74a4b4456d0cf3b714ca522e725243c603e8254ad85c3b59b7c0c4bf0"}, + {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e626b864725680cd3904414d72e7b0bd81c0e5b2b53a5b30b4273034253bb41f"}, + {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:485301ee56ce87a51ccb182a4b180d852c5cb2b3cb3a82f7d4714b4141119d8c"}, + {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:42f712b4668831c0cd85e0a5b5a308700fe068e37dcd24c0062904c4e372b093"}, + {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c9141af27a4e5819d74d67d227d5047a20fa3c7d4d9df43037a955b4c748ec5"}, + {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef750a20de1b65657a1425f77c525b0183eac63fe7b8f5ac0dd16f3668d3e64f"}, + {file = "rpds_py-0.10.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e1a0ffc39f51aa5f5c22114a8f1906b3c17eba68c5babb86c5f77d8b1bba14d1"}, + {file = "rpds_py-0.10.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f4c179a7aeae10ddf44c6bac87938134c1379c49c884529f090f9bf05566c836"}, + {file = "rpds_py-0.10.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:176287bb998fd1e9846a9b666e240e58f8d3373e3bf87e7642f15af5405187b8"}, + {file = "rpds_py-0.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6446002739ca29249f0beaaf067fcbc2b5aab4bc7ee8fb941bd194947ce19aff"}, + {file = "rpds_py-0.10.3-cp311-none-win32.whl", hash = "sha256:c7aed97f2e676561416c927b063802c8a6285e9b55e1b83213dfd99a8f4f9e48"}, + {file = "rpds_py-0.10.3-cp311-none-win_amd64.whl", hash = "sha256:8bd01ff4032abaed03f2db702fa9a61078bee37add0bd884a6190b05e63b028c"}, + {file = "rpds_py-0.10.3-cp312-cp312-macosx_10_7_x86_64.whl", hash = "sha256:4cf0855a842c5b5c391dd32ca273b09e86abf8367572073bd1edfc52bc44446b"}, + {file = "rpds_py-0.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:69b857a7d8bd4f5d6e0db4086da8c46309a26e8cefdfc778c0c5cc17d4b11e08"}, + {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:975382d9aa90dc59253d6a83a5ca72e07f4ada3ae3d6c0575ced513db322b8ec"}, + {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:35fbd23c1c8732cde7a94abe7fb071ec173c2f58c0bd0d7e5b669fdfc80a2c7b"}, + {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:106af1653007cc569d5fbb5f08c6648a49fe4de74c2df814e234e282ebc06957"}, + {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce5e7504db95b76fc89055c7f41e367eaadef5b1d059e27e1d6eabf2b55ca314"}, + {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5aca759ada6b1967fcfd4336dcf460d02a8a23e6abe06e90ea7881e5c22c4de6"}, + {file = "rpds_py-0.10.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b5d4bdd697195f3876d134101c40c7d06d46c6ab25159ed5cbd44105c715278a"}, + {file = "rpds_py-0.10.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a657250807b6efd19b28f5922520ae002a54cb43c2401e6f3d0230c352564d25"}, + {file = "rpds_py-0.10.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:177c9dd834cdf4dc39c27436ade6fdf9fe81484758885f2d616d5d03c0a83bd2"}, + {file = "rpds_py-0.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e22491d25f97199fc3581ad8dd8ce198d8c8fdb8dae80dea3512e1ce6d5fa99f"}, + {file = "rpds_py-0.10.3-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:2f3e1867dd574014253b4b8f01ba443b9c914e61d45f3674e452a915d6e929a3"}, + {file = "rpds_py-0.10.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c22211c165166de6683de8136229721f3d5c8606cc2c3d1562da9a3a5058049c"}, + {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40bc802a696887b14c002edd43c18082cb7b6f9ee8b838239b03b56574d97f71"}, + {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e271dd97c7bb8eefda5cca38cd0b0373a1fea50f71e8071376b46968582af9b"}, + {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:95cde244e7195b2c07ec9b73fa4c5026d4a27233451485caa1cd0c1b55f26dbd"}, + {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08a80cf4884920863623a9ee9a285ee04cef57ebedc1cc87b3e3e0f24c8acfe5"}, + {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:763ad59e105fca09705d9f9b29ecffb95ecdc3b0363be3bb56081b2c6de7977a"}, + {file = "rpds_py-0.10.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:187700668c018a7e76e89424b7c1042f317c8df9161f00c0c903c82b0a8cac5c"}, + {file = "rpds_py-0.10.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:5267cfda873ad62591b9332fd9472d2409f7cf02a34a9c9cb367e2c0255994bf"}, + {file = "rpds_py-0.10.3-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:2ed83d53a8c5902ec48b90b2ac045e28e1698c0bea9441af9409fc844dc79496"}, + {file = "rpds_py-0.10.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:255f1a10ae39b52122cce26ce0781f7a616f502feecce9e616976f6a87992d6b"}, + {file = "rpds_py-0.10.3-cp38-none-win32.whl", hash = "sha256:a019a344312d0b1f429c00d49c3be62fa273d4a1094e1b224f403716b6d03be1"}, + {file = "rpds_py-0.10.3-cp38-none-win_amd64.whl", hash = "sha256:efb9ece97e696bb56e31166a9dd7919f8f0c6b31967b454718c6509f29ef6fee"}, + {file = "rpds_py-0.10.3-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:570cc326e78ff23dec7f41487aa9c3dffd02e5ee9ab43a8f6ccc3df8f9327623"}, + {file = "rpds_py-0.10.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cff7351c251c7546407827b6a37bcef6416304fc54d12d44dbfecbb717064717"}, + {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:177914f81f66c86c012311f8c7f46887ec375cfcfd2a2f28233a3053ac93a569"}, + {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:448a66b8266de0b581246ca7cd6a73b8d98d15100fb7165974535fa3b577340e"}, + {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3bbac1953c17252f9cc675bb19372444aadf0179b5df575ac4b56faaec9f6294"}, + {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dd9d9d9e898b9d30683bdd2b6c1849449158647d1049a125879cb397ee9cd12"}, + {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e8c71ea77536149e36c4c784f6d420ffd20bea041e3ba21ed021cb40ce58e2c9"}, + {file = "rpds_py-0.10.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16a472300bc6c83fe4c2072cc22b3972f90d718d56f241adabc7ae509f53f154"}, + {file = "rpds_py-0.10.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b9255e7165083de7c1d605e818025e8860636348f34a79d84ec533546064f07e"}, + {file = "rpds_py-0.10.3-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:53d7a3cd46cdc1689296348cb05ffd4f4280035770aee0c8ead3bbd4d6529acc"}, + {file = "rpds_py-0.10.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22da15b902f9f8e267020d1c8bcfc4831ca646fecb60254f7bc71763569f56b1"}, + {file = "rpds_py-0.10.3-cp39-none-win32.whl", hash = "sha256:850c272e0e0d1a5c5d73b1b7871b0a7c2446b304cec55ccdb3eaac0d792bb065"}, + {file = "rpds_py-0.10.3-cp39-none-win_amd64.whl", hash = "sha256:de61e424062173b4f70eec07e12469edde7e17fa180019a2a0d75c13a5c5dc57"}, + {file = "rpds_py-0.10.3-pp310-pypy310_pp73-macosx_10_7_x86_64.whl", hash = "sha256:af247fd4f12cca4129c1b82090244ea5a9d5bb089e9a82feb5a2f7c6a9fe181d"}, + {file = "rpds_py-0.10.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ad59efe24a4d54c2742929001f2d02803aafc15d6d781c21379e3f7f66ec842"}, + {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642ed0a209ced4be3a46f8cb094f2d76f1f479e2a1ceca6de6346a096cd3409d"}, + {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:37d0c59548ae56fae01c14998918d04ee0d5d3277363c10208eef8c4e2b68ed6"}, + {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:aad6ed9e70ddfb34d849b761fb243be58c735be6a9265b9060d6ddb77751e3e8"}, + {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8f94fdd756ba1f79f988855d948ae0bad9ddf44df296770d9a58c774cfbcca72"}, + {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77076bdc8776a2b029e1e6ffbe6d7056e35f56f5e80d9dc0bad26ad4a024a762"}, + {file = "rpds_py-0.10.3-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:87d9b206b1bd7a0523375dc2020a6ce88bca5330682ae2fe25e86fd5d45cea9c"}, + {file = "rpds_py-0.10.3-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:8efaeb08ede95066da3a3e3c420fcc0a21693fcd0c4396d0585b019613d28515"}, + {file = "rpds_py-0.10.3-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:a4d9bfda3f84fc563868fe25ca160c8ff0e69bc4443c5647f960d59400ce6557"}, + {file = "rpds_py-0.10.3-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:d27aa6bbc1f33be920bb7adbb95581452cdf23005d5611b29a12bb6a3468cc95"}, + {file = "rpds_py-0.10.3-pp38-pypy38_pp73-macosx_10_7_x86_64.whl", hash = "sha256:ed8313809571a5463fd7db43aaca68ecb43ca7a58f5b23b6e6c6c5d02bdc7882"}, + {file = "rpds_py-0.10.3-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:e10e6a1ed2b8661201e79dff5531f8ad4cdd83548a0f81c95cf79b3184b20c33"}, + {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:015de2ce2af1586ff5dc873e804434185199a15f7d96920ce67e50604592cae9"}, + {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae87137951bb3dc08c7d8bfb8988d8c119f3230731b08a71146e84aaa919a7a9"}, + {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0bb4f48bd0dd18eebe826395e6a48b7331291078a879295bae4e5d053be50d4c"}, + {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09362f86ec201288d5687d1dc476b07bf39c08478cde837cb710b302864e7ec9"}, + {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:821392559d37759caa67d622d0d2994c7a3f2fb29274948ac799d496d92bca73"}, + {file = "rpds_py-0.10.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7170cbde4070dc3c77dec82abf86f3b210633d4f89550fa0ad2d4b549a05572a"}, + {file = "rpds_py-0.10.3-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:5de11c041486681ce854c814844f4ce3282b6ea1656faae19208ebe09d31c5b8"}, + {file = "rpds_py-0.10.3-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:4ed172d0c79f156c1b954e99c03bc2e3033c17efce8dd1a7c781bc4d5793dfac"}, + {file = "rpds_py-0.10.3-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:11fdd1192240dda8d6c5d18a06146e9045cb7e3ba7c06de6973000ff035df7c6"}, + {file = "rpds_py-0.10.3-pp39-pypy39_pp73-macosx_10_7_x86_64.whl", hash = "sha256:f602881d80ee4228a2355c68da6b296a296cd22bbb91e5418d54577bbf17fa7c"}, + {file = "rpds_py-0.10.3-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:691d50c99a937709ac4c4cd570d959a006bd6a6d970a484c84cc99543d4a5bbb"}, + {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24cd91a03543a0f8d09cb18d1cb27df80a84b5553d2bd94cba5979ef6af5c6e7"}, + {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fc2200e79d75b5238c8d69f6a30f8284290c777039d331e7340b6c17cad24a5a"}, + {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ea65b59882d5fa8c74a23f8960db579e5e341534934f43f3b18ec1839b893e41"}, + {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:829e91f3a8574888b73e7a3feb3b1af698e717513597e23136ff4eba0bc8387a"}, + {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eab75a8569a095f2ad470b342f2751d9902f7944704f0571c8af46bede438475"}, + {file = "rpds_py-0.10.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:061c3ff1f51ecec256e916cf71cc01f9975af8fb3af9b94d3c0cc8702cfea637"}, + {file = "rpds_py-0.10.3-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:39d05e65f23a0fe897b6ac395f2a8d48c56ac0f583f5d663e0afec1da89b95da"}, + {file = "rpds_py-0.10.3-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:4eca20917a06d2fca7628ef3c8b94a8c358f6b43f1a621c9815243462dcccf97"}, + {file = "rpds_py-0.10.3-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e8d0f0eca087630d58b8c662085529781fd5dc80f0a54eda42d5c9029f812599"}, + {file = "rpds_py-0.10.3.tar.gz", hash = "sha256:fcc1ebb7561a3e24a6588f7c6ded15d80aec22c66a070c757559b57b17ffd1cb"}, +] + +[[package]] +name = "safe-pysha3" +version = "1.0.4" +description = "SHA-3 (Keccak) for Python 3.9 - 3.11" +optional = false +python-versions = "*" +files = [ + {file = "safe-pysha3-1.0.4.tar.gz", hash = "sha256:e429146b1edd198b2ca934a2046a65656c5d31b0ec894bbd6055127f4deaff17"}, +] + +[[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 = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +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 = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "toolz" +version = "0.12.0" +description = "List processing tools and functional utilities" +optional = false +python-versions = ">=3.5" +files = [ + {file = "toolz-0.12.0-py3-none-any.whl", hash = "sha256:2059bd4148deb1884bb0eb770a3cde70e7f954cfbbdc2285f1f2de01fd21eb6f"}, + {file = "toolz-0.12.0.tar.gz", hash = "sha256:88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194"}, +] + +[[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 = "tzdata" +version = "2023.3" +description = "Provider of IANA time zone data" +optional = false +python-versions = ">=2" +files = [ + {file = "tzdata-2023.3-py2.py3-none-any.whl", hash = "sha256:7e65763eef3120314099b6939b5546db7adce1e7d6f2e179e3df563c70511eda"}, + {file = "tzdata-2023.3.tar.gz", hash = "sha256:11ef1e08e54acb0d4f95bdb1be05da659673de4acbd21bf9c69e94cc5e907a3a"}, +] + +[[package]] +name = "tzlocal" +version = "5.0.1" +description = "tzinfo object for the local timezone" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tzlocal-5.0.1-py3-none-any.whl", hash = "sha256:f3596e180296aaf2dbd97d124fe76ae3a0e3d32b258447de7b939b3fd4be992f"}, + {file = "tzlocal-5.0.1.tar.gz", hash = "sha256:46eb99ad4bdb71f3f72b7d24f4267753e240944ecfc16f25d2719ba89827a803"}, +] + +[package.dependencies] +tzdata = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +devenv = ["black", "check-manifest", "flake8", "pyroma", "pytest (>=4.3)", "pytest-cov", "pytest-mock (>=3.3)", "zest.releaser"] + +[[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 = "virtualenv" +version = "20.24.5" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.24.5-py3-none-any.whl", hash = "sha256:b80039f280f4919c77b30f1c23294ae357c4c8701042086e3fc005963e4e537b"}, + {file = "virtualenv-20.24.5.tar.gz", hash = "sha256:e8361967f6da6fbdf1426483bfe9fca8287c242ac0bc30429905721cefbff752"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<4" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "web3" +version = "6.9.0" +description = "web3.py" +optional = false +python-versions = ">=3.7.2" +files = [ + {file = "web3-6.9.0-py3-none-any.whl", hash = "sha256:3bc95043ee9fc6ee0b13a4766d4975b9f7cae069db136430a3799ed18743e608"}, + {file = "web3-6.9.0.tar.gz", hash = "sha256:cb454d0180e63ba1d83143dccf7c623581ba58e222edb006f48252d8a7b948e0"}, +] + +[package.dependencies] +aiohttp = ">=3.7.4.post0" +eth-abi = ">=4.0.0" +eth-account = ">=0.8.0" +eth-hash = {version = ">=0.5.1", extras = ["pycryptodome"]} +eth-typing = ">=3.0.0" +eth-utils = ">=2.1.0" +hexbytes = ">=0.1.0" +jsonschema = ">=4.0.0" +lru-dict = ">=1.1.6" +protobuf = ">=4.21.6" +pyunormalize = ">=15.0.0" +pywin32 = {version = ">=223", markers = "platform_system == \"Windows\""} +requests = ">=2.16.0" +typing-extensions = ">=4.0.1" +websockets = ">=10.0.0" + +[package.extras] +dev = ["black (>=22.1.0)", "build (>=0.9.0)", "bumpversion", "eth-tester[py-evm] (==v0.9.1-b.1)", "flake8 (==3.8.3)", "flaky (>=3.7.0)", "hypothesis (>=3.31.2)", "importlib-metadata (<5.0)", "ipfshttpclient (==0.8.0a2)", "isort (>=5.11.0)", "mypy (>=1.0.0)", "py-geth (>=3.11.0)", "pytest (>=7.0.0)", "pytest-asyncio (>=0.18.1)", "pytest-mock (>=1.10)", "pytest-watch (>=4.2)", "pytest-xdist (>=1.29)", "setuptools (>=38.6.0)", "sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)", "tox (>=3.18.0)", "tqdm (>4.32)", "twine (>=1.13)", "types-protobuf (==3.19.13)", "types-requests (>=2.26.1)", "types-setuptools (>=57.4.4)", "when-changed (>=0.3.0)"] +docs = ["sphinx (>=5.3.0)", "sphinx-rtd-theme (>=1.0.0)", "towncrier (>=21,<22)"] +ipfs = ["ipfshttpclient (==0.8.0a2)"] +linter = ["black (>=22.1.0)", "flake8 (==3.8.3)", "isort (>=5.11.0)", "mypy (>=1.0.0)", "types-protobuf (==3.19.13)", "types-requests (>=2.26.1)", "types-setuptools (>=57.4.4)"] +tester = ["eth-tester[py-evm] (==v0.9.1-b.1)", "py-geth (>=3.11.0)"] + +[[package]] +name = "websockets" +version = "11.0.3" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3ccc8a0c387629aec40f2fc9fdcb4b9d5431954f934da3eaf16cdc94f67dbfac"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d67ac60a307f760c6e65dad586f556dde58e683fab03323221a4e530ead6f74d"}, + {file = "websockets-11.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84d27a4832cc1a0ee07cdcf2b0629a8a72db73f4cf6de6f0904f6661227f256f"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ffd7dcaf744f25f82190856bc26ed81721508fc5cbf2a330751e135ff1283564"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7622a89d696fc87af8e8d280d9b421db5133ef5b29d3f7a1ce9f1a7bf7fcfa11"}, + {file = "websockets-11.0.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bceab846bac555aff6427d060f2fcfff71042dba6f5fca7dc4f75cac815e57ca"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:54c6e5b3d3a8936a4ab6870d46bdd6ec500ad62bde9e44462c32d18f1e9a8e54"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41f696ba95cd92dc047e46b41b26dd24518384749ed0d99bea0a941ca87404c4"}, + {file = "websockets-11.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:86d2a77fd490ae3ff6fae1c6ceaecad063d3cc2320b44377efdde79880e11526"}, + {file = "websockets-11.0.3-cp310-cp310-win32.whl", hash = "sha256:2d903ad4419f5b472de90cd2d40384573b25da71e33519a67797de17ef849b69"}, + {file = "websockets-11.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:1d2256283fa4b7f4c7d7d3e84dc2ece74d341bce57d5b9bf385df109c2a1a82f"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e848f46a58b9fcf3d06061d17be388caf70ea5b8cc3466251963c8345e13f7eb"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa5003845cdd21ac0dc6c9bf661c5beddd01116f6eb9eb3c8e272353d45b3288"}, + {file = "websockets-11.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b58cbf0697721120866820b89f93659abc31c1e876bf20d0b3d03cef14faf84d"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:660e2d9068d2bedc0912af508f30bbeb505bbbf9774d98def45f68278cea20d3"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c1f0524f203e3bd35149f12157438f406eff2e4fb30f71221c8a5eceb3617b6b"}, + {file = "websockets-11.0.3-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:def07915168ac8f7853812cc593c71185a16216e9e4fa886358a17ed0fd9fcf6"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b30c6590146e53149f04e85a6e4fcae068df4289e31e4aee1fdf56a0dead8f97"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:619d9f06372b3a42bc29d0cd0354c9bb9fb39c2cbc1a9c5025b4538738dbffaf"}, + {file = "websockets-11.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:01f5567d9cf6f502d655151645d4e8b72b453413d3819d2b6f1185abc23e82dd"}, + {file = "websockets-11.0.3-cp311-cp311-win32.whl", hash = "sha256:e1459677e5d12be8bbc7584c35b992eea142911a6236a3278b9b5ce3326f282c"}, + {file = "websockets-11.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:e7837cb169eca3b3ae94cc5787c4fed99eef74c0ab9506756eea335e0d6f3ed8"}, + {file = "websockets-11.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9f59a3c656fef341a99e3d63189852be7084c0e54b75734cde571182c087b152"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2529338a6ff0eb0b50c7be33dc3d0e456381157a31eefc561771ee431134a97f"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34fd59a4ac42dff6d4681d8843217137f6bc85ed29722f2f7222bd619d15e95b"}, + {file = "websockets-11.0.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:332d126167ddddec94597c2365537baf9ff62dfcc9db4266f263d455f2f031cb"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6505c1b31274723ccaf5f515c1824a4ad2f0d191cec942666b3d0f3aa4cb4007"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:f467ba0050b7de85016b43f5a22b46383ef004c4f672148a8abf32bc999a87f0"}, + {file = "websockets-11.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9d9acd80072abcc98bd2c86c3c9cd4ac2347b5a5a0cae7ed5c0ee5675f86d9af"}, + {file = "websockets-11.0.3-cp37-cp37m-win32.whl", hash = "sha256:e590228200fcfc7e9109509e4d9125eace2042fd52b595dd22bbc34bb282307f"}, + {file = "websockets-11.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:b16fff62b45eccb9c7abb18e60e7e446998093cdcb50fed33134b9b6878836de"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fb06eea71a00a7af0ae6aefbb932fb8a7df3cb390cc217d51a9ad7343de1b8d0"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8a34e13a62a59c871064dfd8ffb150867e54291e46d4a7cf11d02c94a5275bae"}, + {file = "websockets-11.0.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4841ed00f1026dfbced6fca7d963c4e7043aa832648671b5138008dc5a8f6d99"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a073fc9ab1c8aff37c99f11f1641e16da517770e31a37265d2755282a5d28aa"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68b977f21ce443d6d378dbd5ca38621755f2063d6fdb3335bda981d552cfff86"}, + {file = "websockets-11.0.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e1a99a7a71631f0efe727c10edfba09ea6bee4166a6f9c19aafb6c0b5917d09c"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:bee9fcb41db2a23bed96c6b6ead6489702c12334ea20a297aa095ce6d31370d0"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4b253869ea05a5a073ebfdcb5cb3b0266a57c3764cf6fe114e4cd90f4bfa5f5e"}, + {file = "websockets-11.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1553cb82942b2a74dd9b15a018dce645d4e68674de2ca31ff13ebc2d9f283788"}, + {file = "websockets-11.0.3-cp38-cp38-win32.whl", hash = "sha256:f61bdb1df43dc9c131791fbc2355535f9024b9a04398d3bd0684fc16ab07df74"}, + {file = "websockets-11.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:03aae4edc0b1c68498f41a6772d80ac7c1e33c06c6ffa2ac1c27a07653e79d6f"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:777354ee16f02f643a4c7f2b3eff8027a33c9861edc691a2003531f5da4f6bc8"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8c82f11964f010053e13daafdc7154ce7385ecc538989a354ccc7067fd7028fd"}, + {file = "websockets-11.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3580dd9c1ad0701169e4d6fc41e878ffe05e6bdcaf3c412f9d559389d0c9e016"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f1a3f10f836fab6ca6efa97bb952300b20ae56b409414ca85bff2ad241d2a61"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:df41b9bc27c2c25b486bae7cf42fccdc52ff181c8c387bfd026624a491c2671b"}, + {file = "websockets-11.0.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:279e5de4671e79a9ac877427f4ac4ce93751b8823f276b681d04b2156713b9dd"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:1fdf26fa8a6a592f8f9235285b8affa72748dc12e964a5518c6c5e8f916716f7"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:69269f3a0b472e91125b503d3c0b3566bda26da0a3261c49f0027eb6075086d1"}, + {file = "websockets-11.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:97b52894d948d2f6ea480171a27122d77af14ced35f62e5c892ca2fae9344311"}, + {file = "websockets-11.0.3-cp39-cp39-win32.whl", hash = "sha256:c7f3cb904cce8e1be667c7e6fef4516b98d1a6a0635a58a57528d577ac18a128"}, + {file = "websockets-11.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:c792ea4eabc0159535608fc5658a74d1a81020eb35195dd63214dcf07556f67e"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f2e58f2c36cc52d41f2659e4c0cbf7353e28c8c9e63e30d8c6d3494dc9fdedcf"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:de36fe9c02995c7e6ae6efe2e205816f5f00c22fd1fbf343d4d18c3d5ceac2f5"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0ac56b661e60edd453585f4bd68eb6a29ae25b5184fd5ba51e97652580458998"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e052b8467dd07d4943936009f46ae5ce7b908ddcac3fda581656b1b19c083d9b"}, + {file = "websockets-11.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:42cc5452a54a8e46a032521d7365da775823e21bfba2895fb7b77633cce031bb"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:e6316827e3e79b7b8e7d8e3b08f4e331af91a48e794d5d8b099928b6f0b85f20"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8531fdcad636d82c517b26a448dcfe62f720e1922b33c81ce695d0edb91eb931"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c114e8da9b475739dde229fd3bc6b05a6537a88a578358bc8eb29b4030fac9c9"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e063b1865974611313a3849d43f2c3f5368093691349cf3c7c8f8f75ad7cb280"}, + {file = "websockets-11.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:92b2065d642bf8c0a82d59e59053dd2fdde64d4ed44efe4870fa816c1232647b"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0ee68fe502f9031f19d495dae2c268830df2760c0524cbac5d759921ba8c8e82"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dcacf2c7a6c3a84e720d1bb2b543c675bf6c40e460300b628bab1b1efc7c034c"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b67c6f5e5a401fc56394f191f00f9b3811fe843ee93f4a70df3c389d1adf857d"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d5023a4b6a5b183dc838808087033ec5df77580485fc533e7dab2567851b0a4"}, + {file = "websockets-11.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ed058398f55163a79bb9f06a90ef9ccc063b204bb346c4de78efc5d15abfe602"}, + {file = "websockets-11.0.3-py3-none-any.whl", hash = "sha256:6681ba9e7f8f3b19440921e99efbb40fc89f26cd71bf539e45d8c8a25c976dc6"}, + {file = "websockets-11.0.3.tar.gz", hash = "sha256:88fc51d9a26b10fc331be344f1781224a375b78488fc343620184e95a4b27016"}, +] + +[[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" + +[metadata] +lock-version = "2.0" +python-versions = "^3.9" +content-hash = "1c74ebf70d3cc8987fe3218c68cb29aa1a11121e1bd854af44dd2886413b5541" diff --git a/poetry.toml b/poetry.toml new file mode 100644 index 00000000..53b35d37 --- /dev/null +++ b/poetry.toml @@ -0,0 +1,3 @@ +[virtualenvs] +create = true +in-project = true diff --git a/pyinjective/Peggo_ABI.json b/pyinjective/Peggo_ABI.json index 0d05b147..cc60aa18 100644 --- a/pyinjective/Peggo_ABI.json +++ b/pyinjective/Peggo_ABI.json @@ -723,4 +723,4 @@ "stateMutability": "nonpayable", "type": "function" } -] \ No newline at end of file +] diff --git a/pyinjective/__init__.py b/pyinjective/__init__.py index 841ee3e8..aed35d7e 100644 --- a/pyinjective/__init__.py +++ b/pyinjective/__init__.py @@ -1,3 +1,3 @@ -from .async_client import AsyncClient -from .transaction import Transaction -from .wallet import PrivateKey, PublicKey, Address +from .async_client import AsyncClient # noqa: F401 +from .transaction import Transaction # noqa: F401 +from .wallet import Address, PrivateKey, PublicKey # noqa: F401 diff --git a/pyinjective/async_client.py b/pyinjective/async_client.py index 3374f6c1..f279b45f 100644 --- a/pyinjective/async_client.py +++ b/pyinjective/async_client.py @@ -1,68 +1,49 @@ import asyncio import time from copy import deepcopy +from decimal import Decimal +from typing import Coroutine, Dict, List, Optional, Tuple, Union -import grpc import aiocron -from decimal import Decimal -from typing import Dict, List, Optional, Tuple, Union, Coroutine +import grpc from pyinjective.composer import Composer from . import constant from .core.market import BinaryOptionMarket, DerivativeMarket, SpotMarket +from .core.network import Network from .core.token import Token from .exceptions import NotFoundError - +from .proto.cosmos.auth.v1beta1 import query_pb2 as auth_query +from .proto.cosmos.auth.v1beta1 import query_pb2_grpc as auth_query_grpc +from .proto.cosmos.authz.v1beta1 import query_pb2 as authz_query +from .proto.cosmos.authz.v1beta1 import query_pb2_grpc as authz_query_grpc +from .proto.cosmos.bank.v1beta1 import query_pb2 as bank_query +from .proto.cosmos.bank.v1beta1 import query_pb2_grpc as bank_query_grpc from .proto.cosmos.base.abci.v1beta1 import abci_pb2 as abci_type - -from .proto.cosmos.base.tendermint.v1beta1 import ( - query_pb2_grpc as tendermint_query_grpc, - query_pb2 as tendermint_query, -) - -from .proto.cosmos.auth.v1beta1 import ( - query_pb2_grpc as auth_query_grpc, - query_pb2 as auth_query, -) -from .proto.cosmos.authz.v1beta1 import ( - query_pb2_grpc as authz_query_grpc, - query_pb2 as authz_query, -) -from .proto.cosmos.bank.v1beta1 import ( - query_pb2_grpc as bank_query_grpc, - query_pb2 as bank_query, -) -from .proto.cosmos.tx.v1beta1 import ( - service_pb2_grpc as tx_service_grpc, - service_pb2 as tx_service, -) -from .proto.exchange import ( - injective_accounts_rpc_pb2 as exchange_accounts_rpc_pb, - injective_accounts_rpc_pb2_grpc as exchange_accounts_rpc_grpc, - injective_oracle_rpc_pb2 as oracle_rpc_pb, - injective_oracle_rpc_pb2_grpc as oracle_rpc_grpc, - injective_insurance_rpc_pb2 as insurance_rpc_pb, - injective_insurance_rpc_pb2_grpc as insurance_rpc_grpc, - injective_spot_exchange_rpc_pb2 as spot_exchange_rpc_pb, - injective_spot_exchange_rpc_pb2_grpc as spot_exchange_rpc_grpc, - injective_derivative_exchange_rpc_pb2 as derivative_exchange_rpc_pb, - injective_derivative_exchange_rpc_pb2_grpc as derivative_exchange_rpc_grpc, - injective_meta_rpc_pb2 as exchange_meta_rpc_pb, - injective_meta_rpc_pb2_grpc as exchange_meta_rpc_grpc, - injective_explorer_rpc_pb2 as explorer_rpc_pb, - injective_explorer_rpc_pb2_grpc as explorer_rpc_grpc, - injective_auction_rpc_pb2 as auction_rpc_pb, - injective_auction_rpc_pb2_grpc as auction_rpc_grpc, - injective_portfolio_rpc_pb2 as portfolio_rpc_pb, - injective_portfolio_rpc_pb2_grpc as portfolio_rpc_grpc, -) - -from .proto.injective.types.v1beta1 import ( - account_pb2 -) - -from .core.network import Network +from .proto.cosmos.base.tendermint.v1beta1 import query_pb2 as tendermint_query +from .proto.cosmos.base.tendermint.v1beta1 import query_pb2_grpc as tendermint_query_grpc +from .proto.cosmos.tx.v1beta1 import service_pb2 as tx_service +from .proto.cosmos.tx.v1beta1 import service_pb2_grpc as tx_service_grpc +from .proto.exchange import injective_accounts_rpc_pb2 as exchange_accounts_rpc_pb +from .proto.exchange import injective_accounts_rpc_pb2_grpc as exchange_accounts_rpc_grpc +from .proto.exchange import injective_auction_rpc_pb2 as auction_rpc_pb +from .proto.exchange import injective_auction_rpc_pb2_grpc as auction_rpc_grpc +from .proto.exchange import injective_derivative_exchange_rpc_pb2 as derivative_exchange_rpc_pb +from .proto.exchange import injective_derivative_exchange_rpc_pb2_grpc as derivative_exchange_rpc_grpc +from .proto.exchange import injective_explorer_rpc_pb2 as explorer_rpc_pb +from .proto.exchange import injective_explorer_rpc_pb2_grpc as explorer_rpc_grpc +from .proto.exchange import injective_insurance_rpc_pb2 as insurance_rpc_pb +from .proto.exchange import injective_insurance_rpc_pb2_grpc as insurance_rpc_grpc +from .proto.exchange import injective_meta_rpc_pb2 as exchange_meta_rpc_pb +from .proto.exchange import injective_meta_rpc_pb2_grpc as exchange_meta_rpc_grpc +from .proto.exchange import injective_oracle_rpc_pb2 as oracle_rpc_pb +from .proto.exchange import injective_oracle_rpc_pb2_grpc as oracle_rpc_grpc +from .proto.exchange import injective_portfolio_rpc_pb2 as portfolio_rpc_pb +from .proto.exchange import injective_portfolio_rpc_pb2_grpc as portfolio_rpc_grpc +from .proto.exchange import injective_spot_exchange_rpc_pb2 as spot_exchange_rpc_pb +from .proto.exchange import injective_spot_exchange_rpc_pb2_grpc as spot_exchange_rpc_grpc +from .proto.injective.types.v1beta1 import account_pb2 from .utils.logger import LoggerProvider DEFAULT_TIMEOUTHEIGHT_SYNC_INTERVAL = 20 # seconds @@ -73,10 +54,10 @@ class AsyncClient: def __init__( - self, - network: Network, - insecure: bool = False, - credentials=grpc.ssl_channel_credentials(), + self, + network: Network, + insecure: bool = False, + credentials=grpc.ssl_channel_credentials(), ): # the `insecure` parameter is ignored and will be deprecated soon. The value is taken directly from `network` @@ -93,9 +74,7 @@ def __init__( else grpc.aio.insecure_channel(network.grpc_endpoint) ) - self.stubCosmosTendermint = tendermint_query_grpc.ServiceStub( - self.chain_channel - ) + self.stubCosmosTendermint = tendermint_query_grpc.ServiceStub(self.chain_channel) self.stubAuth = auth_query_grpc.QueryStub(self.chain_channel) self.stubAuthz = authz_query_grpc.QueryStub(self.chain_channel) self.stubBank = bank_query_grpc.QueryStub(self.chain_channel) @@ -110,30 +89,16 @@ def __init__( if (network.use_secure_connection and credentials is not None) else grpc.aio.insecure_channel(network.grpc_exchange_endpoint) ) - self.stubMeta = exchange_meta_rpc_grpc.InjectiveMetaRPCStub( - self.exchange_channel - ) - self.stubExchangeAccount = exchange_accounts_rpc_grpc.InjectiveAccountsRPCStub( - self.exchange_channel - ) + self.stubMeta = exchange_meta_rpc_grpc.InjectiveMetaRPCStub(self.exchange_channel) + self.stubExchangeAccount = exchange_accounts_rpc_grpc.InjectiveAccountsRPCStub(self.exchange_channel) self.stubOracle = oracle_rpc_grpc.InjectiveOracleRPCStub(self.exchange_channel) - self.stubInsurance = insurance_rpc_grpc.InjectiveInsuranceRPCStub( - self.exchange_channel - ) - self.stubSpotExchange = spot_exchange_rpc_grpc.InjectiveSpotExchangeRPCStub( - self.exchange_channel - ) - self.stubDerivativeExchange = ( - derivative_exchange_rpc_grpc.InjectiveDerivativeExchangeRPCStub( - self.exchange_channel - ) - ) - self.stubAuction = auction_rpc_grpc.InjectiveAuctionRPCStub( - self.exchange_channel - ) - self.stubPortfolio = portfolio_rpc_grpc.InjectivePortfolioRPCStub( + self.stubInsurance = insurance_rpc_grpc.InjectiveInsuranceRPCStub(self.exchange_channel) + self.stubSpotExchange = spot_exchange_rpc_grpc.InjectiveSpotExchangeRPCStub(self.exchange_channel) + self.stubDerivativeExchange = derivative_exchange_rpc_grpc.InjectiveDerivativeExchangeRPCStub( self.exchange_channel ) + self.stubAuction = auction_rpc_grpc.InjectiveAuctionRPCStub(self.exchange_channel) + self.stubPortfolio = portfolio_rpc_grpc.InjectivePortfolioRPCStub(self.exchange_channel) # explorer stubs self.explorer_channel = ( @@ -141,9 +106,7 @@ def __init__( if (network.use_secure_connection and credentials is not None) else grpc.aio.insecure_channel(network.grpc_explorer_endpoint) ) - self.stubExplorer = explorer_rpc_grpc.InjectiveExplorerRPCStub( - self.explorer_channel - ) + self.stubExplorer = explorer_rpc_grpc.InjectiveExplorerRPCStub(self.explorer_channel) # timeout height update routine self.cron = aiocron.crontab( @@ -223,11 +186,10 @@ async def get_latest_block(self) -> tendermint_query.GetLatestBlockResponse: async def get_account(self, address: str) -> Optional[account_pb2.EthAccount]: try: - metadata = await self.network.chain_metadata( - metadata_query_provider=self._chain_cookie_metadata_requestor) - account_any = (await self.stubAuth.Account( - auth_query.QueryAccountRequest(address=address), metadata=metadata - )).account + metadata = await self.network.chain_metadata(metadata_query_provider=self._chain_cookie_metadata_requestor) + account_any = ( + await self.stubAuth.Account(auth_query.QueryAccountRequest(address=address), metadata=metadata) + ).account account = account_pb2.EthAccount() if account_any.Is(account.DESCRIPTOR): account_any.Unpack(account) @@ -235,18 +197,15 @@ async def get_account(self, address: str) -> Optional[account_pb2.EthAccount]: self.sequence = int(account.base_account.sequence) except Exception as e: LoggerProvider().logger_for_class(logging_class=self.__class__).debug( - f"error while fetching sequence and number {e}") + f"error while fetching sequence and number {e}" + ) return None async def get_request_id_by_tx_hash(self, tx_hash: bytes) -> List[int]: tx = await self.stubTx.GetTx(tx_service.GetTxRequest(hash=tx_hash)) request_ids = [] for tx in tx.tx_response.logs: - request_event = [ - event - for event in tx.events - if event.type == "request" or event.type == "report" - ] + request_event = [event for event in tx.events if event.type == "request" or event.type == "report"] if len(request_event) == 1: attrs = request_event[0].attributes attr_id = [attr for attr in attrs if attr.key == "id"] @@ -257,37 +216,28 @@ async def get_request_id_by_tx_hash(self, tx_hash: bytes) -> List[int]: raise NotFoundError("Request Id is not found") return request_ids - async def simulate_tx( - self, tx_byte: bytes - ) -> Tuple[Union[abci_type.SimulationResponse, grpc.RpcError], bool]: + async def simulate_tx(self, tx_byte: bytes) -> Tuple[Union[abci_type.SimulationResponse, grpc.RpcError], bool]: try: req = tx_service.SimulateRequest(tx_bytes=tx_byte) - metadata = await self.network.chain_metadata( - metadata_query_provider=self._chain_cookie_metadata_requestor) + metadata = await self.network.chain_metadata(metadata_query_provider=self._chain_cookie_metadata_requestor) return await self.stubTx.Simulate(request=req, metadata=metadata), True except grpc.RpcError as err: return err, False async def send_tx_sync_mode(self, tx_byte: bytes) -> abci_type.TxResponse: - req = tx_service.BroadcastTxRequest( - tx_bytes=tx_byte, mode=tx_service.BroadcastMode.BROADCAST_MODE_SYNC - ) + req = tx_service.BroadcastTxRequest(tx_bytes=tx_byte, mode=tx_service.BroadcastMode.BROADCAST_MODE_SYNC) metadata = await self.network.chain_metadata(metadata_query_provider=self._chain_cookie_metadata_requestor) result = await self.stubTx.BroadcastTx(request=req, metadata=metadata) return result.tx_response async def send_tx_async_mode(self, tx_byte: bytes) -> abci_type.TxResponse: - req = tx_service.BroadcastTxRequest( - tx_bytes=tx_byte, mode=tx_service.BroadcastMode.BROADCAST_MODE_ASYNC - ) + req = tx_service.BroadcastTxRequest(tx_bytes=tx_byte, mode=tx_service.BroadcastMode.BROADCAST_MODE_ASYNC) metadata = await self.network.chain_metadata(metadata_query_provider=self._chain_cookie_metadata_requestor) result = await self.stubTx.BroadcastTx(request=req, metadata=metadata) return result.tx_response async def send_tx_block_mode(self, tx_byte: bytes) -> abci_type.TxResponse: - req = tx_service.BroadcastTxRequest( - tx_bytes=tx_byte, mode=tx_service.BroadcastMode.BROADCAST_MODE_BLOCK - ) + req = tx_service.BroadcastTxRequest(tx_bytes=tx_byte, mode=tx_service.BroadcastMode.BROADCAST_MODE_BLOCK) metadata = await self.network.chain_metadata(metadata_query_provider=self._chain_cookie_metadata_requestor) result = await self.stubTx.BroadcastTx(request=req, metadata=metadata) return result.tx_response @@ -306,14 +256,10 @@ async def get_grants(self, granter: str, grantee: str, **kwargs): ) async def get_bank_balances(self, address: str): - return await self.stubBank.AllBalances( - bank_query.QueryAllBalancesRequest(address=address) - ) + return await self.stubBank.AllBalances(bank_query.QueryAllBalancesRequest(address=address)) async def get_bank_balance(self, address: str, denom: str): - return await self.stubBank.Balance( - bank_query.QueryBalanceRequest(address=address, denom=denom) - ) + return await self.stubBank.Balance(bank_query.QueryBalanceRequest(address=address, denom=denom)) # Injective Exchange client methods @@ -435,27 +381,21 @@ async def get_ibc_transfers(self, **kwargs): async def stream_subaccount_balance(self, subaccount_id: str, **kwargs): req = exchange_accounts_rpc_pb.StreamSubaccountBalanceRequest( - subaccount_id=subaccount_id, - denoms=kwargs.get("denoms") + subaccount_id=subaccount_id, denoms=kwargs.get("denoms") ) return self.stubExchangeAccount.StreamSubaccountBalance(req) async def get_subaccount_balance(self, subaccount_id: str, denom: str): - req = exchange_accounts_rpc_pb.SubaccountBalanceEndpointRequest( - subaccount_id=subaccount_id, denom=denom - ) + req = exchange_accounts_rpc_pb.SubaccountBalanceEndpointRequest(subaccount_id=subaccount_id, denom=denom) return await self.stubExchangeAccount.SubaccountBalanceEndpoint(req) async def get_subaccount_list(self, account_address: str): - req = exchange_accounts_rpc_pb.SubaccountsListRequest( - account_address=account_address - ) + req = exchange_accounts_rpc_pb.SubaccountsListRequest(account_address=account_address) return await self.stubExchangeAccount.SubaccountsList(req) async def get_subaccount_balances_list(self, subaccount_id: str, **kwargs): req = exchange_accounts_rpc_pb.SubaccountBalancesListRequest( - subaccount_id=subaccount_id, - denoms=kwargs.get("denoms") + subaccount_id=subaccount_id, denoms=kwargs.get("denoms") ) return await self.stubExchangeAccount.SubaccountBalancesList(req) @@ -466,7 +406,7 @@ async def get_subaccount_history(self, subaccount_id: str, **kwargs): transfer_types=kwargs.get("transfer_types"), skip=kwargs.get("skip"), limit=kwargs.get("limit"), - end_time=kwargs.get("end_time") + end_time=kwargs.get("end_time"), ) return await self.stubExchangeAccount.SubaccountHistory(req) @@ -497,20 +437,18 @@ async def get_rewards(self, **kwargs): # OracleRPC - async def stream_oracle_prices( - self, base_symbol: str, quote_symbol: str, oracle_type: str - ): + async def stream_oracle_prices(self, base_symbol: str, quote_symbol: str, oracle_type: str): req = oracle_rpc_pb.StreamPricesRequest( base_symbol=base_symbol, quote_symbol=quote_symbol, oracle_type=oracle_type ) return self.stubOracle.StreamPrices(req) async def get_oracle_prices( - self, - base_symbol: str, - quote_symbol: str, - oracle_type: str, - oracle_scale_factor: int, + self, + base_symbol: str, + quote_symbol: str, + oracle_type: str, + oracle_scale_factor: int, ): req = oracle_rpc_pb.PriceRequest( base_symbol=base_symbol, @@ -553,9 +491,7 @@ async def get_spot_markets(self, **kwargs): return await self.stubSpotExchange.Markets(req) async def stream_spot_markets(self, **kwargs): - req = spot_exchange_rpc_pb.StreamMarketsRequest( - market_ids=kwargs.get("market_ids") - ) + req = spot_exchange_rpc_pb.StreamMarketsRequest(market_ids=kwargs.get("market_ids")) metadata = await self.network.exchange_metadata( metadata_query_provider=self._exchange_cookie_metadata_requestor ) @@ -645,7 +581,7 @@ async def stream_historical_spot_orders(self, market_id: str, **kwargs): subaccount_id=kwargs.get("subaccount_id"), order_types=kwargs.get("order_types"), state=kwargs.get("state"), - execution_types=kwargs.get("execution_types") + execution_types=kwargs.get("execution_types"), ) metadata = await self.network.exchange_metadata( metadata_query_provider=self._exchange_cookie_metadata_requestor @@ -659,7 +595,7 @@ async def stream_historical_derivative_orders(self, market_id: str, **kwargs): subaccount_id=kwargs.get("subaccount_id"), order_types=kwargs.get("order_types"), state=kwargs.get("state"), - execution_types=kwargs.get("execution_types") + execution_types=kwargs.get("execution_types"), ) metadata = await self.network.exchange_metadata( metadata_query_provider=self._exchange_cookie_metadata_requestor @@ -715,9 +651,7 @@ async def get_derivative_markets(self, **kwargs): return await self.stubDerivativeExchange.Markets(req) async def stream_derivative_markets(self, **kwargs): - req = derivative_exchange_rpc_pb.StreamMarketRequest( - market_ids=kwargs.get("market_ids") - ) + req = derivative_exchange_rpc_pb.StreamMarketRequest(market_ids=kwargs.get("market_ids")) metadata = await self.network.exchange_metadata( metadata_query_provider=self._exchange_cookie_metadata_requestor ) @@ -919,9 +853,7 @@ async def get_account_portfolio(self, account_address: str): async def stream_account_portfolio(self, account_address: str, **kwargs): req = portfolio_rpc_pb.StreamAccountPortfolioRequest( - account_address=account_address, - subaccount_id=kwargs.get("subaccount_id"), - type=kwargs.get("type") + account_address=account_address, subaccount_id=kwargs.get("subaccount_id"), type=kwargs.get("type") ) metadata = await self.network.exchange_metadata( metadata_query_provider=self._exchange_cookie_metadata_requestor @@ -1010,10 +942,10 @@ async def _initialize_tokens_and_markets(self): maintenance_margin_ratio=Decimal(market_info.maintenance_margin_ratio), quote_token=quote_token, maker_fee_rate=Decimal(market_info.maker_fee_rate), - taker_fee_rate = Decimal(market_info.taker_fee_rate), - service_provider_fee = Decimal(market_info.service_provider_fee), - min_price_tick_size = Decimal(market_info.min_price_tick_size), - min_quantity_tick_size = Decimal(market_info.min_quantity_tick_size), + taker_fee_rate=Decimal(market_info.taker_fee_rate), + service_provider_fee=Decimal(market_info.service_provider_fee), + min_price_tick_size=Decimal(market_info.min_price_tick_size), + min_quantity_tick_size=Decimal(market_info.min_quantity_tick_size), ) derivative_markets[market.id] = market diff --git a/pyinjective/composer.py b/pyinjective/composer.py index 000efcf6..b543b077 100644 --- a/pyinjective/composer.py +++ b/pyinjective/composer.py @@ -2,54 +2,44 @@ from configparser import ConfigParser from decimal import Decimal from time import time +from typing import Dict, List, Optional + +from google.protobuf import any_pb2, json_format, timestamp_pb2 -from google.protobuf import any_pb2, timestamp_pb2, json_format +from pyinjective import constant +from pyinjective.proto.cosmos.base.v1beta1 import coin_pb2 as cosmos_dot_base_dot_v1beta1_dot_coin__pb2 +from pyinjective.proto.injective.exchange.v1beta1 import ( + exchange_pb2 as injective_dot_exchange_dot_v1beta1_dot_exchange__pb2, +) +from .constant import ADDITIONAL_CHAIN_FORMAT_DECIMALS, INJ_DENOM from .core.market import BinaryOptionMarket, DerivativeMarket, SpotMarket from .core.token import Token from .proto.cosmos.authz.v1beta1 import authz_pb2 as cosmos_authz_pb from .proto.cosmos.authz.v1beta1 import tx_pb2 as cosmos_authz_tx_pb - -from .proto.injective.exchange.v1beta1 import authz_pb2 as injective_authz_pb - from .proto.cosmos.bank.v1beta1 import tx_pb2 as cosmos_bank_tx_pb - -from .proto.injective.exchange.v1beta1 import tx_pb2 as injective_exchange_tx_pb -from pyinjective.proto.injective.exchange.v1beta1 import exchange_pb2 as injective_dot_exchange_dot_v1beta1_dot_exchange__pb2 - -from .proto.injective.auction.v1beta1 import tx_pb2 as injective_auction_tx_pb - -from .proto.injective.peggy.v1 import msgs_pb2 as injective_peggy_tx_pb - -from .proto.injective.oracle.v1beta1 import tx_pb2 as injective_oracle_tx_pb - -from .proto.cosmos.staking.v1beta1 import tx_pb2 as cosmos_staking_tx_pb - from .proto.cosmos.distribution.v1beta1 import tx_pb2 as cosmos_distribution_tx_pb - from .proto.cosmos.gov.v1beta1 import tx_pb2 as cosmos_gov_tx_pb - -from .proto.injective.insurance.v1beta1 import tx_pb2 as injective_insurance_tx_pb - -from pyinjective.proto.cosmos.base.v1beta1 import coin_pb2 as cosmos_dot_base_dot_v1beta1_dot_coin__pb2 - +from .proto.cosmos.staking.v1beta1 import tx_pb2 as cosmos_staking_tx_pb from .proto.cosmwasm.wasm.v1 import tx_pb2 as wasm_tx_pb - -from .constant import ADDITIONAL_CHAIN_FORMAT_DECIMALS, INJ_DENOM -from typing import Dict, List, Optional - -from pyinjective import constant +from .proto.injective.auction.v1beta1 import tx_pb2 as injective_auction_tx_pb +from .proto.injective.exchange.v1beta1 import authz_pb2 as injective_authz_pb +from .proto.injective.exchange.v1beta1 import tx_pb2 as injective_exchange_tx_pb +from .proto.injective.insurance.v1beta1 import tx_pb2 as injective_insurance_tx_pb +from .proto.injective.oracle.v1beta1 import tx_pb2 as injective_oracle_tx_pb +from .proto.injective.peggy.v1 import msgs_pb2 as injective_peggy_tx_pb class Composer: def __init__( - self, - network: str, - spot_markets: Optional[Dict[str, SpotMarket]] = None, - derivative_markets: Optional[Dict[str, DerivativeMarket]] = None, - binary_option_markets: Optional[Dict[str, BinaryOptionMarket]] = None, - tokens: Optional[Dict[str, Token]] = None): - """ Composer is used to create the requests to send to the nodes using the Client + self, + network: str, + spot_markets: Optional[Dict[str, SpotMarket]] = None, + derivative_markets: Optional[Dict[str, DerivativeMarket]] = None, + binary_option_markets: Optional[Dict[str, BinaryOptionMarket]] = None, + tokens: Optional[Dict[str, Token]] = None, + ): + """Composer is used to create the requests to send to the nodes using the Client :param network: the name of the network to use (mainnet, testnet, devnet) :type network: str @@ -110,7 +100,6 @@ def get_order_mask(self, **kwargs): return order_mask def OrderData(self, market_id: str, subaccount_id: str, order_hash: str, **kwargs): - order_mask = self.get_order_mask(**kwargs) return injective_exchange_tx_pb.OrderData( @@ -232,7 +221,6 @@ def BinaryOptionsOrder( quantity: float, **kwargs, ): - market = self.binary_option_markets[market_id] denom = kwargs.get("denom", None) @@ -291,7 +279,8 @@ def MsgExecuteContract(self, sender: str, contract: str, msg: str, **kwargs): sender=sender, contract=contract, msg=bytes(msg, "utf-8"), - funds=kwargs.get('funds') # funds is a list of cosmos_dot_base_dot_v1beta1_dot_coin__pb2.Coin. The coins in the list must be sorted in alphabetical order by denoms. + funds=kwargs.get("funds") # funds is a list of cosmos_dot_base_dot_v1beta1_dot_coin__pb2.Coin. + # The coins in the list must be sorted in alphabetical order by denoms. ) def MsgDeposit(self, sender: str, subaccount_id: str, amount: float, denom: str): @@ -348,9 +337,7 @@ def MsgCreateSpotMarketOrder( ), ) - def MsgCancelSpotOrder( - self, market_id: str, sender: str, subaccount_id: str, order_hash: str - ): + def MsgCancelSpotOrder(self, market_id: str, sender: str, subaccount_id: str, order_hash: str): return injective_exchange_tx_pb.MsgCancelSpotOrder( sender=sender, market_id=market_id, @@ -359,19 +346,13 @@ def MsgCancelSpotOrder( ) def MsgBatchCreateSpotLimitOrders(self, sender: str, orders: List): - return injective_exchange_tx_pb.MsgBatchCreateSpotLimitOrders( - sender=sender, orders=orders - ) + return injective_exchange_tx_pb.MsgBatchCreateSpotLimitOrders(sender=sender, orders=orders) def MsgBatchCancelSpotOrders(self, sender: str, data: List): - return injective_exchange_tx_pb.MsgBatchCancelSpotOrders( - sender=sender, data=data - ) + return injective_exchange_tx_pb.MsgBatchCancelSpotOrders(sender=sender, data=data) def MsgRewardsOptOut(self, sender: str): - return injective_exchange_tx_pb.MsgRewardsOptOut( - sender=sender - ) + return injective_exchange_tx_pb.MsgRewardsOptOut(sender=sender) def MsgCreateDerivativeLimitOrder( self, @@ -429,7 +410,6 @@ def MsgCreateBinaryOptionsLimitOrder( quantity: float, **kwargs, ): - return injective_exchange_tx_pb.MsgCreateBinaryOptionsLimitOrder( sender=sender, order=self.BinaryOptionsOrder( @@ -464,10 +444,7 @@ def MsgCreateBinaryOptionsMarketOrder( ), ) - def MsgCancelBinaryOptionsOrder( - self, sender: str, market_id: str, subaccount_id: str, order_hash: str - ): - + def MsgCancelBinaryOptionsOrder(self, sender: str, market_id: str, subaccount_id: str, order_hash: str): return injective_exchange_tx_pb.MsgCancelBinaryOptionsOrder( sender=sender, market_id=market_id, @@ -482,7 +459,6 @@ def MsgAdminUpdateBinaryOptionsMarket( status: str, **kwargs, ): - price_to_bytes = None if kwargs.get("settlement_price") is not None: @@ -501,9 +477,7 @@ def MsgAdminUpdateBinaryOptionsMarket( status=status, ) - def MsgRelayProviderPrices( - self, sender: str, provider: str, symbols: list, prices: list - ): + def MsgRelayProviderPrices(self, sender: str, provider: str, symbols: list, prices: list): oracle_prices = [] for price in prices: @@ -533,16 +507,13 @@ def MsgInstantBinaryOptionsMarketLaunch( min_quantity_tick_size: float, **kwargs, ): - scaled_maker_fee_rate = Decimal((maker_fee_rate * pow(10, 18))) maker_fee_to_bytes = bytes(str(scaled_maker_fee_rate), "utf-8") scaled_taker_fee_rate = Decimal((taker_fee_rate * pow(10, 18))) taker_fee_to_bytes = bytes(str(scaled_taker_fee_rate), "utf-8") - scaled_min_price_tick_size = Decimal( - (min_price_tick_size * pow(10, quote_decimals + 18)) - ) + scaled_min_price_tick_size = Decimal((min_price_tick_size * pow(10, quote_decimals + 18))) min_price_to_bytes = bytes(str(scaled_min_price_tick_size), "utf-8") scaled_min_quantity_tick_size = Decimal((min_quantity_tick_size * pow(10, 18))) @@ -565,9 +536,7 @@ def MsgInstantBinaryOptionsMarketLaunch( admin=kwargs.get("admin"), ) - def MsgCancelDerivativeOrder( - self, market_id: str, sender: str, subaccount_id: str, order_hash: str, **kwargs - ): + def MsgCancelDerivativeOrder(self, market_id: str, sender: str, subaccount_id: str, order_hash: str, **kwargs): order_mask = self.get_order_mask(**kwargs) return injective_exchange_tx_pb.MsgCancelDerivativeOrder( @@ -579,36 +548,24 @@ def MsgCancelDerivativeOrder( ) def MsgBatchCreateDerivativeLimitOrders(self, sender: str, orders: List): - return injective_exchange_tx_pb.MsgBatchCreateDerivativeLimitOrders( - sender=sender, orders=orders - ) + return injective_exchange_tx_pb.MsgBatchCreateDerivativeLimitOrders(sender=sender, orders=orders) def MsgBatchCancelDerivativeOrders(self, sender: str, data: List): - return injective_exchange_tx_pb.MsgBatchCancelDerivativeOrders( - sender=sender, data=data - ) + return injective_exchange_tx_pb.MsgBatchCancelDerivativeOrders(sender=sender, data=data) def MsgBatchUpdateOrders(self, sender: str, **kwargs): return injective_exchange_tx_pb.MsgBatchUpdateOrders( sender=sender, subaccount_id=kwargs.get("subaccount_id"), spot_market_ids_to_cancel_all=kwargs.get("spot_market_ids_to_cancel_all"), - derivative_market_ids_to_cancel_all=kwargs.get( - "derivative_market_ids_to_cancel_all" - ), + derivative_market_ids_to_cancel_all=kwargs.get("derivative_market_ids_to_cancel_all"), spot_orders_to_cancel=kwargs.get("spot_orders_to_cancel"), derivative_orders_to_cancel=kwargs.get("derivative_orders_to_cancel"), spot_orders_to_create=kwargs.get("spot_orders_to_create"), derivative_orders_to_create=kwargs.get("derivative_orders_to_create"), - binary_options_orders_to_cancel=kwargs.get( - "binary_options_orders_to_cancel" - ), - binary_options_market_ids_to_cancel_all=kwargs.get( - "binary_options_market_ids_to_cancel_all" - ), - binary_options_orders_to_create=kwargs.get( - "binary_options_orders_to_create" - ), + binary_options_orders_to_cancel=kwargs.get("binary_options_orders_to_cancel"), + binary_options_market_ids_to_cancel_all=kwargs.get("binary_options_market_ids_to_cancel_all"), + binary_options_orders_to_create=kwargs.get("binary_options_orders_to_create"), ) def MsgLiquidatePosition(self, sender: str, subaccount_id: str, market_id: str): @@ -643,13 +600,14 @@ def MsgSubaccountTransfer( amount: int, denom: str, ): - peggy_denom, decimals = Denom.load_peggy_denom(self.network, denom) - be_amount = amount_to_backend(amount, decimals) + token = self.tokens[denom] + be_amount = token.chain_formatted_value(human_readable_value=Decimal(str(amount))) + return injective_exchange_tx_pb.MsgSubaccountTransfer( sender=sender, source_subaccount_id=source_subaccount_id, destination_subaccount_id=destination_subaccount_id, - amount=self.Coin(amount=be_amount, denom=peggy_denom), + amount=self.Coin(amount=int(be_amount), denom=token.denom), ) def MsgWithdraw(self, sender: str, subaccount_id: str, amount: float, denom: str): @@ -681,7 +639,6 @@ def MsgExternalTransfer( ) def MsgBid(self, sender: str, bid_amount: float, round: float): - be_amount = Decimal(str(bid_amount)) * Decimal(f"1e{ADDITIONAL_CHAIN_FORMAT_DECIMALS}") return injective_auction_tx_pb.MsgBid( @@ -690,9 +647,7 @@ def MsgBid(self, sender: str, bid_amount: float, round: float): bid_amount=self.Coin(amount=int(be_amount), denom=INJ_DENOM), ) - def MsgGrantGeneric( - self, granter: str, grantee: str, msg_type: str, expire_in: int - ): + def MsgGrantGeneric(self, granter: str, grantee: str, msg_type: str, expire_in: int): auth = cosmos_authz_pb.GenericAuthorization(msg=msg_type) any_auth = any_pb2.Any() any_auth.Pack(auth, type_url_prefix="") @@ -702,9 +657,7 @@ def MsgGrantGeneric( expiration=timestamp_pb2.Timestamp(seconds=(int(time()) + expire_in)), ) - return cosmos_authz_tx_pb.MsgGrant( - granter=granter, grantee=grantee, grant=grant - ) + return cosmos_authz_tx_pb.MsgGrant(granter=granter, grantee=grantee, grant=grant) def MsgGrantTyped( self, @@ -771,9 +724,7 @@ def MsgGrantTyped( expiration=timestamp_pb2.Timestamp(seconds=(int(time()) + expire_in)), ) - return cosmos_authz_tx_pb.MsgGrant( - granter=granter, grantee=grantee, grant=grant - ) + return cosmos_authz_tx_pb.MsgGrant(granter=granter, grantee=grantee, grant=grant) def MsgExec(self, grantee: str, msgs: List): any_msgs: List[any_pb2.Any] = [] @@ -785,21 +736,12 @@ def MsgExec(self, grantee: str, msgs: List): return cosmos_authz_tx_pb.MsgExec(grantee=grantee, msgs=any_msgs) def MsgRevoke(self, granter: str, grantee: str, msg_type: str): - return cosmos_authz_tx_pb.MsgRevoke( - granter=granter, grantee=grantee, msg_type_url=msg_type - ) + return cosmos_authz_tx_pb.MsgRevoke(granter=granter, grantee=grantee, msg_type_url=msg_type) - def MsgRelayPriceFeedPrice( - self, sender: list, base: list, quote: list, price: list - ): + def MsgRelayPriceFeedPrice(self, sender: list, base: list, quote: list, price: list): + return injective_oracle_tx_pb.MsgRelayPriceFeedPrice(sender=sender, base=base, quote=quote, price=price) - return injective_oracle_tx_pb.MsgRelayPriceFeedPrice( - sender=sender, base=base, quote=quote, price=price - ) - - def MsgSendToEth( - self, denom: str, sender: str, eth_dest: str, amount: float, bridge_fee: float - ): + def MsgSendToEth(self, denom: str, sender: str, eth_dest: str, amount: float, bridge_fee: float): token = self.tokens[denom] be_amount = token.chain_formatted_value(human_readable_value=Decimal(str(amount))) be_bridge_fee = token.chain_formatted_value(human_readable_value=Decimal(str(bridge_fee))) @@ -811,10 +753,7 @@ def MsgSendToEth( bridge_fee=self.Coin(amount=int(be_bridge_fee), denom=token.denom), ) - def MsgDelegate( - self, delegator_address: str, validator_address: str, amount: float - ): - + def MsgDelegate(self, delegator_address: str, validator_address: str, amount: float): be_amount = Decimal(str(amount)) * Decimal(f"1e{ADDITIONAL_CHAIN_FORMAT_DECIMALS}") return cosmos_staking_tx_pb.MsgDelegate( @@ -832,7 +771,7 @@ def MsgCreateInsuranceFund( oracle_quote: str, oracle_type: int, expiry: int, - initial_deposit: int + initial_deposit: int, ): token = self.tokens[quote_denom] be_amount = token.chain_formatted_value(human_readable_value=Decimal(str(initial_deposit))) @@ -859,7 +798,9 @@ def MsgUnderwrite( be_amount = token.chain_formatted_value(human_readable_value=Decimal(str(amount))) return injective_insurance_tx_pb.MsgUnderwrite( - sender=sender, market_id=market_id, deposit=self.Coin(amount=int(be_amount), denom=token.denom), + sender=sender, + market_id=market_id, + deposit=self.Coin(amount=int(be_amount), denom=token.denom), ) def MsgRequestRedemption( @@ -869,26 +810,19 @@ def MsgRequestRedemption( share_denom: str, amount: int, ): - return injective_insurance_tx_pb.MsgRequestRedemption( - sender=sender, market_id=market_id, amount=self.Coin(amount=amount, denom=share_denom), + sender=sender, + market_id=market_id, + amount=self.Coin(amount=amount, denom=share_denom), ) - def MsgWithdrawDelegatorReward( - self, delegator_address: str, validator_address: str - ): - + def MsgWithdrawDelegatorReward(self, delegator_address: str, validator_address: str): return cosmos_distribution_tx_pb.MsgWithdrawDelegatorReward( delegator_address=delegator_address, validator_address=validator_address ) - def MsgWithdrawValidatorCommission( - self, validator_address: str - ): - - return cosmos_distribution_tx_pb.MsgWithdrawValidatorCommission( - validator_address=validator_address - ) + def MsgWithdrawValidatorCommission(self, validator_address: str): + return cosmos_distribution_tx_pb.MsgWithdrawValidatorCommission(validator_address=validator_address) def MsgVote( self, @@ -896,27 +830,30 @@ def MsgVote( voter: str, option: int, ): + return cosmos_gov_tx_pb.MsgVote(proposal_id=proposal_id, voter=voter, option=option) - return cosmos_gov_tx_pb.MsgVote( - proposal_id=proposal_id, voter=voter, option=option - ) - - def MsgPrivilegedExecuteContract(self, sender: str, contract: str, msg: str, **kwargs) -> injective_exchange_tx_pb.MsgPrivilegedExecuteContract: + def MsgPrivilegedExecuteContract( + self, sender: str, contract: str, msg: str, **kwargs + ) -> injective_exchange_tx_pb.MsgPrivilegedExecuteContract: return injective_exchange_tx_pb.MsgPrivilegedExecuteContract( sender=sender, contract_address=contract, data=msg, - funds=kwargs.get('funds') # funds is a string of Coin strings, comma separated, e.g 100000inj,20000000000usdt + funds=kwargs.get("funds") # funds is a string of Coin strings, comma separated, + # e.g. 100000inj,20000000000usdt ) - def MsgInstantiateContract(self, sender: str, admin: str, code_id: int, label: str, message: bytes, **kwargs) -> wasm_tx_pb.MsgInstantiateContract: + def MsgInstantiateContract( + self, sender: str, admin: str, code_id: int, label: str, message: bytes, **kwargs + ) -> wasm_tx_pb.MsgInstantiateContract: return wasm_tx_pb.MsgInstantiateContract( sender=sender, admin=admin, code_id=code_id, label=label, msg=message, - funds=kwargs.get('funds'), # funds is a list of cosmos_dot_base_dot_v1beta1_dot_coin__pb2.Coin. The coins in the list must be sorted in alphabetical order by denoms. + funds=kwargs.get("funds"), # funds is a list of cosmos_dot_base_dot_v1beta1_dot_coin__pb2.Coin. + # The coins in the list must be sorted in alphabetical order by denoms. ) # data field format: [request-msg-header][raw-byte-msg-response] @@ -927,37 +864,66 @@ def MsgResponses(response, simulation=False): data = response.result if not simulation: data = bytes.fromhex(data) + # fmt: off header_map = { - "/injective.exchange.v1beta1.MsgCreateSpotLimitOrderResponse": injective_exchange_tx_pb.MsgCreateSpotLimitOrderResponse, - "/injective.exchange.v1beta1.MsgCreateSpotMarketOrderResponse": injective_exchange_tx_pb.MsgCreateSpotMarketOrderResponse, - "/injective.exchange.v1beta1.MsgCreateDerivativeLimitOrderResponse": injective_exchange_tx_pb.MsgCreateDerivativeLimitOrderResponse, - "/injective.exchange.v1beta1.MsgCreateDerivativeMarketOrderResponse": injective_exchange_tx_pb.MsgCreateDerivativeMarketOrderResponse, - "/injective.exchange.v1beta1.MsgCancelSpotOrderResponse": injective_exchange_tx_pb.MsgCancelSpotOrderResponse, - "/injective.exchange.v1beta1.MsgCancelDerivativeOrderResponse": injective_exchange_tx_pb.MsgCancelDerivativeOrderResponse, - "/injective.exchange.v1beta1.MsgBatchCancelSpotOrdersResponse": injective_exchange_tx_pb.MsgBatchCancelSpotOrdersResponse, - "/injective.exchange.v1beta1.MsgBatchCancelDerivativeOrdersResponse": injective_exchange_tx_pb.MsgBatchCancelDerivativeOrdersResponse, - "/injective.exchange.v1beta1.MsgBatchCreateSpotLimitOrdersResponse": injective_exchange_tx_pb.MsgBatchCreateSpotLimitOrdersResponse, - "/injective.exchange.v1beta1.MsgBatchCreateDerivativeLimitOrdersResponse": injective_exchange_tx_pb.MsgBatchCreateDerivativeLimitOrdersResponse, - "/injective.exchange.v1beta1.MsgBatchUpdateOrdersResponse": injective_exchange_tx_pb.MsgBatchUpdateOrdersResponse, - "/injective.exchange.v1beta1.MsgDepositResponse": injective_exchange_tx_pb.MsgDepositResponse, - "/injective.exchange.v1beta1.MsgWithdrawResponse": injective_exchange_tx_pb.MsgWithdrawResponse, - "/injective.exchange.v1beta1.MsgSubaccountTransferResponse": injective_exchange_tx_pb.MsgSubaccountTransferResponse, - "/injective.exchange.v1beta1.MsgLiquidatePositionResponse": injective_exchange_tx_pb.MsgLiquidatePositionResponse, - "/injective.exchange.v1beta1.MsgIncreasePositionMarginResponse": injective_exchange_tx_pb.MsgIncreasePositionMarginResponse, - "/injective.auction.v1beta1.MsgBidResponse": injective_auction_tx_pb.MsgBidResponse, - "/injective.exchange.v1beta1.MsgCreateBinaryOptionsLimitOrderResponse": injective_exchange_tx_pb.MsgCreateBinaryOptionsLimitOrderResponse, - "/injective.exchange.v1beta1.MsgCreateBinaryOptionsMarketOrderResponse": injective_exchange_tx_pb.MsgCreateBinaryOptionsMarketOrderResponse, - "/injective.exchange.v1beta1.MsgCancelBinaryOptionsOrderResponse": injective_exchange_tx_pb.MsgCancelBinaryOptionsOrderResponse, - "/injective.exchange.v1beta1.MsgAdminUpdateBinaryOptionsMarketResponse": injective_exchange_tx_pb.MsgAdminUpdateBinaryOptionsMarketResponse, - "/injective.exchange.v1beta1.MsgInstantBinaryOptionsMarketLaunchResponse": injective_exchange_tx_pb.MsgInstantBinaryOptionsMarketLaunchResponse, - "/cosmos.bank.v1beta1.MsgSendResponse": cosmos_bank_tx_pb.MsgSendResponse, - "/cosmos.authz.v1beta1.MsgGrantResponse": cosmos_authz_tx_pb.MsgGrantResponse, - "/cosmos.authz.v1beta1.MsgExecResponse": cosmos_authz_tx_pb.MsgExecResponse, - "/cosmos.authz.v1beta1.MsgRevokeResponse": cosmos_authz_tx_pb.MsgRevokeResponse, - "/injective.oracle.v1beta1.MsgRelayPriceFeedPriceResponse": injective_oracle_tx_pb.MsgRelayPriceFeedPriceResponse, - "/injective.oracle.v1beta1.MsgRelayProviderPricesResponse": injective_oracle_tx_pb.MsgRelayProviderPrices, + "/injective.exchange.v1beta1.MsgCreateSpotLimitOrderResponse": + injective_exchange_tx_pb.MsgCreateSpotLimitOrderResponse, + "/injective.exchange.v1beta1.MsgCreateSpotMarketOrderResponse": + injective_exchange_tx_pb.MsgCreateSpotMarketOrderResponse, + "/injective.exchange.v1beta1.MsgCreateDerivativeLimitOrderResponse": + injective_exchange_tx_pb.MsgCreateDerivativeLimitOrderResponse, + "/injective.exchange.v1beta1.MsgCreateDerivativeMarketOrderResponse": + injective_exchange_tx_pb.MsgCreateDerivativeMarketOrderResponse, + "/injective.exchange.v1beta1.MsgCancelSpotOrderResponse": + injective_exchange_tx_pb.MsgCancelSpotOrderResponse, + "/injective.exchange.v1beta1.MsgCancelDerivativeOrderResponse": + injective_exchange_tx_pb.MsgCancelDerivativeOrderResponse, + "/injective.exchange.v1beta1.MsgBatchCancelSpotOrdersResponse": + injective_exchange_tx_pb.MsgBatchCancelSpotOrdersResponse, + "/injective.exchange.v1beta1.MsgBatchCancelDerivativeOrdersResponse": + injective_exchange_tx_pb.MsgBatchCancelDerivativeOrdersResponse, + "/injective.exchange.v1beta1.MsgBatchCreateSpotLimitOrdersResponse": + injective_exchange_tx_pb.MsgBatchCreateSpotLimitOrdersResponse, + "/injective.exchange.v1beta1.MsgBatchCreateDerivativeLimitOrdersResponse": + injective_exchange_tx_pb.MsgBatchCreateDerivativeLimitOrdersResponse, + "/injective.exchange.v1beta1.MsgBatchUpdateOrdersResponse": + injective_exchange_tx_pb.MsgBatchUpdateOrdersResponse, + "/injective.exchange.v1beta1.MsgDepositResponse": + injective_exchange_tx_pb.MsgDepositResponse, + "/injective.exchange.v1beta1.MsgWithdrawResponse": + injective_exchange_tx_pb.MsgWithdrawResponse, + "/injective.exchange.v1beta1.MsgSubaccountTransferResponse": + injective_exchange_tx_pb.MsgSubaccountTransferResponse, + "/injective.exchange.v1beta1.MsgLiquidatePositionResponse": + injective_exchange_tx_pb.MsgLiquidatePositionResponse, + "/injective.exchange.v1beta1.MsgIncreasePositionMarginResponse": + injective_exchange_tx_pb.MsgIncreasePositionMarginResponse, + "/injective.auction.v1beta1.MsgBidResponse": + injective_auction_tx_pb.MsgBidResponse, + "/injective.exchange.v1beta1.MsgCreateBinaryOptionsLimitOrderResponse": + injective_exchange_tx_pb.MsgCreateBinaryOptionsLimitOrderResponse, + "/injective.exchange.v1beta1.MsgCreateBinaryOptionsMarketOrderResponse": + injective_exchange_tx_pb.MsgCreateBinaryOptionsMarketOrderResponse, + "/injective.exchange.v1beta1.MsgCancelBinaryOptionsOrderResponse": + injective_exchange_tx_pb.MsgCancelBinaryOptionsOrderResponse, + "/injective.exchange.v1beta1.MsgAdminUpdateBinaryOptionsMarketResponse": + injective_exchange_tx_pb.MsgAdminUpdateBinaryOptionsMarketResponse, + "/injective.exchange.v1beta1.MsgInstantBinaryOptionsMarketLaunchResponse": + injective_exchange_tx_pb.MsgInstantBinaryOptionsMarketLaunchResponse, + "/cosmos.bank.v1beta1.MsgSendResponse": + cosmos_bank_tx_pb.MsgSendResponse, + "/cosmos.authz.v1beta1.MsgGrantResponse": + cosmos_authz_tx_pb.MsgGrantResponse, + "/cosmos.authz.v1beta1.MsgExecResponse": + cosmos_authz_tx_pb.MsgExecResponse, + "/cosmos.authz.v1beta1.MsgRevokeResponse": + cosmos_authz_tx_pb.MsgRevokeResponse, + "/injective.oracle.v1beta1.MsgRelayPriceFeedPriceResponse": + injective_oracle_tx_pb.MsgRelayPriceFeedPriceResponse, + "/injective.oracle.v1beta1.MsgRelayProviderPricesResponse": + injective_oracle_tx_pb.MsgRelayProviderPrices, } - + # fmt: on msgs = [] for msg in data.msg_responses: msgs.append(header_map[msg.type_url].FromString(msg.value)) @@ -966,29 +932,52 @@ def MsgResponses(response, simulation=False): @staticmethod def UnpackMsgExecResponse(msg_type, data): + # fmt: off header_map = { - "MsgCreateSpotLimitOrder": injective_exchange_tx_pb.MsgCreateSpotLimitOrderResponse, - "MsgCreateSpotMarketOrder": injective_exchange_tx_pb.MsgCreateSpotMarketOrderResponse, - "MsgCreateDerivativeLimitOrder": injective_exchange_tx_pb.MsgCreateDerivativeLimitOrderResponse, - "MsgCreateDerivativeMarketOrder": injective_exchange_tx_pb.MsgCreateDerivativeMarketOrderResponse, - "MsgCancelSpotOrder": injective_exchange_tx_pb.MsgCancelSpotOrderResponse, - "MsgCancelDerivativeOrder": injective_exchange_tx_pb.MsgCancelDerivativeOrderResponse, - "MsgBatchCancelSpotOrders": injective_exchange_tx_pb.MsgBatchCancelSpotOrdersResponse, - "MsgBatchCancelDerivativeOrders": injective_exchange_tx_pb.MsgBatchCancelDerivativeOrdersResponse, - "MsgBatchCreateSpotLimitOrders": injective_exchange_tx_pb.MsgBatchCreateSpotLimitOrdersResponse, - "MsgBatchCreateDerivativeLimitOrders": injective_exchange_tx_pb.MsgBatchCreateDerivativeLimitOrdersResponse, - "MsgBatchUpdateOrders": injective_exchange_tx_pb.MsgBatchUpdateOrdersResponse, - "MsgDeposit": injective_exchange_tx_pb.MsgDepositResponse, - "MsgWithdraw": injective_exchange_tx_pb.MsgWithdrawResponse, - "MsgSubaccountTransfer": injective_exchange_tx_pb.MsgSubaccountTransferResponse, - "MsgLiquidatePosition": injective_exchange_tx_pb.MsgLiquidatePositionResponse, - "MsgIncreasePositionMargin": injective_exchange_tx_pb.MsgIncreasePositionMarginResponse, - "MsgCreateBinaryOptionsLimitOrder": injective_exchange_tx_pb.MsgCreateBinaryOptionsLimitOrderResponse, - "MsgCreateBinaryOptionsMarketOrder": injective_exchange_tx_pb.MsgCreateBinaryOptionsMarketOrderResponse, - "MsgCancelBinaryOptionsOrder": injective_exchange_tx_pb.MsgCancelBinaryOptionsOrderResponse, - "MsgAdminUpdateBinaryOptionsMarket": injective_exchange_tx_pb.MsgAdminUpdateBinaryOptionsMarketResponse, - "MsgInstantBinaryOptionsMarketLaunch": injective_exchange_tx_pb.MsgInstantBinaryOptionsMarketLaunchResponse, + "MsgCreateSpotLimitOrder": + injective_exchange_tx_pb.MsgCreateSpotLimitOrderResponse, + "MsgCreateSpotMarketOrder": + injective_exchange_tx_pb.MsgCreateSpotMarketOrderResponse, + "MsgCreateDerivativeLimitOrder": + injective_exchange_tx_pb.MsgCreateDerivativeLimitOrderResponse, + "MsgCreateDerivativeMarketOrder": + injective_exchange_tx_pb.MsgCreateDerivativeMarketOrderResponse, + "MsgCancelSpotOrder": + injective_exchange_tx_pb.MsgCancelSpotOrderResponse, + "MsgCancelDerivativeOrder": + injective_exchange_tx_pb.MsgCancelDerivativeOrderResponse, + "MsgBatchCancelSpotOrders": + injective_exchange_tx_pb.MsgBatchCancelSpotOrdersResponse, + "MsgBatchCancelDerivativeOrders": + injective_exchange_tx_pb.MsgBatchCancelDerivativeOrdersResponse, + "MsgBatchCreateSpotLimitOrders": + injective_exchange_tx_pb.MsgBatchCreateSpotLimitOrdersResponse, + "MsgBatchCreateDerivativeLimitOrders": + injective_exchange_tx_pb.MsgBatchCreateDerivativeLimitOrdersResponse, + "MsgBatchUpdateOrders": + injective_exchange_tx_pb.MsgBatchUpdateOrdersResponse, + "MsgDeposit": + injective_exchange_tx_pb.MsgDepositResponse, + "MsgWithdraw": + injective_exchange_tx_pb.MsgWithdrawResponse, + "MsgSubaccountTransfer": + injective_exchange_tx_pb.MsgSubaccountTransferResponse, + "MsgLiquidatePosition": + injective_exchange_tx_pb.MsgLiquidatePositionResponse, + "MsgIncreasePositionMargin": + injective_exchange_tx_pb.MsgIncreasePositionMarginResponse, + "MsgCreateBinaryOptionsLimitOrder": + injective_exchange_tx_pb.MsgCreateBinaryOptionsLimitOrderResponse, + "MsgCreateBinaryOptionsMarketOrder": + injective_exchange_tx_pb.MsgCreateBinaryOptionsMarketOrderResponse, + "MsgCancelBinaryOptionsOrder": + injective_exchange_tx_pb.MsgCancelBinaryOptionsOrderResponse, + "MsgAdminUpdateBinaryOptionsMarket": + injective_exchange_tx_pb.MsgAdminUpdateBinaryOptionsMarketResponse, + "MsgInstantBinaryOptionsMarketLaunch": + injective_exchange_tx_pb.MsgInstantBinaryOptionsMarketLaunchResponse, } + # fmt: on responses = [header_map[msg_type].FromString(result) for result in data.results] return responses @@ -996,38 +985,66 @@ def UnpackMsgExecResponse(msg_type, data): @staticmethod def UnpackTransactionMessages(transaction): meta_messages = json.loads(transaction.messages.decode()) - + # fmt: off header_map = { - "/injective.exchange.v1beta1.MsgCreateSpotLimitOrder": injective_exchange_tx_pb.MsgCreateSpotLimitOrder, - "/injective.exchange.v1beta1.MsgCreateSpotMarketOrder": injective_exchange_tx_pb.MsgCreateSpotMarketOrder, - "/injective.exchange.v1beta1.MsgCreateDerivativeLimitOrder": injective_exchange_tx_pb.MsgCreateDerivativeLimitOrder, - "/injective.exchange.v1beta1.MsgCreateDerivativeMarketOrder": injective_exchange_tx_pb.MsgCreateDerivativeMarketOrder, - "/injective.exchange.v1beta1.MsgCancelSpotOrder": injective_exchange_tx_pb.MsgCancelSpotOrder, - "/injective.exchange.v1beta1.MsgCancelDerivativeOrder": injective_exchange_tx_pb.MsgCancelDerivativeOrder, - "/injective.exchange.v1beta1.MsgBatchCancelSpotOrders": injective_exchange_tx_pb.MsgBatchCancelSpotOrders, - "/injective.exchange.v1beta1.MsgBatchCancelDerivativeOrders": injective_exchange_tx_pb.MsgBatchCancelDerivativeOrders, - "/injective.exchange.v1beta1.MsgBatchCreateSpotLimitOrders": injective_exchange_tx_pb.MsgBatchCreateSpotLimitOrders, - "/injective.exchange.v1beta1.MsgBatchCreateDerivativeLimitOrders": injective_exchange_tx_pb.MsgBatchCreateDerivativeLimitOrders, - "/injective.exchange.v1beta1.MsgBatchUpdateOrders": injective_exchange_tx_pb.MsgBatchUpdateOrders, - "/injective.exchange.v1beta1.MsgDeposit": injective_exchange_tx_pb.MsgDeposit, - "/injective.exchange.v1beta1.MsgWithdraw": injective_exchange_tx_pb.MsgWithdraw, - "/injective.exchange.v1beta1.MsgSubaccountTransfer": injective_exchange_tx_pb.MsgSubaccountTransfer, - "/injective.exchange.v1beta1.MsgLiquidatePosition": injective_exchange_tx_pb.MsgLiquidatePosition, - "/injective.exchange.v1beta1.MsgIncreasePositionMargin": injective_exchange_tx_pb.MsgIncreasePositionMargin, - "/injective.auction.v1beta1.MsgBid": injective_auction_tx_pb.MsgBid, - "/injective.exchange.v1beta1.MsgCreateBinaryOptionsLimitOrder": injective_exchange_tx_pb.MsgCreateBinaryOptionsLimitOrder, - "/injective.exchange.v1beta1.MsgCreateBinaryOptionsMarketOrder": injective_exchange_tx_pb.MsgCreateBinaryOptionsMarketOrder, - "/injective.exchange.v1beta1.MsgCancelBinaryOptionsOrder": injective_exchange_tx_pb.MsgCancelBinaryOptionsOrder, - "/injective.exchange.v1beta1.MsgAdminUpdateBinaryOptionsMarket": injective_exchange_tx_pb.MsgAdminUpdateBinaryOptionsMarket, - "/injective.exchange.v1beta1.MsgInstantBinaryOptionsMarketLaunch": injective_exchange_tx_pb.MsgInstantBinaryOptionsMarketLaunch, - "/cosmos.bank.v1beta1.MsgSend": cosmos_bank_tx_pb.MsgSend, - "/cosmos.authz.v1beta1.MsgGrant": cosmos_authz_tx_pb.MsgGrant, - "/cosmos.authz.v1beta1.MsgExec": cosmos_authz_tx_pb.MsgExec, - "/cosmos.authz.v1beta1.MsgRevoke": cosmos_authz_tx_pb.MsgRevoke, - "/injective.oracle.v1beta1.MsgRelayPriceFeedPrice": injective_oracle_tx_pb.MsgRelayPriceFeedPrice, - "/injective.oracle.v1beta1.MsgRelayProviderPrices": injective_oracle_tx_pb.MsgRelayProviderPrices, + "/injective.exchange.v1beta1.MsgCreateSpotLimitOrder": + injective_exchange_tx_pb.MsgCreateSpotLimitOrder, + "/injective.exchange.v1beta1.MsgCreateSpotMarketOrder": + injective_exchange_tx_pb.MsgCreateSpotMarketOrder, + "/injective.exchange.v1beta1.MsgCreateDerivativeLimitOrder": + injective_exchange_tx_pb.MsgCreateDerivativeLimitOrder, + "/injective.exchange.v1beta1.MsgCreateDerivativeMarketOrder": + injective_exchange_tx_pb.MsgCreateDerivativeMarketOrder, + "/injective.exchange.v1beta1.MsgCancelSpotOrder": + injective_exchange_tx_pb.MsgCancelSpotOrder, + "/injective.exchange.v1beta1.MsgCancelDerivativeOrder": + injective_exchange_tx_pb.MsgCancelDerivativeOrder, + "/injective.exchange.v1beta1.MsgBatchCancelSpotOrders": + injective_exchange_tx_pb.MsgBatchCancelSpotOrders, + "/injective.exchange.v1beta1.MsgBatchCancelDerivativeOrders": + injective_exchange_tx_pb.MsgBatchCancelDerivativeOrders, + "/injective.exchange.v1beta1.MsgBatchCreateSpotLimitOrders": + injective_exchange_tx_pb.MsgBatchCreateSpotLimitOrders, + "/injective.exchange.v1beta1.MsgBatchCreateDerivativeLimitOrders": + injective_exchange_tx_pb.MsgBatchCreateDerivativeLimitOrders, + "/injective.exchange.v1beta1.MsgBatchUpdateOrders": + injective_exchange_tx_pb.MsgBatchUpdateOrders, + "/injective.exchange.v1beta1.MsgDeposit": + injective_exchange_tx_pb.MsgDeposit, + "/injective.exchange.v1beta1.MsgWithdraw": + injective_exchange_tx_pb.MsgWithdraw, + "/injective.exchange.v1beta1.MsgSubaccountTransfer": + injective_exchange_tx_pb.MsgSubaccountTransfer, + "/injective.exchange.v1beta1.MsgLiquidatePosition": + injective_exchange_tx_pb.MsgLiquidatePosition, + "/injective.exchange.v1beta1.MsgIncreasePositionMargin": + injective_exchange_tx_pb.MsgIncreasePositionMargin, + "/injective.auction.v1beta1.MsgBid": + injective_auction_tx_pb.MsgBid, + "/injective.exchange.v1beta1.MsgCreateBinaryOptionsLimitOrder": + injective_exchange_tx_pb.MsgCreateBinaryOptionsLimitOrder, + "/injective.exchange.v1beta1.MsgCreateBinaryOptionsMarketOrder": + injective_exchange_tx_pb.MsgCreateBinaryOptionsMarketOrder, + "/injective.exchange.v1beta1.MsgCancelBinaryOptionsOrder": + injective_exchange_tx_pb.MsgCancelBinaryOptionsOrder, + "/injective.exchange.v1beta1.MsgAdminUpdateBinaryOptionsMarket": + injective_exchange_tx_pb.MsgAdminUpdateBinaryOptionsMarket, + "/injective.exchange.v1beta1.MsgInstantBinaryOptionsMarketLaunch": + injective_exchange_tx_pb.MsgInstantBinaryOptionsMarketLaunch, + "/cosmos.bank.v1beta1.MsgSend": + cosmos_bank_tx_pb.MsgSend, + "/cosmos.authz.v1beta1.MsgGrant": + cosmos_authz_tx_pb.MsgGrant, + "/cosmos.authz.v1beta1.MsgExec": + cosmos_authz_tx_pb.MsgExec, + "/cosmos.authz.v1beta1.MsgRevoke": + cosmos_authz_tx_pb.MsgRevoke, + "/injective.oracle.v1beta1.MsgRelayPriceFeedPrice": + injective_oracle_tx_pb.MsgRelayPriceFeedPrice, + "/injective.oracle.v1beta1.MsgRelayProviderPrices": + injective_oracle_tx_pb.MsgRelayProviderPrices, } - + # fmt: on msgs = [] for msg in meta_messages: msg_as_string_dict = json.dumps(msg["value"]) @@ -1076,91 +1093,8 @@ def _initialize_markets_and_tokens_from_files(self): taker_fee_rate=None, service_provider_fee=None, min_price_tick_size=Decimal(str(configuration_section["min_price_tick_size"])), - min_quantity_tick_size=Decimal(str(configuration_section["min_quantity_tick_size"])) - ) - spot_markets[market.id] = market - else: - market = DerivativeMarket( - id=section_name, - status="", - ticker=description, - oracle_base="", - oracle_quote="", - oracle_type="", - oracle_scale_factor=1, - initial_margin_ratio=None, - maintenance_margin_ratio=None, - quote_token=quote_token, - maker_fee_rate=None, - taker_fee_rate=None, - service_provider_fee=None, - min_price_tick_size=Decimal(str(configuration_section["min_price_tick_size"])), min_quantity_tick_size=Decimal(str(configuration_section["min_quantity_tick_size"])), ) - - derivative_markets[market.id] = market - - elif section_name != "DEFAULT": - token = Token( - name=section_name, - symbol=section_name, - denom=configuration_section["peggy_denom"], - address="", - decimals=int(configuration_section["decimals"]), - logo="", - updated=-1, - ) - - tokens[token.symbol] = token - - self.tokens = tokens - self.spot_markets = spot_markets - self.derivative_markets = derivative_markets - self.binary_option_markets = dict() - - def _initialize_markets_and_tokens_from_files(self): - config: ConfigParser = constant.CONFIGS[self.network] - spot_markets = dict() - derivative_markets = dict() - tokens = dict() - - for section_name, configuration_section in config.items(): - if section_name.startswith("0x"): - description = configuration_section["description"] - - quote_token = Token( - name="", - symbol="", - denom="", - address="", - decimals=int(configuration_section["quote"]), - logo="", - updated=-1, - ) - - if "Spot" in description: - base_token = Token( - name="", - symbol="", - denom="", - address="", - decimals=int(configuration_section["base"]), - logo="", - updated=-1, - ) - - market = SpotMarket( - id=section_name, - status="", - ticker=description, - base_token=base_token, - quote_token=quote_token, - maker_fee_rate=None, - taker_fee_rate=None, - service_provider_fee=None, - min_price_tick_size=Decimal(str(configuration_section["min_price_tick_size"])), - min_quantity_tick_size=Decimal(str(configuration_section["min_quantity_tick_size"])) - ) spot_markets[market.id] = market else: market = DerivativeMarket( diff --git a/pyinjective/constant.py b/pyinjective/constant.py index 49aaef3d..3e8d0d40 100644 --- a/pyinjective/constant.py +++ b/pyinjective/constant.py @@ -1,6 +1,5 @@ import os from configparser import ConfigParser -from warnings import warn MAX_CLIENT_ID_LENGTH = 128 MAX_DATA_SIZE = 256 @@ -27,14 +26,8 @@ class Denom: def __init__( - self, - description: str, - base: int, - quote: int, - min_price_tick_size: float, - min_quantity_tick_size: float + self, description: str, base: int, quote: int, min_price_tick_size: float, min_quantity_tick_size: float ): - self.description = description self.base = base self.quote = quote @@ -48,7 +41,7 @@ def load_market(cls, network, market_id): elif network == "testnet": config = testnet_config else: - config =mainnet_config + config = mainnet_config return cls( description=config[market_id]["description"], diff --git a/pyinjective/core/broadcaster.py b/pyinjective/core/broadcaster.py index 7fb54278..a84b38dd 100644 --- a/pyinjective/core/broadcaster.py +++ b/pyinjective/core/broadcaster.py @@ -1,19 +1,18 @@ +import math from abc import ABC, abstractmethod from decimal import Decimal from typing import List, Optional -import math from google.protobuf import any_pb2 -from pyinjective import PrivateKey, Transaction, PublicKey +from pyinjective import PrivateKey, PublicKey, Transaction from pyinjective.async_client import AsyncClient from pyinjective.composer import Composer -from pyinjective.core.network import Network from pyinjective.core.gas_limit_estimator import GasLimitEstimator +from pyinjective.core.network import Network class BroadcasterAccountConfig(ABC): - @property @abstractmethod def trading_injective_address(self) -> str: @@ -34,28 +33,28 @@ def messages_prepared_for_transaction(self, messages: List[any_pb2.Any]) -> List ... -class TransactionFeeCalculator (ABC): +class TransactionFeeCalculator(ABC): DEFAULT_GAS_PRICE = 500_000_000 @abstractmethod async def configure_gas_fee_for_transaction( - self, - transaction: Transaction, - private_key: PrivateKey, - public_key: PublicKey, + self, + transaction: Transaction, + private_key: PrivateKey, + public_key: PublicKey, ): ... class MsgBroadcasterWithPk: - def __init__( - self, - network: Network, - account_config: BroadcasterAccountConfig, - client: AsyncClient, - composer: Composer, - fee_calculator: TransactionFeeCalculator): + self, + network: Network, + account_config: BroadcasterAccountConfig, + client: AsyncClient, + composer: Composer, + fee_calculator: TransactionFeeCalculator, + ): self._network = network self._account_config = account_config self._client = client @@ -64,19 +63,16 @@ def __init__( @classmethod def new_using_simulation( - cls, - network: Network, - private_key: str, - client: Optional[AsyncClient] = None, - composer: Optional[Composer] = None, + cls, + network: Network, + private_key: str, + client: Optional[AsyncClient] = None, + composer: Optional[Composer] = None, ): client = client or AsyncClient(network=network) composer = composer or Composer(network=client.network.string()) account_config = StandardAccountBroadcasterConfig(private_key=private_key) - fee_calculator = SimulatedTransactionFeeCalculator( - client=client, - composer=composer - ) + fee_calculator = SimulatedTransactionFeeCalculator(client=client, composer=composer) instance = cls( network=network, account_config=account_config, @@ -88,19 +84,16 @@ def new_using_simulation( @classmethod def new_without_simulation( - cls, - network: Network, - private_key: str, - client: Optional[AsyncClient] = None, - composer: Optional[Composer] = None, + cls, + network: Network, + private_key: str, + client: Optional[AsyncClient] = None, + composer: Optional[Composer] = None, ): client = client or AsyncClient(network=network) composer = composer or Composer(network=client.network.string()) account_config = StandardAccountBroadcasterConfig(private_key=private_key) - fee_calculator = MessageBasedTransactionFeeCalculator( - client=client, - composer=composer - ) + fee_calculator = MessageBasedTransactionFeeCalculator(client=client, composer=composer) instance = cls( network=network, account_config=account_config, @@ -112,19 +105,16 @@ def new_without_simulation( @classmethod def new_for_grantee_account_using_simulation( - cls, - network: Network, - grantee_private_key: str, - client: Optional[AsyncClient] = None, - composer: Optional[Composer] = None, + cls, + network: Network, + grantee_private_key: str, + client: Optional[AsyncClient] = None, + composer: Optional[Composer] = None, ): client = client or AsyncClient(network=network) composer = composer or Composer(network=client.network.string()) account_config = GranteeAccountBroadcasterConfig(grantee_private_key=grantee_private_key, composer=composer) - fee_calculator = SimulatedTransactionFeeCalculator( - client=client, - composer=composer - ) + fee_calculator = SimulatedTransactionFeeCalculator(client=client, composer=composer) instance = cls( network=network, account_config=account_config, @@ -136,19 +126,16 @@ def new_for_grantee_account_using_simulation( @classmethod def new_for_grantee_account_without_simulation( - cls, - network: Network, - grantee_private_key: str, - client: Optional[AsyncClient] = None, - composer: Optional[Composer] = None, + cls, + network: Network, + grantee_private_key: str, + client: Optional[AsyncClient] = None, + composer: Optional[Composer] = None, ): client = client or AsyncClient(network=network) composer = composer or Composer(network=client.network.string()) account_config = GranteeAccountBroadcasterConfig(grantee_private_key=grantee_private_key, composer=composer) - fee_calculator = MessageBasedTransactionFeeCalculator( - client=client, - composer=composer - ) + fee_calculator = MessageBasedTransactionFeeCalculator(client=client, composer=composer) instance = cls( network=network, account_config=account_config, @@ -189,7 +176,6 @@ async def broadcast(self, messages: List[any_pb2.Any]): class StandardAccountBroadcasterConfig(BroadcasterAccountConfig): - def __init__(self, private_key: str): self._private_key = PrivateKey.from_hex(private_key) self._public_key = self._private_key.to_public_key() @@ -213,7 +199,6 @@ def messages_prepared_for_transaction(self, messages: List[any_pb2.Any]) -> List class GranteeAccountBroadcasterConfig(BroadcasterAccountConfig): - def __init__(self, grantee_private_key: str, composer: Composer): self._grantee_private_key = PrivateKey.from_hex(grantee_private_key) self._grantee_public_key = self._grantee_private_key.to_public_key() @@ -242,23 +227,23 @@ def messages_prepared_for_transaction(self, messages: List[any_pb2.Any]) -> List class SimulatedTransactionFeeCalculator(TransactionFeeCalculator): - def __init__( - self, - client: AsyncClient, - composer: Composer, - gas_price: Optional[int] = None, - gas_limit_adjustment_multiplier: Optional[Decimal] = None): + self, + client: AsyncClient, + composer: Composer, + gas_price: Optional[int] = None, + gas_limit_adjustment_multiplier: Optional[Decimal] = None, + ): self._client = client self._composer = composer self._gas_price = gas_price or self.DEFAULT_GAS_PRICE self._gas_limit_adjustment_multiplier = gas_limit_adjustment_multiplier or Decimal("1.3") async def configure_gas_fee_for_transaction( - self, - transaction: Transaction, - private_key: PrivateKey, - public_key: PublicKey, + self, + transaction: Transaction, + private_key: PrivateKey, + public_key: PublicKey, ): sim_sign_doc = transaction.get_sign_doc(public_key) sim_sig = private_key.sign(sim_sign_doc.SerializeToString()) @@ -285,20 +270,16 @@ async def configure_gas_fee_for_transaction( class MessageBasedTransactionFeeCalculator(TransactionFeeCalculator): TRANSACTION_GAS_LIMIT = 60_000 - def __init__( - self, - client: AsyncClient, - composer: Composer, - gas_price: Optional[int] = None): + def __init__(self, client: AsyncClient, composer: Composer, gas_price: Optional[int] = None): self._client = client self._composer = composer self._gas_price = gas_price or self.DEFAULT_GAS_PRICE async def configure_gas_fee_for_transaction( - self, - transaction: Transaction, - private_key: PrivateKey, - public_key: PublicKey, + self, + transaction: Transaction, + private_key: PrivateKey, + public_key: PublicKey, ): messages_gas_limit = math.ceil(self._calculate_gas_limit(messages=transaction.msgs)) transaction_gas_limit = messages_gas_limit + self.TRANSACTION_GAS_LIMIT diff --git a/pyinjective/core/gas_limit_estimator.py b/pyinjective/core/gas_limit_estimator.py index d21c385b..2bc5656c 100644 --- a/pyinjective/core/gas_limit_estimator.py +++ b/pyinjective/core/gas_limit_estimator.py @@ -19,9 +19,14 @@ def applies_to(cls, message: any_pb2.Any) -> bool: @classmethod def for_message(cls, message: any_pb2.Any): - estimator_class = next((estimator_subclass for estimator_subclass in cls.__subclasses__() - if estimator_subclass.applies_to(message=message)), - None) + estimator_class = next( + ( + estimator_subclass + for estimator_subclass in cls.__subclasses__() + if estimator_subclass.applies_to(message=message) + ), + None, + ) if estimator_class is None: estimator = DefaultGasLimitEstimator() else: @@ -180,15 +185,21 @@ def gas_limit(self) -> int: total += len(self._message.derivative_orders_to_cancel) * self.DERIVATIVE_ORDER_CANCELATION_GAS_LIMIT total += len(self._message.binary_options_orders_to_cancel) * self.DERIVATIVE_ORDER_CANCELATION_GAS_LIMIT - total += (len(self._message.spot_market_ids_to_cancel_all) - * self.CANCEL_ALL_SPOT_MARKET_GAS_LIMIT - * self.AVERAGE_CANCEL_ALL_AFFECTED_ORDERS) - total += (len(self._message.derivative_market_ids_to_cancel_all) - * self.CANCEL_ALL_DERIVATIVE_MARKET_GAS_LIMIT - * self.AVERAGE_CANCEL_ALL_AFFECTED_ORDERS) - total += (len(self._message.binary_options_market_ids_to_cancel_all) - * self.CANCEL_ALL_DERIVATIVE_MARKET_GAS_LIMIT - * self.AVERAGE_CANCEL_ALL_AFFECTED_ORDERS) + total += ( + len(self._message.spot_market_ids_to_cancel_all) + * self.CANCEL_ALL_SPOT_MARKET_GAS_LIMIT + * self.AVERAGE_CANCEL_ALL_AFFECTED_ORDERS + ) + total += ( + len(self._message.derivative_market_ids_to_cancel_all) + * self.CANCEL_ALL_DERIVATIVE_MARKET_GAS_LIMIT + * self.AVERAGE_CANCEL_ALL_AFFECTED_ORDERS + ) + total += ( + len(self._message.binary_options_market_ids_to_cancel_all) + * self.CANCEL_ALL_DERIVATIVE_MARKET_GAS_LIMIT + * self.AVERAGE_CANCEL_ALL_AFFECTED_ORDERS + ) return total @@ -207,8 +218,9 @@ def applies_to(cls, message: any_pb2.Any) -> bool: return cls.message_type(message=message).endswith("MsgExec") def gas_limit(self) -> int: - total = sum([GasLimitEstimator.for_message(message=inner_message).gas_limit() - for inner_message in self._message.msgs]) + total = sum( + [GasLimitEstimator.for_message(message=inner_message).gas_limit() for inner_message in self._message.msgs] + ) total += self.DEFAULT_GAS_LIMIT return total @@ -218,7 +230,6 @@ def _message_class(self, message: any_pb2.Any): class PrivilegedExecuteContractGasLimitEstimator(GasLimitEstimator): - def __init__(self, message: any_pb2.Any): self._message = self._parsed_message(message=message) @@ -234,7 +245,6 @@ def _message_class(self, message: any_pb2.Any): class ExecuteContractGasLimitEstimator(GasLimitEstimator): - def __init__(self, message: any_pb2.Any): self._message = self._parsed_message(message=message) @@ -250,7 +260,6 @@ def _message_class(self, message: any_pb2.Any): class GeneralWasmGasLimitEstimator(GasLimitEstimator): - def __init__(self, message: any_pb2.Any): self._message = self._parsed_message(message=message) @@ -266,7 +275,6 @@ def _message_class(self, message: any_pb2.Any): class GovernanceGasLimitEstimator(GasLimitEstimator): - def __init__(self, message: any_pb2.Any): self._message = self._parsed_message(message=message) @@ -274,7 +282,7 @@ def __init__(self, message: any_pb2.Any): def applies_to(cls, message: any_pb2.Any) -> bool: message_type = cls.message_type(message=message) return "gov." in message_type and ( - message_type.endswith("MsgDeposit") or message_type.endswith("MsgSubmitProposal") + message_type.endswith("MsgDeposit") or message_type.endswith("MsgSubmitProposal") ) def gas_limit(self) -> int: diff --git a/pyinjective/core/market.py b/pyinjective/core/market.py index 9a42b88c..58e648bb 100644 --- a/pyinjective/core/market.py +++ b/pyinjective/core/market.py @@ -34,6 +34,14 @@ def price_to_chain_format(self, human_readable_value: Decimal) -> Decimal: return extended_chain_formatted_value + def quantity_from_chain_format(self, chain_value: Decimal) -> Decimal: + return chain_value / Decimal(f"1e{self.base_token.decimals}") + + def price_from_chain_format(self, chain_value: Decimal) -> Decimal: + decimals = self.base_token.decimals - self.quote_token.decimals + return chain_value * Decimal(f"1e{decimals}") + + @dataclass(eq=True, frozen=True) class DerivativeMarket: id: str @@ -77,10 +85,7 @@ def margin_to_chain_format(self, human_readable_value: Decimal) -> Decimal: return extended_chain_formatted_value def calculate_margin_in_chain_format( - self, - human_readable_quantity: Decimal, - human_readable_price: Decimal, - leverage: Decimal + self, human_readable_quantity: Decimal, human_readable_price: Decimal, leverage: Decimal ) -> Decimal: chain_formatted_quantity = human_readable_quantity chain_formatted_price = human_readable_price * Decimal(f"1e{self.quote_token.decimals}") @@ -92,6 +97,16 @@ def calculate_margin_in_chain_format( return extended_chain_formatted_margin + def quantity_from_chain_format(self, chain_value: Decimal) -> Decimal: + return chain_value + + def price_from_chain_format(self, chain_value: Decimal) -> Decimal: + return chain_value * Decimal(f"1e-{self.quote_token.decimals}") + + def margin_from_chain_format(self, chain_value: Decimal) -> Decimal: + return chain_value * Decimal(f"1e-{self.quote_token.decimals}") + + @dataclass(eq=True, frozen=True) class BinaryOptionMarket: id: str @@ -113,7 +128,9 @@ class BinaryOptionMarket: def quantity_to_chain_format(self, human_readable_value: Decimal, special_denom: Optional[Denom] = None) -> Decimal: # Binary option markets do not have a base market to provide the number of decimals decimals = 0 if special_denom is None else special_denom.base - min_quantity_tick_size = self.min_quantity_tick_size if special_denom is None else special_denom.min_quantity_tick_size + min_quantity_tick_size = ( + self.min_quantity_tick_size if special_denom is None else special_denom.min_quantity_tick_size + ) chain_formatted_value = human_readable_value * Decimal(f"1e{decimals}") quantized_value = chain_formatted_value // min_quantity_tick_size * min_quantity_tick_size extended_chain_formatted_value = quantized_value * Decimal(f"1e{ADDITIONAL_CHAIN_FORMAT_DECIMALS}") @@ -130,22 +147,33 @@ def price_to_chain_format(self, human_readable_value: Decimal, special_denom: Op return extended_chain_formatted_value def calculate_margin_in_chain_format( - self, - human_readable_quantity: Decimal, - human_readable_price: Decimal, - is_buy: bool, - special_denom: Optional[Denom] = None, + self, + human_readable_quantity: Decimal, + human_readable_price: Decimal, + is_buy: bool, + special_denom: Optional[Denom] = None, ) -> Decimal: quantity_decimals = 0 if special_denom is None else special_denom.base price_decimals = self.quote_token.decimals if special_denom is None else special_denom.quote - min_quantity_tick_size = self.min_quantity_tick_size if special_denom is None else special_denom.min_quantity_tick_size + min_quantity_tick_size = ( + self.min_quantity_tick_size if special_denom is None else special_denom.min_quantity_tick_size + ) price = human_readable_price if is_buy else 1 - human_readable_price chain_formatted_quantity = human_readable_quantity * Decimal(f"1e{quantity_decimals}") chain_formatted_price = price * Decimal(f"1e{price_decimals}") - margin = (chain_formatted_price * chain_formatted_quantity) + margin = chain_formatted_price * chain_formatted_quantity # We are using the min_quantity_tick_size to quantize the margin because that is the way margin is validated # in the chain (it might be changed to a min_notional in the future) quantized_margin = (margin // min_quantity_tick_size) * min_quantity_tick_size extended_chain_formatted_margin = quantized_margin * Decimal(f"1e{ADDITIONAL_CHAIN_FORMAT_DECIMALS}") - return extended_chain_formatted_margin \ No newline at end of file + return extended_chain_formatted_margin + + def quantity_from_chain_format(self, chain_value: Decimal, special_denom: Optional[Denom] = None) -> Decimal: + # Binary option markets do not have a base market to provide the number of decimals + decimals = 0 if special_denom is None else special_denom.base + return chain_value * Decimal(f"1e-{decimals}") + + def price_from_chain_format(self, chain_value: Decimal, special_denom: Optional[Denom] = None) -> Decimal: + decimals = self.quote_token.decimals if special_denom is None else special_denom.quote + return chain_value * Decimal(f"1e-{decimals}") diff --git a/pyinjective/core/network.py b/pyinjective/core/network.py index 420d0152..930fafe0 100644 --- a/pyinjective/core/network.py +++ b/pyinjective/core/network.py @@ -27,7 +27,6 @@ async def exchange_metadata(self, metadata_query_provider: Callable) -> Tuple[Tu class KubernetesLoadBalancedCookieAssistant(CookieAssistant): - def __init__(self): self._chain_cookie: Optional[str] = None self._exchange_cookie: Optional[str] = None @@ -35,9 +34,9 @@ def __init__(self): self._exchange_cookie_initialization_lock = asyncio.Lock() async def chain_cookie(self, metadata_query_provider: Callable) -> str: - if self._chain_cookie == None: + if self._chain_cookie is None: async with self._chain_cookie_initialization_lock: - if self._chain_cookie == None: + if self._chain_cookie is None: await self._fetch_chain_cookie(metadata_query_provider=metadata_query_provider) cookie = self._chain_cookie self._check_chain_cookie_expiration() @@ -45,9 +44,9 @@ async def chain_cookie(self, metadata_query_provider: Callable) -> str: return cookie async def exchange_cookie(self, metadata_query_provider: Callable) -> str: - if self._exchange_cookie == None: + if self._exchange_cookie is None: async with self._exchange_cookie_initialization_lock: - if self._exchange_cookie == None: + if self._exchange_cookie is None: await self._fetch_exchange_cookie(metadata_query_provider=metadata_query_provider) cookie = self._exchange_cookie self._check_exchange_cookie_expiration() @@ -84,15 +83,13 @@ def _is_cookie_expired(self, cookie_data: str) -> bool: cookie = SimpleCookie() cookie.load(cookie_data) - expiration_time = datetime.datetime.strptime(cookie["GCLB"]["expires"], - "%a, %d-%b-%Y %H:%M:%S %Z").timestamp() + expiration_time = datetime.datetime.strptime(cookie["GCLB"]["expires"], "%a, %d-%b-%Y %H:%M:%S %Z").timestamp() timestamp_diff = expiration_time - time.time() return timestamp_diff < self.SESSION_RENEWAL_OFFSET class BareMetalLoadBalancedCookieAssistant(CookieAssistant): - def __init__(self): self._chain_cookie: Optional[str] = None self._exchange_cookie: Optional[str] = None @@ -100,9 +97,9 @@ def __init__(self): self._exchange_cookie_initialization_lock = asyncio.Lock() async def chain_cookie(self, metadata_query_provider: Callable) -> str: - if self._chain_cookie == None: + if self._chain_cookie is None: async with self._chain_cookie_initialization_lock: - if self._chain_cookie == None: + if self._chain_cookie is None: await self._fetch_chain_cookie(metadata_query_provider=metadata_query_provider) cookie = self._chain_cookie self._check_chain_cookie_expiration() @@ -110,9 +107,9 @@ async def chain_cookie(self, metadata_query_provider: Callable) -> str: return cookie async def exchange_cookie(self, metadata_query_provider: Callable) -> str: - if self._exchange_cookie == None: + if self._exchange_cookie is None: async with self._exchange_cookie_initialization_lock: - if self._exchange_cookie == None: + if self._exchange_cookie is None: await self._fetch_exchange_cookie(metadata_query_provider=metadata_query_provider) cookie = self._exchange_cookie self._check_exchange_cookie_expiration() @@ -239,13 +236,13 @@ def testnet(cls, node="lb"): fee_denom="inj", env="testnet", cookie_assistant=cookie_assistant, - use_secure_connection=use_secure_connection + use_secure_connection=use_secure_connection, ) @classmethod def mainnet(cls, node="lb"): nodes = [ - "lb", # us, asia, prod + "lb", # us, asia, prod "lb_k8s", "sentry0", # ca, prod "sentry1", # ca, prod @@ -309,16 +306,16 @@ def local(cls): @classmethod def custom( - cls, - lcd_endpoint, - tm_websocket_endpoint, - grpc_endpoint, - grpc_exchange_endpoint, - grpc_explorer_endpoint, - chain_id, - env, - cookie_assistant: Optional[CookieAssistant] = None, - use_secure_connection: bool = False, + cls, + lcd_endpoint, + tm_websocket_endpoint, + grpc_endpoint, + grpc_exchange_endpoint, + grpc_explorer_endpoint, + chain_id, + env, + cookie_assistant: Optional[CookieAssistant] = None, + use_secure_connection: bool = False, ): assistant = cookie_assistant or DisabledCookieAssistant() return cls( @@ -331,7 +328,7 @@ def custom( fee_denom="inj", env=env, cookie_assistant=assistant, - use_secure_connection=use_secure_connection + use_secure_connection=use_secure_connection, ) def string(self): diff --git a/pyinjective/core/token.py b/pyinjective/core/token.py index c6af6c0d..f2a9bc79 100644 --- a/pyinjective/core/token.py +++ b/pyinjective/core/token.py @@ -1,6 +1,7 @@ from dataclasses import dataclass from decimal import Decimal + @dataclass(eq=True, frozen=True) class Token: name: str diff --git a/pyinjective/denoms_devnet.ini b/pyinjective/denoms_devnet.ini index 4e4f2797..ab4ebf17 100644 --- a/pyinjective/denoms_devnet.ini +++ b/pyinjective/denoms_devnet.ini @@ -242,4 +242,3 @@ decimals = 6 [UST] peggy_denom = ibc/B448C0CA358B958301D328CCDC5D5AD642FC30A6D3AE106FF721DB315F3DDE5C decimals = 6 - diff --git a/pyinjective/denoms_mainnet.ini b/pyinjective/denoms_mainnet.ini index bf7b610b..3f185310 100644 --- a/pyinjective/denoms_mainnet.ini +++ b/pyinjective/denoms_mainnet.ini @@ -394,6 +394,24 @@ min_display_price_tick_size = 9.999999999999999e-05 min_quantity_tick_size = 10000000 min_display_quantity_tick_size = 0.1 +[0xe8fe754e16233754e2811c36aca89992e35951cfd61376f1cbdc44be6ac8d3fb] +description = 'Mainnet Spot NEOK/USDT' +base = 18 +quote = 6 +min_price_tick_size = 0.0000000000000001 +min_display_price_tick_size = 9.999999999999999e-05 +min_quantity_tick_size = 100000000000000000 +min_display_quantity_tick_size = 0.1 + +[0xa04adeed0f09ed45c73b344b520d05aa31eabe2f469dcbb02a021e0d9d098715] +description = 'Mainnet Spot ORAI/USDT' +base = 6 +quote = 6 +min_price_tick_size = 0.0001 +min_display_price_tick_size = 9.999999999999999e-05 +min_quantity_tick_size = 100000 +min_display_quantity_tick_size = 0.1 + [0x4ca0f92fc28be0c9761326016b5a1a2177dd6375558365116b5bdda9abc229ce] description = 'Mainnet Derivative BTC/USDT PERP' base = 0 @@ -680,3 +698,11 @@ decimals = 8 [NBLA] peggy_denom = factory/inj1d0zfq42409a5mhdagjutl8u6u9rgcm4h8zfmfq/nbla decimals = 6 + +[NEOK] +peggy_denom = ibc/F6CC233E5C0EA36B1F74AB1AF98471A2D6A80E2542856639703E908B4D93E7C4 +decimals = 18 + +[ORAI] +peggy_denom = ibc/C20C0A822BD22B2CEF0D067400FCCFB6FAEEE9E91D360B4E0725BD522302D565 +decimals = 6 diff --git a/pyinjective/denoms_testnet.ini b/pyinjective/denoms_testnet.ini index 2e24698f..92d3e534 100644 --- a/pyinjective/denoms_testnet.ini +++ b/pyinjective/denoms_testnet.ini @@ -195,4 +195,3 @@ decimals = 8 [FRCOIN] peggy_denom = factory/inj1d3jc5pr6nsf9twyzjh9w5nj7nn235ysllwtpq7/frcoin decimals = 6 - diff --git a/pyinjective/orderhash.py b/pyinjective/orderhash.py index b27551b1..dd6a43c6 100644 --- a/pyinjective/orderhash.py +++ b/pyinjective/orderhash.py @@ -1,16 +1,16 @@ -import requests from decimal import Decimal +import requests from eip712.messages import EIP712Message, EIP712Type from eth_account.messages import _hash_eip191_message as hash_eip191_message from hexbytes import HexBytes class OrderInfo(EIP712Type): - SubaccountId: "string" - FeeRecipient: "string" - Price: "string" - Quantity: "string" + SubaccountId: "string" # noqa: F821 + FeeRecipient: "string" # noqa: F821 + Price: "string" # noqa: F821 + Quantity: "string" # noqa: F821 class SpotOrder(EIP712Message): @@ -20,11 +20,11 @@ class SpotOrder(EIP712Message): _verifyingContract_ = "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" _salt_ = HexBytes("0x0000000000000000000000000000000000000000000000000000000000000000") - MarketId: "string" + MarketId: "string" # noqa: F821 OrderInfo: OrderInfo - Salt: "string" - OrderType: "string" - TriggerPrice: "string" + Salt: "string" # noqa: F821 + OrderType: "string" # noqa: F821 + TriggerPrice: "string" # noqa: F821 class DerivativeOrder(EIP712Message): @@ -34,39 +34,41 @@ class DerivativeOrder(EIP712Message): _verifyingContract_ = "0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC" _salt_ = HexBytes("0x0000000000000000000000000000000000000000000000000000000000000000") - MarketId: "string" + MarketId: "string" # noqa: F821 OrderInfo: OrderInfo - OrderType: "string" - Margin: "string" - TriggerPrice: "string" - Salt: "string" + OrderType: "string" # noqa: F821 + Margin: "string" # noqa: F821 + TriggerPrice: "string" # noqa: F821 + Salt: "string" # noqa: F821 # domain_separator = EIP712_domain.hash_struct() -order_type_dict = {0: '\x00', 1: '\x01', 2: '\x02', 3: '\x03', 4: '\x04', 5: '\x05', 6: '\x06', 7: '\x07', 8: '\x08'} +order_type_dict = {0: "\x00", 1: "\x01", 2: "\x02", 3: "\x03", 4: "\x04", 5: "\x05", 6: "\x06", 7: "\x07", 8: "\x08"} + class OrderHashResponse: def __init__( - self, - spot: [str] = None, - derivative: [str] = None, + self, + spot: [str] = None, + derivative: [str] = None, ): self.spot = spot self.derivative = derivative + class OrderHashManager: def __init__( - self, - address, - network, - subaccount_indexes: [int] = None, + self, + address, + network, + subaccount_indexes: [int] = None, ): self.address = address self.subacc_nonces = dict() for i in subaccount_indexes: subaccount_id = address.get_subaccount_id(index=i) - url = network.lcd_endpoint + '/injective/exchange/v1beta1/exchange/' + subaccount_id + url = network.lcd_endpoint + "/injective/exchange/v1beta1/exchange/" + subaccount_id res = requests.get(url=url) nonce = res.json()["nonce"] self.subacc_nonces[i] = [subaccount_id, nonce + 1] @@ -91,15 +93,18 @@ def compute_order_hashes(self, spot_orders, derivative_orders, subaccount_index) return order_hashes + def param_to_backend_go(param) -> int: go_param = Decimal(param) / pow(10, 18) - return format(go_param, '.18f') + return format(go_param, ".18f") + def parse_order_type(order): return order_type_dict[order.order_type] + def build_eip712_msg(order, nonce): - if order.__class__.__name__ == 'SpotOrder': + if order.__class__.__name__ == "SpotOrder": go_price = param_to_backend_go(order.order_info.price) go_trigger_price = param_to_backend_go(order.trigger_price) go_quantity = param_to_backend_go(order.order_info.quantity) @@ -110,13 +115,13 @@ def build_eip712_msg(order, nonce): SubaccountId=order.order_info.subaccount_id, FeeRecipient=order.order_info.fee_recipient, Price=go_price, - Quantity=go_quantity + Quantity=go_quantity, ), Salt=str(nonce), OrderType=go_order_type, - TriggerPrice=go_trigger_price + TriggerPrice=go_trigger_price, ) - if order.__class__.__name__ == 'DerivativeOrder': + if order.__class__.__name__ == "DerivativeOrder": go_price = param_to_backend_go(order.order_info.price) go_trigger_price = param_to_backend_go(order.trigger_price) go_quantity = param_to_backend_go(order.order_info.quantity) @@ -128,14 +133,15 @@ def build_eip712_msg(order, nonce): SubaccountId=order.order_info.subaccount_id, FeeRecipient=order.order_info.fee_recipient, Price=go_price, - Quantity=go_quantity + Quantity=go_quantity, ), Salt=str(nonce), OrderType=go_order_type, TriggerPrice=go_trigger_price, - Margin=go_margin + Margin=go_margin, ) + def hash_order(msg): signable_message = msg.signable_message hex_digest = hash_eip191_message(signable_message=signable_message).hex() diff --git a/pyinjective/sendtocosmos.py b/pyinjective/sendtocosmos.py index 102d1c6c..043910b6 100644 --- a/pyinjective/sendtocosmos.py +++ b/pyinjective/sendtocosmos.py @@ -3,57 +3,65 @@ from .utils.logger import LoggerProvider from .wallet import Address + class Peggo: def __init__(self, network: str): self.network = network - def sendToInjective(self, ethereum_endpoint: str, private_key: str, token_contract: str, receiver: str, amount: int, - maxFeePerGas: int, maxPriorityFeePerGas: int, peggo_abi: str, data: str, decimals=18): - if self.network == 'testnet': + + def sendToInjective( + self, + ethereum_endpoint: str, + private_key: str, + token_contract: str, + receiver: str, + amount: float, + maxFeePerGas: int, + maxPriorityFeePerGas: int, + peggo_abi: str, + data: str, + decimals=18, + ): + if self.network == "testnet": peggy_proxy_address = "0xd2C6753F6B1783EF0a3857275e16e79D91b539a3" - elif self.network == 'mainnet': + elif self.network == "mainnet": peggy_proxy_address = "0xF955C57f9EA9Dc8781965FEaE0b6A2acE2BAD6f3" - elif self.network == 'devnet': + elif self.network == "devnet": peggy_proxy_address = "0x4F38F75606d046819638f909b66B112aF1095e8d" else: LoggerProvider().logger_for_class(logging_class=self.__class__).info("Network is not supported") + raise RuntimeError(f"Network {self.network} not supported") web3 = Web3(Web3.HTTPProvider(ethereum_endpoint)) contract = web3.eth.contract(address=peggy_proxy_address, abi=peggo_abi) - token_contract_address = web3.toChecksumAddress(token_contract) + token_contract_address = web3.to_checksum_address(token_contract) receiver_address = Address.from_acc_bech32(receiver) receiver_ethereum_address = Address.get_ethereum_address(receiver_address) - receiver_address_checksum = web3.toChecksumAddress(receiver_ethereum_address) + receiver_address_checksum = web3.to_checksum_address(receiver_ethereum_address) receiver_slice = receiver_address_checksum[2:] - receiver_padded_address = '0x' + receiver_slice.zfill(64) + receiver_padded_address = "0x" + receiver_slice.zfill(64) - destination = web3.toBytes(hexstr=receiver_padded_address) + destination = web3.to_bytes(hexstr=receiver_padded_address) - sender_ethereum_address = web3.eth.account.privateKeyToAccount(private_key).address - sender_address_checksum = web3.toChecksumAddress(sender_ethereum_address) + sender_ethereum_address = web3.eth.account.from_key(private_key).address + sender_address_checksum = web3.to_checksum_address(sender_ethereum_address) nonce = web3.eth.get_transaction_count(sender_address_checksum) amount_to_send = int(amount * pow(10, decimals)) gas = contract.functions.sendToInjective( - token_contract_address, - destination, - amount_to_send, - data - ).estimateGas({'from': sender_address_checksum}) + token_contract_address, destination, amount_to_send, data + ).estimate_gas({"from": sender_address_checksum}) transaction_body = { - 'nonce': nonce, - 'gas': gas, - 'maxFeePerGas': web3.toWei(maxFeePerGas, 'gwei'), - 'maxPriorityFeePerGas': web3.toWei(maxPriorityFeePerGas, 'gwei'), + "nonce": nonce, + "gas": gas, + "maxFeePerGas": web3.to_wei(maxFeePerGas, "gwei"), + "maxPriorityFeePerGas": web3.to_wei(maxPriorityFeePerGas, "gwei"), } tx = contract.functions.sendToInjective( - token_contract_address, - destination, - amount_to_send, - data + token_contract_address, destination, amount_to_send, data ).buildTransaction(transaction_body) signed_tx = web3.eth.account.signTransaction(tx, private_key=private_key) @@ -61,8 +69,10 @@ def sendToInjective(self, ethereum_endpoint: str, private_key: str, token_contra try: tx_hash = web3.eth.send_raw_transaction(signed_tx.rawTransaction) LoggerProvider().logger_for_class(logging_class=self.__class__).info( - f"Transferred {amount} {token_contract} from {sender_ethereum_address} to {receiver}") + f"Transferred {amount} {token_contract} from {sender_ethereum_address} to {receiver}" + ) LoggerProvider().logger_for_class(logging_class=self.__class__).info( - "Transaction hash:".format(Web3.to_hex(tx_hash))) + "Transaction hash: {}".format(Web3.to_hex(tx_hash)) + ) except Exception as e: - LoggerProvider().logger_for_class(logging_class=self.__class__).info("Transaction failed".format(e)) + LoggerProvider().logger_for_class(logging_class=self.__class__).info("Transaction failed {}".format(e)) diff --git a/pyinjective/transaction.py b/pyinjective/transaction.py index afe7bd24..f54d5649 100644 --- a/pyinjective/transaction.py +++ b/pyinjective/transaction.py @@ -1,25 +1,26 @@ from typing import List, Tuple from google.protobuf import any_pb2, message -from .proto.cosmos.base.v1beta1.coin_pb2 import Coin -from .proto.cosmos.tx.v1beta1 import tx_pb2 as cosmos_tx_type -from .proto.cosmos.tx.signing.v1beta1 import signing_pb2 as tx_sign from .constant import MAX_MEMO_CHARACTERS from .exceptions import EmptyMsgError, UndefinedError, ValueTooLargeError +from .proto.cosmos.base.v1beta1.coin_pb2 import Coin +from .proto.cosmos.tx.signing.v1beta1 import signing_pb2 as tx_sign +from .proto.cosmos.tx.v1beta1 import tx_pb2 as cosmos_tx_type from .wallet import PublicKey + class Transaction: def __init__( self, - msgs: Tuple[message.Message,...] = None, + msgs: Tuple[message.Message, ...] = None, account_num: int = None, sequence: int = None, chain_id: str = None, fee: List[Coin] = None, gas: int = 0, memo: str = "", - timeout_height: int = 0 + timeout_height: int = 0, ): self.msgs = self.__convert_msgs(msgs) if msgs is not None else [] self.account_num = account_num @@ -31,7 +32,7 @@ def __init__( self.timeout_height = timeout_height @staticmethod - def __convert_msgs(msgs: Tuple[message.Message,...]) -> List[any_pb2.Any]: + def __convert_msgs(msgs: Tuple[message.Message, ...]) -> List[any_pb2.Any]: any_msgs: List[any_pb2.Any] = [] for msg in msgs: any_msg = any_pb2.Any() @@ -74,11 +75,7 @@ def with_timeout_height(self, timeout_height: int) -> "Transaction": return self def __generate_info(self, public_key: PublicKey = None) -> Tuple[str, str]: - body = cosmos_tx_type.TxBody( - messages=self.msgs, - memo=self.memo, - timeout_height=self.timeout_height - ) + body = cosmos_tx_type.TxBody(messages=self.msgs, memo=self.memo, timeout_height=self.timeout_height) body_bytes = body.SerializeToString() mode_info = cosmos_tx_type.ModeInfo(single=cosmos_tx_type.ModeInfo.Single(mode=tx_sign.SIGN_MODE_DIRECT)) diff --git a/pyinjective/utils/fetch_metadata.py b/pyinjective/utils/fetch_metadata.py index 68269b74..715e43c5 100644 --- a/pyinjective/utils/fetch_metadata.py +++ b/pyinjective/utils/fetch_metadata.py @@ -20,60 +20,67 @@ """ -testnet_denom_output = '' -mainnet_denom_output = '' +testnet_denom_output = "" +mainnet_denom_output = "" + async def fetch_denom(network) -> str: - denom_output = '' + denom_output = "" symbols = {} # fetch meta data for spot markets client = AsyncClient(network) - status = 'active' + status = "active" mresp = await client.get_spot_markets(market_status=status) for market in mresp.markets: # append symbols to dict - if market.base_token_meta.SerializeToString() != '': + if market.base_token_meta.SerializeToString() != "": symbols[market.base_token_meta.symbol] = (market.base_denom, market.base_token_meta.decimals) - if market.quote_token_meta.SerializeToString() != '': + if market.quote_token_meta.SerializeToString() != "": symbols[market.quote_token_meta.symbol] = (market.base_denom, market.quote_token_meta.decimals) # format into ini entry - min_display_price_tick_size = float(market.min_price_tick_size) / pow(10, market.quote_token_meta.decimals - market.base_token_meta.decimals) + min_display_price_tick_size = float(market.min_price_tick_size) / pow( + 10, market.quote_token_meta.decimals - market.base_token_meta.decimals + ) min_display_quantity_tick_size = float(market.min_quantity_tick_size) / pow(10, market.base_token_meta.decimals) config = metadata_template.format( market.market_id, - network.string().capitalize(), 'Spot', market.ticker, + network.string().capitalize(), + "Spot", + market.ticker, market.base_token_meta.decimals, market.quote_token_meta.decimals, market.min_price_tick_size, min_display_price_tick_size, market.min_quantity_tick_size, - min_display_quantity_tick_size - ) + min_display_quantity_tick_size, + ) denom_output += config # fetch meta data for derivative markets client = AsyncClient(network) - status = 'active' + status = "active" mresp = await client.get_derivative_markets(market_status=status) for market in mresp.markets: # append symbols to dict - if market.quote_token_meta.SerializeToString() != '': + if market.quote_token_meta.SerializeToString() != "": symbols[market.quote_token_meta.symbol] = (market.quote_denom, market.quote_token_meta.decimals) # format into ini entry min_display_price_tick_size = float(market.min_price_tick_size) / pow(10, market.quote_token_meta.decimals) config = metadata_template.format( market.market_id, - network.string().capitalize(), 'Derivative', market.ticker, + network.string().capitalize(), + "Derivative", + market.ticker, 0, market.quote_token_meta.decimals, market.min_price_tick_size, min_display_price_tick_size, market.min_quantity_tick_size, - market.min_quantity_tick_size + market.min_quantity_tick_size, ) denom_output += config @@ -85,6 +92,7 @@ async def fetch_denom(network) -> str: return denom_output + async def main() -> None: testnet = Network.testnet() data = await fetch_denom(testnet) @@ -96,5 +104,6 @@ async def main() -> None: with open("../denoms_mainnet.ini", "w") as text_file: text_file.write(data) -if __name__ == '__main__': + +if __name__ == "__main__": asyncio.get_event_loop().run_until_complete(main()) diff --git a/pyinjective/utils/logger.py b/pyinjective/utils/logger.py index 7562e95d..01f1dd09 100644 --- a/pyinjective/utils/logger.py +++ b/pyinjective/utils/logger.py @@ -8,7 +8,6 @@ class LoggerProvider: - def logger(self) -> Logger: return logging.getLogger(__name__) diff --git a/pyinjective/utils/metadata_validation.py b/pyinjective/utils/metadata_validation.py index 366aa0aa..892ef8d5 100644 --- a/pyinjective/utils/metadata_validation.py +++ b/pyinjective/utils/metadata_validation.py @@ -4,8 +4,8 @@ import pyinjective.constant as constant from pyinjective.async_client import AsyncClient +from pyinjective.core.market import BinaryOptionMarket, DerivativeMarket, SpotMarket from pyinjective.core.network import Network -from pyinjective.core.market import SpotMarket, DerivativeMarket, BinaryOptionMarket def find_metadata_inconsistencies(network: Network) -> Tuple[List[Any]]: @@ -27,45 +27,79 @@ def find_metadata_inconsistencies(network: Network) -> Tuple[List[Any]]: denom = constant.Denom.load_market(network=network.string(), market_id=config_key) if config_key in spot_markets: market: SpotMarket = spot_markets[config_key] - if (market.base_token.decimals != denom.base - or market.quote_token.decimals != denom.quote - or market.min_price_tick_size != Decimal(str(denom.min_price_tick_size)) - or market.min_quantity_tick_size != Decimal(str(denom.min_quantity_tick_size))): - markets_with_diffs.append([ - {"denom-market": config_key, "base_decimals": denom.base, "quote_decimals": denom.quote, - "min_quantity_tick_size": denom.min_quantity_tick_size, - "min_price_tick_size": denom.min_price_tick_size}, - {"newer-market": market.id, "base_decimals": market.base_token.decimals, - "quote_decimals": market.quote_token.decimals, - "min_quantity_tick_size": float(market.min_quantity_tick_size), - "min_price_tick_size": float(market.min_price_tick_size), "ticker": market.ticker}, - ]) + if ( + market.base_token.decimals != denom.base + or market.quote_token.decimals != denom.quote + or market.min_price_tick_size != Decimal(str(denom.min_price_tick_size)) + or market.min_quantity_tick_size != Decimal(str(denom.min_quantity_tick_size)) + ): + markets_with_diffs.append( + [ + { + "denom-market": config_key, + "base_decimals": denom.base, + "quote_decimals": denom.quote, + "min_quantity_tick_size": denom.min_quantity_tick_size, + "min_price_tick_size": denom.min_price_tick_size, + }, + { + "newer-market": market.id, + "base_decimals": market.base_token.decimals, + "quote_decimals": market.quote_token.decimals, + "min_quantity_tick_size": float(market.min_quantity_tick_size), + "min_price_tick_size": float(market.min_price_tick_size), + "ticker": market.ticker, + }, + ] + ) elif config_key in derivative_markets: market: DerivativeMarket = derivative_markets[config_key] - if (market.quote_token.decimals != denom.quote - or market.min_price_tick_size != Decimal(str(denom.min_price_tick_size)) - or market.min_quantity_tick_size != Decimal(str(denom.min_quantity_tick_size))): - markets_with_diffs.append([ - {"denom-market": config_key, "quote_decimals": denom.quote, - "min_quantity_tick_size": denom.min_quantity_tick_size, - "min_price_tick_size": denom.min_price_tick_size}, - {"newer-market": market.id, "quote_decimals": market.quote_token.decimals, - "min_quantity_tick_size": float(market.min_quantity_tick_size), - "min_price_tick_size": float(market.min_price_tick_size), "ticker": market.ticker}, - ]) + if ( + market.quote_token.decimals != denom.quote + or market.min_price_tick_size != Decimal(str(denom.min_price_tick_size)) + or market.min_quantity_tick_size != Decimal(str(denom.min_quantity_tick_size)) + ): + markets_with_diffs.append( + [ + { + "denom-market": config_key, + "quote_decimals": denom.quote, + "min_quantity_tick_size": denom.min_quantity_tick_size, + "min_price_tick_size": denom.min_price_tick_size, + }, + { + "newer-market": market.id, + "quote_decimals": market.quote_token.decimals, + "min_quantity_tick_size": float(market.min_quantity_tick_size), + "min_price_tick_size": float(market.min_price_tick_size), + "ticker": market.ticker, + }, + ] + ) elif config_key in binary_option_markets: market: BinaryOptionMarket = binary_option_markets[config_key] - if (market.quote_token.decimals != denom.quote - or market.min_price_tick_size != Decimal(str(denom.min_price_tick_size)) - or market.min_quantity_tick_size != Decimal(str(denom.min_quantity_tick_size))): - markets_with_diffs.append([ - {"denom-market": config_key, "quote_decimals": denom.quote, - "min_quantity_tick_size": denom.min_quantity_tick_size, - "min_price_tick_size": denom.min_price_tick_size}, - {"newer-market": market.id, "quote_decimals": market.quote_token.decimals, - "min_quantity_tick_size": float(market.min_quantity_tick_size), - "min_price_tick_size": float(market.min_price_tick_size), "ticker": market.ticker}, - ]) + if ( + market.quote_token.decimals != denom.quote + or market.min_price_tick_size != Decimal(str(denom.min_price_tick_size)) + or market.min_quantity_tick_size != Decimal(str(denom.min_quantity_tick_size)) + ): + markets_with_diffs.append( + [ + { + "denom-market": config_key, + "quote_decimals": denom.quote, + "min_quantity_tick_size": denom.min_quantity_tick_size, + "min_price_tick_size": denom.min_price_tick_size, + }, + { + "newer-market": market.id, + "quote_decimals": market.quote_token.decimals, + "min_quantity_tick_size": float(market.min_quantity_tick_size), + "min_price_tick_size": float(market.min_price_tick_size), + "ticker": market.ticker, + }, + ] + ) else: markets_not_found.append({"denom-market": config_key, "description": denom.description}) @@ -76,31 +110,37 @@ def find_metadata_inconsistencies(network: Network) -> Tuple[List[Any]]: peggy_denom, decimals = constant.Denom.load_peggy_denom(network=network.string(), symbol=config_key) if config_key in all_tokens: token = all_tokens[config_key] - if (token.denom != peggy_denom - or token.decimals != decimals): - peggy_denoms_with_diffs.append([ - {"denom_token": config_key, "peggy_denom": peggy_denom, "decimals": decimals}, - {"newer_token": token.symbol, "peggy_denom": token.denom, "decimals": token.decimals} - ]) + if token.denom != peggy_denom or token.decimals != decimals: + peggy_denoms_with_diffs.append( + [ + {"denom_token": config_key, "peggy_denom": peggy_denom, "decimals": decimals}, + {"newer_token": token.symbol, "peggy_denom": token.denom, "decimals": token.decimals}, + ] + ) else: peggy_denoms_not_found.append( - {"denom_token": config_key, "peggy_denom": peggy_denom, "decimals": decimals}) + {"denom_token": config_key, "peggy_denom": peggy_denom, "decimals": decimals} + ) return markets_with_diffs, markets_not_found, peggy_denoms_with_diffs, peggy_denoms_not_found def print_metadata_mismatches(network: Network): - markets_with_diffs, markets_not_found, peggy_denoms_with_diffs, peggy_denoms_not_found = find_metadata_inconsistencies( - network=network) + ( + markets_with_diffs, + markets_not_found, + peggy_denoms_with_diffs, + peggy_denoms_not_found, + ) = find_metadata_inconsistencies(network=network) for diff_pair in markets_with_diffs: print(f"{diff_pair[0]}\n{diff_pair[1]}") - print(f"\n\n") + print("\n\n") for missing_market in markets_not_found: print(f"{missing_market}") - print(f"\n\n") + print("\n\n") for diff_token in peggy_denoms_with_diffs: print(f"{diff_token[0]}\n{diff_token[1]}") - print(f"\n\n") + print("\n\n") for missing_peggy in peggy_denoms_not_found: print(f"{missing_peggy}") diff --git a/pyinjective/wallet.py b/pyinjective/wallet.py index c557dd8f..991ba744 100644 --- a/pyinjective/wallet.py +++ b/pyinjective/wallet.py @@ -1,13 +1,13 @@ -import sha3 import hashlib -import aiohttp import json -import requests from typing import Tuple -from bech32 import bech32_encode, bech32_decode, convertbits +import aiohttp +import requests +import sha3 +from bech32 import bech32_decode, bech32_encode, convertbits from bip32 import BIP32 -from ecdsa import SigningKey, VerifyingKey, SECP256k1, BadSignatureError +from ecdsa import BadSignatureError, SECP256k1, SigningKey, VerifyingKey from ecdsa.util import sigencode_string_canonize from mnemonic import Mnemonic @@ -102,6 +102,7 @@ def sign(self, msg: bytes) -> bytes: return self.signing_key.sign_deterministic(msg, hashfunc=sha3.keccak_256, sigencode=sigencode_string_canonize) + class PublicKey: """ Class for wrapping VerifyKey using for signature verification. Adding method to encode/decode @@ -254,43 +255,46 @@ def to_hex(self) -> str: def get_subaccount_id(self, index: int) -> str: """Return a hex representation of address""" - id = index.to_bytes(12, byteorder='big').hex() - return '0x' + self.addr.hex() + id + id = index.to_bytes(12, byteorder="big").hex() + return "0x" + self.addr.hex() + id def get_ethereum_address(self) -> str: - return '0x' + self.addr.hex() + return "0x" + self.addr.hex() async def async_init_num_seq(self, lcd_endpoint: str) -> "Address": async with aiohttp.ClientSession() as session: async with session.request( - 'GET', lcd_endpoint + '/cosmos/auth/v1beta1/accounts/' + self.to_acc_bech32(), - headers={'Accept-Encoding': 'application/json'}, + "GET", + lcd_endpoint + "/cosmos/auth/v1beta1/accounts/" + self.to_acc_bech32(), + headers={"Accept-Encoding": "application/json"}, ) as response: if response.status != 200: print(await response.text()) raise ValueError("HTTP response status", response.status) resp = json.loads(await response.text()) - acc = resp['account']['base_account'] - self.number = int(acc['account_number']) - self.sequence = int(acc['sequence']) + acc = resp["account"]["base_account"] + self.number = int(acc["account_number"]) + self.sequence = int(acc["sequence"]) return self - def init_num_seq(self, lcd_endpoint: str)-> "Address": - response = requests.get(f"{lcd_endpoint}/cosmos/auth/v1beta1/accounts/{self.to_acc_bech32()}", - headers={'Accept-Encoding': 'application/json'}) + def init_num_seq(self, lcd_endpoint: str) -> "Address": + response = requests.get( + url=f"{lcd_endpoint}/cosmos/auth/v1beta1/accounts/{self.to_acc_bech32()}", + headers={"Accept-Encoding": "application/json"}, + ) if response.status_code != 200: raise ValueError("HTTP response status", response.status_code) resp = json.loads(response.text) - acc = resp['account']['base_account'] - self.number = int(acc['account_number']) - self.sequence = int(acc['sequence']) + acc = resp["account"]["base_account"] + self.number = int(acc["account_number"]) + self.sequence = int(acc["sequence"]) return self def get_sequence(self): current_seq = self.sequence self.sequence += 1 return current_seq - + def get_number(self): return self.number diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 00000000..d0189976 --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,99 @@ +[tool.poetry] +name = "injective-py" +version = "0.9.dev" +description = "Injective Python SDK, with Exchange API Client" +authors = ["Injective Labs "] +license = "Apache Software License 2.0" +readme = "README.md" +packages = [ + { include = "pyinjective" }, +] +include = [ + { path = "pyinjective/proto/**/*.py" }, + { path = "*.ini" }, +] + +[tool.poetry.dependencies] +python = "^3.9" +aiocron = "*" +aiohttp = "*" +asyncio = "*" +bech32 = "*" +bip32 = "*" +coincurve = "*" +ecdsa = "*" +eip712 = "*" +grpcio = "*" +grpcio-tools = "*" +hdwallets = "*" +mnemonic = "*" +protobuf = "*" +requests = "*" +safe-pysha3 = "*" +urllib3 = "<2" +websockets = "*" +web3 = "^6.0" + +[tool.poetry.group.test.dependencies] +pytest = "*" +pytest-asyncio = "*" +pytest-grpc = "*" +requests-mock = "*" +pytest-cov = "^4.1.0" + + +[tool.poetry.group.dev.dependencies] +pre-commit = "^3.4.0" +flakeheaven = "^3.3.0" +isort = "^5.12.0" +black = "^23.9.1" + + +[tool.flakeheaven] +exclude = ["pyinjective/proto/*", ".idea/*"] +max_line_length = 120 + + +# list of plugins and rules for them +[tool.flakeheaven.plugins] +pycodestyle = ["+*", "-W503"] +pyflakes = ["+*"] + +[tool.flakeheaven.exceptions."tests/"] +pyflakes = ["-F811"] # disable a plugin + + +[tool.isort] +profile = "black" +line_length = 120 +skip_glob = ["pyinjective/proto/*", ".idea/*"] + + +[tool.black] +line-length = 120 +target-version = ["py39", "py310", "py311"] +include = '\.pyi?$' +# 'extend-exclude' excludes files or directories in addition to the defaults +extend-exclude = ''' +# A regex preceded with ^/ will apply only to files and directories +# in the root of the project. +( + ^pyinjective/proto/.* + | \.idea/.* +) +''' + +[tool.coverage.run] +branch = true +source_pkgs = ["pyinjective"] +omit = ["pyinjective/proto/*"] + +[tool.coverage.report] +skip_empty = true +fail_under = 52 +precision = 2 + + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/setup.py b/setup.py deleted file mode 100755 index ec5c78ae..00000000 --- a/setup.py +++ /dev/null @@ -1,143 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -# Note: To use the 'upload' functionality of this file, you must: -# $ pipenv install twine --dev - -import io -import os -import sys -from shutil import rmtree - -from setuptools import setup, Command, find_packages - -NAME = "injective-py" -DESCRIPTION = "Injective Python SDK, with Exchange API client" -URL = "https://github.com/InjectiveLabs/sdk-python" -EMAIL = "achilleas@injectivelabs.com" -AUTHOR = "Injective Labs" -REQUIRES_PYTHON = ">=3.9" -VERSION = "0.8.1" - -REQUIRED = [ - "aiohttp", - "aiocron", - "asyncio", - "bech32", - "bip32", - "coincurve", - "ecdsa", - "eip712", - "grpcio", - "grpcio-tools", - "hdwallets", - "mnemonic", - "protobuf", - "requests", - "safe-pysha3", - "urllib3", - "websockets", -] - -DEV_REQUIRED = [ - "pytest", - "pytest-asyncio", - "pytest-grpc", - "request-mock", -] - -# The rest you shouldn't have to touch too much :) -# ------------------------------------------------ -# Except, perhaps the License and Trove Classifiers! -# If you do change the License, remember to change the Trove Classifier for that! - -here = os.path.abspath(os.path.dirname(__file__)) - -# Import the README and use it as the long-description. -# Note: this will only work if 'README.md' is present in your MANIFEST.in file! -try: - with io.open(os.path.join(here, "README.md"), encoding="utf-8") as f: - long_description = "\n" + f.read() -except FileNotFoundError: - long_description = DESCRIPTION - -# Load the package's __version__.py module as a dictionary. -about = {} -if not VERSION: - project_slug = NAME.lower().replace("-", "_").replace(" ", "_") - with open(os.path.join(here, project_slug, "__version__.py")) as f: - exec(f.read(), about) -else: - about["__version__"] = VERSION - - -class UploadCommand(Command): - """Support setup.py upload.""" - - description = "Build and publish the package." - user_options = [] - - @staticmethod - def status(s): - """Prints things in bold.""" - print("\033[1m{0}\033[0m".format(s)) - - def initialize_options(self): - pass - - def finalize_options(self): - pass - - def run(self): - try: - self.status("Removing previous builds…") - rmtree(os.path.join(here, "dist")) - except OSError: - pass - - self.status("Building Source and Wheel (universal) distribution…") - os.system("{0} setup.py sdist bdist_wheel --universal".format(sys.executable)) - - self.status("Uploading the package to PyPI via Twine…") - os.system("twine upload dist/*") - - self.status("Pushing git tags…") - os.system("git tag v{0}".format(about["__version__"])) - os.system("git push --tags") - - sys.exit() - - -# Where the magic happens: -setup( - name=NAME, - packages=find_packages(), - include_package_data=True, - version=about["__version__"], - license="Apache Software License 2.0", - description=DESCRIPTION, - long_description=long_description, - long_description_content_type="text/markdown", - author=AUTHOR, - author_email=EMAIL, - python_requires=REQUIRES_PYTHON, - url=URL, - install_requires=REQUIRED, - extras_require={ - "dev": DEV_REQUIRED, - }, - classifiers=[ - # Trove classifiers - # Full list: https://pypi.python.org/pypi?%3Aaction=list_classifiers - "License :: OSI Approved :: Apache Software License", - "Programming Language :: Python", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: Implementation :: CPython", - "Programming Language :: Python :: Implementation :: PyPy", - ], - # $ setup.py publish support. - cmdclass={ - "upload": UploadCommand, - }, -) diff --git a/tests/core/test_gas_limit_estimator.py b/tests/core/test_gas_limit_estimator.py index 9ccbc98b..a2838f0b 100644 --- a/tests/core/test_gas_limit_estimator.py +++ b/tests/core/test_gas_limit_estimator.py @@ -6,25 +6,19 @@ from pyinjective.proto.cosmos.gov.v1beta1 import tx_pb2 as gov_tx_pb from pyinjective.proto.cosmwasm.wasm.v1 import tx_pb2 as wasm_tx_pb from pyinjective.proto.injective.exchange.v1beta1 import tx_pb2 as injective_exchange_tx_pb +from tests.model_fixtures.markets_fixtures import usdt_token # noqa: F401 -from tests.model_fixtures.markets_fixtures import usdt_token class TestGasLimitEstimator: - def test_estimation_for_message_without_applying_rule(self): composer = Composer(network="testnet") - message = composer.MsgSend( - from_address="from_address", - to_address="to_address", - amount=1, - denom='INJ' - ) + message = composer.MsgSend(from_address="from_address", to_address="to_address", amount=1, denom="INJ") estimator = GasLimitEstimator.for_message(message=message) expected_message_gas_limit = 150_000 - assert(expected_message_gas_limit == estimator.gas_limit()) + assert expected_message_gas_limit == estimator.gas_limit() def test_estimation_for_batch_create_spot_limit_orders(self): spot_market_id = "0x0611780ba69656949525013d947713300f56c37b6175e02f26bffa495c3208fe" @@ -37,7 +31,7 @@ def test_estimation_for_batch_create_spot_limit_orders(self): price=5, quantity=1, is_buy=True, - is_po=False + is_po=False, ), composer.SpotOrder( market_id=spot_market_id, @@ -46,19 +40,16 @@ def test_estimation_for_batch_create_spot_limit_orders(self): price=4, quantity=1, is_buy=True, - is_po=False + is_po=False, ), ] - message = composer.MsgBatchCreateSpotLimitOrders( - sender="sender", - orders=orders - ) + message = composer.MsgBatchCreateSpotLimitOrders(sender="sender", orders=orders) estimator = GasLimitEstimator.for_message(message=message) expected_order_gas_limit = 45000 expected_message_gas_limit = 5000 - assert((expected_order_gas_limit * 2) + expected_message_gas_limit == estimator.gas_limit()) + assert (expected_order_gas_limit * 2) + expected_message_gas_limit == estimator.gas_limit() def test_estimation_for_batch_cancel_spot_orders(self): spot_market_id = "0x0611780ba69656949525013d947713300f56c37b6175e02f26bffa495c3208fe" @@ -67,29 +58,26 @@ def test_estimation_for_batch_cancel_spot_orders(self): composer.OrderData( market_id=spot_market_id, subaccount_id="subaccount_id", - order_hash="0x3870fbdd91f07d54425147b1bb96404f4f043ba6335b422a6d494d285b387f2d" + order_hash="0x3870fbdd91f07d54425147b1bb96404f4f043ba6335b422a6d494d285b387f2d", ), composer.OrderData( market_id=spot_market_id, subaccount_id="subaccount_id", - order_hash="0x222daa22f60fe9f075ed0ca583459e121c23e64431c3fbffdedda04598ede0d2" + order_hash="0x222daa22f60fe9f075ed0ca583459e121c23e64431c3fbffdedda04598ede0d2", ), composer.OrderData( market_id=spot_market_id, subaccount_id="subaccount_id", - order_hash="0x7ee76255d7ca763c56b0eab9828fca89fdd3739645501c8a80f58b62b4f76da5" - ) + order_hash="0x7ee76255d7ca763c56b0eab9828fca89fdd3739645501c8a80f58b62b4f76da5", + ), ] - message = composer.MsgBatchCancelSpotOrders( - sender="sender", - data=orders - ) + message = composer.MsgBatchCancelSpotOrders(sender="sender", data=orders) estimator = GasLimitEstimator.for_message(message=message) expected_order_gas_limit = 45000 expected_message_gas_limit = 5000 - assert((expected_order_gas_limit * 3) + expected_message_gas_limit == estimator.gas_limit()) + assert (expected_order_gas_limit * 3) + expected_message_gas_limit == estimator.gas_limit() def test_estimation_for_batch_create_derivative_limit_orders(self): market_id = "0x17ef48032cb24375ba7c2e39f384e56433bcab20cbee9a7357e4cba2eb00abe6" @@ -103,7 +91,7 @@ def test_estimation_for_batch_create_derivative_limit_orders(self): quantity=1, leverage=1, is_buy=True, - is_po=False + is_po=False, ), composer.DerivativeOrder( market_id=market_id, @@ -113,19 +101,16 @@ def test_estimation_for_batch_create_derivative_limit_orders(self): quantity=1, leverage=1, is_buy=False, - is_reduce_only=False + is_reduce_only=False, ), ] - message = composer.MsgBatchCreateDerivativeLimitOrders( - sender="sender", - orders=orders - ) + message = composer.MsgBatchCreateDerivativeLimitOrders(sender="sender", orders=orders) estimator = GasLimitEstimator.for_message(message=message) expected_order_gas_limit = 60_000 expected_message_gas_limit = 5000 - assert((expected_order_gas_limit * 2) + expected_message_gas_limit == estimator.gas_limit()) + assert (expected_order_gas_limit * 2) + expected_message_gas_limit == estimator.gas_limit() def test_estimation_for_batch_cancel_derivative_orders(self): spot_market_id = "0x0611780ba69656949525013d947713300f56c37b6175e02f26bffa495c3208fe" @@ -134,29 +119,26 @@ def test_estimation_for_batch_cancel_derivative_orders(self): composer.OrderData( market_id=spot_market_id, subaccount_id="subaccount_id", - order_hash="0x3870fbdd91f07d54425147b1bb96404f4f043ba6335b422a6d494d285b387f2d" + order_hash="0x3870fbdd91f07d54425147b1bb96404f4f043ba6335b422a6d494d285b387f2d", ), composer.OrderData( market_id=spot_market_id, subaccount_id="subaccount_id", - order_hash="0x222daa22f60fe9f075ed0ca583459e121c23e64431c3fbffdedda04598ede0d2" + order_hash="0x222daa22f60fe9f075ed0ca583459e121c23e64431c3fbffdedda04598ede0d2", ), composer.OrderData( market_id=spot_market_id, subaccount_id="subaccount_id", - order_hash="0x7ee76255d7ca763c56b0eab9828fca89fdd3739645501c8a80f58b62b4f76da5" - ) + order_hash="0x7ee76255d7ca763c56b0eab9828fca89fdd3739645501c8a80f58b62b4f76da5", + ), ] - message = composer.MsgBatchCancelDerivativeOrders( - sender="sender", - data=orders - ) + message = composer.MsgBatchCancelDerivativeOrders(sender="sender", data=orders) estimator = GasLimitEstimator.for_message(message=message) expected_order_gas_limit = 55_000 expected_message_gas_limit = 5000 - assert((expected_order_gas_limit * 3) + expected_message_gas_limit == estimator.gas_limit()) + assert (expected_order_gas_limit * 3) + expected_message_gas_limit == estimator.gas_limit() def test_estimation_for_batch_update_orders_to_create_spot_orders(self): market_id = "0x0611780ba69656949525013d947713300f56c37b6175e02f26bffa495c3208fe" @@ -169,7 +151,7 @@ def test_estimation_for_batch_update_orders_to_create_spot_orders(self): price=5, quantity=1, is_buy=True, - is_po=False + is_po=False, ), composer.SpotOrder( market_id=market_id, @@ -178,7 +160,7 @@ def test_estimation_for_batch_update_orders_to_create_spot_orders(self): price=4, quantity=1, is_buy=True, - is_po=False + is_po=False, ), ] message = composer.MsgBatchUpdateOrders( @@ -186,14 +168,14 @@ def test_estimation_for_batch_update_orders_to_create_spot_orders(self): derivative_orders_to_create=[], spot_orders_to_create=orders, derivative_orders_to_cancel=[], - spot_orders_to_cancel=[] + spot_orders_to_cancel=[], ) estimator = GasLimitEstimator.for_message(message=message) expected_order_gas_limit = 40_000 expected_message_gas_limit = 10_000 - assert((expected_order_gas_limit * 2) + expected_message_gas_limit == estimator.gas_limit()) + assert (expected_order_gas_limit * 2) + expected_message_gas_limit == estimator.gas_limit() def test_estimation_for_batch_update_orders_to_create_derivative_orders(self): market_id = "0x17ef48032cb24375ba7c2e39f384e56433bcab20cbee9a7357e4cba2eb00abe6" @@ -207,7 +189,7 @@ def test_estimation_for_batch_update_orders_to_create_derivative_orders(self): quantity=1, leverage=1, is_buy=True, - is_po=False + is_po=False, ), composer.DerivativeOrder( market_id=market_id, @@ -217,7 +199,7 @@ def test_estimation_for_batch_update_orders_to_create_derivative_orders(self): quantity=1, leverage=1, is_buy=False, - is_reduce_only=False + is_reduce_only=False, ), ] message = composer.MsgBatchUpdateOrders( @@ -225,14 +207,14 @@ def test_estimation_for_batch_update_orders_to_create_derivative_orders(self): derivative_orders_to_create=orders, spot_orders_to_create=[], derivative_orders_to_cancel=[], - spot_orders_to_cancel=[] + spot_orders_to_cancel=[], ) estimator = GasLimitEstimator.for_message(message=message) expected_order_gas_limit = 60_000 expected_message_gas_limit = 10_000 - assert((expected_order_gas_limit * 2) + expected_message_gas_limit == estimator.gas_limit()) + assert (expected_order_gas_limit * 2) + expected_message_gas_limit == estimator.gas_limit() def test_estimation_for_batch_update_orders_to_create_binary_orders(self, usdt_token): market_id = "0x230dcce315364ff6360097838701b14713e2f4007d704df20ed3d81d09eec957" @@ -264,7 +246,7 @@ def test_estimation_for_batch_update_orders_to_create_binary_orders(self, usdt_t quantity=1, leverage=1, is_buy=True, - is_po=False + is_po=False, ), composer.BinaryOptionsOrder( market_id=market_id, @@ -274,7 +256,7 @@ def test_estimation_for_batch_update_orders_to_create_binary_orders(self, usdt_t quantity=1, leverage=1, is_buy=False, - is_reduce_only=False + is_reduce_only=False, ), ] message = composer.MsgBatchUpdateOrders( @@ -283,14 +265,14 @@ def test_estimation_for_batch_update_orders_to_create_binary_orders(self, usdt_t spot_orders_to_create=[], binary_options_orders_to_create=orders, derivative_orders_to_cancel=[], - spot_orders_to_cancel=[] + spot_orders_to_cancel=[], ) estimator = GasLimitEstimator.for_message(message=message) expected_order_gas_limit = 60_000 expected_message_gas_limit = 10_000 - assert((expected_order_gas_limit * 2) + expected_message_gas_limit == estimator.gas_limit()) + assert (expected_order_gas_limit * 2) + expected_message_gas_limit == estimator.gas_limit() def test_estimation_for_batch_update_orders_to_cancel_spot_orders(self): market_id = "0x0611780ba69656949525013d947713300f56c37b6175e02f26bffa495c3208fe" @@ -299,32 +281,32 @@ def test_estimation_for_batch_update_orders_to_cancel_spot_orders(self): composer.OrderData( market_id=market_id, subaccount_id="subaccount_id", - order_hash="0x3870fbdd91f07d54425147b1bb96404f4f043ba6335b422a6d494d285b387f2d" + order_hash="0x3870fbdd91f07d54425147b1bb96404f4f043ba6335b422a6d494d285b387f2d", ), composer.OrderData( market_id=market_id, subaccount_id="subaccount_id", - order_hash="0x222daa22f60fe9f075ed0ca583459e121c23e64431c3fbffdedda04598ede0d2" + order_hash="0x222daa22f60fe9f075ed0ca583459e121c23e64431c3fbffdedda04598ede0d2", ), composer.OrderData( market_id=market_id, subaccount_id="subaccount_id", - order_hash="0x7ee76255d7ca763c56b0eab9828fca89fdd3739645501c8a80f58b62b4f76da5" - ) + order_hash="0x7ee76255d7ca763c56b0eab9828fca89fdd3739645501c8a80f58b62b4f76da5", + ), ] message = composer.MsgBatchUpdateOrders( sender="senders", derivative_orders_to_create=[], spot_orders_to_create=[], derivative_orders_to_cancel=[], - spot_orders_to_cancel=orders + spot_orders_to_cancel=orders, ) estimator = GasLimitEstimator.for_message(message=message) expected_order_gas_limit = 45_000 expected_message_gas_limit = 10_000 - assert((expected_order_gas_limit * 3) + expected_message_gas_limit == estimator.gas_limit()) + assert (expected_order_gas_limit * 3) + expected_message_gas_limit == estimator.gas_limit() def test_estimation_for_batch_update_orders_to_cancel_derivative_orders(self): market_id = "0x17ef48032cb24375ba7c2e39f384e56433bcab20cbee9a7357e4cba2eb00abe6" @@ -333,32 +315,32 @@ def test_estimation_for_batch_update_orders_to_cancel_derivative_orders(self): composer.OrderData( market_id=market_id, subaccount_id="subaccount_id", - order_hash="0x3870fbdd91f07d54425147b1bb96404f4f043ba6335b422a6d494d285b387f2d" + order_hash="0x3870fbdd91f07d54425147b1bb96404f4f043ba6335b422a6d494d285b387f2d", ), composer.OrderData( market_id=market_id, subaccount_id="subaccount_id", - order_hash="0x222daa22f60fe9f075ed0ca583459e121c23e64431c3fbffdedda04598ede0d2" + order_hash="0x222daa22f60fe9f075ed0ca583459e121c23e64431c3fbffdedda04598ede0d2", ), composer.OrderData( market_id=market_id, subaccount_id="subaccount_id", - order_hash="0x7ee76255d7ca763c56b0eab9828fca89fdd3739645501c8a80f58b62b4f76da5" - ) + order_hash="0x7ee76255d7ca763c56b0eab9828fca89fdd3739645501c8a80f58b62b4f76da5", + ), ] message = composer.MsgBatchUpdateOrders( sender="senders", derivative_orders_to_create=[], spot_orders_to_create=[], derivative_orders_to_cancel=orders, - spot_orders_to_cancel=[] + spot_orders_to_cancel=[], ) estimator = GasLimitEstimator.for_message(message=message) expected_order_gas_limit = 55_000 expected_message_gas_limit = 10_000 - assert((expected_order_gas_limit * 3) + expected_message_gas_limit == estimator.gas_limit()) + assert (expected_order_gas_limit * 3) + expected_message_gas_limit == estimator.gas_limit() def test_estimation_for_batch_update_orders_to_cancel_binary_orders(self): market_id = "0x17ef48032cb24375ba7c2e39f384e56433bcab20cbee9a7357e4cba2eb00abe6" @@ -367,18 +349,18 @@ def test_estimation_for_batch_update_orders_to_cancel_binary_orders(self): composer.OrderData( market_id=market_id, subaccount_id="subaccount_id", - order_hash="0x3870fbdd91f07d54425147b1bb96404f4f043ba6335b422a6d494d285b387f2d" + order_hash="0x3870fbdd91f07d54425147b1bb96404f4f043ba6335b422a6d494d285b387f2d", ), composer.OrderData( market_id=market_id, subaccount_id="subaccount_id", - order_hash="0x222daa22f60fe9f075ed0ca583459e121c23e64431c3fbffdedda04598ede0d2" + order_hash="0x222daa22f60fe9f075ed0ca583459e121c23e64431c3fbffdedda04598ede0d2", ), composer.OrderData( market_id=market_id, subaccount_id="subaccount_id", - order_hash="0x7ee76255d7ca763c56b0eab9828fca89fdd3739645501c8a80f58b62b4f76da5" - ) + order_hash="0x7ee76255d7ca763c56b0eab9828fca89fdd3739645501c8a80f58b62b4f76da5", + ), ] message = composer.MsgBatchUpdateOrders( sender="senders", @@ -393,7 +375,7 @@ def test_estimation_for_batch_update_orders_to_cancel_binary_orders(self): expected_order_gas_limit = 55_000 expected_message_gas_limit = 10_000 - assert((expected_order_gas_limit * 3) + expected_message_gas_limit == estimator.gas_limit()) + assert (expected_order_gas_limit * 3) + expected_message_gas_limit == estimator.gas_limit() def test_estimation_for_batch_update_orders_to_cancel_all_for_spot_market(self): market_id = "0x0611780ba69656949525013d947713300f56c37b6175e02f26bffa495c3208fe" @@ -406,14 +388,14 @@ def test_estimation_for_batch_update_orders_to_cancel_all_for_spot_market(self): derivative_orders_to_create=[], spot_orders_to_create=[], derivative_orders_to_cancel=[], - spot_orders_to_cancel=[] + spot_orders_to_cancel=[], ) estimator = GasLimitEstimator.for_message(message=message) expected_gas_limit = 35_000 * 20 expected_message_gas_limit = 10_000 - assert(expected_gas_limit + expected_message_gas_limit == estimator.gas_limit()) + assert expected_gas_limit + expected_message_gas_limit == estimator.gas_limit() def test_estimation_for_batch_update_orders_to_cancel_all_for_derivative_market(self): market_id = "0x0611780ba69656949525013d947713300f56c37b6175e02f26bffa495c3208fe" @@ -426,14 +408,14 @@ def test_estimation_for_batch_update_orders_to_cancel_all_for_derivative_market( derivative_orders_to_create=[], spot_orders_to_create=[], derivative_orders_to_cancel=[], - spot_orders_to_cancel=[] + spot_orders_to_cancel=[], ) estimator = GasLimitEstimator.for_message(message=message) expected_gas_limit = 45_000 * 20 expected_message_gas_limit = 10_000 - assert(expected_gas_limit + expected_message_gas_limit == estimator.gas_limit()) + assert expected_gas_limit + expected_message_gas_limit == estimator.gas_limit() def test_estimation_for_batch_update_orders_to_cancel_all_for_binary_options_market(self): market_id = "0x0611780ba69656949525013d947713300f56c37b6175e02f26bffa495c3208fe" @@ -446,14 +428,14 @@ def test_estimation_for_batch_update_orders_to_cancel_all_for_binary_options_mar derivative_orders_to_create=[], spot_orders_to_create=[], derivative_orders_to_cancel=[], - spot_orders_to_cancel=[] + spot_orders_to_cancel=[], ) estimator = GasLimitEstimator.for_message(message=message) expected_gas_limit = 45_000 * 20 expected_message_gas_limit = 10_000 - assert(expected_gas_limit + expected_message_gas_limit == estimator.gas_limit()) + assert expected_gas_limit + expected_message_gas_limit == estimator.gas_limit() def test_estimation_for_exec_message(self): market_id = "0x0611780ba69656949525013d947713300f56c37b6175e02f26bffa495c3208fe" @@ -466,7 +448,7 @@ def test_estimation_for_exec_message(self): price=5, quantity=1, is_buy=True, - is_po=False + is_po=False, ), ] inner_message = composer.MsgBatchUpdateOrders( @@ -474,12 +456,9 @@ def test_estimation_for_exec_message(self): derivative_orders_to_create=[], spot_orders_to_create=orders, derivative_orders_to_cancel=[], - spot_orders_to_cancel=[] - ) - message = composer.MsgExec( - grantee="grantee", - msgs=[inner_message] + spot_orders_to_cancel=[], ) + message = composer.MsgExec(grantee="grantee", msgs=[inner_message]) estimator = GasLimitEstimator.for_message(message=message) @@ -487,19 +466,18 @@ def test_estimation_for_exec_message(self): expected_inner_message_gas_limit = 10_000 expected_exec_message_gas_limit = 5_000 - assert(expected_order_gas_limit - + expected_inner_message_gas_limit - + expected_exec_message_gas_limit - == estimator.gas_limit()) - + assert ( + expected_order_gas_limit + expected_inner_message_gas_limit + expected_exec_message_gas_limit + == estimator.gas_limit() + ) + def test_estimation_for_privileged_execute_contract_message(self): message = injective_exchange_tx_pb.MsgPrivilegedExecuteContract() estimator = GasLimitEstimator.for_message(message=message) expected_gas_limit = 900_000 - assert(expected_gas_limit == estimator.gas_limit()) - + assert expected_gas_limit == estimator.gas_limit() def test_estimation_for_execute_contract_message(self): composer = Composer(network="testnet") @@ -512,7 +490,7 @@ def test_estimation_for_execute_contract_message(self): expected_gas_limit = 375_000 - assert(expected_gas_limit == estimator.gas_limit()) + assert expected_gas_limit == estimator.gas_limit() def test_estimation_for_wasm_message(self): message = wasm_tx_pb.MsgInstantiateContract2() @@ -520,7 +498,7 @@ def test_estimation_for_wasm_message(self): expected_gas_limit = 225_000 - assert(expected_gas_limit == estimator.gas_limit()) + assert expected_gas_limit == estimator.gas_limit() def test_estimation_for_governance_message(self): message = gov_tx_pb.MsgDeposit() @@ -528,7 +506,7 @@ def test_estimation_for_governance_message(self): expected_gas_limit = 2_250_000 - assert(expected_gas_limit == estimator.gas_limit()) + assert expected_gas_limit == estimator.gas_limit() def test_estimation_for_generic_exchange_message(self): composer = Composer(network="testnet") @@ -540,10 +518,10 @@ def test_estimation_for_generic_exchange_message(self): price=7.523, quantity=0.01, is_buy=True, - is_po=False + is_po=False, ) estimator = GasLimitEstimator.for_message(message=message) expected_gas_limit = 100_000 - assert(expected_gas_limit == estimator.gas_limit()) + assert expected_gas_limit == estimator.gas_limit() diff --git a/tests/core/test_market.py b/tests/core/test_market.py index 1038c51b..003f39a2 100644 --- a/tests/core/test_market.py +++ b/tests/core/test_market.py @@ -1,31 +1,27 @@ -import pytest from decimal import Decimal from pyinjective.constant import Denom - from pyinjective.core.market import BinaryOptionMarket, DerivativeMarket, SpotMarket -from tests.model_fixtures.markets_fixtures import ( - first_match_bet_market, - inj_token, - usdt_token, - usdt_perp_token, - inj_usdt_spot_market, - btc_usdt_perp_market, -) +from tests.model_fixtures.markets_fixtures import btc_usdt_perp_market # noqa: F401 +from tests.model_fixtures.markets_fixtures import first_match_bet_market # noqa: F401 +from tests.model_fixtures.markets_fixtures import inj_token # noqa: F401 +from tests.model_fixtures.markets_fixtures import inj_usdt_spot_market # noqa: F401 +from tests.model_fixtures.markets_fixtures import usdt_perp_token # noqa: F401 +from tests.model_fixtures.markets_fixtures import usdt_token # noqa: F401; noqa: F401 class TestSpotMarket: - def test_convert_quantity_to_chain_format(self, inj_usdt_spot_market: SpotMarket): original_quantity = Decimal("123.456789") chain_value = inj_usdt_spot_market.quantity_to_chain_format(human_readable_value=original_quantity) expected_value = original_quantity * Decimal(f"1e{inj_usdt_spot_market.base_token.decimals}") - quantized_value = ((expected_value // inj_usdt_spot_market.min_quantity_tick_size) - * inj_usdt_spot_market.min_quantity_tick_size) - quantized_chain_format_value = quantized_value * Decimal(f"1e18") + quantized_value = ( + expected_value // inj_usdt_spot_market.min_quantity_tick_size + ) * inj_usdt_spot_market.min_quantity_tick_size + quantized_chain_format_value = quantized_value * Decimal("1e18") - assert (quantized_chain_format_value == chain_value) + assert quantized_chain_format_value == chain_value def test_convert_price_to_chain_format(self, inj_usdt_spot_market: SpotMarket): original_quantity = Decimal("123.456789") @@ -33,24 +29,42 @@ def test_convert_price_to_chain_format(self, inj_usdt_spot_market: SpotMarket): chain_value = inj_usdt_spot_market.price_to_chain_format(human_readable_value=original_quantity) price_decimals = inj_usdt_spot_market.quote_token.decimals - inj_usdt_spot_market.base_token.decimals expected_value = original_quantity * Decimal(f"1e{price_decimals}") - quantized_value = ((expected_value // inj_usdt_spot_market.min_price_tick_size) - * inj_usdt_spot_market.min_price_tick_size) - quantized_chain_format_value = quantized_value * Decimal(f"1e18") + quantized_value = ( + expected_value // inj_usdt_spot_market.min_price_tick_size + ) * inj_usdt_spot_market.min_price_tick_size + quantized_chain_format_value = quantized_value * Decimal("1e18") - assert (quantized_chain_format_value == chain_value) + assert quantized_chain_format_value == chain_value + def test_convert_quantity_from_chain_format(self, inj_usdt_spot_market: SpotMarket): + expected_quantity = Decimal("123.456") -class TestDerivativeMarket: + chain_format_quantity = expected_quantity * Decimal(f"1e{inj_usdt_spot_market.base_token.decimals}") + human_readable_quantity = inj_usdt_spot_market.quantity_from_chain_format(chain_value=chain_format_quantity) + + assert expected_quantity == human_readable_quantity + + def test_convert_price_from_chain_format(self, inj_usdt_spot_market: SpotMarket): + expected_price = Decimal("123.456") + + price_decimals = inj_usdt_spot_market.quote_token.decimals - inj_usdt_spot_market.base_token.decimals + chain_format_price = expected_price * Decimal(f"1e{price_decimals}") + human_readable_price = inj_usdt_spot_market.price_from_chain_format(chain_value=chain_format_price) + + assert expected_price == human_readable_price + +class TestDerivativeMarket: def test_convert_quantity_to_chain_format(self, btc_usdt_perp_market: DerivativeMarket): original_quantity = Decimal("123.456789") chain_value = btc_usdt_perp_market.quantity_to_chain_format(human_readable_value=original_quantity) - quantized_value = ((original_quantity // btc_usdt_perp_market.min_quantity_tick_size) - * btc_usdt_perp_market.min_quantity_tick_size) - quantized_chain_format_value = quantized_value * Decimal(f"1e18") + quantized_value = ( + original_quantity // btc_usdt_perp_market.min_quantity_tick_size + ) * btc_usdt_perp_market.min_quantity_tick_size + quantized_chain_format_value = quantized_value * Decimal("1e18") - assert (quantized_chain_format_value == chain_value) + assert quantized_chain_format_value == chain_value def test_convert_price_to_chain_format(self, btc_usdt_perp_market: DerivativeMarket): original_quantity = Decimal("123.456789") @@ -58,11 +72,12 @@ def test_convert_price_to_chain_format(self, btc_usdt_perp_market: DerivativeMar chain_value = btc_usdt_perp_market.price_to_chain_format(human_readable_value=original_quantity) price_decimals = btc_usdt_perp_market.quote_token.decimals expected_value = original_quantity * Decimal(f"1e{price_decimals}") - quantized_value = ((expected_value // btc_usdt_perp_market.min_price_tick_size) - * btc_usdt_perp_market.min_price_tick_size) - quantized_chain_format_value = quantized_value * Decimal(f"1e18") + quantized_value = ( + expected_value // btc_usdt_perp_market.min_price_tick_size + ) * btc_usdt_perp_market.min_price_tick_size + quantized_chain_format_value = quantized_value * Decimal("1e18") - assert (quantized_chain_format_value == chain_value) + assert quantized_chain_format_value == chain_value def test_convert_margin_to_chain_format(self, btc_usdt_perp_market: DerivativeMarket): original_quantity = Decimal("123.456789") @@ -70,14 +85,41 @@ def test_convert_margin_to_chain_format(self, btc_usdt_perp_market: DerivativeMa chain_value = btc_usdt_perp_market.margin_to_chain_format(human_readable_value=original_quantity) margin_decimals = btc_usdt_perp_market.quote_token.decimals expected_value = original_quantity * Decimal(f"1e{margin_decimals}") - quantized_value = ((expected_value // btc_usdt_perp_market.min_quantity_tick_size) - * btc_usdt_perp_market.min_quantity_tick_size) - quantized_chain_format_value = quantized_value * Decimal(f"1e18") + quantized_value = ( + expected_value // btc_usdt_perp_market.min_quantity_tick_size + ) * btc_usdt_perp_market.min_quantity_tick_size + quantized_chain_format_value = quantized_value * Decimal("1e18") - assert (quantized_chain_format_value == chain_value) + assert quantized_chain_format_value == chain_value -class TestBinaryOptionMarket: + def test_convert_quantity_from_chain_format(self, btc_usdt_perp_market: DerivativeMarket): + expected_quantity = Decimal("123.456") + + chain_format_quantity = expected_quantity + human_readable_quantity = btc_usdt_perp_market.quantity_from_chain_format(chain_value=chain_format_quantity) + + assert expected_quantity == human_readable_quantity + + def test_convert_price_from_chain_format(self, btc_usdt_perp_market: DerivativeMarket): + expected_price = Decimal("123.456") + + price_decimals = btc_usdt_perp_market.quote_token.decimals + chain_format_price = expected_price * Decimal(f"1e{price_decimals}") + human_readable_price = btc_usdt_perp_market.price_from_chain_format(chain_value=chain_format_price) + assert expected_price == human_readable_price + + def test_convert_margin_from_chain_format(self, btc_usdt_perp_market: DerivativeMarket): + expected_margin = Decimal("123.456") + + price_decimals = btc_usdt_perp_market.quote_token.decimals + chain_format_margin = expected_margin * Decimal(f"1e{price_decimals}") + human_readable_margin = btc_usdt_perp_market.margin_from_chain_format(chain_value=chain_format_margin) + + assert expected_margin == human_readable_margin + + +class TestBinaryOptionMarket: def test_convert_quantity_to_chain_format_with_fixed_denom(self, first_match_bet_market: BinaryOptionMarket): original_quantity = Decimal("123.456789") fixed_denom = Denom( @@ -89,15 +131,15 @@ def test_convert_quantity_to_chain_format_with_fixed_denom(self, first_match_bet ) chain_value = first_match_bet_market.quantity_to_chain_format( - human_readable_value=original_quantity, - special_denom=fixed_denom + human_readable_value=original_quantity, special_denom=fixed_denom ) chain_formatted_quantity = original_quantity * Decimal(f"1e{fixed_denom.base}") - quantized_value = ((chain_formatted_quantity // Decimal(str(fixed_denom.min_quantity_tick_size))) - * Decimal(str(fixed_denom.min_quantity_tick_size))) - quantized_chain_format_value = quantized_value * Decimal(f"1e18") + quantized_value = (chain_formatted_quantity // Decimal(str(fixed_denom.min_quantity_tick_size))) * Decimal( + str(fixed_denom.min_quantity_tick_size) + ) + quantized_chain_format_value = quantized_value * Decimal("1e18") - assert (quantized_chain_format_value == chain_value) + assert quantized_chain_format_value == chain_value def test_convert_quantity_to_chain_format_without_fixed_denom(self, first_match_bet_market: BinaryOptionMarket): original_quantity = Decimal("123.456789") @@ -105,11 +147,12 @@ def test_convert_quantity_to_chain_format_without_fixed_denom(self, first_match_ chain_value = first_match_bet_market.quantity_to_chain_format( human_readable_value=original_quantity, ) - quantized_value = ((original_quantity // first_match_bet_market.min_quantity_tick_size) - * first_match_bet_market.min_quantity_tick_size) - quantized_chain_format_value = quantized_value * Decimal(f"1e18") + quantized_value = ( + original_quantity // first_match_bet_market.min_quantity_tick_size + ) * first_match_bet_market.min_quantity_tick_size + quantized_chain_format_value = quantized_value * Decimal("1e18") - assert (quantized_chain_format_value == chain_value) + assert quantized_chain_format_value == chain_value def test_convert_price_to_chain_format_with_fixed_denom(self, first_match_bet_market: BinaryOptionMarket): original_quantity = Decimal("123.456789") @@ -127,11 +170,12 @@ def test_convert_price_to_chain_format_with_fixed_denom(self, first_match_bet_ma ) price_decimals = fixed_denom.quote expected_value = original_quantity * Decimal(f"1e{price_decimals}") - quantized_value = ((expected_value // Decimal(str(fixed_denom.min_price_tick_size))) - * Decimal(str(fixed_denom.min_price_tick_size))) - quantized_chain_format_value = quantized_value * Decimal(f"1e18") + quantized_value = (expected_value // Decimal(str(fixed_denom.min_price_tick_size))) * Decimal( + str(fixed_denom.min_price_tick_size) + ) + quantized_chain_format_value = quantized_value * Decimal("1e18") - assert (quantized_chain_format_value == chain_value) + assert quantized_chain_format_value == chain_value def test_convert_price_to_chain_format_without_fixed_denom(self, first_match_bet_market: BinaryOptionMarket): original_quantity = Decimal("123.456789") @@ -139,11 +183,12 @@ def test_convert_price_to_chain_format_without_fixed_denom(self, first_match_bet chain_value = first_match_bet_market.price_to_chain_format(human_readable_value=original_quantity) price_decimals = first_match_bet_market.quote_token.decimals expected_value = original_quantity * Decimal(f"1e{price_decimals}") - quantized_value = ((expected_value // first_match_bet_market.min_price_tick_size) - * first_match_bet_market.min_price_tick_size) - quantized_chain_format_value = quantized_value * Decimal(f"1e18") + quantized_value = ( + expected_value // first_match_bet_market.min_price_tick_size + ) * first_match_bet_market.min_price_tick_size + quantized_chain_format_value = quantized_value * Decimal("1e18") - assert (quantized_chain_format_value == chain_value) + assert quantized_chain_format_value == chain_value def test_calculate_margin_for_buy_with_fixed_denom(self, first_match_bet_market: BinaryOptionMarket): original_quantity = Decimal("123.456789") @@ -168,11 +213,12 @@ def test_calculate_margin_for_buy_with_fixed_denom(self, first_match_bet_market: expected_quantity = original_quantity * Decimal(f"1e{quantity_decimals}") expected_price = original_price * Decimal(f"1e{price_decimals}") expected_margin = expected_quantity * expected_price - quantized_margin = ((expected_margin // Decimal(str(fixed_denom.min_quantity_tick_size))) - * Decimal(str(fixed_denom.min_quantity_tick_size))) - quantized_chain_format_margin = quantized_margin * Decimal(f"1e18") + quantized_margin = (expected_margin // Decimal(str(fixed_denom.min_quantity_tick_size))) * Decimal( + str(fixed_denom.min_quantity_tick_size) + ) + quantized_chain_format_margin = quantized_margin * Decimal("1e18") - assert (quantized_chain_format_margin == chain_value) + assert quantized_chain_format_margin == chain_value def test_calculate_margin_for_buy_without_fixed_denom(self, first_match_bet_market: BinaryOptionMarket): original_quantity = Decimal("123.456789") @@ -187,11 +233,12 @@ def test_calculate_margin_for_buy_without_fixed_denom(self, first_match_bet_mark price_decimals = first_match_bet_market.quote_token.decimals expected_price = original_price * Decimal(f"1e{price_decimals}") expected_margin = original_quantity * expected_price - quantized_margin = ((expected_margin // Decimal(str(first_match_bet_market.min_quantity_tick_size))) - * Decimal(str(first_match_bet_market.min_quantity_tick_size))) - quantized_chain_format_margin = quantized_margin * Decimal(f"1e18") + quantized_margin = (expected_margin // Decimal(str(first_match_bet_market.min_quantity_tick_size))) * Decimal( + str(first_match_bet_market.min_quantity_tick_size) + ) + quantized_chain_format_margin = quantized_margin * Decimal("1e18") - assert (quantized_chain_format_margin == chain_value) + assert quantized_chain_format_margin == chain_value def test_calculate_margin_for_sell_without_fixed_denom(self, first_match_bet_market: BinaryOptionMarket): original_quantity = Decimal("123.456789") @@ -206,8 +253,64 @@ def test_calculate_margin_for_sell_without_fixed_denom(self, first_match_bet_mar price_decimals = first_match_bet_market.quote_token.decimals expected_price = (Decimal(1) - original_price) * Decimal(f"1e{price_decimals}") expected_margin = original_quantity * expected_price - quantized_margin = ((expected_margin // Decimal(str(first_match_bet_market.min_quantity_tick_size))) - * Decimal(str(first_match_bet_market.min_quantity_tick_size))) - quantized_chain_format_margin = quantized_margin * Decimal(f"1e18") + quantized_margin = (expected_margin // Decimal(str(first_match_bet_market.min_quantity_tick_size))) * Decimal( + str(first_match_bet_market.min_quantity_tick_size) + ) + quantized_chain_format_margin = quantized_margin * Decimal("1e18") + + assert quantized_chain_format_margin == chain_value + + def test_convert_quantity_from_chain_format_with_fixed_denom(self, first_match_bet_market: BinaryOptionMarket): + original_quantity = Decimal("123.456789") + fixed_denom = Denom( + description="Fixed denom", + base=2, + quote=4, + min_quantity_tick_size=100, + min_price_tick_size=10000, + ) + + chain_formatted_quantity = original_quantity * Decimal(f"1e{fixed_denom.base}") + + human_readable_quantity = first_match_bet_market.quantity_from_chain_format( + chain_value=chain_formatted_quantity, special_denom=fixed_denom + ) + + assert original_quantity == human_readable_quantity + + def test_convert_quantity_from_chain_format_without_fixed_denom(self, first_match_bet_market: BinaryOptionMarket): + original_quantity = Decimal("123.456789") + + chain_formatted_quantity = original_quantity + + human_readable_quantity = first_match_bet_market.quantity_from_chain_format( + chain_value=chain_formatted_quantity + ) + + assert original_quantity == human_readable_quantity + + def test_convert_price_from_chain_format_with_fixed_denom(self, first_match_bet_market: BinaryOptionMarket): + original_price = Decimal("123.456789") + fixed_denom = Denom( + description="Fixed denom", + base=2, + quote=4, + min_quantity_tick_size=100, + min_price_tick_size=10000, + ) + + chain_formatted_price = original_price * Decimal(f"1e{fixed_denom.quote}") + + human_readable_price = first_match_bet_market.price_from_chain_format( + chain_value=chain_formatted_price, special_denom=fixed_denom + ) + + assert original_price == human_readable_price + + def test_convert_price_from_chain_format_without_fixed_denom(self, first_match_bet_market: BinaryOptionMarket): + original_price = Decimal("123.456789") + chain_formatted_price = original_price * Decimal(f"1e{first_match_bet_market.quote_token.decimals}") + + human_readable_price = first_match_bet_market.price_from_chain_format(chain_value=chain_formatted_price) - assert (quantized_chain_format_margin == chain_value) + assert original_price == human_readable_price diff --git a/tests/core/test_message_based_transaction_fee_calculator.py b/tests/core/test_message_based_transaction_fee_calculator.py index 2c3c4441..f4c3a8d8 100644 --- a/tests/core/test_message_based_transaction_fee_calculator.py +++ b/tests/core/test_message_based_transaction_fee_calculator.py @@ -1,20 +1,19 @@ +import math from decimal import Decimal -import math import pytest from pyinjective import Transaction from pyinjective.async_client import AsyncClient from pyinjective.composer import Composer -from pyinjective.core.network import Network from pyinjective.core.broadcaster import MessageBasedTransactionFeeCalculator +from pyinjective.core.network import Network from pyinjective.proto.cosmos.gov.v1beta1 import tx_pb2 as gov_tx_pb2 from pyinjective.proto.cosmwasm.wasm.v1 import tx_pb2 as wasm_tx_pb2 from pyinjective.proto.injective.exchange.v1beta1 import tx_pb2 class TestMessageBasedTransactionFeeCalculator: - @pytest.mark.asyncio async def test_gas_fee_for_privileged_execute_contract_message(self): network = Network.testnet(node="sentry") @@ -34,8 +33,8 @@ async def test_gas_fee_for_privileged_execute_contract_message(self): expected_transaction_gas_limit = 60_000 expected_gas_limit = math.ceil(Decimal(6) * 150_000 + expected_transaction_gas_limit) - assert(expected_gas_limit == transaction.fee.gas_limit) - assert(str(expected_gas_limit * 5_000_000) == transaction.fee.amount[0].amount) + assert expected_gas_limit == transaction.fee.gas_limit + assert str(expected_gas_limit * 5_000_000) == transaction.fee.amount[0].amount @pytest.mark.asyncio async def test_gas_fee_for_execute_contract_message(self): @@ -60,8 +59,8 @@ async def test_gas_fee_for_execute_contract_message(self): expected_transaction_gas_limit = 60_000 expected_gas_limit = math.ceil(Decimal(2.5) * 150_000 + expected_transaction_gas_limit) - assert (expected_gas_limit == transaction.fee.gas_limit) - assert (str(expected_gas_limit * 5_000_000) == transaction.fee.amount[0].amount) + assert expected_gas_limit == transaction.fee.gas_limit + assert str(expected_gas_limit * 5_000_000) == transaction.fee.amount[0].amount @pytest.mark.asyncio async def test_gas_fee_for_wasm_message(self): @@ -82,8 +81,8 @@ async def test_gas_fee_for_wasm_message(self): expected_transaction_gas_limit = 60_000 expected_gas_limit = math.ceil(Decimal(1.5) * 150_000 + expected_transaction_gas_limit) - assert (expected_gas_limit == transaction.fee.gas_limit) - assert (str(expected_gas_limit * 5_000_000) == transaction.fee.amount[0].amount) + assert expected_gas_limit == transaction.fee.gas_limit + assert str(expected_gas_limit * 5_000_000) == transaction.fee.amount[0].amount @pytest.mark.asyncio async def test_gas_fee_for_governance_message(self): @@ -104,8 +103,8 @@ async def test_gas_fee_for_governance_message(self): expected_transaction_gas_limit = 60_000 expected_gas_limit = math.ceil(Decimal(15) * 150_000 + expected_transaction_gas_limit) - assert (expected_gas_limit == transaction.fee.gas_limit) - assert (str(expected_gas_limit * 5_000_000) == transaction.fee.amount[0].amount) + assert expected_gas_limit == transaction.fee.gas_limit + assert str(expected_gas_limit * 5_000_000) == transaction.fee.amount[0].amount @pytest.mark.asyncio async def test_gas_fee_for_exchange_message(self): @@ -126,7 +125,7 @@ async def test_gas_fee_for_exchange_message(self): price=7.523, quantity=0.01, is_buy=True, - is_po=False + is_po=False, ) transaction = Transaction() transaction.with_messages(message) @@ -135,8 +134,8 @@ async def test_gas_fee_for_exchange_message(self): expected_transaction_gas_limit = 60_000 expected_gas_limit = math.ceil(Decimal(1) * 100_000 + expected_transaction_gas_limit) - assert (expected_gas_limit == transaction.fee.gas_limit) - assert (str(expected_gas_limit * 5_000_000) == transaction.fee.amount[0].amount) + assert expected_gas_limit == transaction.fee.gas_limit + assert str(expected_gas_limit * 5_000_000) == transaction.fee.amount[0].amount @pytest.mark.asyncio async def test_gas_fee_for_msg_exec_message(self): @@ -157,12 +156,9 @@ async def test_gas_fee_for_msg_exec_message(self): price=7.523, quantity=0.01, is_buy=True, - is_po=False - ) - message = composer.MsgExec( - grantee="grantee", - msgs=[inner_message] + is_po=False, ) + message = composer.MsgExec(grantee="grantee", msgs=[inner_message]) transaction = Transaction() transaction.with_messages(message) @@ -174,8 +170,8 @@ async def test_gas_fee_for_msg_exec_message(self): expected_gas_limit = math.ceil( expected_exec_message_gas_limit + expected_inner_message_gas_limit + expected_transaction_gas_limit ) - assert (expected_gas_limit == transaction.fee.gas_limit) - assert (str(expected_gas_limit * 5_000_000) == transaction.fee.amount[0].amount) + assert expected_gas_limit == transaction.fee.gas_limit + assert str(expected_gas_limit * 5_000_000) == transaction.fee.amount[0].amount @pytest.mark.asyncio async def test_gas_fee_for_two_messages_in_one_transaction(self): @@ -196,19 +192,11 @@ async def test_gas_fee_for_two_messages_in_one_transaction(self): price=7.523, quantity=0.01, is_buy=True, - is_po=False - ) - message = composer.MsgExec( - grantee="grantee", - msgs=[inner_message] + is_po=False, ) + message = composer.MsgExec(grantee="grantee", msgs=[inner_message]) - send_message = composer.MsgSend( - from_address="address", - to_address='to_address', - amount=1, - denom='INJ' - ) + send_message = composer.MsgSend(from_address="address", to_address="to_address", amount=1, denom="INJ") transaction = Transaction() transaction.with_messages(message, send_message) @@ -225,5 +213,5 @@ async def test_gas_fee_for_two_messages_in_one_transaction(self): + expected_send_message_gas_limit + expected_transaction_gas_limit ) - assert (expected_gas_limit == transaction.fee.gas_limit) - assert (str(expected_gas_limit * 5_000_000) == transaction.fee.amount[0].amount) + assert expected_gas_limit == transaction.fee.gas_limit + assert str(expected_gas_limit * 5_000_000) == transaction.fee.amount[0].amount diff --git a/tests/core/test_token.py b/tests/core/test_token.py index 66cb6cd7..6c649f06 100644 --- a/tests/core/test_token.py +++ b/tests/core/test_token.py @@ -1,15 +1,13 @@ -import pytest from decimal import Decimal -from tests.model_fixtures.markets_fixtures import inj_token +from tests.model_fixtures.markets_fixtures import inj_token # noqa: F401 class TestToken: - def test_chain_formatted_value(self, inj_token): value = Decimal("1.3456") chain_formatted_value = inj_token.chain_formatted_value(human_readable_value=value) expected_value = value * Decimal(f"1e{inj_token.decimals}") - assert (chain_formatted_value == expected_value) + assert chain_formatted_value == expected_value diff --git a/tests/model_fixtures/markets_fixtures.py b/tests/model_fixtures/markets_fixtures.py index cca40680..15b35021 100644 --- a/tests/model_fixtures/markets_fixtures.py +++ b/tests/model_fixtures/markets_fixtures.py @@ -1,6 +1,7 @@ -import pytest from decimal import Decimal +import pytest + from pyinjective.core.market import BinaryOptionMarket, DerivativeMarket, SpotMarket from pyinjective.core.token import Token @@ -90,6 +91,7 @@ def btc_usdt_perp_market(usdt_perp_token): return market + @pytest.fixture def first_match_bet_market(usdt_token): market = BinaryOptionMarket( diff --git a/tests/rpc_fixtures/configurable_servicers.py b/tests/rpc_fixtures/configurable_servicers.py index 136491ce..8c46dd2d 100644 --- a/tests/rpc_fixtures/configurable_servicers.py +++ b/tests/rpc_fixtures/configurable_servicers.py @@ -1,17 +1,11 @@ from collections import deque -import pytest +from pyinjective.proto.exchange import injective_derivative_exchange_rpc_pb2, injective_spot_exchange_rpc_pb2 from pyinjective.proto.exchange.injective_derivative_exchange_rpc_pb2_grpc import InjectiveDerivativeExchangeRPCServicer - -from pyinjective.proto.exchange import ( - injective_spot_exchange_rpc_pb2, - injective_derivative_exchange_rpc_pb2, -) from pyinjective.proto.exchange.injective_spot_exchange_rpc_pb2_grpc import InjectiveSpotExchangeRPCServicer class ConfigurableInjectiveSpotExchangeRPCServicer(InjectiveSpotExchangeRPCServicer): - def __init__(self): super().__init__() self.markets_queue = deque() @@ -21,7 +15,6 @@ async def Markets(self, request: injective_spot_exchange_rpc_pb2.MarketsRequest, class ConfigurableInjectiveDerivativeExchangeRPCServicer(InjectiveDerivativeExchangeRPCServicer): - def __init__(self): super().__init__() self.markets_queue = deque() @@ -31,8 +24,6 @@ async def Markets(self, request: injective_derivative_exchange_rpc_pb2.MarketsRe return self.markets_queue.pop() async def BinaryOptionsMarkets( - self, - request: injective_derivative_exchange_rpc_pb2.BinaryOptionsMarketsRequest, - context=None + self, request: injective_derivative_exchange_rpc_pb2.BinaryOptionsMarketsRequest, context=None ): return self.binary_option_markets_queue.pop() diff --git a/tests/rpc_fixtures/markets_fixtures.py b/tests/rpc_fixtures/markets_fixtures.py index b6a2d3a3..534ec8d7 100644 --- a/tests/rpc_fixtures/markets_fixtures.py +++ b/tests/rpc_fixtures/markets_fixtures.py @@ -11,11 +11,12 @@ def inj_token_meta(): symbol="INJ", logo="https://static.alchemyapi.io/images/assets/7226.png", decimals=18, - updated_at=1681739137644 + updated_at=1681739137644, ) return token + @pytest.fixture def ape_token_meta(): from pyinjective.proto.exchange.injective_spot_exchange_rpc_pb2 import TokenMeta @@ -26,11 +27,12 @@ def ape_token_meta(): symbol="APE", logo="https://assets.coingecko.com/coins/images/24383/small/apecoin.jpg?1647476455", decimals=18, - updated_at=1681739137646 + updated_at=1681739137646, ) return token + @pytest.fixture def usdt_token_meta(): from pyinjective.proto.exchange.injective_spot_exchange_rpc_pb2 import TokenMeta @@ -41,11 +43,12 @@ def usdt_token_meta(): symbol="USDT", logo="https://static.alchemyapi.io/images/assets/825.png", decimals=6, - updated_at=1681739137645 + updated_at=1681739137645, ) return token + @pytest.fixture def usdt_token_meta_second_denom(): from pyinjective.proto.exchange.injective_spot_exchange_rpc_pb2 import TokenMeta @@ -56,7 +59,7 @@ def usdt_token_meta_second_denom(): symbol="USDT", logo="https://static.alchemyapi.io/images/assets/826.png", decimals=6, - updated_at=1691739137645 + updated_at=1691739137645, ) return token @@ -72,7 +75,7 @@ def usdt_perp_token_meta(): symbol="USDTPerp", logo="https://static.alchemyapi.io/images/assets/825.png", decimals=6, - updated_at=1683929869866 + updated_at=1683929869866, ) return token @@ -99,6 +102,7 @@ def ape_usdt_spot_market_meta(ape_token_meta, usdt_token_meta_second_denom): return market + @pytest.fixture def inj_usdt_spot_market_meta(inj_token_meta, usdt_token_meta): from pyinjective.proto.exchange.injective_spot_exchange_rpc_pb2 import SpotMarketInfo @@ -120,12 +124,13 @@ def inj_usdt_spot_market_meta(inj_token_meta, usdt_token_meta): return market + @pytest.fixture def btc_usdt_perp_market_meta(usdt_perp_token_meta): from pyinjective.proto.exchange.injective_derivative_exchange_rpc_pb2 import ( DerivativeMarketInfo, - PerpetualMarketInfo, PerpetualMarketFunding, + PerpetualMarketInfo, ) perpetual_market_info = PerpetualMarketInfo( @@ -164,6 +169,7 @@ def btc_usdt_perp_market_meta(usdt_perp_token_meta): return market + @pytest.fixture def first_match_bet_market_meta(inj_usdt_spot_market_meta): from pyinjective.proto.exchange.injective_derivative_exchange_rpc_pb2 import BinaryOptionsMarketInfo @@ -186,4 +192,4 @@ def first_match_bet_market_meta(inj_usdt_spot_market_meta): min_quantity_tick_size="1", ) - return market \ No newline at end of file + return market diff --git a/tests/test_async_client.py b/tests/test_async_client.py index 8cbab554..c2bc2335 100644 --- a/tests/test_async_client.py +++ b/tests/test_async_client.py @@ -1,26 +1,25 @@ import logging import pytest -from pyinjective.core.network import Network from pyinjective.async_client import AsyncClient -from pyinjective.proto.exchange import ( - injective_spot_exchange_rpc_pb2, - injective_derivative_exchange_rpc_pb2, +from pyinjective.core.network import Network +from pyinjective.proto.exchange import injective_derivative_exchange_rpc_pb2, injective_spot_exchange_rpc_pb2 +from tests.rpc_fixtures.configurable_servicers import ( + ConfigurableInjectiveDerivativeExchangeRPCServicer, + ConfigurableInjectiveSpotExchangeRPCServicer, ) -from tests.rpc_fixtures.markets_fixtures import ( - inj_token_meta, - ape_token_meta, - usdt_token_meta, - usdt_token_meta_second_denom, - usdt_perp_token_meta, - inj_usdt_spot_market_meta, - ape_usdt_spot_market_meta, - btc_usdt_perp_market_meta, +from tests.rpc_fixtures.markets_fixtures import ape_token_meta # noqa: F401 +from tests.rpc_fixtures.markets_fixtures import ape_usdt_spot_market_meta # noqa: F401 +from tests.rpc_fixtures.markets_fixtures import btc_usdt_perp_market_meta # noqa: F401 +from tests.rpc_fixtures.markets_fixtures import inj_token_meta # noqa: F401 +from tests.rpc_fixtures.markets_fixtures import inj_usdt_spot_market_meta # noqa: F401 +from tests.rpc_fixtures.markets_fixtures import usdt_perp_token_meta # noqa: F401 +from tests.rpc_fixtures.markets_fixtures import usdt_token_meta # noqa: F401 +from tests.rpc_fixtures.markets_fixtures import ( # noqa: F401; noqa: F401; noqa: F401 first_match_bet_market_meta, + usdt_token_meta_second_denom, ) -from tests.rpc_fixtures.configurable_servicers import ConfigurableInjectiveDerivativeExchangeRPCServicer, \ - ConfigurableInjectiveSpotExchangeRPCServicer @pytest.fixture @@ -34,7 +33,6 @@ def derivative_servicer(): class TestAsyncClient: - @pytest.mark.asyncio async def test_sync_timeout_height_logs_exception(self, caplog): client = AsyncClient( @@ -50,9 +48,9 @@ async def test_sync_timeout_height_logs_exception(self, caplog): (record for record in caplog.record_tuples if record[2].startswith(expected_log_message_prefix)), None, ) - assert (found_log is not None) - assert (found_log[0] == "pyinjective.async_client.AsyncClient") - assert (found_log[1] == logging.DEBUG) + assert found_log is not None + assert found_log[0] == "pyinjective.async_client.AsyncClient" + assert found_log[1] == logging.DEBUG @pytest.mark.asyncio async def test_get_account_logs_exception(self, caplog): @@ -69,30 +67,31 @@ async def test_get_account_logs_exception(self, caplog): (record for record in caplog.record_tuples if record[2].startswith(expected_log_message_prefix)), None, ) - assert (found_log is not None) - assert (found_log[0] == "pyinjective.async_client.AsyncClient") - assert (found_log[1] == logging.DEBUG) + assert found_log is not None + assert found_log[0] == "pyinjective.async_client.AsyncClient" + assert found_log[1] == logging.DEBUG @pytest.mark.asyncio async def test_initialize_tokens_and_markets( - self, - spot_servicer, - derivative_servicer, - inj_usdt_spot_market_meta, - ape_usdt_spot_market_meta, - btc_usdt_perp_market_meta, - first_match_bet_market_meta, + self, + spot_servicer, + derivative_servicer, + inj_usdt_spot_market_meta, + ape_usdt_spot_market_meta, + btc_usdt_perp_market_meta, + first_match_bet_market_meta, ): - spot_servicer.markets_queue.append(injective_spot_exchange_rpc_pb2.MarketsResponse( - markets=[inj_usdt_spot_market_meta, ape_usdt_spot_market_meta] - )) - derivative_servicer.markets_queue.append(injective_derivative_exchange_rpc_pb2.MarketsResponse( - markets=[btc_usdt_perp_market_meta] - )) + spot_servicer.markets_queue.append( + injective_spot_exchange_rpc_pb2.MarketsResponse( + markets=[inj_usdt_spot_market_meta, ape_usdt_spot_market_meta] + ) + ) + derivative_servicer.markets_queue.append( + injective_derivative_exchange_rpc_pb2.MarketsResponse(markets=[btc_usdt_perp_market_meta]) + ) derivative_servicer.binary_option_markets_queue.append( - injective_derivative_exchange_rpc_pb2.BinaryOptionsMarketsResponse( - markets=[first_match_bet_market_meta] - )) + injective_derivative_exchange_rpc_pb2.BinaryOptionsMarketsResponse(markets=[first_match_bet_market_meta]) + ) client = AsyncClient( network=Network.local(), @@ -105,26 +104,28 @@ async def test_initialize_tokens_and_markets( await client._initialize_tokens_and_markets() all_tokens = await client.all_tokens() - assert(5 == len(all_tokens)) + assert 5 == len(all_tokens) inj_symbol, usdt_symbol = inj_usdt_spot_market_meta.ticker.split("/") ape_symbol, _ = ape_usdt_spot_market_meta.ticker.split("/") alternative_usdt_name = ape_usdt_spot_market_meta.quote_token_meta.name usdt_perp_symbol = btc_usdt_perp_market_meta.quote_token_meta.symbol - assert(inj_symbol in all_tokens) - assert(usdt_symbol in all_tokens) - assert(alternative_usdt_name in all_tokens) - assert(ape_symbol in all_tokens) - assert(usdt_perp_symbol in all_tokens) + assert inj_symbol in all_tokens + assert usdt_symbol in all_tokens + assert alternative_usdt_name in all_tokens + assert ape_symbol in all_tokens + assert usdt_perp_symbol in all_tokens all_spot_markets = await client.all_spot_markets() - assert (2 == len(all_spot_markets)) - assert (any((inj_usdt_spot_market_meta.market_id == market.id for market in all_spot_markets.values()))) - assert (any((ape_usdt_spot_market_meta.market_id == market.id for market in all_spot_markets.values()))) + assert 2 == len(all_spot_markets) + assert any((inj_usdt_spot_market_meta.market_id == market.id for market in all_spot_markets.values())) + assert any((ape_usdt_spot_market_meta.market_id == market.id for market in all_spot_markets.values())) all_derivative_markets = await client.all_derivative_markets() - assert (1 == len(all_derivative_markets)) - assert (any((btc_usdt_perp_market_meta.market_id == market.id for market in all_derivative_markets.values()))) + assert 1 == len(all_derivative_markets) + assert any((btc_usdt_perp_market_meta.market_id == market.id for market in all_derivative_markets.values())) all_binary_option_markets = await client.all_binary_option_markets() - assert (1 == len(all_binary_option_markets)) - assert (any((first_match_bet_market_meta.market_id == market.id for market in all_binary_option_markets.values()))) + assert 1 == len(all_binary_option_markets) + assert any( + (first_match_bet_market_meta.market_id == market.id for market in all_binary_option_markets.values()) + ) diff --git a/tests/test_composer.py b/tests/test_composer.py index 449854ad..c36eb5c5 100644 --- a/tests/test_composer.py +++ b/tests/test_composer.py @@ -1,23 +1,21 @@ -import pytest from decimal import Decimal +import pytest + from pyinjective.composer import Composer -from pyinjective.core.network import Network from pyinjective.constant import Denom from pyinjective.core.market import BinaryOptionMarket, DerivativeMarket, SpotMarket +from pyinjective.core.network import Network from pyinjective.proto.injective.exchange.v1beta1 import exchange_pb2 -from tests.model_fixtures.markets_fixtures import ( - btc_usdt_perp_market, - first_match_bet_market, - inj_token, - inj_usdt_spot_market, - usdt_token, - usdt_perp_token -) +from tests.model_fixtures.markets_fixtures import btc_usdt_perp_market # noqa: F401 +from tests.model_fixtures.markets_fixtures import first_match_bet_market # noqa: F401 +from tests.model_fixtures.markets_fixtures import inj_token # noqa: F401 +from tests.model_fixtures.markets_fixtures import inj_usdt_spot_market # noqa: F401 +from tests.model_fixtures.markets_fixtures import usdt_perp_token # noqa: F401 +from tests.model_fixtures.markets_fixtures import usdt_token # noqa: F401 class TestComposer: - @pytest.fixture def inj_usdt_market_id(self): return "0xa508cb32923323679f29a032c70342c147c17d0145625922b0ef22e955c844c0" @@ -33,7 +31,7 @@ def basic_composer(self, inj_usdt_spot_market, btc_usdt_perp_market, first_match inj_usdt_spot_market.base_token.symbol: inj_usdt_spot_market.base_token, inj_usdt_spot_market.quote_token.symbol: inj_usdt_spot_market.quote_token, btc_usdt_perp_market.quote_token.symbol: btc_usdt_perp_market.quote_token, - } + }, ) return composer @@ -42,14 +40,21 @@ def test_composer_initialization_from_ini_files(self): composer = Composer(network=Network.devnet().string()) inj_token = composer.tokens["INJ"] - inj_usdt_spot_market = next((market for market in composer.spot_markets.values() if market.ticker == "'Devnet Spot INJ/USDT'")) - inj_usdt_perp_market = next((market for market in composer.derivative_markets.values() if market.ticker == "'Devnet Derivative INJ/USDT PERP'")) - - assert (18 == inj_token.decimals) - assert (18 == inj_usdt_spot_market.base_token.decimals) - assert (6 == inj_usdt_spot_market.quote_token.decimals) - assert (6 == inj_usdt_perp_market.quote_token.decimals) + inj_usdt_spot_market = next( + (market for market in composer.spot_markets.values() if market.ticker == "'Devnet Spot INJ/USDT'") + ) + inj_usdt_perp_market = next( + ( + market + for market in composer.derivative_markets.values() + if market.ticker == "'Devnet Derivative INJ/USDT PERP'" + ) + ) + assert 18 == inj_token.decimals + assert 18 == inj_usdt_spot_market.base_token.decimals + assert 6 == inj_usdt_spot_market.quote_token.decimals + assert 6 == inj_usdt_perp_market.quote_token.decimals def test_buy_spot_order_creation(self, basic_composer: Composer, inj_usdt_spot_market: SpotMarket): fee_recipient = "inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r" @@ -66,21 +71,25 @@ def test_buy_spot_order_creation(self, basic_composer: Composer, inj_usdt_spot_m price_decimals = inj_usdt_spot_market.quote_token.decimals - inj_usdt_spot_market.base_token.decimals chain_format_price = Decimal(str(price)) * Decimal(f"1e{price_decimals}") - expected_price = ((chain_format_price // inj_usdt_spot_market.min_price_tick_size) - * inj_usdt_spot_market.min_price_tick_size - * Decimal(f"1e18")) + expected_price = ( + (chain_format_price // inj_usdt_spot_market.min_price_tick_size) + * inj_usdt_spot_market.min_price_tick_size + * Decimal("1e18") + ) chain_format_quantity = Decimal(str(quantity)) * Decimal(f"1e{inj_usdt_spot_market.base_token.decimals}") - expected_quantity = ((chain_format_quantity // inj_usdt_spot_market.min_quantity_tick_size) - * inj_usdt_spot_market.min_quantity_tick_size - * Decimal(f"1e18")) - - assert (order.market_id == inj_usdt_spot_market.id) - assert (order.order_info.subaccount_id == "1") - assert (order.order_info.fee_recipient == fee_recipient) - assert (order.order_info.price == str(int(expected_price))) - assert (order.order_info.quantity == str(int(expected_quantity))) - assert (order.order_type == exchange_pb2.OrderType.BUY) - assert (order.trigger_price == "0") + expected_quantity = ( + (chain_format_quantity // inj_usdt_spot_market.min_quantity_tick_size) + * inj_usdt_spot_market.min_quantity_tick_size + * Decimal("1e18") + ) + + assert order.market_id == inj_usdt_spot_market.id + assert order.order_info.subaccount_id == "1" + assert order.order_info.fee_recipient == fee_recipient + assert order.order_info.price == str(int(expected_price)) + assert order.order_info.quantity == str(int(expected_quantity)) + assert order.order_type == exchange_pb2.OrderType.BUY + assert order.trigger_price == "0" def test_buy_derivative_order_creation(self, basic_composer: Composer, btc_usdt_perp_market: DerivativeMarket): fee_recipient = "inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r" @@ -99,26 +108,32 @@ def test_buy_derivative_order_creation(self, basic_composer: Composer, btc_usdt_ price_decimals = btc_usdt_perp_market.quote_token.decimals chain_format_price = Decimal(str(price)) * Decimal(f"1e{price_decimals}") - expected_price = ((chain_format_price // btc_usdt_perp_market.min_price_tick_size) - * btc_usdt_perp_market.min_price_tick_size - * Decimal(f"1e18")) + expected_price = ( + (chain_format_price // btc_usdt_perp_market.min_price_tick_size) + * btc_usdt_perp_market.min_price_tick_size + * Decimal("1e18") + ) chain_format_quantity = Decimal(str(quantity)) - expected_quantity = ((chain_format_quantity // btc_usdt_perp_market.min_quantity_tick_size) - * btc_usdt_perp_market.min_quantity_tick_size - * Decimal(f"1e18")) + expected_quantity = ( + (chain_format_quantity // btc_usdt_perp_market.min_quantity_tick_size) + * btc_usdt_perp_market.min_quantity_tick_size + * Decimal("1e18") + ) chain_format_margin = (chain_format_quantity * chain_format_price) / Decimal(leverage) - expected_margin = ((chain_format_margin // btc_usdt_perp_market.min_quantity_tick_size) - * btc_usdt_perp_market.min_quantity_tick_size - * Decimal(f"1e18")) - - assert (order.market_id == btc_usdt_perp_market.id) - assert (order.order_info.subaccount_id == "1") - assert (order.order_info.fee_recipient == fee_recipient) - assert (order.order_info.price == str(int(expected_price))) - assert (order.order_info.quantity == str(int(expected_quantity))) - assert (order.order_type == exchange_pb2.OrderType.BUY) - assert (order.margin == str(int(expected_margin))) - assert (order.trigger_price == "0") + expected_margin = ( + (chain_format_margin // btc_usdt_perp_market.min_quantity_tick_size) + * btc_usdt_perp_market.min_quantity_tick_size + * Decimal("1e18") + ) + + assert order.market_id == btc_usdt_perp_market.id + assert order.order_info.subaccount_id == "1" + assert order.order_info.fee_recipient == fee_recipient + assert order.order_info.price == str(int(expected_price)) + assert order.order_info.quantity == str(int(expected_quantity)) + assert order.order_type == exchange_pb2.OrderType.BUY + assert order.margin == str(int(expected_margin)) + assert order.trigger_price == "0" def test_increase_position_margin(self, basic_composer: Composer, btc_usdt_perp_market: DerivativeMarket): sender = "inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r" @@ -133,20 +148,20 @@ def test_increase_position_margin(self, basic_composer: Composer, btc_usdt_perp_ price_decimals = btc_usdt_perp_market.quote_token.decimals chain_format_margin = Decimal(str(amount)) * Decimal(f"1e{price_decimals}") - expected_margin = ((chain_format_margin // btc_usdt_perp_market.min_quantity_tick_size) - * btc_usdt_perp_market.min_quantity_tick_size - * Decimal(f"1e18")) + expected_margin = ( + (chain_format_margin // btc_usdt_perp_market.min_quantity_tick_size) + * btc_usdt_perp_market.min_quantity_tick_size + * Decimal("1e18") + ) - assert (message.market_id == btc_usdt_perp_market.id) - assert (message.sender == sender) - assert (message.source_subaccount_id == "1") - assert (message.destination_subaccount_id == "2") - assert (message.amount == str(int(expected_margin))) + assert message.market_id == btc_usdt_perp_market.id + assert message.sender == sender + assert message.source_subaccount_id == "1" + assert message.destination_subaccount_id == "2" + assert message.amount == str(int(expected_margin)) def test_buy_binary_option_order_creation_with_fixed_denom( - self, - basic_composer: Composer, - first_match_bet_market: BinaryOptionMarket + self, basic_composer: Composer, first_match_bet_market: BinaryOptionMarket ): fee_recipient = "inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r" price = 6.869 @@ -171,32 +186,38 @@ def test_buy_binary_option_order_creation_with_fixed_denom( price_decimals = fixed_denom.quote chain_format_price = Decimal(str(price)) * Decimal(f"1e{price_decimals}") - expected_price = ((chain_format_price // Decimal(str(fixed_denom.min_price_tick_size))) - * Decimal(str(fixed_denom.min_price_tick_size)) - * Decimal(f"1e18")) + expected_price = ( + (chain_format_price // Decimal(str(fixed_denom.min_price_tick_size))) + * Decimal(str(fixed_denom.min_price_tick_size)) + * Decimal("1e18") + ) quantity_decimals = fixed_denom.base chain_format_quantity = Decimal(str(quantity)) * Decimal(f"1e{quantity_decimals}") - expected_quantity = ((chain_format_quantity // Decimal(str(fixed_denom.min_quantity_tick_size))) - * Decimal(str(fixed_denom.min_quantity_tick_size)) - * Decimal(f"1e18")) + expected_quantity = ( + (chain_format_quantity // Decimal(str(fixed_denom.min_quantity_tick_size))) + * Decimal(str(fixed_denom.min_quantity_tick_size)) + * Decimal("1e18") + ) chain_format_margin = chain_format_quantity * chain_format_price - expected_margin = ((chain_format_margin // Decimal(str(fixed_denom.min_quantity_tick_size))) - * Decimal(str(fixed_denom.min_quantity_tick_size)) - * Decimal(f"1e18")) - - assert (order.market_id == first_match_bet_market.id) - assert (order.order_info.subaccount_id == "1") - assert (order.order_info.fee_recipient == fee_recipient) - assert (order.order_info.price == str(int(expected_price))) - assert (order.order_info.quantity == str(int(expected_quantity))) - assert (order.order_type == exchange_pb2.OrderType.BUY) - assert (order.margin == str(int(expected_margin))) - assert (order.trigger_price == "0") + expected_margin = ( + (chain_format_margin // Decimal(str(fixed_denom.min_quantity_tick_size))) + * Decimal(str(fixed_denom.min_quantity_tick_size)) + * Decimal("1e18") + ) + + assert order.market_id == first_match_bet_market.id + assert order.order_info.subaccount_id == "1" + assert order.order_info.fee_recipient == fee_recipient + assert order.order_info.price == str(int(expected_price)) + assert order.order_info.quantity == str(int(expected_quantity)) + assert order.order_type == exchange_pb2.OrderType.BUY + assert order.margin == str(int(expected_margin)) + assert order.trigger_price == "0" def test_buy_binary_option_order_creation_without_fixed_denom( - self, - basic_composer: Composer, - first_match_bet_market: BinaryOptionMarket, + self, + basic_composer: Composer, + first_match_bet_market: BinaryOptionMarket, ): fee_recipient = "inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r" price = 6.869 @@ -213,23 +234,29 @@ def test_buy_binary_option_order_creation_without_fixed_denom( price_decimals = first_match_bet_market.quote_token.decimals chain_format_price = Decimal(str(price)) * Decimal(f"1e{price_decimals}") - expected_price = ((chain_format_price // first_match_bet_market.min_price_tick_size) - * first_match_bet_market.min_price_tick_size - * Decimal(f"1e18")) + expected_price = ( + (chain_format_price // first_match_bet_market.min_price_tick_size) + * first_match_bet_market.min_price_tick_size + * Decimal("1e18") + ) chain_format_quantity = Decimal(str(quantity)) - expected_quantity = ((chain_format_quantity // first_match_bet_market.min_quantity_tick_size) - * first_match_bet_market.min_quantity_tick_size - * Decimal(f"1e18")) - chain_format_margin = (chain_format_quantity * chain_format_price) - expected_margin = ((chain_format_margin // first_match_bet_market.min_quantity_tick_size) - * first_match_bet_market.min_quantity_tick_size - * Decimal(f"1e18")) - - assert (order.market_id == first_match_bet_market.id) - assert (order.order_info.subaccount_id == "1") - assert (order.order_info.fee_recipient == fee_recipient) - assert (order.order_info.price == str(int(expected_price))) - assert (order.order_info.quantity == str(int(expected_quantity))) - assert (order.order_type == exchange_pb2.OrderType.BUY) - assert (order.margin == str(int(expected_margin))) - assert (order.trigger_price == "0") + expected_quantity = ( + (chain_format_quantity // first_match_bet_market.min_quantity_tick_size) + * first_match_bet_market.min_quantity_tick_size + * Decimal("1e18") + ) + chain_format_margin = chain_format_quantity * chain_format_price + expected_margin = ( + (chain_format_margin // first_match_bet_market.min_quantity_tick_size) + * first_match_bet_market.min_quantity_tick_size + * Decimal("1e18") + ) + + assert order.market_id == first_match_bet_market.id + assert order.order_info.subaccount_id == "1" + assert order.order_info.fee_recipient == fee_recipient + assert order.order_info.price == str(int(expected_price)) + assert order.order_info.quantity == str(int(expected_quantity)) + assert order.order_type == exchange_pb2.OrderType.BUY + assert order.margin == str(int(expected_margin)) + assert order.trigger_price == "0" diff --git a/tests/test_orderhash.py b/tests/test_orderhash.py index c5331e26..c57b6305 100644 --- a/tests/test_orderhash.py +++ b/tests/test_orderhash.py @@ -5,7 +5,6 @@ class TestOrderHashManager: - def test_spot_order_hash(self, requests_mock): network = Network.devnet() composer = Composer(network=network.string()) @@ -17,11 +16,7 @@ def test_spot_order_hash(self, requests_mock): url = network.lcd_endpoint + "/injective/exchange/v1beta1/exchange/" + subaccount_id requests_mock.get(url, json={"nonce": 0}) - order_hash_manager = OrderHashManager( - address=address, - network=network, - subaccount_indexes=[0] - ) + order_hash_manager = OrderHashManager(address=address, network=network, subaccount_indexes=[0]) spot_market_id = "0xa508cb32923323679f29a032c70342c147c17d0145625922b0ef22e955c844c0" fee_recipient = "inj1hkhdaj2a2clmq5jq6mspsggqs32vynpk228q3r" @@ -34,7 +29,7 @@ def test_spot_order_hash(self, requests_mock): price=0.524, quantity=0.01, is_buy=True, - is_po=False + is_po=False, ), composer.SpotOrder( market_id=spot_market_id, @@ -43,17 +38,15 @@ def test_spot_order_hash(self, requests_mock): price=27.92, quantity=0.01, is_buy=False, - is_po=False + is_po=False, ), ] order_hashes_response = order_hash_manager.compute_order_hashes( - spot_orders=spot_orders, - derivative_orders=[], - subaccount_index=0 + spot_orders=spot_orders, derivative_orders=[], subaccount_index=0 ) - assert (len(order_hashes_response.spot) == 2) - assert (len(order_hashes_response.derivative) == 0) - assert (order_hashes_response.spot[0] == "0x6b1e4d1fb3012735dd5e386175eb4541c024e0d8dbfeb452767b973d70ae0924") - assert (order_hashes_response.spot[1] == "0xb36146f913955d989269732d167ec554e6d0d544411d82d7f86aef18350b252b") + assert len(order_hashes_response.spot) == 2 + assert len(order_hashes_response.derivative) == 0 + assert order_hashes_response.spot[0] == "0x6b1e4d1fb3012735dd5e386175eb4541c024e0d8dbfeb452767b973d70ae0924" + assert order_hashes_response.spot[1] == "0xb36146f913955d989269732d167ec554e6d0d544411d82d7f86aef18350b252b" diff --git a/tests/test_wallet.py b/tests/test_wallet.py index 4e6132a6..a2740a97 100644 --- a/tests/test_wallet.py +++ b/tests/test_wallet.py @@ -1,21 +1,23 @@ from eth_hash.auto import keccak -from pyinjective import PrivateKey, Address +from pyinjective import Address, PrivateKey class TestPrivateKey: - def test_private_key_signature_generation(self): private_key = PrivateKey.from_mnemonic("test mnemonic never use other places") signature = private_key.sign(msg="test message".encode()) - expected_signature = b'\x8f\xae\xcb#z\x9a+\x12\x88\xea\xb5xZ"\x8f\x98y\xb8\x97\xa7F\xd5\xdd\x15s\x05;\x04\x1d\xbaY|rw\x8b\xbb\x19\xfc\x8e\x15\x8b\xf1\x18\x08\xba\xc7\x15\xed\xb0\xee\x95\x0e|Ch\x7f\xaf\x9cH\xc6\x9f\xbf\x14\xa5' + expected_signature = ( + b'\x8f\xae\xcb#z\x9a+\x12\x88\xea\xb5xZ"\x8f\x98y\xb8\x97\xa7F\xd5\xdd\x15s\x05;' + b"\x04\x1d\xbaY|rw\x8b\xbb\x19\xfc\x8e\x15\x8b\xf1\x18\x08\xba\xc7\x15\xed\xb0\xee\x95" + b"\x0e|Ch\x7f\xaf\x9cH\xc6\x9f\xbf\x14\xa5" + ) - assert (expected_signature == signature) + assert expected_signature == signature class TestPublicKey: - def test_convert_public_key_to_address(self): private_key = PrivateKey.from_mnemonic("test mnemonic never use other places") public_key = private_key.to_public_key() @@ -25,5 +27,4 @@ def test_convert_public_key_to_address(self): hashed_value = keccak(key[1:]) expected_address = Address(hashed_value[12:]) - assert (expected_address == address) - + assert expected_address == address