diff --git a/src/main/java/org/arkecosystem/crypto/transactions/Deserializer.java b/src/main/java/org/arkecosystem/crypto/transactions/Deserializer.java index fd7d338..63aadbb 100644 --- a/src/main/java/org/arkecosystem/crypto/transactions/Deserializer.java +++ b/src/main/java/org/arkecosystem/crypto/transactions/Deserializer.java @@ -104,6 +104,8 @@ private AbstractTransaction guessTransactionFromTransactionData( return new Unvote(transactionData.toHashMap()); } else if (TransactionTypeIdentifier.isValidatorRegistration(payload)) { return new ValidatorRegistration(transactionData.toHashMap()); + } else if (TransactionTypeIdentifier.isUpdateValidator(payload)) { + return new ValidatorUpdate(transactionData.toHashMap()); } else if (TransactionTypeIdentifier.isValidatorResignation(payload)) { return new ValidatorResignation(transactionData.toHashMap()); } else if (TransactionTypeIdentifier.isUsernameRegistration(payload)) { diff --git a/src/main/java/org/arkecosystem/crypto/transactions/builder/ValidatorRegistrationBuilder.java b/src/main/java/org/arkecosystem/crypto/transactions/builder/ValidatorRegistrationBuilder.java index 0d1eafc..62a01a6 100644 --- a/src/main/java/org/arkecosystem/crypto/transactions/builder/ValidatorRegistrationBuilder.java +++ b/src/main/java/org/arkecosystem/crypto/transactions/builder/ValidatorRegistrationBuilder.java @@ -1,17 +1,17 @@ package org.arkecosystem.crypto.transactions.builder; -import org.arkecosystem.crypto.identities.BlsPublicKey; +import org.arkecosystem.crypto.encoding.Hex; import org.arkecosystem.crypto.transactions.types.AbstractTransaction; import org.arkecosystem.crypto.transactions.types.ValidatorRegistration; +import org.arkecosystem.crypto.utils.ProofOfPossession; public class ValidatorRegistrationBuilder extends AbstractTransactionBuilder { - public ValidatorRegistrationBuilder validatorPublicKey(String validatorPublicKey) { - if (!BlsPublicKey.validate(validatorPublicKey)) { - throw new IllegalArgumentException("Invalid BLS public key"); - } - this.transaction.validatorPublicKey = validatorPublicKey; + public ValidatorRegistrationBuilder validatorPassphrase(String passphrase) { + ProofOfPossession.Result pop = ProofOfPossession.fromMnemonic(passphrase); + this.transaction.validatorPublicKey = Hex.encode(pop.pk); + this.transaction.validatorProof = Hex.encode(pop.pop); this.transaction.refreshPayloadData(); diff --git a/src/main/java/org/arkecosystem/crypto/transactions/builder/ValidatorUpdateBuilder.java b/src/main/java/org/arkecosystem/crypto/transactions/builder/ValidatorUpdateBuilder.java new file mode 100644 index 0000000..3095d2e --- /dev/null +++ b/src/main/java/org/arkecosystem/crypto/transactions/builder/ValidatorUpdateBuilder.java @@ -0,0 +1,30 @@ +package org.arkecosystem.crypto.transactions.builder; + +import org.arkecosystem.crypto.encoding.Hex; +import org.arkecosystem.crypto.transactions.types.AbstractTransaction; +import org.arkecosystem.crypto.transactions.types.ValidatorUpdate; +import org.arkecosystem.crypto.utils.ProofOfPossession; + +public class ValidatorUpdateBuilder extends AbstractTransactionBuilder { + + public ValidatorUpdateBuilder validatorPassphrase(String passphrase) { + ProofOfPossession.Result pop = ProofOfPossession.fromMnemonic(passphrase); + this.transaction.validatorPublicKey = Hex.encode(pop.pk); + this.transaction.validatorProof = Hex.encode(pop.pop); + + this.transaction.refreshPayloadData(); + + return this.instance(); + } + + @Override + protected AbstractTransaction getTransactionInstance() { + return new ValidatorUpdate(); + } + + @Override + protected ValidatorUpdateBuilder instance() { + return this; + } + +} diff --git a/src/main/java/org/arkecosystem/crypto/transactions/types/AbstractTransaction.java b/src/main/java/org/arkecosystem/crypto/transactions/types/AbstractTransaction.java index b1c2594..9db4387 100644 --- a/src/main/java/org/arkecosystem/crypto/transactions/types/AbstractTransaction.java +++ b/src/main/java/org/arkecosystem/crypto/transactions/types/AbstractTransaction.java @@ -28,6 +28,7 @@ public abstract class AbstractTransaction { public long gasLimit; public long gasPrice; public String validatorPublicKey; + public String validatorProof; public String vote; public List multipaymentRecipients; public List multipaymentAmounts; @@ -75,6 +76,9 @@ public AbstractTransaction(Map data) { if (data.containsKey("validatorPublicKey")) { this.validatorPublicKey = (String) data.get("validatorPublicKey"); } + if (data.containsKey("validatorProof")) { + this.validatorProof = (String) data.get("validatorProof"); + } if (data.containsKey("vote")) { this.vote = (String) data.get("vote"); } diff --git a/src/main/java/org/arkecosystem/crypto/transactions/types/ValidatorRegistration.java b/src/main/java/org/arkecosystem/crypto/transactions/types/ValidatorRegistration.java index 0b014f5..8c6145c 100644 --- a/src/main/java/org/arkecosystem/crypto/transactions/types/ValidatorRegistration.java +++ b/src/main/java/org/arkecosystem/crypto/transactions/types/ValidatorRegistration.java @@ -8,29 +8,31 @@ public class ValidatorRegistration extends AbstractTransaction { public ValidatorRegistration() { - super(); // Call the default constructor of AbstractTransaction + super(); } public ValidatorRegistration(Map data) { super(data); - // Use a local decodePayload method since we can't rely on AbstractTransaction's data field List payload = decodePayload(data); - if (payload != null && !payload.isEmpty()) { - Object arg = payload.get(0); - this.validatorPublicKey = arg.toString().replaceFirst("^0x", ""); + if (payload != null && payload.size() >= 2) { + this.validatorPublicKey = payload.get(0).toString().replaceFirst("^0x", ""); + this.validatorProof = payload.get(1).toString().replaceFirst("^0x", ""); } } @Override public String getPayload() { - if (this.validatorPublicKey == null || this.validatorPublicKey.isEmpty()) { + if (this.validatorPublicKey == null + || this.validatorPublicKey.isEmpty() + || this.validatorProof == null + || this.validatorProof.isEmpty()) { return ""; } - String validatorPublicKeyHex = "0x" + this.validatorPublicKey; List args = new ArrayList<>(); - args.add(validatorPublicKeyHex); + args.add("0x" + this.validatorPublicKey); + args.add("0x" + this.validatorProof); try { return new AbiEncoder() diff --git a/src/main/java/org/arkecosystem/crypto/transactions/types/ValidatorUpdate.java b/src/main/java/org/arkecosystem/crypto/transactions/types/ValidatorUpdate.java new file mode 100644 index 0000000..e523973 --- /dev/null +++ b/src/main/java/org/arkecosystem/crypto/transactions/types/ValidatorUpdate.java @@ -0,0 +1,44 @@ +package org.arkecosystem.crypto.transactions.types; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import org.arkecosystem.crypto.enums.AbiFunction; +import org.arkecosystem.crypto.utils.AbiEncoder; + +public class ValidatorUpdate extends AbstractTransaction { + public ValidatorUpdate() { + super(); + } + + public ValidatorUpdate(Map data) { + super(data); + + List payload = decodePayload(data); + if (payload != null && payload.size() >= 2) { + this.validatorPublicKey = payload.get(0).toString().replaceFirst("^0x", ""); + this.validatorProof = payload.get(1).toString().replaceFirst("^0x", ""); + } + } + + @Override + public String getPayload() { + if (this.validatorPublicKey == null + || this.validatorPublicKey.isEmpty() + || this.validatorProof == null + || this.validatorProof.isEmpty()) { + return ""; + } + + List args = new ArrayList<>(); + args.add("0x" + this.validatorPublicKey); + args.add("0x" + this.validatorProof); + + try { + return new AbiEncoder() + .encodeFunctionCall(AbiFunction.UPDATE_VALIDATOR.toString(), args); + } catch (Exception e) { + throw new RuntimeException("Error encoding function call", e); + } + } +} diff --git a/src/main/java/org/arkecosystem/crypto/utils/AbiDecoder.java b/src/main/java/org/arkecosystem/crypto/utils/AbiDecoder.java index 880b913..a50a21e 100644 --- a/src/main/java/org/arkecosystem/crypto/utils/AbiDecoder.java +++ b/src/main/java/org/arkecosystem/crypto/utils/AbiDecoder.java @@ -174,10 +174,8 @@ public static Object[] decodeNumber(byte[] bytes, int offset, int bits, boolean public static Object[] decodeString(byte[] bytes, int offset) { int dataOffset = readUInt(bytes, offset).intValue(); - int stringOffset = offset + dataOffset; - int length = readUInt(bytes, stringOffset).intValue(); - byte[] stringData = - Arrays.copyOfRange(bytes, stringOffset + 32, stringOffset + 32 + length); + int length = readUInt(bytes, dataOffset).intValue(); + byte[] stringData = Arrays.copyOfRange(bytes, dataOffset + 32, dataOffset + 32 + length); String value = new String(stringData); return new Object[] {value, 32}; @@ -185,9 +183,8 @@ public static Object[] decodeString(byte[] bytes, int offset) { public static Object[] decodeDynamicBytes(byte[] bytes, int offset) { int dataOffset = readUInt(bytes, offset).intValue(); - int bytesOffset = offset + dataOffset; - int length = readUInt(bytes, bytesOffset).intValue(); - byte[] bytesData = Arrays.copyOfRange(bytes, bytesOffset + 32, bytesOffset + 32 + length); + int length = readUInt(bytes, dataOffset).intValue(); + byte[] bytesData = Arrays.copyOfRange(bytes, dataOffset + 32, dataOffset + 32 + length); String value = "0x" + Numeric.toHexStringNoPrefix(bytesData); return new Object[] {value, 32}; diff --git a/src/main/java/org/arkecosystem/crypto/utils/ProofOfPossession.java b/src/main/java/org/arkecosystem/crypto/utils/ProofOfPossession.java new file mode 100644 index 0000000..482c5e1 --- /dev/null +++ b/src/main/java/org/arkecosystem/crypto/utils/ProofOfPossession.java @@ -0,0 +1,67 @@ +package org.arkecosystem.crypto.utils; + +import java.nio.charset.StandardCharsets; +import java.text.Normalizer; +import org.arkecosystem.crypto.encoding.Hex; +import org.bouncycastle.crypto.digests.SHA512Digest; +import org.bouncycastle.crypto.generators.PKCS5S2ParametersGenerator; +import org.bouncycastle.crypto.params.KeyParameter; +import supranational.blst.P1; +import supranational.blst.P2; +import supranational.blst.SecretKey; + +public class ProofOfPossession { + + private static final String POP_DST = "BLS_POP_BLS12381G2_XMD:SHA-256_SSWU_RO_POP_"; + + public static final class Result { + public final byte[] pk; + public final byte[] pop; + + Result(byte[] pk, byte[] pop) { + this.pk = pk; + this.pop = pop; + } + } + + public static byte[] deriveBlsPrivateKey(String passphrase) { + return deriveChildSk(passphrase).to_bendian(); + } + + public static String deriveBlsPublicKey(String passphrase) { + return Hex.encode(new P1(deriveChildSk(passphrase)).compress()); + } + + public static Result buildProofOfPossession(byte[] secretKeyBytes) { + SecretKey sk = new SecretKey(); + sk.from_bendian(secretKeyBytes); + byte[] pk = new P1(sk).compress(); + P2 sig = new P2().hash_to(pk, POP_DST).sign_with(sk); + return new Result(pk, sig.compress()); + } + + public static Result fromMnemonic(String passphrase) { + return buildProofOfPossession(deriveBlsPrivateKey(passphrase)); + } + + private static SecretKey deriveChildSk(String passphrase) { + byte[] seed = passphraseToSeed(passphrase); + SecretKey master = new SecretKey(); + master.derive_master_eip2333(seed); + SecretKey child = new SecretKey(); + child.derive_child_eip2333(master, 0L); + return child; + } + + private static byte[] passphraseToSeed(String passphrase) { + byte[] pass = + Normalizer.normalize(passphrase, Normalizer.Form.NFKD) + .getBytes(StandardCharsets.UTF_8); + byte[] salt = "mnemonic".getBytes(StandardCharsets.UTF_8); + PKCS5S2ParametersGenerator gen = new PKCS5S2ParametersGenerator(new SHA512Digest()); + gen.init(pass, salt, 2048); + return ((KeyParameter) gen.generateDerivedParameters(512)).getKey(); + } + + +} diff --git a/src/main/java/org/arkecosystem/crypto/utils/TransactionEncoder.java b/src/main/java/org/arkecosystem/crypto/utils/TransactionEncoder.java index 1a00804..4cf30ad 100644 --- a/src/main/java/org/arkecosystem/crypto/utils/TransactionEncoder.java +++ b/src/main/java/org/arkecosystem/crypto/utils/TransactionEncoder.java @@ -4,8 +4,10 @@ import java.util.Arrays; import java.util.Collections; import java.util.List; +import org.arkecosystem.crypto.encoding.Hex; import org.arkecosystem.crypto.enums.AbiFunction; import org.arkecosystem.crypto.enums.ContractAbiType; +import org.arkecosystem.crypto.utils.ProofOfPossession; public final class TransactionEncoder { @@ -39,11 +41,12 @@ public static String usernameResignation() { Collections.emptyList()); } - public static String validatorRegistration(String validatorPublicKey) { + public static String validatorRegistration(String passphrase) { + ProofOfPossession.Result pop = ProofOfPossession.fromMnemonic(passphrase); return encode( ContractAbiType.CONSENSUS, AbiFunction.VALIDATOR_REGISTRATION, - Collections.singletonList(addHexPrefix(validatorPublicKey))); + Arrays.asList(addHexPrefix(Hex.encode(pop.pk)), addHexPrefix(Hex.encode(pop.pop)))); } public static String validatorResignation() { @@ -53,11 +56,12 @@ public static String validatorResignation() { Collections.emptyList()); } - public static String updateValidator(String validatorPublicKey) { + public static String validatorUpdate(String passphrase) { + ProofOfPossession.Result pop = ProofOfPossession.fromMnemonic(passphrase); return encode( ContractAbiType.CONSENSUS, AbiFunction.UPDATE_VALIDATOR, - Collections.singletonList(addHexPrefix(validatorPublicKey))); + Arrays.asList(addHexPrefix(Hex.encode(pop.pk)), addHexPrefix(Hex.encode(pop.pop)))); } public static String vote(String voteAddress) { diff --git a/src/main/java/org/arkecosystem/crypto/utils/TransactionTypeIdentifier.java b/src/main/java/org/arkecosystem/crypto/utils/TransactionTypeIdentifier.java index a3ea069..4e3f9db 100644 --- a/src/main/java/org/arkecosystem/crypto/utils/TransactionTypeIdentifier.java +++ b/src/main/java/org/arkecosystem/crypto/utils/TransactionTypeIdentifier.java @@ -76,11 +76,11 @@ private static synchronized Map signatures() { map.put("multiPayment", multipaymentMethods.get("pay(address[],uint256[])")); map.put("registerUsername", usernamesMethods.get("registerUsername(string)")); map.put("resignUsername", usernamesMethods.get("resignUsername()")); - map.put("registerValidator", consensusMethods.get("registerValidator(bytes)")); + map.put("registerValidator", consensusMethods.get("registerValidator(bytes,bytes)")); map.put("resignValidator", consensusMethods.get("resignValidator()")); map.put("vote", consensusMethods.get("vote(address)")); map.put("unvote", consensusMethods.get("unvote()")); - map.put("updateValidator", consensusMethods.get("updateValidator(bytes)")); + map.put("updateValidator", consensusMethods.get("updateValidator(bytes,bytes)")); map.put("transfer", "transfer"); signatures = map; diff --git a/src/main/resources/Abi.Consensus.json b/src/main/resources/Abi.Consensus.json index 71a7eaf..508ee68 100644 --- a/src/main/resources/Abi.Consensus.json +++ b/src/main/resources/Abi.Consensus.json @@ -1,1643 +1,1074 @@ { - "abi": [ - { - "type": "function", - "name": "UPGRADE_INTERFACE_VERSION", - "inputs": [], - "outputs": [{ "name": "", "type": "string", "internalType": "string" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "activeValidatorsCount", - "inputs": [], - "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], - "stateMutability": "view" - }, - { - "type": "function", - "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": "addVote", - "inputs": [ - { - "name": "voter", - "type": "address", - "internalType": "address" - }, - { - "name": "validator", - "type": "address", - "internalType": "address" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "calculateActiveValidators", - "inputs": [{ "name": "n", "type": "uint8", "internalType": "uint8" }], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "getActiveValidators", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "tuple[]", - "internalType": "struct ConsensusV1.Validator[]", - "components": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "tuple", - "internalType": "struct ConsensusV1.ValidatorData", - "components": [ - { - "name": "votersCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "voteBalance", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "isResigned", - "type": "bool", - "internalType": "bool" - }, - { - "name": "blsPublicKey", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getAllValidators", - "inputs": [], - "outputs": [ - { - "name": "", - "type": "tuple[]", - "internalType": "struct ConsensusV1.Validator[]", - "components": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "tuple", - "internalType": "struct ConsensusV1.ValidatorData", - "components": [ - { - "name": "votersCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "voteBalance", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "isResigned", - "type": "bool", - "internalType": "bool" - }, - { - "name": "blsPublicKey", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getRounds", - "inputs": [ - { - "name": "offset", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "count", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple[]", - "internalType": "struct ConsensusV1.Round[]", - "components": [ - { - "name": "round", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "validators", - "type": "tuple[]", - "internalType": "struct ConsensusV1.RoundValidator[]", - "components": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "voteBalance", - "type": "uint256", - "internalType": "uint256" - } - ] - } - ] - } - ], - "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" }], - "outputs": [ - { - "name": "", - "type": "tuple", - "internalType": "struct ConsensusV1.Validator", - "components": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "data", - "type": "tuple", - "internalType": "struct ConsensusV1.ValidatorData", - "components": [ - { - "name": "votersCount", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "voteBalance", - "type": "uint256", - "internalType": "uint256" - }, - { - "name": "isResigned", - "type": "bool", - "internalType": "bool" - }, - { - "name": "blsPublicKey", - "type": "bytes", - "internalType": "bytes" - } - ] - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getVotes", - "inputs": [ - { - "name": "addr", - "type": "address", - "internalType": "address" - }, - { - "name": "count", - "type": "uint256", - "internalType": "uint256" - } - ], - "outputs": [ - { - "name": "", - "type": "tuple[]", - "internalType": "struct ConsensusV1.VoteResult[]", - "components": [ - { - "name": "voter", - "type": "address", - "internalType": "address" - }, - { - "name": "validator", - "type": "address", - "internalType": "address" - } - ] - } - ], - "stateMutability": "view" - }, - { - "type": "function", - "name": "getVotesCount", - "inputs": [], - "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "initialize", - "inputs": [], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "isValidatorRegistered", - "inputs": [{ "name": "addr", "type": "address", "internalType": "address" }], - "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "owner", - "inputs": [], - "outputs": [{ "name": "", "type": "address", "internalType": "address" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "proxiableUUID", - "inputs": [], - "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], - "stateMutability": "view" - }, - { - "type": "function", - "name": "registerValidator", - "inputs": [ - { - "name": "blsPublicKey", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "registeredValidatorsCount", - "inputs": [], - "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], - "stateMutability": "view" - }, - { - "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" }], - "stateMutability": "view" - }, - { - "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": "blsPublicKey", - "type": "bytes", - "internalType": "bytes" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "updateVoters", - "inputs": [ - { - "name": "voters", - "type": "address[]", - "internalType": "address[]" - } - ], - "outputs": [], - "stateMutability": "nonpayable" - }, - { - "type": "function", - "name": "upgradeToAndCall", - "inputs": [ - { - "name": "newImplementation", - "type": "address", - "internalType": "address" - }, - { "name": "data", "type": "bytes", "internalType": "bytes" } - ], - "outputs": [], - "stateMutability": "payable" - }, - { - "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": "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" - } - ], - "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": "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": "blsPublicKey", - "type": "bytes", - "indexed": false, - "internalType": "bytes" - } - ], - "anonymous": false - }, - { - "type": "event", - "name": "Voted", - "inputs": [ - { - "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": "InvalidInitialization", "inputs": [] }, - { "type": "error", "name": "InvalidParameters", "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": "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": "0x60a0604052306080523480156012575f5ffd5b5060805161387e6100395f395f81816122680152818161229101526123d0015261387e5ff3fe6080604052600436106101af575f3560e01c8063715018a6116100e7578063ad3cb1cc11610087578063eb9019d411610062578063eb9019d4146104a2578063f1bd0b37146104ce578063f2fde38b146104e2578063f3513a3714610501575f5ffd5b8063ad3cb1cc14610422578063b85f5da21461045f578063d04a68c714610473575f5ffd5b8063857861db116100c2578063857861db146103885780638da5cb5b146103a75780639de70258146103ed578063a09686c41461040e575f5ffd5b8063715018a6146103415780637c8a92c3146103555780638129fc1c14610374575f5ffd5b806340f74f471161015257806354fd4d501161012d57806354fd4d50146102d15780635a8eed73146102e4578063602a9eee146103035780636dd7d8ea14610322575f5ffd5b806340f74f471461027e5780634f1ef286146102aa57806352d1902d146102bd575f5ffd5b80631b605b861161018d5780631b605b86146102165780632bdf6d431461022a5780633174b6891461024b5780633d09c2a81461025f575f5ffd5b80630777cbef146101b35780630d2bd909146101d65780631904bb2e146101ea575b5f5ffd5b3480156101be575f5ffd5b506005545b6040519081526020015b60405180910390f35b3480156101e1575f5ffd5b50600d546101c3565b3480156101f5575f5ffd5b50610209610204366004613014565b610515565b6040516101cd91906130d3565b348015610221575f5ffd5b506009546101c3565b348015610235575f5ffd5b506102496102443660046130e5565b610630565b005b348015610256575f5ffd5b5061024961067e565b34801561026a575f5ffd5b50610249610279366004613154565b6106cd565b348015610289575f5ffd5b5061029d610298366004613185565b610918565b6040516101cd91906131a5565b6102496102b8366004613272565b610aab565b3480156102c8575f5ffd5b506101c3610aca565b3480156102dc575f5ffd5b5060016101c3565b3480156102ef575f5ffd5b506102496102fe366004613377565b610ae5565b34801561030e575f5ffd5b5061024961031d366004613377565b610b71565b34801561032d575f5ffd5b5061024961033c366004613014565b610cff565b34801561034c575f5ffd5b50610249610f7d565b348015610360575f5ffd5b5061024961036f3660046133b5565b610f90565b34801561037f575f5ffd5b506102496111cf565b348015610393575f5ffd5b506102496103a236600461341a565b6112db565b3480156103b2575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b0390911681526020016101cd565b3480156103f8575f5ffd5b50610401611874565b6040516101cd919061343a565b348015610419575f5ffd5b50600f546101c3565b34801561042d575f5ffd5b50610452604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101cd9190613491565b34801561046a575f5ffd5b50610249611a14565b34801561047e575f5ffd5b5061049261048d366004613014565b611afd565b60405190151581526020016101cd565b3480156104ad575f5ffd5b506104c16104bc3660046134a3565b611b1a565b6040516101cd91906134cb565b3480156104d9575f5ffd5b506004546101c3565b3480156104ed575f5ffd5b506102496104fc366004613014565b611d1b565b34801561050c575f5ffd5b50610401611d5d565b61051d612f1e565b61052682611afd565b6105435760405163510b8aad60e11b815260040160405180910390fd5b6040805180820182526001600160a01b0384168082525f908152602081815290839020835160808101855281548152600182015481840152600282015460ff161515948101949094526003810180549394928501936060840191906105a790613525565b80601f01602080910402602001604051908101604052809291908181526020018280546105d390613525565b801561061e5780601f106105f55761010080835404028352916020019161061e565b820191905f5260205f20905b81548152906001019060200180831161060157829003601f168201915b50505091909252505050905292915050565b610638611ef7565b5f5b818110156106795761067183838381811061065757610657613557565b905060200201602081019061066c9190613014565b611f52565b60010161063a565b505050565b7f6572af8bf9a0a86efb88dcc30011626a15c9c4603503aa4466a3f87a1867deef336106a8612032565b604080516001600160a01b0393841681529290911660208301520160405180910390a1565b6106d5611ef7565b600f54156106f6576040516349625b3b60e01b815260040160405180910390fd5b6106ff81611afd565b61071c5760405163510b8aad60e11b815260040160405180910390fd5b6001600160a01b038083165f90815260066020526040902080549091161561075757604051637c9a1cf960e01b815260040160405180910390fd5b604080516080810182526001600160a01b038085168252858116803160208085019182525f85870181815260608701828152948252600690925295909520935184549084166001600160a01b0319918216178555905160018501559351600284018054918416918616919091179055516003909201805492821692909316919091179091556007541661081457600780546001600160a01b0385166001600160a01b0319918216811790925560088054909116909117905561086c565b600880546001600160a01b039081165f9081526006602052604080822060030180548489166001600160a01b031991821681179092558554828552929093206002018054841692909416919091179092558254161790555b60098054905f61087b8361357f565b90915550506001600160a01b038083165f90815260208190526040812060018101805491938716319290916108b1908490613597565b9091555050805460019082905f906108ca908490613597565b9091555050604080516001600160a01b038087168252851660208201527fce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2910160405180910390a150505050565b6060610922611ef7565b600f548290841061093457505f610958565b600f546109418486613597565b111561095857600f546109559085906135aa565b90505b5f816001600160401b038111156109715761097161325e565b6040519080825280602002602001820160405280156109b657816020015b604080518082019091525f81526060602082015281526020019060019003908161098f5790505b5090505f5b82811015610aa057604051806040016040528082886109da9190613597565b6109e5906001613597565b8152602001600f6109f6848a613597565b81548110610a0657610a06613557565b905f5260205f2001805480602002602001604051908101604052809291908181526020015f905b82821015610a74575f848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101610a2d565b50505050815250828281518110610a8d57610a8d613557565b60209081029190910101526001016109bb565b509150505b92915050565b610ab361225d565b610abc82612301565b610ac68282612309565b5050565b5f610ad36123c5565b505f5160206138295f395f51905f5290565b610aee33611afd565b610b0b5760405163510b8aad60e11b815260040160405180910390fd5b610b15828261240e565b335f908152602081905260409020600301610b31828483613601565b507f4af0b5984c9f88659d661fb64dcb63a5b946809cf1c78a8c6e0f6ef93c917032338383604051610b65939291906136ba565b60405180910390a15050565b335f9081526001602052604090205460ff1615610ba15760405163132e7efb60e31b815260040160405180910390fd5b610bab828261240e565b5f60405180608001604052805f81526020015f81526020015f1515815260200184848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920182905250939094525050600480549394509150610c148361357f565b9091555050335f908152600160208181526040808420805460ff19908116851790915584835293819020855181559185015192820192909255908301516002820180549093169015151790915560608201518291906003820190610c7890826136f9565b5050600380546001810182555f919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b031916339081179091556040517f61809fa303a3a57f4d70552f533f3e0b003173d424590cd4bb22a2afe000990c9250610cf29190869086906136ba565b60405180910390a1505050565b610d0881611afd565b610d255760405163510b8aad60e11b815260040160405180910390fd5b6001600160a01b0381165f908152602081905260409020600281015460ff1615610d625760405163510ae2bd60e11b815260040160405180910390fd5b806003018054610d7190613525565b90505f03610d925760405163970c784d60e01b815260040160405180910390fd5b335f90815260066020526040902080546001600160a01b03848116911603610dcd57604051630d41c52760e01b815260040160405180910390fd5b80546001600160a01b031615610de757610de5612032565b505b604080516080810182526001600160a01b03808616825233803160208085019182525f85870181815260608701828152948252600690925295909520935184549084166001600160a01b03199182161785559051600185015593516002840180549184169186169190911790555160039092018054928216929093169190911790915560075416610e995760078054336001600160a01b03199182168117909255600880549091169091179055610ef0565b600880546001600160a01b039081165f9081526006602052604080822060030180546001600160a01b0319908116339081179092558554828552929093206002018054841692909416919091179092558254161790555b60098054905f610eff8361357f565b9190505550336001600160a01b031631826001015f828254610f219190613597565b9091555050815460019083905f90610f3a908490613597565b9091555050604080513381526001600160a01b03851660208201527fce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e29101610cf2565b610f85611ef7565b610f8e5f612482565b565b610f98611ef7565b600f5415610fb9576040516349625b3b60e01b815260040160405180910390fd5b6001600160a01b0384165f9081526001602052604090205460ff1615610ff25760405163132e7efb60e31b815260040160405180910390fd5b60025f84846040516110059291906137b3565b604080519182900390912082526020820192909252015f205460ff161561103f57604051637e4c066f60e01b815260040160405180910390fd5b811561104f5761104f838361240e565b5f60405180608001604052805f81526020015f8152602001831515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509390945250506004805493945091506110b88361357f565b90915550506001600160a01b0385165f908152600160208181526040808420805460ff1990811685179091558483529381902085518155918501519282019290925590830151600282018054909316901515179091556060820151829190600382019061112590826136f9565b5050600380546001810182555f919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b03881617905550811561118d5760058054905f6111878361357f565b91905055505b7f61809fa303a3a57f4d70552f533f3e0b003173d424590cd4bb22a2afe000990c8585856040516111c0939291906136ba565b60405180910390a15050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156112135750825b90505f826001600160401b0316600114801561122e5750303b155b90508115801561123c575080155b1561125a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561128457845460ff60401b1916600160401b1785555b61128d336124f2565b6001600e5583156112d457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906020016111c0565b5050505050565b6112e3611ef7565b8060ff165f0361130657604051630e52390960e41b815260040160405180910390fd5b60ff8116600e556113176003612503565b61131f612653565b600c80546001600160a01b03191690556005546004545f916113519160ff851691849161134c91906135aa565b6126a4565b90508060ff165f03611376576040516367c0fced60e01b815260040160405180910390fd5b5f5b600354811015611638575f6003828154811061139657611396613557565b5f9182526020808320909101546001600160a01b031680835290829052604090912060028101549192509060ff16806113dd57508060030180546113d990613525565b1590505b156113e9575050611630565b600c546001600160a01b03166114245750600c80546001600160a01b0319166001600160a01b03929092169190911790556001600d55611630565b8360ff16600d5410156114425761143b82856126f8565b5050611630565b600c546001600160a01b039081165f9081526020818152604091829020825180840184529386168452825160808101845285548152600186015481840152600286015460ff16151593810193909352600385018054919461161d949093840192909187916060840191906114b590613525565b80601f01602080910402602001604051908101604052809291908181526020018280546114e190613525565b801561152c5780601f106115035761010080835404028352916020019161152c565b820191905f5260205f20905b81548152906001019060200180831161150f57829003601f168201915b505050919092525050509052604080518082018252600c546001600160a01b031681528151608081018352855481526001860154602082810191909152600287015460ff1615159382019390935260038601805492938401928791606084019161159590613525565b80601f01602080910402602001604051908101604052809291908181526020018280546115c190613525565b801561160c5780601f106115e35761010080835404028352916020019161160c565b820191905f5260205f20905b8154815290600101906020018083116115ef57829003601f168201915b505050505081525050815250612ad4565b1561162c5761162c83866126f8565b5050505b600101611378565b50600d545f0361165b576040516367c0fced60e01b815260040160405180910390fd5b600c54600d546001600160a01b03909116905f906001600160401b038111156116865761168661325e565b6040519080825280602002602001820160405280156116af578160200160208202803683370190505b5090505f5b600d5481101561170957828282815181106116d1576116d1613557565b6001600160a01b039283166020918202929092018101919091529381165f908152600a909452604090932054909216916001016116b4565b5061171381612b18565b600f80546001810182555f9182527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802019061175090600b90612f67565b600e546001600160401b0381111561176a5761176a61325e565b604051908082528060200260200182016040528015611793578160200160208202803683370190505b5080516117a891600b91602090910190612f82565b505f5b600e5481101561186c575f83600d54836117c591906137c2565b815181106117d5576117d5613557565b6020026020010151905080600b83815481106117f3576117f3613557565b5f918252602080832090910180546001600160a01b039485166001600160a01b0319918216179091556040805180820182529585168087528452838352832060019081015486840190815288548083018a55898652939094209551600290930290950180549290941691161782555190820155016117ab565b505050505050565b600b546060905f906001600160401b038111156118935761189361325e565b6040519080825280602002602001820160405280156118cc57816020015b6118b9612f1e565b8152602001906001900390816118b15790505b5090505f5b600b54811015611a0e575f600b82815481106118ef576118ef613557565b5f9182526020808320909101546001600160a01b031680835282825260409283902083518085018552828152845160808101865282548152600183015481860152600283015460ff16151595810195909552600382018054939650919490938401929091859160608401919061196490613525565b80601f016020809104026020016040519081016040528092919081815260200182805461199090613525565b80156119db5780601f106119b2576101008083540402835291602001916119db565b820191905f5260205f20905b8154815290600101906020018083116119be57829003601f168201915b5050505050815250508152508484815181106119f9576119f9613557565b602090810291909101015250506001016118d1565b50919050565b611a1d33611afd565b611a3a5760405163668191af60e11b815260040160405180910390fd5b335f908152602081905260409020600281015460ff1615611a6e57604051632d8b5c9760e21b815260040160405180910390fd5b600e54600554600454611a8191906135aa565b11611a9f57604051633b15f1f760e21b815260040160405180910390fd5b60028101805460ff19166001908117909155600580545f90611ac2908490613597565b90915550506040513381527f24250fc1ec78a1405ddd4cc8b75964858af228d05faa8d4bc1302966d8a541179060200160405180910390a150565b6001600160a01b03165f9081526001602052604090205460ff1690565b6060611b24611ef7565b5f611b32835f6009546126a4565b6001600160401b03811115611b4957611b4961325e565b604051908082528060200260200182016040528015611b8d57816020015b604080518082019091525f8082526020820152815260200190600190039081611b675790505b506007549091506001600160a01b0390811690851615611bc657506001600160a01b038085165f90815260066020526040902060030154165b5f5b6001600160a01b03821615801590611bdf57508481105b15611c54576001600160a01b038083165f818152600660209081526040918290208251808401909352928252825490931692810192909252908483611c238161357f565b945081518110611c3557611c35613557565b6020908102919091010152600301546001600160a01b03169150611bc8565b80835103611c6757829350505050610aa5565b5f816001600160401b03811115611c8057611c8061325e565b604051908082528060200260200182016040528015611cc457816020015b604080518082019091525f8082526020820152815260200190600190039081611c9e5790505b5090505f5b82811015611d1057848181518110611ce357611ce3613557565b6020026020010151828281518110611cfd57611cfd613557565b6020908102919091010152600101611cc9565b509695505050505050565b611d23611ef7565b6001600160a01b038116611d5157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b611d5a81612482565b50565b6003546060905f906001600160401b03811115611d7c57611d7c61325e565b604051908082528060200260200182016040528015611db557816020015b611da2612f1e565b815260200190600190039081611d9a5790505b5090505f5b600354811015611a0e575f60038281548110611dd857611dd8613557565b5f9182526020808320909101546001600160a01b031680835282825260409283902083518085018552828152845160808101865282548152600183015481860152600283015460ff161515958101959095526003820180549396509194909384019290918591606084019190611e4d90613525565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7990613525565b8015611ec45780601f10611e9b57610100808354040283529160200191611ec4565b820191905f5260205f20905b815481529060010190602001808311611ea757829003601f168201915b505050505081525050815250848481518110611ee257611ee2613557565b60209081029190910101525050600101611dba565b33611f297f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610f8e5760405163118cdaa760e01b8152336004820152602401611d48565b6001600160a01b038082165f9081526006602052604090208054909116611f77575050565b60018101546001600160a01b03831631811015611fd857611fa2816001600160a01b038516316135aa565b82546001600160a01b03165f9081526020819052604081206001018054909190611fcd908490613597565b9091555061201d9050565b611fec6001600160a01b03841631826135aa565b82546001600160a01b03165f90815260208190526040812060010180549091906120179084906135aa565b90915550505b506001600160a01b0390911631600190910155565b335f90815260066020526040812080546001600160a01b03166120685760405163498ea63d60e01b815260040160405180910390fd5b6008546007546001600160a01b039182169116036120a157600780546001600160a01b03199081169091556008805490911690556121b4565b600854336001600160a01b03909116036120fa576002810180546001600160a01b039081165f90815260066020526040902060030180546001600160a01b031990811690915591546008805490931691161790556121b4565b600754336001600160a01b039091160361215e576008546001600160a01b039081165f9081526006602052604080822060020180546001600160a01b03199081169091556007805480861685529290932060030154911692169190911790556121b4565b60038181018054600280850180546001600160a01b039081165f9081526006602052604080822090970180549583166001600160a01b031996871617905591549454811682529490200180549290931691161790555b80546001600160a01b03165f8181526020819052604081206001808501549082018054929391929091906121e99084906135aa565b9091555050805460019082905f906122029084906135aa565b9091555050335f90815260066020526040812080546001600160a01b0319908116825560018201839055600282018054821690556003909101805490911690556009805491612250836137e1565b9091555091949350505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806122e357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166122d75f5160206138295f395f51905f52546001600160a01b031690565b6001600160a01b031614155b15610f8e5760405163703e46dd60e11b815260040160405180910390fd5b611d5a611ef7565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612363575060408051601f3d908101601f19168201909252612360918101906137f6565b60015b61238b57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611d48565b5f5160206138295f395f51905f5281146123bb57604051632a87526960e21b815260048101829052602401611d48565b6106798383612c2f565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f8e5760405163703e46dd60e11b815260040160405180910390fd5b5f828260405161241f9291906137b3565b60408051918290039091205f8181526002602052919091205490915060ff161561245c57604051637e4c066f60e01b815260040160405180910390fd5b6124668383612c84565b5f908152600260205260409020805460ff191660011790555050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6124fa612ca5565b611d5a81612cee565b80545f819003612511575050565b5f61251d6001836135aa565b90505b8015610679575f612532826001613597565b60408051426020820152908101849052606001604051602081830303815290604052805190602001205f1c61256791906137c2565b90505f84838154811061257c5761257c613557565b5f9182526020909120015485546001600160a01b0390911691508590839081106125a8576125a8613557565b905f5260205f20015f9054906101000a90046001600160a01b03168584815481106125d5576125d5613557565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508085838154811061261357612613613557565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050808061264b906137e1565b915050612520565b600c546001600160a01b03165b6001600160a01b0381161561269d576001600160a01b039081165f908152600a6020526040902080546001600160a01b0319811690915516612660565b505f600d55565b5f818311156126d057604051632457cde760e01b81526004810184905260248101839052604401611d48565b828410156126df5750816126f1565b818411156126ee5750806126f1565b50825b9392505050565b6001600160a01b0382165f90815260208181526040808320815160808101835281548152600182015493810193909352600281015460ff1615159183019190915260038101805460608401919061274e90613525565b80601f016020809104026020016040519081016040528092919081815260200182805461277a90613525565b80156127c55780601f1061279c576101008083540402835291602001916127c5565b820191905f5260205f20905b8154815290600101906020018083116127a857829003601f168201915b505050919092525050604080518082018252600c546001600160a01b03168082525f908152602081815290839020835160808101855281548152600182015481840152600282015460ff161515948101949094526003810180549697506128e49693955091850193929091606084019161283e90613525565b80601f016020809104026020016040519081016040528092919081815260200182805461286a90613525565b80156128b55780601f1061288c576101008083540402835291602001916128b5565b820191905f5260205f20905b81548152906001019060200180831161289857829003601f168201915b5050505050815250508152506040518060400160405280866001600160a01b0316815260200184815250612ad4565b156128f7576128f283612cf6565b612a75565b600c546001600160a01b039081165f818152600a6020526040902054909116905b6001600160a01b038216612935576129308186612d47565b612a72565b6040805180820182526001600160a01b0384168082525f908152602081815290839020835160808101855281548152600182015481840152600282015460ff16151594810194909452600381018054612a4295938501939291606084019161299c90613525565b80601f01602080910402602001604051908101604052809291908181526020018280546129c890613525565b8015612a135780601f106129ea57610100808354040283529160200191612a13565b820191905f5260205f20905b8154815290600101906020018083116129f657829003601f168201915b5050505050815250508152506040518060400160405280886001600160a01b0316815260200186815250612ad4565b15612a51576129308186612d47565b506001600160a01b038082165f908152600a60205260409020541690612918565b50505b8160ff16600d54111561067957600c80546001600160a01b039081165f908152600a6020526040812080546001600160a01b03198082169092558454931692168217909255600d80549192612ac9836137e1565b919050555050505050565b5f81602001516020015183602001516020015103612b045750805182516001600160a01b03918216911611610aa5565b506020908101518101519181015101511190565b80515f819003612b26575050565b5f612b326001836135aa565b90505b8015610679575f612b47826001613597565b60408051426020820152908101849052606001604051602081830303815290604052805190602001205f1c612b7c91906137c2565b90505f848381518110612b9157612b91613557565b60200260200101519050848281518110612bad57612bad613557565b6020026020010151858481518110612bc757612bc7613557565b60200260200101906001600160a01b031690816001600160a01b03168152505080858381518110612bfa57612bfa613557565b60200260200101906001600160a01b031690816001600160a01b03168152505050508080612c27906137e1565b915050612b35565b612c3882612da5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115612c7c576106798282612e08565b610ac6612e7a565b60308114610ac6576040516305db9dbd60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610f8e57604051631afcd79f60e31b815260040160405180910390fd5b611d23612ca5565b600c80546001600160a01b038381165f818152600a602052604081208054939094166001600160a01b031993841617909355835490911617909155600d805491612d3f8361357f565b919050555050565b6001600160a01b038281165f818152600a602052604080822080548686168085529284208054919096166001600160a01b03199182161790955592825282549093169092179055600d805491612d9c8361357f565b91905055505050565b806001600160a01b03163b5f03612dda57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611d48565b5f5160206138295f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b031684604051612e24919061380d565b5f60405180830381855af49150503d805f8114612e5c576040519150601f19603f3d011682016040523d82523d5f602084013e612e61565b606091505b5091509150612e71858383612e99565b95945050505050565b3415610f8e5760405163b398979f60e01b815260040160405180910390fd5b606082612eae57612ea982612ef5565b6126f1565b8151158015612ec557506001600160a01b0384163b155b15612eee57604051639996b31560e01b81526001600160a01b0385166004820152602401611d48565b50806126f1565b805115612f055780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b60405180604001604052805f6001600160a01b03168152602001612f6260405180608001604052805f81526020015f81526020015f15158152602001606081525090565b905290565b5080545f8255905f5260205f2090810190611d5a9190612fe5565b828054828255905f5260205f20908101928215612fd5579160200282015b82811115612fd557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612fa0565b50612fe1929150612fe5565b5090565b5b80821115612fe1575f8155600101612fe6565b80356001600160a01b038116811461300f575f5ffd5b919050565b5f60208284031215613024575f5ffd5b6126f182612ff9565b5f5b8381101561304757818101518382015260200161302f565b50505f910152565b5f815180845261306681602086016020860161302d565b601f01601f19169290920160200192915050565b60018060a01b0381511682525f602082015160406020850152805160408501526020810151606085015260408101511515608085015260608101519050608060a08501526130cb60c085018261304f565b949350505050565b602081525f6126f1602083018461307a565b5f5f602083850312156130f6575f5ffd5b82356001600160401b0381111561310b575f5ffd5b8301601f8101851361311b575f5ffd5b80356001600160401b03811115613130575f5ffd5b8560208260051b8401011115613144575f5ffd5b6020919091019590945092505050565b5f5f60408385031215613165575f5ffd5b61316e83612ff9565b915061317c60208401612ff9565b90509250929050565b5f5f60408385031215613196575f5ffd5b50508035926020909101359150565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561325257868503603f19018452815180518652602090810151604082880181905281519088018190529101905f9060608801905b8083101561323a57835180516001600160a01b03168352602090810151818401529093019260019290920191604090910190613203565b509650505060209384019391909101906001016131cb565b50929695505050505050565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215613283575f5ffd5b61328c83612ff9565b915060208301356001600160401b038111156132a6575f5ffd5b8301601f810185136132b6575f5ffd5b80356001600160401b038111156132cf576132cf61325e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156132fd576132fd61325e565b604052818152828201602001871015613314575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f83601f840112613343575f5ffd5b5081356001600160401b03811115613359575f5ffd5b602083019150836020828501011115613370575f5ffd5b9250929050565b5f5f60208385031215613388575f5ffd5b82356001600160401b0381111561339d575f5ffd5b6133a985828601613333565b90969095509350505050565b5f5f5f5f606085870312156133c8575f5ffd5b6133d185612ff9565b935060208501356001600160401b038111156133eb575f5ffd5b6133f787828801613333565b9094509250506040850135801515811461340f575f5ffd5b939692955090935050565b5f6020828403121561342a575f5ffd5b813560ff811681146126f1575f5ffd5b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561325257603f1987860301845261347c85835161307a565b94506020938401939190910190600101613460565b602081525f6126f1602083018461304f565b5f5f604083850312156134b4575f5ffd5b6134bd83612ff9565b946020939093013593505050565b602080825282518282018190525f918401906040840190835b8181101561351a57835180516001600160a01b0390811685526020918201511681850152909301926040909201916001016134e4565b509095945050505050565b600181811c9082168061353957607f821691505b602082108103611a0e57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016135905761359061356b565b5060010190565b80820180821115610aa557610aa561356b565b81810381811115610aa557610aa561356b565b601f82111561067957805f5260205f20601f840160051c810160208510156135e25750805b601f840160051c820191505b818110156112d4575f81556001016135ee565b6001600160401b038311156136185761361861325e565b61362c836136268354613525565b836135bd565b5f601f84116001811461365d575f85156136465750838201355b5f19600387901b1c1916600186901b1783556112d4565b5f83815260208120601f198716915b8281101561368c578685013582556020948501946001909201910161366c565b50868210156136a8575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b81516001600160401b038111156137125761371261325e565b613726816137208454613525565b846135bd565b6020601f821160018114613758575f83156137415750848201515b5f19600385901b1c1916600184901b1784556112d4565b5f84815260208120601f198516915b828110156137875787850151825560209485019460019092019101613767565b50848210156137a457868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b818382375f9101908152919050565b5f826137dc57634e487b7160e01b5f52601260045260245ffd5b500690565b5f816137ef576137ef61356b565b505f190190565b5f60208284031215613806575f5ffd5b5051919050565b5f825161381e81846020870161302d565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220983e2d933e18f12cab95985824dc16db07106a30fc15cd31c83493c6e0e0f72b64736f6c634300081b0033", - "sourceMap": "1266:19289:37:-:0;;;1171:4:25;1128:48;;1266:19289:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", - "linkReferences": {} - }, - "deployedBytecode": { - "object": "0x6080604052600436106101af575f3560e01c8063715018a6116100e7578063ad3cb1cc11610087578063eb9019d411610062578063eb9019d4146104a2578063f1bd0b37146104ce578063f2fde38b146104e2578063f3513a3714610501575f5ffd5b8063ad3cb1cc14610422578063b85f5da21461045f578063d04a68c714610473575f5ffd5b8063857861db116100c2578063857861db146103885780638da5cb5b146103a75780639de70258146103ed578063a09686c41461040e575f5ffd5b8063715018a6146103415780637c8a92c3146103555780638129fc1c14610374575f5ffd5b806340f74f471161015257806354fd4d501161012d57806354fd4d50146102d15780635a8eed73146102e4578063602a9eee146103035780636dd7d8ea14610322575f5ffd5b806340f74f471461027e5780634f1ef286146102aa57806352d1902d146102bd575f5ffd5b80631b605b861161018d5780631b605b86146102165780632bdf6d431461022a5780633174b6891461024b5780633d09c2a81461025f575f5ffd5b80630777cbef146101b35780630d2bd909146101d65780631904bb2e146101ea575b5f5ffd5b3480156101be575f5ffd5b506005545b6040519081526020015b60405180910390f35b3480156101e1575f5ffd5b50600d546101c3565b3480156101f5575f5ffd5b50610209610204366004613014565b610515565b6040516101cd91906130d3565b348015610221575f5ffd5b506009546101c3565b348015610235575f5ffd5b506102496102443660046130e5565b610630565b005b348015610256575f5ffd5b5061024961067e565b34801561026a575f5ffd5b50610249610279366004613154565b6106cd565b348015610289575f5ffd5b5061029d610298366004613185565b610918565b6040516101cd91906131a5565b6102496102b8366004613272565b610aab565b3480156102c8575f5ffd5b506101c3610aca565b3480156102dc575f5ffd5b5060016101c3565b3480156102ef575f5ffd5b506102496102fe366004613377565b610ae5565b34801561030e575f5ffd5b5061024961031d366004613377565b610b71565b34801561032d575f5ffd5b5061024961033c366004613014565b610cff565b34801561034c575f5ffd5b50610249610f7d565b348015610360575f5ffd5b5061024961036f3660046133b5565b610f90565b34801561037f575f5ffd5b506102496111cf565b348015610393575f5ffd5b506102496103a236600461341a565b6112db565b3480156103b2575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b0390911681526020016101cd565b3480156103f8575f5ffd5b50610401611874565b6040516101cd919061343a565b348015610419575f5ffd5b50600f546101c3565b34801561042d575f5ffd5b50610452604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101cd9190613491565b34801561046a575f5ffd5b50610249611a14565b34801561047e575f5ffd5b5061049261048d366004613014565b611afd565b60405190151581526020016101cd565b3480156104ad575f5ffd5b506104c16104bc3660046134a3565b611b1a565b6040516101cd91906134cb565b3480156104d9575f5ffd5b506004546101c3565b3480156104ed575f5ffd5b506102496104fc366004613014565b611d1b565b34801561050c575f5ffd5b50610401611d5d565b61051d612f1e565b61052682611afd565b6105435760405163510b8aad60e11b815260040160405180910390fd5b6040805180820182526001600160a01b0384168082525f908152602081815290839020835160808101855281548152600182015481840152600282015460ff161515948101949094526003810180549394928501936060840191906105a790613525565b80601f01602080910402602001604051908101604052809291908181526020018280546105d390613525565b801561061e5780601f106105f55761010080835404028352916020019161061e565b820191905f5260205f20905b81548152906001019060200180831161060157829003601f168201915b50505091909252505050905292915050565b610638611ef7565b5f5b818110156106795761067183838381811061065757610657613557565b905060200201602081019061066c9190613014565b611f52565b60010161063a565b505050565b7f6572af8bf9a0a86efb88dcc30011626a15c9c4603503aa4466a3f87a1867deef336106a8612032565b604080516001600160a01b0393841681529290911660208301520160405180910390a1565b6106d5611ef7565b600f54156106f6576040516349625b3b60e01b815260040160405180910390fd5b6106ff81611afd565b61071c5760405163510b8aad60e11b815260040160405180910390fd5b6001600160a01b038083165f90815260066020526040902080549091161561075757604051637c9a1cf960e01b815260040160405180910390fd5b604080516080810182526001600160a01b038085168252858116803160208085019182525f85870181815260608701828152948252600690925295909520935184549084166001600160a01b0319918216178555905160018501559351600284018054918416918616919091179055516003909201805492821692909316919091179091556007541661081457600780546001600160a01b0385166001600160a01b0319918216811790925560088054909116909117905561086c565b600880546001600160a01b039081165f9081526006602052604080822060030180548489166001600160a01b031991821681179092558554828552929093206002018054841692909416919091179092558254161790555b60098054905f61087b8361357f565b90915550506001600160a01b038083165f90815260208190526040812060018101805491938716319290916108b1908490613597565b9091555050805460019082905f906108ca908490613597565b9091555050604080516001600160a01b038087168252851660208201527fce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2910160405180910390a150505050565b6060610922611ef7565b600f548290841061093457505f610958565b600f546109418486613597565b111561095857600f546109559085906135aa565b90505b5f816001600160401b038111156109715761097161325e565b6040519080825280602002602001820160405280156109b657816020015b604080518082019091525f81526060602082015281526020019060019003908161098f5790505b5090505f5b82811015610aa057604051806040016040528082886109da9190613597565b6109e5906001613597565b8152602001600f6109f6848a613597565b81548110610a0657610a06613557565b905f5260205f2001805480602002602001604051908101604052809291908181526020015f905b82821015610a74575f848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101610a2d565b50505050815250828281518110610a8d57610a8d613557565b60209081029190910101526001016109bb565b509150505b92915050565b610ab361225d565b610abc82612301565b610ac68282612309565b5050565b5f610ad36123c5565b505f5160206138295f395f51905f5290565b610aee33611afd565b610b0b5760405163510b8aad60e11b815260040160405180910390fd5b610b15828261240e565b335f908152602081905260409020600301610b31828483613601565b507f4af0b5984c9f88659d661fb64dcb63a5b946809cf1c78a8c6e0f6ef93c917032338383604051610b65939291906136ba565b60405180910390a15050565b335f9081526001602052604090205460ff1615610ba15760405163132e7efb60e31b815260040160405180910390fd5b610bab828261240e565b5f60405180608001604052805f81526020015f81526020015f1515815260200184848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920182905250939094525050600480549394509150610c148361357f565b9091555050335f908152600160208181526040808420805460ff19908116851790915584835293819020855181559185015192820192909255908301516002820180549093169015151790915560608201518291906003820190610c7890826136f9565b5050600380546001810182555f919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b031916339081179091556040517f61809fa303a3a57f4d70552f533f3e0b003173d424590cd4bb22a2afe000990c9250610cf29190869086906136ba565b60405180910390a1505050565b610d0881611afd565b610d255760405163510b8aad60e11b815260040160405180910390fd5b6001600160a01b0381165f908152602081905260409020600281015460ff1615610d625760405163510ae2bd60e11b815260040160405180910390fd5b806003018054610d7190613525565b90505f03610d925760405163970c784d60e01b815260040160405180910390fd5b335f90815260066020526040902080546001600160a01b03848116911603610dcd57604051630d41c52760e01b815260040160405180910390fd5b80546001600160a01b031615610de757610de5612032565b505b604080516080810182526001600160a01b03808616825233803160208085019182525f85870181815260608701828152948252600690925295909520935184549084166001600160a01b03199182161785559051600185015593516002840180549184169186169190911790555160039092018054928216929093169190911790915560075416610e995760078054336001600160a01b03199182168117909255600880549091169091179055610ef0565b600880546001600160a01b039081165f9081526006602052604080822060030180546001600160a01b0319908116339081179092558554828552929093206002018054841692909416919091179092558254161790555b60098054905f610eff8361357f565b9190505550336001600160a01b031631826001015f828254610f219190613597565b9091555050815460019083905f90610f3a908490613597565b9091555050604080513381526001600160a01b03851660208201527fce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e29101610cf2565b610f85611ef7565b610f8e5f612482565b565b610f98611ef7565b600f5415610fb9576040516349625b3b60e01b815260040160405180910390fd5b6001600160a01b0384165f9081526001602052604090205460ff1615610ff25760405163132e7efb60e31b815260040160405180910390fd5b60025f84846040516110059291906137b3565b604080519182900390912082526020820192909252015f205460ff161561103f57604051637e4c066f60e01b815260040160405180910390fd5b811561104f5761104f838361240e565b5f60405180608001604052805f81526020015f8152602001831515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509390945250506004805493945091506110b88361357f565b90915550506001600160a01b0385165f908152600160208181526040808420805460ff1990811685179091558483529381902085518155918501519282019290925590830151600282018054909316901515179091556060820151829190600382019061112590826136f9565b5050600380546001810182555f919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b03881617905550811561118d5760058054905f6111878361357f565b91905055505b7f61809fa303a3a57f4d70552f533f3e0b003173d424590cd4bb22a2afe000990c8585856040516111c0939291906136ba565b60405180910390a15050505050565b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a008054600160401b810460ff1615906001600160401b03165f811580156112135750825b90505f826001600160401b0316600114801561122e5750303b155b90508115801561123c575080155b1561125a5760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff19166001178555831561128457845460ff60401b1916600160401b1785555b61128d336124f2565b6001600e5583156112d457845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d2906020016111c0565b5050505050565b6112e3611ef7565b8060ff165f0361130657604051630e52390960e41b815260040160405180910390fd5b60ff8116600e556113176003612503565b61131f612653565b600c80546001600160a01b03191690556005546004545f916113519160ff851691849161134c91906135aa565b6126a4565b90508060ff165f03611376576040516367c0fced60e01b815260040160405180910390fd5b5f5b600354811015611638575f6003828154811061139657611396613557565b5f9182526020808320909101546001600160a01b031680835290829052604090912060028101549192509060ff16806113dd57508060030180546113d990613525565b1590505b156113e9575050611630565b600c546001600160a01b03166114245750600c80546001600160a01b0319166001600160a01b03929092169190911790556001600d55611630565b8360ff16600d5410156114425761143b82856126f8565b5050611630565b600c546001600160a01b039081165f9081526020818152604091829020825180840184529386168452825160808101845285548152600186015481840152600286015460ff16151593810193909352600385018054919461161d949093840192909187916060840191906114b590613525565b80601f01602080910402602001604051908101604052809291908181526020018280546114e190613525565b801561152c5780601f106115035761010080835404028352916020019161152c565b820191905f5260205f20905b81548152906001019060200180831161150f57829003601f168201915b505050919092525050509052604080518082018252600c546001600160a01b031681528151608081018352855481526001860154602082810191909152600287015460ff1615159382019390935260038601805492938401928791606084019161159590613525565b80601f01602080910402602001604051908101604052809291908181526020018280546115c190613525565b801561160c5780601f106115e35761010080835404028352916020019161160c565b820191905f5260205f20905b8154815290600101906020018083116115ef57829003601f168201915b505050505081525050815250612ad4565b1561162c5761162c83866126f8565b5050505b600101611378565b50600d545f0361165b576040516367c0fced60e01b815260040160405180910390fd5b600c54600d546001600160a01b03909116905f906001600160401b038111156116865761168661325e565b6040519080825280602002602001820160405280156116af578160200160208202803683370190505b5090505f5b600d5481101561170957828282815181106116d1576116d1613557565b6001600160a01b039283166020918202929092018101919091529381165f908152600a909452604090932054909216916001016116b4565b5061171381612b18565b600f80546001810182555f9182527f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac802019061175090600b90612f67565b600e546001600160401b0381111561176a5761176a61325e565b604051908082528060200260200182016040528015611793578160200160208202803683370190505b5080516117a891600b91602090910190612f82565b505f5b600e5481101561186c575f83600d54836117c591906137c2565b815181106117d5576117d5613557565b6020026020010151905080600b83815481106117f3576117f3613557565b5f918252602080832090910180546001600160a01b039485166001600160a01b0319918216179091556040805180820182529585168087528452838352832060019081015486840190815288548083018a55898652939094209551600290930290950180549290941691161782555190820155016117ab565b505050505050565b600b546060905f906001600160401b038111156118935761189361325e565b6040519080825280602002602001820160405280156118cc57816020015b6118b9612f1e565b8152602001906001900390816118b15790505b5090505f5b600b54811015611a0e575f600b82815481106118ef576118ef613557565b5f9182526020808320909101546001600160a01b031680835282825260409283902083518085018552828152845160808101865282548152600183015481860152600283015460ff16151595810195909552600382018054939650919490938401929091859160608401919061196490613525565b80601f016020809104026020016040519081016040528092919081815260200182805461199090613525565b80156119db5780601f106119b2576101008083540402835291602001916119db565b820191905f5260205f20905b8154815290600101906020018083116119be57829003601f168201915b5050505050815250508152508484815181106119f9576119f9613557565b602090810291909101015250506001016118d1565b50919050565b611a1d33611afd565b611a3a5760405163668191af60e11b815260040160405180910390fd5b335f908152602081905260409020600281015460ff1615611a6e57604051632d8b5c9760e21b815260040160405180910390fd5b600e54600554600454611a8191906135aa565b11611a9f57604051633b15f1f760e21b815260040160405180910390fd5b60028101805460ff19166001908117909155600580545f90611ac2908490613597565b90915550506040513381527f24250fc1ec78a1405ddd4cc8b75964858af228d05faa8d4bc1302966d8a541179060200160405180910390a150565b6001600160a01b03165f9081526001602052604090205460ff1690565b6060611b24611ef7565b5f611b32835f6009546126a4565b6001600160401b03811115611b4957611b4961325e565b604051908082528060200260200182016040528015611b8d57816020015b604080518082019091525f8082526020820152815260200190600190039081611b675790505b506007549091506001600160a01b0390811690851615611bc657506001600160a01b038085165f90815260066020526040902060030154165b5f5b6001600160a01b03821615801590611bdf57508481105b15611c54576001600160a01b038083165f818152600660209081526040918290208251808401909352928252825490931692810192909252908483611c238161357f565b945081518110611c3557611c35613557565b6020908102919091010152600301546001600160a01b03169150611bc8565b80835103611c6757829350505050610aa5565b5f816001600160401b03811115611c8057611c8061325e565b604051908082528060200260200182016040528015611cc457816020015b604080518082019091525f8082526020820152815260200190600190039081611c9e5790505b5090505f5b82811015611d1057848181518110611ce357611ce3613557565b6020026020010151828281518110611cfd57611cfd613557565b6020908102919091010152600101611cc9565b509695505050505050565b611d23611ef7565b6001600160a01b038116611d5157604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b611d5a81612482565b50565b6003546060905f906001600160401b03811115611d7c57611d7c61325e565b604051908082528060200260200182016040528015611db557816020015b611da2612f1e565b815260200190600190039081611d9a5790505b5090505f5b600354811015611a0e575f60038281548110611dd857611dd8613557565b5f9182526020808320909101546001600160a01b031680835282825260409283902083518085018552828152845160808101865282548152600183015481860152600283015460ff161515958101959095526003820180549396509194909384019290918591606084019190611e4d90613525565b80601f0160208091040260200160405190810160405280929190818152602001828054611e7990613525565b8015611ec45780601f10611e9b57610100808354040283529160200191611ec4565b820191905f5260205f20905b815481529060010190602001808311611ea757829003601f168201915b505050505081525050815250848481518110611ee257611ee2613557565b60209081029190910101525050600101611dba565b33611f297f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610f8e5760405163118cdaa760e01b8152336004820152602401611d48565b6001600160a01b038082165f9081526006602052604090208054909116611f77575050565b60018101546001600160a01b03831631811015611fd857611fa2816001600160a01b038516316135aa565b82546001600160a01b03165f9081526020819052604081206001018054909190611fcd908490613597565b9091555061201d9050565b611fec6001600160a01b03841631826135aa565b82546001600160a01b03165f90815260208190526040812060010180549091906120179084906135aa565b90915550505b506001600160a01b0390911631600190910155565b335f90815260066020526040812080546001600160a01b03166120685760405163498ea63d60e01b815260040160405180910390fd5b6008546007546001600160a01b039182169116036120a157600780546001600160a01b03199081169091556008805490911690556121b4565b600854336001600160a01b03909116036120fa576002810180546001600160a01b039081165f90815260066020526040902060030180546001600160a01b031990811690915591546008805490931691161790556121b4565b600754336001600160a01b039091160361215e576008546001600160a01b039081165f9081526006602052604080822060020180546001600160a01b03199081169091556007805480861685529290932060030154911692169190911790556121b4565b60038181018054600280850180546001600160a01b039081165f9081526006602052604080822090970180549583166001600160a01b031996871617905591549454811682529490200180549290931691161790555b80546001600160a01b03165f8181526020819052604081206001808501549082018054929391929091906121e99084906135aa565b9091555050805460019082905f906122029084906135aa565b9091555050335f90815260066020526040812080546001600160a01b0319908116825560018201839055600282018054821690556003909101805490911690556009805491612250836137e1565b9091555091949350505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806122e357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166122d75f5160206138295f395f51905f52546001600160a01b031690565b6001600160a01b031614155b15610f8e5760405163703e46dd60e11b815260040160405180910390fd5b611d5a611ef7565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612363575060408051601f3d908101601f19168201909252612360918101906137f6565b60015b61238b57604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611d48565b5f5160206138295f395f51905f5281146123bb57604051632a87526960e21b815260048101829052602401611d48565b6106798383612c2f565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f8e5760405163703e46dd60e11b815260040160405180910390fd5b5f828260405161241f9291906137b3565b60408051918290039091205f8181526002602052919091205490915060ff161561245c57604051637e4c066f60e01b815260040160405180910390fd5b6124668383612c84565b5f908152600260205260409020805460ff191660011790555050565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6124fa612ca5565b611d5a81612cee565b80545f819003612511575050565b5f61251d6001836135aa565b90505b8015610679575f612532826001613597565b60408051426020820152908101849052606001604051602081830303815290604052805190602001205f1c61256791906137c2565b90505f84838154811061257c5761257c613557565b5f9182526020909120015485546001600160a01b0390911691508590839081106125a8576125a8613557565b905f5260205f20015f9054906101000a90046001600160a01b03168584815481106125d5576125d5613557565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508085838154811061261357612613613557565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055505050808061264b906137e1565b915050612520565b600c546001600160a01b03165b6001600160a01b0381161561269d576001600160a01b039081165f908152600a6020526040902080546001600160a01b0319811690915516612660565b505f600d55565b5f818311156126d057604051632457cde760e01b81526004810184905260248101839052604401611d48565b828410156126df5750816126f1565b818411156126ee5750806126f1565b50825b9392505050565b6001600160a01b0382165f90815260208181526040808320815160808101835281548152600182015493810193909352600281015460ff1615159183019190915260038101805460608401919061274e90613525565b80601f016020809104026020016040519081016040528092919081815260200182805461277a90613525565b80156127c55780601f1061279c576101008083540402835291602001916127c5565b820191905f5260205f20905b8154815290600101906020018083116127a857829003601f168201915b505050919092525050604080518082018252600c546001600160a01b03168082525f908152602081815290839020835160808101855281548152600182015481840152600282015460ff161515948101949094526003810180549697506128e49693955091850193929091606084019161283e90613525565b80601f016020809104026020016040519081016040528092919081815260200182805461286a90613525565b80156128b55780601f1061288c576101008083540402835291602001916128b5565b820191905f5260205f20905b81548152906001019060200180831161289857829003601f168201915b5050505050815250508152506040518060400160405280866001600160a01b0316815260200184815250612ad4565b156128f7576128f283612cf6565b612a75565b600c546001600160a01b039081165f818152600a6020526040902054909116905b6001600160a01b038216612935576129308186612d47565b612a72565b6040805180820182526001600160a01b0384168082525f908152602081815290839020835160808101855281548152600182015481840152600282015460ff16151594810194909452600381018054612a4295938501939291606084019161299c90613525565b80601f01602080910402602001604051908101604052809291908181526020018280546129c890613525565b8015612a135780601f106129ea57610100808354040283529160200191612a13565b820191905f5260205f20905b8154815290600101906020018083116129f657829003601f168201915b5050505050815250508152506040518060400160405280886001600160a01b0316815260200186815250612ad4565b15612a51576129308186612d47565b506001600160a01b038082165f908152600a60205260409020541690612918565b50505b8160ff16600d54111561067957600c80546001600160a01b039081165f908152600a6020526040812080546001600160a01b03198082169092558454931692168217909255600d80549192612ac9836137e1565b919050555050505050565b5f81602001516020015183602001516020015103612b045750805182516001600160a01b03918216911611610aa5565b506020908101518101519181015101511190565b80515f819003612b26575050565b5f612b326001836135aa565b90505b8015610679575f612b47826001613597565b60408051426020820152908101849052606001604051602081830303815290604052805190602001205f1c612b7c91906137c2565b90505f848381518110612b9157612b91613557565b60200260200101519050848281518110612bad57612bad613557565b6020026020010151858481518110612bc757612bc7613557565b60200260200101906001600160a01b031690816001600160a01b03168152505080858381518110612bfa57612bfa613557565b60200260200101906001600160a01b031690816001600160a01b03168152505050508080612c27906137e1565b915050612b35565b612c3882612da5565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115612c7c576106798282612e08565b610ac6612e7a565b60308114610ac6576040516305db9dbd60e01b815260040160405180910390fd5b7ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a0054600160401b900460ff16610f8e57604051631afcd79f60e31b815260040160405180910390fd5b611d23612ca5565b600c80546001600160a01b038381165f818152600a602052604081208054939094166001600160a01b031993841617909355835490911617909155600d805491612d3f8361357f565b919050555050565b6001600160a01b038281165f818152600a602052604080822080548686168085529284208054919096166001600160a01b03199182161790955592825282549093169092179055600d805491612d9c8361357f565b91905055505050565b806001600160a01b03163b5f03612dda57604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611d48565b5f5160206138295f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b031684604051612e24919061380d565b5f60405180830381855af49150503d805f8114612e5c576040519150601f19603f3d011682016040523d82523d5f602084013e612e61565b606091505b5091509150612e71858383612e99565b95945050505050565b3415610f8e5760405163b398979f60e01b815260040160405180910390fd5b606082612eae57612ea982612ef5565b6126f1565b8151158015612ec557506001600160a01b0384163b155b15612eee57604051639996b31560e01b81526001600160a01b0385166004820152602401611d48565b50806126f1565b805115612f055780518082602001fd5b60405163d6bda27560e01b815260040160405180910390fd5b60405180604001604052805f6001600160a01b03168152602001612f6260405180608001604052805f81526020015f81526020015f15158152602001606081525090565b905290565b5080545f8255905f5260205f2090810190611d5a9190612fe5565b828054828255905f5260205f20908101928215612fd5579160200282015b82811115612fd557825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190612fa0565b50612fe1929150612fe5565b5090565b5b80821115612fe1575f8155600101612fe6565b80356001600160a01b038116811461300f575f5ffd5b919050565b5f60208284031215613024575f5ffd5b6126f182612ff9565b5f5b8381101561304757818101518382015260200161302f565b50505f910152565b5f815180845261306681602086016020860161302d565b601f01601f19169290920160200192915050565b60018060a01b0381511682525f602082015160406020850152805160408501526020810151606085015260408101511515608085015260608101519050608060a08501526130cb60c085018261304f565b949350505050565b602081525f6126f1602083018461307a565b5f5f602083850312156130f6575f5ffd5b82356001600160401b0381111561310b575f5ffd5b8301601f8101851361311b575f5ffd5b80356001600160401b03811115613130575f5ffd5b8560208260051b8401011115613144575f5ffd5b6020919091019590945092505050565b5f5f60408385031215613165575f5ffd5b61316e83612ff9565b915061317c60208401612ff9565b90509250929050565b5f5f60408385031215613196575f5ffd5b50508035926020909101359150565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561325257868503603f19018452815180518652602090810151604082880181905281519088018190529101905f9060608801905b8083101561323a57835180516001600160a01b03168352602090810151818401529093019260019290920191604090910190613203565b509650505060209384019391909101906001016131cb565b50929695505050505050565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215613283575f5ffd5b61328c83612ff9565b915060208301356001600160401b038111156132a6575f5ffd5b8301601f810185136132b6575f5ffd5b80356001600160401b038111156132cf576132cf61325e565b604051601f8201601f19908116603f011681016001600160401b03811182821017156132fd576132fd61325e565b604052818152828201602001871015613314575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f83601f840112613343575f5ffd5b5081356001600160401b03811115613359575f5ffd5b602083019150836020828501011115613370575f5ffd5b9250929050565b5f5f60208385031215613388575f5ffd5b82356001600160401b0381111561339d575f5ffd5b6133a985828601613333565b90969095509350505050565b5f5f5f5f606085870312156133c8575f5ffd5b6133d185612ff9565b935060208501356001600160401b038111156133eb575f5ffd5b6133f787828801613333565b9094509250506040850135801515811461340f575f5ffd5b939692955090935050565b5f6020828403121561342a575f5ffd5b813560ff811681146126f1575f5ffd5b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b8281101561325257603f1987860301845261347c85835161307a565b94506020938401939190910190600101613460565b602081525f6126f1602083018461304f565b5f5f604083850312156134b4575f5ffd5b6134bd83612ff9565b946020939093013593505050565b602080825282518282018190525f918401906040840190835b8181101561351a57835180516001600160a01b0390811685526020918201511681850152909301926040909201916001016134e4565b509095945050505050565b600181811c9082168061353957607f821691505b602082108103611a0e57634e487b7160e01b5f52602260045260245ffd5b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b5f600182016135905761359061356b565b5060010190565b80820180821115610aa557610aa561356b565b81810381811115610aa557610aa561356b565b601f82111561067957805f5260205f20601f840160051c810160208510156135e25750805b601f840160051c820191505b818110156112d4575f81556001016135ee565b6001600160401b038311156136185761361861325e565b61362c836136268354613525565b836135bd565b5f601f84116001811461365d575f85156136465750838201355b5f19600387901b1c1916600186901b1783556112d4565b5f83815260208120601f198716915b8281101561368c578685013582556020948501946001909201910161366c565b50868210156136a8575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b81516001600160401b038111156137125761371261325e565b613726816137208454613525565b846135bd565b6020601f821160018114613758575f83156137415750848201515b5f19600385901b1c1916600184901b1784556112d4565b5f84815260208120601f198516915b828110156137875787850151825560209485019460019092019101613767565b50848210156137a457868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b818382375f9101908152919050565b5f826137dc57634e487b7160e01b5f52601260045260245ffd5b500690565b5f816137ef576137ef61356b565b505f190190565b5f60208284031215613806575f5ffd5b5051919050565b5f825161381e81846020870161302d565b919091019291505056fe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220983e2d933e18f12cab95985824dc16db07106a30fc15cd31c83493c6e0e0f72b64736f6c634300081b0033", - "sourceMap": "1266:19289:37:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11522:115;;;;;;;;;;-1:-1:-1;11606:24:37;;11522:115;;;160:25:50;;;148:2;133:18;11522:115:37;;;;;;;;11643:111;;;;;;;;;;-1:-1:-1;11725:22:37;;11643:111;;11881:253;;;;;;;;;;-1:-1:-1;11881:253:37;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;12997:93::-;;;;;;;;;;-1:-1:-1;13071:12:37;;12997:93;;8737:176;;;;;;;;;;-1:-1:-1;8737:176:37;;;;;:::i;:::-;;:::i;:::-;;8652:79;;;;;;;;;;;;;:::i;4875:1019::-;;;;;;;;;;-1:-1:-1;4875:1019:37;;;;;:::i;:::-;;:::i;14051:531::-;;;;;;;;;;-1:-1:-1;14051:531:37;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;4161:214:25:-;;;;;;:::i;:::-;;:::i;3708:134::-;;;;;;;;;;;;;:::i;11325:76:37:-;;;;;;;;;;-1:-1:-1;11393:1:37;11325:76;;6502:354;;;;;;;;;;-1:-1:-1;6502:354:37;;;;;:::i;:::-;;:::i;5900:596::-;;;;;;;;;;-1:-1:-1;5900:596:37;;;;;:::i;:::-;;:::i;7431:1215::-;;;;;;;;;;-1:-1:-1;7431:1215:37;;;;;:::i;:::-;;:::i;3155:101:23:-;;;;;;;;;;;;;:::i;3885:984:37:-;;;;;;;;;;-1:-1:-1;3885:984:37;;;;;:::i;:::-;;:::i;3634:112::-;;;;;;;;;;;;;:::i;8919:2360::-;;;;;;;;;;-1:-1:-1;8919:2360:37;;;;;:::i;:::-;;:::i;2441:144:23:-;;;;;;;;;;-1:-1:-1;1313:22:23;2570:8;2441:144;;-1:-1:-1;;;;;2570:8:23;;;7899:51:50;;7887:2;7872:18;2441:144:23;7753:203:50;12140:433:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;13949:96::-;;;;;;;;;;-1:-1:-1;14024:7:37;:14;13949:96;;1819:58:25;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1819:58:25;;;;;;;;;;;;:::i;6862:563:37:-;;;;;;;;;;;;;:::i;11760:115::-;;;;;;;;;;-1:-1:-1;11760:115:37;;;;;:::i;:::-;;:::i;:::-;;;9183:14:50;;9176:22;9158:41;;9146:2;9131:18;11760:115:37;9018:187:50;13096:847:37;;;;;;;;;;-1:-1:-1;13096:847:37;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;11407:109::-;;;;;;;;;;-1:-1:-1;11493:16:37;;11407:109;;3405:215:23;;;;;;;;;;-1:-1:-1;3405:215:23;;;;;:::i;:::-;;:::i;12579:412:37:-;;;;;;;;;;;;;:::i;11881:253::-;11940:16;;:::i;:::-;11973:27;11995:4;11973:21;:27::i;:::-;11968:90;;12023:24;;-1:-1:-1;;;12023:24:37;;;;;;;;;;;11968:90;12075:52;;;;;;;;-1:-1:-1;;;;;12075:52:37;;;;;-1:-1:-1;12104:21:37;;;12075:52;12104:21;;;;;;;12075:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;12075:52:37;;;;-1:-1:-1;;;12075:52:37;;12068:59;11881:253;-1:-1:-1;;11881:253:37:o;8737:176::-;2334:13:23;:11;:13::i;:::-;8820:9:37::1;8815:92;8835:17:::0;;::::1;8815:92;;;8873:23;8886:6;;8893:1;8886:9;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;8873:12;:23::i;:::-;8854:3;;8815:92;;;;8737:176:::0;;:::o;8652:79::-;8694:30;8702:10;8714:9;:7;:9::i;:::-;8694:30;;;-1:-1:-1;;;;;11035:32:50;;;11017:51;;11104:32;;;;11099:2;11084:18;;11077:60;10990:18;8694:30:37;;;;;;;8652:79::o;4875:1019::-;2334:13:23;:11;:13::i;:::-;4959:7:37::1;:14:::0;:18;4955:76:::1;;5000:20;;-1:-1:-1::0;;;5000:20:37::1;;;;;;;;;;;4955:76;5046:32;5068:9;5046:21;:32::i;:::-;5041:95;;5101:24;;-1:-1:-1::0;;;5101:24:37::1;;;;;;;;;;;5041:95;-1:-1:-1::0;;;;;5171:14:37;;::::1;5146:22;5171:14:::0;;;:7:::1;:14;::::0;;;;5199:19;;5171:14;;5199:19:::1;:33:::0;5195:85:::1;;5255:14;;-1:-1:-1::0;;;5255:14:37::1;;;;;;;;;;;5195:85;5307:88;::::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;5307:88:37;;::::1;::::0;;5344:13;;::::1;::::0;::::1;5307:88;::::0;;::::1;::::0;;;-1:-1:-1;5307:88:37;;;;;;;;;;;;5290:14;;;:7:::1;:14:::0;;;;;;;:105;;;;;;::::1;-1:-1:-1::0;;;;;;5290:105:37;;::::1;;::::0;;;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;;;::::1;::::0;;;5410:11:::1;::::0;::::1;5406:252;;5451:11;:19:::0;;-1:-1:-1;;;;;5451:19:37;::::1;-1:-1:-1::0;;;;;;5451:19:37;;::::1;::::0;::::1;::::0;;;5484:11:::1;:19:::0;;;;::::1;::::0;;::::1;::::0;;5406:252:::1;;;5542:11;::::0;;-1:-1:-1;;;;;5542:11:37;;::::1;5534:20;::::0;;;:7:::1;:20;::::0;;;;;:25:::1;;:33:::0;;;;::::1;-1:-1:-1::0;;;;;;5534:33:37;;::::1;::::0;::::1;::::0;;;5603:11;;5581:14;;;;;;;:19:::1;;:33:::0;;;::::1;5603:11:::0;;;::::1;5581:33:::0;;;::::1;::::0;;;5628:19;;::::1;;::::0;;5406:252:::1;5667:12;:14:::0;;;:12:::1;:14;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;5730:26:37;;::::1;5692:35;5730:26:::0;;;::::1;::::0;;;;;;5766:25:::1;::::0;::::1;:42:::0;;5730:26;;5795:13;::::1;;::::0;5766:25;;:42:::1;::::0;5795:13;;5766:42:::1;:::i;:::-;::::0;;;-1:-1:-1;;5818:30:37;;5847:1:::1;::::0;5818:13;;:25:::1;::::0;:30:::1;::::0;5847:1;;5818:30:::1;:::i;:::-;::::0;;;-1:-1:-1;;5864:23:37::1;::::0;;-1:-1:-1;;;;;11035:32:50;;;11017:51;;11104:32;;11099:2;11084:18;;11077:60;5864:23:37::1;::::0;10990:18:50;5864:23:37::1;;;;;;;4945:949;;4875:1019:::0;;:::o;14051:531::-;14134:14;2334:13:23;:11;:13::i;:::-;14205:7:37::1;:14:::0;14176:5;;14195:24;::::1;14191:163;;-1:-1:-1::0;14243:1:37::1;14191:163;;;14282:7;:14:::0;14265::::1;14274:5:::0;14265:6;:14:::1;:::i;:::-;:31;14261:93;;;14320:7;:14:::0;:23:::1;::::0;14337:6;;14320:23:::1;:::i;:::-;14312:31;;14261:93;14364:21;14400:5;-1:-1:-1::0;;;;;14388:18:37::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;14388:18:37::1;;;;;;;;;;;;;;;-1:-1:-1::0;14364:42:37;-1:-1:-1;14421:9:37::1;14416:136;14440:5;14436:1;:9;14416:136;;;14478:63;;;;;;;;14501:1;14492:6;:10;;;;:::i;:::-;:14;::::0;14505:1:::1;14492:14;:::i;:::-;14478:63:::0;;::::1;;14520:7;14528:10;14537:1:::0;14528:6;:10:::1;:::i;:::-;14520:19;;;;;;;;:::i;:::-;;;;;;;;14478:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;;::::1;::::0;::::1;::::0;;::::1;::::0;;-1:-1:-1;;;;;14478:63:37::1;::::0;;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;::::1;;;;;;;;;;::::0;14466:6:::1;14473:1;14466:9;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:75;14447:3:::1;;14416:136;;;-1:-1:-1::0;14569:6:37;-1:-1:-1;;2357:1:23::1;14051:531:37::0;;;;:::o;4161:214:25:-;2655:13;:11;:13::i;:::-;4276:36:::1;4294:17;4276;:36::i;:::-;4322:46;4344:17;4363:4;4322:21;:46::i;:::-;4161:214:::0;;:::o;3708:134::-;3777:7;2926:20;:18;:20::i;:::-;-1:-1:-1;;;;;;;;;;;;3708:134:25;:::o;6502:354:37:-;6580:33;6602:10;6580:21;:33::i;:::-;6575:96;;6636:24;;-1:-1:-1;;;6636:24:37;;;;;;;;;;;6575:96;6681:44;6712:12;;6681:30;:44::i;:::-;6752:10;6736:15;:27;;;;;;;;;;:40;;:55;6779:12;;6736:40;:55;:::i;:::-;;6807:42;6824:10;6836:12;;6807:42;;;;;;;;:::i;:::-;;;;;;;;6502:354;;:::o;5900:596::-;5993:10;5979:25;;;;:13;:25;;;;;;;;5975:91;;;6027:28;;-1:-1:-1;;;6027:28:37;;;;;;;;;;;5975:91;6076:44;6107:12;;6076:30;:44::i;:::-;6131:30;6176:94;;;;;;;;6204:1;6176:94;;;;6220:1;6176:94;;;;6235:5;6176:94;;;;;;6256:12;;6176:94;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6176:94:37;;;;-1:-1:-1;;6281:16:37;:18;;6131:139;;-1:-1:-1;6281:16:37;-1:-1:-1;6281:18:37;;;:::i;:::-;;;;-1:-1:-1;;6323:10:37;6309:25;;;;6337:4;6309:25;;;;;;;;:32;;-1:-1:-1;;6309:32:37;;;;;;;;6351:27;;;;;;;:39;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:27;:39;;;;;;;;:::i;:::-;-1:-1:-1;;6400:11:37;:28;;;;;;;-1:-1:-1;6400:28:37;;;;;;;;-1:-1:-1;;;;;;6400:28:37;6417:10;6400:28;;;;;;6444:45;;;;-1:-1:-1;6444:45:37;;6417:10;6476:12;;;;6444:45;:::i;:::-;;;;;;;;5965:531;5900:596;;:::o;7431:1215::-;7483:27;7505:4;7483:21;:27::i;:::-;7478:90;;7533:24;;-1:-1:-1;;;7533:24:37;;;;;;;;;;;7478:90;-1:-1:-1;;;;;7616:21:37;;7578:35;7616:21;;;;;;;;;;7651:24;;;;;;7647:85;;;7698:23;;-1:-1:-1;;;7698:23:37;;;;;;;;;;;7647:85;7746:13;:26;;:33;;;;;:::i;:::-;;;7783:1;7746:38;7742:110;;7807:34;;-1:-1:-1;;;7807:34:37;;;;;;;;;;;7742:110;7891:10;7862:18;7883:19;;;:7;:19;;;;;7916:15;;-1:-1:-1;;;;;7916:23:37;;;:15;;:23;7912:80;;7962:19;;-1:-1:-1;;;7962:19:37;;;;;;;;;;;7912:80;8006:15;;-1:-1:-1;;;;;8006:15:37;:29;8002:69;;8051:9;:7;:9::i;:::-;;8002:69;8103:88;;;;;;;;-1:-1:-1;;;;;8103:88:37;;;;;8135:10;:18;;8103:88;;;;;;;-1:-1:-1;8103:88:37;;;;;;;;;;;;8081:19;;;:7;:19;;;;;;;:110;;;;;;;-1:-1:-1;;;;;;8081:110:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8206:11;;;8202:277;;8247:11;:24;;8261:10;-1:-1:-1;;;;;;8247:24:37;;;;;;;;8285:11;:24;;;;;;;;;;8202:277;;;8348:11;;;-1:-1:-1;;;;;8348:11:37;;;8340:20;;;;:7;:20;;;;;;:25;;:38;;-1:-1:-1;;;;;;8340:38:37;;;8368:10;8340:38;;;;;;8419:11;;8392:19;;;;;;;:24;;:38;;;;8419:11;;;;8392:38;;;;;;;8444:24;;;;;;8202:277;8488:12;:14;;;:12;:14;;;:::i;:::-;;;;;;8542:10;-1:-1:-1;;;;;8542:18:37;;8513:13;:25;;;:47;;;;;;;:::i;:::-;;;;-1:-1:-1;;8570:30:37;;8599:1;;8570:13;;:25;;:30;;8599:1;;8570:30;:::i;:::-;;;;-1:-1:-1;;8616:23:37;;;8622:10;11017:51:50;;-1:-1:-1;;;;;11104:32:50;;11099:2;11084:18;;11077:60;8616:23:37;;10990:18:50;8616:23:37;10843:300:50;3155:101:23;2334:13;:11;:13::i;:::-;3219:30:::1;3246:1;3219:18;:30::i;:::-;3155:101::o:0;3885:984:37:-;2334:13:23;:11;:13::i;:::-;4000:7:37::1;:14:::0;:18;3996:76:::1;;4041:20;;-1:-1:-1::0;;;4041:20:37::1;;;;;;;;;;;3996:76;-1:-1:-1::0;;;;;4086:19:37;::::1;;::::0;;;:13:::1;:19;::::0;;;;;::::1;;4082:85;;;4128:28;;-1:-1:-1::0;;;4128:28:37::1;;;;;;;;;;;4082:85;4181:14;:39;4206:12;;4196:23;;;;;;;:::i;:::-;;::::0;;;;;::::1;::::0;;;4181:39;;::::1;::::0;::::1;::::0;;;;;-1:-1:-1;4181:39:37;;::::1;;4177:102;;;4243:25;;-1:-1:-1::0;;;4243:25:37::1;;;;;;;;;;;4177:102;4341:24:::0;;4337:99:::1;;4381:44;4412:12;;4381:30;:44::i;:::-;4446:30;4491:99;;;;;;;;4519:1;4491:99;;;;4535:1;4491:99;;;;4550:10;4491:99;;;;;;4576:12;;4491:99;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;4491:99:37;;;;-1:-1:-1;;4601:16:37::1;:18:::0;;4446:144;;-1:-1:-1;4601:16:37;-1:-1:-1;4601:18:37::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;;;;;;4629:19:37;::::1;;::::0;;;4651:4:::1;4629:19;::::0;;;;;;;:26;;-1:-1:-1;;4629:26:37;;::::1;::::0;::::1;::::0;;;4665:21;;;;;;;:33;;;;;;::::1;::::0;;;::::1;::::0;;;;;;::::1;::::0;::::1;::::0;::::1;::::0;;;;::::1;::::0;::::1;;;::::0;;;::::1;::::0;::::1;::::0;;;:21;:33:::1;::::0;::::1;::::0;::::1;::::0;;::::1;:::i;:::-;-1:-1:-1::0;;4708:11:37::1;:22:::0;;::::1;::::0;::::1;::::0;;-1:-1:-1;4708:22:37;;;;;::::1;::::0;;-1:-1:-1;;;;;;4708:22:37::1;-1:-1:-1::0;;;;;4708:22:37;::::1;;::::0;;-1:-1:-1;4741:67:37;::::1;;;4771:24;:26:::0;;;:24:::1;:26;::::0;::::1;:::i;:::-;;;;;;4741:67;4823:39;4843:4;4849:12;;4823:39;;;;;;;;:::i;:::-;;;;;;;;3986:883;3885:984:::0;;;;:::o;3634:112::-;8870:21:24;4302:15;;-1:-1:-1;;;4302:15:24;;;;4301:16;;-1:-1:-1;;;;;4348:14:24;4158:30;4726:16;;:34;;;;;4746:14;4726:34;4706:54;;4770:17;4790:11;-1:-1:-1;;;;;4790:16:24;4805:1;4790:16;:50;;;;-1:-1:-1;4818:4:24;4810:25;:30;4790:50;4770:70;;4856:12;4855:13;:30;;;;;4873:12;4872:13;4855:30;4851:91;;;4908:23;;-1:-1:-1;;;4908:23:24;;;;;;;;;;;4851:91;4951:18;;-1:-1:-1;;4951:18:24;4968:1;4951:18;;;4979:67;;;;5013:22;;-1:-1:-1;;;;5013:22:24;-1:-1:-1;;;5013:22:24;;;4979:67;3685:26:37::1;3700:10;3685:14;:26::i;:::-;3738:1;3721:14;:18:::0;5066:101:24;;;;5100:23;;-1:-1:-1;;;;5100:23:24;;;5142:14;;-1:-1:-1;15919:50:50;;5142:14:24;;15907:2:50;15892:18;5142:14:24;15766:209:50;5066:101:24;4092:1081;;;;;3634:112:37:o;8919:2360::-;2334:13:23;:11;:13::i;:::-;8996:1:37::1;:6;;9001:1;8996:6:::0;8992:63:::1;;9025:19;;-1:-1:-1::0;;;9025:19:37::1;;;;;;;;;;;8992:63;9065:18;::::0;::::1;:14;:18:::0;9094:21:::1;9103:11;9094:8;:21::i;:::-;9125:25;:23;:25::i;:::-;9161:21;:34:::0;;-1:-1:-1;;;;;;9161:34:37::1;::::0;;9255:24:::1;::::0;9236:16:::1;::::0;9193:1:::1;::::0;9223:57:::1;::::0;::::1;::::0;::::1;::::0;9193:1;;9236:43:::1;::::0;9255:24;9236:43:::1;:::i;:::-;9223:6;:57::i;:::-;9205:76;;9296:3;:8;;9303:1;9296:8:::0;9292:66:::1;;9327:20;;-1:-1:-1::0;;;9327:20:37::1;;;;;;;;;;;9292:66;9373:9;9368:936;9392:11;:18:::0;9388:22;::::1;9368:936;;;9431:12;9446:11;9458:1;9446:14;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;9446:14:37::1;9504:21:::0;;;;;;;;;;;9544:15:::1;::::0;::::1;::::0;9446:14;;-1:-1:-1;9504:21:37;9544:15:::1;;::::0;:48:::1;;;9563:4;:17;;:24;;;;;:::i;:::-;:29:::0;;-1:-1:-1;9544:48:37::1;9540:95;;;9612:8;;;;9540:95;9653:21;::::0;-1:-1:-1;;;;;9653:21:37::1;9649:172;;-1:-1:-1::0;9708:21:37::1;:28:::0;;-1:-1:-1;;;;;;9708:28:37::1;-1:-1:-1::0;;;;;9708:28:37;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;9754:22:37::1;:26:::0;9798:8:::1;;9649:172;9864:3;9839:28;;:22;;:28;9835:120;;;9887:27;9904:4;9910:3;9887:16;:27::i;:::-;9932:8;;;;9835:120;10018:21;::::0;-1:-1:-1;;;;;10018:21:37;;::::1;9969:30;10002:38:::0;;;::::1;::::0;;;;;;;;10108:35;;;;::::1;::::0;;;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;10018:21;10108:35;::::1;::::0;;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;;;;::::0;;;;;;;::::1;::::0;::::1;::::0;;10002:38;;10076:143:::1;::::0;10108:35;;;::::1;::::0;;;10137:4;;10108:35;;;;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;10108:35:37;;;;-1:-1:-1;;;10108:35:37;;10145:56:::1;::::0;;;;::::1;::::0;;10162:21:::1;::::0;-1:-1:-1;;;;;10162:21:37::1;10145:56:::0;;;;::::1;::::0;::::1;::::0;;;;;;10162:21;10145:56;::::1;::::0;::::1;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;::::1;;;;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;10191:8;;10145:56;;;;::::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;::::0;10076:10:::1;:143::i;:::-;10055:239;;;10252:27;10269:4;10275:3;10252:16;:27::i;:::-;9417:887;;;9368:936;9412:3;;9368:936;;;;10318:22;;10344:1;10318:27:::0;10314:85:::1;;10368:20;;-1:-1:-1::0;;;10368:20:37::1;;;;;;;;;;;10314:85;10505:21;::::0;10583:22:::1;::::0;-1:-1:-1;;;;;10505:21:37;;::::1;::::0;10490:12:::1;::::0;-1:-1:-1;;;;;10569:37:37;::::1;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;10569:37:37::1;-1:-1:-1::0;10536:70:37;-1:-1:-1;10622:9:37::1;10617:148;10641:22;;10637:1;:26;10617:148;;;10703:4;10684:13;10698:1;10684:16;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;10684:23:37;;::::1;:16;::::0;;::::1;::::0;;;;;;:23;;;;10728:26;;::::1;;::::0;;;:20:::1;:26:::0;;;;;;;;;;::::1;::::0;;10665:3:::1;10617:148;;;;10774:26;10786:13;10774:11;:26::i;:::-;10886:7;:14:::0;;::::1;::::0;::::1;::::0;;10853:30:::1;10886:14:::0;;;;::::1;::::0;10910:24:::1;::::0;10917:17:::1;::::0;10910:24:::1;:::i;:::-;10978:14;;-1:-1:-1::0;;;;;10964:29:37::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;-1:-1:-1;10964:29:37::1;-1:-1:-1::0;10944:49:37;;::::1;::::0;:17:::1;::::0;:49:::1;::::0;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;11009:9:37::1;11004:269;11028:14;;11024:1;:18;11004:269;;;11063:12;11078:13;11096:22;;11092:1;:26;;;;:::i;:::-;11078:41;;;;;;;;:::i;:::-;;;;;;;11063:56;;11156:4;11133:17;11151:1;11133:20;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;:27:::0;;-1:-1:-1;;;;;11133:27:37;;::::1;-1:-1:-1::0;;;;;;11133:27:37;;::::1;;::::0;;;11185:76:::1;::::0;;;;::::1;::::0;;;;::::1;::::0;;;11226:21;;;;;;;11133:27;11226:33;;::::1;::::0;11185:76;;::::1;::::0;;;11174:88;;;;::::1;::::0;;;;;;;;;;;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;::::1;::::0;::::1;;::::0;;;;;::::1;::::0;11044:3:::1;11004:269;;;;8982:2297;;;;8919:2360:::0;:::o;12140:433::-;12268:17;:24;12194:18;;12224:25;;-1:-1:-1;;;;;12252:41:37;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;12224:69:37;-1:-1:-1;12308:9:37;12303:240;12327:17;:24;12323:28;;12303:240;;;12372:12;12387:17;12405:1;12387:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;12387:20:37;12450:21;;;;;;;;;;;12497:35;;;;;;;;;;;;;;;;;;;;;12387:20;12497:35;;;;;;;;;;;;;;;;;;;;;;;;;;;12387:20;;-1:-1:-1;12450:21:37;;12497:35;;;;;;;12450:21;;12497:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12485:6;12492:1;12485:9;;;;;;;;:::i;:::-;;;;;;;;;;:47;-1:-1:-1;;12353:3:37;;12303:240;;;-1:-1:-1;12560:6:37;12140:433;-1:-1:-1;12140:433:37:o;6862:563::-;6913:33;6935:10;6913:21;:33::i;:::-;6908:94;;6969:22;;-1:-1:-1;;;6969:22:37;;;;;;;;;;;6908:94;7062:10;7012:31;7046:27;;;;;;;;;;7087:20;;;;;;7083:84;;;7130:26;;-1:-1:-1;;;7130:26:37;;;;;;;;;;;7083:84;7228:14;;7200:24;;7181:16;;:43;;;;:::i;:::-;:61;7177:120;;7265:21;;-1:-1:-1;;;7265:21:37;;;;;;;;;;;7177:120;7307:20;;;:27;;-1:-1:-1;;7307:27:37;7330:4;7307:27;;;;;;7344:24;:29;;7307:20;;7344:29;;7330:4;;7344:29;:::i;:::-;;;;-1:-1:-1;;7389:29:37;;7407:10;7899:51:50;;7389:29:37;;7887:2:50;7872:18;7389:29:37;;;;;;;6898:527;6862:563::o;11760:115::-;-1:-1:-1;;;;;11849:19:37;11826:4;11849:19;;;:13;:19;;;;;;;;;11760:115::o;13096:847::-;13176:19;2334:13:23;:11;:13::i;:::-;13207:26:37::1;13253:30;13260:5;13267:1;13270:12;;13253:6;:30::i;:::-;-1:-1:-1::0;;;;;13236:48:37::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;13236:48:37::1;;;;;;;;;;;;;;;-1:-1:-1::0;13310:11:37::1;::::0;13207:77;;-1:-1:-1;;;;;;13310:11:37;;::::1;::::0;13336:18;::::1;::::0;13332:74:::1;;-1:-1:-1::0;;;;;;13377:13:37;;::::1;;::::0;;;:7:::1;:13;::::0;;;;:18:::1;;::::0;::::1;13332:74;13416:9;13439:211;-1:-1:-1::0;;;;;13446:18:37;::::1;::::0;;::::1;::::0;:31:::1;;;13472:5;13468:1;:9;13446:31;13439:211;;;-1:-1:-1::0;;;;;13514:13:37;;::::1;13493:18;13514:13:::0;;;:7:::1;:13;::::0;;;;;;;;13555:53;;;;::::1;::::0;;;;;;13591:15;;;;::::1;13555:53:::0;;::::1;::::0;;;;13514:13;13541:6;13548:3;::::1;::::0;::::1;:::i;:::-;;;13541:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:67;13629:10:::1;;::::0;-1:-1:-1;;;;;13629:10:37::1;::::0;-1:-1:-1;13439:211:37::1;;;13681:1;13664:6;:13;:18:::0;13660:62:::1;;13705:6;13698:13;;;;;;;13660:62;13780:25;13825:1;-1:-1:-1::0;;;;;13808:19:37::1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;;;;;;;;;;;;;13808:19:37::1;;;;;;;;;;;;;;;-1:-1:-1::0;13780:47:37;-1:-1:-1;13842:9:37::1;13837:77;13861:1;13857;:5;13837:77;;;13894:6;13901:1;13894:9;;;;;;;;:::i;:::-;;;;;;;13883:5;13889:1;13883:8;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;:20;13864:3:::1;;13837:77;;;-1:-1:-1::0;13931:5:37;13096:847;-1:-1:-1;;;;;;13096:847:37:o;3405:215:23:-;2334:13;:11;:13::i;:::-;-1:-1:-1;;;;;3489:22:23;::::1;3485:91;;3534:31;::::0;-1:-1:-1;;;3534:31:23;;3562:1:::1;3534:31;::::0;::::1;7899:51:50::0;7872:18;;3534:31:23::1;;;;;;;;3485:91;3585:28;3604:8;3585:18;:28::i;:::-;3405:215:::0;:::o;12579:412:37:-;12704:11;:18;12630;;12660:25;;-1:-1:-1;;;;;12688:35:37;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;12660:63:37;-1:-1:-1;12738:9:37;12733:228;12757:11;:18;12753:22;;12733:228;;;12796:12;12811:11;12823:1;12811:14;;;;;;;;:::i;:::-;;;;;;;;;;;;;-1:-1:-1;;;;;12811:14:37;12868:21;;;;;;;;;;;12915:35;;;;;;;;;;;;;;;;;;;;;12811:14;12915:35;;;;;;;;;;;;;;;;;;;;;;;;;;;12811:14;;-1:-1:-1;12868:21:37;;12915:35;;;;;;;12868:21;;12915:35;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12903:6;12910:1;12903:9;;;;;;;;:::i;:::-;;;;;;;;;;:47;-1:-1:-1;;12777:3:37;;12733:228;;2658:162:23;966:10:26;2717:7:23;1313:22;2570:8;-1:-1:-1;;;;;2570:8:23;;2441:144;2717:7;-1:-1:-1;;;;;2717:23:23;;2713:101;;2763:40;;-1:-1:-1;;;2763:40:23;;966:10:26;2763:40:23;;;7899:51:50;7872:18;;2763:40:23;7753:203:50;18813:506:37;-1:-1:-1;;;;;18889:13:37;;;18868:18;18889:13;;;:7;:13;;;;;18916:15;;18889:13;;18916:15;18912:66;;18961:7;18813:506;:::o;18912:66::-;19011:13;;;;-1:-1:-1;;;;;19054:12:37;;;19039:27;;19035:239;;;19130:27;19145:12;-1:-1:-1;;;;;19130:12:37;;;:27;:::i;:::-;19098:15;;-1:-1:-1;;;;;19098:15:37;19082;:32;;;;;;;;;;19098:15;19082:44;:75;;:44;;:15;:75;;;;;:::i;:::-;;;;-1:-1:-1;19035:239:37;;-1:-1:-1;19035:239:37;;19236:27;-1:-1:-1;;;;;19251:12:37;;;19236;:27;:::i;:::-;19204:15;;-1:-1:-1;;;;;19204:15:37;19188;:32;;;;;;;;;;19204:15;19188:44;:75;;:44;;:15;:75;;;;;:::i;:::-;;;;-1:-1:-1;;19035:239:37;-1:-1:-1;;;;;;19300:12:37;;;;19284:13;;;;:28;18813:506::o;17760:1047::-;17845:10;17797:7;17837:19;;;:7;:19;;;;;17870:15;;-1:-1:-1;;;;;17870:15:37;17866:80;;17922:13;;-1:-1:-1;;;17922:13:37;;;;;;;;;;;17866:80;17975:11;;17960;;-1:-1:-1;;;;;17975:11:37;;;17960;;:26;17956:528;;18002:11;:24;;-1:-1:-1;;;;;;18002:24:37;;;;;;18040:11;:24;;;;;;;17956:528;;;18085:11;;18100:10;-1:-1:-1;;;;;18085:11:37;;;:25;18081:403;;18134:10;;;;;-1:-1:-1;;;;;18134:10:37;;;18161:1;18126:19;;;:7;:19;;;;;:24;;:37;;-1:-1:-1;;;;;;18126:37:37;;;;;;18191:10;;18177:11;:24;;;;;18191:10;;18177:24;;;18081:403;;;18222:11;;18237:10;-1:-1:-1;;;;;18222:11:37;;;:25;18218:266;;18271:11;;-1:-1:-1;;;;;18271:11:37;;;18299:1;18263:20;;;:7;:20;;;;;;:25;;:38;;-1:-1:-1;;;;;;18263:38:37;;;;;;18337:11;;;;;;18329:20;;;;;;:25;;;18315:39;;18329:25;;18315:39;;;;;;18218:266;;;18412:10;;;;;;18393;;;;;;-1:-1:-1;;;;;18393:10:37;;;18412;18385:19;;;:7;:19;;;;;;:24;;;:37;;18412:10;;;-1:-1:-1;;;;;;18385:37:37;;;;;;18463:10;;18444;;;;18436:19;;;;;:24;:37;;18463:10;;;;18436:37;;;;;18218:266;18518:15;;-1:-1:-1;;;;;18518:15:37;18494:21;18582:32;;;;;;;;;;18518:15;18654:13;;;;18625:25;;;:42;;18582:32;;18654:13;;18625:25;;18494:21;18625:42;;18654:13;;18625:42;:::i;:::-;;;;-1:-1:-1;;18677:30:37;;18706:1;;18677:13;;:25;;:30;;18706:1;;18677:30;:::i;:::-;;;;-1:-1:-1;;18733:10:37;18725:19;;;;:7;:19;;;;;18718:26;;-1:-1:-1;;;;;;18718:26:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18755:12;:14;;;;;;:::i;:::-;;;;-1:-1:-1;18787:13:37;;17760:1047;-1:-1:-1;;;;17760:1047:37:o;4603:312:25:-;4683:4;-1:-1:-1;;;;;4692:6:25;4675:23;;;:120;;;4789:6;-1:-1:-1;;;;;4753:42:25;:32;-1:-1:-1;;;;;;;;;;;1519:53:30;-1:-1:-1;;;;;1519:53:30;;1441:138;4753:32:25;-1:-1:-1;;;;;4753:42:25;;;4675:120;4658:251;;;4869:29;;-1:-1:-1;;;4869:29:25;;;;;;;;;;;3769:84:37;2334:13:23;:11;:13::i;6057:538:25:-;6174:17;-1:-1:-1;;;;;6156:50:25;;:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6156:52:25;;;;;;;;-1:-1:-1;;6156:52:25;;;;;;;;;;;;:::i;:::-;;;6152:437;;6518:60;;-1:-1:-1;;;6518:60:25;;-1:-1:-1;;;;;7917:32:50;;6518:60:25;;;7899:51:50;7872:18;;6518:60:25;7753:203:50;6152:437:25;-1:-1:-1;;;;;;;;;;;6250:40:25;;6246:120;;6317:34;;-1:-1:-1;;;6317:34:25;;;;;160:25:50;;;133:18;;6317:34:25;14:177:50;6246:120:25;6379:54;6409:17;6428:4;6379:29;:54::i;5032:213::-;5106:4;-1:-1:-1;;;;;5115:6:25;5098:23;;5094:145;;5199:29;;-1:-1:-1;;;5199:29:25;;;;;;;;;;;19325:348:37;19413:24;19450:12;;19440:23;;;;;;;:::i;:::-;;;;;;;;;;;19477:32;;;;:14;:32;;;;;;;19440:23;;-1:-1:-1;19477:32:37;;19473:95;;;19532:25;;-1:-1:-1;;;19532:25:37;;;;;;;;;;;19473:95;19578:38;19603:12;;19578:24;:38::i;:::-;19627:32;;;;:14;:32;;;;;:39;;-1:-1:-1;;19627:39:37;19662:4;19627:39;;;-1:-1:-1;;19325:348:37:o;3774:248:23:-;1313:22;3923:8;;-1:-1:-1;;;;;;3941:19:23;;-1:-1:-1;;;;;3941:19:23;;;;;;;;3975:40;;3923:8;;;;;3975:40;;3847:24;;3975:40;3837:185;;3774:248;:::o;1847:127::-;6931:20:24;:18;:20::i;:::-;1929:38:23::1;1954:12;1929:24;:38::i;14614:502:37:-:0;14688:12;;14676:9;14714:6;;;14710:43;;14736:7;14614:502;:::o;14710:43::-;14768:9;14780:5;14784:1;14780;:5;:::i;:::-;14768:17;;14763:347;14787:5;;14763:347;;14875:9;14947:5;:1;14951;14947:5;:::i;:::-;14905:36;;;14922:15;14905:36;;;16681:19:50;16716:12;;;16709:28;;;16753:12;;14905:36:37;;;;;;;;;;;;14895:47;;;;;;14887:56;;:66;;;;:::i;:::-;14875:78;;15014:12;15029:5;15035:1;15029:8;;;;;;;;:::i;:::-;;;;;;;;;;;15062;;-1:-1:-1;;;;;15029:8:37;;;;-1:-1:-1;15062:5:37;;15068:1;;15062:8;;;;;;:::i;:::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;15062:8:37;15051:5;15057:1;15051:8;;;;;;;;:::i;:::-;;;;;;;;;:19;;;;;-1:-1:-1;;;;;15051:19:37;;;;;-1:-1:-1;;;;;15051:19:37;;;;;;15095:4;15084:5;15090:1;15084:8;;;;;;;;:::i;:::-;;;;;;;;;:15;;;;;-1:-1:-1;;;;;15084:15:37;;;;;-1:-1:-1;;;;;15084:15:37;;;;;;14799:311;;14794:3;;;;;:::i;:::-;;;;14763:347;;15637:317;15706:21;;-1:-1:-1;;;;;15706:21:37;15738:174;-1:-1:-1;;;;;15745:18:37;;;15738:174;;-1:-1:-1;;;;;15822:29:37;;;15779:15;15822:29;;;:20;:29;;;;;;;-1:-1:-1;;;;;;15865:36:37;;;;;15822:29;15738:174;;;-1:-1:-1;15946:1:37;15921:22;:26;15637:317::o;20216:337::-;20296:7;20325:3;20319;:9;20315:69;;;20351:22;;-1:-1:-1;;;20351:22:37;;;;;16950:25:50;;;16991:18;;;16984:34;;;16923:18;;20351:22:37;16776:248:50;20315:69:37;20406:3;20398:5;:11;20394:153;;;-1:-1:-1;20432:3:37;20425:10;;20394:153;20464:3;20456:5;:11;20452:95;;;-1:-1:-1;20490:3:37;20483:10;;20452:95;-1:-1:-1;20531:5:37;20452:95;20216:337;;;;;:::o;15960:1391::-;-1:-1:-1;;;;;16058:21:37;;16030:25;16058:21;;;;;;;;;;;16030:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;16030:49:37;;;;-1:-1:-1;;16135:86:37;;;;;;;;16152:21;;-1:-1:-1;;;;;16152:21:37;16135:86;;;-1:-1:-1;16181:38:37;;;16135:86;16181:38;;;;;;;16135:86;;;;;;;;;;;16152:21;16135:86;;;;;;;;;;;;;;;;;;;;;;;;;;;16030:49;;-1:-1:-1;16107:181:37;;16135:86;;-1:-1:-1;16135:86:37;;;;;16181:38;;16135:86;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16239:35;;;;;;;;16256:4;-1:-1:-1;;;;;16239:35:37;;;;;16268:4;16239:35;;;16107:10;:181::i;:::-;16090:984;;;16313:17;16325:4;16313:11;:17::i;:::-;16090:984;;;16400:21;;-1:-1:-1;;;;;16400:21:37;;;16361:15;16379:43;;;:20;:43;;;;;;;;;;16491:573;-1:-1:-1;;;;;16526:21:37;;16522:123;;16571:28;16584:8;16594:4;16571:12;:28::i;:::-;16621:5;;16522:123;16724:58;;;;;;;;-1:-1:-1;;;;;16724:58:37;;;;;-1:-1:-1;16756:24:37;;;16724:58;16756:24;;;;;;;16724:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16688:153;;16724:58;;;;;16756:24;16724:58;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16784:35;;;;;;;;16801:4;-1:-1:-1;;;;;16784:35:37;;;;;16813:4;16784:35;;;16688:10;:153::i;:::-;16663:293;;;16882:28;16895:8;16905:4;16882:12;:28::i;16663:293::-;-1:-1:-1;;;;;;17020:29:37;;;;;;;:20;:29;;;;;;;;16491:573;;;16347:727;;16090:984;17113:3;17088:28;;:22;;:28;17084:261;;;17168:21;;;-1:-1:-1;;;;;17168:21:37;;;17132:12;17147:43;;;:20;:43;;;;;;;-1:-1:-1;;;;;;17204:50:37;;;;;;17268:28;;17147:43;;17268:28;;;;;;;17310:22;:24;;17147:43;;17310:24;;;:::i;:::-;;;;;;17118:227;16020:1331;15960:1391;;:::o;19883:327::-;19984:4;20035:10;:15;;;:27;;;20004:10;:15;;;:27;;;:58;20000:129;;-1:-1:-1;20103:15:37;;20085;;-1:-1:-1;;;;;20085:33:37;;;;;;20078:40;;20000:129;-1:-1:-1;20176:15:37;;;;;:27;;;20146:15;;;;:27;;:57;;19883:327::o;15122:509::-;15203:12;;15191:9;15229:6;;;15225:43;;15251:7;15122:509;:::o;15225:43::-;15283:9;15295:5;15299:1;15295;:5;:::i;:::-;15283:17;;15278:347;15302:5;;15278:347;;15390:9;15462:5;:1;15466;15462:5;:::i;:::-;15420:36;;;15437:15;15420:36;;;16681:19:50;16716:12;;;16709:28;;;16753:12;;15420:36:37;;;;;;;;;;;;15410:47;;;;;;15402:56;;:66;;;;:::i;:::-;15390:78;;15529:12;15544:5;15550:1;15544:8;;;;;;;;:::i;:::-;;;;;;;15529:23;;15577:5;15583:1;15577:8;;;;;;;;:::i;:::-;;;;;;;15566:5;15572:1;15566:8;;;;;;;;:::i;:::-;;;;;;:19;-1:-1:-1;;;;;15566:19:37;;;-1:-1:-1;;;;;15566:19:37;;;;;15610:4;15599:5;15605:1;15599:8;;;;;;;;:::i;:::-;;;;;;:15;-1:-1:-1;;;;;15599:15:37;;;-1:-1:-1;;;;;15599:15:37;;;;;15314:311;;15309:3;;;;;:::i;:::-;;;;15278:347;;2264:344:30;2355:37;2374:17;2355:18;:37::i;:::-;2407:36;;-1:-1:-1;;;;;2407:36:30;;;;;;;;2458:11;;:15;2454:148;;2489:53;2518:17;2537:4;2489:28;:53::i;2454:148::-;2573:18;:16;:18::i;19710:167:37:-;19818:2;19798:22;;19794:77;;19843:17;;-1:-1:-1;;;19843:17:37;;;;;;;;;;;7084:141:24;8870:21;8560:40;-1:-1:-1;;;8560:40:24;;;;7146:73;;7191:17;;-1:-1:-1;;;7191:17:24;;;;;;;;;;;1980:235:23;6931:20:24;:18;:20::i;17357:183:37:-;17440:21;;;-1:-1:-1;;;;;17411:26:37;;;17440:21;17411:26;;;:20;:26;;;;;:50;;17440:21;;;;-1:-1:-1;;;;;;17411:50:37;;;;;;;17471:28;;;;;;;;;17509:22;:24;;;;;;:::i;:::-;;;;;;17357:183;:::o;17546:208::-;-1:-1:-1;;;;;17644:26:37;;;;;;;:20;:26;;;;;;;;17615;;;;;;;;;:55;;17644:26;;;;-1:-1:-1;;;;;;17615:55:37;;;;;;;17680:26;;;:33;;;;;;;;;;17723:22;:24;;;;;;:::i;:::-;;;;;;17546:208;;:::o;1671:281:30:-;1748:17;-1:-1:-1;;;;;1748:29:30;;1781:1;1748:34;1744:119;;1805:47;;-1:-1:-1;;;1805:47:30;;-1:-1:-1;;;;;7917:32:50;;1805:47:30;;;7899:51:50;7872:18;;1805:47:30;7753:203:50;1744:119:30;-1:-1:-1;;;;;;;;;;;1872:73:30;;-1:-1:-1;;;;;;1872:73:30;-1:-1:-1;;;;;1872:73:30;;;;;;;;;;1671:281::o;3900:253:34:-;3983:12;4008;4022:23;4049:6;-1:-1:-1;;;;;4049:19:34;4069:4;4049:25;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4007:67;;;;4091:55;4118:6;4126:7;4135:10;4091:26;:55::i;:::-;4084:62;3900:253;-1:-1:-1;;;;;3900:253:34:o;6113:122:30:-;6163:9;:13;6159:70;;6199:19;;-1:-1:-1;;;6199:19:30;;;;;;;;;;;4421:582:34;4565:12;4594:7;4589:408;;4617:19;4625:10;4617:7;:19::i;:::-;4589:408;;;4841:17;;:22;:49;;;;-1:-1:-1;;;;;;4867:18:34;;;:23;4841:49;4837:119;;;4917:24;;-1:-1:-1;;;4917:24:34;;-1:-1:-1;;;;;7917:32:50;;4917:24:34;;;7899:51:50;7872:18;;4917:24:34;7753:203:50;4837:119:34;-1:-1:-1;4976:10:34;4969:17;;5543:487;5674:17;;:21;5670:354;;5871:10;5865:17;5927:15;5914:10;5910:2;5906:19;5899:44;5670:354;5994:19;;-1:-1:-1;;;5994:19:34;;;;;;;;;;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;196:173:50;264:20;;-1:-1:-1;;;;;313:31:50;;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:250::-;650:1;660:113;674:6;671:1;668:13;660:113;;;750:11;;;744:18;731:11;;;724:39;696:2;689:10;660:113;;;-1:-1:-1;;807:1:50;789:16;;782:27;565:250::o;820:270::-;861:3;899:5;893:12;926:6;921:3;914:19;942:76;1011:6;1004:4;999:3;995:14;988:4;981:5;977:16;942:76;:::i;:::-;1072:2;1051:15;-1:-1:-1;;1047:29:50;1038:39;;;;1079:4;1034:50;;820:270;-1:-1:-1;;820:270:50:o;1095:566::-;1212:1;1208;1203:3;1199:11;1195:19;1187:5;1181:12;1177:38;1172:3;1165:51;1147:3;1262:4;1255:5;1251:16;1245:23;1300:4;1293;1288:3;1284:14;1277:28;1343:12;1337:19;1330:4;1325:3;1321:14;1314:43;1411:4;1397:12;1393:23;1387:30;1382:2;1377:3;1373:12;1366:52;1488:4;1474:12;1470:23;1464:30;1457:38;1450:46;1443:4;1438:3;1434:14;1427:70;1552:2;1538:12;1534:21;1528:28;1506:50;;1587:4;1581:3;1576;1572:13;1565:27;1608:47;1650:3;1645;1641:13;1625:14;1608:47;:::i;:::-;1601:54;1095:566;-1:-1:-1;;;;1095:566:50:o;1666:266::-;1851:2;1840:9;1833:21;1814:4;1871:55;1922:2;1911:9;1907:18;1899:6;1871:55;:::i;1937:610::-;2023:6;2031;2084:2;2072:9;2063:7;2059:23;2055:32;2052:52;;;2100:1;2097;2090:12;2052:52;2140:9;2127:23;-1:-1:-1;;;;;2165:6:50;2162:30;2159:50;;;2205:1;2202;2195:12;2159:50;2228:22;;2281:4;2273:13;;2269:27;-1:-1:-1;2259:55:50;;2310:1;2307;2300:12;2259:55;2350:2;2337:16;-1:-1:-1;;;;;2368:6:50;2365:30;2362:50;;;2408:1;2405;2398:12;2362:50;2461:7;2456:2;2446:6;2443:1;2439:14;2435:2;2431:23;2427:32;2424:45;2421:65;;;2482:1;2479;2472:12;2421:65;2513:2;2505:11;;;;;2535:6;;-1:-1:-1;1937:610:50;-1:-1:-1;;;1937:610:50:o;2552:260::-;2620:6;2628;2681:2;2669:9;2660:7;2656:23;2652:32;2649:52;;;2697:1;2694;2687:12;2649:52;2720:29;2739:9;2720:29;:::i;:::-;2710:39;;2768:38;2802:2;2791:9;2787:18;2768:38;:::i;:::-;2758:48;;2552:260;;;;;:::o;2817:346::-;2885:6;2893;2946:2;2934:9;2925:7;2921:23;2917:32;2914:52;;;2962:1;2959;2952:12;2914:52;-1:-1:-1;;3007:23:50;;;3127:2;3112:18;;;3099:32;;-1:-1:-1;2817:346:50:o;3168:1554::-;3358:4;3406:2;3395:9;3391:18;3436:2;3425:9;3418:21;3459:6;3494;3488:13;3525:6;3517;3510:22;3563:2;3552:9;3548:18;3541:25;;3625:2;3615:6;3612:1;3608:14;3597:9;3593:30;3589:39;3575:53;;3663:2;3655:6;3651:15;3684:1;3694:999;3708:6;3705:1;3702:13;3694:999;;;3773:22;;;-1:-1:-1;;3769:36:50;3757:49;;3829:13;;3912:9;;3897:25;;3969:2;3961:11;;;3955:18;3881:2;3993:15;;;3986:27;;;4074:19;;3869:15;;;4106:24;;;4196:21;;;-1:-1:-1;;4164:2:50;4152:15;;;4255:330;4271:8;4266:3;4263:17;4255:330;;;4344:15;;4394:9;;-1:-1:-1;;;;;4390:35:50;4376:50;;4480:2;4472:11;;;4466:18;4450:14;;;4443:42;4554:17;;;;4422:1;4290:11;;;;;4522:2;4511:14;;;;4255:330;;;-1:-1:-1;4608:5:50;-1:-1:-1;;;4648:2:50;4671:12;;;;4636:15;;;;;3730:1;3723:9;3694:999;;;-1:-1:-1;4710:6:50;;3168:1554;-1:-1:-1;;;;;;3168:1554:50:o;4727:127::-;4788:10;4783:3;4779:20;4776:1;4769:31;4819:4;4816:1;4809:15;4843:4;4840:1;4833:15;4859:1018;4936:6;4944;4997:2;4985:9;4976:7;4972:23;4968:32;4965:52;;;5013:1;5010;5003:12;4965:52;5036:29;5055:9;5036:29;:::i;:::-;5026:39;;5116:2;5105:9;5101:18;5088:32;-1:-1:-1;;;;;5135:6:50;5132:30;5129:50;;;5175:1;5172;5165:12;5129:50;5198:22;;5251:4;5243:13;;5239:27;-1:-1:-1;5229:55:50;;5280:1;5277;5270:12;5229:55;5320:2;5307:16;-1:-1:-1;;;;;5338:6:50;5335:30;5332:56;;;5368:18;;:::i;:::-;5417:2;5411:9;5509:2;5471:17;;-1:-1:-1;;5467:31:50;;;5500:2;5463:40;5459:54;5447:67;;-1:-1:-1;;;;;5529:34:50;;5565:22;;;5526:62;5523:88;;;5591:18;;:::i;:::-;5627:2;5620:22;5651;;;5692:15;;;5709:2;5688:24;5685:37;-1:-1:-1;5682:57:50;;;5735:1;5732;5725:12;5682:57;5791:6;5786:2;5782;5778:11;5773:2;5765:6;5761:15;5748:50;5844:1;5839:2;5830:6;5822;5818:19;5814:28;5807:39;5865:6;5855:16;;;;;4859:1018;;;;;:::o;6064:347::-;6115:8;6125:6;6179:3;6172:4;6164:6;6160:17;6156:27;6146:55;;6197:1;6194;6187:12;6146:55;-1:-1:-1;6220:20:50;;-1:-1:-1;;;;;6252:30:50;;6249:50;;;6295:1;6292;6285:12;6249:50;6332:4;6324:6;6320:17;6308:29;;6384:3;6377:4;6368:6;6360;6356:19;6352:30;6349:39;6346:59;;;6401:1;6398;6391:12;6346:59;6064:347;;;;;:::o;6416:409::-;6486:6;6494;6547:2;6535:9;6526:7;6522:23;6518:32;6515:52;;;6563:1;6560;6553:12;6515:52;6603:9;6590:23;-1:-1:-1;;;;;6628:6:50;6625:30;6622:50;;;6668:1;6665;6658:12;6622:50;6707:58;6757:7;6748:6;6737:9;6733:22;6707:58;:::i;:::-;6784:8;;6681:84;;-1:-1:-1;6416:409:50;-1:-1:-1;;;;6416:409:50:o;6830:644::-;6915:6;6923;6931;6939;6992:2;6980:9;6971:7;6967:23;6963:32;6960:52;;;7008:1;7005;6998:12;6960:52;7031:29;7050:9;7031:29;:::i;:::-;7021:39;;7111:2;7100:9;7096:18;7083:32;-1:-1:-1;;;;;7130:6:50;7127:30;7124:50;;;7170:1;7167;7160:12;7124:50;7209:58;7259:7;7250:6;7239:9;7235:22;7209:58;:::i;:::-;7286:8;;-1:-1:-1;7183:84:50;-1:-1:-1;;7371:2:50;7356:18;;7343:32;7411:13;;7404:21;7394:32;;7384:60;;7440:1;7437;7430:12;7384:60;6830:644;;;;-1:-1:-1;6830:644:50;;-1:-1:-1;;6830:644:50:o;7479:269::-;7536:6;7589:2;7577:9;7568:7;7564:23;7560:32;7557:52;;;7605:1;7602;7595:12;7557:52;7644:9;7631:23;7694:4;7687:5;7683:16;7676:5;7673:27;7663:55;;7714:1;7711;7704:12;7961:828;8159:4;8207:2;8196:9;8192:18;8237:2;8226:9;8219:21;8260:6;8295;8289:13;8326:6;8318;8311:22;8364:2;8353:9;8349:18;8342:25;;8426:2;8416:6;8413:1;8409:14;8398:9;8394:30;8390:39;8376:53;;8464:2;8456:6;8452:15;8485:1;8495:265;8509:6;8506:1;8503:13;8495:265;;;8602:2;8598:7;8586:9;8578:6;8574:22;8570:36;8565:3;8558:49;8630:50;8673:6;8664;8658:13;8630:50;:::i;:::-;8620:60;-1:-1:-1;8715:2:50;8738:12;;;;8703:15;;;;;8531:1;8524:9;8495:265;;8794:219;8943:2;8932:9;8925:21;8906:4;8963:44;9003:2;8992:9;8988:18;8980:6;8963:44;:::i;9210:300::-;9278:6;9286;9339:2;9327:9;9318:7;9314:23;9310:32;9307:52;;;9355:1;9352;9345:12;9307:52;9378:29;9397:9;9378:29;:::i;:::-;9368:39;9476:2;9461:18;;;;9448:32;;-1:-1:-1;;;9210:300:50:o;9515:806::-;9763:2;9775:21;;;9845:13;;9748:18;;;9867:22;;;9715:4;;9946:15;;;9920:2;9905:18;;;9715:4;9989:306;10003:6;10000:1;9997:13;9989:306;;;10062:13;;10104:9;;-1:-1:-1;;;;;10100:35:50;;;10088:48;;10188:2;10180:11;;;10174:18;10170:44;10156:12;;;10149:66;10270:15;;;;10244:2;10235:12;;;;10132:1;10018:9;9989:306;;;-1:-1:-1;10312:3:50;;9515:806;-1:-1:-1;;;;;9515:806:50:o;10326:380::-;10405:1;10401:12;;;;10448;;;10469:61;;10523:4;10515:6;10511:17;10501:27;;10469:61;10576:2;10568:6;10565:14;10545:18;10542:38;10539:161;;10622:10;10617:3;10613:20;10610:1;10603:31;10657:4;10654:1;10647:15;10685:4;10682:1;10675:15;10711:127;10772:10;10767:3;10763:20;10760:1;10753:31;10803:4;10800:1;10793:15;10827:4;10824:1;10817:15;11148:127;11209:10;11204:3;11200:20;11197:1;11190:31;11240:4;11237:1;11230:15;11264:4;11261:1;11254:15;11280:135;11319:3;11340:17;;;11337:43;;11360:18;;:::i;:::-;-1:-1:-1;11407:1:50;11396:13;;11280:135::o;11420:125::-;11485:9;;;11506:10;;;11503:36;;;11519:18;;:::i;11550:128::-;11617:9;;;11638:11;;;11635:37;;;11652:18;;:::i;11808:517::-;11909:2;11904:3;11901:11;11898:421;;;11945:5;11942:1;11935:16;11989:4;11986:1;11976:18;12059:2;12047:10;12043:19;12040:1;12036:27;12030:4;12026:38;12095:4;12083:10;12080:20;12077:47;;;-1:-1:-1;12118:4:50;12077:47;12173:2;12168:3;12164:12;12161:1;12157:20;12151:4;12147:31;12137:41;;12228:81;12246:2;12239:5;12236:13;12228:81;;;12305:1;12291:16;;12272:1;12261:13;12228:81;;12501:1194;-1:-1:-1;;;;;12618:3:50;12615:27;12612:53;;;12645:18;;:::i;:::-;12674:93;12763:3;12723:38;12755:4;12749:11;12723:38;:::i;:::-;12717:4;12674:93;:::i;:::-;12793:1;12818:2;12813:3;12810:11;12835:1;12830:607;;;;13481:1;13498:3;13495:93;;;-1:-1:-1;13554:19:50;;;13541:33;13495:93;-1:-1:-1;;12458:1:50;12454:11;;;12450:24;12446:29;12436:40;12482:1;12478:11;;;12433:57;13601:78;;12803:886;;12830:607;11755:1;11748:14;;;11792:4;11779:18;;-1:-1:-1;;12866:17:50;;;12980:229;12994:7;12991:1;12988:14;12980:229;;;13083:19;;;13070:33;13055:49;;13190:4;13175:20;;;;13143:1;13131:14;;;;13010:12;12980:229;;;12984:3;13237;13228:7;13225:16;13222:159;;;13361:1;13357:6;13351:3;13345;13342:1;13338:11;13334:21;13330:34;13326:39;13313:9;13308:3;13304:19;13291:33;13287:79;13279:6;13272:95;13222:159;;;13424:1;13418:3;13415:1;13411:11;13407:19;13401:4;13394:33;12803:886;;12501:1194;;;:::o;13700:485::-;-1:-1:-1;;;;;13885:32:50;;13867:51;;13954:2;13949;13934:18;;13927:30;;;13973:18;;13966:34;;;13993:6;14042;14037:2;14022:18;;14009:48;14106:1;14077:22;;;14101:2;14073:31;;;14066:42;;;;14169:2;14148:15;;;-1:-1:-1;;14144:29:50;14129:45;14125:54;;13700:485;-1:-1:-1;;13700:485:50:o;14190:1295::-;14314:3;14308:10;-1:-1:-1;;;;;14333:6:50;14330:30;14327:56;;;14363:18;;:::i;:::-;14392:96;14481:6;14441:38;14473:4;14467:11;14441:38;:::i;:::-;14435:4;14392:96;:::i;:::-;14537:4;14568:2;14557:14;;14585:1;14580:648;;;;15272:1;15289:6;15286:89;;;-1:-1:-1;15341:19:50;;;15335:26;15286:89;-1:-1:-1;;12458:1:50;12454:11;;;12450:24;12446:29;12436:40;12482:1;12478:11;;;12433:57;15388:81;;14550:929;;14580:648;11755:1;11748:14;;;11792:4;11779:18;;-1:-1:-1;;14616:20:50;;;14733:222;14747:7;14744:1;14741:14;14733:222;;;14829:19;;;14823:26;14808:42;;14936:4;14921:20;;;;14889:1;14877:14;;;;14763:12;14733:222;;;14737:3;14983:6;14974:7;14971:19;14968:201;;;15044:19;;;15038:26;-1:-1:-1;;15127:1:50;15123:14;;;15139:3;15119:24;15115:37;15111:42;15096:58;15081:74;;14968:201;-1:-1:-1;;;;15215:1:50;15199:14;;;15195:22;15182:36;;-1:-1:-1;14190:1295:50:o;15490:271::-;15673:6;15665;15660:3;15647:33;15629:3;15699:16;;15724:13;;;15699:16;15490:271;-1:-1:-1;15490:271:50:o;15980:209::-;16012:1;16038;16028:132;;16082:10;16077:3;16073:20;16070:1;16063:31;16117:4;16114:1;16107:15;16145:4;16142:1;16135:15;16028:132;-1:-1:-1;16174:9:50;;15980:209::o;16194:136::-;16233:3;16261:5;16251:39;;16270:18;;:::i;:::-;-1:-1:-1;;;16306:18:50;;16194:136::o;16335:184::-;16405:6;16458:2;16446:9;16437:7;16433:23;16429:32;16426:52;;;16474:1;16471;16464:12;16426:52;-1:-1:-1;16497:16:50;;16335:184;-1:-1:-1;16335:184:50:o;17029:287::-;17158:3;17196:6;17190:13;17212:66;17271:6;17266:3;17259:4;17251:6;17247:17;17212:66;:::i;:::-;17294:16;;;;;17029:287;-1:-1:-1;;17029:287:50:o", - "linkReferences": {}, - "immutableReferences": { - "40567": [ - { "start": 8808, "length": 32 }, - { "start": 8849, "length": 32 }, - { "start": 9168, "length": 32 } - ] - } - }, - "methodIdentifiers": { - "UPGRADE_INTERFACE_VERSION()": "ad3cb1cc", - "activeValidatorsCount()": "0d2bd909", - "addValidator(address,bytes,bool)": "7c8a92c3", - "addVote(address,address)": "3d09c2a8", - "calculateActiveValidators(uint8)": "857861db", - "getActiveValidators()": "9de70258", - "getAllValidators()": "f3513a37", - "getRounds(uint256,uint256)": "40f74f47", - "getRoundsCount()": "a09686c4", - "getValidator(address)": "1904bb2e", - "getVotes(address,uint256)": "eb9019d4", - "getVotesCount()": "1b605b86", - "initialize()": "8129fc1c", - "isValidatorRegistered(address)": "d04a68c7", - "owner()": "8da5cb5b", - "proxiableUUID()": "52d1902d", - "registerValidator(bytes)": "602a9eee", - "registeredValidatorsCount()": "f1bd0b37", - "renounceOwnership()": "715018a6", - "resignValidator()": "b85f5da2", - "resignedValidatorsCount()": "0777cbef", - "transferOwnership(address)": "f2fde38b", - "unvote()": "3174b689", - "updateValidator(bytes)": "5a8eed73", - "updateVoters(address[])": "2bdf6d43", - "upgradeToAndCall(address,bytes)": "4f1ef286", - "version()": "54fd4d50", - "vote(address)": "6dd7d8ea" - }, - "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\":\"InvalidInitialization\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidParameters\",\"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\":\"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\":\"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\":\"voter\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"validator\",\"type\":\"address\"}],\"name\":\"addVote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint8\",\"name\":\"n\",\"type\":\"uint8\"}],\"name\":\"calculateActiveValidators\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActiveValidators\",\"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\":\"blsPublicKey\",\"type\":\"bytes\"}],\"internalType\":\"struct ConsensusV1.ValidatorData\",\"name\":\"data\",\"type\":\"tuple\"}],\"internalType\":\"struct ConsensusV1.Validator[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"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\":\"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\":\"votersCount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"voteBalance\",\"type\":\"uint256\"},{\"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\":[],\"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\"}],\"name\":\"registerValidator\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registeredValidatorsCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"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\":[{\"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\"}],\"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\":\"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/\",\":ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/\",\":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/\",\":solidity-stringutils/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/\"]},\"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\":\"0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609\",\"dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM\"]},\"lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol\":{\"keccak256\":\"0xf72d3b11f41fccbbdcacd121f994daab8267ccfceb1fb4f247e4ba274c169d27\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://1e46ee40ddc9e2009176ce5d76aa2c046fd68f2ed52d02d77db191365b7c5b2e\",\"dweb:/ipfs/QmZnxgPmCCHosdvbh4J65uTaFYeGtZGzQ1sXRdeh1y68Zr\"]},\"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\":\"0x911c3346ee26afe188f3b9dc267ef62a7ccf940aba1afa963e3922f0ca3d8a06\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://04539f4419e44a831807d7203375d2bc6a733da256efd02e51290f5d5015218c\",\"dweb:/ipfs/QmPZ97gsAAgaMRPiE2WJfkzRsudQnW5tPAvMgGj1jcTJtR\"]},\"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\":\"0x9d8da059267bac779a2dbbb9a26c2acf00ca83085e105d62d5d4ef96054a47f5\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://c78e2aa4313323cecd1ef12a8d6265b96beee1a199923abf55d9a2a9e291ad23\",\"dweb:/ipfs/QmUTs2KStXucZezzFo3EYeqYu47utu56qrF7jj1Gue65vb\"]},\"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/ConsensusV1.sol\":{\"keccak256\":\"0xf46c47adfacce9f204df2223af8b3cde47b9fdcaa372d67fdd739cb6ec096733\",\"license\":\"GNU GENERAL PUBLIC LICENSE\",\"urls\":[\"bzz-raw://15318c1cdb08120eab84d5d1f6fe997749e843d0b6487f8ae58eaf189dafd27e\",\"dweb:/ipfs/QmbwYcnDQBG3NwBpUHvjGWPLuNYXhPxjitowEFjQk9BVqg\"]}},\"version\":1}", - "metadata": { - "compiler": { "version": "0.8.27+commit.40a35a09" }, - "language": "Solidity", - "output": { - "abi": [ - { - "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": "InvalidInitialization" - }, - { "inputs": [], "type": "error", "name": "InvalidParameters" }, - { - "inputs": [ - { - "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": "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": "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", - "anonymous": false - }, - { - "inputs": [ - { - "internalType": "address", - "name": "implementation", - "type": "address", - "indexed": true - } - ], - "type": "event", - "name": "Upgraded", - "anonymous": false - }, - { - "inputs": [ - { - "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": "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" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "addr", - "type": "address" - }, - { - "internalType": "bytes", - "name": "blsPublicKey", - "type": "bytes" - }, - { - "internalType": "bool", - "name": "isResigned", - "type": "bool" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "addValidator" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "voter", - "type": "address" - }, - { - "internalType": "address", - "name": "validator", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "addVote" - }, - { - "inputs": [ - { - "internalType": "uint8", - "name": "n", - "type": "uint8" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "calculateActiveValidators" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "getActiveValidators", - "outputs": [ - { - "internalType": "struct ConsensusV1.Validator[]", - "name": "", - "type": "tuple[]", - "components": [ - { - "internalType": "address", - "name": "addr", - "type": "address" - }, - { - "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": "blsPublicKey", - "type": "bytes" - } - ] - } - ] - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "getAllValidators", - "outputs": [ - { - "internalType": "struct ConsensusV1.Validator[]", - "name": "", - "type": "tuple[]", - "components": [ - { - "internalType": "address", - "name": "addr", - "type": "address" - }, - { - "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": "blsPublicKey", - "type": "bytes" - } - ] - } - ] - } - ] - }, - { - "inputs": [ - { - "internalType": "uint256", - "name": "offset", - "type": "uint256" - }, - { - "internalType": "uint256", - "name": "count", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function", - "name": "getRounds", - "outputs": [ - { - "internalType": "struct ConsensusV1.Round[]", - "name": "", - "type": "tuple[]", - "components": [ - { - "internalType": "uint256", - "name": "round", - "type": "uint256" - }, - { - "internalType": "struct ConsensusV1.RoundValidator[]", - "name": "validators", - "type": "tuple[]", - "components": [ - { - "internalType": "address", - "name": "addr", - "type": "address" - }, - { - "internalType": "uint256", - "name": "voteBalance", - "type": "uint256" - } - ] - } - ] - } - ] - }, - { - "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 ConsensusV1.Validator", - "name": "", - "type": "tuple", - "components": [ - { - "internalType": "address", - "name": "addr", - "type": "address" - }, - { - "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": "blsPublicKey", - "type": "bytes" - } - ] - } - ] - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "addr", - "type": "address" - }, - { - "internalType": "uint256", - "name": "count", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function", - "name": "getVotes", - "outputs": [ - { - "internalType": "struct ConsensusV1.VoteResult[]", - "name": "", - "type": "tuple[]", - "components": [ - { - "internalType": "address", - "name": "voter", - "type": "address" - }, - { - "internalType": "address", - "name": "validator", - "type": "address" - } - ] - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "getVotesCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] - }, - { - "inputs": [], - "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" }] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "owner", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ] - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "proxiableUUID", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ] - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "blsPublicKey", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "registerValidator" - }, - { - "inputs": [], - "stateMutability": "view", - "type": "function", - "name": "registeredValidatorsCount", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ] - }, - { - "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" - } - ] - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newOwner", - "type": "address" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "transferOwnership" - }, - { - "inputs": [], - "stateMutability": "nonpayable", - "type": "function", - "name": "unvote" - }, - { - "inputs": [ - { - "internalType": "bytes", - "name": "blsPublicKey", - "type": "bytes" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "updateValidator" - }, - { - "inputs": [ - { - "internalType": "address[]", - "name": "voters", - "type": "address[]" - } - ], - "stateMutability": "nonpayable", - "type": "function", - "name": "updateVoters" - }, - { - "inputs": [ - { - "internalType": "address", - "name": "newImplementation", - "type": "address" - }, - { - "internalType": "bytes", - "name": "data", - "type": "bytes" - } - ], - "stateMutability": "payable", - "type": "function", - "name": "upgradeToAndCall" - }, - { - "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": { - "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/=lib/forge-std/src/", - "@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/", - "@openzeppelin/contracts/=lib/openzeppelin-contracts-upgradeable/lib/openzeppelin-contracts/contracts/", - "ds-test/=lib/openzeppelin-contracts-upgradeable/lib/forge-std/lib/ds-test/src/", - "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/", - "solidity-stringutils/=lib/openzeppelin-foundry-upgrades/lib/solidity-stringutils/" - ], - "optimizer": { "enabled": true, "runs": 200 }, - "metadata": { "bytecodeHash": "ipfs" }, - "compilationTarget": { - "src/consensus/ConsensusV1.sol": "ConsensusV1" - }, - "evmVersion": "shanghai", - "libraries": {} - }, - "sources": { - "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": "0x631188737069917d2f909d29ce62c4d48611d326686ba6683e26b72a23bfac0b", - "urls": [ - "bzz-raw://7a61054ae84cd6c4d04c0c4450ba1d6de41e27e0a2c4f1bcdf58f796b401c609", - "dweb:/ipfs/QmUvtdp7X1mRVyC3CsHrtPbgoqWaXHp3S1ZR24tpAQYJWM" - ], - "license": "MIT" - }, - "lib/openzeppelin-contracts-upgradeable/contracts/proxy/utils/UUPSUpgradeable.sol": { - "keccak256": "0xf72d3b11f41fccbbdcacd121f994daab8267ccfceb1fb4f247e4ba274c169d27", - "urls": [ - "bzz-raw://1e46ee40ddc9e2009176ce5d76aa2c046fd68f2ed52d02d77db191365b7c5b2e", - "dweb:/ipfs/QmZnxgPmCCHosdvbh4J65uTaFYeGtZGzQ1sXRdeh1y68Zr" - ], - "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": "0x911c3346ee26afe188f3b9dc267ef62a7ccf940aba1afa963e3922f0ca3d8a06", - "urls": [ - "bzz-raw://04539f4419e44a831807d7203375d2bc6a733da256efd02e51290f5d5015218c", - "dweb:/ipfs/QmPZ97gsAAgaMRPiE2WJfkzRsudQnW5tPAvMgGj1jcTJtR" - ], - "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": "0x9d8da059267bac779a2dbbb9a26c2acf00ca83085e105d62d5d4ef96054a47f5", - "urls": [ - "bzz-raw://c78e2aa4313323cecd1ef12a8d6265b96beee1a199923abf55d9a2a9e291ad23", - "dweb:/ipfs/QmUTs2KStXucZezzFo3EYeqYu47utu56qrF7jj1Gue65vb" - ], - "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/ConsensusV1.sol": { - "keccak256": "0xf46c47adfacce9f204df2223af8b3cde47b9fdcaa372d67fdd739cb6ec096733", - "urls": [ - "bzz-raw://15318c1cdb08120eab84d5d1f6fe997749e843d0b6487f8ae58eaf189dafd27e", - "dweb:/ipfs/QmbwYcnDQBG3NwBpUHvjGWPLuNYXhPxjitowEFjQk9BVqg" - ], - "license": "GNU GENERAL PUBLIC LICENSE" - } - }, - "version": 1 - }, - "id": 37 + "abi": [ + { + "type": "function", + "name": "UPGRADE_INTERFACE_VERSION", + "inputs": [], + "outputs": [{ "name": "", "type": "string", "internalType": "string" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "activeValidatorsCount", + "inputs": [], + "outputs": [{ "name": "", "type": "uint256", "internalType": "uint256" }], + "stateMutability": "view" + }, + { + "type": "function", + "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": "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", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct ConsensusV1.Validator[]", + "components": [ + { "name": "addr", "type": "address", "internalType": "address" }, + { + "name": "data", + "type": "tuple", + "internalType": "struct ConsensusV1.ValidatorData", + "components": [ + { "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" } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRoundValidators", + "inputs": [], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct ConsensusV1.Validator[]", + "components": [ + { "name": "addr", "type": "address", "internalType": "address" }, + { + "name": "data", + "type": "tuple", + "internalType": "struct ConsensusV1.ValidatorData", + "components": [ + { "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" } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getRounds", + "inputs": [ + { "name": "offset", "type": "uint256", "internalType": "uint256" }, + { "name": "count", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct ConsensusV1.Round[]", + "components": [ + { "name": "round", "type": "uint256", "internalType": "uint256" }, + { + "name": "validators", + "type": "tuple[]", + "internalType": "struct ConsensusV1.RoundValidator[]", + "components": [ + { "name": "addr", "type": "address", "internalType": "address" }, + { "name": "voteBalance", "type": "uint256", "internalType": "uint256" } + ] + } + ] + } + ], + "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" }], + "outputs": [ + { + "name": "", + "type": "tuple", + "internalType": "struct ConsensusV1.Validator", + "components": [ + { "name": "addr", "type": "address", "internalType": "address" }, + { + "name": "data", + "type": "tuple", + "internalType": "struct ConsensusV1.ValidatorData", + "components": [ + { "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" } + ] + } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getVotes", + "inputs": [ + { "name": "addr", "type": "address", "internalType": "address" }, + { "name": "count", "type": "uint256", "internalType": "uint256" } + ], + "outputs": [ + { + "name": "", + "type": "tuple[]", + "internalType": "struct ConsensusV1.VoteResult[]", + "components": [ + { "name": "voter", "type": "address", "internalType": "address" }, + { "name": "validator", "type": "address", "internalType": "address" } + ] + } + ], + "stateMutability": "view" + }, + { + "type": "function", + "name": "getVotesCount", + "inputs": [], + "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" }], + "outputs": [{ "name": "", "type": "bool", "internalType": "bool" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "owner", + "inputs": [], + "outputs": [{ "name": "", "type": "address", "internalType": "address" }], + "stateMutability": "view" + }, + { + "type": "function", + "name": "proxiableUUID", + "inputs": [], + "outputs": [{ "name": "", "type": "bytes32", "internalType": "bytes32" }], + "stateMutability": "view" + }, + { + "type": "function", + "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" }], + "stateMutability": "view" + }, + { + "type": "function", + "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": "blsPublicKey", "type": "bytes", "internalType": "bytes" }, + { "name": "proofOfPossession", "type": "bytes", "internalType": "bytes" } + ], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "updateVoters", + "inputs": [{ "name": "voters", "type": "address[]", "internalType": "address[]" }], + "outputs": [], + "stateMutability": "nonpayable" + }, + { + "type": "function", + "name": "upgradeToAndCall", + "inputs": [ + { "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" } + ], + "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": "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": "blsPublicKey", "type": "bytes", "indexed": false, "internalType": "bytes" } + ], + "anonymous": false + }, + { + "type": "event", + "name": "Voted", + "inputs": [ + { "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": "0x60a0604052306080523480156012575f5ffd5b5060805161424b6100395f395f81816126630152818161268c01526127cb015261424b5ff3fe6080604052600436106101d0575f3560e01c80637c8a92c3116100fd578063c5a7444911610092578063eb9019d411610062578063eb9019d414610512578063ed612f8c1461053e578063f2fde38b14610552578063f3513a3714610571575f5ffd5b8063c5a7444914610488578063d04a68c7146104a7578063ddca3f43146104d6578063e9257dc8146104f3575f5ffd5b8063a250eaf1116100cd578063a250eaf114610402578063ad3cb1cc14610423578063b84d356e14610460578063b85f5da214610474575f5ffd5b80637c8a92c31461036a5780638da5cb5b146103895780638f062626146103cf578063a09686c4146103ee575f5ffd5b80633687f24a1161017357806354fd4d501161014357806354fd4d501461030557806356db9ef1146103185780636dd7d8ea14610337578063715018a614610356575f5ffd5b80633687f24a1461029357806340f74f47146102b25780634f1ef286146102de57806352d1902d146102f1575f5ffd5b80631b605b86116101ae5780631b605b8614610237578063226f26451461024b5780632bdf6d43146102605780633174b6891461027f575f5ffd5b80630777cbef146101d45780630d2bd909146101f75780631904bb2e1461020b575b5f5ffd5b3480156101df575f5ffd5b506006545b6040519081526020015b60405180910390f35b348015610202575f5ffd5b506004546101e4565b348015610216575f5ffd5b5061022a6102253660046138a3565b610585565b6040516101ee919061397e565b348015610242575f5ffd5b50600a546101e4565b61025e6102593660046139d4565b6106c2565b005b34801561026b575f5ffd5b5061025e61027a366004613a7e565b6108ec565b34801561028a575f5ffd5b5061025e61093a565b34801561029e575f5ffd5b5061025e6102ad366004613abc565b610989565b3480156102bd575f5ffd5b506102d16102cc366004613ae2565b6109e6565b6040516101ee9190613b02565b61025e6102ec366004613bcf565b610b79565b3480156102fc575f5ffd5b506101e4610b98565b348015610310575f5ffd5b5060016101e4565b348015610323575f5ffd5b5061025e610332366004613abc565b610bb3565b348015610342575f5ffd5b5061025e6103513660046138a3565b610cca565b348015610361575f5ffd5b5061025e610f7d565b348015610375575f5ffd5b5061025e610384366004613c90565b610f90565b348015610394575f5ffd5b507f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546040516001600160a01b0390911681526020016101ee565b3480156103da575f5ffd5b5061025e6103e93660046139d4565b611214565b3480156103f9575f5ffd5b506011546101e4565b34801561040d575f5ffd5b506104166112f4565b6040516101ee9190613cf5565b34801561042e575f5ffd5b50610453604051806040016040528060058152602001640352e302e360dc1b81525081565b6040516101ee9190613d4c565b34801561046b575f5ffd5b50600e546101e4565b34801561047f575f5ffd5b5061025e6114b7565b348015610493575f5ffd5b5061025e6104a2366004613d5e565b61162c565b3480156104b2575f5ffd5b506104c66104c13660046138a3565b611bfa565b60405190151581526020016101ee565b3480156104e1575f5ffd5b506010546001600160801b03166101e4565b3480156104fe575f5ffd5b5061025e61050d366004613d7e565b611c17565b34801561051d575f5ffd5b5061053161052c366004613ddc565b611cda565b6040516101ee9190613e04565b348015610549575f5ffd5b506003546101e4565b34801561055d575f5ffd5b5061025e61056c3660046138a3565b611edb565b34801561057c575f5ffd5b50610416611f18565b61058d613795565b61059682611bfa565b6105b35760405163510b8aad60e11b815260040160405180910390fd5b6040805180820182526001600160a01b0384168082525f908152602081815290839020835160a0810185528154815260018201546001600160801b03811682850152600160801b81046001600160401b031695820195909552600160c01b90940460ff161515606085015260028101805493949285019360808401919061063990613e5e565b80601f016020809104026020016040519081016040528092919081815260200182805461066590613e5e565b80156106b05780601f10610687576101008083540402835291602001916106b0565b820191905f5260205f20905b81548152906001019060200180831161069357829003601f168201915b50505091909252505050905292915050565b6010546001600160801b031634146106ed576040516358d620b360e01b815260040160405180910390fd5b335f9081526001602052604090205460ff161561071d5760405163132e7efb60e31b815260040160405180910390fd5b610729848484846120d5565b610746576040516392536faf60e01b815260040160405180910390fd5b61075084846121e6565b5f6040518060a001604052805f8152602001346001600160801b031681526020015f6001600160401b031681526020015f1515815260200186868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920182905250939094525050338152600160208181526040808420805460ff19168417905583825292839020855181559085015191810180549386015160608701511515600160c01b0260ff60c01b196001600160401b03909216600160801b026001600160c01b03199096166001600160801b039095169490941794909417939093169190911790915560808301519293508392909150600282019061085a9082613ed4565b5050600380546001810182555f919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b031916339081179091556108aa915061225a565b7f61809fa303a3a57f4d70552f533f3e0b003173d424590cd4bb22a2afe000990c3386866040516108dd93929190613f8e565b60405180910390a15050505050565b6108f46122cd565b5f5b818110156109355761092d83838381811061091357610913613fcd565b905060200201602081019061092891906138a3565b612328565b6001016108f6565b505050565b7f6572af8bf9a0a86efb88dcc30011626a15c9c4603503aa4466a3f87a1867deef33610964612402565b604080516001600160a01b0393841681529290911660208301520160405180910390a1565b6109916122cd565b601080546001600160801b0319166001600160801b0383169081179091556040519081527f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c76906020015b60405180910390a150565b60606109f06122cd565b60115482908410610a0257505f610a26565b601154610a0f8486613ff5565b1115610a2657601154610a23908590614008565b90505b5f816001600160401b03811115610a3f57610a3f613bbb565b604051908082528060200260200182016040528015610a8457816020015b604080518082019091525f815260606020820152815260200190600190039081610a5d5790505b5090505f5b82811015610b6e5760405180604001604052808288610aa89190613ff5565b610ab3906001613ff5565b81526020016011610ac4848a613ff5565b81548110610ad457610ad4613fcd565b905f5260205f2001805480602002602001604051908101604052809291908181526020015f905b82821015610b42575f848152602090819020604080518082019091526002850290910180546001600160a01b03168252600190810154828401529083529092019101610afb565b50505050815250828281518110610b5b57610b5b613fcd565b6020908102919091010152600101610a89565b509150505b92915050565b610b81612658565b610b8a826126fc565b610b948282612704565b5050565b5f610ba16127c0565b505f5160206141f65f395f51905f5290565b5f610bbc612809565b805490915060ff600160401b82041615906001600160401b03165f81158015610be25750825b90505f826001600160401b03166001148015610bfd5750303b155b905081158015610c0b575080155b15610c295760405163f92ee8a960e01b815260040160405180910390fd5b845467ffffffffffffffff191660011785558315610c5357845460ff60401b1916600160401b1785555b610c5c33612831565b6001600f55601080546001600160801b0319166001600160801b0388161790558315610cc257845460ff60401b19168555604051600181527fc7f505b2f371ae2175ee4913f4499e1f2633a7b5936321eed1cdaeb6115181d29060200160405180910390a15b505050505050565b610cd381611bfa565b610cf05760405163510b8aad60e11b815260040160405180910390fd5b6001600160a01b0381165f9081526020819052604090206001810154600160c01b900460ff1615610d345760405163510ae2bd60e11b815260040160405180910390fd5b806002018054610d4390613e5e565b90505f03610d645760405163970c784d60e01b815260040160405180910390fd5b335f90815260076020526040902080546001600160a01b03848116911603610d9f57604051630d41c52760e01b815260040160405180910390fd5b80546001600160a01b031615610db957610db7612402565b505b604080516080810182526001600160a01b03808616825233803160208085019182525f85870181815260608701828152948252600790925295909520935184549084166001600160a01b03199182161785559051600185015593516002840180549184169186169190911790555160039092018054928216929093169190911790915560085416610e6b5760088054336001600160a01b03199182168117909255600980549091169091179055610ec2565b600980546001600160a01b039081165f9081526007602052604080822060030180546001600160a01b0319908116339081179092558554828552929093206002018054841692909416919091179092558254161790555b600a8054905f610ed18361401b565b9091555050815433319083905f90610eea908490613ff5565b909155505060018281018054601090610f14908490600160801b90046001600160401b0316614033565b82546001600160401b039182166101009390930a928302919092021990911617905550604080513381526001600160a01b03851660208201527fce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e2910160405180910390a1505050565b610f856122cd565b610f8e5f612842565b565b610f986122cd565b60115415610fb9576040516349625b3b60e01b815260040160405180910390fd5b6001600160a01b0384165f9081526001602052604090205460ff1615610ff25760405163132e7efb60e31b815260040160405180910390fd5b60025f8484604051611005929190614052565b604080519182900390912082526020820192909252015f205460ff161561103f57604051637e4c066f60e01b815260040160405180910390fd5b811561104f5761104f83836121e6565b5f6040518060a001604052805f81526020015f6001600160801b031681526020015f6001600160401b03168152602001831515815260200185858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201829052509390945250506001600160a01b0388168152600160208181526040808420805460ff19168417905583825292839020855181559085015191810180549386015160608701511515600160c01b0260ff60c01b196001600160401b03909216600160801b026001600160c01b03199096166001600160801b03909516949094179490941793909316919091179091556080830151929350839290915060028201906111629082613ed4565b5050600380546001810182555f919091527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b0180546001600160a01b0319166001600160a01b0388161790555081156111ca5760068054905f6111c48361401b565b91905055505b6111d3856128b2565b156111e1576111e18561225a565b7f61809fa303a3a57f4d70552f533f3e0b003173d424590cd4bb22a2afe000990c8585856040516108dd93929190613f8e565b61121d33611bfa565b61123a5760405163510b8aad60e11b815260040160405180910390fd5b611246848484846120d5565b611263576040516392536faf60e01b815260040160405180910390fd5b61126d84846121e6565b335f908152602081905260409020600201611289848683614061565b50611293336128b2565b80156112a557506112a3336128fb565b155b156112b3576112b33361225a565b7f4af0b5984c9f88659d661fb64dcb63a5b946809cf1c78a8c6e0f6ef93c9170323385856040516112e693929190613f8e565b60405180910390a150505050565b600c546060905f906001600160401b0381111561131357611313613bbb565b60405190808252806020026020018201604052801561134c57816020015b611339613795565b8152602001906001900390816113315790505b5090505f5b600c548110156114b1575f600c828154811061136f5761136f613fcd565b5f918252602080832091909101546001600160a01b031680835282825260409283902083518085018552828152845160a0810186528254815260018301546001600160801b03811682870152600160801b81046001600160401b031696820196909652600160c01b90950460ff1615156060860152600282018054939650919490938401929091859160808401919061140790613e5e565b80601f016020809104026020016040519081016040528092919081815260200182805461143390613e5e565b801561147e5780601f106114555761010080835404028352916020019161147e565b820191905f5260205f20905b81548152906001019060200180831161146157829003601f168201915b50505050508152505081525084848151811061149c5761149c613fcd565b60209081029190910101525050600101611351565b50919050565b6114c033611bfa565b6114dd5760405163668191af60e11b815260040160405180910390fd5b335f9081526020819052604090206001810154600160c01b900460ff161561151857604051632d8b5c9760e21b815260040160405180910390fd5b600f546004541161153c57604051633b15f1f760e21b815260040160405180910390fd5b6001818101805460ff60c01b1916600160c01b179055600680545f90611563908490613ff5565b9091555061157290503361295d565b60018101546001600160801b0316156115fc5760018101546040515f9133916001600160801b03909116908381818185875af1925050503d805f81146115d3576040519150601f19603f3d011682016040523d82523d5f602084013e6115d8565b606091505b50509050806115fa57604051633c31275160e21b815260040160405180910390fd5b505b6040513381527f24250fc1ec78a1405ddd4cc8b75964858af228d05faa8d4bc1302966d8a54117906020016109db565b6116346122cd565b8060ff165f0361165757604051630e52390960e41b815260040160405180910390fd5b60ff8116600f55611666612a6d565b61166e612c0b565b600d80546001600160a01b03191690556004545f906116939060ff8416908390612c5c565b90508060ff165f036116b8576040516367c0fced60e01b815260040160405180910390fd5b5f5b6004548110156119c5575f600482815481106116d8576116d8613fcd565b5f9182526020808320909101546001600160a01b031680835290829052604090912060018101549192509060ff600160c01b9091041680611727575080600201805461172390613e5e565b1590505b156117335750506119bd565b600d546001600160a01b031661176e5750600d80546001600160a01b0319166001600160a01b03929092169190911790556001600e556119bd565b8360ff16600e54101561178c576117858285612cae565b50506119bd565b600d546001600160a01b039081165f9081526020818152604091829020825180840184529386168452825160a0810184528554815260018601546001600160801b03811682850152600160801b81046001600160401b031694820194909452600160c01b90930460ff161515606084015260028501805491946119aa9490938401929091879160808401919061182190613e5e565b80601f016020809104026020016040519081016040528092919081815260200182805461184d90613e5e565b80156118985780601f1061186f57610100808354040283529160200191611898565b820191905f5260205f20905b81548152906001019060200180831161187b57829003601f168201915b505050919092525050509052604080518082018252600d546001600160a01b03168152815160a0810183528554815260018601546001600160801b038116602080840191909152600160801b82046001600160401b031694830194909452600160c01b900460ff161515606082015260028601805492938401928791608084019161192290613e5e565b80601f016020809104026020016040519081016040528092919081815260200182805461194e90613e5e565b80156119995780601f1061197057610100808354040283529160200191611999565b820191905f5260205f20905b81548152906001019060200180831161197c57829003601f168201915b5050505050815250508152506130f3565b156119b9576119b98386612cae565b5050505b6001016116ba565b50600e545f036119e8576040516367c0fced60e01b815260040160405180910390fd5b600d54600e546001600160a01b03909116905f906001600160401b03811115611a1357611a13613bbb565b604051908082528060200260200182016040528015611a3c578160200160208202803683370190505b5090505f5b600e54811015611a965782828281518110611a5e57611a5e613fcd565b6001600160a01b039283166020918202929092018101919091529381165f908152600b90945260409093205490921691600101611a41565b50611aa08161312f565b601180546001810182555f9182527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c680190611add90600c906137f6565b600f546001600160401b03811115611af757611af7613bbb565b604051908082528060200260200182016040528015611b20578160200160208202803683370190505b508051611b3591600c91602090910190613811565b505f5b600f54811015610cc2575f83600e5483611b52919061411a565b81518110611b6257611b62613fcd565b6020026020010151905080600c8381548110611b8057611b80613fcd565b5f918252602080832090910180546001600160a01b039485166001600160a01b0319918216179091556040805180820182529585168087528452838352832054858301908152875460018181018a558986529390942095516002909402909501805493909416921691909117825591519082015501611b38565b6001600160a01b03165f9081526001602052604090205460ff1690565b611c1f6122cd565b828114611c6b5760405162461bcd60e51b81526020600482015260156024820152740d2dce0eae840d8cadccee8d040dad2e6dac2e8c6d605b1b60448201526064015b60405180910390fd5b5f5b83811015611cd357611ccb858583818110611c8a57611c8a613fcd565b9050602002016020810190611c9f91906138a3565b848484818110611cb157611cb1613fcd565b9050602002016020810190611cc691906138a3565b613246565b600101611c6d565b5050505050565b6060611ce46122cd565b5f611cf2835f600a54612c5c565b6001600160401b03811115611d0957611d09613bbb565b604051908082528060200260200182016040528015611d4d57816020015b604080518082019091525f8082526020820152815260200190600190039081611d275790505b506008549091506001600160a01b0390811690851615611d8657506001600160a01b038085165f90815260076020526040902060030154165b5f5b6001600160a01b03821615801590611d9f57508481105b15611e14576001600160a01b038083165f818152600760209081526040918290208251808401909352928252825490931692810192909252908483611de38161401b565b945081518110611df557611df5613fcd565b6020908102919091010152600301546001600160a01b03169150611d88565b80835103611e2757829350505050610b73565b5f816001600160401b03811115611e4057611e40613bbb565b604051908082528060200260200182016040528015611e8457816020015b604080518082019091525f8082526020820152815260200190600190039081611e5e5790505b5090505f5b82811015611ed057848181518110611ea357611ea3613fcd565b6020026020010151828281518110611ebd57611ebd613fcd565b6020908102919091010152600101611e89565b509695505050505050565b611ee36122cd565b6001600160a01b038116611f0c57604051631e4fbdf760e01b81525f6004820152602401611c62565b611f1581612842565b50565b6003546060905f906001600160401b03811115611f3757611f37613bbb565b604051908082528060200260200182016040528015611f7057816020015b611f5d613795565b815260200190600190039081611f555790505b5090505f5b6003548110156114b1575f60038281548110611f9357611f93613fcd565b5f918252602080832091909101546001600160a01b031680835282825260409283902083518085018552828152845160a0810186528254815260018301546001600160801b03811682870152600160801b81046001600160401b031696820196909652600160c01b90950460ff1615156060860152600282018054939650919490938401929091859160808401919061202b90613e5e565b80601f016020809104026020016040519081016040528092919081815260200182805461205790613e5e565b80156120a25780601f10612079576101008083540402835291602001916120a2565b820191905f5260205f20905b81548152906001019060200180831161208557829003601f168201915b5050505050815250508152508484815181106120c0576120c0613fcd565b60209081029190910101525050600101611f75565b5f603084146120f757604051637db491eb60e01b815260040160405180910390fd5b6060821461211857604051637db491eb60e01b815260040160405180910390fd5b5f858585856040516020016121309493929190614139565b60405160208183030381529060405290505f5f63011812006001600160a01b03168360405161215f9190614158565b5f60405180830381855afa9150503d805f8114612197576040519150601f19603f3d011682016040523d82523d5f602084013e61219c565b606091505b50915091508115806121b057508051602014155b156121ce57604051633f48ffd960e21b815260040160405180910390fd5b6121d781614173565b60011498975050505050505050565b5f82826040516121f7929190614052565b60408051918290039091205f8181526002602052919091205490915060ff161561223457604051637e4c066f60e01b815260040160405180910390fd5b61223e83836134b2565b5f908152600260205260409020805460ff191660011790555050565b60048054600180820183555f8390527f8a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b90910180546001600160a01b0319166001600160a01b03851617905590546122b29190614008565b6001600160a01b039091165f90815260056020526040902055565b336122ff7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c199300546001600160a01b031690565b6001600160a01b031614610f8e5760405163118cdaa760e01b8152336004820152602401611c62565b6001600160a01b038082165f908152600760205260409020805490911661234d575050565b60018101546001600160a01b038316318110156123ab57612378816001600160a01b03851631614008565b82546001600160a01b03165f90815260208190526040812080549091906123a0908490613ff5565b909155506123ed9050565b6123bf6001600160a01b0384163182614008565b82546001600160a01b03165f90815260208190526040812080549091906123e7908490614008565b90915550505b506001600160a01b0390911631600190910155565b335f90815260076020526040812080546001600160a01b03166124385760405163498ea63d60e01b815260040160405180910390fd5b6009546008546001600160a01b0391821691160361247157600880546001600160a01b0319908116909155600980549091169055612584565b600954336001600160a01b03909116036124ca576002810180546001600160a01b039081165f90815260076020526040902060030180546001600160a01b03199081169091559154600980549093169116179055612584565b600854336001600160a01b039091160361252e576009546001600160a01b039081165f9081526007602052604080822060020180546001600160a01b0319908116909155600880548086168552929093206003015491169216919091179055612584565b60038181018054600280850180546001600160a01b039081165f9081526007602052604080822090970180549583166001600160a01b031996871617905591549454811682529490200180549290931691161790555b80546001600160a01b03165f81815260208190526040812060018401548154919290918391906125b5908490614008565b9091555050600181810180546010906125df908490600160801b90046001600160401b0316614196565b82546001600160401b039182166101009390930a928302919092021990911617905550335f90815260076020526040812080546001600160a01b031990811682556001820183905560028201805482169055600390910180549091169055600a80549161264b836141b5565b9091555091949350505050565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614806126de57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166126d25f5160206141f65f395f51905f52546001600160a01b031690565b6001600160a01b031614155b15610f8e5760405163703e46dd60e11b815260040160405180910390fd5b611f156122cd565b816001600160a01b03166352d1902d6040518163ffffffff1660e01b8152600401602060405180830381865afa92505050801561275e575060408051601f3d908101601f1916820190925261275b918101906141ca565b60015b61278657604051634c9c8ce360e01b81526001600160a01b0383166004820152602401611c62565b5f5160206141f65f395f51905f5281146127b657604051632a87526960e21b815260048101829052602401611c62565b61093583836134d3565b306001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610f8e5760405163703e46dd60e11b815260040160405180910390fd5b5f807ff0c57e16840df040f15088dc2f81fe391c3923bec73e23a9662efc9c229c6a00610b73565b612839613528565b611f158161354d565b7f9016d09d72d40fdae2fd8ceac6b6234c7706214fd39c1cd1e609a0528c19930080546001600160a01b031981166001600160a01b03848116918217845560405192169182907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a3505050565b6001600160a01b0381165f9081526020819052604081206001810154600160c01b900460ff161580156128f457508060020180546128ef90613e5e565b151590505b9392505050565b6001600160a01b0381165f90815260056020526040812054600454811061292457505f92915050565b826001600160a01b03166004828154811061294157612941613fcd565b5f918252602090912001546001600160a01b0316149392505050565b612966816128fb565b61296d5750565b6001600160a01b0381165f9081526005602052604081205460045490919061299790600190614008565b9050808214612a1c575f600482815481106129b4576129b4613fcd565b5f91825260209091200154600480546001600160a01b0390921692508291859081106129e2576129e2613fcd565b5f91825260208083209190910180546001600160a01b0319166001600160a01b039485161790559290911681526005909152604090208290555b6004805480612a2d57612a2d6141e1565b5f828152602080822083015f1990810180546001600160a01b03191690559092019092556001600160a01b03949094168152600590935250506040812055565b6004545f819003612a7b5750565b5f612a87600183614008565b90505b8015610b94575f612a9c826001613ff5565b60408051426020820152908101849052606001604051602081830303815290604052805190602001205f1c612ad1919061411a565b9050808203612ae05750612bf9565b5f60048381548110612af457612af4613fcd565b5f918252602082200154600480546001600160a01b0390921693509084908110612b2057612b20613fcd565b5f91825260209091200154600480546001600160a01b0390921692509084908110612b4d57612b4d613fcd565b5f91825260209091200154600480546001600160a01b039092169186908110612b7857612b78613fcd565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055508160048481548110612bb757612bb7613fcd565b5f91825260208083209190910180546001600160a01b0319166001600160a01b0394851617905593821681526005909352604080842094909455168152208190555b80612c03816141b5565b915050612a8a565b600d546001600160a01b03165b6001600160a01b03811615612c55576001600160a01b039081165f908152600b6020526040902080546001600160a01b0319811690915516612c18565b505f600e55565b5f81831115612c8857604051632457cde760e01b81526004810184905260248101839052604401611c62565b82841015612c975750816128f4565b81841115612ca65750806128f4565b509192915050565b6001600160a01b0382165f90815260208181526040808320815160a0810183528154815260018201546001600160801b03811694820194909452600160801b84046001600160401b031692810192909252600160c01b90920460ff1615156060820152600282018054919291608084019190612d2990613e5e565b80601f0160208091040260200160405190810160405280929190818152602001828054612d5590613e5e565b8015612da05780601f10612d7757610100808354040283529160200191612da0565b820191905f5260205f20905b815481529060010190602001808311612d8357829003601f168201915b505050919092525050604080518082018252600d546001600160a01b03168082525f908152602081815290839020835160a0810185528154815260018201546001600160801b03811682850152600160801b81046001600160401b031695820195909552600160c01b90940460ff1615156060850152600281018054969750612ee196939550918501939290916080840191612e3b90613e5e565b80601f0160208091040260200160405190810160405280929190818152602001828054612e6790613e5e565b8015612eb25780601f10612e8957610100808354040283529160200191612eb2565b820191905f5260205f20905b815481529060010190602001808311612e9557829003601f168201915b5050505050815250508152506040518060400160405280866001600160a01b03168152602001848152506130f3565b15612ef457612eef83613555565b613094565b600d546001600160a01b039081165f818152600b6020526040902054909116905b6001600160a01b038216612f3257612f2d81866135a6565b613091565b6040805180820182526001600160a01b0384168082525f908152602081815290839020835160a0810185528154815260018201546001600160801b03811682850152600160801b81046001600160401b031695820195909552600160c01b90940460ff1615156060850152600281018054613061959385019392916080840191612fbb90613e5e565b80601f0160208091040260200160405190810160405280929190818152602001828054612fe790613e5e565b80156130325780601f1061300957610100808354040283529160200191613032565b820191905f5260205f20905b81548152906001019060200180831161301557829003601f168201915b5050505050815250508152506040518060400160405280886001600160a01b03168152602001868152506130f3565b1561307057612f2d81866135a6565b506001600160a01b038082165f908152600b60205260409020541690612f15565b50505b8160ff16600e54111561093557600d80546001600160a01b039081165f908152600b6020526040812080546001600160a01b03198082169092558454931692168217909255600e805491926130e8836141b5565b919050555050505050565b6020808201515190830151515f91900361311f5750805182516001600160a01b03918216911610610b73565b5060209081015151910151511190565b80515f81900361313d575050565b5f613149600183614008565b90505b8015610935575f61315e826001613ff5565b60408051426020820152908101849052606001604051602081830303815290604052805190602001205f1c613193919061411a565b90505f8483815181106131a8576131a8613fcd565b602002602001015190508482815181106131c4576131c4613fcd565b60200260200101518584815181106131de576131de613fcd565b60200260200101906001600160a01b031690816001600160a01b0316815250508085838151811061321157613211613fcd565b60200260200101906001600160a01b031690816001600160a01b0316815250505050808061323e906141b5565b91505061314c565b60115415613267576040516349625b3b60e01b815260040160405180910390fd5b61327081611bfa565b61328d5760405163510b8aad60e11b815260040160405180910390fd5b6001600160a01b038083165f9081526007602052604090208054909116156132c857604051637c9a1cf960e01b815260040160405180910390fd5b604080516080810182526001600160a01b038085168252858116803160208085019182525f85870181815260608701828152948252600790925295909520935184549084166001600160a01b0319918216178555905160018501559351600284018054918416918616919091179055516003909201805492821692909316919091179091556008541661338557600880546001600160a01b0385166001600160a01b031991821681179092556009805490911690911790556133dd565b600980546001600160a01b039081165f9081526007602052604080822060030180548489166001600160a01b031991821681179092558554828552929093206002018054841692909416919091179092558254161790555b600a8054905f6133ec8361401b565b90915550506001600160a01b038083165f9081526020819052604081208054909286163191839161341e908490613ff5565b909155505060018181018054601090613448908490600160801b90046001600160401b0316614033565b92506101000a8154816001600160401b0302191690836001600160401b031602179055507fce0c7a2a940807f7dc2ce7a615c2532e915e6c0ac9a08bc4ed9d515a710a53e284846040516112e69291906001600160a01b0392831681529116602082015260400190565b60308114610b94576040516305db9dbd60e01b815260040160405180910390fd5b6134dc82613604565b6040516001600160a01b038316907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a2805115613520576109358282613667565b610b946136d9565b6135306136f8565b610f8e57604051631afcd79f60e31b815260040160405180910390fd5b611ee3613528565b600d80546001600160a01b038381165f818152600b602052604081208054939094166001600160a01b031993841617909355835490911617909155600e80549161359e8361401b565b919050555050565b6001600160a01b038281165f818152600b602052604080822080548686168085529284208054919096166001600160a01b03199182161790955592825282549093169092179055600e8054916135fb8361401b565b91905055505050565b806001600160a01b03163b5f0361363957604051634c9c8ce360e01b81526001600160a01b0382166004820152602401611c62565b5f5160206141f65f395f51905f5280546001600160a01b0319166001600160a01b0392909216919091179055565b60605f5f846001600160a01b0316846040516136839190614158565b5f60405180830381855af49150503d805f81146136bb576040519150601f19603f3d011682016040523d82523d5f602084013e6136c0565b606091505b50915091506136d0858383613711565b95945050505050565b3415610f8e5760405163b398979f60e01b815260040160405180910390fd5b5f613701612809565b54600160401b900460ff16919050565b606082613726576137218261376d565b6128f4565b815115801561373d57506001600160a01b0384163b155b1561376657604051639996b31560e01b81526001600160a01b0385166004820152602401611c62565b50806128f4565b80511561377c57805160208201fd5b60405163d6bda27560e01b815260040160405180910390fd5b60405180604001604052805f6001600160a01b031681526020016137f16040518060a001604052805f81526020015f6001600160801b031681526020015f6001600160401b031681526020015f15158152602001606081525090565b905290565b5080545f8255905f5260205f2090810190611f159190613874565b828054828255905f5260205f20908101928215613864579160200282015b8281111561386457825182546001600160a01b0319166001600160a01b0390911617825560209092019160019091019061382f565b50613870929150613874565b5090565b5b80821115613870575f8155600101613875565b80356001600160a01b038116811461389e575f5ffd5b919050565b5f602082840312156138b3575f5ffd5b6128f482613888565b5f5b838110156138d65781810151838201526020016138be565b50505f910152565b5f81518084526138f58160208601602086016138bc565b601f01601f19169290920160200192915050565b60018060a01b0381511682525f602082015160406020850152805160408501526001600160801b0360208201511660608501526001600160401b0360408201511660808501526060810151151560a08501526080810151905060a060c085015261397660e08501826138de565b949350505050565b602081525f6128f46020830184613909565b5f5f83601f8401126139a0575f5ffd5b5081356001600160401b038111156139b6575f5ffd5b6020830191508360208285010111156139cd575f5ffd5b9250929050565b5f5f5f5f604085870312156139e7575f5ffd5b84356001600160401b038111156139fc575f5ffd5b613a0887828801613990565b90955093505060208501356001600160401b03811115613a26575f5ffd5b613a3287828801613990565b95989497509550505050565b5f5f83601f840112613a4e575f5ffd5b5081356001600160401b03811115613a64575f5ffd5b6020830191508360208260051b85010111156139cd575f5ffd5b5f5f60208385031215613a8f575f5ffd5b82356001600160401b03811115613aa4575f5ffd5b613ab085828601613a3e565b90969095509350505050565b5f60208284031215613acc575f5ffd5b81356001600160801b03811681146128f4575f5ffd5b5f5f60408385031215613af3575f5ffd5b50508035926020909101359150565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015613baf57868503603f19018452815180518652602090810151604082880181905281519088018190529101905f9060608801905b80831015613b9757835180516001600160a01b03168352602090810151818401529093019260019290920191604090910190613b60565b50965050506020938401939190910190600101613b28565b50929695505050505050565b634e487b7160e01b5f52604160045260245ffd5b5f5f60408385031215613be0575f5ffd5b613be983613888565b915060208301356001600160401b03811115613c03575f5ffd5b8301601f81018513613c13575f5ffd5b80356001600160401b03811115613c2c57613c2c613bbb565b604051601f8201601f19908116603f011681016001600160401b0381118282101715613c5a57613c5a613bbb565b604052818152828201602001871015613c71575f5ffd5b816020840160208301375f602083830101528093505050509250929050565b5f5f5f5f60608587031215613ca3575f5ffd5b613cac85613888565b935060208501356001600160401b03811115613cc6575f5ffd5b613cd287828801613990565b90945092505060408501358015158114613cea575f5ffd5b939692955090935050565b5f602082016020835280845180835260408501915060408160051b8601019250602086015f5b82811015613baf57603f19878603018452613d37858351613909565b94506020938401939190910190600101613d1b565b602081525f6128f460208301846138de565b5f60208284031215613d6e575f5ffd5b813560ff811681146128f4575f5ffd5b5f5f5f5f60408587031215613d91575f5ffd5b84356001600160401b03811115613da6575f5ffd5b613db287828801613a3e565b90955093505060208501356001600160401b03811115613dd0575f5ffd5b613a3287828801613a3e565b5f5f60408385031215613ded575f5ffd5b613df683613888565b946020939093013593505050565b602080825282518282018190525f918401906040840190835b81811015613e5357835180516001600160a01b039081168552602091820151168185015290930192604090920191600101613e1d565b509095945050505050565b600181811c90821680613e7257607f821691505b6020821081036114b157634e487b7160e01b5f52602260045260245ffd5b601f82111561093557805f5260205f20601f840160051c81016020851015613eb55750805b601f840160051c820191505b81811015611cd3575f8155600101613ec1565b81516001600160401b03811115613eed57613eed613bbb565b613f0181613efb8454613e5e565b84613e90565b6020601f821160018114613f33575f8315613f1c5750848201515b5f19600385901b1c1916600184901b178455611cd3565b5f84815260208120601f198516915b82811015613f625787850151825560209485019460019092019101613f42565b5084821015613f7f57868401515f19600387901b60f8161c191681555b50505050600190811b01905550565b6001600160a01b03841681526040602082018190528101829052818360608301375f818301606090810191909152601f909201601f1916010192915050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b80820180821115610b7357610b73613fe1565b81810381811115610b7357610b73613fe1565b5f6001820161402c5761402c613fe1565b5060010190565b6001600160401b038181168382160190811115610b7357610b73613fe1565b818382375f9101908152919050565b6001600160401b0383111561407857614078613bbb565b61408c836140868354613e5e565b83613e90565b5f601f8411600181146140bd575f85156140a65750838201355b5f19600387901b1c1916600186901b178355611cd3565b5f83815260208120601f198716915b828110156140ec57868501358255602094850194600190920191016140cc565b5086821015614108575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f8261413457634e487b7160e01b5f52601260045260245ffd5b500690565b838582375f8482015f8152838582375f93019283525090949350505050565b5f82516141698184602087016138bc565b9190910192915050565b805160208083015191908110156114b1575f1960209190910360031b1b16919050565b6001600160401b038281168282160390811115610b7357610b73613fe1565b5f816141c3576141c3613fe1565b505f190190565b5f602082840312156141da575f5ffd5b5051919050565b634e487b7160e01b5f52603160045260245ffdfe360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbca2646970667358221220239ca47940153ca95050e872fcd474f2e4c0506fb5d9affc9c904a9db13f056864736f6c634300081b0033", + "sourceMap": "1684:23443:34:-:0;;;1171:4:21;1128:48;;1684:23443:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;", + "linkReferences": {} + }, + "methodIdentifiers": { + "UPGRADE_INTERFACE_VERSION()": "ad3cb1cc", + "activeValidatorsCount()": "0d2bd909", + "addValidator(address,bytes,bool)": "7c8a92c3", + "addVotes(address[],address[])": "e9257dc8", + "calculateRoundValidators(uint8)": "c5a74449", + "fee()": "ddca3f43", + "getAllValidators()": "f3513a37", + "getRoundValidators()": "a250eaf1", + "getRounds(uint256,uint256)": "40f74f47", + "getRoundsCount()": "a09686c4", + "getValidator(address)": "1904bb2e", + "getVotes(address,uint256)": "eb9019d4", + "getVotesCount()": "1b605b86", + "initialize(uint128)": "56db9ef1", + "isValidatorRegistered(address)": "d04a68c7", + "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(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\":[{\"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": [{ "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": "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", + "anonymous": false + }, + { + "inputs": [ + { "internalType": "address", "name": "implementation", "type": "address", "indexed": true } + ], + "type": "event", + "name": "Upgraded", + "anonymous": false + }, + { + "inputs": [ + { "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": "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" }] + }, + { + "inputs": [ + { "internalType": "address", "name": "addr", "type": "address" }, + { "internalType": "bytes", "name": "blsPublicKey", "type": "bytes" }, + { "internalType": "bool", "name": "isResigned", "type": "bool" } + ], + "stateMutability": "nonpayable", + "type": "function", + "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": [], + "stateMutability": "view", + "type": "function", + "name": "getAllValidators", + "outputs": [ + { + "internalType": "struct ConsensusV1.Validator[]", + "name": "", + "type": "tuple[]", + "components": [ + { "internalType": "address", "name": "addr", "type": "address" }, + { + "internalType": "struct ConsensusV1.ValidatorData", + "name": "data", + "type": "tuple", + "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" } + ] + } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getRoundValidators", + "outputs": [ + { + "internalType": "struct ConsensusV1.Validator[]", + "name": "", + "type": "tuple[]", + "components": [ + { "internalType": "address", "name": "addr", "type": "address" }, + { + "internalType": "struct ConsensusV1.ValidatorData", + "name": "data", + "type": "tuple", + "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" } + ] + } + ] + } + ] + }, + { + "inputs": [ + { "internalType": "uint256", "name": "offset", "type": "uint256" }, + { "internalType": "uint256", "name": "count", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function", + "name": "getRounds", + "outputs": [ + { + "internalType": "struct ConsensusV1.Round[]", + "name": "", + "type": "tuple[]", + "components": [ + { "internalType": "uint256", "name": "round", "type": "uint256" }, + { + "internalType": "struct ConsensusV1.RoundValidator[]", + "name": "validators", + "type": "tuple[]", + "components": [ + { "internalType": "address", "name": "addr", "type": "address" }, + { "internalType": "uint256", "name": "voteBalance", "type": "uint256" } + ] + } + ] + } + ] + }, + { + "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 ConsensusV1.Validator", + "name": "", + "type": "tuple", + "components": [ + { "internalType": "address", "name": "addr", "type": "address" }, + { + "internalType": "struct ConsensusV1.ValidatorData", + "name": "data", + "type": "tuple", + "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" } + ] + } + ] + } + ] + }, + { + "inputs": [ + { "internalType": "address", "name": "addr", "type": "address" }, + { "internalType": "uint256", "name": "count", "type": "uint256" } + ], + "stateMutability": "view", + "type": "function", + "name": "getVotes", + "outputs": [ + { + "internalType": "struct ConsensusV1.VoteResult[]", + "name": "", + "type": "tuple[]", + "components": [ + { "internalType": "address", "name": "voter", "type": "address" }, + { "internalType": "address", "name": "validator", "type": "address" } + ] + } + ] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "getVotesCount", + "outputs": [{ "internalType": "uint256", "name": "", "type": "uint256" }] + }, + { + "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" }] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "owner", + "outputs": [{ "internalType": "address", "name": "", "type": "address" }] + }, + { + "inputs": [], + "stateMutability": "view", + "type": "function", + "name": "proxiableUUID", + "outputs": [{ "internalType": "bytes32", "name": "", "type": "bytes32" }] + }, + { + "inputs": [ + { "internalType": "bytes", "name": "blsPublicKey", "type": "bytes" }, + { "internalType": "bytes", "name": "proofOfPossession", "type": "bytes" } + ], + "stateMutability": "payable", + "type": "function", + "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" }] + }, + { + "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": "setFee" + }, + { + "inputs": [{ "internalType": "address", "name": "newOwner", "type": "address" }], + "stateMutability": "nonpayable", + "type": "function", + "name": "transferOwnership" + }, + { "inputs": [], "stateMutability": "nonpayable", "type": "function", "name": "unvote" }, + { + "inputs": [ + { "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[]" }], + "stateMutability": "nonpayable", + "type": "function", + "name": "updateVoters" + }, + { + "inputs": [ + { "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": { + "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/=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/ConsensusV1.sol": "ConsensusV1" }, + "evmVersion": "shanghai", + "libraries": {} + }, + "sources": { + "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://35a52180a27c0818efa6cc80445db16c9d655a0004bfb1db599c0dc5d0588ee4", + "dweb:/ipfs/Qmd4cjwm4CWNJFihLM4sbNqSEPALoXXfsdDS3MhDzcvvGR" + ], + "license": "GNU GENERAL PUBLIC LICENSE" + } + }, + "version": 1 + }, + "id": 34 } diff --git a/src/test/java/org/arkecosystem/crypto/transactions/builder/ValidatorRegistrationBuilderTest.java b/src/test/java/org/arkecosystem/crypto/transactions/builder/ValidatorRegistrationBuilderTest.java index 92fe551..7914820 100644 --- a/src/test/java/org/arkecosystem/crypto/transactions/builder/ValidatorRegistrationBuilderTest.java +++ b/src/test/java/org/arkecosystem/crypto/transactions/builder/ValidatorRegistrationBuilderTest.java @@ -9,10 +9,14 @@ public class ValidatorRegistrationBuilderTest extends AbstractTest { + private static final String VALIDATOR_PASSPHRASE = + "gold favorite math anchor detect march purpose such sausage crucial reform novel" + + " connect misery update episode invite salute barely garbage exclude winner" + + " visa cruise"; + @Test public void it_should_sign_it_with_a_passphrase() throws Exception { Map fixture = loadFixture("validator-registration"); - Map data = (Map) fixture.get("data"); ValidatorRegistrationBuilder builder = @@ -21,25 +25,12 @@ public void it_should_sign_it_with_a_passphrase() throws Exception { .nonce(Long.parseLong(data.get("nonce").toString())) .network(((Number) data.get("network")).intValue()) .gasLimit(((Number) data.get("gasLimit")).longValue()) - .validatorPublicKey( - "a08058db53e2665c84a40f5152e76dd2b652125a6079130d4c315e728bcf4dd1dfb44ac26e82302331d61977d3141118") + .validatorPassphrase(VALIDATOR_PASSPHRASE) .recipientAddress((String) data.get("recipientAddress")) .sign(this.passphrase); - byte[] serializedBytes = builder.transaction.serialize(false); - String serializedHex = Hex.encode(serializedBytes); - - assertEquals(fixture.get("serialized"), serializedHex); + assertEquals(fixture.get("serialized"), Hex.encode(builder.transaction.serialize(false))); assertEquals(data.get("id"), builder.transaction.getId()); assertTrue(builder.verify()); } - - @Test - public void it_should_throw_on_invalid_bls_public_key() { - assertThrows( - IllegalArgumentException.class, - () -> { - new ValidatorRegistrationBuilder().validatorPublicKey("invalid-bls-key"); - }); - } } diff --git a/src/test/java/org/arkecosystem/crypto/transactions/builder/ValidatorUpdateBuilderTest.java b/src/test/java/org/arkecosystem/crypto/transactions/builder/ValidatorUpdateBuilderTest.java new file mode 100644 index 0000000..d02dd11 --- /dev/null +++ b/src/test/java/org/arkecosystem/crypto/transactions/builder/ValidatorUpdateBuilderTest.java @@ -0,0 +1,36 @@ +package org.arkecosystem.crypto.transactions.builder; + +import static org.junit.jupiter.api.Assertions.*; + +import java.util.Map; +import org.arkecosystem.crypto.AbstractTest; +import org.arkecosystem.crypto.encoding.Hex; +import org.junit.jupiter.api.Test; + +public class ValidatorUpdateBuilderTest extends AbstractTest { + + private static final String VALIDATOR_PASSPHRASE = + "gold favorite math anchor detect march purpose such sausage crucial reform novel" + + " connect misery update episode invite salute barely garbage exclude winner" + + " visa cruise"; + + @Test + public void it_should_sign_it_with_a_passphrase() throws Exception { + Map fixture = loadFixture("validator-update"); + Map data = (Map) fixture.get("data"); + + ValidatorUpdateBuilder builder = + new ValidatorUpdateBuilder() + .gasPrice(((Number) data.get("gasPrice")).longValue()) + .nonce(Long.parseLong(data.get("nonce").toString())) + .network(((Number) data.get("network")).intValue()) + .gasLimit(((Number) data.get("gasLimit")).longValue()) + .validatorPassphrase(VALIDATOR_PASSPHRASE) + .recipientAddress((String) data.get("recipientAddress")) + .sign(this.passphrase); + + assertEquals(fixture.get("serialized"), Hex.encode(builder.transaction.serialize(false))); + assertEquals(data.get("id"), builder.transaction.getId()); + assertTrue(builder.verify()); + } +} diff --git a/src/test/java/org/arkecosystem/crypto/utils/AbiBaseTest.java b/src/test/java/org/arkecosystem/crypto/utils/AbiBaseTest.java index 74d6e54..50dbe13 100644 --- a/src/test/java/org/arkecosystem/crypto/utils/AbiBaseTest.java +++ b/src/test/java/org/arkecosystem/crypto/utils/AbiBaseTest.java @@ -19,7 +19,7 @@ void method_identifiers_loads_consensus_signatures() throws Exception { assertEquals("6dd7d8ea", identifiers.get("vote(address)")); assertEquals("3174b689", identifiers.get("unvote()")); - assertEquals("602a9eee", identifiers.get("registerValidator(bytes)")); + assertEquals("226f2645", identifiers.get("registerValidator(bytes,bytes)")); } @Test diff --git a/src/test/java/org/arkecosystem/crypto/utils/AbiJsonFilesTest.java b/src/test/java/org/arkecosystem/crypto/utils/AbiJsonFilesTest.java index 6d7737a..1ac6fa7 100644 --- a/src/test/java/org/arkecosystem/crypto/utils/AbiJsonFilesTest.java +++ b/src/test/java/org/arkecosystem/crypto/utils/AbiJsonFilesTest.java @@ -92,9 +92,9 @@ void consensus_exposes_expected_method_signatures() throws Exception { assertEquals("6dd7d8ea", identifiers.get("vote(address)")); assertNotNull(identifiers.get("unvote()")); - assertNotNull(identifiers.get("registerValidator(bytes)")); + assertNotNull(identifiers.get("registerValidator(bytes,bytes)")); assertNotNull(identifiers.get("resignValidator()")); - assertNotNull(identifiers.get("updateValidator(bytes)")); + assertNotNull(identifiers.get("updateValidator(bytes,bytes)")); } @Test diff --git a/src/test/java/org/arkecosystem/crypto/utils/ProofOfPossessionTest.java b/src/test/java/org/arkecosystem/crypto/utils/ProofOfPossessionTest.java new file mode 100644 index 0000000..50123ff --- /dev/null +++ b/src/test/java/org/arkecosystem/crypto/utils/ProofOfPossessionTest.java @@ -0,0 +1,126 @@ +package org.arkecosystem.crypto.utils; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import java.io.InputStreamReader; +import java.lang.reflect.Type; +import java.util.List; +import java.util.Map; +import java.util.ArrayList; +import java.util.stream.Stream; +import org.arkecosystem.crypto.encoding.Hex; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.MethodSource; + +public class ProofOfPossessionTest { + + // Pinned vectors from typescript-crypto/tests/unit/utils/ProofOfPossession.test.ts + private static final String SK_A_HEX = + "67d53f170b908cabb9eb326c3c337762d59289a8fec79f7bc9254b584b73265c"; + private static final String SK_A_PK = + "a7e75af9dd4d868a41ad2f5a5b021d653e31084261724fb40ae2f1b1c31c778d3b9464502d599cf6720723ec5c68b59d"; + private static final String SK_A_POP = + "878ad02e1f215d40722bd77a0148adb8dfaad4514157600a0a926cfc58589fa4e79d3d4d579cc4149237b8100efdcff110dd2a251c52543539d499c8f24b142da66d1dc19ec44b3d9c3f71112b2705e5557f932a36bd9cd9b3544ab0d9e6a677"; + + private static final String PASSPHRASE_A = + "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"; + private static final String PASSPHRASE_A_PK = + "b7e5e1ea87f5be0ac7d97402a73002d302a3672f58aacb443cc5456190eac50f439f61b73556209de7624dfb535459e8"; + + private static final String PASSPHRASE_ZH = + "逻 砖 浇 动 牌 霞 扎 团 柴 年 虽 类" + + " 因 什 电 骂 后 什 帽 玻 缩 像" + + " 壮 摘"; + private static final String PASSPHRASE_ZH_SK = + "3c91a0142bdb0c777b64c74ae2a76cb110b1cdd56f2781aeb5ba7f1eac983b91"; + private static final String PASSPHRASE_ZH_PK = + "a6fab215d09829188d9fe753ae0162cb0aacfc875a2246550585205cd95e062b79585402b3ef853a8afc73a13e09065b"; + private static final String PASSPHRASE_ZH_POP = + "b2333783b03f6b0c095391c48b874a1d4e6beac5c840a5a89ef3954f94bf5519210578aa734ecbe90e90a7417eed001a01e3402e3c899183ffee6fe636a02833276b0f3bac543312804d2c9908233252e998696d6fd34df847137b48c4548b78"; + + @Test + public void buildProofOfPossessionPkMatchesPinnedVector() { + ProofOfPossession.Result result = ProofOfPossession.buildProofOfPossession(Hex.decode(SK_A_HEX)); + assertEquals(SK_A_PK, Hex.encode(result.pk)); + } + + @Test + public void buildProofOfPossessionPopMatchesPinnedVector() { + ProofOfPossession.Result result = ProofOfPossession.buildProofOfPossession(Hex.decode(SK_A_HEX)); + assertEquals(SK_A_POP, Hex.encode(result.pop)); + } + + @Test + public void fromMnemonicChineseMnemonicPkAndPop() { + ProofOfPossession.Result result = ProofOfPossession.fromMnemonic(PASSPHRASE_ZH); + assertEquals(PASSPHRASE_ZH_PK, Hex.encode(result.pk)); + assertEquals(PASSPHRASE_ZH_POP, Hex.encode(result.pop)); + } + + @Test + public void deriveBlsPublicKeyMatchesPinnedVector() { + assertEquals(PASSPHRASE_A_PK, ProofOfPossession.deriveBlsPublicKey(PASSPHRASE_A)); + } + + @Test + public void deriveBlsPrivateKeyChineseMnemonic() { + assertEquals(PASSPHRASE_ZH_SK, Hex.encode(ProofOfPossession.deriveBlsPrivateKey(PASSPHRASE_ZH))); + } + + @Test + public void deriveBlsPublicKeyChineseMnemonic() { + assertEquals(PASSPHRASE_ZH_PK, ProofOfPossession.deriveBlsPublicKey(PASSPHRASE_ZH)); + } + + @Test + public void buildProofOfPossessionChineseMnemonicPkAndPop() { + byte[] sk = ProofOfPossession.deriveBlsPrivateKey(PASSPHRASE_ZH); + ProofOfPossession.Result result = ProofOfPossession.buildProofOfPossession(sk); + assertEquals(PASSPHRASE_ZH_PK, Hex.encode(result.pk)); + assertEquals(PASSPHRASE_ZH_POP, Hex.encode(result.pop)); + } + + record BlsKeyVector(String language, int index, String mnemonic, String sk, String pk, String pop) { + @Override + public String toString() { + return language + "[" + index + "]"; + } + } + + @ParameterizedTest(name = "{0}") + @MethodSource("blsKeyVectors") + public void blsKeyVectorsMatchJsonDataset(BlsKeyVector v) { + assertEquals(v.sk(), Hex.encode(ProofOfPossession.deriveBlsPrivateKey(v.mnemonic()))); + ProofOfPossession.Result result = ProofOfPossession.fromMnemonic(v.mnemonic()); + assertEquals(v.pk(), Hex.encode(result.pk)); + assertEquals(v.pop(), Hex.encode(result.pop)); + } + + static Stream blsKeyVectors() throws Exception { + Type type = new TypeToken>>>() {}.getType(); + Map>> data; + try (InputStreamReader reader = + new InputStreamReader( + ProofOfPossessionTest.class.getResourceAsStream("/bls-keys.json"))) { + data = new Gson().fromJson(reader, type); + } + List vectors = new ArrayList<>(); + for (var entry : data.entrySet()) { + int i = 1; + for (var v : entry.getValue()) { + vectors.add(new BlsKeyVector( + entry.getKey(), + i++, + v.get("mnemonic"), + v.get("validatorPrivateKey"), + v.get("validatorPublicKey").substring(2), + v.get("validatorPop").substring(2))); + } + } + return vectors.stream(); + } + +} diff --git a/src/test/java/org/arkecosystem/crypto/utils/TransactionEncoderTest.java b/src/test/java/org/arkecosystem/crypto/utils/TransactionEncoderTest.java index 4fae508..f171182 100644 --- a/src/test/java/org/arkecosystem/crypto/utils/TransactionEncoderTest.java +++ b/src/test/java/org/arkecosystem/crypto/utils/TransactionEncoderTest.java @@ -11,6 +11,11 @@ public class TransactionEncoderTest { + private static final String VALIDATOR_PASSPHRASE = + "gold favorite math anchor detect march purpose such sausage crucial reform novel" + + " connect misery update episode invite salute barely garbage exclude winner" + + " visa cruise"; + @Test public void it_should_encode_a_vote_payload() throws Exception { String address = "0xC3bBE9B1CeE1ff85Ad72b87414B0E9B7F2366763"; @@ -32,26 +37,12 @@ public void it_should_encode_an_unvote_payload() throws Exception { @Test public void it_should_encode_a_validator_registration_payload() throws Exception { - String key = - "954f46d6097a1d314e900e66e11e0dad0a57cd03e04ec99f0dedd1c765dcb11e6d7fa02e22cf40f9ee23d9cc1c0624bd"; - - String payload = TransactionEncoder.validatorRegistration(key); + String payload = TransactionEncoder.validatorRegistration(VALIDATOR_PASSPHRASE); Map decoded = new AbiDecoder().decodeFunctionData(payload); assertEquals("registerValidator", decoded.get("functionName")); } - @Test - public void it_should_normalise_validator_public_key_prefix() { - String key = - "954f46d6097a1d314e900e66e11e0dad0a57cd03e04ec99f0dedd1c765dcb11e6d7fa02e22cf40f9ee23d9cc1c0624bd"; - - String withoutPrefix = TransactionEncoder.validatorRegistration(key); - String withPrefix = TransactionEncoder.validatorRegistration("0x" + key); - - assertEquals(withoutPrefix, withPrefix); - } - @Test public void it_should_encode_a_validator_resignation_payload() throws Exception { String payload = TransactionEncoder.validatorResignation(); @@ -61,11 +52,8 @@ public void it_should_encode_a_validator_resignation_payload() throws Exception } @Test - public void it_should_encode_an_update_validator_payload() throws Exception { - String key = - "954f46d6097a1d314e900e66e11e0dad0a57cd03e04ec99f0dedd1c765dcb11e6d7fa02e22cf40f9ee23d9cc1c0624bd"; - - String payload = TransactionEncoder.updateValidator(key); + public void it_should_encode_a_validator_update_payload() throws Exception { + String payload = TransactionEncoder.validatorUpdate(VALIDATOR_PASSPHRASE); Map decoded = new AbiDecoder().decodeFunctionData(payload); assertEquals("updateValidator", decoded.get("functionName")); diff --git a/src/test/java/org/arkecosystem/crypto/utils/TransactionTypeIdentifierTest.java b/src/test/java/org/arkecosystem/crypto/utils/TransactionTypeIdentifierTest.java index fc2f663..694ac6d 100644 --- a/src/test/java/org/arkecosystem/crypto/utils/TransactionTypeIdentifierTest.java +++ b/src/test/java/org/arkecosystem/crypto/utils/TransactionTypeIdentifierTest.java @@ -15,9 +15,9 @@ class TransactionTypeIdentifierTest { private static final String VOTE = "6dd7d8ea"; private static final String UNVOTE = "3174b689"; - private static final String REGISTER_VALIDATOR = "602a9eee"; + private static final String REGISTER_VALIDATOR = "226f2645"; private static final String RESIGN_VALIDATOR = "b85f5da2"; - private static final String UPDATE_VALIDATOR = "5a8eed73"; + private static final String UPDATE_VALIDATOR = "8f062626"; private static final String PAY = "084ce708"; private static final String REGISTER_USERNAME = "36a94134"; private static final String RESIGN_USERNAME = "ebed6dab"; diff --git a/src/test/resources/bls-keys.json b/src/test/resources/bls-keys.json new file mode 100644 index 0000000..8518da3 --- /dev/null +++ b/src/test/resources/bls-keys.json @@ -0,0 +1,322 @@ +{ + "czech": [ + { + "mnemonic": "krutost soumrak trhlina ruchadlo obloha traverza gotika seshora poloha sliznice skanzen mohyla hodovat bojovat lomcovat navzdory zalepit ucho pyramida ponechat odhodit fialka sodovka vymizet", + "validatorPrivateKey": "05c738639663e7007caf9c7fd05a35fd094a9bdc0f4df5c44fdf6b1010ecd83b", + "validatorPublicKey": "0x887d6ee1fd5b81fb842be07cc92c458f3b1466c83d9d4437ba8ae711461915f7670627120c9122ef70992a71d18e58cf", + "validatorPop": "0xa94b3d6af373fcc267b1e0d64dd4e04af441a20c537e4611eab2304175ee087b3b044c9dd793ae3bab76a22a2e5fdceb124757a607a8553d3c8ed5dd10993c806089fdef1194e5e3664880364430fd8b82579aaf947340c3c367ebbd97e123fa" + }, + { + "mnemonic": "cvaknout hejkal gril vitalita husita vzdychat obyvatel skladba husita muzeum provaz zajistit obohatit podoba trojice pytel filtr velryba expedice nadobro vymazat deficit odluka stupnice", + "validatorPrivateKey": "33122311763a233177912d8310ed79e3fb5db75a1477809cc38442a50dc23d59", + "validatorPublicKey": "0xac254fdfe31889767359090ad9ad2bd68770d0384debf775ba6844b9057e0671b02ca1f16052d450b8874930633c68ce", + "validatorPop": "0xb2f6cdef1f344cb8501c31ed71f1c4647ce367195e3e35f77d8c820f4ec7e935551b4b90b017d17d7d9304aa23e4bf60103dfb11d270e2ce66ba668a055eede53a1a0d31654d228e0ddee8305e3dbf4d4f74552e949ff090ec4c9f95617e71c2" + }, + { + "mnemonic": "tahoun doma linka nerost vyhradit zhluboka paruka roubenka vyhledat smrtka uplynout hodovat slon baletka uzdravit imunita zhltnout zvesela lichotka nahodile investor ikona lucerna katalog", + "validatorPrivateKey": "4f85e107d5dec8af96854b6afb492121be87eeccfc38384db50fd434a25a711d", + "validatorPublicKey": "0xb69c23db033f54e1acb7ef42e98f643986eaf6335eccc11cafd4b94b05c661f6b073df93fdd6d692abce91d4ff63b6da", + "validatorPop": "0xb85282490de9fa8ab158559a5877444b2e366f95e55de4f920c4f552b3ed3b405cdabe0635131718b5de042f6e9a348b131c9e2fe81e1e2c37cb8dbf8a3202e1bed9cc03267cfbd8aa5f98a2bd6cd5624d50ea252511dd7e191cb767ebb8f1f4" + }, + { + "mnemonic": "pyramida fialka odkaz frakce hezky doufat burza vidle foton mandle patrona klesnout nakonec pochod detektiv chochol sponzor kapr odpykat brzy biograf groteska mihnout otvor", + "validatorPrivateKey": "122e17048e149339525a82c7142664974ca42203ac6c7414418e32cd8fc82f64", + "validatorPublicKey": "0xa14df06f4bb8226a9c579cf643228cfac334d15010a9b274bcbe58576358c77d8c3ebce0679833bbda0399531cebd66f", + "validatorPop": "0x8a27e6375e1d07bc838dd14056bf501c955a2bc5264ca7c828950f416ec1879af732ff861342ebcf5afb161442614f890b9cffe228e997eeb0efdf944d15fd665b625c4cae67b83aeb23b6c2f6112baad57c9a470d6d759d4f399d94019dda4b" + }, + { + "mnemonic": "milost blokovat uniforma secese biograf princip idylka bilance velmoc jevit logika empatie loudal tiskopis mandle doplnit rejnok vjezd kormidlo linie internet vlasec karton pochod", + "validatorPrivateKey": "2b2dbab558963ca5938f2cf787a70502a127e3d321712fcedbf68d0e4665885b", + "validatorPublicKey": "0x9989f97279d009615299b6b14ce2b67ac24853ef02f78a466e785d7e1af9bcdc7f23533e8adf42a4e15e7f9c2b5647a0", + "validatorPop": "0x879e5c3d608f814921bba9a4cf53f35e6fcb2a098aae66e4185664f2343b02465c2c8f6aa868041af84b90aadc9c57b702158dd599283bf8d689fde926f0e9375dd90fccd14f052d12d5f9fcd4545690034db64fba4bb6d89e26de072bdf6b7d" + } + ], + "chinese_simplified": [ + { + "mnemonic": "菜 流 税 救 您 猛 糖 岸 丽 征 辞 择 石 幼 机 牙 往 荡 念 乙 贮 投 辉 堵", + "validatorPrivateKey": "631add6d0fbb16afe392e979c6b624e603e7e055818d9da0874071c89cab6621", + "validatorPublicKey": "0xa2592a3863c9e87c16df307755a3145fe29f3fea0286318f98a7f154560c7f4925593f419cc41db417a918ddac1febb6", + "validatorPop": "0x95f89451f6632363b444dfd273b1ca0c1462fbfe409b8c5df48acf675fe781e2a3da2bb60adc6d3cdcb84b52c23a240c03cbdb1982208efa91f981d8a8e79be2bcdb6fae8510f3fdc2d55f9a30cc83385a3bce5e7022aeac1e645c3601d4a79b" + }, + { + "mnemonic": "衰 轨 创 社 辉 塘 落 都 毒 栏 准 歪 相 多 众 吨 帐 健 含 劲 袁 从 洋 完", + "validatorPrivateKey": "668ffaf41d63f8f46f1362adcb5f29662c2aa51cf7b7671574cb8bbd81e186fd", + "validatorPublicKey": "0xaa89a80828a154559a59144da0a6d3fe7cf61a7c7fcc9acc0033b0cefdc83dd866a2adfc9883d74276fe4c3c8577790a", + "validatorPop": "0x80baf32a0024b39fffb05d434472ed83cffbcd540b1e21882345459e7814558ff99b374b7330231b853d06e6e26c5f3311851e755d501bea16d147dbe28ba78dbdef10c32dca37de13a1f2c6604f282ceb00527a84e91c239108fe8ee653011a" + }, + { + "mnemonic": "钠 灌 丙 浇 八 把 厘 弄 扰 纷 均 莲 并 伙 干 苦 文 炎 留 插 宾 蛋 硬 拜", + "validatorPrivateKey": "2d24632f085198597ec5864dcca5e7b11ee36561c2a05ea2eb6bd7c8a64bd793", + "validatorPublicKey": "0x99c3016c65b78a0144c2a05feee1705e4e55713b907a9bbd017cd37ccdae9206062a4198d00b8cda1acecb8edcef3fe4", + "validatorPop": "0x8c9dd70ad8ae1fd0ee5ddc6c82c3aad472f74282dbcfb846a40ba9d44536cda965a61d045bfbbb161a31721746548e980f0b4752b9348f8a45d049b211165db857157bde860490294c1a1b38969be85c5f1bb5f86f643cb077ee00a585809d06" + }, + { + "mnemonic": "像 署 摄 繁 箭 润 般 户 王 坦 凝 涉 腰 蒋 疗 奏 腔 脸 母 卿 衣 季 抛 找", + "validatorPrivateKey": "38d85857446300db50d9d5ec25559fdba4213c9d7c06be4093af0d8821d9a0ba", + "validatorPublicKey": "0xa5f9d3951767134bd611a442dbd6d9ce489c7902ff2d8a333bdcb4c90a40a3f758d3eda6d1f5b01eac1b98ce7a027726", + "validatorPop": "0xb98a53485a719226b5a7cc51f0c2f32609c5df005fc398bde6fe4dde61553a0dded382cabf736dd18c0e01fca402de75022a46941efb4e908406f6ccdfb90dfc6f19a0f3f6bdafc145a56741c4cc213b71ca859d49cc9ac43010d8902525877e" + }, + { + "mnemonic": "序 轧 侧 蛋 二 仍 恰 招 钾 概 映 除 替 疑 壤 产 捕 恐 谈 练 馆 象 氮 虾", + "validatorPrivateKey": "0341bb011bd7697244471e811eaebe341ff57865c5ec0f14d12133432f595f3d", + "validatorPublicKey": "0x8504e255155b8c2276cc59a67dedc30abd024b83e248db643faf502ee4661f49dcb1d55517bdf291e45f297efeab3ea2", + "validatorPop": "0x9272d5134eb47c1cc7e7aca3db9e75b1c0237c5a8ab822b358e00f3183a5d0c1b58e79baccae7482b5eb88eeda8bbde91076946d90e6e10f67dd3f0a06ed1dd173215b9cf40f1b30df6f037e2f96ec88b9157b6aa4141b3db39f6ae8f2d3d9ab" + } + ], + "chinese_traditional": [ + { + "mnemonic": "仁 作 杜 女 剪 輸 百 背 卿 練 多 棉 勒 法 旬 宋 考 飾 它 緊 婚 頓 表 錠", + "validatorPrivateKey": "0e7afde79d5cfb6c3595c20f7a375ab89a09aa86fa9223016045d3be7406ca82", + "validatorPublicKey": "0x8719511e638fc14df4bffaa7c46523f6a010a55c27e24152bdb8bdb8f45aa59477f6e3d6574aa160bfe07d295a1a0497", + "validatorPop": "0x8adea1a9d442d06fef7d3f4c901dd6b536a2f82aab0435af3012383812f2cdd9a3f659a15902bed6dd5e5bdb3dddf35c11772b7341571d536ad0baafec38d5f411112b85f995ab879590878c13137f5e48a56ed3c4f8db9066701312ff188e76" + }, + { + "mnemonic": "桑 黴 飄 療 驅 釘 完 刮 當 補 窮 搬 罐 蔥 喝 臟 禁 伊 航 管 丘 強 勘 售", + "validatorPrivateKey": "3cff2fe0a9ef0065cb57f6df6396404214853d6e1d97d627ec90921f266a6b3f", + "validatorPublicKey": "0x9343ce3d653cce03d84dde1601d4f973d795005e51fc0616c79274050b36157cbd2215a8b1ca32f134f6246ed77274d8", + "validatorPop": "0x85b86c671a56be8a1f7153b0858a26f8ff458c999fb398647f62dbc36df1b575d1060307f9314eb70061b2738ba5d6d001ad87944b69b037efe9c6779c435dcc0129d37c1b6a86626b1fdcd5279740abfcad95f909f3290b6f5cd992f52b7076" + }, + { + "mnemonic": "宇 鐵 築 郵 盧 返 洛 端 宴 埃 遭 洞 謝 塑 砂 賢 凡 躍 暖 昨 而 殘 建 坡", + "validatorPrivateKey": "4855a39c26a6fd3792e3e00a92bc06b0da96e254ef39571adea18a8db2f5de2c", + "validatorPublicKey": "0xa26875f9858f18a5e5c46b655483a43a5f925fe4b4b5baa2577d3113842106c2f421f35da442eb44a9dd03e30a41e504", + "validatorPop": "0x871ae73b487d8d99818b9ee37539f32ecd67a92b19370b6734dfdfc2b16a1a179e3707c7330a255b3c21dc1968b104d40b14b0b89cacf777fbdf81e9306d9f18531892822cea02b602144320ed11b3abeacb49102c590344902cd21d9dfc5df7" + }, + { + "mnemonic": "阿 植 節 勞 島 埔 盜 鍋 南 津 阻 忍 秘 旬 旺 旱 聽 歇 拔 抹 教 灘 基 死", + "validatorPrivateKey": "39c63f59d606ebc84d6c422423a2e6ddf14bf2770cb4e4a1311509222aeaa689", + "validatorPublicKey": "0xa5dc865f6da1b1b85b96b403e7f39b09dc6c89e71c907fda6f64d22961b5687e8da295ed08bbb8faa6c883627163b433", + "validatorPop": "0x92641b1b2b1c482ea05664f61399460f408f30f159d07974a26e090e27b38d5e5b45fa38744962dd331252c16dfdffca1317cda4769ebbf920401157642e3249974bda03efc12dc960c2db74293326f81e2b37aedf53c17a9acdb714fc58f773" + }, + { + "mnemonic": "肌 聖 紫 偷 土 命 補 錫 機 窮 型 衛 否 善 僅 敗 亡 蟲 李 鹽 炮 去 情 洲", + "validatorPrivateKey": "27947e35e9e426535fa13f68eaedcaec677cd9149e1187daef5abf294782d272", + "validatorPublicKey": "0x968636756c1508713f7ef32fc80ab24b62e2f1153d3417d6c32b5ccd04157a2a47e10423277585c7870c17cc9dea39d4", + "validatorPop": "0x945351c26e250e3b7d334b4a167c14a9e363357acedf285312e66460224db27d637adbb570c17467954595b0774e39210542396f943c47fa330691eea9d4779e5bea0f95c6a262a3ee8381b5f2ab4b7bb90930dfcaf15121017a2cdb0c7636d9" + } + ], + "korean": [ + { + "mnemonic": "종업원 밥그릇 도심 순위 여직원 바탕 야간 이름 전문 별명 핑계 비빔밥 도대체 일부 영남 인물 의논 하늘 적용 할인 찬물 창가 사탕 공휴일", + "validatorPrivateKey": "0f5c33e6ab421f07081207fbca19e5822f9c4b66641a457a78412807e292064a", + "validatorPublicKey": "0xa0139b8f5252df3421a31196b1028ff54caff72e58c7f0f284c306e5a803cdbd0e3777c1809439448d95d417d35f0b85", + "validatorPop": "0xaf6438a1cd074d7309a9170c845820e64cd4e7c393c47ff985a93a5501d7de3eb3a425e3077207acb0dcd6ce75d0da020e2bdaf5778fbef0b8e77486274139e47219ce28c0bc6c3813100114363e12623ce69b0b43fffca4b1abac50ba16ae47" + }, + { + "mnemonic": "칫솔 공포 진행 먼저 별일 달걀 문학 식생활 행위 중세 근본 순수 거짓 육체 시중 개구리 가족 택시 콤플렉스 필수 장애인 불행 바닷가 연장", + "validatorPrivateKey": "5b0a6583db206a87402571c99d3068843df0a985535381833383eaf4c57d77ec", + "validatorPublicKey": "0x85f0bf98954b90e5776859aaec6c7b59ece420034b9be9996f882d49607359f811748eaed4305b3aa69d065f6c07d343", + "validatorPop": "0x812ee0cb2cdb4e4021d62fb17b139f437496973d81b72d271eaab3cd7236887fba764a2eb5e8e57a688035cb8445393805080e37be6c8038a13069938ffc79868b2163458095ece3c637b34322e48d4eaad587e55704742ffda659fbe02c380d" + }, + { + "mnemonic": "대문 국민 착각 목사 소망 엊그제 참기름 시집 창고 화요일 의외로 나침반 목소리 운동 수상 재활용 해군 창작 항공 전부 배드민턴 전공 열정 감정", + "validatorPrivateKey": "43ad99d8112660dc4e7dac643f11c8e931f0caa52ab063a4e5ac7b6036462376", + "validatorPublicKey": "0xa78d727dd7c87749bf267ce52abd8cf79eaebf606e918cb73a107733d9594d4e7874d25a14c0a100b7dc54ee281bc2c8", + "validatorPop": "0xa356032b5a4ae7eaa1131b5311a454381836f026380c1cb0b73e88395cc51c79ede13e61eece0efbd2185066944b010d1011ebe2fb217131e0beb59f2cf1d80f4dec13b28bbc12f9e880f321b0d2425695a92113925d141bf73dce7e375463f1" + }, + { + "mnemonic": "전철 소득 테스트 표현 나들이 바람 공원 자판 화분 이민 탄생 먼지 연장 각오 손녀 미술 태양 타자기 정도 플라스틱 컨디션 막내 지원 공급", + "validatorPrivateKey": "0fb306926e026a263a8ed512656b6e5c1425e74cb5da7e16a642f2767b0483f6", + "validatorPublicKey": "0x944dd58f066e0ffe4a304eec83f98ce98b3b832207271b6fbb0bb3ec78ffda48e1397616058a5fb2fb557f8ad6cedc2f", + "validatorPop": "0xb8e222bbd52147a67ae589325e23d1cdb1a59cb1cf884731a2329f836bf976201327d3d162b3a90c8f61c31a10920ef51096628d82bf557b64bf411ab2f46b5e448492fef2b5607a3c22e73ef6f01fbf2edf1c9223473e0800efba27fb9e866e" + }, + { + "mnemonic": "염려 공업 보험 임금 문화 비만 마약 시점 접근 행사 반대 본래 나란히 사계절 여름 근래 차림 육상 가족 휴식 골짜기 포인트 미인 텔레비전", + "validatorPrivateKey": "1ff861e32207193114a92f6652fc35e2d20a8feefbffa5b11dd7a06581107e8b", + "validatorPublicKey": "0x8456910e8ac70a3a5c76271f1a96a5f18d728db1878c23de617cef5bfbad7e13181b0a25eceafe95f0c489beb35df72c", + "validatorPop": "0xb3c5706fd393ea541502788793f24c423dcf1650b0c13b84d60842209683992621a72ca47ffd4723f735eeb2a574141a0ee9d1306cfae4243bf2434ba0175a4094e5bc544b05c2f15641653afbee7b0271d2668a783f1d03c8e70b34ce8ec69d" + } + ], + "french": [ + { + "mnemonic": "dribbler larme taureau plexus erreur claquer féroce frotter friction départ cosmique négliger frotter burin tonique fouiller univers humour toucher réglage hiver défiler poussin mixte", + "validatorPrivateKey": "3343a4c7f778e1ffb7c2164f7b98160baa38d6ebe8af86729f08945b8e23bbfd", + "validatorPublicKey": "0xb5f4c7d873ca7c67145a29486fe62b31666c3c02713fedcb9fd83dda040ee2d460784a9f6edf6fcfdf0b592b5b8a310d", + "validatorPop": "0x8421878abca4537b3af374aa88ce8c4bcabc0284fde740a528cedcfb7d59fe97d5f34cf953cdc0ca652e5f89f4f900dc176e4a6e2ff11c43692dabe73aa13e43208fab695ba3e85c21b7744140b1e653534d8ddb0c1f952dc3e95e87c4537fb9" + }, + { + "mnemonic": "obtenir pipette axiome maudire torrent litige bavarder écouter hanneton syntaxe tortue clivage parsemer fossile tumulte bonbon sacoche bidule coton admettre liasse visuel filetage amorcer", + "validatorPrivateKey": "6c4c397096a186a2827f27e33ec6f56b0978d8bf1e1215c005370b8122f3d4b8", + "validatorPublicKey": "0x80ac1c5353e172c0a976478659831adcf44f9bdcb159aa7d1b2b99f51c9fee9b875afb064c593239d0fae3a1b60aaa1c", + "validatorPop": "0xb898877f760544e6c71ca4da641c8bdeb12520261eb01f3a4422ff2dd97d7b149f76908a0d2be6447242100f5ab6e7820ed57c407bba251e841bbf79b5bb8d38eedb246b9dc9fe7f234e44ce2b80cf29a73ef3a65ea99e77ad0d89721936ab9c" + }, + { + "mnemonic": "décider cloche tenaille aiguille vagabond vacarme hanneton cimenter infusion sosie évidence gendarme adhésif rompre dédale unitaire maritime ruiner vidéo prévoir fédérer boueux farfelu exhaler", + "validatorPrivateKey": "669a2662f700d71a160661d587e3dd8c06a0b0998ecb16c7cd175ff6d1502fbd", + "validatorPublicKey": "0x818e9020dda548505b21995824bdd1d7b14819d79cb471d9673635e13ae9c0ad2d4e3be93cb9409d36f5ee95b9b619fc", + "validatorPop": "0xb6fdbed5448a146890b060da99e88becb01b11db633b8fd0de2227da2ffee36b4bc8f3181b83af386ddea26f7236281c0301aeda9f347aa24f0527935371bbe7abdba335822c963dc868a244259af270dd8a81b6ab28c5dab0313786f0b37975" + }, + { + "mnemonic": "poète dynastie littoral groupe digne zeste ronce punitif chavirer cassure neurone capsule esprit désigner tabac fiasco pluie cravate exact varier tatami alourdir réagir distance", + "validatorPrivateKey": "6570ebbcb99dbe8d81ac3410243ab29dab6e79c8aa7ccefcb8607d5337d4f864", + "validatorPublicKey": "0x980f74a682945a3ed34dd55cc2789275c4cfb3644103d7ba11b2f55fbdf6c3df1d600f96b4167c8adc2041ac5fe35fc1", + "validatorPop": "0x9914ad0e5c743b708b32bf41f700d9dd2062050d409ede8ac85cc091888fe354924d1cef589c95975a56d5c12f26380f14921c9a8267ad20773db2ca7007a79d033cab1425aa769e887f5343afd6fc155d424208dc2a146e9b74dad4cc0434a9" + }, + { + "mnemonic": "matériel euphorie heureux pinceau stimulus raisin triomphe risible dégivrer viticole scalpel sécréter jeudi ultime muraille éclipse médaille forcer joyau suiveur passion tablier nébuleux omettre", + "validatorPrivateKey": "2d03ce03a5b89ef489c2461571d7f72c4ce9727c95ab5e077fb40f788ae2e060", + "validatorPublicKey": "0x92e4b62246dd3e4fcde6fcffc714ccce2e490fa937b8e7971aea9068ec462d23bb4e56ad20d07eab714951061f5ed449", + "validatorPop": "0x907041b9009b68a92ba7d03d9ed98d4035efe543e857597bce46559afc9668260af63f859a5a0f96565dfdf5af8e4c4b0922be745511fd7bdf5c305ff252f68fbea4d12f212d118921943198f0fe99057c0c178358171ea0f2b9328333b4c506" + } + ], + "italian": [ + { + "mnemonic": "zelante utilizzo prima asepsi gallina sospiro camerata motivato druido stampato cornice parziale favoloso omaggio padrone anagrafe fronde appetito gregge acrilico speranza sigla edile nanometro", + "validatorPrivateKey": "452e6ea0978f003597d870c8ac9cb9331ff787654a8d89a84a75f16bb5cb2dd0", + "validatorPublicKey": "0x8b8d5a520899efeacd63b59b635223bd2247eb170ac0ea8fbfc3fffe1ed915784e6245058367d76ce38d458029b24f25", + "validatorPop": "0x8791fb929a38d45bd2755555cb81da57a4085988836b8235989ac51de8c35d23b8ee7e8f9b8d2be296be193b647cac7b16768ec037b726ab22e177ab546192650703af27a68b2e3a788b7bd609d2187b9e1013b983df733d3e3c69cbb925c573" + }, + { + "mnemonic": "emblema ignorato puntare velina sdebitare ciottolo tasto pugno luminoso agente pioggia fondente deserto frollino oliato prelievo popoloso plasma catasta identico digitale sciarpa aspirato igiene", + "validatorPrivateKey": "4da993a7bd114aed3b78d62336fcbe9c6a222ac92385ff3146b3e5d43f442f2b", + "validatorPublicKey": "0xb749a56fac3c29aaf5b9f341ea9e5bb43e19d4ee1843314d9b76cb78cb3c667f01395c398ea1150803cc0e1643ef8dc0", + "validatorPop": "0x8243d3ea43c4e5aaa7261d63ae6ad8eeaa69a0d9966d0c85b26a2d00b2870738d5ea6195ca9a9c059018855fc914c7f00f75b718ccc38423d9aecbec8ca304a4ca642edac1cdf9cd58dd4b5d32fbf6f35a168eee63533930e9886965bea00742" + }, + { + "mnemonic": "rastrello daino discreto buono smentito cucire vivido achille silenzio pollice origine cratere roccia oviparo agire esercito cerume multiplo feudo utilizzo spargere biscotto endemico eroe", + "validatorPrivateKey": "5adb2bdd1f69bbf10e2201a0ce7e61cef0b02ed6738ab30b15c6469e5b7bc278", + "validatorPublicKey": "0xa7222e417a89dfc932c726a566cccbe54c9655a89a6485fb74b77adde2a03e015c959fbf3134277b6a58708cc0a0e38e", + "validatorPop": "0x8d9670a3e8bd106dbe333db0ccceaff18125340b3d20b19aff58b0836771d828f0127cf82f2e19b86cc3f29e3df7dfa811923d7ea397706379318561ea5192f76d4e8807c03777b1f49398719936bf3e1e926c95bfb8f0d69a68132bc96986f3" + }, + { + "mnemonic": "prelievo ginepro codice radunato dalmata lilla scapola tecnico ammenda balcone lenza rastrello midollo meschino mattone ignorato estimare avviso sgonfiare insonnia munto regresso diffuso criceto", + "validatorPrivateKey": "396fa5f1d3e82cd2c8e097da388165cb4f4e47ba7bfbbc57995ed15f7a260cc8", + "validatorPublicKey": "0xa7d0162225bce452e35381dec2c788d01fd80ed6d1e938719b7e6830a678fd750ef00494f72a33542678d964ad18bd1e", + "validatorPop": "0xa5470dd36911571d3628b002cb7c6b3e256ff244be9c137eb0e488e76e13d672244682fbd2c51ec4df3b597fb16686d30943b7409cb74c553a77cb46cb9bc62ad85395bd9c76661710278dbf53599e6fe8f70a141e2903227d1ffd6bc37c476e" + }, + { + "mnemonic": "indagine tromba soccorso ologramma sedano garbo apertura marcire superbo sfuso azzimo inglese modello movimento criceto becco alticcio novella dividere sbloccato retorica palazzina cottura riunione", + "validatorPrivateKey": "2ad5cca2dc7706fc1654fd9ea84a20b686be4e56850bb70defd08c870510a4d6", + "validatorPublicKey": "0x8ba6325e21fc2ad645e4d8267165b7a6f3e14ba9d1fb944bd72ed8a2c044e0fd792f091e9a32071dbb9022efb8654e09", + "validatorPop": "0xb1097d6cbb9a1c0eab00d6f13b3fe2b703168d89e93594a996a50f09a3bc6987714d1d8f6dfc5356ef3b844335c0214008cd5833edf936d1f2cb520bdfc20d2f033d9cf15dc4f6b025d88dbf252017a454ea0b3ec7bc9746f8c42e67f18e7d02" + } + ], + "spanish": [ + { + "mnemonic": "martes señal seguir porción goloso paquete flujo válido nadar oficio acoso hora cuadro gota asistir colcha lana exceso brote saque lindo asumir morir leal", + "validatorPrivateKey": "25c44d00d29dbab24f28dd00a229ddb0803ef53ccd42eaef6de351cef82d0f4f", + "validatorPublicKey": "0x97fd4fdbdebab7fa2fb8872d30e5b036a5028912dd4f39e21f6ff8a460bbcab68c8c13bcca162c1ae8cdf263b0cd654f", + "validatorPop": "0xa297a13e00bfa7dd6742711bced755f645e6745ae46772b23ee6df6e7e405d6c6786a55cd95e8d1ad48a449b5a5e800002ceac6b484c2055fe9fa31f2cdba113a3f3c21f9df3c5a6e14a536e3a447a41ae96003472bada189ed364fd929305ca" + }, + { + "mnemonic": "cima feria órgano tío sur fuga negar divino turno ducha equipo fachada breve mérito núcleo futuro alerta hoja todo pupa cumbre himno cara cripta", + "validatorPrivateKey": "4ccee835aa496e5e9614d0e877fbb6176536d913a33e74c765e28524a659d271", + "validatorPublicKey": "0x90d3390be6c7553ad3e5ecfd3b3fc821af70dca3c91c6ed1d3c0555e63577da9a47a821c6e10e9b7ab08e001f7822662", + "validatorPop": "0x9734e38ede82b538c033a8cb3b01f095125e323e6bd3a98dba249fbd844760393eedb81c4452721e452db937734e9cda083c7b60ed889285f987c6dfae77c4d5cd28409b9fa01c3dceaefcab349b9d8b311958516f0f0e96e4a6a198aa0026f5" + }, + { + "mnemonic": "típico malla anís apoyo trozo ladrón sondeo iglesia leyenda aroma pleito crisis pelea burro aduana secreto sed cien doce junio octavo perla bahía método", + "validatorPrivateKey": "34f393136b47e2171fb6c5ca7d2fd51f4a42c5472e9b3afde2307bd224a1a68b", + "validatorPublicKey": "0xa80bcdfeb4107779800f8d7137c1c2f84c1a47e80e5ad8aecfc3ab93d41cbba07a86a2ea1fd49798441a2328f023dcd2", + "validatorPop": "0x96d4009ca22f2db92adaf6e201503f11c89de206a030569b027b39bd5cd5b371054953a0cad26191998c377d090afafa13595fabb4c66053eaeb6db425bcfaa8b42714f43152a4350b95cdc712e8e65f3ce874276e8524f671da78e28afe4d09" + }, + { + "mnemonic": "chico lata juez defensa eje urbe ave oración basura mortal rígido pluma cordón rechazo surgir tonto alto estilo cuesta clave viudo bien capucha isla", + "validatorPrivateKey": "117b0c75dec31f1e9cd282d0e133665f2fa02504b1d97be6a0e7d98eeb4db9f7", + "validatorPublicKey": "0x89894e4a6f7eec8cec7137d62269d48c236cd78fded994cefcdc0e3737464b233d379773dc1de28042fd58d3935e46a9", + "validatorPop": "0x913050903b418fd18c4c146de8763c2a4cf073803faad4df439964f108539f61e1606cc0c128991266115ba2d200ec0710c6b73ed9819478aeca466bac904337a8e95c03ef2f6745dadde3808332e6e4e40926671442d6039392cf2d71fd20ed" + }, + { + "mnemonic": "cero válvula tejido apodo margen goloso chuleta tapa observar afinar meter zorro simio yoga calcio superar rábano delfín octubre combate novela hecho aislar legión", + "validatorPrivateKey": "2c2b0e5932a2bd2ecfe552a897bfc353e0facb1c3d5aa7af4bd674cb2f421c4d", + "validatorPublicKey": "0x8275a6b35f3c48a65729d86533f1988cf9b52899dc13b90cca5bcfb5bd8e8d8edfd83634a758ff5b2b57d5c1d64639fb", + "validatorPop": "0x81d5e27dd793ea5a48610240e43dc0cc6bbb625c9b9bf4e5d0ffde1f175030eda8ed85a859cb0eec5f614139a205654b154fda30dda80c1828c03df178f78a8de14c96e5441ed21a40ed89675bbf44011c7b70247adacac18bf1a10a55a86715" + } + ], + "japanese": [ + { + "mnemonic": "しあわせ せっこつ いみん そめる とさか つねづね くれる とくべつ かかえる ずひょう やおや そんぞく こんだて やさしい ふうとう りそく しちょう へいせつ けつろん きんようび すあな たぬき たもつ だいすき", + "validatorPrivateKey": "142008b4f59fc2fdd18e606939d5d9e9b30bb0e43417104466d13a62193891d4", + "validatorPublicKey": "0xa8452d79e71b776f879d17092898f91ea6a11b9e8c528da94c21e498cee7816edf536ce1066399456d9cb721f77b6f27", + "validatorPop": "0x857d0da58bdf3b6d40113ffa98ee0e035d794716cec3358f7dadc69bcaee02000c2c1b075229ed67a17f7ca77fa5db041968bbbe21e7188bb5bd9c46db2f2c21e54b2283ade08a5ff17fcb75d55572e5a596cab6707f8688bc863734edd5c4fd" + }, + { + "mnemonic": "こゆう つながる こくはく りくつ ろうじん のこす ときおり かえる いろえんぴつ すろっと さゆう おとしもの ないそう ゆうめい てんいん かんそう はんめい てちょう いばる かいぜん ぞんび せりふ にきび うくらいな", + "validatorPrivateKey": "4461918903d0fb568149b421f004e88c529b512fd48059b1d7284141886ba34f", + "validatorPublicKey": "0x8abf9c3196085d79c6ca455e2471cbc011170d5b74e58ee3655b66aa4d09ddd93ac3e51bdf75dbbf230e7e7dbad52a50", + "validatorPop": "0x9922dd5a662d3ee980ebe7eaa150b1553fe6b46199742547972f43116c50c7b7fd99fab309522cbddd38dbb62a37351802fbaeb213de3ccec2b672722e2c29bd0e43b7c1eb17ca59dfa2f71368c54c27dc3c002f7e23285cf4068396d4f4412e" + }, + { + "mnemonic": "のたまう ぐたいてき ねぶそく うつる けってい ふんいき すいえい えつらん がいへき すごい ねみみ さとる さむけ たんさん えいきょう へいあん くたびれる しいん やさい くのう かんこう むさぼる しっかり のちほど", + "validatorPrivateKey": "253f91fce0a5cdc74197647606f169dd138b90bfaae722ad41716bc57e80d41e", + "validatorPublicKey": "0xb1485e689a9ad2f1470a6fa30dcc84388b4e4a606a0b6ea1c81f6ab735dc34b3b8893f426e170a9526a1390de48e53c1", + "validatorPop": "0x846e2a15d313cfaf552765695a1d7425c6af57bc34fbb4976ec1eee326e0db329497683b636b74beb89472acdd7a28b601a1d98445f7baf9293392db7568a112abe058f8a1de8c44c6d34cc88c98f50604d3112debc35737daedb0871395ad3a" + }, + { + "mnemonic": "ねんれい いがい やさい のこる たれんと きれつ れいとう ちょうし りりく へいたく くうこう ないせん でっぱ そせん けんえつ よろこぶ れいぞうこ こむぎこ すくう げぼく さっきょく とそう りそく こいぬ", + "validatorPrivateKey": "27e282f80a80d652c1a53817c479251f7230a814f1055510531418cdd30d32a8", + "validatorPublicKey": "0x99ef3bddfe31f487b33d4a81271bd40a67409e6ec117cdf8c6f67935a5d440b929287ae0863e0985218e417f00ab6c6f", + "validatorPop": "0xb4f09e9022dc69c9ee48326b669a9e2b730e7a5c1383969630d04068281aa452443382fc628c35c77b143b476754a8160dc257c98253617d3052cd7cf19c064d5a184f1032b623bcde237f251f3d40f118f8656a8a09f3a2582704261855c427" + }, + { + "mnemonic": "うれしい きつつき そいとげる ちきゅう てみやげ きかんしゃ めだつ ひやす めだつ うなじ たいわん ぶんぽう ただしい なにもの いばる きゃく あてはまる いれい じゃま きない いっぽう おうふく さんいん なさけ", + "validatorPrivateKey": "15082ce06a66431b7a03f25537827bc5cc73acd9007243a9e696c374920075dd", + "validatorPublicKey": "0x8124d478ad9cc14f8ccde96023944c358e58e8006a6cd7319942fec56d25d9507c96f47ef69a2e1e0e84e46653d367ab", + "validatorPop": "0x88d10a676d665555a88c6224f913c13ccda838a405314bc1430548b5b9e2687fafadafa7310a1dbe1dc0314fb1ff998e157152e3f8b2af486e7e8dfa9604ef09699f8d29a080414eecd51ffdd62ec9bc012b5bf2fcc3b503fb17c446c697aa41" + } + ], + "portuguese": [ + { + "mnemonic": "esgrima vertente patamar resenha voltagem semanal patente alcatra gordura bule saibro torrada careca ajustar biosfera musical meteoro piada glacial resolver soberano rabanada futebol ilha", + "validatorPrivateKey": "3f2a50540b649232f027e8a277c3a444c19e922a2a97971bf440df984b931593", + "validatorPublicKey": "0xb3d174587f5befdf7b5934b7ad8ce05757398db9be55bec884ad4b19b17f6e7db70eaeb7321b8f6ea3b9f8ef37f96565", + "validatorPop": "0xb61e4ce63305baceda40d9efe786013b78d70e5876c9c36aa95b19759773d4e39372f27e8419c970947502502d9c9a06111a5d8a524742419d9e2b6268fbfde5d9e153b596cee3d05a41e40b037f8406f9141b0e5e95a356591db9ee898ecb04" + }, + { + "mnemonic": "dosagem taxativo cabelo sediado atingir mesada toupeira pele soja cevada asilado oriental frango rabisco lontra moqueca bule seleto azarar clero bobagem europeu lactante focinho", + "validatorPrivateKey": "46f4c4e9cb0ab5dbf2e2dcc526b2d0001bccd72261862421e8642c13004264c6", + "validatorPublicKey": "0x928acc27de87f1f58d9ab40a7e98bbd6418b6b507dfde0c5f548d8a293d921f56000b7c11bb76bc24382fd0a492c40ad", + "validatorPop": "0xa79e465de3424e1631170325144af08147784eb57cf3ec8c2e5c0add9a809293d1e4e0a4b90babda696d88edc72e187e135597cfdfb9a842839207aaa97a5112133faf3ea1e3133fe6c92ed0c4daf1bee53dadc574a74bad7e6297777d99e9bf" + }, + { + "mnemonic": "papagaio vertente fungo magreza chegada gracejo jasmim madeira unha caneta benzer cinza rigoroso tese atracar adeus teimar amaciar ameixa ossada sinopse pergunta esgrima joelhada", + "validatorPrivateKey": "1749d423eae74ad8c4576067f9ad81d92f6e36f987308f9dc62fe83361dfd9f5", + "validatorPublicKey": "0x8d22647a9332444ea4d84e00648e60558c6d2386112aad3c262de74ff5223d890c8177c71d2c7c2615a8101ad61a32fa", + "validatorPop": "0xa3012c4fbacafe86f2288afb6eec2b35d010f55d09a839cfa2890538da49619d9a6384d0b06a6a55368b9cbd80a6b20316468ca94f41ad6cc789370e56b79d5cc28cee8c05e06554798dd67c854b5058b982cd7cf01690650930620c882a1074" + }, + { + "mnemonic": "exclamar pendurar moqueca falta calafrio apelido imunizar secar vinco nebuloso aura lasanha partida elevador rodovia flacidez lamber rigoroso ficheiro separado rajada aquecer pasmo auditor", + "validatorPrivateKey": "2f75417cd8b2e8efd39e8dcef6e1a850c5f8c9719ca7b86392f994c82cac35e5", + "validatorPublicKey": "0xa58269b98777c26c3b5bf6abb7d379bed61bd67ca4b081adf83b40e9647679b65ff7e7bcdaa5da7adfc4a46767206a40", + "validatorPop": "0xb02b3fd7469b1dbadab14a3d04780fe8f527e73e8a0024de1302741fc8110b2081ea30100e79526d8a9e28a4a23a815d14da2d1109725fb20e490ca0686673adc213197515f7eb01d234e7b57029daa37a1e3ca4982122d3309bdc9dc819390f" + }, + { + "mnemonic": "cordial respeito granada enquanto moto crioulo erva mapeado levar escola bimotor ensino demanda auditor surtir tomilho plaqueta castelo rainha praxe educado resgatar submerso planta", + "validatorPrivateKey": "484c6232215ead7fe319fad15769559f7f5644f0fe166cc767009122440569ad", + "validatorPublicKey": "0xaf4dd4a6079edd643a0fdc40eea642c3b15783feb1ec8f97bc8ec1bae320d8ca4752d347244f601eb531eff3428c54b5", + "validatorPop": "0xafbc875a04d7c555e19ba56acd2e6f8a31a048f73eedd42315cb16bcde021b408d3f3a675f98baa0edc23f2be576892d000c37af1adcc29457a2cc52d5ab14ef96faad465b640ddbcc05b1395019be84ce1bc3141bdb39575baf5653b9d09897" + } + ], + "english": [ + { + "mnemonic": "tilt solid main night swallow mixture witness undo resemble dinner abuse lucky lens price debris close session rotate giggle spin behave bulb volcano school", + "validatorPrivateKey": "1a0a19222804265d899b7b9a577a14e303d2bce9a2edd9613b66b7f85d0cf085", + "validatorPublicKey": "0x93e2bfe845711f4c87373c6c3be6993f74d0902c0e153bc4a56331e6e6c0ed0ee31f0ba551950e23aa0e13add3af51f2", + "validatorPop": "0x84989fa01fc8402b3c9e622ef1f19c2697d1f8d6491dae52b8f832b9c63da678b12761538a91745c75febee6c92b9fe60e1e186bfbcb6de3454e81f54260d9964804640b7dff4a64cfd8235fe4bd449180cdde0ff03b9b7e676ca6bb0bba885b" + }, + { + "mnemonic": "bachelor any crew spell clap misery later glow flush gain stem puzzle opera body junior base circle brick fantasy token hybrid aim live year", + "validatorPrivateKey": "672dc293ed7944ab6bab48b9cf094c0330e86e187d1b7c1806052844a619cf87", + "validatorPublicKey": "0xa00ff3c4d8fd674e8203d83c2e3875d8766a984b06470752598d99a857aef0a7098a395866598bf996a4a767b3a9701a", + "validatorPop": "0x863b1e51a2a5beb8be5fd5ba200a01c768e092d054a7ba7feee3e04b6f9746f9ee2324bc4bd6b481f9c5f24bde54af31053dbdd5dfa802ff2ac1bb1ad0e22fd58d03168a871b6ba3734647b084c2efcafe360dfa13e0a3128d58b5c4b649002b" + }, + { + "mnemonic": "track dumb fantasy slide surprise ramp inherit erode fat staff potato night pill catch cabbage book exotic upset wing winner satisfy total vessel rubber", + "validatorPrivateKey": "0fb965e7eb47440e3fb5e5399ace682888cd209363c5550195cce16dcf92fab1", + "validatorPublicKey": "0x8c9700f630f514d10319abe35192b169c733d4ff3534bcf6a148f42d8a475fde2e2adcb72ed5af13587b851fb8ff4e0e", + "validatorPop": "0x98c172d81fcb44cc2650bd2be8ff2024017c348545c4014d6936ef335d845817f0eab56c9d26f5a36de9a627831ff869141ec3957bc09e1d4d9f3136e21a671577b95f0dff6f38a1c3a776961fbed254f509067d410e3118b5da8e192237f065" + }, + { + "mnemonic": "attitude endorse witness engine hole employ keen obey equip empty street region opera liar labor path middle stadium pony switch pass spring version ordinary", + "validatorPrivateKey": "49ba61ad4384dd022595834faf12023d14a0ff55ef18ddef9092ff446c17dc23", + "validatorPublicKey": "0xa5e9860f389b3975b837045373988c6654faf3cc48f32c8eda2cdbe0c25c336ad9d31fb8e7fb5a00e8528141361b4972", + "validatorPop": "0x8c41fb0687b6d94c8c7eac339df24c96ef705b79f47f974d53d97aa7abc0a5f3b08269311bf681f1d76ac9b271be7d44005675482e5439bd5d9fb91f64b45ba05cfe62bc7f8e6e716d87e2fc0b223a29256e49556a9b8e07dab4af949d09b420" + }, + { + "mnemonic": "gather gold embrace walnut hover evolve wedding they radar turn drink rail decade general smooth magnet perfect scale jar topic current fury struggle inject", + "validatorPrivateKey": "07021bacbcaa0ddd099fbd31a17084708783c0248a9b065fe39876c2d6dddfd7", + "validatorPublicKey": "0xac2ede580bdc2482a5d302bc96d66318c46c0bb14926460eec49881fb545af20e6da0a06ace7d5b0ada6d2f4e93528e6", + "validatorPop": "0x843c2459ce6e5c855d0432187f5a8256d64a2d88482c8aa33fb4b400eb56815108b937e238a86769f2cbcd5e43d06a1206f63833fe00c5a95b2933a129c4d739d49b85daae714371fd68d9c5762c687b59c385cb410c9871edcddb3508066c66" + } + ] +} diff --git a/src/test/resources/transactions/validator-registration.json b/src/test/resources/transactions/validator-registration.json index 452620f..617f0c9 100644 --- a/src/test/resources/transactions/validator-registration.json +++ b/src/test/resources/transactions/validator-registration.json @@ -5,10 +5,12 @@ "gasLimit": 200000, "recipientAddress": "0x535B3D7A252fa034Ed71F0C53ec0C6F784cB64E1", "value": "0", - "data": "602a9eee00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030a08058db53e2665c84a40f5152e76dd2b652125a6079130d4c315e728bcf4dd1dfb44ac26e82302331d61977d314111800000000000000000000000000000000", + "data": "0x226f2645000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030a18dba7811b212bbb2f080d7c69935998ffbe7b38586e2d3e9e12079ea789996d1c69feb158c002aed327f69865be496000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a124539f9d469919eb57224cc003d9d5b086a27c6de244abf60b74b35fb749fceab7f4c24b983475cddab7d0876de49c000b5c362f5e3ce18d964f5c2d20d4eadcf7cb77a73d8ee4cd87bad10f7ba0824cea6715d1c045b4f93865a2758b7bfe", "network": 11812, - "signature": "55c3de643cf08bd207ce5667566c1c545304a4cda0de38fbee8f28cffbe53c92428cbd017bf64ae4f5d43b6822cc4d6245226e3ee1e64ca4d1078985f3e4bcc701", - "id": "9cded60378a492a450df2acee4c0fe1d228e999f58da814d4cfe452d8f28ff6b" + "validatorPublicKey": "a18dba7811b212bbb2f080d7c69935998ffbe7b38586e2d3e9e12079ea789996d1c69feb158c002aed327f69865be496", + "validatorProof": "a124539f9d469919eb57224cc003d9d5b086a27c6de244abf60b74b35fb749fceab7f4c24b983475cddab7d0876de49c000b5c362f5e3ce18d964f5c2d20d4eadcf7cb77a73d8ee4cd87bad10f7ba0824cea6715d1c045b4f93865a2758b7bfe", + "signature": "2ac3550cae0c7749e131b482ea3c5a5d4ca66f4b84e54861ab86cd68340f50a117101f0c0b91c713db6f79c1aa95c83a2cf7a6c81085692af8526b7b755d569201", + "id": "cc4331ec856b588436e8ba3de8b04175b4537fbe1cc4dd6a6e8a1f92788b206b" }, - "serialized": "f8ec0185012a05f20083030d4094535b3d7a252fa034ed71f0c53ec0c6f784cb64e180b884602a9eee00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030a08058db53e2665c84a40f5152e76dd2b652125a6079130d4c315e728bcf4dd1dfb44ac26e82302331d61977d314111800000000000000000000000000000000825c6ca055c3de643cf08bd207ce5667566c1c545304a4cda0de38fbee8f28cffbe53c92a0428cbd017bf64ae4f5d43b6822cc4d6245226e3ee1e64ca4d1078985f3e4bcc7" + "serialized": "f9018d0185012a05f20083030d4094535b3d7a252fa034ed71f0c53ec0c6f784cb64e180b90124226f2645000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030a18dba7811b212bbb2f080d7c69935998ffbe7b38586e2d3e9e12079ea789996d1c69feb158c002aed327f69865be496000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a124539f9d469919eb57224cc003d9d5b086a27c6de244abf60b74b35fb749fceab7f4c24b983475cddab7d0876de49c000b5c362f5e3ce18d964f5c2d20d4eadcf7cb77a73d8ee4cd87bad10f7ba0824cea6715d1c045b4f93865a2758b7bfe825c6ca02ac3550cae0c7749e131b482ea3c5a5d4ca66f4b84e54861ab86cd68340f50a1a017101f0c0b91c713db6f79c1aa95c83a2cf7a6c81085692af8526b7b755d5692" } diff --git a/src/test/resources/transactions/validator-update.json b/src/test/resources/transactions/validator-update.json new file mode 100644 index 0000000..e1259dc --- /dev/null +++ b/src/test/resources/transactions/validator-update.json @@ -0,0 +1,16 @@ +{ + "data": { + "nonce": "1", + "gasPrice": 5000000000, + "gasLimit": 200000, + "recipientAddress": "0x535B3D7A252fa034Ed71F0C53ec0C6F784cB64E1", + "value": "0", + "data": "0x8f062626000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030a18dba7811b212bbb2f080d7c69935998ffbe7b38586e2d3e9e12079ea789996d1c69feb158c002aed327f69865be496000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a124539f9d469919eb57224cc003d9d5b086a27c6de244abf60b74b35fb749fceab7f4c24b983475cddab7d0876de49c000b5c362f5e3ce18d964f5c2d20d4eadcf7cb77a73d8ee4cd87bad10f7ba0824cea6715d1c045b4f93865a2758b7bfe", + "network": 11812, + "validatorPublicKey": "a18dba7811b212bbb2f080d7c69935998ffbe7b38586e2d3e9e12079ea789996d1c69feb158c002aed327f69865be496", + "validatorProof": "a124539f9d469919eb57224cc003d9d5b086a27c6de244abf60b74b35fb749fceab7f4c24b983475cddab7d0876de49c000b5c362f5e3ce18d964f5c2d20d4eadcf7cb77a73d8ee4cd87bad10f7ba0824cea6715d1c045b4f93865a2758b7bfe", + "signature": "5500089b0b0afbf2a638d7fab985d8def9e44c0087859f6e5e0561e37dccc487219b047c62e0d94b3e834085dc0cd6b5f12c6f27ab058e949dec82f24f29b4fd00", + "id": "142c471a038d69b7ae7d18c83efa767a16915dc750a380966f50959beec9f9ea" + }, + "serialized": "f9018d0185012a05f20083030d4094535b3d7a252fa034ed71f0c53ec0c6f784cb64e180b901248f062626000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000030a18dba7811b212bbb2f080d7c69935998ffbe7b38586e2d3e9e12079ea789996d1c69feb158c002aed327f69865be496000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000060a124539f9d469919eb57224cc003d9d5b086a27c6de244abf60b74b35fb749fceab7f4c24b983475cddab7d0876de49c000b5c362f5e3ce18d964f5c2d20d4eadcf7cb77a73d8ee4cd87bad10f7ba0824cea6715d1c045b4f93865a2758b7bfe825c6ba05500089b0b0afbf2a638d7fab985d8def9e44c0087859f6e5e0561e37dccc487a0219b047c62e0d94b3e834085dc0cd6b5f12c6f27ab058e949dec82f24f29b4fd" +}