diff --git a/README.md b/README.md index b5577291..81ef40f2 100644 --- a/README.md +++ b/README.md @@ -71,6 +71,12 @@ poetry run brownie networks import network-config.yaml True poetry shell ``` +This is a workaround related brownie deps pyyaml issue eth-brownie/brownie#1701: + +```bash +poetry run pip install "cython<3.0" pyyaml==5.4.1 --no-build-isolation +`````` + Compile the Smart Contracts: ```bash diff --git a/bytecode-verificator/SHA256SUMS b/bytecode-verificator/SHA256SUMS new file mode 100644 index 00000000..19d0fd51 --- /dev/null +++ b/bytecode-verificator/SHA256SUMS @@ -0,0 +1,6 @@ +d619d4f5d8fd988bc63262407e749e905ccc8d8ab1ccf0280da1d12b918894ce ./compilers/solc-darwin-0.8.9 +f851f11fad37496baabaf8d6cb5c057ca0d9754fddb7a351ab580d7fd728cb94 ./compilers/solc-linux-0.8.9 +86ee99f64fc7e36bfa046169b6a4d4c10eb35017ed11e0c970f01223b2f5db36 ./compilers/solc-darwin-0.8.6 +abd5c4f3f262bc3ed7951b968c63f98e83f66d9a5c3568ab306eac49250aec3e ./compilers/solc-linux-0.8.6 +7034c4048bc713d5c14cdd6681953c736e2adbdb9174f8bfbfb6a097109ffaaa ./compilers/solc-darwin-0.4.24 +665675b9e0431c2572d59d6a7112afbdc752732ea0ce9aecf1a1855f28e02a09 ./compilers/solc-linux-0.4.24 diff --git a/bytecode-verificator/bytecode_verificator.sh b/bytecode-verificator/bytecode_verificator.sh new file mode 100755 index 00000000..438b41fb --- /dev/null +++ b/bytecode-verificator/bytecode_verificator.sh @@ -0,0 +1,496 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +if [[ "${TRACE-0}" == "1" ]]; then + set -o xtrace +fi + +################################ +# Bytecode verification script # +################################ + +RED='\033[0;31m' +ORANGE='\033[0;33m' +GREEN='\033[0;32m' +NC='\033[0m' + +zero_padding=$(printf '%0.1s' "0"{1..64}) +placeholder_padding=$(printf '%0.1s' "-"{1..64}) + +# Prerequisite executables +prerequisites=(jq yarn awk curl shasum uname bc nc) + +# Environment vailable required +envs=(ETHERSCAN_TOKEN) + +# Commandline args required +cmdargs=(solc_version remote_rpc_url etherscan_api_url contract config_json) +sha256sum='shasum -a 256' + +# Vars +constructor_calldata="" +contract_config_name="" +local_rpc_url="" +# Fork PID of Ganache +fork_pid=0 +local_rpc_port=7776 +local_rpc_url=http://127.0.0.1:${local_rpc_port} + +function show_help() { + cat <<-_EOF_ + Bytecode verificator + + CLI tool to validate contract bytecode at remote rpc node, etherscan and bytecode deployed from local source code + + $0 [--solc-version ] [--remote-rpc-url ] [--etherscan-api-url ] [--contract ] [--config-json ] [--constructor-calldata ] [-h|--help] + + Options: + --solc-version SOLC-VERSION version of solidity to compile contract with (e.g. 0.4.24, 0.8.9) + --remote-rpc-url REMOTE-RPC-URL Ethereum node URL that contains the comparating contract bytecode. e.g. https://mainnet.infura.io/v3/\$WEB3_INFURA_PROJECT_ID + --etherscan-api ETHERSCAN-API-URL Etherscan API URL e.g. https://api.etherscan.io/api + --contract CONTRACT Contract name from config file. (e.g. app:lido, stakingRouter, lidoLocator ...) + --config-json CONFIG-JSON Path to JSON file. Artifacts of deployment (e.g './deployed-mainnet.json') + --constructor-calldata DATA (optional) Calldata that will be used for local contract deployment. Will be encoded from config file if does not provided. (hex data with no 0x prefix) + -h, --help Prints help. +_EOF_ +} + +# Entry point +main() { + SCRIPT_DIR=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd) + cd "${SCRIPT_DIR}" + + check_root + check_prerequisites + check_envs + + parse_cmd_args "$@" + check_compiler + [[ "${local_ganache:-unset}" == "unset" ]] && start_fork + + [[ "${skip_compilation:-unset}" == "unset" ]] && compile_contract + deploy_contract_on_fork + compare_bytecode +} + +# Service functions + +function check_root() { + if ((EUID == 0)); then + _err "This script must NOT be run as root" + fi +} + +function check_prerequisites() { + for p in "${prerequisites[@]}"; do + [[ -x "$(command -v "$p")" ]] || { _err "$p app is required but not found"; } + done +} + +function check_envs() { + for e in "${envs[@]}"; do + [[ "${!e:+isset}" == "isset" ]] || { _err "${e} env var is required but is not set"; } + done +} + +function parse_cmd_args() { + + while [[ $# -gt 0 ]]; do + case $1 in + --solc-version) + solc_version="$2" + [[ "$solc_version" =~ ^[0-9]+\.[0-9]+\.[0-9]+$ ]] || { _err "Invalid solc version: $solc_version"; } + shift + shift + ;; + --remote-rpc-url) + remote_rpc_url="$2" + [[ "$remote_rpc_url" =~ ^http ]] || { _err "Invalid remote rpc URL: $remote_rpc_url"; } + shift + shift + ;; + --etherscan-api-url) + etherscan_api_url="$2" + [[ "$etherscan_api_url" =~ ^https ]] || { _err "Invalid Etherscan API URL: $remote_rpc_url"; } + shift + shift + ;; + --contract) + contract="$2" + shift + shift + ;; + --config-json) + config_json="$2" + [[ -f $config_json ]] || { _err "config file ${config_json} does not exist"; } + shift + shift + ;; + --constructor-calldata) + constructor_calldata="$2" + [[ "$constructor_calldata" =~ ^[0-9A-Fa-f]+$ ]] || { _err "Invalid calldata: $constructor_calldata"; } + shift + shift + ;; + --skip-compilation) + skip_compilation=true + shift + ;; + --local-ganache) + local_ganache=true + shift + ;; + --help | -h) + show_help + exit 0 + ;; + --* | -*) + _err "Unknown option \"$1\"" + ;; + esac + done + + for arg in "${cmdargs[@]}"; do + if [ "${!arg:+isset}" != "isset" ]; then + _err "argument '--${arg//_/-}' is empty" + fi + done +} + +function check_compiler() { + platform=$(uname | awk '{print tolower($0)}') + + solc=./compilers/solc-$platform-$solc_version + + if ! [ -x "$(command -v "$solc")" ]; then + _err "$solc could not be found or is not executable" + fi + + echo -e "Platform: ${ORANGE}$platform${NC}" + echo -e "Compiler version: ${ORANGE}$solc_version${NC}" + echo -e "Compiler binary: ${ORANGE}$solc${NC}" + + compilerSha256Sum=$($sha256sum "$solc") + grep -q "$compilerSha256Sum" ./SHA256SUMS || { _err "\"$solc\" has unrecognized checksum (local)"; } + + if [[ "$platform" == 'darwin' ]]; then + github_sha256=$(curl -sS https://binaries.soliditylang.org/macosx-amd64/list.json | jq -r ".builds | .[] | select(.version==\"$solc_version\").sha256") + [[ "$github_sha256 $solc" == "0x$compilerSha256Sum" ]] || { _err "$solc has unrecognized checksum (github)"; } + elif [[ $platform == 'linux' ]]; then + github_sha256=$(curl -sS https://binaries.soliditylang.org/linux-amd64/list.json | jq -r ".builds | .[] | select(.version==\"$solc_version\").sha256") + [[ "$github_sha256 $solc" == "0x$compilerSha256Sum" ]] || { _err "$solc has unrecognized checksum (github)"; } + fi + + checksum=$(echo -e "$compilerSha256Sum" | awk '{print $1;}') + echo -e "Compiler checksum ${ORANGE}$checksum${GREEN} is correct${NC}" +} + +function start_fork() { + local_fork_command=$( + cat <<-_EOF_ | xargs | sed 's/ / /g' + yarn ganache --chain.vmErrorsOnRPCResponse true + --wallet.totalAccounts 10 --chain.chainId 1 + --fork.url ${remote_rpc_url} + --miner.blockGasLimit 92000000 + --server.host 127.0.0.1 --server.port ${local_rpc_port} + --hardfork istanbul -d +_EOF_ + ) + + echo "Starting local fork \"${local_fork_command}\"" + (nc -vz 127.0.0.1 $local_rpc_port) &>/dev/null && kill -SIGTERM "$(lsof -t -i:$local_rpc_port)" + + $local_fork_command 1>>./logs 2>&1 & + fork_pid=$$ + echo "Ganache pid $fork_pid" + + sleep 10 +} + +function encode_address() { + echo "${1/0x/000000000000000000000000}" +} + +function encode_uint256() { + printf "%064X\n" "$1" +} + +function encode_bytes32() { + echo "${1/0x/}" +} + +function encode_bytes() { + local bytes_str + local data_length + local encoded_length + + bytes_str=$(sed -E 's/^0x(00)*//' <<<"$1") + data_length=$((${#bytes_str} / 2)) + encoded_length=0 + if [[ data_length -gt "0" ]]; then + encoded_length=$(bc <<<"(((${#bytes_str} - 1) / 64) + 1) * 64") + fi + bytes_str=$bytes_str$zero_padding + bytes_str=${bytes_str:0:$encoded_length} + echo "$(printf "%064X\n" "$data_length")$bytes_str" +} + +function encode_string() { + local string_bytes + local data_length + local encoded_length + + string_bytes=$(xxd -p <<<"$1" | sed 's/..$//') + data_length=$(bc <<<"${#string_bytes} / 2") + encoded_length=0 + if [[ data_length -gt "0" ]]; then + encoded_length=$(bc <<<"(((${#string_bytes} - 1) / 64) + 1) * 64") + fi + string_bytes=$string_bytes$zero_padding + string_bytes=${string_bytes:0:$encoded_length} + echo "$(printf "%064X\n" "$data_length")$string_bytes" +} + +function encode_array() { + local type=$1 + local array=$2 + local array_length + local encoded_data + encoded_data="" + + array_length=$(jq -r 'length' <<<"$array") + encoded_data="$encoded_data$(encode_uint256 "$(bc <<<"$array_length * 32")")" + if [[ $array_length -gt 0 ]]; then + for i in $(seq 0 "$(bc <<<"$array_length - 1")"); do + case $type in + address\[\]) encoded_data="$encoded_data$(encode_address "$(jq -r ".[$i]" <<<"$array")")" ;; + uint256\[\]) encoded_data="$encoded_data$(encode_uint256 "$(jq -r ".[$i]" <<<"$array")")" ;; + bytes32\[\]) encoded_data="$encoded_data$(encode_bytes32 "$(jq -r ".[$i]" <<<"$array")")" ;; + *) _err "Unknown constructor argument type '$type', use --constructor-calldata instead" ;; + esac + done + fi + echo "$encoded_data" +} + +function encode_tuple() { + local types=$1 + local args=$2 + local args_length + local encoded_data + encoded_data="" + + args_length=$(jq -r 'length' <<<"$types") + + for arg_index in $(seq 0 "$(bc <<<"$args_length - 1")"); do + local arg_type + local arg + + arg_type=$(jq -r ".[$arg_index]" <<<"$types") + arg=$(jq -r ".[$arg_index]" <<<"$args") + + case $arg_type in + address) encoded_data="$encoded_data$(encode_address "$arg")" ;; + uint256) encoded_data="$encoded_data$(encode_uint256 "$arg")" ;; + bytes32) encoded_data="$encoded_data$(encode_bytes32 "$arg")" ;; + *) _err "Unknown constructor argument type '$arg_type', use --constructor-calldata instead" ;; + esac + done + echo "$encoded_data" +} + +function endode_solidity_calldata_placeholder() { + local placeholder="$1$placeholder_padding" + echo "${placeholder:0:64}" +} + +function compile_contract() { + rm -rf "${PWD}/build" + cd "${PWD}/.." + ./bytecode-verificator/"$solc" OpenZeppelin/openzeppelin-contracts@4.3.2/contracts=./node_modules/@openzeppelin/contracts-v4.3.2 contracts/**/*.sol contracts/*.sol -o ./bytecode-verificator/build --allow-paths "$PWD" --bin --overwrite --optimize --optimize-runs 200 1>>./logs 2>&1 + ./bytecode-verificator/"$solc" OpenZeppelin/openzeppelin-contracts@4.3.2/contracts=./node_modules/@openzeppelin/contracts-v4.3.2 contracts/**/*.sol contracts/*.sol -o ./bytecode-verificator/build --allow-paths "$PWD" --abi --overwrite --optimize --optimize-runs 200 1>>./logs 2>&1 + cd - &>/dev/null +} + +function deploy_contract_on_fork() { + contract_config_name=$(_read_contract_config "$contract" contract) + contract_config_address=$(_read_contract_config "$contract" address) + + echo -e "Contract name: ${ORANGE}$contract_config_name${NC}" + echo -e "Contract address: ${ORANGE}$contract_config_address${NC}" + + if [[ "${constructor_calldata:-unset}" == "unset" ]]; then + local contract_abi + local constructor_abi + local arg_length + local constructor_config_args + local compl_data + + compl_data=() + contract_abi=$(cat ./build/"$contract_config_name".abi) + constructor_abi=$(jq -r '.[] | select(.type == "constructor") | .inputs ' <<<"$contract_abi") + arg_length=$(jq -r 'length' <<<"$constructor_abi") + + echo -e "Constructor args types: $(jq ".[].type" <<<"$constructor_abi")" + + constructor_config_args=$(_read_contract_config "$contract" constructorArgs) + + if [[ $arg_length -gt 0 ]]; then + for argument_index in $(seq 0 "$(bc <<<"$arg_length - 1")"); do + local arg_type + local arg + + arg_type=$(jq -r ".[$argument_index].type" <<<"$constructor_abi") + arg=$(jq -r ".[$argument_index]" <<<"$constructor_config_args") + + case $arg_type in + address) constructor_calldata="$constructor_calldata$(encode_address "$arg")" ;; + uint256) constructor_calldata="$constructor_calldata$(encode_uint256 "$arg")" ;; + bytes32) constructor_calldata="$constructor_calldata$(encode_bytes32 "$arg")" ;; + bytes) + constructor_calldata="$constructor_calldata$(endode_solidity_calldata_placeholder ${#compl_data[@]})" + compl_data+=("$(encode_bytes "$arg")") + ;; + string) + constructor_calldata="$constructor_calldata$(endode_solidity_calldata_placeholder ${#compl_data[@]})" + compl_data+=("$(encode_string "$arg")") + ;; + tuple) + args_types=$(jq -r ".[$argument_index].components | map(.type)" <<<"$constructor_abi") + constructor_calldata="$constructor_calldata$(encode_tuple "$args_types" "$arg")" + ;; + *[]) + constructor_calldata="$constructor_calldata$(endode_solidity_calldata_placeholder ${#compl_data[@]})" + compl_data+=("$(encode_array "$arg_type" "$arg")") + ;; + *) _err "Unknown constructor argument type '$arg_type', use --constructor-calldata instead" ;; + esac + done + + for index in "${!compl_data[@]}"; do + encoded_data_length=$(bc <<<"${#constructor_calldata} / 2") + constructor_calldata=$(sed -E "s/$(endode_solidity_calldata_placeholder "$index")/$(printf "%064X\n" "$encoded_data_length")/" <<<"$constructor_calldata${compl_data[$index]}") + done + fi + fi + + echo "Contract constructor encoded args: 0x$constructor_calldata" + + echo "Deploying compiled contract to local fork" + contract_bytecode=$(cat ./build/"$contract_config_name".bin) + deployment_bytecode="0x$contract_bytecode$constructor_calldata" + deployer_account=$(_get_account "$local_rpc_url" 0) + local_contract_address=$(_deploy_contract "$local_rpc_url" "$deployer_account" "$deployment_bytecode") + echo "Done" +} + +function compare_bytecode() { + local remote_code + local local_code + local etherscan_code + + echo "Retrieving contract bytecode from local rpc (Ganache)" + local_code=$(_get_code $local_rpc_url "$local_contract_address") + + echo -e "Retrieving contract bytecode from remote rpc ${remote_rpc_url}" + remote_code=$(_get_code "$remote_rpc_url" "$contract_config_address") + + echo "Retrieving contract bytecode from etherscan" + etherscan_code=$(_get_code_etherscan "$contract_config_address") + + echo "Replacing CBOR-encoded metadata" + # https://docs.soliditylang.org/en/v0.8.9/metadata.html#encoding-of-the-metadata-hash-in-the-bytecode + remote_code=$(sed -E 's/a264697066735822[0-9a-f]{68}//' <<<"$remote_code") + local_code=$(sed -E 's/a264697066735822[0-9a-f]{68}//' <<<"$local_code") + etherscan_code=$(sed -E 's/a264697066735822[0-9a-f]{68}//' <<<"$etherscan_code") + + # https://docs.soliditylang.org/en/v0.4.24/metadata.html#encoding-of-the-metadata-hash-in-the-bytecode + remote_code=$(sed -E 's/a165627a7a72305820[0-9a-f]{68}//' <<<"$remote_code") + local_code=$(sed -E 's/a165627a7a72305820[0-9a-f]{68}//' <<<"$local_code") + etherscan_code=$(sed -E 's/a165627a7a72305820[0-9a-f]{68}//' <<<"$etherscan_code") + + _print_checksum local_code + _print_checksum remote_code + _print_checksum etherscan_code + + echo "Comparing remote and local bytecode" + [[ "$local_code" == "$remote_code" ]] || { + mkdir -p ./verificator_diffs + echo "$local_code" >./verificator_diffs/"$contract"_local.bin + echo "$remote_code" >./verificator_diffs/"$contract"_remote.bin + _err "local bytecode and remote bytecode is not equal. Bytecode saved in ./verificator_diffs/" + } + echo -e "${GREEN}Local bytecode matches with remote rpc${NC}" + + echo "Comparing etherscan and local bytecode" + [[ "$local_code" == "$etherscan_code" ]] || { _err "local bytecode and etherscan bytecode is not equal"; } + echo -e "${GREEN}Local bytecode matches with etherscan${NC}" +} + +# Internals + +_get_code() { + local rpc_url=$1 + local contract_address=$2 + + curl -sS -X POST -H "Content-Type: application/json" "$rpc_url" --data "{\"jsonrpc\": \"2.0\", \"id\": 42, \"method\": \"eth_getCode\", \"params\": [\"$contract_address\", \"latest\"]}" | jq -r '.result' +} + +_get_code_etherscan() { + local contract_address=$1 + curl -sS -G -d "address=$contract_address" -d "action=eth_getCode" -d "module=proxy" -d "tag=latest" -d "apikey=$ETHERSCAN_TOKEN" "$etherscan_api_url" | jq -r '.result' +} + +_get_account() { + local rpc_url=$1 + + curl -sS -X POST -H "Content-Type: application/json" "$rpc_url" --data '{"jsonrpc": "2.0", "id": 42, "method": "eth_accounts", "params": []}' | jq -r '.result[0]' +} + +_deploy_contract() { + local rpc_url=$1 + local deployer=$2 + local data=$3 + + tx_hash=$(curl -sS -X POST "$rpc_url" --data "{\"jsonrpc\":\"2.0\",\"method\":\"eth_sendTransaction\",\"params\":[{\"from\":\"$deployer\", \"to\":null, \"gas\": \"0x1312D00\", \"data\":\"$data\"}], \"id\":1}" -H 'Content-Type: application/json' | jq -r '.result') + + contract_address=$(curl -sS -X POST -H "Content-Type: application/json" "$rpc_url" --data "{\"jsonrpc\":\"2.0\",\"method\":\"eth_getTransactionReceipt\",\"params\":[\"$tx_hash\"],\"id\":1}" | jq -r '.result.contractAddress') + + echo "$contract_address" +} + +_read_contract_config() { + local contract=$1 + local param=$2 + + jq -r ".\"$contract\".\"$param\"" <"$config_json" +} + +_print_checksum() { + + echo -e "${ORANGE}$1${NC} checksum: $(echo "${!1}" | $sha256sum)" +} + +_err() { + local message=$1 + + echo -e "${RED}Error:${NC} $message, aborting." >&2 + exit 1 +} + +# Intercept ctrl+C +trap ctrl_c INT +ctrl_c() { + if [[ "$fork_pid" -gt 0 ]]; then + echo "Stopping ganache" + kill -SIGTERM "$fork_pid" + fi + exit 0 +} + +# Run main +main "$@" +ctrl_c diff --git a/bytecode-verificator/compilers/solc-darwin-0.8.6 b/bytecode-verificator/compilers/solc-darwin-0.8.6 new file mode 100755 index 00000000..aa535423 Binary files /dev/null and b/bytecode-verificator/compilers/solc-darwin-0.8.6 differ diff --git a/bytecode-verificator/compilers/solc-linux-0.8.6 b/bytecode-verificator/compilers/solc-linux-0.8.6 new file mode 100755 index 00000000..49b0ef8e Binary files /dev/null and b/bytecode-verificator/compilers/solc-linux-0.8.6 differ diff --git a/contracts/AllowedRecipientsBuilder.sol b/contracts/AllowedRecipientsBuilder.sol index 3133a57a..080756cd 100644 --- a/contracts/AllowedRecipientsBuilder.sol +++ b/contracts/AllowedRecipientsBuilder.sol @@ -3,31 +3,9 @@ pragma solidity ^0.8.4; -interface IEasyTrack { - function evmScriptExecutor() external view returns (address); -} - -interface IAllowedRecipientsRegistry { - function addRecipient(address _recipient, string memory _title) external; - - function renounceRole(bytes32 role, address account) external; - - function isRecipientAllowed(address _recipient) external view returns (bool); - - function setLimitParameters(uint256 _limit, uint256 _periodDurationMonths) external; - - function getLimitParameters() external view returns (uint256, uint256); - - function updateSpentAmount(uint256 _payoutAmount) external; - - function spendableBalance() external view returns (uint256); - - function hasRole(bytes32 role, address account) external view returns (bool); - - function getAllowedRecipients() external view returns (address[] memory); - - function bokkyPooBahsDateTimeContract() external view returns (address); -} +import "./interfaces/IAllowedRecipientsRegistry.sol"; +import "./interfaces/IAllowedTokensRegistry.sol"; +import "./interfaces/IEasyTrack.sol"; interface ITopUpAllowedRecipients { function token() external view returns (address); @@ -39,6 +17,8 @@ interface ITopUpAllowedRecipients { function trustedCaller() external view returns (address); function allowedRecipientsRegistry() external view returns (address); + + function allowedTokensRegistry() external view returns (address); } interface IAddAllowedRecipient { @@ -56,29 +36,34 @@ interface IRemoveAllowedRecipient { interface IAllowedRecipientsFactory { function deployAllowedRecipientsRegistry( address _admin, - address[] memory _addRecipientToAllowedListRoleHolders, - address[] memory _removeRecipientFromAllowedListRoleHolders, - address[] memory _setLimitParametersRoleHolders, - address[] memory _updateSpentAmountRoleHolders, + address[] calldata _addRecipientToAllowedListRoleHolders, + address[] calldata _removeRecipientFromAllowedListRoleHolders, + address[] calldata _setLimitParametersRoleHolders, + address[] calldata _updateSpentAmountRoleHolders, address bokkyPooBahsDateTimeContract ) external returns (IAllowedRecipientsRegistry); + function deployAllowedTokensRegistry( + address _defaultAdmin, + address[] calldata _addTokensToAllowedListRoleHolders, + address[] calldata _removeTokensFromAllowedListRoleHolders + ) external returns (IAllowedTokensRegistry registry); + function deployTopUpAllowedRecipients( address _trustedCaller, address _allowedRecipientsRegistry, - address _token, + address _allowedTokensRegistry, address _finance, - IEasyTrack _easyTrack - ) external returns (ITopUpAllowedRecipients); + address _easyTrack + ) external returns (ITopUpAllowedRecipients topUpAllowedRecipients); function deployAddAllowedRecipient(address _trustedCaller, address _allowedRecipientsRegistry) external returns (IAddAllowedRecipient); - function deployRemoveAllowedRecipient( - address _trustedCaller, - address _allowedRecipientsRegistry - ) external returns (IRemoveAllowedRecipient); + function deployRemoveAllowedRecipient(address _trustedCaller, address _allowedRecipientsRegistry) + external + returns (IRemoveAllowedRecipient); } contract AllowedRecipientsBuilder { @@ -89,10 +74,11 @@ contract AllowedRecipientsBuilder { address public immutable bokkyPooBahsDateTimeContract; IAllowedRecipientsFactory public immutable factory; - bytes32 public constant ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE = - keccak256("ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE"); + bytes32 public constant ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE = keccak256("ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE"); bytes32 public constant REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE = keccak256("REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE"); + bytes32 public constant ADD_TOKEN_TO_ALLOWED_LIST_ROLE = keccak256("ADD_TOKEN_TO_ALLOWED_LIST_ROLE"); + bytes32 public constant REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE = keccak256("REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE"); bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; bytes32 public constant SET_PARAMETERS_ROLE = keccak256("SET_PARAMETERS_ROLE"); bytes32 public constant UPDATE_SPENT_AMOUNT_ROLE = keccak256("UPDATE_SPENT_AMOUNT_ROLE"); @@ -204,136 +190,108 @@ contract AllowedRecipientsBuilder { assert(!registry.hasRole(DEFAULT_ADMIN_ROLE, address(this))); } + function deployAllowedTokensRegistry(address[] calldata _tokens) public returns (IAllowedTokensRegistry registry) { + address[] memory addTokenRoleHolders = new address[](2); + address[] memory removeTokenRoleHolders = new address[](1); + + addTokenRoleHolders[0] = admin; + addTokenRoleHolders[1] = address(this); + + removeTokenRoleHolders[0] = admin; + + registry = factory.deployAllowedTokensRegistry(admin, addTokenRoleHolders, removeTokenRoleHolders); + + for (uint256 i = 0; i < _tokens.length; i++) { + registry.addToken(_tokens[i]); + } + + registry.renounceRole(ADD_TOKEN_TO_ALLOWED_LIST_ROLE, address(this)); + + for (uint256 i = 0; i < _tokens.length; i++) { + assert(registry.isTokenAllowed(_tokens[i])); + } + + assert(registry.hasRole(ADD_TOKEN_TO_ALLOWED_LIST_ROLE, admin)); + assert(registry.hasRole(REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, admin)); + assert(registry.hasRole(DEFAULT_ADMIN_ROLE, admin)); + + assert(!registry.hasRole(ADD_TOKEN_TO_ALLOWED_LIST_ROLE, address(this))); + } + function deployTopUpAllowedRecipients( address _trustedCaller, address _allowedRecipientsRegistry, - address _token + address _allowedTokensRegistry ) public returns (ITopUpAllowedRecipients topUpAllowedRecipients) { topUpAllowedRecipients = factory.deployTopUpAllowedRecipients( - _trustedCaller, - _allowedRecipientsRegistry, - _token, - finance, - easyTrack + _trustedCaller, _allowedRecipientsRegistry, _allowedTokensRegistry, finance, address(easyTrack) ); - assert(topUpAllowedRecipients.token() == _token); assert(topUpAllowedRecipients.finance() == finance); assert(topUpAllowedRecipients.easyTrack() == easyTrack); assert(topUpAllowedRecipients.trustedCaller() == _trustedCaller); - assert( - address(topUpAllowedRecipients.allowedRecipientsRegistry()) == - _allowedRecipientsRegistry - ); + assert(address(topUpAllowedRecipients.allowedRecipientsRegistry()) == _allowedRecipientsRegistry); + assert(address(topUpAllowedRecipients.allowedTokensRegistry()) == _allowedTokensRegistry); } function deployAddAllowedRecipient(address _trustedCaller, address _allowedRecipientsRegistry) public returns (IAddAllowedRecipient addAllowedRecipient) { - addAllowedRecipient = factory.deployAddAllowedRecipient( - _trustedCaller, - _allowedRecipientsRegistry - ); + addAllowedRecipient = factory.deployAddAllowedRecipient(_trustedCaller, _allowedRecipientsRegistry); assert(addAllowedRecipient.trustedCaller() == _trustedCaller); - assert( - address(addAllowedRecipient.allowedRecipientsRegistry()) == _allowedRecipientsRegistry - ); + assert(address(addAllowedRecipient.allowedRecipientsRegistry()) == _allowedRecipientsRegistry); } - function deployRemoveAllowedRecipient( - address _trustedCaller, - address _allowedRecipientsRegistry - ) public returns (IRemoveAllowedRecipient removeAllowedRecipient) { - removeAllowedRecipient = factory.deployRemoveAllowedRecipient( - _trustedCaller, - _allowedRecipientsRegistry - ); + function deployRemoveAllowedRecipient(address _trustedCaller, address _allowedRecipientsRegistry) + public + returns (IRemoveAllowedRecipient removeAllowedRecipient) + { + removeAllowedRecipient = factory.deployRemoveAllowedRecipient(_trustedCaller, _allowedRecipientsRegistry); assert(removeAllowedRecipient.trustedCaller() == _trustedCaller); - assert( - address(removeAllowedRecipient.allowedRecipientsRegistry()) == - _allowedRecipientsRegistry - ); + assert(address(removeAllowedRecipient.allowedRecipientsRegistry()) == _allowedRecipientsRegistry); } function deployFullSetup( address _trustedCaller, - address _token, uint256 _limit, uint256 _periodDurationMonths, - address[] memory _recipients, - string[] memory _titles, + address[] calldata _tokens, + address[] calldata _recipients, + string[] calldata _titles, uint256 _spentAmount - ) - public - returns ( - IAllowedRecipientsRegistry allowedRecipientsRegistry, - ITopUpAllowedRecipients topUpAllowedRecipients, - IAddAllowedRecipient addAllowedRecipient, - IRemoveAllowedRecipient removeAllowedRecipient - ) - { - allowedRecipientsRegistry = deployAllowedRecipientsRegistry( - _limit, - _periodDurationMonths, - _recipients, - _titles, - _spentAmount, - true - ); + ) public { + IAllowedRecipientsRegistry allowedRecipientsRegistry = + deployAllowedRecipientsRegistry(_limit, _periodDurationMonths, _recipients, _titles, _spentAmount, true); + IAllowedTokensRegistry allowedTokensRegistry = deployAllowedTokensRegistry(_tokens); - topUpAllowedRecipients = deployTopUpAllowedRecipients( - _trustedCaller, - address(allowedRecipientsRegistry), - _token - ); + deployTopUpAllowedRecipients(_trustedCaller, address(allowedRecipientsRegistry), address(allowedTokensRegistry)); - addAllowedRecipient = deployAddAllowedRecipient( - _trustedCaller, - address(allowedRecipientsRegistry) - ); + deployAddAllowedRecipient(_trustedCaller, address(allowedRecipientsRegistry)); - removeAllowedRecipient = deployRemoveAllowedRecipient( - _trustedCaller, - address(allowedRecipientsRegistry) - ); + deployRemoveAllowedRecipient(_trustedCaller, address(allowedRecipientsRegistry)); } function deploySingleRecipientTopUpOnlySetup( address _recipient, - string memory _title, - address _token, + string calldata _title, + address[] calldata _tokens, uint256 _limit, uint256 _periodDurationMonths, uint256 _spentAmount - ) - public - returns ( - IAllowedRecipientsRegistry allowedRecipientsRegistry, - ITopUpAllowedRecipients topUpAllowedRecipients - ) - { + ) public { address[] memory recipients = new address[](1); recipients[0] = _recipient; string[] memory titles = new string[](1); titles[0] = _title; - allowedRecipientsRegistry = deployAllowedRecipientsRegistry( - _limit, - _periodDurationMonths, - recipients, - titles, - _spentAmount, - false - ); + IAllowedRecipientsRegistry allowedRecipientsRegistry = + deployAllowedRecipientsRegistry(_limit, _periodDurationMonths, recipients, titles, _spentAmount, false); + IAllowedTokensRegistry allowedTokensRegistry = deployAllowedTokensRegistry(_tokens); - topUpAllowedRecipients = deployTopUpAllowedRecipients( - _recipient, - address(allowedRecipientsRegistry), - _token - ); + deployTopUpAllowedRecipients(_recipient, address(allowedRecipientsRegistry), address(allowedTokensRegistry)); } } diff --git a/contracts/AllowedRecipientsFactory.sol b/contracts/AllowedRecipientsFactory.sol index 123798a5..649f0539 100644 --- a/contracts/AllowedRecipientsFactory.sol +++ b/contracts/AllowedRecipientsFactory.sol @@ -7,6 +7,7 @@ import "./EVMScriptFactories/AddAllowedRecipient.sol"; import "./EVMScriptFactories/RemoveAllowedRecipient.sol"; import "./EVMScriptFactories/TopUpAllowedRecipients.sol"; import "./AllowedRecipientsRegistry.sol"; +import "./AllowedTokensRegistry.sol"; /// @author bulbozaur /// @notice Factory for Allowed Recipient Easy Track contracts @@ -22,13 +23,21 @@ contract AllowedRecipientsFactory { IBokkyPooBahsDateTimeContract bokkyPooBahsDateTimeContract ); + event AllowedTokensRegistryDeployed( + address indexed creator, + address indexed allowedTokensRegistry, + address _defaultAdmin, + address[] addTokenToAllowedListRoleHolders, + address[] removeTokenFromAllowedListRoleHolders + ); + event TopUpAllowedRecipientsDeployed( address indexed creator, address indexed topUpAllowedRecipients, address trustedCaller, address allowedRecipientsRegistry, + address allowedTokenssRegistry, address finance, - address token, address easyTrack ); @@ -48,12 +57,12 @@ contract AllowedRecipientsFactory { function deployAllowedRecipientsRegistry( address _defaultAdmin, - address[] memory _addRecipientToAllowedListRoleHolders, - address[] memory _removeRecipientFromAllowedListRoleHolders, - address[] memory _setLimitParametersRoleHolders, - address[] memory _updateSpentAmountRoleHolders, + address[] calldata _addRecipientToAllowedListRoleHolders, + address[] calldata _removeRecipientFromAllowedListRoleHolders, + address[] calldata _setLimitParametersRoleHolders, + address[] calldata _updateSpentAmountRoleHolders, IBokkyPooBahsDateTimeContract _bokkyPooBahsDateTimeContract - ) public returns (AllowedRecipientsRegistry registry) { + ) external returns (AllowedRecipientsRegistry registry) { registry = new AllowedRecipientsRegistry( _defaultAdmin, _addRecipientToAllowedListRoleHolders, @@ -75,18 +84,38 @@ contract AllowedRecipientsFactory { ); } + function deployAllowedTokensRegistry( + address _defaultAdmin, + address[] calldata _addTokensToAllowedListRoleHolders, + address[] calldata _removeTokensFromAllowedListRoleHolders + ) external returns (AllowedTokensRegistry registry) { + registry = new AllowedTokensRegistry( + _defaultAdmin, + _addTokensToAllowedListRoleHolders, + _removeTokensFromAllowedListRoleHolders + ); + + emit AllowedTokensRegistryDeployed( + msg.sender, + address(registry), + _defaultAdmin, + _addTokensToAllowedListRoleHolders, + _removeTokensFromAllowedListRoleHolders + ); + } + function deployTopUpAllowedRecipients( address _trustedCaller, address _allowedRecipientsRegistry, - address _token, + address _allowedTokensRegistry, address _finance, address _easyTrack - ) public returns (TopUpAllowedRecipients topUpAllowedRecipients) { + ) external returns (TopUpAllowedRecipients topUpAllowedRecipients) { topUpAllowedRecipients = new TopUpAllowedRecipients( _trustedCaller, _allowedRecipientsRegistry, + _allowedTokensRegistry, _finance, - _token, _easyTrack ); @@ -95,8 +124,8 @@ contract AllowedRecipientsFactory { address(topUpAllowedRecipients), _trustedCaller, _allowedRecipientsRegistry, + _allowedTokensRegistry, _finance, - _token, _easyTrack ); @@ -104,7 +133,7 @@ contract AllowedRecipientsFactory { } function deployAddAllowedRecipient(address _trustedCaller, address _allowedRecipientsRegistry) - public + external returns (AddAllowedRecipient addAllowedRecipient) { addAllowedRecipient = new AddAllowedRecipient(_trustedCaller, _allowedRecipientsRegistry); @@ -120,7 +149,7 @@ contract AllowedRecipientsFactory { function deployRemoveAllowedRecipient( address _trustedCaller, address _allowedRecipientsRegistry - ) public returns (RemoveAllowedRecipient removeAllowedRecipient) { + ) external returns (RemoveAllowedRecipient removeAllowedRecipient) { removeAllowedRecipient = new RemoveAllowedRecipient( _trustedCaller, _allowedRecipientsRegistry diff --git a/contracts/AllowedTokensRegistry.sol b/contracts/AllowedTokensRegistry.sol new file mode 100644 index 00000000..4670fa0a --- /dev/null +++ b/contracts/AllowedTokensRegistry.sol @@ -0,0 +1,130 @@ +// SPDX-FileCopyrightText: 2022 Lido +// SPDX-License-Identifier: GPL-3.0 +pragma solidity ^0.8.4; + +import "OpenZeppelin/openzeppelin-contracts@4.3.2/contracts/access/AccessControl.sol"; +import "OpenZeppelin/openzeppelin-contracts@4.3.2/contracts/token/ERC20/extensions/IERC20Metadata.sol"; + +contract AllowedTokensRegistry is AccessControl { + // ------------- + // EVENTS + // ------------- + event TokenAdded(address indexed _token); + event TokenRemoved(address indexed _token); + + // ------------- + // ROLES + // ------------- + + bytes32 public constant ADD_TOKEN_TO_ALLOWED_LIST_ROLE = keccak256("ADD_TOKEN_TO_ALLOWED_LIST_ROLE"); + bytes32 public constant REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE = keccak256("REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE"); + + // ------------- + // ERRORS + // ------------- + string private constant ERROR_TOKEN_ALREADY_ADDED_TO_ALLOWED_LIST = "TOKEN_ALREADY_ADDED_TO_ALLOWED_LIST"; + string private constant ERROR_TOKEN_NOT_FOUND_IN_ALLOWED_LIST = "TOKEN_NOT_FOUND_IN_ALLOWED_LIST"; + string private constant ERROR_TOKEN_ADDRESS_IS_ZERO = "TOKEN_ADDRESS_IS_ZERO"; + + // ------------- + // VARIABLES + // ------------- + /// @dev List of allowed tokens for payouts + address[] public allowedTokens; + + // Position of the address in the `allowedTokens` array, + // plus 1 because index 0 means a value is not in the set. + mapping(address => uint256) private allowedTokenIndices; + + /// @notice Precise number of tokens in the system + uint8 internal constant DECIMALS = 18; + + constructor( + address _admin, + address[] memory _addTokenToAllowedListRoleHolders, + address[] memory _removeTokenFromAllowedListRoleHolders + ) { + _setupRole(DEFAULT_ADMIN_ROLE, _admin); + for (uint256 i = 0; i < _addTokenToAllowedListRoleHolders.length; i++) { + _setupRole(ADD_TOKEN_TO_ALLOWED_LIST_ROLE, _addTokenToAllowedListRoleHolders[i]); + } + for (uint256 i = 0; i < _removeTokenFromAllowedListRoleHolders.length; i++) { + _setupRole(REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, _removeTokenFromAllowedListRoleHolders[i]); + } + } + + // ------------- + // EXTERNAL METHODS + // ------------- + + /// @notice Adds address to list of allowed tokens for payouts + function addToken(address _token) external onlyRole(ADD_TOKEN_TO_ALLOWED_LIST_ROLE) { + require(_token != address(0), ERROR_TOKEN_ADDRESS_IS_ZERO); + require(allowedTokenIndices[_token] == 0, ERROR_TOKEN_ALREADY_ADDED_TO_ALLOWED_LIST); + + allowedTokens.push(_token); + allowedTokenIndices[_token] = allowedTokens.length; + emit TokenAdded(_token); + } + + /// @notice Removes address from list of allowed tokens for payouts + /// @dev To delete an allowed token from the allowedTokens array in O(1), + /// we swap the element to delete with the last one in the array, + /// and then remove the last element (sometimes called as 'swap and pop'). + function removeToken(address _token) external onlyRole(REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE) { + uint256 index = _getAllowedTokenIndex(_token); + uint256 lastIndex = allowedTokens.length - 1; + + if (index != lastIndex) { + address lastAllowedToken = allowedTokens[lastIndex]; + allowedTokens[index] = lastAllowedToken; + allowedTokenIndices[lastAllowedToken] = index + 1; + } + + allowedTokens.pop(); + delete allowedTokenIndices[_token]; + emit TokenRemoved(_token); + } + + /// @notice Returns if passed address is listed as allowed token in the registry + function isTokenAllowed(address _token) external view returns (bool) { + return allowedTokenIndices[_token] > 0; + } + + /// @notice Returns current list of allowed tokens + function getAllowedTokens() external view returns (address[] memory) { + return allowedTokens; + } + + /// @notice Transforms amout from token format to precise format + function normalizeAmount(uint256 _tokenAmount, address _token) external view returns (uint256) { + require(_token != address(0), ERROR_TOKEN_ADDRESS_IS_ZERO); + + if (_tokenAmount == 0) return 0; + + uint8 tokenDecimals = IERC20Metadata(_token).decimals(); + + if (tokenDecimals == DECIMALS) return _tokenAmount; + if (tokenDecimals > DECIMALS) { + // It's rounded up to fit into limits + // https://github.com/OpenZeppelin/openzeppelin-contracts/blob/3e6c86392c97fbc30d3d20a378a6f58beba08eba/contracts/utils/math/Math.sol#L107 + return (_tokenAmount - 1) / 10 ** (tokenDecimals - DECIMALS) + 1; + } + return _tokenAmount * 10 ** (DECIMALS - tokenDecimals); + } + + /// @notice Returns precision of the token + function decimals() pure external returns (uint8) { + return DECIMALS; + } + + // ------------------ + // PRIVATE METHODS + // ------------------ + + function _getAllowedTokenIndex(address _token) private view returns (uint256 _index) { + _index = allowedTokenIndices[_token]; + require(_index > 0, ERROR_TOKEN_NOT_FOUND_IN_ALLOWED_LIST); + _index -= 1; + } +} diff --git a/contracts/EVMScriptFactories/TopUpAllowedRecipients.sol b/contracts/EVMScriptFactories/TopUpAllowedRecipients.sol index 10008f12..7850dc05 100644 --- a/contracts/EVMScriptFactories/TopUpAllowedRecipients.sol +++ b/contracts/EVMScriptFactories/TopUpAllowedRecipients.sol @@ -4,11 +4,12 @@ pragma solidity ^0.8.4; import "../TrustedCaller.sol"; -import "../AllowedRecipientsRegistry.sol"; +import "../interfaces/IAllowedRecipientsRegistry.sol"; +import "../interfaces/IAllowedTokensRegistry.sol"; import "../interfaces/IFinance.sol"; import "../libraries/EVMScriptCreator.sol"; import "../interfaces/IEVMScriptFactory.sol"; -import "../EasyTrack.sol"; +import "../interfaces/IEasyTrack.sol"; /// @notice Creates EVMScript to top up allowed recipients addresses within the current spendable balance contract TopUpAllowedRecipients is TrustedCaller, IEVMScriptFactory { @@ -18,7 +19,9 @@ contract TopUpAllowedRecipients is TrustedCaller, IEVMScriptFactory { string private constant ERROR_LENGTH_MISMATCH = "LENGTH_MISMATCH"; string private constant ERROR_EMPTY_DATA = "EMPTY_DATA"; string private constant ERROR_ZERO_AMOUNT = "ZERO_AMOUNT"; + string private constant ERROR_TOKEN_NOT_ALLOWED = "TOKEN_NOT_ALLOWED"; string private constant ERROR_RECIPIENT_NOT_ALLOWED = "RECIPIENT_NOT_ALLOWED"; + string private constant ERROR_ZERO_RECIPIENT = "ZERO_RECIPIENT"; string private constant ERROR_SUM_EXCEEDS_SPENDABLE_BALANCE = "SUM_EXCEEDS_SPENDABLE_BALANCE"; // ------------- @@ -26,16 +29,16 @@ contract TopUpAllowedRecipients is TrustedCaller, IEVMScriptFactory { // ------------- /// @notice Address of EasyTrack contract - EasyTrack public immutable easyTrack; + IEasyTrack public immutable easyTrack; /// @notice Address of Aragon's Finance contract IFinance public immutable finance; - /// @notice Address of payout token - address public token; - /// @notice Address of AllowedRecipientsRegistry contract - AllowedRecipientsRegistry public allowedRecipientsRegistry; + IAllowedRecipientsRegistry public immutable allowedRecipientsRegistry; + + /// @notice Address of AllowedTokensRegistry contract + IAllowedTokensRegistry public immutable allowedTokensRegistry; // ------------- // CONSTRUCTOR @@ -44,20 +47,20 @@ contract TopUpAllowedRecipients is TrustedCaller, IEVMScriptFactory { /// @param _trustedCaller Address that has access to certain methods. /// Set once on deployment and can't be changed. /// @param _allowedRecipientsRegistry Address of AllowedRecipientsRegistry contract + /// @param _allowedTokensRegistry Address of AllowedTokensRegistry contract /// @param _finance Address of Aragon's Finance contract - /// @param _token Address of payout token /// @param _easyTrack Address of EasyTrack contract constructor( address _trustedCaller, address _allowedRecipientsRegistry, + address _allowedTokensRegistry, address _finance, - address _token, address _easyTrack ) TrustedCaller(_trustedCaller) { finance = IFinance(_finance); - token = _token; - allowedRecipientsRegistry = AllowedRecipientsRegistry(_allowedRecipientsRegistry); - easyTrack = EasyTrack(_easyTrack); + allowedRecipientsRegistry = IAllowedRecipientsRegistry(_allowedRecipientsRegistry); + allowedTokensRegistry = IAllowedTokensRegistry(_allowedTokensRegistry); + easyTrack = IEasyTrack(_easyTrack); } // ------------- @@ -66,21 +69,21 @@ contract TopUpAllowedRecipients is TrustedCaller, IEVMScriptFactory { /// @notice Creates EVMScript to top up allowed recipients addresses /// @param _creator Address who creates EVMScript - /// @param _evmScriptCallData Encoded tuple: (address[] recipients, uint256[] amounts) where + /// @param _evmScriptCallData Encoded tuple: (address token, address[] recipients, uint256[] amounts) where + /// token - address of token to top up /// recipients - addresses of recipients to top up /// amounts - corresponding amounts of token to transfer /// @dev note that the arrays below has one extra element to store limit enforcement calls - function createEVMScript(address _creator, bytes memory _evmScriptCallData) + function createEVMScript(address _creator, bytes calldata _evmScriptCallData) external view override onlyTrustedCaller(_creator) returns (bytes memory) { - (address[] memory recipients, uint256[] memory amounts) = _decodeEVMScriptCallData( - _evmScriptCallData - ); - uint256 totalAmount = _validateEVMScriptCallData(recipients, amounts); + (address token, address[] memory recipients, uint256[] memory amounts) = + _decodeEVMScriptCallData(_evmScriptCallData); + uint256 normalizedAmount = _validateEVMScriptCallData(token, recipients, amounts); address[] memory to = new address[](recipients.length + 1); bytes4[] memory methodIds = new bytes4[](recipients.length + 1); @@ -88,17 +91,12 @@ contract TopUpAllowedRecipients is TrustedCaller, IEVMScriptFactory { to[0] = address(allowedRecipientsRegistry); methodIds[0] = allowedRecipientsRegistry.updateSpentAmount.selector; - evmScriptsCalldata[0] = abi.encode(totalAmount); + evmScriptsCalldata[0] = abi.encode(normalizedAmount); for (uint256 i = 0; i < recipients.length; ++i) { to[i + 1] = address(finance); methodIds[i + 1] = finance.newImmediatePayment.selector; - evmScriptsCalldata[i + 1] = abi.encode( - token, - recipients[i], - amounts[i], - "Easy Track: top up recipient" - ); + evmScriptsCalldata[i + 1] = abi.encode(token, recipients[i], amounts[i], "Easy Track: top up recipient"); } return EVMScriptCreator.createEVMScript(to, methodIds, evmScriptsCalldata); @@ -108,12 +106,13 @@ contract TopUpAllowedRecipients is TrustedCaller, IEVMScriptFactory { /// @param _evmScriptCallData Encoded tuple: (address[] recipients, uint256[] amounts) where /// recipients - addresses of recipients to top up /// amounts - corresponding amounts of token to transfer + /// @return token Address of payout token /// @return recipients Addresses of recipients to top up /// @return amounts Amounts of token to transfer - function decodeEVMScriptCallData(bytes memory _evmScriptCallData) + function decodeEVMScriptCallData(bytes calldata _evmScriptCallData) external pure - returns (address[] memory recipients, uint256[] memory amounts) + returns (address token, address[] memory recipients, uint256[] memory amounts) { return _decodeEVMScriptCallData(_evmScriptCallData); } @@ -122,32 +121,35 @@ contract TopUpAllowedRecipients is TrustedCaller, IEVMScriptFactory { // PRIVATE METHODS // ------------------ - function _validateEVMScriptCallData(address[] memory _recipients, uint256[] memory _amounts) + function _validateEVMScriptCallData(address token, address[] memory _recipients, uint256[] memory _amounts) private view - returns (uint256 totalAmount) + returns (uint256 normalizedAmount) { require(_amounts.length == _recipients.length, ERROR_LENGTH_MISMATCH); require(_recipients.length > 0, ERROR_EMPTY_DATA); + require(allowedTokensRegistry.isTokenAllowed(token), ERROR_TOKEN_NOT_ALLOWED); + + uint256 totalAmount; for (uint256 i = 0; i < _recipients.length; ++i) { require(_amounts[i] > 0, ERROR_ZERO_AMOUNT); - require( - allowedRecipientsRegistry.isRecipientAllowed(_recipients[i]), - ERROR_RECIPIENT_NOT_ALLOWED - ); + require(_recipients[i] != address(0), ERROR_ZERO_RECIPIENT); + require(allowedRecipientsRegistry.isRecipientAllowed(_recipients[i]), ERROR_RECIPIENT_NOT_ALLOWED); totalAmount += _amounts[i]; } - _validateSpendableBalance(totalAmount); + normalizedAmount = allowedTokensRegistry.normalizeAmount(totalAmount, token); + + _validateSpendableBalance(normalizedAmount); } - function _decodeEVMScriptCallData(bytes memory _evmScriptCallData) + function _decodeEVMScriptCallData(bytes calldata _evmScriptCallData) private pure - returns (address[] memory recipients, uint256[] memory amounts) + returns (address token, address[] memory recipients, uint256[] memory amounts) { - return abi.decode(_evmScriptCallData, (address[], uint256[])); + return abi.decode(_evmScriptCallData, (address, address[], uint256[])); } function _validateSpendableBalance(uint256 _amount) private view { diff --git a/contracts/interfaces/IAllowedRecipientsRegistry.sol b/contracts/interfaces/IAllowedRecipientsRegistry.sol new file mode 100644 index 00000000..9de089a1 --- /dev/null +++ b/contracts/interfaces/IAllowedRecipientsRegistry.sol @@ -0,0 +1,28 @@ +// SPDX-FileCopyrightText: 2022 Lido +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity ^0.8.4; + +interface IAllowedRecipientsRegistry { + function addRecipient(address _recipient, string memory _title) external; + + function renounceRole(bytes32 role, address account) external; + + function isRecipientAllowed(address _recipient) external view returns (bool); + + function setLimitParameters(uint256 _limit, uint256 _periodDurationMonths) external; + + function getLimitParameters() external view returns (uint256, uint256); + + function updateSpentAmount(uint256 _payoutAmount) external; + + function spendableBalance() external view returns (uint256); + + function hasRole(bytes32 role, address account) external view returns (bool); + + function getAllowedRecipients() external view returns (address[] memory); + + function bokkyPooBahsDateTimeContract() external view returns (address); + + function isUnderSpendableBalance(uint256 _amount, uint256 _motionDuration) external view returns (bool); +} \ No newline at end of file diff --git a/contracts/interfaces/IAllowedTokensRegistry.sol b/contracts/interfaces/IAllowedTokensRegistry.sol new file mode 100644 index 00000000..fa62ef6b --- /dev/null +++ b/contracts/interfaces/IAllowedTokensRegistry.sol @@ -0,0 +1,22 @@ +// SPDX-FileCopyrightText: 2022 Lido +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity ^0.8.4; + +interface IAllowedTokensRegistry { + function addToken(address _token) external; + + function removeToken(address _token) external; + + function renounceRole(bytes32 role, address account) external; + + function isTokenAllowed(address _token) external view returns (bool); + + function hasRole(bytes32 role, address account) external view returns (bool); + + function getAllowedTokens() external view returns (address[] memory); + + function decimals() external view returns (uint8); + + function normalizeAmount(uint256 _amount, address _token) external view returns (uint256); +} \ No newline at end of file diff --git a/contracts/interfaces/IEasyTrack.sol b/contracts/interfaces/IEasyTrack.sol new file mode 100644 index 00000000..7a1468e8 --- /dev/null +++ b/contracts/interfaces/IEasyTrack.sol @@ -0,0 +1,9 @@ +// SPDX-FileCopyrightText: 2022 Lido +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity ^0.8.4; + +interface IEasyTrack { + function motionDuration() external view returns (uint256); + function evmScriptExecutor() external view returns (address); +} \ No newline at end of file diff --git a/contracts/test/MockERC20.sol b/contracts/test/MockERC20.sol new file mode 100644 index 00000000..c223f5ef --- /dev/null +++ b/contracts/test/MockERC20.sol @@ -0,0 +1,13 @@ +// SPDX-FileCopyrightText: 2021 Lido +// SPDX-License-Identifier: GPL-3.0 + +pragma solidity ^0.8.4; + +contract MockERC20 { + + uint8 public decimals; + + constructor(uint8 _decimals) { + decimals = _decimals; + } +} \ No newline at end of file diff --git a/dependencies/OpenZeppelin/openzeppelin-contracts@4.3.2/contracts/token/ERC20/IERC20.sol b/dependencies/OpenZeppelin/openzeppelin-contracts@4.3.2/contracts/token/ERC20/IERC20.sol new file mode 100644 index 00000000..b7490382 --- /dev/null +++ b/dependencies/OpenZeppelin/openzeppelin-contracts@4.3.2/contracts/token/ERC20/IERC20.sol @@ -0,0 +1,77 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} \ No newline at end of file diff --git a/dependencies/OpenZeppelin/openzeppelin-contracts@4.3.2/contracts/token/ERC20/extensions/IERC20Metadata.sol b/dependencies/OpenZeppelin/openzeppelin-contracts@4.3.2/contracts/token/ERC20/extensions/IERC20Metadata.sol new file mode 100644 index 00000000..93666341 --- /dev/null +++ b/dependencies/OpenZeppelin/openzeppelin-contracts@4.3.2/contracts/token/ERC20/extensions/IERC20Metadata.sol @@ -0,0 +1,27 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.0; + +import "../IERC20.sol"; + +/** + * @dev Interface for the optional metadata functions from the ERC20 standard. + * + * _Available since v4.1._ + */ +interface IERC20Metadata is IERC20 { + /** + * @dev Returns the name of the token. + */ + function name() external view returns (string memory); + + /** + * @dev Returns the symbol of the token. + */ + function symbol() external view returns (string memory); + + /** + * @dev Returns the decimals places of the token. + */ + function decimals() external view returns (uint8); +} \ No newline at end of file diff --git a/deployed-mainnet.json b/deployed-mainnet.json new file mode 100644 index 00000000..7e9cff14 --- /dev/null +++ b/deployed-mainnet.json @@ -0,0 +1,18 @@ +{ + "AllowedRecipientsBuilder": { + "contract": "AllowedRecipientsBuilder", + "address": "0x334D6eDc13F63728b39e6A6D04A7Bbd5D6A9B9FF", + "constructorArgs": [ + "0xEe60C6ebC91237d334230b12263E26EE3b480ec4", + "0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c", + "0xF0211b7660680B49De1A7E9f25C65660F0a13Fea", + "0xB9E5CBB9CA5b0d659238807E84D0176930753d86", + "0x75100bd564415731B5936A4A94D0dC29DdE5dB3C" + ] + }, + "AllowedRecipientsFactory": { + "contract": "AllowedRecipientsFactory", + "address": "0xEe60C6ebC91237d334230b12263E26EE3b480ec4", + "constructorArgs": [] + } +} \ No newline at end of file diff --git a/network-config.yaml b/network-config.yaml index 9d13ac9b..8bb05d2e 100644 --- a/network-config.yaml +++ b/network-config.yaml @@ -1,10 +1,21 @@ +live: +- name: Ethereum + networks: + - chainid: 17000 + explorer: https://api-holesky.etherscan.io/api + host: $HOLESKY_RPC_URL + id: holesky + # New backward-compatible multicall contract. multicall2 is missing on Holesky. See https://github.com/mds1/multicall + multicall2: "0xcA11bde05977b3631167028862bE2a173976CA11" + name: Holesky (Infura) + provider: infura development: - cmd: ./ganache.sh cmd_settings: accounts: 10 evm_version: istanbul fork: mainnet - gas_limit: 12000000 + gas_limit: 30000000 mnemonic: brownie port: 8545 host: http://127.0.0.1 @@ -16,9 +27,20 @@ development: accounts: 10 chain_id: 5 fork: goerli - gas_limit: 12000000 + gas_limit: 30000000 mnemonic: brownie port: 8545 host: http://127.0.0.1 id: goerli-fork name: goerli-fork + - cmd: ./ganache.sh + cmd_settings: + accounts: 10 + chain_id: 17000 + fork: $HOLESKY_RPC_URL + gas_limit: 12000000 + mnemonic: brownie + port: 8545 + host: http://127.0.0.1 + id: holesky-fork + name: holesky-fork \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index fa04754c..3aefc305 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,10 +1,100 @@ +# This file is automatically @generated by Poetry 1.6.1 and should not be changed by hand. + [[package]] name = "aiohttp" -version = "3.8.1" +version = "3.8.3" description = "Async http client/server framework (asyncio)" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "aiohttp-3.8.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ba71c9b4dcbb16212f334126cc3d8beb6af377f6703d9dc2d9fb3874fd667ee9"}, + {file = "aiohttp-3.8.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d24b8bb40d5c61ef2d9b6a8f4528c2f17f1c5d2d31fed62ec860f6006142e83e"}, + {file = "aiohttp-3.8.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f88df3a83cf9df566f171adba39d5bd52814ac0b94778d2448652fc77f9eb491"}, + {file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97decbb3372d4b69e4d4c8117f44632551c692bb1361b356a02b97b69e18a62"}, + {file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309aa21c1d54b8ef0723181d430347d7452daaff93e8e2363db8e75c72c2fb2d"}, + {file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad5383a67514e8e76906a06741febd9126fc7c7ff0f599d6fcce3e82b80d026f"}, + {file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20acae4f268317bb975671e375493dbdbc67cddb5f6c71eebdb85b34444ac46b"}, + {file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05a3c31c6d7cd08c149e50dc7aa2568317f5844acd745621983380597f027a18"}, + {file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d6f76310355e9fae637c3162936e9504b4767d5c52ca268331e2756e54fd4ca5"}, + {file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:256deb4b29fe5e47893fa32e1de2d73c3afe7407738bd3c63829874661d4822d"}, + {file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5c59fcd80b9049b49acd29bd3598cada4afc8d8d69bd4160cd613246912535d7"}, + {file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:059a91e88f2c00fe40aed9031b3606c3f311414f86a90d696dd982e7aec48142"}, + {file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2feebbb6074cdbd1ac276dbd737b40e890a1361b3cc30b74ac2f5e24aab41f7b"}, + {file = "aiohttp-3.8.3-cp310-cp310-win32.whl", hash = "sha256:5bf651afd22d5f0c4be16cf39d0482ea494f5c88f03e75e5fef3a85177fecdeb"}, + {file = "aiohttp-3.8.3-cp310-cp310-win_amd64.whl", hash = "sha256:653acc3880459f82a65e27bd6526e47ddf19e643457d36a2250b85b41a564715"}, + {file = "aiohttp-3.8.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:86fc24e58ecb32aee09f864cb11bb91bc4c1086615001647dbfc4dc8c32f4008"}, + {file = "aiohttp-3.8.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75e14eac916f024305db517e00a9252714fce0abcb10ad327fb6dcdc0d060f1d"}, + {file = "aiohttp-3.8.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d1fde0f44029e02d02d3993ad55ce93ead9bb9b15c6b7ccd580f90bd7e3de476"}, + {file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ab94426ddb1ecc6a0b601d832d5d9d421820989b8caa929114811369673235c"}, + {file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89d2e02167fa95172c017732ed7725bc8523c598757f08d13c5acca308e1a061"}, + {file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:02f9a2c72fc95d59b881cf38a4b2be9381b9527f9d328771e90f72ac76f31ad8"}, + {file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c7149272fb5834fc186328e2c1fa01dda3e1fa940ce18fded6d412e8f2cf76d"}, + {file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:512bd5ab136b8dc0ffe3fdf2dfb0c4b4f49c8577f6cae55dca862cd37a4564e2"}, + {file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7018ecc5fe97027214556afbc7c502fbd718d0740e87eb1217b17efd05b3d276"}, + {file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:88c70ed9da9963d5496d38320160e8eb7e5f1886f9290475a881db12f351ab5d"}, + {file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:da22885266bbfb3f78218dc40205fed2671909fbd0720aedba39b4515c038091"}, + {file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:e65bc19919c910127c06759a63747ebe14f386cda573d95bcc62b427ca1afc73"}, + {file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:08c78317e950e0762c2983f4dd58dc5e6c9ff75c8a0efeae299d363d439c8e34"}, + {file = "aiohttp-3.8.3-cp311-cp311-win32.whl", hash = "sha256:45d88b016c849d74ebc6f2b6e8bc17cabf26e7e40c0661ddd8fae4c00f015697"}, + {file = "aiohttp-3.8.3-cp311-cp311-win_amd64.whl", hash = "sha256:96372fc29471646b9b106ee918c8eeb4cca423fcbf9a34daa1b93767a88a2290"}, + {file = "aiohttp-3.8.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c971bf3786b5fad82ce5ad570dc6ee420f5b12527157929e830f51c55dc8af77"}, + {file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff25f48fc8e623d95eca0670b8cc1469a83783c924a602e0fbd47363bb54aaca"}, + {file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e381581b37db1db7597b62a2e6b8b57c3deec95d93b6d6407c5b61ddc98aca6d"}, + {file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db19d60d846283ee275d0416e2a23493f4e6b6028825b51290ac05afc87a6f97"}, + {file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25892c92bee6d9449ffac82c2fe257f3a6f297792cdb18ad784737d61e7a9a85"}, + {file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:398701865e7a9565d49189f6c90868efaca21be65c725fc87fc305906be915da"}, + {file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4a4fbc769ea9b6bd97f4ad0b430a6807f92f0e5eb020f1e42ece59f3ecfc4585"}, + {file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:b29bfd650ed8e148f9c515474a6ef0ba1090b7a8faeee26b74a8ff3b33617502"}, + {file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:1e56b9cafcd6531bab5d9b2e890bb4937f4165109fe98e2b98ef0dcfcb06ee9d"}, + {file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ec40170327d4a404b0d91855d41bfe1fe4b699222b2b93e3d833a27330a87a6d"}, + {file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2df5f139233060578d8c2c975128fb231a89ca0a462b35d4b5fcf7c501ebdbe1"}, + {file = "aiohttp-3.8.3-cp36-cp36m-win32.whl", hash = "sha256:f973157ffeab5459eefe7b97a804987876dd0a55570b8fa56b4e1954bf11329b"}, + {file = "aiohttp-3.8.3-cp36-cp36m-win_amd64.whl", hash = "sha256:437399385f2abcd634865705bdc180c8314124b98299d54fe1d4c8990f2f9494"}, + {file = "aiohttp-3.8.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:09e28f572b21642128ef31f4e8372adb6888846f32fecb288c8b0457597ba61a"}, + {file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f3553510abdbec67c043ca85727396ceed1272eef029b050677046d3387be8d"}, + {file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e168a7560b7c61342ae0412997b069753f27ac4862ec7867eff74f0fe4ea2ad9"}, + {file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db4c979b0b3e0fa7e9e69ecd11b2b3174c6963cebadeecfb7ad24532ffcdd11a"}, + {file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e164e0a98e92d06da343d17d4e9c4da4654f4a4588a20d6c73548a29f176abe2"}, + {file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8a78079d9a39ca9ca99a8b0ac2fdc0c4d25fc80c8a8a82e5c8211509c523363"}, + {file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:21b30885a63c3f4ff5b77a5d6caf008b037cb521a5f33eab445dc566f6d092cc"}, + {file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4b0f30372cef3fdc262f33d06e7b411cd59058ce9174ef159ad938c4a34a89da"}, + {file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:8135fa153a20d82ffb64f70a1b5c2738684afa197839b34cc3e3c72fa88d302c"}, + {file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:ad61a9639792fd790523ba072c0555cd6be5a0baf03a49a5dd8cfcf20d56df48"}, + {file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:978b046ca728073070e9abc074b6299ebf3501e8dee5e26efacb13cec2b2dea0"}, + {file = "aiohttp-3.8.3-cp37-cp37m-win32.whl", hash = "sha256:0d2c6d8c6872df4a6ec37d2ede71eff62395b9e337b4e18efd2177de883a5033"}, + {file = "aiohttp-3.8.3-cp37-cp37m-win_amd64.whl", hash = "sha256:21d69797eb951f155026651f7e9362877334508d39c2fc37bd04ff55b2007091"}, + {file = "aiohttp-3.8.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ca9af5f8f5812d475c5259393f52d712f6d5f0d7fdad9acdb1107dd9e3cb7eb"}, + {file = "aiohttp-3.8.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d90043c1882067f1bd26196d5d2db9aa6d268def3293ed5fb317e13c9413ea4"}, + {file = "aiohttp-3.8.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d737fc67b9a970f3234754974531dc9afeea11c70791dcb7db53b0cf81b79784"}, + {file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebf909ea0a3fc9596e40d55d8000702a85e27fd578ff41a5500f68f20fd32e6c"}, + {file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5835f258ca9f7c455493a57ee707b76d2d9634d84d5d7f62e77be984ea80b849"}, + {file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da37dcfbf4b7f45d80ee386a5f81122501ec75672f475da34784196690762f4b"}, + {file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f44875f2804bc0511a69ce44a9595d5944837a62caecc8490bbdb0e18b1342"}, + {file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:527b3b87b24844ea7865284aabfab08eb0faf599b385b03c2aa91fc6edd6e4b6"}, + {file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5ba88df9aa5e2f806650fcbeedbe4f6e8736e92fc0e73b0400538fd25a4dd96"}, + {file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e7b8813be97cab8cb52b1375f41f8e6804f6507fe4660152e8ca5c48f0436017"}, + {file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:2dea10edfa1a54098703cb7acaa665c07b4e7568472a47f4e64e6319d3821ccf"}, + {file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:713d22cd9643ba9025d33c4af43943c7a1eb8547729228de18d3e02e278472b6"}, + {file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2d252771fc85e0cf8da0b823157962d70639e63cb9b578b1dec9868dd1f4f937"}, + {file = "aiohttp-3.8.3-cp38-cp38-win32.whl", hash = "sha256:66bd5f950344fb2b3dbdd421aaa4e84f4411a1a13fca3aeb2bcbe667f80c9f76"}, + {file = "aiohttp-3.8.3-cp38-cp38-win_amd64.whl", hash = "sha256:84b14f36e85295fe69c6b9789b51a0903b774046d5f7df538176516c3e422446"}, + {file = "aiohttp-3.8.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16c121ba0b1ec2b44b73e3a8a171c4f999b33929cd2397124a8c7fcfc8cd9e06"}, + {file = "aiohttp-3.8.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8d6aaa4e7155afaf994d7924eb290abbe81a6905b303d8cb61310a2aba1c68ba"}, + {file = "aiohttp-3.8.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:43046a319664a04b146f81b40e1545d4c8ac7b7dd04c47e40bf09f65f2437346"}, + {file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599418aaaf88a6d02a8c515e656f6faf3d10618d3dd95866eb4436520096c84b"}, + {file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92a2964319d359f494f16011e23434f6f8ef0434acd3cf154a6b7bec511e2fb7"}, + {file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73a4131962e6d91109bca6536416aa067cf6c4efb871975df734f8d2fd821b37"}, + {file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598adde339d2cf7d67beaccda3f2ce7c57b3b412702f29c946708f69cf8222aa"}, + {file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:75880ed07be39beff1881d81e4a907cafb802f306efd6d2d15f2b3c69935f6fb"}, + {file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0239da9fbafd9ff82fd67c16704a7d1bccf0d107a300e790587ad05547681c8"}, + {file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4e3a23ec214e95c9fe85a58470b660efe6534b83e6cbe38b3ed52b053d7cb6ad"}, + {file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:47841407cc89a4b80b0c52276f3cc8138bbbfba4b179ee3acbd7d77ae33f7ac4"}, + {file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:54d107c89a3ebcd13228278d68f1436d3f33f2dd2af5415e3feaeb1156e1a62c"}, + {file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c37c5cce780349d4d51739ae682dec63573847a2a8dcb44381b174c3d9c8d403"}, + {file = "aiohttp-3.8.3-cp39-cp39-win32.whl", hash = "sha256:f178d2aadf0166be4df834c4953da2d7eef24719e8aec9a65289483eeea9d618"}, + {file = "aiohttp-3.8.3-cp39-cp39-win_amd64.whl", hash = "sha256:88e5be56c231981428f4f506c68b6a46fa25c4123a2e86d156c58a8369d31ab7"}, + {file = "aiohttp-3.8.3.tar.gz", hash = "sha256:3828fb41b7203176b82fe5d699e0d845435f2374750a44b480ea6b930f6be269"}, +] [package.dependencies] aiosignal = ">=1.1.2" @@ -22,9 +112,12 @@ speedups = ["Brotli", "aiodns", "cchardet"] name = "aiosignal" version = "1.2.0" description = "aiosignal: a list of registered asynchronous callbacks" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "aiosignal-1.2.0-py3-none-any.whl", hash = "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a"}, + {file = "aiosignal-1.2.0.tar.gz", hash = "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"}, +] [package.dependencies] frozenlist = ">=1.1.0" @@ -33,9 +126,12 @@ frozenlist = ">=1.1.0" name = "asttokens" version = "2.0.5" description = "Annotate AST trees with source code positions" -category = "main" optional = false python-versions = "*" +files = [ + {file = "asttokens-2.0.5-py2.py3-none-any.whl", hash = "sha256:0844691e88552595a6f4a4281a9f7f79b8dd45ca4ccea82e5e05b4bbdb76705c"}, + {file = "asttokens-2.0.5.tar.gz", hash = "sha256:9a54c114f02c7a9480d56550932546a3f1fe71d8a02f1bc7ccd0ee3ee35cf4d5"}, +] [package.dependencies] six = "*" @@ -47,39 +143,50 @@ test = ["astroid", "pytest"] name = "async-timeout" version = "4.0.2" description = "Timeout context manager for asyncio programs" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, + {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, +] [[package]] name = "atomicwrites" version = "1.4.1" description = "Atomic file writes." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, +] [[package]] name = "attrs" version = "22.1.0" description = "Classes Without Boilerplate" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, + {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, +] [package.extras] dev = ["cloudpickle", "coverage[toml] (>=5.0.2)", "furo", "hypothesis", "mypy (>=0.900,!=0.940)", "pre-commit", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "sphinx", "sphinx-notfound-page", "zope.interface"] docs = ["furo", "sphinx", "sphinx-notfound-page", "zope.interface"] tests = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins", "zope.interface"] -tests_no_zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] +tests-no-zope = ["cloudpickle", "coverage[toml] (>=5.0.2)", "hypothesis", "mypy (>=0.900,!=0.940)", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins"] [[package]] name = "base58" version = "2.1.1" description = "Base58 and Base58Check implementation." -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"}, + {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"}, +] [package.extras] tests = ["PyHamcrest (>=2.0.2)", "mypy", "pytest (>=4.6)", "pytest-benchmark", "pytest-cov", "pytest-flake8"] @@ -88,17 +195,112 @@ tests = ["PyHamcrest (>=2.0.2)", "mypy", "pytest (>=4.6)", "pytest-benchmark", " name = "bitarray" version = "2.6.0" description = "efficient arrays of booleans -- C extension" -category = "main" optional = false python-versions = "*" +files = [ + {file = "bitarray-2.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b080eb25811db46306dfce58b4760df32f40bcf5551ebba3b7c8d3ec90d9b988"}, + {file = "bitarray-2.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b0cfca1b5a57b540f4761b57de485196218733153c430d58f9e048e325c98b47"}, + {file = "bitarray-2.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6fa63a86aad0f45a27c7c5a27cd9b787fe9b1aed431f97f49ee8b834fa0780a0"}, + {file = "bitarray-2.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15d2a1c060a11fc5508715fef6177937614f9354dd3afe6a00e261775f8b0e8f"}, + {file = "bitarray-2.6.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ffc076a0e22cda949ccd062f37ecc3dc53856c6e8bdfe07e1e81c411cf31621"}, + {file = "bitarray-2.6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ecce266e24b21615a3ed234869be84bef492f6a34bb650d0e25dc3662c59bce4"}, + {file = "bitarray-2.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0399886ca8ead7d0f16f94545bda800467d6d9c63fbd4866ee7ede7981166ba8"}, + {file = "bitarray-2.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f263b18fdb8bf42cd7cf9849d5863847d215024c68fe74cf33bcd82641d4376a"}, + {file = "bitarray-2.6.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:119d503edf09bef37f2d0dc3b4a23c36c3c1e88e17701ab71388eb4780c046c7"}, + {file = "bitarray-2.6.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:985a937218aa3d1ac7013174bfcbb1cb2f3157e17c6e349e83386f33459be1c0"}, + {file = "bitarray-2.6.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d34673ebaf562347d004a465e16e2930c6568d196bb79d67fc6358f1213a1ac7"}, + {file = "bitarray-2.6.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7126563c86f6b60d87414124f035ff0d29de02ad9e46ea085de2c772b0be1331"}, + {file = "bitarray-2.6.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76c4e3261d6370383b02018cb964b5d9260e3c62dea31949910e9cc3a1c802d2"}, + {file = "bitarray-2.6.0-cp310-cp310-win32.whl", hash = "sha256:346d2c5452cc024c41d267ba99e48d38783c1706c50c4632a4484cc57b152d0e"}, + {file = "bitarray-2.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:b849a6cdd46608e7cc108c75e1265304e79488480a822bae7471e628f971a6f0"}, + {file = "bitarray-2.6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d7bec01818c3a9d185f929cd36a82cc7acf13905920f7f595942105c5eef2300"}, + {file = "bitarray-2.6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a0bb91363041b45523e5bcbc4153a5e1eb1ddb21e46fe1910340c0d095e1a8e"}, + {file = "bitarray-2.6.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7ba4c964a36fe198a8c4b5d08924709d4ed0337b65ae222b6503ed3442a46e8"}, + {file = "bitarray-2.6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a239313e75da37d1f6548d666d4dd8554c4a92dabed15741612855d186e86e72"}, + {file = "bitarray-2.6.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9c492644f70f80f8266748c18309a0d73c22c47903f4b62f3fb772a15a8fd5f"}, + {file = "bitarray-2.6.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b756e5c771cdceb17622b6a0678fa78364e329d875de73a4f26bbacab8915a8"}, + {file = "bitarray-2.6.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c24d4a1b5baa46920b801aa55c0e0a640c6e7683a73a941302e102e2bd11a830"}, + {file = "bitarray-2.6.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:f253b9bdf5abd039741a9594a681453c973b09dcb7edac9105961838675b7c6b"}, + {file = "bitarray-2.6.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4849709571b1a53669798d23cc8430e677dcf0eea88610a0412e1911233899a"}, + {file = "bitarray-2.6.0-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:67c5822f4bb6a419bc2f2dba9fa07b5646f0cda930bafa9e1130af6822e4bdf3"}, + {file = "bitarray-2.6.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:6071d12043300e50a4b7ba9caeeca92aac567bb4ac4a227709e3c77a3d788587"}, + {file = "bitarray-2.6.0-cp36-cp36m-win32.whl", hash = "sha256:12c96dedd6e4584fecc2bf5fbffe1c635bd516eee7ade7b839c35aeba84336b4"}, + {file = "bitarray-2.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d53520b54206d8569b81eee56ccd9477af2f1b3ca355df9c48ee615a11e1a637"}, + {file = "bitarray-2.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7ae3b8b48167579066a17c5ba1631d089f931f4eae8b4359ad123807d5e75c51"}, + {file = "bitarray-2.6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24331bd2f52cd5410e48c132f486ed02a4ca3b96133fb26e3a8f50a57c354be6"}, + {file = "bitarray-2.6.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:742d43cbbc7267caae6379e2156a1fd8532332920a3d919b68c2982d439a98ba"}, + {file = "bitarray-2.6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1479f533eaff4080078b6e5d06b467868bd6edd73bb6651a295bf662d40afa62"}, + {file = "bitarray-2.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec18a0b97ea6b912ea57dc00a3f8f3ce515d774d00951d30e2ae243589d3d021"}, + {file = "bitarray-2.6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6bd32e492cdc740ec36b6725457685c9f2aa012dd8cbdae1643fed2b6821895"}, + {file = "bitarray-2.6.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bfda0af4072df6e932ec510b72c461e1ec0ad0820a76df588cdfebf5a07f5b5d"}, + {file = "bitarray-2.6.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d523ffef1927cb686ad787b25b2e98a5bd53e3c40673c394f07bf9b281e69796"}, + {file = "bitarray-2.6.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b0e4a6f5360e5f6c3a2b250c9e9cd539a9aabf0465dbedbaf364203e74ff101b"}, + {file = "bitarray-2.6.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5bd315ac63b62de5eefbfa07969162ffbda8e535c3b7b3d41b565d2a88817b71"}, + {file = "bitarray-2.6.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d697cc38cb6fa9bae3b994dd3ce68552ffe69c453a3b6fd6a4f94bb8a8bfd70b"}, + {file = "bitarray-2.6.0-cp37-cp37m-win32.whl", hash = "sha256:c19e900b6f9df13c7f406f827c5643f83c0839a58d007b35a4d7df827601f740"}, + {file = "bitarray-2.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:878f16daa9c2062e4d29c1928b6f3eb50911726ad6d2006918a29ca6b38b5080"}, + {file = "bitarray-2.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:565c4334cb410f5eb62280dcfb3a52629e60ce430f31dfa4bbef92ec80de4890"}, + {file = "bitarray-2.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6d8ba8065d1b60da24d94078249cbf24a02d869d7dc9eba12db1fb513a375c79"}, + {file = "bitarray-2.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fc635b27939969d53cac53e8b8f860ea69fc98cc9867cac17dd193f41dc2a57f"}, + {file = "bitarray-2.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f853589426920d9bb3683f6b6cd11ce48d9d06a62c0b98ea4b82ebd8db3bddec"}, + {file = "bitarray-2.6.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:076a72531bcca99114036c3714bac8124f5529b60fb6a6986067c6f345238c76"}, + {file = "bitarray-2.6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:874a222ece2100b3a3a8f08c57da3267a4e2219d26474a46937552992fcec771"}, + {file = "bitarray-2.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6a4a4bf6fbc42b2674023ca58a47c86ee55c023a8af85420f266e86b10e7065"}, + {file = "bitarray-2.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f5df0377f3e7f1366e506c5295f08d3f8761e4a6381918931fc1d9594aa435e"}, + {file = "bitarray-2.6.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:42a071c9db755f267e5d3b9909ea8c22fb071d27860dd940facfacffbde79de8"}, + {file = "bitarray-2.6.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:36802129a3115023700c07725d981c74e23b0914551898f788e5a41aed2d63bf"}, + {file = "bitarray-2.6.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:c774328057a4b1fc48bee2dd5a60ee1e8e0ec112d29c4e6b9c550e1686b6db5c"}, + {file = "bitarray-2.6.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:763cac57692d07aa950b92c20f55ef66801955b71b4a1f4f48d5422d748c6dda"}, + {file = "bitarray-2.6.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:11996c4da9c1ca9f97143e939af75c5b24ad0fdc2fa13aeb0007ebfa3c602caf"}, + {file = "bitarray-2.6.0-cp38-cp38-win32.whl", hash = "sha256:3f238127789c993de937178c3ff836d0fad4f2da08af9f579668873ac1332a42"}, + {file = "bitarray-2.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:7f369872d551708d608e50a9ab8748d3d4f32a697dc5c2c37ff16cb8d7060210"}, + {file = "bitarray-2.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:049e8f017b5b6d1763ababa156ca5cbdea8a01e20a1e80525b0fbe9fb839d695"}, + {file = "bitarray-2.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:035d3e5ab3c1afa2cd88bbc33af595b4875a24b0d037dfef907b41bc4b0dbe2b"}, + {file = "bitarray-2.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:97609495479c5214c7b57173c17206ebb056507a8d26eebc17942d62f8f25944"}, + {file = "bitarray-2.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71cc3d1da4f682f27728745f21ed3447ee8f6a0019932126c422dd91278eb414"}, + {file = "bitarray-2.6.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c3d0a4a6061adc3d3128e1e1146940d17df8cbfe3d77cb66a1df69ddcdf27d5"}, + {file = "bitarray-2.6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c46c2ba24a517f391c3ab9e7a214185f95146d0b664b4b0463ab31e5387669f"}, + {file = "bitarray-2.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0302605b3bbc439083a400cf57d7464f1ac098c722309a03abaa7d97cd420b5"}, + {file = "bitarray-2.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d42fee0add2114e572b0cd6edefc4c52207874f58b70043f82faa8bb7141620"}, + {file = "bitarray-2.6.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5276c7247d350819d1dae385d8f78ebfb44ee90ff11a775f981d45cb366573e5"}, + {file = "bitarray-2.6.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e76642232db8330589ed1ac1cec0e9c3814c708521c336a5c79d39a5d8d8c206"}, + {file = "bitarray-2.6.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:1d0a2d896bcbcb5f32f60571ebd48349ec322dee5e137b342483108c5cbd0f03"}, + {file = "bitarray-2.6.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:8c811e59c86ce0a8515daf47db9c2484fd42e51bdb44581d7bcc9caad6c9a7a1"}, + {file = "bitarray-2.6.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:febaf00e498230ce2e75dac910056f0e3a91c8631b7ceb6385bb39d448960bc5"}, + {file = "bitarray-2.6.0-cp39-cp39-win32.whl", hash = "sha256:2cfe1661b614314d67e6884e5e19e36957ff6faea5fcea7f25840dff95288248"}, + {file = "bitarray-2.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:f37b5282b029d9f51454f8c580eb6a24e5dc140ef5866290afb20e607d2dce5f"}, + {file = "bitarray-2.6.0.tar.gz", hash = "sha256:56d3f16dd807b1c56732a244ce071c135ee973d3edc9929418c1b24c5439a0fd"}, +] [[package]] name = "black" -version = "22.6.0" +version = "22.10.0" description = "The uncompromising code formatter." -category = "main" optional = false -python-versions = ">=3.6.2" +python-versions = ">=3.7" +files = [ + {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, + {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, + {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, + {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, + {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, + {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, + {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, + {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, + {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, + {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, + {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, + {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, + {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, + {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, + {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, + {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, + {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, + {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, + {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, + {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, + {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, +] [package.dependencies] click = ">=8.0.0" @@ -114,62 +316,219 @@ d = ["aiohttp (>=3.7.4)"] jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"] uvloop = ["uvloop (>=0.15.2)"] +[[package]] +name = "cbor2" +version = "5.4.6" +description = "CBOR (de)serializer with extensive tag support" +optional = false +python-versions = ">=3.7" +files = [ + {file = "cbor2-5.4.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:309fffbb7f561d67f02095d4b9657b73c9220558701c997e9bfcfbca2696e927"}, + {file = "cbor2-5.4.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ff95b33e5482313a74648ca3620c9328e9f30ecfa034df040b828e476597d352"}, + {file = "cbor2-5.4.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:db9eb582fce972f0fa429d8159b7891ff8deccb7affc4995090afc61ce0d328a"}, + {file = "cbor2-5.4.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3950be57a1698086cf26d8710b4e5a637b65133c5b1f9eec23967d4089d8cfed"}, + {file = "cbor2-5.4.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:78304df140b9e13b93bcbb2aecee64c9aaa9f1cadbd45f043b5e7b93cc2f21a2"}, + {file = "cbor2-5.4.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e73ca40dd3c7210ff776acff9869ddc9ff67bae7c425b58e5715dcf55275163f"}, + {file = "cbor2-5.4.6-cp310-cp310-win_amd64.whl", hash = "sha256:0b956f19e93ba3180c336282cd1b6665631f2d3a196a9c19b29a833bf979e7a4"}, + {file = "cbor2-5.4.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1c12c0ab78f5bc290b08a79152a8621822415836a86f8f4b50dadba371736fda"}, + {file = "cbor2-5.4.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3545b16f9f0d5f34d4c99052829c3726020a07be34c99c250d0df87418f02954"}, + {file = "cbor2-5.4.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24144822f8d2b0156f4cda9427f071f969c18683ffed39663dc86bc0a75ae4dd"}, + {file = "cbor2-5.4.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1835536e76ea16e88c934aac5e369ba9f93d495b01e5fa2d93f0b4986b89146d"}, + {file = "cbor2-5.4.6-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:39452c799453f5bf33281ffc0752c620b8bfa0b7c13070b87d370257a1311976"}, + {file = "cbor2-5.4.6-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3316f09a77af85e7772ecfdd693b0f450678a60b1aee641bac319289757e3fa0"}, + {file = "cbor2-5.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:456cdff668a50a52fdb8aa6d0742511e43ed46d6a5b463dba80a5a720fa0d320"}, + {file = "cbor2-5.4.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9394ca49ecdf0957924e45d09a4026482d184a465a047f60c4044eb464c43de9"}, + {file = "cbor2-5.4.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:56dfa030cd3d67e5b6701d3067923f2f61536a8ffb1b45be14775d1e866b59ae"}, + {file = "cbor2-5.4.6-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5094562dfe3e5583202b93ef7ca5082c2ba5571accb2c4412d27b7d0ba8a563"}, + {file = "cbor2-5.4.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:94f844d0e232aca061a86dd6ff191e47ba0389ddd34acb784ad9a41594dc99a4"}, + {file = "cbor2-5.4.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:7bbd3470eb685325398023e335be896b74f61b014896604ed45049a7b7b6d8ac"}, + {file = "cbor2-5.4.6-cp37-cp37m-win_amd64.whl", hash = "sha256:0bd12c54a48949d11f5ffc2fa27f5df1b4754111f5207453e5fae3512ebb3cab"}, + {file = "cbor2-5.4.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:d2984a488f350aee1d54fa9cb8c6a3c1f1f5b268abbc91161e47185de4d829f3"}, + {file = "cbor2-5.4.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c285a2cb2c04004bfead93df89d92a0cef1874ad337d0cb5ea53c2c31e97bfdb"}, + {file = "cbor2-5.4.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6709d97695205cd08255363b54afa035306d5302b7b5e38308c8ff5a47e60f2a"}, + {file = "cbor2-5.4.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96087fa5336ebfc94465c0768cd5de0fcf9af3840d2cf0ce32f5767855f1a293"}, + {file = "cbor2-5.4.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0d2b926b024d3a1549b819bc82fdc387062bbd977b0299dd5fa5e0ea3267b98b"}, + {file = "cbor2-5.4.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6e1b5aee920b6a2f737aa12e2b54de3826b09f885a7ce402db84216343368140"}, + {file = "cbor2-5.4.6-cp38-cp38-win_amd64.whl", hash = "sha256:79e048e623846d60d735bb350263e8fdd36cb6195d7f1a2b57eacd573d9c0b33"}, + {file = "cbor2-5.4.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:80ac8ba450c7a41c5afe5f7e503d3092442ed75393e1de162b0bf0d97edf7c7f"}, + {file = "cbor2-5.4.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ce1a2c272ba8523a55ea2f1d66e3464e89fa0e37c9a3d786a919fe64e68dbd7"}, + {file = "cbor2-5.4.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1618d16e310f7ffed141762b0ff5d8bb6b53ad449406115cc465bf04213cefcf"}, + {file = "cbor2-5.4.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4bbbdb2e3ef274865dc3f279aae109b5d94f4654aea3c72c479fb37e4a1e7ed7"}, + {file = "cbor2-5.4.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6f9c702bee2954fffdfa3de95a5af1a6b1c5f155e39490353d5654d83bb05bb9"}, + {file = "cbor2-5.4.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:4b9f3924da0e460a93b3674c7e71020dd6c9e9f17400a34e52a88c0af2dcd2aa"}, + {file = "cbor2-5.4.6-cp39-cp39-win_amd64.whl", hash = "sha256:d54bd840b4fe34f097b8665fc0692c7dd175349e53976be6c5de4433b970daa4"}, + {file = "cbor2-5.4.6-py3-none-any.whl", hash = "sha256:181ac494091d1f9c5bb373cd85514ce1eb967a8cf3ec298e8dfa8878aa823956"}, + {file = "cbor2-5.4.6.tar.gz", hash = "sha256:b893500db0fe033e570c3adc956af6eefc57e280026bd2d86fd53da9f1e594d7"}, +] + +[package.extras] +doc = ["sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["pytest", "pytest-cov"] + [[package]] name = "certifi" -version = "2022.6.15" +version = "2022.9.24" description = "Python package for providing Mozilla's CA Bundle." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, + {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, +] [[package]] name = "charset-normalizer" -version = "2.1.0" +version = "2.1.1" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." -category = "main" optional = false python-versions = ">=3.6.0" +files = [ + {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, + {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, +] [package.extras] -unicode_backport = ["unicodedata2"] +unicode-backport = ["unicodedata2"] [[package]] name = "click" version = "8.1.3" description = "Composable command line interface toolkit" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, + {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, +] [package.dependencies] colorama = {version = "*", markers = "platform_system == \"Windows\""} [[package]] name = "colorama" -version = "0.4.5" +version = "0.4.6" description = "Cross-platform colored terminal text." -category = "main" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] [[package]] name = "crytic-compile" -version = "0.2.3" +version = "0.3.4" description = "Util to facilitate smart contracts compilation." -category = "dev" optional = false -python-versions = ">=3.6" +python-versions = ">=3.8" +files = [ + {file = "crytic-compile-0.3.4.tar.gz", hash = "sha256:f4bbabe616d09dcae73c3cd4140b719845ff67993c0159ec0de7d4e20642725d"}, + {file = "crytic_compile-0.3.4-py3-none-any.whl", hash = "sha256:5ae0ac789d5aff22d13b7ec564ab81f5b97991f702c5d8b78af538b6306d08b1"}, +] [package.dependencies] -pysha3 = ">=1.0.2" +cbor2 = "*" +pycryptodome = ">=3.4.6" +solc-select = ">=v1.0.4" + +[package.extras] +dev = ["crytic-compile[doc,lint,test]"] +doc = ["pdoc"] +lint = ["black (==22.3.0)", "darglint (==1.8.0)", "mypy (==0.942)", "pylint (==2.13.4)"] +test = ["pytest", "pytest-cov"] [[package]] name = "cytoolz" version = "0.12.0" description = "Cython implementation of Toolz: High performance functional utilities" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "cytoolz-0.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8237612fed78d4580e94141a74ac0977f5a9614dd7fa8f3d2fcb30e6d04e73aa"}, + {file = "cytoolz-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:798dff7a40adbb3dfa2d50499c2038779061ebc37eccedaf28fa296cb517b84e"}, + {file = "cytoolz-0.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:336551092eb1cfc2ad5878cc08ef290f744843f84c1dda06f9e4a84d2c440b73"}, + {file = "cytoolz-0.12.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79b46cda959f026bd9fc33b4046294b32bd5e7664a4cf607179f80ac93844e7f"}, + {file = "cytoolz-0.12.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b716f66b5ee72dbf9a001316ffe72afe0bb8f6ce84e341aec64291c0ff16b9f4"}, + {file = "cytoolz-0.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac7758c5c5a66664285831261a9af8e0af504026e0987cd01535045945df6e1"}, + {file = "cytoolz-0.12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:337c9a3ce2929c6361bcc1b304ce81ed675078a34c203dbb7c3e154f7ed1cca8"}, + {file = "cytoolz-0.12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ee1fe1a3d0c8c456c3fbf62f28d178f870d14302fcd1edbc240b717ae3ab08de"}, + {file = "cytoolz-0.12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f1f5c1ef04240b323b9e6b87d4b1d7f14b735e284a33b18a509537a10f62715c"}, + {file = "cytoolz-0.12.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:25c037a7b4f49730ccc295a03cd2217ba67ff43ac0918299f5f368271433ff0f"}, + {file = "cytoolz-0.12.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:38e3386f63ebaea46a4ee0bfefc9a38590c3b78ab86439766b5225443468a76b"}, + {file = "cytoolz-0.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cb072fa81caab93a5892c4b69dfe0d48f52026a7fe83ba2567020a7995a456e7"}, + {file = "cytoolz-0.12.0-cp310-cp310-win32.whl", hash = "sha256:a4acf6cb20f01a5eb5b6d459e08fb92aacfb4de8bc97e25437c1a3e71860b452"}, + {file = "cytoolz-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:7fe93ffde090e2867f8ce4369d0c1abf5651817a74a3d0a4da2b1ffd412603ff"}, + {file = "cytoolz-0.12.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d212296e996a70db8d9e1c0622bc8aefa732eb0416b5441624d0fd5b853ea391"}, + {file = "cytoolz-0.12.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:231d87ffb5fc468989e35336a2f8da1c9b8d97cfd9300cf2df32e953e4d20cae"}, + {file = "cytoolz-0.12.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f26079bc2d0b7aa1a185516ac9f7cda0d7932da6c60589bfed4079e3a5369e83"}, + {file = "cytoolz-0.12.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d511dd49eb1263ccb4e5f84ae1478dc2824d66b813cdf700e1ba593faa256ade"}, + {file = "cytoolz-0.12.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa5ded9f811c36668239adb4806fca1244b06add4d64af31119c279aab1ef8a6"}, + {file = "cytoolz-0.12.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c818a382b828e960fbbedbc85663414edbbba816c2bf8c1bb5651305d79bdb97"}, + {file = "cytoolz-0.12.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1c22255e7458feb6f43d99c9578396e91d5934757c552128f6afd3b093b41c00"}, + {file = "cytoolz-0.12.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5b7079b3197256ac6bf73f8b9484d514fac68a36d05513b9e5247354d6fc2885"}, + {file = "cytoolz-0.12.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:2ee9ca2cfc939607926096c7cc6f298cee125f8ca53a4f46745f8dfbb7fb7ab1"}, + {file = "cytoolz-0.12.0-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:8c0101bb2b2bcc0de2e2eb288a132c261e5fa883b1423799b47d4f0cfd879cd6"}, + {file = "cytoolz-0.12.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:4b8b1d9764d08782caa8ba0e91d76b95b973a82f4ce2a3f9c7e726bfeaddbdfa"}, + {file = "cytoolz-0.12.0-cp36-cp36m-win32.whl", hash = "sha256:f71b49a41826a8e7fd464d6991134a6d022a666be4e76d517850abbea561c909"}, + {file = "cytoolz-0.12.0-cp36-cp36m-win_amd64.whl", hash = "sha256:ae7f417bb2b4e3906e525b3dbe944791dfa9248faea719c7a9c200aa1a019a4e"}, + {file = "cytoolz-0.12.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b05dc257996c0accf6f877b1f212f74dc134b39c46baac09e1894d9d9c970b6a"}, + {file = "cytoolz-0.12.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2cca43caea857e761cc458ffb4f7af397a13824c5e71341ca08035ff5ff0b27"}, + {file = "cytoolz-0.12.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd840adfe027d379e7aede973bc0e193e6eef9b33d46d1d42826e26db9b37d7e"}, + {file = "cytoolz-0.12.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b067c88de0eaca174211c8422b3f72cbfb63b101a0eeb528c4f21282ca0afe"}, + {file = "cytoolz-0.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db619f17705067f1f112d3e84a0904b2f04117e50cefc4016f435ff0dc59bc4e"}, + {file = "cytoolz-0.12.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e8335998e21205574fc7d8d17844a9cc0dd4cbb25bb7716d90683a935d2c879"}, + {file = "cytoolz-0.12.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:46b9f4af719b113c01a4144c52fc4b929f98a47017a5408e3910050f4641126b"}, + {file = "cytoolz-0.12.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d29cf7a44a8abaeb00537e3bad7abf823fce194fe707c366f81020d384e22f7"}, + {file = "cytoolz-0.12.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:02dc4565a8d27c9f3e87b715c0a300890e17c94ba1294af61c4ba97aa8482b22"}, + {file = "cytoolz-0.12.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:2bd1c692ab706acb46cfebe7105945b07f7274598097e32c8979d3b22ae62cc6"}, + {file = "cytoolz-0.12.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d035805dcdefcdfe64d97d6e1e7603798588d5e1ae08e61a5dae3258c3cb407a"}, + {file = "cytoolz-0.12.0-cp37-cp37m-win32.whl", hash = "sha256:9ecdd6e2be8d59b76c2bd3e2d832e7b3d5b2535c418b13cfa85e3b17de985199"}, + {file = "cytoolz-0.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3a5408a74df84e84aa1c86a2f9f2ffaed51a55f34bbad5b8fae547cb9167e977"}, + {file = "cytoolz-0.12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1cf9ae77eed57924becd3ab65ae24487d7b1f9823d3e685d796e58f57424f82a"}, + {file = "cytoolz-0.12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dc8df9adfca0da9956589f53764d459389ce86d824663c7217422232f1dfbc9d"}, + {file = "cytoolz-0.12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf460dc6bed081f274cd3d8ae162dd7e382014161d65edcdec832035d93901b"}, + {file = "cytoolz-0.12.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f5784adcdb285e70b61efc1a369cd61c6b7f1e0b5d521651f93cde09549681f5"}, + {file = "cytoolz-0.12.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09fac69cebcb79a6ed75565fe2de9511be6e3d93f30dad115832cc1a3933b6ce"}, + {file = "cytoolz-0.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1744217505b835fcf55d82d67addd0d361791c4fd6a2f485f034b343ffc7edb3"}, + {file = "cytoolz-0.12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fa49cfaa0eedad59d8357a482bd10e2cc2a12ad9f41aae53427e82d3eba068a"}, + {file = "cytoolz-0.12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c9f8c9b3cfa20b4ce6a89b7e2e7ffda76bdd81e95b7d20bbb2c47c2b31e72622"}, + {file = "cytoolz-0.12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c9fe89548b1dc7c8b3160758d192791b32bd42b1c244a20809a1053a9d74428"}, + {file = "cytoolz-0.12.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:d61bc1713662e7d9aa3e298dad790dfd027c5c0f1342c36be8401aebe3d3d453"}, + {file = "cytoolz-0.12.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:69c04ae878d5bcde5462e7290f950bfce11fd139ec4b481687983326658e6dbe"}, + {file = "cytoolz-0.12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:21986f4a970c03ca84806b3a08e89386ac4aeb54c9b79d6a7268e83225331a87"}, + {file = "cytoolz-0.12.0-cp38-cp38-win32.whl", hash = "sha256:e17516a102731bcf86446ce148127a8cd2887cf27ac388990cd63881115b4fdc"}, + {file = "cytoolz-0.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:16748ea2b40c5978190d9acf9aa8fbacbfb440964c1035dc16cb14dbd557edb5"}, + {file = "cytoolz-0.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:02583c9fd4668f9e343ad4fc0e0f9651b1a0c16fe92bd208d07fd07de90fdc99"}, + {file = "cytoolz-0.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee92dadb312e657b9b666a0385fafc6dad073d8a0fbef5cea09e21011554206a"}, + {file = "cytoolz-0.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12d3d11ceb0fce8be5463f1e363366888c4b71e68fb2f5d536e4790b933cfd7e"}, + {file = "cytoolz-0.12.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f87472837c26b3bc91f9767c7adcfb935d0c097937c6744250672cd8c36019d"}, + {file = "cytoolz-0.12.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7244fb0d0b87499becc29051b82925e0daf3838e6c352e6b2d62e0f969b090af"}, + {file = "cytoolz-0.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:deb8550f487de756f1c24c56fa2c8451a53c0346868c13899c6b3a39b1f3d2c3"}, + {file = "cytoolz-0.12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f959c1319b7e6ed3367b0f5a54a7b9c59063bd053c74278b27999db013e568df"}, + {file = "cytoolz-0.12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f40897f6f341e03a945759fcdb2208dc7c64dc312386d3088c47b78fca2a3b2"}, + {file = "cytoolz-0.12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:68336dfbe00efebbb1d02b8aa00b570dceec5d03fbd818c620aa246a8f5e5409"}, + {file = "cytoolz-0.12.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:886b3bf8fa99510836107097a5e5a2bd81631d3795dedc5684e25bef6538ac39"}, + {file = "cytoolz-0.12.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0f94b4a3500345de5853d1896b7e770ce4a6577a431f43ff7d8f05f9051aeb7d"}, + {file = "cytoolz-0.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9dd7dbdfc24ed309af96be170c9030f43713950afab2b4bed1d372a91b37cbb0"}, + {file = "cytoolz-0.12.0-cp39-cp39-win32.whl", hash = "sha256:ed8771e36430fb0e4398030569bdab1419e4e74f7bcd51ea57239aa95441983a"}, + {file = "cytoolz-0.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:a15157f4280f6e5d7c2d0892847a6c4dffbd2c5cefccaf1ac1f1c6c3d2cf9936"}, + {file = "cytoolz-0.12.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ae403cac13c2b9a2a92e56468ca1f822899b64d75d5be8ca802f1c14870d9133"}, + {file = "cytoolz-0.12.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ff74cb0e1a50de7f59e54a156dfd734b6593008f6f804d0726a73b89d170cd"}, + {file = "cytoolz-0.12.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f24e70d29223cde8ce3f5aefa7fd06bda12ae4386dcfbc726773e95b099cde0d"}, + {file = "cytoolz-0.12.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a79658fd264c5f82ea1b5cb45cf3899afabd9ec3e58c333bea042a2b4a94134"}, + {file = "cytoolz-0.12.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ef4a496a3175aec595ae24ad03e0bb2fe76401f8f79e7ef3d344533ba990ec0e"}, + {file = "cytoolz-0.12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bb0fc2ed8efa89f31ffa99246b1d434ff3db2b7b7e35147486172da849c8024a"}, + {file = "cytoolz-0.12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59263f296e043d4210dd34f91e6f11c4b20e6195976da23170d5ad056030258a"}, + {file = "cytoolz-0.12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:274bc965cd93d6fa0bfe6f770cf6549bbe58d7b0a48dd6893d3f2c4b495d7f95"}, + {file = "cytoolz-0.12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8feb4d056c22983723278160aff8a28c507b0e942768f4e856539a60e7bb874"}, + {file = "cytoolz-0.12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:09f5652caeac85e3735bd5aaed49ebf4eeb7c0f15cb9b7c4a5fb6f45308dc2fd"}, + {file = "cytoolz-0.12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8060be3b1fa24a4e3b165ce3c0ee6048f5e181289af57dbd9e3c4d4b8545dd78"}, + {file = "cytoolz-0.12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e32292721f16516a574891a1af6760cba37a0f426a2b2cea6f9d560131a76ea"}, + {file = "cytoolz-0.12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6aade6ebb4507330b0540af58dc2804415945611e90c70bb97360973e487c48a"}, + {file = "cytoolz-0.12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f909760f89a54d860cf960b4cd828f9f6301fb104cd0de5b15b16822c9c4828b"}, + {file = "cytoolz-0.12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8e69c9f3a32e0f9331cf6707a0f159c6dec0ff2a9f41507f6b2d06cd423f0d0"}, + {file = "cytoolz-0.12.0.tar.gz", hash = "sha256:c105b05f85e03fbcd60244375968e62e44fe798c15a3531c922d531018d22412"}, +] [package.dependencies] toolz = ">=0.8.0" @@ -181,17 +540,23 @@ cython = ["cython"] name = "dataclassy" version = "0.11.1" description = "A fast and flexible reimplementation of data classes" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "dataclassy-0.11.1-py3-none-any.whl", hash = "sha256:bcb030d3d700cf9b1597042bbc8375b92773e6f68f65675a7071862c0ddb87f5"}, + {file = "dataclassy-0.11.1.tar.gz", hash = "sha256:ad6622cb91e644d13f68768558983fbc22c90a8ff7e355638485d18b9baf1198"}, +] [[package]] name = "eip712" version = "0.1.0" description = "eip712: Message classes for typed structured data hashing and signing in Ethereum" -category = "main" optional = false python-versions = ">=3.6,<4" +files = [ + {file = "eip712-0.1.0-py3-none-any.whl", hash = "sha256:8d91257bb94cc33b0115b2f65c71297b6e8b8f16ed49173313e13ac8931df4b1"}, + {file = "eip712-0.1.0.tar.gz", hash = "sha256:2655c8ab58a552bc2adf0b5a07465483fe24a27237e07c4384f36f16efafa418"}, +] [package.dependencies] dataclassy = ">=0.8.2,<1.0" @@ -212,9 +577,12 @@ test = ["hypothesis (>=6.2.0,<7.0)", "pytest (>=6.0,<7.0)", "pytest-cov", "pytes name = "eth-abi" version = "2.2.0" description = "eth_abi: Python utilities for working with Ethereum ABI definitions, especially encoding and decoding" -category = "main" optional = false python-versions = ">=3.6, <4" +files = [ + {file = "eth_abi-2.2.0-py3-none-any.whl", hash = "sha256:8d018351b00e304113f50ffded9baf4b9c6ef1c7e4ddec71bd64048c1c5c438c"}, + {file = "eth_abi-2.2.0.tar.gz", hash = "sha256:d1bd16a911dd8fe45f1e6ed02099b4fceb8ae9ea741ab11b135cf288ada74a99"}, +] [package.dependencies] eth-typing = ">=2.0.0,<3.0.0" @@ -232,9 +600,12 @@ tools = ["hypothesis (>=4.18.2,<5.0.0)"] name = "eth-account" version = "0.5.9" description = "eth-account: Sign Ethereum transactions and messages with local private keys" -category = "main" optional = false python-versions = ">=3.6, <4" +files = [ + {file = "eth-account-0.5.9.tar.gz", hash = "sha256:ee62e121d977ca452f600043338af36f9349aa1f8409c5096d75df6576c79f1b"}, + {file = "eth_account-0.5.9-py3-none-any.whl", hash = "sha256:42f9eefbf0e1c84a278bf27a25eccc2e0c20b18c17e2ab6f46044a534479e95a"}, +] [package.dependencies] bitarray = ">=1.2.1,<3" @@ -254,23 +625,26 @@ test = ["hypothesis (>=4.18.0,<5)", "pytest (>=6.2.5,<7)", "pytest-xdist", "tox [[package]] name = "eth-brownie" -version = "1.19.1" +version = "1.19.3" description = "A Python framework for Ethereum smart contract deployment, testing and interaction." -category = "main" optional = false python-versions = ">=3.7,<4" +files = [ + {file = "eth-brownie-1.19.3.tar.gz", hash = "sha256:a3659dc23ecf1ab96586d32ffa382736e711b38ccd2fe0fab9cc1617e36e00b0"}, + {file = "eth_brownie-1.19.3-py3-none-any.whl", hash = "sha256:d8d3e497d8e056a093006fb27fab6c3a3f97ac5b166f7946db5a46bdcc4eaa8a"}, +] [package.dependencies] -aiohttp = "3.8.1" +aiohttp = "3.8.3" aiosignal = "1.2.0" asttokens = "2.0.5" async-timeout = "4.0.2" attrs = "22.1.0" base58 = "2.1.1" bitarray = "2.6.0" -black = "22.6.0" -certifi = "2022.6.15" -charset-normalizer = "2.1.0" +black = "22.10.0" +certifi = "2022.9.24" +charset-normalizer = "2.1.1" click = "8.1.3" cytoolz = "0.12.0" dataclassy = "0.11.1" @@ -286,9 +660,9 @@ eth-typing = "2.3.0" eth-utils = "1.10.0" execnet = "1.9.0" frozenlist = "1.3.1" -hexbytes = "0.2.2" +hexbytes = "0.2.3" hypothesis = "6.27.3" -idna = "3.3" +idna = "3.4" inflection = "0.5.0" iniconfig = "1.1.1" ipfshttpclient = "0.8.0a2" @@ -302,17 +676,17 @@ mythx-models = "1.9.1" netaddr = "0.8.0" packaging = "21.3" parsimonious = "0.8.1" -pathspec = "0.9.0" +pathspec = "0.10.1" platformdirs = "2.5.2" pluggy = "1.0.0" -prompt-toolkit = "3.0.30" -protobuf = "3.20.1" -psutil = "5.9.1" +prompt-toolkit = "3.0.31" +protobuf = "3.19.5" +psutil = "5.9.2" py = "1.11.0" py-solc-ast = "1.2.9" py-solc-x = "1.1.1" pycryptodome = "3.15.0" -pygments = "2.12.0" +pygments = "2.13.0" pygments-lexer-solidity = "0.7.0" pyjwt = "1.7.1" pyparsing = "3.0.9" @@ -326,19 +700,20 @@ pythx = "1.6.1" pyyaml = "5.4.1" requests = "2.28.1" rlp = "2.0.1" -semantic-version = "2.8.5" +semantic-version = "2.10.0" six = "1.16.0" sortedcontainers = "2.4.0" toml = "0.10.2" tomli = "2.0.1" toolz = "0.12.0" -tqdm = "4.64.0" -urllib3 = "1.26.11" +tqdm = "4.64.1" +typing-extensions = "4.4.0" +urllib3 = "1.26.12" varint = "1.0.2" vvm = "0.1.0" -vyper = "0.3.6" +vyper = "0.3.7" wcwidth = "0.2.5" -web3 = "5.30.0" +web3 = "5.31.3" websockets = "9.1" wheel = "0.37.1" wrapt = "1.14.1" @@ -348,9 +723,12 @@ yarl = "1.8.1" name = "eth-event" version = "1.2.3" description = "Ethereum event decoder and topic generator" -category = "main" optional = false python-versions = ">=3.6, <4" +files = [ + {file = "eth-event-1.2.3.tar.gz", hash = "sha256:1589b583a9b0294f9aba4dedce8077685ced298393872f7f19bbf7d67ed9e49a"}, + {file = "eth_event-1.2.3-py3-none-any.whl", hash = "sha256:5d86d049eded86d0fb41538590487e1ccea2e1fa3e6d16ee2fc0952be7e5c59a"}, +] [package.dependencies] eth-abi = ">=2.0.0,<3.0.0" @@ -362,9 +740,12 @@ hexbytes = ">=0.2.0,<1.0.0" name = "eth-hash" version = "0.3.3" description = "eth-hash: The Ethereum hashing function, keccak256, sometimes (erroneously) called sha3" -category = "main" optional = false python-versions = ">=3.5, <4" +files = [ + {file = "eth-hash-0.3.3.tar.gz", hash = "sha256:8cde211519ff1a98b46e9057cb909f12ab62e263eb30a0a94e2f7e1f46ac67a0"}, + {file = "eth_hash-0.3.3-py3-none-any.whl", hash = "sha256:3c884e4f788b38cc92cff05c4e43bc6b82686066f04ecfae0e11cdcbe5a283bd"}, +] [package.dependencies] pycryptodome = {version = ">=3.6.6,<4", optional = true, markers = "extra == \"pycryptodome\""} @@ -381,9 +762,12 @@ test = ["pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)"] name = "eth-keyfile" version = "0.5.1" description = "A library for handling the encrypted keyfiles used to store ethereum private keys." -category = "main" optional = false python-versions = "*" +files = [ + {file = "eth-keyfile-0.5.1.tar.gz", hash = "sha256:939540efb503380bc30d926833e6a12b22c6750de80feef3720d79e5a79de47d"}, + {file = "eth_keyfile-0.5.1-py3-none-any.whl", hash = "sha256:70d734af17efdf929a90bb95375f43522be4ed80c3b9e0a8bca575fb11cd1159"}, +] [package.dependencies] cytoolz = ">=0.9.0,<1.0.0" @@ -395,9 +779,12 @@ pycryptodome = ">=3.4.7,<4.0.0" name = "eth-keys" version = "0.3.4" description = "Common API for Ethereum key operations." -category = "main" optional = false python-versions = "*" +files = [ + {file = "eth-keys-0.3.4.tar.gz", hash = "sha256:e5590797f5e2930086c705a6dd1ac14397f74f19bdcd1b5f837475554f354ad8"}, + {file = "eth_keys-0.3.4-py3-none-any.whl", hash = "sha256:565bf62179b8143bcbd302a0ec6c49882d9c7678f9e6ab0484a8a5725f5ef10e"}, +] [package.dependencies] eth-typing = ">=2.2.1,<3.0.0" @@ -414,9 +801,12 @@ test = ["asn1tools (>=0.146.2,<0.147)", "eth-hash[pycryptodome]", "eth-hash[pysh name = "eth-rlp" version = "0.2.1" description = "eth-rlp: RLP definitions for common Ethereum objects in Python" -category = "main" optional = false python-versions = ">=3.6, <4" +files = [ + {file = "eth-rlp-0.2.1.tar.gz", hash = "sha256:f016f980b0ed42ee7650ba6e4e4d3c4e9aa06d8b9c6825a36d3afe5aa0187a8b"}, + {file = "eth_rlp-0.2.1-py3-none-any.whl", hash = "sha256:cc389ef8d7b6f76a98f90bcdbff1b8684b3a78f53d47e871191b50d4d6aee5a1"}, +] [package.dependencies] eth-utils = ">=1.0.1,<2" @@ -433,9 +823,12 @@ test = ["eth-hash[pycryptodome]", "pytest (==5.4.1)", "pytest-xdist", "tox (==3. name = "eth-typing" version = "2.3.0" description = "eth-typing: Common type annotations for ethereum python packages" -category = "main" optional = false python-versions = ">=3.5, <4" +files = [ + {file = "eth-typing-2.3.0.tar.gz", hash = "sha256:39cce97f401f082739b19258dfa3355101c64390914c73fe2b90012f443e0dc7"}, + {file = "eth_typing-2.3.0-py3-none-any.whl", hash = "sha256:b7fa58635c1cb0cbf538b2f5f1e66139575ea4853eac1d6000f0961a4b277422"}, +] [package.extras] dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "flake8 (==3.8.3)", "ipython", "isort (>=4.2.15,<5)", "mypy (==0.782)", "pydocstyle (>=3.0.0,<4)", "pytest (>=4.4,<4.5)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "sphinx-rtd-theme (>=0.1.9)", "tox (>=2.9.1,<3)", "twine", "wheel"] @@ -447,9 +840,12 @@ test = ["pytest (>=4.4,<4.5)", "pytest-xdist", "tox (>=2.9.1,<3)"] name = "eth-utils" version = "1.10.0" description = "eth-utils: Common utility functions for python code that interacts with Ethereum" -category = "main" optional = false python-versions = ">=3.5,!=3.5.2,<4" +files = [ + {file = "eth-utils-1.10.0.tar.gz", hash = "sha256:bf82762a46978714190b0370265a7148c954d3f0adaa31c6f085ea375e4c61af"}, + {file = "eth_utils-1.10.0-py3-none-any.whl", hash = "sha256:74240a8c6f652d085ed3c85f5f1654203d2f10ff9062f83b3bad0a12ff321c7a"}, +] [package.dependencies] cytoolz = {version = ">=0.10.1,<1.0.0", markers = "implementation_name == \"cpython\""} @@ -467,9 +863,12 @@ test = ["hypothesis (>=4.43.0,<5.0.0)", "pytest (==5.4.1)", "pytest-xdist", "tox name = "execnet" version = "1.9.0" description = "execnet: rapid multi-Python deployment" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "execnet-1.9.0-py2.py3-none-any.whl", hash = "sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142"}, + {file = "execnet-1.9.0.tar.gz", hash = "sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5"}, +] [package.extras] testing = ["pre-commit"] @@ -478,31 +877,97 @@ testing = ["pre-commit"] name = "frozenlist" version = "1.3.1" description = "A list-like structure which implements collections.abc.MutableSequence" -category = "main" optional = false python-versions = ">=3.7" - -[[package]] -name = "hexbytes" -version = "0.2.2" -description = "hexbytes: Python `bytes` subclass that decodes hex, with a readable console output" -category = "main" -optional = false -python-versions = ">=3.6, <4" - -[package.extras] -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 (==5.4.1)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)", "tox (==3.14.6)", "twine", "wheel"] -doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=19.2.0,<20)"] -lint = ["flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.770)", "pydocstyle (>=5.0.0,<6)"] -test = ["eth-utils (>=1.0.1,<2)", "hypothesis (>=3.44.24,<4)", "pytest (==5.4.1)", "pytest-xdist", "tox (==3.14.6)"] - -[[package]] -name = "hypothesis" -version = "6.27.3" -description = "A library for property-based testing" -category = "main" -optional = false -python-versions = ">=3.6" +files = [ + {file = "frozenlist-1.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5f271c93f001748fc26ddea409241312a75e13466b06c94798d1a341cf0e6989"}, + {file = "frozenlist-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c6ef8014b842f01f5d2b55315f1af5cbfde284eb184075c189fd657c2fd8204"}, + {file = "frozenlist-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:219a9676e2eae91cb5cc695a78b4cb43d8123e4160441d2b6ce8d2c70c60e2f3"}, + {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b47d64cdd973aede3dd71a9364742c542587db214e63b7529fbb487ed67cddd9"}, + {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2af6f7a4e93f5d08ee3f9152bce41a6015b5cf87546cb63872cc19b45476e98a"}, + {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a718b427ff781c4f4e975525edb092ee2cdef6a9e7bc49e15063b088961806f8"}, + {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c56c299602c70bc1bb5d1e75f7d8c007ca40c9d7aebaf6e4ba52925d88ef826d"}, + {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:717470bfafbb9d9be624da7780c4296aa7935294bd43a075139c3d55659038ca"}, + {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:31b44f1feb3630146cffe56344704b730c33e042ffc78d21f2125a6a91168131"}, + {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c3b31180b82c519b8926e629bf9f19952c743e089c41380ddca5db556817b221"}, + {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d82bed73544e91fb081ab93e3725e45dd8515c675c0e9926b4e1f420a93a6ab9"}, + {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49459f193324fbd6413e8e03bd65789e5198a9fa3095e03f3620dee2f2dabff2"}, + {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:94e680aeedc7fd3b892b6fa8395b7b7cc4b344046c065ed4e7a1e390084e8cb5"}, + {file = "frozenlist-1.3.1-cp310-cp310-win32.whl", hash = "sha256:fabb953ab913dadc1ff9dcc3a7a7d3dc6a92efab3a0373989b8063347f8705be"}, + {file = "frozenlist-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:eee0c5ecb58296580fc495ac99b003f64f82a74f9576a244d04978a7e97166db"}, + {file = "frozenlist-1.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0bc75692fb3770cf2b5856a6c2c9de967ca744863c5e89595df64e252e4b3944"}, + {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086ca1ac0a40e722d6833d4ce74f5bf1aba2c77cbfdc0cd83722ffea6da52a04"}, + {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b51eb355e7f813bcda00276b0114c4172872dc5fb30e3fea059b9367c18fbcb"}, + {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74140933d45271c1a1283f708c35187f94e1256079b3c43f0c2267f9db5845ff"}, + {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee4c5120ddf7d4dd1eaf079af3af7102b56d919fa13ad55600a4e0ebe532779b"}, + {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97d9e00f3ac7c18e685320601f91468ec06c58acc185d18bb8e511f196c8d4b2"}, + {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6e19add867cebfb249b4e7beac382d33215d6d54476bb6be46b01f8cafb4878b"}, + {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a027f8f723d07c3f21963caa7d585dcc9b089335565dabe9c814b5f70c52705a"}, + {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:61d7857950a3139bce035ad0b0945f839532987dfb4c06cfe160254f4d19df03"}, + {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:53b2b45052e7149ee8b96067793db8ecc1ae1111f2f96fe1f88ea5ad5fd92d10"}, + {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bbb1a71b1784e68870800b1bc9f3313918edc63dbb8f29fbd2e767ce5821696c"}, + {file = "frozenlist-1.3.1-cp37-cp37m-win32.whl", hash = "sha256:ab6fa8c7871877810e1b4e9392c187a60611fbf0226a9e0b11b7b92f5ac72792"}, + {file = "frozenlist-1.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f89139662cc4e65a4813f4babb9ca9544e42bddb823d2ec434e18dad582543bc"}, + {file = "frozenlist-1.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4c0c99e31491a1d92cde8648f2e7ccad0e9abb181f6ac3ddb9fc48b63301808e"}, + {file = "frozenlist-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:61e8cb51fba9f1f33887e22488bad1e28dd8325b72425f04517a4d285a04c519"}, + {file = "frozenlist-1.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc2f3e368ee5242a2cbe28323a866656006382872c40869b49b265add546703f"}, + {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58fb94a01414cddcdc6839807db77ae8057d02ddafc94a42faee6004e46c9ba8"}, + {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:022178b277cb9277d7d3b3f2762d294f15e85cd2534047e68a118c2bb0058f3e"}, + {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:572ce381e9fe027ad5e055f143763637dcbac2542cfe27f1d688846baeef5170"}, + {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19127f8dcbc157ccb14c30e6f00392f372ddb64a6ffa7106b26ff2196477ee9f"}, + {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42719a8bd3792744c9b523674b752091a7962d0d2d117f0b417a3eba97d1164b"}, + {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2743bb63095ef306041c8f8ea22bd6e4d91adabf41887b1ad7886c4c1eb43d5f"}, + {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:fa47319a10e0a076709644a0efbcaab9e91902c8bd8ef74c6adb19d320f69b83"}, + {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52137f0aea43e1993264a5180c467a08a3e372ca9d378244c2d86133f948b26b"}, + {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:f5abc8b4d0c5b556ed8cd41490b606fe99293175a82b98e652c3f2711b452988"}, + {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1e1cf7bc8cbbe6ce3881863671bac258b7d6bfc3706c600008925fb799a256e2"}, + {file = "frozenlist-1.3.1-cp38-cp38-win32.whl", hash = "sha256:0dde791b9b97f189874d654c55c24bf7b6782343e14909c84beebd28b7217845"}, + {file = "frozenlist-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:9494122bf39da6422b0972c4579e248867b6b1b50c9b05df7e04a3f30b9a413d"}, + {file = "frozenlist-1.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:31bf9539284f39ff9398deabf5561c2b0da5bb475590b4e13dd8b268d7a3c5c1"}, + {file = "frozenlist-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e0c8c803f2f8db7217898d11657cb6042b9b0553a997c4a0601f48a691480fab"}, + {file = "frozenlist-1.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da5ba7b59d954f1f214d352308d1d86994d713b13edd4b24a556bcc43d2ddbc3"}, + {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74e6b2b456f21fc93ce1aff2b9728049f1464428ee2c9752a4b4f61e98c4db96"}, + {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526d5f20e954d103b1d47232e3839f3453c02077b74203e43407b962ab131e7b"}, + {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b499c6abe62a7a8d023e2c4b2834fce78a6115856ae95522f2f974139814538c"}, + {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab386503f53bbbc64d1ad4b6865bf001414930841a870fc97f1546d4d133f141"}, + {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f63c308f82a7954bf8263a6e6de0adc67c48a8b484fab18ff87f349af356efd"}, + {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:12607804084d2244a7bd4685c9d0dca5df17a6a926d4f1967aa7978b1028f89f"}, + {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:da1cdfa96425cbe51f8afa43e392366ed0b36ce398f08b60de6b97e3ed4affef"}, + {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f810e764617b0748b49a731ffaa525d9bb36ff38332411704c2400125af859a6"}, + {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:35c3d79b81908579beb1fb4e7fcd802b7b4921f1b66055af2578ff7734711cfa"}, + {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c92deb5d9acce226a501b77307b3b60b264ca21862bd7d3e0c1f3594022f01bc"}, + {file = "frozenlist-1.3.1-cp39-cp39-win32.whl", hash = "sha256:5e77a8bd41e54b05e4fb2708dc6ce28ee70325f8c6f50f3df86a44ecb1d7a19b"}, + {file = "frozenlist-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:625d8472c67f2d96f9a4302a947f92a7adbc1e20bedb6aff8dbc8ff039ca6189"}, + {file = "frozenlist-1.3.1.tar.gz", hash = "sha256:3a735e4211a04ccfa3f4833547acdf5d2f863bfeb01cfd3edaffbc251f15cec8"}, +] + +[[package]] +name = "hexbytes" +version = "0.2.3" +description = "hexbytes: Python `bytes` subclass that decodes hex, with a readable console output" +optional = false +python-versions = ">=3.6, <4" +files = [ + {file = "hexbytes-0.2.3-py3-none-any.whl", hash = "sha256:1b33a3f101084763551e0094dbf35104868dfa82ba48787a1ca77f81ce15a44c"}, + {file = "hexbytes-0.2.3.tar.gz", hash = "sha256:199daa356aeb14879ee9c43de637acaaa1409febf15151a0e3dbcf1f8df128c0"}, +] + +[package.extras] +dev = ["Sphinx (>=1.6.5,<2)", "black (>=22,<23)", "bumpversion (>=0.5.3,<1)", "eth-utils (>=1.0.1,<2)", "flake8 (==3.7.9)", "hypothesis (>=3.44.24,<=6.31.6)", "ipython", "isort (>=4.2.15,<5)", "jinja2 (>=3.0.0,<3.1.0)", "mypy (==0.971)", "pydocstyle (>=5.0.0,<6)", "pytest (>=7,<8)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=21,<22)", "tox (>=3.25.1,<4)", "twine", "wheel"] +doc = ["Sphinx (>=1.6.5,<2)", "jinja2 (>=3.0.0,<3.1.0)", "sphinx-rtd-theme (>=0.1.9,<1)", "towncrier (>=21,<22)"] +lint = ["black (>=22,<23)", "flake8 (==3.7.9)", "isort (>=4.2.15,<5)", "mypy (==0.971)", "pydocstyle (>=5.0.0,<6)"] +test = ["eth-utils (>=1.0.1,<2)", "hypothesis (>=3.44.24,<=6.31.6)", "pytest (>=7,<8)", "pytest-xdist", "tox (>=3.25.1,<4)"] + +[[package]] +name = "hypothesis" +version = "6.27.3" +description = "A library for property-based testing" +optional = false +python-versions = ">=3.6" +files = [ + {file = "hypothesis-6.27.3-py3-none-any.whl", hash = "sha256:1c4568f40ca893c884330a1de0e0e5dcb1e867c60a56f414cb7bce97afc8dfec"}, + {file = "hypothesis-6.27.3.tar.gz", hash = "sha256:587da483bcc324494cec09cbbde3396c00da280c1732e387d7b5b89eff1aaff3"}, +] [package.dependencies] attrs = ">=19.2.0" @@ -526,35 +991,47 @@ zoneinfo = ["backports.zoneinfo (>=0.2.1)", "importlib-resources (>=3.3.0)", "tz [[package]] name = "idna" -version = "3.3" +version = "3.4" description = "Internationalized Domain Names in Applications (IDNA)" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, + {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, +] [[package]] name = "inflection" version = "0.5.0" description = "A port of Ruby on Rails inflector to Python" -category = "main" optional = false python-versions = ">=3.5" +files = [ + {file = "inflection-0.5.0-py2.py3-none-any.whl", hash = "sha256:88b101b2668a1d81d6d72d4c2018e53bc6c7fc544c987849da1c7f77545c3bc9"}, + {file = "inflection-0.5.0.tar.gz", hash = "sha256:f576e85132d34f5bf7df5183c2c6f94cfb32e528f53065345cf71329ba0b8924"}, +] [[package]] name = "iniconfig" version = "1.1.1" description = "iniconfig: brain-dead simple config-ini parsing" -category = "main" optional = false python-versions = "*" +files = [ + {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, + {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, +] [[package]] name = "ipfshttpclient" version = "0.8.0a2" description = "Python IPFS HTTP CLIENT library" -category = "main" optional = false python-versions = ">=3.6.2,!=3.7.0,!=3.7.1" +files = [ + {file = "ipfshttpclient-0.8.0a2-py3-none-any.whl", hash = "sha256:ce6bac0e3963c4ced74d7eb6978125362bb05bbe219088ca48f369ce14d3cc39"}, + {file = "ipfshttpclient-0.8.0a2.tar.gz", hash = "sha256:0d80e95ee60b02c7d414e79bf81a36fc3c8fbab74265475c52f70b2620812135"}, +] [package.dependencies] multiaddr = ">=0.0.7" @@ -564,9 +1041,12 @@ requests = ">=2.11" name = "jsonschema" version = "3.2.0" description = "An implementation of JSON Schema validation for Python" -category = "main" optional = false python-versions = "*" +files = [ + {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, + {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, +] [package.dependencies] attrs = ">=17.4.0" @@ -576,23 +1056,110 @@ six = ">=1.11.0" [package.extras] format = ["idna", "jsonpointer (>1.13)", "rfc3987", "strict-rfc3339", "webcolors"] -format_nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] +format-nongpl = ["idna", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "webcolors"] [[package]] name = "lazy-object-proxy" version = "1.7.1" description = "A fast and thorough lazy object proxy." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "lazy-object-proxy-1.7.1.tar.gz", hash = "sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-win32.whl", hash = "sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9"}, + {file = "lazy_object_proxy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win32.whl", hash = "sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb"}, + {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win32.whl", hash = "sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69"}, + {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-win32.whl", hash = "sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55"}, + {file = "lazy_object_proxy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-win32.whl", hash = "sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f"}, + {file = "lazy_object_proxy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61"}, + {file = "lazy_object_proxy-1.7.1-pp37.pp38-none-any.whl", hash = "sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84"}, +] [[package]] name = "lru-dict" version = "1.1.8" description = "An Dict like LRU container." -category = "main" optional = false python-versions = "*" +files = [ + {file = "lru-dict-1.1.8.tar.gz", hash = "sha256:878bc8ef4073e5cfb953dfc1cf4585db41e8b814c0106abde34d00ee0d0b3115"}, + {file = "lru_dict-1.1.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9d5815c0e85922cd0fb8344ca8b1c7cf020bf9fc45e670d34d51932c91fd7ec"}, + {file = "lru_dict-1.1.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f877f53249c3e49bbd7612f9083127290bede6c7d6501513567ab1bf9c581381"}, + {file = "lru_dict-1.1.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fef595c4f573141d54a38bda9221b9ee3cbe0acc73d67304a1a6d5972eb2a02"}, + {file = "lru_dict-1.1.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:db20597c4e67b4095b376ce2e83930c560f4ce481e8d05737885307ed02ba7c1"}, + {file = "lru_dict-1.1.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5b09dbe47bc4b4d45ffe56067aff190bc3c0049575da6e52127e114236e0a6a7"}, + {file = "lru_dict-1.1.8-cp310-cp310-win32.whl", hash = "sha256:3b1692755fef288b67af5cd8a973eb331d1f44cb02cbdc13660040809c2bfec6"}, + {file = "lru_dict-1.1.8-cp310-cp310-win_amd64.whl", hash = "sha256:8f6561f9cd5a452cb84905c6a87aa944fdfdc0f41cc057d03b71f9b29b2cc4bd"}, + {file = "lru_dict-1.1.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ca8f89361e0e7aad0bf93ae03a31502e96280faeb7fb92267f4998fb230d36b2"}, + {file = "lru_dict-1.1.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c50ab9edaa5da5838426816a2b7bcde9d576b4fc50e6a8c062073dbc4969d78"}, + {file = "lru_dict-1.1.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fe16ade5fd0a57e9a335f69b8055aaa6fb278fbfa250458e4f6b8255115578f"}, + {file = "lru_dict-1.1.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:de972c7f4bc7b6002acff2a8de984c55fbd7f2289dba659cfd90f7a0f5d8f5d1"}, + {file = "lru_dict-1.1.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:3d003a864899c29b0379e412709a6e516cbd6a72ee10b09d0b33226343617412"}, + {file = "lru_dict-1.1.8-cp36-cp36m-win32.whl", hash = "sha256:6e2a7aa9e36626fb48fdc341c7e3685a31a7b50ea4918677ea436271ad0d904d"}, + {file = "lru_dict-1.1.8-cp36-cp36m-win_amd64.whl", hash = "sha256:d2ed4151445c3f30423c2698f72197d64b27b1cd61d8d56702ffe235584e47c2"}, + {file = "lru_dict-1.1.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:075b9dd46d7022b675419bc6e3631748ae184bc8af195d20365a98b4f3bb2914"}, + {file = "lru_dict-1.1.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70364e3cbef536adab8762b4835e18f5ca8e3fddd8bd0ec9258c42bbebd0ee77"}, + {file = "lru_dict-1.1.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:720f5728e537f11a311e8b720793a224e985d20e6b7c3d34a891a391865af1a2"}, + {file = "lru_dict-1.1.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c2fe692332c2f1d81fd27457db4b35143801475bfc2e57173a2403588dd82a42"}, + {file = "lru_dict-1.1.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:86d32a4498b74a75340497890a260d37bf1560ad2683969393032977dd36b088"}, + {file = "lru_dict-1.1.8-cp37-cp37m-win32.whl", hash = "sha256:348167f110494cfafae70c066470a6f4e4d43523933edf16ccdb8947f3b5fae0"}, + {file = "lru_dict-1.1.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9be6c4039ef328676b868acea619cd100e3de1a35b3be211cf0eaf9775563b65"}, + {file = "lru_dict-1.1.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a777d48319d293b1b6a933d606c0e4899690a139b4c81173451913bbcab6f44f"}, + {file = "lru_dict-1.1.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99f6cfb3e28490357a0805b409caf693e46c61f8dbb789c51355adb693c568d3"}, + {file = "lru_dict-1.1.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:163079dbda54c3e6422b23da39fb3ecc561035d65e8496ff1950cbdb376018e1"}, + {file = "lru_dict-1.1.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0972d669e9e207617e06416166718b073a49bf449abbd23940d9545c0847a4d9"}, + {file = "lru_dict-1.1.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:97c24ffc55de6013075979f440acd174e88819f30387074639fb7d7178ca253e"}, + {file = "lru_dict-1.1.8-cp38-cp38-win32.whl", hash = "sha256:0f83cd70a6d32f9018d471be609f3af73058f700691657db4a3d3dd78d3f96dd"}, + {file = "lru_dict-1.1.8-cp38-cp38-win_amd64.whl", hash = "sha256:add762163f4af7f4173fafa4092eb7c7f023cf139ef6d2015cfea867e1440d82"}, + {file = "lru_dict-1.1.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:484ac524e4615f06dc72ffbfd83f26e073c9ec256de5413634fbd024c010a8bc"}, + {file = "lru_dict-1.1.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7284bdbc5579bbdc3fc8f869ed4c169f403835566ab0f84567cdbfdd05241847"}, + {file = "lru_dict-1.1.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca497cb25f19f24171f9172805f3ff135b911aeb91960bd4af8e230421ccb51"}, + {file = "lru_dict-1.1.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1df1da204a9f0b5eb8393a46070f1d984fa8559435ee790d7f8f5602038fc00"}, + {file = "lru_dict-1.1.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f4d0a6d733a23865019b1c97ed6fb1fdb739be923192abf4dbb644f697a26a69"}, + {file = "lru_dict-1.1.8-cp39-cp39-win32.whl", hash = "sha256:7be1b66926277993cecdc174c15a20c8ce785c1f8b39aa560714a513eef06473"}, + {file = "lru_dict-1.1.8-cp39-cp39-win_amd64.whl", hash = "sha256:881104711900af45967c2e5ce3e62291dd57d5b2a224d58b7c9f60bf4ad41b8c"}, + {file = "lru_dict-1.1.8-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:beb089c46bd95243d1ac5b2bd13627317b08bf40dd8dc16d4b7ee7ecb3cf65ca"}, + {file = "lru_dict-1.1.8-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10fe823ff90b655f0b6ba124e2b576ecda8c61b8ead76b456db67831942d22f2"}, + {file = "lru_dict-1.1.8-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07163c9dcbb2eca377f366b1331f46302fd8b6b72ab4d603087feca00044bb0"}, + {file = "lru_dict-1.1.8-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93336911544ebc0e466272043adab9fb9f6e9dcba6024b639c32553a3790e089"}, + {file = "lru_dict-1.1.8-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:55aeda6b6789b2d030066b4f5f6fc3596560ba2a69028f35f3682a795701b5b1"}, + {file = "lru_dict-1.1.8-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:262a4e622010ceb960a6a5222ed011090e50954d45070fd369c0fa4d2ed7d9a9"}, + {file = "lru_dict-1.1.8-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6f64005ede008b7a866be8f3f6274dbf74e656e15e4004e9d99ad65efb01809"}, + {file = "lru_dict-1.1.8-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:9d70257246b8207e8ef3d8b18457089f5ff0dfb087bd36eb33bce6584f2e0b3a"}, + {file = "lru_dict-1.1.8-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f874e9c2209dada1a080545331aa1277ec060a13f61684a8642788bf44b2325f"}, + {file = "lru_dict-1.1.8-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a592363c93d6fc6472d5affe2819e1c7590746aecb464774a4f67e09fbefdfc"}, + {file = "lru_dict-1.1.8-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f340b61f3cdfee71f66da7dbfd9a5ea2db6974502ccff2065cdb76619840dca"}, + {file = "lru_dict-1.1.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9447214e4857e16d14158794ef01e4501d8fad07d298d03308d9f90512df02fa"}, +] [package.extras] test = ["pytest"] @@ -601,9 +1168,12 @@ test = ["pytest"] name = "multiaddr" version = "0.0.9" description = "Python implementation of jbenet's multiaddr" -category = "main" optional = false python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*" +files = [ + {file = "multiaddr-0.0.9-py2.py3-none-any.whl", hash = "sha256:5c0f862cbcf19aada2a899f80ef896ddb2e85614e0c8f04dd287c06c69dac95b"}, + {file = "multiaddr-0.0.9.tar.gz", hash = "sha256:30b2695189edc3d5b90f1c303abb8f02d963a3a4edf2e7178b975eb417ab0ecf"}, +] [package.dependencies] base58 = "*" @@ -615,25 +1185,91 @@ varint = "*" name = "multidict" version = "6.0.2" description = "multidict implementation" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"}, + {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"}, + {file = "multidict-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88"}, + {file = "multidict-6.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87"}, + {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389"}, + {file = "multidict-6.0.2-cp310-cp310-win32.whl", hash = "sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293"}, + {file = "multidict-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658"}, + {file = "multidict-6.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b"}, + {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b"}, + {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15"}, + {file = "multidict-6.0.2-cp37-cp37m-win32.whl", hash = "sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc"}, + {file = "multidict-6.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86"}, + {file = "multidict-6.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693"}, + {file = "multidict-6.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9"}, + {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d"}, + {file = "multidict-6.0.2-cp38-cp38-win32.whl", hash = "sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57"}, + {file = "multidict-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e"}, + {file = "multidict-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9"}, + {file = "multidict-6.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360"}, + {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937"}, + {file = "multidict-6.0.2-cp39-cp39-win32.whl", hash = "sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a"}, + {file = "multidict-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae"}, + {file = "multidict-6.0.2.tar.gz", hash = "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013"}, +] [[package]] name = "mypy-extensions" version = "0.4.3" description = "Experimental type system extensions for programs checked with the mypy typechecker." -category = "main" optional = false python-versions = "*" +files = [ + {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, + {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, +] [[package]] name = "mythx-models" version = "1.9.1" description = "Python domain model classes for the MythX platform" -category = "main" optional = false python-versions = "*" +files = [ + {file = "mythx-models-1.9.1.tar.gz", hash = "sha256:037090723c5006df25656473db7875469e11d9d03478d41bb8d1f1517c1c474c"}, + {file = "mythx_models-1.9.1-py2.py3-none-any.whl", hash = "sha256:4b9133c2ee41f97c03545bb480a16f3388b10557c5622aeada7ce79aaadcf7de"}, +] [package.dependencies] inflection = "0.5.0" @@ -644,17 +1280,23 @@ python-dateutil = "2.8.1" name = "netaddr" version = "0.8.0" description = "A network address manipulation library for Python" -category = "main" optional = false python-versions = "*" +files = [ + {file = "netaddr-0.8.0-py2.py3-none-any.whl", hash = "sha256:9666d0232c32d2656e5e5f8d735f58fd6c7457ce52fc21c98d45f2af78f990ac"}, + {file = "netaddr-0.8.0.tar.gz", hash = "sha256:d6cc57c7a07b1d9d2e917aa8b36ae8ce61c35ba3fcd1b83ca31c5a0ee2b5a243"}, +] [[package]] name = "packaging" version = "21.3" description = "Core utilities for Python packages" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, + {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, +] [package.dependencies] pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" @@ -663,28 +1305,36 @@ pyparsing = ">=2.0.2,<3.0.5 || >3.0.5" name = "parsimonious" version = "0.8.1" description = "(Soon to be) the fastest pure-Python PEG parser I could muster" -category = "main" optional = false python-versions = "*" - +files = [ + {file = "parsimonious-0.8.1.tar.gz", hash = "sha256:3add338892d580e0cb3b1a39e4a1b427ff9f687858fdd61097053742391a9f6b"}, +] + [package.dependencies] six = ">=1.9.0" [[package]] name = "pathspec" -version = "0.9.0" +version = "0.10.1" description = "Utility library for gitignore style pattern matching of file paths." -category = "main" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +python-versions = ">=3.7" +files = [ + {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, + {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, +] [[package]] name = "platformdirs" version = "2.5.2" description = "A small Python module for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, + {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, +] [package.extras] docs = ["furo (>=2021.7.5b38)", "proselint (>=0.10.2)", "sphinx (>=4)", "sphinx-autodoc-typehints (>=1.12)"] @@ -694,9 +1344,12 @@ test = ["appdirs (==1.4.4)", "pytest (>=6)", "pytest-cov (>=2.7)", "pytest-mock name = "pluggy" version = "1.0.0" description = "plugin and hook calling mechanisms for python" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, + {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, +] [package.extras] dev = ["pre-commit", "tox"] @@ -704,11 +1357,14 @@ testing = ["pytest", "pytest-benchmark"] [[package]] name = "prettytable" -version = "3.4.1" +version = "3.9.0" description = "A simple Python library for easily displaying tabular data in a visually appealing ASCII table format" -category = "dev" optional = false -python-versions = ">=3.7" +python-versions = ">=3.8" +files = [ + {file = "prettytable-3.9.0-py3-none-any.whl", hash = "sha256:a71292ab7769a5de274b146b276ce938786f56c31cf7cea88b6f3775d82fe8c8"}, + {file = "prettytable-3.9.0.tar.gz", hash = "sha256:f4ed94803c23073a90620b201965e5dc0bccf1760b7a7eaf3158cab8aaffdf34"}, +] [package.dependencies] wcwidth = "*" @@ -718,30 +1374,92 @@ tests = ["pytest", "pytest-cov", "pytest-lazy-fixture"] [[package]] name = "prompt-toolkit" -version = "3.0.30" +version = "3.0.31" description = "Library for building powerful interactive command lines in Python" -category = "main" optional = false python-versions = ">=3.6.2" +files = [ + {file = "prompt_toolkit-3.0.31-py3-none-any.whl", hash = "sha256:9696f386133df0fc8ca5af4895afe5d78f5fcfe5258111c2a79a1c3e41ffa96d"}, + {file = "prompt_toolkit-3.0.31.tar.gz", hash = "sha256:9ada952c9d1787f52ff6d5f3484d0b4df8952787c087edf6a1f7c2cb1ea88148"}, +] [package.dependencies] wcwidth = "*" [[package]] name = "protobuf" -version = "3.20.1" +version = "3.19.5" description = "Protocol Buffers" -category = "main" optional = false -python-versions = ">=3.7" +python-versions = ">=3.5" +files = [ + {file = "protobuf-3.19.5-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:f2b599a21c9a32e171ec29a2ac54e03297736c578698e11b099d031f79da114b"}, + {file = "protobuf-3.19.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f976234e20ab2785f54224bcdafa027674e23663b132fa3ca0caa291a6cfbde7"}, + {file = "protobuf-3.19.5-cp310-cp310-win32.whl", hash = "sha256:4ee2af7051d3b10c8a4fe6fd1a2c69f201fea36aeee7086cf202a692e1b99ee1"}, + {file = "protobuf-3.19.5-cp310-cp310-win_amd64.whl", hash = "sha256:dca2284378a5f2a86ffed35c6ac147d14c48b525eefcd1083e5a9ce28dfa8657"}, + {file = "protobuf-3.19.5-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c0f80876a8ff0ae7064084ed094eb86497bd5a3812e6fc96a05318b92301674e"}, + {file = "protobuf-3.19.5-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c4160b601220627f7e91154e572baf5e161a9c3f445a8242d536ee3d0b7b17c"}, + {file = "protobuf-3.19.5-cp36-cp36m-win32.whl", hash = "sha256:f2bde37667b18c2b5280df83bc799204394a5d2d774e4deaf9de0eb741df6833"}, + {file = "protobuf-3.19.5-cp36-cp36m-win_amd64.whl", hash = "sha256:1867f93b06a183f87696871bb8d1e99ee71dbb69d468ce1f0cc8bf3d30f982f3"}, + {file = "protobuf-3.19.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a89aa0c042e61e11ade320b802d6db4ee5391d8d973e46d3a48172c1597789f8"}, + {file = "protobuf-3.19.5-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:f9cebda093c2f6bfed88f1c17cdade09d4d96096421b344026feee236532d4de"}, + {file = "protobuf-3.19.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:67efb5d20618020aa9596e17bfc37ca068c28ec0c1507d9507f73c93d46c9855"}, + {file = "protobuf-3.19.5-cp37-cp37m-win32.whl", hash = "sha256:950abd6c00e7b51f87ae8b18a0ce4d69fea217f62f171426e77de5061f6d9850"}, + {file = "protobuf-3.19.5-cp37-cp37m-win_amd64.whl", hash = "sha256:d3973a2d58aefc7d1230725c2447ce7f86a71cbc094b86a77c6ee1505ac7cdb1"}, + {file = "protobuf-3.19.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9e1d74032f56ff25f417cfe84c8147047732e5059137ca42efad20cbbd25f5e0"}, + {file = "protobuf-3.19.5-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:d249519ba5ecf5dd6b18150c9b6bcde510b273714b696f3923ff8308fc11ae49"}, + {file = "protobuf-3.19.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9f957ef53e872d58a0afd3bf6d80d48535d28c99b40e75e6634cbc33ea42fd54"}, + {file = "protobuf-3.19.5-cp38-cp38-win32.whl", hash = "sha256:5470f892961af464ae6eaf0f3099e2c1190ae8c7f36f174b89491281341f79ca"}, + {file = "protobuf-3.19.5-cp38-cp38-win_amd64.whl", hash = "sha256:c44e3282cff74ad18c7e8a0375f407f69ee50c2116364b44492a196293e08b21"}, + {file = "protobuf-3.19.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:66d14b5b90090353efe75c9fb1bf65ef7267383034688d255b500822e37d5c2f"}, + {file = "protobuf-3.19.5-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:f4f909f4dde413dec435a44b0894956d55bb928ded7d6e3c726556ca4c796e84"}, + {file = "protobuf-3.19.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5266c36cc0af3bb3dbf44f199d225b33da66a9a5c3bdc2b14865ad10eddf0e37"}, + {file = "protobuf-3.19.5-cp39-cp39-win32.whl", hash = "sha256:6a02172b9650f819d01fb8e224fc69b0706458fc1ab4f1c669281243c71c1a5e"}, + {file = "protobuf-3.19.5-cp39-cp39-win_amd64.whl", hash = "sha256:696e6cfab94cc15a14946f2bf72719dced087d437adbd994fff34f38986628bc"}, + {file = "protobuf-3.19.5-py2.py3-none-any.whl", hash = "sha256:9e42b1cf2ecd8a1bd161239e693f22035ba99905ae6d7efeac8a0546c7ec1a27"}, + {file = "protobuf-3.19.5.tar.gz", hash = "sha256:e63b0b3c42e51c94add62b010366cd4979cb6d5f06158bcae8faac4c294f91e1"}, +] [[package]] name = "psutil" -version = "5.9.1" +version = "5.9.2" description = "Cross-platform lib for process and system monitoring in Python." -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "psutil-5.9.2-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:8f024fbb26c8daf5d70287bb3edfafa22283c255287cf523c5d81721e8e5d82c"}, + {file = "psutil-5.9.2-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:b2f248ffc346f4f4f0d747ee1947963613216b06688be0be2e393986fe20dbbb"}, + {file = "psutil-5.9.2-cp27-cp27m-win32.whl", hash = "sha256:b1928b9bf478d31fdffdb57101d18f9b70ed4e9b0e41af751851813547b2a9ab"}, + {file = "psutil-5.9.2-cp27-cp27m-win_amd64.whl", hash = "sha256:404f4816c16a2fcc4eaa36d7eb49a66df2d083e829d3e39ee8759a411dbc9ecf"}, + {file = "psutil-5.9.2-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:94e621c6a4ddb2573d4d30cba074f6d1aa0186645917df42c811c473dd22b339"}, + {file = "psutil-5.9.2-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:256098b4f6ffea6441eb54ab3eb64db9ecef18f6a80d7ba91549195d55420f84"}, + {file = "psutil-5.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:614337922702e9be37a39954d67fdb9e855981624d8011a9927b8f2d3c9625d9"}, + {file = "psutil-5.9.2-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39ec06dc6c934fb53df10c1672e299145ce609ff0611b569e75a88f313634969"}, + {file = "psutil-5.9.2-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3ac2c0375ef498e74b9b4ec56df3c88be43fe56cac465627572dbfb21c4be34"}, + {file = "psutil-5.9.2-cp310-cp310-win32.whl", hash = "sha256:e4c4a7636ffc47b7141864f1c5e7d649f42c54e49da2dd3cceb1c5f5d29bfc85"}, + {file = "psutil-5.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:f4cb67215c10d4657e320037109939b1c1d2fd70ca3d76301992f89fe2edb1f1"}, + {file = "psutil-5.9.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:dc9bda7d5ced744622f157cc8d8bdd51735dafcecff807e928ff26bdb0ff097d"}, + {file = "psutil-5.9.2-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d75291912b945a7351d45df682f9644540d564d62115d4a20d45fa17dc2d48f8"}, + {file = "psutil-5.9.2-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4018d5f9b6651f9896c7a7c2c9f4652e4eea53f10751c4e7d08a9093ab587ec"}, + {file = "psutil-5.9.2-cp36-cp36m-win32.whl", hash = "sha256:f40ba362fefc11d6bea4403f070078d60053ed422255bd838cd86a40674364c9"}, + {file = "psutil-5.9.2-cp36-cp36m-win_amd64.whl", hash = "sha256:9770c1d25aee91417eba7869139d629d6328a9422ce1cdd112bd56377ca98444"}, + {file = "psutil-5.9.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:42638876b7f5ef43cef8dcf640d3401b27a51ee3fa137cb2aa2e72e188414c32"}, + {file = "psutil-5.9.2-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:91aa0dac0c64688667b4285fa29354acfb3e834e1fd98b535b9986c883c2ce1d"}, + {file = "psutil-5.9.2-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4fb54941aac044a61db9d8eb56fc5bee207db3bc58645d657249030e15ba3727"}, + {file = "psutil-5.9.2-cp37-cp37m-win32.whl", hash = "sha256:7cbb795dcd8ed8fd238bc9e9f64ab188f3f4096d2e811b5a82da53d164b84c3f"}, + {file = "psutil-5.9.2-cp37-cp37m-win_amd64.whl", hash = "sha256:5d39e3a2d5c40efa977c9a8dd4f679763c43c6c255b1340a56489955dbca767c"}, + {file = "psutil-5.9.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:fd331866628d18223a4265371fd255774affd86244fc307ef66eaf00de0633d5"}, + {file = "psutil-5.9.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b315febaebae813326296872fdb4be92ad3ce10d1d742a6b0c49fb619481ed0b"}, + {file = "psutil-5.9.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f7929a516125f62399d6e8e026129c8835f6c5a3aab88c3fff1a05ee8feb840d"}, + {file = "psutil-5.9.2-cp38-cp38-win32.whl", hash = "sha256:561dec454853846d1dd0247b44c2e66a0a0c490f937086930ec4b8f83bf44f06"}, + {file = "psutil-5.9.2-cp38-cp38-win_amd64.whl", hash = "sha256:67b33f27fc0427483b61563a16c90d9f3b547eeb7af0ef1b9fe024cdc9b3a6ea"}, + {file = "psutil-5.9.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b3591616fa07b15050b2f87e1cdefd06a554382e72866fcc0ab2be9d116486c8"}, + {file = "psutil-5.9.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:14b29f581b5edab1f133563272a6011925401804d52d603c5c606936b49c8b97"}, + {file = "psutil-5.9.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4642fd93785a29353d6917a23e2ac6177308ef5e8be5cc17008d885cb9f70f12"}, + {file = "psutil-5.9.2-cp39-cp39-win32.whl", hash = "sha256:ed29ea0b9a372c5188cdb2ad39f937900a10fb5478dc077283bf86eeac678ef1"}, + {file = "psutil-5.9.2-cp39-cp39-win_amd64.whl", hash = "sha256:68b35cbff92d1f7103d8f1db77c977e72f49fcefae3d3d2b91c76b0e7aef48b8"}, + {file = "psutil-5.9.2.tar.gz", hash = "sha256:feb861a10b6c3bb00701063b37e4afc754f8217f0f09c42280586bd6ac712b5c"}, +] [package.extras] test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] @@ -750,25 +1468,34 @@ test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] name = "py" version = "1.11.0" description = "library with cross-python path, ini-parsing, io, code, log facilities" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, + {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, +] [[package]] name = "py-solc-ast" version = "1.2.9" description = "A tool for exploring the abstract syntax tree generated by solc." -category = "main" optional = false python-versions = ">=3.6, <4" +files = [ + {file = "py-solc-ast-1.2.9.tar.gz", hash = "sha256:5a5c3bb1998de32eed4b793ebbf2f14f1fd5c681cf8b62af6b8f9f76b805164d"}, + {file = "py_solc_ast-1.2.9-py3-none-any.whl", hash = "sha256:f636217ef77bbe0f9c87a71af2f6cc9577f6301aa2ffb9af119f4c8fa8522b2d"}, +] [[package]] name = "py-solc-x" version = "1.1.1" description = "Python wrapper and version management tool for the solc Solidity compiler." -category = "main" optional = false python-versions = ">=3.6, <4" +files = [ + {file = "py-solc-x-1.1.1.tar.gz", hash = "sha256:d8b0bd2b04f47cff6e92181739d9e94e41b2d62f056900761c797fa5babc76b6"}, + {file = "py_solc_x-1.1.1-py3-none-any.whl", hash = "sha256:8f5caa4f54e227fc301e2e4c8aa868e869c2bc0c6636aa9e8115f8414bb891f9"}, +] [package.dependencies] requests = ">=2.19.0,<3" @@ -778,36 +1505,81 @@ semantic-version = ">=2.8.1,<3" name = "pycryptodome" version = "3.15.0" description = "Cryptographic library for Python" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pycryptodome-3.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff7ae90e36c1715a54446e7872b76102baa5c63aa980917f4aa45e8c78d1a3ec"}, + {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2ffd8b31561455453ca9f62cb4c24e6b8d119d6d531087af5f14b64bee2c23e6"}, + {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2ea63d46157386c5053cfebcdd9bd8e0c8b7b0ac4a0507a027f5174929403884"}, + {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:7c9ed8aa31c146bef65d89a1b655f5f4eab5e1120f55fc297713c89c9e56ff0b"}, + {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:5099c9ca345b2f252f0c28e96904643153bae9258647585e5e6f649bb7a1844a"}, + {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:2ec709b0a58b539a4f9d33fb8508264c3678d7edb33a68b8906ba914f71e8c13"}, + {file = "pycryptodome-3.15.0-cp27-cp27m-musllinux_1_1_aarch64.whl", hash = "sha256:2ae53125de5b0d2c95194d957db9bb2681da8c24d0fb0fe3b056de2bcaf5d837"}, + {file = "pycryptodome-3.15.0-cp27-cp27m-win32.whl", hash = "sha256:fd2184aae6ee2a944aaa49113e6f5787cdc5e4db1eb8edb1aea914bd75f33a0c"}, + {file = "pycryptodome-3.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:7e3a8f6ee405b3bd1c4da371b93c31f7027944b2bcce0697022801db93120d83"}, + {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:b9c5b1a1977491533dfd31e01550ee36ae0249d78aae7f632590db833a5012b8"}, + {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0926f7cc3735033061ef3cf27ed16faad6544b14666410727b31fea85a5b16eb"}, + {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:2aa55aae81f935a08d5a3c2042eb81741a43e044bd8a81ea7239448ad751f763"}, + {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:c3640deff4197fa064295aaac10ab49a0d55ef3d6a54ae1499c40d646655c89f"}, + {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:045d75527241d17e6ef13636d845a12e54660aa82e823b3b3341bcf5af03fa79"}, + {file = "pycryptodome-3.15.0-cp27-cp27mu-musllinux_1_1_aarch64.whl", hash = "sha256:eb6fce570869e70cc8ebe68eaa1c26bed56d40ad0f93431ee61d400525433c54"}, + {file = "pycryptodome-3.15.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9ee40e2168f1348ae476676a2e938ca80a2f57b14a249d8fe0d3cdf803e5a676"}, + {file = "pycryptodome-3.15.0-cp35-abi3-manylinux1_i686.whl", hash = "sha256:4c3ccad74eeb7b001f3538643c4225eac398c77d617ebb3e57571a897943c667"}, + {file = "pycryptodome-3.15.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:1b22bcd9ec55e9c74927f6b1f69843cb256fb5a465088ce62837f793d9ffea88"}, + {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2010_i686.whl", hash = "sha256:57f565acd2f0cf6fb3e1ba553d0cb1f33405ec1f9c5ded9b9a0a5320f2c0bd3d"}, + {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:4b52cb18b0ad46087caeb37a15e08040f3b4c2d444d58371b6f5d786d95534c2"}, + {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:092a26e78b73f2530b8bd6b3898e7453ab2f36e42fd85097d705d6aba2ec3e5e"}, + {file = "pycryptodome-3.15.0-cp35-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:50ca7e587b8e541eb6c192acf92449d95377d1f88908c0a32ac5ac2703ebe28b"}, + {file = "pycryptodome-3.15.0-cp35-abi3-win32.whl", hash = "sha256:e244ab85c422260de91cda6379e8e986405b4f13dc97d2876497178707f87fc1"}, + {file = "pycryptodome-3.15.0-cp35-abi3-win_amd64.whl", hash = "sha256:c77126899c4b9c9827ddf50565e93955cb3996813c18900c16b2ea0474e130e9"}, + {file = "pycryptodome-3.15.0-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:9eaadc058106344a566dc51d3d3a758ab07f8edde013712bc8d22032a86b264f"}, + {file = "pycryptodome-3.15.0-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:ff287bcba9fbeb4f1cccc1f2e90a08d691480735a611ee83c80a7d74ad72b9d9"}, + {file = "pycryptodome-3.15.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:60b4faae330c3624cc5a546ba9cfd7b8273995a15de94ee4538130d74953ec2e"}, + {file = "pycryptodome-3.15.0-pp27-pypy_73-win32.whl", hash = "sha256:a8f06611e691c2ce45ca09bbf983e2ff2f8f4f87313609d80c125aff9fad6e7f"}, + {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b9cc96e274b253e47ad33ae1fccc36ea386f5251a823ccb50593a935db47fdd2"}, + {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:ecaaef2d21b365d9c5ca8427ffc10cebed9d9102749fd502218c23cb9a05feb5"}, + {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:d2a39a66057ab191e5c27211a7daf8f0737f23acbf6b3562b25a62df65ffcb7b"}, + {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:9c772c485b27967514d0df1458b56875f4b6d025566bf27399d0c239ff1b369f"}, + {file = "pycryptodome-3.15.0.tar.gz", hash = "sha256:9135dddad504592bcc18b0d2d95ce86c3a5ea87ec6447ef25cfedea12d6018b8"}, +] [[package]] -name = "Pygments" -version = "2.12.0" +name = "pygments" +version = "2.13.0" description = "Pygments is a syntax highlighting package written in Python." -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, + {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, +] + +[package.extras] +plugins = ["importlib-metadata"] [[package]] name = "pygments-lexer-solidity" version = "0.7.0" description = "Solidity lexer for Pygments (includes Yul intermediate language)" -category = "main" optional = false python-versions = ">=3.3, <4" +files = [ + {file = "pygments-lexer-solidity-0.7.0.tar.gz", hash = "sha256:a347fd96981838331b6d98b0f891776908a49406d343ff2a40a6a1c8475a9350"}, +] [package.dependencies] pygments = ">=2.1" [[package]] -name = "PyJWT" +name = "pyjwt" version = "1.7.1" description = "JSON Web Token implementation in Python" -category = "main" optional = false python-versions = "*" +files = [ + {file = "PyJWT-1.7.1-py2.py3-none-any.whl", hash = "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e"}, + {file = "PyJWT-1.7.1.tar.gz", hash = "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"}, +] [package.extras] crypto = ["cryptography (>=1.4)"] @@ -818,9 +1590,12 @@ test = ["pytest (>=4.0.1,<5.0.0)", "pytest-cov (>=2.6.0,<3.0.0)", "pytest-runner name = "pyparsing" version = "3.0.9" description = "pyparsing module - Classes and methods to define and execute parsing grammars" -category = "main" optional = false python-versions = ">=3.6.8" +files = [ + {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, + {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, +] [package.extras] diagrams = ["jinja2", "railroad-diagrams"] @@ -829,25 +1604,72 @@ diagrams = ["jinja2", "railroad-diagrams"] name = "pyrsistent" version = "0.18.1" description = "Persistent/Functional/Immutable data structures" -category = "main" optional = false python-versions = ">=3.7" +files = [ + {file = "pyrsistent-0.18.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1"}, + {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d45866ececf4a5fff8742c25722da6d4c9e180daa7b405dc0a2a2790d668c26"}, + {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ed6784ceac462a7d6fcb7e9b663e93b9a6fb373b7f43594f9ff68875788e01e"}, + {file = "pyrsistent-0.18.1-cp310-cp310-win32.whl", hash = "sha256:e4f3149fd5eb9b285d6bfb54d2e5173f6a116fe19172686797c056672689daf6"}, + {file = "pyrsistent-0.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:636ce2dc235046ccd3d8c56a7ad54e99d5c1cd0ef07d9ae847306c91d11b5fec"}, + {file = "pyrsistent-0.18.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e92a52c166426efbe0d1ec1332ee9119b6d32fc1f0bbfd55d5c1088070e7fc1b"}, + {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7a096646eab884bf8bed965bad63ea327e0d0c38989fc83c5ea7b8a87037bfc"}, + {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdfd2c361b8a8e5d9499b9082b501c452ade8bbf42aef97ea04854f4a3f43b22"}, + {file = "pyrsistent-0.18.1-cp37-cp37m-win32.whl", hash = "sha256:7ec335fc998faa4febe75cc5268a9eac0478b3f681602c1f27befaf2a1abe1d8"}, + {file = "pyrsistent-0.18.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6455fc599df93d1f60e1c5c4fe471499f08d190d57eca040c0ea182301321286"}, + {file = "pyrsistent-0.18.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd8da6d0124efa2f67d86fa70c851022f87c98e205f0594e1fae044e7119a5a6"}, + {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bfe2388663fd18bd8ce7db2c91c7400bf3e1a9e8bd7d63bf7e77d39051b85ec"}, + {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e3e1fcc45199df76053026a51cc59ab2ea3fc7c094c6627e93b7b44cdae2c8c"}, + {file = "pyrsistent-0.18.1-cp38-cp38-win32.whl", hash = "sha256:b568f35ad53a7b07ed9b1b2bae09eb15cdd671a5ba5d2c66caee40dbf91c68ca"}, + {file = "pyrsistent-0.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1b96547410f76078eaf66d282ddca2e4baae8964364abb4f4dcdde855cd123a"}, + {file = "pyrsistent-0.18.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f87cc2863ef33c709e237d4b5f4502a62a00fab450c9e020892e8e2ede5847f5"}, + {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bc66318fb7ee012071b2792024564973ecc80e9522842eb4e17743604b5e045"}, + {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:914474c9f1d93080338ace89cb2acee74f4f666fb0424896fcfb8d86058bf17c"}, + {file = "pyrsistent-0.18.1-cp39-cp39-win32.whl", hash = "sha256:1b34eedd6812bf4d33814fca1b66005805d3640ce53140ab8bbb1e2651b0d9bc"}, + {file = "pyrsistent-0.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07"}, + {file = "pyrsistent-0.18.1.tar.gz", hash = "sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96"}, +] [[package]] name = "pysha3" version = "1.0.2" description = "SHA-3 (Keccak) for Python 2.7 - 3.5" -category = "dev" optional = false python-versions = "*" +files = [ + {file = "pysha3-1.0.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:6e6a84efb7856f5d760ee55cd2b446972cb7b835676065f6c4f694913ea8f8d9"}, + {file = "pysha3-1.0.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f9046d59b3e72aa84f6dae83a040bd1184ebd7fef4e822d38186a8158c89e3cf"}, + {file = "pysha3-1.0.2-cp27-cp27m-win32.whl", hash = "sha256:9fdd28884c5d0b4edfed269b12badfa07f1c89dbc5c9c66dd279833894a9896b"}, + {file = "pysha3-1.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:41be70b06c8775a9e4d4eeb52f2f6a3f356f17539a54eac61f43a29e42fd453d"}, + {file = "pysha3-1.0.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:68c3a60a39f9179b263d29e221c1bd6e01353178b14323c39cc70593c30f21c5"}, + {file = "pysha3-1.0.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:59111c08b8f34495575d12e5f2ce3bafb98bea470bc81e70c8b6df99aef0dd2f"}, + {file = "pysha3-1.0.2-cp33-cp33m-win32.whl", hash = "sha256:571a246308a7b63f15f5aa9651f99cf30f2a6acba18eddf28f1510935968b603"}, + {file = "pysha3-1.0.2-cp33-cp33m-win_amd64.whl", hash = "sha256:93abd775dac570cb9951c4e423bcb2bc6303a9d1dc0dc2b7afa2dd401d195b24"}, + {file = "pysha3-1.0.2-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:11a2ba7a2e1d9669d0052fc8fb30f5661caed5512586ecbeeaf6bf9478ab5c48"}, + {file = "pysha3-1.0.2-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:5ec8da7c5c70a53b5fa99094af3ba8d343955b212bc346a0d25f6ff75853999f"}, + {file = "pysha3-1.0.2-cp34-cp34m-win32.whl", hash = "sha256:9c778fa8b161dc9348dc5cc361e94d54aa5ff18413788f4641f6600d4893a608"}, + {file = "pysha3-1.0.2-cp34-cp34m-win_amd64.whl", hash = "sha256:fd7e66999060d079e9c0e8893e78d8017dad4f59721f6fe0be6307cd32127a07"}, + {file = "pysha3-1.0.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:827b308dc025efe9b6b7bae36c2e09ed0118a81f792d888548188e97b9bf9a3d"}, + {file = "pysha3-1.0.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:4416f16b0f1605c25f627966f76873e432971824778b369bd9ce1bb63d6566d9"}, + {file = "pysha3-1.0.2-cp35-cp35m-win32.whl", hash = "sha256:c93a2676e6588abcfaecb73eb14485c81c63b94fca2000a811a7b4fb5937b8e8"}, + {file = "pysha3-1.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:684cb01d87ed6ff466c135f1c83e7e4042d0fc668fa20619f581e6add1d38d77"}, + {file = "pysha3-1.0.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:386998ee83e313b6911327174e088021f9f2061cbfa1651b97629b761e9ef5c4"}, + {file = "pysha3-1.0.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c7c2adcc43836223680ebdf91f1d3373543dc32747c182c8ca2e02d1b69ce030"}, + {file = "pysha3-1.0.2-cp36-cp36m-win32.whl", hash = "sha256:cd5c961b603bd2e6c2b5ef9976f3238a561c58569945d4165efb9b9383b050ef"}, + {file = "pysha3-1.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:0060a66be16665d90c432f55a0ba1f6480590cfb7d2ad389e688a399183474f0"}, + {file = "pysha3-1.0.2.tar.gz", hash = "sha256:fe988e73f2ce6d947220624f04d467faf05f1bbdbc64b0a201296bb3af92739e"}, +] [[package]] name = "pytest" version = "6.2.5" description = "pytest: simple powerful testing with Python" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, + {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, +] [package.dependencies] atomicwrites = {version = ">=1.0", markers = "sys_platform == \"win32\""} @@ -866,9 +1688,12 @@ testing = ["argcomplete", "hypothesis (>=3.56)", "mock", "nose", "requests", "xm name = "pytest-forked" version = "1.4.0" description = "run tests in isolated forked subprocesses" -category = "main" optional = false python-versions = ">=3.6" +files = [ + {file = "pytest-forked-1.4.0.tar.gz", hash = "sha256:8b67587c8f98cbbadfdd804539ed5455b6ed03802203485dd2f53c1422d7440e"}, + {file = "pytest_forked-1.4.0-py3-none-any.whl", hash = "sha256:bbbb6717efc886b9d64537b41fb1497cfaf3c9601276be8da2cccfea5a3c8ad8"}, +] [package.dependencies] py = "*" @@ -878,9 +1703,12 @@ pytest = ">=3.10" name = "pytest-xdist" version = "1.34.0" description = "pytest xdist plugin for distributed testing and loop-on-failing modes" -category = "main" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "pytest-xdist-1.34.0.tar.gz", hash = "sha256:340e8e83e2a4c0d861bdd8d05c5d7b7143f6eea0aba902997db15c2a86be04ee"}, + {file = "pytest_xdist-1.34.0-py2.py3-none-any.whl", hash = "sha256:ba5d10729372d65df3ac150872f9df5d2ed004a3b0d499cc0164aafedd8c7b66"}, +] [package.dependencies] execnet = ">=1.1" @@ -895,9 +1723,12 @@ testing = ["filelock"] name = "python-dateutil" version = "2.8.1" description = "Extensions to the standard Python datetime module" -category = "main" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, + {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, +] [package.dependencies] six = ">=1.5" @@ -906,9 +1737,12 @@ six = ">=1.5" name = "python-dotenv" version = "0.16.0" description = "Read key-value pairs from a .env file and set them as environment variables" -category = "main" optional = false python-versions = "*" +files = [ + {file = "python-dotenv-0.16.0.tar.gz", hash = "sha256:9fa413c37d4652d3fa02fea0ff465c384f5db75eab259c4fc5d0c5b8bf20edd4"}, + {file = "python_dotenv-0.16.0-py2.py3-none-any.whl", hash = "sha256:31d752f5b748f4e292448c9a0cac6a08ed5e6f4cefab85044462dcad56905cec"}, +] [package.extras] cli = ["click (>=5.0)"] @@ -917,1146 +1751,50 @@ cli = ["click (>=5.0)"] name = "pythx" version = "1.6.1" description = "A Python library for the MythX platform" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -inflection = "0.5.0" -mythx-models = "1.9.1" -PyJWT = ">=1.7.0,<1.8.0" -python-dateutil = ">=2.8.0,<2.9.0" -requests = ">=2.0.0,<3.0.0" - -[[package]] -name = "pywin32" -version = "304" -description = "Python for Window Extensions" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "PyYAML" -version = "5.4.1" -description = "YAML parser and emitter for Python" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" - -[[package]] -name = "requests" -version = "2.28.1" -description = "Python HTTP for Humans." -category = "main" -optional = false -python-versions = ">=3.7, <4" - -[package.dependencies] -certifi = ">=2017.4.17" -charset-normalizer = ">=2,<3" -idna = ">=2.5,<4" -urllib3 = ">=1.21.1,<1.27" - -[package.extras] -socks = ["PySocks (>=1.5.6,!=1.5.7)"] -use_chardet_on_py3 = ["chardet (>=3.0.2,<6)"] - -[[package]] -name = "rlp" -version = "2.0.1" -description = "A package for Recursive Length Prefix encoding and decoding" -category = "main" -optional = false -python-versions = "*" - -[package.dependencies] -eth-utils = ">=1.0.2,<2" - -[package.extras] -dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "flake8 (==3.4.1)", "hypothesis (==5.19.0)", "ipython", "pytest (==5.4.3)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "setuptools (>=36.2.0)", "sphinx-rtd-theme (>=0.1.9)", "tox (>=2.9.1,<3)", "twine", "wheel"] -doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)"] -lint = ["flake8 (==3.4.1)"] -rust-backend = ["rusty-rlp (>=0.1.15,<0.2)"] -test = ["hypothesis (==5.19.0)", "pytest (==5.4.3)", "tox (>=2.9.1,<3)"] - -[[package]] -name = "semantic-version" -version = "2.8.5" -description = "A library implementing the 'SemVer' scheme." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" - -[[package]] -name = "setuptools" -version = "63.4.3" -description = "Easily download, build, install, upgrade, and uninstall Python packages" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.extras] -docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mock", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] -testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] - -[[package]] -name = "six" -version = "1.16.0" -description = "Python 2 and 3 compatibility utilities" -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "slither-analyzer" -version = "0.8.3" -description = "Slither is a Solidity static analysis framework written in Python 3." -category = "dev" -optional = false -python-versions = ">=3.6" - -[package.dependencies] -crytic-compile = ">=0.2.3" -prettytable = ">=0.7.2" -pysha3 = ">=1.0.2" - -[[package]] -name = "sortedcontainers" -version = "2.4.0" -description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" -category = "main" optional = false python-versions = "*" - -[[package]] -name = "toml" -version = "0.10.2" -description = "Python Library for Tom's Obvious, Minimal Language" -category = "main" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" - -[[package]] -name = "tomli" -version = "2.0.1" -description = "A lil' TOML parser" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "toolz" -version = "0.12.0" -description = "List processing tools and functional utilities" -category = "main" -optional = false -python-versions = ">=3.5" - -[[package]] -name = "tqdm" -version = "4.64.0" -description = "Fast, Extensible Progress Meter" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" - -[package.dependencies] -colorama = {version = "*", markers = "platform_system == \"Windows\""} - -[package.extras] -dev = ["py-make (>=0.1.0)", "twine", "wheel"] -notebook = ["ipywidgets (>=6)"] -slack = ["slack-sdk"] -telegram = ["requests"] - -[[package]] -name = "typing-extensions" -version = "4.3.0" -description = "Backported and Experimental Type Hints for Python 3.7+" -category = "main" -optional = false -python-versions = ">=3.7" - -[[package]] -name = "urllib3" -version = "1.26.11" -description = "HTTP library with thread-safe connection pooling, file post, and more." -category = "main" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" - -[package.extras] -brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] -secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)"] -socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] - -[[package]] -name = "varint" -version = "1.0.2" -description = "Simple python varint implementation" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "vvm" -version = "0.1.0" -description = "Vyper version management tool" -category = "main" -optional = false -python-versions = ">=3.6, <4" - -[package.dependencies] -requests = ">=2.19.0,<3" -semantic-version = ">=2.8.1,<3" - -[[package]] -name = "vyper" -version = "0.3.6" -description = "Vyper: the Pythonic Programming Language for the EVM" -category = "main" -optional = false -python-versions = ">=3.7,<3.11" - -[package.dependencies] -asttokens = "2.0.5" -pycryptodome = ">=3.5.1,<4" -semantic-version = "2.8.5" -wheel = "*" - -[package.extras] -dev = ["black (==21.9b0)", "click (<8.1.0)", "eth-tester[py-evm] (>=0.6.0b6,<0.7)", "flake8 (==3.9.2)", "flake8-bugbear (==20.1.4)", "flake8-use-fstring (==1.1)", "hypothesis[lark] (>=5.37.1,<6.0)", "ipython", "isort (==5.9.3)", "lark-parser (==0.10.0)", "mypy (==0.910)", "pre-commit", "py-evm (>=0.5.0a3,<0.6)", "pyinstaller", "pytest (>=6.2.5,<7.0)", "pytest-cov (>=2.10,<3.0)", "pytest-instafail (>=0.4,<1.0)", "pytest-rerunfailures (>=10.2,<11)", "pytest-split (>=0.7.0,<1.0)", "pytest-xdist (>=2.5,<3.0)", "recommonmark", "sphinx (>=3.0,<4.0)", "sphinx-rtd-theme (>=0.5,<0.6)", "tox (>=3.15,<4.0)", "twine", "web3 (==5.27.0)"] -docs = ["recommonmark", "sphinx (>=3.0,<4.0)", "sphinx-rtd-theme (>=0.5,<0.6)"] -lint = ["black (==21.9b0)", "click (<8.1.0)", "flake8 (==3.9.2)", "flake8-bugbear (==20.1.4)", "flake8-use-fstring (==1.1)", "isort (==5.9.3)", "mypy (==0.910)"] -test = ["eth-tester[py-evm] (>=0.6.0b6,<0.7)", "hypothesis[lark] (>=5.37.1,<6.0)", "lark-parser (==0.10.0)", "py-evm (>=0.5.0a3,<0.6)", "pytest (>=6.2.5,<7.0)", "pytest-cov (>=2.10,<3.0)", "pytest-instafail (>=0.4,<1.0)", "pytest-rerunfailures (>=10.2,<11)", "pytest-split (>=0.7.0,<1.0)", "pytest-xdist (>=2.5,<3.0)", "tox (>=3.15,<4.0)", "web3 (==5.27.0)"] - -[[package]] -name = "wcwidth" -version = "0.2.5" -description = "Measures the displayed width of unicode strings in a terminal" -category = "main" -optional = false -python-versions = "*" - -[[package]] -name = "web3" -version = "5.30.0" -description = "Web3.py" -category = "main" -optional = false -python-versions = ">=3.6,<4" - -[package.dependencies] -aiohttp = ">=3.7.4.post0,<4" -eth-abi = ">=2.0.0b6,<3.0.0" -eth-account = ">=0.5.7,<0.6.0" -eth-hash = {version = ">=0.2.0,<1.0.0", extras = ["pycryptodome"]} -eth-rlp = "<0.3" -eth-typing = ">=2.0.0,<3.0.0" -eth-utils = ">=1.9.5,<2.0.0" -hexbytes = ">=0.1.0,<1.0.0" -ipfshttpclient = "0.8.0a2" -jsonschema = ">=3.2.0,<5" -lru-dict = ">=1.1.6,<2.0.0" -protobuf = ">=3.10.0,<4" -pywin32 = {version = ">=223", markers = "platform_system == \"Windows\""} -requests = ">=2.16.0,<3.0.0" -websockets = ">=9.1,<10" - -[package.extras] -dev = ["Jinja2 (<=3.0.3)", "bumpversion", "click (>=5.1)", "configparser (==3.5.0)", "contextlib2 (>=0.5.4)", "eth-tester[py-evm] (==v0.6.0-beta.6)", "flake8 (==3.8.3)", "flaky (>=3.7.0,<4)", "hypothesis (>=3.31.2,<6)", "isort (>=4.2.15,<4.3.5)", "mock", "mypy (==0.910)", "pluggy (==0.13.1)", "py-geth (>=3.8.0,<4)", "py-solc (>=0.4.0)", "pytest (>=4.4.0,<5.0.0)", "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)", "sphinx (>=3.0,<4)", "sphinx-better-theme (>=0.1.4)", "sphinx-rtd-theme (>=0.1.9)", "toposort (>=1.4)", "towncrier (==18.5.0)", "tox (>=1.8.0)", "tqdm (>4.32,<5)", "twine (>=1.13,<2)", "types-protobuf (==3.19.13)", "types-requests (>=2.26.1,<3)", "types-setuptools (>=57.4.4,<58)", "urllib3", "wheel", "when-changed (>=0.3.0,<0.4)"] -docs = ["Jinja2 (<=3.0.3)", "click (>=5.1)", "configparser (==3.5.0)", "contextlib2 (>=0.5.4)", "mock", "py-geth (>=3.8.0,<4)", "py-solc (>=0.4.0)", "pytest (>=4.4.0,<5.0.0)", "sphinx (>=3.0,<4)", "sphinx-better-theme (>=0.1.4)", "sphinx-rtd-theme (>=0.1.9)", "toposort (>=1.4)", "towncrier (==18.5.0)", "urllib3", "wheel"] -linter = ["flake8 (==3.8.3)", "isort (>=4.2.15,<4.3.5)", "mypy (==0.910)", "types-protobuf (==3.19.13)", "types-requests (>=2.26.1,<3)", "types-setuptools (>=57.4.4,<58)"] -tester = ["eth-tester[py-evm] (==v0.6.0-beta.6)", "py-geth (>=3.8.0,<4)"] - -[[package]] -name = "websockets" -version = "9.1" -description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" -category = "main" -optional = false -python-versions = ">=3.6.1" - -[[package]] -name = "wheel" -version = "0.37.1" -description = "A built-package format for Python" -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[package.extras] -test = ["pytest (>=3.0.0)", "pytest-cov"] - -[[package]] -name = "wrapt" -version = "1.14.1" -description = "Module for decorators, wrappers and monkey patching." -category = "main" -optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" - -[[package]] -name = "yarl" -version = "1.8.1" -description = "Yet another URL library" -category = "main" -optional = false -python-versions = ">=3.7" - -[package.dependencies] -idna = ">=2.0" -multidict = ">=4.0" - -[metadata] -lock-version = "1.1" -python-versions = ">=3.9,<3.11" -content-hash = "a23ce1c127d4f7a6ba4d84a9a676d52c494fcc9184a1d899f9ebb8b79fd29266" - -[metadata.files] -aiohttp = [ - {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1ed0b6477896559f17b9eaeb6d38e07f7f9ffe40b9f0f9627ae8b9926ae260a8"}, - {file = "aiohttp-3.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7dadf3c307b31e0e61689cbf9e06be7a867c563d5a63ce9dca578f956609abf8"}, - {file = "aiohttp-3.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a79004bb58748f31ae1cbe9fa891054baaa46fb106c2dc7af9f8e3304dc30316"}, - {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12de6add4038df8f72fac606dff775791a60f113a725c960f2bab01d8b8e6b15"}, - {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f0d5f33feb5f69ddd57a4a4bd3d56c719a141080b445cbf18f238973c5c9923"}, - {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eaba923151d9deea315be1f3e2b31cc39a6d1d2f682f942905951f4e40200922"}, - {file = "aiohttp-3.8.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:099ebd2c37ac74cce10a3527d2b49af80243e2a4fa39e7bce41617fbc35fa3c1"}, - {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"}, - {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:fa0ffcace9b3aa34d205d8130f7873fcfefcb6a4dd3dd705b0dab69af6712642"}, - {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:61bfc23df345d8c9716d03717c2ed5e27374e0fe6f659ea64edcd27b4b044cf7"}, - {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:31560d268ff62143e92423ef183680b9829b1b482c011713ae941997921eebc8"}, - {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:01d7bdb774a9acc838e6b8f1d114f45303841b89b95984cbb7d80ea41172a9e3"}, - {file = "aiohttp-3.8.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:97ef77eb6b044134c0b3a96e16abcb05ecce892965a2124c566af0fd60f717e2"}, - {file = "aiohttp-3.8.1-cp310-cp310-win32.whl", hash = "sha256:c2aef4703f1f2ddc6df17519885dbfa3514929149d3ff900b73f45998f2532fa"}, - {file = "aiohttp-3.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:713ac174a629d39b7c6a3aa757b337599798da4c1157114a314e4e391cd28e32"}, - {file = "aiohttp-3.8.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:473d93d4450880fe278696549f2e7aed8cd23708c3c1997981464475f32137db"}, - {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99b5eeae8e019e7aad8af8bb314fb908dd2e028b3cdaad87ec05095394cce632"}, - {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3af642b43ce56c24d063325dd2cf20ee012d2b9ba4c3c008755a301aaea720ad"}, - {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c3630c3ef435c0a7c549ba170a0633a56e92629aeed0e707fec832dee313fb7a"}, - {file = "aiohttp-3.8.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:4a4a4e30bf1edcad13fb0804300557aedd07a92cabc74382fdd0ba6ca2661091"}, - {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"}, - {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:a25fa703a527158aaf10dafd956f7d42ac6d30ec80e9a70846253dd13e2f067b"}, - {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5bfde62d1d2641a1f5173b8c8c2d96ceb4854f54a44c23102e2ccc7e02f003ec"}, - {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:51467000f3647d519272392f484126aa716f747859794ac9924a7aafa86cd411"}, - {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:03a6d5349c9ee8f79ab3ff3694d6ce1cfc3ced1c9d36200cb8f08ba06bd3b782"}, - {file = "aiohttp-3.8.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:102e487eeb82afac440581e5d7f8f44560b36cf0bdd11abc51a46c1cd88914d4"}, - {file = "aiohttp-3.8.1-cp36-cp36m-win32.whl", hash = "sha256:4aed991a28ea3ce320dc8ce655875e1e00a11bdd29fe9444dd4f88c30d558602"}, - {file = "aiohttp-3.8.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b0e20cddbd676ab8a64c774fefa0ad787cc506afd844de95da56060348021e96"}, - {file = "aiohttp-3.8.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:37951ad2f4a6df6506750a23f7cbabad24c73c65f23f72e95897bb2cecbae676"}, - {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5c23b1ad869653bc818e972b7a3a79852d0e494e9ab7e1a701a3decc49c20d51"}, - {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:15b09b06dae900777833fe7fc4b4aa426556ce95847a3e8d7548e2d19e34edb8"}, - {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:477c3ea0ba410b2b56b7efb072c36fa91b1e6fc331761798fa3f28bb224830dd"}, - {file = "aiohttp-3.8.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:2f2f69dca064926e79997f45b2f34e202b320fd3782f17a91941f7eb85502ee2"}, - {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"}, - {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6d69f36d445c45cda7b3b26afef2fc34ef5ac0cdc75584a87ef307ee3c8c6d00"}, - {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:55c3d1072704d27401c92339144d199d9de7b52627f724a949fc7d5fc56d8b93"}, - {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b9d00268fcb9f66fbcc7cd9fe423741d90c75ee029a1d15c09b22d23253c0a44"}, - {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:07b05cd3305e8a73112103c834e91cd27ce5b4bd07850c4b4dbd1877d3f45be7"}, - {file = "aiohttp-3.8.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:c34dc4958b232ef6188c4318cb7b2c2d80521c9a56c52449f8f93ab7bc2a8a1c"}, - {file = "aiohttp-3.8.1-cp37-cp37m-win32.whl", hash = "sha256:d2f9b69293c33aaa53d923032fe227feac867f81682f002ce33ffae978f0a9a9"}, - {file = "aiohttp-3.8.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6ae828d3a003f03ae31915c31fa684b9890ea44c9c989056fea96e3d12a9fa17"}, - {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0c7ebbbde809ff4e970824b2b6cb7e4222be6b95a296e46c03cf050878fc1785"}, - {file = "aiohttp-3.8.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8b7ef7cbd4fec9a1e811a5de813311ed4f7ac7d93e0fda233c9b3e1428f7dd7b"}, - {file = "aiohttp-3.8.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c3d6a4d0619e09dcd61021debf7059955c2004fa29f48788a3dfaf9c9901a7cd"}, - {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:718626a174e7e467f0558954f94af117b7d4695d48eb980146016afa4b580b2e"}, - {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:589c72667a5febd36f1315aa6e5f56dd4aa4862df295cb51c769d16142ddd7cd"}, - {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2ed076098b171573161eb146afcb9129b5ff63308960aeca4b676d9d3c35e700"}, - {file = "aiohttp-3.8.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:086f92daf51a032d062ec5f58af5ca6a44d082c35299c96376a41cbb33034675"}, - {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"}, - {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:31d1e1c0dbf19ebccbfd62eff461518dcb1e307b195e93bba60c965a4dcf1ba0"}, - {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:11a67c0d562e07067c4e86bffc1553f2cf5b664d6111c894671b2b8712f3aba5"}, - {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:bb01ba6b0d3f6c68b89fce7305080145d4877ad3acaed424bae4d4ee75faa950"}, - {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:44db35a9e15d6fe5c40d74952e803b1d96e964f683b5a78c3cc64eb177878155"}, - {file = "aiohttp-3.8.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:844a9b460871ee0a0b0b68a64890dae9c415e513db0f4a7e3cab41a0f2fedf33"}, - {file = "aiohttp-3.8.1-cp38-cp38-win32.whl", hash = "sha256:7d08744e9bae2ca9c382581f7dce1273fe3c9bae94ff572c3626e8da5b193c6a"}, - {file = "aiohttp-3.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:04d48b8ce6ab3cf2097b1855e1505181bdd05586ca275f2505514a6e274e8e75"}, - {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f5315a2eb0239185af1bddb1abf472d877fede3cc8d143c6cddad37678293237"}, - {file = "aiohttp-3.8.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a996d01ca39b8dfe77440f3cd600825d05841088fd6bc0144cc6c2ec14cc5f74"}, - {file = "aiohttp-3.8.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:13487abd2f761d4be7c8ff9080de2671e53fff69711d46de703c310c4c9317ca"}, - {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea302f34477fda3f85560a06d9ebdc7fa41e82420e892fc50b577e35fc6a50b2"}, - {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a2f635ce61a89c5732537a7896b6319a8fcfa23ba09bec36e1b1ac0ab31270d2"}, - {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e999f2d0e12eea01caeecb17b653f3713d758f6dcc770417cf29ef08d3931421"}, - {file = "aiohttp-3.8.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:0770e2806a30e744b4e21c9d73b7bee18a1cfa3c47991ee2e5a65b887c49d5cf"}, - {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"}, - {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:6c7cefb4b0640703eb1069835c02486669312bf2f12b48a748e0a7756d0de33d"}, - {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:71927042ed6365a09a98a6377501af5c9f0a4d38083652bcd2281a06a5976724"}, - {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:28d490af82bc6b7ce53ff31337a18a10498303fe66f701ab65ef27e143c3b0ef"}, - {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b6613280ccedf24354406caf785db748bebbddcf31408b20c0b48cb86af76866"}, - {file = "aiohttp-3.8.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:81e3d8c34c623ca4e36c46524a3530e99c0bc95ed068fd6e9b55cb721d408fb2"}, - {file = "aiohttp-3.8.1-cp39-cp39-win32.whl", hash = "sha256:7187a76598bdb895af0adbd2fb7474d7f6025d170bc0a1130242da817ce9e7d1"}, - {file = "aiohttp-3.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:1c182cb873bc91b411e184dab7a2b664d4fea2743df0e4d57402f7f3fa644bac"}, - {file = "aiohttp-3.8.1.tar.gz", hash = "sha256:fc5471e1a54de15ef71c1bc6ebe80d4dc681ea600e68bfd1cbce40427f0b7578"}, -] -aiosignal = [ - {file = "aiosignal-1.2.0-py3-none-any.whl", hash = "sha256:26e62109036cd181df6e6ad646f91f0dcfd05fe16d0cb924138ff2ab75d64e3a"}, - {file = "aiosignal-1.2.0.tar.gz", hash = "sha256:78ed67db6c7b7ced4f98e495e572106d5c432a93e1ddd1bf475e1dc05f5b7df2"}, -] -asttokens = [ - {file = "asttokens-2.0.5-py2.py3-none-any.whl", hash = "sha256:0844691e88552595a6f4a4281a9f7f79b8dd45ca4ccea82e5e05b4bbdb76705c"}, - {file = "asttokens-2.0.5.tar.gz", hash = "sha256:9a54c114f02c7a9480d56550932546a3f1fe71d8a02f1bc7ccd0ee3ee35cf4d5"}, -] -async-timeout = [ - {file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"}, - {file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"}, -] -atomicwrites = [ - {file = "atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11"}, -] -attrs = [ - {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, - {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, -] -base58 = [ - {file = "base58-2.1.1-py3-none-any.whl", hash = "sha256:11a36f4d3ce51dfc1043f3218591ac4eb1ceb172919cebe05b52a5bcc8d245c2"}, - {file = "base58-2.1.1.tar.gz", hash = "sha256:c5d0cb3f5b6e81e8e35da5754388ddcc6d0d14b6c6a132cb93d69ed580a7278c"}, -] -bitarray = [ - {file = "bitarray-2.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b080eb25811db46306dfce58b4760df32f40bcf5551ebba3b7c8d3ec90d9b988"}, - {file = "bitarray-2.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b0cfca1b5a57b540f4761b57de485196218733153c430d58f9e048e325c98b47"}, - {file = "bitarray-2.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6fa63a86aad0f45a27c7c5a27cd9b787fe9b1aed431f97f49ee8b834fa0780a0"}, - {file = "bitarray-2.6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:15d2a1c060a11fc5508715fef6177937614f9354dd3afe6a00e261775f8b0e8f"}, - {file = "bitarray-2.6.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4ffc076a0e22cda949ccd062f37ecc3dc53856c6e8bdfe07e1e81c411cf31621"}, - {file = "bitarray-2.6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ecce266e24b21615a3ed234869be84bef492f6a34bb650d0e25dc3662c59bce4"}, - {file = "bitarray-2.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0399886ca8ead7d0f16f94545bda800467d6d9c63fbd4866ee7ede7981166ba8"}, - {file = "bitarray-2.6.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f263b18fdb8bf42cd7cf9849d5863847d215024c68fe74cf33bcd82641d4376a"}, - {file = "bitarray-2.6.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:119d503edf09bef37f2d0dc3b4a23c36c3c1e88e17701ab71388eb4780c046c7"}, - {file = "bitarray-2.6.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:985a937218aa3d1ac7013174bfcbb1cb2f3157e17c6e349e83386f33459be1c0"}, - {file = "bitarray-2.6.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d34673ebaf562347d004a465e16e2930c6568d196bb79d67fc6358f1213a1ac7"}, - {file = "bitarray-2.6.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:7126563c86f6b60d87414124f035ff0d29de02ad9e46ea085de2c772b0be1331"}, - {file = "bitarray-2.6.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:76c4e3261d6370383b02018cb964b5d9260e3c62dea31949910e9cc3a1c802d2"}, - {file = "bitarray-2.6.0-cp310-cp310-win32.whl", hash = "sha256:346d2c5452cc024c41d267ba99e48d38783c1706c50c4632a4484cc57b152d0e"}, - {file = "bitarray-2.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:b849a6cdd46608e7cc108c75e1265304e79488480a822bae7471e628f971a6f0"}, - {file = "bitarray-2.6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d7bec01818c3a9d185f929cd36a82cc7acf13905920f7f595942105c5eef2300"}, - {file = "bitarray-2.6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5a0bb91363041b45523e5bcbc4153a5e1eb1ddb21e46fe1910340c0d095e1a8e"}, - {file = "bitarray-2.6.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e7ba4c964a36fe198a8c4b5d08924709d4ed0337b65ae222b6503ed3442a46e8"}, - {file = "bitarray-2.6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a239313e75da37d1f6548d666d4dd8554c4a92dabed15741612855d186e86e72"}, - {file = "bitarray-2.6.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9c492644f70f80f8266748c18309a0d73c22c47903f4b62f3fb772a15a8fd5f"}, - {file = "bitarray-2.6.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0b756e5c771cdceb17622b6a0678fa78364e329d875de73a4f26bbacab8915a8"}, - {file = "bitarray-2.6.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:c24d4a1b5baa46920b801aa55c0e0a640c6e7683a73a941302e102e2bd11a830"}, - {file = "bitarray-2.6.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:f253b9bdf5abd039741a9594a681453c973b09dcb7edac9105961838675b7c6b"}, - {file = "bitarray-2.6.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:f4849709571b1a53669798d23cc8430e677dcf0eea88610a0412e1911233899a"}, - {file = "bitarray-2.6.0-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:67c5822f4bb6a419bc2f2dba9fa07b5646f0cda930bafa9e1130af6822e4bdf3"}, - {file = "bitarray-2.6.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:6071d12043300e50a4b7ba9caeeca92aac567bb4ac4a227709e3c77a3d788587"}, - {file = "bitarray-2.6.0-cp36-cp36m-win32.whl", hash = "sha256:12c96dedd6e4584fecc2bf5fbffe1c635bd516eee7ade7b839c35aeba84336b4"}, - {file = "bitarray-2.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:d53520b54206d8569b81eee56ccd9477af2f1b3ca355df9c48ee615a11e1a637"}, - {file = "bitarray-2.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:7ae3b8b48167579066a17c5ba1631d089f931f4eae8b4359ad123807d5e75c51"}, - {file = "bitarray-2.6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24331bd2f52cd5410e48c132f486ed02a4ca3b96133fb26e3a8f50a57c354be6"}, - {file = "bitarray-2.6.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:742d43cbbc7267caae6379e2156a1fd8532332920a3d919b68c2982d439a98ba"}, - {file = "bitarray-2.6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1479f533eaff4080078b6e5d06b467868bd6edd73bb6651a295bf662d40afa62"}, - {file = "bitarray-2.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec18a0b97ea6b912ea57dc00a3f8f3ce515d774d00951d30e2ae243589d3d021"}, - {file = "bitarray-2.6.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6bd32e492cdc740ec36b6725457685c9f2aa012dd8cbdae1643fed2b6821895"}, - {file = "bitarray-2.6.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:bfda0af4072df6e932ec510b72c461e1ec0ad0820a76df588cdfebf5a07f5b5d"}, - {file = "bitarray-2.6.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d523ffef1927cb686ad787b25b2e98a5bd53e3c40673c394f07bf9b281e69796"}, - {file = "bitarray-2.6.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:b0e4a6f5360e5f6c3a2b250c9e9cd539a9aabf0465dbedbaf364203e74ff101b"}, - {file = "bitarray-2.6.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:5bd315ac63b62de5eefbfa07969162ffbda8e535c3b7b3d41b565d2a88817b71"}, - {file = "bitarray-2.6.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d697cc38cb6fa9bae3b994dd3ce68552ffe69c453a3b6fd6a4f94bb8a8bfd70b"}, - {file = "bitarray-2.6.0-cp37-cp37m-win32.whl", hash = "sha256:c19e900b6f9df13c7f406f827c5643f83c0839a58d007b35a4d7df827601f740"}, - {file = "bitarray-2.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:878f16daa9c2062e4d29c1928b6f3eb50911726ad6d2006918a29ca6b38b5080"}, - {file = "bitarray-2.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:565c4334cb410f5eb62280dcfb3a52629e60ce430f31dfa4bbef92ec80de4890"}, - {file = "bitarray-2.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6d8ba8065d1b60da24d94078249cbf24a02d869d7dc9eba12db1fb513a375c79"}, - {file = "bitarray-2.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fc635b27939969d53cac53e8b8f860ea69fc98cc9867cac17dd193f41dc2a57f"}, - {file = "bitarray-2.6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f853589426920d9bb3683f6b6cd11ce48d9d06a62c0b98ea4b82ebd8db3bddec"}, - {file = "bitarray-2.6.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:076a72531bcca99114036c3714bac8124f5529b60fb6a6986067c6f345238c76"}, - {file = "bitarray-2.6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:874a222ece2100b3a3a8f08c57da3267a4e2219d26474a46937552992fcec771"}, - {file = "bitarray-2.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e6a4a4bf6fbc42b2674023ca58a47c86ee55c023a8af85420f266e86b10e7065"}, - {file = "bitarray-2.6.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5f5df0377f3e7f1366e506c5295f08d3f8761e4a6381918931fc1d9594aa435e"}, - {file = "bitarray-2.6.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:42a071c9db755f267e5d3b9909ea8c22fb071d27860dd940facfacffbde79de8"}, - {file = "bitarray-2.6.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:36802129a3115023700c07725d981c74e23b0914551898f788e5a41aed2d63bf"}, - {file = "bitarray-2.6.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:c774328057a4b1fc48bee2dd5a60ee1e8e0ec112d29c4e6b9c550e1686b6db5c"}, - {file = "bitarray-2.6.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:763cac57692d07aa950b92c20f55ef66801955b71b4a1f4f48d5422d748c6dda"}, - {file = "bitarray-2.6.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:11996c4da9c1ca9f97143e939af75c5b24ad0fdc2fa13aeb0007ebfa3c602caf"}, - {file = "bitarray-2.6.0-cp38-cp38-win32.whl", hash = "sha256:3f238127789c993de937178c3ff836d0fad4f2da08af9f579668873ac1332a42"}, - {file = "bitarray-2.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:7f369872d551708d608e50a9ab8748d3d4f32a697dc5c2c37ff16cb8d7060210"}, - {file = "bitarray-2.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:049e8f017b5b6d1763ababa156ca5cbdea8a01e20a1e80525b0fbe9fb839d695"}, - {file = "bitarray-2.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:035d3e5ab3c1afa2cd88bbc33af595b4875a24b0d037dfef907b41bc4b0dbe2b"}, - {file = "bitarray-2.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:97609495479c5214c7b57173c17206ebb056507a8d26eebc17942d62f8f25944"}, - {file = "bitarray-2.6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:71cc3d1da4f682f27728745f21ed3447ee8f6a0019932126c422dd91278eb414"}, - {file = "bitarray-2.6.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6c3d0a4a6061adc3d3128e1e1146940d17df8cbfe3d77cb66a1df69ddcdf27d5"}, - {file = "bitarray-2.6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6c46c2ba24a517f391c3ab9e7a214185f95146d0b664b4b0463ab31e5387669f"}, - {file = "bitarray-2.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0302605b3bbc439083a400cf57d7464f1ac098c722309a03abaa7d97cd420b5"}, - {file = "bitarray-2.6.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4d42fee0add2114e572b0cd6edefc4c52207874f58b70043f82faa8bb7141620"}, - {file = "bitarray-2.6.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5276c7247d350819d1dae385d8f78ebfb44ee90ff11a775f981d45cb366573e5"}, - {file = "bitarray-2.6.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e76642232db8330589ed1ac1cec0e9c3814c708521c336a5c79d39a5d8d8c206"}, - {file = "bitarray-2.6.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:1d0a2d896bcbcb5f32f60571ebd48349ec322dee5e137b342483108c5cbd0f03"}, - {file = "bitarray-2.6.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:8c811e59c86ce0a8515daf47db9c2484fd42e51bdb44581d7bcc9caad6c9a7a1"}, - {file = "bitarray-2.6.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:febaf00e498230ce2e75dac910056f0e3a91c8631b7ceb6385bb39d448960bc5"}, - {file = "bitarray-2.6.0-cp39-cp39-win32.whl", hash = "sha256:2cfe1661b614314d67e6884e5e19e36957ff6faea5fcea7f25840dff95288248"}, - {file = "bitarray-2.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:f37b5282b029d9f51454f8c580eb6a24e5dc140ef5866290afb20e607d2dce5f"}, - {file = "bitarray-2.6.0.tar.gz", hash = "sha256:56d3f16dd807b1c56732a244ce071c135ee973d3edc9929418c1b24c5439a0fd"}, -] -black = [ - {file = "black-22.6.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f586c26118bc6e714ec58c09df0157fe2d9ee195c764f630eb0d8e7ccce72e69"}, - {file = "black-22.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b270a168d69edb8b7ed32c193ef10fd27844e5c60852039599f9184460ce0807"}, - {file = "black-22.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6797f58943fceb1c461fb572edbe828d811e719c24e03375fd25170ada53825e"}, - {file = "black-22.6.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c85928b9d5f83b23cee7d0efcb310172412fbf7cb9d9ce963bd67fd141781def"}, - {file = "black-22.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:f6fe02afde060bbeef044af7996f335fbe90b039ccf3f5eb8f16df8b20f77666"}, - {file = "black-22.6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:cfaf3895a9634e882bf9d2363fed5af8888802d670f58b279b0bece00e9a872d"}, - {file = "black-22.6.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94783f636bca89f11eb5d50437e8e17fbc6a929a628d82304c80fa9cd945f256"}, - {file = "black-22.6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:2ea29072e954a4d55a2ff58971b83365eba5d3d357352a07a7a4df0d95f51c78"}, - {file = "black-22.6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e439798f819d49ba1c0bd9664427a05aab79bfba777a6db94fd4e56fae0cb849"}, - {file = "black-22.6.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:187d96c5e713f441a5829e77120c269b6514418f4513a390b0499b0987f2ff1c"}, - {file = "black-22.6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:074458dc2f6e0d3dab7928d4417bb6957bb834434516f21514138437accdbe90"}, - {file = "black-22.6.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:a218d7e5856f91d20f04e931b6f16d15356db1c846ee55f01bac297a705ca24f"}, - {file = "black-22.6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:568ac3c465b1c8b34b61cd7a4e349e93f91abf0f9371eda1cf87194663ab684e"}, - {file = "black-22.6.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:6c1734ab264b8f7929cef8ae5f900b85d579e6cbfde09d7387da8f04771b51c6"}, - {file = "black-22.6.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c9a3ac16efe9ec7d7381ddebcc022119794872abce99475345c5a61aa18c45ad"}, - {file = "black-22.6.0-cp38-cp38-win_amd64.whl", hash = "sha256:b9fd45787ba8aa3f5e0a0a98920c1012c884622c6c920dbe98dbd05bc7c70fbf"}, - {file = "black-22.6.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7ba9be198ecca5031cd78745780d65a3f75a34b2ff9be5837045dce55db83d1c"}, - {file = "black-22.6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a3db5b6409b96d9bd543323b23ef32a1a2b06416d525d27e0f67e74f1446c8f2"}, - {file = "black-22.6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:560558527e52ce8afba936fcce93a7411ab40c7d5fe8c2463e279e843c0328ee"}, - {file = "black-22.6.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b154e6bbde1e79ea3260c4b40c0b7b3109ffcdf7bc4ebf8859169a6af72cd70b"}, - {file = "black-22.6.0-cp39-cp39-win_amd64.whl", hash = "sha256:4af5bc0e1f96be5ae9bd7aaec219c901a94d6caa2484c21983d043371c733fc4"}, - {file = "black-22.6.0-py3-none-any.whl", hash = "sha256:ac609cf8ef5e7115ddd07d85d988d074ed00e10fbc3445aee393e70164a2219c"}, - {file = "black-22.6.0.tar.gz", hash = "sha256:6c6d39e28aed379aec40da1c65434c77d75e65bb59a1e1c283de545fb4e7c6c9"}, -] -certifi = [ - {file = "certifi-2022.6.15-py3-none-any.whl", hash = "sha256:fe86415d55e84719d75f8b69414f6438ac3547d2078ab91b67e779ef69378412"}, - {file = "certifi-2022.6.15.tar.gz", hash = "sha256:84c85a9078b11105f04f3036a9482ae10e4621616db313fe045dd24743a0820d"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.1.0.tar.gz", hash = "sha256:575e708016ff3a5e3681541cb9d79312c416835686d054a23accb873b254f413"}, - {file = "charset_normalizer-2.1.0-py3-none-any.whl", hash = "sha256:5189b6f22b01957427f35b6a08d9a0bc45b46d3788ef5a92e978433c7a35f8a5"}, -] -click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] -colorama = [ - {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, - {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, -] -crytic-compile = [ - {file = "crytic_compile-0.2.3-py3-none-any.whl", hash = "sha256:9e22b1d6398d20fefbe64209744bd9b2877ae82c0204f682f499df4f78e6842d"}, -] -cytoolz = [ - {file = "cytoolz-0.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8237612fed78d4580e94141a74ac0977f5a9614dd7fa8f3d2fcb30e6d04e73aa"}, - {file = "cytoolz-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:798dff7a40adbb3dfa2d50499c2038779061ebc37eccedaf28fa296cb517b84e"}, - {file = "cytoolz-0.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:336551092eb1cfc2ad5878cc08ef290f744843f84c1dda06f9e4a84d2c440b73"}, - {file = "cytoolz-0.12.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:79b46cda959f026bd9fc33b4046294b32bd5e7664a4cf607179f80ac93844e7f"}, - {file = "cytoolz-0.12.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b716f66b5ee72dbf9a001316ffe72afe0bb8f6ce84e341aec64291c0ff16b9f4"}, - {file = "cytoolz-0.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ac7758c5c5a66664285831261a9af8e0af504026e0987cd01535045945df6e1"}, - {file = "cytoolz-0.12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:337c9a3ce2929c6361bcc1b304ce81ed675078a34c203dbb7c3e154f7ed1cca8"}, - {file = "cytoolz-0.12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ee1fe1a3d0c8c456c3fbf62f28d178f870d14302fcd1edbc240b717ae3ab08de"}, - {file = "cytoolz-0.12.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:f1f5c1ef04240b323b9e6b87d4b1d7f14b735e284a33b18a509537a10f62715c"}, - {file = "cytoolz-0.12.0-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:25c037a7b4f49730ccc295a03cd2217ba67ff43ac0918299f5f368271433ff0f"}, - {file = "cytoolz-0.12.0-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:38e3386f63ebaea46a4ee0bfefc9a38590c3b78ab86439766b5225443468a76b"}, - {file = "cytoolz-0.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cb072fa81caab93a5892c4b69dfe0d48f52026a7fe83ba2567020a7995a456e7"}, - {file = "cytoolz-0.12.0-cp310-cp310-win32.whl", hash = "sha256:a4acf6cb20f01a5eb5b6d459e08fb92aacfb4de8bc97e25437c1a3e71860b452"}, - {file = "cytoolz-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:7fe93ffde090e2867f8ce4369d0c1abf5651817a74a3d0a4da2b1ffd412603ff"}, - {file = "cytoolz-0.12.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d212296e996a70db8d9e1c0622bc8aefa732eb0416b5441624d0fd5b853ea391"}, - {file = "cytoolz-0.12.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:231d87ffb5fc468989e35336a2f8da1c9b8d97cfd9300cf2df32e953e4d20cae"}, - {file = "cytoolz-0.12.0-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f26079bc2d0b7aa1a185516ac9f7cda0d7932da6c60589bfed4079e3a5369e83"}, - {file = "cytoolz-0.12.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d511dd49eb1263ccb4e5f84ae1478dc2824d66b813cdf700e1ba593faa256ade"}, - {file = "cytoolz-0.12.0-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa5ded9f811c36668239adb4806fca1244b06add4d64af31119c279aab1ef8a6"}, - {file = "cytoolz-0.12.0-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c818a382b828e960fbbedbc85663414edbbba816c2bf8c1bb5651305d79bdb97"}, - {file = "cytoolz-0.12.0-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:1c22255e7458feb6f43d99c9578396e91d5934757c552128f6afd3b093b41c00"}, - {file = "cytoolz-0.12.0-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5b7079b3197256ac6bf73f8b9484d514fac68a36d05513b9e5247354d6fc2885"}, - {file = "cytoolz-0.12.0-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:2ee9ca2cfc939607926096c7cc6f298cee125f8ca53a4f46745f8dfbb7fb7ab1"}, - {file = "cytoolz-0.12.0-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:8c0101bb2b2bcc0de2e2eb288a132c261e5fa883b1423799b47d4f0cfd879cd6"}, - {file = "cytoolz-0.12.0-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:4b8b1d9764d08782caa8ba0e91d76b95b973a82f4ce2a3f9c7e726bfeaddbdfa"}, - {file = "cytoolz-0.12.0-cp36-cp36m-win32.whl", hash = "sha256:f71b49a41826a8e7fd464d6991134a6d022a666be4e76d517850abbea561c909"}, - {file = "cytoolz-0.12.0-cp36-cp36m-win_amd64.whl", hash = "sha256:ae7f417bb2b4e3906e525b3dbe944791dfa9248faea719c7a9c200aa1a019a4e"}, - {file = "cytoolz-0.12.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b05dc257996c0accf6f877b1f212f74dc134b39c46baac09e1894d9d9c970b6a"}, - {file = "cytoolz-0.12.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a2cca43caea857e761cc458ffb4f7af397a13824c5e71341ca08035ff5ff0b27"}, - {file = "cytoolz-0.12.0-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dd840adfe027d379e7aede973bc0e193e6eef9b33d46d1d42826e26db9b37d7e"}, - {file = "cytoolz-0.12.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:94b067c88de0eaca174211c8422b3f72cbfb63b101a0eeb528c4f21282ca0afe"}, - {file = "cytoolz-0.12.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db619f17705067f1f112d3e84a0904b2f04117e50cefc4016f435ff0dc59bc4e"}, - {file = "cytoolz-0.12.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e8335998e21205574fc7d8d17844a9cc0dd4cbb25bb7716d90683a935d2c879"}, - {file = "cytoolz-0.12.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:46b9f4af719b113c01a4144c52fc4b929f98a47017a5408e3910050f4641126b"}, - {file = "cytoolz-0.12.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d29cf7a44a8abaeb00537e3bad7abf823fce194fe707c366f81020d384e22f7"}, - {file = "cytoolz-0.12.0-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:02dc4565a8d27c9f3e87b715c0a300890e17c94ba1294af61c4ba97aa8482b22"}, - {file = "cytoolz-0.12.0-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:2bd1c692ab706acb46cfebe7105945b07f7274598097e32c8979d3b22ae62cc6"}, - {file = "cytoolz-0.12.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d035805dcdefcdfe64d97d6e1e7603798588d5e1ae08e61a5dae3258c3cb407a"}, - {file = "cytoolz-0.12.0-cp37-cp37m-win32.whl", hash = "sha256:9ecdd6e2be8d59b76c2bd3e2d832e7b3d5b2535c418b13cfa85e3b17de985199"}, - {file = "cytoolz-0.12.0-cp37-cp37m-win_amd64.whl", hash = "sha256:3a5408a74df84e84aa1c86a2f9f2ffaed51a55f34bbad5b8fae547cb9167e977"}, - {file = "cytoolz-0.12.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1cf9ae77eed57924becd3ab65ae24487d7b1f9823d3e685d796e58f57424f82a"}, - {file = "cytoolz-0.12.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:dc8df9adfca0da9956589f53764d459389ce86d824663c7217422232f1dfbc9d"}, - {file = "cytoolz-0.12.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:edf460dc6bed081f274cd3d8ae162dd7e382014161d65edcdec832035d93901b"}, - {file = "cytoolz-0.12.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f5784adcdb285e70b61efc1a369cd61c6b7f1e0b5d521651f93cde09549681f5"}, - {file = "cytoolz-0.12.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:09fac69cebcb79a6ed75565fe2de9511be6e3d93f30dad115832cc1a3933b6ce"}, - {file = "cytoolz-0.12.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1744217505b835fcf55d82d67addd0d361791c4fd6a2f485f034b343ffc7edb3"}, - {file = "cytoolz-0.12.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fa49cfaa0eedad59d8357a482bd10e2cc2a12ad9f41aae53427e82d3eba068a"}, - {file = "cytoolz-0.12.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:c9f8c9b3cfa20b4ce6a89b7e2e7ffda76bdd81e95b7d20bbb2c47c2b31e72622"}, - {file = "cytoolz-0.12.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0c9fe89548b1dc7c8b3160758d192791b32bd42b1c244a20809a1053a9d74428"}, - {file = "cytoolz-0.12.0-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:d61bc1713662e7d9aa3e298dad790dfd027c5c0f1342c36be8401aebe3d3d453"}, - {file = "cytoolz-0.12.0-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:69c04ae878d5bcde5462e7290f950bfce11fd139ec4b481687983326658e6dbe"}, - {file = "cytoolz-0.12.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:21986f4a970c03ca84806b3a08e89386ac4aeb54c9b79d6a7268e83225331a87"}, - {file = "cytoolz-0.12.0-cp38-cp38-win32.whl", hash = "sha256:e17516a102731bcf86446ce148127a8cd2887cf27ac388990cd63881115b4fdc"}, - {file = "cytoolz-0.12.0-cp38-cp38-win_amd64.whl", hash = "sha256:16748ea2b40c5978190d9acf9aa8fbacbfb440964c1035dc16cb14dbd557edb5"}, - {file = "cytoolz-0.12.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:02583c9fd4668f9e343ad4fc0e0f9651b1a0c16fe92bd208d07fd07de90fdc99"}, - {file = "cytoolz-0.12.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee92dadb312e657b9b666a0385fafc6dad073d8a0fbef5cea09e21011554206a"}, - {file = "cytoolz-0.12.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12d3d11ceb0fce8be5463f1e363366888c4b71e68fb2f5d536e4790b933cfd7e"}, - {file = "cytoolz-0.12.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6f87472837c26b3bc91f9767c7adcfb935d0c097937c6744250672cd8c36019d"}, - {file = "cytoolz-0.12.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7244fb0d0b87499becc29051b82925e0daf3838e6c352e6b2d62e0f969b090af"}, - {file = "cytoolz-0.12.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:deb8550f487de756f1c24c56fa2c8451a53c0346868c13899c6b3a39b1f3d2c3"}, - {file = "cytoolz-0.12.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f959c1319b7e6ed3367b0f5a54a7b9c59063bd053c74278b27999db013e568df"}, - {file = "cytoolz-0.12.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:8f40897f6f341e03a945759fcdb2208dc7c64dc312386d3088c47b78fca2a3b2"}, - {file = "cytoolz-0.12.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:68336dfbe00efebbb1d02b8aa00b570dceec5d03fbd818c620aa246a8f5e5409"}, - {file = "cytoolz-0.12.0-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:886b3bf8fa99510836107097a5e5a2bd81631d3795dedc5684e25bef6538ac39"}, - {file = "cytoolz-0.12.0-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0f94b4a3500345de5853d1896b7e770ce4a6577a431f43ff7d8f05f9051aeb7d"}, - {file = "cytoolz-0.12.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:9dd7dbdfc24ed309af96be170c9030f43713950afab2b4bed1d372a91b37cbb0"}, - {file = "cytoolz-0.12.0-cp39-cp39-win32.whl", hash = "sha256:ed8771e36430fb0e4398030569bdab1419e4e74f7bcd51ea57239aa95441983a"}, - {file = "cytoolz-0.12.0-cp39-cp39-win_amd64.whl", hash = "sha256:a15157f4280f6e5d7c2d0892847a6c4dffbd2c5cefccaf1ac1f1c6c3d2cf9936"}, - {file = "cytoolz-0.12.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:ae403cac13c2b9a2a92e56468ca1f822899b64d75d5be8ca802f1c14870d9133"}, - {file = "cytoolz-0.12.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ff74cb0e1a50de7f59e54a156dfd734b6593008f6f804d0726a73b89d170cd"}, - {file = "cytoolz-0.12.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f24e70d29223cde8ce3f5aefa7fd06bda12ae4386dcfbc726773e95b099cde0d"}, - {file = "cytoolz-0.12.0-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a79658fd264c5f82ea1b5cb45cf3899afabd9ec3e58c333bea042a2b4a94134"}, - {file = "cytoolz-0.12.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:ef4a496a3175aec595ae24ad03e0bb2fe76401f8f79e7ef3d344533ba990ec0e"}, - {file = "cytoolz-0.12.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:bb0fc2ed8efa89f31ffa99246b1d434ff3db2b7b7e35147486172da849c8024a"}, - {file = "cytoolz-0.12.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59263f296e043d4210dd34f91e6f11c4b20e6195976da23170d5ad056030258a"}, - {file = "cytoolz-0.12.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:274bc965cd93d6fa0bfe6f770cf6549bbe58d7b0a48dd6893d3f2c4b495d7f95"}, - {file = "cytoolz-0.12.0-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8feb4d056c22983723278160aff8a28c507b0e942768f4e856539a60e7bb874"}, - {file = "cytoolz-0.12.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:09f5652caeac85e3735bd5aaed49ebf4eeb7c0f15cb9b7c4a5fb6f45308dc2fd"}, - {file = "cytoolz-0.12.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8060be3b1fa24a4e3b165ce3c0ee6048f5e181289af57dbd9e3c4d4b8545dd78"}, - {file = "cytoolz-0.12.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9e32292721f16516a574891a1af6760cba37a0f426a2b2cea6f9d560131a76ea"}, - {file = "cytoolz-0.12.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6aade6ebb4507330b0540af58dc2804415945611e90c70bb97360973e487c48a"}, - {file = "cytoolz-0.12.0-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f909760f89a54d860cf960b4cd828f9f6301fb104cd0de5b15b16822c9c4828b"}, - {file = "cytoolz-0.12.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a8e69c9f3a32e0f9331cf6707a0f159c6dec0ff2a9f41507f6b2d06cd423f0d0"}, - {file = "cytoolz-0.12.0.tar.gz", hash = "sha256:c105b05f85e03fbcd60244375968e62e44fe798c15a3531c922d531018d22412"}, -] -dataclassy = [ - {file = "dataclassy-0.11.1-py3-none-any.whl", hash = "sha256:bcb030d3d700cf9b1597042bbc8375b92773e6f68f65675a7071862c0ddb87f5"}, - {file = "dataclassy-0.11.1.tar.gz", hash = "sha256:ad6622cb91e644d13f68768558983fbc22c90a8ff7e355638485d18b9baf1198"}, -] -eip712 = [ - {file = "eip712-0.1.0-py3-none-any.whl", hash = "sha256:8d91257bb94cc33b0115b2f65c71297b6e8b8f16ed49173313e13ac8931df4b1"}, - {file = "eip712-0.1.0.tar.gz", hash = "sha256:2655c8ab58a552bc2adf0b5a07465483fe24a27237e07c4384f36f16efafa418"}, -] -eth-abi = [ - {file = "eth_abi-2.2.0-py3-none-any.whl", hash = "sha256:8d018351b00e304113f50ffded9baf4b9c6ef1c7e4ddec71bd64048c1c5c438c"}, - {file = "eth_abi-2.2.0.tar.gz", hash = "sha256:d1bd16a911dd8fe45f1e6ed02099b4fceb8ae9ea741ab11b135cf288ada74a99"}, -] -eth-account = [ - {file = "eth-account-0.5.9.tar.gz", hash = "sha256:ee62e121d977ca452f600043338af36f9349aa1f8409c5096d75df6576c79f1b"}, - {file = "eth_account-0.5.9-py3-none-any.whl", hash = "sha256:42f9eefbf0e1c84a278bf27a25eccc2e0c20b18c17e2ab6f46044a534479e95a"}, -] -eth-brownie = [ - {file = "eth-brownie-1.19.1.tar.gz", hash = "sha256:3ca815de9356d1dd6525584f7e9a5d5a85bcb3f149304037114f91b15247b8be"}, - {file = "eth_brownie-1.19.1-py3-none-any.whl", hash = "sha256:8539d353f2de8391949651668de7b98b8ad069974457e6add33ecebec97dc5d4"}, -] -eth-event = [ - {file = "eth-event-1.2.3.tar.gz", hash = "sha256:1589b583a9b0294f9aba4dedce8077685ced298393872f7f19bbf7d67ed9e49a"}, - {file = "eth_event-1.2.3-py3-none-any.whl", hash = "sha256:5d86d049eded86d0fb41538590487e1ccea2e1fa3e6d16ee2fc0952be7e5c59a"}, -] -eth-hash = [ - {file = "eth-hash-0.3.3.tar.gz", hash = "sha256:8cde211519ff1a98b46e9057cb909f12ab62e263eb30a0a94e2f7e1f46ac67a0"}, - {file = "eth_hash-0.3.3-py3-none-any.whl", hash = "sha256:3c884e4f788b38cc92cff05c4e43bc6b82686066f04ecfae0e11cdcbe5a283bd"}, -] -eth-keyfile = [ - {file = "eth-keyfile-0.5.1.tar.gz", hash = "sha256:939540efb503380bc30d926833e6a12b22c6750de80feef3720d79e5a79de47d"}, - {file = "eth_keyfile-0.5.1-py3-none-any.whl", hash = "sha256:70d734af17efdf929a90bb95375f43522be4ed80c3b9e0a8bca575fb11cd1159"}, -] -eth-keys = [ - {file = "eth-keys-0.3.4.tar.gz", hash = "sha256:e5590797f5e2930086c705a6dd1ac14397f74f19bdcd1b5f837475554f354ad8"}, - {file = "eth_keys-0.3.4-py3-none-any.whl", hash = "sha256:565bf62179b8143bcbd302a0ec6c49882d9c7678f9e6ab0484a8a5725f5ef10e"}, -] -eth-rlp = [ - {file = "eth-rlp-0.2.1.tar.gz", hash = "sha256:f016f980b0ed42ee7650ba6e4e4d3c4e9aa06d8b9c6825a36d3afe5aa0187a8b"}, - {file = "eth_rlp-0.2.1-py3-none-any.whl", hash = "sha256:cc389ef8d7b6f76a98f90bcdbff1b8684b3a78f53d47e871191b50d4d6aee5a1"}, -] -eth-typing = [ - {file = "eth-typing-2.3.0.tar.gz", hash = "sha256:39cce97f401f082739b19258dfa3355101c64390914c73fe2b90012f443e0dc7"}, - {file = "eth_typing-2.3.0-py3-none-any.whl", hash = "sha256:b7fa58635c1cb0cbf538b2f5f1e66139575ea4853eac1d6000f0961a4b277422"}, -] -eth-utils = [ - {file = "eth-utils-1.10.0.tar.gz", hash = "sha256:bf82762a46978714190b0370265a7148c954d3f0adaa31c6f085ea375e4c61af"}, - {file = "eth_utils-1.10.0-py3-none-any.whl", hash = "sha256:74240a8c6f652d085ed3c85f5f1654203d2f10ff9062f83b3bad0a12ff321c7a"}, -] -execnet = [ - {file = "execnet-1.9.0-py2.py3-none-any.whl", hash = "sha256:a295f7cc774947aac58dde7fdc85f4aa00c42adf5d8f5468fc630c1acf30a142"}, - {file = "execnet-1.9.0.tar.gz", hash = "sha256:8f694f3ba9cc92cab508b152dcfe322153975c29bda272e2fd7f3f00f36e47c5"}, -] -frozenlist = [ - {file = "frozenlist-1.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5f271c93f001748fc26ddea409241312a75e13466b06c94798d1a341cf0e6989"}, - {file = "frozenlist-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c6ef8014b842f01f5d2b55315f1af5cbfde284eb184075c189fd657c2fd8204"}, - {file = "frozenlist-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:219a9676e2eae91cb5cc695a78b4cb43d8123e4160441d2b6ce8d2c70c60e2f3"}, - {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b47d64cdd973aede3dd71a9364742c542587db214e63b7529fbb487ed67cddd9"}, - {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2af6f7a4e93f5d08ee3f9152bce41a6015b5cf87546cb63872cc19b45476e98a"}, - {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a718b427ff781c4f4e975525edb092ee2cdef6a9e7bc49e15063b088961806f8"}, - {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c56c299602c70bc1bb5d1e75f7d8c007ca40c9d7aebaf6e4ba52925d88ef826d"}, - {file = "frozenlist-1.3.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:717470bfafbb9d9be624da7780c4296aa7935294bd43a075139c3d55659038ca"}, - {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:31b44f1feb3630146cffe56344704b730c33e042ffc78d21f2125a6a91168131"}, - {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:c3b31180b82c519b8926e629bf9f19952c743e089c41380ddca5db556817b221"}, - {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:d82bed73544e91fb081ab93e3725e45dd8515c675c0e9926b4e1f420a93a6ab9"}, - {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:49459f193324fbd6413e8e03bd65789e5198a9fa3095e03f3620dee2f2dabff2"}, - {file = "frozenlist-1.3.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:94e680aeedc7fd3b892b6fa8395b7b7cc4b344046c065ed4e7a1e390084e8cb5"}, - {file = "frozenlist-1.3.1-cp310-cp310-win32.whl", hash = "sha256:fabb953ab913dadc1ff9dcc3a7a7d3dc6a92efab3a0373989b8063347f8705be"}, - {file = "frozenlist-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:eee0c5ecb58296580fc495ac99b003f64f82a74f9576a244d04978a7e97166db"}, - {file = "frozenlist-1.3.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0bc75692fb3770cf2b5856a6c2c9de967ca744863c5e89595df64e252e4b3944"}, - {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086ca1ac0a40e722d6833d4ce74f5bf1aba2c77cbfdc0cd83722ffea6da52a04"}, - {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1b51eb355e7f813bcda00276b0114c4172872dc5fb30e3fea059b9367c18fbcb"}, - {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:74140933d45271c1a1283f708c35187f94e1256079b3c43f0c2267f9db5845ff"}, - {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee4c5120ddf7d4dd1eaf079af3af7102b56d919fa13ad55600a4e0ebe532779b"}, - {file = "frozenlist-1.3.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:97d9e00f3ac7c18e685320601f91468ec06c58acc185d18bb8e511f196c8d4b2"}, - {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6e19add867cebfb249b4e7beac382d33215d6d54476bb6be46b01f8cafb4878b"}, - {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:a027f8f723d07c3f21963caa7d585dcc9b089335565dabe9c814b5f70c52705a"}, - {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:61d7857950a3139bce035ad0b0945f839532987dfb4c06cfe160254f4d19df03"}, - {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:53b2b45052e7149ee8b96067793db8ecc1ae1111f2f96fe1f88ea5ad5fd92d10"}, - {file = "frozenlist-1.3.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:bbb1a71b1784e68870800b1bc9f3313918edc63dbb8f29fbd2e767ce5821696c"}, - {file = "frozenlist-1.3.1-cp37-cp37m-win32.whl", hash = "sha256:ab6fa8c7871877810e1b4e9392c187a60611fbf0226a9e0b11b7b92f5ac72792"}, - {file = "frozenlist-1.3.1-cp37-cp37m-win_amd64.whl", hash = "sha256:f89139662cc4e65a4813f4babb9ca9544e42bddb823d2ec434e18dad582543bc"}, - {file = "frozenlist-1.3.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:4c0c99e31491a1d92cde8648f2e7ccad0e9abb181f6ac3ddb9fc48b63301808e"}, - {file = "frozenlist-1.3.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:61e8cb51fba9f1f33887e22488bad1e28dd8325b72425f04517a4d285a04c519"}, - {file = "frozenlist-1.3.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:cc2f3e368ee5242a2cbe28323a866656006382872c40869b49b265add546703f"}, - {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58fb94a01414cddcdc6839807db77ae8057d02ddafc94a42faee6004e46c9ba8"}, - {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:022178b277cb9277d7d3b3f2762d294f15e85cd2534047e68a118c2bb0058f3e"}, - {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:572ce381e9fe027ad5e055f143763637dcbac2542cfe27f1d688846baeef5170"}, - {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19127f8dcbc157ccb14c30e6f00392f372ddb64a6ffa7106b26ff2196477ee9f"}, - {file = "frozenlist-1.3.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42719a8bd3792744c9b523674b752091a7962d0d2d117f0b417a3eba97d1164b"}, - {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2743bb63095ef306041c8f8ea22bd6e4d91adabf41887b1ad7886c4c1eb43d5f"}, - {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:fa47319a10e0a076709644a0efbcaab9e91902c8bd8ef74c6adb19d320f69b83"}, - {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:52137f0aea43e1993264a5180c467a08a3e372ca9d378244c2d86133f948b26b"}, - {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:f5abc8b4d0c5b556ed8cd41490b606fe99293175a82b98e652c3f2711b452988"}, - {file = "frozenlist-1.3.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:1e1cf7bc8cbbe6ce3881863671bac258b7d6bfc3706c600008925fb799a256e2"}, - {file = "frozenlist-1.3.1-cp38-cp38-win32.whl", hash = "sha256:0dde791b9b97f189874d654c55c24bf7b6782343e14909c84beebd28b7217845"}, - {file = "frozenlist-1.3.1-cp38-cp38-win_amd64.whl", hash = "sha256:9494122bf39da6422b0972c4579e248867b6b1b50c9b05df7e04a3f30b9a413d"}, - {file = "frozenlist-1.3.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:31bf9539284f39ff9398deabf5561c2b0da5bb475590b4e13dd8b268d7a3c5c1"}, - {file = "frozenlist-1.3.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e0c8c803f2f8db7217898d11657cb6042b9b0553a997c4a0601f48a691480fab"}, - {file = "frozenlist-1.3.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:da5ba7b59d954f1f214d352308d1d86994d713b13edd4b24a556bcc43d2ddbc3"}, - {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74e6b2b456f21fc93ce1aff2b9728049f1464428ee2c9752a4b4f61e98c4db96"}, - {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:526d5f20e954d103b1d47232e3839f3453c02077b74203e43407b962ab131e7b"}, - {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b499c6abe62a7a8d023e2c4b2834fce78a6115856ae95522f2f974139814538c"}, - {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ab386503f53bbbc64d1ad4b6865bf001414930841a870fc97f1546d4d133f141"}, - {file = "frozenlist-1.3.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f63c308f82a7954bf8263a6e6de0adc67c48a8b484fab18ff87f349af356efd"}, - {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:12607804084d2244a7bd4685c9d0dca5df17a6a926d4f1967aa7978b1028f89f"}, - {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:da1cdfa96425cbe51f8afa43e392366ed0b36ce398f08b60de6b97e3ed4affef"}, - {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:f810e764617b0748b49a731ffaa525d9bb36ff38332411704c2400125af859a6"}, - {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:35c3d79b81908579beb1fb4e7fcd802b7b4921f1b66055af2578ff7734711cfa"}, - {file = "frozenlist-1.3.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c92deb5d9acce226a501b77307b3b60b264ca21862bd7d3e0c1f3594022f01bc"}, - {file = "frozenlist-1.3.1-cp39-cp39-win32.whl", hash = "sha256:5e77a8bd41e54b05e4fb2708dc6ce28ee70325f8c6f50f3df86a44ecb1d7a19b"}, - {file = "frozenlist-1.3.1-cp39-cp39-win_amd64.whl", hash = "sha256:625d8472c67f2d96f9a4302a947f92a7adbc1e20bedb6aff8dbc8ff039ca6189"}, - {file = "frozenlist-1.3.1.tar.gz", hash = "sha256:3a735e4211a04ccfa3f4833547acdf5d2f863bfeb01cfd3edaffbc251f15cec8"}, -] -hexbytes = [ - {file = "hexbytes-0.2.2-py3-none-any.whl", hash = "sha256:ef53c37ea9f316fff86fcb1df057b4c6ba454da348083e972031bbf7bc9c3acc"}, - {file = "hexbytes-0.2.2.tar.gz", hash = "sha256:a5881304d186e87578fb263a85317c808cf130e1d4b3d37d30142ab0f7898d03"}, -] -hypothesis = [ - {file = "hypothesis-6.27.3-py3-none-any.whl", hash = "sha256:1c4568f40ca893c884330a1de0e0e5dcb1e867c60a56f414cb7bce97afc8dfec"}, - {file = "hypothesis-6.27.3.tar.gz", hash = "sha256:587da483bcc324494cec09cbbde3396c00da280c1732e387d7b5b89eff1aaff3"}, -] -idna = [ - {file = "idna-3.3-py3-none-any.whl", hash = "sha256:84d9dd047ffa80596e0f246e2eab0b391788b0503584e8945f2368256d2735ff"}, - {file = "idna-3.3.tar.gz", hash = "sha256:9d643ff0a55b762d5cdb124b8eaa99c66322e2157b69160bc32796e824360e6d"}, -] -inflection = [ - {file = "inflection-0.5.0-py2.py3-none-any.whl", hash = "sha256:88b101b2668a1d81d6d72d4c2018e53bc6c7fc544c987849da1c7f77545c3bc9"}, - {file = "inflection-0.5.0.tar.gz", hash = "sha256:f576e85132d34f5bf7df5183c2c6f94cfb32e528f53065345cf71329ba0b8924"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -ipfshttpclient = [ - {file = "ipfshttpclient-0.8.0a2-py3-none-any.whl", hash = "sha256:ce6bac0e3963c4ced74d7eb6978125362bb05bbe219088ca48f369ce14d3cc39"}, - {file = "ipfshttpclient-0.8.0a2.tar.gz", hash = "sha256:0d80e95ee60b02c7d414e79bf81a36fc3c8fbab74265475c52f70b2620812135"}, -] -jsonschema = [ - {file = "jsonschema-3.2.0-py2.py3-none-any.whl", hash = "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163"}, - {file = "jsonschema-3.2.0.tar.gz", hash = "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a"}, -] -lazy-object-proxy = [ - {file = "lazy-object-proxy-1.7.1.tar.gz", hash = "sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-win32.whl", hash = "sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win32.whl", hash = "sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win32.whl", hash = "sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-win32.whl", hash = "sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-win32.whl", hash = "sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61"}, - {file = "lazy_object_proxy-1.7.1-pp37.pp38-none-any.whl", hash = "sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84"}, -] -lru-dict = [ - {file = "lru-dict-1.1.8.tar.gz", hash = "sha256:878bc8ef4073e5cfb953dfc1cf4585db41e8b814c0106abde34d00ee0d0b3115"}, - {file = "lru_dict-1.1.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f9d5815c0e85922cd0fb8344ca8b1c7cf020bf9fc45e670d34d51932c91fd7ec"}, - {file = "lru_dict-1.1.8-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f877f53249c3e49bbd7612f9083127290bede6c7d6501513567ab1bf9c581381"}, - {file = "lru_dict-1.1.8-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3fef595c4f573141d54a38bda9221b9ee3cbe0acc73d67304a1a6d5972eb2a02"}, - {file = "lru_dict-1.1.8-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:db20597c4e67b4095b376ce2e83930c560f4ce481e8d05737885307ed02ba7c1"}, - {file = "lru_dict-1.1.8-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5b09dbe47bc4b4d45ffe56067aff190bc3c0049575da6e52127e114236e0a6a7"}, - {file = "lru_dict-1.1.8-cp310-cp310-win32.whl", hash = "sha256:3b1692755fef288b67af5cd8a973eb331d1f44cb02cbdc13660040809c2bfec6"}, - {file = "lru_dict-1.1.8-cp310-cp310-win_amd64.whl", hash = "sha256:8f6561f9cd5a452cb84905c6a87aa944fdfdc0f41cc057d03b71f9b29b2cc4bd"}, - {file = "lru_dict-1.1.8-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:ca8f89361e0e7aad0bf93ae03a31502e96280faeb7fb92267f4998fb230d36b2"}, - {file = "lru_dict-1.1.8-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8c50ab9edaa5da5838426816a2b7bcde9d576b4fc50e6a8c062073dbc4969d78"}, - {file = "lru_dict-1.1.8-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1fe16ade5fd0a57e9a335f69b8055aaa6fb278fbfa250458e4f6b8255115578f"}, - {file = "lru_dict-1.1.8-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:de972c7f4bc7b6002acff2a8de984c55fbd7f2289dba659cfd90f7a0f5d8f5d1"}, - {file = "lru_dict-1.1.8-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:3d003a864899c29b0379e412709a6e516cbd6a72ee10b09d0b33226343617412"}, - {file = "lru_dict-1.1.8-cp36-cp36m-win32.whl", hash = "sha256:6e2a7aa9e36626fb48fdc341c7e3685a31a7b50ea4918677ea436271ad0d904d"}, - {file = "lru_dict-1.1.8-cp36-cp36m-win_amd64.whl", hash = "sha256:d2ed4151445c3f30423c2698f72197d64b27b1cd61d8d56702ffe235584e47c2"}, - {file = "lru_dict-1.1.8-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:075b9dd46d7022b675419bc6e3631748ae184bc8af195d20365a98b4f3bb2914"}, - {file = "lru_dict-1.1.8-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:70364e3cbef536adab8762b4835e18f5ca8e3fddd8bd0ec9258c42bbebd0ee77"}, - {file = "lru_dict-1.1.8-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:720f5728e537f11a311e8b720793a224e985d20e6b7c3d34a891a391865af1a2"}, - {file = "lru_dict-1.1.8-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c2fe692332c2f1d81fd27457db4b35143801475bfc2e57173a2403588dd82a42"}, - {file = "lru_dict-1.1.8-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:86d32a4498b74a75340497890a260d37bf1560ad2683969393032977dd36b088"}, - {file = "lru_dict-1.1.8-cp37-cp37m-win32.whl", hash = "sha256:348167f110494cfafae70c066470a6f4e4d43523933edf16ccdb8947f3b5fae0"}, - {file = "lru_dict-1.1.8-cp37-cp37m-win_amd64.whl", hash = "sha256:9be6c4039ef328676b868acea619cd100e3de1a35b3be211cf0eaf9775563b65"}, - {file = "lru_dict-1.1.8-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a777d48319d293b1b6a933d606c0e4899690a139b4c81173451913bbcab6f44f"}, - {file = "lru_dict-1.1.8-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99f6cfb3e28490357a0805b409caf693e46c61f8dbb789c51355adb693c568d3"}, - {file = "lru_dict-1.1.8-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:163079dbda54c3e6422b23da39fb3ecc561035d65e8496ff1950cbdb376018e1"}, - {file = "lru_dict-1.1.8-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:0972d669e9e207617e06416166718b073a49bf449abbd23940d9545c0847a4d9"}, - {file = "lru_dict-1.1.8-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:97c24ffc55de6013075979f440acd174e88819f30387074639fb7d7178ca253e"}, - {file = "lru_dict-1.1.8-cp38-cp38-win32.whl", hash = "sha256:0f83cd70a6d32f9018d471be609f3af73058f700691657db4a3d3dd78d3f96dd"}, - {file = "lru_dict-1.1.8-cp38-cp38-win_amd64.whl", hash = "sha256:add762163f4af7f4173fafa4092eb7c7f023cf139ef6d2015cfea867e1440d82"}, - {file = "lru_dict-1.1.8-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:484ac524e4615f06dc72ffbfd83f26e073c9ec256de5413634fbd024c010a8bc"}, - {file = "lru_dict-1.1.8-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7284bdbc5579bbdc3fc8f869ed4c169f403835566ab0f84567cdbfdd05241847"}, - {file = "lru_dict-1.1.8-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ca497cb25f19f24171f9172805f3ff135b911aeb91960bd4af8e230421ccb51"}, - {file = "lru_dict-1.1.8-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1df1da204a9f0b5eb8393a46070f1d984fa8559435ee790d7f8f5602038fc00"}, - {file = "lru_dict-1.1.8-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:f4d0a6d733a23865019b1c97ed6fb1fdb739be923192abf4dbb644f697a26a69"}, - {file = "lru_dict-1.1.8-cp39-cp39-win32.whl", hash = "sha256:7be1b66926277993cecdc174c15a20c8ce785c1f8b39aa560714a513eef06473"}, - {file = "lru_dict-1.1.8-cp39-cp39-win_amd64.whl", hash = "sha256:881104711900af45967c2e5ce3e62291dd57d5b2a224d58b7c9f60bf4ad41b8c"}, - {file = "lru_dict-1.1.8-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:beb089c46bd95243d1ac5b2bd13627317b08bf40dd8dc16d4b7ee7ecb3cf65ca"}, - {file = "lru_dict-1.1.8-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:10fe823ff90b655f0b6ba124e2b576ecda8c61b8ead76b456db67831942d22f2"}, - {file = "lru_dict-1.1.8-pp37-pypy37_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07163c9dcbb2eca377f366b1331f46302fd8b6b72ab4d603087feca00044bb0"}, - {file = "lru_dict-1.1.8-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93336911544ebc0e466272043adab9fb9f6e9dcba6024b639c32553a3790e089"}, - {file = "lru_dict-1.1.8-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:55aeda6b6789b2d030066b4f5f6fc3596560ba2a69028f35f3682a795701b5b1"}, - {file = "lru_dict-1.1.8-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:262a4e622010ceb960a6a5222ed011090e50954d45070fd369c0fa4d2ed7d9a9"}, - {file = "lru_dict-1.1.8-pp38-pypy38_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b6f64005ede008b7a866be8f3f6274dbf74e656e15e4004e9d99ad65efb01809"}, - {file = "lru_dict-1.1.8-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:9d70257246b8207e8ef3d8b18457089f5ff0dfb087bd36eb33bce6584f2e0b3a"}, - {file = "lru_dict-1.1.8-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:f874e9c2209dada1a080545331aa1277ec060a13f61684a8642788bf44b2325f"}, - {file = "lru_dict-1.1.8-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a592363c93d6fc6472d5affe2819e1c7590746aecb464774a4f67e09fbefdfc"}, - {file = "lru_dict-1.1.8-pp39-pypy39_pp73-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2f340b61f3cdfee71f66da7dbfd9a5ea2db6974502ccff2065cdb76619840dca"}, - {file = "lru_dict-1.1.8-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:9447214e4857e16d14158794ef01e4501d8fad07d298d03308d9f90512df02fa"}, -] -multiaddr = [ - {file = "multiaddr-0.0.9-py2.py3-none-any.whl", hash = "sha256:5c0f862cbcf19aada2a899f80ef896ddb2e85614e0c8f04dd287c06c69dac95b"}, - {file = "multiaddr-0.0.9.tar.gz", hash = "sha256:30b2695189edc3d5b90f1c303abb8f02d963a3a4edf2e7178b975eb417ab0ecf"}, -] -multidict = [ - {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0b9e95a740109c6047602f4db4da9949e6c5945cefbad34a1299775ddc9a62e2"}, - {file = "multidict-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ac0e27844758d7177989ce406acc6a83c16ed4524ebc363c1f748cba184d89d3"}, - {file = "multidict-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:041b81a5f6b38244b34dc18c7b6aba91f9cdaf854d9a39e5ff0b58e2b5773b9c"}, - {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5fdda29a3c7e76a064f2477c9aab1ba96fd94e02e386f1e665bca1807fc5386f"}, - {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3368bf2398b0e0fcbf46d85795adc4c259299fec50c1416d0f77c0a843a3eed9"}, - {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4f052ee022928d34fe1f4d2bc743f32609fb79ed9c49a1710a5ad6b2198db20"}, - {file = "multidict-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:225383a6603c086e6cef0f2f05564acb4f4d5f019a4e3e983f572b8530f70c88"}, - {file = "multidict-6.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50bd442726e288e884f7be9071016c15a8742eb689a593a0cac49ea093eef0a7"}, - {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:47e6a7e923e9cada7c139531feac59448f1f47727a79076c0b1ee80274cd8eee"}, - {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:0556a1d4ea2d949efe5fd76a09b4a82e3a4a30700553a6725535098d8d9fb672"}, - {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:626fe10ac87851f4cffecee161fc6f8f9853f0f6f1035b59337a51d29ff3b4f9"}, - {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:8064b7c6f0af936a741ea1efd18690bacfbae4078c0c385d7c3f611d11f0cf87"}, - {file = "multidict-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2d36e929d7f6a16d4eb11b250719c39560dd70545356365b494249e2186bc389"}, - {file = "multidict-6.0.2-cp310-cp310-win32.whl", hash = "sha256:fcb91630817aa8b9bc4a74023e4198480587269c272c58b3279875ed7235c293"}, - {file = "multidict-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:8cbf0132f3de7cc6c6ce00147cc78e6439ea736cee6bca4f068bcf892b0fd658"}, - {file = "multidict-6.0.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:05f6949d6169878a03e607a21e3b862eaf8e356590e8bdae4227eedadacf6e51"}, - {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e2c2e459f7050aeb7c1b1276763364884595d47000c1cddb51764c0d8976e608"}, - {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d0509e469d48940147e1235d994cd849a8f8195e0bca65f8f5439c56e17872a3"}, - {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:514fe2b8d750d6cdb4712346a2c5084a80220821a3e91f3f71eec11cf8d28fd4"}, - {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:19adcfc2a7197cdc3987044e3f415168fc5dc1f720c932eb1ef4f71a2067e08b"}, - {file = "multidict-6.0.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b9d153e7f1f9ba0b23ad1568b3b9e17301e23b042c23870f9ee0522dc5cc79e8"}, - {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:aef9cc3d9c7d63d924adac329c33835e0243b5052a6dfcbf7732a921c6e918ba"}, - {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4571f1beddff25f3e925eea34268422622963cd8dc395bb8778eb28418248e43"}, - {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:d48b8ee1d4068561ce8033d2c344cf5232cb29ee1a0206a7b828c79cbc5982b8"}, - {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:45183c96ddf61bf96d2684d9fbaf6f3564d86b34cb125761f9a0ef9e36c1d55b"}, - {file = "multidict-6.0.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:75bdf08716edde767b09e76829db8c1e5ca9d8bb0a8d4bd94ae1eafe3dac5e15"}, - {file = "multidict-6.0.2-cp37-cp37m-win32.whl", hash = "sha256:a45e1135cb07086833ce969555df39149680e5471c04dfd6a915abd2fc3f6dbc"}, - {file = "multidict-6.0.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6f3cdef8a247d1eafa649085812f8a310e728bdf3900ff6c434eafb2d443b23a"}, - {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0327292e745a880459ef71be14e709aaea2f783f3537588fb4ed09b6c01bca60"}, - {file = "multidict-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e875b6086e325bab7e680e4316d667fc0e5e174bb5611eb16b3ea121c8951b86"}, - {file = "multidict-6.0.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:feea820722e69451743a3d56ad74948b68bf456984d63c1a92e8347b7b88452d"}, - {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cc57c68cb9139c7cd6fc39f211b02198e69fb90ce4bc4a094cf5fe0d20fd8b0"}, - {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:497988d6b6ec6ed6f87030ec03280b696ca47dbf0648045e4e1d28b80346560d"}, - {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:89171b2c769e03a953d5969b2f272efa931426355b6c0cb508022976a17fd376"}, - {file = "multidict-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:684133b1e1fe91eda8fa7447f137c9490a064c6b7f392aa857bba83a28cfb693"}, - {file = "multidict-6.0.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd9fc9c4849a07f3635ccffa895d57abce554b467d611a5009ba4f39b78a8849"}, - {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e07c8e79d6e6fd37b42f3250dba122053fddb319e84b55dd3a8d6446e1a7ee49"}, - {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:4070613ea2227da2bfb2c35a6041e4371b0af6b0be57f424fe2318b42a748516"}, - {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:47fbeedbf94bed6547d3aa632075d804867a352d86688c04e606971595460227"}, - {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5774d9218d77befa7b70d836004a768fb9aa4fdb53c97498f4d8d3f67bb9cfa9"}, - {file = "multidict-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2957489cba47c2539a8eb7ab32ff49101439ccf78eab724c828c1a54ff3ff98d"}, - {file = "multidict-6.0.2-cp38-cp38-win32.whl", hash = "sha256:e5b20e9599ba74391ca0cfbd7b328fcc20976823ba19bc573983a25b32e92b57"}, - {file = "multidict-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:8004dca28e15b86d1b1372515f32eb6f814bdf6f00952699bdeb541691091f96"}, - {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2e4a0785b84fb59e43c18a015ffc575ba93f7d1dbd272b4cdad9f5134b8a006c"}, - {file = "multidict-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6701bf8a5d03a43375909ac91b6980aea74b0f5402fbe9428fc3f6edf5d9677e"}, - {file = "multidict-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a007b1638e148c3cfb6bf0bdc4f82776cef0ac487191d093cdc316905e504071"}, - {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07a017cfa00c9890011628eab2503bee5872f27144936a52eaab449be5eaf032"}, - {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c207fff63adcdf5a485969131dc70e4b194327666b7e8a87a97fbc4fd80a53b2"}, - {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:373ba9d1d061c76462d74e7de1c0c8e267e9791ee8cfefcf6b0b2495762c370c"}, - {file = "multidict-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfba7c6d5d7c9099ba21f84662b037a0ffd4a5e6b26ac07d19e423e6fdf965a9"}, - {file = "multidict-6.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:19d9bad105dfb34eb539c97b132057a4e709919ec4dd883ece5838bcbf262b80"}, - {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:de989b195c3d636ba000ee4281cd03bb1234635b124bf4cd89eeee9ca8fcb09d"}, - {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c40b7bbece294ae3a87c1bc2abff0ff9beef41d14188cda94ada7bcea99b0fb"}, - {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:d16cce709ebfadc91278a1c005e3c17dd5f71f5098bfae1035149785ea6e9c68"}, - {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:a2c34a93e1d2aa35fbf1485e5010337c72c6791407d03aa5f4eed920343dd360"}, - {file = "multidict-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:feba80698173761cddd814fa22e88b0661e98cb810f9f986c54aa34d281e4937"}, - {file = "multidict-6.0.2-cp39-cp39-win32.whl", hash = "sha256:23b616fdc3c74c9fe01d76ce0d1ce872d2d396d8fa8e4899398ad64fb5aa214a"}, - {file = "multidict-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:4bae31803d708f6f15fd98be6a6ac0b6958fcf68fda3c77a048a4f9073704aae"}, - {file = "multidict-6.0.2.tar.gz", hash = "sha256:5ff3bd75f38e4c43f1f470f2df7a4d430b821c4ce22be384e1459cb57d6bb013"}, -] -mypy-extensions = [ - {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, - {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, -] -mythx-models = [ - {file = "mythx-models-1.9.1.tar.gz", hash = "sha256:037090723c5006df25656473db7875469e11d9d03478d41bb8d1f1517c1c474c"}, - {file = "mythx_models-1.9.1-py2.py3-none-any.whl", hash = "sha256:4b9133c2ee41f97c03545bb480a16f3388b10557c5622aeada7ce79aaadcf7de"}, -] -netaddr = [ - {file = "netaddr-0.8.0-py2.py3-none-any.whl", hash = "sha256:9666d0232c32d2656e5e5f8d735f58fd6c7457ce52fc21c98d45f2af78f990ac"}, - {file = "netaddr-0.8.0.tar.gz", hash = "sha256:d6cc57c7a07b1d9d2e917aa8b36ae8ce61c35ba3fcd1b83ca31c5a0ee2b5a243"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -parsimonious = [ - {file = "parsimonious-0.8.1.tar.gz", hash = "sha256:3add338892d580e0cb3b1a39e4a1b427ff9f687858fdd61097053742391a9f6b"}, -] -pathspec = [ - {file = "pathspec-0.9.0-py2.py3-none-any.whl", hash = "sha256:7d15c4ddb0b5c802d161efc417ec1a2558ea2653c2e8ad9c19098201dc1c993a"}, - {file = "pathspec-0.9.0.tar.gz", hash = "sha256:e564499435a2673d586f6b2130bb5b95f04a3ba06f81b8f895b651a3c76aabb1"}, -] -platformdirs = [ - {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, - {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -prettytable = [ - {file = "prettytable-3.4.1-py3-none-any.whl", hash = "sha256:0d23ff81e165077d93367e1379d97893c7a51541483d25bad45b9647660ef06f"}, - {file = "prettytable-3.4.1.tar.gz", hash = "sha256:7d7dd84d0b206f2daac4471a72f299d6907f34516064feb2838e333a4e2567bd"}, -] -prompt-toolkit = [ - {file = "prompt_toolkit-3.0.30-py3-none-any.whl", hash = "sha256:d8916d3f62a7b67ab353a952ce4ced6a1d2587dfe9ef8ebc30dd7c386751f289"}, - {file = "prompt_toolkit-3.0.30.tar.gz", hash = "sha256:859b283c50bde45f5f97829f77a4674d1c1fcd88539364f1b28a37805cfd89c0"}, -] -protobuf = [ - {file = "protobuf-3.20.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3cc797c9d15d7689ed507b165cd05913acb992d78b379f6014e013f9ecb20996"}, - {file = "protobuf-3.20.1-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:ff8d8fa42675249bb456f5db06c00de6c2f4c27a065955917b28c4f15978b9c3"}, - {file = "protobuf-3.20.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cd68be2559e2a3b84f517fb029ee611546f7812b1fdd0aa2ecc9bc6ec0e4fdde"}, - {file = "protobuf-3.20.1-cp310-cp310-win32.whl", hash = "sha256:9016d01c91e8e625141d24ec1b20fed584703e527d28512aa8c8707f105a683c"}, - {file = "protobuf-3.20.1-cp310-cp310-win_amd64.whl", hash = "sha256:32ca378605b41fd180dfe4e14d3226386d8d1b002ab31c969c366549e66a2bb7"}, - {file = "protobuf-3.20.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9be73ad47579abc26c12024239d3540e6b765182a91dbc88e23658ab71767153"}, - {file = "protobuf-3.20.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:097c5d8a9808302fb0da7e20edf0b8d4703274d140fd25c5edabddcde43e081f"}, - {file = "protobuf-3.20.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e250a42f15bf9d5b09fe1b293bdba2801cd520a9f5ea2d7fb7536d4441811d20"}, - {file = "protobuf-3.20.1-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:cdee09140e1cd184ba9324ec1df410e7147242b94b5f8b0c64fc89e38a8ba531"}, - {file = "protobuf-3.20.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:af0ebadc74e281a517141daad9d0f2c5d93ab78e9d455113719a45a49da9db4e"}, - {file = "protobuf-3.20.1-cp37-cp37m-win32.whl", hash = "sha256:755f3aee41354ae395e104d62119cb223339a8f3276a0cd009ffabfcdd46bb0c"}, - {file = "protobuf-3.20.1-cp37-cp37m-win_amd64.whl", hash = "sha256:62f1b5c4cd6c5402b4e2d63804ba49a327e0c386c99b1675c8a0fefda23b2067"}, - {file = "protobuf-3.20.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:06059eb6953ff01e56a25cd02cca1a9649a75a7e65397b5b9b4e929ed71d10cf"}, - {file = "protobuf-3.20.1-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:cb29edb9eab15742d791e1025dd7b6a8f6fcb53802ad2f6e3adcb102051063ab"}, - {file = "protobuf-3.20.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:69ccfdf3657ba59569c64295b7d51325f91af586f8d5793b734260dfe2e94e2c"}, - {file = "protobuf-3.20.1-cp38-cp38-win32.whl", hash = "sha256:dd5789b2948ca702c17027c84c2accb552fc30f4622a98ab5c51fcfe8c50d3e7"}, - {file = "protobuf-3.20.1-cp38-cp38-win_amd64.whl", hash = "sha256:77053d28427a29987ca9caf7b72ccafee011257561259faba8dd308fda9a8739"}, - {file = "protobuf-3.20.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6f50601512a3d23625d8a85b1638d914a0970f17920ff39cec63aaef80a93fb7"}, - {file = "protobuf-3.20.1-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:284f86a6207c897542d7e956eb243a36bb8f9564c1742b253462386e96c6b78f"}, - {file = "protobuf-3.20.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:7403941f6d0992d40161aa8bb23e12575637008a5a02283a930addc0508982f9"}, - {file = "protobuf-3.20.1-cp39-cp39-win32.whl", hash = "sha256:db977c4ca738dd9ce508557d4fce0f5aebd105e158c725beec86feb1f6bc20d8"}, - {file = "protobuf-3.20.1-cp39-cp39-win_amd64.whl", hash = "sha256:7e371f10abe57cee5021797126c93479f59fccc9693dafd6bd5633ab67808a91"}, - {file = "protobuf-3.20.1-py2.py3-none-any.whl", hash = "sha256:adfc6cf69c7f8c50fd24c793964eef18f0ac321315439d94945820612849c388"}, - {file = "protobuf-3.20.1.tar.gz", hash = "sha256:adc31566d027f45efe3f44eeb5b1f329da43891634d61c75a5944e9be6dd42c9"}, -] -psutil = [ - {file = "psutil-5.9.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:799759d809c31aab5fe4579e50addf84565e71c1dc9f1c31258f159ff70d3f87"}, - {file = "psutil-5.9.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:9272167b5f5fbfe16945be3db475b3ce8d792386907e673a209da686176552af"}, - {file = "psutil-5.9.1-cp27-cp27m-win32.whl", hash = "sha256:0904727e0b0a038830b019551cf3204dd48ef5c6868adc776e06e93d615fc5fc"}, - {file = "psutil-5.9.1-cp27-cp27m-win_amd64.whl", hash = "sha256:e7e10454cb1ab62cc6ce776e1c135a64045a11ec4c6d254d3f7689c16eb3efd2"}, - {file = "psutil-5.9.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:56960b9e8edcca1456f8c86a196f0c3d8e3e361320071c93378d41445ffd28b0"}, - {file = "psutil-5.9.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:44d1826150d49ffd62035785a9e2c56afcea66e55b43b8b630d7706276e87f22"}, - {file = "psutil-5.9.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c7be9d7f5b0d206f0bbc3794b8e16fb7dbc53ec9e40bbe8787c6f2d38efcf6c9"}, - {file = "psutil-5.9.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd9246e4cdd5b554a2ddd97c157e292ac11ef3e7af25ac56b08b455c829dca8"}, - {file = "psutil-5.9.1-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:29a442e25fab1f4d05e2655bb1b8ab6887981838d22effa2396d584b740194de"}, - {file = "psutil-5.9.1-cp310-cp310-win32.whl", hash = "sha256:20b27771b077dcaa0de1de3ad52d22538fe101f9946d6dc7869e6f694f079329"}, - {file = "psutil-5.9.1-cp310-cp310-win_amd64.whl", hash = "sha256:58678bbadae12e0db55186dc58f2888839228ac9f41cc7848853539b70490021"}, - {file = "psutil-5.9.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3a76ad658641172d9c6e593de6fe248ddde825b5866464c3b2ee26c35da9d237"}, - {file = "psutil-5.9.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a6a11e48cb93a5fa606306493f439b4aa7c56cb03fc9ace7f6bfa21aaf07c453"}, - {file = "psutil-5.9.1-cp36-cp36m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:068935df39055bf27a29824b95c801c7a5130f118b806eee663cad28dca97685"}, - {file = "psutil-5.9.1-cp36-cp36m-win32.whl", hash = "sha256:0f15a19a05f39a09327345bc279c1ba4a8cfb0172cc0d3c7f7d16c813b2e7d36"}, - {file = "psutil-5.9.1-cp36-cp36m-win_amd64.whl", hash = "sha256:db417f0865f90bdc07fa30e1aadc69b6f4cad7f86324b02aa842034efe8d8c4d"}, - {file = "psutil-5.9.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:91c7ff2a40c373d0cc9121d54bc5f31c4fa09c346528e6a08d1845bce5771ffc"}, - {file = "psutil-5.9.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fea896b54f3a4ae6f790ac1d017101252c93f6fe075d0e7571543510f11d2676"}, - {file = "psutil-5.9.1-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3054e923204b8e9c23a55b23b6df73a8089ae1d075cb0bf711d3e9da1724ded4"}, - {file = "psutil-5.9.1-cp37-cp37m-win32.whl", hash = "sha256:d2d006286fbcb60f0b391741f520862e9b69f4019b4d738a2a45728c7e952f1b"}, - {file = "psutil-5.9.1-cp37-cp37m-win_amd64.whl", hash = "sha256:b14ee12da9338f5e5b3a3ef7ca58b3cba30f5b66f7662159762932e6d0b8f680"}, - {file = "psutil-5.9.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:19f36c16012ba9cfc742604df189f2f28d2720e23ff7d1e81602dbe066be9fd1"}, - {file = "psutil-5.9.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:944c4b4b82dc4a1b805329c980f270f170fdc9945464223f2ec8e57563139cf4"}, - {file = "psutil-5.9.1-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b6750a73a9c4a4e689490ccb862d53c7b976a2a35c4e1846d049dcc3f17d83b"}, - {file = "psutil-5.9.1-cp38-cp38-win32.whl", hash = "sha256:a8746bfe4e8f659528c5c7e9af5090c5a7d252f32b2e859c584ef7d8efb1e689"}, - {file = "psutil-5.9.1-cp38-cp38-win_amd64.whl", hash = "sha256:79c9108d9aa7fa6fba6e668b61b82facc067a6b81517cab34d07a84aa89f3df0"}, - {file = "psutil-5.9.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:28976df6c64ddd6320d281128817f32c29b539a52bdae5e192537bc338a9ec81"}, - {file = "psutil-5.9.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b88f75005586131276634027f4219d06e0561292be8bd6bc7f2f00bdabd63c4e"}, - {file = "psutil-5.9.1-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:645bd4f7bb5b8633803e0b6746ff1628724668681a434482546887d22c7a9537"}, - {file = "psutil-5.9.1-cp39-cp39-win32.whl", hash = "sha256:32c52611756096ae91f5d1499fe6c53b86f4a9ada147ee42db4991ba1520e574"}, - {file = "psutil-5.9.1-cp39-cp39-win_amd64.whl", hash = "sha256:f65f9a46d984b8cd9b3750c2bdb419b2996895b005aefa6cbaba9a143b1ce2c5"}, - {file = "psutil-5.9.1.tar.gz", hash = "sha256:57f1819b5d9e95cdfb0c881a8a5b7d542ed0b7c522d575706a80bedc848c8954"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -py-solc-ast = [ - {file = "py-solc-ast-1.2.9.tar.gz", hash = "sha256:5a5c3bb1998de32eed4b793ebbf2f14f1fd5c681cf8b62af6b8f9f76b805164d"}, - {file = "py_solc_ast-1.2.9-py3-none-any.whl", hash = "sha256:f636217ef77bbe0f9c87a71af2f6cc9577f6301aa2ffb9af119f4c8fa8522b2d"}, -] -py-solc-x = [ - {file = "py-solc-x-1.1.1.tar.gz", hash = "sha256:d8b0bd2b04f47cff6e92181739d9e94e41b2d62f056900761c797fa5babc76b6"}, - {file = "py_solc_x-1.1.1-py3-none-any.whl", hash = "sha256:8f5caa4f54e227fc301e2e4c8aa868e869c2bc0c6636aa9e8115f8414bb891f9"}, -] -pycryptodome = [ - {file = "pycryptodome-3.15.0-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:ff7ae90e36c1715a54446e7872b76102baa5c63aa980917f4aa45e8c78d1a3ec"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:2ffd8b31561455453ca9f62cb4c24e6b8d119d6d531087af5f14b64bee2c23e6"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:2ea63d46157386c5053cfebcdd9bd8e0c8b7b0ac4a0507a027f5174929403884"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:7c9ed8aa31c146bef65d89a1b655f5f4eab5e1120f55fc297713c89c9e56ff0b"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:5099c9ca345b2f252f0c28e96904643153bae9258647585e5e6f649bb7a1844a"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-manylinux2014_aarch64.whl", hash = "sha256:2ec709b0a58b539a4f9d33fb8508264c3678d7edb33a68b8906ba914f71e8c13"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-win32.whl", hash = "sha256:fd2184aae6ee2a944aaa49113e6f5787cdc5e4db1eb8edb1aea914bd75f33a0c"}, - {file = "pycryptodome-3.15.0-cp27-cp27m-win_amd64.whl", hash = "sha256:7e3a8f6ee405b3bd1c4da371b93c31f7027944b2bcce0697022801db93120d83"}, - {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:b9c5b1a1977491533dfd31e01550ee36ae0249d78aae7f632590db833a5012b8"}, - {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:0926f7cc3735033061ef3cf27ed16faad6544b14666410727b31fea85a5b16eb"}, - {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:2aa55aae81f935a08d5a3c2042eb81741a43e044bd8a81ea7239448ad751f763"}, - {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:c3640deff4197fa064295aaac10ab49a0d55ef3d6a54ae1499c40d646655c89f"}, - {file = "pycryptodome-3.15.0-cp27-cp27mu-manylinux2014_aarch64.whl", hash = "sha256:045d75527241d17e6ef13636d845a12e54660aa82e823b3b3341bcf5af03fa79"}, - {file = "pycryptodome-3.15.0-cp35-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9ee40e2168f1348ae476676a2e938ca80a2f57b14a249d8fe0d3cdf803e5a676"}, - {file = "pycryptodome-3.15.0-cp35-abi3-manylinux1_i686.whl", hash = "sha256:4c3ccad74eeb7b001f3538643c4225eac398c77d617ebb3e57571a897943c667"}, - {file = "pycryptodome-3.15.0-cp35-abi3-manylinux1_x86_64.whl", hash = "sha256:1b22bcd9ec55e9c74927f6b1f69843cb256fb5a465088ce62837f793d9ffea88"}, - {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2010_i686.whl", hash = "sha256:57f565acd2f0cf6fb3e1ba553d0cb1f33405ec1f9c5ded9b9a0a5320f2c0bd3d"}, - {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2010_x86_64.whl", hash = "sha256:4b52cb18b0ad46087caeb37a15e08040f3b4c2d444d58371b6f5d786d95534c2"}, - {file = "pycryptodome-3.15.0-cp35-abi3-manylinux2014_aarch64.whl", hash = "sha256:092a26e78b73f2530b8bd6b3898e7453ab2f36e42fd85097d705d6aba2ec3e5e"}, - {file = "pycryptodome-3.15.0-cp35-abi3-win32.whl", hash = "sha256:e244ab85c422260de91cda6379e8e986405b4f13dc97d2876497178707f87fc1"}, - {file = "pycryptodome-3.15.0-cp35-abi3-win_amd64.whl", hash = "sha256:c77126899c4b9c9827ddf50565e93955cb3996813c18900c16b2ea0474e130e9"}, - {file = "pycryptodome-3.15.0-pp27-pypy_73-macosx_10_9_x86_64.whl", hash = "sha256:9eaadc058106344a566dc51d3d3a758ab07f8edde013712bc8d22032a86b264f"}, - {file = "pycryptodome-3.15.0-pp27-pypy_73-manylinux1_x86_64.whl", hash = "sha256:ff287bcba9fbeb4f1cccc1f2e90a08d691480735a611ee83c80a7d74ad72b9d9"}, - {file = "pycryptodome-3.15.0-pp27-pypy_73-manylinux2010_x86_64.whl", hash = "sha256:60b4faae330c3624cc5a546ba9cfd7b8273995a15de94ee4538130d74953ec2e"}, - {file = "pycryptodome-3.15.0-pp27-pypy_73-win32.whl", hash = "sha256:a8f06611e691c2ce45ca09bbf983e2ff2f8f4f87313609d80c125aff9fad6e7f"}, - {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-macosx_10_9_x86_64.whl", hash = "sha256:b9cc96e274b253e47ad33ae1fccc36ea386f5251a823ccb50593a935db47fdd2"}, - {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-manylinux1_x86_64.whl", hash = "sha256:ecaaef2d21b365d9c5ca8427ffc10cebed9d9102749fd502218c23cb9a05feb5"}, - {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-manylinux2010_x86_64.whl", hash = "sha256:d2a39a66057ab191e5c27211a7daf8f0737f23acbf6b3562b25a62df65ffcb7b"}, - {file = "pycryptodome-3.15.0-pp36-pypy36_pp73-win32.whl", hash = "sha256:9c772c485b27967514d0df1458b56875f4b6d025566bf27399d0c239ff1b369f"}, - {file = "pycryptodome-3.15.0.tar.gz", hash = "sha256:9135dddad504592bcc18b0d2d95ce86c3a5ea87ec6447ef25cfedea12d6018b8"}, -] -Pygments = [ - {file = "Pygments-2.12.0-py3-none-any.whl", hash = "sha256:dc9c10fb40944260f6ed4c688ece0cd2048414940f1cea51b8b226318411c519"}, - {file = "Pygments-2.12.0.tar.gz", hash = "sha256:5eb116118f9612ff1ee89ac96437bb6b49e8f04d8a13b514ba26f620208e26eb"}, -] -pygments-lexer-solidity = [ - {file = "pygments-lexer-solidity-0.7.0.tar.gz", hash = "sha256:a347fd96981838331b6d98b0f891776908a49406d343ff2a40a6a1c8475a9350"}, -] -PyJWT = [ - {file = "PyJWT-1.7.1-py2.py3-none-any.whl", hash = "sha256:5c6eca3c2940464d106b99ba83b00c6add741c9becaec087fb7ccdefea71350e"}, - {file = "PyJWT-1.7.1.tar.gz", hash = "sha256:8d59a976fb773f3e6a39c85636357c4f0e242707394cadadd9814f5cbaa20e96"}, -] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -pyrsistent = [ - {file = "pyrsistent-0.18.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:df46c854f490f81210870e509818b729db4488e1f30f2a1ce1698b2295a878d1"}, - {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5d45866ececf4a5fff8742c25722da6d4c9e180daa7b405dc0a2a2790d668c26"}, - {file = "pyrsistent-0.18.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4ed6784ceac462a7d6fcb7e9b663e93b9a6fb373b7f43594f9ff68875788e01e"}, - {file = "pyrsistent-0.18.1-cp310-cp310-win32.whl", hash = "sha256:e4f3149fd5eb9b285d6bfb54d2e5173f6a116fe19172686797c056672689daf6"}, - {file = "pyrsistent-0.18.1-cp310-cp310-win_amd64.whl", hash = "sha256:636ce2dc235046ccd3d8c56a7ad54e99d5c1cd0ef07d9ae847306c91d11b5fec"}, - {file = "pyrsistent-0.18.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:e92a52c166426efbe0d1ec1332ee9119b6d32fc1f0bbfd55d5c1088070e7fc1b"}, - {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d7a096646eab884bf8bed965bad63ea327e0d0c38989fc83c5ea7b8a87037bfc"}, - {file = "pyrsistent-0.18.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cdfd2c361b8a8e5d9499b9082b501c452ade8bbf42aef97ea04854f4a3f43b22"}, - {file = "pyrsistent-0.18.1-cp37-cp37m-win32.whl", hash = "sha256:7ec335fc998faa4febe75cc5268a9eac0478b3f681602c1f27befaf2a1abe1d8"}, - {file = "pyrsistent-0.18.1-cp37-cp37m-win_amd64.whl", hash = "sha256:6455fc599df93d1f60e1c5c4fe471499f08d190d57eca040c0ea182301321286"}, - {file = "pyrsistent-0.18.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:fd8da6d0124efa2f67d86fa70c851022f87c98e205f0594e1fae044e7119a5a6"}, - {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7bfe2388663fd18bd8ce7db2c91c7400bf3e1a9e8bd7d63bf7e77d39051b85ec"}, - {file = "pyrsistent-0.18.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0e3e1fcc45199df76053026a51cc59ab2ea3fc7c094c6627e93b7b44cdae2c8c"}, - {file = "pyrsistent-0.18.1-cp38-cp38-win32.whl", hash = "sha256:b568f35ad53a7b07ed9b1b2bae09eb15cdd671a5ba5d2c66caee40dbf91c68ca"}, - {file = "pyrsistent-0.18.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1b96547410f76078eaf66d282ddca2e4baae8964364abb4f4dcdde855cd123a"}, - {file = "pyrsistent-0.18.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f87cc2863ef33c709e237d4b5f4502a62a00fab450c9e020892e8e2ede5847f5"}, - {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6bc66318fb7ee012071b2792024564973ecc80e9522842eb4e17743604b5e045"}, - {file = "pyrsistent-0.18.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:914474c9f1d93080338ace89cb2acee74f4f666fb0424896fcfb8d86058bf17c"}, - {file = "pyrsistent-0.18.1-cp39-cp39-win32.whl", hash = "sha256:1b34eedd6812bf4d33814fca1b66005805d3640ce53140ab8bbb1e2651b0d9bc"}, - {file = "pyrsistent-0.18.1-cp39-cp39-win_amd64.whl", hash = "sha256:e24a828f57e0c337c8d8bb9f6b12f09dfdf0273da25fda9e314f0b684b415a07"}, - {file = "pyrsistent-0.18.1.tar.gz", hash = "sha256:d4d61f8b993a7255ba714df3aca52700f8125289f84f704cf80916517c46eb96"}, -] -pysha3 = [ - {file = "pysha3-1.0.2-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:6e6a84efb7856f5d760ee55cd2b446972cb7b835676065f6c4f694913ea8f8d9"}, - {file = "pysha3-1.0.2-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:f9046d59b3e72aa84f6dae83a040bd1184ebd7fef4e822d38186a8158c89e3cf"}, - {file = "pysha3-1.0.2-cp27-cp27m-win32.whl", hash = "sha256:9fdd28884c5d0b4edfed269b12badfa07f1c89dbc5c9c66dd279833894a9896b"}, - {file = "pysha3-1.0.2-cp27-cp27m-win_amd64.whl", hash = "sha256:41be70b06c8775a9e4d4eeb52f2f6a3f356f17539a54eac61f43a29e42fd453d"}, - {file = "pysha3-1.0.2-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:68c3a60a39f9179b263d29e221c1bd6e01353178b14323c39cc70593c30f21c5"}, - {file = "pysha3-1.0.2-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:59111c08b8f34495575d12e5f2ce3bafb98bea470bc81e70c8b6df99aef0dd2f"}, - {file = "pysha3-1.0.2-cp33-cp33m-win32.whl", hash = "sha256:571a246308a7b63f15f5aa9651f99cf30f2a6acba18eddf28f1510935968b603"}, - {file = "pysha3-1.0.2-cp33-cp33m-win_amd64.whl", hash = "sha256:93abd775dac570cb9951c4e423bcb2bc6303a9d1dc0dc2b7afa2dd401d195b24"}, - {file = "pysha3-1.0.2-cp34-cp34m-manylinux1_i686.whl", hash = "sha256:11a2ba7a2e1d9669d0052fc8fb30f5661caed5512586ecbeeaf6bf9478ab5c48"}, - {file = "pysha3-1.0.2-cp34-cp34m-manylinux1_x86_64.whl", hash = "sha256:5ec8da7c5c70a53b5fa99094af3ba8d343955b212bc346a0d25f6ff75853999f"}, - {file = "pysha3-1.0.2-cp34-cp34m-win32.whl", hash = "sha256:9c778fa8b161dc9348dc5cc361e94d54aa5ff18413788f4641f6600d4893a608"}, - {file = "pysha3-1.0.2-cp34-cp34m-win_amd64.whl", hash = "sha256:fd7e66999060d079e9c0e8893e78d8017dad4f59721f6fe0be6307cd32127a07"}, - {file = "pysha3-1.0.2-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:827b308dc025efe9b6b7bae36c2e09ed0118a81f792d888548188e97b9bf9a3d"}, - {file = "pysha3-1.0.2-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:4416f16b0f1605c25f627966f76873e432971824778b369bd9ce1bb63d6566d9"}, - {file = "pysha3-1.0.2-cp35-cp35m-win32.whl", hash = "sha256:c93a2676e6588abcfaecb73eb14485c81c63b94fca2000a811a7b4fb5937b8e8"}, - {file = "pysha3-1.0.2-cp35-cp35m-win_amd64.whl", hash = "sha256:684cb01d87ed6ff466c135f1c83e7e4042d0fc668fa20619f581e6add1d38d77"}, - {file = "pysha3-1.0.2-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:386998ee83e313b6911327174e088021f9f2061cbfa1651b97629b761e9ef5c4"}, - {file = "pysha3-1.0.2-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:c7c2adcc43836223680ebdf91f1d3373543dc32747c182c8ca2e02d1b69ce030"}, - {file = "pysha3-1.0.2-cp36-cp36m-win32.whl", hash = "sha256:cd5c961b603bd2e6c2b5ef9976f3238a561c58569945d4165efb9b9383b050ef"}, - {file = "pysha3-1.0.2-cp36-cp36m-win_amd64.whl", hash = "sha256:0060a66be16665d90c432f55a0ba1f6480590cfb7d2ad389e688a399183474f0"}, - {file = "pysha3-1.0.2.tar.gz", hash = "sha256:fe988e73f2ce6d947220624f04d467faf05f1bbdbc64b0a201296bb3af92739e"}, -] -pytest = [ - {file = "pytest-6.2.5-py3-none-any.whl", hash = "sha256:7310f8d27bc79ced999e760ca304d69f6ba6c6649c0b60fb0e04a4a77cacc134"}, - {file = "pytest-6.2.5.tar.gz", hash = "sha256:131b36680866a76e6781d13f101efb86cf674ebb9762eb70d3082b6f29889e89"}, -] -pytest-forked = [ - {file = "pytest-forked-1.4.0.tar.gz", hash = "sha256:8b67587c8f98cbbadfdd804539ed5455b6ed03802203485dd2f53c1422d7440e"}, - {file = "pytest_forked-1.4.0-py3-none-any.whl", hash = "sha256:bbbb6717efc886b9d64537b41fb1497cfaf3c9601276be8da2cccfea5a3c8ad8"}, -] -pytest-xdist = [ - {file = "pytest-xdist-1.34.0.tar.gz", hash = "sha256:340e8e83e2a4c0d861bdd8d05c5d7b7143f6eea0aba902997db15c2a86be04ee"}, - {file = "pytest_xdist-1.34.0-py2.py3-none-any.whl", hash = "sha256:ba5d10729372d65df3ac150872f9df5d2ed004a3b0d499cc0164aafedd8c7b66"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.1.tar.gz", hash = "sha256:73ebfe9dbf22e832286dafa60473e4cd239f8592f699aa5adaf10050e6e1823c"}, - {file = "python_dateutil-2.8.1-py2.py3-none-any.whl", hash = "sha256:75bb3f31ea686f1197762692a9ee6a7550b59fc6ca3a1f4b5d7e32fb98e2da2a"}, -] -python-dotenv = [ - {file = "python-dotenv-0.16.0.tar.gz", hash = "sha256:9fa413c37d4652d3fa02fea0ff465c384f5db75eab259c4fc5d0c5b8bf20edd4"}, - {file = "python_dotenv-0.16.0-py2.py3-none-any.whl", hash = "sha256:31d752f5b748f4e292448c9a0cac6a08ed5e6f4cefab85044462dcad56905cec"}, -] -pythx = [ +files = [ {file = "pythx-1.6.1-py2.py3-none-any.whl", hash = "sha256:44cb6c88f5213a3dd516e8322dbd17551fc7d435dc6290d3a6145333258d901f"}, {file = "pythx-1.6.1.tar.gz", hash = "sha256:7758a00125d5ba96d902bd2c79c1b1d10713a86479dc4f9ea7febc2337ff1eca"}, ] -pywin32 = [ - {file = "pywin32-304-cp310-cp310-win32.whl", hash = "sha256:3c7bacf5e24298c86314f03fa20e16558a4e4138fc34615d7de4070c23e65af3"}, - {file = "pywin32-304-cp310-cp310-win_amd64.whl", hash = "sha256:4f32145913a2447736dad62495199a8e280a77a0ca662daa2332acf849f0be48"}, - {file = "pywin32-304-cp310-cp310-win_arm64.whl", hash = "sha256:d3ee45adff48e0551d1aa60d2ec066fec006083b791f5c3527c40cd8aefac71f"}, - {file = "pywin32-304-cp311-cp311-win32.whl", hash = "sha256:30c53d6ce44c12a316a06c153ea74152d3b1342610f1b99d40ba2795e5af0269"}, - {file = "pywin32-304-cp311-cp311-win_amd64.whl", hash = "sha256:7ffa0c0fa4ae4077e8b8aa73800540ef8c24530057768c3ac57c609f99a14fd4"}, - {file = "pywin32-304-cp311-cp311-win_arm64.whl", hash = "sha256:cbbe34dad39bdbaa2889a424d28752f1b4971939b14b1bb48cbf0182a3bcfc43"}, - {file = "pywin32-304-cp36-cp36m-win32.whl", hash = "sha256:be253e7b14bc601718f014d2832e4c18a5b023cbe72db826da63df76b77507a1"}, - {file = "pywin32-304-cp36-cp36m-win_amd64.whl", hash = "sha256:de9827c23321dcf43d2f288f09f3b6d772fee11e809015bdae9e69fe13213988"}, - {file = "pywin32-304-cp37-cp37m-win32.whl", hash = "sha256:f64c0377cf01b61bd5e76c25e1480ca8ab3b73f0c4add50538d332afdf8f69c5"}, - {file = "pywin32-304-cp37-cp37m-win_amd64.whl", hash = "sha256:bb2ea2aa81e96eee6a6b79d87e1d1648d3f8b87f9a64499e0b92b30d141e76df"}, - {file = "pywin32-304-cp38-cp38-win32.whl", hash = "sha256:94037b5259701988954931333aafd39cf897e990852115656b014ce72e052e96"}, - {file = "pywin32-304-cp38-cp38-win_amd64.whl", hash = "sha256:ead865a2e179b30fb717831f73cf4373401fc62fbc3455a0889a7ddac848f83e"}, - {file = "pywin32-304-cp39-cp39-win32.whl", hash = "sha256:25746d841201fd9f96b648a248f731c1dec851c9a08b8e33da8b56148e4c65cc"}, - {file = "pywin32-304-cp39-cp39-win_amd64.whl", hash = "sha256:d24a3382f013b21aa24a5cfbfad5a2cd9926610c0affde3e8ab5b3d7dbcf4ac9"}, -] -PyYAML = [ + +[package.dependencies] +inflection = "0.5.0" +mythx-models = "1.9.1" +PyJWT = ">=1.7.0,<1.8.0" +python-dateutil = ">=2.8.0,<2.9.0" +requests = ">=2.0.0,<3.0.0" + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pyyaml" +version = "5.4.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ {file = "PyYAML-5.4.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:3b2b1824fe7112845700f815ff6a489360226a5609b96ec2190a45e62a9fc922"}, {file = "PyYAML-5.4.1-cp27-cp27m-win32.whl", hash = "sha256:129def1b7c1bf22faffd67b8f3724645203b79d8f4cc81f674654d9902cb4393"}, {file = "PyYAML-5.4.1-cp27-cp27m-win_amd64.whl", hash = "sha256:4465124ef1b18d9ace298060f4eccc64b0850899ac4ac53294547536533800c8"}, @@ -2087,77 +1825,312 @@ PyYAML = [ {file = "PyYAML-5.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:c20cfa2d49991c8b4147af39859b167664f2ad4561704ee74c1de03318e898db"}, {file = "PyYAML-5.4.1.tar.gz", hash = "sha256:607774cbba28732bfa802b54baa7484215f530991055bb562efbed5b2f20a45e"}, ] -requests = [ + +[[package]] +name = "requests" +version = "2.28.1" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7, <4" +files = [ {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, ] -rlp = [ + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<3" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<1.27" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rlp" +version = "2.0.1" +description = "A package for Recursive Length Prefix encoding and decoding" +optional = false +python-versions = "*" +files = [ {file = "rlp-2.0.1-py2.py3-none-any.whl", hash = "sha256:52a57c9f53f03c88b189283734b397314288250cc4a3c4113e9e36e2ac6bdd16"}, {file = "rlp-2.0.1.tar.gz", hash = "sha256:665e8312750b3fc5f7002e656d05b9dcb6e93b6063df40d95c49ad90c19d1f0e"}, ] -semantic-version = [ - {file = "semantic_version-2.8.5-py2.py3-none-any.whl", hash = "sha256:45e4b32ee9d6d70ba5f440ec8cc5221074c7f4b0e8918bdab748cc37912440a9"}, - {file = "semantic_version-2.8.5.tar.gz", hash = "sha256:d2cb2de0558762934679b9a104e82eca7af448c9f4974d1f3eeccff651df8a54"}, + +[package.dependencies] +eth-utils = ">=1.0.2,<2" + +[package.extras] +dev = ["Sphinx (>=1.6.5,<2)", "bumpversion (>=0.5.3,<1)", "flake8 (==3.4.1)", "hypothesis (==5.19.0)", "ipython", "pytest (==5.4.3)", "pytest-watch (>=4.1.0,<5)", "pytest-xdist", "setuptools (>=36.2.0)", "sphinx-rtd-theme (>=0.1.9)", "tox (>=2.9.1,<3)", "twine", "wheel"] +doc = ["Sphinx (>=1.6.5,<2)", "sphinx-rtd-theme (>=0.1.9)"] +lint = ["flake8 (==3.4.1)"] +rust-backend = ["rusty-rlp (>=0.1.15,<0.2)"] +test = ["hypothesis (==5.19.0)", "pytest (==5.4.3)", "tox (>=2.9.1,<3)"] + +[[package]] +name = "semantic-version" +version = "2.10.0" +description = "A library implementing the 'SemVer' scheme." +optional = false +python-versions = ">=2.7" +files = [ + {file = "semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177"}, + {file = "semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c"}, ] -setuptools = [ + +[package.extras] +dev = ["Django (>=1.11)", "check-manifest", "colorama (<=0.4.1)", "coverage", "flake8", "nose2", "readme-renderer (<25.0)", "tox", "wheel", "zest.releaser[recommended]"] +doc = ["Sphinx", "sphinx-rtd-theme"] + +[[package]] +name = "setuptools" +version = "63.4.3" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.7" +files = [ {file = "setuptools-63.4.3-py3-none-any.whl", hash = "sha256:7f61f7e82647f77d4118eeaf43d64cbcd4d87e38af9611694d4866eb070cd10d"}, {file = "setuptools-63.4.3.tar.gz", hash = "sha256:521c833d1e5e1ef0869940e7f486a83de7773b9f029010ad0c2fe35453a9dad9"}, ] -six = [ + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx", "sphinx-favicon", "sphinx-hoverxref (<2)", "sphinx-inline-tabs", "sphinx-notfound-page (==0.8.3)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8 (<5)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mock", "pip (>=19.1)", "pip-run (>=8.8)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=1.3)", "pytest-flake8", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv]", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, ] -slither-analyzer = [ + +[[package]] +name = "slither-analyzer" +version = "0.8.3" +description = "Slither is a Solidity static analysis framework written in Python 3." +optional = false +python-versions = ">=3.6" +files = [ {file = "slither_analyzer-0.8.3-py3-none-any.whl", hash = "sha256:6216a934e45a85d2d1a8831b14e5f36a98d56dec7ee4eaf9e59194133d346697"}, ] -sortedcontainers = [ + +[package.dependencies] +crytic-compile = ">=0.2.3" +prettytable = ">=0.7.2" +pysha3 = ">=1.0.2" + +[[package]] +name = "solc-select" +version = "1.0.4" +description = "Manage multiple Solidity compiler versions." +optional = false +python-versions = ">=3.6" +files = [ + {file = "solc-select-1.0.4.tar.gz", hash = "sha256:db7b9de009af6de3a5416b80bbe5b6d636bf314703c016319b8c1231e248a6c7"}, + {file = "solc_select-1.0.4-py3-none-any.whl", hash = "sha256:9a28b8a612ff18a171929d23e2ed68a6263f4e11784fc47fa81476a3219874cb"}, +] + +[package.dependencies] +packaging = "*" +pycryptodome = ">=3.4.6" + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +description = "Sorted Containers -- Sorted List, Sorted Dict, Sorted Set" +optional = false +python-versions = "*" +files = [ {file = "sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0"}, {file = "sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88"}, ] -toml = [ + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, ] -tomli = [ + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, ] -toolz = [ + +[[package]] +name = "toolz" +version = "0.12.0" +description = "List processing tools and functional utilities" +optional = false +python-versions = ">=3.5" +files = [ {file = "toolz-0.12.0-py3-none-any.whl", hash = "sha256:2059bd4148deb1884bb0eb770a3cde70e7f954cfbbdc2285f1f2de01fd21eb6f"}, {file = "toolz-0.12.0.tar.gz", hash = "sha256:88c570861c440ee3f2f6037c4654613228ff40c93a6c25e0eba70d17282c6194"}, ] -tqdm = [ - {file = "tqdm-4.64.0-py2.py3-none-any.whl", hash = "sha256:74a2cdefe14d11442cedf3ba4e21a3b84ff9a2dbdc6cfae2c34addb2a14a5ea6"}, - {file = "tqdm-4.64.0.tar.gz", hash = "sha256:40be55d30e200777a307a7585aee69e4eabb46b4ec6a4b4a5f2d9f11e7d5408d"}, + +[[package]] +name = "tqdm" +version = "4.64.1" +description = "Fast, Extensible Progress Meter" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" +files = [ + {file = "tqdm-4.64.1-py2.py3-none-any.whl", hash = "sha256:6fee160d6ffcd1b1c68c65f14c829c22832bc401726335ce92c52d395944a6a1"}, + {file = "tqdm-4.64.1.tar.gz", hash = "sha256:5f4f682a004951c1b450bc753c710e9280c5746ce6ffedee253ddbcbf54cf1e4"}, ] -typing-extensions = [ - {file = "typing_extensions-4.3.0-py3-none-any.whl", hash = "sha256:25642c956049920a5aa49edcdd6ab1e06d7e5d467fc00e0506c44ac86fbfca02"}, - {file = "typing_extensions-4.3.0.tar.gz", hash = "sha256:e6d2677a32f47fc7eb2795db1dd15c1f34eff616bcaf2cfb5e997f854fa1c4a6"}, + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[package.extras] +dev = ["py-make (>=0.1.0)", "twine", "wheel"] +notebook = ["ipywidgets (>=6)"] +slack = ["slack-sdk"] +telegram = ["requests"] + +[[package]] +name = "typing-extensions" +version = "4.4.0" +description = "Backported and Experimental Type Hints for Python 3.7+" +optional = false +python-versions = ">=3.7" +files = [ + {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, + {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, ] -urllib3 = [ - {file = "urllib3-1.26.11-py2.py3-none-any.whl", hash = "sha256:c33ccba33c819596124764c23a97d25f32b28433ba0dedeb77d873a38722c9bc"}, - {file = "urllib3-1.26.11.tar.gz", hash = "sha256:ea6e8fb210b19d950fab93b60c9009226c63a28808bc8386e05301e25883ac0a"}, + +[[package]] +name = "urllib3" +version = "1.26.12" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, <4" +files = [ + {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, + {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, ] -varint = [ + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)", "brotlipy (>=0.6.0)"] +secure = ["certifi", "cryptography (>=1.3.4)", "idna (>=2.0.0)", "ipaddress", "pyOpenSSL (>=0.14)", "urllib3-secure-extra"] +socks = ["PySocks (>=1.5.6,!=1.5.7,<2.0)"] + +[[package]] +name = "varint" +version = "1.0.2" +description = "Simple python varint implementation" +optional = false +python-versions = "*" +files = [ {file = "varint-1.0.2.tar.gz", hash = "sha256:a6ecc02377ac5ee9d65a6a8ad45c9ff1dac8ccee19400a5950fb51d594214ca5"}, ] -vvm = [ + +[[package]] +name = "vvm" +version = "0.1.0" +description = "Vyper version management tool" +optional = false +python-versions = ">=3.6, <4" +files = [ {file = "vvm-0.1.0-py3-none-any.whl", hash = "sha256:814c67bc8049d45ea8049bc26b04ce4065015f5a3e2896a1a2a2a44ab6e85edc"}, {file = "vvm-0.1.0.tar.gz", hash = "sha256:a1474915b12e0084299d2c7fe7d72434fa99c00ebb117e400756a5d7e0edac2a"}, ] -vyper = [ - {file = "vyper-0.3.6-py3-none-any.whl", hash = "sha256:d9d18e8eaed281b4f8b5545fa164215d08ed34c2977ec1cce624347707056909"}, - {file = "vyper-0.3.6.tar.gz", hash = "sha256:f23c3ddadb4a857b9bcc3af4b6df7f3a80ac3c4c81f723d1b2e78afa3e0f3ba6"}, + +[package.dependencies] +requests = ">=2.19.0,<3" +semantic-version = ">=2.8.1,<3" + +[[package]] +name = "vyper" +version = "0.3.7" +description = "Vyper: the Pythonic Programming Language for the EVM" +optional = false +python-versions = ">=3.7,<3.11" +files = [ + {file = "vyper-0.3.7-py3-none-any.whl", hash = "sha256:9432db96db9d685ce74423b2bf685b0bcefa7bec39589036cd52bb1635fc1800"}, + {file = "vyper-0.3.7.tar.gz", hash = "sha256:1874eff683b7034ac376547d566d29fd05780bcec9f875c3d9615a9efc82636a"}, ] -wcwidth = [ + +[package.dependencies] +asttokens = "2.0.5" +pycryptodome = ">=3.5.1,<4" +semantic-version = ">=2.10,<3" +wheel = "*" + +[package.extras] +dev = ["black (==21.9b0)", "click (<8.1.0)", "eth-tester[py-evm] (>=0.6.0b6,<0.7)", "flake8 (==3.9.2)", "flake8-bugbear (==20.1.4)", "flake8-use-fstring (==1.1)", "hypothesis[lark] (>=5.37.1,<6.0)", "ipython", "isort (==5.9.3)", "lark (==1.1.2)", "mypy (==0.910)", "pre-commit", "py-evm (>=0.5.0a3,<0.6)", "pyinstaller", "pytest (>=6.2.5,<7.0)", "pytest-cov (>=2.10,<3.0)", "pytest-instafail (>=0.4,<1.0)", "pytest-rerunfailures (>=10.2,<11)", "pytest-split (>=0.7.0,<1.0)", "pytest-xdist (>=2.5,<3.0)", "recommonmark", "sphinx (>=3.0,<4.0)", "sphinx-rtd-theme (>=0.5,<0.6)", "tox (>=3.15,<4.0)", "twine", "web3 (==5.27.0)"] +docs = ["recommonmark", "sphinx (>=3.0,<4.0)", "sphinx-rtd-theme (>=0.5,<0.6)"] +lint = ["black (==21.9b0)", "click (<8.1.0)", "flake8 (==3.9.2)", "flake8-bugbear (==20.1.4)", "flake8-use-fstring (==1.1)", "isort (==5.9.3)", "mypy (==0.910)"] +test = ["eth-tester[py-evm] (>=0.6.0b6,<0.7)", "hypothesis[lark] (>=5.37.1,<6.0)", "lark (==1.1.2)", "py-evm (>=0.5.0a3,<0.6)", "pytest (>=6.2.5,<7.0)", "pytest-cov (>=2.10,<3.0)", "pytest-instafail (>=0.4,<1.0)", "pytest-rerunfailures (>=10.2,<11)", "pytest-split (>=0.7.0,<1.0)", "pytest-xdist (>=2.5,<3.0)", "tox (>=3.15,<4.0)", "web3 (==5.27.0)"] + +[[package]] +name = "wcwidth" +version = "0.2.5" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ {file = "wcwidth-0.2.5-py2.py3-none-any.whl", hash = "sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784"}, {file = "wcwidth-0.2.5.tar.gz", hash = "sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83"}, ] -web3 = [ - {file = "web3-5.30.0-py3-none-any.whl", hash = "sha256:664fbb668522874a8bb15ec06c605f1e0c754bbc0d7a040ee47536c648b46af0"}, - {file = "web3-5.30.0.tar.gz", hash = "sha256:e141d90408fd9fe5156e2ef22884a160bef8bfd55e6cecd51181af3162ea84dd"}, + +[[package]] +name = "web3" +version = "5.31.3" +description = "Web3.py" +optional = false +python-versions = ">=3.6,<4" +files = [ + {file = "web3-5.31.3-py3-none-any.whl", hash = "sha256:39ad206db390ae1a9001522e300da66d766fa2f1bf2f15422f2fee29f97b81ef"}, + {file = "web3-5.31.3.tar.gz", hash = "sha256:4b2d420647c81856e3cf398996cd3cc80c719dc3a10881884c5c3b1467e4f850"}, ] -websockets = [ + +[package.dependencies] +aiohttp = ">=3.7.4.post0,<4" +eth-abi = ">=2.2.0,<3.0.0" +eth-account = ">=0.5.9,<0.6.0" +eth-hash = {version = ">=0.2.0,<1.0.0", extras = ["pycryptodome"]} +eth-rlp = "<0.3" +eth-typing = ">=2.0.0,<3.0.0" +eth-utils = ">=1.9.5,<2.0.0" +hexbytes = ">=0.1.0,<1.0.0" +ipfshttpclient = "0.8.0a2" +jsonschema = ">=3.2.0,<5" +lru-dict = ">=1.1.6,<2.0.0" +protobuf = "3.19.5" +pywin32 = {version = ">=223", markers = "platform_system == \"Windows\""} +requests = ">=2.16.0,<3.0.0" +websockets = ">=9.1,<10" + +[package.extras] +dev = ["Jinja2 (<=3.0.3)", "bumpversion", "click (>=5.1)", "configparser (==3.5.0)", "contextlib2 (>=0.5.4)", "eth-tester[py-evm] (==v0.6.0-beta.7)", "flake8 (==3.8.3)", "flaky (>=3.7.0,<4)", "hypothesis (>=3.31.2,<6)", "importlib-metadata (<5.0)", "isort (>=4.2.15,<4.3.5)", "mock", "mypy (==0.910)", "pluggy (==0.13.1)", "py-geth (>=3.9.1,<4)", "py-solc (>=0.4.0)", "pytest (>=4.4.0,<5.0.0)", "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)", "sphinx (>=3.0,<4)", "sphinx-better-theme (>=0.1.4)", "sphinx-rtd-theme (>=0.1.9)", "toposort (>=1.4)", "towncrier (==18.5.0)", "tox (>=1.8.0)", "tqdm (>4.32,<5)", "twine (>=1.13,<2)", "types-protobuf (==3.19.13)", "types-requests (>=2.26.1,<3)", "types-setuptools (>=57.4.4,<58)", "urllib3", "wheel", "when-changed (>=0.3.0,<0.4)"] +docs = ["Jinja2 (<=3.0.3)", "click (>=5.1)", "configparser (==3.5.0)", "contextlib2 (>=0.5.4)", "mock", "py-geth (>=3.9.1,<4)", "py-solc (>=0.4.0)", "pytest (>=4.4.0,<5.0.0)", "sphinx (>=3.0,<4)", "sphinx-better-theme (>=0.1.4)", "sphinx-rtd-theme (>=0.1.9)", "toposort (>=1.4)", "towncrier (==18.5.0)", "urllib3", "wheel"] +linter = ["flake8 (==3.8.3)", "isort (>=4.2.15,<4.3.5)", "mypy (==0.910)", "types-protobuf (==3.19.13)", "types-requests (>=2.26.1,<3)", "types-setuptools (>=57.4.4,<58)"] +tester = ["eth-tester[py-evm] (==v0.6.0-beta.7)", "py-geth (>=3.9.1,<4)"] + +[[package]] +name = "websockets" +version = "9.1" +description = "An implementation of the WebSocket Protocol (RFC 6455 & 7692)" +optional = false +python-versions = ">=3.6.1" +files = [ {file = "websockets-9.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d144b350045c53c8ff09aa1cfa955012dd32f00c7e0862c199edcabb1a8b32da"}, {file = "websockets-9.1-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:b4ad84b156cf50529b8ac5cc1638c2cf8680490e3fccb6121316c8c02620a2e4"}, {file = "websockets-9.1-cp36-cp36m-manylinux1_x86_64.whl", hash = "sha256:2cf04601633a4ec176b9cc3d3e73789c037641001dbfaf7c411f89cd3e04fcaf"}, @@ -2192,11 +2165,28 @@ websockets = [ {file = "websockets-9.1-cp39-cp39-win_amd64.whl", hash = "sha256:85db8090ba94e22d964498a47fdd933b8875a1add6ebc514c7ac8703eb97bbf0"}, {file = "websockets-9.1.tar.gz", hash = "sha256:276d2339ebf0df4f45df453923ebd2270b87900eda5dfd4a6b0cfa15f82111c3"}, ] -wheel = [ + +[[package]] +name = "wheel" +version = "0.37.1" +description = "A built-package format for Python" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ {file = "wheel-0.37.1-py2.py3-none-any.whl", hash = "sha256:4bdcd7d840138086126cd09254dc6195fb4fc6f01c050a1d7236f2630db1d22a"}, {file = "wheel-0.37.1.tar.gz", hash = "sha256:e9a504e793efbca1b8e0e9cb979a249cf4a0a7b5b8c9e8b65a5e39d49529c1c4"}, ] -wrapt = [ + +[package.extras] +test = ["pytest (>=3.0.0)", "pytest-cov"] + +[[package]] +name = "wrapt" +version = "1.14.1" +description = "Module for decorators, wrappers and monkey patching." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, @@ -2216,6 +2206,16 @@ wrapt = [ {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ecee4132c6cd2ce5308e21672015ddfed1ff975ad0ac8d27168ea82e71413f55"}, + {file = "wrapt-1.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2020f391008ef874c6d9e208b24f28e31bcb85ccff4f335f15a3251d222b92d9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2feecf86e1f7a86517cab34ae6c2f081fd2d0dac860cb0c0ded96d799d20b335"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:240b1686f38ae665d1b15475966fe0472f78e71b1b4903c143a842659c8e4cb9"}, + {file = "wrapt-1.14.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9008dad07d71f68487c91e96579c8567c98ca4c3881b9b113bc7b33e9fd78b8"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6447e9f3ba72f8e2b985a1da758767698efa72723d5b59accefd716e9e8272bf"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:acae32e13a4153809db37405f5eba5bac5fbe2e2ba61ab227926a22901051c0a"}, + {file = "wrapt-1.14.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:49ef582b7a1152ae2766557f0550a9fcbf7bbd76f43fbdc94dd3bf07cc7168be"}, + {file = "wrapt-1.14.1-cp311-cp311-win32.whl", hash = "sha256:358fe87cc899c6bb0ddc185bf3dbfa4ba646f05b1b0b9b5a27c2cb92c2cea204"}, + {file = "wrapt-1.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:26046cd03936ae745a502abf44dac702a5e6880b2b01c29aea8ddf3353b68224"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, @@ -2262,7 +2262,14 @@ wrapt = [ {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, ] -yarl = [ + +[[package]] +name = "yarl" +version = "1.8.1" +description = "Yet another URL library" +optional = false +python-versions = ">=3.7" +files = [ {file = "yarl-1.8.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:abc06b97407868ef38f3d172762f4069323de52f2b70d133d096a48d72215d28"}, {file = "yarl-1.8.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:07b21e274de4c637f3e3b7104694e53260b5fc10d51fb3ec5fed1da8e0f754e3"}, {file = "yarl-1.8.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9de955d98e02fab288c7718662afb33aab64212ecb368c5dc866d9a57bf48880"}, @@ -2323,3 +2330,12 @@ yarl = [ {file = "yarl-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:de49d77e968de6626ba7ef4472323f9d2e5a56c1d85b7c0e2a190b2173d3b9be"}, {file = "yarl-1.8.1.tar.gz", hash = "sha256:af887845b8c2e060eb5605ff72b6f2dd2aab7a761379373fd89d314f4752abbf"}, ] + +[package.dependencies] +idna = ">=2.0" +multidict = ">=4.0" + +[metadata] +lock-version = "2.0" +python-versions = ">=3.9,<3.11" +content-hash = "c853ec99ad116c15b89b620335c1d53ef7357e82267fc75f2523f27a105f5337" diff --git a/pyproject.toml b/pyproject.toml index c85af785..82bef47b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,7 @@ packages = [] setuptools = "^63.0.0" python = ">=3.9,<3.11" eth-abi = "^2.1.1" -eth-brownie = "^1.19.1" +eth-brownie = "1.19.3" [tool.poetry.group.dev.dependencies] slither-analyzer = "^0.8.3" diff --git a/scripts/acceptance_test_full_setup.py b/scripts/acceptance_test_full_setup.py index 1a754b88..4a1d56a0 100644 --- a/scripts/acceptance_test_full_setup.py +++ b/scripts/acceptance_test_full_setup.py @@ -1,39 +1,31 @@ from brownie import ( chain, network, + AllowedTokensRegistry, AllowedRecipientsRegistry, TopUpAllowedRecipients, AddAllowedRecipient, RemoveAllowedRecipient, ) -from utils.config import ( - get_network_name, -) from utils import lido, deployed_easy_track, log, deployment from hexbytes import HexBytes -ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE = ( - "0xec20c52871c824e5437859e75ac830e83aaaaeb7b0ffd850de830ddd3e385276" -) -REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE = ( - "0x491d7752c25cfca0f73715cde1130022a9b815373f91a996bbb1ba8943efc99b" -) -SET_PARAMETERS_ROLE = ( - "0x260b83d52a26066d8e9db550fa70395df5f3f064b50ff9d8a94267d9f1fe1967" -) -UPDATE_SPENT_AMOUNT_ROLE = ( - "0xc5260260446719a726d11a6faece21d19daa48b4cbcca118345832d4cb71df99" -) -DEFAULT_ADMIN_ROLE = ( - "0x0000000000000000000000000000000000000000000000000000000000000000" +from utils.test_helpers import ( + ADD_TOKEN_TO_ALLOWED_LIST_ROLE, + REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, + ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, + REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, + SET_PARAMETERS_ROLE, + UPDATE_SPENT_AMOUNT_ROLE, + DEFAULT_ADMIN_ROLE, ) GRANT_ROLE_EVENT = "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d" REVOKE_ROLE_EVENT = "0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b" deploy_config = deployment.AllowedRecipientsFullSetupDeployConfig( - token="", + tokens=[], limit=0, period=1, spent_amount=0, @@ -44,29 +36,52 @@ deployment_tx_hash = "" +recipients_registry_deploy_tx_hash = "" +tokens_registry_deploy_tx_hash = "" +top_up_allowed_recipients_deploy_tx_hash = "" +add_allowed_token_deploy_tx_hash = "" +remove_allowed_token_deploy_tx_hash = "" + def main(): network_name = network.show_active() - tx = chain.get_transaction(deployment_tx_hash) + recipients_registry_deploy_tx = chain.get_transaction( + recipients_registry_deploy_tx_hash or deployment_tx_hash + ) + tokens_registry_deploy_tx = chain.get_transaction( + tokens_registry_deploy_tx_hash or deployment_tx_hash + ) + top_up_deploy_tx = chain.get_transaction( + top_up_allowed_recipients_deploy_tx_hash or deployment_tx_hash + ) + add_allowed_token_deploy_tx = chain.get_transaction( + add_allowed_token_deploy_tx_hash or deployment_tx_hash + ) + remove_allowed_recipient_deploy_tx = chain.get_transaction( + remove_allowed_token_deploy_tx_hash or deployment_tx_hash + ) contracts = lido.contracts(network=network_name) et_contracts = deployed_easy_track.contracts(network=network_name) evm_script_executor = et_contracts.evm_script_executor - registry_address = tx.events["AllowedRecipientsRegistryDeployed"][ - "allowedRecipientsRegistry" - ] - top_up_address = tx.events["TopUpAllowedRecipientsDeployed"][ - "topUpAllowedRecipients" - ] - add_allowed_recipient_address = tx.events["AddAllowedRecipientDeployed"][ - "addAllowedRecipient" - ] - remove_allowed_recipient_address = tx.events["RemoveAllowedRecipientDeployed"][ - "removeAllowedRecipient" - ] + recipients_registry_address = recipients_registry_deploy_tx.events[ + "AllowedRecipientsRegistryDeployed" + ]["allowedRecipientsRegistry"] + tokens_registry_address = tokens_registry_deploy_tx.events[ + "AllowedTokensRegistryDeployed" + ]["allowedTokensRegistry"] + top_up_address = top_up_deploy_tx.events[ + "TopUpAllowedRecipientsDeployed" + ]["topUpAllowedRecipients"] + add_allowed_recipient_address = add_allowed_token_deploy_tx.events[ + "AddAllowedRecipientDeployed" + ]["addAllowedRecipient"] + remove_allowed_recipient_address = remove_allowed_recipient_deploy_tx.events[ + "RemoveAllowedRecipientDeployed" + ]["removeAllowedRecipient"] log.br() @@ -83,63 +98,103 @@ def main(): log.br() - log.nb("AllowedRecipientsRegistryDeployed", registry_address) + log.nb("AllowedRecipientsRegistryDeployed", recipients_registry_address) log.nb("TopUpAllowedRecipientsDeployed", top_up_address) log.nb("AddAllowedRecipientDeployed", add_allowed_recipient_address) log.nb("RemoveAllowedRecipientDeployed", remove_allowed_recipient_address) log.br() - registry = AllowedRecipientsRegistry.at(registry_address) + recipients_registry = AllowedRecipientsRegistry.at(recipients_registry_address) + tokens_registry = AllowedTokensRegistry.at(tokens_registry_address) top_up_allowed_recipients = TopUpAllowedRecipients.at(top_up_address) add_allowed_recipient = AddAllowedRecipient.at(add_allowed_recipient_address) remove_allowed_recipient = RemoveAllowedRecipient.at( remove_allowed_recipient_address ) - assert top_up_allowed_recipients.token() == deploy_config.token - assert top_up_allowed_recipients.allowedRecipientsRegistry() == registry + assert tokens_registry.getAllowedTokens() == deploy_config.tokens + assert len(tokens_registry.getAllowedTokens()) == len(deploy_config.tokens) + + assert top_up_allowed_recipients.allowedRecipientsRegistry() == recipients_registry assert top_up_allowed_recipients.trustedCaller() == deploy_config.trusted_caller - assert add_allowed_recipient.allowedRecipientsRegistry() == registry + assert add_allowed_recipient.allowedRecipientsRegistry() == recipients_registry assert add_allowed_recipient.trustedCaller() == deploy_config.trusted_caller - assert remove_allowed_recipient.allowedRecipientsRegistry() == registry + assert remove_allowed_recipient.allowedRecipientsRegistry() == recipients_registry assert remove_allowed_recipient.trustedCaller() == deploy_config.trusted_caller - assert len(registry.getAllowedRecipients()) == len(deploy_config.recipients) + assert len(recipients_registry.getAllowedRecipients()) == len( + deploy_config.recipients + ) for recipient in deploy_config.recipients: - assert registry.isRecipientAllowed(recipient) + assert recipients_registry.isRecipientAllowed(recipient) - registryLimit, registryPeriodDuration = registry.getLimitParameters() + registryLimit, registryPeriodDuration = recipients_registry.getLimitParameters() assert registryLimit == deploy_config.limit assert registryPeriodDuration == deploy_config.period assert ( - registry.spendableBalance() == deploy_config.limit - deploy_config.spent_amount + recipients_registry.spendableBalance() + == deploy_config.limit - deploy_config.spent_amount ) - assert registry.hasRole(ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, contracts.aragon.agent) - assert registry.hasRole( + assert recipients_registry.hasRole( + ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, contracts.aragon.agent + ) + assert recipients_registry.hasRole( REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, contracts.aragon.agent ) - assert registry.hasRole(SET_PARAMETERS_ROLE, contracts.aragon.agent) - assert registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, contracts.aragon.agent) - assert registry.hasRole(DEFAULT_ADMIN_ROLE, contracts.aragon.agent) + assert recipients_registry.hasRole(SET_PARAMETERS_ROLE, contracts.aragon.agent) + assert recipients_registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, contracts.aragon.agent) + assert recipients_registry.hasRole(DEFAULT_ADMIN_ROLE, contracts.aragon.agent) - assert registry.hasRole(ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, evm_script_executor) - assert registry.hasRole( + assert recipients_registry.hasRole( + ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, evm_script_executor + ) + assert recipients_registry.hasRole( REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, evm_script_executor ) - assert registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, evm_script_executor) - assert not registry.hasRole(SET_PARAMETERS_ROLE, evm_script_executor) - assert not registry.hasRole(DEFAULT_ADMIN_ROLE, evm_script_executor) + assert recipients_registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, evm_script_executor) + assert not recipients_registry.hasRole(SET_PARAMETERS_ROLE, evm_script_executor) + assert not recipients_registry.hasRole(DEFAULT_ADMIN_ROLE, evm_script_executor) + + assert not recipients_registry.hasRole( + ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, recipients_registry_address + ) + assert not recipients_registry.hasRole( + REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, recipients_registry_address + ) + assert not recipients_registry.hasRole( + SET_PARAMETERS_ROLE, recipients_registry_address + ) + assert not recipients_registry.hasRole( + UPDATE_SPENT_AMOUNT_ROLE, recipients_registry_address + ) + assert not recipients_registry.hasRole( + DEFAULT_ADMIN_ROLE, recipients_registry_address + ) + + for token in deploy_config.tokens: + assert tokens_registry.isTokenAllowed(token) + + assert tokens_registry.getAllowedTokens() == deploy_config.tokens + assert len(tokens_registry.getAllowedTokens()) == len(deploy_config.tokens) + + assert tokens_registry.hasRole(DEFAULT_ADMIN_ROLE, contracts.aragon.agent) + assert tokens_registry.hasRole( + ADD_TOKEN_TO_ALLOWED_LIST_ROLE, contracts.aragon.agent + ) + assert tokens_registry.hasRole( + REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, contracts.aragon.agent + ) - assert not registry.hasRole(ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, registry_address) - assert not registry.hasRole( - REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, registry_address + assert not tokens_registry.hasRole(DEFAULT_ADMIN_ROLE, tokens_registry_address) + assert not tokens_registry.hasRole( + ADD_TOKEN_TO_ALLOWED_LIST_ROLE, tokens_registry_address + ) + assert not tokens_registry.hasRole( + REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, tokens_registry_address ) - assert not registry.hasRole(SET_PARAMETERS_ROLE, registry_address) - assert not registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, registry_address) - assert not registry.hasRole(DEFAULT_ADMIN_ROLE, registry_address) registry_roles_holders = { ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE: [], @@ -147,10 +202,31 @@ def main(): SET_PARAMETERS_ROLE: [], UPDATE_SPENT_AMOUNT_ROLE: [], DEFAULT_ADMIN_ROLE: [], + ADD_TOKEN_TO_ALLOWED_LIST_ROLE: [], + REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE: [], } - for event in tx.logs: - # print(event["topics"][0]) + def log_to_key(log): + return log["address"] + + all_logs = ( + recipients_registry_deploy_tx.logs + + tokens_registry_deploy_tx.logs + + top_up_deploy_tx.logs + + add_allowed_token_deploy_tx.logs + + remove_allowed_recipient_deploy_tx.logs + ) + + unique_logs = [] + seen_keys = set() + + for l in all_logs: + key = log_to_key(l) + if key not in seen_keys: + unique_logs.append(l) + seen_keys.add(key) + + for event in all_logs: if event["topics"][0] == HexBytes(GRANT_ROLE_EVENT): registry_roles_holders[event["topics"][1].hex()].append( "0x" + event["topics"][2].hex()[26:] diff --git a/scripts/acceptance_test_single_setup.py b/scripts/acceptance_test_single_setup.py index 3c11e5c9..d4898fd3 100644 --- a/scripts/acceptance_test_single_setup.py +++ b/scripts/acceptance_test_single_setup.py @@ -1,59 +1,72 @@ -from brownie import chain, network, AllowedRecipientsRegistry, TopUpAllowedRecipients +from brownie import ( + chain, + network, + AllowedRecipientsRegistry, + TopUpAllowedRecipients, + AllowedTokensRegistry, +) from utils.config import ( get_network_name, ) +from utils.test_helpers import ( + ADD_TOKEN_TO_ALLOWED_LIST_ROLE, + REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, + ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, + REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, + SET_PARAMETERS_ROLE, + UPDATE_SPENT_AMOUNT_ROLE, + DEFAULT_ADMIN_ROLE, +) from utils import lido, deployed_easy_track, log, deployment from hexbytes import HexBytes -ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE = ( - "0xec20c52871c824e5437859e75ac830e83aaaaeb7b0ffd850de830ddd3e385276" -) -REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE = ( - "0x491d7752c25cfca0f73715cde1130022a9b815373f91a996bbb1ba8943efc99b" -) -SET_PARAMETERS_ROLE = ( - "0x260b83d52a26066d8e9db550fa70395df5f3f064b50ff9d8a94267d9f1fe1967" -) -UPDATE_SPENT_AMOUNT_ROLE = ( - "0xc5260260446719a726d11a6faece21d19daa48b4cbcca118345832d4cb71df99" -) -DEFAULT_ADMIN_ROLE = ( - "0x0000000000000000000000000000000000000000000000000000000000000000" -) - GRANT_ROLE_EVENT = "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d" REVOKE_ROLE_EVENT = "0xf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b" deploy_config = deployment.AllowedRecipientsSingleRecipientSetupDeployConfig( - period=0, + period=1, spent_amount=0, title="", limit=0, - token="", + tokens=[], trusted_caller="", ) deployment_tx_hash = "" +recipients_registry_deploy_tx_hash = "" +tokens_registry_deploy_tx_hash = "" +top_up_allowed_recipients_deploy_tx_hash = "" def main(): network_name = network.show_active() - tx = chain.get_transaction(deployment_tx_hash) + recipients_registry_deploy_tx = chain.get_transaction( + recipients_registry_deploy_tx_hash or deployment_tx_hash + ) + tokens_registry_deploy_tx = chain.get_transaction( + tokens_registry_deploy_tx_hash or deployment_tx_hash + ) + top_up_deploy_tx = chain.get_transaction( + top_up_allowed_recipients_deploy_tx_hash or deployment_tx_hash + ) contracts = lido.contracts(network=network_name) et_contracts = deployed_easy_track.contracts(network=network_name) evm_script_executor = et_contracts.evm_script_executor - registry_address = tx.events["AllowedRecipientsRegistryDeployed"][ - "allowedRecipientsRegistry" - ] - add_allowed_recipient_address = tx.events["TopUpAllowedRecipientsDeployed"][ - "topUpAllowedRecipients" - ] + recipients_registry_address = recipients_registry_deploy_tx.events[ + "AllowedRecipientsRegistryDeployed" + ]["allowedRecipientsRegistry"] + tokens_registry_address = tokens_registry_deploy_tx.events[ + "AllowedTokensRegistryDeployed" + ]["allowedTokensRegistry"] + top_up_allowed_recipient_address = top_up_deploy_tx.events[ + "TopUpAllowedRecipientsDeployed" + ]["topUpAllowedRecipients"] log.br() log.nb("tx of creation", deployment_tx_hash) @@ -61,7 +74,7 @@ def main(): log.br() log.nb("trusted_caller", deploy_config.trusted_caller) - log.nb("token", deploy_config.token) + log.nb("tokens", deploy_config.tokens) log.nb("limit", deploy_config.limit) log.nb("title", deploy_config.title) log.nb("period", deploy_config.period) @@ -69,52 +82,90 @@ def main(): log.br() - log.nb("AllowedRecipientsRegistryDeployed", registry_address) - log.nb("TopUpAllowedRecipientsDeployed", add_allowed_recipient_address) + log.nb("AllowedRecipientsRegistryDeployed", recipients_registry_address) + log.nb("AllowedTokensRegistryDeployed", tokens_registry_address) + log.nb("TopUpAllowedRecipientsDeployed", top_up_allowed_recipient_address) log.br() - registry = AllowedRecipientsRegistry.at(registry_address) - top_up_allowed_recipients = TopUpAllowedRecipients.at(add_allowed_recipient_address) + recipients_registry = AllowedRecipientsRegistry.at(recipients_registry_address) + top_up_allowed_recipients = TopUpAllowedRecipients.at( + top_up_allowed_recipient_address + ) + tokens_registry = AllowedTokensRegistry.at(tokens_registry_address) - assert top_up_allowed_recipients.token() == deploy_config.token - assert top_up_allowed_recipients.allowedRecipientsRegistry() == registry + assert top_up_allowed_recipients.allowedRecipientsRegistry() == recipients_registry assert top_up_allowed_recipients.trustedCaller() == deploy_config.trusted_caller - assert len(registry.getAllowedRecipients()) == 1 - assert registry.isRecipientAllowed(deploy_config.trusted_caller) + assert len(recipients_registry.getAllowedRecipients()) == 1 + assert recipients_registry.isRecipientAllowed(deploy_config.trusted_caller) - registryLimit, registryPeriodDuration = registry.getLimitParameters() + registryLimit, registryPeriodDuration = recipients_registry.getLimitParameters() assert registryLimit == deploy_config.limit assert registryPeriodDuration == deploy_config.period assert ( - registry.spendableBalance() == deploy_config.limit - deploy_config.spent_amount + recipients_registry.spendableBalance() + == deploy_config.limit - deploy_config.spent_amount ) - assert registry.hasRole(ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, contracts.aragon.agent) - assert registry.hasRole( + assert recipients_registry.hasRole( + ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, contracts.aragon.agent + ) + assert recipients_registry.hasRole( REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, contracts.aragon.agent ) - assert registry.hasRole(SET_PARAMETERS_ROLE, contracts.aragon.agent) - assert registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, contracts.aragon.agent) - assert registry.hasRole(DEFAULT_ADMIN_ROLE, contracts.aragon.agent) + assert recipients_registry.hasRole(SET_PARAMETERS_ROLE, contracts.aragon.agent) + assert recipients_registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, contracts.aragon.agent) + assert recipients_registry.hasRole(DEFAULT_ADMIN_ROLE, contracts.aragon.agent) - assert not registry.hasRole(ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, evm_script_executor) - assert not registry.hasRole( + assert not recipients_registry.hasRole( + ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, evm_script_executor + ) + assert not recipients_registry.hasRole( REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, evm_script_executor ) - assert registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, evm_script_executor) - assert not registry.hasRole(SET_PARAMETERS_ROLE, evm_script_executor) - assert not registry.hasRole(DEFAULT_ADMIN_ROLE, evm_script_executor) + assert recipients_registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, evm_script_executor) + assert not recipients_registry.hasRole(SET_PARAMETERS_ROLE, evm_script_executor) + assert not recipients_registry.hasRole(DEFAULT_ADMIN_ROLE, evm_script_executor) - assert not registry.hasRole(ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, registry_address) - assert not registry.hasRole( - REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, registry_address + assert not recipients_registry.hasRole( + ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, recipients_registry_address + ) + assert not recipients_registry.hasRole( + REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, recipients_registry_address + ) + assert not recipients_registry.hasRole( + SET_PARAMETERS_ROLE, recipients_registry_address + ) + assert not recipients_registry.hasRole( + UPDATE_SPENT_AMOUNT_ROLE, recipients_registry_address + ) + assert not recipients_registry.hasRole( + DEFAULT_ADMIN_ROLE, recipients_registry_address + ) + + for token in deploy_config.tokens: + assert tokens_registry.isTokenAllowed(token) + + assert tokens_registry.getAllowedTokens() == deploy_config.tokens + assert len(tokens_registry.getAllowedTokens()) == len(deploy_config.tokens) + + assert tokens_registry.hasRole(DEFAULT_ADMIN_ROLE, contracts.aragon.agent) + assert tokens_registry.hasRole( + ADD_TOKEN_TO_ALLOWED_LIST_ROLE, contracts.aragon.agent + ) + assert tokens_registry.hasRole( + REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, contracts.aragon.agent + ) + + assert not tokens_registry.hasRole(DEFAULT_ADMIN_ROLE, tokens_registry_address) + assert not tokens_registry.hasRole( + ADD_TOKEN_TO_ALLOWED_LIST_ROLE, tokens_registry_address + ) + assert not tokens_registry.hasRole( + REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, tokens_registry_address ) - assert not registry.hasRole(SET_PARAMETERS_ROLE, registry_address) - assert not registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, registry_address) - assert not registry.hasRole(DEFAULT_ADMIN_ROLE, registry_address) registry_roles_holders = { ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE: [], @@ -122,10 +173,29 @@ def main(): SET_PARAMETERS_ROLE: [], UPDATE_SPENT_AMOUNT_ROLE: [], DEFAULT_ADMIN_ROLE: [], + ADD_TOKEN_TO_ALLOWED_LIST_ROLE: [], + REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE: [], } - for event in tx.logs: - # print(event["topics"][0]) + def log_to_key(log): + return log["address"] + + all_logs = ( + recipients_registry_deploy_tx.logs + + tokens_registry_deploy_tx.logs + + top_up_deploy_tx.logs + ) + + unique_logs = [] + seen_keys = set() + + for l in all_logs: + key = log_to_key(l) + if key not in seen_keys: + unique_logs.append(l) + seen_keys.add(key) + + for event in all_logs: if event["topics"][0] == HexBytes(GRANT_ROLE_EVENT): registry_roles_holders[event["topics"][1].hex()].append( "0x" + event["topics"][2].hex()[26:] @@ -149,6 +219,14 @@ def main(): "REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE role holders", registry_roles_holders[REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE], ) + log.nb( + "ADD_TOKEN_TO_ALLOWED_LIST_ROLE role holders", + registry_roles_holders[ADD_TOKEN_TO_ALLOWED_LIST_ROLE], + ) + log.nb( + "REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE role holders", + registry_roles_holders[REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE], + ) log.nb( "SET_PARAMETERS_ROLE role holders", registry_roles_holders[SET_PARAMETERS_ROLE], diff --git a/scripts/create_full_recipients_setup.py b/scripts/create_full_recipients_setup.py index d205162a..eb6c2c87 100644 --- a/scripts/create_full_recipients_setup.py +++ b/scripts/create_full_recipients_setup.py @@ -16,13 +16,12 @@ from brownie import AllowedRecipientsBuilder deploy_config = deployment.AllowedRecipientsFullSetupDeployConfig( - token="", + tokens=[], limit=0, period=1, spent_amount=0, trusted_caller="", - titles=[ - ], + titles=[""], recipients=[], ) @@ -39,7 +38,7 @@ def main(): log.ok("chain id", chain.id) log.ok("Deployer", deployer) - log.ok("Token", deploy_config.token) + log.ok("Tokens", deploy_config.tokens) log.ok("Limit", deploy_config.limit) log.ok("Period", deploy_config.period) log.ok("Spent amount", deploy_config.spent_amount) @@ -59,9 +58,9 @@ def main(): tx = allowed_recipients_builder.deployFullSetup( deploy_config.trusted_caller, - deploy_config.token, deploy_config.limit, deploy_config.period, + deploy_config.tokens, deploy_config.recipients, deploy_config.titles, deploy_config.spent_amount, @@ -71,6 +70,9 @@ def main(): allowed_recipients_registry_address = tx.events[ "AllowedRecipientsRegistryDeployed" ]["allowedRecipientsRegistry"] + allowed_tokens_registry_address = tx.events[ + "AllowedTokensRegistryDeployed" + ]["allowedTokensRegistry"] top_up_allowed_recipients_address = tx.events["TopUpAllowedRecipientsDeployed"][ "topUpAllowedRecipients" ] @@ -83,6 +85,7 @@ def main(): log.ok("Allowed recipients easy track contracts have been deployed...") log.nb("Deployed AllowedRecipientsRegistry", allowed_recipients_registry_address) + log.nb("Deployed AllowedTokensRegistry", allowed_tokens_registry_address) log.nb("Deployed AddAllowedRecipient", add_allowed_recipient_address) log.nb("Deployed RemoveAllowedRecipient", remove_allowed_recipient_address) log.nb("Deployed TopUpAllowedRecipients", top_up_allowed_recipients_address) diff --git a/scripts/create_single_recipient_setup.py b/scripts/create_single_recipient_setup.py index 19db3b86..e45752f2 100644 --- a/scripts/create_single_recipient_setup.py +++ b/scripts/create_single_recipient_setup.py @@ -11,11 +11,11 @@ from brownie import AllowedRecipientsBuilder deploy_config = deployment.AllowedRecipientsSingleRecipientSetupDeployConfig( - period=0, + period=1, spent_amount=0, title="", limit=0, - token="", + tokens=[], trusted_caller="", ) @@ -32,7 +32,7 @@ def main(): log.ok("chain id", chain.id) log.ok("Deployer", deployer) - log.ok("Token", deploy_config.token) + log.ok("Tokens", deploy_config.tokens) log.ok("Title", deploy_config.title) log.ok("Trusted caller", deploy_config.trusted_caller) log.ok("Limit", deploy_config.limit) @@ -52,20 +52,22 @@ def main(): tx = allowed_recipients_builder.deploySingleRecipientTopUpOnlySetup( deploy_config.trusted_caller, deploy_config.title, - deploy_config.token, + deploy_config.tokens, deploy_config.limit, deploy_config.period, deploy_config.spent_amount, tx_params, ) - registryAddress = tx.events["AllowedRecipientsRegistryDeployed"][ + recipientsRegistryAddress = tx.events["AllowedRecipientsRegistryDeployed"][ "allowedRecipientsRegistry" ] + tokensRegistryAddress = tx.events['AllowedTokensRegistryDeployed']['allowedTokensRegistry'] topUpAddress = tx.events["TopUpAllowedRecipientsDeployed"]["topUpAllowedRecipients"] log.ok("Allowed recipients easy track contracts have been deployed...") - log.nb("Deployed AllowedRecipientsRegistryDeployed", registryAddress) + log.nb("Deployed AllowedRecipientsRegistryDeployed", recipientsRegistryAddress) + log.nb("Deployed AllowedTokensRegistryDeployed", tokensRegistryAddress) log.nb("Deployed TopUpAllowedRecipientsDeployed", topUpAddress) log.br() diff --git a/scripts/verify_simple_dvt_factories.sh b/scripts/verify_simple_dvt_factories.sh new file mode 100755 index 00000000..6b088fe6 --- /dev/null +++ b/scripts/verify_simple_dvt_factories.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +set -o errexit +set -o nounset +set -o pipefail + +RED='\033[0;31m' +ORANGE='\033[0;33m' +GREEN='\033[0;32m' +NC='\033[0m' + +if [[ "${TRACE-0}" == "1" ]]; then + set -o xtrace +fi + +envs=(REMOTE_RPC ETHERSCAN_TOKEN) + +local_rpc_port=7776 + +_err() { + local message=$1 + + echo -e "${RED}Error:${NC} $message, aborting." >&2 + exit 1 +} + +for e in "${envs[@]}"; do + [[ "${!e:+isset}" == "isset" ]] || { _err "${e} env var is required but is not set"; } +done + +function start_fork() { + local_fork_command=$( + cat <<-_EOF_ | xargs | sed 's/ / /g' + yarn ganache --chain.vmErrorsOnRPCResponse true + --wallet.totalAccounts 10 --chain.chainId 1 + --fork.url ${REMOTE_RPC} + --miner.blockGasLimit 92000000 + --server.host 127.0.0.1 --server.port ${local_rpc_port} + --hardfork istanbul -d +_EOF_ + ) + + echo "Starting local fork \"${local_fork_command}\"" + (nc -vz 127.0.0.1 $local_rpc_port) &>/dev/null && kill -SIGTERM "$(lsof -t -i:$local_rpc_port)" + + $local_fork_command 1>>./logs 2>&1 & + fork_pid=$$ + echo "Ganache pid $fork_pid" + + sleep 10 +} + +start_fork + +echo "==========================================================" +./bytecode-verificator/bytecode_verificator.sh --solc-version 0.8.6 --remote-rpc-url $REMOTE_RPC --config-json ../deployed-mainnet.json --contract AllowedRecipientsBuilder --etherscan-api-url https://api.etherscan.io/api --local-ganache +echo "==========================================================" +./bytecode-verificator/bytecode_verificator.sh --solc-version 0.8.6 --remote-rpc-url $REMOTE_RPC --config-json ../deployed-mainnet.json --contract AllowedRecipientsFactory --etherscan-api-url https://api.etherscan.io/api --skip-compilation --local-ganache \ No newline at end of file diff --git a/tests/conftest.py b/tests/conftest.py index 270a4f8c..b1b85f45 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -3,11 +3,11 @@ import pytest import brownie -from brownie import chain +from brownie import chain import constants from utils.evm_script import encode_call_script, encode_calldata -from utils.lido import contracts +from utils.lido import contracts, external_contracts from utils.config import get_network_name from utils import test_helpers, deployed_date_time @@ -126,7 +126,9 @@ def evm_script_executor(owner, easy_track, calls_script, EVMScriptExecutor): @pytest.fixture(scope="module") -def reward_programs_registry(owner, voting, evm_script_executor_stub, RewardProgramsRegistry): +def reward_programs_registry( + owner, voting, evm_script_executor_stub, RewardProgramsRegistry +): return owner.deploy( RewardProgramsRegistry, voting, @@ -158,8 +160,12 @@ def remove_reward_program(owner, reward_programs_registry, RemoveRewardProgram): @pytest.fixture(scope="module") -def top_up_reward_programs(owner, finance, ldo, reward_programs_registry, TopUpRewardPrograms): - return owner.deploy(TopUpRewardPrograms, owner, reward_programs_registry, finance, ldo) +def top_up_reward_programs( + owner, finance, ldo, reward_programs_registry, TopUpRewardPrograms +): + return owner.deploy( + TopUpRewardPrograms, owner, reward_programs_registry, finance, ldo + ) @pytest.fixture(scope="module") @@ -174,7 +180,9 @@ def add_allowed_recipients(owner, allowed_recipients_registry, AddAllowedRecipie @pytest.fixture(scope="module") -def remove_allowed_recipients(owner, allowed_recipients_registry, RemoveAllowedRecipient): +def remove_allowed_recipients( + owner, allowed_recipients_registry, RemoveAllowedRecipient +): (registry, _, _, _, _, _) = allowed_recipients_registry return owner.deploy(RemoveAllowedRecipient, owner, registry) @@ -271,21 +279,42 @@ def allowed_recipients_registry( ) +@pytest.fixture(scope="module") +def allowed_tokens_registry(AllowedTokensRegistry, owner, accounts): + add_token_role_holder = accounts[6] + remove_token_role_holder = accounts[7] + + registry = owner.deploy( + AllowedTokensRegistry, + owner, + [add_token_role_holder], + [remove_token_role_holder], + ) + + return (registry, owner, add_token_role_holder, remove_token_role_holder) + + @pytest.fixture(scope="module") def top_up_allowed_recipients( allowed_recipients_registry, + allowed_tokens_registry, accounts, finance, - ldo, easy_track, TopUpAllowedRecipients, ): - (registry, owner, _, _, _, _) = allowed_recipients_registry + (recipients_registry, owner, _, _, _, _) = allowed_recipients_registry + (tokens_registry, _, _, _) = allowed_tokens_registry trusted_caller = accounts[4] top_up_factory = owner.deploy( - TopUpAllowedRecipients, trusted_caller, registry, finance, ldo, easy_track + TopUpAllowedRecipients, + trusted_caller, + recipients_registry, + tokens_registry, + finance, + easy_track, ) return top_up_factory @@ -306,6 +335,15 @@ def steth(lido_contracts): return lido_contracts.steth +@pytest.fixture(scope="module") +def usdc(): + return external_contracts(network=brownie.network.show_active())["usdc"] + +@pytest.fixture(scope="module") +def dai(): + return external_contracts(network=brownie.network.show_active())["dai"] + + @pytest.fixture(scope="module") def node_operators_registry(lido_contracts): return lido_contracts.node_operators_registry diff --git a/tests/evm_script_factories/test_top_up_allowed_recipients.py b/tests/evm_script_factories/test_top_up_allowed_recipients.py index ea82c285..97fa75c8 100644 --- a/tests/evm_script_factories/test_top_up_allowed_recipients.py +++ b/tests/evm_script_factories/test_top_up_allowed_recipients.py @@ -5,28 +5,35 @@ from utils.evm_script import encode_calldata, encode_call_script -def make_call_data(recipients, amounts): - return encode_calldata("(address[],uint256[])", [recipients, amounts]) + +def make_call_data(token, recipients, amounts): + return encode_calldata("(address,address[],uint256[])", [token, recipients, amounts]) def test_top_up_factory_initial_state( allowed_recipients_registry, + allowed_tokens_registry, accounts, finance, - ldo, easy_track, TopUpAllowedRecipients, ): - (registry, owner, _, _, _, _) = allowed_recipients_registry + (recipients_registry, owner, _, _, _, _) = allowed_recipients_registry + (tokens_registry, _, _, _) = allowed_tokens_registry trusted_caller = accounts[4] top_up_factory = owner.deploy( - TopUpAllowedRecipients, trusted_caller, registry, finance, ldo, easy_track + TopUpAllowedRecipients, + trusted_caller, + recipients_registry, + tokens_registry, + finance, + easy_track, ) - assert top_up_factory.token() == ldo - assert top_up_factory.allowedRecipientsRegistry() == registry + assert top_up_factory.allowedRecipientsRegistry() == recipients_registry + assert top_up_factory.allowedTokensRegistry() == tokens_registry assert top_up_factory.trustedCaller() == trusted_caller assert top_up_factory.easyTrack() == easy_track assert top_up_factory.finance() == finance @@ -34,18 +41,23 @@ def test_top_up_factory_initial_state( def test_fail_if_zero_trusted_caller( allowed_recipients_registry, + allowed_tokens_registry, finance, - ldo, easy_track, TopUpAllowedRecipients, ): (registry, owner, _, _, _, _) = allowed_recipients_registry + (tokens_registry, _, _, _) = allowed_tokens_registry with reverts("TRUSTED_CALLER_IS_ZERO_ADDRESS"): - owner.deploy(TopUpAllowedRecipients, ZERO_ADDRESS, registry, finance, ldo, easy_track) + owner.deploy( + TopUpAllowedRecipients, ZERO_ADDRESS, registry, tokens_registry, finance, easy_track + ) -def test_top_up_factory_constructor_zero_argument_addresses_allowed(TopUpAllowedRecipients, owner): +def test_top_up_factory_constructor_zero_argument_addresses_allowed( + TopUpAllowedRecipients, owner +): """Check no revert""" trusted_caller = accounts[4] owner.deploy( @@ -58,56 +70,67 @@ def test_top_up_factory_constructor_zero_argument_addresses_allowed(TopUpAllowed ) -def test_fail_create_evm_script_if_not_trusted_caller(top_up_allowed_recipients, stranger): +def test_fail_create_evm_script_if_not_trusted_caller( + top_up_allowed_recipients, stranger +): with reverts("CALLER_IS_FORBIDDEN"): - top_up_allowed_recipients.createEVMScript(stranger, make_call_data([], [])) + top_up_allowed_recipients.createEVMScript(stranger, make_call_data(ZERO_ADDRESS, [], [])) def test_create_evm_script_is_permissionless( - allowed_recipients_registry, stranger, top_up_allowed_recipients + allowed_recipients_registry, allowed_tokens_registry, stranger, top_up_allowed_recipients, ldo ): ( registry, - owner, + _, add_recipient_role_holder, _, set_limit_role_holder, _, ) = allowed_recipients_registry - registry.addRecipient(stranger.address, "Test Recipient", {"from": add_recipient_role_holder}) + (token_registry, _, add_token_role_holder, _) = allowed_tokens_registry + token_registry.addToken(ldo, {"from": add_token_role_holder}) + registry.addRecipient( + stranger.address, "Test Recipient", {"from": add_recipient_role_holder} + ) registry.setLimitParameters(int(100e18), 12, {"from": set_limit_role_holder}) - call_data = make_call_data([stranger.address], [123]) + call_data = make_call_data(ldo.address, [stranger.address], [123]) trusted_caller = top_up_allowed_recipients.trustedCaller() - top_up_allowed_recipients.createEVMScript(trusted_caller, call_data, {"from": stranger}) + top_up_allowed_recipients.createEVMScript( + trusted_caller, call_data, {"from": stranger} + ) -def test_decode_evm_script_calldata_is_permissionless(stranger, top_up_allowed_recipients): - call_data = make_call_data([stranger.address], [123]) +def test_decode_evm_script_calldata_is_permissionless( + stranger, top_up_allowed_recipients, ldo +): + call_data = make_call_data(ldo.address, [stranger.address], [123]) top_up_allowed_recipients.decodeEVMScriptCallData(call_data, {"from": stranger}) -def test_fail_create_evm_script_if_length_mismatch(top_up_allowed_recipients, accounts): +def test_fail_create_evm_script_if_length_mismatch(top_up_allowed_recipients, accounts, ldo): factory = top_up_allowed_recipients trusted_caller = top_up_allowed_recipients.trustedCaller() recipient = accounts[2].address with reverts("LENGTH_MISMATCH"): - factory.createEVMScript(trusted_caller, make_call_data([recipient], [])) + factory.createEVMScript(trusted_caller, make_call_data(ldo.address, [recipient], [])) with reverts("LENGTH_MISMATCH"): - factory.createEVMScript(trusted_caller, make_call_data([], [123])) + factory.createEVMScript(trusted_caller, make_call_data(ldo.address, [], [123])) -def test_fail_create_evm_script_if_empty_data(top_up_allowed_recipients, accounts): +def test_fail_create_evm_script_if_empty_data(top_up_allowed_recipients): factory = top_up_allowed_recipients trusted_caller = top_up_allowed_recipients.trustedCaller() with reverts("EMPTY_DATA"): - factory.createEVMScript(trusted_caller, make_call_data([], [])) + factory.createEVMScript(trusted_caller, make_call_data(ZERO_ADDRESS, [], [])) def test_fail_create_evm_script_if_zero_amount( allowed_recipients_registry, + allowed_tokens_registry, TopUpAllowedRecipients, owner, finance, @@ -125,25 +148,32 @@ def test_fail_create_evm_script_if_zero_amount( set_limit_role_holder, _, ) = allowed_recipients_registry + (tokens_registry, _, add_token_role_holder, _) = allowed_tokens_registry + - registry.addRecipient(recipient, "Test Recipient", {"from": add_recipient_role_holder}) + registry.addRecipient( + recipient, "Test Recipient", {"from": add_recipient_role_holder} + ) registry.setLimitParameters(int(100e18), 12, {"from": set_limit_role_holder}) top_up_factory = owner.deploy( - TopUpAllowedRecipients, trusted_caller, registry, finance, ldo, easy_track + TopUpAllowedRecipients, trusted_caller, registry, tokens_registry, finance, easy_track ) + tokens_registry.addToken(ldo, {"from": add_token_role_holder}) + with reverts("ZERO_AMOUNT"): - top_up_factory.createEVMScript(trusted_caller, make_call_data([recipient], [0])) + top_up_factory.createEVMScript(trusted_caller, make_call_data(ldo.address, [recipient], [0])) with reverts("ZERO_AMOUNT"): top_up_factory.createEVMScript( - trusted_caller, make_call_data([recipient, recipient], [123, 0]) + trusted_caller, make_call_data(ldo.address, [recipient, recipient], [123, 0]) ) def test_fail_create_evm_script_if_recipient_not_allowed( allowed_recipients_registry, + allowed_tokens_registry, TopUpAllowedRecipients, owner, finance, @@ -162,20 +192,104 @@ def test_fail_create_evm_script_if_recipient_not_allowed( set_limit_role_holder, _, ) = allowed_recipients_registry + (tokens_registry, _, add_token_role_holder, _) = allowed_tokens_registry - registry.addRecipient(recipient, "Test Recipient", {"from": add_recipient_role_holder}) + registry.addRecipient( + recipient, "Test Recipient", {"from": add_recipient_role_holder} + ) registry.setLimitParameters(int(100e18), 12, {"from": set_limit_role_holder}) top_up_factory = owner.deploy( - TopUpAllowedRecipients, trusted_caller, registry, finance, ldo, easy_track + TopUpAllowedRecipients, trusted_caller, registry, tokens_registry, finance, easy_track ) + tokens_registry.addToken(ldo, {"from": add_token_role_holder}) + with reverts("RECIPIENT_NOT_ALLOWED"): - top_up_factory.createEVMScript(trusted_caller, make_call_data([stranger.address], [123])) + top_up_factory.createEVMScript( + trusted_caller, make_call_data(ldo.address, [stranger.address], [123]) + ) + + +def test_fail_create_evm_script_if_recipient_is_zero( + allowed_recipients_registry, + allowed_tokens_registry, + TopUpAllowedRecipients, + owner, + finance, + ldo, + easy_track, +): + trusted_caller = owner + recipient = ZERO_ADDRESS + + ( + registry, + owner, + add_recipient_role_holder, + _, + set_limit_role_holder, + _, + ) = allowed_recipients_registry + (tokens_registry, _, add_token_role_holder, _) = allowed_tokens_registry + + + registry.addRecipient( + recipient, "Test Recipient", {"from": add_recipient_role_holder} + ) + registry.setLimitParameters(int(100e18), 12, {"from": set_limit_role_holder}) + tokens_registry.addToken(ldo, {"from": add_token_role_holder}) + + top_up_factory = owner.deploy( + TopUpAllowedRecipients, trusted_caller, registry, tokens_registry, finance, easy_track + ) + + with reverts("ZERO_RECIPIENT"): + top_up_factory.createEVMScript( + trusted_caller, make_call_data(ldo.address, [recipient], [123]) + ) + + +def test_fail_create_evm_script_if_token_not_allowed( + allowed_recipients_registry, + allowed_tokens_registry, + TopUpAllowedRecipients, + owner, + finance, + ldo, + easy_track, +): + trusted_caller = owner + recipient = accounts[4].address + + ( + registry, + owner, + add_recipient_role_holder, + _, + set_limit_role_holder, + _, + ) = allowed_recipients_registry + (tokens_registry, _, _, _) = allowed_tokens_registry + + registry.addRecipient( + recipient, "Test Recipient", {"from": add_recipient_role_holder} + ) + registry.setLimitParameters(int(100e18), 12, {"from": set_limit_role_holder}) + + top_up_factory = owner.deploy( + TopUpAllowedRecipients, trusted_caller, registry, tokens_registry, finance, easy_track + ) + + with reverts("TOKEN_NOT_ALLOWED"): + top_up_factory.createEVMScript( + trusted_caller, make_call_data(ldo.address, [recipient], [123]) + ) def test_top_up_factory_evm_script_creation_happy_path( allowed_recipients_registry, + allowed_tokens_registry, TopUpAllowedRecipients, owner, finance, @@ -193,23 +307,29 @@ def test_top_up_factory_evm_script_creation_happy_path( set_limit_role_holder, _, ) = allowed_recipients_registry + (tokens_registry, _, add_token_role_holder, _) = allowed_tokens_registry - registry.addRecipient(recipient, "Test Recipient", {"from": add_recipient_role_holder}) + registry.addRecipient( + recipient, "Test Recipient", {"from": add_recipient_role_holder} + ) registry.setLimitParameters(int(100e18), 12, {"from": set_limit_role_holder}) top_up_factory = owner.deploy( - TopUpAllowedRecipients, trusted_caller, registry, finance, ldo, easy_track + TopUpAllowedRecipients, trusted_caller, registry, tokens_registry, finance, easy_track ) + tokens_registry.addToken(ldo, {"from": add_token_role_holder}) + payout = int(1e18) - call_data = make_call_data([recipient], [payout]) + call_data = make_call_data(ldo.address, [recipient], [payout]) evm_script = top_up_factory.createEVMScript(trusted_caller, call_data) - assert top_up_factory.decodeEVMScriptCallData(call_data) == ([recipient], [payout]) + assert top_up_factory.decodeEVMScriptCallData(call_data) == (ldo.address, [recipient], [payout]) assert "Easy Track: top up recipient".encode("utf-8").hex() in str(evm_script) def test_top_up_factory_evm_script_creation_multiple_recipients_happy_path( allowed_recipients_registry, + allowed_tokens_registry, TopUpAllowedRecipients, owner, finance, @@ -227,33 +347,40 @@ def test_top_up_factory_evm_script_creation_multiple_recipients_happy_path( set_limit_role_holder, _, ) = allowed_recipients_registry + (tokens_registry, _, add_token_role_holder, _) = allowed_tokens_registry - registry.addRecipient(recipients[0], "Test Recipient 1", {"from": add_recipient_role_holder}) - registry.addRecipient(recipients[1], "Test Recipient 2", {"from": add_recipient_role_holder}) + registry.addRecipient( + recipients[0], "Test Recipient 1", {"from": add_recipient_role_holder} + ) + registry.addRecipient( + recipients[1], "Test Recipient 2", {"from": add_recipient_role_holder} + ) registry.setLimitParameters(int(100e18), 12, {"from": set_limit_role_holder}) top_up_factory = owner.deploy( - TopUpAllowedRecipients, trusted_caller, registry, finance, ldo, easy_track + TopUpAllowedRecipients, trusted_caller, registry, tokens_registry, finance, easy_track ) + tokens_registry.addToken(ldo, {"from": add_token_role_holder}) + payouts = [int(1e18), int(2e18)] - call_data = make_call_data(recipients, payouts) + call_data = make_call_data(ldo.address, recipients, payouts) evm_script = top_up_factory.createEVMScript(trusted_caller, call_data) - assert top_up_factory.decodeEVMScriptCallData(call_data) == (recipients, payouts) + assert top_up_factory.decodeEVMScriptCallData(call_data) == (ldo.address, recipients, payouts) assert "Easy Track: top up recipient".encode("utf-8").hex() in str(evm_script) def test_fail_create_evm_script_if_sum_exceeds_limit( allowed_recipients_registry, + allowed_tokens_registry, TopUpAllowedRecipients, owner, finance, ldo, - easy_track,): - + usdc, + easy_track, +): recipients = [accounts[4].address, accounts[5].address] - payouts = [int(10e18), int(20e18)] - call_data = make_call_data(recipients, payouts) ( registry, @@ -263,27 +390,43 @@ def test_fail_create_evm_script_if_sum_exceeds_limit( set_limit_role_holder, _, ) = allowed_recipients_registry + (tokens_registry, _, add_token_role_holder, _) = allowed_tokens_registry - registry.addRecipient(recipients[0], "Test Recipient 1", {"from": add_recipient_role_holder}) - registry.addRecipient(recipients[1], "Test Recipient 2", {"from": add_recipient_role_holder}) + registry.addRecipient( + recipients[0], "Test Recipient 1", {"from": add_recipient_role_holder} + ) + registry.addRecipient( + recipients[1], "Test Recipient 2", {"from": add_recipient_role_holder} + ) registry.setLimitParameters(int(20e18), 12, {"from": set_limit_role_holder}) top_up_factory = owner.deploy( - TopUpAllowedRecipients, owner, registry, finance, ldo, easy_track + TopUpAllowedRecipients, owner, registry, tokens_registry, finance, easy_track ) + tokens_registry.addToken(ldo, {"from": add_token_role_holder}) + tokens_registry.addToken(usdc, {"from": add_token_role_holder}) + + payouts = [int(10e18), int(20e18)] + call_data = make_call_data(ldo.address, recipients, payouts) + with reverts("SUM_EXCEEDS_SPENDABLE_BALANCE"): + top_up_factory.createEVMScript(owner, call_data) + + payouts = [int(10e6), int(20e6)] + call_data = make_call_data(usdc, recipients, payouts) with reverts("SUM_EXCEEDS_SPENDABLE_BALANCE"): top_up_factory.createEVMScript(owner, call_data) def test_create_evm_script_correctly( allowed_recipients_registry, + allowed_tokens_registry, TopUpAllowedRecipients, owner, finance, ldo, - easy_track,): - + easy_track, +): recipients = [accounts[4].address, accounts[5].address] payouts = [int(1e18), int(2e18)] totalAmount = int(3e18) @@ -296,24 +439,29 @@ def test_create_evm_script_correctly( set_limit_role_holder, _, ) = allowed_recipients_registry + (tokens_registry, _, add_token_role_holder, _) = allowed_tokens_registry - registry.addRecipient(recipients[0], "Test Recipient 1", {"from": add_recipient_role_holder}) - registry.addRecipient(recipients[1], "Test Recipient 2", {"from": add_recipient_role_holder}) + registry.addRecipient( + recipients[0], "Test Recipient 1", {"from": add_recipient_role_holder} + ) + registry.addRecipient( + recipients[1], "Test Recipient 2", {"from": add_recipient_role_holder} + ) registry.setLimitParameters(int(100e18), 12, {"from": set_limit_role_holder}) top_up_factory = owner.deploy( - TopUpAllowedRecipients, owner, registry, finance, ldo, easy_track + TopUpAllowedRecipients, owner, registry, tokens_registry, finance, easy_track ) - call_data = make_call_data(recipients,payouts) + tokens_registry.addToken(ldo, {"from": add_token_role_holder}) + + call_data = make_call_data(ldo.address, recipients, payouts) evm_script = top_up_factory.createEVMScript(owner, call_data) expected_evm_script = encode_call_script( [ ( registry.address, - registry.updateSpentAmount.encode_input( - totalAmount - ), + registry.updateSpentAmount.encode_input(totalAmount), ), ( finance.address, @@ -326,16 +474,20 @@ def test_create_evm_script_correctly( finance.newImmediatePayment.encode_input( ldo, recipients[1], payouts[1], "Easy Track: top up recipient" ), - ) + ), ] ) assert evm_script == expected_evm_script -def test_decode_evm_script_call_data(top_up_allowed_recipients, accounts): +def test_decode_evm_script_call_data(top_up_allowed_recipients, ldo, accounts): recipient = accounts[4].address payout = int(1e18) - call_data = make_call_data([recipient], [payout]) + call_data = make_call_data(ldo.address, [recipient], [payout]) - assert top_up_allowed_recipients.decodeEVMScriptCallData(call_data) == [[recipient], [payout]] + assert top_up_allowed_recipients.decodeEVMScriptCallData(call_data) == [ + ldo.address, + [recipient], + [payout], + ] diff --git a/tests/integration/conftest.py b/tests/integration/conftest.py index e5373140..e3672ec1 100644 --- a/tests/integration/conftest.py +++ b/tests/integration/conftest.py @@ -65,6 +65,7 @@ def deployed_contracts(): "AllowedRecipientsFactory": "", "AllowedRecipientsBuilder": "", "AllowedRecipientsRegistry": "", + "AllowedTokensRegistry": "", "AddAllowedRecipient": "", "RemoveAllowedRecipient": "", "TopUpAllowedRecipients": "", @@ -94,6 +95,9 @@ def _load_deployed_contract(contract_name): def lido_contracts(): return lido.contracts(network=brownie.network.show_active()) +@pytest.fixture(scope="module") +def external_contracts(): + return lido.external_contracts(network=brownie.network.show_active()) @pytest.fixture(scope="module") def easy_track( @@ -180,10 +184,11 @@ def add_allowed_recipient_evm_script_factory( trusted_caller, load_deployed_contract, allowed_recipients_builder, - allowed_recipients_registry, + registries, deployer, ): + (allowed_recipients_registry, _) = registries evm_script_factory = load_deployed_contract("AddAllowedRecipient") if evm_script_factory is None: @@ -214,11 +219,12 @@ def remove_allowed_recipient_evm_script_factory( lido_contracts, load_deployed_contract, allowed_recipients_builder, - allowed_recipients_registry, + registries, deployer, trusted_caller, ): evm_script_factory = load_deployed_contract("RemoveAllowedRecipient") + (allowed_recipients_registry, _) = registries if evm_script_factory is None: tx = allowed_recipients_builder.deployRemoveAllowedRecipient( @@ -312,18 +318,18 @@ def top_up_allowed_recipients_evm_script_factory( lido_contracts, load_deployed_contract, allowed_recipients_builder, - allowed_recipients_registry, + registries, trusted_caller, deployer, ): - + (allowed_recipients_registry, allowed_tokens_registry) = registries evm_script_factory = load_deployed_contract("TopUpAllowedRecipients") if evm_script_factory is None: tx = allowed_recipients_builder.deployTopUpAllowedRecipients( trusted_caller, allowed_recipients_registry, - lido_contracts.ldo, + allowed_tokens_registry, {"from": deployer}, ) @@ -374,13 +380,14 @@ def _create_add_allowed_recipient_motion( def create_top_up_allowed_recipients_motion(easy_track): def _create_top_up_allowed_recipients_motion( top_up_allowed_recipients_evm_script_factory, + token, recipient_addresses, top_up_amounts, ): return easy_track.createMotion( top_up_allowed_recipients_evm_script_factory, evm_script.encode_calldata( - "(address[],uint256[])", [recipient_addresses, top_up_amounts] + "(address,address[],uint256[])", [token, recipient_addresses, top_up_amounts] ), {"from": top_up_allowed_recipients_evm_script_factory.trustedCaller()}, ) @@ -396,12 +403,14 @@ def top_up_allowed_recipient_by_motion( ): def _top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + token_address, recipient_addresses, top_up_amounts, spent_amount=0 ): motion_creation_tx = create_top_up_allowed_recipients_motion( top_up_allowed_recipients_evm_script_factory, + token_address, recipient_addresses, top_up_amounts, ) @@ -437,14 +446,13 @@ def _enact_top_up_allowed_recipient_motion_by_creation_tx(motion_creation_tx, sp ) ( + top_up_token, recipients, amounts, ) = top_up_allowed_recipients_evm_script_factory.decodeEVMScriptCallData( motion_creation_tx.events["MotionCreated"]["_evmScriptCallData"] ) - top_up_token = top_up_allowed_recipients_evm_script_factory.token() - (sender_balance_before,) = get_balances( top_up_token, [lido_contracts.aragon.agent] ) @@ -476,6 +484,7 @@ def _enact_top_up_allowed_recipient_motion_by_creation_tx(motion_creation_tx, sp recipients_balances_before=recipients_balances_before, sender_shares_balance_before=sender_shares_balance_before, recipients_shares_balance_before=recipients_shares_balance_before, + top_up_token=top_up_token, top_up_recipients=recipients, top_up_amounts=amounts, spent_amount=spent_amount @@ -486,10 +495,25 @@ def _enact_top_up_allowed_recipient_motion_by_creation_tx(motion_creation_tx, sp @pytest.fixture(scope="module") def check_top_up_motion_enactment( - AllowedRecipientsRegistry, get_balances, lido_contracts + AllowedRecipientsRegistry, get_balances, lido_contracts, interface ): """Note: this check works correctly only when was payment in the period""" + def normalize_amount(token_amount, token): + DECIMALS = 18 + + if token_amount == 0: + return 0 + + token_decimals = interface.ERC20(token).decimals() + + if token_decimals == DECIMALS: + return token_amount + if token_decimals > DECIMALS: + return (token_amount - 1) // (10 ** (token_decimals - DECIMALS)) + 1 + return token_amount * (10 ** (DECIMALS - token_decimals)) + + def _check_top_up_motion_enactment( top_up_allowed_recipients_evm_script_factory, top_up_motion_enactment_tx, @@ -497,6 +521,7 @@ def _check_top_up_motion_enactment( recipients_balances_before, sender_shares_balance_before, recipients_shares_balance_before, + top_up_token, top_up_recipients, top_up_amounts, spent_amount, @@ -506,7 +531,10 @@ def _check_top_up_motion_enactment( ) limit, duration = allowed_recipients_registry.getLimitParameters() - spending = sum(top_up_amounts) + spending_in_tokens = sum(top_up_amounts) + spending = normalize_amount( + spending_in_tokens, top_up_token + ) spendable = limit - (spending + spent_amount) assert allowed_recipients_registry.isUnderSpendableBalance(spendable, 0) @@ -522,7 +550,6 @@ def _check_top_up_motion_enactment( == spendable ) - top_up_token = top_up_allowed_recipients_evm_script_factory.token() (sender_balance,) = get_balances(top_up_token, [lido_contracts.aragon.agent]) recipients_balances = get_balances( top_up_token, @@ -530,7 +557,7 @@ def _check_top_up_motion_enactment( ) if top_up_token == lido_contracts.steth: - assert math.isclose(sender_balance, sender_balance_before - spending, abs_tol = STETH_ERROR_MARGIN_WEI) + assert math.isclose(sender_balance, sender_balance_before - spending_in_tokens, abs_tol = STETH_ERROR_MARGIN_WEI) sender_shares_balance_after = lido_contracts.steth.sharesOf(lido_contracts.aragon.agent) recipients_shares_balance_after = 0 @@ -539,7 +566,7 @@ def _check_top_up_motion_enactment( assert sender_shares_balance_before >= sender_shares_balance_after assert sender_shares_balance_before - sender_shares_balance_after == recipients_shares_balance_after - recipients_shares_balance_before else: - assert sender_balance == sender_balance_before - spending + assert sender_balance == sender_balance_before - spending_in_tokens for before, now, payment in zip( recipients_balances_before, recipients_balances, top_up_amounts @@ -623,19 +650,23 @@ class AllowedRecipientsDefaultParams: @pytest.fixture(scope="module") -def allowed_recipients_registry( +def registries( AllowedRecipientsRegistry, + AllowedTokensRegistry, allowed_recipients_default_params, allowed_recipients_builder, load_deployed_contract, lido_contracts, easy_track, deployer, + dai, + interface ): allowed_recipients_registry = load_deployed_contract("AllowedRecipientsRegistry") + allowed_tokens_registry = load_deployed_contract("AllowedTokensRegistry") if allowed_recipients_registry is None: - tx = allowed_recipients_builder.deployAllowedRecipientsRegistry( + tx_recipients = allowed_recipients_builder.deployAllowedRecipientsRegistry( allowed_recipients_default_params.limit, allowed_recipients_default_params.period_duration_months, [], @@ -645,8 +676,13 @@ def allowed_recipients_registry( {"from": deployer}, ) + tx_tokens = allowed_recipients_builder.deployAllowedTokensRegistry([]) + allowed_recipients_registry = AllowedRecipientsRegistry.at( - tx.events["AllowedRecipientsRegistryDeployed"]["allowedRecipientsRegistry"] + tx_recipients.events["AllowedRecipientsRegistryDeployed"]["allowedRecipientsRegistry"] + ) + allowed_tokens_registry = AllowedTokensRegistry.at( + tx_tokens.events["AllowedTokensRegistryDeployed"]["allowedTokensRegistry"] ) if not allowed_recipients_registry.hasRole( @@ -669,16 +705,43 @@ def allowed_recipients_registry( {"from": lido_contracts.aragon.agent}, ) - return allowed_recipients_registry + # dai_ward = "0x9759A6Ac90977b93B58547b4A71c78317f391A28" + test = "0x075e72a5eDf65F0A5f44699c7654C1a76941Ddc8" + + interface.ERC20(dai).transfer(lido_contracts.aragon.agent, interface.ERC20(dai).balanceOf(test), {"from": test}) + return (allowed_recipients_registry, allowed_tokens_registry) + +@pytest.fixture(scope="module") +def add_allowed_token(registries, lido_contracts): + (_, allowed_tokens_registry) = registries + def _add_allowed_token(token): + if (allowed_tokens_registry.isTokenAllowed(token)): + return + allowed_tokens_registry.addToken(token, {"from": lido_contracts.aragon.agent}) + assert allowed_tokens_registry.isTokenAllowed(token) + return _add_allowed_token @pytest.fixture(scope="module") -def allowed_recipients_limit_params(allowed_recipients_registry): +def remove_allowed_token(registries, lido_contracts): + (_, allowed_tokens_registry) = registries + def _remove_allowed_token(token): + if not allowed_tokens_registry.isTokenAllowed(token): + return + allowed_tokens_registry.removeToken(token, {"from": lido_contracts.aragon.agent}) + assert not allowed_tokens_registry.isTokenAllowed(token) + return _remove_allowed_token + + +@pytest.fixture(scope="module") +def allowed_recipients_limit_params(registries): @dataclass class AllowedRecipientsLimits: limit: int duration: int + (allowed_recipients_registry, _) = registries + limit, duration = allowed_recipients_registry.getLimitParameters() return AllowedRecipientsLimits(limit, duration) diff --git a/tests/integration/test_allowed_recipients_happy_path.py b/tests/integration/test_allowed_recipients_happy_path.py index 63602b56..37042894 100644 --- a/tests/integration/test_allowed_recipients_happy_path.py +++ b/tests/integration/test_allowed_recipients_happy_path.py @@ -3,6 +3,7 @@ from brownie import ( chain, reverts, + AllowedTokensRegistry, AllowedRecipientsRegistry, TopUpAllowedRecipients, AddAllowedRecipient, @@ -15,8 +16,10 @@ @dataclass class SingleRecipientTopUpOnlySetup: + allowed_tokens_registry: AllowedTokensRegistry allowed_recipients_registry: AllowedRecipientsRegistry top_up_allowed_recipients_evm_script_factory: TopUpAllowedRecipients + allowed_tokens: list[str] @dataclass @@ -38,6 +41,7 @@ def new_recipient(recipients): @pytest.fixture(scope="module") def single_recipient_top_up_only_setup( AllowedRecipientsRegistry, + AllowedTokensRegistry, TopUpAllowedRecipients, easy_track, lido_contracts, @@ -45,12 +49,15 @@ def single_recipient_top_up_only_setup( allowed_recipients_builder, allowed_recipients_default_params, deployer, + dai, + usdc, ): + allowed_tokens = [dai, usdc] deploy_tx = allowed_recipients_builder.deploySingleRecipientTopUpOnlySetup( allowed_recipient.address, allowed_recipient.title, - lido_contracts.ldo, + allowed_tokens, allowed_recipients_default_params.limit, allowed_recipients_default_params.period_duration_months, allowed_recipients_default_params.spent_amount, @@ -62,9 +69,13 @@ def single_recipient_top_up_only_setup( "allowedRecipientsRegistry" ] ) + allowed_tokens_registry = AllowedTokensRegistry.at( + deploy_tx.events["AllowedTokensRegistryDeployed"]["allowedTokensRegistry"] + ) top_up_allowed_recipients_evm_script_factory = TopUpAllowedRecipients.at( deploy_tx.events["TopUpAllowedRecipientsDeployed"]["topUpAllowedRecipients"] ) + easy_track.addEVMScriptFactory( top_up_allowed_recipients_evm_script_factory, deployment.create_permission( @@ -76,13 +87,17 @@ def single_recipient_top_up_only_setup( {"from": lido_contracts.aragon.voting}, ) return SingleRecipientTopUpOnlySetup( - allowed_recipients_registry, top_up_allowed_recipients_evm_script_factory + allowed_tokens_registry=allowed_tokens_registry, + allowed_recipients_registry=allowed_recipients_registry, + top_up_allowed_recipients_evm_script_factory=top_up_allowed_recipients_evm_script_factory, + allowed_tokens=allowed_tokens ) @pytest.fixture(scope="module") def full_setup( AllowedRecipientsRegistry, + AllowedTokensRegistry, AddAllowedRecipient, TopUpAllowedRecipients, RemoveAllowedRecipient, @@ -92,12 +107,15 @@ def full_setup( lido_contracts, allowed_recipients_default_params, deployer, + dai, + usdc, ): + allowed_tokens = [dai, usdc] deploy_tx = allowed_recipients_builder.deployFullSetup( trusted_caller, - lido_contracts.ldo, allowed_recipients_default_params.limit, allowed_recipients_default_params.period_duration_months, + [dai, usdc], [], [], allowed_recipients_default_params.spent_amount, @@ -109,9 +127,12 @@ def full_setup( "allowedRecipientsRegistry" ] ) + allowed_tokens_registry = AllowedTokensRegistry.at( + deploy_tx.events["AllowedTokensRegistryDeployed"]["allowedTokensRegistry"] + ) add_allowed_recipient_evm_script_factory = AddAllowedRecipient.at( - deploy_tx.events["AddAllowedRecipientDeployed"]["addAllowedRecipient"] + deploy_tx.events["AddAllowedRecipientDeployed"][0]["addAllowedRecipient"] ) easy_track.addEVMScriptFactory( @@ -123,6 +144,7 @@ def full_setup( remove_allowed_recipient_evm_script_factory = RemoveAllowedRecipient.at( deploy_tx.events["RemoveAllowedRecipientDeployed"]["removeAllowedRecipient"] ) + easy_track.addEVMScriptFactory( remove_allowed_recipient_evm_script_factory, deployment.create_permission(allowed_recipients_registry, "removeRecipient"), @@ -132,6 +154,7 @@ def full_setup( top_up_allowed_recipients_evm_script_factory = TopUpAllowedRecipients.at( deploy_tx.events["TopUpAllowedRecipientsDeployed"]["topUpAllowedRecipients"] ) + easy_track.addEVMScriptFactory( top_up_allowed_recipients_evm_script_factory, deployment.create_permission( @@ -144,10 +167,12 @@ def full_setup( ) return FullSetup( - allowed_recipients_registry, - top_up_allowed_recipients_evm_script_factory, - add_allowed_recipient_evm_script_factory, - remove_allowed_recipient_evm_script_factory, + allowed_tokens_registry=allowed_tokens_registry, + allowed_recipients_registry=allowed_recipients_registry, + top_up_allowed_recipients_evm_script_factory=top_up_allowed_recipients_evm_script_factory, + allowed_tokens=allowed_tokens, + add_allowed_recipient_evm_script_factory=add_allowed_recipient_evm_script_factory, + remove_allowed_recipient_evm_script_factory=remove_allowed_recipient_evm_script_factory, ) @@ -160,8 +185,8 @@ def test_single_recipient_top_up_only_setup_happy_path( allowed_recipient, new_recipient, ): - first_top_up_amount = 50 * 10 ** 18 - second_top_up_amount = 100 * 10 ** 18 + first_top_up_amount = 100 * 10**18 + second_top_up_amount = 100 * 10**6 test_helpers.advance_chain_time_to_beginning_of_the_next_period( allowed_recipients_default_params.period_duration_months @@ -170,14 +195,20 @@ def test_single_recipient_top_up_only_setup_happy_path( allowed_recipients_registry = ( single_recipient_top_up_only_setup.allowed_recipients_registry ) + allowed_tokens_registry = ( + single_recipient_top_up_only_setup.allowed_tokens_registry + ) top_up_allowed_recipients_evm_script_factory = ( single_recipient_top_up_only_setup.top_up_allowed_recipients_evm_script_factory ) + [dai, usdc] = single_recipient_top_up_only_setup.allowed_tokens + # Top up allowed recipient top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, [allowed_recipient.address], [first_top_up_amount], ) @@ -222,6 +253,20 @@ def test_single_recipient_top_up_only_setup_happy_path( new_recipient.address, {"from": evm_script_executor} ) + # Validate Aragon Agent can remove token + assert allowed_tokens_registry.isTokenAllowed(dai) + + allowed_tokens_registry.removeToken(dai, {"from": lido_contracts.aragon.agent}) + + assert not allowed_tokens_registry.isTokenAllowed(dai) + + # Validate Aragon Agent can add token + assert not allowed_tokens_registry.isTokenAllowed(dai) + + allowed_tokens_registry.addToken(dai, {"from": lido_contracts.aragon.agent}) + + assert allowed_tokens_registry.isTokenAllowed(dai) + # wait next period chain.sleep( @@ -232,6 +277,7 @@ def test_single_recipient_top_up_only_setup_happy_path( top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + usdc, [new_recipient.address], [second_top_up_amount], ) @@ -240,6 +286,7 @@ def test_single_recipient_top_up_only_setup_happy_path( with reverts("SUM_EXCEEDS_SPENDABLE_BALANCE"): top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + usdc, [new_recipient.address], [1], ) @@ -255,8 +302,12 @@ def test_full_setup_happy_path( allowed_recipient, new_recipient, ): - first_top_up_amount = 50 * 10 ** 18 - second_top_up_amount = 100 * 10 ** 18 + first_top_up_amount = 50 * 10**6 + second_top_up_amount = 100 * 10**18 + + print(full_setup) + + [dai, usdc] = full_setup.allowed_tokens test_helpers.advance_chain_time_to_beginning_of_the_next_period( allowed_recipients_default_params.period_duration_months @@ -278,6 +329,7 @@ def test_full_setup_happy_path( ) top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + usdc, [allowed_recipient.address], [first_top_up_amount], ) @@ -301,6 +353,21 @@ def test_full_setup_happy_path( ) assert allowed_recipients_registry.isRecipientAllowed(new_recipient.address) + # Validate Aragon Agent can remove token + allowed_tokens_registry = full_setup.allowed_tokens_registry + assert allowed_tokens_registry.isTokenAllowed(dai) + + allowed_tokens_registry.removeToken(dai, {"from": lido_contracts.aragon.agent}) + + assert not allowed_tokens_registry.isTokenAllowed(dai) + + # Validate Aragon Agent can add token + assert not allowed_tokens_registry.isTokenAllowed(dai) + + allowed_tokens_registry.addToken(dai, {"from": lido_contracts.aragon.agent}) + + assert allowed_tokens_registry.isTokenAllowed(dai) + # Wait for next period chain.sleep( allowed_recipients_default_params.period_duration_months * MAX_SECONDS_IN_MONTH @@ -312,6 +379,7 @@ def test_full_setup_happy_path( ) top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, [new_recipient.address], [second_top_up_amount], ) @@ -320,6 +388,7 @@ def test_full_setup_happy_path( with reverts("SUM_EXCEEDS_SPENDABLE_BALANCE"): top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, [new_recipient.address], [1], ) diff --git a/tests/integration/test_allowed_recipients_motions.py b/tests/integration/test_allowed_recipients_motions.py index 4cd886ff..b188d0bd 100644 --- a/tests/integration/test_allowed_recipients_motions.py +++ b/tests/integration/test_allowed_recipients_motions.py @@ -4,19 +4,21 @@ from brownie.network import chain from dataclasses import dataclass -from utils import deployment, evm_script, test_helpers, lido, config +from utils import evm_script, test_helpers MAX_SECONDS_IN_MONTH = 31 * 24 * 60 * 60 def test_add_recipient_motion( recipients, - allowed_recipients_registry, + registries, add_allowed_recipient_by_motion, add_allowed_recipient_evm_script_factory, ): recipient = recipients[0] + (allowed_recipients_registry, _) = registries + allowed_recipients_count_before = len( allowed_recipients_registry.getAllowedRecipients() ) @@ -38,11 +40,12 @@ def test_add_recipient_motion( def test_add_multiple_recipients_by_concurrent_motions( recipients, easy_track, - allowed_recipients_registry, + registries, enact_motion_by_creation_tx, create_add_allowed_recipient_motion, add_allowed_recipient_evm_script_factory, ): + (allowed_recipients_registry, _) = registries first_recipient, second_recipient = recipients[:2] allowed_recipients_count_before = len( @@ -125,12 +128,13 @@ def test_fail_if_add_same_recipient_twice( def test_remove_recipient_motion( recipients, - allowed_recipients_registry, + registries, add_allowed_recipient_by_motion, add_allowed_recipient_evm_script_factory, remove_allowed_recipient_evm_script_factory, remove_allowed_recipient_by_motion, ): + (allowed_recipients_registry, _) = registries allowed_recipient = recipients[0] allowed_recipients_count_before = len( @@ -161,10 +165,11 @@ def test_remove_recipient_motion( def test_fail_remove_recipient_if_empty_allowed_recipients_list( recipients, - allowed_recipients_registry, + registries, remove_allowed_recipient_by_motion, remove_allowed_recipient_evm_script_factory, ): + (allowed_recipients_registry, _) = registries allowed_recipients = allowed_recipients_registry.getAllowedRecipients() for allowed_recipient in allowed_recipients: @@ -182,12 +187,13 @@ def test_fail_remove_recipient_if_empty_allowed_recipients_list( def test_fail_remove_recipient_if_it_is_not_allowed( recipients, - allowed_recipients_registry, + registries, add_allowed_recipient_by_motion, remove_allowed_recipient_by_motion, add_allowed_recipient_evm_script_factory, remove_allowed_recipient_evm_script_factory, ): + (allowed_recipients_registry, _) = registries allowed_recipient, not_allowed_recipient = recipients[0], recipients[1] add_allowed_recipient_by_motion( @@ -209,6 +215,8 @@ def test_fail_remove_recipient_if_it_is_not_allowed( def test_top_up_single_recipient( recipients, + dai, + add_allowed_token, allowed_recipients_limit_params, add_allowed_recipient_by_motion, top_up_allowed_recipient_by_motion, @@ -223,8 +231,10 @@ def test_top_up_single_recipient( allowed_recipient.title, ) + add_allowed_token(dai) + top_up_recipient_addresses = [allowed_recipient.address] - top_up_amounts = [2 * 10 ** 18] + top_up_amounts = [2 * 10**18] test_helpers.advance_chain_time_to_beginning_of_the_next_period( allowed_recipients_limit_params.duration @@ -232,6 +242,7 @@ def test_top_up_single_recipient( top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, top_up_recipient_addresses, top_up_amounts, ) @@ -239,13 +250,18 @@ def test_top_up_single_recipient( def test_top_up_single_recipient_several_times_in_period( recipients, + registries, + lido_contracts, + add_allowed_token, allowed_recipients_limit_params, add_allowed_recipient_by_motion, top_up_allowed_recipient_by_motion, add_allowed_recipient_evm_script_factory, top_up_allowed_recipients_evm_script_factory, + dai ): allowed_recipient = recipients[0] + (allowed_recipients_registry, _) = registries add_allowed_recipient_by_motion( add_allowed_recipient_evm_script_factory, @@ -253,8 +269,10 @@ def test_top_up_single_recipient_several_times_in_period( allowed_recipient.title, ) + add_allowed_token(dai) + top_up_recipient_addresses = [allowed_recipient.address] - top_up_amounts = [int(allowed_recipients_limit_params.limit / 2)] + top_up_amounts = [allowed_recipients_limit_params.limit // 2] test_helpers.advance_chain_time_to_beginning_of_the_next_period( allowed_recipients_limit_params.duration @@ -262,12 +280,14 @@ def test_top_up_single_recipient_several_times_in_period( top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, top_up_recipient_addresses, top_up_amounts, ) top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, top_up_recipient_addresses, top_up_amounts, sum(top_up_amounts) @@ -276,6 +296,7 @@ def test_top_up_single_recipient_several_times_in_period( with reverts("SUM_EXCEEDS_SPENDABLE_BALANCE"): top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, top_up_recipient_addresses, [1], ) @@ -286,6 +307,7 @@ def test_top_up_single_recipient_several_times_in_period( top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, top_up_recipient_addresses, [allowed_recipients_limit_params.limit] ) @@ -293,11 +315,13 @@ def test_top_up_single_recipient_several_times_in_period( def test_top_up_multiple_recipients( recipients, + add_allowed_token, allowed_recipients_limit_params, add_allowed_recipient_by_motion, top_up_allowed_recipient_by_motion, add_allowed_recipient_evm_script_factory, top_up_allowed_recipients_evm_script_factory, + dai, ): allowed_recipients = recipients[:2] @@ -312,21 +336,80 @@ def test_top_up_multiple_recipients( allowed_recipients[1].title, ) + add_allowed_token(dai) + test_helpers.advance_chain_time_to_beginning_of_the_next_period( allowed_recipients_limit_params.duration ) - top_up_amounts = [2 * 10 ** 18, 1 * 10 ** 18] + top_up_amounts = [2 * 10**18, 1 * 10**18] top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], top_up_amounts, ) +def test_top_up_multiple_tokens( + recipients, + registries, + add_allowed_token, + allowed_recipients_limit_params, + add_allowed_recipient_by_motion, + top_up_allowed_recipient_by_motion, + add_allowed_recipient_evm_script_factory, + top_up_allowed_recipients_evm_script_factory, + dai, + usdc +): + (allowed_recipients_registry, _) = registries + allowed_recipient = recipients[0] + + add_allowed_recipient_by_motion( + add_allowed_recipient_evm_script_factory, + allowed_recipient.address, + allowed_recipient.title, + ) + + add_allowed_token(dai) + + top_up_recipient_addresses = [allowed_recipient.address] + top_up_amounts_dai = [1 * 10**18] + + test_helpers.advance_chain_time_to_beginning_of_the_next_period( + allowed_recipients_limit_params.duration + ) + + top_up_allowed_recipient_by_motion( + top_up_allowed_recipients_evm_script_factory, + dai, + top_up_recipient_addresses, + top_up_amounts_dai, + ) + + add_allowed_token(usdc) + top_up_amounts_usdc = [1 * 10**6] + + top_up_allowed_recipient_by_motion( + top_up_allowed_recipients_evm_script_factory, + usdc, + top_up_recipient_addresses, + top_up_amounts_usdc, + sum(top_up_amounts_dai) + ) + + (limit, _) = allowed_recipients_registry.getLimitParameters() + + assert allowed_recipients_registry.spendableBalance() == limit - 2 * 10**18 + + + def test_top_up_motion_enacted_in_next_period( + dai, recipients, + add_allowed_token, allowed_recipients_limit_params, add_allowed_recipient_by_motion, create_top_up_allowed_recipients_motion, @@ -347,6 +430,8 @@ def test_top_up_motion_enacted_in_next_period( allowed_recipients[1].title, ) + add_allowed_token(dai) + top_up_amounts = [int(3e18), int(90e18)] test_helpers.advance_chain_time_to_beginning_of_the_next_period( @@ -355,6 +440,7 @@ def test_top_up_motion_enacted_in_next_period( motion_creation_tx = create_top_up_allowed_recipients_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], top_up_amounts, ) @@ -366,16 +452,19 @@ def test_top_up_motion_enacted_in_next_period( def test_top_up_motion_ended_and_enacted_in_next_period( + dai, recipients, easy_track, allowed_recipients_limit_params, - allowed_recipients_registry, + registries, + add_allowed_token, add_allowed_recipient_by_motion, create_top_up_allowed_recipients_motion, add_allowed_recipient_evm_script_factory, top_up_allowed_recipients_evm_script_factory, enact_top_up_allowed_recipient_motion_by_creation_tx, ): + (allowed_recipients_registry, _) = registries allowed_recipients = recipients[:2] add_allowed_recipient_by_motion( @@ -391,6 +480,8 @@ def test_top_up_motion_ended_and_enacted_in_next_period( top_up_amounts = [int(3e18), int(90e18)] + add_allowed_token(dai) + test_helpers.advance_chain_time_to_beginning_of_the_next_period( allowed_recipients_limit_params.duration ) @@ -400,6 +491,7 @@ def test_top_up_motion_ended_and_enacted_in_next_period( motion_creation_tx = create_top_up_allowed_recipients_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], top_up_amounts, ) @@ -415,7 +507,9 @@ def test_top_up_motion_ended_and_enacted_in_next_period( def test_top_up_motion_enacted_in_second_next_period( + dai, recipients, + add_allowed_token, allowed_recipients_limit_params, add_allowed_recipient_by_motion, create_top_up_allowed_recipients_motion, @@ -436,6 +530,8 @@ def test_top_up_motion_enacted_in_second_next_period( allowed_recipients[1].title, ) + add_allowed_token(dai) + top_up_amounts = [int(3e18), int(90e18)] test_helpers.advance_chain_time_to_beginning_of_the_next_period( @@ -444,6 +540,7 @@ def test_top_up_motion_enacted_in_second_next_period( motion_creation_tx = create_top_up_allowed_recipients_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], top_up_amounts, ) @@ -454,23 +551,22 @@ def test_top_up_motion_enacted_in_second_next_period( def test_spendable_balance_is_renewed_in_next_period( + dai, recipients, allowed_recipients_limit_params, - allowed_recipients_registry, + registries, + add_allowed_token, add_allowed_recipient_by_motion, top_up_allowed_recipient_by_motion, add_allowed_recipient_evm_script_factory, top_up_allowed_recipients_evm_script_factory, ): + (allowed_recipients_registry, _) = registries + test_helpers.advance_chain_time_to_beginning_of_the_next_period( allowed_recipients_limit_params.duration ) - assert ( - allowed_recipients_registry.spendableBalance() - == allowed_recipients_limit_params.limit - ) - allowed_recipients = recipients[:2] add_allowed_recipient_by_motion( @@ -484,13 +580,16 @@ def test_spendable_balance_is_renewed_in_next_period( allowed_recipients[1].title, ) + add_allowed_token(dai) + top_up_amounts = [ - int(allowed_recipients_limit_params.limit // 10 ** 18 * 0.1) * 10 ** 18, - int(allowed_recipients_limit_params.limit // 10 ** 18 * 0.9) * 10 ** 18, + int(allowed_recipients_limit_params.limit // 10**18 * 0.1) * 10**18, + int(allowed_recipients_limit_params.limit // 10**18 * 0.9) * 10**18, ] top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], top_up_amounts, ) @@ -505,6 +604,7 @@ def test_spendable_balance_is_renewed_in_next_period( with reverts("SUM_EXCEEDS_SPENDABLE_BALANCE"): top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, [allowed_recipients[0].address], [1], ) @@ -516,6 +616,7 @@ def test_spendable_balance_is_renewed_in_next_period( # or setLimitParameters. So trying to make a full period limit amount payout top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, [allowed_recipients[0].address], [allowed_recipients_limit_params.limit], ) @@ -527,8 +628,95 @@ def test_spendable_balance_is_renewed_in_next_period( assert allowed_recipients_registry.spendableBalance() == 0 +def test_fail_if_token_not_allowed( + dai, + registries, + recipients, + add_allowed_token, + remove_allowed_token, + add_allowed_recipient_by_motion, + allowed_recipients_limit_params, + create_top_up_allowed_recipients_motion, + add_allowed_recipient_evm_script_factory, + top_up_allowed_recipients_evm_script_factory, +): + (_, allowed_tokens_registry) = registries + allowed_recipient = recipients[0] + + add_allowed_recipient_by_motion( + add_allowed_recipient_evm_script_factory, + allowed_recipient.address, + allowed_recipient.title, + ) + + restore_after_test = False + if allowed_tokens_registry.isTokenAllowed(dai): + remove_allowed_token(dai) + restore_after_test = True + + test_helpers.advance_chain_time_to_beginning_of_the_next_period( + allowed_recipients_limit_params.duration + ) + + with reverts("TOKEN_NOT_ALLOWED"): + create_top_up_allowed_recipients_motion( + top_up_allowed_recipients_evm_script_factory, + dai, + [allowed_recipient.address], + [allowed_recipients_limit_params.limit], + ) + if restore_after_test: + add_allowed_token(dai) + + +def test_fail_enact_top_up_motion_if_recipient_removed_by_other_motion( + dai, + registries, + recipients, + add_allowed_token, + remove_allowed_token, + add_allowed_recipient_by_motion, + allowed_recipients_limit_params, + create_top_up_allowed_recipients_motion, + add_allowed_recipient_evm_script_factory, + top_up_allowed_recipients_evm_script_factory, + enact_top_up_allowed_recipient_motion_by_creation_tx +): + allowed_recipient = recipients[0] + + add_allowed_recipient_by_motion( + add_allowed_recipient_evm_script_factory, + allowed_recipient.address, + allowed_recipient.title, + ) + + add_allowed_token(dai) + + test_helpers.advance_chain_time_to_beginning_of_the_next_period( + allowed_recipients_limit_params.duration + ) + + motion_creation_tx = create_top_up_allowed_recipients_motion( + top_up_allowed_recipients_evm_script_factory, + dai, + [allowed_recipient.address], + allowed_recipients_limit_params.limit, + ) + + remove_allowed_token(dai) + + with reverts("TOKEN_NOT_ALLOWED"): + enact_top_up_allowed_recipient_motion_by_creation_tx(motion_creation_tx) + + add_allowed_token(dai) + + enact_top_up_allowed_recipient_motion_by_creation_tx(motion_creation_tx) + + def test_fail_enact_top_up_motion_if_recipient_removed_by_other_motion( + dai, recipients, + add_allowed_token, allowed_recipients_limit_params, add_allowed_recipient_by_motion, remove_allowed_recipient_by_motion, @@ -555,11 +743,14 @@ def test_fail_enact_top_up_motion_if_recipient_removed_by_other_motion( allowed_recipients[1].title, ) + add_allowed_token(dai) + recipient_to_remove = allowed_recipients[0] top_up_amounts = [int(40e18), int(30e18)] motion_creation_tx = create_top_up_allowed_recipients_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], top_up_amounts, ) @@ -573,7 +764,9 @@ def test_fail_enact_top_up_motion_if_recipient_removed_by_other_motion( def test_fail_create_top_up_motion_if_exceeds_limit( + dai, recipients, + add_allowed_token, allowed_recipients_limit_params, add_allowed_recipient_by_motion, create_top_up_allowed_recipients_motion, @@ -588,6 +781,8 @@ def test_fail_create_top_up_motion_if_exceeds_limit( allowed_recipient.title, ) + add_allowed_token(dai) + test_helpers.advance_chain_time_to_beginning_of_the_next_period( allowed_recipients_limit_params.duration ) @@ -596,13 +791,16 @@ def test_fail_create_top_up_motion_if_exceeds_limit( exceeded_top_up_amounts = [allowed_recipients_limit_params.limit + 1] create_top_up_allowed_recipients_motion( top_up_allowed_recipients_evm_script_factory, + dai, [allowed_recipient.address], exceeded_top_up_amounts, ) def test_fail_to_create_top_up_motion_which_exceeds_spendable( + dai, recipients, + add_allowed_token, allowed_recipients_limit_params, add_allowed_recipient_by_motion, top_up_allowed_recipient_by_motion, @@ -622,19 +820,22 @@ def test_fail_to_create_top_up_motion_which_exceeds_spendable( allowed_recipients[1].title, ) + add_allowed_token(dai) + test_helpers.advance_chain_time_to_beginning_of_the_next_period( allowed_recipients_limit_params.duration ) first_top_up_amounts = [ - int(allowed_recipients_limit_params.limit // 10 ** 18 * 0.4) * 10 ** 18, - int(allowed_recipients_limit_params.limit // 10 ** 18 * 0.6) * 10 ** 18, + int(allowed_recipients_limit_params.limit // 10**18 * 0.4) * 10**18, + int(allowed_recipients_limit_params.limit // 10**18 * 0.6) * 10**18, ] assert sum(first_top_up_amounts) == allowed_recipients_limit_params.limit top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], first_top_up_amounts, ) @@ -643,13 +844,16 @@ def test_fail_to_create_top_up_motion_which_exceeds_spendable( second_top_up_amounts = [1, 1] top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], second_top_up_amounts, ) def test_fail_2nd_top_up_motion_enactment_due_limit_but_can_enact_in_next( + dai, recipients, + add_allowed_token, allowed_recipients_limit_params, add_allowed_recipient_by_motion, create_top_up_allowed_recipients_motion, @@ -670,17 +874,19 @@ def test_fail_2nd_top_up_motion_enactment_due_limit_but_can_enact_in_next( allowed_recipients[1].title, ) + add_allowed_token(dai) + test_helpers.advance_chain_time_to_beginning_of_the_next_period( allowed_recipients_limit_params.duration ) first_top_up_amount = [ - int(allowed_recipients_limit_params.limit // 10 ** 18 * 0.4) * 10 ** 18, - int(allowed_recipients_limit_params.limit // 10 ** 18 * 0.3) * 10 ** 18, + int(allowed_recipients_limit_params.limit // 10**18 * 0.4) * 10**18, + int(allowed_recipients_limit_params.limit // 10**18 * 0.3) * 10**18, ] second_top_up_amount = [ - int(allowed_recipients_limit_params.limit // 10 ** 18 * 0.3) * 10 ** 18, - int(allowed_recipients_limit_params.limit // 10 ** 18 * 0.2) * 10 ** 18, + int(allowed_recipients_limit_params.limit // 10**18 * 0.3) * 10**18, + int(allowed_recipients_limit_params.limit // 10**18 * 0.2) * 10**18, ] assert ( @@ -689,11 +895,13 @@ def test_fail_2nd_top_up_motion_enactment_due_limit_but_can_enact_in_next( ) first_motion_creation_tx = create_top_up_allowed_recipients_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], first_top_up_amount, ) second_motion_creation_tx = create_top_up_allowed_recipients_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], second_top_up_amount, ) @@ -709,8 +917,10 @@ def test_fail_2nd_top_up_motion_enactment_due_limit_but_can_enact_in_next( def test_fail_2nd_top_up_motion_creation_in_period_if_it_exceeds_spendable( + dai, recipients, - allowed_recipients_registry, + registries, + add_allowed_token, add_allowed_recipient_by_motion, allowed_recipients_limit_params, top_up_allowed_recipient_by_motion, @@ -719,6 +929,7 @@ def test_fail_2nd_top_up_motion_creation_in_period_if_it_exceeds_spendable( ): """Revert 2nd payout which together with 1st payout exceed the current period limit""" + (allowed_recipients_registry, _) = registries allowed_recipients = recipients[:2] add_allowed_recipient_by_motion( @@ -732,17 +943,19 @@ def test_fail_2nd_top_up_motion_creation_in_period_if_it_exceeds_spendable( allowed_recipients[1].title, ) + add_allowed_token(dai) + test_helpers.advance_chain_time_to_beginning_of_the_next_period( allowed_recipients_limit_params.duration ) first_top_up_amounts = [ - int(allowed_recipients_limit_params.limit // 10 ** 18 * 0.03) * 10 ** 18, - int(allowed_recipients_limit_params.limit // 10 ** 18 * 0.9) * 10 ** 18, + int(allowed_recipients_limit_params.limit // 10**18 * 0.03) * 10**18, + int(allowed_recipients_limit_params.limit // 10**18 * 0.9) * 10**18, ] second_top_up_amounts = [ - int(allowed_recipients_limit_params.limit // 10 ** 18 * 0.05) * 10 ** 18, - int(allowed_recipients_limit_params.limit // 10 ** 18 * 0.04) * 10 ** 18, + int(allowed_recipients_limit_params.limit // 10**18 * 0.05) * 10**18, + int(allowed_recipients_limit_params.limit // 10**18 * 0.04) * 10**18, ] assert ( @@ -752,6 +965,7 @@ def test_fail_2nd_top_up_motion_creation_in_period_if_it_exceeds_spendable( top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], first_top_up_amounts, ) @@ -761,15 +975,18 @@ def test_fail_2nd_top_up_motion_creation_in_period_if_it_exceeds_spendable( with reverts("SUM_EXCEEDS_SPENDABLE_BALANCE"): top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], second_top_up_amounts, ) def test_fail_top_up_if_limit_decreased_while_motion_is_in_flight( + dai, recipients, lido_contracts, - allowed_recipients_registry, + registries, + add_allowed_token, allowed_recipients_limit_params, add_allowed_recipient_by_motion, create_top_up_allowed_recipients_motion, @@ -777,6 +994,7 @@ def test_fail_top_up_if_limit_decreased_while_motion_is_in_flight( top_up_allowed_recipients_evm_script_factory, enact_top_up_allowed_recipient_motion_by_creation_tx, ): + (allowed_recipients_registry, _) = registries allowed_recipients = recipients[:1] add_allowed_recipient_by_motion( @@ -785,6 +1003,8 @@ def test_fail_top_up_if_limit_decreased_while_motion_is_in_flight( allowed_recipients[0].title, ) + add_allowed_token(dai) + test_helpers.advance_chain_time_to_beginning_of_the_next_period( allowed_recipients_limit_params.duration ) @@ -792,6 +1012,7 @@ def test_fail_top_up_if_limit_decreased_while_motion_is_in_flight( top_up_amounts = [allowed_recipients_limit_params.limit] motion_creation_tx = create_top_up_allowed_recipients_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], top_up_amounts, ) @@ -807,9 +1028,11 @@ def test_fail_top_up_if_limit_decreased_while_motion_is_in_flight( def test_top_up_if_limit_increased_while_motion_is_in_flight( + dai, recipients, lido_contracts, - allowed_recipients_registry, + registries, + add_allowed_token, add_allowed_recipient_by_motion, allowed_recipients_limit_params, create_top_up_allowed_recipients_motion, @@ -817,6 +1040,7 @@ def test_top_up_if_limit_increased_while_motion_is_in_flight( top_up_allowed_recipients_evm_script_factory, enact_top_up_allowed_recipient_motion_by_creation_tx, ): + (allowed_recipients_registry, _) = registries allowed_recipients = recipients[:1] add_allowed_recipient_by_motion( @@ -825,13 +1049,18 @@ def test_top_up_if_limit_increased_while_motion_is_in_flight( allowed_recipients[0].title, ) + add_allowed_token(dai) + test_helpers.advance_chain_time_to_beginning_of_the_next_period( allowed_recipients_limit_params.duration ) + spent = allowed_recipients_limit_params.limit - allowed_recipients_registry.spendableBalance() + top_up_amounts = [allowed_recipients_limit_params.limit] motion_creation_tx = create_top_up_allowed_recipients_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], top_up_amounts, ) @@ -842,15 +1071,17 @@ def test_top_up_if_limit_increased_while_motion_is_in_flight( {"from": lido_contracts.aragon.agent}, ) - enact_top_up_allowed_recipient_motion_by_creation_tx(motion_creation_tx) + enact_top_up_allowed_recipient_motion_by_creation_tx(motion_creation_tx, spent_amount=spent) def test_two_motion_seconds_failed_to_enact_due_limit_but_succeeded_after_limit_increased( + dai, easy_track, recipients, lido_contracts, enact_motion_by_creation_tx, - allowed_recipients_registry, + registries, + add_allowed_token, add_allowed_recipient_by_motion, allowed_recipients_limit_params, create_top_up_allowed_recipients_motion, @@ -858,6 +1089,7 @@ def test_two_motion_seconds_failed_to_enact_due_limit_but_succeeded_after_limit_ top_up_allowed_recipients_evm_script_factory, enact_top_up_allowed_recipient_motion_by_creation_tx, ): + (allowed_recipients_registry, _) = registries allowed_recipients = recipients[:2] add_allowed_recipient_by_motion( @@ -871,25 +1103,29 @@ def test_two_motion_seconds_failed_to_enact_due_limit_but_succeeded_after_limit_ allowed_recipients[1].title, ) + add_allowed_token(dai) + test_helpers.advance_chain_time_to_beginning_of_the_next_period( allowed_recipients_limit_params.duration ) first_top_up_amounts = [ - int(allowed_recipients_limit_params.limit // 10 ** 18 * 0.4) * 10 ** 18, - int(allowed_recipients_limit_params.limit // 10 ** 18 * 0.6) * 10 ** 18, + int(allowed_recipients_limit_params.limit // 10**18 * 0.4) * 10**18, + int(allowed_recipients_limit_params.limit // 10**18 * 0.6) * 10**18, ] assert sum(first_top_up_amounts) == allowed_recipients_limit_params.limit second_top_up_amounts = [1, 1] first_motion_creation_tx = create_top_up_allowed_recipients_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], first_top_up_amounts, ) second_motion_creation_tx = create_top_up_allowed_recipients_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], second_top_up_amounts, ) @@ -916,8 +1152,10 @@ def test_two_motion_seconds_failed_to_enact_due_limit_but_succeeded_after_limit_ "initial_period_duration,new_period_duration", [(3, 2), (3, 6), (12, 1), (1, 12)] ) def test_top_up_spendable_renewal_if_period_duration_changed( + dai, recipients, - allowed_recipients_registry, + registries, + add_allowed_token, add_allowed_recipient_by_motion, lido_contracts, create_top_up_allowed_recipients_motion, @@ -927,7 +1165,8 @@ def test_top_up_spendable_renewal_if_period_duration_changed( initial_period_duration: int, new_period_duration: int, ): - period_limit = 100 * 10 ** 18 + (allowed_recipients_registry, _) = registries + period_limit = 100 * 10**18 allowed_recipients = recipients[:1] add_allowed_recipient_by_motion( @@ -936,6 +1175,8 @@ def test_top_up_spendable_renewal_if_period_duration_changed( allowed_recipients[0].title, ) + add_allowed_token(dai) + first_top_up_amount = [period_limit] second_top_up_amount = [1] # just 1 wei @@ -948,6 +1189,7 @@ def test_top_up_spendable_renewal_if_period_duration_changed( top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], first_top_up_amount, ) @@ -955,6 +1197,7 @@ def test_top_up_spendable_renewal_if_period_duration_changed( with reverts("SUM_EXCEEDS_SPENDABLE_BALANCE"): create_top_up_allowed_recipients_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], second_top_up_amount, ) @@ -968,6 +1211,7 @@ def test_top_up_spendable_renewal_if_period_duration_changed( with reverts("SUM_EXCEEDS_SPENDABLE_BALANCE"): create_top_up_allowed_recipients_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], second_top_up_amount, ) @@ -978,16 +1222,16 @@ def test_top_up_spendable_renewal_if_period_duration_changed( # expect the spendable get renewed top_up_allowed_recipient_by_motion( top_up_allowed_recipients_evm_script_factory, + dai, [r.address for r in allowed_recipients], second_top_up_amount, ) -def test_set_limit_parameters_by_aragon_agent_via_voting( - lido_contracts, allowed_recipients_registry -): +def test_set_limit_parameters_by_aragon_agent_via_voting(lido_contracts, registries): """Do Aragon Agent to set limit parameters to the allowed recipients registry""" - period_limit, period_duration = 100 * 10 ** 18, 6 + period_limit, period_duration = 100 * 10**18, 6 + (allowed_recipients_registry, _) = registries set_limit_parameters_voting_id, _ = lido_contracts.create_voting( evm_script=evm_script.encode_call_script( diff --git a/tests/test_allowed_recipients_builder.py b/tests/test_allowed_recipients_builder.py index a00a2759..1ed39506 100644 --- a/tests/test_allowed_recipients_builder.py +++ b/tests/test_allowed_recipients_builder.py @@ -1,5 +1,9 @@ import pytest from brownie import Contract, reverts +from utils.test_helpers import ( + ADD_TOKEN_TO_ALLOWED_LIST_ROLE, + REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, +) ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE = ( "0xec20c52871c824e5437859e75ac830e83aaaaeb7b0ffd850de830ddd3e385276" @@ -67,16 +71,16 @@ def test_deploy_top_up_allowed_recipients( allowed_recipients_builder, accounts, stranger, - ldo, finance, easy_track, TopUpAllowedRecipients, ): trusted_caller = accounts[3] - registry = accounts[4] + recipients_registry = accounts[4] + tokens_registry = accounts[4] tx = allowed_recipients_builder.deployTopUpAllowedRecipients( - trusted_caller, registry, ldo, {"from": stranger} + trusted_caller, recipients_registry, tokens_registry, {"from": stranger} ) top_up_address = tx.events["TopUpAllowedRecipientsDeployed"][ @@ -92,20 +96,18 @@ def test_deploy_top_up_allowed_recipients( ) assert ( tx.events["TopUpAllowedRecipientsDeployed"]["allowedRecipientsRegistry"] - == registry + == recipients_registry ) assert tx.events["TopUpAllowedRecipientsDeployed"]["finance"] == finance - assert tx.events["TopUpAllowedRecipientsDeployed"]["token"] == ldo assert tx.events["TopUpAllowedRecipientsDeployed"]["easyTrack"] == easy_track topUpAllowedRecipients = Contract.from_abi( "TopUpAllowedRecipients", top_up_address, TopUpAllowedRecipients.abi ) - assert topUpAllowedRecipients.token() == ldo - assert topUpAllowedRecipients.allowedRecipientsRegistry() == registry + assert topUpAllowedRecipients.allowedRecipientsRegistry() == recipients_registry + assert topUpAllowedRecipients.allowedTokensRegistry() == tokens_registry assert topUpAllowedRecipients.trustedCaller() == trusted_caller assert topUpAllowedRecipients.finance() == finance - assert topUpAllowedRecipients.token() == ldo assert topUpAllowedRecipients.easyTrack() == easy_track @@ -191,53 +193,101 @@ def test_deploy_allowed_recipients_registry( titles = ["account 3", "account 4"] spentAmount = 1e10 - tx = allowed_recipients_builder.deployAllowedRecipientsRegistry( + tx_recipients = allowed_recipients_builder.deployAllowedRecipientsRegistry( limit, period, recipients, titles, spentAmount, True, {"from": stranger} ) - registry_address = tx.events["AllowedRecipientsRegistryDeployed"][ - "allowedRecipientsRegistry" - ] + recipient_registry_address = tx_recipients.events[ + "AllowedRecipientsRegistryDeployed" + ]["allowedRecipientsRegistry"] - registry = Contract.from_abi( - "AllowedRecipientsRegistry", registry_address, AllowedRecipientsRegistry.abi + recipient_registry = Contract.from_abi( + "AllowedRecipientsRegistry", + recipient_registry_address, + AllowedRecipientsRegistry.abi, ) - assert len(registry.getAllowedRecipients()) == len(recipients) + assert len(recipient_registry.getAllowedRecipients()) == len(recipients) for recipient in recipients: - assert registry.isRecipientAllowed(recipient) + assert recipient_registry.isRecipientAllowed(recipient) - registry_limit, registry_period_duration = registry.getLimitParameters() + registry_limit, registry_period_duration = recipient_registry.getLimitParameters() assert registry_limit == limit assert registry_period_duration == period - assert registry.spendableBalance() == limit - spentAmount + assert recipient_registry.spendableBalance() == limit - spentAmount - assert registry.hasRole(ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, agent) - assert registry.hasRole(REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, agent) - assert registry.hasRole(SET_PARAMETERS_ROLE, agent) - assert registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, agent) - assert registry.hasRole(DEFAULT_ADMIN_ROLE, agent) + assert recipient_registry.hasRole(ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, agent) + assert recipient_registry.hasRole(REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, agent) + assert recipient_registry.hasRole(SET_PARAMETERS_ROLE, agent) + assert recipient_registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, agent) + assert recipient_registry.hasRole(DEFAULT_ADMIN_ROLE, agent) - assert registry.hasRole(ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, evm_script_executor) - assert registry.hasRole( + assert recipient_registry.hasRole( + ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, evm_script_executor + ) + assert recipient_registry.hasRole( REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, evm_script_executor ) - assert registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, evm_script_executor) - assert not registry.hasRole(SET_PARAMETERS_ROLE, evm_script_executor) - assert not registry.hasRole(DEFAULT_ADMIN_ROLE, evm_script_executor) + assert recipient_registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, evm_script_executor) + assert not recipient_registry.hasRole(SET_PARAMETERS_ROLE, evm_script_executor) + assert not recipient_registry.hasRole(DEFAULT_ADMIN_ROLE, evm_script_executor) - assert not registry.hasRole(ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, registry_address) - assert not registry.hasRole( - REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, registry_address + assert not recipient_registry.hasRole( + ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, recipient_registry_address ) - assert not registry.hasRole(SET_PARAMETERS_ROLE, registry_address) - assert not registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, registry_address) - assert not registry.hasRole(DEFAULT_ADMIN_ROLE, registry_address) + assert not recipient_registry.hasRole( + REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, recipient_registry_address + ) + assert not recipient_registry.hasRole( + SET_PARAMETERS_ROLE, recipient_registry_address + ) + assert not recipient_registry.hasRole( + UPDATE_SPENT_AMOUNT_ROLE, recipient_registry_address + ) + assert not recipient_registry.hasRole( + DEFAULT_ADMIN_ROLE, recipient_registry_address + ) + + +def test_deploy_allowed_tokens_registry( + allowed_recipients_builder, + AllowedTokensRegistry, + stranger, + agent, + ldo, + usdc, +): + tx_tokens = allowed_recipients_builder.deployAllowedTokensRegistry( + [ldo, usdc], {"from": stranger} + ) + token_registry_address = tx_tokens.events["AllowedTokensRegistryDeployed"][ + "allowedTokensRegistry" + ] + token_registry = Contract.from_abi( + "AllowedTokensRegistry", token_registry_address, AllowedTokensRegistry.abi + ) + + assert token_registry.isTokenAllowed(ldo) + assert token_registry.isTokenAllowed(usdc) + assert token_registry.getAllowedTokens() == [ldo, usdc] + assert len(token_registry.getAllowedTokens()) == 2 + + assert token_registry.hasRole(DEFAULT_ADMIN_ROLE, agent) + assert not token_registry.hasRole(DEFAULT_ADMIN_ROLE, token_registry_address) + assert not token_registry.hasRole(DEFAULT_ADMIN_ROLE, allowed_recipients_builder) + + assert token_registry.hasRole(ADD_TOKEN_TO_ALLOWED_LIST_ROLE, agent) + assert token_registry.hasRole(REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, agent) + + assert not token_registry.hasRole(ADD_TOKEN_TO_ALLOWED_LIST_ROLE, token_registry_address) + assert not token_registry.hasRole(REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, token_registry_address) + assert not token_registry.hasRole(ADD_TOKEN_TO_ALLOWED_LIST_ROLE, allowed_recipients_builder) + assert not token_registry.hasRole(REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, allowed_recipients_builder) def test_deploy_recipients_registry_reverts_recipients_length( - allowed_recipients_builder, accounts, stranger + allowed_recipients_builder, accounts, stranger, ldo ): limit = 1e18 period = 1 @@ -252,10 +302,11 @@ def test_deploy_recipients_registry_reverts_recipients_length( def test_deploy_recipients_registry_reverts_spentAmount_gt_limit( - allowed_recipients_builder, accounts, stranger + allowed_recipients_builder, accounts, stranger, ldo ): limit = 1e5 period = 1 + tokens = [ldo] recipients = [accounts[3], accounts[4]] titles = ["account 3", "account 4"] spentAmount = 1e10 @@ -273,11 +324,11 @@ def test_deploy_full_setup( ldo, evm_script_executor, AllowedRecipientsRegistry, + AllowedTokensRegistry, AddAllowedRecipient, RemoveAllowedRecipient, TopUpAllowedRecipients, ): - recipients = [ "0xbbe8dDEf5BF31b71Ff5DbE89635f9dB4DeFC667E", "0x07fC01f46dC1348d7Ce43787b5Bbd52d8711a92D", @@ -299,18 +350,21 @@ def test_deploy_full_setup( tx = allowed_recipients_builder.deployFullSetup( trusted_caller, - ldo, limit, period, + [ldo], recipients, titles, spent_amount, {"from": stranger}, ) - registry_address = tx.events["AllowedRecipientsRegistryDeployed"][ + recipients_registry_address = tx.events["AllowedRecipientsRegistryDeployed"][ "allowedRecipientsRegistry" ] + tokens_registry_address = tx.events["AllowedTokensRegistryDeployed"][ + "allowedTokensRegistry" + ] top_up_address = tx.events["TopUpAllowedRecipientsDeployed"][ "topUpAllowedRecipients" ] @@ -321,8 +375,14 @@ def test_deploy_full_setup( "removeAllowedRecipient" ] - registry = Contract.from_abi( - "AllowedRecipientsRegistry", registry_address, AllowedRecipientsRegistry.abi + recipients_registry = Contract.from_abi( + "AllowedRecipientsRegistry", + recipients_registry_address, + AllowedRecipientsRegistry.abi, + ) + + tokens_registry = Contract.from_abi( + "AllowedTokensRegistry", tokens_registry_address, AllowedTokensRegistry.abi ) top_up_allowed_recipients = Contract.from_abi( @@ -339,45 +399,69 @@ def test_deploy_full_setup( RemoveAllowedRecipient.abi, ) - assert top_up_allowed_recipients.token() == ldo - assert top_up_allowed_recipients.allowedRecipientsRegistry() == registry + assert top_up_allowed_recipients.allowedRecipientsRegistry() == recipients_registry assert top_up_allowed_recipients.trustedCaller() == trusted_caller - assert add_allowed_recipient.allowedRecipientsRegistry() == registry + assert add_allowed_recipient.allowedRecipientsRegistry() == recipients_registry assert add_allowed_recipient.trustedCaller() == trusted_caller - assert remove_allowed_recipient.allowedRecipientsRegistry() == registry + assert remove_allowed_recipient.allowedRecipientsRegistry() == recipients_registry assert remove_allowed_recipient.trustedCaller() == trusted_caller - assert len(registry.getAllowedRecipients()) == len(recipients) + assert len(recipients_registry.getAllowedRecipients()) == len(recipients) for recipient in recipients: - assert registry.isRecipientAllowed(recipient) + assert recipients_registry.isRecipientAllowed(recipient) - registry_limit, registry_period_duration = registry.getLimitParameters() + registry_limit, registry_period_duration = recipients_registry.getLimitParameters() assert registry_limit == limit assert registry_period_duration == period - assert registry.spendableBalance() == limit - spent_amount + assert recipients_registry.spendableBalance() == limit - spent_amount - assert registry.hasRole(ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, agent) - assert registry.hasRole(REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, agent) - assert registry.hasRole(SET_PARAMETERS_ROLE, agent) - assert registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, agent) - assert registry.hasRole(DEFAULT_ADMIN_ROLE, agent) + assert recipients_registry.hasRole(ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, agent) + assert recipients_registry.hasRole(REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, agent) + assert recipients_registry.hasRole(SET_PARAMETERS_ROLE, agent) + assert recipients_registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, agent) + assert recipients_registry.hasRole(DEFAULT_ADMIN_ROLE, agent) - assert registry.hasRole(ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, evm_script_executor) - assert registry.hasRole( + assert recipients_registry.hasRole( + ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, evm_script_executor + ) + assert recipients_registry.hasRole( REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, evm_script_executor ) - assert registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, evm_script_executor) - assert not registry.hasRole(SET_PARAMETERS_ROLE, evm_script_executor) - assert not registry.hasRole(DEFAULT_ADMIN_ROLE, evm_script_executor) + assert recipients_registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, evm_script_executor) + assert not recipients_registry.hasRole(SET_PARAMETERS_ROLE, evm_script_executor) + assert not recipients_registry.hasRole(DEFAULT_ADMIN_ROLE, evm_script_executor) - assert not registry.hasRole(ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, registry_address) - assert not registry.hasRole( - REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, registry_address + assert not recipients_registry.hasRole( + ADD_RECIPIENT_TO_ALLOWED_LIST_ROLE, recipients_registry_address ) - assert not registry.hasRole(SET_PARAMETERS_ROLE, registry_address) - assert not registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, registry_address) - assert not registry.hasRole(DEFAULT_ADMIN_ROLE, registry_address) + assert not recipients_registry.hasRole( + REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE, recipients_registry_address + ) + assert not recipients_registry.hasRole( + SET_PARAMETERS_ROLE, recipients_registry_address + ) + assert not recipients_registry.hasRole( + UPDATE_SPENT_AMOUNT_ROLE, recipients_registry_address + ) + assert not recipients_registry.hasRole( + DEFAULT_ADMIN_ROLE, recipients_registry_address + ) + + assert tokens_registry.isTokenAllowed(ldo) + assert tokens_registry.getAllowedTokens() == [ldo] + assert len(tokens_registry.getAllowedTokens()) == 1 + + assert tokens_registry.hasRole(DEFAULT_ADMIN_ROLE, agent) + assert not tokens_registry.hasRole(DEFAULT_ADMIN_ROLE, tokens_registry_address) + + assert tokens_registry.hasRole(ADD_TOKEN_TO_ALLOWED_LIST_ROLE, agent) + assert tokens_registry.hasRole(REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, agent) + + assert not tokens_registry.hasRole(ADD_TOKEN_TO_ALLOWED_LIST_ROLE, tokens_registry_address) + assert not tokens_registry.hasRole(REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, tokens_registry_address) + assert not tokens_registry.hasRole(ADD_TOKEN_TO_ALLOWED_LIST_ROLE, allowed_recipients_builder) + assert not tokens_registry.hasRole(REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, allowed_recipients_builder) def test_deploy_deploy_single_recipient_top_up_only_setup( @@ -388,9 +472,9 @@ def test_deploy_deploy_single_recipient_top_up_only_setup( stranger, evm_script_executor, AllowedRecipientsRegistry, + AllowedTokensRegistry, TopUpAllowedRecipients, ): - recipient = accounts[2] title = "recipient" limit = 1e18 @@ -398,12 +482,15 @@ def test_deploy_deploy_single_recipient_top_up_only_setup( spent_amount = 1e10 tx = allowed_recipients_builder.deploySingleRecipientTopUpOnlySetup( - recipient, title, ldo, limit, period, spent_amount, {"from": stranger} + recipient, title, [ldo], limit, period, spent_amount, {"from": stranger} ) registry_address = tx.events["AllowedRecipientsRegistryDeployed"][ "allowedRecipientsRegistry" ] + tokens_registry_address = tx.events["AllowedTokensRegistryDeployed"][ + "allowedTokensRegistry" + ] top_up_address = tx.events["TopUpAllowedRecipientsDeployed"][ "topUpAllowedRecipients" ] @@ -411,13 +498,15 @@ def test_deploy_deploy_single_recipient_top_up_only_setup( registry = Contract.from_abi( "AllowedRecipientsRegistry", registry_address, AllowedRecipientsRegistry.abi ) + tokens_registry = Contract.from_abi( + "AllowedTokensRegistry", tokens_registry_address, AllowedTokensRegistry.abi + ) top_up_allowed_recipients = Contract.from_abi( "TopUpAllowedRecipients", top_up_address, TopUpAllowedRecipients.abi ) assert top_up_allowed_recipients.allowedRecipientsRegistry() == registry - assert top_up_allowed_recipients.token() == ldo assert len(registry.getAllowedRecipients()) == 1 assert registry.isRecipientAllowed(recipient) @@ -449,3 +538,18 @@ def test_deploy_deploy_single_recipient_top_up_only_setup( assert not registry.hasRole(SET_PARAMETERS_ROLE, registry_address) assert not registry.hasRole(UPDATE_SPENT_AMOUNT_ROLE, registry_address) assert not registry.hasRole(DEFAULT_ADMIN_ROLE, registry_address) + + assert tokens_registry.isTokenAllowed(ldo) + assert tokens_registry.getAllowedTokens() == [ldo] + assert len(tokens_registry.getAllowedTokens()) == 1 + + assert tokens_registry.hasRole(DEFAULT_ADMIN_ROLE, agent) + assert not tokens_registry.hasRole(DEFAULT_ADMIN_ROLE, tokens_registry_address) + + assert tokens_registry.hasRole(ADD_TOKEN_TO_ALLOWED_LIST_ROLE, agent) + assert tokens_registry.hasRole(REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, agent) + + assert not tokens_registry.hasRole(ADD_TOKEN_TO_ALLOWED_LIST_ROLE, tokens_registry_address) + assert not tokens_registry.hasRole(REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, tokens_registry_address) + assert not tokens_registry.hasRole(ADD_TOKEN_TO_ALLOWED_LIST_ROLE, allowed_recipients_builder) + assert not tokens_registry.hasRole(REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, allowed_recipients_builder) diff --git a/tests/test_allowed_recipients_registry.py b/tests/test_allowed_recipients_registry.py index 7644dde1..7b9f93d1 100644 --- a/tests/test_allowed_recipients_registry.py +++ b/tests/test_allowed_recipients_registry.py @@ -1074,6 +1074,32 @@ def test_fail_if_update_spent_amount_when_no_period_duration_set(limits_checker) limits_checker.updateSpentAmount(123, {"from": update_spent_amount_role_holder}) +def test_fail_edge_case(limits_checker): + ( + limits_checker, + set_parameters_role_holder, + update_spent_amount_role_holder, + ) = limits_checker + period_limit, period_duration = 10 * 10 ** 18, 1 + + limits_checker.setLimitParameters( + period_limit, period_duration, {"from": set_parameters_role_holder} + ) + + limits_checker.updateSpentAmount(9 * 10**18, {"from": update_spent_amount_role_holder}) + assert limits_checker.isUnderSpendableBalance(1 * 10**18, 0) + assert not limits_checker.isUnderSpendableBalance(1 * 10**18 + 1, 0) + + advance_chain_time_to_beginning_of_the_next_period(period_duration) + + limits_checker.setLimitParameters( + 10 * 10 ** 18, period_duration, {"from": set_parameters_role_holder} + ) + + assert limits_checker.isUnderSpendableBalance(1 * 10**18, 0) + assert not limits_checker.isUnderSpendableBalance(1 * 10**18 + 1, 0) + + @pytest.mark.parametrize( "inputs, period_duration, expected_result", [ diff --git a/tests/test_allowed_tokens_registry.py b/tests/test_allowed_tokens_registry.py new file mode 100644 index 00000000..6feb7508 --- /dev/null +++ b/tests/test_allowed_tokens_registry.py @@ -0,0 +1,247 @@ +import pytest + +from brownie import reverts, ZERO_ADDRESS, MockERC20, accounts + +from utils.test_helpers import ( + access_revert_message, + DEFAULT_ADMIN_ROLE, + ADD_TOKEN_TO_ALLOWED_LIST_ROLE, + REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, +) + +# ------------ +# constructor +# ------------ + + +def test_registry_initial_state(AllowedTokensRegistry, accounts, owner): + add_token_role_holder = accounts[6] + remove_token_role_holder = accounts[7] + + registry = owner.deploy( + AllowedTokensRegistry, + owner, + [add_token_role_holder], + [remove_token_role_holder], + ) + + assert registry.hasRole(DEFAULT_ADMIN_ROLE, owner) + + assert registry.hasRole(ADD_TOKEN_TO_ALLOWED_LIST_ROLE, add_token_role_holder) + assert registry.hasRole( + REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE, remove_token_role_holder + ) + + for role_holder in [add_token_role_holder, remove_token_role_holder]: + assert not registry.hasRole(registry.DEFAULT_ADMIN_ROLE(), role_holder) + + assert len(registry.getAllowedTokens()) == 0 + + +def test_registry_zero_admin_allowed(AllowedTokensRegistry, owner): + """Checking no revert""" + owner.deploy(AllowedTokensRegistry, ZERO_ADDRESS, [owner], [owner]) + + +def test_registry_none_role_holders_allowed(AllowedTokensRegistry, owner): + """Checking no revert""" + owner.deploy(AllowedTokensRegistry, owner, [], []) + + +# ------------ +# access control +# ------------ + + +def test_rights_are_not_shared_by_different_roles( + AllowedTokensRegistry, + owner, + stranger, + voting, + ldo, + accounts, +): + deployer = owner + add_role_holder = accounts[6] + remove_role_holder = accounts[7] + + registry = deployer.deploy( + AllowedTokensRegistry, voting, [add_role_holder], [remove_role_holder] + ) + assert registry.hasRole(registry.DEFAULT_ADMIN_ROLE(), voting) + + for caller in [ + deployer, + remove_role_holder, + stranger, + ]: + with reverts(access_revert_message(caller, ADD_TOKEN_TO_ALLOWED_LIST_ROLE)): + registry.addToken(ldo, {"from": caller}) + + for caller in [ + deployer, + add_role_holder, + stranger, + ]: + with reverts( + access_revert_message(caller, REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE) + ): + registry.removeToken(ldo, {"from": caller}) + + +def test_multiple_role_holders( + AllowedTokensRegistry, owner, voting, accounts, ldo, steth +): + deployer = owner + add_role_holders = (accounts[2], accounts[3]) + remove_role_holders = (accounts[4], accounts[5]) + + registry = deployer.deploy( + AllowedTokensRegistry, voting, add_role_holders, remove_role_holders + ) + + for caller in accounts: + if not caller in add_role_holders: + with reverts(access_revert_message(caller, ADD_TOKEN_TO_ALLOWED_LIST_ROLE)): + registry.addToken(ldo, {"from": caller}) + + registry.addToken(ldo, {"from": add_role_holders[0]}) + registry.addToken(steth, {"from": add_role_holders[1]}) + + for caller in accounts: + if not caller in remove_role_holders: + with reverts( + access_revert_message(caller, REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE) + ): + registry.removeToken(ldo, {"from": caller}) + + registry.removeToken(ldo, {"from": remove_role_holders[0]}) + registry.removeToken(steth, {"from": remove_role_holders[1]}) + + +# ------------ +# logic +# ------------ + + + +def test_add_tokens(allowed_tokens_registry, ldo): + (registry, _, add_token_role_holder, _) = allowed_tokens_registry + + registry.addToken(ldo, {"from": add_token_role_holder}) + + assert registry.isTokenAllowed(ldo) + assert len(registry.getAllowedTokens()) == 1 + assert registry.getAllowedTokens()[0] == ldo + + +def test_add_multiple_tokens(allowed_tokens_registry, ldo, steth): + (registry, _, add_token_role_holder, _) = allowed_tokens_registry + + registry.addToken(ldo, {"from": add_token_role_holder}) + registry.addToken(steth, {"from": add_token_role_holder}) + + assert registry.isTokenAllowed(ldo) + assert registry.isTokenAllowed(steth) + assert len(registry.getAllowedTokens()) == 2 + assert registry.getAllowedTokens()[0] == ldo + assert registry.getAllowedTokens()[1] == steth + + +def test_add_zero_token(allowed_tokens_registry): + (registry, _, add_token_role_holder, _) = allowed_tokens_registry + + with reverts("TOKEN_ADDRESS_IS_ZERO"): + registry.addToken(ZERO_ADDRESS, {"from": add_token_role_holder}) + + +def test_add_the_same_token(allowed_tokens_registry, ldo): + (registry, _, add_token_role_holder, _) = allowed_tokens_registry + + registry.addToken(ldo, {"from": add_token_role_holder}) + + with reverts("TOKEN_ALREADY_ADDED_TO_ALLOWED_LIST"): + registry.addToken(ldo, {"from": add_token_role_holder}) + + +def test_remove_token(allowed_tokens_registry, ldo): + (registry, _, add_token_holder, remove_token_role_holder) = allowed_tokens_registry + + registry.addToken(ldo, {"from": add_token_holder}) + + assert registry.isTokenAllowed(ldo) + assert len(registry.getAllowedTokens()) == 1 + + registry.removeToken(ldo, {"from": remove_token_role_holder}) + + assert not registry.isTokenAllowed(ldo) + assert len(registry.getAllowedTokens()) == 0 + + +def test_remove_multiple_tokens(allowed_tokens_registry, ldo, steth): + (registry, _, add_token_holder, remove_token_role_holder) = allowed_tokens_registry + + registry.addToken(ldo, {"from": add_token_holder}) + registry.addToken(steth, {"from": add_token_holder}) + + assert registry.isTokenAllowed(ldo) + assert registry.isTokenAllowed(steth) + assert len(registry.getAllowedTokens()) == 2 + + registry.removeToken(ldo, {"from": remove_token_role_holder}) + + assert not registry.isTokenAllowed(ldo) + assert registry.isTokenAllowed(steth) + assert len(registry.getAllowedTokens()) == 1 + + registry.removeToken(steth, {"from": remove_token_role_holder}) + + assert not registry.isTokenAllowed(ldo) + assert not registry.isTokenAllowed(steth) + assert len(registry.getAllowedTokens()) == 0 + + +def test_remove_the_same_token(allowed_tokens_registry, ldo): + (registry, _, add_token_holder, remove_token_role_holder) = allowed_tokens_registry + + registry.addToken(ldo, {"from": add_token_holder}) + + assert registry.isTokenAllowed(ldo) + assert len(registry.getAllowedTokens()) == 1 + + registry.removeToken(ldo, {"from": remove_token_role_holder}) + + assert not registry.isTokenAllowed(ldo) + assert len(registry.getAllowedTokens()) == 0 + + with reverts("TOKEN_NOT_FOUND_IN_ALLOWED_LIST"): + registry.removeToken(ldo, {"from": remove_token_role_holder}) + + +def test_remove_not_existing_token(allowed_tokens_registry, ldo): + (registry, _, _, remove_token_role_holder) = allowed_tokens_registry + + with reverts("TOKEN_NOT_FOUND_IN_ALLOWED_LIST"): + registry.removeToken(ldo, {"from": remove_token_role_holder}) + + +def test_normalize_amount(allowed_tokens_registry): + (registry, _, _, _) = allowed_tokens_registry + + erc20decimals18 = MockERC20.deploy(18, {"from": accounts[0]}) + + with reverts("TOKEN_ADDRESS_IS_ZERO"): + registry.normalizeAmount(1, ZERO_ADDRESS) + + + amount1 = 1000000000000000999 + assert registry.normalizeAmount(amount1, erc20decimals18) == amount1 + + erc20decimals21 = MockERC20.deploy(21, {"from": accounts[0]}) + amount2 = 1000000000000000999000 + assert registry.normalizeAmount(amount2, erc20decimals21) == amount1 + assert registry.normalizeAmount(amount2 + 1, erc20decimals21) == amount1 + 1 + + erc20decimals12 = MockERC20.deploy(12, {"from": accounts[0]}) + amount3 = 1000000000009 + assert registry.normalizeAmount(amount3, erc20decimals12) == 1000000000009000000 diff --git a/utils/config.py b/utils/config.py index 736b0f18..34f9958d 100644 --- a/utils/config.py +++ b/utils/config.py @@ -22,7 +22,8 @@ def get_is_live(): "hardhat", "hardhat-fork", "mainnet-fork", - "goerli-fork" + "goerli-fork", + "holesky-fork" ] return network.show_active() not in dev_networks diff --git a/utils/deployed_date_time.py b/utils/deployed_date_time.py index 273bd9df..33b6cdf9 100644 --- a/utils/deployed_date_time.py +++ b/utils/deployed_date_time.py @@ -3,4 +3,6 @@ def date_time_contract(network: str = "mainnet") -> str: return "0x75100bd564415731b5936a4a94d0dc29dde5db3c" if network == "goerli" or network == "goerli-fork": return "0xb1e4de1092D0D32613e4BbFBf4D68650862f43A6" - raise NameError(f"""Unknown network "{network}". Supported networks: mainnet, goerli.""") + if network == "holesky" or network == "holesky-fork": + return "0xd6237FecDF9C1D9b023A5205C17549E3037EeEec" + raise NameError(f"""Unknown network "{network}". Supported networks: mainnet, goerli, holesky.""") diff --git a/utils/deployed_easy_track.py b/utils/deployed_easy_track.py index 9c556402..20bf2721 100644 --- a/utils/deployed_easy_track.py +++ b/utils/deployed_easy_track.py @@ -51,8 +51,27 @@ def addresses(network="mainnet"): reward_programs_registry="0x4CB0c9987fd670069e4b24c653981E86b261A2ca", ), ) + if network == "holesky" or network == "holesky-fork": + return EasyTrackSetup( + easy_track="0x1763b9ED3586B08AE796c7787811a2E1bc16163a", + evm_script_executor="0x2819B65021E13CEEB9AC33E77DB32c7e64e7520D", + increase_node_operator_staking_limit="0x18Ff3bD97739bf910cDCDb8d138976c6afDB4449", + top_up_lego_program=None, + reward_programs=RewardPrograms( + add_reward_program=None, + remove_reward_program=None, + top_up_reward_programs=None, + reward_programs_registry=None, + ), + referral_partners=RewardPrograms( + add_reward_program=None, + remove_reward_program=None, + top_up_reward_programs=None, + reward_programs_registry=None, + ), + ) raise NameError( - f"""Unknown network "{network}". Supported networks: mainnet, goerli.""" + f"""Unknown network "{network}". Supported networks: mainnet, goerli, holesky.""" ) diff --git a/utils/deployment.py b/utils/deployment.py index 35a684b3..b1b1c1bb 100644 --- a/utils/deployment.py +++ b/utils/deployment.py @@ -16,7 +16,7 @@ @dataclass class AllowedRecipientsDeployConfig: - token: str + tokens: [str] limit: int period: int spent_amount: int diff --git a/utils/lido.py b/utils/lido.py index 55f4fe64..9b27a858 100644 --- a/utils/lido.py +++ b/utils/lido.py @@ -32,8 +32,43 @@ def addresses(network=DEFAULT_NETWORK): steth="0x1643e812ae58766192cf7d2cf9567df2c37e9b7f", node_operators_registry="0x9d4af1ee19dad8857db3a45b0374c81c8a1c6320", ) + if network == "holesky" or network == "holesky-fork": + return LidoAddressesSetup( + aragon=AragonSetup( + acl="0xfd1E42595CeC3E83239bf8dFc535250e7F48E0bC", + agent="0xE92329EC7ddB11D25e25b3c21eeBf11f15eB325d", + voting="0xdA7d2573Df555002503F29aA4003e398d28cc00f", + finance="0xf0F281E5d7FBc54EAFcE0dA225CDbde04173AB16", + gov_token="0x14ae7daeecdf57034f3E9db8564e46Dba8D97344", + calls_script="0xAa8B4F258a4817bfb0058b861447878168ddf7B0", + token_manager="0xFaa1692c6eea8eeF534e7819749aD93a1420379A", + ), + steth="0x3F1c547b21f65e10480dE3ad8E19fAAC46C95034", + node_operators_registry="0x595F64Ddc3856a3b5Ff4f4CC1d1fb4B46cFd2bAC", + ) + raise NameError( + f"""Unknown network "{network}". Supported networks: mainnet, mainnet-fork goerli, goerli-fork, holesky, holesky-fork""" + ) + + +def external_contracts(network=DEFAULT_NETWORK): + if network == "mainnet" or network == "mainnet-fork": + return { + "usdc": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", + "dai": "0x6B175474E89094C44Da98b954EedeAC495271d0F", + } + if network == "goerli" or network == "goerli-fork": + return { + "usdc": "0xD87Ba7A50B2E7E660f678A895E4B72E7CB4CCd9C", + "dai": "0x56340274fB5a72af1A3C6609061c451De7961Bd4", + } + if network == "holesky" or network == "holesky-fork": + return { + "usdc": "0x9715b2786f1053294fc8952df923b95cab9aac42", + "dai": "0x2eb8e9198e647f80ccf62a5e291bcd4a5a3ca68c", + } raise NameError( - f"""Unknown network "{network}". Supported networks: mainnet, mainnet-fork goerli, goerli-fork""" + f"""Unknown network "{network}". Supported networks: mainnet, mainnet-fork goerli, goerli-fork, holesky, holesky-fork""" ) @@ -48,10 +83,14 @@ def allowed_recipients_builder(network=DEFAULT_NETWORK): ) if network == "goerli" or network == "goerli-fork": return brownie.AllowedRecipientsBuilder.at( - "0x1082512D1d60a0480445353eb55de451D261b684" + "0xC4573b7288c391d090F1b6e3343AE9782D4aF87d" + ) + if network == "holesky" or network == "holesky-fork": + return brownie.AllowedRecipientsBuilder.at( + "0xeC3785b13b21c226D66B5bC2E82BB2f4226f715e" ) raise NameError( - f"""Unknown network "{network}". Supported networks: mainnet, mainnet-fork goerli, goerli-fork""" + f"""Unknown network "{network}". Supported networks: mainnet, mainnet-fork goerli, goerli-fork, holesky, holesy-fork""" ) diff --git a/utils/test_helpers.py b/utils/test_helpers.py index ee0ada4a..6833b6ae 100644 --- a/utils/test_helpers.py +++ b/utils/test_helpers.py @@ -16,6 +16,12 @@ REMOVE_RECIPIENT_FROM_ALLOWED_LIST_ROLE = ( "0x491d7752c25cfca0f73715cde1130022a9b815373f91a996bbb1ba8943efc99b" ) +ADD_TOKEN_TO_ALLOWED_LIST_ROLE = ( + "0xf171689cfd5919fb6ea45c7db72005f66d37a9d2ecad9a9102caf8177435cf54" +) +REMOVE_TOKEN_FROM_ALLOWED_LIST_ROLE = ( + "0x9328ef869700347b81959a69acbca4adf93a9ee617e796e5692b2660ee007a81" +) PERMISSION_ERROR_TEMPLATE = "AccessControl: account %s is missing role %s"