├── src ├── tests │ ├── libs │ │ ├── __init__.py │ │ ├── utils.py │ │ └── adaptors.py │ ├── unit_test.py │ └── stateful_test.py ├── scripts │ └── deploy_ropsten.py ├── mypy.ini ├── .gitignore ├── .gitattributes ├── brownie-config.yaml ├── contracts │ ├── RKLMarketplace.sol │ ├── extensions │ │ └── MarketplaceFeeCollector.sol │ ├── tests │ │ ├── E721.sol │ │ └── E1155.sol │ ├── NFTCommon.sol │ └── Marketplace.sol └── interfaces │ ├── IMarketplace.sol │ └── INFTContract.sol ├── static └── locker-room.png ├── pyproject.toml ├── README.md ├── LICENSE ├── .gitignore └── poetry.lock /src/tests/libs/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/scripts/deploy_ropsten.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/mypy.ini: -------------------------------------------------------------------------------- 1 | [mypy] 2 | ignore_missing_imports = True -------------------------------------------------------------------------------- /src/.gitignore: -------------------------------------------------------------------------------- 1 | __pycache__ 2 | .history 3 | .hypothesis/ 4 | build/ 5 | reports/ 6 | -------------------------------------------------------------------------------- /src/.gitattributes: -------------------------------------------------------------------------------- 1 | *.sol linguist-language=Solidity 2 | *.vy linguist-language=Python 3 | -------------------------------------------------------------------------------- /static/locker-room.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HappyMicky0317/marketplace/HEAD/static/locker-room.png -------------------------------------------------------------------------------- /src/brownie-config.yaml: -------------------------------------------------------------------------------- 1 | compiler: 2 | solc: 3 | remappings: 4 | - "@openzeppelin=OpenZeppelin/openzeppelin-contracts@4.4.2" 5 | -------------------------------------------------------------------------------- /src/contracts/RKLMarketplace.sol: -------------------------------------------------------------------------------- 1 | //SPDX-License-Identifier: MIT 2 | pragma solidity =0.8.11; 3 | 4 | import "./extensions/MarketplaceFeeCollector.sol"; 5 | 6 | abstract contract RKLMarketplace is MarketplaceFeeCollector {} 7 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "marketplace" 3 | version = "0.1.1" 4 | description = "ERC721 and ERC1155 smart contract marketplace" 5 | authors = ["Rumble League Studios "] 6 | license = "MIT" 7 | 8 | [tool.poetry.dependencies] 9 | python = ">=3.7.2,<3.10" 10 | 11 | [tool.poetry.dev-dependencies] 12 | black = "21.11b1" 13 | eth-brownie = "1.17.2" 14 | pytest = "6.2.5" 15 | mypy = "0.931" 16 | 17 | [build-system] 18 | requires = ["poetry-core>=1.0.0"] 19 | build-backend = "poetry.core.masonry.api" 20 | -------------------------------------------------------------------------------- /src/tests/libs/utils.py: -------------------------------------------------------------------------------- 1 | def pr_red(skk): 2 | print("\033[91m {}\033[00m".format(skk)) 3 | 4 | 5 | def pr_green(skk): 6 | print("\033[92m {}\033[00m".format(skk)) 7 | 8 | 9 | def pr_yellow(skk): 10 | print("\033[93m {}\033[00m".format(skk)) 11 | 12 | 13 | def pr_light_purple(skk): 14 | print("\033[94m {}\033[00m".format(skk)) 15 | 16 | 17 | def pr_purple(skk): 18 | print("\033[95m {}\033[00m".format(skk)) 19 | 20 | 21 | def pr_cyan(skk): 22 | print("\033[96m {}\033[00m".format(skk)) 23 | 24 | 25 | def pr_light_gray(skk): 26 | print("\033[97m {}\033[00m".format(skk)) 27 | 28 | 29 | def pr_black(skk): 30 | print("\033[98m {}\033[00m".format(skk)) 31 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # NFT Marketplace 2 | 3 | ![locker-room](static/locker-room.png) 4 | 5 | Contracts herein define a minimal general trustless marketplace for any ERC-721 or ERC-1155 implementation. They support: 6 | 7 | - batch trading 8 | - royalties 9 | - withdraw pattern to avoid re-entrancy issues 10 | - events for optimal subgraph indexing 11 | 12 | They are well-tested, a combination of stateful and unit tests was used. 13 | 14 | You can use poetry for easy python virtual environment and requirements handling. 15 | 16 | ## Dev 17 | 18 | You will need to initialise poetry with the root config. 19 | 20 | To run tests 21 | 22 | `brownie test -s` 23 | 24 | This will give you unsupressed output for each example ran in stateful tests. 25 | 26 | LFG 👑🦍 27 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Rumble Kong League 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /src/contracts/extensions/MarketplaceFeeCollector.sol: -------------------------------------------------------------------------------- 1 | //SPDX-License-Identifier: MIT 2 | pragma solidity =0.8.11; 3 | 4 | import "@openzeppelin/contracts/utils/Address.sol"; 5 | import "../Marketplace.sol"; 6 | 7 | // * discounts require proxy forwarding, but a problem with that is that 8 | // * the contract checks the balances of the caller (i.e. proxy) instead 9 | // * of the initializer. First version, plain same fee for everyone. 10 | 11 | abstract contract MarketplaceFeeCollector is Marketplace { 12 | using Address for address payable; 13 | // 0.5% in basis points 14 | uint256 public fee = 500; 15 | uint256 public constant HUNDRED_PERCENT = 10_000; 16 | 17 | /// @dev Hook that is called before any token transfer. 18 | function _beforeTokenTransferTakeFee(uint256 totalPrice) 19 | internal 20 | returns (uint256) 21 | { 22 | uint256 cut = (totalPrice * fee) / HUNDRED_PERCENT; 23 | require(cut < totalPrice, ""); 24 | beneficiary.sendValue(cut); 25 | uint256 left = totalPrice - cut; 26 | return left; 27 | } 28 | 29 | function changeFee(uint256 newFee) external { 30 | require(msg.sender == admin, ""); 31 | require(newFee < HUNDRED_PERCENT, ""); 32 | fee = newFee; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/tests/libs/adaptors.py: -------------------------------------------------------------------------------- 1 | from dataclasses import dataclass 2 | from brownie.network.account import Account 3 | import json 4 | 5 | 6 | @dataclass(frozen=True) 7 | class NFT: 8 | address: Account 9 | token_id: int 10 | 11 | def __repr__(self) -> str: 12 | s = json.dumps( 13 | {"address": self.address.address.lower(), "tokenID": self.token_id} 14 | ) 15 | return f"NFT({s})" 16 | 17 | 18 | @dataclass(frozen=True) 19 | class Ask: 20 | exists: bool 21 | nft: NFT 22 | seller: Account 23 | price: int 24 | to: Account 25 | 26 | def __repr__(self) -> str: 27 | s = json.dumps( 28 | { 29 | "exists": self.exists, 30 | "nft": str(self.nft), 31 | "seller": self.seller.address.lower(), 32 | "price": self.price, 33 | "to": self.to.address.lower(), 34 | }, 35 | indent=2, 36 | ) 37 | return f"Ask(\n{s}\n)" 38 | 39 | 40 | @dataclass(frozen=True) 41 | class Bid: 42 | exists: bool 43 | nft: NFT 44 | buyer: Account 45 | price: int 46 | 47 | def __repr__(self) -> str: 48 | s = json.dumps( 49 | { 50 | "exists": self.exists, 51 | "nft": str(self.nft), 52 | "buyer": self.buyer.address.lower(), 53 | "price": self.price, 54 | }, 55 | indent=2, 56 | ) 57 | return f"Bid(\n{s}\n)" 58 | -------------------------------------------------------------------------------- /src/contracts/tests/E721.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity =0.8.11; 3 | 4 | import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol"; 5 | import "@openzeppelin/contracts/access/Ownable.sol"; 6 | 7 | contract E721 is Ownable, ERC721Enumerable { 8 | uint256 private counter = 0; 9 | 10 | constructor() ERC721("E721", "E721") {} 11 | 12 | function faucet() public { 13 | counter++; 14 | _mint(msg.sender, counter); 15 | } 16 | } 17 | 18 | /* 19 | * 88888888ba 88 a8P 88 20 | * 88 "8b 88 ,88' 88 21 | * 88 ,8P 88 ,88" 88 22 | * 88aaaaaa8P' 88,d88' 88 23 | * 88""""88' 8888"88, 88 24 | * 88 `8b 88P Y8b 88 25 | * 88 `8b 88 "88, 88 26 | * 88 `8b 88 Y8b 88888888888 27 | * 28 | * Marketplace: Marketplace.sol 29 | * 30 | * MIT License 31 | * =========== 32 | * 33 | * Copyright (c) 2022 Marketplace 34 | * 35 | * Permission is hereby granted, free of charge, to any person obtaining a copy 36 | * of this software and associated documentation files (the "Software"), to deal 37 | * in the Software without restriction, including without limitation the rights 38 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 39 | * copies of the Software, and to permit persons to whom the Software is 40 | * furnished to do so, subject to the following conditions: 41 | * 42 | * The above copyright notice and this permission notice shall be included in all 43 | * copies or substantial portions of the Software. 44 | * 45 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 46 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 47 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 48 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 49 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 50 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 51 | */ 52 | -------------------------------------------------------------------------------- /src/contracts/tests/E1155.sol: -------------------------------------------------------------------------------- 1 | // SPDX-License-Identifier: MIT 2 | pragma solidity =0.8.11; 3 | 4 | import "@openzeppelin/contracts/token/ERC1155/ERC1155.sol"; 5 | 6 | contract E1155 is ERC1155 { 7 | uint256 private tokenId; 8 | 9 | constructor() ERC1155("lfg://rumble.kongs/{id}.json") {} 10 | 11 | function faucet() external { 12 | tokenId++; 13 | _mint(msg.sender, tokenId, 10, ""); 14 | } 15 | 16 | function totalSupply() external view returns (uint256) { 17 | return tokenId; 18 | } 19 | } 20 | 21 | /* 22 | * 88888888ba 88 a8P 88 23 | * 88 "8b 88 ,88' 88 24 | * 88 ,8P 88 ,88" 88 25 | * 88aaaaaa8P' 88,d88' 88 26 | * 88""""88' 8888"88, 88 27 | * 88 `8b 88P Y8b 88 28 | * 88 `8b 88 "88, 88 29 | * 88 `8b 88 Y8b 88888888888 30 | * 31 | * Marketplace: Marketplace.sol 32 | * 33 | * MIT License 34 | * =========== 35 | * 36 | * Copyright (c) 2022 Rumble League Studios Inc. 37 | * 38 | * Permission is hereby granted, free of charge, to any person obtaining a copy 39 | * of this software and associated documentation files (the "Software"), to deal 40 | * in the Software without restriction, including without limitation the rights 41 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 42 | * copies of the Software, and to permit persons to whom the Software is 43 | * furnished to do so, subject to the following conditions: 44 | * 45 | * The above copyright notice and this permission notice shall be included in all 46 | * copies or substantial portions of the Software. 47 | * 48 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 49 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 50 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 51 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 52 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 53 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 54 | */ 55 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | 131 | .vscode/ -------------------------------------------------------------------------------- /src/interfaces/IMarketplace.sol: -------------------------------------------------------------------------------- 1 | //SPDX-License-Identifier: MIT 2 | pragma solidity =0.8.11; 3 | 4 | import "./INFTContract.sol"; 5 | 6 | interface IMarketplace { 7 | 8 | event CreateAsk( 9 | address indexed nft, 10 | uint256 indexed tokenID, 11 | uint256 price, 12 | address indexed to 13 | ); 14 | event CancelAsk(address indexed nft, uint256 indexed tokenID); 15 | event AcceptAsk( 16 | address indexed nft, 17 | uint256 indexed tokenID, 18 | uint256 price, 19 | address indexed to 20 | ); 21 | 22 | event CreateBid( 23 | address indexed nft, 24 | uint256 indexed tokenID, 25 | uint256 price 26 | ); 27 | event CancelBid(address indexed nft, uint256 indexed tokenID); 28 | event AcceptBid( 29 | address indexed nft, 30 | uint256 indexed tokenID, 31 | uint256 price 32 | ); 33 | 34 | struct Ask { 35 | bool exists; 36 | address seller; 37 | uint256 price; 38 | address to; 39 | } 40 | 41 | struct Bid { 42 | bool exists; 43 | address buyer; 44 | uint256 price; 45 | } 46 | 47 | function createAsk( 48 | INFTContract[] calldata nft, 49 | uint256[] calldata tokenID, 50 | uint256[] calldata price, 51 | address[] calldata to 52 | ) external; 53 | 54 | function createBid( 55 | INFTContract[] calldata nft, 56 | uint256[] calldata tokenID, 57 | uint256[] calldata price 58 | ) external payable; 59 | 60 | function cancelAsk(INFTContract[] calldata nft, uint256[] calldata tokenID) 61 | external; 62 | 63 | function cancelBid(INFTContract[] calldata nft, uint256[] calldata tokenID) 64 | external; 65 | 66 | function acceptAsk(INFTContract[] calldata nft, uint256[] calldata tokenID) 67 | external 68 | payable; 69 | 70 | function acceptBid(INFTContract[] calldata nft, uint256[] calldata tokenID) 71 | external; 72 | 73 | function withdraw() external; 74 | } 75 | 76 | /* 77 | * 88888888ba 88 a8P 88 78 | * 88 "8b 88 ,88' 88 79 | * 88 ,8P 88 ,88" 88 80 | * 88aaaaaa8P' 88,d88' 88 81 | * 88""""88' 8888"88, 88 82 | * 88 `8b 88P Y8b 88 83 | * 88 `8b 88 "88, 88 84 | * 88 `8b 88 Y8b 88888888888 85 | * 86 | * Marketplace: interfaces/IMarketplace.sol 87 | * 88 | * MIT License 89 | * =========== 90 | * 91 | * Copyright (c) 2022 Rumble League Studios Inc. 92 | * 93 | * Permission is hereby granted, free of charge, to any person obtaining a copy 94 | * of this software and associated documentation files (the "Software"), to deal 95 | * in the Software without restriction, including without limitation the rights 96 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 97 | * copies of the Software, and to permit persons to whom the Software is 98 | * furnished to do so, subject to the following conditions: 99 | * 100 | * The above copyright notice and this permission notice shall be included in all 101 | * copies or substantial portions of the Software. 102 | * 103 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 104 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 105 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 106 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 107 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 108 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 109 | */ 110 | -------------------------------------------------------------------------------- /src/contracts/NFTCommon.sol: -------------------------------------------------------------------------------- 1 | //SPDX-License-Identifier: MIT 2 | pragma solidity =0.8.11; 3 | 4 | import "../interfaces/INFTContract.sol"; 5 | 6 | // helps with sending the NFTs, will be particularly useful for batch operations 7 | library NFTCommon { 8 | /** 9 | @notice Transfers the NFT tokenID from to. 10 | @dev safuTransferFrom name to avoid collision with the interface signature definitions. The reason it is implemented the way it is, 11 | is because some NFT contracts implement both the 721 and 1155 standard at the same time. Sometimes, 721 or 1155 function does not work. 12 | So instead of relying on the user's input, or asking the contract what interface it implements, it is best to just make a good assumption 13 | about what NFT type it is (here we guess it is 721 first), and if that fails, we use the 1155 function to tranfer the NFT. 14 | @param nft NFT address 15 | @param from Source address 16 | @param to Target address 17 | @param tokenID ID of the token type 18 | @param data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to` 19 | */ 20 | function safeTransferFrom_( 21 | INFTContract nft, 22 | address from, 23 | address to, 24 | uint256 tokenID, 25 | bytes memory data 26 | ) internal returns (bool) { 27 | // most are 721s, so we assume that that is what the NFT type is 28 | try nft.safeTransferFrom(from, to, tokenID, data) { 29 | return true; 30 | // on fail, use 1155s format 31 | } catch (bytes memory) { 32 | try nft.safeTransferFrom(from, to, tokenID, 1, data) { 33 | return true; 34 | } catch (bytes memory) { 35 | return false; 36 | } 37 | } 38 | } 39 | 40 | /** 41 | @notice Determines if potentialOwner is in fact an owner of at least 1 qty of NFT token ID. 42 | @param nft NFT address 43 | @param potentialOwner suspected owner of the NFT token ID 44 | @param tokenID id of the token 45 | @return quantity of held token, possibly zero 46 | */ 47 | function quantityOf( 48 | INFTContract nft, 49 | address potentialOwner, 50 | uint256 tokenID 51 | ) internal view returns (uint256) { 52 | try nft.ownerOf(tokenID) returns (address owner) { 53 | if (owner == potentialOwner) { 54 | return 1; 55 | } else { 56 | return 0; 57 | } 58 | } catch (bytes memory) { 59 | try nft.balanceOf(potentialOwner, tokenID) returns ( 60 | uint256 amount 61 | ) { 62 | return amount; 63 | } catch (bytes memory) { 64 | return 0; 65 | } 66 | } 67 | } 68 | } 69 | 70 | /* 71 | * 88888888ba 88 a8P 88 72 | * 88 "8b 88 ,88' 88 73 | * 88 ,8P 88 ,88" 88 74 | * 88aaaaaa8P' 88,d88' 88 75 | * 88""""88' 8888"88, 88 76 | * 88 `8b 88P Y8b 88 77 | * 88 `8b 88 "88, 88 78 | * 88 `8b 88 Y8b 88888888888 79 | * 80 | * Marketplace: Marketplace.sol 81 | * 82 | * MIT License 83 | * =========== 84 | * 85 | * Copyright (c) 2022 Marketplace 86 | * 87 | * Permission is hereby granted, free of charge, to any person obtaining a copy 88 | * of this software and associated documentation files (the "Software"), to deal 89 | * in the Software without restriction, including without limitation the rights 90 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 91 | * copies of the Software, and to permit persons to whom the Software is 92 | * furnished to do so, subject to the following conditions: 93 | * 94 | * The above copyright notice and this permission notice shall be included in all 95 | * copies or substantial portions of the Software. 96 | * 97 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 98 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 99 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 100 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 101 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 102 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 103 | */ 104 | -------------------------------------------------------------------------------- /src/tests/unit_test.py: -------------------------------------------------------------------------------- 1 | # pylint: disable=redefined-outer-name,invalid-name,no-name-in-module,unused-argument,too-few-public-methods,too-many-arguments 2 | # type: ignore 3 | from dataclasses import dataclass 4 | from decimal import Decimal 5 | from typing import List, Tuple 6 | from brownie.network.account import Account 7 | from decimal import Decimal 8 | 9 | import json 10 | import pytest 11 | import brownie 12 | from brownie import ZERO_ADDRESS, accounts, Marketplace, E721, E1155 13 | from brownie.test import strategy 14 | 15 | ANYONE_CAN_BUY = ZERO_ADDRESS 16 | 17 | 18 | # reset state before each test 19 | @pytest.fixture(autouse=True) 20 | def shared_setup(fn_isolation): 21 | pass 22 | 23 | 24 | class Accounts: 25 | def __init__(self, accounts): 26 | self.admin = accounts[0] 27 | self.bidder = accounts[1] 28 | self.asker = accounts[2] 29 | 30 | 31 | @dataclass(frozen=True) 32 | class NFTParams: 33 | token_id: int = 1 34 | price: str = "1 ether" 35 | qty_1155: int = 10 36 | 37 | 38 | @dataclass(frozen=True) 39 | class Setup: 40 | marketplace: Marketplace 41 | e721: E721 42 | e1155: E1155 43 | 44 | 45 | @pytest.fixture(scope="module") 46 | def A(): 47 | A = Accounts(accounts) 48 | return A 49 | 50 | 51 | @pytest.fixture(scope="module") 52 | def setup(A, Marketplace, E721, E1155): 53 | marketplace = Marketplace.deploy(A.admin, {"from": A.admin}) 54 | 55 | e721 = E721.deploy({"from": A.admin}) 56 | e1155 = E1155.deploy({"from": A.admin}) 57 | 58 | return Setup(marketplace, e721, e1155) 59 | 60 | 61 | def test_accept_bid_721(setup, A): 62 | setup.e721.faucet({"from": A.asker}) 63 | 64 | assert setup.e721.ownerOf(NFTParams.token_id) == A.asker 65 | assert setup.marketplace.escrow(A.asker) == 0 66 | 67 | setup.marketplace.createBid( 68 | [setup.e721], 69 | [NFTParams.token_id], 70 | [NFTParams.price], 71 | {"from": A.bidder, "value": NFTParams.price}, 72 | ) 73 | setup.e721.setApprovalForAll(setup.marketplace, True, {"from": A.asker}) 74 | setup.marketplace.acceptBid([setup.e721], [NFTParams.token_id], {"from": A.asker}) 75 | 76 | assert setup.e721.ownerOf(NFTParams.token_id) == A.bidder 77 | assert setup.marketplace.escrow(A.asker) == NFTParams.price 78 | 79 | 80 | def test_accept_bid_1155(setup, A): 81 | setup.e1155.faucet({"from": A.asker}) 82 | 83 | assert setup.e1155.balanceOf(A.asker, NFTParams.token_id) == 10 84 | assert setup.marketplace.escrow(A.asker) == 0 85 | 86 | setup.marketplace.createBid( 87 | [setup.e1155], 88 | [NFTParams.token_id], 89 | [NFTParams.price], 90 | {"from": A.bidder, "value": NFTParams.price}, 91 | ) 92 | setup.e1155.setApprovalForAll(setup.marketplace, True, {"from": A.asker}) 93 | setup.marketplace.acceptBid([setup.e1155], [NFTParams.token_id], {"from": A.asker}) 94 | 95 | assert setup.e1155.balanceOf(A.asker, NFTParams.token_id) == 9 96 | assert setup.e1155.balanceOf(A.bidder, NFTParams.token_id) == 1 97 | assert setup.marketplace.escrow(A.asker) == NFTParams.price 98 | 99 | 100 | def test_accept_ask_721(setup, A): 101 | setup.e721.faucet({"from": A.asker}) 102 | 103 | assert setup.e721.ownerOf(NFTParams.token_id) == A.asker 104 | assert setup.marketplace.escrow(A.asker) == 0 105 | 106 | setup.marketplace.createAsk( 107 | [setup.e721], 108 | [NFTParams.token_id], 109 | [NFTParams.price], 110 | [ANYONE_CAN_BUY], 111 | {"from": A.asker}, 112 | ) 113 | setup.e721.setApprovalForAll(setup.marketplace, True, {"from": A.asker}) 114 | setup.marketplace.acceptAsk( 115 | [setup.e721], [NFTParams.token_id], {"from": A.bidder, "value": NFTParams.price} 116 | ) 117 | 118 | assert setup.e721.ownerOf(NFTParams.token_id) == A.bidder 119 | assert setup.marketplace.escrow(A.asker) == NFTParams.price 120 | 121 | 122 | def test_accept_ask_1155(setup, A): 123 | setup.e1155.faucet({"from": A.asker}) 124 | 125 | assert setup.e1155.balanceOf(A.asker, NFTParams.token_id) == NFTParams.qty_1155 126 | assert setup.marketplace.escrow(A.asker) == 0 127 | 128 | setup.marketplace.createAsk( 129 | [setup.e1155], 130 | [NFTParams.token_id], 131 | [NFTParams.price], 132 | [ANYONE_CAN_BUY], 133 | {"from": A.asker}, 134 | ) 135 | setup.e1155.setApprovalForAll(setup.marketplace, True, {"from": A.asker}) 136 | setup.marketplace.acceptAsk( 137 | [setup.e1155], 138 | [NFTParams.token_id], 139 | {"from": A.bidder, "value": NFTParams.price}, 140 | ) 141 | 142 | assert setup.e1155.balanceOf(A.asker, NFTParams.token_id) == 9 143 | assert setup.e1155.balanceOf(A.bidder, NFTParams.token_id) == 1 144 | assert setup.marketplace.escrow(A.asker) == NFTParams.price 145 | -------------------------------------------------------------------------------- /src/interfaces/INFTContract.sol: -------------------------------------------------------------------------------- 1 | //SPDX-License-Identifier: MIT 2 | pragma solidity =0.8.11; 3 | 4 | interface INFTContract { 5 | // --------------- ERC1155 ----------------------------------------------------- 6 | 7 | /// @notice Get the balance of an account's tokens. 8 | /// @param _owner The address of the token holder 9 | /// @param _id ID of the token 10 | /// @return The _owner's balance of the token type requested 11 | function balanceOf(address _owner, uint256 _id) 12 | external 13 | view 14 | returns (uint256); 15 | 16 | /// @notice Enable or disable approval for a third party ("operator") to manage all of the caller's tokens. 17 | /// @dev MUST emit the ApprovalForAll event on success. 18 | /// @param _operator Address to add to the set of authorized operators 19 | /// @param _approved True if the operator is approved, false to revoke approval 20 | function setApprovalForAll(address _operator, bool _approved) external; 21 | 22 | /// @notice Transfers `_value` amount of an `_id` from the `_from` address to the `_to` address specified (with safety call). 23 | /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). 24 | /// MUST revert if `_to` is the zero address. 25 | /// MUST revert if balance of holder for token `_id` is lower than the `_value` sent. 26 | /// MUST revert on any other error. 27 | /// MUST emit the `TransferSingle` event to reflect the balance change (see "Safe Transfer Rules" section of the standard). 28 | /// After the above conditions are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call `onERC1155Received` on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). 29 | /// @param _from Source address 30 | /// @param _to Target address 31 | /// @param _id ID of the token type 32 | /// @param _value Transfer amount 33 | /// @param _data Additional data with no specified format, MUST be sent unaltered in call to `onERC1155Received` on `_to` 34 | function safeTransferFrom( 35 | address _from, 36 | address _to, 37 | uint256 _id, 38 | uint256 _value, 39 | bytes calldata _data 40 | ) external; 41 | 42 | /// @notice Transfers `_values` amount(s) of `_ids` from the `_from` address to the `_to` address specified (with safety call). 43 | /// @dev Caller must be approved to manage the tokens being transferred out of the `_from` account (see "Approval" section of the standard). 44 | /// MUST revert if `_to` is the zero address. 45 | /// MUST revert if length of `_ids` is not the same as length of `_values`. 46 | /// MUST revert if any of the balance(s) of the holder(s) for token(s) in `_ids` is lower than the respective amount(s) in `_values` sent to the recipient. 47 | /// MUST revert on any other error. 48 | /// MUST emit `TransferSingle` or `TransferBatch` event(s) such that all the balance changes are reflected (see "Safe Transfer Rules" section of the standard). 49 | /// Balance changes and events MUST follow the ordering of the arrays (_ids[0]/_values[0] before _ids[1]/_values[1], etc). 50 | /// After the above conditions for the transfer(s) in the batch are met, this function MUST check if `_to` is a smart contract (e.g. code size > 0). If so, it MUST call the relevant `ERC1155TokenReceiver` hook(s) on `_to` and act appropriately (see "Safe Transfer Rules" section of the standard). 51 | /// @param _from Source address 52 | /// @param _to Target address 53 | /// @param _ids IDs of each token type (order and length must match _values array) 54 | /// @param _values Transfer amounts per token type (order and length must match _ids array) 55 | /// @param _data Additional data with no specified format, MUST be sent unaltered in call to the `ERC1155TokenReceiver` hook(s) on `_to` 56 | function safeBatchTransferFrom( 57 | address _from, 58 | address _to, 59 | uint256[] calldata _ids, 60 | uint256[] calldata _values, 61 | bytes calldata _data 62 | ) external; 63 | 64 | // ---------------------- ERC721 ------------------------------------------------ 65 | 66 | /// @notice Find the owner of an NFT 67 | /// @dev NFTs assigned to zero address are considered invalid, and queries 68 | /// about them do throw. 69 | /// @param tokenId The identifier for an NFT 70 | /// @return owner The address of the owner of the NFT 71 | function ownerOf(uint256 tokenId) external view returns (address owner); 72 | 73 | // function setApprovalForAll(address _operator, bool _approved) external; 74 | 75 | /// @notice Change or reaffirm the approved address for an NFT 76 | /// @dev The zero address indicates there is no approved address. 77 | /// Throws unless `msg.sender` is the current NFT owner, or an authorized 78 | /// operator of the current owner. 79 | /// @param _approved The new approved NFT controller 80 | /// @param _tokenId The NFT to approve 81 | function approve(address _approved, uint256 _tokenId) external payable; 82 | 83 | /// @notice Transfers the ownership of an NFT from one address to another address 84 | /// @dev Throws unless `msg.sender` is the current owner, an authorized 85 | /// operator, or the approved address for this NFT. Throws if `_from` is 86 | /// not the current owner. Throws if `_to` is the zero address. Throws if 87 | /// `_tokenId` is not a valid NFT. When transfer is complete, this function 88 | /// checks if `_to` is a smart contract (code size > 0). If so, it calls 89 | /// `onERC721Received` on `_to` and throws if the return value is not 90 | /// `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`. 91 | /// @param _from The current owner of the NFT 92 | /// @param _to The new owner 93 | /// @param _tokenId The NFT to transfer 94 | /// @param data Additional data with no specified format, sent in call to `_to` 95 | function safeTransferFrom( 96 | address _from, 97 | address _to, 98 | uint256 _tokenId, 99 | bytes calldata data 100 | ) external payable; 101 | 102 | /// @notice Transfers the ownership of an NFT from one address to another address 103 | /// @dev This works identically to the other function with an extra data parameter, 104 | /// except this function just sets data to "". 105 | /// @param _from The current owner of the NFT 106 | /// @param _to The new owner 107 | /// @param _tokenId The NFT to transfer 108 | function safeTransferFrom( 109 | address _from, 110 | address _to, 111 | uint256 _tokenId 112 | ) external payable; 113 | } 114 | 115 | /* 116 | * 88888888ba 88 a8P 88 117 | * 88 "8b 88 ,88' 88 118 | * 88 ,8P 88 ,88" 88 119 | * 88aaaaaa8P' 88,d88' 88 120 | * 88""""88' 8888"88, 88 121 | * 88 `8b 88P Y8b 88 122 | * 88 `8b 88 "88, 88 123 | * 88 `8b 88 Y8b 88888888888 124 | * 125 | * Marketplace: interfaces/INFTContract.sol 126 | * 127 | * MIT License 128 | * =========== 129 | * 130 | * Copyright (c) 2022 Marketplace 131 | * 132 | * Permission is hereby granted, free of charge, to any person obtaining a copy 133 | * of this software and associated documentation files (the "Software"), to deal 134 | * in the Software without restriction, including without limitation the rights 135 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 136 | * copies of the Software, and to permit persons to whom the Software is 137 | * furnished to do so, subject to the following conditions: 138 | * 139 | * The above copyright notice and this permission notice shall be included in all 140 | * copies or substantial portions of the Software. 141 | * 142 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 143 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 144 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 145 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 146 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 147 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 148 | */ 149 | -------------------------------------------------------------------------------- /src/tests/stateful_test.py: -------------------------------------------------------------------------------- 1 | import pytest 2 | from brownie.network.account import Account # type: ignore 3 | from brownie.test import strategy # type: ignore 4 | from brownie import accounts, Marketplace, E721, E1155, ZERO_ADDRESS, reverts # type: ignore 5 | 6 | # from hypothesis.stateful import precondition 7 | from typing import DefaultDict, Dict, List, Tuple, Optional, TypeVar, Set, Union 8 | from collections import defaultdict 9 | from random import randint 10 | 11 | from libs.utils import * 12 | from libs.adaptors import NFT, Ask, Bid 13 | 14 | T = TypeVar("T") 15 | K = TypeVar("K") 16 | V = TypeVar("V") 17 | 18 | TO_ANYONE = ZERO_ADDRESS 19 | 20 | 21 | class Accounts: 22 | def __init__(self, accounts): 23 | self.admin = accounts[0] 24 | 25 | self.bidders = [accounts[1], accounts[2]] 26 | self.askers = [accounts[3], accounts[4]] 27 | 28 | 29 | @pytest.fixture(autouse=True) 30 | def shared_setup(fn_isolation): 31 | pass 32 | 33 | 34 | @pytest.fixture(scope="module") 35 | def A(): 36 | a = Accounts(accounts) 37 | return a 38 | 39 | 40 | TokenID = WithdrawableBalance = int 41 | 42 | 43 | class StateMachine: 44 | 45 | # price needs to at least be 10_000 46 | st_price = strategy("uint256", min_value="10001", max_value="1 ether") 47 | 48 | def __init__(cls, A, marketplace, e7, e1): 49 | cls.accounts = A 50 | cls.marketplace = marketplace 51 | 52 | cls.e7 = e7 53 | cls.e1 = e1 54 | 55 | def setup(self): 56 | # state sits here. This gets ran once 57 | 58 | self.bids: DefaultDict[Account, Set[Bid]] = defaultdict(set) 59 | self.asks: DefaultDict[Account, Set[Ask]] = defaultdict(set) 60 | 61 | self.holdership: DefaultDict[Account, Set[NFT]] = defaultdict(set) 62 | self.escrow: DefaultDict[Account, WithdrawableBalance] = defaultdict(int) 63 | 64 | def initialize(self): 65 | # initialize gets ran before each example 66 | 67 | # mint tradeable NFTs for askers 68 | for asker in self.accounts.askers: 69 | e = self.e7.faucet({"from": asker}) 70 | ee = self.e1.faucet({"from": asker}) 71 | 72 | token_id_e7 = self.pluck_token_id(e.events) 73 | token_id_e1 = self.pluck_token_id(ee.events) 74 | 75 | _asker = Account(asker) 76 | self.holdership[_asker].add(NFT(Account(self.e7.address), token_id_e7)) 77 | self.holdership[_asker].add(NFT(Account(self.e1.address), token_id_e1)) 78 | 79 | def invariant(self): 80 | # invariants run after each rule 81 | contract_bids = self.contract_bids() 82 | contract_asks = self.contract_asks() 83 | 84 | state_bids = self.flatten_dict(self.bids) 85 | state_asks = self.flatten_dict(self.asks) 86 | 87 | assert state_bids == contract_bids 88 | assert state_asks == contract_asks 89 | 90 | pr_purple("invariant checked") 91 | 92 | def rule_ask(self, price="st_price"): 93 | asker, nft = self.find_asker() 94 | 95 | ask = Ask(True, nft, asker, price, Account(TO_ANYONE)) 96 | self.marketplace.createAsk( 97 | [ask.nft.address], 98 | [ask.nft.token_id], 99 | [ask.price], 100 | [ask.to], 101 | {"from": ask.seller}, 102 | ) 103 | self.add_ask(ask) 104 | 105 | pr_yellow(f"{ask}") 106 | 107 | # todo: when precondition works with brownie, remove the if condition 108 | # @precondition(lambda _: True == True) 109 | def rule_cancel_ask(self, st_price): 110 | if self.get_ask() is None: 111 | self.rule_ask(st_price) 112 | 113 | ask = self.get_ask() 114 | self.marketplace.cancelAsk( 115 | [ask.nft.address], [ask.nft.token_id], {"from": ask.seller} 116 | ) 117 | self.remove_ask(ask) 118 | 119 | pr_yellow( 120 | f"cancelled ask. token_id={ask.nft.token_id},addr={ask.nft.address.address.lower()}" 121 | ) 122 | 123 | # @precondition(lambda _: True == True) 124 | def rule_accept_ask(self): 125 | pr_yellow("accepted ask") 126 | 127 | def rule_bid(self, price="st_price"): 128 | bidder, nft = self.find_bidder() 129 | 130 | bid = Bid(True, nft, bidder, price) 131 | existing_bid = self.find_existing_bid(nft) 132 | bid_args = [ 133 | [bid.nft.address], 134 | [bid.nft.token_id], 135 | [bid.price], 136 | {"from": bid.buyer, "value": bid.price}, 137 | ] 138 | 139 | if existing_bid is None: 140 | self.marketplace.createBid(*bid_args) 141 | self.add_bid(bid) 142 | pr_light_purple(f"{bid}") 143 | else: 144 | if existing_bid.price > bid.price: 145 | with reverts(self.marketplace.REVERT_BID_TOO_LOW()): 146 | self.marketplace.createBid(*bid_args) 147 | 148 | # @precondition(lambda _: True == True) 149 | def rule_cancel_bid(self, st_price): 150 | if self.get_bid() is None: 151 | self.rule_bid(st_price) 152 | 153 | bid = self.get_bid() 154 | self.marketplace.cancelBid( 155 | [bid.nft.address], [bid.nft.token_id], {"from": bid.buyer} 156 | ) 157 | self.remove_bid(bid) 158 | 159 | pr_light_purple( 160 | f"cancelled bid. token_id={bid.nft.token_id},addr={bid.nft.address.address.lower()}" 161 | ) 162 | 163 | # @precondition(lambda _: True == True) 164 | def rule_accept_bid(self): 165 | pr_light_purple("accepted bid") 166 | 167 | # @precondition(lambda _: True == True) 168 | def rule_transfer_has_ask(self): 169 | pr_cyan("transferred") 170 | 171 | # @precondition(lambda _: True == True) 172 | def rule_transfer_has_bid_to(self): 173 | pr_cyan("transferred") 174 | 175 | # --- 176 | 177 | # returns an asker and an NFT that they can place an ask on 178 | def find_asker(self) -> Tuple[Account, NFT]: 179 | """ 180 | Loops through holdership, to give the first available account that can place an ask 181 | """ 182 | # this will always be valid as long as we are correctly updating the holdership 183 | # that means: 184 | # - update if someone accepts ask 185 | # - update if someone accepts bid 186 | # - update on transfers 187 | for holder, nfts in self.holdership.items(): 188 | if len(nfts) > 0: 189 | return (holder, next(iter(nfts))) 190 | 191 | return Account(ZERO_ADDRESS), NFT(Account(ZERO_ADDRESS), 0) 192 | 193 | # returns bidder and an NFT on which to bid 194 | def find_bidder(self) -> Tuple[Account, NFT]: 195 | """ 196 | Finds the account from which we can bid, and also find an NFT on which to bid 197 | """ 198 | # to find a bidder and an NFT to bid on, we mint an arbitrary new NFT from an 199 | # account other than the bidder 200 | bidder = self.accounts.bidders[randint(0, 1)] 201 | minter = self.not_this_account(bidder) 202 | 203 | nft_contract = self.e7 if randint(0, 1) == 0 else self.e1 204 | e = nft_contract.faucet({"from": minter}) 205 | token_id = self.pluck_token_id(e.events) 206 | self.holdership[Account(minter)].add( 207 | NFT(Account(nft_contract.address), token_id) 208 | ) 209 | 210 | return (bidder, NFT(Account(nft_contract.address), token_id)) 211 | 212 | # given an NFT, gives you a bid on it (or None) 213 | def find_existing_bid(self, nft: NFT) -> Optional[Bid]: 214 | """ 215 | Finds a bid, given an NFT. 216 | """ 217 | bid = [bid for bids in self.bids.values() for bid in bids if nft == bid.nft] 218 | return None if len(bid) == 0 else bid[0] 219 | 220 | # returns an account that is not the arg account 221 | def not_this_account(self, not_this: Account) -> Account: 222 | for acc in self.accounts.bidders + self.accounts.askers: 223 | if acc.address != not_this.address: 224 | return acc 225 | 226 | def pluck_token_id(self, e: Dict) -> int: 227 | if "TransferSingle" in e: 228 | return int(e["TransferSingle"]["id"]) 229 | elif "Transfer": 230 | return int(e["Transfer"]["tokenId"]) 231 | else: 232 | return -1 233 | 234 | def _update_order(self, order: Union[Ask, Bid]) -> None: 235 | existing_order = None 236 | is_ask_request = isinstance(order, Ask) 237 | agents_orders = set() 238 | 239 | if is_ask_request: 240 | agents_orders = self.asks[order.seller] 241 | else: 242 | agents_orders = self.bids[order.buyer] 243 | 244 | for _order in agents_orders: 245 | if ( 246 | _order.nft.token_id == order.nft.token_id 247 | and _order.nft.address == order.nft.address 248 | ): 249 | existing_order = _order 250 | 251 | if is_ask_request: 252 | if existing_order is not None: 253 | self.asks[order.seller].remove(existing_order) 254 | self.asks[order.seller].add(order) 255 | else: 256 | if existing_order is not None: 257 | self.bids[order.buyer].remove(existing_order) 258 | self.bids[order.buyer].add(order) 259 | 260 | # adds ask to the test's state 261 | def add_ask(self, ask: Ask) -> None: 262 | self._update_order(ask) 263 | 264 | # adds bid to the test's state 265 | def add_bid(self, bid: Bid) -> None: 266 | self._update_order(bid) 267 | 268 | def _remove_order(self, order: Union[Ask, Bid]) -> None: 269 | # breakpoint() 270 | 271 | agents_orders = set() 272 | is_ask_request = isinstance(order, Ask) 273 | 274 | agents_orders = ( 275 | self.asks[order.seller] if is_ask_request else self.bids[order.buyer] 276 | ) 277 | 278 | updated_orders = set(_order for _order in agents_orders if _order != order) 279 | 280 | if is_ask_request: 281 | self.asks[order.seller] = updated_orders 282 | else: 283 | self.bids[order.buyer] = updated_orders 284 | 285 | # removes ask from the test's state 286 | def remove_ask(self, ask: Ask) -> None: 287 | self._remove_order(ask) 288 | 289 | # removes bid from the test's state 290 | def remove_bid(self, bid: Bid) -> None: 291 | self._remove_order(bid) 292 | 293 | def _contract_orders(self, *, is_ask_request: bool) -> Set[Union[Ask, Bid]]: 294 | orders: Set[Union[Ask, Bid]] = set() 295 | 296 | contract_func = ( 297 | self.marketplace.asks if is_ask_request == True else self.marketplace.bids 298 | ) 299 | 300 | for nft in [self.e7, self.e1]: 301 | # plus one, because token index starts at 1 302 | total_supply = nft.totalSupply() + 1 303 | 304 | for token_id in range(total_supply): 305 | _order = contract_func(nft.address, token_id) 306 | order: Union[Ask, Bid] 307 | if _order[0]: 308 | nft = NFT(Account(nft.address), token_id) 309 | if is_ask_request: 310 | order = Ask( 311 | True, 312 | nft, 313 | Account(_order[1]), 314 | int(_order[2]), 315 | Account(_order[3]), 316 | ) 317 | else: 318 | order = Bid(True, nft, Account(_order[1]), int(_order[2])) 319 | 320 | orders.add(order) 321 | 322 | return orders 323 | 324 | def contract_asks(self) -> Set[Union[Ask, Bid]]: 325 | return self._contract_orders(is_ask_request=True) 326 | 327 | def contract_bids(self) -> Set[Union[Ask, Bid]]: 328 | return self._contract_orders(is_ask_request=False) 329 | 330 | def flatten_dict(self, d: Dict[K, Set[V]]) -> Set[V]: 331 | """ 332 | Double set comprehension allows us to flatten a dict whose values are lists of 333 | values. 334 | 335 | Same as: 336 | x = set() 337 | for v in d.values(): 338 | for x in v: 339 | set.add(x) 340 | """ 341 | return {x for v in d.values() for x in v} 342 | 343 | def _get_first_order(self, *, is_ask_request: bool) -> Optional[Union[Ask, Bid]]: 344 | accs_orders = self.asks if is_ask_request == True else self.bids 345 | 346 | for orders in accs_orders.values(): # type: ignore 347 | if len(orders) > 0: 348 | return next(iter(orders)) 349 | 350 | return None 351 | 352 | # returns first bid that it finds (or None) 353 | def get_bid(self) -> Optional[Bid]: 354 | return self._get_first_order(is_ask_request=False) # type: ignore 355 | 356 | # returns first ask that it finds (or None) 357 | def get_ask(self) -> Optional[Ask]: 358 | return self._get_first_order(is_ask_request=True) # type: ignore 359 | 360 | 361 | def test_stateful(state_machine, A): 362 | marketplace = Marketplace.deploy(A.admin, {"from": A.admin}) 363 | 364 | e7 = E721.deploy({"from": A.admin}) 365 | e1 = E1155.deploy({"from": A.admin}) 366 | 367 | state_machine(StateMachine, A, marketplace, e7, e1) 368 | -------------------------------------------------------------------------------- /src/contracts/Marketplace.sol: -------------------------------------------------------------------------------- 1 | //SPDX-License-Identifier: MIT 2 | pragma solidity =0.8.11; 3 | 4 | import "@openzeppelin/contracts/utils/Address.sol"; 5 | 6 | import "../interfaces/IMarketplace.sol"; 7 | import "../interfaces/INFTContract.sol"; 8 | import "./NFTCommon.sol"; 9 | 10 | // todo: think about how on transfer we can delete the ask of prev owner 11 | // might not be necessary if we bake in checks, and if checks fail: delete 12 | // todo: check out 0.8.9 custom types 13 | contract Marketplace is IMarketplace { 14 | using Address for address payable; 15 | using NFTCommon for INFTContract; 16 | 17 | mapping(address => mapping(uint256 => Ask)) public asks; 18 | mapping(address => mapping(uint256 => Bid)) public bids; 19 | mapping(address => uint256) public escrow; 20 | 21 | // ===================================================================== 22 | 23 | address payable beneficiary; 24 | address admin; 25 | 26 | // ===================================================================== 27 | 28 | string public constant REVERT_NOT_OWNER_OF_TOKEN_ID = 29 | "Marketplace::not an owner of token ID"; 30 | string public constant REVERT_OWNER_OF_TOKEN_ID = 31 | "Marketplace::owner of token ID"; 32 | string public constant REVERT_BID_TOO_LOW = "Marketplace::bid too low"; 33 | string public constant REVERT_NOT_A_CREATOR_OF_BID = 34 | "Marketplace::not a creator of the bid"; 35 | string public constant REVERT_NOT_A_CREATOR_OF_ASK = 36 | "Marketplace::not a creator of the ask"; 37 | string public constant REVERT_ASK_DOES_NOT_EXIST = 38 | "Marketplace::ask does not exist"; 39 | string public constant REVERT_CANT_ACCEPT_OWN_ASK = 40 | "Marketplace::cant accept own ask"; 41 | string public constant REVERT_ASK_IS_RESERVED = 42 | "Marketplace::ask is reserved"; 43 | string public constant REVERT_ASK_INSUFFICIENT_VALUE = 44 | "Marketplace::ask price higher than sent value"; 45 | string public constant REVERT_ASK_SELLER_NOT_OWNER = 46 | "Marketplace::ask creator not owner"; 47 | string public constant REVERT_NFT_NOT_SENT = "Marketplace::NFT not sent"; 48 | string public constant REVERT_INSUFFICIENT_ETHER = 49 | "Marketplace::insufficient ether sent"; 50 | 51 | // ===================================================================== 52 | 53 | constructor(address payable newBeneficiary) { 54 | beneficiary = newBeneficiary; 55 | admin = msg.sender; 56 | } 57 | 58 | // ======= CREATE ASK / BID ============================================ 59 | 60 | /// @notice Creates an ask for (`nft`, `tokenID`) tuple for `price`, which can 61 | /// be reserved for `to`, if `to` is not a zero address. 62 | /// @dev Creating an ask requires msg.sender to have at least one qty of 63 | /// (`nft`, `tokenID`). 64 | /// @param nft An array of ERC-721 and / or ERC-1155 addresses. 65 | /// @param tokenID Token Ids of the NFTs msg.sender wishes to sell. 66 | /// @param price Prices at which the seller is willing to sell the NFTs. 67 | /// @param to Addresses for which the sale is reserved. If zero address, 68 | /// then anyone can accept. 69 | function createAsk( 70 | INFTContract[] calldata nft, 71 | uint256[] calldata tokenID, 72 | uint256[] calldata price, 73 | address[] calldata to 74 | ) external override { 75 | for (uint256 i = 0; i < nft.length; i++) { 76 | require( 77 | nft[i].quantityOf(msg.sender, tokenID[i]) > 0, 78 | REVERT_NOT_OWNER_OF_TOKEN_ID 79 | ); 80 | // if feecollector extension applied, this ensures math is correct 81 | require(price[i] > 10_000, "price too low"); 82 | 83 | // overwristes or creates a new one 84 | asks[address(nft[i])][tokenID[i]] = Ask({ 85 | exists: true, 86 | seller: msg.sender, 87 | price: price[i], 88 | to: to[i] 89 | }); 90 | 91 | emit CreateAsk({ 92 | nft: address(nft[i]), 93 | tokenID: tokenID[i], 94 | price: price[i], 95 | to: to[i] 96 | }); 97 | } 98 | } 99 | 100 | /// @notice Creates a bid on (`nft`, `tokenID`) tuple for `price`. 101 | /// @param nft An array of ERC-721 and / or ERC-1155 addresses. 102 | /// @param tokenID Token Ids of the NFTs msg.sender wishes to buy. 103 | /// @param price Prices at which the buyer is willing to buy the NFTs. 104 | function createBid( 105 | INFTContract[] calldata nft, 106 | uint256[] calldata tokenID, 107 | uint256[] calldata price 108 | ) external payable override { 109 | uint256 totalPrice = 0; 110 | 111 | for (uint256 i = 0; i < nft.length; i++) { 112 | address nftAddress = address(nft[i]); 113 | // bidding on own NFTs is possible. But then again, even if we wanted to disallow it, 114 | // it would not be an effective mechanism, since the agent can bid from his other 115 | // wallets 116 | require( 117 | msg.value > bids[nftAddress][tokenID[i]].price, 118 | REVERT_BID_TOO_LOW 119 | ); 120 | 121 | // if bid existed, let the prev. creator withdraw their bid. new overwrites 122 | if (bids[nftAddress][tokenID[i]].exists) { 123 | escrow[bids[nftAddress][tokenID[i]].buyer] += bids[nftAddress][ 124 | tokenID[i] 125 | ].price; 126 | } 127 | 128 | // overwrites or creates a new one 129 | bids[nftAddress][tokenID[i]] = Bid({ 130 | exists: true, 131 | buyer: msg.sender, 132 | price: price[i] 133 | }); 134 | 135 | emit CreateBid({ 136 | nft: nftAddress, 137 | tokenID: tokenID[i], 138 | price: price[i] 139 | }); 140 | 141 | totalPrice += price[i]; 142 | } 143 | 144 | require(totalPrice == msg.value, REVERT_INSUFFICIENT_ETHER); 145 | } 146 | 147 | // ======= CANCEL ASK / BID ============================================ 148 | 149 | /// @notice Cancels ask(s) that the seller previously created. 150 | /// @param nft An array of ERC-721 and / or ERC-1155 addresses. 151 | /// @param tokenID Token Ids of the NFTs msg.sender wishes to cancel the 152 | /// asks on. 153 | function cancelAsk(INFTContract[] calldata nft, uint256[] calldata tokenID) 154 | external 155 | override 156 | { 157 | for (uint256 i = 0; i < nft.length; i++) { 158 | address nftAddress = address(nft[i]); 159 | require( 160 | asks[nftAddress][tokenID[i]].seller == msg.sender, 161 | REVERT_NOT_A_CREATOR_OF_ASK 162 | ); 163 | 164 | delete asks[nftAddress][tokenID[i]]; 165 | 166 | emit CancelAsk({nft: nftAddress, tokenID: tokenID[i]}); 167 | } 168 | } 169 | 170 | /// @notice Cancels bid(s) that the msg.sender previously created. 171 | /// @param nft An array of ERC-721 and / or ERC-1155 addresses. 172 | /// @param tokenID Token Ids of the NFTs msg.sender wishes to cancel the 173 | /// bids on. 174 | function cancelBid(INFTContract[] calldata nft, uint256[] calldata tokenID) 175 | external 176 | override 177 | { 178 | for (uint256 i = 0; i < nft.length; i++) { 179 | address nftAddress = address(nft[i]); 180 | require( 181 | bids[nftAddress][tokenID[i]].buyer == msg.sender, 182 | REVERT_NOT_A_CREATOR_OF_BID 183 | ); 184 | 185 | escrow[msg.sender] += bids[nftAddress][tokenID[i]].price; 186 | 187 | delete bids[nftAddress][tokenID[i]]; 188 | 189 | emit CancelBid({nft: nftAddress, tokenID: tokenID[i]}); 190 | } 191 | } 192 | 193 | // ======= ACCEPT ASK / BID =========================================== 194 | 195 | /// @notice Seller placed ask(s), you (buyer) are fine with the terms. You accept 196 | /// their ask by sending the required msg.value and indicating the id of the 197 | /// token(s) you are purchasing. 198 | /// @param nft An array of ERC-721 and / or ERC-1155 addresses. 199 | /// @param tokenID Token Ids of the NFTs msg.sender wishes to accept the 200 | /// asks on. 201 | function acceptAsk(INFTContract[] calldata nft, uint256[] calldata tokenID) 202 | external 203 | payable 204 | override 205 | { 206 | uint256 totalPrice = 0; 207 | for (uint256 i = 0; i < nft.length; i++) { 208 | address nftAddress = address(nft[i]); 209 | 210 | require( 211 | asks[nftAddress][tokenID[i]].exists, 212 | REVERT_ASK_DOES_NOT_EXIST 213 | ); 214 | require( 215 | asks[nftAddress][tokenID[i]].seller != msg.sender, 216 | REVERT_CANT_ACCEPT_OWN_ASK 217 | ); 218 | if (asks[nftAddress][tokenID[i]].to != address(0)) { 219 | require( 220 | asks[nftAddress][tokenID[i]].to == msg.sender, 221 | REVERT_ASK_IS_RESERVED 222 | ); 223 | } 224 | require( 225 | nft[i].quantityOf( 226 | asks[nftAddress][tokenID[i]].seller, 227 | tokenID[i] 228 | ) > 0, 229 | REVERT_ASK_SELLER_NOT_OWNER 230 | ); 231 | 232 | totalPrice += asks[nftAddress][tokenID[i]].price; 233 | 234 | escrow[asks[nftAddress][tokenID[i]].seller] += _takeFee( 235 | asks[nftAddress][tokenID[i]].price 236 | ); 237 | 238 | // if there is a bid for this tokenID from msg.sender, cancel and refund 239 | if (bids[nftAddress][tokenID[i]].buyer == msg.sender) { 240 | escrow[bids[nftAddress][tokenID[i]].buyer] += bids[nftAddress][ 241 | tokenID[i] 242 | ].price; 243 | delete bids[nftAddress][tokenID[i]]; 244 | } 245 | 246 | emit AcceptAsk({ 247 | nft: nftAddress, 248 | tokenID: tokenID[i], 249 | price: asks[nftAddress][tokenID[i]].price, 250 | to: asks[nftAddress][tokenID[i]].to 251 | }); 252 | 253 | bool success = nft[i].safeTransferFrom_( 254 | asks[nftAddress][tokenID[i]].seller, 255 | msg.sender, 256 | tokenID[i], 257 | new bytes(0) 258 | ); 259 | require(success, REVERT_NFT_NOT_SENT); 260 | 261 | delete asks[nftAddress][tokenID[i]]; 262 | } 263 | 264 | require(totalPrice == msg.value, REVERT_ASK_INSUFFICIENT_VALUE); 265 | } 266 | 267 | /// @notice You are the owner of the NFTs, someone submitted the bids on them. 268 | /// You accept one or more of these bids. 269 | /// @param nft An array of ERC-721 and / or ERC-1155 addresses. 270 | /// @param tokenID Token Ids of the NFTs msg.sender wishes to accept the 271 | /// bids on. 272 | function acceptBid(INFTContract[] calldata nft, uint256[] calldata tokenID) 273 | external 274 | override 275 | { 276 | uint256 escrowDelta = 0; 277 | for (uint256 i = 0; i < nft.length; i++) { 278 | require( 279 | nft[i].quantityOf(msg.sender, tokenID[i]) > 0, 280 | REVERT_NOT_OWNER_OF_TOKEN_ID 281 | ); 282 | 283 | address nftAddress = address(nft[i]); 284 | 285 | escrowDelta += bids[nftAddress][tokenID[i]].price; 286 | // escrow[msg.sender] += bids[nftAddress][tokenID[i]].price; 287 | 288 | emit AcceptBid({ 289 | nft: nftAddress, 290 | tokenID: tokenID[i], 291 | price: bids[nftAddress][tokenID[i]].price 292 | }); 293 | 294 | bool success = nft[i].safeTransferFrom_( 295 | msg.sender, 296 | bids[nftAddress][tokenID[i]].buyer, 297 | tokenID[i], 298 | new bytes(0) 299 | ); 300 | require(success, REVERT_NFT_NOT_SENT); 301 | 302 | delete asks[nftAddress][tokenID[i]]; 303 | delete bids[nftAddress][tokenID[i]]; 304 | } 305 | 306 | uint256 remaining = _takeFee(escrowDelta); 307 | escrow[msg.sender] = remaining; 308 | } 309 | 310 | /// @notice Sellers can receive their payment by calling this function. 311 | function withdraw() external override { 312 | uint256 amount = escrow[msg.sender]; 313 | escrow[msg.sender] = 0; 314 | payable(address(msg.sender)).sendValue(amount); 315 | } 316 | 317 | // ============ ADMIN ================================================== 318 | 319 | /// @dev Used to change the address of the trade fee receiver. 320 | function changeBeneficiary(address payable newBeneficiary) external { 321 | require(msg.sender == admin, ""); 322 | require(newBeneficiary != payable(address(0)), ""); 323 | beneficiary = newBeneficiary; 324 | } 325 | 326 | /// @dev sets the admin to the zero address. This implies that beneficiary 327 | /// address and other admin only functions are disabled. 328 | function revokeAdmin() external { 329 | require(msg.sender == admin, ""); 330 | admin = address(0); 331 | } 332 | 333 | // ============ EXTENSIONS ============================================= 334 | 335 | /// @dev Hook that is called to collect the fees in FeeCollector extension. 336 | /// Plain implementation of marketplace (without the FeeCollector extension) 337 | /// has no fees. 338 | /// @param totalPrice Total price payable for the trade(s). 339 | function _takeFee(uint256 totalPrice) internal virtual returns (uint256) { 340 | return totalPrice; 341 | } 342 | } 343 | 344 | /* 345 | * 88888888ba 88 a8P 88 346 | * 88 "8b 88 ,88' 88 347 | * 88 ,8P 88 ,88" 88 348 | * 88aaaaaa8P' 88,d88' 88 349 | * 88""""88' 8888"88, 88 350 | * 88 `8b 88P Y8b 88 351 | * 88 `8b 88 "88, 88 352 | * 88 `8b 88 Y8b 88888888888 353 | * 354 | * Marketplace: Marketplace.sol 355 | * 356 | * MIT License 357 | * =========== 358 | * 359 | * Copyright (c) 2022 Rumble League Studios Inc. 360 | * 361 | * Permission is hereby granted, free of charge, to any person obtaining a copy 362 | * of this software and associated documentation files (the "Software"), to deal 363 | * in the Software without restriction, including without limitation the rights 364 | * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 365 | * copies of the Software, and to permit persons to whom the Software is 366 | * furnished to do so, subject to the following conditions: 367 | * 368 | * The above copyright notice and this permission notice shall be included in all 369 | * copies or substantial portions of the Software. 370 | * 371 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 372 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 373 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 374 | * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 375 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 376 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 377 | */ 378 | -------------------------------------------------------------------------------- /poetry.lock: -------------------------------------------------------------------------------- 1 | [[package]] 2 | name = "aiohttp" 3 | version = "3.8.1" 4 | description = "Async http client/server framework (asyncio)" 5 | category = "dev" 6 | optional = false 7 | python-versions = ">=3.6" 8 | 9 | [package.dependencies] 10 | aiosignal = ">=1.1.2" 11 | async-timeout = ">=4.0.0a3,<5.0" 12 | asynctest = {version = "0.13.0", markers = "python_version < \"3.8\""} 13 | attrs = ">=17.3.0" 14 | charset-normalizer = ">=2.0,<3.0" 15 | frozenlist = ">=1.1.1" 16 | multidict = ">=4.5,<7.0" 17 | typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} 18 | yarl = ">=1.0,<2.0" 19 | 20 | [package.extras] 21 | speedups = ["aiodns", "brotli", "cchardet"] 22 | 23 | [[package]] 24 | name = "aiosignal" 25 | version = "1.2.0" 26 | description = "aiosignal: a list of registered asynchronous callbacks" 27 | category = "dev" 28 | optional = false 29 | python-versions = ">=3.6" 30 | 31 | [package.dependencies] 32 | frozenlist = ">=1.1.0" 33 | 34 | [[package]] 35 | name = "asttokens" 36 | version = "2.0.5" 37 | description = "Annotate AST trees with source code positions" 38 | category = "dev" 39 | optional = false 40 | python-versions = "*" 41 | 42 | [package.dependencies] 43 | six = "*" 44 | 45 | [package.extras] 46 | test = ["astroid", "pytest"] 47 | 48 | [[package]] 49 | name = "async-timeout" 50 | version = "4.0.1" 51 | description = "Timeout context manager for asyncio programs" 52 | category = "dev" 53 | optional = false 54 | python-versions = ">=3.6" 55 | 56 | [package.dependencies] 57 | typing-extensions = ">=3.6.5" 58 | 59 | [[package]] 60 | name = "asynctest" 61 | version = "0.13.0" 62 | description = "Enhance the standard unittest package with features for testing asyncio libraries" 63 | category = "dev" 64 | optional = false 65 | python-versions = ">=3.5" 66 | 67 | [[package]] 68 | name = "atomicwrites" 69 | version = "1.4.0" 70 | description = "Atomic file writes." 71 | category = "dev" 72 | optional = false 73 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 74 | 75 | [[package]] 76 | name = "attrs" 77 | version = "21.2.0" 78 | description = "Classes Without Boilerplate" 79 | category = "dev" 80 | optional = false 81 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 82 | 83 | [package.extras] 84 | dev = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface", "furo", "sphinx", "sphinx-notfound-page", "pre-commit"] 85 | docs = ["furo", "sphinx", "zope.interface", "sphinx-notfound-page"] 86 | tests = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins", "zope.interface"] 87 | tests_no_zope = ["coverage[toml] (>=5.0.2)", "hypothesis", "pympler", "pytest (>=4.3.0)", "six", "mypy", "pytest-mypy-plugins"] 88 | 89 | [[package]] 90 | name = "base58" 91 | version = "2.1.1" 92 | description = "Base58 and Base58Check implementation." 93 | category = "dev" 94 | optional = false 95 | python-versions = ">=3.5" 96 | 97 | [package.extras] 98 | tests = ["mypy", "PyHamcrest (>=2.0.2)", "pytest (>=4.6)", "pytest-benchmark", "pytest-cov", "pytest-flake8"] 99 | 100 | [[package]] 101 | name = "bitarray" 102 | version = "1.2.2" 103 | description = "efficient arrays of booleans -- C extension" 104 | category = "dev" 105 | optional = false 106 | python-versions = "*" 107 | 108 | [[package]] 109 | name = "black" 110 | version = "21.11b1" 111 | description = "The uncompromising code formatter." 112 | category = "dev" 113 | optional = false 114 | python-versions = ">=3.6.2" 115 | 116 | [package.dependencies] 117 | click = ">=7.1.2" 118 | mypy-extensions = ">=0.4.3" 119 | pathspec = ">=0.9.0,<1" 120 | platformdirs = ">=2" 121 | regex = ">=2021.4.4" 122 | tomli = ">=0.2.6,<2.0.0" 123 | typed-ast = {version = ">=1.4.2", markers = "python_version < \"3.8\" and implementation_name == \"cpython\""} 124 | typing-extensions = ">=3.10.0.0" 125 | 126 | [package.extras] 127 | colorama = ["colorama (>=0.4.3)"] 128 | d = ["aiohttp (>=3.7.4)"] 129 | jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] 130 | python2 = ["typed-ast (>=1.4.3)"] 131 | uvloop = ["uvloop (>=0.15.2)"] 132 | 133 | [[package]] 134 | name = "cached-property" 135 | version = "1.5.2" 136 | description = "A decorator for caching properties in classes." 137 | category = "dev" 138 | optional = false 139 | python-versions = "*" 140 | 141 | [[package]] 142 | name = "certifi" 143 | version = "2021.10.8" 144 | description = "Python package for providing Mozilla's CA Bundle." 145 | category = "dev" 146 | optional = false 147 | python-versions = "*" 148 | 149 | [[package]] 150 | name = "charset-normalizer" 151 | version = "2.0.9" 152 | description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." 153 | category = "dev" 154 | optional = false 155 | python-versions = ">=3.5.0" 156 | 157 | [package.extras] 158 | unicode_backport = ["unicodedata2"] 159 | 160 | [[package]] 161 | name = "click" 162 | version = "8.0.3" 163 | description = "Composable command line interface toolkit" 164 | category = "dev" 165 | optional = false 166 | python-versions = ">=3.6" 167 | 168 | [package.dependencies] 169 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 170 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 171 | 172 | [[package]] 173 | name = "colorama" 174 | version = "0.4.4" 175 | description = "Cross-platform colored terminal text." 176 | category = "dev" 177 | optional = false 178 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 179 | 180 | [[package]] 181 | name = "cytoolz" 182 | version = "0.11.2" 183 | description = "Cython implementation of Toolz: High performance functional utilities" 184 | category = "dev" 185 | optional = false 186 | python-versions = ">=3.5" 187 | 188 | [package.dependencies] 189 | toolz = ">=0.8.0" 190 | 191 | [package.extras] 192 | cython = ["cython"] 193 | 194 | [[package]] 195 | name = "dataclassy" 196 | version = "0.11.1" 197 | description = "A fast and flexible reimplementation of data classes" 198 | category = "dev" 199 | optional = false 200 | python-versions = ">=3.6" 201 | 202 | [[package]] 203 | name = "eip712" 204 | version = "0.1.0" 205 | description = "eip712: Message classes for typed structured data hashing and signing in Ethereum" 206 | category = "dev" 207 | optional = false 208 | python-versions = ">=3.6,<4" 209 | 210 | [package.dependencies] 211 | dataclassy = ">=0.8.2,<1.0" 212 | eth-abi = ">=2.0.0b7,<3" 213 | eth-typing = ">=2.2,<3.0" 214 | eth-utils = ">=1.3.0,<2" 215 | hexbytes = "<0.3.0" 216 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 217 | pycryptodome = ">=3.4.7,<4.0.0" 218 | 219 | [package.extras] 220 | dev = ["pytest (>=6.0,<7.0)", "pytest-xdist", "pytest-cov", "hypothesis (>=6.2.0,<7.0)", "black (>=20.8b1,<21.0)", "mypy (>=0.800,<1.0)", "flake8 (>=3.8.3,<4.0)", "isort (>=5.7.0,<6.0)", "Sphinx (>=3.4.3,<4)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)", "setuptools", "setuptools-scm", "wheel", "twine", "commitizen", "pytest-watch", "ipython", "ipdb"] 221 | doc = ["Sphinx (>=3.4.3,<4)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"] 222 | lint = ["black (>=20.8b1,<21.0)", "mypy (>=0.800,<1.0)", "flake8 (>=3.8.3,<4.0)", "isort (>=5.7.0,<6.0)"] 223 | release = ["setuptools", "setuptools-scm", "wheel", "twine"] 224 | test = ["pytest (>=6.0,<7.0)", "pytest-xdist", "pytest-cov", "hypothesis (>=6.2.0,<7.0)"] 225 | 226 | [[package]] 227 | name = "eth-abi" 228 | version = "2.1.1" 229 | description = "eth_abi: Python utilities for working with Ethereum ABI definitions, especially encoding and decoding" 230 | category = "dev" 231 | optional = false 232 | python-versions = ">=3.6, <4" 233 | 234 | [package.dependencies] 235 | eth-typing = ">=2.0.0,<3.0.0" 236 | eth-utils = ">=1.2.0,<2.0.0" 237 | parsimonious = ">=0.8.0,<0.9.0" 238 | 239 | [package.extras] 240 | dev = ["bumpversion (>=0.5.3,<1)", "pytest-watch (>=4.1.0,<5)", "wheel", "twine", "ipython", "pytest (==4.4.1)", "pytest-pythonpath (>=0.7.1)", "pytest-xdist (==1.22.3)", "tox (>=2.9.1,<3)", "eth-hash", "hypothesis (>=3.6.1,<4)", "flake8 (==3.4.1)", "isort (>=4.2.15,<5)", "mypy (==0.701)", "pydocstyle (>=3.0.0,<4)", "Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=19.2.0,<20)"] 241 | doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=19.2.0,<20)"] 242 | lint = ["flake8 (==3.4.1)", "isort (>=4.2.15,<5)", "mypy (==0.701)", "pydocstyle (>=3.0.0,<4)"] 243 | test = ["pytest (==4.4.1)", "pytest-pythonpath (>=0.7.1)", "pytest-xdist (==1.22.3)", "tox (>=2.9.1,<3)", "eth-hash", "hypothesis (>=3.6.1,<4)"] 244 | tools = ["hypothesis (>=3.6.1,<4)"] 245 | 246 | [[package]] 247 | name = "eth-account" 248 | version = "0.5.6" 249 | description = "eth-account: Sign Ethereum transactions and messages with local private keys" 250 | category = "dev" 251 | optional = false 252 | python-versions = ">=3.6, <4" 253 | 254 | [package.dependencies] 255 | bitarray = ">=1.2.1,<1.3.0" 256 | eth-abi = ">=2.0.0b7,<3" 257 | eth-keyfile = ">=0.5.0,<0.6.0" 258 | eth-keys = ">=0.2.1,<0.3.2 || >0.3.2,<0.4.0" 259 | eth-rlp = ">=0.1.2,<2" 260 | eth-utils = ">=1.3.0,<2" 261 | hexbytes = ">=0.1.0,<1" 262 | rlp = ">=1.0.0,<3" 263 | 264 | [package.extras] 265 | dev = ["bumpversion (>=0.5.3,<1)", "pytest-watch (>=4.1.0,<5)", "wheel", "twine", "ipython", "hypothesis (>=4.18.0,<5)", "pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)", "flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)", "Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"] 266 | doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"] 267 | lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)"] 268 | test = ["hypothesis (>=4.18.0,<5)", "pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)"] 269 | 270 | [[package]] 271 | name = "eth-brownie" 272 | version = "1.17.2" 273 | description = "A Python framework for Ethereum smart contract deployment, testing and interaction." 274 | category = "dev" 275 | optional = false 276 | python-versions = ">=3.7,<4" 277 | 278 | [package.dependencies] 279 | aiohttp = "3.8.1" 280 | aiosignal = "1.2.0" 281 | asttokens = "2.0.5" 282 | async-timeout = "4.0.1" 283 | asynctest = "0.13.0" 284 | attrs = "21.2.0" 285 | base58 = "2.1.1" 286 | bitarray = "1.2.2" 287 | black = "21.11b1" 288 | cached-property = "1.5.2" 289 | certifi = "2021.10.8" 290 | charset-normalizer = "2.0.9" 291 | click = "8.0.3" 292 | cytoolz = "0.11.2" 293 | dataclassy = "0.11.1" 294 | eip712 = "0.1.0" 295 | eth-abi = "2.1.1" 296 | eth-account = "0.5.6" 297 | eth-event = "1.2.3" 298 | eth-hash = {version = "0.3.2", extras = ["pycryptodome"]} 299 | eth-keyfile = "0.5.1" 300 | eth-keys = "0.3.3" 301 | eth-rlp = "0.2.1" 302 | eth-typing = "2.2.2" 303 | eth-utils = "1.10.0" 304 | execnet = "1.9.0" 305 | frozenlist = "1.2.0" 306 | hexbytes = "0.2.2" 307 | hypothesis = "6.27.3" 308 | idna = "3.3" 309 | importlib-metadata = "4.8.2" 310 | inflection = "0.5.0" 311 | iniconfig = "1.1.1" 312 | ipfshttpclient = "0.8.0a2" 313 | jsonschema = "3.2.0" 314 | lazy-object-proxy = "1.6.0" 315 | lru-dict = "1.1.7" 316 | multiaddr = "0.0.9" 317 | multidict = "5.2.0" 318 | mypy-extensions = "0.4.3" 319 | mythx-models = "1.9.1" 320 | netaddr = "0.8.0" 321 | packaging = "21.3" 322 | parsimonious = "0.8.1" 323 | pathspec = "0.9.0" 324 | platformdirs = "2.4.0" 325 | pluggy = "1.0.0" 326 | prompt-toolkit = "3.0.23" 327 | protobuf = "3.19.1" 328 | psutil = "5.8.0" 329 | py = "1.11.0" 330 | py-solc-ast = "1.2.9" 331 | py-solc-x = "1.1.1" 332 | pycryptodome = "3.12.0" 333 | pygments = "2.10.0" 334 | pygments-lexer-solidity = "0.7.0" 335 | pyjwt = "1.7.1" 336 | pyparsing = "3.0.6" 337 | pyrsistent = "0.18.0" 338 | pytest = "6.2.5" 339 | pytest-forked = "1.3.0" 340 | pytest-xdist = "1.34.0" 341 | python-dateutil = "2.8.1" 342 | python-dotenv = "0.16.0" 343 | pythx = "1.6.1" 344 | pyyaml = "5.4.1" 345 | regex = "2021.11.10" 346 | requests = "2.26.0" 347 | rlp = "2.0.1" 348 | semantic-version = "2.8.5" 349 | six = "1.16.0" 350 | sortedcontainers = "2.4.0" 351 | toml = "0.10.2" 352 | tomli = "1.2.2" 353 | toolz = "0.11.2" 354 | tqdm = "4.62.3" 355 | typed-ast = "1.5.1" 356 | typing-extensions = "3.10.0.2" 357 | urllib3 = "1.26.7" 358 | varint = "1.0.2" 359 | vvm = "0.1.0" 360 | vyper = "0.3.1" 361 | wcwidth = "0.2.5" 362 | web3 = "5.25.0" 363 | websockets = "9.1" 364 | wrapt = "1.13.3" 365 | yarl = "1.7.2" 366 | zipp = "3.6.0" 367 | 368 | [[package]] 369 | name = "eth-event" 370 | version = "1.2.3" 371 | description = "Ethereum event decoder and topic generator" 372 | category = "dev" 373 | optional = false 374 | python-versions = ">=3.6, <4" 375 | 376 | [package.dependencies] 377 | eth-abi = ">=2.0.0,<3.0.0" 378 | eth-hash = {version = ">=0.2.0,<1.0.0", extras = ["pycryptodome"]} 379 | eth-utils = ">=1.2.0,<2.0.0" 380 | hexbytes = ">=0.2.0,<1.0.0" 381 | 382 | [[package]] 383 | name = "eth-hash" 384 | version = "0.3.2" 385 | description = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" 386 | category = "dev" 387 | optional = false 388 | python-versions = ">=3.5, <4" 389 | 390 | [package.dependencies] 391 | pycryptodome = {version = ">=3.6.6,<4", optional = true, markers = "extra == \"pycryptodome\""} 392 | 393 | [package.extras] 394 | dev = ["bumpversion (>=0.5.3,<1)", "pytest-watch (>=4.1.0,<5)", "wheel", "twine", "ipython", "pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)", "flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)", "Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"] 395 | doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"] 396 | lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)"] 397 | pycryptodome = ["pycryptodome (>=3.6.6,<4)"] 398 | pysha3 = ["pysha3 (>=1.0.0,<2.0.0)"] 399 | test = ["pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)"] 400 | 401 | [[package]] 402 | name = "eth-keyfile" 403 | version = "0.5.1" 404 | description = "A library for handling the encrypted keyfiles used to store ethereum private keys." 405 | category = "dev" 406 | optional = false 407 | python-versions = "*" 408 | 409 | [package.dependencies] 410 | cytoolz = ">=0.9.0,<1.0.0" 411 | eth-keys = ">=0.1.0-beta.4,<1.0.0" 412 | eth-utils = ">=1.0.0-beta.1,<2.0.0" 413 | pycryptodome = ">=3.4.7,<4.0.0" 414 | 415 | [[package]] 416 | name = "eth-keys" 417 | version = "0.3.3" 418 | description = "Common API for Ethereum key operations." 419 | category = "dev" 420 | optional = false 421 | python-versions = "*" 422 | 423 | [package.dependencies] 424 | eth-typing = ">=2.2.1,<3.0.0" 425 | eth-utils = ">=1.3.0,<2.0.0" 426 | 427 | [package.extras] 428 | coincurve = ["coincurve (>=7.0.0,<13.0.0)"] 429 | dev = ["tox (==2.7.0)", "bumpversion (==0.5.3)", "twine", "eth-utils (>=1.3.0,<2.0.0)", "eth-typing (>=2.2.1,<3.0.0)", "flake8 (==3.0.4)", "mypy (==0.701)", "asn1tools (>=0.146.2,<0.147)", "pyasn1 (>=0.4.5,<0.5)", "pytest (==3.2.2)", "hypothesis (>=4.56.1,<5.0.0)", "eth-hash", "eth-hash"] 430 | eth-keys = ["eth-utils (>=1.3.0,<2.0.0)", "eth-typing (>=2.2.1,<3.0.0)"] 431 | lint = ["flake8 (==3.0.4)", "mypy (==0.701)"] 432 | test = ["asn1tools (>=0.146.2,<0.147)", "pyasn1 (>=0.4.5,<0.5)", "pytest (==3.2.2)", "hypothesis (>=4.56.1,<5.0.0)", "eth-hash", "eth-hash"] 433 | 434 | [[package]] 435 | name = "eth-rlp" 436 | version = "0.2.1" 437 | description = "eth-rlp: RLP definitions for common Ethereum objects in Python" 438 | category = "dev" 439 | optional = false 440 | python-versions = ">=3.6, <4" 441 | 442 | [package.dependencies] 443 | eth-utils = ">=1.0.1,<2" 444 | hexbytes = ">=0.1.0,<1" 445 | rlp = ">=0.6.0,<3" 446 | 447 | [package.extras] 448 | dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "eth-hash", "flake8 (==3.7.9)", "ipython", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=3.0.0,<4)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "pytest (==5.4.1)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=19.2.0,<20)", "tox (==3.14.6)", "twine", "wheel"] 449 | doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)", "towncrier (>=19.2.0,<20)"] 450 | lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=3.0.0,<4)"] 451 | test = ["eth-hash", "pytest-xdist", "pytest (==5.4.1)", "tox (==3.14.6)"] 452 | 453 | [[package]] 454 | name = "eth-typing" 455 | version = "2.2.2" 456 | description = "eth-typing: Common type annotations for ethereum python packages" 457 | category = "dev" 458 | optional = false 459 | python-versions = ">=3.5, <4" 460 | 461 | [package.extras] 462 | dev = ["bumpversion (>=0.5.3,<1)", "pytest-watch (>=4.1.0,<5)", "wheel", "twine", "ipython", "pytest (>=4.4,<4.5)", "pytest-xdist", "tox (>=2.9.1,<3)", "flake8 (==3.8.3)", "isort (>=4.2.15,<5)", "mypy (==0.782)", "pydocstyle (>=3.0.0,<4)", "Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)"] 463 | doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)"] 464 | lint = ["flake8 (==3.8.3)", "isort (>=4.2.15,<5)", "mypy (==0.782)", "pydocstyle (>=3.0.0,<4)"] 465 | test = ["pytest (>=4.4,<4.5)", "pytest-xdist", "tox (>=2.9.1,<3)"] 466 | 467 | [[package]] 468 | name = "eth-utils" 469 | version = "1.10.0" 470 | description = "eth-utils: Common utility functions for python code that interacts with Ethereum" 471 | category = "dev" 472 | optional = false 473 | python-versions = ">=3.5,!=3.5.2,<4" 474 | 475 | [package.dependencies] 476 | cytoolz = {version = ">=0.10.1,<1.0.0", markers = "implementation_name == \"cpython\""} 477 | eth-hash = ">=0.3.1,<0.4.0" 478 | eth-typing = ">=2.2.1,<3.0.0" 479 | toolz = {version = ">0.8.2,<1", markers = "implementation_name == \"pypy\""} 480 | 481 | [package.extras] 482 | dev = ["bumpversion (>=0.5.3,<1)", "pytest-watch (>=4.1.0,<5)", "wheel (>=0.30.0,<1.0.0)", "twine (>=1.13,<2)", "ipython", "hypothesis (>=4.43.0,<5.0.0)", "pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)", "black (>=18.6b4,<19)", "flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.720)", "pydocstyle (>=5.0.0,<6)", "pytest (>=3.4.1,<4.0.0)", "Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<2)", "towncrier (>=19.2.0,<20)"] 483 | doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<2)", "towncrier (>=19.2.0,<20)"] 484 | lint = ["black (>=18.6b4,<19)", "flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.720)", "pydocstyle (>=5.0.0,<6)", "pytest (>=3.4.1,<4.0.0)"] 485 | test = ["hypothesis (>=4.43.0,<5.0.0)", "pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)"] 486 | 487 | [[package]] 488 | name = "execnet" 489 | version = "1.9.0" 490 | description = "execnet: rapid multi-Python deployment" 491 | category = "dev" 492 | optional = false 493 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 494 | 495 | [package.extras] 496 | testing = ["pre-commit"] 497 | 498 | [[package]] 499 | name = "frozenlist" 500 | version = "1.2.0" 501 | description = "A list-like structure which implements collections.abc.MutableSequence" 502 | category = "dev" 503 | optional = false 504 | python-versions = ">=3.6" 505 | 506 | [[package]] 507 | name = "hexbytes" 508 | version = "0.2.2" 509 | description = "hexbytes: Python `bytes` subclass that decodes hex, with a readable console output" 510 | category = "dev" 511 | optional = false 512 | python-versions = ">=3.6, <4" 513 | 514 | [package.extras] 515 | dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "eth-utils (>=1.0.1,<2)", "flake8 (==3.7.9)", "hypothesis (>=3.44.24,<4)", "ipython", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "pytest (==5.4.1)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)", "tox (==3.14.6)", "twine", "wheel"] 516 | doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"] 517 | lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)"] 518 | test = ["eth-utils (>=1.0.1,<2)", "hypothesis (>=3.44.24,<4)", "pytest-xdist", "pytest (==5.4.1)", "tox (==3.14.6)"] 519 | 520 | [[package]] 521 | name = "hypothesis" 522 | version = "6.27.3" 523 | description = "A library for property-based testing" 524 | category = "dev" 525 | optional = false 526 | python-versions = ">=3.6" 527 | 528 | [package.dependencies] 529 | attrs = ">=19.2.0" 530 | sortedcontainers = ">=2.1.0,<3.0.0" 531 | 532 | [package.extras] 533 | all = ["black (>=19.10b0)", "click (>=7.0)", "django (>=2.2)", "dpcontracts (>=0.4)", "lark-parser (>=0.6.5)", "libcst (>=0.3.16)", "numpy (>=1.9.0)", "pandas (>=0.25)", "pytest (>=4.6)", "python-dateutil (>=1.4)", "pytz (>=2014.1)", "redis (>=3.0.0)", "rich (>=9.0.0)", "importlib-resources (>=3.3.0)", "importlib-metadata (>=3.6)", "backports.zoneinfo (>=0.2.1)", "tzdata (>=2020.4)"] 534 | cli = ["click (>=7.0)", "black (>=19.10b0)", "rich (>=9.0.0)"] 535 | codemods = ["libcst (>=0.3.16)"] 536 | dateutil = ["python-dateutil (>=1.4)"] 537 | django = ["pytz (>=2014.1)", "django (>=2.2)"] 538 | dpcontracts = ["dpcontracts (>=0.4)"] 539 | ghostwriter = ["black (>=19.10b0)"] 540 | lark = ["lark-parser (>=0.6.5)"] 541 | numpy = ["numpy (>=1.9.0)"] 542 | pandas = ["pandas (>=0.25)"] 543 | pytest = ["pytest (>=4.6)"] 544 | pytz = ["pytz (>=2014.1)"] 545 | redis = ["redis (>=3.0.0)"] 546 | zoneinfo = ["importlib-resources (>=3.3.0)", "backports.zoneinfo (>=0.2.1)", "tzdata (>=2020.4)"] 547 | 548 | [[package]] 549 | name = "idna" 550 | version = "3.3" 551 | description = "Internationalized Domain Names in Applications (IDNA)" 552 | category = "dev" 553 | optional = false 554 | python-versions = ">=3.5" 555 | 556 | [[package]] 557 | name = "importlib-metadata" 558 | version = "4.8.2" 559 | description = "Read metadata from Python packages" 560 | category = "dev" 561 | optional = false 562 | python-versions = ">=3.6" 563 | 564 | [package.dependencies] 565 | typing-extensions = {version = ">=3.6.4", markers = "python_version < \"3.8\""} 566 | zipp = ">=0.5" 567 | 568 | [package.extras] 569 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 570 | perf = ["ipython"] 571 | testing = ["pytest (>=6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "packaging", "pep517", "pyfakefs", "flufl.flake8", "pytest-perf (>=0.9.2)", "pytest-black (>=0.3.7)", "pytest-mypy", "importlib-resources (>=1.3)"] 572 | 573 | [[package]] 574 | name = "inflection" 575 | version = "0.5.0" 576 | description = "A port of Ruby on Rails inflector to Python" 577 | category = "dev" 578 | optional = false 579 | python-versions = ">=3.5" 580 | 581 | [[package]] 582 | name = "iniconfig" 583 | version = "1.1.1" 584 | description = "iniconfig: brain-dead simple config-ini parsing" 585 | category = "dev" 586 | optional = false 587 | python-versions = "*" 588 | 589 | [[package]] 590 | name = "ipfshttpclient" 591 | version = "0.8.0a2" 592 | description = "Python IPFS HTTP CLIENT library" 593 | category = "dev" 594 | optional = false 595 | python-versions = ">=3.6.2,!=3.7.0,!=3.7.1" 596 | 597 | [package.dependencies] 598 | multiaddr = ">=0.0.7" 599 | requests = ">=2.11" 600 | 601 | [[package]] 602 | name = "jsonschema" 603 | version = "3.2.0" 604 | description = "An implementation of JSON Schema validation for Python" 605 | category = "dev" 606 | optional = false 607 | python-versions = "*" 608 | 609 | [package.dependencies] 610 | attrs = ">=17.4.0" 611 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 612 | pyrsistent = ">=0.14.0" 613 | six = ">=1.11.0" 614 | 615 | [package.extras] 616 | format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] 617 | format_nongpl = ["idna", "jsonpointer (>1.13)", "webcolors", "rfc3986-validator (>0.1.0)", "rfc3339-validator"] 618 | 619 | [[package]] 620 | name = "lazy-object-proxy" 621 | version = "1.6.0" 622 | description = "A fast and thorough lazy object proxy." 623 | category = "dev" 624 | optional = false 625 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 626 | 627 | [[package]] 628 | name = "lru-dict" 629 | version = "1.1.7" 630 | description = "An Dict like LRU container." 631 | category = "dev" 632 | optional = false 633 | python-versions = "*" 634 | 635 | [[package]] 636 | name = "multiaddr" 637 | version = "0.0.9" 638 | description = "Python implementation of jbenet's multiaddr" 639 | category = "dev" 640 | optional = false 641 | python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" 642 | 643 | [package.dependencies] 644 | base58 = "*" 645 | netaddr = "*" 646 | six = "*" 647 | varint = "*" 648 | 649 | [[package]] 650 | name = "multidict" 651 | version = "5.2.0" 652 | description = "multidict implementation" 653 | category = "dev" 654 | optional = false 655 | python-versions = ">=3.6" 656 | 657 | [[package]] 658 | name = "mypy" 659 | version = "0.931" 660 | description = "Optional static typing for Python" 661 | category = "dev" 662 | optional = false 663 | python-versions = ">=3.6" 664 | 665 | [package.dependencies] 666 | mypy-extensions = ">=0.4.3" 667 | tomli = ">=1.1.0" 668 | typed-ast = {version = ">=1.4.0,<2", markers = "python_version < \"3.8\""} 669 | typing-extensions = ">=3.10" 670 | 671 | [package.extras] 672 | dmypy = ["psutil (>=4.0)"] 673 | python2 = ["typed-ast (>=1.4.0,<2)"] 674 | 675 | [[package]] 676 | name = "mypy-extensions" 677 | version = "0.4.3" 678 | description = "Experimental type system extensions for programs checked with the mypy typechecker." 679 | category = "dev" 680 | optional = false 681 | python-versions = "*" 682 | 683 | [[package]] 684 | name = "mythx-models" 685 | version = "1.9.1" 686 | description = "Python domain model classes for the MythX platform" 687 | category = "dev" 688 | optional = false 689 | python-versions = "*" 690 | 691 | [package.dependencies] 692 | inflection = "0.5.0" 693 | jsonschema = "<4.0.0" 694 | python-dateutil = "2.8.1" 695 | 696 | [[package]] 697 | name = "netaddr" 698 | version = "0.8.0" 699 | description = "A network address manipulation library for Python" 700 | category = "dev" 701 | optional = false 702 | python-versions = "*" 703 | 704 | [[package]] 705 | name = "packaging" 706 | version = "21.3" 707 | description = "Core utilities for Python packages" 708 | category = "dev" 709 | optional = false 710 | python-versions = ">=3.6" 711 | 712 | [package.dependencies] 713 | pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" 714 | 715 | [[package]] 716 | name = "parsimonious" 717 | version = "0.8.1" 718 | description = "(Soon to be) the fastest pure-Python PEG parser I could muster" 719 | category = "dev" 720 | optional = false 721 | python-versions = "*" 722 | 723 | [package.dependencies] 724 | six = ">=1.9.0" 725 | 726 | [[package]] 727 | name = "pathspec" 728 | version = "0.9.0" 729 | description = "Utility library for gitignore style pattern matching of file paths." 730 | category = "dev" 731 | optional = false 732 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 733 | 734 | [[package]] 735 | name = "platformdirs" 736 | version = "2.4.0" 737 | description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." 738 | category = "dev" 739 | optional = false 740 | python-versions = ">=3.6" 741 | 742 | [package.extras] 743 | docs = ["Sphinx (>=4)", "furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx-autodoc-typehints (>=1.12)"] 744 | test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock (>=3.6)"] 745 | 746 | [[package]] 747 | name = "pluggy" 748 | version = "1.0.0" 749 | description = "plugin and hook calling mechanisms for python" 750 | category = "dev" 751 | optional = false 752 | python-versions = ">=3.6" 753 | 754 | [package.dependencies] 755 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 756 | 757 | [package.extras] 758 | dev = ["pre-commit", "tox"] 759 | testing = ["pytest", "pytest-benchmark"] 760 | 761 | [[package]] 762 | name = "prompt-toolkit" 763 | version = "3.0.23" 764 | description = "Library for building powerful interactive command lines in Python" 765 | category = "dev" 766 | optional = false 767 | python-versions = ">=3.6.2" 768 | 769 | [package.dependencies] 770 | wcwidth = "*" 771 | 772 | [[package]] 773 | name = "protobuf" 774 | version = "3.19.1" 775 | description = "Protocol Buffers" 776 | category = "dev" 777 | optional = false 778 | python-versions = ">=3.5" 779 | 780 | [[package]] 781 | name = "psutil" 782 | version = "5.8.0" 783 | description = "Cross-platform lib for process and system monitoring in Python." 784 | category = "dev" 785 | optional = false 786 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 787 | 788 | [package.extras] 789 | test = ["ipaddress", "mock", "unittest2", "enum34", "pywin32", "wmi"] 790 | 791 | [[package]] 792 | name = "py" 793 | version = "1.11.0" 794 | description = "library with cross-python path, ini-parsing, io, code, log facilities" 795 | category = "dev" 796 | optional = false 797 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 798 | 799 | [[package]] 800 | name = "py-solc-ast" 801 | version = "1.2.9" 802 | description = "A tool for exploring the abstract syntax tree generated by solc." 803 | category = "dev" 804 | optional = false 805 | python-versions = ">=3.6, <4" 806 | 807 | [[package]] 808 | name = "py-solc-x" 809 | version = "1.1.1" 810 | description = "Python wrapper and version management tool for the solc Solidity compiler." 811 | category = "dev" 812 | optional = false 813 | python-versions = ">=3.6, <4" 814 | 815 | [package.dependencies] 816 | requests = ">=2.19.0,<3" 817 | semantic-version = ">=2.8.1,<3" 818 | 819 | [[package]] 820 | name = "pycryptodome" 821 | version = "3.12.0" 822 | description = "Cryptographic library for Python" 823 | category = "dev" 824 | optional = false 825 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 826 | 827 | [[package]] 828 | name = "pygments" 829 | version = "2.10.0" 830 | description = "Pygments is a syntax highlighting package written in Python." 831 | category = "dev" 832 | optional = false 833 | python-versions = ">=3.5" 834 | 835 | [[package]] 836 | name = "pygments-lexer-solidity" 837 | version = "0.7.0" 838 | description = "Solidity lexer for Pygments (includes Yul intermediate language)" 839 | category = "dev" 840 | optional = false 841 | python-versions = ">=3.3, <4" 842 | 843 | [package.dependencies] 844 | pygments = ">=2.1" 845 | 846 | [[package]] 847 | name = "pyjwt" 848 | version = "1.7.1" 849 | description = "JSON Web Token implementation in Python" 850 | category = "dev" 851 | optional = false 852 | python-versions = "*" 853 | 854 | [package.extras] 855 | crypto = ["cryptography (>=1.4)"] 856 | flake8 = ["flake8", "flake8-import-order", "pep8-naming"] 857 | test = ["pytest (>=4.0.1,<5.0.0)", "pytest-cov (>=2.6.0,<3.0.0)", "pytest-runner (>=4.2,<5.0.0)"] 858 | 859 | [[package]] 860 | name = "pyparsing" 861 | version = "3.0.6" 862 | description = "Python parsing module" 863 | category = "dev" 864 | optional = false 865 | python-versions = ">=3.6" 866 | 867 | [package.extras] 868 | diagrams = ["jinja2", "railroad-diagrams"] 869 | 870 | [[package]] 871 | name = "pyrsistent" 872 | version = "0.18.0" 873 | description = "Persistent/Functional/Immutable data structures" 874 | category = "dev" 875 | optional = false 876 | python-versions = ">=3.6" 877 | 878 | [[package]] 879 | name = "pytest" 880 | version = "6.2.5" 881 | description = "pytest: simple powerful testing with Python" 882 | category = "dev" 883 | optional = false 884 | python-versions = ">=3.6" 885 | 886 | [package.dependencies] 887 | atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} 888 | attrs = ">=19.2.0" 889 | colorama = {version = "*", markers = "sys_platform == \"win32\""} 890 | importlib-metadata = {version = ">=0.12", markers = "python_version < \"3.8\""} 891 | iniconfig = "*" 892 | packaging = "*" 893 | pluggy = ">=0.12,<2.0" 894 | py = ">=1.8.2" 895 | toml = "*" 896 | 897 | [package.extras] 898 | testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xmlschema"] 899 | 900 | [[package]] 901 | name = "pytest-forked" 902 | version = "1.3.0" 903 | description = "run tests in isolated forked subprocesses" 904 | category = "dev" 905 | optional = false 906 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 907 | 908 | [package.dependencies] 909 | py = "*" 910 | pytest = ">=3.10" 911 | 912 | [[package]] 913 | name = "pytest-xdist" 914 | version = "1.34.0" 915 | description = "pytest xdist plugin for distributed testing and loop-on-failing modes" 916 | category = "dev" 917 | optional = false 918 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" 919 | 920 | [package.dependencies] 921 | execnet = ">=1.1" 922 | pytest = ">=4.4.0" 923 | pytest-forked = "*" 924 | six = "*" 925 | 926 | [package.extras] 927 | testing = ["filelock"] 928 | 929 | [[package]] 930 | name = "python-dateutil" 931 | version = "2.8.1" 932 | description = "Extensions to the standard Python datetime module" 933 | category = "dev" 934 | optional = false 935 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" 936 | 937 | [package.dependencies] 938 | six = ">=1.5" 939 | 940 | [[package]] 941 | name = "python-dotenv" 942 | version = "0.16.0" 943 | description = "Read key-value pairs from a .env file and set them as environment variables" 944 | category = "dev" 945 | optional = false 946 | python-versions = "*" 947 | 948 | [package.extras] 949 | cli = ["click (>=5.0)"] 950 | 951 | [[package]] 952 | name = "pythx" 953 | version = "1.6.1" 954 | description = "A Python library for the MythX platform" 955 | category = "dev" 956 | optional = false 957 | python-versions = "*" 958 | 959 | [package.dependencies] 960 | inflection = "0.5.0" 961 | mythx-models = "1.9.1" 962 | PyJWT = ">=1.7.0,<1.8.0" 963 | python-dateutil = ">=2.8.0,<2.9.0" 964 | requests = ">=2.0.0,<3.0.0" 965 | 966 | [[package]] 967 | name = "pywin32" 968 | version = "303" 969 | description = "Python for Window Extensions" 970 | category = "dev" 971 | optional = false 972 | python-versions = "*" 973 | 974 | [[package]] 975 | name = "pyyaml" 976 | version = "5.4.1" 977 | description = "YAML parser and emitter for Python" 978 | category = "dev" 979 | optional = false 980 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 981 | 982 | [[package]] 983 | name = "regex" 984 | version = "2021.11.10" 985 | description = "Alternative regular expression module, to replace re." 986 | category = "dev" 987 | optional = false 988 | python-versions = "*" 989 | 990 | [[package]] 991 | name = "requests" 992 | version = "2.26.0" 993 | description = "Python HTTP for Humans." 994 | category = "dev" 995 | optional = false 996 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" 997 | 998 | [package.dependencies] 999 | certifi = ">=2017.4.17" 1000 | charset-normalizer = {version = ">=2.0.0,<2.1.0", markers = "python_version >= \"3\""} 1001 | idna = {version = ">=2.5,<4", markers = "python_version >= \"3\""} 1002 | urllib3 = ">=1.21.1,<1.27" 1003 | 1004 | [package.extras] 1005 | socks = ["PySocks (>=1.5.6,!=1.5.7)", "win-inet-pton"] 1006 | use_chardet_on_py3 = ["chardet (>=3.0.2,<5)"] 1007 | 1008 | [[package]] 1009 | name = "rlp" 1010 | version = "2.0.1" 1011 | description = "A package for Recursive Length Prefix encoding and decoding" 1012 | category = "dev" 1013 | optional = false 1014 | python-versions = "*" 1015 | 1016 | [package.dependencies] 1017 | eth-utils = ">=1.0.2,<2" 1018 | 1019 | [package.extras] 1020 | dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "flake8 (==3.4.1)", "hypothesis (==5.19.0)", "ipython", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "pytest (==5.4.3)", "setuptools (>=36.2.0)", "sphinx-rtd-theme (>=0.1.9)", "tox (>=2.9.1,<3)", "twine", "wheel"] 1021 | doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)"] 1022 | lint = ["flake8 (==3.4.1)"] 1023 | rust-backend = ["rusty-rlp (>=0.1.15,<0.2)"] 1024 | test = ["hypothesis (==5.19.0)", "pytest (==5.4.3)", "tox (>=2.9.1,<3)"] 1025 | 1026 | [[package]] 1027 | name = "semantic-version" 1028 | version = "2.8.5" 1029 | description = "A library implementing the 'SemVer' scheme." 1030 | category = "dev" 1031 | optional = false 1032 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" 1033 | 1034 | [[package]] 1035 | name = "six" 1036 | version = "1.16.0" 1037 | description = "Python 2 and 3 compatibility utilities" 1038 | category = "dev" 1039 | optional = false 1040 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" 1041 | 1042 | [[package]] 1043 | name = "sortedcontainers" 1044 | version = "2.4.0" 1045 | description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" 1046 | category = "dev" 1047 | optional = false 1048 | python-versions = "*" 1049 | 1050 | [[package]] 1051 | name = "toml" 1052 | version = "0.10.2" 1053 | description = "Python Library for Tom's Obvious, Minimal Language" 1054 | category = "dev" 1055 | optional = false 1056 | python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" 1057 | 1058 | [[package]] 1059 | name = "tomli" 1060 | version = "1.2.2" 1061 | description = "A lil' TOML parser" 1062 | category = "dev" 1063 | optional = false 1064 | python-versions = ">=3.6" 1065 | 1066 | [[package]] 1067 | name = "toolz" 1068 | version = "0.11.2" 1069 | description = "List processing tools and functional utilities" 1070 | category = "dev" 1071 | optional = false 1072 | python-versions = ">=3.5" 1073 | 1074 | [[package]] 1075 | name = "tqdm" 1076 | version = "4.62.3" 1077 | description = "Fast, Extensible Progress Meter" 1078 | category = "dev" 1079 | optional = false 1080 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" 1081 | 1082 | [package.dependencies] 1083 | colorama = {version = "*", markers = "platform_system == \"Windows\""} 1084 | 1085 | [package.extras] 1086 | dev = ["py-make (>=0.1.0)", "twine", "wheel"] 1087 | notebook = ["ipywidgets (>=6)"] 1088 | telegram = ["requests"] 1089 | 1090 | [[package]] 1091 | name = "typed-ast" 1092 | version = "1.5.1" 1093 | description = "a fork of Python 2 and 3 ast modules with type comment support" 1094 | category = "dev" 1095 | optional = false 1096 | python-versions = ">=3.6" 1097 | 1098 | [[package]] 1099 | name = "typing-extensions" 1100 | version = "3.10.0.2" 1101 | description = "Backported and Experimental Type Hints for Python 3.5+" 1102 | category = "dev" 1103 | optional = false 1104 | python-versions = "*" 1105 | 1106 | [[package]] 1107 | name = "urllib3" 1108 | version = "1.26.7" 1109 | description = "HTTP library with thread-safe connection pooling, file post, and more." 1110 | category = "dev" 1111 | optional = false 1112 | python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, <4" 1113 | 1114 | [package.extras] 1115 | brotli = ["brotlipy (>=0.6.0)"] 1116 | secure = ["pyOpenSSL (>=0.14)", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "certifi", "ipaddress"] 1117 | socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] 1118 | 1119 | [[package]] 1120 | name = "varint" 1121 | version = "1.0.2" 1122 | description = "Simple python varint implementation" 1123 | category = "dev" 1124 | optional = false 1125 | python-versions = "*" 1126 | 1127 | [[package]] 1128 | name = "vvm" 1129 | version = "0.1.0" 1130 | description = "Vyper version management tool" 1131 | category = "dev" 1132 | optional = false 1133 | python-versions = ">=3.6, <4" 1134 | 1135 | [package.dependencies] 1136 | requests = ">=2.19.0,<3" 1137 | semantic-version = ">=2.8.1,<3" 1138 | 1139 | [[package]] 1140 | name = "vyper" 1141 | version = "0.3.1" 1142 | description = "Vyper: the Pythonic Programming Language for the EVM" 1143 | category = "dev" 1144 | optional = false 1145 | python-versions = ">=3.7,<3.10" 1146 | 1147 | [package.dependencies] 1148 | asttokens = "2.0.5" 1149 | cached-property = {version = "1.5.2", markers = "python_version < \"3.8\""} 1150 | importlib-metadata = {version = "*", markers = "python_version < \"3.8\""} 1151 | pycryptodome = ">=3.5.1,<4" 1152 | semantic-version = "2.8.5" 1153 | 1154 | [package.extras] 1155 | dev = ["pytest (>=5.4,<6.0)", "pytest-cov (>=2.10,<3.0)", "pytest-instafail (>=0.4,<1.0)", "pytest-xdist (>=1.32,<2.0)", "eth-tester[py-evm] (>=0.5.0b1,<0.6)", "py-evm (==0.4.0a4)", "web3 (==5.21.0)", "tox (>=3.15,<4.0)", "lark-parser (==0.10.0)", "hypothesis[lark] (>=5.37.1,<6.0)", "black (==21.9b0)", "flake8 (==3.9.2)", "flake8-bugbear (==20.1.4)", "flake8-use-fstring (==1.1)", "isort (==5.9.3)", "mypy (==0.910)", "recommonmark", "sphinx (>=3.0,<4.0)", "sphinx-rtd-theme (>=0.5,<0.6)", "ipython", "pre-commit", "pyinstaller", "twine"] 1156 | docs = ["recommonmark", "sphinx (>=3.0,<4.0)", "sphinx-rtd-theme (>=0.5,<0.6)"] 1157 | lint = ["black (==21.9b0)", "flake8 (==3.9.2)", "flake8-bugbear (==20.1.4)", "flake8-use-fstring (==1.1)", "isort (==5.9.3)", "mypy (==0.910)"] 1158 | test = ["pytest (>=5.4,<6.0)", "pytest-cov (>=2.10,<3.0)", "pytest-instafail (>=0.4,<1.0)", "pytest-xdist (>=1.32,<2.0)", "eth-tester[py-evm] (>=0.5.0b1,<0.6)", "py-evm (==0.4.0a4)", "web3 (==5.21.0)", "tox (>=3.15,<4.0)", "lark-parser (==0.10.0)", "hypothesis[lark] (>=5.37.1,<6.0)"] 1159 | 1160 | [[package]] 1161 | name = "wcwidth" 1162 | version = "0.2.5" 1163 | description = "Measures the displayed width of unicode strings in a terminal" 1164 | category = "dev" 1165 | optional = false 1166 | python-versions = "*" 1167 | 1168 | [[package]] 1169 | name = "web3" 1170 | version = "5.25.0" 1171 | description = "Web3.py" 1172 | category = "dev" 1173 | optional = false 1174 | python-versions = ">=3.6,<4" 1175 | 1176 | [package.dependencies] 1177 | aiohttp = ">=3.7.4.post0,<4" 1178 | eth-abi = ">=2.0.0b6,<3.0.0" 1179 | eth-account = ">=0.5.6,<0.6.0" 1180 | eth-hash = {version = ">=0.2.0,<1.0.0", extras = ["pycryptodome"]} 1181 | eth-typing = ">=2.0.0,<3.0.0" 1182 | eth-utils = ">=1.9.5,<2.0.0" 1183 | hexbytes = ">=0.1.0,<1.0.0" 1184 | ipfshttpclient = "0.8.0a2" 1185 | jsonschema = ">=3.2.0,<4.0.0" 1186 | lru-dict = ">=1.1.6,<2.0.0" 1187 | protobuf = ">=3.10.0,<4" 1188 | pywin32 = {version = ">=223", markers = "platform_system == \"Windows\""} 1189 | requests = ">=2.16.0,<3.0.0" 1190 | typing-extensions = {version = ">=3.7.4.1,<4", markers = "python_version < \"3.8\""} 1191 | websockets = ">=9.1,<10" 1192 | 1193 | [package.extras] 1194 | dev = ["eth-tester[py-evm] (==v0.6.0-beta.4)", "py-geth (>=3.6.0,<4)", "flake8 (==3.8.3)", "isort (>=4.2.15,<4.3.5)", "mypy (==0.812)", "mock", "sphinx-better-theme (>=0.1.4)", "click (>=5.1)", "configparser (==3.5.0)", "contextlib2 (>=0.5.4)", "py-solc (>=0.4.0)", "pytest (>=4.4.0,<5.0.0)", "sphinx (>=3.0,<4)", "sphinx-rtd-theme (>=0.1.9)", "toposort (>=1.4)", "towncrier (==18.5.0)", "urllib3", "wheel", "bumpversion", "flaky (>=3.7.0,<4)", "hypothesis (>=3.31.2,<6)", "pytest-asyncio (>=0.10.0,<0.11)", "pytest-mock (>=1.10,<2)", "pytest-pythonpath (>=0.3)", "pytest-watch (>=4.2,<5)", "pytest-xdist (>=1.29,<2)", "setuptools (>=38.6.0)", "tox (>=1.8.0)", "tqdm (>4.32,<5)", "twine (>=1.13,<2)", "pluggy (==0.13.1)", "when-changed (>=0.3.0,<0.4)"] 1195 | docs = ["mock", "sphinx-better-theme (>=0.1.4)", "click (>=5.1)", "configparser (==3.5.0)", "contextlib2 (>=0.5.4)", "py-geth (>=3.6.0,<4)", "py-solc (>=0.4.0)", "pytest (>=4.4.0,<5.0.0)", "sphinx (>=3.0,<4)", "sphinx-rtd-theme (>=0.1.9)", "toposort (>=1.4)", "towncrier (==18.5.0)", "urllib3", "wheel"] 1196 | linter = ["flake8 (==3.8.3)", "isort (>=4.2.15,<4.3.5)", "mypy (==0.812)"] 1197 | tester = ["eth-tester[py-evm] (==v0.6.0-beta.4)", "py-geth (>=3.6.0,<4)"] 1198 | 1199 | [[package]] 1200 | name = "websockets" 1201 | version = "9.1" 1202 | description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" 1203 | category = "dev" 1204 | optional = false 1205 | python-versions = ">=3.6.1" 1206 | 1207 | [[package]] 1208 | name = "wrapt" 1209 | version = "1.13.3" 1210 | description = "Module for decorators, wrappers and monkey patching." 1211 | category = "dev" 1212 | optional = false 1213 | python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" 1214 | 1215 | [[package]] 1216 | name = "yarl" 1217 | version = "1.7.2" 1218 | description = "Yet another URL library" 1219 | category = "dev" 1220 | optional = false 1221 | python-versions = ">=3.6" 1222 | 1223 | [package.dependencies] 1224 | idna = ">=2.0" 1225 | multidict = ">=4.0" 1226 | typing-extensions = {version = ">=3.7.4", markers = "python_version < \"3.8\""} 1227 | 1228 | [[package]] 1229 | name = "zipp" 1230 | version = "3.6.0" 1231 | description = "Backport of pathlib-compatible object wrapper for zip files" 1232 | category = "dev" 1233 | optional = false 1234 | python-versions = ">=3.6" 1235 | 1236 | [package.extras] 1237 | docs = ["sphinx", "jaraco.packaging (>=8.2)", "rst.linker (>=1.9)"] 1238 | testing = ["pytest (>=4.6)", "pytest-checkdocs (>=2.4)", "pytest-flake8", "pytest-cov", "pytest-enabler (>=1.0.1)", "jaraco.itertools", "func-timeout", "pytest-black (>=0.3.7)", "pytest-mypy"] 1239 | 1240 | [metadata] 1241 | lock-version = "1.1" 1242 | python-versions = ">=3.7.2,<3.10" 1243 | content-hash = "047ad83d98f7fc696b81e542126d8da18398eeea8ce8cc58c8676715df90ca80" 1244 | 1245 | [metadata.files] 1246 | aiohttp = [ 1247 | {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8"}, 1248 | {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7dadf3c307b31e0e61689cbf9e06be7a867c563d5a63ce9dca578f956609abf8"}, 1249 | {file = "aiohttp-3.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a79004bb58748f31ae1cbe9fa891054baaa46fb106c2dc7af9f8e3304dc30316"}, 1250 | {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12de6add4038df8f72fac606dff775791a60f113a725c960f2bab01d8b8e6b15"}, 1251 | {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f0d5f33feb5f69ddd57a4a4bd3d56c719a141080b445cbf18f238973c5c9923"}, 1252 | {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eaba923151d9deea315be1f3e2b31cc39a6d1d2f682f942905951f4e40200922"}, 1253 | {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:099ebd2c37ac74cce10a3527d2b49af80243e2a4fa39e7bce41617fbc35fa3c1"}, 1254 | {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:2e5d962cf7e1d426aa0e528a7e198658cdc8aa4fe87f781d039ad75dcd52c516"}, 1255 | {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fa0ffcace9b3aa34d205d8130f7873fcfefcb6a4dd3dd705b0dab69af6712642"}, 1256 | {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61bfc23df345d8c9716d03717c2ed5e27374e0fe6f659ea64edcd27b4b044cf7"}, 1257 | {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:31560d268ff62143e92423ef183680b9829b1b482c011713ae941997921eebc8"}, 1258 | {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:01d7bdb774a9acc838e6b8f1d114f45303841b89b95984cbb7d80ea41172a9e3"}, 1259 | {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:97ef77eb6b044134c0b3a96e16abcb05ecce892965a2124c566af0fd60f717e2"}, 1260 | {file = "aiohttp-3.8.1-cp310-cp310-win32.whl", hash = "sha256:c2aef4703f1f2ddc6df17519885dbfa3514929149d3ff900b73f45998f2532fa"}, 1261 | {file = "aiohttp-3.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:713ac174a629d39b7c6a3aa757b337599798da4c1157114a314e4e391cd28e32"}, 1262 | {file = "aiohttp-3.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:473d93d4450880fe278696549f2e7aed8cd23708c3c1997981464475f32137db"}, 1263 | {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99b5eeae8e019e7aad8af8bb314fb908dd2e028b3cdaad87ec05095394cce632"}, 1264 | {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af642b43ce56c24d063325dd2cf20ee012d2b9ba4c3c008755a301aaea720ad"}, 1265 | {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3630c3ef435c0a7c549ba170a0633a56e92629aeed0e707fec832dee313fb7a"}, 1266 | {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4a4a4e30bf1edcad13fb0804300557aedd07a92cabc74382fdd0ba6ca2661091"}, 1267 | {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6f8b01295e26c68b3a1b90efb7a89029110d3a4139270b24fda961893216c440"}, 1268 | {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a25fa703a527158aaf10dafd956f7d42ac6d30ec80e9a70846253dd13e2f067b"}, 1269 | {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5bfde62d1d2641a1f5173b8c8c2d96ceb4854f54a44c23102e2ccc7e02f003ec"}, 1270 | {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:51467000f3647d519272392f484126aa716f747859794ac9924a7aafa86cd411"}, 1271 | {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:03a6d5349c9ee8f79ab3ff3694d6ce1cfc3ced1c9d36200cb8f08ba06bd3b782"}, 1272 | {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:102e487eeb82afac440581e5d7f8f44560b36cf0bdd11abc51a46c1cd88914d4"}, 1273 | {file = "aiohttp-3.8.1-cp36-cp36m-win32.whl", hash = "sha256:4aed991a28ea3ce320dc8ce655875e1e00a11bdd29fe9444dd4f88c30d558602"}, 1274 | {file = "aiohttp-3.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b0e20cddbd676ab8a64c774fefa0ad787cc506afd844de95da56060348021e96"}, 1275 | {file = "aiohttp-3.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:37951ad2f4a6df6506750a23f7cbabad24c73c65f23f72e95897bb2cecbae676"}, 1276 | {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c23b1ad869653bc818e972b7a3a79852d0e494e9ab7e1a701a3decc49c20d51"}, 1277 | {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15b09b06dae900777833fe7fc4b4aa426556ce95847a3e8d7548e2d19e34edb8"}, 1278 | {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:477c3ea0ba410b2b56b7efb072c36fa91b1e6fc331761798fa3f28bb224830dd"}, 1279 | {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2f2f69dca064926e79997f45b2f34e202b320fd3782f17a91941f7eb85502ee2"}, 1280 | {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ef9612483cb35171d51d9173647eed5d0069eaa2ee812793a75373447d487aa4"}, 1281 | {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6d69f36d445c45cda7b3b26afef2fc34ef5ac0cdc75584a87ef307ee3c8c6d00"}, 1282 | {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:55c3d1072704d27401c92339144d199d9de7b52627f724a949fc7d5fc56d8b93"}, 1283 | {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b9d00268fcb9f66fbcc7cd9fe423741d90c75ee029a1d15c09b22d23253c0a44"}, 1284 | {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:07b05cd3305e8a73112103c834e91cd27ce5b4bd07850c4b4dbd1877d3f45be7"}, 1285 | {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c34dc4958b232ef6188c4318cb7b2c2d80521c9a56c52449f8f93ab7bc2a8a1c"}, 1286 | {file = "aiohttp-3.8.1-cp37-cp37m-win32.whl", hash = "sha256:d2f9b69293c33aaa53d923032fe227feac867f81682f002ce33ffae978f0a9a9"}, 1287 | {file = "aiohttp-3.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6ae828d3a003f03ae31915c31fa684b9890ea44c9c989056fea96e3d12a9fa17"}, 1288 | {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0c7ebbbde809ff4e970824b2b6cb7e4222be6b95a296e46c03cf050878fc1785"}, 1289 | {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b7ef7cbd4fec9a1e811a5de813311ed4f7ac7d93e0fda233c9b3e1428f7dd7b"}, 1290 | {file = "aiohttp-3.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c3d6a4d0619e09dcd61021debf7059955c2004fa29f48788a3dfaf9c9901a7cd"}, 1291 | {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:718626a174e7e467f0558954f94af117b7d4695d48eb980146016afa4b580b2e"}, 1292 | {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:589c72667a5febd36f1315aa6e5f56dd4aa4862df295cb51c769d16142ddd7cd"}, 1293 | {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ed076098b171573161eb146afcb9129b5ff63308960aeca4b676d9d3c35e700"}, 1294 | {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:086f92daf51a032d062ec5f58af5ca6a44d082c35299c96376a41cbb33034675"}, 1295 | {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:11691cf4dc5b94236ccc609b70fec991234e7ef8d4c02dd0c9668d1e486f5abf"}, 1296 | {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:31d1e1c0dbf19ebccbfd62eff461518dcb1e307b195e93bba60c965a4dcf1ba0"}, 1297 | {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11a67c0d562e07067c4e86bffc1553f2cf5b664d6111c894671b2b8712f3aba5"}, 1298 | {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:bb01ba6b0d3f6c68b89fce7305080145d4877ad3acaed424bae4d4ee75faa950"}, 1299 | {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:44db35a9e15d6fe5c40d74952e803b1d96e964f683b5a78c3cc64eb177878155"}, 1300 | {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:844a9b460871ee0a0b0b68a64890dae9c415e513db0f4a7e3cab41a0f2fedf33"}, 1301 | {file = "aiohttp-3.8.1-cp38-cp38-win32.whl", hash = "sha256:7d08744e9bae2ca9c382581f7dce1273fe3c9bae94ff572c3626e8da5b193c6a"}, 1302 | {file = "aiohttp-3.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:04d48b8ce6ab3cf2097b1855e1505181bdd05586ca275f2505514a6e274e8e75"}, 1303 | {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5315a2eb0239185af1bddb1abf472d877fede3cc8d143c6cddad37678293237"}, 1304 | {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a996d01ca39b8dfe77440f3cd600825d05841088fd6bc0144cc6c2ec14cc5f74"}, 1305 | {file = "aiohttp-3.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:13487abd2f761d4be7c8ff9080de2671e53fff69711d46de703c310c4c9317ca"}, 1306 | {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea302f34477fda3f85560a06d9ebdc7fa41e82420e892fc50b577e35fc6a50b2"}, 1307 | {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2f635ce61a89c5732537a7896b6319a8fcfa23ba09bec36e1b1ac0ab31270d2"}, 1308 | {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e999f2d0e12eea01caeecb17b653f3713d758f6dcc770417cf29ef08d3931421"}, 1309 | {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0770e2806a30e744b4e21c9d73b7bee18a1cfa3c47991ee2e5a65b887c49d5cf"}, 1310 | {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d15367ce87c8e9e09b0f989bfd72dc641bcd04ba091c68cd305312d00962addd"}, 1311 | {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c7cefb4b0640703eb1069835c02486669312bf2f12b48a748e0a7756d0de33d"}, 1312 | {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:71927042ed6365a09a98a6377501af5c9f0a4d38083652bcd2281a06a5976724"}, 1313 | {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:28d490af82bc6b7ce53ff31337a18a10498303fe66f701ab65ef27e143c3b0ef"}, 1314 | {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b6613280ccedf24354406caf785db748bebbddcf31408b20c0b48cb86af76866"}, 1315 | {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81e3d8c34c623ca4e36c46524a3530e99c0bc95ed068fd6e9b55cb721d408fb2"}, 1316 | {file = "aiohttp-3.8.1-cp39-cp39-win32.whl", hash = "sha256:7187a76598bdb895af0adbd2fb7474d7f6025d170bc0a1130242da817ce9e7d1"}, 1317 | {file = "aiohttp-3.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:1c182cb873bc91b411e184dab7a2b664d4fea2743df0e4d57402f7f3fa644bac"}, 1318 | {file = "aiohttp-3.8.1.tar.gz", hash = "sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578"}, 1319 | ] 1320 | aiosignal = [ 1321 | {file = "aiosignal-1.2.0-py3-none-any.whl", hash = "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a"}, 1322 | {file = "aiosignal-1.2.0.tar.gz", hash = "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"}, 1323 | ] 1324 | asttokens = [ 1325 | {file = "asttokens-2.0.5-py2.py3-none-any.whl", hash = "sha256:0844691e88552595a6f4a4281a9f7f79b8dd45ca4ccea82e5e05b4bbdb76705c"}, 1326 | {file = "asttokens-2.0.5.tar.gz", hash = "sha256:9a54c114f02c7a9480d56550932546a3f1fe71d8a02f1bc7ccd0ee3ee35cf4d5"}, 1327 | ] 1328 | async-timeout = [ 1329 | {file = "async-timeout-4.0.1.tar.gz", hash = "sha256:b930cb161a39042f9222f6efb7301399c87eeab394727ec5437924a36d6eef51"}, 1330 | {file = "async_timeout-4.0.1-py3-none-any.whl", hash = "sha256:a22c0b311af23337eb05fcf05a8b51c3ea53729d46fb5460af62bee033cec690"}, 1331 | ] 1332 | asynctest = [ 1333 | {file = "asynctest-0.13.0-py3-none-any.whl", hash = "sha256:5da6118a7e6d6b54d83a8f7197769d046922a44d2a99c21382f0a6e4fadae676"}, 1334 | {file = "asynctest-0.13.0.tar.gz", hash = "sha256:c27862842d15d83e6a34eb0b2866c323880eb3a75e4485b079ea11748fd77fac"}, 1335 | ] 1336 | atomicwrites = [ 1337 | {file = "atomicwrites-1.4.0-py2.py3-none-any.whl", hash = "sha256:6d1784dea7c0c8d4a5172b6c620f40b6e4cbfdf96d783691f2e1302a7b88e197"}, 1338 | {file = "atomicwrites-1.4.0.tar.gz", hash = "sha256:ae70396ad1a434f9c7046fd2dd196fc04b12f9e91ffb859164193be8b6168a7a"}, 1339 | ] 1340 | attrs = [ 1341 | {file = "attrs-21.2.0-py2.py3-none-any.whl", hash = "sha256:149e90d6d8ac20db7a955ad60cf0e6881a3f20d37096140088356da6c716b0b1"}, 1342 | {file = "attrs-21.2.0.tar.gz", hash = "sha256:ef6aaac3ca6cd92904cdd0d83f629a15f18053ec84e6432106f7a4d04ae4f5fb"}, 1343 | ] 1344 | base58 = [ 1345 | {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"}, 1346 | {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"}, 1347 | ] 1348 | bitarray = [ 1349 | {file = "bitarray-1.2.2.tar.gz", hash = "sha256:27a69ffcee3b868abab3ce8b17c69e02b63e722d4d64ffd91d659f81e9984954"}, 1350 | ] 1351 | black = [ 1352 | {file = "black-21.11b1-py3-none-any.whl", hash = "sha256:802c6c30b637b28645b7fde282ed2569c0cd777dbe493a41b6a03c1d903f99ac"}, 1353 | {file = "black-21.11b1.tar.gz", hash = "sha256:a042adbb18b3262faad5aff4e834ff186bb893f95ba3a8013f09de1e5569def2"}, 1354 | ] 1355 | cached-property = [ 1356 | {file = "cached-property-1.5.2.tar.gz", hash = "sha256:9fa5755838eecbb2d234c3aa390bd80fbd3ac6b6869109bfc1b499f7bd89a130"}, 1357 | {file = "cached_property-1.5.2-py2.py3-none-any.whl", hash = "sha256:df4f613cf7ad9a588cc381aaf4a512d26265ecebd5eb9e1ba12f1319eb85a6a0"}, 1358 | ] 1359 | certifi = [ 1360 | {file = "certifi-2021.10.8-py2.py3-none-any.whl", hash = "sha256:d62a0163eb4c2344ac042ab2bdf75399a71a2d8c7d47eac2e2ee91b9d6339569"}, 1361 | {file = "certifi-2021.10.8.tar.gz", hash = "sha256:78884e7c1d4b00ce3cea67b44566851c4343c120abd683433ce934a68ea58872"}, 1362 | ] 1363 | charset-normalizer = [ 1364 | {file = "charset-normalizer-2.0.9.tar.gz", hash = "sha256:b0b883e8e874edfdece9c28f314e3dd5badf067342e42fb162203335ae61aa2c"}, 1365 | {file = "charset_normalizer-2.0.9-py3-none-any.whl", hash = "sha256:1eecaa09422db5be9e29d7fc65664e6c33bd06f9ced7838578ba40d58bdf3721"}, 1366 | ] 1367 | click = [ 1368 | {file = "click-8.0.3-py3-none-any.whl", hash = "sha256:353f466495adaeb40b6b5f592f9f91cb22372351c84caeb068132442a4518ef3"}, 1369 | {file = "click-8.0.3.tar.gz", hash = "sha256:410e932b050f5eed773c4cda94de75971c89cdb3155a72a0831139a79e5ecb5b"}, 1370 | ] 1371 | colorama = [ 1372 | {file = "colorama-0.4.4-py2.py3-none-any.whl", hash = "sha256:9f47eda37229f68eee03b24b9748937c7dc3868f906e8ba69fbcbdd3bc5dc3e2"}, 1373 | {file = "colorama-0.4.4.tar.gz", hash = "sha256:5941b2b48a20143d2267e95b1c2a7603ce057ee39fd88e7329b0c292aa16869b"}, 1374 | ] 1375 | cytoolz = [ 1376 | {file = "cytoolz-0.11.2.tar.gz", hash = "sha256:ea23663153806edddce7e4153d1d407d62357c05120a4e8485bddf1bd5ab22b4"}, 1377 | ] 1378 | dataclassy = [ 1379 | {file = "dataclassy-0.11.1-py3-none-any.whl", hash = "sha256:bcb030d3d700cf9b1597042bbc8375b92773e6f68f65675a7071862c0ddb87f5"}, 1380 | {file = "dataclassy-0.11.1.tar.gz", hash = "sha256:ad6622cb91e644d13f68768558983fbc22c90a8ff7e355638485d18b9baf1198"}, 1381 | ] 1382 | eip712 = [ 1383 | {file = "eip712-0.1.0-py3-none-any.whl", hash = "sha256:8d91257bb94cc33b0115b2f65c71297b6e8b8f16ed49173313e13ac8931df4b1"}, 1384 | {file = "eip712-0.1.0.tar.gz", hash = "sha256:2655c8ab58a552bc2adf0b5a07465483fe24a27237e07c4384f36f16efafa418"}, 1385 | ] 1386 | eth-abi = [ 1387 | {file = "eth_abi-2.1.1-py3-none-any.whl", hash = "sha256:78df5d2758247a8f0766a7cfcea4575bcfe568c34a33e6d05a72c328a9040444"}, 1388 | {file = "eth_abi-2.1.1.tar.gz", hash = "sha256:4bb1d87bb6605823379b07f6c02c8af45df01a27cc85bd6abb7cf1446ce7d188"}, 1389 | ] 1390 | eth-account = [ 1391 | {file = "eth-account-0.5.6.tar.gz", hash = "sha256:baef80956e88af5643f8602e72aab6bcd91d8a9f71dd03c7a7f1145f5e6fd694"}, 1392 | {file = "eth_account-0.5.6-py3-none-any.whl", hash = "sha256:d324daf5a40bd5bdaf5ddaebfec71e7440b21f9ae4989921ce1253d63f8fe436"}, 1393 | ] 1394 | eth-brownie = [ 1395 | {file = "eth-brownie-1.17.2.tar.gz", hash = "sha256:97f0ebb85ee790a64aea66011c56137fc87d8d15a851c17b2734d02a2751fe98"}, 1396 | {file = "eth_brownie-1.17.2-py3-none-any.whl", hash = "sha256:32612a5a7057d9e7a929d90b4e1f76aabf9c79431f4e94dcfd6b72462da74886"}, 1397 | ] 1398 | eth-event = [ 1399 | {file = "eth-event-1.2.3.tar.gz", hash = "sha256:1589b583a9b0294f9aba4dedce8077685ced298393872f7f19bbf7d67ed9e49a"}, 1400 | {file = "eth_event-1.2.3-py3-none-any.whl", hash = "sha256:5d86d049eded86d0fb41538590487e1ccea2e1fa3e6d16ee2fc0952be7e5c59a"}, 1401 | ] 1402 | eth-hash = [ 1403 | {file = "eth-hash-0.3.2.tar.gz", hash = "sha256:3f40cecd5ead88184aa9550afc19d057f103728108c5102f592f8415949b5a76"}, 1404 | {file = "eth_hash-0.3.2-py3-none-any.whl", hash = "sha256:de7385148a8e0237ba1240cddbc06d53f56731140f8593bdb8429306f6b42271"}, 1405 | ] 1406 | eth-keyfile = [ 1407 | {file = "eth-keyfile-0.5.1.tar.gz", hash = "sha256:939540efb503380bc30d926833e6a12b22c6750de80feef3720d79e5a79de47d"}, 1408 | {file = "eth_keyfile-0.5.1-py3-none-any.whl", hash = "sha256:70d734af17efdf929a90bb95375f43522be4ed80c3b9e0a8bca575fb11cd1159"}, 1409 | ] 1410 | eth-keys = [ 1411 | {file = "eth-keys-0.3.3.tar.gz", hash = "sha256:a9a1e83e443bd369265b1a1b66dc30f6841bdbb3577ecd042e037b7b405b6cb0"}, 1412 | {file = "eth_keys-0.3.3-py3-none-any.whl", hash = "sha256:412dd5c9732b8e92af40c9c77597f4661c57eba3897aaa55e527af56a8c5ab47"}, 1413 | ] 1414 | eth-rlp = [ 1415 | {file = "eth-rlp-0.2.1.tar.gz", hash = "sha256:f016f980b0ed42ee7650ba6e4e4d3c4e9aa06d8b9c6825a36d3afe5aa0187a8b"}, 1416 | {file = "eth_rlp-0.2.1-py3-none-any.whl", hash = "sha256:cc389ef8d7b6f76a98f90bcdbff1b8684b3a78f53d47e871191b50d4d6aee5a1"}, 1417 | ] 1418 | eth-typing = [ 1419 | {file = "eth-typing-2.2.2.tar.gz", hash = "sha256:97ba0f83da7cf1d3668f6ed54983f21168076c552762bf5e06d4a20921877f3f"}, 1420 | {file = "eth_typing-2.2.2-py3-none-any.whl", hash = "sha256:1140c7592321dbf10d6663c46f7e43eb0e6410b011b03f14b3df3eb1f76aa9bb"}, 1421 | ] 1422 | eth-utils = [ 1423 | {file = "eth-utils-1.10.0.tar.gz", hash = "sha256:bf82762a46978714190b0370265a7148c954d3f0adaa31c6f085ea375e4c61af"}, 1424 | {file = "eth_utils-1.10.0-py3-none-any.whl", hash = "sha256:74240a8c6f652d085ed3c85f5f1654203d2f10ff9062f83b3bad0a12ff321c7a"}, 1425 | ] 1426 | execnet = [ 1427 | {file = "execnet-1.9.0-py2.py3-none-any.whl", hash = "sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142"}, 1428 | {file = "execnet-1.9.0.tar.gz", hash = "sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5"}, 1429 | ] 1430 | frozenlist = [ 1431 | {file = "frozenlist-1.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:977a1438d0e0d96573fd679d291a1542097ea9f4918a8b6494b06610dfeefbf9"}, 1432 | {file = "frozenlist-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a8d86547a5e98d9edd47c432f7a14b0c5592624b496ae9880fb6332f34af1edc"}, 1433 | {file = "frozenlist-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:181754275d5d32487431a0a29add4f897968b7157204bc1eaaf0a0ce80c5ba7d"}, 1434 | {file = "frozenlist-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5df31bb2b974f379d230a25943d9bf0d3bc666b4b0807394b131a28fca2b0e5f"}, 1435 | {file = "frozenlist-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4766632cd8a68e4f10f156a12c9acd7b1609941525569dd3636d859d79279ed3"}, 1436 | {file = "frozenlist-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16eef427c51cb1203a7c0ab59d1b8abccaba9a4f58c4bfca6ed278fc896dc193"}, 1437 | {file = "frozenlist-1.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:01d79515ed5aa3d699b05f6bdcf1fe9087d61d6b53882aa599a10853f0479c6c"}, 1438 | {file = "frozenlist-1.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:28e164722ea0df0cf6d48c4d5bdf3d19e87aaa6dfb39b0ba91153f224b912020"}, 1439 | {file = "frozenlist-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e63ad0beef6ece06475d29f47d1f2f29727805376e09850ebf64f90777962792"}, 1440 | {file = "frozenlist-1.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:41de4db9b9501679cf7cddc16d07ac0f10ef7eb58c525a1c8cbff43022bddca4"}, 1441 | {file = "frozenlist-1.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c6a9d84ee6427b65a81fc24e6ef589cb794009f5ca4150151251c062773e7ed2"}, 1442 | {file = "frozenlist-1.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:f5f3b2942c3b8b9bfe76b408bbaba3d3bb305ee3693e8b1d631fe0a0d4f93673"}, 1443 | {file = "frozenlist-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c98d3c04701773ad60d9545cd96df94d955329efc7743fdb96422c4b669c633b"}, 1444 | {file = "frozenlist-1.2.0-cp310-cp310-win32.whl", hash = "sha256:72cfbeab7a920ea9e74b19aa0afe3b4ad9c89471e3badc985d08756efa9b813b"}, 1445 | {file = "frozenlist-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:11ff401951b5ac8c0701a804f503d72c048173208490c54ebb8d7bb7c07a6d00"}, 1446 | {file = "frozenlist-1.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:b46f997d5ed6d222a863b02cdc9c299101ee27974d9bbb2fd1b3c8441311c408"}, 1447 | {file = "frozenlist-1.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:351686ca020d1bcd238596b1fa5c8efcbc21bffda9d0efe237aaa60348421e2a"}, 1448 | {file = "frozenlist-1.2.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bfbaa08cf1452acad9cb1c1d7b89394a41e712f88df522cea1a0f296b57782a0"}, 1449 | {file = "frozenlist-1.2.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2ae2f5e9fa10805fb1c9adbfefaaecedd9e31849434be462c3960a0139ed729"}, 1450 | {file = "frozenlist-1.2.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6790b8d96bbb74b7a6f4594b6f131bd23056c25f2aa5d816bd177d95245a30e3"}, 1451 | {file = "frozenlist-1.2.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:41f62468af1bd4e4b42b5508a3fe8cc46a693f0cdd0ca2f443f51f207893d837"}, 1452 | {file = "frozenlist-1.2.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:ec6cf345771cdb00791d271af9a0a6fbfc2b6dd44cb753f1eeaa256e21622adb"}, 1453 | {file = "frozenlist-1.2.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:14a5cef795ae3e28fb504b73e797c1800e9249f950e1c964bb6bdc8d77871161"}, 1454 | {file = "frozenlist-1.2.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:8b54cdd2fda15467b9b0bfa78cee2ddf6dbb4585ef23a16e14926f4b076dfae4"}, 1455 | {file = "frozenlist-1.2.0-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:f025f1d6825725b09c0038775acab9ae94264453a696cc797ce20c0769a7b367"}, 1456 | {file = "frozenlist-1.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:84e97f59211b5b9083a2e7a45abf91cfb441369e8bb6d1f5287382c1c526def3"}, 1457 | {file = "frozenlist-1.2.0-cp36-cp36m-win32.whl", hash = "sha256:c5328ed53fdb0a73c8a50105306a3bc013e5ca36cca714ec4f7bd31d38d8a97f"}, 1458 | {file = "frozenlist-1.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:9ade70aea559ca98f4b1b1e5650c45678052e76a8ab2f76d90f2ac64180215a2"}, 1459 | {file = "frozenlist-1.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0d3ffa8772464441b52489b985d46001e2853a3b082c655ec5fad9fb6a3d618"}, 1460 | {file = "frozenlist-1.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3457f8cf86deb6ce1ba67e120f1b0128fcba1332a180722756597253c465fc1d"}, 1461 | {file = "frozenlist-1.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5a72eecf37eface331636951249d878750db84034927c997d47f7f78a573b72b"}, 1462 | {file = "frozenlist-1.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:acc4614e8d1feb9f46dd829a8e771b8f5c4b1051365d02efb27a3229048ade8a"}, 1463 | {file = "frozenlist-1.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:87521e32e18a2223311afc2492ef2d99946337da0779ddcda77b82ee7319df59"}, 1464 | {file = "frozenlist-1.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b4c7665a17c3a5430edb663e4ad4e1ad457614d1b2f2b7f87052e2ef4fa45ca"}, 1465 | {file = "frozenlist-1.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ed58803563a8c87cf4c0771366cf0ad1aa265b6b0ae54cbbb53013480c7ad74d"}, 1466 | {file = "frozenlist-1.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:aa44c4740b4e23fcfa259e9dd52315d2b1770064cde9507457e4c4a65a04c397"}, 1467 | {file = "frozenlist-1.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:2de5b931701257d50771a032bba4e448ff958076380b049fd36ed8738fdb375b"}, 1468 | {file = "frozenlist-1.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:6e105013fa84623c057a4381dc8ea0361f4d682c11f3816cc80f49a1f3bc17c6"}, 1469 | {file = "frozenlist-1.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:705c184b77565955a99dc360f359e8249580c6b7eaa4dc0227caa861ef46b27a"}, 1470 | {file = "frozenlist-1.2.0-cp37-cp37m-win32.whl", hash = "sha256:a37594ad6356e50073fe4f60aa4187b97d15329f2138124d252a5a19c8553ea4"}, 1471 | {file = "frozenlist-1.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:25b358aaa7dba5891b05968dd539f5856d69f522b6de0bf34e61f133e077c1a4"}, 1472 | {file = "frozenlist-1.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:af2a51c8a381d76eabb76f228f565ed4c3701441ecec101dd18be70ebd483cfd"}, 1473 | {file = "frozenlist-1.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:82d22f6e6f2916e837c91c860140ef9947e31194c82aaeda843d6551cec92f19"}, 1474 | {file = "frozenlist-1.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1cfe6fef507f8bac40f009c85c7eddfed88c1c0d38c75e72fe10476cef94e10f"}, 1475 | {file = "frozenlist-1.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f602e380a5132880fa245c92030abb0fc6ff34e0c5500600366cedc6adb06a"}, 1476 | {file = "frozenlist-1.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ad065b2ebd09f32511ff2be35c5dfafee6192978b5a1e9d279a5c6e121e3b03"}, 1477 | {file = "frozenlist-1.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bc93f5f62df3bdc1f677066327fc81f92b83644852a31c6aa9b32c2dde86ea7d"}, 1478 | {file = "frozenlist-1.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:89fdfc84c6bf0bff2ff3170bb34ecba8a6911b260d318d377171429c4be18c73"}, 1479 | {file = "frozenlist-1.2.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:47b2848e464883d0bbdcd9493c67443e5e695a84694efff0476f9059b4cb6257"}, 1480 | {file = "frozenlist-1.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:4f52d0732e56906f8ddea4bd856192984650282424049c956857fed43697ea43"}, 1481 | {file = "frozenlist-1.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:16ef7dd5b7d17495404a2e7a49bac1bc13d6d20c16d11f4133c757dd94c4144c"}, 1482 | {file = "frozenlist-1.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:1cf63243bc5f5c19762943b0aa9e0d3fb3723d0c514d820a18a9b9a5ef864315"}, 1483 | {file = "frozenlist-1.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:54a1e09ab7a69f843cd28fefd2bcaf23edb9e3a8d7680032c8968b8ac934587d"}, 1484 | {file = "frozenlist-1.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:954b154a4533ef28bd3e83ffdf4eadf39deeda9e38fb8feaf066d6069885e034"}, 1485 | {file = "frozenlist-1.2.0-cp38-cp38-win32.whl", hash = "sha256:cb3957c39668d10e2b486acc85f94153520a23263b6401e8f59422ef65b9520d"}, 1486 | {file = "frozenlist-1.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:0a7c7cce70e41bc13d7d50f0e5dd175f14a4f1837a8549b0936ed0cbe6170bf9"}, 1487 | {file = "frozenlist-1.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4c457220468d734e3077580a3642b7f682f5fd9507f17ddf1029452450912cdc"}, 1488 | {file = "frozenlist-1.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e74f8b4d8677ebb4015ac01fcaf05f34e8a1f22775db1f304f497f2f88fdc697"}, 1489 | {file = "frozenlist-1.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fbd4844ff111449f3bbe20ba24fbb906b5b1c2384d0f3287c9f7da2354ce6d23"}, 1490 | {file = "frozenlist-1.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0081a623c886197ff8de9e635528fd7e6a387dccef432149e25c13946cb0cd0"}, 1491 | {file = "frozenlist-1.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9b6e21e5770df2dea06cb7b6323fbc008b13c4a4e3b52cb54685276479ee7676"}, 1492 | {file = "frozenlist-1.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:406aeb340613b4b559db78d86864485f68919b7141dec82aba24d1477fd2976f"}, 1493 | {file = "frozenlist-1.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:878ebe074839d649a1cdb03a61077d05760624f36d196884a5cafb12290e187b"}, 1494 | {file = "frozenlist-1.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:1fef737fd1388f9b93bba8808c5f63058113c10f4e3c0763ced68431773f72f9"}, 1495 | {file = "frozenlist-1.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4a495c3d513573b0b3f935bfa887a85d9ae09f0627cf47cad17d0cc9b9ba5c38"}, 1496 | {file = "frozenlist-1.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e7d0dd3e727c70c2680f5f09a0775525229809f1a35d8552b92ff10b2b14f2c2"}, 1497 | {file = "frozenlist-1.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:66a518731a21a55b7d3e087b430f1956a36793acc15912e2878431c7aec54210"}, 1498 | {file = "frozenlist-1.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:94728f97ddf603d23c8c3dd5cae2644fa12d33116e69f49b1644a71bb77b89ae"}, 1499 | {file = "frozenlist-1.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c1e8e9033d34c2c9e186e58279879d78c94dd365068a3607af33f2bc99357a53"}, 1500 | {file = "frozenlist-1.2.0-cp39-cp39-win32.whl", hash = "sha256:83334e84a290a158c0c4cc4d22e8c7cfe0bba5b76d37f1c2509dabd22acafe15"}, 1501 | {file = "frozenlist-1.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:735f386ec522e384f511614c01d2ef9cf799f051353876b4c6fb93ef67a6d1ee"}, 1502 | {file = "frozenlist-1.2.0.tar.gz", hash = "sha256:68201be60ac56aff972dc18085800b6ee07973c49103a8aba669dee3d71079de"}, 1503 | ] 1504 | hexbytes = [ 1505 | {file = "hexbytes-0.2.2-py3-none-any.whl", hash = "sha256:ef53c37ea9f316fff86fcb1df057b4c6ba454da348083e972031bbf7bc9c3acc"}, 1506 | {file = "hexbytes-0.2.2.tar.gz", hash = "sha256:a5881304d186e87578fb263a85317c808cf130e1d4b3d37d30142ab0f7898d03"}, 1507 | ] 1508 | hypothesis = [ 1509 | {file = "hypothesis-6.27.3-py3-none-any.whl", hash = "sha256:1c4568f40ca893c884330a1de0e0e5dcb1e867c60a56f414cb7bce97afc8dfec"}, 1510 | {file = "hypothesis-6.27.3.tar.gz", hash = "sha256:587da483bcc324494cec09cbbde3396c00da280c1732e387d7b5b89eff1aaff3"}, 1511 | ] 1512 | idna = [ 1513 | {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, 1514 | {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, 1515 | ] 1516 | importlib-metadata = [ 1517 | {file = "importlib_metadata-4.8.2-py3-none-any.whl", hash = "sha256:53ccfd5c134223e497627b9815d5030edf77d2ed573922f7a0b8f8bb81a1c100"}, 1518 | {file = "importlib_metadata-4.8.2.tar.gz", hash = "sha256:75bdec14c397f528724c1bfd9709d660b33a4d2e77387a3358f20b848bb5e5fb"}, 1519 | ] 1520 | inflection = [ 1521 | {file = "inflection-0.5.0-py2.py3-none-any.whl", hash = "sha256:88b101b2668a1d81d6d72d4c2018e53bc6c7fc544c987849da1c7f77545c3bc9"}, 1522 | {file = "inflection-0.5.0.tar.gz", hash = "sha256:f576e85132d34f5bf7df5183c2c6f94cfb32e528f53065345cf71329ba0b8924"}, 1523 | ] 1524 | iniconfig = [ 1525 | {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, 1526 | {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, 1527 | ] 1528 | ipfshttpclient = [ 1529 | {file = "ipfshttpclient-0.8.0a2-py3-none-any.whl", hash = "sha256:ce6bac0e3963c4ced74d7eb6978125362bb05bbe219088ca48f369ce14d3cc39"}, 1530 | {file = "ipfshttpclient-0.8.0a2.tar.gz", hash = "sha256:0d80e95ee60b02c7d414e79bf81a36fc3c8fbab74265475c52f70b2620812135"}, 1531 | ] 1532 | jsonschema = [ 1533 | {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, 1534 | {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, 1535 | ] 1536 | lazy-object-proxy = [ 1537 | {file = "lazy-object-proxy-1.6.0.tar.gz", hash = "sha256:489000d368377571c6f982fba6497f2aa13c6d1facc40660963da62f5c379726"}, 1538 | {file = "lazy_object_proxy-1.6.0-cp27-cp27m-macosx_10_14_x86_64.whl", hash = "sha256:c6938967f8528b3668622a9ed3b31d145fab161a32f5891ea7b84f6b790be05b"}, 1539 | {file = "lazy_object_proxy-1.6.0-cp27-cp27m-win32.whl", hash = "sha256:ebfd274dcd5133e0afae738e6d9da4323c3eb021b3e13052d8cbd0e457b1256e"}, 1540 | {file = "lazy_object_proxy-1.6.0-cp27-cp27m-win_amd64.whl", hash = "sha256:ed361bb83436f117f9917d282a456f9e5009ea12fd6de8742d1a4752c3017e93"}, 1541 | {file = "lazy_object_proxy-1.6.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:d900d949b707778696fdf01036f58c9876a0d8bfe116e8d220cfd4b15f14e741"}, 1542 | {file = "lazy_object_proxy-1.6.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5743a5ab42ae40caa8421b320ebf3a998f89c85cdc8376d6b2e00bd12bd1b587"}, 1543 | {file = "lazy_object_proxy-1.6.0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:bf34e368e8dd976423396555078def5cfc3039ebc6fc06d1ae2c5a65eebbcde4"}, 1544 | {file = "lazy_object_proxy-1.6.0-cp36-cp36m-win32.whl", hash = "sha256:b579f8acbf2bdd9ea200b1d5dea36abd93cabf56cf626ab9c744a432e15c815f"}, 1545 | {file = "lazy_object_proxy-1.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:4f60460e9f1eb632584c9685bccea152f4ac2130e299784dbaf9fae9f49891b3"}, 1546 | {file = "lazy_object_proxy-1.6.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:d7124f52f3bd259f510651450e18e0fd081ed82f3c08541dffc7b94b883aa981"}, 1547 | {file = "lazy_object_proxy-1.6.0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:22ddd618cefe54305df49e4c069fa65715be4ad0e78e8d252a33debf00f6ede2"}, 1548 | {file = "lazy_object_proxy-1.6.0-cp37-cp37m-win32.whl", hash = "sha256:9d397bf41caad3f489e10774667310d73cb9c4258e9aed94b9ec734b34b495fd"}, 1549 | {file = "lazy_object_proxy-1.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:24a5045889cc2729033b3e604d496c2b6f588c754f7a62027ad4437a7ecc4837"}, 1550 | {file = "lazy_object_proxy-1.6.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:17e0967ba374fc24141738c69736da90e94419338fd4c7c7bef01ee26b339653"}, 1551 | {file = "lazy_object_proxy-1.6.0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:410283732af311b51b837894fa2f24f2c0039aa7f220135192b38fcc42bd43d3"}, 1552 | {file = "lazy_object_proxy-1.6.0-cp38-cp38-win32.whl", hash = "sha256:85fb7608121fd5621cc4377a8961d0b32ccf84a7285b4f1d21988b2eae2868e8"}, 1553 | {file = "lazy_object_proxy-1.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:d1c2676e3d840852a2de7c7d5d76407c772927addff8d742b9808fe0afccebdf"}, 1554 | {file = "lazy_object_proxy-1.6.0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:b865b01a2e7f96db0c5d12cfea590f98d8c5ba64ad222300d93ce6ff9138bcad"}, 1555 | {file = "lazy_object_proxy-1.6.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:4732c765372bd78a2d6b2150a6e99d00a78ec963375f236979c0626b97ed8e43"}, 1556 | {file = "lazy_object_proxy-1.6.0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:9698110e36e2df951c7c36b6729e96429c9c32b3331989ef19976592c5f3c77a"}, 1557 | {file = "lazy_object_proxy-1.6.0-cp39-cp39-win32.whl", hash = "sha256:1fee665d2638491f4d6e55bd483e15ef21f6c8c2095f235fef72601021e64f61"}, 1558 | {file = "lazy_object_proxy-1.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:f5144c75445ae3ca2057faac03fda5a902eff196702b0a24daf1d6ce0650514b"}, 1559 | ] 1560 | lru-dict = [ 1561 | {file = "lru-dict-1.1.7.tar.gz", hash = "sha256:45b81f67d75341d4433abade799a47e9c42a9e22a118531dcb5e549864032d7c"}, 1562 | ] 1563 | multiaddr = [ 1564 | {file = "multiaddr-0.0.9-py2.py3-none-any.whl", hash = "sha256:5c0f862cbcf19aada2a899f80ef896ddb2e85614e0c8f04dd287c06c69dac95b"}, 1565 | {file = "multiaddr-0.0.9.tar.gz", hash = "sha256:30b2695189edc3d5b90f1c303abb8f02d963a3a4edf2e7178b975eb417ab0ecf"}, 1566 | ] 1567 | multidict = [ 1568 | {file = "multidict-5.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3822c5894c72e3b35aae9909bef66ec83e44522faf767c0ad39e0e2de11d3b55"}, 1569 | {file = "multidict-5.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:28e6d883acd8674887d7edc896b91751dc2d8e87fbdca8359591a13872799e4e"}, 1570 | {file = "multidict-5.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b61f85101ef08cbbc37846ac0e43f027f7844f3fade9b7f6dd087178caedeee7"}, 1571 | {file = "multidict-5.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9b668c065968c5979fe6b6fa6760bb6ab9aeb94b75b73c0a9c1acf6393ac3bf"}, 1572 | {file = "multidict-5.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:517d75522b7b18a3385726b54a081afd425d4f41144a5399e5abd97ccafdf36b"}, 1573 | {file = "multidict-5.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1b4ac3ba7a97b35a5ccf34f41b5a8642a01d1e55454b699e5e8e7a99b5a3acf5"}, 1574 | {file = "multidict-5.2.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:df23c83398715b26ab09574217ca21e14694917a0c857e356fd39e1c64f8283f"}, 1575 | {file = "multidict-5.2.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e58a9b5cc96e014ddf93c2227cbdeca94b56a7eb77300205d6e4001805391747"}, 1576 | {file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:f76440e480c3b2ca7f843ff8a48dc82446b86ed4930552d736c0bac507498a52"}, 1577 | {file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cfde464ca4af42a629648c0b0d79b8f295cf5b695412451716531d6916461628"}, 1578 | {file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:0fed465af2e0eb6357ba95795d003ac0bdb546305cc2366b1fc8f0ad67cc3fda"}, 1579 | {file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:b70913cbf2e14275013be98a06ef4b412329fe7b4f83d64eb70dce8269ed1e1a"}, 1580 | {file = "multidict-5.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a5635bcf1b75f0f6ef3c8a1ad07b500104a971e38d3683167b9454cb6465ac86"}, 1581 | {file = "multidict-5.2.0-cp310-cp310-win32.whl", hash = "sha256:77f0fb7200cc7dedda7a60912f2059086e29ff67cefbc58d2506638c1a9132d7"}, 1582 | {file = "multidict-5.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:9416cf11bcd73c861267e88aea71e9fcc35302b3943e45e1dbb4317f91a4b34f"}, 1583 | {file = "multidict-5.2.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:fd77c8f3cba815aa69cb97ee2b2ef385c7c12ada9c734b0f3b32e26bb88bbf1d"}, 1584 | {file = "multidict-5.2.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:98ec9aea6223adf46999f22e2c0ab6cf33f5914be604a404f658386a8f1fba37"}, 1585 | {file = "multidict-5.2.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e5283c0a00f48e8cafcecadebfa0ed1dac8b39e295c7248c44c665c16dc1138b"}, 1586 | {file = "multidict-5.2.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5f79c19c6420962eb17c7e48878a03053b7ccd7b69f389d5831c0a4a7f1ac0a1"}, 1587 | {file = "multidict-5.2.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:e4a67f1080123de76e4e97a18d10350df6a7182e243312426d508712e99988d4"}, 1588 | {file = "multidict-5.2.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:94b117e27efd8e08b4046c57461d5a114d26b40824995a2eb58372b94f9fca02"}, 1589 | {file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2e77282fd1d677c313ffcaddfec236bf23f273c4fba7cdf198108f5940ae10f5"}, 1590 | {file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:116347c63ba049c1ea56e157fa8aa6edaf5e92925c9b64f3da7769bdfa012858"}, 1591 | {file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:dc3a866cf6c13d59a01878cd806f219340f3e82eed514485e094321f24900677"}, 1592 | {file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ac42181292099d91217a82e3fa3ce0e0ddf3a74fd891b7c2b347a7f5aa0edded"}, 1593 | {file = "multidict-5.2.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:f0bb0973f42ffcb5e3537548e0767079420aefd94ba990b61cf7bb8d47f4916d"}, 1594 | {file = "multidict-5.2.0-cp36-cp36m-win32.whl", hash = "sha256:ea21d4d5104b4f840b91d9dc8cbc832aba9612121eaba503e54eaab1ad140eb9"}, 1595 | {file = "multidict-5.2.0-cp36-cp36m-win_amd64.whl", hash = "sha256:e6453f3cbeb78440747096f239d282cc57a2997a16b5197c9bc839099e1633d0"}, 1596 | {file = "multidict-5.2.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:d3def943bfd5f1c47d51fd324df1e806d8da1f8e105cc7f1c76a1daf0f7e17b0"}, 1597 | {file = "multidict-5.2.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35591729668a303a02b06e8dba0eb8140c4a1bfd4c4b3209a436a02a5ac1de11"}, 1598 | {file = "multidict-5.2.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ce8cacda0b679ebc25624d5de66c705bc53dcc7c6f02a7fb0f3ca5e227d80422"}, 1599 | {file = "multidict-5.2.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:baf1856fab8212bf35230c019cde7c641887e3fc08cadd39d32a421a30151ea3"}, 1600 | {file = "multidict-5.2.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:a43616aec0f0d53c411582c451f5d3e1123a68cc7b3475d6f7d97a626f8ff90d"}, 1601 | {file = "multidict-5.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25cbd39a9029b409167aa0a20d8a17f502d43f2efebfe9e3ac019fe6796c59ac"}, 1602 | {file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a2cbcfbea6dc776782a444db819c8b78afe4db597211298dd8b2222f73e9cd0"}, 1603 | {file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3d2d7d1fff8e09d99354c04c3fd5b560fb04639fd45926b34e27cfdec678a704"}, 1604 | {file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:a37e9a68349f6abe24130846e2f1d2e38f7ddab30b81b754e5a1fde32f782b23"}, 1605 | {file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:637c1896497ff19e1ee27c1c2c2ddaa9f2d134bbb5e0c52254361ea20486418d"}, 1606 | {file = "multidict-5.2.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:9815765f9dcda04921ba467957be543423e5ec6a1136135d84f2ae092c50d87b"}, 1607 | {file = "multidict-5.2.0-cp37-cp37m-win32.whl", hash = "sha256:8b911d74acdc1fe2941e59b4f1a278a330e9c34c6c8ca1ee21264c51ec9b67ef"}, 1608 | {file = "multidict-5.2.0-cp37-cp37m-win_amd64.whl", hash = "sha256:380b868f55f63d048a25931a1632818f90e4be71d2081c2338fcf656d299949a"}, 1609 | {file = "multidict-5.2.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e7d81ce5744757d2f05fc41896e3b2ae0458464b14b5a2c1e87a6a9d69aefaa8"}, 1610 | {file = "multidict-5.2.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2d1d55cdf706ddc62822d394d1df53573d32a7a07d4f099470d3cb9323b721b6"}, 1611 | {file = "multidict-5.2.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a4771d0d0ac9d9fe9e24e33bed482a13dfc1256d008d101485fe460359476065"}, 1612 | {file = "multidict-5.2.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da7d57ea65744d249427793c042094c4016789eb2562576fb831870f9c878d9e"}, 1613 | {file = "multidict-5.2.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdd68778f96216596218b4e8882944d24a634d984ee1a5a049b300377878fa7c"}, 1614 | {file = "multidict-5.2.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ecc99bce8ee42dcad15848c7885197d26841cb24fa2ee6e89d23b8993c871c64"}, 1615 | {file = "multidict-5.2.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:067150fad08e6f2dd91a650c7a49ba65085303fcc3decbd64a57dc13a2733031"}, 1616 | {file = "multidict-5.2.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:78c106b2b506b4d895ddc801ff509f941119394b89c9115580014127414e6c2d"}, 1617 | {file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e6c4fa1ec16e01e292315ba76eb1d012c025b99d22896bd14a66628b245e3e01"}, 1618 | {file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:b227345e4186809d31f22087d0265655114af7cda442ecaf72246275865bebe4"}, 1619 | {file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:06560fbdcf22c9387100979e65b26fba0816c162b888cb65b845d3def7a54c9b"}, 1620 | {file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:7878b61c867fb2df7a95e44b316f88d5a3742390c99dfba6c557a21b30180cac"}, 1621 | {file = "multidict-5.2.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:246145bff76cc4b19310f0ad28bd0769b940c2a49fc601b86bfd150cbd72bb22"}, 1622 | {file = "multidict-5.2.0-cp38-cp38-win32.whl", hash = "sha256:c30ac9f562106cd9e8071c23949a067b10211917fdcb75b4718cf5775356a940"}, 1623 | {file = "multidict-5.2.0-cp38-cp38-win_amd64.whl", hash = "sha256:f19001e790013ed580abfde2a4465388950728861b52f0da73e8e8a9418533c0"}, 1624 | {file = "multidict-5.2.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c1ff762e2ee126e6f1258650ac641e2b8e1f3d927a925aafcfde943b77a36d24"}, 1625 | {file = "multidict-5.2.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:bd6c9c50bf2ad3f0448edaa1a3b55b2e6866ef8feca5d8dbec10ec7c94371d21"}, 1626 | {file = "multidict-5.2.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fc66d4016f6e50ed36fb39cd287a3878ffcebfa90008535c62e0e90a7ab713ae"}, 1627 | {file = "multidict-5.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9acb76d5f3dd9421874923da2ed1e76041cb51b9337fd7f507edde1d86535d6"}, 1628 | {file = "multidict-5.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dfc924a7e946dd3c6360e50e8f750d51e3ef5395c95dc054bc9eab0f70df4f9c"}, 1629 | {file = "multidict-5.2.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:32fdba7333eb2351fee2596b756d730d62b5827d5e1ab2f84e6cbb287cc67fe0"}, 1630 | {file = "multidict-5.2.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b9aad49466b8d828b96b9e3630006234879c8d3e2b0a9d99219b3121bc5cdb17"}, 1631 | {file = "multidict-5.2.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:93de39267c4c676c9ebb2057e98a8138bade0d806aad4d864322eee0803140a0"}, 1632 | {file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f9bef5cff994ca3026fcc90680e326d1a19df9841c5e3d224076407cc21471a1"}, 1633 | {file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:5f841c4f14331fd1e36cbf3336ed7be2cb2a8f110ce40ea253e5573387db7621"}, 1634 | {file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:38ba256ee9b310da6a1a0f013ef4e422fca30a685bcbec86a969bd520504e341"}, 1635 | {file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:3bc3b1621b979621cee9f7b09f024ec76ec03cc365e638126a056317470bde1b"}, 1636 | {file = "multidict-5.2.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:6ee908c070020d682e9b42c8f621e8bb10c767d04416e2ebe44e37d0f44d9ad5"}, 1637 | {file = "multidict-5.2.0-cp39-cp39-win32.whl", hash = "sha256:1c7976cd1c157fa7ba5456ae5d31ccdf1479680dc9b8d8aa28afabc370df42b8"}, 1638 | {file = "multidict-5.2.0-cp39-cp39-win_amd64.whl", hash = "sha256:c9631c642e08b9fff1c6255487e62971d8b8e821808ddd013d8ac058087591ac"}, 1639 | {file = "multidict-5.2.0.tar.gz", hash = "sha256:0dd1c93edb444b33ba2274b66f63def8a327d607c6c790772f448a53b6ea59ce"}, 1640 | ] 1641 | mypy = [ 1642 | {file = "mypy-0.931-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:3c5b42d0815e15518b1f0990cff7a705805961613e701db60387e6fb663fe78a"}, 1643 | {file = "mypy-0.931-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c89702cac5b302f0c5d33b172d2b55b5df2bede3344a2fbed99ff96bddb2cf00"}, 1644 | {file = "mypy-0.931-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:300717a07ad09525401a508ef5d105e6b56646f7942eb92715a1c8d610149714"}, 1645 | {file = "mypy-0.931-cp310-cp310-win_amd64.whl", hash = "sha256:7b3f6f557ba4afc7f2ce6d3215d5db279bcf120b3cfd0add20a5d4f4abdae5bc"}, 1646 | {file = "mypy-0.931-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:1bf752559797c897cdd2c65f7b60c2b6969ffe458417b8d947b8340cc9cec08d"}, 1647 | {file = "mypy-0.931-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4365c60266b95a3f216a3047f1d8e3f895da6c7402e9e1ddfab96393122cc58d"}, 1648 | {file = "mypy-0.931-cp36-cp36m-win_amd64.whl", hash = "sha256:1b65714dc296a7991000b6ee59a35b3f550e0073411ac9d3202f6516621ba66c"}, 1649 | {file = "mypy-0.931-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e839191b8da5b4e5d805f940537efcaa13ea5dd98418f06dc585d2891d228cf0"}, 1650 | {file = "mypy-0.931-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:50c7346a46dc76a4ed88f3277d4959de8a2bd0a0fa47fa87a4cde36fe247ac05"}, 1651 | {file = "mypy-0.931-cp37-cp37m-win_amd64.whl", hash = "sha256:d8f1ff62f7a879c9fe5917b3f9eb93a79b78aad47b533911b853a757223f72e7"}, 1652 | {file = "mypy-0.931-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f9fe20d0872b26c4bba1c1be02c5340de1019530302cf2dcc85c7f9fc3252ae0"}, 1653 | {file = "mypy-0.931-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:1b06268df7eb53a8feea99cbfff77a6e2b205e70bf31743e786678ef87ee8069"}, 1654 | {file = "mypy-0.931-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8c11003aaeaf7cc2d0f1bc101c1cc9454ec4cc9cb825aef3cafff8a5fdf4c799"}, 1655 | {file = "mypy-0.931-cp38-cp38-win_amd64.whl", hash = "sha256:d9d2b84b2007cea426e327d2483238f040c49405a6bf4074f605f0156c91a47a"}, 1656 | {file = "mypy-0.931-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ff3bf387c14c805ab1388185dd22d6b210824e164d4bb324b195ff34e322d166"}, 1657 | {file = "mypy-0.931-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5b56154f8c09427bae082b32275a21f500b24d93c88d69a5e82f3978018a0266"}, 1658 | {file = "mypy-0.931-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8ca7f8c4b1584d63c9a0f827c37ba7a47226c19a23a753d52e5b5eddb201afcd"}, 1659 | {file = "mypy-0.931-cp39-cp39-win_amd64.whl", hash = "sha256:74f7eccbfd436abe9c352ad9fb65872cc0f1f0a868e9d9c44db0893440f0c697"}, 1660 | {file = "mypy-0.931-py3-none-any.whl", hash = "sha256:1171f2e0859cfff2d366da2c7092b06130f232c636a3f7301e3feb8b41f6377d"}, 1661 | {file = "mypy-0.931.tar.gz", hash = "sha256:0038b21890867793581e4cb0d810829f5fd4441aa75796b53033af3aa30430ce"}, 1662 | ] 1663 | mypy-extensions = [ 1664 | {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, 1665 | {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, 1666 | ] 1667 | mythx-models = [ 1668 | {file = "mythx-models-1.9.1.tar.gz", hash = "sha256:037090723c5006df25656473db7875469e11d9d03478d41bb8d1f1517c1c474c"}, 1669 | {file = "mythx_models-1.9.1-py2.py3-none-any.whl", hash = "sha256:4b9133c2ee41f97c03545bb480a16f3388b10557c5622aeada7ce79aaadcf7de"}, 1670 | ] 1671 | netaddr = [ 1672 | {file = "netaddr-0.8.0-py2.py3-none-any.whl", hash = "sha256:9666d0232c32d2656e5e5f8d735f58fd6c7457ce52fc21c98d45f2af78f990ac"}, 1673 | {file = "netaddr-0.8.0.tar.gz", hash = "sha256:d6cc57c7a07b1d9d2e917aa8b36ae8ce61c35ba3fcd1b83ca31c5a0ee2b5a243"}, 1674 | ] 1675 | packaging = [ 1676 | {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, 1677 | {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, 1678 | ] 1679 | parsimonious = [ 1680 | {file = "parsimonious-0.8.1.tar.gz", hash = "sha256:3add338892d580e0cb3b1a39e4a1b427ff9f687858fdd61097053742391a9f6b"}, 1681 | ] 1682 | pathspec = [ 1683 | {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, 1684 | {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, 1685 | ] 1686 | platformdirs = [ 1687 | {file = "platformdirs-2.4.0-py3-none-any.whl", hash = "sha256:8868bbe3c3c80d42f20156f22e7131d2fb321f5bc86a2a345375c6481a67021d"}, 1688 | {file = "platformdirs-2.4.0.tar.gz", hash = "sha256:367a5e80b3d04d2428ffa76d33f124cf11e8fff2acdaa9b43d545f5c7d661ef2"}, 1689 | ] 1690 | pluggy = [ 1691 | {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, 1692 | {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, 1693 | ] 1694 | prompt-toolkit = [ 1695 | {file = "prompt_toolkit-3.0.23-py3-none-any.whl", hash = "sha256:5f29d62cb7a0ecacfa3d8ceea05a63cd22500543472d64298fc06ddda906b25d"}, 1696 | {file = "prompt_toolkit-3.0.23.tar.gz", hash = "sha256:7053aba00895473cb357819358ef33f11aa97e4ac83d38efb123e5649ceeecaf"}, 1697 | ] 1698 | protobuf = [ 1699 | {file = "protobuf-3.19.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d80f80eb175bf5f1169139c2e0c5ada98b1c098e2b3c3736667f28cbbea39fc8"}, 1700 | {file = "protobuf-3.19.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:a529e7df52204565bcd33738a7a5f288f3d2d37d86caa5d78c458fa5fabbd54d"}, 1701 | {file = "protobuf-3.19.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:28ccea56d4dc38d35cd70c43c2da2f40ac0be0a355ef882242e8586c6d66666f"}, 1702 | {file = "protobuf-3.19.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:8b30a7de128c46b5ecb343917d9fa737612a6e8280f440874e5cc2ba0d79b8f6"}, 1703 | {file = "protobuf-3.19.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5935c8ce02e3d89c7900140a8a42b35bc037ec07a6aeb61cc108be8d3c9438a6"}, 1704 | {file = "protobuf-3.19.1-cp36-cp36m-win32.whl", hash = "sha256:74f33edeb4f3b7ed13d567881da8e5a92a72b36495d57d696c2ea1ae0cfee80c"}, 1705 | {file = "protobuf-3.19.1-cp36-cp36m-win_amd64.whl", hash = "sha256:038daf4fa38a7e818dd61f51f22588d61755160a98db087a046f80d66b855942"}, 1706 | {file = "protobuf-3.19.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e51561d72efd5bd5c91490af1f13e32bcba8dab4643761eb7de3ce18e64a853"}, 1707 | {file = "protobuf-3.19.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:6e8ea9173403219239cdfd8d946ed101f2ab6ecc025b0fda0c6c713c35c9981d"}, 1708 | {file = "protobuf-3.19.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db3532d9f7a6ebbe2392041350437953b6d7a792de10e629c1e4f5a6b1fe1ac6"}, 1709 | {file = "protobuf-3.19.1-cp37-cp37m-win32.whl", hash = "sha256:615b426a177780ce381ecd212edc1e0f70db8557ed72560b82096bd36b01bc04"}, 1710 | {file = "protobuf-3.19.1-cp37-cp37m-win_amd64.whl", hash = "sha256:d8919368410110633717c406ab5c97e8df5ce93020cfcf3012834f28b1fab1ea"}, 1711 | {file = "protobuf-3.19.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:71b0250b0cfb738442d60cab68abc166de43411f2a4f791d31378590bfb71bd7"}, 1712 | {file = "protobuf-3.19.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:3cd0458870ea7d1c58e948ac8078f6ba8a7ecc44a57e03032ed066c5bb318089"}, 1713 | {file = "protobuf-3.19.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655264ed0d0efe47a523e2255fc1106a22f6faab7cc46cfe99b5bae085c2a13e"}, 1714 | {file = "protobuf-3.19.1-cp38-cp38-win32.whl", hash = "sha256:b691d996c6d0984947c4cf8b7ae2fe372d99b32821d0584f0b90277aa36982d3"}, 1715 | {file = "protobuf-3.19.1-cp38-cp38-win_amd64.whl", hash = "sha256:e7e8d2c20921f8da0dea277dfefc6abac05903ceac8e72839b2da519db69206b"}, 1716 | {file = "protobuf-3.19.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fd390367fc211cc0ffcf3a9e149dfeca78fecc62adb911371db0cec5c8b7472d"}, 1717 | {file = "protobuf-3.19.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d83e1ef8cb74009bebee3e61cc84b1c9cd04935b72bca0cbc83217d140424995"}, 1718 | {file = "protobuf-3.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:36d90676d6f426718463fe382ec6274909337ca6319d375eebd2044e6c6ac560"}, 1719 | {file = "protobuf-3.19.1-cp39-cp39-win32.whl", hash = "sha256:e7b24c11df36ee8e0c085e5b0dc560289e4b58804746fb487287dda51410f1e2"}, 1720 | {file = "protobuf-3.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:77d2fadcf369b3f22859ab25bd12bb8e98fb11e05d9ff9b7cd45b711c719c002"}, 1721 | {file = "protobuf-3.19.1-py2.py3-none-any.whl", hash = "sha256:e813b1c9006b6399308e917ac5d298f345d95bb31f46f02b60cd92970a9afa17"}, 1722 | {file = "protobuf-3.19.1.tar.gz", hash = "sha256:62a8e4baa9cb9e064eb62d1002eca820857ab2138440cb4b3ea4243830f94ca7"}, 1723 | ] 1724 | psutil = [ 1725 | {file = "psutil-5.8.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0066a82f7b1b37d334e68697faba68e5ad5e858279fd6351c8ca6024e8d6ba64"}, 1726 | {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:0ae6f386d8d297177fd288be6e8d1afc05966878704dad9847719650e44fc49c"}, 1727 | {file = "psutil-5.8.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:12d844996d6c2b1d3881cfa6fa201fd635971869a9da945cf6756105af73d2df"}, 1728 | {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:02b8292609b1f7fcb34173b25e48d0da8667bc85f81d7476584d889c6e0f2131"}, 1729 | {file = "psutil-5.8.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6ffe81843131ee0ffa02c317186ed1e759a145267d54fdef1bc4ea5f5931ab60"}, 1730 | {file = "psutil-5.8.0-cp27-none-win32.whl", hash = "sha256:ea313bb02e5e25224e518e4352af4bf5e062755160f77e4b1767dd5ccb65f876"}, 1731 | {file = "psutil-5.8.0-cp27-none-win_amd64.whl", hash = "sha256:5da29e394bdedd9144c7331192e20c1f79283fb03b06e6abd3a8ae45ffecee65"}, 1732 | {file = "psutil-5.8.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:74fb2557d1430fff18ff0d72613c5ca30c45cdbfcddd6a5773e9fc1fe9364be8"}, 1733 | {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:74f2d0be88db96ada78756cb3a3e1b107ce8ab79f65aa885f76d7664e56928f6"}, 1734 | {file = "psutil-5.8.0-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:99de3e8739258b3c3e8669cb9757c9a861b2a25ad0955f8e53ac662d66de61ac"}, 1735 | {file = "psutil-5.8.0-cp36-cp36m-win32.whl", hash = "sha256:36b3b6c9e2a34b7d7fbae330a85bf72c30b1c827a4366a07443fc4b6270449e2"}, 1736 | {file = "psutil-5.8.0-cp36-cp36m-win_amd64.whl", hash = "sha256:52de075468cd394ac98c66f9ca33b2f54ae1d9bff1ef6b67a212ee8f639ec06d"}, 1737 | {file = "psutil-5.8.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c6a5fd10ce6b6344e616cf01cc5b849fa8103fbb5ba507b6b2dee4c11e84c935"}, 1738 | {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:61f05864b42fedc0771d6d8e49c35f07efd209ade09a5afe6a5059e7bb7bf83d"}, 1739 | {file = "psutil-5.8.0-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:0dd4465a039d343925cdc29023bb6960ccf4e74a65ad53e768403746a9207023"}, 1740 | {file = "psutil-5.8.0-cp37-cp37m-win32.whl", hash = "sha256:1bff0d07e76114ec24ee32e7f7f8d0c4b0514b3fae93e3d2aaafd65d22502394"}, 1741 | {file = "psutil-5.8.0-cp37-cp37m-win_amd64.whl", hash = "sha256:fcc01e900c1d7bee2a37e5d6e4f9194760a93597c97fee89c4ae51701de03563"}, 1742 | {file = "psutil-5.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6223d07a1ae93f86451d0198a0c361032c4c93ebd4bf6d25e2fb3edfad9571ef"}, 1743 | {file = "psutil-5.8.0-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:d225cd8319aa1d3c85bf195c4e07d17d3cd68636b8fc97e6cf198f782f99af28"}, 1744 | {file = "psutil-5.8.0-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:28ff7c95293ae74bf1ca1a79e8805fcde005c18a122ca983abf676ea3466362b"}, 1745 | {file = "psutil-5.8.0-cp38-cp38-win32.whl", hash = "sha256:ce8b867423291cb65cfc6d9c4955ee9bfc1e21fe03bb50e177f2b957f1c2469d"}, 1746 | {file = "psutil-5.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:90f31c34d25b1b3ed6c40cdd34ff122b1887a825297c017e4cbd6796dd8b672d"}, 1747 | {file = "psutil-5.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6323d5d845c2785efb20aded4726636546b26d3b577aded22492908f7c1bdda7"}, 1748 | {file = "psutil-5.8.0-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:245b5509968ac0bd179287d91210cd3f37add77dad385ef238b275bad35fa1c4"}, 1749 | {file = "psutil-5.8.0-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:90d4091c2d30ddd0a03e0b97e6a33a48628469b99585e2ad6bf21f17423b112b"}, 1750 | {file = "psutil-5.8.0-cp39-cp39-win32.whl", hash = "sha256:ea372bcc129394485824ae3e3ddabe67dc0b118d262c568b4d2602a7070afdb0"}, 1751 | {file = "psutil-5.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:f4634b033faf0d968bb9220dd1c793b897ab7f1189956e1aa9eae752527127d3"}, 1752 | {file = "psutil-5.8.0.tar.gz", hash = "sha256:0c9ccb99ab76025f2f0bbecf341d4656e9c1351db8cc8a03ccd62e318ab4b5c6"}, 1753 | ] 1754 | py = [ 1755 | {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, 1756 | {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, 1757 | ] 1758 | py-solc-ast = [ 1759 | {file = "py-solc-ast-1.2.9.tar.gz", hash = "sha256:5a5c3bb1998de32eed4b793ebbf2f14f1fd5c681cf8b62af6b8f9f76b805164d"}, 1760 | {file = "py_solc_ast-1.2.9-py3-none-any.whl", hash = "sha256:f636217ef77bbe0f9c87a71af2f6cc9577f6301aa2ffb9af119f4c8fa8522b2d"}, 1761 | ] 1762 | py-solc-x = [ 1763 | {file = "py-solc-x-1.1.1.tar.gz", hash = "sha256:d8b0bd2b04f47cff6e92181739d9e94e41b2d62f056900761c797fa5babc76b6"}, 1764 | {file = "py_solc_x-1.1.1-py3-none-any.whl", hash = "sha256:8f5caa4f54e227fc301e2e4c8aa868e869c2bc0c6636aa9e8115f8414bb891f9"}, 1765 | ] 1766 | pycryptodome = [ 1767 | {file = "pycryptodome-3.12.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:90ad3381ccdc6a24cc2841e295706a168f32abefe64c679695712acac71fd5da"}, 1768 | {file = "pycryptodome-3.12.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:e80f7469b0b3ea0f694230477d8501dc5a30a717e94fddd4821e6721f3053eae"}, 1769 | {file = "pycryptodome-3.12.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:b91404611767a7485837a6f1fd20cf9a5ae0ad362040a022cd65827ecb1b0d00"}, 1770 | {file = "pycryptodome-3.12.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:db66ccda65d5d20c17b00768e462a86f6f540f9aea8419a7f76cc7d9effd82cd"}, 1771 | {file = "pycryptodome-3.12.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:dc88355c4b261ed259268e65705b28b44d99570337694d593f06e3b1698eaaf3"}, 1772 | {file = "pycryptodome-3.12.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:6f8f5b7b53516da7511951910ab458e799173722c91fea54e2ba2f56d102e4aa"}, 1773 | {file = "pycryptodome-3.12.0-cp27-cp27m-win32.whl", hash = "sha256:93acad54a72d81253242eb0a15064be559ec9d989e5173286dc21cad19f01765"}, 1774 | {file = "pycryptodome-3.12.0-cp27-cp27m-win_amd64.whl", hash = "sha256:5a8c24d39d4a237dbfe181ea6593792bf9b5582c7fcfa7b8e0e12fda5eec07af"}, 1775 | {file = "pycryptodome-3.12.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:32d15da81959faea6cbed95df2bb44f7f796211c110cf90b5ad3b2aeeb97fc8e"}, 1776 | {file = "pycryptodome-3.12.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:aed7eb4b64c600fbc5e6d4238991ad1b4179a558401f203d1fcbd24883748982"}, 1777 | {file = "pycryptodome-3.12.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:341c6bbf932c406b4f3ee2372e8589b67ac0cf4e99e7dc081440f43a3cde9f0f"}, 1778 | {file = "pycryptodome-3.12.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:de0b711d673904dd6c65307ead36cb76622365a393569bf880895cba21195b7a"}, 1779 | {file = "pycryptodome-3.12.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:3558616f45d8584aee3eba27559bc6fd0ba9be6c076610ed3cc62bd5229ffdc3"}, 1780 | {file = "pycryptodome-3.12.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:a78e4324e566b5fbc2b51e9240950d82fa9e1c7eb77acdf27f58712f65622c1d"}, 1781 | {file = "pycryptodome-3.12.0-cp35-abi3-manylinux1_i686.whl", hash = "sha256:3f2f3dd596c6128d91314e60a6bcf4344610ef0e97f4ae4dd1770f86dd0748d8"}, 1782 | {file = "pycryptodome-3.12.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:e05f994f30f1cda3cbe57441f41220d16731cf99d868bb02a8f6484c454c206b"}, 1783 | {file = "pycryptodome-3.12.0-cp35-abi3-manylinux2010_i686.whl", hash = "sha256:4cded12e13785bbdf4ba1ff5fb9d261cd98162145f869e4fbc4a4b9083392f0b"}, 1784 | {file = "pycryptodome-3.12.0-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:1181c90d1a6aee68a84826825548d0db1b58d8541101f908d779d601d1690586"}, 1785 | {file = "pycryptodome-3.12.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:6bb0d340c93bcb674ea8899e2f6408ec64c6c21731a59481332b4b2a8143cc60"}, 1786 | {file = "pycryptodome-3.12.0-cp35-abi3-win32.whl", hash = "sha256:39da5807aa1ff820799c928f745f89432908bf6624b9e981d2d7f9e55d91b860"}, 1787 | {file = "pycryptodome-3.12.0-cp35-abi3-win_amd64.whl", hash = "sha256:212c7f7fe11cad9275fbcff50ca977f1c6643f13560d081e7b0f70596df447b8"}, 1788 | {file = "pycryptodome-3.12.0-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:b07a4238465eb8c65dd5df2ab8ba6df127e412293c0ed7656c003336f557a100"}, 1789 | {file = "pycryptodome-3.12.0-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:a6e1bcd9d5855f1a3c0f8d585f44c81b08f39a02754007f374fb8db9605ba29c"}, 1790 | {file = "pycryptodome-3.12.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:aceb1d217c3a025fb963849071446cf3aca1353282fe1c3cb7bd7339a4d47947"}, 1791 | {file = "pycryptodome-3.12.0-pp27-pypy_73-win32.whl", hash = "sha256:f699360ae285fcae9c8f53ca6acf33796025a82bb0ccd7c1c551b04c1726def3"}, 1792 | {file = "pycryptodome-3.12.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d845c587ceb82ac7cbac7d0bf8c62a1a0fe7190b028b322da5ca65f6e5a18b9e"}, 1793 | {file = "pycryptodome-3.12.0-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:d8083de50f6dec56c3c6f270fb193590999583a1b27c9c75bc0b5cac22d438cc"}, 1794 | {file = "pycryptodome-3.12.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:9ea2f6674c803602a7c0437fccdc2ea036707e60456974fe26ca263bd501ec45"}, 1795 | {file = "pycryptodome-3.12.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:5d4264039a2087977f50072aaff2346d1c1c101cb359f9444cf92e3d1f42b4cd"}, 1796 | {file = "pycryptodome-3.12.0.zip", hash = "sha256:12c7343aec5a3b3df5c47265281b12b611f26ec9367b6129199d67da54b768c1"}, 1797 | ] 1798 | pygments = [ 1799 | {file = "Pygments-2.10.0-py3-none-any.whl", hash = "sha256:b8e67fe6af78f492b3c4b3e2970c0624cbf08beb1e493b2c99b9fa1b67a20380"}, 1800 | {file = "Pygments-2.10.0.tar.gz", hash = "sha256:f398865f7eb6874156579fdf36bc840a03cab64d1cde9e93d68f46a425ec52c6"}, 1801 | ] 1802 | pygments-lexer-solidity = [ 1803 | {file = "pygments-lexer-solidity-0.7.0.tar.gz", hash = "sha256:a347fd96981838331b6d98b0f891776908a49406d343ff2a40a6a1c8475a9350"}, 1804 | ] 1805 | pyjwt = [ 1806 | {file = "PyJWT-1.7.1-py2.py3-none-any.whl", hash = "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e"}, 1807 | {file = "PyJWT-1.7.1.tar.gz", hash = "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"}, 1808 | ] 1809 | pyparsing = [ 1810 | {file = "pyparsing-3.0.6-py3-none-any.whl", hash = "sha256:04ff808a5b90911829c55c4e26f75fa5ca8a2f5f36aa3a51f68e27033341d3e4"}, 1811 | {file = "pyparsing-3.0.6.tar.gz", hash = "sha256:d9bdec0013ef1eb5a84ab39a3b3868911598afa494f5faa038647101504e2b81"}, 1812 | ] 1813 | pyrsistent = [ 1814 | {file = "pyrsistent-0.18.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:f4c8cabb46ff8e5d61f56a037974228e978f26bfefce4f61a4b1ac0ba7a2ab72"}, 1815 | {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:da6e5e818d18459fa46fac0a4a4e543507fe1110e808101277c5a2b5bab0cd2d"}, 1816 | {file = "pyrsistent-0.18.0-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:5e4395bbf841693eaebaa5bb5c8f5cdbb1d139e07c975c682ec4e4f8126e03d2"}, 1817 | {file = "pyrsistent-0.18.0-cp36-cp36m-win32.whl", hash = "sha256:527be2bfa8dc80f6f8ddd65242ba476a6c4fb4e3aedbf281dfbac1b1ed4165b1"}, 1818 | {file = "pyrsistent-0.18.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2aaf19dc8ce517a8653746d98e962ef480ff34b6bc563fc067be6401ffb457c7"}, 1819 | {file = "pyrsistent-0.18.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58a70d93fb79dc585b21f9d72487b929a6fe58da0754fa4cb9f279bb92369396"}, 1820 | {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:4916c10896721e472ee12c95cdc2891ce5890898d2f9907b1b4ae0f53588b710"}, 1821 | {file = "pyrsistent-0.18.0-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:73ff61b1411e3fb0ba144b8f08d6749749775fe89688093e1efef9839d2dcc35"}, 1822 | {file = "pyrsistent-0.18.0-cp37-cp37m-win32.whl", hash = "sha256:b29b869cf58412ca5738d23691e96d8aff535e17390128a1a52717c9a109da4f"}, 1823 | {file = "pyrsistent-0.18.0-cp37-cp37m-win_amd64.whl", hash = "sha256:097b96f129dd36a8c9e33594e7ebb151b1515eb52cceb08474c10a5479e799f2"}, 1824 | {file = "pyrsistent-0.18.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:772e94c2c6864f2cd2ffbe58bb3bdefbe2a32afa0acb1a77e472aac831f83427"}, 1825 | {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:c1a9ff320fa699337e05edcaae79ef8c2880b52720bc031b219e5b5008ebbdef"}, 1826 | {file = "pyrsistent-0.18.0-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:cd3caef37a415fd0dae6148a1b6957a8c5f275a62cca02e18474608cb263640c"}, 1827 | {file = "pyrsistent-0.18.0-cp38-cp38-win32.whl", hash = "sha256:e79d94ca58fcafef6395f6352383fa1a76922268fa02caa2272fff501c2fdc78"}, 1828 | {file = "pyrsistent-0.18.0-cp38-cp38-win_amd64.whl", hash = "sha256:a0c772d791c38bbc77be659af29bb14c38ced151433592e326361610250c605b"}, 1829 | {file = "pyrsistent-0.18.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d5ec194c9c573aafaceebf05fc400656722793dac57f254cd4741f3c27ae57b4"}, 1830 | {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:6b5eed00e597b5b5773b4ca30bd48a5774ef1e96f2a45d105db5b4ebb4bca680"}, 1831 | {file = "pyrsistent-0.18.0-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:48578680353f41dca1ca3dc48629fb77dfc745128b56fc01096b2530c13fd426"}, 1832 | {file = "pyrsistent-0.18.0-cp39-cp39-win32.whl", hash = "sha256:f3ef98d7b76da5eb19c37fda834d50262ff9167c65658d1d8f974d2e4d90676b"}, 1833 | {file = "pyrsistent-0.18.0-cp39-cp39-win_amd64.whl", hash = "sha256:404e1f1d254d314d55adb8d87f4f465c8693d6f902f67eb6ef5b4526dc58e6ea"}, 1834 | {file = "pyrsistent-0.18.0.tar.gz", hash = "sha256:773c781216f8c2900b42a7b638d5b517bb134ae1acbebe4d1e8f1f41ea60eb4b"}, 1835 | ] 1836 | pytest = [ 1837 | {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, 1838 | {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, 1839 | ] 1840 | pytest-forked = [ 1841 | {file = "pytest-forked-1.3.0.tar.gz", hash = "sha256:6aa9ac7e00ad1a539c41bec6d21011332de671e938c7637378ec9710204e37ca"}, 1842 | {file = "pytest_forked-1.3.0-py2.py3-none-any.whl", hash = "sha256:dc4147784048e70ef5d437951728825a131b81714b398d5d52f17c7c144d8815"}, 1843 | ] 1844 | pytest-xdist = [ 1845 | {file = "pytest-xdist-1.34.0.tar.gz", hash = "sha256:340e8e83e2a4c0d861bdd8d05c5d7b7143f6eea0aba902997db15c2a86be04ee"}, 1846 | {file = "pytest_xdist-1.34.0-py2.py3-none-any.whl", hash = "sha256:ba5d10729372d65df3ac150872f9df5d2ed004a3b0d499cc0164aafedd8c7b66"}, 1847 | ] 1848 | python-dateutil = [ 1849 | {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, 1850 | {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, 1851 | ] 1852 | python-dotenv = [ 1853 | {file = "python-dotenv-0.16.0.tar.gz", hash = "sha256:9fa413c37d4652d3fa02fea0ff465c384f5db75eab259c4fc5d0c5b8bf20edd4"}, 1854 | {file = "python_dotenv-0.16.0-py2.py3-none-any.whl", hash = "sha256:31d752f5b748f4e292448c9a0cac6a08ed5e6f4cefab85044462dcad56905cec"}, 1855 | ] 1856 | pythx = [ 1857 | {file = "pythx-1.6.1-py2.py3-none-any.whl", hash = "sha256:44cb6c88f5213a3dd516e8322dbd17551fc7d435dc6290d3a6145333258d901f"}, 1858 | {file = "pythx-1.6.1.tar.gz", hash = "sha256:7758a00125d5ba96d902bd2c79c1b1d10713a86479dc4f9ea7febc2337ff1eca"}, 1859 | ] 1860 | pywin32 = [ 1861 | {file = "pywin32-303-cp310-cp310-win32.whl", hash = "sha256:6fed4af057039f309263fd3285d7b8042d41507343cd5fa781d98fcc5b90e8bb"}, 1862 | {file = "pywin32-303-cp310-cp310-win_amd64.whl", hash = "sha256:51cb52c5ec6709f96c3f26e7795b0bf169ee0d8395b2c1d7eb2c029a5008ed51"}, 1863 | {file = "pywin32-303-cp311-cp311-win32.whl", hash = "sha256:d9b5d87ca944eb3aa4cd45516203ead4b37ab06b8b777c54aedc35975dec0dee"}, 1864 | {file = "pywin32-303-cp311-cp311-win_amd64.whl", hash = "sha256:fcf44032f5b14fcda86028cdf49b6ebdaea091230eb0a757282aa656e4732439"}, 1865 | {file = "pywin32-303-cp36-cp36m-win32.whl", hash = "sha256:aad484d52ec58008ca36bd4ad14a71d7dd0a99db1a4ca71072213f63bf49c7d9"}, 1866 | {file = "pywin32-303-cp36-cp36m-win_amd64.whl", hash = "sha256:2a09632916b6bb231ba49983fe989f2f625cea237219530e81a69239cd0c4559"}, 1867 | {file = "pywin32-303-cp37-cp37m-win32.whl", hash = "sha256:b1675d82bcf6dbc96363fca747bac8bff6f6e4a447a4287ac652aa4b9adc796e"}, 1868 | {file = "pywin32-303-cp37-cp37m-win_amd64.whl", hash = "sha256:c268040769b48a13367221fced6d4232ed52f044ffafeda247bd9d2c6bdc29ca"}, 1869 | {file = "pywin32-303-cp38-cp38-win32.whl", hash = "sha256:5f9ec054f5a46a0f4dfd72af2ce1372f3d5a6e4052af20b858aa7df2df7d355b"}, 1870 | {file = "pywin32-303-cp38-cp38-win_amd64.whl", hash = "sha256:793bf74fce164bcffd9d57bb13c2c15d56e43c9542a7b9687b4fccf8f8a41aba"}, 1871 | {file = "pywin32-303-cp39-cp39-win32.whl", hash = "sha256:7d3271c98434617a11921c5ccf74615794d97b079e22ed7773790822735cc352"}, 1872 | {file = "pywin32-303-cp39-cp39-win_amd64.whl", hash = "sha256:79cbb862c11b9af19bcb682891c1b91942ec2ff7de8151e2aea2e175899cda34"}, 1873 | ] 1874 | pyyaml = [ 1875 | {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, 1876 | {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, 1877 | {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, 1878 | {file = "PyYAML-5.4.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:bb4191dfc9306777bc594117aee052446b3fa88737cd13b7188d0e7aa8162185"}, 1879 | {file = "PyYAML-5.4.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:6c78645d400265a062508ae399b60b8c167bf003db364ecb26dcab2bda048253"}, 1880 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:4e0583d24c881e14342eaf4ec5fbc97f934b999a6828693a99157fde912540cc"}, 1881 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:72a01f726a9c7851ca9bfad6fd09ca4e090a023c00945ea05ba1638c09dc3347"}, 1882 | {file = "PyYAML-5.4.1-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:895f61ef02e8fed38159bb70f7e100e00f471eae2bc838cd0f4ebb21e28f8541"}, 1883 | {file = "PyYAML-5.4.1-cp36-cp36m-win32.whl", hash = "sha256:3bd0e463264cf257d1ffd2e40223b197271046d09dadf73a0fe82b9c1fc385a5"}, 1884 | {file = "PyYAML-5.4.1-cp36-cp36m-win_amd64.whl", hash = "sha256:e4fac90784481d221a8e4b1162afa7c47ed953be40d31ab4629ae917510051df"}, 1885 | {file = "PyYAML-5.4.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:5accb17103e43963b80e6f837831f38d314a0495500067cb25afab2e8d7a4018"}, 1886 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:e1d4970ea66be07ae37a3c2e48b5ec63f7ba6804bdddfdbd3cfd954d25a82e63"}, 1887 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cb333c16912324fd5f769fff6bc5de372e9e7a202247b48870bc251ed40239aa"}, 1888 | {file = "PyYAML-5.4.1-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:fe69978f3f768926cfa37b867e3843918e012cf83f680806599ddce33c2c68b0"}, 1889 | {file = "PyYAML-5.4.1-cp37-cp37m-win32.whl", hash = "sha256:dd5de0646207f053eb0d6c74ae45ba98c3395a571a2891858e87df7c9b9bd51b"}, 1890 | {file = "PyYAML-5.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:08682f6b72c722394747bddaf0aa62277e02557c0fd1c42cb853016a38f8dedf"}, 1891 | {file = "PyYAML-5.4.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2d9808ea7b4af864f35ea216be506ecec180628aced0704e34aca0b040ffe46"}, 1892 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:8c1be557ee92a20f184922c7b6424e8ab6691788e6d86137c5d93c1a6ec1b8fb"}, 1893 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:fd7f6999a8070df521b6384004ef42833b9bd62cfee11a09bda1079b4b704247"}, 1894 | {file = "PyYAML-5.4.1-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:bfb51918d4ff3d77c1c856a9699f8492c612cde32fd3bcd344af9be34999bfdc"}, 1895 | {file = "PyYAML-5.4.1-cp38-cp38-win32.whl", hash = "sha256:fa5ae20527d8e831e8230cbffd9f8fe952815b2b7dae6ffec25318803a7528fc"}, 1896 | {file = "PyYAML-5.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:0f5f5786c0e09baddcd8b4b45f20a7b5d61a7e7e99846e3c799b05c7c53fa696"}, 1897 | {file = "PyYAML-5.4.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:294db365efa064d00b8d1ef65d8ea2c3426ac366c0c4368d930bf1c5fb497f77"}, 1898 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:74c1485f7707cf707a7aef42ef6322b8f97921bd89be2ab6317fd782c2d53183"}, 1899 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:d483ad4e639292c90170eb6f7783ad19490e7a8defb3e46f97dfe4bacae89122"}, 1900 | {file = "PyYAML-5.4.1-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:fdc842473cd33f45ff6bce46aea678a54e3d21f1b61a7750ce3c498eedfe25d6"}, 1901 | {file = "PyYAML-5.4.1-cp39-cp39-win32.whl", hash = "sha256:49d4cdd9065b9b6e206d0595fee27a96b5dd22618e7520c33204a4a3239d5b10"}, 1902 | {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, 1903 | {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, 1904 | ] 1905 | regex = [ 1906 | {file = "regex-2021.11.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9345b6f7ee578bad8e475129ed40123d265464c4cfead6c261fd60fc9de00bcf"}, 1907 | {file = "regex-2021.11.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:416c5f1a188c91e3eb41e9c8787288e707f7d2ebe66e0a6563af280d9b68478f"}, 1908 | {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e0538c43565ee6e703d3a7c3bdfe4037a5209250e8502c98f20fea6f5fdf2965"}, 1909 | {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ee1227cf08b6716c85504aebc49ac827eb88fcc6e51564f010f11a406c0a667"}, 1910 | {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6650f16365f1924d6014d2ea770bde8555b4a39dc9576abb95e3cd1ff0263b36"}, 1911 | {file = "regex-2021.11.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30ab804ea73972049b7a2a5c62d97687d69b5a60a67adca07eb73a0ddbc9e29f"}, 1912 | {file = "regex-2021.11.10-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:68a067c11463de2a37157930d8b153005085e42bcb7ad9ca562d77ba7d1404e0"}, 1913 | {file = "regex-2021.11.10-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:162abfd74e88001d20cb73ceaffbfe601469923e875caf9118333b1a4aaafdc4"}, 1914 | {file = "regex-2021.11.10-cp310-cp310-win32.whl", hash = "sha256:98ba568e8ae26beb726aeea2273053c717641933836568c2a0278a84987b2a1a"}, 1915 | {file = "regex-2021.11.10-cp310-cp310-win_amd64.whl", hash = "sha256:780b48456a0f0ba4d390e8b5f7c661fdd218934388cde1a974010a965e200e12"}, 1916 | {file = "regex-2021.11.10-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dba70f30fd81f8ce6d32ddeef37d91c8948e5d5a4c63242d16a2b2df8143aafc"}, 1917 | {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1f54b9b4b6c53369f40028d2dd07a8c374583417ee6ec0ea304e710a20f80a0"}, 1918 | {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fbb9dc00e39f3e6c0ef48edee202f9520dafb233e8b51b06b8428cfcb92abd30"}, 1919 | {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:666abff54e474d28ff42756d94544cdfd42e2ee97065857413b72e8a2d6a6345"}, 1920 | {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5537f71b6d646f7f5f340562ec4c77b6e1c915f8baae822ea0b7e46c1f09b733"}, 1921 | {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2e07c6a26ed4bea91b897ee2b0835c21716d9a469a96c3e878dc5f8c55bb23"}, 1922 | {file = "regex-2021.11.10-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ca5f18a75e1256ce07494e245cdb146f5a9267d3c702ebf9b65c7f8bd843431e"}, 1923 | {file = "regex-2021.11.10-cp36-cp36m-win32.whl", hash = "sha256:93a5051fcf5fad72de73b96f07d30bc29665697fb8ecdfbc474f3452c78adcf4"}, 1924 | {file = "regex-2021.11.10-cp36-cp36m-win_amd64.whl", hash = "sha256:b483c9d00a565633c87abd0aaf27eb5016de23fed952e054ecc19ce32f6a9e7e"}, 1925 | {file = "regex-2021.11.10-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:fff55f3ce50a3ff63ec8e2a8d3dd924f1941b250b0aac3d3d42b687eeff07a8e"}, 1926 | {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e32d2a2b02ccbef10145df9135751abea1f9f076e67a4e261b05f24b94219e36"}, 1927 | {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:53db2c6be8a2710b359bfd3d3aa17ba38f8aa72a82309a12ae99d3c0c3dcd74d"}, 1928 | {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2207ae4f64ad3af399e2d30dde66f0b36ae5c3129b52885f1bffc2f05ec505c8"}, 1929 | {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d5ca078bb666c4a9d1287a379fe617a6dccd18c3e8a7e6c7e1eb8974330c626a"}, 1930 | {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dd33eb9bdcfbabab3459c9ee651d94c842bc8a05fabc95edf4ee0c15a072495e"}, 1931 | {file = "regex-2021.11.10-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:05b7d6d7e64efe309972adab77fc2af8907bb93217ec60aa9fe12a0dad35874f"}, 1932 | {file = "regex-2021.11.10-cp37-cp37m-win32.whl", hash = "sha256:e71255ba42567d34a13c03968736c5d39bb4a97ce98188fafb27ce981115beec"}, 1933 | {file = "regex-2021.11.10-cp37-cp37m-win_amd64.whl", hash = "sha256:07856afef5ffcc052e7eccf3213317fbb94e4a5cd8177a2caa69c980657b3cb4"}, 1934 | {file = "regex-2021.11.10-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ba05430e819e58544e840a68b03b28b6d328aff2e41579037e8bab7653b37d83"}, 1935 | {file = "regex-2021.11.10-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7f301b11b9d214f83ddaf689181051e7f48905568b0c7017c04c06dfd065e244"}, 1936 | {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aaa4e0705ef2b73dd8e36eeb4c868f80f8393f5f4d855e94025ce7ad8525f50"}, 1937 | {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:788aef3549f1924d5c38263104dae7395bf020a42776d5ec5ea2b0d3d85d6646"}, 1938 | {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f8af619e3be812a2059b212064ea7a640aff0568d972cd1b9e920837469eb3cb"}, 1939 | {file = "regex-2021.11.10-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85bfa6a5413be0ee6c5c4a663668a2cad2cbecdee367630d097d7823041bdeec"}, 1940 | {file = "regex-2021.11.10-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f23222527b307970e383433daec128d769ff778d9b29343fb3496472dc20dabe"}, 1941 | {file = "regex-2021.11.10-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:da1a90c1ddb7531b1d5ff1e171b4ee61f6345119be7351104b67ff413843fe94"}, 1942 | {file = "regex-2021.11.10-cp38-cp38-win32.whl", hash = "sha256:0617383e2fe465732af4509e61648b77cbe3aee68b6ac8c0b6fe934db90be5cc"}, 1943 | {file = "regex-2021.11.10-cp38-cp38-win_amd64.whl", hash = "sha256:a3feefd5e95871872673b08636f96b61ebef62971eab044f5124fb4dea39919d"}, 1944 | {file = "regex-2021.11.10-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f7f325be2804246a75a4f45c72d4ce80d2443ab815063cdf70ee8fb2ca59ee1b"}, 1945 | {file = "regex-2021.11.10-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:537ca6a3586931b16a85ac38c08cc48f10fc870a5b25e51794c74df843e9966d"}, 1946 | {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eef2afb0fd1747f33f1ee3e209bce1ed582d1896b240ccc5e2697e3275f037c7"}, 1947 | {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:432bd15d40ed835a51617521d60d0125867f7b88acf653e4ed994a1f8e4995dc"}, 1948 | {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b43c2b8a330a490daaef5a47ab114935002b13b3f9dc5da56d5322ff218eeadb"}, 1949 | {file = "regex-2021.11.10-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:962b9a917dd7ceacbe5cd424556914cb0d636001e393b43dc886ba31d2a1e449"}, 1950 | {file = "regex-2021.11.10-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fa8c626d6441e2d04b6ee703ef2d1e17608ad44c7cb75258c09dd42bacdfc64b"}, 1951 | {file = "regex-2021.11.10-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3c5fb32cc6077abad3bbf0323067636d93307c9fa93e072771cf9a64d1c0f3ef"}, 1952 | {file = "regex-2021.11.10-cp39-cp39-win32.whl", hash = "sha256:3b5df18db1fccd66de15aa59c41e4f853b5df7550723d26aa6cb7f40e5d9da5a"}, 1953 | {file = "regex-2021.11.10-cp39-cp39-win_amd64.whl", hash = "sha256:83ee89483672b11f8952b158640d0c0ff02dc43d9cb1b70c1564b49abe92ce29"}, 1954 | {file = "regex-2021.11.10.tar.gz", hash = "sha256:f341ee2df0999bfdf7a95e448075effe0db212a59387de1a70690e4acb03d4c6"}, 1955 | ] 1956 | requests = [ 1957 | {file = "requests-2.26.0-py2.py3-none-any.whl", hash = "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24"}, 1958 | {file = "requests-2.26.0.tar.gz", hash = "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7"}, 1959 | ] 1960 | rlp = [ 1961 | {file = "rlp-2.0.1-py2.py3-none-any.whl", hash = "sha256:52a57c9f53f03c88b189283734b397314288250cc4a3c4113e9e36e2ac6bdd16"}, 1962 | {file = "rlp-2.0.1.tar.gz", hash = "sha256:665e8312750b3fc5f7002e656d05b9dcb6e93b6063df40d95c49ad90c19d1f0e"}, 1963 | ] 1964 | semantic-version = [ 1965 | {file = "semantic_version-2.8.5-py2.py3-none-any.whl", hash = "sha256:45e4b32ee9d6d70ba5f440ec8cc5221074c7f4b0e8918bdab748cc37912440a9"}, 1966 | {file = "semantic_version-2.8.5.tar.gz", hash = "sha256:d2cb2de0558762934679b9a104e82eca7af448c9f4974d1f3eeccff651df8a54"}, 1967 | ] 1968 | six = [ 1969 | {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, 1970 | {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, 1971 | ] 1972 | sortedcontainers = [ 1973 | {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, 1974 | {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, 1975 | ] 1976 | toml = [ 1977 | {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, 1978 | {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, 1979 | ] 1980 | tomli = [ 1981 | {file = "tomli-1.2.2-py3-none-any.whl", hash = "sha256:f04066f68f5554911363063a30b108d2b5a5b1a010aa8b6132af78489fe3aade"}, 1982 | {file = "tomli-1.2.2.tar.gz", hash = "sha256:c6ce0015eb38820eaf32b5db832dbc26deb3dd427bd5f6556cf0acac2c214fee"}, 1983 | ] 1984 | toolz = [ 1985 | {file = "toolz-0.11.2-py3-none-any.whl", hash = "sha256:a5700ce83414c64514d82d60bcda8aabfde092d1c1a8663f9200c07fdcc6da8f"}, 1986 | {file = "toolz-0.11.2.tar.gz", hash = "sha256:6b312d5e15138552f1bda8a4e66c30e236c831b612b2bf0005f8a1df10a4bc33"}, 1987 | ] 1988 | tqdm = [ 1989 | {file = "tqdm-4.62.3-py2.py3-none-any.whl", hash = "sha256:8dd278a422499cd6b727e6ae4061c40b48fce8b76d1ccbf5d34fca9b7f925b0c"}, 1990 | {file = "tqdm-4.62.3.tar.gz", hash = "sha256:d359de7217506c9851b7869f3708d8ee53ed70a1b8edbba4dbcb47442592920d"}, 1991 | ] 1992 | typed-ast = [ 1993 | {file = "typed_ast-1.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d8314c92414ce7481eee7ad42b353943679cf6f30237b5ecbf7d835519e1212"}, 1994 | {file = "typed_ast-1.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b53ae5de5500529c76225d18eeb060efbcec90ad5e030713fe8dab0fb4531631"}, 1995 | {file = "typed_ast-1.5.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:24058827d8f5d633f97223f5148a7d22628099a3d2efe06654ce872f46f07cdb"}, 1996 | {file = "typed_ast-1.5.1-cp310-cp310-win_amd64.whl", hash = "sha256:a6d495c1ef572519a7bac9534dbf6d94c40e5b6a608ef41136133377bba4aa08"}, 1997 | {file = "typed_ast-1.5.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:de4ecae89c7d8b56169473e08f6bfd2df7f95015591f43126e4ea7865928677e"}, 1998 | {file = "typed_ast-1.5.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:256115a5bc7ea9e665c6314ed6671ee2c08ca380f9d5f130bd4d2c1f5848d695"}, 1999 | {file = "typed_ast-1.5.1-cp36-cp36m-win_amd64.whl", hash = "sha256:7c42707ab981b6cf4b73490c16e9d17fcd5227039720ca14abe415d39a173a30"}, 2000 | {file = "typed_ast-1.5.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:71dcda943a471d826ea930dd449ac7e76db7be778fcd722deb63642bab32ea3f"}, 2001 | {file = "typed_ast-1.5.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4f30a2bcd8e68adbb791ce1567fdb897357506f7ea6716f6bbdd3053ac4d9471"}, 2002 | {file = "typed_ast-1.5.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ca9e8300d8ba0b66d140820cf463438c8e7b4cdc6fd710c059bfcfb1531d03fb"}, 2003 | {file = "typed_ast-1.5.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9caaf2b440efb39ecbc45e2fabde809cbe56272719131a6318fd9bf08b58e2cb"}, 2004 | {file = "typed_ast-1.5.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c9bcad65d66d594bffab8575f39420fe0ee96f66e23c4d927ebb4e24354ec1af"}, 2005 | {file = "typed_ast-1.5.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:591bc04e507595887160ed7aa8d6785867fb86c5793911be79ccede61ae96f4d"}, 2006 | {file = "typed_ast-1.5.1-cp38-cp38-win_amd64.whl", hash = "sha256:a80d84f535642420dd17e16ae25bb46c7f4c16ee231105e7f3eb43976a89670a"}, 2007 | {file = "typed_ast-1.5.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:38cf5c642fa808300bae1281460d4f9b7617cf864d4e383054a5ef336e344d32"}, 2008 | {file = "typed_ast-1.5.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5b6ab14c56bc9c7e3c30228a0a0b54b915b1579613f6e463ba6f4eb1382e7fd4"}, 2009 | {file = "typed_ast-1.5.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a2b8d7007f6280e36fa42652df47087ac7b0a7d7f09f9468f07792ba646aac2d"}, 2010 | {file = "typed_ast-1.5.1-cp39-cp39-win_amd64.whl", hash = "sha256:b6d17f37f6edd879141e64a5db17b67488cfeffeedad8c5cec0392305e9bc775"}, 2011 | {file = "typed_ast-1.5.1.tar.gz", hash = "sha256:484137cab8ecf47e137260daa20bafbba5f4e3ec7fda1c1e69ab299b75fa81c5"}, 2012 | ] 2013 | typing-extensions = [ 2014 | {file = "typing_extensions-3.10.0.2-py2-none-any.whl", hash = "sha256:d8226d10bc02a29bcc81df19a26e56a9647f8b0a6d4a83924139f4a8b01f17b7"}, 2015 | {file = "typing_extensions-3.10.0.2-py3-none-any.whl", hash = "sha256:f1d25edafde516b146ecd0613dabcc61409817af4766fbbcfb8d1ad4ec441a34"}, 2016 | {file = "typing_extensions-3.10.0.2.tar.gz", hash = "sha256:49f75d16ff11f1cd258e1b988ccff82a3ca5570217d7ad8c5f48205dd99a677e"}, 2017 | ] 2018 | urllib3 = [ 2019 | {file = "urllib3-1.26.7-py2.py3-none-any.whl", hash = "sha256:c4fdf4019605b6e5423637e01bc9fe4daef873709a7973e195ceba0a62bbc844"}, 2020 | {file = "urllib3-1.26.7.tar.gz", hash = "sha256:4987c65554f7a2dbf30c18fd48778ef124af6fab771a377103da0585e2336ece"}, 2021 | ] 2022 | varint = [ 2023 | {file = "varint-1.0.2.tar.gz", hash = "sha256:a6ecc02377ac5ee9d65a6a8ad45c9ff1dac8ccee19400a5950fb51d594214ca5"}, 2024 | ] 2025 | vvm = [ 2026 | {file = "vvm-0.1.0-py3-none-any.whl", hash = "sha256:814c67bc8049d45ea8049bc26b04ce4065015f5a3e2896a1a2a2a44ab6e85edc"}, 2027 | {file = "vvm-0.1.0.tar.gz", hash = "sha256:a1474915b12e0084299d2c7fe7d72434fa99c00ebb117e400756a5d7e0edac2a"}, 2028 | ] 2029 | vyper = [ 2030 | {file = "vyper-0.3.1-py3-none-any.whl", hash = "sha256:40eabebb0cf859f9660ad94d3af273d3176252d50597fdb94fa808446943d1c5"}, 2031 | {file = "vyper-0.3.1.tar.gz", hash = "sha256:7d7ba0e6fdf3b2dcf5f6e7b1316a241c156c7dc9766427483885ca78b57287f4"}, 2032 | ] 2033 | wcwidth = [ 2034 | {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, 2035 | {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, 2036 | ] 2037 | web3 = [ 2038 | {file = "web3-5.25.0-py3-none-any.whl", hash = "sha256:24fdedb85eac0068f7c964e8b6713a5623e4a1e0d95ebabd1939fef933007c02"}, 2039 | {file = "web3-5.25.0.tar.gz", hash = "sha256:0e9ae7db064a3efee611af0c18d921cc7a4b320380a1f734b0c837518e62484b"}, 2040 | ] 2041 | websockets = [ 2042 | {file = "websockets-9.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d144b350045c53c8ff09aa1cfa955012dd32f00c7e0862c199edcabb1a8b32da"}, 2043 | {file = "websockets-9.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:b4ad84b156cf50529b8ac5cc1638c2cf8680490e3fccb6121316c8c02620a2e4"}, 2044 | {file = "websockets-9.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2cf04601633a4ec176b9cc3d3e73789c037641001dbfaf7c411f89cd3e04fcaf"}, 2045 | {file = "websockets-9.1-cp36-cp36m-manylinux2010_i686.whl", hash = "sha256:5c8f0d82ea2468282e08b0cf5307f3ad022290ed50c45d5cb7767957ca782880"}, 2046 | {file = "websockets-9.1-cp36-cp36m-manylinux2010_x86_64.whl", hash = "sha256:caa68c95bc1776d3521f81eeb4d5b9438be92514ec2a79fececda814099c8314"}, 2047 | {file = "websockets-9.1-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:d2c2d9b24d3c65b5a02cac12cbb4e4194e590314519ed49db2f67ef561c3cf58"}, 2048 | {file = "websockets-9.1-cp36-cp36m-win32.whl", hash = "sha256:f31722f1c033c198aa4a39a01905951c00bd1c74f922e8afc1b1c62adbcdd56a"}, 2049 | {file = "websockets-9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:3ddff38894c7857c476feb3538dd847514379d6dc844961dc99f04b0384b1b1b"}, 2050 | {file = "websockets-9.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:51d04df04ed9d08077d10ccbe21e6805791b78eac49d16d30a1f1fe2e44ba0af"}, 2051 | {file = "websockets-9.1-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:f68c352a68e5fdf1e97288d5cec9296664c590c25932a8476224124aaf90dbcd"}, 2052 | {file = "websockets-9.1-cp37-cp37m-manylinux1_x86_64.whl", hash = "sha256:b43b13e5622c5a53ab12f3272e6f42f1ce37cd5b6684b2676cb365403295cd40"}, 2053 | {file = "websockets-9.1-cp37-cp37m-manylinux2010_i686.whl", hash = "sha256:9147868bb0cc01e6846606cd65cbf9c58598f187b96d14dd1ca17338b08793bb"}, 2054 | {file = "websockets-9.1-cp37-cp37m-manylinux2010_x86_64.whl", hash = "sha256:836d14eb53b500fd92bd5db2fc5894f7c72b634f9c2a28f546f75967503d8e25"}, 2055 | {file = "websockets-9.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:48c222feb3ced18f3dc61168ca18952a22fb88e5eb8902d2bf1b50faefdc34a2"}, 2056 | {file = "websockets-9.1-cp37-cp37m-win32.whl", hash = "sha256:900589e19200be76dd7cbaa95e9771605b5ce3f62512d039fb3bc5da9014912a"}, 2057 | {file = "websockets-9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:ab5ee15d3462198c794c49ccd31773d8a2b8c17d622aa184f669d2b98c2f0857"}, 2058 | {file = "websockets-9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:85e701a6c316b7067f1e8675c638036a796fe5116783a4c932e7eb8e305a3ffe"}, 2059 | {file = "websockets-9.1-cp38-cp38-manylinux1_i686.whl", hash = "sha256:b2e71c4670ebe1067fa8632f0d081e47254ee2d3d409de54168b43b0ba9147e0"}, 2060 | {file = "websockets-9.1-cp38-cp38-manylinux1_x86_64.whl", hash = "sha256:230a3506df6b5f446fed2398e58dcaafdff12d67fe1397dff196411a9e820d02"}, 2061 | {file = "websockets-9.1-cp38-cp38-manylinux2010_i686.whl", hash = "sha256:7df3596838b2a0c07c6f6d67752c53859a54993d4f062689fdf547cb56d0f84f"}, 2062 | {file = "websockets-9.1-cp38-cp38-manylinux2010_x86_64.whl", hash = "sha256:826ccf85d4514609219725ba4a7abd569228c2c9f1968e8be05be366f68291ec"}, 2063 | {file = "websockets-9.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:0dd4eb8e0bbf365d6f652711ce21b8fd2b596f873d32aabb0fbb53ec604418cc"}, 2064 | {file = "websockets-9.1-cp38-cp38-win32.whl", hash = "sha256:1d0971cc7251aeff955aa742ec541ee8aaea4bb2ebf0245748fbec62f744a37e"}, 2065 | {file = "websockets-9.1-cp38-cp38-win_amd64.whl", hash = "sha256:7189e51955f9268b2bdd6cc537e0faa06f8fffda7fb386e5922c6391de51b077"}, 2066 | {file = "websockets-9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e9e5fd6dbdf95d99bc03732ded1fc8ef22ebbc05999ac7e0c7bf57fe6e4e5ae2"}, 2067 | {file = "websockets-9.1-cp39-cp39-manylinux1_i686.whl", hash = "sha256:9e7fdc775fe7403dbd8bc883ba59576a6232eac96dacb56512daacf7af5d618d"}, 2068 | {file = "websockets-9.1-cp39-cp39-manylinux1_x86_64.whl", hash = "sha256:597c28f3aa7a09e8c070a86b03107094ee5cdafcc0d55f2f2eac92faac8dc67d"}, 2069 | {file = "websockets-9.1-cp39-cp39-manylinux2010_i686.whl", hash = "sha256:ad893d889bc700a5835e0a95a3e4f2c39e91577ab232a3dc03c262a0f8fc4b5c"}, 2070 | {file = "websockets-9.1-cp39-cp39-manylinux2010_x86_64.whl", hash = "sha256:1d6b4fddb12ab9adf87b843cd4316c4bd602db8d5efd2fb83147f0458fe85135"}, 2071 | {file = "websockets-9.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:ebf459a1c069f9866d8569439c06193c586e72c9330db1390af7c6a0a32c4afd"}, 2072 | {file = "websockets-9.1-cp39-cp39-win32.whl", hash = "sha256:be5fd35e99970518547edc906efab29afd392319f020c3c58b0e1a158e16ed20"}, 2073 | {file = "websockets-9.1-cp39-cp39-win_amd64.whl", hash = "sha256:85db8090ba94e22d964498a47fdd933b8875a1add6ebc514c7ac8703eb97bbf0"}, 2074 | {file = "websockets-9.1.tar.gz", hash = "sha256:276d2339ebf0df4f45df453923ebd2270b87900eda5dfd4a6b0cfa15f82111c3"}, 2075 | ] 2076 | wrapt = [ 2077 | {file = "wrapt-1.13.3-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:e05e60ff3b2b0342153be4d1b597bbcfd8330890056b9619f4ad6b8d5c96a81a"}, 2078 | {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:85148f4225287b6a0665eef08a178c15097366d46b210574a658c1ff5b377489"}, 2079 | {file = "wrapt-1.13.3-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2dded5496e8f1592ec27079b28b6ad2a1ef0b9296d270f77b8e4a3a796cf6909"}, 2080 | {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:e94b7d9deaa4cc7bac9198a58a7240aaf87fe56c6277ee25fa5b3aa1edebd229"}, 2081 | {file = "wrapt-1.13.3-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:498e6217523111d07cd67e87a791f5e9ee769f9241fcf8a379696e25806965af"}, 2082 | {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:ec7e20258ecc5174029a0f391e1b948bf2906cd64c198a9b8b281b811cbc04de"}, 2083 | {file = "wrapt-1.13.3-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:87883690cae293541e08ba2da22cacaae0a092e0ed56bbba8d018cc486fbafbb"}, 2084 | {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:f99c0489258086308aad4ae57da9e8ecf9e1f3f30fa35d5e170b4d4896554d80"}, 2085 | {file = "wrapt-1.13.3-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:6a03d9917aee887690aa3f1747ce634e610f6db6f6b332b35c2dd89412912bca"}, 2086 | {file = "wrapt-1.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:936503cb0a6ed28dbfa87e8fcd0a56458822144e9d11a49ccee6d9a8adb2ac44"}, 2087 | {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f9c51d9af9abb899bd34ace878fbec8bf357b3194a10c4e8e0a25512826ef056"}, 2088 | {file = "wrapt-1.13.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:220a869982ea9023e163ba915077816ca439489de6d2c09089b219f4e11b6785"}, 2089 | {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0877fe981fd76b183711d767500e6b3111378ed2043c145e21816ee589d91096"}, 2090 | {file = "wrapt-1.13.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:43e69ffe47e3609a6aec0fe723001c60c65305784d964f5007d5b4fb1bc6bf33"}, 2091 | {file = "wrapt-1.13.3-cp310-cp310-win32.whl", hash = "sha256:78dea98c81915bbf510eb6a3c9c24915e4660302937b9ae05a0947164248020f"}, 2092 | {file = "wrapt-1.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:ea3e746e29d4000cd98d572f3ee2a6050a4f784bb536f4ac1f035987fc1ed83e"}, 2093 | {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:8c73c1a2ec7c98d7eaded149f6d225a692caa1bd7b2401a14125446e9e90410d"}, 2094 | {file = "wrapt-1.13.3-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:086218a72ec7d986a3eddb7707c8c4526d677c7b35e355875a0fe2918b059179"}, 2095 | {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:e92d0d4fa68ea0c02d39f1e2f9cb5bc4b4a71e8c442207433d8db47ee79d7aa3"}, 2096 | {file = "wrapt-1.13.3-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:d4a5f6146cfa5c7ba0134249665acd322a70d1ea61732723c7d3e8cc0fa80755"}, 2097 | {file = "wrapt-1.13.3-cp35-cp35m-win32.whl", hash = "sha256:8aab36778fa9bba1a8f06a4919556f9f8c7b33102bd71b3ab307bb3fecb21851"}, 2098 | {file = "wrapt-1.13.3-cp35-cp35m-win_amd64.whl", hash = "sha256:944b180f61f5e36c0634d3202ba8509b986b5fbaf57db3e94df11abee244ba13"}, 2099 | {file = "wrapt-1.13.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:2ebdde19cd3c8cdf8df3fc165bc7827334bc4e353465048b36f7deeae8ee0918"}, 2100 | {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:610f5f83dd1e0ad40254c306f4764fcdc846641f120c3cf424ff57a19d5f7ade"}, 2101 | {file = "wrapt-1.13.3-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5601f44a0f38fed36cc07db004f0eedeaadbdcec90e4e90509480e7e6060a5bc"}, 2102 | {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:e6906d6f48437dfd80464f7d7af1740eadc572b9f7a4301e7dd3d65db285cacf"}, 2103 | {file = "wrapt-1.13.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:766b32c762e07e26f50d8a3468e3b4228b3736c805018e4b0ec8cc01ecd88125"}, 2104 | {file = "wrapt-1.13.3-cp36-cp36m-win32.whl", hash = "sha256:5f223101f21cfd41deec8ce3889dc59f88a59b409db028c469c9b20cfeefbe36"}, 2105 | {file = "wrapt-1.13.3-cp36-cp36m-win_amd64.whl", hash = "sha256:f122ccd12fdc69628786d0c947bdd9cb2733be8f800d88b5a37c57f1f1d73c10"}, 2106 | {file = "wrapt-1.13.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:46f7f3af321a573fc0c3586612db4decb7eb37172af1bc6173d81f5b66c2e068"}, 2107 | {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:778fd096ee96890c10ce96187c76b3e99b2da44e08c9e24d5652f356873f6709"}, 2108 | {file = "wrapt-1.13.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:0cb23d36ed03bf46b894cfec777eec754146d68429c30431c99ef28482b5c1df"}, 2109 | {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:96b81ae75591a795d8c90edc0bfaab44d3d41ffc1aae4d994c5aa21d9b8e19a2"}, 2110 | {file = "wrapt-1.13.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7dd215e4e8514004c8d810a73e342c536547038fb130205ec4bba9f5de35d45b"}, 2111 | {file = "wrapt-1.13.3-cp37-cp37m-win32.whl", hash = "sha256:47f0a183743e7f71f29e4e21574ad3fa95676136f45b91afcf83f6a050914829"}, 2112 | {file = "wrapt-1.13.3-cp37-cp37m-win_amd64.whl", hash = "sha256:fd76c47f20984b43d93de9a82011bb6e5f8325df6c9ed4d8310029a55fa361ea"}, 2113 | {file = "wrapt-1.13.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:b73d4b78807bd299b38e4598b8e7bd34ed55d480160d2e7fdaabd9931afa65f9"}, 2114 | {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ec9465dd69d5657b5d2fa6133b3e1e989ae27d29471a672416fd729b429eb554"}, 2115 | {file = "wrapt-1.13.3-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dd91006848eb55af2159375134d724032a2d1d13bcc6f81cd8d3ed9f2b8e846c"}, 2116 | {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ae9de71eb60940e58207f8e71fe113c639da42adb02fb2bcbcaccc1ccecd092b"}, 2117 | {file = "wrapt-1.13.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:51799ca950cfee9396a87f4a1240622ac38973b6df5ef7a41e7f0b98797099ce"}, 2118 | {file = "wrapt-1.13.3-cp38-cp38-win32.whl", hash = "sha256:4b9c458732450ec42578b5642ac53e312092acf8c0bfce140ada5ca1ac556f79"}, 2119 | {file = "wrapt-1.13.3-cp38-cp38-win_amd64.whl", hash = "sha256:7dde79d007cd6dfa65afe404766057c2409316135cb892be4b1c768e3f3a11cb"}, 2120 | {file = "wrapt-1.13.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:981da26722bebb9247a0601e2922cedf8bb7a600e89c852d063313102de6f2cb"}, 2121 | {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:705e2af1f7be4707e49ced9153f8d72131090e52be9278b5dbb1498c749a1e32"}, 2122 | {file = "wrapt-1.13.3-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:25b1b1d5df495d82be1c9d2fad408f7ce5ca8a38085e2da41bb63c914baadff7"}, 2123 | {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:77416e6b17926d953b5c666a3cb718d5945df63ecf922af0ee576206d7033b5e"}, 2124 | {file = "wrapt-1.13.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:865c0b50003616f05858b22174c40ffc27a38e67359fa1495605f96125f76640"}, 2125 | {file = "wrapt-1.13.3-cp39-cp39-win32.whl", hash = "sha256:0a017a667d1f7411816e4bf214646d0ad5b1da2c1ea13dec6c162736ff25a374"}, 2126 | {file = "wrapt-1.13.3-cp39-cp39-win_amd64.whl", hash = "sha256:81bd7c90d28a4b2e1df135bfbd7c23aee3050078ca6441bead44c42483f9ebfb"}, 2127 | {file = "wrapt-1.13.3.tar.gz", hash = "sha256:1fea9cd438686e6682271d36f3481a9f3636195578bab9ca3382e2f5f01fc185"}, 2128 | ] 2129 | yarl = [ 2130 | {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2a8508f7350512434e41065684076f640ecce176d262a7d54f0da41d99c5a95"}, 2131 | {file = "yarl-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:da6df107b9ccfe52d3a48165e48d72db0eca3e3029b5b8cb4fe6ee3cb870ba8b"}, 2132 | {file = "yarl-1.7.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a1d0894f238763717bdcfea74558c94e3bc34aeacd3351d769460c1a586a8b05"}, 2133 | {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dfe4b95b7e00c6635a72e2d00b478e8a28bfb122dc76349a06e20792eb53a523"}, 2134 | {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c145ab54702334c42237a6c6c4cc08703b6aa9b94e2f227ceb3d477d20c36c63"}, 2135 | {file = "yarl-1.7.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1ca56f002eaf7998b5fcf73b2421790da9d2586331805f38acd9997743114e98"}, 2136 | {file = "yarl-1.7.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1d3d5ad8ea96bd6d643d80c7b8d5977b4e2fb1bab6c9da7322616fd26203d125"}, 2137 | {file = "yarl-1.7.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:167ab7f64e409e9bdd99333fe8c67b5574a1f0495dcfd905bc7454e766729b9e"}, 2138 | {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:95a1873b6c0dd1c437fb3bb4a4aaa699a48c218ac7ca1e74b0bee0ab16c7d60d"}, 2139 | {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6152224d0a1eb254f97df3997d79dadd8bb2c1a02ef283dbb34b97d4f8492d23"}, 2140 | {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5bb7d54b8f61ba6eee541fba4b83d22b8a046b4ef4d8eb7f15a7e35db2e1e245"}, 2141 | {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:9c1f083e7e71b2dd01f7cd7434a5f88c15213194df38bc29b388ccdf1492b739"}, 2142 | {file = "yarl-1.7.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f44477ae29025d8ea87ec308539f95963ffdc31a82f42ca9deecf2d505242e72"}, 2143 | {file = "yarl-1.7.2-cp310-cp310-win32.whl", hash = "sha256:cff3ba513db55cc6a35076f32c4cdc27032bd075c9faef31fec749e64b45d26c"}, 2144 | {file = "yarl-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:c9c6d927e098c2d360695f2e9d38870b2e92e0919be07dbe339aefa32a090265"}, 2145 | {file = "yarl-1.7.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9b4c77d92d56a4c5027572752aa35082e40c561eec776048330d2907aead891d"}, 2146 | {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c01a89a44bb672c38f42b49cdb0ad667b116d731b3f4c896f72302ff77d71656"}, 2147 | {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c19324a1c5399b602f3b6e7db9478e5b1adf5cf58901996fc973fe4fccd73eed"}, 2148 | {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3abddf0b8e41445426d29f955b24aeecc83fa1072be1be4e0d194134a7d9baee"}, 2149 | {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:6a1a9fe17621af43e9b9fcea8bd088ba682c8192d744b386ee3c47b56eaabb2c"}, 2150 | {file = "yarl-1.7.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b0915ee85150963a9504c10de4e4729ae700af11df0dc5550e6587ed7891e92"}, 2151 | {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:29e0656d5497733dcddc21797da5a2ab990c0cb9719f1f969e58a4abac66234d"}, 2152 | {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:bf19725fec28452474d9887a128e98dd67eee7b7d52e932e6949c532d820dc3b"}, 2153 | {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:d6f3d62e16c10e88d2168ba2d065aa374e3c538998ed04996cd373ff2036d64c"}, 2154 | {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ac10bbac36cd89eac19f4e51c032ba6b412b3892b685076f4acd2de18ca990aa"}, 2155 | {file = "yarl-1.7.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:aa32aaa97d8b2ed4e54dc65d241a0da1c627454950f7d7b1f95b13985afd6c5d"}, 2156 | {file = "yarl-1.7.2-cp36-cp36m-win32.whl", hash = "sha256:87f6e082bce21464857ba58b569370e7b547d239ca22248be68ea5d6b51464a1"}, 2157 | {file = "yarl-1.7.2-cp36-cp36m-win_amd64.whl", hash = "sha256:ac35ccde589ab6a1870a484ed136d49a26bcd06b6a1c6397b1967ca13ceb3913"}, 2158 | {file = "yarl-1.7.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a467a431a0817a292121c13cbe637348b546e6ef47ca14a790aa2fa8cc93df63"}, 2159 | {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ab0c3274d0a846840bf6c27d2c60ba771a12e4d7586bf550eefc2df0b56b3b4"}, 2160 | {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d260d4dc495c05d6600264a197d9d6f7fc9347f21d2594926202fd08cf89a8ba"}, 2161 | {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fc4dd8b01a8112809e6b636b00f487846956402834a7fd59d46d4f4267181c41"}, 2162 | {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c1164a2eac148d85bbdd23e07dfcc930f2e633220f3eb3c3e2a25f6148c2819e"}, 2163 | {file = "yarl-1.7.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:67e94028817defe5e705079b10a8438b8cb56e7115fa01640e9c0bb3edf67332"}, 2164 | {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:89ccbf58e6a0ab89d487c92a490cb5660d06c3a47ca08872859672f9c511fc52"}, 2165 | {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:8cce6f9fa3df25f55521fbb5c7e4a736683148bcc0c75b21863789e5185f9185"}, 2166 | {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:211fcd65c58bf250fb994b53bc45a442ddc9f441f6fec53e65de8cba48ded986"}, 2167 | {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c10ea1e80a697cf7d80d1ed414b5cb8f1eec07d618f54637067ae3c0334133c4"}, 2168 | {file = "yarl-1.7.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:52690eb521d690ab041c3919666bea13ab9fbff80d615ec16fa81a297131276b"}, 2169 | {file = "yarl-1.7.2-cp37-cp37m-win32.whl", hash = "sha256:695ba021a9e04418507fa930d5f0704edbce47076bdcfeeaba1c83683e5649d1"}, 2170 | {file = "yarl-1.7.2-cp37-cp37m-win_amd64.whl", hash = "sha256:c17965ff3706beedafd458c452bf15bac693ecd146a60a06a214614dc097a271"}, 2171 | {file = "yarl-1.7.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fce78593346c014d0d986b7ebc80d782b7f5e19843ca798ed62f8e3ba8728576"}, 2172 | {file = "yarl-1.7.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c2a1ac41a6aa980db03d098a5531f13985edcb451bcd9d00670b03129922cd0d"}, 2173 | {file = "yarl-1.7.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:39d5493c5ecd75c8093fa7700a2fb5c94fe28c839c8e40144b7ab7ccba6938c8"}, 2174 | {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1eb6480ef366d75b54c68164094a6a560c247370a68c02dddb11f20c4c6d3c9d"}, 2175 | {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5ba63585a89c9885f18331a55d25fe81dc2d82b71311ff8bd378fc8004202ff6"}, 2176 | {file = "yarl-1.7.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e39378894ee6ae9f555ae2de332d513a5763276a9265f8e7cbaeb1b1ee74623a"}, 2177 | {file = "yarl-1.7.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c0910c6b6c31359d2f6184828888c983d54d09d581a4a23547a35f1d0b9484b1"}, 2178 | {file = "yarl-1.7.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6feca8b6bfb9eef6ee057628e71e1734caf520a907b6ec0d62839e8293e945c0"}, 2179 | {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:8300401dc88cad23f5b4e4c1226f44a5aa696436a4026e456fe0e5d2f7f486e6"}, 2180 | {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:788713c2896f426a4e166b11f4ec538b5736294ebf7d5f654ae445fd44270832"}, 2181 | {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:fd547ec596d90c8676e369dd8a581a21227fe9b4ad37d0dc7feb4ccf544c2d59"}, 2182 | {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:737e401cd0c493f7e3dd4db72aca11cfe069531c9761b8ea474926936b3c57c8"}, 2183 | {file = "yarl-1.7.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:baf81561f2972fb895e7844882898bda1eef4b07b5b385bcd308d2098f1a767b"}, 2184 | {file = "yarl-1.7.2-cp38-cp38-win32.whl", hash = "sha256:ede3b46cdb719c794427dcce9d8beb4abe8b9aa1e97526cc20de9bd6583ad1ef"}, 2185 | {file = "yarl-1.7.2-cp38-cp38-win_amd64.whl", hash = "sha256:cc8b7a7254c0fc3187d43d6cb54b5032d2365efd1df0cd1749c0c4df5f0ad45f"}, 2186 | {file = "yarl-1.7.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:580c1f15500e137a8c37053e4cbf6058944d4c114701fa59944607505c2fe3a0"}, 2187 | {file = "yarl-1.7.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3ec1d9a0d7780416e657f1e405ba35ec1ba453a4f1511eb8b9fbab81cb8b3ce1"}, 2188 | {file = "yarl-1.7.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3bf8cfe8856708ede6a73907bf0501f2dc4e104085e070a41f5d88e7faf237f3"}, 2189 | {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1be4bbb3d27a4e9aa5f3df2ab61e3701ce8fcbd3e9846dbce7c033a7e8136746"}, 2190 | {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:534b047277a9a19d858cde163aba93f3e1677d5acd92f7d10ace419d478540de"}, 2191 | {file = "yarl-1.7.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6ddcd80d79c96eb19c354d9dca95291589c5954099836b7c8d29278a7ec0bda"}, 2192 | {file = "yarl-1.7.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9bfcd43c65fbb339dc7086b5315750efa42a34eefad0256ba114cd8ad3896f4b"}, 2193 | {file = "yarl-1.7.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f64394bd7ceef1237cc604b5a89bf748c95982a84bcd3c4bbeb40f685c810794"}, 2194 | {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:044daf3012e43d4b3538562da94a88fb12a6490652dbc29fb19adfa02cf72eac"}, 2195 | {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:368bcf400247318382cc150aaa632582d0780b28ee6053cd80268c7e72796dec"}, 2196 | {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:bab827163113177aee910adb1f48ff7af31ee0289f434f7e22d10baf624a6dfe"}, 2197 | {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0cba38120db72123db7c58322fa69e3c0efa933040ffb586c3a87c063ec7cae8"}, 2198 | {file = "yarl-1.7.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:59218fef177296451b23214c91ea3aba7858b4ae3306dde120224cfe0f7a6ee8"}, 2199 | {file = "yarl-1.7.2-cp39-cp39-win32.whl", hash = "sha256:1edc172dcca3f11b38a9d5c7505c83c1913c0addc99cd28e993efeaafdfaa18d"}, 2200 | {file = "yarl-1.7.2-cp39-cp39-win_amd64.whl", hash = "sha256:797c2c412b04403d2da075fb93c123df35239cd7b4cc4e0cd9e5839b73f52c58"}, 2201 | {file = "yarl-1.7.2.tar.gz", hash = "sha256:45399b46d60c253327a460e99856752009fcee5f5d3c80b2f7c0cae1c38d56dd"}, 2202 | ] 2203 | zipp = [ 2204 | {file = "zipp-3.6.0-py3-none-any.whl", hash = "sha256:9fe5ea21568a0a70e50f273397638d39b03353731e6cbbb3fd8502a33fec40bc"}, 2205 | {file = "zipp-3.6.0.tar.gz", hash = "sha256:71c644c5369f4a6e07636f0aa966270449561fcea2e3d6747b8d23efaa9d7832"}, 2206 | ] 2207 | --------------------------------------------------------------------------------