diff --git a/crypto/identity/proof_of_possession.py b/crypto/identity/proof_of_possession.py new file mode 100644 index 0000000..5df7443 --- /dev/null +++ b/crypto/identity/proof_of_possession.py @@ -0,0 +1,53 @@ +import sys +import os +from os.path import dirname + +sys.path.append(os.path.join(dirname(dirname(__file__)), 'thirdparty/bls-signatures/python-impl')) + +from schemes import PopSchemeMPL, PrivateKey as BLSSchemePrivateKey + +from crypto.identity.bls_private_key import BLSPrivateKey + + +class ProofOfPossession: + @staticmethod + def derive_bls_private_key(passphrase: str) -> bytes: + """Derives a BLS private key (32 bytes) from a BIP-39 mnemonic.""" + return BLSPrivateKey.from_passphrase(passphrase).private_key + + @classmethod + def derive_bls_public_key(cls, passphrase: str) -> str: + """Derives the BLS12-381 G1 public key from a mnemonic. Returns hex (96 chars).""" + sk = BLSSchemePrivateKey.from_bytes(cls.derive_bls_private_key(passphrase)) + return bytes(sk.get_g1()).hex() + + @classmethod + def build_proof_of_possession(cls, private_key_bytes: bytes) -> dict: + """Builds proof of possession for a given private key. + + Args: + private_key_bytes: 32-byte BLS private key + + Returns: + dict with 'pk' (hex, 48 bytes G1) and 'pop' (hex, 96 bytes G2) + + Raises: + ValueError: if the key is not exactly 32 bytes or is the zero scalar + """ + if int.from_bytes(private_key_bytes, 'big') == 0: + raise ValueError('BLS secret key must not be zero') + + sk = BLSSchemePrivateKey.from_bytes(private_key_bytes) + pk = bytes(sk.get_g1()).hex() + pop = bytes(PopSchemeMPL.pop_prove(sk)).hex() + + return {'pk': pk, 'pop': pop} + + @classmethod + def from_passphrase(cls, passphrase: str) -> dict: + """Convenience: derives private key from mnemonic and builds PoP. + + Returns: + dict with 'pk' (hex, 48 bytes G1) and 'pop' (hex, 96 bytes G2) + """ + return cls.build_proof_of_possession(cls.derive_bls_private_key(passphrase)) diff --git a/crypto/transactions/builder/validator_registration_builder.py b/crypto/transactions/builder/validator_registration_builder.py index ee80f1c..a187251 100644 --- a/crypto/transactions/builder/validator_registration_builder.py +++ b/crypto/transactions/builder/validator_registration_builder.py @@ -1,15 +1,18 @@ from crypto.enums.contract_addresses import ContractAddresses +from crypto.identity.proof_of_possession import ProofOfPossession from crypto.transactions.builder.abstract_transaction_builder import AbstractTransactionBuilder from crypto.transactions.types.validator_registration import ValidatorRegistration + class ValidatorRegistrationBuilder(AbstractTransactionBuilder): def __init__(self, data: dict): super().__init__(data) - self.to(ContractAddresses.CONSENSUS.value) - def validator_public_key(self, validator_public_key: str): - self.transaction.data['validatorPublicKey'] = validator_public_key + def validator_passphrase(self, passphrase: str): + bls = ProofOfPossession.from_passphrase(passphrase) + self.transaction.data['validatorPublicKey'] = '0x' + bls['pk'] + self.transaction.data['validatorProof'] = '0x' + bls['pop'] self.transaction.refresh_payload_data() return self diff --git a/crypto/transactions/builder/validator_update_builder.py b/crypto/transactions/builder/validator_update_builder.py new file mode 100644 index 0000000..4adb898 --- /dev/null +++ b/crypto/transactions/builder/validator_update_builder.py @@ -0,0 +1,20 @@ +from crypto.enums.contract_addresses import ContractAddresses +from crypto.identity.proof_of_possession import ProofOfPossession +from crypto.transactions.builder.abstract_transaction_builder import AbstractTransactionBuilder +from crypto.transactions.types.validator_update import ValidatorUpdate + + +class ValidatorUpdateBuilder(AbstractTransactionBuilder): + def __init__(self, data: dict): + super().__init__(data) + self.to(ContractAddresses.CONSENSUS.value) + + def validator_passphrase(self, passphrase: str): + bls = ProofOfPossession.from_passphrase(passphrase) + self.transaction.data['validatorPublicKey'] = '0x' + bls['pk'] + self.transaction.data['validatorProof'] = '0x' + bls['pop'] + self.transaction.refresh_payload_data() + return self + + def get_transaction_instance(self, data: dict): + return ValidatorUpdate(data) diff --git a/crypto/transactions/deserializer.py b/crypto/transactions/deserializer.py index 8eadf2d..65c64d2 100644 --- a/crypto/transactions/deserializer.py +++ b/crypto/transactions/deserializer.py @@ -12,6 +12,7 @@ from crypto.transactions.types.unvote import Unvote from crypto.transactions.types.validator_registration import ValidatorRegistration from crypto.transactions.types.validator_resignation import ValidatorResignation +from crypto.transactions.types.validator_update import ValidatorUpdate from crypto.enums.abi_function import AbiFunction from crypto.utils.abi_decoder import AbiDecoder @@ -95,6 +96,9 @@ def __guess_transaction_from_data(self, data: dict) -> AbstractTransaction: if function_name == AbiFunction.VALIDATOR_RESIGNATION.value: return ValidatorResignation(data) + if function_name == AbiFunction.UPDATE_VALIDATOR.value: + return ValidatorUpdate(data) + username_payload_data = self.decode_payload(data, ContractAbiType.USERNAMES) if username_payload_data is not None: function_name = username_payload_data.get('functionName') diff --git a/crypto/transactions/types/validator_registration.py b/crypto/transactions/types/validator_registration.py index 126c304..e684cf1 100644 --- a/crypto/transactions/types/validator_registration.py +++ b/crypto/transactions/types/validator_registration.py @@ -1,19 +1,21 @@ -from typing import Optional from crypto.transactions.types.abstract_transaction import AbstractTransaction from crypto.utils.abi_encoder import AbiEncoder from crypto.enums.abi_function import AbiFunction -from crypto.utils.transaction_utils import TransactionUtils + class ValidatorRegistration(AbstractTransaction): def __init__(self, data: dict): payload = self._decode_payload(data) if payload: - data['validatorPublicKey'] = TransactionUtils.parse_hex_from_str(payload.get('args', [None])[0]) if payload.get('args') else None + data['validatorPublicKey'], data['validatorProof'] = payload['args'] super().__init__(data) def get_payload(self) -> str: - if 'validatorPublicKey' not in self.data: + if 'validatorPublicKey' not in self.data or 'validatorProof' not in self.data: return '' encoder = AbiEncoder() - return encoder.encode_function_call(AbiFunction.VALIDATOR_REGISTRATION.value, ['0x' + self.data['validatorPublicKey']]) + return encoder.encode_function_call( + AbiFunction.VALIDATOR_REGISTRATION.value, + [self.data['validatorPublicKey'], self.data['validatorProof']], + ) diff --git a/crypto/transactions/types/validator_update.py b/crypto/transactions/types/validator_update.py new file mode 100644 index 0000000..cefc0e2 --- /dev/null +++ b/crypto/transactions/types/validator_update.py @@ -0,0 +1,21 @@ +from crypto.transactions.types.abstract_transaction import AbstractTransaction +from crypto.utils.abi_encoder import AbiEncoder +from crypto.enums.abi_function import AbiFunction + + +class ValidatorUpdate(AbstractTransaction): + def __init__(self, data: dict): + payload = self._decode_payload(data) + if payload: + data['validatorPublicKey'], data['validatorProof'] = payload['args'] + + super().__init__(data) + + def get_payload(self) -> str: + if 'validatorPublicKey' not in self.data or 'validatorProof' not in self.data: + return '' + encoder = AbiEncoder() + return encoder.encode_function_call( + AbiFunction.UPDATE_VALIDATOR.value, + [self.data['validatorPublicKey'], self.data['validatorProof']], + ) diff --git a/crypto/utils/abi/json/Abi.Consensus.json b/crypto/utils/abi/json/Abi.Consensus.json index 69ed373..3c7b3f5 100644 --- a/crypto/utils/abi/json/Abi.Consensus.json +++ b/crypto/utils/abi/json/Abi.Consensus.json @@ -1,28 +1,54 @@ { "abi": [ { - "type": "constructor", + "type": "function", + "name": "UPGRADE_INTERFACE_VERSION", "inputs": [], - "stateMutability": "nonpayable" + "outputs": [{ "name": "", "type": "string", "internalType": "string" }], + "stateMutability": "view" }, { "type": "function", "name": "activeValidatorsCount", "inputs": [], - "outputs": [ - { "name": "", "type": "uint256", "internalType": "uint256" } - ], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], "stateMutability": "view" }, { "type": "function", - "name": "calculateTopValidators", + "name": "addValidator", + "inputs": [ + { "name": "addr", "type": "address", "internalType": "address" }, + { "name": "blsPublicKey", "type": "bytes", "internalType": "bytes" }, + { "name": "isResigned", "type": "bool", "internalType": "bool" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "addVotes", "inputs": [ - { "name": "n", "type": "uint8", "internalType": "uint8" } + { "name": "voters", "type": "address[]", "internalType": "address[]" }, + { "name": "validators", "type": "address[]", "internalType": "address[]" } ], "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "function", + "name": "calculateRoundValidators", + "inputs": [{ "name": "n", "type": "uint8", "internalType": "uint8" }], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "fee", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, { "type": "function", "name": "getAllValidators", @@ -31,38 +57,19 @@ { "name": "", "type": "tuple[]", - "internalType": "struct Validator[]", + "internalType": "struct ConsensusV1.Validator[]", "components": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - }, + { "name": "addr", "type": "address", "internalType": "address" }, { "name": "data", "type": "tuple", - "internalType": "struct ValidatorData", + "internalType": "struct ConsensusV1.ValidatorData", "components": [ - { - "name": "votersCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "voteBalance", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "isResigned", - "type": "bool", - "internalType": "bool" - }, - { - "name": "bls12_381_public_key", - "type": "bytes", - "internalType": "bytes" - } + { "name": "voteBalance", "type": "uint256", "internalType": "uint256" }, + { "name": "fee", "type": "uint128", "internalType": "uint128" }, + { "name": "votersCount", "type": "uint64", "internalType": "uint64" }, + { "name": "isResigned", "type": "bool", "internalType": "bool" }, + { "name": "blsPublicKey", "type": "bytes", "internalType": "bytes" } ] } ] @@ -72,45 +79,25 @@ }, { "type": "function", - "name": "getRounds", - "inputs": [ - { - "name": "offset", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "count", - "type": "uint256", - "internalType": "uint256" - } - ], + "name": "getRoundValidators", + "inputs": [], "outputs": [ { "name": "", "type": "tuple[]", - "internalType": "struct Round[]", + "internalType": "struct ConsensusV1.Validator[]", "components": [ + { "name": "addr", "type": "address", "internalType": "address" }, { - "name": "round", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "validators", - "type": "tuple[]", - "internalType": "struct RoundValidator[]", + "name": "data", + "type": "tuple", + "internalType": "struct ConsensusV1.ValidatorData", "components": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "voteBalance", - "type": "uint256", - "internalType": "uint256" - } + { "name": "voteBalance", "type": "uint256", "internalType": "uint256" }, + { "name": "fee", "type": "uint128", "internalType": "uint128" }, + { "name": "votersCount", "type": "uint64", "internalType": "uint64" }, + { "name": "isResigned", "type": "bool", "internalType": "bool" }, + { "name": "blsPublicKey", "type": "bytes", "internalType": "bytes" } ] } ] @@ -120,53 +107,25 @@ }, { "type": "function", - "name": "getRoundsCount", - "inputs": [], - "outputs": [ - { "name": "", "type": "uint256", "internalType": "uint256" } + "name": "getRounds", + "inputs": [ + { "name": "offset", "type": "uint256", "internalType": "uint256" }, + { "name": "count", "type": "uint256", "internalType": "uint256" } ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getTopValidators", - "inputs": [], "outputs": [ { "name": "", "type": "tuple[]", - "internalType": "struct Validator[]", + "internalType": "struct ConsensusV1.Round[]", "components": [ + { "name": "round", "type": "uint256", "internalType": "uint256" }, { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "tuple", - "internalType": "struct ValidatorData", + "name": "validators", + "type": "tuple[]", + "internalType": "struct ConsensusV1.RoundValidator[]", "components": [ - { - "name": "votersCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "voteBalance", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "isResigned", - "type": "bool", - "internalType": "bool" - }, - { - "name": "bls12_381_public_key", - "type": "bytes", - "internalType": "bytes" - } + { "name": "addr", "type": "address", "internalType": "address" }, + { "name": "voteBalance", "type": "uint256", "internalType": "uint256" } ] } ] @@ -174,52 +133,34 @@ ], "stateMutability": "view" }, + { + "type": "function", + "name": "getRoundsCount", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, { "type": "function", "name": "getValidator", - "inputs": [ - { - "name": "_addr", - "type": "address", - "internalType": "address" - } - ], + "inputs": [{ "name": "addr", "type": "address", "internalType": "address" }], "outputs": [ { "name": "", "type": "tuple", - "internalType": "struct Validator", + "internalType": "struct ConsensusV1.Validator", "components": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - }, + { "name": "addr", "type": "address", "internalType": "address" }, { "name": "data", "type": "tuple", - "internalType": "struct ValidatorData", + "internalType": "struct ConsensusV1.ValidatorData", "components": [ - { - "name": "votersCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "voteBalance", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "isResigned", - "type": "bool", - "internalType": "bool" - }, - { - "name": "bls12_381_public_key", - "type": "bytes", - "internalType": "bytes" - } + { "name": "voteBalance", "type": "uint256", "internalType": "uint256" }, + { "name": "fee", "type": "uint128", "internalType": "uint128" }, + { "name": "votersCount", "type": "uint64", "internalType": "uint64" }, + { "name": "isResigned", "type": "bool", "internalType": "bool" }, + { "name": "blsPublicKey", "type": "bytes", "internalType": "bytes" } ] } ] @@ -231,33 +172,17 @@ "type": "function", "name": "getVotes", "inputs": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "count", - "type": "uint256", - "internalType": "uint256" - } + { "name": "addr", "type": "address", "internalType": "address" }, + { "name": "count", "type": "uint256", "internalType": "uint256" } ], "outputs": [ { "name": "", "type": "tuple[]", - "internalType": "struct VoteResult[]", + "internalType": "struct ConsensusV1.VoteResult[]", "components": [ - { - "name": "voter", - "type": "address", - "internalType": "address" - }, - { - "name": "validator", - "type": "address", - "internalType": "address" - } + { "name": "voter", "type": "address", "internalType": "address" }, + { "name": "validator", "type": "address", "internalType": "address" } ] } ], @@ -267,108 +192,90 @@ "type": "function", "name": "getVotesCount", "inputs": [], - "outputs": [ - { "name": "", "type": "uint256", "internalType": "uint256" } - ], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], "stateMutability": "view" }, + { + "type": "function", + "name": "initialize", + "inputs": [{ "name": "registrationFee", "type": "uint128", "internalType": "uint128" }], + "outputs": [], + "stateMutability": "nonpayable" + }, { "type": "function", "name": "isValidatorRegistered", - "inputs": [ - { "name": "addr", "type": "address", "internalType": "address" } - ], + "inputs": [{ "name": "addr", "type": "address", "internalType": "address" }], "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], "stateMutability": "view" }, { "type": "function", - "name": "registerValidator", - "inputs": [ - { - "name": "bls12_381_public_key", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" + "name": "owner", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" }, { "type": "function", - "name": "registeredValidatorsCount", + "name": "proxiableUUID", "inputs": [], - "outputs": [ - { "name": "", "type": "uint256", "internalType": "uint256" } - ], + "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], "stateMutability": "view" }, { "type": "function", - "name": "resignValidator", + "name": "registerValidator", + "inputs": [ + { "name": "blsPublicKey", "type": "bytes", "internalType": "bytes" }, + { "name": "proofOfPossession", "type": "bytes", "internalType": "bytes" } + ], + "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "renounceOwnership", "inputs": [], "outputs": [], "stateMutability": "nonpayable" }, + { "type": "function", "name": "resignValidator", "inputs": [], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", "name": "resignedValidatorsCount", "inputs": [], - "outputs": [ - { "name": "", "type": "uint256", "internalType": "uint256" } - ], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], "stateMutability": "view" }, { "type": "function", - "name": "unvote", + "name": "roundValidatorsCount", "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "setFee", + "inputs": [{ "name": "registrationFee", "type": "uint128", "internalType": "uint128" }], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "transferOwnership", + "inputs": [{ "name": "newOwner", "type": "address", "internalType": "address" }], "outputs": [], "stateMutability": "nonpayable" }, + { "type": "function", "name": "unvote", "inputs": [], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", "name": "updateValidator", "inputs": [ - { - "name": "_validator", - "type": "tuple", - "internalType": "struct Validator", - "components": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "tuple", - "internalType": "struct ValidatorData", - "components": [ - { - "name": "votersCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "voteBalance", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "isResigned", - "type": "bool", - "internalType": "bool" - }, - { - "name": "bls12_381_public_key", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ] - } + { "name": "blsPublicKey", "type": "bytes", "internalType": "bytes" }, + { "name": "proofOfPossession", "type": "bytes", "internalType": "bytes" } ], "outputs": [], "stateMutability": "nonpayable" @@ -376,73 +283,98 @@ { "type": "function", "name": "updateVoters", - "inputs": [ - { - "name": "voters", - "type": "address[]", - "internalType": "address[]" - } - ], + "inputs": [{ "name": "voters", "type": "address[]", "internalType": "address[]" }], "outputs": [], "stateMutability": "nonpayable" }, { "type": "function", - "name": "vote", + "name": "upgradeToAndCall", "inputs": [ - { "name": "addr", "type": "address", "internalType": "address" } + { "name": "newImplementation", "type": "address", "internalType": "address" }, + { "name": "data", "type": "bytes", "internalType": "bytes" } ], "outputs": [], + "stateMutability": "payable" + }, + { + "type": "function", + "name": "validatorsCount", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "version", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "pure" + }, + { + "type": "function", + "name": "vote", + "inputs": [{ "name": "addr", "type": "address", "internalType": "address" }], + "outputs": [], "stateMutability": "nonpayable" }, + { + "type": "event", + "name": "FeeUpdated", + "inputs": [{ "name": "fee", "type": "uint256", "indexed": false, "internalType": "uint256" }], + "anonymous": false + }, + { + "type": "event", + "name": "Initialized", + "inputs": [{ "name": "version", "type": "uint64", "indexed": false, "internalType": "uint64" }], + "anonymous": false + }, + { + "type": "event", + "name": "OwnershipTransferred", + "inputs": [ + { "name": "previousOwner", "type": "address", "indexed": true, "internalType": "address" }, + { "name": "newOwner", "type": "address", "indexed": true, "internalType": "address" } + ], + "anonymous": false + }, { "type": "event", "name": "Unvoted", "inputs": [ - { - "name": "voter", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "validator", - "type": "address", - "indexed": false, - "internalType": "address" - } + { "name": "voter", "type": "address", "indexed": false, "internalType": "address" }, + { "name": "validator", "type": "address", "indexed": false, "internalType": "address" } ], "anonymous": false }, + { + "type": "event", + "name": "Upgraded", + "inputs": [{ "name": "implementation", "type": "address", "indexed": true, "internalType": "address" }], + "anonymous": false + }, { "type": "event", "name": "ValidatorRegistered", "inputs": [ - { - "name": "addr", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "bls12_381_public_key", - "type": "bytes", - "indexed": false, - "internalType": "bytes" - } + { "name": "addr", "type": "address", "indexed": false, "internalType": "address" }, + { "name": "blsPublicKey", "type": "bytes", "indexed": false, "internalType": "bytes" } ], "anonymous": false }, { "type": "event", "name": "ValidatorResigned", + "inputs": [{ "name": "addr", "type": "address", "indexed": false, "internalType": "address" }], + "anonymous": false + }, + { + "type": "event", + "name": "ValidatorUpdated", "inputs": [ - { - "name": "addr", - "type": "address", - "indexed": false, - "internalType": "address" - } + { "name": "addr", "type": "address", "indexed": false, "internalType": "address" }, + { "name": "blsPublicKey", "type": "bytes", "indexed": false, "internalType": "bytes" } ], "anonymous": false }, @@ -450,87 +382,197 @@ "type": "event", "name": "Voted", "inputs": [ - { - "name": "voter", - "type": "address", - "indexed": false, - "internalType": "address" - }, - { - "name": "validator", - "type": "address", - "indexed": false, - "internalType": "address" - } + { "name": "voter", "type": "address", "indexed": false, "internalType": "address" }, + { "name": "validator", "type": "address", "indexed": false, "internalType": "address" } ], "anonymous": false - } + }, + { + "type": "error", + "name": "AddressEmptyCode", + "inputs": [{ "name": "target", "type": "address", "internalType": "address" }] + }, + { "type": "error", "name": "AlreadyVoted", "inputs": [] }, + { "type": "error", "name": "BellowMinValidators", "inputs": [] }, + { "type": "error", "name": "BlsKeyAlreadyRegistered", "inputs": [] }, + { "type": "error", "name": "BlsKeyIsInvalid", "inputs": [] }, + { "type": "error", "name": "CallerIsNotValidator", "inputs": [] }, + { + "type": "error", + "name": "ERC1967InvalidImplementation", + "inputs": [{ "name": "implementation", "type": "address", "internalType": "address" }] + }, + { "type": "error", "name": "ERC1967NonPayable", "inputs": [] }, + { "type": "error", "name": "FailedCall", "inputs": [] }, + { "type": "error", "name": "ImportIsNotAllowed", "inputs": [] }, + { "type": "error", "name": "InvalidFee", "inputs": [] }, + { "type": "error", "name": "InvalidInitialization", "inputs": [] }, + { "type": "error", "name": "InvalidInputLength", "inputs": [] }, + { "type": "error", "name": "InvalidParameters", "inputs": [] }, + { "type": "error", "name": "InvalidProofOfPossession", "inputs": [] }, + { + "type": "error", + "name": "InvalidRange", + "inputs": [ + { "name": "min", "type": "uint256", "internalType": "uint256" }, + { "name": "max", "type": "uint256", "internalType": "uint256" } + ] + }, + { "type": "error", "name": "MissingVote", "inputs": [] }, + { "type": "error", "name": "NoActiveValidators", "inputs": [] }, + { "type": "error", "name": "NotInitializing", "inputs": [] }, + { + "type": "error", + "name": "OwnableInvalidOwner", + "inputs": [{ "name": "owner", "type": "address", "internalType": "address" }] + }, + { + "type": "error", + "name": "OwnableUnauthorizedAccount", + "inputs": [{ "name": "account", "type": "address", "internalType": "address" }] + }, + { "type": "error", "name": "PrecompileCallFailed", "inputs": [] }, + { "type": "error", "name": "RefundFailed", "inputs": [] }, + { "type": "error", "name": "UUPSUnauthorizedCallContext", "inputs": [] }, + { + "type": "error", + "name": "UUPSUnsupportedProxiableUUID", + "inputs": [{ "name": "slot", "type": "bytes32", "internalType": "bytes32" }] + }, + { "type": "error", "name": "ValidatorAlreadyRegistered", "inputs": [] }, + { "type": "error", "name": "ValidatorAlreadyResigned", "inputs": [] }, + { "type": "error", "name": "ValidatorNotRegistered", "inputs": [] }, + { "type": "error", "name": "VoteResignedValidator", "inputs": [] }, + { "type": "error", "name": "VoteSameValidator", "inputs": [] }, + { "type": "error", "name": "VoteValidatorWithoutBlsPublicKey", "inputs": [] } ], "bytecode": { - "object": "0x60a06040525f80805560018190556007819055600880546001600160a01b0319908116909155600980549091169055600c5534801561003c575f5ffd5b5033608052608051612bdb61007c5f395f81816103e4015281816104c30152818161069301528181610a0901528181610f2101526114e90152612bdb5ff3fe608060405234801561000f575f5ffd5b5060043610610111575f3560e01c80636dd7d8ea1161009e578063b85f5da21161006e578063b85f5da214610202578063d04a68c71461020a578063eb9019d414610245578063f1bd0b3714610265578063f3513a371461026c575f5ffd5b80636dd7d8ea146101bf578063a09686c4146101d2578063afeea115146101da578063b5cfa68c146101ef575f5ffd5b80632bdf6d43116100e45780632bdf6d431461015c5780633174b6891461017157806340f74f4714610179578063602a9eee1461019957806362525879146101ac575f5ffd5b80630777cbef146101155780630d2bd9091461012c5780631904bb2e146101345780631b605b8614610154575b5f5ffd5b6001545b6040519081526020015b60405180910390f35b600d54610119565b610147610142366004612457565b610274565b60405161012391906124fb565b600754610119565b61016f61016a36600461250d565b6103d9565b005b61016f610467565b61018c61018736600461257c565b6104b6565b604051610123919061259c565b61016f6101a7366004612655565b610689565b61016f6101ba3660046126b1565b610964565b61016f6101cd366004612457565b6109ff565b600e54610119565b6101e2610d79565b60405161012391906126e7565b61016f6101fd36600461273e565b610f16565b61016f6113bb565b610235610218366004612457565b6001600160a01b03165f9081526003602052604090205460ff1690565b6040519015158152602001610123565b61025861025336600461275e565b6114dc565b6040516101239190612786565b5f54610119565b6101e261171d565b61027c612361565b6001600160a01b0382165f9081526003602052604090205460ff166102e85760405162461bcd60e51b815260206004820152601c60248201527f56616c696461746f724461746120646f65736e2774206578697374730000000060448201526064015b60405180910390fd5b6040805180820182526001600160a01b0384168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff16151594820194909452600384018054939492850193919291606084019190610350906127e0565b80601f016020809104026020016040519081016040528092919081815260200182805461037c906127e0565b80156103c75780601f1061039e576101008083540402835291602001916103c7565b820191905f5260205f20905b8154815290600101906020018083116103aa57829003601f168201915b50505091909252505050905292915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104215760405162461bcd60e51b81526004016102df90612812565b5f5b818110156104625761045a83838381811061044057610440612847565b90506020020160208101906104559190612457565b6118b4565b600101610423565b505050565b7f6572af8bf9a0a86efb88dcc30011626a15c9c4603503aa4466a3f87a1867deef33610491611994565b604080516001600160a01b0393841681529290911660208301520160405180910390a1565b6060336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105005760405162461bcd60e51b81526004016102df90612812565b600e548290841061051257505f610536565b600e5461051f848661286f565b111561053657600e54610533908590612882565b90505b5f816001600160401b0381111561054f5761054f612895565b60405190808252806020026020018201604052801561059457816020015b604080518082019091525f81526060602082015281526020019060019003908161056d5790505b5090505f5b8281101561067e57604051806040016040528082886105b8919061286f565b6105c390600161286f565b8152602001600e6105d4848a61286f565b815481106105e4576105e4612847565b905f5260205f2001805480602002602001604051908101604052809291908181526020015f905b82821015610652575f848152602090819020604080518082019091526002850290910180546001600160a01b0316825260019081015482840152908352909201910161060b565b5050505081525082828151811061066b5761066b612847565b6020908102919091010152600101610599565b509150505b92915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036107015760405162461bcd60e51b815260206004820152601c60248201527f43616c6c65722069732074686520636f6e7472616374206f776e65720000000060448201526064016102df565b335f9081526003602052604090205460ff16156107605760405162461bcd60e51b815260206004820152601f60248201527f56616c696461746f7220697320616c726561647920726567697374657265640060448201526064016102df565b5f82826040516107719291906128a9565b60408051918290039091205f8181526004602052919091205490915060ff16156107e95760405162461bcd60e51b815260206004820152602360248201527f424c5331322d333831206b657920697320616c726561647920726567697374656044820152621c995960ea1b60648201526084016102df565b6107f38383611bfc565b5f60405180608001604052805f81526020015f81526020015f1515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920182905250939094525050805492935090508061085b836128b8565b9091555050335f9081526003602081815260408084208054600160ff1991821681179092556002808552958390208751815593870151918401919091559085015193820180549091169315159390931790925560608301518392918201906108c39082612914565b5050505f82815260046020526040808220805460ff191660019081179091556005805491820181559092527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090910180546001600160a01b0319163390811790915590517f61809fa303a3a57f4d70552f533f3e0b003173d424590cd4bb22a2afe000990c9161095691879087906129ce565b60405180910390a150505050565b6109746102186020830183612457565b6109c05760405162461bcd60e51b815260206004820152601c60248201527f56616c696461746f724461746120646f65736e2774206578697374730000000060448201526064016102df565b6109cd6020820182612a0d565b60025f6109dd6020850185612457565b6001600160a01b0316815260208101919091526040015f206104628282612ae4565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163303610a775760405162461bcd60e51b815260206004820152601c60248201527f43616c6c65722069732074686520636f6e7472616374206f776e65720000000060448201526064016102df565b6001600160a01b0381165f9081526003602052604090205460ff16610ade5760405162461bcd60e51b815260206004820152601760248201527f4d75737420766f746520666f722076616c696461746f7200000000000000000060448201526064016102df565b6001600160a01b0381165f9081526002602081905260409091209081015460ff1615610b575760405162461bcd60e51b815260206004820152602260248201527f4d75737420766f746520666f7220756e72657369676e65642076616c6964617460448201526137b960f11b60648201526084016102df565b335f90815260066020526040902080546001600160a01b03848116911603610bc15760405162461bcd60e51b815260206004820181905260248201527f416c726561647920766f74656420666f7220746869732076616c696461746f7260448201526064016102df565b80546001600160a01b031615610bdb57610bd9611994565b505b604080516080810182526001600160a01b03808616825233803160208085019182525f85870181815260608701828152948252600690925295909520935184549084166001600160a01b03199182161785559051600185015593516002840180549184169186169190911790555160039092018054928216929093169190911790915560085416610c8d5760088054336001600160a01b03199182168117909255600980549091169091179055610ce4565b600980546001600160a01b039081165f9081526006602052604080822060030180546001600160a01b0319908116339081179092558554828552929093206002018054841692909416919091179092558254161790555b60078054905f610cf3836128b8565b9190505550336001600160a01b031631826001015f828254610d15919061286f565b9091555050815460019083905f90610d2e90849061286f565b9091555050604080513381526001600160a01b03851660208201527fce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2910160405180910390a1505050565b600d546060905f906001600160401b03811115610d9857610d98612895565b604051908082528060200260200182016040528015610dd157816020015b610dbe612361565b815260200190600190039081610db65790505b5090505f5b600d54811015610f10575f600d8281548110610df457610df4612847565b5f9182526020808320909101546001600160a01b03168083526002808352604093849020845180860186528381528551608081018752825481526001830154818701529282015460ff1615159583019590955260038101805493965090949384019285916060840191610e66906127e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610e92906127e0565b8015610edd5780601f10610eb457610100808354040283529160200191610edd565b820191905f5260205f20905b815481529060010190602001808311610ec057829003601f168201915b505050505081525050815250848481518110610efb57610efb612847565b60209081029190910101525050600101610dd6565b50919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f5e5760405162461bcd60e51b81526004016102df90612812565b610f66611c5e565b610f6e611dad565b600a80546001600160a01b03191690556001545f80549091610fa09160ff8516918491610f9b9190612882565b611dfe565b90508060ff165f03610fb0575050565b5f5b60055481101561125b575f60058281548110610fd057610fd0612847565b5f9182526020808320909101546001600160a01b03168083526002918290526040909220908101549192509060ff161561100b575050611253565b600a546001600160a01b03166110465750600a80546001600160a01b0319166001600160a01b03929092169190911790556001600c55611253565b8360ff16600c5410156110645761105d8285611e8f565b5050611253565b600a546001600160a01b039081165f908152600260208181526040928390208351808501855294871685528351608081018552865481526001870154818401529286015460ff161515938301939093526003850180549394611240949093928401929187916060840191906110d8906127e0565b80601f0160208091040260200160405190810160405280929190818152602001828054611104906127e0565b801561114f5780601f106111265761010080835404028352916020019161114f565b820191905f5260205f20905b81548152906001019060200180831161113257829003601f168201915b505050919092525050509052604080518082018252600a546001600160a01b031681528151608081018352855481526001860154602082810191909152600287015460ff161515938201939093526003860180549293840192879160608401916111b8906127e0565b80601f01602080910402602001604051908101604052809291908181526020018280546111e4906127e0565b801561122f5780601f106112065761010080835404028352916020019161122f565b820191905f5260205f20905b81548152906001019060200180831161121257829003601f168201915b50505050508152505081525061226e565b1561124f5761124f8386611e8f565b5050505b600101610fb2565b50600e80546001810182555f918252600a547fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd909101916001600160a01b03909116906112aa90600d906123aa565b8260ff166001600160401b038111156112c5576112c5612895565b6040519080825280602002602001820160405280156112ee578160200160208202803683370190505b50805161130391600d916020909101906123c5565b505f5b8360ff168110156113b35781600d828154811061132557611325612847565b5f918252602080832090910180546001600160a01b039485166001600160a01b03199182161790915560408051808201825296851680885280855260028085528286206001908101548a87019081528b548083018d558c89528789209b519302909a01805492891692909516919091178455975192880192909255908352600b909152902054169101611306565b505050505b50565b335f9081526003602052604090205460ff166114195760405162461bcd60e51b815260206004820152601960248201527f43616c6c6572206973206e6f7420612076616c696461746f720000000000000060448201526064016102df565b335f9081526002602081905260409091209081015460ff161561147e5760405162461bcd60e51b815260206004820152601d60248201527f56616c696461746f7220697320616c72656164792072657369676e656400000060448201526064016102df565b60028101805460ff19166001908117909155805481905f906114a190839061286f565b90915550506040513381527f24250fc1ec78a1405ddd4cc8b75964858af228d05faa8d4bc1302966d8a541179060200160405180910390a150565b6060336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146115265760405162461bcd60e51b81526004016102df90612812565b5f611534835f600754611dfe565b6001600160401b0381111561154b5761154b612895565b60405190808252806020026020018201604052801561158f57816020015b604080518082019091525f80825260208201528152602001906001900390816115695790505b506008549091506001600160a01b03908116908516156115c857506001600160a01b038085165f90815260066020526040902060030154165b5f5b6001600160a01b038216158015906115e157508481105b15611656576001600160a01b038083165f818152600660209081526040918290208251808401909352928252825490931692810192909252908483611625816128b8565b94508151811061163757611637612847565b6020908102919091010152600301546001600160a01b031691506115ca565b8083510361166957829350505050610683565b5f816001600160401b0381111561168257611682612895565b6040519080825280602002602001820160405280156116c657816020015b604080518082019091525f80825260208201528152602001906001900390816116a05790505b5090505f5b82811015611712578481815181106116e5576116e5612847565b60200260200101518282815181106116ff576116ff612847565b60209081029190910101526001016116cb565b509695505050505050565b6005546060905f906001600160401b0381111561173c5761173c612895565b60405190808252806020026020018201604052801561177557816020015b611762612361565b81526020019060019003908161175a5790505b5090505f5b600554811015610f10575f6005828154811061179857611798612847565b5f9182526020808320909101546001600160a01b03168083526002808352604093849020845180860186528381528551608081018752825481526001830154818701529282015460ff161515958301959095526003810180549396509094938401928591606084019161180a906127e0565b80601f0160208091040260200160405190810160405280929190818152602001828054611836906127e0565b80156118815780601f1061185857610100808354040283529160200191611881565b820191905f5260205f20905b81548152906001019060200180831161186457829003601f168201915b50505050508152505081525084848151811061189f5761189f612847565b6020908102919091010152505060010161177a565b6001600160a01b038082165f90815260066020526040902080549091166118d9575050565b60018101546001600160a01b0383163181101561193a57611904816001600160a01b03851631612882565b82546001600160a01b03165f908152600260205260408120600101805490919061192f90849061286f565b9091555061197f9050565b61194e6001600160a01b0384163182612882565b82546001600160a01b03165f9081526002602052604081206001018054909190611979908490612882565b90915550505b506001600160a01b0390911631600190910155565b335f90815260066020526040812080546001600160a01b0316611a075760405162461bcd60e51b815260206004820152602560248201527f4d75737420766f746520666f722076616c696461746f72206265666f726520756044820152646e766f746560d81b60648201526084016102df565b6009546008546001600160a01b03918216911603611a4057600880546001600160a01b0319908116909155600980549091169055611b53565b600954336001600160a01b0390911603611a99576002810180546001600160a01b039081165f90815260066020526040902060030180546001600160a01b03199081169091559154600980549093169116179055611b53565b600854336001600160a01b0390911603611afd576009546001600160a01b039081165f9081526006602052604080822060020180546001600160a01b0319908116909155600880548086168552929093206003015491169216919091179055611b53565b60038181018054600280850180546001600160a01b039081165f9081526006602052604080822090970180549583166001600160a01b031996871617905591549454811682529490200180549290931691161790555b80546001600160a01b03165f818152600260205260408120600180850154908201805492939192909190611b88908490612882565b9091555050805460019082905f90611ba1908490612882565b9091555050335f90815260066020526040812080546001600160a01b0319908116825560018201839055600282018054821690556003909101805490911690556007805491611bef83612b71565b9091555091949350505050565b60308114611c5a5760405162461bcd60e51b815260206004820152602560248201527f424c5331322d333831207075626c69634b6579206c656e67746820697320696e6044820152641d985b1a5960da1b60648201526084016102df565b5050565b6005545f611c6d600183612882565b90505b8015611c5a575f611c8282600161286f565b60408051426020820152449181019190915260608101849052608001604051602081830303815290604052805190602001205f1c611cc09190612b86565b90505f60058381548110611cd657611cd6612847565b5f91825260209091200154600580546001600160a01b0390921692509083908110611d0357611d03612847565b5f91825260209091200154600580546001600160a01b039092169185908110611d2e57611d2e612847565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508060058381548110611d6d57611d6d612847565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050508080611da590612b71565b915050611c70565b600a546001600160a01b03165b6001600160a01b03811615611df7576001600160a01b039081165f908152600b6020526040902080546001600160a01b0319811690915516611dba565b505f600c55565b5f81831115611e675760405162461bcd60e51b815260206004820152602f60248201527f4d696e696d756d2073686f756c64206265206c657373207468616e206f72206560448201526e7175616c20746f206d6178696d756d60881b60648201526084016102df565b82841015611e76575081611e88565b81841115611e85575080611e88565b50825b9392505050565b6001600160a01b0382165f9081526002602081815260408084208151608081018352815481526001820154938101939093529283015460ff16151590820152600382018054919291606084019190611ee6906127e0565b80601f0160208091040260200160405190810160405280929190818152602001828054611f12906127e0565b8015611f5d5780601f10611f3457610100808354040283529160200191611f5d565b820191905f5260205f20905b815481529060010190602001808311611f4057829003601f168201915b505050919092525050604080518082018252600a546001600160a01b03168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff1615159482019490945260038401805496975061207e9693955091850193909290916060840191611fd8906127e0565b80601f0160208091040260200160405190810160405280929190818152602001828054612004906127e0565b801561204f5780601f106120265761010080835404028352916020019161204f565b820191905f5260205f20905b81548152906001019060200180831161203257829003601f168201915b5050505050815250508152506040518060400160405280866001600160a01b031681526020018481525061226e565b156120915761208c836122b2565b61220f565b600a546001600160a01b039081165f818152600b6020526040902054909116905b6001600160a01b0382166120cf576120ca8186612303565b61220c565b6040805180820182526001600160a01b0384168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff161515948201949094526003840180546121dc9593850193916060840191612136906127e0565b80601f0160208091040260200160405190810160405280929190818152602001828054612162906127e0565b80156121ad5780601f10612184576101008083540402835291602001916121ad565b820191905f5260205f20905b81548152906001019060200180831161219057829003601f168201915b5050505050815250508152506040518060400160405280886001600160a01b031681526020018681525061226e565b156121eb576120ca8186612303565b506001600160a01b038082165f908152600b602052604090205416906120b2565b50505b8160ff16600c54111561046257600a80546001600160a01b039081165f908152600b6020526040812080546001600160a01b03198082169092558454931692168217909255600c8054919261226383612b71565b919050555050505050565b5f8160200151602001518360200151602001510361229e5750805182516001600160a01b03918216911611610683565b506020908101518101519181015101511190565b600a80546001600160a01b038381165f818152600b602052604081208054939094166001600160a01b031993841617909355835490911617909155600c8054916122fb836128b8565b919050555050565b6001600160a01b038281165f818152600b602052604080822080548686168085529284208054919096166001600160a01b03199182161790955592825282549093169092179055600c805491612358836128b8565b91905055505050565b60405180604001604052805f6001600160a01b031681526020016123a560405180608001604052805f81526020015f81526020015f15158152602001606081525090565b905290565b5080545f8255905f5260205f20908101906113b89190612428565b828054828255905f5260205f20908101928215612418579160200282015b8281111561241857825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906123e3565b50612424929150612428565b5090565b5b80821115612424575f8155600101612429565b80356001600160a01b0381168114612452575f5ffd5b919050565b5f60208284031215612467575f5ffd5b611e888261243c565b60018060a01b0381511682525f602082015160406020850152805160408501526020810151606085015260408101511515608085015260608101519050608060a085015280518060c08601525f5b818110156124db57602081840181015160e08884010152016124be565b505f60e0828701015260e0601f19601f8301168601019250505092915050565b602081525f611e886020830184612470565b5f5f6020838503121561251e575f5ffd5b82356001600160401b03811115612533575f5ffd5b8301601f81018513612543575f5ffd5b80356001600160401b03811115612558575f5ffd5b8560208260051b840101111561256c575f5ffd5b6020919091019590945092505050565b5f5f6040838503121561258d575f5ffd5b50508035926020909101359150565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561264957868503603f19018452815180518652602090810151604082880181905281519088018190529101905f9060608801905b8083101561263157835180516001600160a01b031683526020908101518184015290930192600192909201916040909101906125fa565b509650505060209384019391909101906001016125c2565b50929695505050505050565b5f5f60208385031215612666575f5ffd5b82356001600160401b0381111561267b575f5ffd5b8301601f8101851361268b575f5ffd5b80356001600160401b038111156126a0575f5ffd5b85602082840101111561256c575f5ffd5b5f602082840312156126c1575f5ffd5b81356001600160401b038111156126d6575f5ffd5b820160408185031215611e88575f5ffd5b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561264957603f19878603018452612729858351612470565b9450602093840193919091019060010161270d565b5f6020828403121561274e575f5ffd5b813560ff81168114611e88575f5ffd5b5f5f6040838503121561276f575f5ffd5b6127788361243c565b946020939093013593505050565b602080825282518282018190525f918401906040840190835b818110156127d557835180516001600160a01b03908116855260209182015116818501529093019260409092019160010161279f565b509095945050505050565b600181811c908216806127f457607f821691505b602082108103610f1057634e487b7160e01b5f52602260045260245ffd5b6020808252818101527f43616c6c6572206973206e6f742074686520636f6e7472616374206f776e6572604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106835761068361285b565b818103818111156106835761068361285b565b634e487b7160e01b5f52604160045260245ffd5b818382375f9101908152919050565b5f600182016128c9576128c961285b565b5060010190565b601f82111561046257805f5260205f20601f840160051c810160208510156128f55750805b601f840160051c820191505b818110156113b3575f8155600101612901565b81516001600160401b0381111561292d5761292d612895565b6129418161293b84546127e0565b846128d0565b6020601f821160018114612973575f831561295c5750848201515b5f19600385901b1c1916600184901b1784556113b3565b5f84815260208120601f198516915b828110156129a25787850151825560209485019460019092019101612982565b50848210156129bf57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f8235607e19833603018112612a21575f5ffd5b9190910192915050565b6001600160401b03831115612a4257612a42612895565b612a5683612a5083546127e0565b836128d0565b5f601f841160018114612a87575f8515612a705750838201355b5f19600387901b1c1916600186901b1783556113b3565b5f83815260208120601f198716915b82811015612ab65786850135825560209485019460019092019101612a96565b5086821015612ad2575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8135815560208201356001820155600281016040830135801515808214612b09575f5ffd5b60ff19835416915060ff8116821783555050506060820135601e19833603018112612b32575f5ffd5b820180356001600160401b03811115612b49575f5ffd5b602082019150803603821315612b5d575f5ffd5b612b6b818360038601612a2b565b50505050565b5f81612b7f57612b7f61285b565b505f190190565b5f82612ba057634e487b7160e01b5f52601260045260245ffd5b50069056fea264697066735822122071b882f5aa13e15b9bba503811bfdf20f770de1ab04c653b0dfdade41b9c0bed64736f6c634300081b0033", - "sourceMap": "1600:14234:23:-:0;;;1701:1;1656:46;;;1708:44;;;;2044:32;;;;2082:40;;;-1:-1:-1;;;;;;2082:40:23;;;;;;2128;;;;;;;;2271:39;;2406:50;;;;;;;;;-1:-1:-1;2439:10:23;2430:19;;1600:14234;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", + "object": "0x60a0604052306080523480156012575f5ffd5b5060805161424b6100395f395f81816126630152818161268c01526127cb015261424b5ff3fe6080604052600436106101d0575f3560e01c80637c8a92c3116100fd578063c5a7444911610092578063eb9019d411610062578063eb9019d414610512578063ed612f8c1461053e578063f2fde38b14610552578063f3513a3714610571575f5ffd5b8063c5a7444914610488578063d04a68c7146104a7578063ddca3f43146104d6578063e9257dc8146104f3575f5ffd5b8063a250eaf1116100cd578063a250eaf114610402578063ad3cb1cc14610423578063b84d356e14610460578063b85f5da214610474575f5ffd5b80637c8a92c31461036a5780638da5cb5b146103895780638f062626146103cf578063a09686c4146103ee575f5ffd5b80633687f24a1161017357806354fd4d501161014357806354fd4d501461030557806356db9ef1146103185780636dd7d8ea14610337578063715018a614610356575f5ffd5b80633687f24a1461029357806340f74f47146102b25780634f1ef286146102de57806352d1902d146102f1575f5ffd5b80631b605b86116101ae5780631b605b8614610237578063226f26451461024b5780632bdf6d43146102605780633174b6891461027f575f5ffd5b80630777cbef146101d45780630d2bd909146101f75780631904bb2e1461020b575b5f5ffd5b3480156101df575f5ffd5b506006545b6040519081526020015b60405180910390f35b348015610202575f5ffd5b506004546101e4565b348015610216575f5ffd5b5061022a6102253660046138a3565b610585565b6040516101ee919061397e565b348015610242575f5ffd5b50600a546101e4565b61025e6102593660046139d4565b6106c2565b005b34801561026b575f5ffd5b5061025e61027a366004613a7e565b6108ec565b34801561028a575f5ffd5b5061025e61093a565b34801561029e575f5ffd5b5061025e6102ad366004613abc565b610989565b3480156102bd575f5ffd5b506102d16102cc366004613ae2565b6109e6565b6040516101ee9190613b02565b61025e6102ec366004613bcf565b610b79565b3480156102fc575f5ffd5b506101e4610b98565b348015610310575f5ffd5b5060016101e4565b348015610323575f5ffd5b5061025e610332366004613abc565b610bb3565b348015610342575f5ffd5b5061025e6103513660046138a3565b610cca565b348015610361575f5ffd5b5061025e610f7d565b348015610375575f5ffd5b5061025e610384366004613c90565b610f90565b348015610394575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b0390911681526020016101ee565b3480156103da575f5ffd5b5061025e6103e93660046139d4565b611214565b3480156103f9575f5ffd5b506011546101e4565b34801561040d575f5ffd5b506104166112f4565b6040516101ee9190613cf5565b34801561042e575f5ffd5b50610453604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101ee9190613d4c565b34801561046b575f5ffd5b50600e546101e4565b34801561047f575f5ffd5b5061025e6114b7565b348015610493575f5ffd5b5061025e6104a2366004613d5e565b61162c565b3480156104b2575f5ffd5b506104c66104c13660046138a3565b611bfa565b60405190151581526020016101ee565b3480156104e1575f5ffd5b506010546001600160801b03166101e4565b3480156104fe575f5ffd5b5061025e61050d366004613d7e565b611c17565b34801561051d575f5ffd5b5061053161052c366004613ddc565b611cda565b6040516101ee9190613e04565b348015610549575f5ffd5b506003546101e4565b34801561055d575f5ffd5b5061025e61056c3660046138a3565b611edb565b34801561057c575f5ffd5b50610416611f18565b61058d613795565b61059682611bfa565b6105b35760405163510b8aad60e11b815260040160405180910390fd5b6040805180820182526001600160a01b0384168082525f908152602081815290839020835160a0810185528154815260018201546001600160801b03811682850152600160801b81046001600160401b031695820195909552600160c01b90940460ff161515606085015260028101805493949285019360808401919061063990613e5e565b80601f016020809104026020016040519081016040528092919081815260200182805461066590613e5e565b80156106b05780601f10610687576101008083540402835291602001916106b0565b820191905f5260205f20905b81548152906001019060200180831161069357829003601f168201915b50505091909252505050905292915050565b6010546001600160801b031634146106ed576040516358d620b360e01b815260040160405180910390fd5b335f9081526001602052604090205460ff161561071d5760405163132e7efb60e31b815260040160405180910390fd5b610729848484846120d5565b610746576040516392536faf60e01b815260040160405180910390fd5b61075084846121e6565b5f6040518060a001604052805f8152602001346001600160801b031681526020015f6001600160401b031681526020015f1515815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920182905250939094525050338152600160208181526040808420805460ff19168417905583825292839020855181559085015191810180549386015160608701511515600160c01b0260ff60c01b196001600160401b03909216600160801b026001600160c01b03199096166001600160801b039095169490941794909417939093169190911790915560808301519293508392909150600282019061085a9082613ed4565b5050600380546001810182555f919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b031916339081179091556108aa915061225a565b7f61809fa303a3a57f4d70552f533f3e0b003173d424590cd4bb22a2afe000990c3386866040516108dd93929190613f8e565b60405180910390a15050505050565b6108f46122cd565b5f5b818110156109355761092d83838381811061091357610913613fcd565b905060200201602081019061092891906138a3565b612328565b6001016108f6565b505050565b7f6572af8bf9a0a86efb88dcc30011626a15c9c4603503aa4466a3f87a1867deef33610964612402565b604080516001600160a01b0393841681529290911660208301520160405180910390a1565b6109916122cd565b601080546001600160801b0319166001600160801b0383169081179091556040519081527f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c76906020015b60405180910390a150565b60606109f06122cd565b60115482908410610a0257505f610a26565b601154610a0f8486613ff5565b1115610a2657601154610a23908590614008565b90505b5f816001600160401b03811115610a3f57610a3f613bbb565b604051908082528060200260200182016040528015610a8457816020015b604080518082019091525f815260606020820152815260200190600190039081610a5d5790505b5090505f5b82811015610b6e5760405180604001604052808288610aa89190613ff5565b610ab3906001613ff5565b81526020016011610ac4848a613ff5565b81548110610ad457610ad4613fcd565b905f5260205f2001805480602002602001604051908101604052809291908181526020015f905b82821015610b42575f848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101610afb565b50505050815250828281518110610b5b57610b5b613fcd565b6020908102919091010152600101610a89565b509150505b92915050565b610b81612658565b610b8a826126fc565b610b948282612704565b5050565b5f610ba16127c0565b505f5160206141f65f395f51905f5290565b5f610bbc612809565b805490915060ff600160401b82041615906001600160401b03165f81158015610be25750825b90505f826001600160401b03166001148015610bfd5750303b155b905081158015610c0b575080155b15610c295760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c5357845460ff60401b1916600160401b1785555b610c5c33612831565b6001600f55601080546001600160801b0319166001600160801b0388161790558315610cc257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b610cd381611bfa565b610cf05760405163510b8aad60e11b815260040160405180910390fd5b6001600160a01b0381165f9081526020819052604090206001810154600160c01b900460ff1615610d345760405163510ae2bd60e11b815260040160405180910390fd5b806002018054610d4390613e5e565b90505f03610d645760405163970c784d60e01b815260040160405180910390fd5b335f90815260076020526040902080546001600160a01b03848116911603610d9f57604051630d41c52760e01b815260040160405180910390fd5b80546001600160a01b031615610db957610db7612402565b505b604080516080810182526001600160a01b03808616825233803160208085019182525f85870181815260608701828152948252600790925295909520935184549084166001600160a01b03199182161785559051600185015593516002840180549184169186169190911790555160039092018054928216929093169190911790915560085416610e6b5760088054336001600160a01b03199182168117909255600980549091169091179055610ec2565b600980546001600160a01b039081165f9081526007602052604080822060030180546001600160a01b0319908116339081179092558554828552929093206002018054841692909416919091179092558254161790555b600a8054905f610ed18361401b565b9091555050815433319083905f90610eea908490613ff5565b909155505060018281018054601090610f14908490600160801b90046001600160401b0316614033565b82546001600160401b039182166101009390930a928302919092021990911617905550604080513381526001600160a01b03851660208201527fce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2910160405180910390a1505050565b610f856122cd565b610f8e5f612842565b565b610f986122cd565b60115415610fb9576040516349625b3b60e01b815260040160405180910390fd5b6001600160a01b0384165f9081526001602052604090205460ff1615610ff25760405163132e7efb60e31b815260040160405180910390fd5b60025f8484604051611005929190614052565b604080519182900390912082526020820192909252015f205460ff161561103f57604051637e4c066f60e01b815260040160405180910390fd5b811561104f5761104f83836121e6565b5f6040518060a001604052805f81526020015f6001600160801b031681526020015f6001600160401b03168152602001831515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509390945250506001600160a01b0388168152600160208181526040808420805460ff19168417905583825292839020855181559085015191810180549386015160608701511515600160c01b0260ff60c01b196001600160401b03909216600160801b026001600160c01b03199096166001600160801b03909516949094179490941793909316919091179091556080830151929350839290915060028201906111629082613ed4565b5050600380546001810182555f919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b0388161790555081156111ca5760068054905f6111c48361401b565b91905055505b6111d3856128b2565b156111e1576111e18561225a565b7f61809fa303a3a57f4d70552f533f3e0b003173d424590cd4bb22a2afe000990c8585856040516108dd93929190613f8e565b61121d33611bfa565b61123a5760405163510b8aad60e11b815260040160405180910390fd5b611246848484846120d5565b611263576040516392536faf60e01b815260040160405180910390fd5b61126d84846121e6565b335f908152602081905260409020600201611289848683614061565b50611293336128b2565b80156112a557506112a3336128fb565b155b156112b3576112b33361225a565b7f4af0b5984c9f88659d661fb64dcb63a5b946809cf1c78a8c6e0f6ef93c9170323385856040516112e693929190613f8e565b60405180910390a150505050565b600c546060905f906001600160401b0381111561131357611313613bbb565b60405190808252806020026020018201604052801561134c57816020015b611339613795565b8152602001906001900390816113315790505b5090505f5b600c548110156114b1575f600c828154811061136f5761136f613fcd565b5f918252602080832091909101546001600160a01b031680835282825260409283902083518085018552828152845160a0810186528254815260018301546001600160801b03811682870152600160801b81046001600160401b031696820196909652600160c01b90950460ff1615156060860152600282018054939650919490938401929091859160808401919061140790613e5e565b80601f016020809104026020016040519081016040528092919081815260200182805461143390613e5e565b801561147e5780601f106114555761010080835404028352916020019161147e565b820191905f5260205f20905b81548152906001019060200180831161146157829003601f168201915b50505050508152505081525084848151811061149c5761149c613fcd565b60209081029190910101525050600101611351565b50919050565b6114c033611bfa565b6114dd5760405163668191af60e11b815260040160405180910390fd5b335f9081526020819052604090206001810154600160c01b900460ff161561151857604051632d8b5c9760e21b815260040160405180910390fd5b600f546004541161153c57604051633b15f1f760e21b815260040160405180910390fd5b6001818101805460ff60c01b1916600160c01b179055600680545f90611563908490613ff5565b9091555061157290503361295d565b60018101546001600160801b0316156115fc5760018101546040515f9133916001600160801b03909116908381818185875af1925050503d805f81146115d3576040519150601f19603f3d011682016040523d82523d5f602084013e6115d8565b606091505b50509050806115fa57604051633c31275160e21b815260040160405180910390fd5b505b6040513381527f24250fc1ec78a1405ddd4cc8b75964858af228d05faa8d4bc1302966d8a54117906020016109db565b6116346122cd565b8060ff165f0361165757604051630e52390960e41b815260040160405180910390fd5b60ff8116600f55611666612a6d565b61166e612c0b565b600d80546001600160a01b03191690556004545f906116939060ff8416908390612c5c565b90508060ff165f036116b8576040516367c0fced60e01b815260040160405180910390fd5b5f5b6004548110156119c5575f600482815481106116d8576116d8613fcd565b5f9182526020808320909101546001600160a01b031680835290829052604090912060018101549192509060ff600160c01b9091041680611727575080600201805461172390613e5e565b1590505b156117335750506119bd565b600d546001600160a01b031661176e5750600d80546001600160a01b0319166001600160a01b03929092169190911790556001600e556119bd565b8360ff16600e54101561178c576117858285612cae565b50506119bd565b600d546001600160a01b039081165f9081526020818152604091829020825180840184529386168452825160a0810184528554815260018601546001600160801b03811682850152600160801b81046001600160401b031694820194909452600160c01b90930460ff161515606084015260028501805491946119aa9490938401929091879160808401919061182190613e5e565b80601f016020809104026020016040519081016040528092919081815260200182805461184d90613e5e565b80156118985780601f1061186f57610100808354040283529160200191611898565b820191905f5260205f20905b81548152906001019060200180831161187b57829003601f168201915b505050919092525050509052604080518082018252600d546001600160a01b03168152815160a0810183528554815260018601546001600160801b038116602080840191909152600160801b82046001600160401b031694830194909452600160c01b900460ff161515606082015260028601805492938401928791608084019161192290613e5e565b80601f016020809104026020016040519081016040528092919081815260200182805461194e90613e5e565b80156119995780601f1061197057610100808354040283529160200191611999565b820191905f5260205f20905b81548152906001019060200180831161197c57829003601f168201915b5050505050815250508152506130f3565b156119b9576119b98386612cae565b5050505b6001016116ba565b50600e545f036119e8576040516367c0fced60e01b815260040160405180910390fd5b600d54600e546001600160a01b03909116905f906001600160401b03811115611a1357611a13613bbb565b604051908082528060200260200182016040528015611a3c578160200160208202803683370190505b5090505f5b600e54811015611a965782828281518110611a5e57611a5e613fcd565b6001600160a01b039283166020918202929092018101919091529381165f908152600b90945260409093205490921691600101611a41565b50611aa08161312f565b601180546001810182555f9182527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680190611add90600c906137f6565b600f546001600160401b03811115611af757611af7613bbb565b604051908082528060200260200182016040528015611b20578160200160208202803683370190505b508051611b3591600c91602090910190613811565b505f5b600f54811015610cc2575f83600e5483611b52919061411a565b81518110611b6257611b62613fcd565b6020026020010151905080600c8381548110611b8057611b80613fcd565b5f918252602080832090910180546001600160a01b039485166001600160a01b0319918216179091556040805180820182529585168087528452838352832054858301908152875460018181018a558986529390942095516002909402909501805493909416921691909117825591519082015501611b38565b6001600160a01b03165f9081526001602052604090205460ff1690565b611c1f6122cd565b828114611c6b5760405162461bcd60e51b81526020600482015260156024820152740d2dce0eae840d8cadccee8d040dad2e6dac2e8c6d605b1b60448201526064015b60405180910390fd5b5f5b83811015611cd357611ccb858583818110611c8a57611c8a613fcd565b9050602002016020810190611c9f91906138a3565b848484818110611cb157611cb1613fcd565b9050602002016020810190611cc691906138a3565b613246565b600101611c6d565b5050505050565b6060611ce46122cd565b5f611cf2835f600a54612c5c565b6001600160401b03811115611d0957611d09613bbb565b604051908082528060200260200182016040528015611d4d57816020015b604080518082019091525f8082526020820152815260200190600190039081611d275790505b506008549091506001600160a01b0390811690851615611d8657506001600160a01b038085165f90815260076020526040902060030154165b5f5b6001600160a01b03821615801590611d9f57508481105b15611e14576001600160a01b038083165f818152600760209081526040918290208251808401909352928252825490931692810192909252908483611de38161401b565b945081518110611df557611df5613fcd565b6020908102919091010152600301546001600160a01b03169150611d88565b80835103611e2757829350505050610b73565b5f816001600160401b03811115611e4057611e40613bbb565b604051908082528060200260200182016040528015611e8457816020015b604080518082019091525f8082526020820152815260200190600190039081611e5e5790505b5090505f5b82811015611ed057848181518110611ea357611ea3613fcd565b6020026020010151828281518110611ebd57611ebd613fcd565b6020908102919091010152600101611e89565b509695505050505050565b611ee36122cd565b6001600160a01b038116611f0c57604051631e4fbdf760e01b81525f6004820152602401611c62565b611f1581612842565b50565b6003546060905f906001600160401b03811115611f3757611f37613bbb565b604051908082528060200260200182016040528015611f7057816020015b611f5d613795565b815260200190600190039081611f555790505b5090505f5b6003548110156114b1575f60038281548110611f9357611f93613fcd565b5f918252602080832091909101546001600160a01b031680835282825260409283902083518085018552828152845160a0810186528254815260018301546001600160801b03811682870152600160801b81046001600160401b031696820196909652600160c01b90950460ff1615156060860152600282018054939650919490938401929091859160808401919061202b90613e5e565b80601f016020809104026020016040519081016040528092919081815260200182805461205790613e5e565b80156120a25780601f10612079576101008083540402835291602001916120a2565b820191905f5260205f20905b81548152906001019060200180831161208557829003601f168201915b5050505050815250508152508484815181106120c0576120c0613fcd565b60209081029190910101525050600101611f75565b5f603084146120f757604051637db491eb60e01b815260040160405180910390fd5b6060821461211857604051637db491eb60e01b815260040160405180910390fd5b5f858585856040516020016121309493929190614139565b60405160208183030381529060405290505f5f63011812006001600160a01b03168360405161215f9190614158565b5f60405180830381855afa9150503d805f8114612197576040519150601f19603f3d011682016040523d82523d5f602084013e61219c565b606091505b50915091508115806121b057508051602014155b156121ce57604051633f48ffd960e21b815260040160405180910390fd5b6121d781614173565b60011498975050505050505050565b5f82826040516121f7929190614052565b60408051918290039091205f8181526002602052919091205490915060ff161561223457604051637e4c066f60e01b815260040160405180910390fd5b61223e83836134b2565b5f908152600260205260409020805460ff191660011790555050565b60048054600180820183555f8390527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b90910180546001600160a01b0319166001600160a01b03851617905590546122b29190614008565b6001600160a01b039091165f90815260056020526040902055565b336122ff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610f8e5760405163118cdaa760e01b8152336004820152602401611c62565b6001600160a01b038082165f908152600760205260409020805490911661234d575050565b60018101546001600160a01b038316318110156123ab57612378816001600160a01b03851631614008565b82546001600160a01b03165f90815260208190526040812080549091906123a0908490613ff5565b909155506123ed9050565b6123bf6001600160a01b0384163182614008565b82546001600160a01b03165f90815260208190526040812080549091906123e7908490614008565b90915550505b506001600160a01b0390911631600190910155565b335f90815260076020526040812080546001600160a01b03166124385760405163498ea63d60e01b815260040160405180910390fd5b6009546008546001600160a01b0391821691160361247157600880546001600160a01b0319908116909155600980549091169055612584565b600954336001600160a01b03909116036124ca576002810180546001600160a01b039081165f90815260076020526040902060030180546001600160a01b03199081169091559154600980549093169116179055612584565b600854336001600160a01b039091160361252e576009546001600160a01b039081165f9081526007602052604080822060020180546001600160a01b0319908116909155600880548086168552929093206003015491169216919091179055612584565b60038181018054600280850180546001600160a01b039081165f9081526007602052604080822090970180549583166001600160a01b031996871617905591549454811682529490200180549290931691161790555b80546001600160a01b03165f81815260208190526040812060018401548154919290918391906125b5908490614008565b9091555050600181810180546010906125df908490600160801b90046001600160401b0316614196565b82546001600160401b039182166101009390930a928302919092021990911617905550335f90815260076020526040812080546001600160a01b031990811682556001820183905560028201805482169055600390910180549091169055600a80549161264b836141b5565b9091555091949350505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806126de57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166126d25f5160206141f65f395f51905f52546001600160a01b031690565b6001600160a01b031614155b15610f8e5760405163703e46dd60e11b815260040160405180910390fd5b611f156122cd565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561275e575060408051601f3d908101601f1916820190925261275b918101906141ca565b60015b61278657604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611c62565b5f5160206141f65f395f51905f5281146127b657604051632a87526960e21b815260048101829052602401611c62565b61093583836134d3565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f8e5760405163703e46dd60e11b815260040160405180910390fd5b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b73565b612839613528565b611f158161354d565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6001600160a01b0381165f9081526020819052604081206001810154600160c01b900460ff161580156128f457508060020180546128ef90613e5e565b151590505b9392505050565b6001600160a01b0381165f90815260056020526040812054600454811061292457505f92915050565b826001600160a01b03166004828154811061294157612941613fcd565b5f918252602090912001546001600160a01b0316149392505050565b612966816128fb565b61296d5750565b6001600160a01b0381165f9081526005602052604081205460045490919061299790600190614008565b9050808214612a1c575f600482815481106129b4576129b4613fcd565b5f91825260209091200154600480546001600160a01b0390921692508291859081106129e2576129e2613fcd565b5f91825260208083209190910180546001600160a01b0319166001600160a01b039485161790559290911681526005909152604090208290555b6004805480612a2d57612a2d6141e1565b5f828152602080822083015f1990810180546001600160a01b03191690559092019092556001600160a01b03949094168152600590935250506040812055565b6004545f819003612a7b5750565b5f612a87600183614008565b90505b8015610b94575f612a9c826001613ff5565b60408051426020820152908101849052606001604051602081830303815290604052805190602001205f1c612ad1919061411a565b9050808203612ae05750612bf9565b5f60048381548110612af457612af4613fcd565b5f918252602082200154600480546001600160a01b0390921693509084908110612b2057612b20613fcd565b5f91825260209091200154600480546001600160a01b0390921692509084908110612b4d57612b4d613fcd565b5f91825260209091200154600480546001600160a01b039092169186908110612b7857612b78613fcd565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508160048481548110612bb757612bb7613fcd565b5f91825260208083209190910180546001600160a01b0319166001600160a01b0394851617905593821681526005909352604080842094909455168152208190555b80612c03816141b5565b915050612a8a565b600d546001600160a01b03165b6001600160a01b03811615612c55576001600160a01b039081165f908152600b6020526040902080546001600160a01b0319811690915516612c18565b505f600e55565b5f81831115612c8857604051632457cde760e01b81526004810184905260248101839052604401611c62565b82841015612c975750816128f4565b81841115612ca65750806128f4565b509192915050565b6001600160a01b0382165f90815260208181526040808320815160a0810183528154815260018201546001600160801b03811694820194909452600160801b84046001600160401b031692810192909252600160c01b90920460ff1615156060820152600282018054919291608084019190612d2990613e5e565b80601f0160208091040260200160405190810160405280929190818152602001828054612d5590613e5e565b8015612da05780601f10612d7757610100808354040283529160200191612da0565b820191905f5260205f20905b815481529060010190602001808311612d8357829003601f168201915b505050919092525050604080518082018252600d546001600160a01b03168082525f908152602081815290839020835160a0810185528154815260018201546001600160801b03811682850152600160801b81046001600160401b031695820195909552600160c01b90940460ff1615156060850152600281018054969750612ee196939550918501939290916080840191612e3b90613e5e565b80601f0160208091040260200160405190810160405280929190818152602001828054612e6790613e5e565b8015612eb25780601f10612e8957610100808354040283529160200191612eb2565b820191905f5260205f20905b815481529060010190602001808311612e9557829003601f168201915b5050505050815250508152506040518060400160405280866001600160a01b03168152602001848152506130f3565b15612ef457612eef83613555565b613094565b600d546001600160a01b039081165f818152600b6020526040902054909116905b6001600160a01b038216612f3257612f2d81866135a6565b613091565b6040805180820182526001600160a01b0384168082525f908152602081815290839020835160a0810185528154815260018201546001600160801b03811682850152600160801b81046001600160401b031695820195909552600160c01b90940460ff1615156060850152600281018054613061959385019392916080840191612fbb90613e5e565b80601f0160208091040260200160405190810160405280929190818152602001828054612fe790613e5e565b80156130325780601f1061300957610100808354040283529160200191613032565b820191905f5260205f20905b81548152906001019060200180831161301557829003601f168201915b5050505050815250508152506040518060400160405280886001600160a01b03168152602001868152506130f3565b1561307057612f2d81866135a6565b506001600160a01b038082165f908152600b60205260409020541690612f15565b50505b8160ff16600e54111561093557600d80546001600160a01b039081165f908152600b6020526040812080546001600160a01b03198082169092558454931692168217909255600e805491926130e8836141b5565b919050555050505050565b6020808201515190830151515f91900361311f5750805182516001600160a01b03918216911610610b73565b5060209081015151910151511190565b80515f81900361313d575050565b5f613149600183614008565b90505b8015610935575f61315e826001613ff5565b60408051426020820152908101849052606001604051602081830303815290604052805190602001205f1c613193919061411a565b90505f8483815181106131a8576131a8613fcd565b602002602001015190508482815181106131c4576131c4613fcd565b60200260200101518584815181106131de576131de613fcd565b60200260200101906001600160a01b031690816001600160a01b0316815250508085838151811061321157613211613fcd565b60200260200101906001600160a01b031690816001600160a01b0316815250505050808061323e906141b5565b91505061314c565b60115415613267576040516349625b3b60e01b815260040160405180910390fd5b61327081611bfa565b61328d5760405163510b8aad60e11b815260040160405180910390fd5b6001600160a01b038083165f9081526007602052604090208054909116156132c857604051637c9a1cf960e01b815260040160405180910390fd5b604080516080810182526001600160a01b038085168252858116803160208085019182525f85870181815260608701828152948252600790925295909520935184549084166001600160a01b0319918216178555905160018501559351600284018054918416918616919091179055516003909201805492821692909316919091179091556008541661338557600880546001600160a01b0385166001600160a01b031991821681179092556009805490911690911790556133dd565b600980546001600160a01b039081165f9081526007602052604080822060030180548489166001600160a01b031991821681179092558554828552929093206002018054841692909416919091179092558254161790555b600a8054905f6133ec8361401b565b90915550506001600160a01b038083165f9081526020819052604081208054909286163191839161341e908490613ff5565b909155505060018181018054601090613448908490600160801b90046001600160401b0316614033565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507fce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e284846040516112e69291906001600160a01b0392831681529116602082015260400190565b60308114610b94576040516305db9dbd60e01b815260040160405180910390fd5b6134dc82613604565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115613520576109358282613667565b610b946136d9565b6135306136f8565b610f8e57604051631afcd79f60e31b815260040160405180910390fd5b611ee3613528565b600d80546001600160a01b038381165f818152600b602052604081208054939094166001600160a01b031993841617909355835490911617909155600e80549161359e8361401b565b919050555050565b6001600160a01b038281165f818152600b602052604080822080548686168085529284208054919096166001600160a01b03199182161790955592825282549093169092179055600e8054916135fb8361401b565b91905055505050565b806001600160a01b03163b5f0361363957604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611c62565b5f5160206141f65f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b0316846040516136839190614158565b5f60405180830381855af49150503d805f81146136bb576040519150601f19603f3d011682016040523d82523d5f602084013e6136c0565b606091505b50915091506136d0858383613711565b95945050505050565b3415610f8e5760405163b398979f60e01b815260040160405180910390fd5b5f613701612809565b54600160401b900460ff16919050565b606082613726576137218261376d565b6128f4565b815115801561373d57506001600160a01b0384163b155b1561376657604051639996b31560e01b81526001600160a01b0385166004820152602401611c62565b50806128f4565b80511561377c57805160208201fd5b60405163d6bda27560e01b815260040160405180910390fd5b60405180604001604052805f6001600160a01b031681526020016137f16040518060a001604052805f81526020015f6001600160801b031681526020015f6001600160401b031681526020015f15158152602001606081525090565b905290565b5080545f8255905f5260205f2090810190611f159190613874565b828054828255905f5260205f20908101928215613864579160200282015b8281111561386457825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061382f565b50613870929150613874565b5090565b5b80821115613870575f8155600101613875565b80356001600160a01b038116811461389e575f5ffd5b919050565b5f602082840312156138b3575f5ffd5b6128f482613888565b5f5b838110156138d65781810151838201526020016138be565b50505f910152565b5f81518084526138f58160208601602086016138bc565b601f01601f19169290920160200192915050565b60018060a01b0381511682525f602082015160406020850152805160408501526001600160801b0360208201511660608501526001600160401b0360408201511660808501526060810151151560a08501526080810151905060a060c085015261397660e08501826138de565b949350505050565b602081525f6128f46020830184613909565b5f5f83601f8401126139a0575f5ffd5b5081356001600160401b038111156139b6575f5ffd5b6020830191508360208285010111156139cd575f5ffd5b9250929050565b5f5f5f5f604085870312156139e7575f5ffd5b84356001600160401b038111156139fc575f5ffd5b613a0887828801613990565b90955093505060208501356001600160401b03811115613a26575f5ffd5b613a3287828801613990565b95989497509550505050565b5f5f83601f840112613a4e575f5ffd5b5081356001600160401b03811115613a64575f5ffd5b6020830191508360208260051b85010111156139cd575f5ffd5b5f5f60208385031215613a8f575f5ffd5b82356001600160401b03811115613aa4575f5ffd5b613ab085828601613a3e565b90969095509350505050565b5f60208284031215613acc575f5ffd5b81356001600160801b03811681146128f4575f5ffd5b5f5f60408385031215613af3575f5ffd5b50508035926020909101359150565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015613baf57868503603f19018452815180518652602090810151604082880181905281519088018190529101905f9060608801905b80831015613b9757835180516001600160a01b03168352602090810151818401529093019260019290920191604090910190613b60565b50965050506020938401939190910190600101613b28565b50929695505050505050565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215613be0575f5ffd5b613be983613888565b915060208301356001600160401b03811115613c03575f5ffd5b8301601f81018513613c13575f5ffd5b80356001600160401b03811115613c2c57613c2c613bbb565b604051601f8201601f19908116603f011681016001600160401b0381118282101715613c5a57613c5a613bbb565b604052818152828201602001871015613c71575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f5f5f60608587031215613ca3575f5ffd5b613cac85613888565b935060208501356001600160401b03811115613cc6575f5ffd5b613cd287828801613990565b90945092505060408501358015158114613cea575f5ffd5b939692955090935050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015613baf57603f19878603018452613d37858351613909565b94506020938401939190910190600101613d1b565b602081525f6128f460208301846138de565b5f60208284031215613d6e575f5ffd5b813560ff811681146128f4575f5ffd5b5f5f5f5f60408587031215613d91575f5ffd5b84356001600160401b03811115613da6575f5ffd5b613db287828801613a3e565b90955093505060208501356001600160401b03811115613dd0575f5ffd5b613a3287828801613a3e565b5f5f60408385031215613ded575f5ffd5b613df683613888565b946020939093013593505050565b602080825282518282018190525f918401906040840190835b81811015613e5357835180516001600160a01b039081168552602091820151168185015290930192604090920191600101613e1d565b509095945050505050565b600181811c90821680613e7257607f821691505b6020821081036114b157634e487b7160e01b5f52602260045260245ffd5b601f82111561093557805f5260205f20601f840160051c81016020851015613eb55750805b601f840160051c820191505b81811015611cd3575f8155600101613ec1565b81516001600160401b03811115613eed57613eed613bbb565b613f0181613efb8454613e5e565b84613e90565b6020601f821160018114613f33575f8315613f1c5750848201515b5f19600385901b1c1916600184901b178455611cd3565b5f84815260208120601f198516915b82811015613f625787850151825560209485019460019092019101613f42565b5084821015613f7f57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610b7357610b73613fe1565b81810381811115610b7357610b73613fe1565b5f6001820161402c5761402c613fe1565b5060010190565b6001600160401b038181168382160190811115610b7357610b73613fe1565b818382375f9101908152919050565b6001600160401b0383111561407857614078613bbb565b61408c836140868354613e5e565b83613e90565b5f601f8411600181146140bd575f85156140a65750838201355b5f19600387901b1c1916600186901b178355611cd3565b5f83815260208120601f198716915b828110156140ec57868501358255602094850194600190920191016140cc565b5086821015614108575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f8261413457634e487b7160e01b5f52601260045260245ffd5b500690565b838582375f8482015f8152838582375f93019283525090949350505050565b5f82516141698184602087016138bc565b9190910192915050565b805160208083015191908110156114b1575f1960209190910360031b1b16919050565b6001600160401b038281168282160390811115610b7357610b73613fe1565b5f816141c3576141c3613fe1565b505f190190565b5f602082840312156141da575f5ffd5b5051919050565b634e487b7160e01b5f52603160045260245ffdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220239ca47940153ca95050e872fcd474f2e4c0506fb5d9affc9c904a9db13f056864736f6c634300081b0033", + "sourceMap": "1684:23443:34:-:0;;;1171:4:21;1128:48;;1684:23443:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", "linkReferences": {} }, - "deployedBytecode": { - "object": "0x608060405234801561000f575f5ffd5b5060043610610111575f3560e01c80636dd7d8ea1161009e578063b85f5da21161006e578063b85f5da214610202578063d04a68c71461020a578063eb9019d414610245578063f1bd0b3714610265578063f3513a371461026c575f5ffd5b80636dd7d8ea146101bf578063a09686c4146101d2578063afeea115146101da578063b5cfa68c146101ef575f5ffd5b80632bdf6d43116100e45780632bdf6d431461015c5780633174b6891461017157806340f74f4714610179578063602a9eee1461019957806362525879146101ac575f5ffd5b80630777cbef146101155780630d2bd9091461012c5780631904bb2e146101345780631b605b8614610154575b5f5ffd5b6001545b6040519081526020015b60405180910390f35b600d54610119565b610147610142366004612457565b610274565b60405161012391906124fb565b600754610119565b61016f61016a36600461250d565b6103d9565b005b61016f610467565b61018c61018736600461257c565b6104b6565b604051610123919061259c565b61016f6101a7366004612655565b610689565b61016f6101ba3660046126b1565b610964565b61016f6101cd366004612457565b6109ff565b600e54610119565b6101e2610d79565b60405161012391906126e7565b61016f6101fd36600461273e565b610f16565b61016f6113bb565b610235610218366004612457565b6001600160a01b03165f9081526003602052604090205460ff1690565b6040519015158152602001610123565b61025861025336600461275e565b6114dc565b6040516101239190612786565b5f54610119565b6101e261171d565b61027c612361565b6001600160a01b0382165f9081526003602052604090205460ff166102e85760405162461bcd60e51b815260206004820152601c60248201527f56616c696461746f724461746120646f65736e2774206578697374730000000060448201526064015b60405180910390fd5b6040805180820182526001600160a01b0384168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff16151594820194909452600384018054939492850193919291606084019190610350906127e0565b80601f016020809104026020016040519081016040528092919081815260200182805461037c906127e0565b80156103c75780601f1061039e576101008083540402835291602001916103c7565b820191905f5260205f20905b8154815290600101906020018083116103aa57829003601f168201915b50505091909252505050905292915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146104215760405162461bcd60e51b81526004016102df90612812565b5f5b818110156104625761045a83838381811061044057610440612847565b90506020020160208101906104559190612457565b6118b4565b600101610423565b505050565b7f6572af8bf9a0a86efb88dcc30011626a15c9c4603503aa4466a3f87a1867deef33610491611994565b604080516001600160a01b0393841681529290911660208301520160405180910390a1565b6060336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146105005760405162461bcd60e51b81526004016102df90612812565b600e548290841061051257505f610536565b600e5461051f848661286f565b111561053657600e54610533908590612882565b90505b5f816001600160401b0381111561054f5761054f612895565b60405190808252806020026020018201604052801561059457816020015b604080518082019091525f81526060602082015281526020019060019003908161056d5790505b5090505f5b8281101561067e57604051806040016040528082886105b8919061286f565b6105c390600161286f565b8152602001600e6105d4848a61286f565b815481106105e4576105e4612847565b905f5260205f2001805480602002602001604051908101604052809291908181526020015f905b82821015610652575f848152602090819020604080518082019091526002850290910180546001600160a01b0316825260019081015482840152908352909201910161060b565b5050505081525082828151811061066b5761066b612847565b6020908102919091010152600101610599565b509150505b92915050565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001633036107015760405162461bcd60e51b815260206004820152601c60248201527f43616c6c65722069732074686520636f6e7472616374206f776e65720000000060448201526064016102df565b335f9081526003602052604090205460ff16156107605760405162461bcd60e51b815260206004820152601f60248201527f56616c696461746f7220697320616c726561647920726567697374657265640060448201526064016102df565b5f82826040516107719291906128a9565b60408051918290039091205f8181526004602052919091205490915060ff16156107e95760405162461bcd60e51b815260206004820152602360248201527f424c5331322d333831206b657920697320616c726561647920726567697374656044820152621c995960ea1b60648201526084016102df565b6107f38383611bfc565b5f60405180608001604052805f81526020015f81526020015f1515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920182905250939094525050805492935090508061085b836128b8565b9091555050335f9081526003602081815260408084208054600160ff1991821681179092556002808552958390208751815593870151918401919091559085015193820180549091169315159390931790925560608301518392918201906108c39082612914565b5050505f82815260046020526040808220805460ff191660019081179091556005805491820181559092527f036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db090910180546001600160a01b0319163390811790915590517f61809fa303a3a57f4d70552f533f3e0b003173d424590cd4bb22a2afe000990c9161095691879087906129ce565b60405180910390a150505050565b6109746102186020830183612457565b6109c05760405162461bcd60e51b815260206004820152601c60248201527f56616c696461746f724461746120646f65736e2774206578697374730000000060448201526064016102df565b6109cd6020820182612a0d565b60025f6109dd6020850185612457565b6001600160a01b0316815260208101919091526040015f206104628282612ae4565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000163303610a775760405162461bcd60e51b815260206004820152601c60248201527f43616c6c65722069732074686520636f6e7472616374206f776e65720000000060448201526064016102df565b6001600160a01b0381165f9081526003602052604090205460ff16610ade5760405162461bcd60e51b815260206004820152601760248201527f4d75737420766f746520666f722076616c696461746f7200000000000000000060448201526064016102df565b6001600160a01b0381165f9081526002602081905260409091209081015460ff1615610b575760405162461bcd60e51b815260206004820152602260248201527f4d75737420766f746520666f7220756e72657369676e65642076616c6964617460448201526137b960f11b60648201526084016102df565b335f90815260066020526040902080546001600160a01b03848116911603610bc15760405162461bcd60e51b815260206004820181905260248201527f416c726561647920766f74656420666f7220746869732076616c696461746f7260448201526064016102df565b80546001600160a01b031615610bdb57610bd9611994565b505b604080516080810182526001600160a01b03808616825233803160208085019182525f85870181815260608701828152948252600690925295909520935184549084166001600160a01b03199182161785559051600185015593516002840180549184169186169190911790555160039092018054928216929093169190911790915560085416610c8d5760088054336001600160a01b03199182168117909255600980549091169091179055610ce4565b600980546001600160a01b039081165f9081526006602052604080822060030180546001600160a01b0319908116339081179092558554828552929093206002018054841692909416919091179092558254161790555b60078054905f610cf3836128b8565b9190505550336001600160a01b031631826001015f828254610d15919061286f565b9091555050815460019083905f90610d2e90849061286f565b9091555050604080513381526001600160a01b03851660208201527fce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2910160405180910390a1505050565b600d546060905f906001600160401b03811115610d9857610d98612895565b604051908082528060200260200182016040528015610dd157816020015b610dbe612361565b815260200190600190039081610db65790505b5090505f5b600d54811015610f10575f600d8281548110610df457610df4612847565b5f9182526020808320909101546001600160a01b03168083526002808352604093849020845180860186528381528551608081018752825481526001830154818701529282015460ff1615159583019590955260038101805493965090949384019285916060840191610e66906127e0565b80601f0160208091040260200160405190810160405280929190818152602001828054610e92906127e0565b8015610edd5780601f10610eb457610100808354040283529160200191610edd565b820191905f5260205f20905b815481529060010190602001808311610ec057829003601f168201915b505050505081525050815250848481518110610efb57610efb612847565b60209081029190910101525050600101610dd6565b50919050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f5e5760405162461bcd60e51b81526004016102df90612812565b610f66611c5e565b610f6e611dad565b600a80546001600160a01b03191690556001545f80549091610fa09160ff8516918491610f9b9190612882565b611dfe565b90508060ff165f03610fb0575050565b5f5b60055481101561125b575f60058281548110610fd057610fd0612847565b5f9182526020808320909101546001600160a01b03168083526002918290526040909220908101549192509060ff161561100b575050611253565b600a546001600160a01b03166110465750600a80546001600160a01b0319166001600160a01b03929092169190911790556001600c55611253565b8360ff16600c5410156110645761105d8285611e8f565b5050611253565b600a546001600160a01b039081165f908152600260208181526040928390208351808501855294871685528351608081018552865481526001870154818401529286015460ff161515938301939093526003850180549394611240949093928401929187916060840191906110d8906127e0565b80601f0160208091040260200160405190810160405280929190818152602001828054611104906127e0565b801561114f5780601f106111265761010080835404028352916020019161114f565b820191905f5260205f20905b81548152906001019060200180831161113257829003601f168201915b505050919092525050509052604080518082018252600a546001600160a01b031681528151608081018352855481526001860154602082810191909152600287015460ff161515938201939093526003860180549293840192879160608401916111b8906127e0565b80601f01602080910402602001604051908101604052809291908181526020018280546111e4906127e0565b801561122f5780601f106112065761010080835404028352916020019161122f565b820191905f5260205f20905b81548152906001019060200180831161121257829003601f168201915b50505050508152505081525061226e565b1561124f5761124f8386611e8f565b5050505b600101610fb2565b50600e80546001810182555f918252600a547fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd909101916001600160a01b03909116906112aa90600d906123aa565b8260ff166001600160401b038111156112c5576112c5612895565b6040519080825280602002602001820160405280156112ee578160200160208202803683370190505b50805161130391600d916020909101906123c5565b505f5b8360ff168110156113b35781600d828154811061132557611325612847565b5f918252602080832090910180546001600160a01b039485166001600160a01b03199182161790915560408051808201825296851680885280855260028085528286206001908101548a87019081528b548083018d558c89528789209b519302909a01805492891692909516919091178455975192880192909255908352600b909152902054169101611306565b505050505b50565b335f9081526003602052604090205460ff166114195760405162461bcd60e51b815260206004820152601960248201527f43616c6c6572206973206e6f7420612076616c696461746f720000000000000060448201526064016102df565b335f9081526002602081905260409091209081015460ff161561147e5760405162461bcd60e51b815260206004820152601d60248201527f56616c696461746f7220697320616c72656164792072657369676e656400000060448201526064016102df565b60028101805460ff19166001908117909155805481905f906114a190839061286f565b90915550506040513381527f24250fc1ec78a1405ddd4cc8b75964858af228d05faa8d4bc1302966d8a541179060200160405180910390a150565b6060336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146115265760405162461bcd60e51b81526004016102df90612812565b5f611534835f600754611dfe565b6001600160401b0381111561154b5761154b612895565b60405190808252806020026020018201604052801561158f57816020015b604080518082019091525f80825260208201528152602001906001900390816115695790505b506008549091506001600160a01b03908116908516156115c857506001600160a01b038085165f90815260066020526040902060030154165b5f5b6001600160a01b038216158015906115e157508481105b15611656576001600160a01b038083165f818152600660209081526040918290208251808401909352928252825490931692810192909252908483611625816128b8565b94508151811061163757611637612847565b6020908102919091010152600301546001600160a01b031691506115ca565b8083510361166957829350505050610683565b5f816001600160401b0381111561168257611682612895565b6040519080825280602002602001820160405280156116c657816020015b604080518082019091525f80825260208201528152602001906001900390816116a05790505b5090505f5b82811015611712578481815181106116e5576116e5612847565b60200260200101518282815181106116ff576116ff612847565b60209081029190910101526001016116cb565b509695505050505050565b6005546060905f906001600160401b0381111561173c5761173c612895565b60405190808252806020026020018201604052801561177557816020015b611762612361565b81526020019060019003908161175a5790505b5090505f5b600554811015610f10575f6005828154811061179857611798612847565b5f9182526020808320909101546001600160a01b03168083526002808352604093849020845180860186528381528551608081018752825481526001830154818701529282015460ff161515958301959095526003810180549396509094938401928591606084019161180a906127e0565b80601f0160208091040260200160405190810160405280929190818152602001828054611836906127e0565b80156118815780601f1061185857610100808354040283529160200191611881565b820191905f5260205f20905b81548152906001019060200180831161186457829003601f168201915b50505050508152505081525084848151811061189f5761189f612847565b6020908102919091010152505060010161177a565b6001600160a01b038082165f90815260066020526040902080549091166118d9575050565b60018101546001600160a01b0383163181101561193a57611904816001600160a01b03851631612882565b82546001600160a01b03165f908152600260205260408120600101805490919061192f90849061286f565b9091555061197f9050565b61194e6001600160a01b0384163182612882565b82546001600160a01b03165f9081526002602052604081206001018054909190611979908490612882565b90915550505b506001600160a01b0390911631600190910155565b335f90815260066020526040812080546001600160a01b0316611a075760405162461bcd60e51b815260206004820152602560248201527f4d75737420766f746520666f722076616c696461746f72206265666f726520756044820152646e766f746560d81b60648201526084016102df565b6009546008546001600160a01b03918216911603611a4057600880546001600160a01b0319908116909155600980549091169055611b53565b600954336001600160a01b0390911603611a99576002810180546001600160a01b039081165f90815260066020526040902060030180546001600160a01b03199081169091559154600980549093169116179055611b53565b600854336001600160a01b0390911603611afd576009546001600160a01b039081165f9081526006602052604080822060020180546001600160a01b0319908116909155600880548086168552929093206003015491169216919091179055611b53565b60038181018054600280850180546001600160a01b039081165f9081526006602052604080822090970180549583166001600160a01b031996871617905591549454811682529490200180549290931691161790555b80546001600160a01b03165f818152600260205260408120600180850154908201805492939192909190611b88908490612882565b9091555050805460019082905f90611ba1908490612882565b9091555050335f90815260066020526040812080546001600160a01b0319908116825560018201839055600282018054821690556003909101805490911690556007805491611bef83612b71565b9091555091949350505050565b60308114611c5a5760405162461bcd60e51b815260206004820152602560248201527f424c5331322d333831207075626c69634b6579206c656e67746820697320696e6044820152641d985b1a5960da1b60648201526084016102df565b5050565b6005545f611c6d600183612882565b90505b8015611c5a575f611c8282600161286f565b60408051426020820152449181019190915260608101849052608001604051602081830303815290604052805190602001205f1c611cc09190612b86565b90505f60058381548110611cd657611cd6612847565b5f91825260209091200154600580546001600160a01b0390921692509083908110611d0357611d03612847565b5f91825260209091200154600580546001600160a01b039092169185908110611d2e57611d2e612847565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508060058381548110611d6d57611d6d612847565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555050508080611da590612b71565b915050611c70565b600a546001600160a01b03165b6001600160a01b03811615611df7576001600160a01b039081165f908152600b6020526040902080546001600160a01b0319811690915516611dba565b505f600c55565b5f81831115611e675760405162461bcd60e51b815260206004820152602f60248201527f4d696e696d756d2073686f756c64206265206c657373207468616e206f72206560448201526e7175616c20746f206d6178696d756d60881b60648201526084016102df565b82841015611e76575081611e88565b81841115611e85575080611e88565b50825b9392505050565b6001600160a01b0382165f9081526002602081815260408084208151608081018352815481526001820154938101939093529283015460ff16151590820152600382018054919291606084019190611ee6906127e0565b80601f0160208091040260200160405190810160405280929190818152602001828054611f12906127e0565b8015611f5d5780601f10611f3457610100808354040283529160200191611f5d565b820191905f5260205f20905b815481529060010190602001808311611f4057829003601f168201915b505050919092525050604080518082018252600a546001600160a01b03168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff1615159482019490945260038401805496975061207e9693955091850193909290916060840191611fd8906127e0565b80601f0160208091040260200160405190810160405280929190818152602001828054612004906127e0565b801561204f5780601f106120265761010080835404028352916020019161204f565b820191905f5260205f20905b81548152906001019060200180831161203257829003601f168201915b5050505050815250508152506040518060400160405280866001600160a01b031681526020018481525061226e565b156120915761208c836122b2565b61220f565b600a546001600160a01b039081165f818152600b6020526040902054909116905b6001600160a01b0382166120cf576120ca8186612303565b61220c565b6040805180820182526001600160a01b0384168082525f90815260026020818152918490208451608081018652815481526001820154818501529181015460ff161515948201949094526003840180546121dc9593850193916060840191612136906127e0565b80601f0160208091040260200160405190810160405280929190818152602001828054612162906127e0565b80156121ad5780601f10612184576101008083540402835291602001916121ad565b820191905f5260205f20905b81548152906001019060200180831161219057829003601f168201915b5050505050815250508152506040518060400160405280886001600160a01b031681526020018681525061226e565b156121eb576120ca8186612303565b506001600160a01b038082165f908152600b602052604090205416906120b2565b50505b8160ff16600c54111561046257600a80546001600160a01b039081165f908152600b6020526040812080546001600160a01b03198082169092558454931692168217909255600c8054919261226383612b71565b919050555050505050565b5f8160200151602001518360200151602001510361229e5750805182516001600160a01b03918216911611610683565b506020908101518101519181015101511190565b600a80546001600160a01b038381165f818152600b602052604081208054939094166001600160a01b031993841617909355835490911617909155600c8054916122fb836128b8565b919050555050565b6001600160a01b038281165f818152600b602052604080822080548686168085529284208054919096166001600160a01b03199182161790955592825282549093169092179055600c805491612358836128b8565b91905055505050565b60405180604001604052805f6001600160a01b031681526020016123a560405180608001604052805f81526020015f81526020015f15158152602001606081525090565b905290565b5080545f8255905f5260205f20908101906113b89190612428565b828054828255905f5260205f20908101928215612418579160200282015b8281111561241857825182546001600160a01b0319166001600160a01b039091161782556020909201916001909101906123e3565b50612424929150612428565b5090565b5b80821115612424575f8155600101612429565b80356001600160a01b0381168114612452575f5ffd5b919050565b5f60208284031215612467575f5ffd5b611e888261243c565b60018060a01b0381511682525f602082015160406020850152805160408501526020810151606085015260408101511515608085015260608101519050608060a085015280518060c08601525f5b818110156124db57602081840181015160e08884010152016124be565b505f60e0828701015260e0601f19601f8301168601019250505092915050565b602081525f611e886020830184612470565b5f5f6020838503121561251e575f5ffd5b82356001600160401b03811115612533575f5ffd5b8301601f81018513612543575f5ffd5b80356001600160401b03811115612558575f5ffd5b8560208260051b840101111561256c575f5ffd5b6020919091019590945092505050565b5f5f6040838503121561258d575f5ffd5b50508035926020909101359150565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561264957868503603f19018452815180518652602090810151604082880181905281519088018190529101905f9060608801905b8083101561263157835180516001600160a01b031683526020908101518184015290930192600192909201916040909101906125fa565b509650505060209384019391909101906001016125c2565b50929695505050505050565b5f5f60208385031215612666575f5ffd5b82356001600160401b0381111561267b575f5ffd5b8301601f8101851361268b575f5ffd5b80356001600160401b038111156126a0575f5ffd5b85602082840101111561256c575f5ffd5b5f602082840312156126c1575f5ffd5b81356001600160401b038111156126d6575f5ffd5b820160408185031215611e88575f5ffd5b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561264957603f19878603018452612729858351612470565b9450602093840193919091019060010161270d565b5f6020828403121561274e575f5ffd5b813560ff81168114611e88575f5ffd5b5f5f6040838503121561276f575f5ffd5b6127788361243c565b946020939093013593505050565b602080825282518282018190525f918401906040840190835b818110156127d557835180516001600160a01b03908116855260209182015116818501529093019260409092019160010161279f565b509095945050505050565b600181811c908216806127f457607f821691505b602082108103610f1057634e487b7160e01b5f52602260045260245ffd5b6020808252818101527f43616c6c6572206973206e6f742074686520636f6e7472616374206f776e6572604082015260600190565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156106835761068361285b565b818103818111156106835761068361285b565b634e487b7160e01b5f52604160045260245ffd5b818382375f9101908152919050565b5f600182016128c9576128c961285b565b5060010190565b601f82111561046257805f5260205f20601f840160051c810160208510156128f55750805b601f840160051c820191505b818110156113b3575f8155600101612901565b81516001600160401b0381111561292d5761292d612895565b6129418161293b84546127e0565b846128d0565b6020601f821160018114612973575f831561295c5750848201515b5f19600385901b1c1916600184901b1784556113b3565b5f84815260208120601f198516915b828110156129a25787850151825560209485019460019092019101612982565b50848210156129bf57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b5f8235607e19833603018112612a21575f5ffd5b9190910192915050565b6001600160401b03831115612a4257612a42612895565b612a5683612a5083546127e0565b836128d0565b5f601f841160018114612a87575f8515612a705750838201355b5f19600387901b1c1916600186901b1783556113b3565b5f83815260208120601f198716915b82811015612ab65786850135825560209485019460019092019101612a96565b5086821015612ad2575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b8135815560208201356001820155600281016040830135801515808214612b09575f5ffd5b60ff19835416915060ff8116821783555050506060820135601e19833603018112612b32575f5ffd5b820180356001600160401b03811115612b49575f5ffd5b602082019150803603821315612b5d575f5ffd5b612b6b818360038601612a2b565b50505050565b5f81612b7f57612b7f61285b565b505f190190565b5f82612ba057634e487b7160e01b5f52601260045260245ffd5b50069056fea264697066735822122071b882f5aa13e15b9bba503811bfdf20f770de1ab04c653b0dfdade41b9c0bed64736f6c634300081b0033", - "sourceMap": "1600:14234:23:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8206:113;8288:24;;8206:113;;;160:25:32;;;148:2;133:18;8206:113:23;;;;;;;;8325:118;8405:24;:31;8325:118;;10111:244;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;10595:91::-;10667:12;;10595:91;;13764:228;;;;;;:::i;:::-;;:::i;:::-;;12617:79;;;:::i;14098:529::-;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8449:951::-;;;;;;:::i;:::-;;:::i;10361:228::-;;;;;;:::i;:::-;;:::i;11543:1068::-;;;;;;:::i;:::-;;:::i;13998:94::-;14071:7;:14;13998:94;;6999:458;;;:::i;:::-;;;;;;;:::i;3531:1701::-;;;;;;:::i;:::-;;:::i;9406:400::-;;;:::i;9812:125::-;;;;;;:::i;:::-;-1:-1:-1;;;;;9901:29:23;9878:4;9901:29;;;:23;:29;;;;;;;;;9812:125;;;;6494:14:32;;6487:22;6469:41;;6457:2;6442:18;9812:125:23;6329:187:32;10692:845:23;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;8083:117::-;8141:7;8167:26;8083:117;;7628:449;;;:::i;10111:244::-;10169:16;;:::i;:::-;-1:-1:-1;;;;;9901:29:23;;9878:4;9901:29;;;:23;:29;;;;;;;;10197:71;;;;-1:-1:-1;;;10197:71:23;;7839:2:32;10197:71:23;;;7821:21:32;7878:2;7858:18;;;7851:30;7917;7897:18;;;7890:58;7965:18;;10197:71:23;;;;;;;;;10285:63;;;;;;;;-1:-1:-1;;;;;10285:63:23;;;;;-1:-1:-1;10315:31:23;;;:24;10285:63;10315:31;;;;;;;10285:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10315:31;10285:63;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;10285:63:23;;;;-1:-1:-1;;;10285:63:23;;10278:70;10111:244;-1:-1:-1;;10111:244:23:o;13764:228::-;2501:10;-1:-1:-1;;;;;2515:6:23;2501:20;;2493:65;;;;-1:-1:-1;;;2493:65:23;;;;;;;:::i;:::-;13899:9:::1;13894:92;13914:17:::0;;::::1;13894:92;;;13952:23;13965:6;;13972:1;13965:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;13952:12;:23::i;:::-;13933:3;;13894:92;;;;13764:228:::0;;:::o;12617:79::-;12659:30;12667:10;12679:9;:7;:9::i;:::-;12659:30;;;-1:-1:-1;;;;;9064:32:32;;;9046:51;;9133:32;;;;9128:2;9113:18;;9106:60;9019:18;12659:30:23;;;;;;;12617:79::o;14098:529::-;14179:14;2501:10;-1:-1:-1;;;;;2515:6:23;2501:20;;2493:65;;;;-1:-1:-1;;;2493:65:23;;;;;;;:::i;:::-;14250:7:::1;:14:::0;14221:5;;14240:24;::::1;14236:163;;-1:-1:-1::0;14288:1:23::1;14236:163;;;14327:7;:14:::0;14310::::1;14319:5:::0;14310:6;:14:::1;:::i;:::-;:31;14306:93;;;14365:7;:14:::0;:23:::1;::::0;14382:6;;14365:23:::1;:::i;:::-;14357:31;;14306:93;14409:21;14445:5;-1:-1:-1::0;;;;;14433:18:23::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;14433:18:23::1;;;;;;;;;;;;;;;-1:-1:-1::0;14409:42:23;-1:-1:-1;14466:9:23::1;14461:136;14485:5;14481:1;:9;14461:136;;;14523:63;;;;;;;;14546:1;14537:6;:10;;;;:::i;:::-;:14;::::0;14550:1:::1;14537:14;:::i;:::-;14523:63:::0;;::::1;;14565:7;14573:10;14582:1:::0;14573:6;:10:::1;:::i;:::-;14565:19;;;;;;;;:::i;:::-;;;;;;;;14523:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;14523:63:23::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;::::1;;;;;;;;;;::::0;14511:6:::1;14518:1;14511:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:75;14492:3:::1;;14461:136;;;-1:-1:-1::0;14614:6:23;-1:-1:-1;;2568:1:23::1;14098:529:::0;;;;:::o;8449:951::-;-1:-1:-1;;;;;2638:6:23;2624:20;:10;:20;2616:61;;;;-1:-1:-1;;;2616:61:23;;9906:2:32;2616:61:23;;;9888:21:32;9945:2;9925:18;;;9918:30;9984;9964:18;;;9957:58;10032:18;;2616:61:23;9704:352:32;2616:61:23;8578:10:::1;8554:35;::::0;;;:23:::1;:35;::::0;;;;;::::1;;8553:36;8545:80;;;::::0;-1:-1:-1;;;8545:80:23;;10263:2:32;8545:80:23::1;::::0;::::1;10245:21:32::0;10302:2;10282:18;;;10275:30;10341:33;10321:18;;;10314:61;10392:18;;8545:80:23::1;10061:355:32::0;8545:80:23::1;8636:27;8676:20;;8666:31;;;;;;;:::i;:::-;;::::0;;;;;::::1;::::0;;;8717:42:::1;::::0;;;:21:::1;:42;::::0;;;;;;8666:31;;-1:-1:-1;8717:42:23::1;;8716:43;8708:91;;;::::0;-1:-1:-1;;;8708:91:23;;10899:2:32;8708:91:23::1;::::0;::::1;10881:21:32::0;10938:2;10918:18;;;10911:30;10977:34;10957:18;;;10950:62;-1:-1:-1;;;11028:18:32;;;11021:33;11071:19;;8708:91:23::1;10697:399:32::0;8708:91:23::1;8810:46;8835:20;;8810:24;:46::i;:::-;8867:30;8900:168;;;;;;;;8941:1;8900:168;;;;8969:1;8900:168;;;;8996:5;8900:168;;;;;;9037:20;;8900:168;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;8900:168:23;;;;-1:-1:-1;;9079:28:23;;8867:201;;-1:-1:-1;8900:168:23;-1:-1:-1;8900:168:23;9079:28:::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;9141:10:23::1;9117:35;::::0;;;:23:::1;:35;::::0;;;;;;;:42;;9155:4:::1;-1:-1:-1::0;;9117:42:23;;::::1;::::0;::::1;::::0;;;9169:24:::1;:36:::0;;;;;;;:48;;;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;::::1;::::0;;;;::::1;::::0;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;:36;:48;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;;;9227:42:23::1;::::0;;;:21:::1;:42;::::0;;;;;:49;;-1:-1:-1;;9227:49:23::1;9272:4;9227:49:::0;;::::1;::::0;;;9286:21:::1;:38:::0;;;;::::1;::::0;;;;;;;;::::1;::::0;;-1:-1:-1;;;;;;9286:38:23::1;9313:10;9286:38:::0;;::::1;::::0;;;9340:53;;::::1;::::0;::::1;::::0;9372:20;;;;9340:53:::1;:::i;:::-;;;;;;;;8535:865;;8449:951:::0;;:::o;10361:228::-;10442:38;10464:15;;;;:10;:15;:::i;10442:38::-;10434:79;;;;-1:-1:-1;;;10434:79:23;;7839:2:32;10434:79:23;;;7821:21:32;7878:2;7858:18;;;7851:30;7917;7897:18;;;7890:58;7965:18;;10434:79:23;7637:352:32;10434:79:23;10567:15;;;;:10;:15;:::i;:::-;10523:24;:41;10548:15;;;;:10;:15;:::i;:::-;-1:-1:-1;;;;;10523:41:23;;;;;;;;;;;;-1:-1:-1;10523:41:23;:59;;:41;:59;:::i;11543:1068::-;-1:-1:-1;;;;;2638:6:23;2624:20;:10;:20;2616:61;;;;-1:-1:-1;;;2616:61:23;;9906:2:32;2616:61:23;;;9888:21:32;9945:2;9925:18;;;9918:30;9984;9964:18;;;9957:58;10032:18;;2616:61:23;9704:352:32;2616:61:23;-1:-1:-1;;;;;9901:29:23;;9878:4;9901:29;;;:23;:29;;;;;;;;11603:63:::1;;;::::0;-1:-1:-1;;;11603:63:23;;16739:2:32;11603:63:23::1;::::0;::::1;16721:21:32::0;16778:2;16758:18;;;16751:30;16817:25;16797:18;;;16790:53;16860:18;;11603:63:23::1;16537:347:32::0;11603:63:23::1;-1:-1:-1::0;;;;;11715:30:23;::::1;11677:35;11715:30:::0;;;:24:::1;:30;::::0;;;;;;;11764:24;;::::1;::::0;::::1;;11763:25;11755:72;;;::::0;-1:-1:-1;;;11755:72:23;;17091:2:32;11755:72:23::1;::::0;::::1;17073:21:32::0;17130:2;17110:18;;;17103:30;17169:34;17149:18;;;17142:62;-1:-1:-1;;;17220:18:32;;;17213:32;17262:19;;11755:72:23::1;16889:398:32::0;11755:72:23::1;11867:10;11838:18;11859:19:::0;;;:7:::1;:19;::::0;;;;11896:15;;-1:-1:-1;;;;;11896:23:23;;::::1;:15:::0;::::1;:23:::0;11888:68:::1;;;::::0;-1:-1:-1;;;11888:68:23;;17494:2:32;11888:68:23::1;::::0;::::1;17476:21:32::0;;;17513:18;;;17506:30;17572:34;17552:18;;;17545:62;17624:18;;11888:68:23::1;17292:356:32::0;11888:68:23::1;11971:15:::0;;-1:-1:-1;;;;;11971:15:23::1;:29:::0;11967:69:::1;;12016:9;:7;:9::i;:::-;;11967:69;12068:88;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;12068:88:23;;::::1;::::0;;12100:10:::1;:18:::0;::::1;12068:88;::::0;;::::1;::::0;;;-1:-1:-1;12068:88:23;;;;;;;;;;;;12046:19;;;:7:::1;:19:::0;;;;;;;:110;;;;;;::::1;-1:-1:-1::0;;;;;;12046:110:23;;::::1;;::::0;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;12171:11:::1;::::0;::::1;12167:277;;12212:11;:24:::0;;12226:10:::1;-1:-1:-1::0;;;;;;12212:24:23;;::::1;::::0;::::1;::::0;;;12250:11:::1;:24:::0;;;;::::1;::::0;;::::1;::::0;;12167:277:::1;;;12313:11;::::0;;-1:-1:-1;;;;;12313:11:23;;::::1;12305:20;::::0;;;:7:::1;:20;::::0;;;;;:25:::1;;:38:::0;;-1:-1:-1;;;;;;12305:38:23;;::::1;12333:10;12305:38:::0;;::::1;::::0;;;12384:11;;12357:19;;;;;;;:24:::1;;:38:::0;;;::::1;12384:11:::0;;;::::1;12357:38:::0;;;::::1;::::0;;;12409:24;;::::1;;::::0;;12167:277:::1;12453:12;:14:::0;;;:12:::1;:14;::::0;::::1;:::i;:::-;;;;;;12507:10;-1:-1:-1::0;;;;;12507:18:23::1;;12478:13;:25;;;:47;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;12535:30:23;;12564:1:::1;::::0;12535:13;;:25:::1;::::0;:30:::1;::::0;12564:1;;12535:30:::1;:::i;:::-;::::0;;;-1:-1:-1;;12581:23:23::1;::::0;;12587:10:::1;9046:51:32::0;;-1:-1:-1;;;;;9133:32:32;;9128:2;9113:18;;9106:60;12581:23:23::1;::::0;9019:18:32;12581:23:23::1;;;;;;;11593:1018;;11543:1068:::0;:::o;6999:458::-;7122:24;:31;7048:18;;7078:25;;-1:-1:-1;;;;;7106:48:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;7078:76:23;-1:-1:-1;7169:9:23;7164:263;7188:24;:31;7184:35;;7164:263;;;7240:12;7255:24;7280:1;7255:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;7255:27:23;7325:30;;;:24;:30;;;;;;;;7381:35;;;;;;;;;;;;;;;;;;;;;7255:27;7381:35;;;;;;;;;;;;;;;;;;;;;;;;;;;7255:27;;-1:-1:-1;7325:30:23;;7381:35;;;;7325:30;;7381:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7369:6;7376:1;7369:9;;;;;;;;:::i;:::-;;;;;;;;;;:47;-1:-1:-1;;7221:3:23;;7164:263;;;-1:-1:-1;7444:6:23;6999:458;-1:-1:-1;6999:458:23:o;3531:1701::-;2501:10;-1:-1:-1;;;;;2515:6:23;2501:20;;2493:65;;;;-1:-1:-1;;;2493:65:23;;;;;;;:::i;:::-;3601:9:::1;:7;:9::i;:::-;3620:21;:19;:21::i;:::-;3652:18;:31:::0;;-1:-1:-1;;;;;;3652:31:23::1;::::0;;;3754:24;3681:1:::1;3725:26:::0;;3681:1;;3712:67:::1;::::0;::::1;::::0;::::1;::::0;3681:1;;3725:53:::1;::::0;3754:24;3725:53:::1;:::i;:::-;3712:6;:67::i;:::-;3694:86;;3853:3;:8;;3860:1;3853:8:::0;3849:45:::1;;3877:7;3531:1701:::0;:::o;3849:45::-:1;3909:9;3904:870;3928:21;:28:::0;3924:32;::::1;3904:870;;;3977:12;3992:21;4014:1;3992:24;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;3992:24:23::1;4060:30:::0;;;:24:::1;:30:::0;;;;;;;;4108:15;;::::1;::::0;3992:24;;-1:-1:-1;4060:30:23;4108:15:::1;;4104:62;;;4143:8;;;;4104:62;4184:18;::::0;-1:-1:-1;;;;;4184:18:23::1;4180:163;;-1:-1:-1::0;4236:18:23::1;:25:::0;;-1:-1:-1;;;;;;4236:25:23::1;-1:-1:-1::0;;;;;4236:25:23;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;4279:19:23::1;:23:::0;4320:8:::1;;4180:163;4383:3;4361:25;;:19;;:25;4357:119;;;4406:29;4425:4;4431:3;4406:18;:29::i;:::-;4453:8;;;;4357:119;4548:18;::::0;-1:-1:-1;;;;;4548:18:23;;::::1;4490:30;4523:44:::0;;;:24:::1;:44;::::0;;;;;;;;4597:35;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;4548:18;4597:35;::::1;::::0;;;::::1;::::0;;;::::1;::::0;::::1;;;;::::0;;;;;;;::::1;::::0;::::1;::::0;;4523:44;;4586:102:::1;::::0;4597:35;;;;::::1;::::0;;4626:4;;4597:35;;;;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;4597:35:23;;;;-1:-1:-1;;;4597:35:23;;4634:53:::1;::::0;;;;::::1;::::0;;4651:18:::1;::::0;-1:-1:-1;;;;;4651:18:23::1;4634:53:::0;;;;::::1;::::0;::::1;::::0;;;;;;4651:18;4634:53;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;;;;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;4677:8;;4634:53;;;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;::::0;4586:10:::1;:102::i;:::-;4582:182;;;4720:29;4739:4;4745:3;4720:18;:29::i;:::-;3963:811;;;3904:870;3958:3;;3904:870;;;-1:-1:-1::0;4817:7:23::1;:14:::0;;::::1;::::0;::::1;::::0;;4784:30:::1;4817:14:::0;;;4857:18:::1;::::0;4817:14;;;::::1;::::0;-1:-1:-1;;;;;4857:18:23;;::::1;::::0;4885:31:::1;::::0;4892:24:::1;::::0;4885:31:::1;:::i;:::-;4967:3;4953:18;;-1:-1:-1::0;;;;;4953:18:23::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;4953:18:23::1;-1:-1:-1::0;4926:45:23;;::::1;::::0;:24:::1;::::0;:45:::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;4986:9:23::1;4981:245;5005:3;5001:7;;:1;:7;4981:245;;;5059:4;5029:24;5054:1;5029:27;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;:34:::0;;-1:-1:-1;;;;;5029:34:23;;::::1;-1:-1:-1::0;;;;;;5029:34:23;;::::1;;::::0;;;5088:85:::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;;5129:30;;;:24:::1;:30:::0;;;;;;5029:34;5129:42;;::::1;::::0;5088:85;;::::1;::::0;;;5077:97;;;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;;;;5195:20;;;:14:::1;:20:::0;;;;;;::::1;::::0;5010:3:::1;4981:245;;;;3591:1641;;;2568:1;3531:1701:::0;:::o;9406:400::-;9482:10;9878:4;9901:29;;;:23;:29;;;;;;;;9452:71;;;;-1:-1:-1;;;9452:71:23;;17855:2:32;9452:71:23;;;17837:21:32;17894:2;17874:18;;;17867:30;17933:27;17913:18;;;17906:55;17978:18;;9452:71:23;17653:349:32;9452:71:23;9593:10;9534:31;9568:36;;;:24;:36;;;;;;;;9623:20;;;;;;9622:21;9614:63;;;;-1:-1:-1;;;9614:63:23;;18209:2:32;9614:63:23;;;18191:21:32;18248:2;18228:18;;;18221:30;18287:31;18267:18;;;18260:59;18336:18;;9614:63:23;18007:353:32;9614:63:23;9688:20;;;:27;;-1:-1:-1;;9688:27:23;9711:4;9688:27;;;;;;9725:29;;9711:4;;9688:20;;9725:29;;9711:4;;9725:29;:::i;:::-;;;;-1:-1:-1;;9770:29:23;;9788:10;18511:51:32;;9770:29:23;;18499:2:32;18484:18;9770:29:23;;;;;;;9442:364;9406:400::o;10692:845::-;10770:19;2501:10;-1:-1:-1;;;;;2515:6:23;2501:20;;2493:65;;;;-1:-1:-1;;;2493:65:23;;;;;;;:::i;:::-;10801:26:::1;10847:30;10854:5;10861:1;10864:12;;10847:6;:30::i;:::-;-1:-1:-1::0;;;;;10830:48:23::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;10830:48:23::1;;;;;;;;;;;;;;;-1:-1:-1::0;10904:11:23::1;::::0;10801:77;;-1:-1:-1;;;;;;10904:11:23;;::::1;::::0;10930:18;::::1;::::0;10926:74:::1;;-1:-1:-1::0;;;;;;10971:13:23;;::::1;;::::0;;;:7:::1;:13;::::0;;;;:18:::1;;::::0;::::1;10926:74;11010:9;11033:211;-1:-1:-1::0;;;;;11040:18:23;::::1;::::0;;::::1;::::0;:31:::1;;;11066:5;11062:1;:9;11040:31;11033:211;;;-1:-1:-1::0;;;;;11108:13:23;;::::1;11087:18;11108:13:::0;;;:7:::1;:13;::::0;;;;;;;;11149:53;;;;::::1;::::0;;;;;;11185:15;;;;::::1;11149:53:::0;;::::1;::::0;;;;11108:13;11135:6;11142:3;::::1;::::0;::::1;:::i;:::-;;;11135:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:67;11223:10:::1;;::::0;-1:-1:-1;;;;;11223:10:23::1;::::0;-1:-1:-1;11033:211:23::1;;;11275:1;11258:6;:13;:18:::0;11254:62:::1;;11299:6;11292:13;;;;;;;11254:62;11374:25;11419:1;-1:-1:-1::0;;;;;11402:19:23::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;11402:19:23::1;;;;;;;;;;;;;;;-1:-1:-1::0;11374:47:23;-1:-1:-1;11436:9:23::1;11431:77;11455:1;11451;:5;11431:77;;;11488:6;11495:1;11488:9;;;;;;;;:::i;:::-;;;;;;;11477:5;11483:1;11477:8;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:20;11458:3:::1;;11431:77;;;-1:-1:-1::0;11525:5:23;10692:845;-1:-1:-1;;;;;;10692:845:23:o;7628:449::-;7751:21;:28;7677:18;;7707:25;;-1:-1:-1;;;;;7735:45:23;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;7707:73:23;-1:-1:-1;7795:9:23;7790:257;7814:21;:28;7810:32;;7790:257;;;7863:12;7878:21;7900:1;7878:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;7878:24:23;7945:30;;;:24;:30;;;;;;;;8001:35;;;;;;;;;;;;;;;;;;;;;7878:24;8001:35;;;;;;;;;;;;;;;;;;;;;;;;;;;7878:24;;-1:-1:-1;7945:30:23;;8001:35;;;;7945:30;;8001:35;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7989:6;7996:1;7989:9;;;;;;;;:::i;:::-;;;;;;;;;;:47;-1:-1:-1;;7844:3:23;;7790:257;;14633:523;-1:-1:-1;;;;;14708:13:23;;;14687:18;14708:13;;;:7;:13;;;;;14735:15;;14708:13;;14735:15;14731:66;;14780:7;14633:523;:::o;14731:66::-;14830:13;;;;-1:-1:-1;;;;;14873:12:23;;;14858:27;;14854:257;;;14958:27;14973:12;-1:-1:-1;;;;;14958:12:23;;;:27;:::i;:::-;14926:15;;-1:-1:-1;;;;;14926:15:23;14901:41;;;;:24;:41;;;;;14926:15;14901:53;:84;;:53;;:41;:84;;;;;:::i;:::-;;;;-1:-1:-1;14854:257:23;;-1:-1:-1;14854:257:23;;15073:27;-1:-1:-1;;;;;15088:12:23;;;15073;:27;:::i;:::-;15041:15;;-1:-1:-1;;;;;15041:15:23;15016:41;;;;:24;:41;;;;;15041:15;15016:53;:84;;:53;;:41;:84;;;;;:::i;:::-;;;;-1:-1:-1;;14854:257:23;-1:-1:-1;;;;;;15137:12:23;;;;15121:13;;;;:28;14633:523::o;12702:1056::-;12787:10;12739:7;12779:19;;;:7;:19;;;;;12816:15;;-1:-1:-1;;;;;12816:15:23;12808:79;;;;-1:-1:-1;;;12808:79:23;;18775:2:32;12808:79:23;;;18757:21:32;18814:2;18794:18;;;18787:30;18853:34;18833:18;;;18826:62;-1:-1:-1;;;18904:18:32;;;18897:35;18949:19;;12808:79:23;18573:401:32;12808:79:23;12917:11;;12902;;-1:-1:-1;;;;;12917:11:23;;;12902;;:26;12898:528;;12944:11;:24;;-1:-1:-1;;;;;;12944:24:23;;;;;;12982:11;:24;;;;;;;12898:528;;;13027:11;;13042:10;-1:-1:-1;;;;;13027:11:23;;;:25;13023:403;;13076:10;;;;;-1:-1:-1;;;;;13076:10:23;;;13103:1;13068:19;;;:7;:19;;;;;:24;;:37;;-1:-1:-1;;;;;;13068:37:23;;;;;;13133:10;;13119:11;:24;;;;;13133:10;;13119:24;;;13023:403;;;13164:11;;13179:10;-1:-1:-1;;;;;13164:11:23;;;:25;13160:266;;13213:11;;-1:-1:-1;;;;;13213:11:23;;;13241:1;13205:20;;;:7;:20;;;;;;:25;;:38;;-1:-1:-1;;;;;;13205:38:23;;;;;;13279:11;;;;;;13271:20;;;;;;:25;;;13257:39;;13271:25;;13257:39;;;;;;13160:266;;;13354:10;;;;;;13335;;;;;;-1:-1:-1;;;;;13335:10:23;;;13354;13327:19;;;:7;:19;;;;;;:24;;;:37;;13354:10;;;-1:-1:-1;;;;;;13327:37:23;;;;;;13405:10;;13386;;;;13378:19;;;;;:24;:37;;13405:10;;;;13378:37;;;;;13160:266;13460:15;;-1:-1:-1;;;;;13460:15:23;13436:21;13524:41;;;:24;:41;;;;;13460:15;13605:13;;;;13576:25;;;:42;;13524:41;;13605:13;;13576:25;;13436:21;13576:42;;13605:13;;13576:42;:::i;:::-;;;;-1:-1:-1;;13628:30:23;;13657:1;;13628:13;;:25;;:30;;13657:1;;13628:30;:::i;:::-;;;;-1:-1:-1;;13684:10:23;13676:19;;;;:7;:19;;;;;13669:26;;-1:-1:-1;;;;;;13669:26:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13706:12;:14;;;;;;:::i;:::-;;;;-1:-1:-1;13738:13:23;;12702:1056;-1:-1:-1;;;;12702:1056:23:o;9943:162::-;10054:2;10034:22;;10026:72;;;;-1:-1:-1;;;10026:72:23;;19322:2:32;10026:72:23;;;19304:21:32;19361:2;19341:18;;;19334:30;19400:34;19380:18;;;19373:62;-1:-1:-1;;;19451:18:32;;;19444:35;19496:19;;10026:72:23;19120:401:32;10026:72:23;9943:162;;:::o;2701:523::-;2751:21;:28;2739:9;2806:5;2810:1;2751:28;2806:5;:::i;:::-;2794:17;;2789:429;2813:5;;2789:429;;2901:9;2991:5;:1;2995;2991:5;:::i;:::-;2931:54;;;2948:15;2931:54;;;19711:19:32;2965:16:23;19746:12:32;;;19739:28;;;;19783:12;;;19776:28;;;19820:12;;2931:54:23;;;;;;;;;;;;2921:65;;;;;;2913:74;;:84;;;;:::i;:::-;2901:96;;3058:12;3073:21;3095:1;3073:24;;;;;;;;:::i;:::-;;;;;;;;;;;3138:21;:24;;-1:-1:-1;;;;;3073:24:23;;;;-1:-1:-1;3138:21:23;3160:1;;3138:24;;;;;;:::i;:::-;;;;;;;;;;;3111:21;:24;;-1:-1:-1;;;;;3138:24:23;;;;3133:1;;3111:24;;;;;;:::i;:::-;;;;;;;;;:51;;;;;-1:-1:-1;;;;;3111:51:23;;;;;-1:-1:-1;;;;;3111:51:23;;;;;;3203:4;3176:21;3198:1;3176:24;;;;;;;;:::i;:::-;;;;;;;;;:31;;;;;-1:-1:-1;;;;;3176:31:23;;;;;-1:-1:-1;;;;;3176:31:23;;;;;;2825:393;;2820:3;;;;;:::i;:::-;;;;2789:429;;3230:295;3295:18;;-1:-1:-1;;;;;3295:18:23;3324:162;-1:-1:-1;;;;;3331:18:23;;;3324:162;;-1:-1:-1;;;;;3408:23:23;;;3365:15;3408:23;;;:14;:23;;;;;;;-1:-1:-1;;;;;;3445:30:23;;;;;3408:23;3324:162;;;-1:-1:-1;3517:1:23;3495:19;:23;3230:295::o;15495:337::-;15574:7;15608:3;15601;:10;;15593:70;;;;-1:-1:-1;;;15593:70:23;;20259:2:32;15593:70:23;;;20241:21:32;20298:2;20278:18;;;20271:30;20337:34;20317:18;;;20310:62;-1:-1:-1;;;20388:18:32;;;20381:45;20443:19;;15593:70:23;20057:411:32;15593:70:23;15685:3;15677:5;:11;15673:153;;;-1:-1:-1;15711:3:23;15704:10;;15673:153;15743:3;15735:5;:11;15731:95;;;-1:-1:-1;15769:3:23;15762:10;;15731:95;-1:-1:-1;15810:5:23;15731:95;15495:337;;;;;:::o;5238:1390::-;-1:-1:-1;;;;;5338:30:23;;5310:25;5338:30;;;:24;:30;;;;;;;;5310:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5338:30;5310:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;5310:58:23;;;;-1:-1:-1;;5424:89:23;;;;;;;;5441:18;;-1:-1:-1;;;;;5441:18:23;5424:89;;;-1:-1:-1;5467:44:23;;;:24;5424:89;5467:44;;;;;;;5424:89;;;;;;;;;;;5441:18;5424:89;;;;;;;;;;;;;;;;;;;;;;;;;;;5310:58;;-1:-1:-1;5396:184:23;;5424:89;;-1:-1:-1;5424:89:23;;;;;;5467:44;;5424:89;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5531:35;;;;;;;;5548:4;-1:-1:-1;;;;;5531:35:23;;;;;5560:4;5531:35;;;5396:10;:184::i;:::-;5379:999;;;5605:16;5616:4;5605:10;:16::i;:::-;5379:999;;;5685:18;;-1:-1:-1;;;;;5685:18:23;;;5652:15;5670:34;;;:14;:34;;;;;;;;;;5770:598;-1:-1:-1;;;;;5805:21:23;;5801:122;;5850:27;5862:8;5872:4;5850:11;:27::i;:::-;5899:5;;5801:122;6002:67;;;;;;;;-1:-1:-1;;;;;6002:67:23;;;;;-1:-1:-1;6034:33:23;;;:24;6002:67;6034:33;;;;;;;6002:67;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5966:186;;6002:67;;;;6034:33;6002:67;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6095:35;;;;;;;;6112:4;-1:-1:-1;;;;;6095:35:23;;;;;6124:4;6095:35;;;5966:10;:186::i;:::-;5941:325;;;6193:27;6205:8;6215:4;6193:11;:27::i;5941:325::-;-1:-1:-1;;;;;;6330:23:23;;;;;;;:14;:23;;;;;;;;5770:598;;;5638:740;;5379:999;6414:3;6392:25;;:19;;:25;6388:234;;;6463:18;;;-1:-1:-1;;;;;6463:18:23;;;6433:12;6448:34;;;:14;:34;;;;;;;-1:-1:-1;;;;;;6496:41:23;;;;;;6551:25;;6448:34;;6551:25;;;;;;;6590:19;:21;;6448:34;;6590:21;;;:::i;:::-;;;;;;6419:203;5300:1328;5238:1390;;:::o;15162:327::-;15263:4;15314:10;:15;;;:27;;;15283:10;:15;;;:27;;;:58;15279:129;;-1:-1:-1;15382:15:23;;15364;;-1:-1:-1;;;;;15364:33:23;;;;;;15357:40;;15279:129;-1:-1:-1;15455:15:23;;;;;:27;;;15425:15;;;;:27;;:57;;15162:327::o;6634:167::-;6710:18;;;-1:-1:-1;;;;;6687:20:23;;;6710:18;6687:20;;;:14;:20;;;;;:41;;6710:18;;;;-1:-1:-1;;;;;;6687:41:23;;;;;;;6738:25;;;;;;;;;6773:19;:21;;;;;;:::i;:::-;;;;;;6634:167;:::o;6807:186::-;-1:-1:-1;;;;;6898:20:23;;;;;;;:14;:20;;;;;;;;6875;;;;;;;;;:43;;6898:20;;;;-1:-1:-1;;;;;;6875:43:23;;;;;;;6928:20;;;:27;;;;;;;;;;6965:19;:21;;;;;;:::i;:::-;;;;;;6807:186;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;196:173:32;264:20;;-1:-1:-1;;;;;313:31:32;;303:42;;293:70;;359:1;356;349:12;293:70;196:173;;;:::o;374:186::-;433:6;486:2;474:9;465:7;461:23;457:32;454:52;;;502:1;499;492:12;454:52;525:29;544:9;525:29;:::i;565:871::-;682:1;678;673:3;669:11;665:19;657:5;651:12;647:38;642:3;635:51;617:3;732:4;725:5;721:16;715:23;770:4;763;758:3;754:14;747:28;813:12;807:19;800:4;795:3;791:14;784:43;881:4;867:12;863:23;857:30;852:2;847:3;843:12;836:52;958:4;944:12;940:23;934:30;927:38;920:46;913:4;908:3;904:14;897:70;1022:2;1008:12;1004:21;998:28;976:50;;1057:4;1051:3;1046;1042:13;1035:27;1091:14;1085:21;1137:6;1131:3;1126;1122:13;1115:29;1162:1;1172:147;1186:6;1183:1;1180:13;1172:147;;;1302:4;1278:22;;;1274:33;;1268:40;1262:3;1249:11;;;1245:21;1238:71;1201:12;1172:147;;;1176:3;1363:1;1357:3;1348:6;1343:3;1339:16;1335:26;1328:37;1426:3;1419:2;1415:7;1410:2;1402:6;1398:15;1394:29;1389:3;1385:39;1381:49;1374:56;;;;565:871;;;;:::o;1441:266::-;1626:2;1615:9;1608:21;1589:4;1646:55;1697:2;1686:9;1682:18;1674:6;1646:55;:::i;1712:610::-;1798:6;1806;1859:2;1847:9;1838:7;1834:23;1830:32;1827:52;;;1875:1;1872;1865:12;1827:52;1915:9;1902:23;-1:-1:-1;;;;;1940:6:32;1937:30;1934:50;;;1980:1;1977;1970:12;1934:50;2003:22;;2056:4;2048:13;;2044:27;-1:-1:-1;2034:55:32;;2085:1;2082;2075:12;2034:55;2125:2;2112:16;-1:-1:-1;;;;;2143:6:32;2140:30;2137:50;;;2183:1;2180;2173:12;2137:50;2236:7;2231:2;2221:6;2218:1;2214:14;2210:2;2206:23;2202:32;2199:45;2196:65;;;2257:1;2254;2247:12;2196:65;2288:2;2280:11;;;;;2310:6;;-1:-1:-1;1712:610:32;-1:-1:-1;;;1712:610:32:o;2327:346::-;2395:6;2403;2456:2;2444:9;2435:7;2431:23;2427:32;2424:52;;;2472:1;2469;2462:12;2424:52;-1:-1:-1;;2517:23:32;;;2637:2;2622:18;;;2609:32;;-1:-1:-1;2327:346:32:o;2678:1554::-;2868:4;2916:2;2905:9;2901:18;2946:2;2935:9;2928:21;2969:6;3004;2998:13;3035:6;3027;3020:22;3073:2;3062:9;3058:18;3051:25;;3135:2;3125:6;3122:1;3118:14;3107:9;3103:30;3099:39;3085:53;;3173:2;3165:6;3161:15;3194:1;3204:999;3218:6;3215:1;3212:13;3204:999;;;3283:22;;;-1:-1:-1;;3279:36:32;3267:49;;3339:13;;3422:9;;3407:25;;3479:2;3471:11;;;3465:18;3391:2;3503:15;;;3496:27;;;3584:19;;3379:15;;;3616:24;;;3706:21;;;-1:-1:-1;;3674:2:32;3662:15;;;3765:330;3781:8;3776:3;3773:17;3765:330;;;3854:15;;3904:9;;-1:-1:-1;;;;;3900:35:32;3886:50;;3990:2;3982:11;;;3976:18;3960:14;;;3953:42;4064:17;;;;3932:1;3800:11;;;;;4032:2;4021:14;;;;3765:330;;;-1:-1:-1;4118:5:32;-1:-1:-1;;;4158:2:32;4181:12;;;;4146:15;;;;;3240:1;3233:9;3204:999;;;-1:-1:-1;4220:6:32;;2678:1554;-1:-1:-1;;;;;;2678:1554:32:o;4237:586::-;4307:6;4315;4368:2;4356:9;4347:7;4343:23;4339:32;4336:52;;;4384:1;4381;4374:12;4336:52;4424:9;4411:23;-1:-1:-1;;;;;4449:6:32;4446:30;4443:50;;;4489:1;4486;4479:12;4443:50;4512:22;;4565:4;4557:13;;4553:27;-1:-1:-1;4543:55:32;;4594:1;4591;4584:12;4543:55;4634:2;4621:16;-1:-1:-1;;;;;4652:6:32;4649:30;4646:50;;;4692:1;4689;4682:12;4646:50;4737:7;4732:2;4723:6;4719:2;4715:15;4711:24;4708:37;4705:57;;;4758:1;4755;4748:12;4828:389;4917:6;4970:2;4958:9;4949:7;4945:23;4941:32;4938:52;;;4986:1;4983;4976:12;4938:52;5026:9;5013:23;-1:-1:-1;;;;;5051:6:32;5048:30;5045:50;;;5091:1;5088;5081:12;5045:50;5114:22;;5170:2;5152:16;;;5148:25;5145:45;;;5186:1;5183;5176:12;5222:828;5420:4;5468:2;5457:9;5453:18;5498:2;5487:9;5480:21;5521:6;5556;5550:13;5587:6;5579;5572:22;5625:2;5614:9;5610:18;5603:25;;5687:2;5677:6;5674:1;5670:14;5659:9;5655:30;5651:39;5637:53;;5725:2;5717:6;5713:15;5746:1;5756:265;5770:6;5767:1;5764:13;5756:265;;;5863:2;5859:7;5847:9;5839:6;5835:22;5831:36;5826:3;5819:49;5891:50;5934:6;5925;5919:13;5891:50;:::i;:::-;5881:60;-1:-1:-1;5976:2:32;5999:12;;;;5964:15;;;;;5792:1;5785:9;5756:265;;6055:269;6112:6;6165:2;6153:9;6144:7;6140:23;6136:32;6133:52;;;6181:1;6178;6171:12;6133:52;6220:9;6207:23;6270:4;6263:5;6259:16;6252:5;6249:27;6239:55;;6290:1;6287;6280:12;6521:300;6589:6;6597;6650:2;6638:9;6629:7;6625:23;6621:32;6618:52;;;6666:1;6663;6656:12;6618:52;6689:29;6708:9;6689:29;:::i;:::-;6679:39;6787:2;6772:18;;;;6759:32;;-1:-1:-1;;;6521:300:32:o;6826:806::-;7074:2;7086:21;;;7156:13;;7059:18;;;7178:22;;;7026:4;;7257:15;;;7231:2;7216:18;;;7026:4;7300:306;7314:6;7311:1;7308:13;7300:306;;;7373:13;;7415:9;;-1:-1:-1;;;;;7411:35:32;;;7399:48;;7499:2;7491:11;;;7485:18;7481:44;7467:12;;;7460:66;7581:15;;;;7555:2;7546:12;;;;7443:1;7329:9;7300:306;;;-1:-1:-1;7623:3:32;;6826:806;-1:-1:-1;;;;;6826:806:32:o;7994:380::-;8073:1;8069:12;;;;8116;;;8137:61;;8191:4;8183:6;8179:17;8169:27;;8137:61;8244:2;8236:6;8233:14;8213:18;8210:38;8207:161;;8290:10;8285:3;8281:20;8278:1;8271:31;8325:4;8322:1;8315:15;8353:4;8350:1;8343:15;8379:356;8581:2;8563:21;;;8600:18;;;8593:30;8659:34;8654:2;8639:18;;8632:62;8726:2;8711:18;;8379:356::o;8740:127::-;8801:10;8796:3;8792:20;8789:1;8782:31;8832:4;8829:1;8822:15;8856:4;8853:1;8846:15;9177:127;9238:10;9233:3;9229:20;9226:1;9219:31;9269:4;9266:1;9259:15;9293:4;9290:1;9283:15;9309:125;9374:9;;;9395:10;;;9392:36;;;9408:18;;:::i;9439:128::-;9506:9;;;9527:11;;;9524:37;;;9541:18;;:::i;9572:127::-;9633:10;9628:3;9624:20;9621:1;9614:31;9664:4;9661:1;9654:15;9688:4;9685:1;9678:15;10421:271;10604:6;10596;10591:3;10578:33;10560:3;10630:16;;10655:13;;;10630:16;10421:271;-1:-1:-1;10421:271:32:o;11101:135::-;11140:3;11161:17;;;11158:43;;11181:18;;:::i;:::-;-1:-1:-1;11228:1:32;11217:13;;11101:135::o;11366:517::-;11467:2;11462:3;11459:11;11456:421;;;11503:5;11500:1;11493:16;11547:4;11544:1;11534:18;11617:2;11605:10;11601:19;11598:1;11594:27;11588:4;11584:38;11653:4;11641:10;11638:20;11635:47;;;-1:-1:-1;11676:4:32;11635:47;11731:2;11726:3;11722:12;11719:1;11715:20;11709:4;11705:31;11695:41;;11786:81;11804:2;11797:5;11794:13;11786:81;;;11863:1;11849:16;;11830:1;11819:13;11786:81;;12059:1295;12183:3;12177:10;-1:-1:-1;;;;;12202:6:32;12199:30;12196:56;;;12232:18;;:::i;:::-;12261:96;12350:6;12310:38;12342:4;12336:11;12310:38;:::i;:::-;12304:4;12261:96;:::i;:::-;12406:4;12437:2;12426:14;;12454:1;12449:648;;;;13141:1;13158:6;13155:89;;;-1:-1:-1;13210:19:32;;;13204:26;13155:89;-1:-1:-1;;12016:1:32;12012:11;;;12008:24;12004:29;11994:40;12040:1;12036:11;;;11991:57;13257:81;;12419:929;;12449:648;11313:1;11306:14;;;11350:4;11337:18;;-1:-1:-1;;12485:20:32;;;12602:222;12616:7;12613:1;12610:14;12602:222;;;12698:19;;;12692:26;12677:42;;12805:4;12790:20;;;;12758:1;12746:14;;;;12632:12;12602:222;;;12606:3;12852:6;12843:7;12840:19;12837:201;;;12913:19;;;12907:26;-1:-1:-1;;12996:1:32;12992:14;;;13008:3;12988:24;12984:37;12980:42;12965:58;12950:74;;12837:201;-1:-1:-1;;;;13084:1:32;13068:14;;;13064:22;13051:36;;-1:-1:-1;12059:1295:32:o;13359:485::-;-1:-1:-1;;;;;13544:32:32;;13526:51;;13613:2;13608;13593:18;;13586:30;;;13632:18;;13625:34;;;13652:6;13701;13696:2;13681:18;;13668:48;13765:1;13736:22;;;13760:2;13732:31;;;13725:42;;;;13828:2;13807:15;;;-1:-1:-1;;13803:29:32;13788:45;13784:54;;13359:485;-1:-1:-1;;13359:485:32:o;13849:332::-;13949:4;14007:11;13994:25;14101:3;14097:8;14086;14070:14;14066:29;14062:44;14042:18;14038:69;14028:97;;14121:1;14118;14111:12;14028:97;14142:33;;;;;13849:332;-1:-1:-1;;13849:332:32:o;14186:1178::-;-1:-1:-1;;;;;14287:3:32;14284:27;14281:53;;;14314:18;;:::i;:::-;14343:93;14432:3;14392:38;14424:4;14418:11;14392:38;:::i;:::-;14386:4;14343:93;:::i;:::-;14462:1;14487:2;14482:3;14479:11;14504:1;14499:607;;;;15150:1;15167:3;15164:93;;;-1:-1:-1;15223:19:32;;;15210:33;15164:93;-1:-1:-1;;12016:1:32;12012:11;;;12008:24;12004:29;11994:40;12040:1;12036:11;;;11991:57;15270:78;;14472:886;;14499:607;11313:1;11306:14;;;11350:4;11337:18;;-1:-1:-1;;14535:17:32;;;14649:229;14663:7;14660:1;14657:14;14649:229;;;14752:19;;;14739:33;14724:49;;14859:4;14844:20;;;;14812:1;14800:14;;;;14679:12;14649:229;;;14653:3;14906;14897:7;14894:16;14891:159;;;15030:1;15026:6;15020:3;15014;15011:1;15007:11;15003:21;14999:34;14995:39;14982:9;14977:3;14973:19;14960:33;14956:79;14948:6;14941:95;14891:159;;;15093:1;15087:3;15084:1;15080:11;15076:19;15070:4;15063:33;14472:886;;14186:1178;;;:::o;15369:1163::-;15556:19;;15584:21;;15674:2;15663:14;;15650:28;15704:1;15694:12;;15687:29;15753:1;15743:12;;15803:2;15792:14;;15779:28;15833:15;;15826:23;15868:15;;;15858:43;;15897:1;15894;15887:12;15858:43;15952:3;15948:8;15935:10;15929:17;15925:32;15910:47;;16005:3;16001:2;15997:12;15988:7;15985:25;15973:10;15966:45;;;;16070:2;16063:5;16059:14;16046:28;16153:2;16149:7;16141:5;16125:14;16121:26;16117:40;16097:18;16093:65;16083:93;;16172:1;16169;16162:12;16083:93;16197:30;;16250:18;;-1:-1:-1;;;;;16280:30:32;;16277:50;;;16323:1;16320;16313:12;16277:50;16360:2;16354:4;16350:13;16336:27;;16407:6;16391:14;16387:27;16379:6;16375:40;16372:60;;;16428:1;16425;16418:12;16372:60;16441:85;16519:6;16511;16507:1;16501:4;16497:12;16441:85;:::i;:::-;;;15369:1163;;:::o;18979:136::-;19018:3;19046:5;19036:39;;19055:18;;:::i;:::-;-1:-1:-1;;;19091:18:32;;18979:136::o;19843:209::-;19875:1;19901;19891:132;;19945:10;19940:3;19936:20;19933:1;19926:31;19980:4;19977:1;19970:15;20008:4;20005:1;19998:15;19891:132;-1:-1:-1;20037:9:32;;19843:209::o", - "linkReferences": {}, - "immutableReferences": { - "39841": [ - { "start": 996, "length": 32 }, - { "start": 1219, "length": 32 }, - { "start": 1683, "length": 32 }, - { "start": 2569, "length": 32 }, - { "start": 3873, "length": 32 }, - { "start": 5353, "length": 32 } - ] - } - }, "methodIdentifiers": { + "UPGRADE_INTERFACE_VERSION()": "ad3cb1cc", "activeValidatorsCount()": "0d2bd909", - "calculateTopValidators(uint8)": "b5cfa68c", + "addValidator(address,bytes,bool)": "7c8a92c3", + "addVotes(address[],address[])": "e9257dc8", + "calculateRoundValidators(uint8)": "c5a74449", + "fee()": "ddca3f43", "getAllValidators()": "f3513a37", + "getRoundValidators()": "a250eaf1", "getRounds(uint256,uint256)": "40f74f47", "getRoundsCount()": "a09686c4", - "getTopValidators()": "afeea115", "getValidator(address)": "1904bb2e", "getVotes(address,uint256)": "eb9019d4", "getVotesCount()": "1b605b86", + "initialize(uint128)": "56db9ef1", "isValidatorRegistered(address)": "d04a68c7", - "registerValidator(bytes)": "602a9eee", - "registeredValidatorsCount()": "f1bd0b37", + "owner()": "8da5cb5b", + "proxiableUUID()": "52d1902d", + "registerValidator(bytes,bytes)": "226f2645", + "renounceOwnership()": "715018a6", "resignValidator()": "b85f5da2", "resignedValidatorsCount()": "0777cbef", + "roundValidatorsCount()": "b84d356e", + "setFee(uint128)": "3687f24a", + "transferOwnership(address)": "f2fde38b", "unvote()": "3174b689", - "updateValidator((address,(uint256,uint256,bool,bytes)))": "62525879", + "updateValidator(bytes,bytes)": "8f062626", "updateVoters(address[])": "2bdf6d43", + "upgradeToAndCall(address,bytes)": "4f1ef286", + "validatorsCount()": "ed612f8c", + "version()": "54fd4d50", "vote(address)": "6dd7d8ea" }, - "rawMetadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"Unvoted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"name\":\"ValidatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"ValidatorResigned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"Voted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"activeValidatorsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"}],\"name\":\"calculateTopValidators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllValidators\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"votersCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isResigned\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"internalType\":\"struct ValidatorData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct Validator[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"name\":\"getRounds\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"round\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"}],\"internalType\":\"struct RoundValidator[]\",\"name\":\"validators\",\"type\":\"tuple[]\"}],\"internalType\":\"struct Round[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRoundsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getTopValidators\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"votersCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isResigned\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"internalType\":\"struct ValidatorData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct Validator[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_addr\",\"type\":\"address\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"votersCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isResigned\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"internalType\":\"struct ValidatorData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct Validator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"name\":\"getVotes\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"internalType\":\"struct VoteResult[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVotesCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isValidatorRegistered\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"name\":\"registerValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registeredValidatorsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resignValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resignedValidatorsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unvote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"votersCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"isResigned\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"bls12_381_public_key\",\"type\":\"bytes\"}],\"internalType\":\"struct ValidatorData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct Validator\",\"name\":\"_validator\",\"type\":\"tuple\"}],\"name\":\"updateValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"voters\",\"type\":\"address[]\"}],\"name\":\"updateVoters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/consensus/Consensus.sol\":\"Consensus\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@contracts/=src/\",\":@forge-std/=forge-std/src/\"]},\"sources\":{\"src/consensus/Consensus.sol\":{\"keccak256\":\"0x5b736870bfb3308f6f109276d30415ab555c65a1c1165afbe50c56220ed9d129\",\"urls\":[\"bzz-raw://0d9655228a0caa1a1802d479cc6bd490d8d0f36061f285e855d23e32e55f311c\",\"dweb:/ipfs/QmUfv3d2My7CuFjq7PM6jmxLoXWLrErfGkCT8s1tNKvcCZ\"]}},\"version\":1}", + "rawMetadata": "{\"compiler\":{\"version\":\"0.8.27+commit.40a35a09\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"}],\"name\":\"AddressEmptyCode\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"AlreadyVoted\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BellowMinValidators\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlsKeyAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BlsKeyIsInvalid\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"CallerIsNotValidator\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"ERC1967InvalidImplementation\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ERC1967NonPayable\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"FailedCall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ImportIsNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidFee\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidInputLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidParameters\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidProofOfPossession\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"min\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"max\",\"type\":\"uint256\"}],\"name\":\"InvalidRange\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MissingVote\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NoActiveValidators\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"NotInitializing\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"OwnableInvalidOwner\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"OwnableUnauthorizedAccount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"PrecompileCallFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"RefundFailed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"UUPSUnauthorizedCallContext\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"slot\",\"type\":\"bytes32\"}],\"name\":\"UUPSUnsupportedProxiableUUID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValidatorAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValidatorAlreadyResigned\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ValidatorNotRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"VoteResignedValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"VoteSameValidator\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"VoteValidatorWithoutBlsPublicKey\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"fee\",\"type\":\"uint256\"}],\"name\":\"FeeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"version\",\"type\":\"uint64\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"Unvoted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"Upgraded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"}],\"name\":\"ValidatorRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"ValidatorResigned\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"}],\"name\":\"ValidatorUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"Voted\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"UPGRADE_INTERFACE_VERSION\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"activeValidatorsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"bool\",\"name\":\"isResigned\",\"type\":\"bool\"}],\"name\":\"addValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"voters\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"validators\",\"type\":\"address[]\"}],\"name\":\"addVotes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"}],\"name\":\"calculateRoundValidators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"fee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getAllValidators\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"fee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"votersCount\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isResigned\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"}],\"internalType\":\"struct ConsensusV1.ValidatorData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct ConsensusV1.Validator[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRoundValidators\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"fee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"votersCount\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isResigned\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"}],\"internalType\":\"struct ConsensusV1.ValidatorData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct ConsensusV1.Validator[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"offset\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"name\":\"getRounds\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"round\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"}],\"internalType\":\"struct ConsensusV1.RoundValidator[]\",\"name\":\"validators\",\"type\":\"tuple[]\"}],\"internalType\":\"struct ConsensusV1.Round[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getRoundsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"getValidator\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"},{\"internalType\":\"uint128\",\"name\":\"fee\",\"type\":\"uint128\"},{\"internalType\":\"uint64\",\"name\":\"votersCount\",\"type\":\"uint64\"},{\"internalType\":\"bool\",\"name\":\"isResigned\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"}],\"internalType\":\"struct ConsensusV1.ValidatorData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct ConsensusV1.Validator\",\"name\":\"\",\"type\":\"tuple\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"name\":\"getVotes\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"internalType\":\"struct ConsensusV1.VoteResult[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getVotesCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint128\",\"name\":\"registrationFee\",\"type\":\"uint128\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isValidatorRegistered\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxiableUUID\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proofOfPossession\",\"type\":\"bytes\"}],\"name\":\"registerValidator\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resignValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"resignedValidatorsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"roundValidatorsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint128\",\"name\":\"registrationFee\",\"type\":\"uint128\"}],\"name\":\"setFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"unvote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"blsPublicKey\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"proofOfPossession\",\"type\":\"bytes\"}],\"name\":\"updateValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"voters\",\"type\":\"address[]\"}],\"name\":\"updateVoters\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeToAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"validatorsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"version\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"vote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"errors\":{\"AddressEmptyCode(address)\":[{\"details\":\"There's no code at `target` (it is not a contract).\"}],\"ERC1967InvalidImplementation(address)\":[{\"details\":\"The `implementation` of the proxy is invalid.\"}],\"ERC1967NonPayable()\":[{\"details\":\"An upgrade function sees `msg.value > 0` that may be lost.\"}],\"FailedCall()\":[{\"details\":\"A call to an address target failed. The target may have reverted.\"}],\"InvalidInitialization()\":[{\"details\":\"The contract is already initialized.\"}],\"NotInitializing()\":[{\"details\":\"The contract is not initializing.\"}],\"OwnableInvalidOwner(address)\":[{\"details\":\"The owner is not a valid owner account. (eg. `address(0)`)\"}],\"OwnableUnauthorizedAccount(address)\":[{\"details\":\"The caller account is not authorized to perform an operation.\"}],\"UUPSUnauthorizedCallContext()\":[{\"details\":\"The call is from an unauthorized context.\"}],\"UUPSUnsupportedProxiableUUID(bytes32)\":[{\"details\":\"The storage `slot` is unsupported as a UUID.\"}]},\"events\":{\"Initialized(uint64)\":{\"details\":\"Triggered when the contract has been initialized or reinitialized.\"},\"Upgraded(address)\":{\"details\":\"Emitted when the implementation is upgraded.\"}},\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"proxiableUUID()\":{\"details\":\"Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"},\"upgradeToAndCall(address,bytes)\":{\"custom:oz-upgrades-unsafe-allow-reachable\":\"delegatecall\",\"details\":\"Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/consensus/ConsensusV1.sol\":\"ConsensusV1\"},\"evmVersion\":\"shanghai\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[\":@contracts/=src/\",\":@forge-std/=lib/forge-std/src/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/\",\":erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/\",\":forge-std/=lib/forge-std/src/\",\":halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/\",\":openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/\"]},\"sources\":{\"lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol\":{\"keccak256\":\"0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6\",\"dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol\":{\"keccak256\":\"0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08\",\"dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0x574a7451e42724f7de29e2855c392a8a5020acd695169466a18459467d719d63\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5bc189f63b639ee173dd7b6fecc39baf7113bf161776aea22b34c57fdd1872ec\",\"dweb:/ipfs/QmZAf2VtjDLRULqjJkde6LNsxAg12tUqpPqgUQQZbAjgtZ\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol\":{\"keccak256\":\"0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9\",\"dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV\"]},\"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol\":{\"keccak256\":\"0xb25a4f11fa80c702bf5cd85adec90e6f6f507f32f4a8e6f5dbc31e8c10029486\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6917f8a323e7811f041aecd4d9fd6e92455a6fba38a797ac6f6e208c7912b79d\",\"dweb:/ipfs/QmShuYv55wYHGi4EFkDB8QfF7ZCHoKk2efyz3AWY1ExSq7\"]},\"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol\":{\"keccak256\":\"0xc42facb5094f2f35f066a7155bda23545e39a3156faef3ddc00185544443ba7d\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://d3b36282ab029b46bd082619a308a2ea11c309967b9425b7b7a6eb0b0c1c3196\",\"dweb:/ipfs/QmP2YVfDB2FoREax3vJu7QhDnyYRMw52WPrCD4vdT2kuDA\"]},\"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol\":{\"keccak256\":\"0x8decfa54cec979c824b044b8128cd91d713f72c71fd7dfa54974624d8c949898\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://271f914261a19d87117a777e0924ada545c16191ef9b00cc40b0134fc14ebc70\",\"dweb:/ipfs/QmdvVNWHGHQrGGPonZJs5NuzTevTjZRM2zayKrDJf7WBA2\"]},\"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol\":{\"keccak256\":\"0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa\",\"dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM\"]},\"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Address.sol\":{\"keccak256\":\"0x06871a0948d0fed9316ae59ee4368527e144911f5e284755312b5bfcde8b27ea\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://3c30e46d061d8a450c561935a1236b1885aa76ffab93a19b26dcb8868c839843\",\"dweb:/ipfs/QmZbWbeDyixTyYkVtJvuiQYfkQz12pS7zxWZF3Ju9PYwGH\"]},\"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Errors.sol\":{\"keccak256\":\"0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf\",\"dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB\"]},\"lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol\":{\"keccak256\":\"0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b\",\"dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM\"]},\"src/consensus/BLSPoP.sol\":{\"keccak256\":\"0x19842d7113033964e1f51c97458aa44cb5efc41618b67fc7f949f48824cfd3ee\",\"license\":\"GNU GENERAL PUBLIC LICENSE\",\"urls\":[\"bzz-raw://a6d8f6d87bef7eff7b1e475d1f82ed401c20e5f83a9cdd8724dd27fc67a1ef26\",\"dweb:/ipfs/QmbyRGmCF1vi5NwZmN9p4T55XVs2kdoRJx8ZiBFU4evRYe\"]},\"src/consensus/ConsensusV1.sol\":{\"keccak256\":\"0x32c0841d05f559c4dbbaf2478891e7e1979e6d6f4b541cde9ada1e3b3747eac9\",\"license\":\"GNU GENERAL PUBLIC LICENSE\",\"urls\":[\"bzz-raw://35a52180a27c0818efa6cc80445db16c9d655a0004bfb1db599c0dc5d0588ee4\",\"dweb:/ipfs/Qmd4cjwm4CWNJFihLM4sbNqSEPALoXXfsdDS3MhDzcvvGR\"]}},\"version\":1}", "metadata": { "compiler": { "version": "0.8.27+commit.40a35a09" }, "language": "Solidity", "output": { "abi": [ { - "inputs": [], - "stateMutability": "nonpayable", - "type": "constructor" + "inputs": [{ "internalType": "address", "name": "target", "type": "address" }], + "type": "error", + "name": "AddressEmptyCode" }, + { "inputs": [], "type": "error", "name": "AlreadyVoted" }, + { "inputs": [], "type": "error", "name": "BellowMinValidators" }, + { "inputs": [], "type": "error", "name": "BlsKeyAlreadyRegistered" }, + { "inputs": [], "type": "error", "name": "BlsKeyIsInvalid" }, + { "inputs": [], "type": "error", "name": "CallerIsNotValidator" }, + { + "inputs": [{ "internalType": "address", "name": "implementation", "type": "address" }], + "type": "error", + "name": "ERC1967InvalidImplementation" + }, + { "inputs": [], "type": "error", "name": "ERC1967NonPayable" }, + { "inputs": [], "type": "error", "name": "FailedCall" }, + { "inputs": [], "type": "error", "name": "ImportIsNotAllowed" }, + { "inputs": [], "type": "error", "name": "InvalidFee" }, + { "inputs": [], "type": "error", "name": "InvalidInitialization" }, + { "inputs": [], "type": "error", "name": "InvalidInputLength" }, + { "inputs": [], "type": "error", "name": "InvalidParameters" }, + { "inputs": [], "type": "error", "name": "InvalidProofOfPossession" }, { "inputs": [ - { - "internalType": "address", - "name": "voter", - "type": "address", - "indexed": false - }, - { - "internalType": "address", - "name": "validator", - "type": "address", - "indexed": false - } + { "internalType": "uint256", "name": "min", "type": "uint256" }, + { "internalType": "uint256", "name": "max", "type": "uint256" } + ], + "type": "error", + "name": "InvalidRange" + }, + { "inputs": [], "type": "error", "name": "MissingVote" }, + { "inputs": [], "type": "error", "name": "NoActiveValidators" }, + { "inputs": [], "type": "error", "name": "NotInitializing" }, + { + "inputs": [{ "internalType": "address", "name": "owner", "type": "address" }], + "type": "error", + "name": "OwnableInvalidOwner" + }, + { + "inputs": [{ "internalType": "address", "name": "account", "type": "address" }], + "type": "error", + "name": "OwnableUnauthorizedAccount" + }, + { "inputs": [], "type": "error", "name": "PrecompileCallFailed" }, + { "inputs": [], "type": "error", "name": "RefundFailed" }, + { "inputs": [], "type": "error", "name": "UUPSUnauthorizedCallContext" }, + { + "inputs": [{ "internalType": "bytes32", "name": "slot", "type": "bytes32" }], + "type": "error", + "name": "UUPSUnsupportedProxiableUUID" + }, + { "inputs": [], "type": "error", "name": "ValidatorAlreadyRegistered" }, + { "inputs": [], "type": "error", "name": "ValidatorAlreadyResigned" }, + { "inputs": [], "type": "error", "name": "ValidatorNotRegistered" }, + { "inputs": [], "type": "error", "name": "VoteResignedValidator" }, + { "inputs": [], "type": "error", "name": "VoteSameValidator" }, + { "inputs": [], "type": "error", "name": "VoteValidatorWithoutBlsPublicKey" }, + { + "inputs": [{ "internalType": "uint256", "name": "fee", "type": "uint256", "indexed": false }], + "type": "event", + "name": "FeeUpdated", + "anonymous": false + }, + { + "inputs": [{ "internalType": "uint64", "name": "version", "type": "uint64", "indexed": false }], + "type": "event", + "name": "Initialized", + "anonymous": false + }, + { + "inputs": [ + { "internalType": "address", "name": "previousOwner", "type": "address", "indexed": true }, + { "internalType": "address", "name": "newOwner", "type": "address", "indexed": true } + ], + "type": "event", + "name": "OwnershipTransferred", + "anonymous": false + }, + { + "inputs": [ + { "internalType": "address", "name": "voter", "type": "address", "indexed": false }, + { "internalType": "address", "name": "validator", "type": "address", "indexed": false } ], "type": "event", "name": "Unvoted", @@ -538,79 +580,90 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "addr", - "type": "address", - "indexed": false - }, - { - "internalType": "bytes", - "name": "bls12_381_public_key", - "type": "bytes", - "indexed": false - } + { "internalType": "address", "name": "implementation", "type": "address", "indexed": true } ], "type": "event", - "name": "ValidatorRegistered", + "name": "Upgraded", "anonymous": false }, { "inputs": [ - { - "internalType": "address", - "name": "addr", - "type": "address", - "indexed": false - } + { "internalType": "address", "name": "addr", "type": "address", "indexed": false }, + { "internalType": "bytes", "name": "blsPublicKey", "type": "bytes", "indexed": false } ], "type": "event", + "name": "ValidatorRegistered", + "anonymous": false + }, + { + "inputs": [{ "internalType": "address", "name": "addr", "type": "address", "indexed": false }], + "type": "event", "name": "ValidatorResigned", "anonymous": false }, { "inputs": [ - { - "internalType": "address", - "name": "voter", - "type": "address", - "indexed": false - }, - { - "internalType": "address", - "name": "validator", - "type": "address", - "indexed": false - } + { "internalType": "address", "name": "addr", "type": "address", "indexed": false }, + { "internalType": "bytes", "name": "blsPublicKey", "type": "bytes", "indexed": false } + ], + "type": "event", + "name": "ValidatorUpdated", + "anonymous": false + }, + { + "inputs": [ + { "internalType": "address", "name": "voter", "type": "address", "indexed": false }, + { "internalType": "address", "name": "validator", "type": "address", "indexed": false } ], "type": "event", "name": "Voted", "anonymous": false }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "UPGRADE_INTERFACE_VERSION", + "outputs": [{ "internalType": "string", "name": "", "type": "string" }] + }, { "inputs": [], "stateMutability": "view", "type": "function", "name": "activeValidatorsCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }] }, { "inputs": [ - { - "internalType": "uint8", - "name": "n", - "type": "uint8" - } + { "internalType": "address", "name": "addr", "type": "address" }, + { "internalType": "bytes", "name": "blsPublicKey", "type": "bytes" }, + { "internalType": "bool", "name": "isResigned", "type": "bool" } ], "stateMutability": "nonpayable", "type": "function", - "name": "calculateTopValidators" + "name": "addValidator" + }, + { + "inputs": [ + { "internalType": "address[]", "name": "voters", "type": "address[]" }, + { "internalType": "address[]", "name": "validators", "type": "address[]" } + ], + "stateMutability": "nonpayable", + "type": "function", + "name": "addVotes" + }, + { + "inputs": [{ "internalType": "uint8", "name": "n", "type": "uint8" }], + "stateMutability": "nonpayable", + "type": "function", + "name": "calculateRoundValidators" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "fee", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }] }, { "inputs": [], @@ -619,40 +672,21 @@ "name": "getAllValidators", "outputs": [ { - "internalType": "struct Validator[]", + "internalType": "struct ConsensusV1.Validator[]", "name": "", "type": "tuple[]", "components": [ + { "internalType": "address", "name": "addr", "type": "address" }, { - "internalType": "address", - "name": "addr", - "type": "address" - }, - { - "internalType": "struct ValidatorData", + "internalType": "struct ConsensusV1.ValidatorData", "name": "data", "type": "tuple", "components": [ - { - "internalType": "uint256", - "name": "votersCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "voteBalance", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "isResigned", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "bls12_381_public_key", - "type": "bytes" - } + { "internalType": "uint256", "name": "voteBalance", "type": "uint256" }, + { "internalType": "uint128", "name": "fee", "type": "uint128" }, + { "internalType": "uint64", "name": "votersCount", "type": "uint64" }, + { "internalType": "bool", "name": "isResigned", "type": "bool" }, + { "internalType": "bytes", "name": "blsPublicKey", "type": "bytes" } ] } ] @@ -660,47 +694,27 @@ ] }, { - "inputs": [ - { - "internalType": "uint256", - "name": "offset", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "count", - "type": "uint256" - } - ], + "inputs": [], "stateMutability": "view", "type": "function", - "name": "getRounds", + "name": "getRoundValidators", "outputs": [ { - "internalType": "struct Round[]", + "internalType": "struct ConsensusV1.Validator[]", "name": "", "type": "tuple[]", "components": [ + { "internalType": "address", "name": "addr", "type": "address" }, { - "internalType": "uint256", - "name": "round", - "type": "uint256" - }, - { - "internalType": "struct RoundValidator[]", - "name": "validators", - "type": "tuple[]", + "internalType": "struct ConsensusV1.ValidatorData", + "name": "data", + "type": "tuple", "components": [ - { - "internalType": "address", - "name": "addr", - "type": "address" - }, - { - "internalType": "uint256", - "name": "voteBalance", - "type": "uint256" - } + { "internalType": "uint256", "name": "voteBalance", "type": "uint256" }, + { "internalType": "uint128", "name": "fee", "type": "uint128" }, + { "internalType": "uint64", "name": "votersCount", "type": "uint64" }, + { "internalType": "bool", "name": "isResigned", "type": "bool" }, + { "internalType": "bytes", "name": "blsPublicKey", "type": "bytes" } ] } ] @@ -708,59 +722,27 @@ ] }, { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "getRoundsCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] - }, - { - "inputs": [], + "inputs": [ + { "internalType": "uint256", "name": "offset", "type": "uint256" }, + { "internalType": "uint256", "name": "count", "type": "uint256" } + ], "stateMutability": "view", "type": "function", - "name": "getTopValidators", + "name": "getRounds", "outputs": [ { - "internalType": "struct Validator[]", + "internalType": "struct ConsensusV1.Round[]", "name": "", "type": "tuple[]", "components": [ + { "internalType": "uint256", "name": "round", "type": "uint256" }, { - "internalType": "address", - "name": "addr", - "type": "address" - }, - { - "internalType": "struct ValidatorData", - "name": "data", - "type": "tuple", + "internalType": "struct ConsensusV1.RoundValidator[]", + "name": "validators", + "type": "tuple[]", "components": [ - { - "internalType": "uint256", - "name": "votersCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "voteBalance", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "isResigned", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "bls12_381_public_key", - "type": "bytes" - } + { "internalType": "address", "name": "addr", "type": "address" }, + { "internalType": "uint256", "name": "voteBalance", "type": "uint256" } ] } ] @@ -768,52 +750,34 @@ ] }, { - "inputs": [ - { - "internalType": "address", - "name": "_addr", - "type": "address" - } - ], + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getRoundsCount", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }] + }, + { + "inputs": [{ "internalType": "address", "name": "addr", "type": "address" }], "stateMutability": "view", "type": "function", "name": "getValidator", "outputs": [ { - "internalType": "struct Validator", + "internalType": "struct ConsensusV1.Validator", "name": "", "type": "tuple", "components": [ + { "internalType": "address", "name": "addr", "type": "address" }, { - "internalType": "address", - "name": "addr", - "type": "address" - }, - { - "internalType": "struct ValidatorData", + "internalType": "struct ConsensusV1.ValidatorData", "name": "data", "type": "tuple", "components": [ - { - "internalType": "uint256", - "name": "votersCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "voteBalance", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "isResigned", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "bls12_381_public_key", - "type": "bytes" - } + { "internalType": "uint256", "name": "voteBalance", "type": "uint256" }, + { "internalType": "uint128", "name": "fee", "type": "uint128" }, + { "internalType": "uint64", "name": "votersCount", "type": "uint64" }, + { "internalType": "bool", "name": "isResigned", "type": "bool" }, + { "internalType": "bytes", "name": "blsPublicKey", "type": "bytes" } ] } ] @@ -822,36 +786,20 @@ }, { "inputs": [ - { - "internalType": "address", - "name": "addr", - "type": "address" - }, - { - "internalType": "uint256", - "name": "count", - "type": "uint256" - } + { "internalType": "address", "name": "addr", "type": "address" }, + { "internalType": "uint256", "name": "count", "type": "uint256" } ], "stateMutability": "view", "type": "function", "name": "getVotes", "outputs": [ { - "internalType": "struct VoteResult[]", + "internalType": "struct ConsensusV1.VoteResult[]", "name": "", "type": "tuple[]", "components": [ - { - "internalType": "address", - "name": "voter", - "type": "address" - }, - { - "internalType": "address", - "name": "validator", - "type": "address" - } + { "internalType": "address", "name": "voter", "type": "address" }, + { "internalType": "address", "name": "validator", "type": "address" } ] } ] @@ -861,172 +809,266 @@ "stateMutability": "view", "type": "function", "name": "getVotesCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }] }, { - "inputs": [ - { - "internalType": "address", - "name": "addr", - "type": "address" - } - ], + "inputs": [{ "internalType": "uint128", "name": "registrationFee", "type": "uint128" }], + "stateMutability": "nonpayable", + "type": "function", + "name": "initialize" + }, + { + "inputs": [{ "internalType": "address", "name": "addr", "type": "address" }], "stateMutability": "view", "type": "function", "name": "isValidatorRegistered", - "outputs": [ - { "internalType": "bool", "name": "", "type": "bool" } - ] + "outputs": [{ "internalType": "bool", "name": "", "type": "bool" }] }, { - "inputs": [ - { - "internalType": "bytes", - "name": "bls12_381_public_key", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", + "inputs": [], + "stateMutability": "view", "type": "function", - "name": "registerValidator" + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }] }, { "inputs": [], "stateMutability": "view", "type": "function", - "name": "registeredValidatorsCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] + "name": "proxiableUUID", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }] }, { - "inputs": [], - "stateMutability": "nonpayable", + "inputs": [ + { "internalType": "bytes", "name": "blsPublicKey", "type": "bytes" }, + { "internalType": "bytes", "name": "proofOfPossession", "type": "bytes" } + ], + "stateMutability": "payable", "type": "function", - "name": "resignValidator" + "name": "registerValidator" }, + { "inputs": [], "stateMutability": "nonpayable", "type": "function", "name": "renounceOwnership" }, + { "inputs": [], "stateMutability": "nonpayable", "type": "function", "name": "resignValidator" }, { "inputs": [], "stateMutability": "view", "type": "function", "name": "resignedValidatorsCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }] }, { "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "roundValidatorsCount", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }] + }, + { + "inputs": [{ "internalType": "uint128", "name": "registrationFee", "type": "uint128" }], "stateMutability": "nonpayable", "type": "function", - "name": "unvote" + "name": "setFee" }, + { + "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], + "stateMutability": "nonpayable", + "type": "function", + "name": "transferOwnership" + }, + { "inputs": [], "stateMutability": "nonpayable", "type": "function", "name": "unvote" }, { "inputs": [ - { - "internalType": "struct Validator", - "name": "_validator", - "type": "tuple", - "components": [ - { - "internalType": "address", - "name": "addr", - "type": "address" - }, - { - "internalType": "struct ValidatorData", - "name": "data", - "type": "tuple", - "components": [ - { - "internalType": "uint256", - "name": "votersCount", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "voteBalance", - "type": "uint256" - }, - { - "internalType": "bool", - "name": "isResigned", - "type": "bool" - }, - { - "internalType": "bytes", - "name": "bls12_381_public_key", - "type": "bytes" - } - ] - } - ] - } + { "internalType": "bytes", "name": "blsPublicKey", "type": "bytes" }, + { "internalType": "bytes", "name": "proofOfPossession", "type": "bytes" } ], "stateMutability": "nonpayable", "type": "function", "name": "updateValidator" }, { - "inputs": [ - { - "internalType": "address[]", - "name": "voters", - "type": "address[]" - } - ], + "inputs": [{ "internalType": "address[]", "name": "voters", "type": "address[]" }], "stateMutability": "nonpayable", "type": "function", "name": "updateVoters" }, { "inputs": [ - { - "internalType": "address", - "name": "addr", - "type": "address" - } + { "internalType": "address", "name": "newImplementation", "type": "address" }, + { "internalType": "bytes", "name": "data", "type": "bytes" } ], + "stateMutability": "payable", + "type": "function", + "name": "upgradeToAndCall" + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "validatorsCount", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }] + }, + { + "inputs": [], + "stateMutability": "pure", + "type": "function", + "name": "version", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }] + }, + { + "inputs": [{ "internalType": "address", "name": "addr", "type": "address" }], "stateMutability": "nonpayable", "type": "function", "name": "vote" } ], - "devdoc": { "kind": "dev", "methods": {}, "version": 1 }, + "devdoc": { + "kind": "dev", + "methods": { + "owner()": { "details": "Returns the address of the current owner." }, + "proxiableUUID()": { + "details": "Implementation of the ERC-1822 {proxiableUUID} function. This returns the storage slot used by the implementation. It is used to validate the implementation's compatibility when performing an upgrade. IMPORTANT: A proxy pointing at a proxiable contract should not be considered proxiable itself, because this risks bricking a proxy that upgrades to it, by delegating to itself until out of gas. Thus it is critical that this function revert if invoked through a proxy. This is guaranteed by the `notDelegated` modifier." + }, + "renounceOwnership()": { + "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby disabling any functionality that is only available to the owner." + }, + "transferOwnership(address)": { + "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner." + }, + "upgradeToAndCall(address,bytes)": { + "custom:oz-upgrades-unsafe-allow-reachable": "delegatecall", + "details": "Upgrade the implementation of the proxy to `newImplementation`, and subsequently execute the function call encoded in `data`. Calls {_authorizeUpgrade}. Emits an {Upgraded} event." + } + }, + "version": 1 + }, "userdoc": { "kind": "user", "methods": {}, "version": 1 } }, "settings": { - "remappings": ["@contracts/=src/", "@forge-std/=forge-std/src/"], + "remappings": [ + "@contracts/=src/", + "@forge-std/=lib/forge-std/src/", + "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", + "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/", + "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", + "forge-std/=lib/forge-std/src/", + "halmos-cheatcodes/=lib/openzeppelin-contracts-upgradeable/lib/halmos-cheatcodes/src/", + "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", + "openzeppelin-contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/", + "openzeppelin-foundry-upgrades/=lib/openzeppelin-foundry-upgrades/src/" + ], "optimizer": { "enabled": true, "runs": 200 }, "metadata": { "bytecodeHash": "ipfs" }, - "compilationTarget": { "src/consensus/Consensus.sol": "Consensus" }, + "compilationTarget": { "src/consensus/ConsensusV1.sol": "ConsensusV1" }, "evmVersion": "shanghai", "libraries": {} }, "sources": { - "src/consensus/Consensus.sol": { - "keccak256": "0x5b736870bfb3308f6f109276d30415ab555c65a1c1165afbe50c56220ed9d129", + "lib/openzeppelin-contracts-upgradeable/contracts/access/OwnableUpgradeable.sol": { + "keccak256": "0xc163fcf9bb10138631a9ba5564df1fa25db9adff73bd9ee868a8ae1858fe093a", + "urls": [ + "bzz-raw://9706d43a0124053d9880f6e31a59f31bc0a6a3dc1acd66ce0a16e1111658c5f6", + "dweb:/ipfs/QmUFmfowzkRwGtDu36cXV9SPTBHJ3n7dG9xQiK5B28jTf2" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/Initializable.sol": { + "keccak256": "0xdb4d24ee2c087c391d587cd17adfe5b3f9d93b3110b1388c2ab6c7c0ad1dcd05", + "urls": [ + "bzz-raw://ab7b6d5b9e2b88176312967fe0f0e78f3d9a1422fa5e4b64e2440c35869b5d08", + "dweb:/ipfs/QmXKYWWyzcLg1B2k7Sb1qkEXgLCYfXecR9wYW5obRzWP1Q" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol": { + "keccak256": "0x574a7451e42724f7de29e2855c392a8a5020acd695169466a18459467d719d63", + "urls": [ + "bzz-raw://5bc189f63b639ee173dd7b6fecc39baf7113bf161776aea22b34c57fdd1872ec", + "dweb:/ipfs/QmZAf2VtjDLRULqjJkde6LNsxAg12tUqpPqgUQQZbAjgtZ" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts-upgradeable/contracts/utils/ContextUpgradeable.sol": { + "keccak256": "0xdbef5f0c787055227243a7318ef74c8a5a1108ca3a07f2b3a00ef67769e1e397", + "urls": [ + "bzz-raw://08e39f23d5b4692f9a40803e53a8156b72b4c1f9902a88cd65ba964db103dab9", + "dweb:/ipfs/QmPKn6EYDgpga7KtpkA8wV2yJCYGMtc9K4LkJfhKX2RVSV" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/IERC1967.sol": { + "keccak256": "0xb25a4f11fa80c702bf5cd85adec90e6f6f507f32f4a8e6f5dbc31e8c10029486", + "urls": [ + "bzz-raw://6917f8a323e7811f041aecd4d9fd6e92455a6fba38a797ac6f6e208c7912b79d", + "dweb:/ipfs/QmShuYv55wYHGi4EFkDB8QfF7ZCHoKk2efyz3AWY1ExSq7" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/interfaces/draft-IERC1822.sol": { + "keccak256": "0xc42facb5094f2f35f066a7155bda23545e39a3156faef3ddc00185544443ba7d", + "urls": [ + "bzz-raw://d3b36282ab029b46bd082619a308a2ea11c309967b9425b7b7a6eb0b0c1c3196", + "dweb:/ipfs/QmP2YVfDB2FoREax3vJu7QhDnyYRMw52WPrCD4vdT2kuDA" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/ERC1967/ERC1967Utils.sol": { + "keccak256": "0x8decfa54cec979c824b044b8128cd91d713f72c71fd7dfa54974624d8c949898", + "urls": [ + "bzz-raw://271f914261a19d87117a777e0924ada545c16191ef9b00cc40b0134fc14ebc70", + "dweb:/ipfs/QmdvVNWHGHQrGGPonZJs5NuzTevTjZRM2zayKrDJf7WBA2" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/proxy/beacon/IBeacon.sol": { + "keccak256": "0xc59a78b07b44b2cf2e8ab4175fca91e8eca1eee2df7357b8d2a8833e5ea1f64c", + "urls": [ + "bzz-raw://5aa4f07e65444784c29cd7bfcc2341b34381e4e5b5da9f0c5bd00d7f430e66fa", + "dweb:/ipfs/QmWRMh4Q9DpaU9GvsiXmDdoNYMyyece9if7hnfLz7uqzWM" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Address.sol": { + "keccak256": "0x06871a0948d0fed9316ae59ee4368527e144911f5e284755312b5bfcde8b27ea", + "urls": [ + "bzz-raw://3c30e46d061d8a450c561935a1236b1885aa76ffab93a19b26dcb8868c839843", + "dweb:/ipfs/QmZbWbeDyixTyYkVtJvuiQYfkQz12pS7zxWZF3Ju9PYwGH" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/Errors.sol": { + "keccak256": "0x6afa713bfd42cf0f7656efa91201007ac465e42049d7de1d50753a373648c123", + "urls": [ + "bzz-raw://ba1d02f4847670a1b83dec9f7d37f0b0418d6043447b69f3a29a5f9efc547fcf", + "dweb:/ipfs/QmQ7iH2keLNUKgq2xSWcRmuBE5eZ3F5whYAkAGzCNNoEWB" + ], + "license": "MIT" + }, + "lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/utils/StorageSlot.sol": { + "keccak256": "0xcf74f855663ce2ae00ed8352666b7935f6cddea2932fdf2c3ecd30a9b1cd0e97", + "urls": [ + "bzz-raw://9f660b1f351b757dfe01438e59888f31f33ded3afcf5cb5b0d9bf9aa6f320a8b", + "dweb:/ipfs/QmarDJ5hZEgBtCmmrVzEZWjub9769eD686jmzb2XpSU1cM" + ], + "license": "MIT" + }, + "src/consensus/BLSPoP.sol": { + "keccak256": "0x19842d7113033964e1f51c97458aa44cb5efc41618b67fc7f949f48824cfd3ee", + "urls": [ + "bzz-raw://a6d8f6d87bef7eff7b1e475d1f82ed401c20e5f83a9cdd8724dd27fc67a1ef26", + "dweb:/ipfs/QmbyRGmCF1vi5NwZmN9p4T55XVs2kdoRJx8ZiBFU4evRYe" + ], + "license": "GNU GENERAL PUBLIC LICENSE" + }, + "src/consensus/ConsensusV1.sol": { + "keccak256": "0x32c0841d05f559c4dbbaf2478891e7e1979e6d6f4b541cde9ada1e3b3747eac9", "urls": [ - "bzz-raw://0d9655228a0caa1a1802d479cc6bd490d8d0f36061f285e855d23e32e55f311c", - "dweb:/ipfs/QmUfv3d2My7CuFjq7PM6jmxLoXWLrErfGkCT8s1tNKvcCZ" + "bzz-raw://35a52180a27c0818efa6cc80445db16c9d655a0004bfb1db599c0dc5d0588ee4", + "dweb:/ipfs/Qmd4cjwm4CWNJFihLM4sbNqSEPALoXXfsdDS3MhDzcvvGR" ], - "license": null + "license": "GNU GENERAL PUBLIC LICENSE" } }, "version": 1 }, - "id": 23 -} + "id": 34 +} \ No newline at end of file diff --git a/crypto/utils/abi_decoder.py b/crypto/utils/abi_decoder.py index 434c5c2..9c2b2a1 100644 --- a/crypto/utils/abi_decoder.py +++ b/crypto/utils/abi_decoder.py @@ -109,7 +109,7 @@ def decode_number(bytes_data, offset, signed): @classmethod def decode_string(cls, bytes_data, offset): data_offset = cls.read_uint(bytes_data, offset) - string_offset = offset + data_offset + string_offset = data_offset length = cls.read_uint(bytes_data, string_offset) string_data = bytes_data[string_offset+32:string_offset+32+length] value = string_data.decode('utf-8') @@ -118,7 +118,7 @@ def decode_string(cls, bytes_data, offset): def decode_dynamic_bytes(self, bytes_data, offset): data_offset = self.read_uint(bytes_data, offset) - bytes_offset = offset + data_offset + bytes_offset = data_offset length = self.read_uint(bytes_data, bytes_offset) bytes_data_value = bytes_data[bytes_offset+32:bytes_offset+32+length] value = '0x' + bytes_data_value.hex() diff --git a/crypto/utils/transaction_data_encoder.py b/crypto/utils/transaction_data_encoder.py index 1a99f5a..87433de 100644 --- a/crypto/utils/transaction_data_encoder.py +++ b/crypto/utils/transaction_data_encoder.py @@ -1,5 +1,6 @@ from crypto.enums.abi_function import AbiFunction from crypto.enums.contract_abi_type import ContractAbiType +from crypto.identity.proof_of_possession import ProofOfPossession from crypto.utils.abi_encoder import AbiEncoder @@ -11,12 +12,10 @@ def multi_payment(recipients, amounts): ) @staticmethod - def update_validator(validator_public_key): - key = validator_public_key - if not key.startswith('0x'): - key = '0x' + key + def update_validator(passphrase: str): + bls = ProofOfPossession.from_passphrase(passphrase) return AbiEncoder(ContractAbiType.CONSENSUS).encode_function_call_hex( - AbiFunction.UPDATE_VALIDATOR.value, [key] + AbiFunction.UPDATE_VALIDATOR.value, ['0x' + bls['pk'], '0x' + bls['pop']] ) @staticmethod @@ -32,12 +31,10 @@ def username_resignation(): ) @staticmethod - def validator_registration(validator_public_key): - key = validator_public_key - if not key.startswith('0x'): - key = '0x' + key + def validator_registration(passphrase: str): + bls = ProofOfPossession.from_passphrase(passphrase) return AbiEncoder(ContractAbiType.CONSENSUS).encode_function_call_hex( - AbiFunction.VALIDATOR_REGISTRATION.value, [key] + AbiFunction.VALIDATOR_REGISTRATION.value, ['0x' + bls['pk'], '0x' + bls['pop']] ) @staticmethod diff --git a/tests/fixtures/transactions/transaction-data-encoder.json b/tests/fixtures/transactions/transaction-data-encoder.json index 2cc9fcd..3e73e1f 100644 --- a/tests/fixtures/transactions/transaction-data-encoder.json +++ b/tests/fixtures/transactions/transaction-data-encoder.json @@ -1,13 +1,13 @@ { "Username": "test", "Address": "0xA5cc0BfEB09742C5e4C610f2EBaaB82Eb142Ca10", - "ValidatorPublicKey": "b209f4a7454ae17c5808991dffbf204c747b851f351d2ce72a6e18903d0e2f609e0328ebbc3fb97cd4d3660b4bc156f1", + "ValidatorPassphrase": "bless organ december boring ill obvious unaware dinosaur broccoli build hamster rebuild skin airport stay entry denial agent october thought duck trouble decorate way", "Amount": "1000000000000", "Encoded": { - "UpdateValidator": "0x5a8eed7300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030b209f4a7454ae17c5808991dffbf204c747b851f351d2ce72a6e18903d0e2f609e0328ebbc3fb97cd4d3660b4bc156f100000000000000000000000000000000", + "UpdateValidator": "0x8f062626000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030b0093ac8f37588e15df7cfb04d0722dc5486cec062233136d3b6a16d41946577a1f332c4c29c0601ccefac1905dbb611000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a8bb7c80d24ee79cf3f141eae774b7575466d68631834c29433036ac84eb4904b8f071167cccd5bcc9d11e7c187d6fc70b87ce6e046a750b07f6a8a5985e76bf005bb55b8c70c1cefaccd4c37c314ce69ddfd2eb4a21f8775e01da02e77590b3", "UsernameRegistration": "0x36a94134000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000047465737400000000000000000000000000000000000000000000000000000000", "UsernameResignation": "0xebed6dab", - "ValidatorRegistration": "0x602a9eee00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030b209f4a7454ae17c5808991dffbf204c747b851f351d2ce72a6e18903d0e2f609e0328ebbc3fb97cd4d3660b4bc156f100000000000000000000000000000000", + "ValidatorRegistration": "0x226f2645000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030b0093ac8f37588e15df7cfb04d0722dc5486cec062233136d3b6a16d41946577a1f332c4c29c0601ccefac1905dbb611000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a8bb7c80d24ee79cf3f141eae774b7575466d68631834c29433036ac84eb4904b8f071167cccd5bcc9d11e7c187d6fc70b87ce6e046a750b07f6a8a5985e76bf005bb55b8c70c1cefaccd4c37c314ce69ddfd2eb4a21f8775e01da02e77590b3", "ValidatorResignation": "0xb85f5da2", "TokenTransfer": "0xa9059cbb000000000000000000000000a5cc0bfeb09742c5e4c610f2ebaab82eb142ca10000000000000000000000000000000000000000000000000000000e8d4a51000", "MultiPayment": "0x084ce708000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000a5cc0bfeb09742c5e4c610f2ebaab82eb142ca10000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000003e8" diff --git a/tests/fixtures/transactions/validator-registration.json b/tests/fixtures/transactions/validator-registration.json index 8c41c4e..f47b3f2 100644 --- a/tests/fixtures/transactions/validator-registration.json +++ b/tests/fixtures/transactions/validator-registration.json @@ -1,18 +1,19 @@ { "data": { + "value": "250000000000000000000", + "senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d", + "gasPrice": 5000000000, + "gasLimit": 200000, "nonce": "1", - "gasPrice": "5000000000", - "gasLimit": "200000", + "data": "226f2645000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030b0093ac8f37588e15df7cfb04d0722dc5486cec062233136d3b6a16d41946577a1f332c4c29c0601ccefac1905dbb611000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a8bb7c80d24ee79cf3f141eae774b7575466d68631834c29433036ac84eb4904b8f071167cccd5bcc9d11e7c187d6fc70b87ce6e046a750b07f6a8a5985e76bf005bb55b8c70c1cefaccd4c37c314ce69ddfd2eb4a21f8775e01da02e77590b3", "to": "0x535B3D7A252fa034Ed71F0C53ec0C6F784cB64E1", - "value": "250000000000000000000", - "data": "602a9eee0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003030954f46d6097a1d314e900e66e11e0dad0a57cd03e04ec99f0dedd1c765dcb11e6d7fa02e22cf40f9ee23d9cc1c062400000000000000000000000000000000", - "network": 11812, + "validatorPublicKey": "0xb0093ac8f37588e15df7cfb04d0722dc5486cec062233136d3b6a16d41946577a1f332c4c29c0601ccefac1905dbb611", + "validatorProof": "0xa8bb7c80d24ee79cf3f141eae774b7575466d68631834c29433036ac84eb4904b8f071167cccd5bcc9d11e7c187d6fc70b87ce6e046a750b07f6a8a5985e76bf005bb55b8c70c1cefaccd4c37c314ce69ddfd2eb4a21f8775e01da02e77590b3", "v": 0, - "r": "c36e366f58d30e34099fdaf2104081bc75aaca456d042618df0e7fdfce48d9a6", - "s": "7cc525d7cfa88f83286396b483ef817a9e14cc240ce027ac9bee38c1fdc7e883", - "senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d", - "from": "0x1E6747BEAa5B4076a6A98D735DF8c35a70D18Bdd", - "hash": "09edf0fcf2af28ff4ad05e0dc831119f25dcdc3261d786b9fa953a227d560b2e" + "r": "d44a597b3b2b14f9770abcdabd73b3c12d0a5ad1a289ac71f8f7a54212cf035d", + "s": "7a111e447b0b28462b7973020f6b8fa9e3c0aac6f5dd71ec1e1d6eb342e153c0", + "hash": "879559d0f2deed36c3e03fc513ba7f0940f3e1370f3c4750453266efc9066941" }, - "serialized": "f8f50185012a05f20083030d4094535b3d7a252fa034ed71f0c53ec0c6f784cb64e1890d8d726b7177a80000b884602a9eee0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000003030954f46d6097a1d314e900e66e11e0dad0a57cd03e04ec99f0dedd1c765dcb11e6d7fa02e22cf40f9ee23d9cc1c062400000000000000000000000000000000825c6ba0c36e366f58d30e34099fdaf2104081bc75aaca456d042618df0e7fdfce48d9a6a07cc525d7cfa88f83286396b483ef817a9e14cc240ce027ac9bee38c1fdc7e883" + "serialized": "f901960185012a05f20083030d4094535b3d7a252fa034ed71f0c53ec0c6f784cb64e1890d8d726b7177a80000b90124226f2645000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030b0093ac8f37588e15df7cfb04d0722dc5486cec062233136d3b6a16d41946577a1f332c4c29c0601ccefac1905dbb611000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a8bb7c80d24ee79cf3f141eae774b7575466d68631834c29433036ac84eb4904b8f071167cccd5bcc9d11e7c187d6fc70b87ce6e046a750b07f6a8a5985e76bf005bb55b8c70c1cefaccd4c37c314ce69ddfd2eb4a21f8775e01da02e77590b3825c6ba0d44a597b3b2b14f9770abcdabd73b3c12d0a5ad1a289ac71f8f7a54212cf035da07a111e447b0b28462b7973020f6b8fa9e3c0aac6f5dd71ec1e1d6eb342e153c0", + "validatorPassphrase": "bless organ december boring ill obvious unaware dinosaur broccoli build hamster rebuild skin airport stay entry denial agent october thought duck trouble decorate way" } diff --git a/tests/fixtures/transactions/validator-update.json b/tests/fixtures/transactions/validator-update.json new file mode 100644 index 0000000..26db201 --- /dev/null +++ b/tests/fixtures/transactions/validator-update.json @@ -0,0 +1,19 @@ +{ + "data": { + "value": "0", + "senderPublicKey": "0243333347c8cbf4e3cbc7a96964181d02a2b0c854faa2fef86b4b8d92afcf473d", + "gasPrice": 5000000000, + "gasLimit": 200000, + "nonce": "1", + "data": "8f062626000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030b0093ac8f37588e15df7cfb04d0722dc5486cec062233136d3b6a16d41946577a1f332c4c29c0601ccefac1905dbb611000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a8bb7c80d24ee79cf3f141eae774b7575466d68631834c29433036ac84eb4904b8f071167cccd5bcc9d11e7c187d6fc70b87ce6e046a750b07f6a8a5985e76bf005bb55b8c70c1cefaccd4c37c314ce69ddfd2eb4a21f8775e01da02e77590b3", + "to": "0x535B3D7A252fa034Ed71F0C53ec0C6F784cB64E1", + "validatorPublicKey": "0xb0093ac8f37588e15df7cfb04d0722dc5486cec062233136d3b6a16d41946577a1f332c4c29c0601ccefac1905dbb611", + "validatorProof": "0xa8bb7c80d24ee79cf3f141eae774b7575466d68631834c29433036ac84eb4904b8f071167cccd5bcc9d11e7c187d6fc70b87ce6e046a750b07f6a8a5985e76bf005bb55b8c70c1cefaccd4c37c314ce69ddfd2eb4a21f8775e01da02e77590b3", + "v": 0, + "r": "583edde415ec3f61643b5e2a18c34c4113eb67434adfc4d3633a1469a6fe3895", + "s": "165b3ec00a56227ab3931865a3a63e5e5dbb79e4e42985abe394f8eb74acbc58", + "hash": "917fb0ebbdfdeb2785db0e3d67bb68bf655a6381a529f22676a7a16e07278e1c" + }, + "serialized": "f9018d0185012a05f20083030d4094535b3d7a252fa034ed71f0c53ec0c6f784cb64e180b901248f062626000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030b0093ac8f37588e15df7cfb04d0722dc5486cec062233136d3b6a16d41946577a1f332c4c29c0601ccefac1905dbb611000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a8bb7c80d24ee79cf3f141eae774b7575466d68631834c29433036ac84eb4904b8f071167cccd5bcc9d11e7c187d6fc70b87ce6e046a750b07f6a8a5985e76bf005bb55b8c70c1cefaccd4c37c314ce69ddfd2eb4a21f8775e01da02e77590b3825c6ba0583edde415ec3f61643b5e2a18c34c4113eb67434adfc4d3633a1469a6fe3895a0165b3ec00a56227ab3931865a3a63e5e5dbb79e4e42985abe394f8eb74acbc58", + "validatorPassphrase": "bless organ december boring ill obvious unaware dinosaur broccoli build hamster rebuild skin airport stay entry denial agent october thought duck trouble decorate way" +} diff --git a/tests/transactions/builder/conftest.py b/tests/transactions/builder/conftest.py index 4da1f36..7c840b3 100644 --- a/tests/transactions/builder/conftest.py +++ b/tests/transactions/builder/conftest.py @@ -18,6 +18,12 @@ def validator_public_key(): return '30954f46d6097a1d314e900e66e11e0dad0a57cd03e04ec99f0dedd1c765dcb11e6d7fa02e22cf40f9ee23d9cc1c0624' +@pytest.fixture +def validator_passphrase(): + """BIP39 mnemonic used for BLS validator key derivation""" + + return 'bless organ december boring ill obvious unaware dinosaur broccoli build hamster rebuild skin airport stay entry denial agent october thought duck trouble decorate way' + @pytest.fixture def username(): """Username used for tests""" diff --git a/tests/transactions/builder/test_validator_registration_builder.py b/tests/transactions/builder/test_validator_registration_builder.py index d4eaabc..3ab8964 100644 --- a/tests/transactions/builder/test_validator_registration_builder.py +++ b/tests/transactions/builder/test_validator_registration_builder.py @@ -1,6 +1,7 @@ from crypto.transactions.builder.validator_registration_builder import ValidatorRegistrationBuilder -def test_validator_registration_transaction(passphrase, validator_public_key, load_transaction_fixture): + +def test_validator_registration_transaction(passphrase, load_transaction_fixture): fixture = load_transaction_fixture('transactions/validator-registration') builder = ( @@ -10,26 +11,27 @@ def test_validator_registration_transaction(passphrase, validator_public_key, lo .gas_limit(fixture['data']['gasLimit']) .nonce(fixture['data']['nonce']) .value(fixture['data']['value']) - .validator_public_key(validator_public_key) + .validator_passphrase(fixture['validatorPassphrase']) .to(fixture['data']['to']) .sign(passphrase) ) - assert builder.transaction.serialize().hex() == fixture['serialized'] assert builder.transaction.data['gasPrice'] == int(fixture['data']['gasPrice']) assert builder.transaction.data['gasLimit'] == int(fixture['data']['gasLimit']) assert builder.transaction.data['nonce'] == fixture['data']['nonce'] assert builder.transaction.data['to'] == fixture['data']['to'] assert builder.transaction.data['value'] == int(fixture['data']['value']) + assert builder.transaction.data['validatorPublicKey'] == fixture['data']['validatorPublicKey'] + assert builder.transaction.data['validatorProof'] == fixture['data']['validatorProof'] assert builder.transaction.data['v'] == fixture['data']['v'] assert builder.transaction.data['r'] == fixture['data']['r'] assert builder.transaction.data['s'] == fixture['data']['s'] - - assert builder.transaction.serialize().hex() == fixture['serialized'] assert builder.transaction.data['hash'] == fixture['data']['hash'] + assert builder.transaction.serialize().hex() == fixture['serialized'] assert builder.verify() -def test_validator_registration_transaction_with_default_to(passphrase, validator_public_key, load_transaction_fixture): + +def test_validator_registration_transaction_with_default_to(passphrase, load_transaction_fixture): fixture = load_transaction_fixture('transactions/validator-registration') builder = ( @@ -39,7 +41,7 @@ def test_validator_registration_transaction_with_default_to(passphrase, validato .gas_limit(fixture['data']['gasLimit']) .nonce(fixture['data']['nonce']) .value(fixture['data']['value']) - .validator_public_key(validator_public_key) + .validator_passphrase(fixture['validatorPassphrase']) .sign(passphrase) ) @@ -48,10 +50,11 @@ def test_validator_registration_transaction_with_default_to(passphrase, validato assert builder.transaction.data['nonce'] == fixture['data']['nonce'] assert builder.transaction.data['to'].lower() == fixture['data']['to'].lower() assert builder.transaction.data['value'] == int(fixture['data']['value']) + assert builder.transaction.data['validatorPublicKey'] == fixture['data']['validatorPublicKey'] + assert builder.transaction.data['validatorProof'] == fixture['data']['validatorProof'] assert builder.transaction.data['v'] == fixture['data']['v'] assert builder.transaction.data['r'] == fixture['data']['r'] assert builder.transaction.data['s'] == fixture['data']['s'] - - assert builder.transaction.serialize().hex() == fixture['serialized'] assert builder.transaction.data['hash'] == fixture['data']['hash'] + assert builder.transaction.serialize().hex() == fixture['serialized'] assert builder.verify() diff --git a/tests/transactions/builder/test_validator_update_builder.py b/tests/transactions/builder/test_validator_update_builder.py new file mode 100644 index 0000000..f377f72 --- /dev/null +++ b/tests/transactions/builder/test_validator_update_builder.py @@ -0,0 +1,58 @@ +from crypto.transactions.builder.validator_update_builder import ValidatorUpdateBuilder + + +def test_validator_update_transaction(passphrase, load_transaction_fixture): + fixture = load_transaction_fixture('transactions/validator-update') + + builder = ( + ValidatorUpdateBuilder + .new() + .gas_price(fixture['data']['gasPrice']) + .gas_limit(fixture['data']['gasLimit']) + .nonce(fixture['data']['nonce']) + .validator_passphrase(fixture['validatorPassphrase']) + .to(fixture['data']['to']) + .sign(passphrase) + ) + + assert builder.transaction.data['gasPrice'] == int(fixture['data']['gasPrice']) + assert builder.transaction.data['gasLimit'] == int(fixture['data']['gasLimit']) + assert builder.transaction.data['nonce'] == fixture['data']['nonce'] + assert builder.transaction.data['to'] == fixture['data']['to'] + assert builder.transaction.data['value'] == int(fixture['data']['value']) + assert builder.transaction.data['validatorPublicKey'] == fixture['data']['validatorPublicKey'] + assert builder.transaction.data['validatorProof'] == fixture['data']['validatorProof'] + assert builder.transaction.data['v'] == fixture['data']['v'] + assert builder.transaction.data['r'] == fixture['data']['r'] + assert builder.transaction.data['s'] == fixture['data']['s'] + assert builder.transaction.data['hash'] == fixture['data']['hash'] + assert builder.transaction.serialize().hex() == fixture['serialized'] + assert builder.verify() + + +def test_validator_update_transaction_with_default_to(passphrase, load_transaction_fixture): + fixture = load_transaction_fixture('transactions/validator-update') + + builder = ( + ValidatorUpdateBuilder + .new() + .gas_price(fixture['data']['gasPrice']) + .gas_limit(fixture['data']['gasLimit']) + .nonce(fixture['data']['nonce']) + .validator_passphrase(fixture['validatorPassphrase']) + .sign(passphrase) + ) + + assert builder.transaction.data['gasPrice'] == int(fixture['data']['gasPrice']) + assert builder.transaction.data['gasLimit'] == int(fixture['data']['gasLimit']) + assert builder.transaction.data['nonce'] == fixture['data']['nonce'] + assert builder.transaction.data['to'].lower() == fixture['data']['to'].lower() + assert builder.transaction.data['value'] == int(fixture['data']['value']) + assert builder.transaction.data['validatorPublicKey'] == fixture['data']['validatorPublicKey'] + assert builder.transaction.data['validatorProof'] == fixture['data']['validatorProof'] + assert builder.transaction.data['v'] == fixture['data']['v'] + assert builder.transaction.data['r'] == fixture['data']['r'] + assert builder.transaction.data['s'] == fixture['data']['s'] + assert builder.transaction.data['hash'] == fixture['data']['hash'] + assert builder.transaction.serialize().hex() == fixture['serialized'] + assert builder.verify() diff --git a/tests/utils/test_transaction_data_encoder.py b/tests/utils/test_transaction_data_encoder.py index 90ae662..fd5f63a 100644 --- a/tests/utils/test_transaction_data_encoder.py +++ b/tests/utils/test_transaction_data_encoder.py @@ -24,11 +24,19 @@ def test_encode_username_resignation(load_transaction_fixture): def test_encode_validator_registration(load_transaction_fixture): fixture = load_transaction_fixture('transactions/transaction-data-encoder') encoded = TransactionDataEncoder.validator_registration( - fixture['ValidatorPublicKey'] + fixture['ValidatorPassphrase'] ) assert encoded == fixture['Encoded']['ValidatorRegistration'] +def test_encode_update_validator(load_transaction_fixture): + fixture = load_transaction_fixture('transactions/transaction-data-encoder') + encoded = TransactionDataEncoder.update_validator( + fixture['ValidatorPassphrase'] + ) + assert encoded == fixture['Encoded']['UpdateValidator'] + + def test_encode_validator_resignation(load_transaction_fixture): fixture = load_transaction_fixture('transactions/transaction-data-encoder') encoded = TransactionDataEncoder.validator_resignation()