From 14279e58bca4e82b9c250adb0c451bc3eedb73f1 Mon Sep 17 00:00:00 2001 From: QuickMythril Date: Sat, 2 Dec 2023 23:06:36 -0500 Subject: [PATCH 01/47] Added API call for bootstrapping node --- .../restricted/resource/AdminResource.java | 31 ++++++ .../org/qortal/controller/AutoUpdate.java | 96 +++++++++++++++++++ 2 files changed, 127 insertions(+) diff --git a/src/main/java/org/qortal/api/restricted/resource/AdminResource.java b/src/main/java/org/qortal/api/restricted/resource/AdminResource.java index f0e045ed..35bf9108 100644 --- a/src/main/java/org/qortal/api/restricted/resource/AdminResource.java +++ b/src/main/java/org/qortal/api/restricted/resource/AdminResource.java @@ -257,6 +257,37 @@ public class AdminResource { return "true"; } + @GET + @Path("/bootstrap") + @Operation( + summary = "Bootstrap", + description = "Delete and download new database archive", + responses = { + @ApiResponse( + description = "\"true\"", + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "string")) + ) + } + ) + @SecurityRequirement(name = "apiKey") + public String bootstrap(@HeaderParam(Security.API_KEY_HEADER) String apiKey) { + Security.checkApiCallAllowed(request); + + new Thread(() -> { + // Short sleep to allow HTTP response body to be emitted + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // Not important + } + + AutoUpdate.attemptBootstrap(); + + }).start(); + + return "true"; + } + @GET @Path("/summary") @Operation( diff --git a/src/main/java/org/qortal/controller/AutoUpdate.java b/src/main/java/org/qortal/controller/AutoUpdate.java index bc232e1b..0bdcfd48 100644 --- a/src/main/java/org/qortal/controller/AutoUpdate.java +++ b/src/main/java/org/qortal/controller/AutoUpdate.java @@ -23,9 +23,12 @@ import java.io.InputStream; import java.io.OutputStream; import java.lang.management.ManagementFactory; import java.nio.ByteBuffer; +import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; @@ -365,4 +368,97 @@ public class AutoUpdate extends Thread { } } + public static boolean attemptBootstrap() { + LOGGER.info(String.format("Bootstrapping node...")); + + // Give repository a chance to backup in case things go badly wrong (if enabled) + if (Settings.getInstance().getRepositoryBackupInterval() > 0) { + try { + // Timeout if the database isn't ready for backing up after 60 seconds + long timeout = 60 * 1000L; + RepositoryManager.backup(true, "backup", timeout); + + } catch (TimeoutException e) { + LOGGER.info("Attempt to backup repository failed due to timeout: {}", e.getMessage()); + // Continue with the bootstrap anyway... + } + } + + // Get the repository path from settings + String repositoryPath = Settings.getInstance().getRepositoryPath(); + LOGGER.debug(String.format("Repository path: %s", repositoryPath)); + + // Call ApplyUpdate to end this process (unlocking current JAR so it can be replaced) + String javaHome = System.getProperty("java.home"); + LOGGER.debug(String.format("Java home: %s", javaHome)); + + Path javaBinary = Paths.get(javaHome, "bin", "java"); + LOGGER.debug(String.format("Java binary: %s", javaBinary)); + + try { + Path directory = Paths.get(repositoryPath); + Files.walkFileTree(directory, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Files.delete(file); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + Files.delete(dir); + return FileVisitResult.CONTINUE; + } + }); + + List javaCmd = new ArrayList<>(); + + // Java runtime binary itself + javaCmd.add(javaBinary.toString()); + + // JVM arguments + javaCmd.addAll(ManagementFactory.getRuntimeMXBean().getInputArguments()); + + // Disable, but retain, any -agentlib JVM arg as sub-process might fail if it tries to reuse same port + javaCmd = javaCmd.stream() + .map(arg -> arg.replace("-agentlib", AGENTLIB_JVM_HOLDER_ARG)) + .collect(Collectors.toList()); + + // Remove JNI options as they won't be supported by command-line 'java' + // These are typically added by the AdvancedInstaller Java launcher EXE + javaCmd.removeAll(Arrays.asList("abort", "exit", "vfprintf")); + + // Call ApplyUpdate using JAR + javaCmd.addAll(Arrays.asList("-cp", JAR_FILENAME, ApplyUpdate.class.getCanonicalName())); + + // Add command-line args saved from start-up + String[] savedArgs = Controller.getInstance().getSavedArgs(); + if (savedArgs != null) + javaCmd.addAll(Arrays.asList(savedArgs)); + + LOGGER.info(String.format("Restarting node with: %s", String.join(" ", javaCmd))); + + SysTray.getInstance().showMessage(Translator.INSTANCE.translate("SysTray", "AUTO_UPDATE"), //TODO + Translator.INSTANCE.translate("SysTray", "APPLYING_UPDATE_AND_RESTARTING"), //TODO + MessageType.INFO); + + ProcessBuilder processBuilder = new ProcessBuilder(javaCmd); + + // New process will inherit our stdout and stderr + processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT); + processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT); + + Process process = processBuilder.start(); + + // Nothing to pipe to new process, so close output stream (process's stdin) + process.getOutputStream().close(); + + return true; // restarting node OK + } catch (Exception e) { + LOGGER.error(String.format("Failed to restart node: %s", e.getMessage())); + + return true; // repo was okay, even if applying update failed + } + } + } From b266d205b140f264ba973505dff57cd9545b5a1f Mon Sep 17 00:00:00 2001 From: QuickMythril Date: Fri, 8 Dec 2023 18:11:02 -0500 Subject: [PATCH 02/47] Added Hebrew translations --- .../resources/i18n/ApiError_he.properties | 83 ++++++++ src/main/resources/i18n/SysTray_he.properties | 48 +++++ .../i18n/TransactionValidity_he.properties | 195 ++++++++++++++++++ 3 files changed, 326 insertions(+) create mode 100644 src/main/resources/i18n/ApiError_he.properties create mode 100644 src/main/resources/i18n/SysTray_he.properties create mode 100644 src/main/resources/i18n/TransactionValidity_he.properties diff --git a/src/main/resources/i18n/ApiError_he.properties b/src/main/resources/i18n/ApiError_he.properties new file mode 100644 index 00000000..5ce597f4 --- /dev/null +++ b/src/main/resources/i18n/ApiError_he.properties @@ -0,0 +1,83 @@ +#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/) +# Keys are from api.ApiError enum + +# "localeLang": "he", + +### Common ### +JSON = נכשל בניתוח הודעת JSON + +INSUFFICIENT_BALANCE = יתרה לא מספקת + +UNAUTHORIZED = קריאת API לא מורשית + +REPOSITORY_ISSUE = שגיאת מאגר + +NON_PRODUCTION = קריאת API זו אינה מותרת עבור מערכות ייצור + +BLOCKCHAIN_NEEDS_SYNC = הבלוקצ'יין צריך להסתנכרן תחילה + +NO_TIME_SYNC = עדיין אין סנכרון שעון + +### Validation ### +INVALID_SIGNATURE = חתימה לא חוקית + +INVALID_ADDRESS = כתובת לא חוקית + +INVALID_PUBLIC_KEY = מפתח ציבורי לא חוקי + +INVALID_DATA = נתונים לא חוקיים + +INVALID_NETWORK_ADDRESS = כתובת רשת לא חוקית + +ADDRESS_UNKNOWN = כתובת חשבון לא ידועה + +INVALID_CRITERIA = קריטריוני חיפוש לא חוקיים + +INVALID_REFERENCE = הפניה לא חוקית + +TRANSFORMATION_ERROR = לא הצליח להפוך את JSON לעסקה + +INVALID_PRIVATE_KEY = מפתח פרטי לא חוקי + +INVALID_HEIGHT = גובה בלוק לא חוקי + +CANNOT_MINT = החשבון לא יכול להטביע + +### Blocks ### +BLOCK_UNKNOWN = בלוק לא ידוע + +### Transactions ### +TRANSACTION_UNKNOWN = עסקה לא ידועה + +PUBLIC_KEY_NOT_FOUND = מפתח ציבורי לא נמצא + +# this one is special in that caller expected to pass two additional strings, hence the two %s +TRANSACTION_INVALID = עסקה לא חוקית: %s (%s) + +### Naming ### +NAME_UNKNOWN = שם לא ידוע + +### Asset ### +INVALID_ASSET_ID = מזהה נכס לא חוקי + +INVALID_ORDER_ID = מזהה הזמנת נכס לא חוקי + +ORDER_UNKNOWN = מזהה הזמנת נכס לא ידוע + +### Groups ### +GROUP_UNKNOWN = קבוצה לא ידועה + +### Foreign Blockchain ### +FOREIGN_BLOCKCHAIN_NETWORK_ISSUE = בעיה זרה בלוקצ'יין או ElectrumX ברשת + +FOREIGN_BLOCKCHAIN_BALANCE_ISSUE = יתרה לא מספקת בבלוקצ'יין זר + +FOREIGN_BLOCKCHAIN_TOO_SOON = מוקדם מדי לשדר עסקת בלוקצ'יין זרה (זמן נעילה/זמן חסימה חציוני) + +### Trade Portal ### +ORDER_SIZE_TOO_SMALL = כמות ההזמנה נמוכה מדי + +### Data ### +FILE_NOT_FOUND = הקובץ לא נמצא + +NO_REPLY = עמית לא השיב בזמן המותר diff --git a/src/main/resources/i18n/SysTray_he.properties b/src/main/resources/i18n/SysTray_he.properties new file mode 100644 index 00000000..50ef8933 --- /dev/null +++ b/src/main/resources/i18n/SysTray_he.properties @@ -0,0 +1,48 @@ +#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/) +# SysTray pop-up menu + +APPLYING_UPDATE_AND_RESTARTING = מחיל עדכון אוטומטי ומפעיל מחדש... + +AUTO_UPDATE = עדכון אוטומטי + +BLOCK_HEIGHT = גובה + +BLOCKS_REMAINING = נותרו בלוקים + +BUILD_VERSION = גרסת בנייה + +CHECK_TIME_ACCURACY = בדוק את דיוק הזמן + +CONNECTING = מתחבר + +CONNECTION = חיבור + +CONNECTIONS = חיבורים + +CREATING_BACKUP_OF_DB_FILES = יוצר גיבוי של קבצי מסד נתונים... + +DB_BACKUP = גיבוי מסד נתונים + +DB_CHECKPOINT = נקודת ביקורת של מסד נתונים + +DB_MAINTENANCE = תחזוקת מסד נתונים + +EXIT = יציאה + +LITE_NODE = Lite Node + +MINTING_DISABLED = כרייה מבוטלת + +MINTING_ENABLED = \u2714 הטבעה + +OPEN_UI = ממשק משתמש פתוח + +PERFORMING_DB_CHECKPOINT = שומר שינויים לא מחויבים במסד הנתונים... + +PERFORMING_DB_MAINTENANCE = מבצע תחזוקה מתוזמנת... + +SYNCHRONIZE_CLOCK = סנכרן שעון + +SYNCHRONIZING_BLOCKCHAIN ​​= מסנכרן + +SYNCHRONIZING_CLOCK = מסנכרן שעון diff --git a/src/main/resources/i18n/TransactionValidity_he.properties b/src/main/resources/i18n/TransactionValidity_he.properties new file mode 100644 index 00000000..889d7b78 --- /dev/null +++ b/src/main/resources/i18n/TransactionValidity_he.properties @@ -0,0 +1,195 @@ +# + +ACCOUNT_ALREADY_EXISTS = חשבון כבר קיים + +ACCOUNT_CANNOT_REWARD_SHARE = ​​חשבון לא יכול לחלוק תגמולים + +ADDRESS_ABOVE_RATE_LIMIT = הכתובת הגיעה למגבלת התעריף שצוינה + +ADDRESS_BLOCKED = כתובת זו חסומה + +ALREADY_GROUP_ADMIN = כבר מנהל קבוצה + +ALREADY_GROUP_MEMBER = כבר חבר בקבוצה + +ALREADY_VOTED_FOR_THAT_OPTION = כבר הצביע עבור אפשרות זו + +ASSET_ALREADY_EXISTS = הנכס כבר קיים + +ASSET_DOES_NOT_EXIST = הנכס אינו קיים + +ASSET_DOES_NOT_MATCH_AT = הנכס אינו תואם לנכס של AT + +ASSET_NOT_SPENDABLE = הנכס אינו ניתן לבזבז + +AT_ALREADY_EXISTS = AT כבר קיים + +AT_IS_FINISHED = AT הסתיים + +AT_UNKNOWN = AT לא ידוע + +BAN_EXISTS = החסימה כבר קיימת + +BAN_UNKNOWN = איסור לא ידוע + +BANNED_FROM_GROUP = חסום מהקבוצה + +BUYER_ALREADY_OWNER = הקונה כבר הבעלים + +CLOCK_NOT_SYNCED = שעון לא מסונכרן + +DUPLICATE_MESSAGE = כתובת שנשלחה הודעה כפולה + +DUPLICATE_OPTION = אפשרות שכפול + +GROUP_ALREADY_EXISTS = הקבוצה כבר קיימת + +GROUP_APPROVAL_DECIDED = אישור הקבוצה כבר הוחלט + +GROUP_APPROVAL_NOT_REQUIRED = אין צורך באישור קבוצתי + +GROUP_DOES_NOT_EXIST = קבוצה לא קיימת + +GROUP_ID_MISMATCH = אי התאמה של מזהה הקבוצה + +GROUP_OWNER_CANNOT_LEAVE = בעל הקבוצה לא יכול לעזוב את הקבוצה + +HAVE_EQUALS_WANT = have-asset זהה ל-want-asset + +INCORRECT_NONCE = לא תקין של PoW + +INSUFFICIENT_FEE = עמלה לא מספקת + +INVALID_ADDRESS = כתובת לא חוקית + +INVALID_AMOUNT = סכום לא חוקי + +INVALID_ASSET_OWNER = בעל נכס לא חוקי + +INVALID_AT_TRANSACTION = עסקת AT לא חוקית + +INVALID_AT_TYPE_LENGTH = אורך AT 'סוג' לא חוקי + +INVALID_BUT_OK = לא חוקי אבל בסדר + +INVALID_CREATION_BYTES = בתים לא חוקיים של יצירה + +INVALID_DATA_LENGTH = אורך נתונים לא חוקי + +INVALID_DESCRIPTION_LENGTH = אורך תיאור לא חוקי + +INVALID_GROUP_APPROVAL_THRESHOLD = סף לא חוקי לאישור קבוצה + +INVALID_GROUP_BLOCK_DELAY = עיכוב חסימת אישור קבוצה לא חוקי + +INVALID_GROUP_ID = מזהה קבוצה לא חוקי + +INVALID_GROUP_OWNER = בעל קבוצה לא חוקי + +INVALID_LIFETIME = משך חיים לא חוקי + +INVALID_NAME_LENGTH = אורך שם לא חוקי + +INVALID_NAME_OWNER = בעל שם לא חוקי + +INVALID_OPTION_LENGTH = אורך אפשרויות לא חוקי + +INVALID_OPTIONS_COUNT = ספירת אפשרויות לא חוקיות + +INVALID_ORDER_CREATOR = יוצר הזמנה לא חוקי + +INVALID_PAYMENTS_COUNT = ספירת תשלומים לא חוקיים + +INVALID_PUBLIC_KEY = מפתח ציבורי לא חוקי + +INVALID_QUANTITY = כמות לא חוקית + +INVALID_REFERENCE = הפניה לא חוקית + +INVALID_RETURN = החזרה לא חוקית + +INVALID_REWARD_SHARE_PERCENT = אחוז חלוקת תגמולים לא חוקי + +INVALID_SELLER = מוכר לא חוקי + +INVALID_TAGS_LENGTH = אורך 'תגים' לא חוקי + +INVALID_TIMESTAMP_SIGNATURE = חתימת חותמת זמן לא חוקית + +INVALID_TX_GROUP_ID = מזהה קבוצת עסקאות לא חוקי + +INVALID_VALUE_LENGTH = אורך 'ערך' לא חוקי + +INVITE_UNKNOWN = הזמנה לקבוצה לא ידועה + +JOIN_REQUEST_EXISTS = בקשת הצטרפות לקבוצה כבר קיימת + +MAXIMUM_REWARD_SHARES = כבר במספר המרבי של שיתופי תגמול עבור חשבון זה + +MISSING_CREATOR = חסר יוצר + +MULTIPLE_NAMES_FORBIDDEN = אסור להשתמש במספר שמות רשומים לכל חשבון + +NAME_ALREADY_FOR_SALE = שם כבר למכירה + +NAME_ALREADY_REGISTERED = השם כבר רשום + +NAME_BLOCKED = השם הזה חסום + +NAME_DOES_NOT_EXIST = שם לא קיים + +NAME_NOT_FOR_SALE = השם אינו למכירה + +NAME_NOT_NORMALIZED = שם לא בצורת Unicode 'מנורמלת' + +NEGATIVE_AMOUNT = סכום לא חוקי/שלילי + +NEGATIVE_FEE = עמלה לא חוקית/שלילית + +NEGATIVE_PRICE = מחיר לא חוקי/שלילי + +NO_BALANCE = איזון לא מספיק + +NO_BLOCKCHAIN_LOCK = הבלוקצ'יין של הצומת תפוס כעת + +NO_FLAG_PERMISSION = לחשבון אין הרשאה זו + +NOT_GROUP_ADMIN = החשבון אינו מנהל קבוצה + +NOT_GROUP_MEMBER = החשבון אינו חבר בקבוצה + +NOT_MINTING_ACCOUNT = החשבון אינו יכול להטביע + +NOT_YET_RELEASED = תכונה עדיין לא שוחררה + +OK = בסדר + +ORDER_ALREADY_CLOSED = הזמנת סחר בנכס כבר סגורה + +ORDER_DOES_NOT_EXIST = הוראת סחר בנכס לא קיימת + +POLL_ALREADY_EXISTS = סקר כבר קיים + +POLL_DOES_NOT_EXIST = סקר אינו קיים + +POLL_OPTION_DOES_NOT_EXIST = אפשרות סקר לא קיימת + +PUBLIC_KEY_UNKNOWN = מפתח ציבורי לא ידוע + +REWARD_SHARE_UNKNOWN = חלוקת פרס לא ידוע + +SELF_SHARE_EXISTS = שיתוף עצמי (שיתוף תגמול) כבר קיים + +TIMESTAMP_TOO_NEW = חותמת זמן חדשה מדי + +TIMESTAMP_TOO_OLD = חותמת זמן ישנה מדי + +TOO_MANY_UNCONFIRMED = בחשבון יש יותר מדי עסקאות לא מאושרות בהמתנה + +TRANSACTION_ALREADY_CONFIRMED = העסקה כבר אושרה + +TRANSACTION_ALREADY_EXISTS = עסקה כבר קיימת + +TRANSACTION_UNKNOWN = עסקה לא ידועה + +TX_GROUP_ID_MISMATCH = מזהה הקבוצה של העסקה אינו תואם From 5054773761f0b4312a0a90360324d66688965582 Mon Sep 17 00:00:00 2001 From: catbref Date: Sun, 10 Dec 2023 14:03:47 +0000 Subject: [PATCH 03/47] Chain AT-transaction references to avoid duplicates --- src/main/java/org/qortal/at/QortalATAPI.java | 4 + .../org/qortal/test/at/CrowdfundTests.java | 425 ++++++++++++++++++ 2 files changed, 429 insertions(+) create mode 100644 src/test/java/org/qortal/test/at/CrowdfundTests.java diff --git a/src/main/java/org/qortal/at/QortalATAPI.java b/src/main/java/org/qortal/at/QortalATAPI.java index 93dac568..276116fc 100644 --- a/src/main/java/org/qortal/at/QortalATAPI.java +++ b/src/main/java/org/qortal/at/QortalATAPI.java @@ -522,6 +522,10 @@ public class QortalATAPI extends API { /** Returns AT account's lastReference */ private byte[] getLastReference() { + // If we have transactions already, then use signature from last transaction + if (!this.transactions.isEmpty()) + return this.transactions.get(this.transactions.size() - 1).getTransactionData().getSignature(); + try { // Look up AT's account's last reference from repository Account atAccount = this.getATAccount(); diff --git a/src/test/java/org/qortal/test/at/CrowdfundTests.java b/src/test/java/org/qortal/test/at/CrowdfundTests.java new file mode 100644 index 00000000..6a60c1ab --- /dev/null +++ b/src/test/java/org/qortal/test/at/CrowdfundTests.java @@ -0,0 +1,425 @@ +package org.qortal.test.at; + +import org.ciyam.at.*; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; +import org.qortal.account.Account; +import org.qortal.account.PrivateKeyAccount; +import org.qortal.asset.Asset; +import org.qortal.at.AT; +import org.qortal.block.Block; +import org.qortal.data.at.ATData; +import org.qortal.data.at.ATStateData; +import org.qortal.data.block.BlockData; +import org.qortal.data.transaction.*; +import org.qortal.group.Group; +import org.qortal.repository.DataException; +import org.qortal.repository.Repository; +import org.qortal.repository.RepositoryManager; +import org.qortal.test.common.*; +import org.qortal.transaction.*; +import org.qortal.utils.*; + +import java.security.SecureRandom; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; + +import static org.junit.Assert.*; + +public class CrowdfundTests extends Common { + + /* + "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "amount": "1000000000" + "QixPbJUwsaHsVEofJdozU9zgVqkK6aYhrK", "amount": "1000000" + "QaUpHNhT3Ygx6avRiKobuLdusppR5biXjL", "amount": "1000000" + "Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er", "amount": "1000000" + */ + + private static final String aliceAddress = "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v"; + private static final String bobAddress = "QixPbJUwsaHsVEofJdozU9zgVqkK6aYhrK"; + private static final String chloeAddress = "QaUpHNhT3Ygx6avRiKobuLdusppR5biXjL"; + private static final String dilbertAddress = "Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er"; + + // Creation bytes from: java -cp 'target/qrowdfund-1.0.0.jar:target/dependency/*' org.qortal.at.qrowdfund.Qrowdfund 50 12385 Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er + private static final String creationBytes58 = "1Pub6o13xyqfCZj8BMzmXsREVJR6h4xxpS2VPV1R2QwjP78r2ozxsNuvb28GWrT8FoTTQMGnVP7pNii6auUqYr2uunWfcxwhERbDgFdsJqtrJMpQNGB9GerAXYyiFiij35cP6eHw7BmALb3viT6VzqaXX9YB25iztekV5cTreJg7o2hRpFc9Rv8Z9dFXcD1Mm4WCaMaknUgchDi7qDnHA7JX8bn9EFD4WMG5nZHMsrmeqBHirURXr2dMxFprTBo187zztmw7izbv5KzMFP8aRP9uEqdTMhZJmvKqhapMK9UJkxMve3KnsxKn5yyaAeiZ4i9GNfrkjpz5T1VGomUaDmeatNti1bjQ2pwtcgZfFFbrnBFMU2kvcPx1UR53dArtRS7pFbNr3EFwnw2Yiu2xS3Z"; + private static final byte[] creationBytes = Base58.decode(creationBytes58); + private static final long fundingAmount = 2_00000000L; + private static final long SLEEP_PERIOD = 50L; + + private Repository repository = null; + private PrivateKeyAccount deployer; + private DeployAtTransaction deployAtTransaction; + private Account atAccount; + private String atAddress; + private byte[] rawLastTxnTimestamp = new byte[8]; + private Transaction transaction; + + @Before + public void before() throws DataException { + Common.useDefaultSettings(); + + this.repository = RepositoryManager.getRepository(); + this.deployer = Common.getTestAccount(repository, "alice"); + + this.deployAtTransaction = doDeploy(repository, deployer, creationBytes, fundingAmount); + this.atAccount = deployAtTransaction.getATAccount(); + this.atAddress = deployAtTransaction.getATAccount().getAddress(); + } + + @After + public void after() throws DataException { + if (this.repository != null) + this.repository.close(); + + this.repository = null; + } + + @Test + public void testDeploy() throws DataException { + // Confirm initial value is zero + extractLastTxTimestamp(repository, atAddress, rawLastTxnTimestamp); + assertArrayEquals(new byte[8], rawLastTxnTimestamp); + } + + @Test + public void testThresholdNotMet() throws DataException { + // AT deployment in block 2 + + // Mint block to allow AT to initialize and call SLEEP_UNTIL_MESSAGE_OR_HEIGHT + BlockUtils.mintBlock(repository); // height now 3 + + // Fetch AT's balance for this height + long preMintBalance = atAccount.getConfirmedBalance(Asset.QORT); + + // Fetch AT's initial lastTxnTimestamp + byte[] creationTimestamp = new byte[8]; + extractLastTxTimestamp(repository, atAddress, creationTimestamp); + + // Mint several blocks + int i = repository.getBlockRepository().getBlockchainHeight(); + long WAKE_HEIGHT = i + SLEEP_PERIOD; + for (; i < WAKE_HEIGHT; ++i) + BlockUtils.mintBlock(repository); + + // We should now be at WAKE_HEIGHT + long height = repository.getBlockRepository().getBlockchainHeight(); + assertEquals(WAKE_HEIGHT, height); + + // AT should have woken and run at this height so balance should have changed + + // Fetch new AT balance + long postMintBalance = atAccount.getConfirmedBalance(Asset.QORT); + + assertNotSame(preMintBalance, postMintBalance); + + // Confirm AT has found no payments + extractLastTxTimestamp(repository, atAddress, rawLastTxnTimestamp); + assertArrayEquals(creationTimestamp, rawLastTxnTimestamp); + + // AT should have finished + ATData atData = repository.getATRepository().fromATAddress(atAddress); + assertTrue(atData.getIsFinished()); + + // AT should have sent balance back to creator + BlockData blockData = repository.getBlockRepository().getLastBlock(); + Block block = new Block(repository, blockData); + List transactions = block.getTransactions(); + + assertEquals(1, transactions.size()); + + Transaction transaction = transactions.get(0); + AtTransaction atTransaction = (AtTransaction) transaction; + assertEquals(aliceAddress, atTransaction.getRecipient().getAddress()); + } + + @Test + public void testThresholdNotMetWithOrphanage() throws DataException { + // AT deployment in block 2 + + // Mint block to allow AT to initialize and call SLEEP_UNTIL_MESSAGE_OR_HEIGHT + BlockUtils.mintBlock(repository); // height now 3 + + // Fetch AT's initial lastTxnTimestamp + byte[] creationTimestamp = new byte[8]; + extractLastTxTimestamp(repository, atAddress, creationTimestamp); + + // Mint several blocks + int i = repository.getBlockRepository().getBlockchainHeight(); + long WAKE_HEIGHT = i + SLEEP_PERIOD; + for (; i < WAKE_HEIGHT; ++i) + BlockUtils.mintBlock(repository); + + // AT should have finished + ATData atData = repository.getATRepository().fromATAddress(atAddress); + assertTrue(atData.getIsFinished()); + + // Orphan + BlockUtils.orphanBlocks(repository, 3); + + // Mint several blocks + for (i = 0; i < 3; ++i) + BlockUtils.mintBlock(repository); + + // Confirm AT has found no payments + extractLastTxTimestamp(repository, atAddress, rawLastTxnTimestamp); + assertArrayEquals(creationTimestamp, rawLastTxnTimestamp); + + // AT should have finished + atData = repository.getATRepository().fromATAddress(atAddress); + assertTrue(atData.getIsFinished()); + + // AT should have sent balance back to creator + BlockData blockData = repository.getBlockRepository().getLastBlock(); + Block block = new Block(repository, blockData); + List transactions = block.getTransactions(); + + assertEquals(1, transactions.size()); + + Transaction transaction = transactions.get(0); + AtTransaction atTransaction = (AtTransaction) transaction; + assertEquals(aliceAddress, atTransaction.getRecipient().getAddress()); + } + + @Test + public void testThresholdNotMetWithPaymentsAndRefunds() throws DataException { + // AT deployment in block 2 + + // Mint block to allow AT to initialize and call SLEEP_UNTIL_MESSAGE_OR_HEIGHT + BlockUtils.mintBlock(repository); // height now 3 + + // Fetch AT's balance for this height + long preMintBalance = atAccount.getConfirmedBalance(Asset.QORT); + + // Fetch AT's initial lastTxnTimestamp + byte[] creationTimestamp = new byte[8]; + extractLastTxTimestamp(repository, atAddress, creationTimestamp); + + int i = repository.getBlockRepository().getBlockchainHeight(); + long WAKE_HEIGHT = i + SLEEP_PERIOD; + + // Create some test accounts, based on donations + List> donations = List.of( + new Pair<>("QRt11DVBnLaSDxr2KHvx92LdPrjhbhJtkj", 500L), + new Pair<>("QRv7tHnaEpRtfovbTJqkJFmtnoahJrbPGg", 250L), + new Pair<>("QRv7tHnaEpRtfovbTJqkJFmtnoahJrbPGg", 250L), + new Pair<>("QczG8GXU5vPQLTZsJBASQd3fAKJzKwnubv", 250L), + new Pair<>("QNuYHyW4HJn7v3dYUxoTLiyS5tpGQAguMJ", 20L), + new Pair<>("QgVqcSZZ6HRhBvdUmpTvEonaQaH2oWfe58", 500L), + new Pair<>("QfDaxmD8jKi3TovWA1NA8RL5rWYXRC12uX", 10L), + new Pair<>("QSohMWUphRwtEuwAZKqoy8UGS13tk1bBDm", 15L), + new Pair<>("QiNKXRfnX9mTodSed1yRQexhL1HA42RHHo", 420L), + new Pair<>("Qgfh143pRJyxpS92JoazjXNMH1uZueQBZ2", 100L), + new Pair<>("Qgfh143pRJyxpS92JoazjXNMH1uZueQBZ2", 100L) + ); + Map donors = donations.stream() + .map(donation -> donation.getA()) + .distinct() + .collect(Collectors.toMap(name -> name, name -> generateTestAccount(repository, name))); + + // Give donors some QORT so they can donate + donors.values() + .stream() + .forEach(donorAccount -> { + try { + AccountUtils.pay(repository, Common.getTestAccount(repository, "alice"), donorAccount.getAddress(), 2000_00000000L); + } catch (DataException e) { + fail(e.getMessage()); + } + }); + + // Record balances + Map initialDonorBalances = donors.values() + .stream() + .collect(Collectors.toMap(account -> account.getAddress(), account -> { + try { + return account.getConfirmedBalance(Asset.QORT); + } catch (DataException e) { + fail(e.getMessage()); + return null; + } + })); + + // Now make donations + donations.stream() + .forEach(donation -> { + TestAccount donorAccount = donors.get(donation.getA()); + try { + AccountUtils.pay(repository, donorAccount, atAddress, donation.getB() * 1_00000000L); + System.out.printf("AT balance at height %d is %s\n", repository.getBlockRepository().getBlockchainHeight(), Amounts.prettyAmount(atAccount.getConfirmedBalance(Asset.QORT))); + } catch (DataException e) { + fail(e.getMessage()); + } + }); + + // Mint several blocks + i = repository.getBlockRepository().getBlockchainHeight(); + for (; i < WAKE_HEIGHT; ++i) { + BlockUtils.mintBlock(repository); + System.out.printf("AT balance at height %d is %s\n", repository.getBlockRepository().getBlockchainHeight(), Amounts.prettyAmount(atAccount.getConfirmedBalance(Asset.QORT))); + } + + // We should now be at WAKE_HEIGHT + long height = repository.getBlockRepository().getBlockchainHeight(); + assertEquals(WAKE_HEIGHT, height); + + // AT should have woken and run at this height so balance should have changed + System.out.printf("AT balance at height %d is %s\n", repository.getBlockRepository().getBlockchainHeight(), Amounts.prettyAmount(atAccount.getConfirmedBalance(Asset.QORT))); + + // Fetch new AT balance + long postMintBalance = atAccount.getConfirmedBalance(Asset.QORT); + + assertNotSame(preMintBalance, postMintBalance); + + + // Payments might happen over multiple blocks! + Map expectedBalances = new HashMap<>(initialDonorBalances); + + ATData atData; + do { + // Confirm AT has found payments + extractLastTxTimestamp(repository, atAddress, rawLastTxnTimestamp); + assertNotSame(ByteArray.wrap(creationTimestamp), ByteArray.copyOf(rawLastTxnTimestamp)); + + // AT should have sent refunds + BlockData blockData = repository.getBlockRepository().getLastBlock(); + Block block = new Block(repository, blockData); + List transactions = block.getTransactions(); + + assertNotSame(0, transactions.size()); + + // Compute expected balances + for (var transaction : transactions) { + AtTransaction atTransaction = (AtTransaction) transaction; + ATTransactionData atTransactionData = (ATTransactionData) atTransaction.getTransactionData(); + String recipient = atTransactionData.getRecipient(); + + // Skip if this is a refund to AT deployer + if (recipient.equals(aliceAddress)) + continue; + + String donorName = donors.entrySet() + .stream() + .filter(donor -> donor.getValue().getAddress().equals(recipient)) + .findFirst() + .get() + .getKey(); + System.out.printf("AT paid %s to %s\n", Amounts.prettyAmount(atTransactionData.getAmount()), donorName); + + expectedBalances.compute(atTransactionData.getRecipient(), (key, balance) -> balance - AccountUtils.fee); + } + + // AT should have finished + atData = repository.getATRepository().fromATAddress(atAddress); + + // Mint new block in case we need to loop round again + BlockUtils.mintBlock(repository); + System.out.printf("AT balance at height %d is %s\n", repository.getBlockRepository().getBlockchainHeight(), Amounts.prettyAmount(atAccount.getConfirmedBalance(Asset.QORT))); + } while (!atData.getIsFinished()); + + // Compare expected balances + donors.entrySet() + .forEach(donor -> { + String donorName = donor.getKey(); + TestAccount donorAccount = donor.getValue(); + + Long expectedBalance = expectedBalances.get(donorAccount.getAddress()); + Long actualBalance = null; + try { + actualBalance = donorAccount.getConfirmedBalance(Asset.QORT); + } catch (DataException e) { + fail(e.getMessage()); + } + + assertEquals(expectedBalance, actualBalance); + }); + } + + + private DeployAtTransaction doDeploy(Repository repository, PrivateKeyAccount deployer, byte[] creationBytes, long fundingAmount) throws DataException { + long txTimestamp = System.currentTimeMillis(); + byte[] lastReference = deployer.getLastReference(); + + if (lastReference == null) { + System.err.println(String.format("Qortal account %s has no last reference", deployer.getAddress())); + System.exit(2); + } + + Long fee = null; + String name = "Test AT"; + String description = "Test AT"; + String atType = "Test"; + String tags = "TEST"; + + BaseTransactionData baseTransactionData = new BaseTransactionData(txTimestamp, Group.NO_GROUP, lastReference, deployer.getPublicKey(), fee, null); + TransactionData deployAtTransactionData = new DeployAtTransactionData(baseTransactionData, name, description, atType, tags, creationBytes, fundingAmount, Asset.QORT); + + DeployAtTransaction deployAtTransaction = new DeployAtTransaction(repository, deployAtTransactionData); + + fee = deployAtTransaction.calcRecommendedFee(); + deployAtTransactionData.setFee(fee); + + TransactionUtils.signAndMint(repository, deployAtTransactionData, deployer); + + return deployAtTransaction; + } + + private void extractLastTxTimestamp(Repository repository, String atAddress, byte[] rawLastTxnTimestamp) throws DataException { + // Check AT result + ATStateData atStateData = repository.getATRepository().getLatestATState(atAddress); + byte[] stateData = atStateData.getStateData(); + + byte[] dataBytes = MachineState.extractDataBytes(stateData); + + System.arraycopy(dataBytes, 5 * MachineState.VALUE_SIZE, rawLastTxnTimestamp, 0, rawLastTxnTimestamp.length); + } + + private void assertTimestamp(Repository repository, String atAddress, Transaction transaction) throws DataException { + int height = transaction.getHeight(); + byte[] transactionSignature = transaction.getTransactionData().getSignature(); + + BlockData blockData = repository.getBlockRepository().fromHeight(height); + assertNotNull(blockData); + + Block block = new Block(repository, blockData); + + List blockTransactions = block.getTransactions(); + int sequence; + for (sequence = blockTransactions.size() - 1; sequence >= 0; --sequence) + if (Arrays.equals(blockTransactions.get(sequence).getTransactionData().getSignature(), transactionSignature)) + break; + + assertNotSame(-1, sequence); + + byte[] rawLastTxTimestamp = new byte[8]; + extractLastTxTimestamp(repository, atAddress, rawLastTxTimestamp); + + Timestamp expectedTimestamp = new Timestamp(height, sequence); + Timestamp actualTimestamp = new Timestamp(BitTwiddling.longFromBEBytes(rawLastTxTimestamp, 0)); + + assertEquals(String.format("Expected height %d, seq %d but was height %d, seq %d", + height, sequence, + actualTimestamp.blockHeight, actualTimestamp.transactionSequence + ), + expectedTimestamp.longValue(), + actualTimestamp.longValue()); + + byte[] expectedPartialSignature = new byte[24]; + System.arraycopy(transactionSignature, 8, expectedPartialSignature, 0, expectedPartialSignature.length); + + byte[] actualPartialSignature = new byte[24]; + System.arraycopy(rawLastTxTimestamp, 8, actualPartialSignature, 0, actualPartialSignature.length); + + assertArrayEquals(expectedPartialSignature, actualPartialSignature); + } + + private static TestAccount generateTestAccount(Repository repository, String accountName) { + byte[] seed = new byte[32]; + new SecureRandom().nextBytes(seed); + return new TestAccount(repository, accountName, Base58.encode(seed), false); + } + +} From c989e3c41305f2d7024dbf663915a3967b3910e7 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Tue, 12 Dec 2023 10:05:24 +0100 Subject: [PATCH 04/47] Rework trustless manager --- .../crypto/TrustlessSSLSocketFactory.java | 27 +++++++++---------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/qortal/crypto/TrustlessSSLSocketFactory.java b/src/main/java/org/qortal/crypto/TrustlessSSLSocketFactory.java index f14efae8..3643e552 100644 --- a/src/main/java/org/qortal/crypto/TrustlessSSLSocketFactory.java +++ b/src/main/java/org/qortal/crypto/TrustlessSSLSocketFactory.java @@ -1,33 +1,33 @@ package org.qortal.crypto; -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; +import javax.net.ssl.*; import java.security.cert.X509Certificate; public abstract class TrustlessSSLSocketFactory { - // Create a trust manager that does not validate certificate chains + /** + * Creates a SSLSocketFactory that ignore certificate chain validation because ElectrumX servers use mostly + * self signed certificates. + */ private static final TrustManager[] TRUSTLESS_MANAGER = new TrustManager[] { new X509TrustManager() { - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - return new X509Certificate[0]; + public X509Certificate[] getAcceptedIssuers() { + return null; } - - public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) { + public void checkClientTrusted(X509Certificate[] certs, String authType) { } - - public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) { + public void checkServerTrusted(X509Certificate[] certs, String authType) { } } }; - // Install the all-trusting trust manager + /** + * Install the all-trusting trust manager. + */ private static final SSLContext sc; static { try { - sc = SSLContext.getInstance("TLSv1.3"); + sc = SSLContext.getInstance("SSL"); sc.init(null, TRUSTLESS_MANAGER, new java.security.SecureRandom()); } catch (Exception e) { throw new RuntimeException(e); @@ -37,5 +37,4 @@ public abstract class TrustlessSSLSocketFactory { public static SSLSocketFactory getSocketFactory() { return sc.getSocketFactory(); } - } From 79b674d2f2693c3b769efd3d4cf2ec9fdf406802 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Tue, 12 Dec 2023 10:25:18 +0100 Subject: [PATCH 05/47] Update AT metadata --- lib/org/ciyam/AT/maven-metadata-local.xml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/org/ciyam/AT/maven-metadata-local.xml b/lib/org/ciyam/AT/maven-metadata-local.xml index d8f3dd34..355c973f 100644 --- a/lib/org/ciyam/AT/maven-metadata-local.xml +++ b/lib/org/ciyam/AT/maven-metadata-local.xml @@ -5,14 +5,11 @@ 1.4.1 - 1.3.4 - 1.3.5 - 1.3.6 1.3.7 1.3.8 1.4.0 1.4.1 - 20230821074325 + 20231212092227 From bf8005aa5a010a1f2fddf2a3e8391f9963416057 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Tue, 12 Dec 2023 10:26:30 +0100 Subject: [PATCH 06/47] Update AT --- lib/org/ciyam/AT/1.4.1/AT-1.4.1.jar | Bin 161850 -> 161856 bytes lib/org/ciyam/AT/1.4.1/AT-1.4.1.pom | 17 ++++++++--------- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/org/ciyam/AT/1.4.1/AT-1.4.1.jar b/lib/org/ciyam/AT/1.4.1/AT-1.4.1.jar index 05c548c8b59e0ca4254cb43fe5f809fe80a0c83e..20e773a4588153466ae87dd8fea4a3f16d37a371 100644 GIT binary patch delta 8354 zcmZu$30#fY`@iR0ZAzsTX-}JoED=()N}DN__NT|i8R-^GnSM+ zQc`0XO&a_dTO}jgsQ>ex^Opae#^=+g-R3KO1OkCC{Adu}nOHl|#!@+1X^#9g3(xx6Z^qmiCz}^z zB)k9%PwCTN_eOBP@{zd^07N5^CH)yoeyA2F90Y@agDcg>tj7XDg{Z>H zND{Fc5ljW_T$O~}K$5uwrOMDzm<>9G=%UQWrOkD)s0|hwii>Jm=^DwTYiRrcy83~^ zJ~nl17?KexbBcU&Jg2-83IvvN1Qj9!iRWP4%`_Z;g7(spcxPD@TlP=}Ph~v9o$j&0 zw7H{raXWmLX?Zw&Jmb?@_`{`W;N#EnksJ?28F(-$R zi4?4B`Qc&IQ?CBVn^Kg_wZ<-`nSxLEpKCYJBb=9OeJ$4A%DhK4xs@I{zqN>53{tiR^|&OAvy65F%}Xp zO}vb)XzxMtbj7Km=m?`>9UsBIE%ib7SfKUfA$_QCy#7Kzu~CvN+RuDb+8%mi0{G?_ zF;qaqB?^Yfg^Gx`6}B+a^)@%<=yG{myq|5&sn*|LebpCsv3^K5Q(CQrav1FOBeK(E z0XCDm{G~P?!d$-f)%?V!0RlmXJl$)=dkL18xNJr(EbPTfvP^qI>^TOMbvs$C3#uAP zi3eoZmnLM*Xc>gFT_KX&@i(Qnu^G*0Yo1%C|F96&B+?>~HGMf_ci#%9v$YR>gPA^y zfqZhQ*rMkHXufX$X7XP}MgoD|Y!OiAM5?kLZH=^63)OKmn8KOHLnTX43YZ;d1 z9u{0lnZ+_>h1E~)Mj7PeNkDbGMbZY?3{8?R--jlOY$V_5Xh#VR4`DrqXtN{2= z7KS a}mFfF;iqxUT5s}J&9ugFf!QhsL; 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 D8A>g9 diff --git a/lib/org/ciyam/AT/1.4.1/AT-1.4.1.pom b/lib/org/ciyam/AT/1.4.1/AT-1.4.1.pom index 16f644b9..d88a53e2 100644 --- a/lib/org/ciyam/AT/1.4.1/AT-1.4.1.pom +++ b/lib/org/ciyam/AT/1.4.1/AT-1.4.1.pom @@ -10,14 +10,13 @@ UTF-8 false - - 3.8.1 - 3.2.0 - 3.3.1 - 3.0.0-M4 - 3.2.0 - - 1.64 + 1.69 + 4.13.2 + 3.11.0 + 3.3.0 + 3.6.3 + 3.3.0 + 3.2.2 @@ -117,7 +116,7 @@ junit junit - 4.13 + ${junit.version} test From 87b3b037bdc2938243e9c62c27a29c9ebb00b40e Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Tue, 12 Dec 2023 16:20:30 +0100 Subject: [PATCH 07/47] Update dependencies --- pom.xml | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index b64917f4..4d736704 100644 --- a/pom.xml +++ b/pom.xml @@ -10,18 +10,18 @@ 7dc8c6f 0.15.10 1.69 - 3.4.0 + 3.5.0 ${maven.build.timestamp} 1.4.1 3.8.0 1.11.0 2.11.0 - 1.24.0 - 3.13.0 + 1.25.0 + 3.14.0 1.2.2 0.12.3 4.9.10 - 1.59.0 + 1.60.0 32.1.3-jre 2.2 1.2.1 @@ -34,7 +34,7 @@ 9.4.53.v20231009 1.1.1 20231013 - 1.16.2 + 1.17.1 5.10.0 1.0.0 2.21.1 @@ -46,15 +46,15 @@ 3.2.2 1.1.0 UTF-8 - 3.24.4 + 3.25.0 1.5.3 0.16 1.17 1.7.36 2.0.10 - 5.9.0 + 5.10.3 1.2 - 2.16.1 + 2.16.2 1.9 From 5afa4e5b1ad38fa962da1204c4e768b09990c731 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Tue, 12 Dec 2023 17:05:08 +0100 Subject: [PATCH 08/47] Default minPeerVersion set to 4.4.0 --- src/main/java/org/qortal/settings/Settings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java index ba90208b..29c726b1 100644 --- a/src/main/java/org/qortal/settings/Settings.java +++ b/src/main/java/org/qortal/settings/Settings.java @@ -221,7 +221,7 @@ public class Settings { public long recoveryModeTimeout = 9999999999999L; /** Minimum peer version number required in order to sync with them */ - private String minPeerVersion = "4.3.2"; + private String minPeerVersion = "4.4.0"; /** Whether to allow connections with peers below minPeerVersion * If true, we won't sync with them but they can still sync with us, and will show in the peers list * If false, sync will be blocked both ways, and they will not appear in the peers list */ From 72aa7b7a770840c83062847ad7e13ba21c5d5e37 Mon Sep 17 00:00:00 2001 From: QuickMythril Date: Tue, 19 Dec 2023 20:38:41 -0500 Subject: [PATCH 09/47] Add vote weights to API call --- .../java/org/qortal/api/model/PollVotes.java | 30 ++++++++++++++++++- .../qortal/api/resource/PollsResource.java | 23 ++++++++++++-- 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/qortal/api/model/PollVotes.java b/src/main/java/org/qortal/api/model/PollVotes.java index 2768694f..49191be2 100644 --- a/src/main/java/org/qortal/api/model/PollVotes.java +++ b/src/main/java/org/qortal/api/model/PollVotes.java @@ -20,17 +20,25 @@ public class PollVotes { @Schema(description = "Total number of votes") public Integer totalVotes; + @Schema(description = "Total weight of votes") + public Integer totalWeight; + @Schema(description = "List of vote counts for each option") public List voteCounts; + @Schema(description = "List of vote weights for each option") + public List voteWeights; + // For JAX-RS protected PollVotes() { } - public PollVotes(List votes, Integer totalVotes, List voteCounts) { + public PollVotes(List votes, Integer totalVotes, Integer totalWeight, List voteCounts, List voteWeights) { this.votes = votes; this.totalVotes = totalVotes; + this.totalWeight = totalWeight; this.voteCounts = voteCounts; + this.voteWeights = voteWeights; } @Schema(description = "Vote info") @@ -52,4 +60,24 @@ public class PollVotes { this.voteCount = voteCount; } } + + @Schema(description = "Vote weights") + // All properties to be converted to JSON via JAX-RS + @XmlAccessorType(XmlAccessType.FIELD) + public static class OptionWeight { + @Schema(description = "Option name") + public String optionName; + + @Schema(description = "Vote weight") + public Integer voteWeight; + + // For JAX-RS + protected OptionWeight() { + } + + public OptionWeight(String optionName, Integer voteWeight) { + this.optionName = optionName; + this.voteWeight = voteWeight; + } + } } diff --git a/src/main/java/org/qortal/api/resource/PollsResource.java b/src/main/java/org/qortal/api/resource/PollsResource.java index aaa4f79c..2b9020ab 100644 --- a/src/main/java/org/qortal/api/resource/PollsResource.java +++ b/src/main/java/org/qortal/api/resource/PollsResource.java @@ -13,6 +13,8 @@ import org.qortal.api.ApiErrors; import org.qortal.api.ApiException; import org.qortal.api.ApiExceptionFactory; import org.qortal.api.model.PollVotes; +import org.qortal.crypto.Crypto; +import org.qortal.data.account.AccountData; import org.qortal.data.transaction.CreatePollTransactionData; import org.qortal.data.transaction.VoteOnPollTransactionData; import org.qortal.data.voting.PollData; @@ -129,12 +131,25 @@ public class PollsResource { for (PollOptionData optionData : pollData.getPollOptions()) { voteCountMap.put(optionData.getOptionName(), 0); } + // Initialize map for counting vote weights + Map voteWeightMap = new HashMap<>(); + for (PollOptionData optionData : pollData.getPollOptions()) { + voteWeightMap.put(optionData.getOptionName(), 0); + } int totalVotes = 0; + int totalWeight = 0; for (VoteOnPollData vote : votes) { + String voter = Crypto.toAddress(vote.getVoterPublicKey()); + AccountData voterData = repository.getAccountRepository().getAccount(voter); + int voteWeight = voterData.getBlocksMinted() - voterData.getBlocksMintedPenalty(); + if (voteWeight < 0) voteWeight = 0; + totalWeight += voteWeight; + String selectedOption = pollData.getPollOptions().get(vote.getOptionIndex()).getOptionName(); if (voteCountMap.containsKey(selectedOption)) { voteCountMap.put(selectedOption, voteCountMap.get(selectedOption) + 1); + voteWeightMap.put(selectedOption, voteWeightMap.get(selectedOption) + voteWeight); totalVotes++; } } @@ -143,11 +158,15 @@ public class PollsResource { List voteCounts = voteCountMap.entrySet().stream() .map(entry -> new PollVotes.OptionCount(entry.getKey(), entry.getValue())) .collect(Collectors.toList()); + // Convert map to list of WeightInfo + List voteWeights = voteWeightMap.entrySet().stream() + .map(entry -> new PollVotes.OptionWeight(entry.getKey(), entry.getValue())) + .collect(Collectors.toList()); if (onlyCounts != null && onlyCounts) { - return new PollVotes(null, totalVotes, voteCounts); + return new PollVotes(null, totalVotes, totalWeight, voteCounts, voteWeights); } else { - return new PollVotes(votes, totalVotes, voteCounts); + return new PollVotes(votes, totalVotes, totalWeight, voteCounts, voteWeights); } } catch (ApiException e) { throw e; From de9c3e551d1c915828ea2b025a1c236474694a27 Mon Sep 17 00:00:00 2001 From: kennycud Date: Tue, 19 Dec 2023 18:33:36 -0800 Subject: [PATCH 10/47] Extracted Server classes into ServerConfigurationInfo in order offer foreign blockchain server information to the Core API --- .../resource/CrossChainBitcoinResource.java | 21 +++++++ .../resource/CrossChainDigibyteResource.java | 21 +++++++ .../resource/CrossChainDogecoinResource.java | 21 +++++++ .../resource/CrossChainLitecoinResource.java | 21 +++++++ .../CrossChainPirateChainResource.java | 22 +++++++ .../resource/CrossChainRavencoinResource.java | 21 +++++++ .../java/org/qortal/crosschain/Bitcoin.java | 2 +- .../BitcoinyBlockchainProvider.java | 8 +++ .../java/org/qortal/crosschain/Digibyte.java | 2 +- .../java/org/qortal/crosschain/Dogecoin.java | 2 +- .../java/org/qortal/crosschain/ElectrumX.java | 62 +++++++++++++++---- .../java/org/qortal/crosschain/Litecoin.java | 2 +- .../org/qortal/crosschain/PirateChain.java | 2 +- .../qortal/crosschain/PirateLightClient.java | 52 +++++++++++++--- .../java/org/qortal/crosschain/Ravencoin.java | 2 +- .../crosschain/ServerConfigurationInfo.java | 60 ++++++++++++++++++ .../test/crosschain/ElectrumXTests.java | 2 +- 17 files changed, 293 insertions(+), 30 deletions(-) create mode 100644 src/main/java/org/qortal/crosschain/ServerConfigurationInfo.java diff --git a/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java index 88cd622d..0abf7c0e 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java @@ -19,6 +19,7 @@ import org.qortal.crosschain.AddressInfo; import org.qortal.crosschain.Bitcoin; import org.qortal.crosschain.ForeignBlockchainException; import org.qortal.crosschain.SimpleTransaction; +import org.qortal.crosschain.ServerConfigurationInfo; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; @@ -283,4 +284,24 @@ public class CrossChainBitcoinResource { return spendTransaction.getTxId().toString(); } + @GET + @Path("/serverinfos") + @Operation( + summary = "Returns current Bitcoin server configuration", + description = "Returns current Bitcoin server locations and use status", + responses = { + @ApiResponse( + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConfigurationInfo.class + ) + ) + ) + } + ) + public ServerConfigurationInfo getServerConfiguration() { + + return CrossChainUtils.buildServerConfigurationInfo(Bitcoin.getInstance()); + } } diff --git a/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java b/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java index 3ab944ab..e675200b 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java @@ -19,6 +19,7 @@ import org.qortal.crosschain.AddressInfo; import org.qortal.crosschain.Digibyte; import org.qortal.crosschain.ForeignBlockchainException; import org.qortal.crosschain.SimpleTransaction; +import org.qortal.crosschain.ServerConfigurationInfo; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; @@ -283,4 +284,24 @@ public class CrossChainDigibyteResource { return spendTransaction.getTxId().toString(); } + @GET + @Path("/serverinfos") + @Operation( + summary = "Returns current Digibyte server configuration", + description = "Returns current Digibyte server locations and use status", + responses = { + @ApiResponse( + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConfigurationInfo.class + ) + ) + ) + } + ) + public ServerConfigurationInfo getServerConfiguration() { + + return CrossChainUtils.buildServerConfigurationInfo(Digibyte.getInstance()); + } } diff --git a/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java index b66b5716..e292f8e2 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java @@ -19,6 +19,7 @@ import org.qortal.crosschain.AddressInfo; import org.qortal.crosschain.Dogecoin; import org.qortal.crosschain.ForeignBlockchainException; import org.qortal.crosschain.SimpleTransaction; +import org.qortal.crosschain.ServerConfigurationInfo; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; @@ -283,4 +284,24 @@ public class CrossChainDogecoinResource { return spendTransaction.getTxId().toString(); } + @GET + @Path("/serverinfos") + @Operation( + summary = "Returns current Dogecoin server configuration", + description = "Returns current Dogecoin server locations and use status", + responses = { + @ApiResponse( + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConfigurationInfo.class + ) + ) + ) + } + ) + public ServerConfigurationInfo getServerConfiguration() { + + return CrossChainUtils.buildServerConfigurationInfo(Dogecoin.getInstance()); + } } diff --git a/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java index 53274f1e..38a8a598 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java @@ -19,6 +19,7 @@ import org.qortal.crosschain.AddressInfo; import org.qortal.crosschain.ForeignBlockchainException; import org.qortal.crosschain.Litecoin; import org.qortal.crosschain.SimpleTransaction; +import org.qortal.crosschain.ServerConfigurationInfo; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; @@ -283,4 +284,24 @@ public class CrossChainLitecoinResource { return spendTransaction.getTxId().toString(); } + @GET + @Path("/serverinfos") + @Operation( + summary = "Returns current Litecoin server configuration", + description = "Returns current Litecoin server locations and use status", + responses = { + @ApiResponse( + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConfigurationInfo.class + ) + ) + ) + } + ) + public ServerConfigurationInfo getServerConfiguration() { + + return CrossChainUtils.buildServerConfigurationInfo(Litecoin.getInstance()); + } } diff --git a/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java b/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java index 7f2e8402..0e29e892 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java @@ -16,6 +16,7 @@ import org.qortal.api.model.crosschain.PirateChainSendRequest; import org.qortal.crosschain.ForeignBlockchainException; import org.qortal.crosschain.PirateChain; import org.qortal.crosschain.SimpleTransaction; +import org.qortal.crosschain.ServerConfigurationInfo; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; @@ -329,4 +330,25 @@ public class CrossChainPirateChainResource { throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE, e.getMessage()); } } + + @GET + @Path("/serverinfos") + @Operation( + summary = "Returns current PirateChain server configuration", + description = "Returns current PirateChain server locations and use status", + responses = { + @ApiResponse( + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConfigurationInfo.class + ) + ) + ) + } + ) + public ServerConfigurationInfo getServerConfiguration() { + + return CrossChainUtils.buildServerConfigurationInfo(PirateChain.getInstance()); + } } diff --git a/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java index 4d3f204d..64ebc136 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java @@ -19,6 +19,7 @@ import org.qortal.crosschain.AddressInfo; import org.qortal.crosschain.ForeignBlockchainException; import org.qortal.crosschain.Ravencoin; import org.qortal.crosschain.SimpleTransaction; +import org.qortal.crosschain.ServerConfigurationInfo; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.GET; @@ -283,4 +284,24 @@ public class CrossChainRavencoinResource { return spendTransaction.getTxId().toString(); } + @GET + @Path("/serverinfos") + @Operation( + summary = "Returns current Ravencoin server configuration", + description = "Returns current Ravencoin server locations and use status", + responses = { + @ApiResponse( + content = @Content( + mediaType = MediaType.APPLICATION_JSON, + schema = @Schema( + implementation = ServerConfigurationInfo.class + ) + ) + ) + } + ) + public ServerConfigurationInfo getServerConfiguration() { + + return CrossChainUtils.buildServerConfigurationInfo(Ravencoin.getInstance()); + } } diff --git a/src/main/java/org/qortal/crosschain/Bitcoin.java b/src/main/java/org/qortal/crosschain/Bitcoin.java index 801b141c..b2a016e7 100644 --- a/src/main/java/org/qortal/crosschain/Bitcoin.java +++ b/src/main/java/org/qortal/crosschain/Bitcoin.java @@ -7,7 +7,7 @@ import org.bitcoinj.params.MainNetParams; import org.bitcoinj.params.RegTestParams; import org.bitcoinj.params.TestNet3Params; import org.qortal.crosschain.ElectrumX.Server; -import org.qortal.crosschain.ElectrumX.Server.ConnectionType; +import org.qortal.crosschain.ChainableServer.ConnectionType; import org.qortal.settings.Settings; import java.util.Arrays; diff --git a/src/main/java/org/qortal/crosschain/BitcoinyBlockchainProvider.java b/src/main/java/org/qortal/crosschain/BitcoinyBlockchainProvider.java index d8b4f653..238eff38 100644 --- a/src/main/java/org/qortal/crosschain/BitcoinyBlockchainProvider.java +++ b/src/main/java/org/qortal/crosschain/BitcoinyBlockchainProvider.java @@ -3,6 +3,7 @@ package org.qortal.crosschain; import cash.z.wallet.sdk.rpc.CompactFormats.CompactBlock; import java.util.List; +import java.util.Set; public abstract class BitcoinyBlockchainProvider { @@ -59,4 +60,11 @@ public abstract class BitcoinyBlockchainProvider { /** Broadcasts raw, serialized, transaction bytes to network, returning success/failure. */ public abstract void broadcastTransaction(byte[] rawTransaction) throws ForeignBlockchainException; + public abstract Set getServers(); + + public abstract List getRemainingServers(); + + public abstract Set getUselessServers(); + + public abstract ChainableServer getCurrentServer(); } diff --git a/src/main/java/org/qortal/crosschain/Digibyte.java b/src/main/java/org/qortal/crosschain/Digibyte.java index 4e725e89..bda6c18d 100644 --- a/src/main/java/org/qortal/crosschain/Digibyte.java +++ b/src/main/java/org/qortal/crosschain/Digibyte.java @@ -7,7 +7,7 @@ import org.bitcoinj.params.RegTestParams; import org.bitcoinj.params.TestNet3Params; import org.libdohj.params.DigibyteMainNetParams; import org.qortal.crosschain.ElectrumX.Server; -import org.qortal.crosschain.ElectrumX.Server.ConnectionType; +import org.qortal.crosschain.ChainableServer.ConnectionType; import org.qortal.settings.Settings; import java.util.Arrays; diff --git a/src/main/java/org/qortal/crosschain/Dogecoin.java b/src/main/java/org/qortal/crosschain/Dogecoin.java index 93941c41..c687ca60 100644 --- a/src/main/java/org/qortal/crosschain/Dogecoin.java +++ b/src/main/java/org/qortal/crosschain/Dogecoin.java @@ -6,7 +6,7 @@ import org.bitcoinj.core.NetworkParameters; import org.libdohj.params.DogecoinMainNetParams; import org.libdohj.params.DogecoinTestNet3Params; import org.qortal.crosschain.ElectrumX.Server; -import org.qortal.crosschain.ElectrumX.Server.ConnectionType; +import org.qortal.crosschain.ChainableServer.ConnectionType; import org.qortal.settings.Settings; import java.util.Arrays; diff --git a/src/main/java/org/qortal/crosschain/ElectrumX.java b/src/main/java/org/qortal/crosschain/ElectrumX.java index 5915ba04..27e140e2 100644 --- a/src/main/java/org/qortal/crosschain/ElectrumX.java +++ b/src/main/java/org/qortal/crosschain/ElectrumX.java @@ -43,12 +43,11 @@ public class ElectrumX extends BitcoinyBlockchainProvider { private static final String VERBOSE_TRANSACTIONS_UNSUPPORTED_MESSAGE = "verbose transactions are currently unsupported"; private static final int RESPONSE_TIME_READINGS = 5; - private static final long MAX_AVG_RESPONSE_TIME = 1000L; // ms + private static final long MAX_AVG_RESPONSE_TIME = 2000L; // ms - public static class Server { + public static class Server implements ChainableServer { String hostname; - public enum ConnectionType { TCP, SSL } ConnectionType connectionType; int port; @@ -60,6 +59,7 @@ public class ElectrumX extends BitcoinyBlockchainProvider { this.port = port; } + @Override public void addResponseTime(long responseTime) { while (this.responseTimes.size() > RESPONSE_TIME_READINGS) { this.responseTimes.remove(0); @@ -67,6 +67,7 @@ public class ElectrumX extends BitcoinyBlockchainProvider { this.responseTimes.add(responseTime); } + @Override public long averageResponseTime() { if (this.responseTimes.size() < RESPONSE_TIME_READINGS) { // Not enough readings yet @@ -79,6 +80,21 @@ public class ElectrumX extends BitcoinyBlockchainProvider { return 0L; } + @Override + public String getHostName() { + return this.hostname; + } + + @Override + public int getPort() { + return this.port; + } + + @Override + public ConnectionType getConnectionType() { + return this.connectionType; + } + @Override public boolean equals(Object other) { if (other == this) @@ -104,9 +120,9 @@ public class ElectrumX extends BitcoinyBlockchainProvider { return String.format("%s:%s:%d", this.connectionType.name(), this.hostname, this.port); } } - private Set servers = new HashSet<>(); - private List remainingServers = new ArrayList<>(); - private Set uselessServers = Collections.synchronizedSet(new HashSet<>()); + private Set servers = new HashSet<>(); + private List remainingServers = new ArrayList<>(); + private Set uselessServers = Collections.synchronizedSet(new HashSet<>()); private final String netId; private final String expectedGenesisHash; @@ -114,7 +130,7 @@ public class ElectrumX extends BitcoinyBlockchainProvider { private Bitcoiny blockchain; private final Object serverLock = new Object(); - private Server currentServer; + private ChainableServer currentServer; private Socket socket; private Scanner scanner; private int nextId = 1; @@ -638,7 +654,7 @@ public class ElectrumX extends BitcoinyBlockchainProvider { if (!this.remainingServers.isEmpty()) { long averageResponseTime = this.currentServer.averageResponseTime(); if (averageResponseTime > MAX_AVG_RESPONSE_TIME) { - LOGGER.info("Slow average response time {}ms from {} - trying another server...", averageResponseTime, this.currentServer.hostname); + LOGGER.info("Slow average response time {}ms from {} - trying another server...", averageResponseTime, this.currentServer.getHostName()); this.closeServer(); break; } @@ -663,20 +679,20 @@ public class ElectrumX extends BitcoinyBlockchainProvider { return true; while (!this.remainingServers.isEmpty()) { - Server server = this.remainingServers.remove(RANDOM.nextInt(this.remainingServers.size())); + ChainableServer server = this.remainingServers.remove(RANDOM.nextInt(this.remainingServers.size())); LOGGER.trace(() -> String.format("Connecting to %s", server)); try { - SocketAddress endpoint = new InetSocketAddress(server.hostname, server.port); + SocketAddress endpoint = new InetSocketAddress(server.getHostName(), server.getPort()); int timeout = 5000; // ms this.socket = new Socket(); this.socket.connect(endpoint, timeout); this.socket.setTcpNoDelay(true); - if (server.connectionType == Server.ConnectionType.SSL) { + if (server.getConnectionType() == Server.ConnectionType.SSL) { SSLSocketFactory factory = TrustlessSSLSocketFactory.getSocketFactory(); - this.socket = factory.createSocket(this.socket, server.hostname, server.port, true); + this.socket = factory.createSocket(this.socket, server.getHostName(), server.getPort(), true); } this.scanner = new Scanner(this.socket.getInputStream()); @@ -832,7 +848,7 @@ public class ElectrumX extends BitcoinyBlockchainProvider { * Closes connection to server if it is currently connected server. * @param server */ - private void closeServer(Server server) { + private void closeServer(ChainableServer server) { synchronized (this.serverLock) { if (this.currentServer == null || !this.currentServer.equals(server)) return; @@ -857,4 +873,24 @@ public class ElectrumX extends BitcoinyBlockchainProvider { } } + @Override + public Set getServers() { + LOGGER.info("getting servers"); + return servers; + } + + @Override + public List getRemainingServers() { + return remainingServers; + } + + @Override + public Set getUselessServers() { + return uselessServers; + } + + @Override + public ChainableServer getCurrentServer() { + return currentServer; + } } diff --git a/src/main/java/org/qortal/crosschain/Litecoin.java b/src/main/java/org/qortal/crosschain/Litecoin.java index a0f7c1cb..d87cd1a1 100644 --- a/src/main/java/org/qortal/crosschain/Litecoin.java +++ b/src/main/java/org/qortal/crosschain/Litecoin.java @@ -7,7 +7,7 @@ import org.libdohj.params.LitecoinMainNetParams; import org.libdohj.params.LitecoinRegTestParams; import org.libdohj.params.LitecoinTestNet3Params; import org.qortal.crosschain.ElectrumX.Server; -import org.qortal.crosschain.ElectrumX.Server.ConnectionType; +import org.qortal.crosschain.ChainableServer.ConnectionType; import org.qortal.settings.Settings; import java.util.Arrays; diff --git a/src/main/java/org/qortal/crosschain/PirateChain.java b/src/main/java/org/qortal/crosschain/PirateChain.java index 6587baca..3f3cba47 100644 --- a/src/main/java/org/qortal/crosschain/PirateChain.java +++ b/src/main/java/org/qortal/crosschain/PirateChain.java @@ -13,7 +13,7 @@ import org.libdohj.params.PirateChainMainNetParams; import org.qortal.api.model.crosschain.PirateChainSendRequest; import org.qortal.controller.PirateChainWalletController; import org.qortal.crosschain.PirateLightClient.Server; -import org.qortal.crosschain.PirateLightClient.Server.ConnectionType; +import org.qortal.crosschain.ChainableServer.ConnectionType; import org.qortal.crypto.Crypto; import org.qortal.settings.Settings; import org.qortal.transform.TransformationException; diff --git a/src/main/java/org/qortal/crosschain/PirateLightClient.java b/src/main/java/org/qortal/crosschain/PirateLightClient.java index be4370a0..ae7c3cc1 100644 --- a/src/main/java/org/qortal/crosschain/PirateLightClient.java +++ b/src/main/java/org/qortal/crosschain/PirateLightClient.java @@ -30,10 +30,9 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { private static final int RESPONSE_TIME_READINGS = 5; private static final long MAX_AVG_RESPONSE_TIME = 500L; // ms - public static class Server { + public static class Server implements ChainableServer{ String hostname; - public enum ConnectionType { TCP, SSL } ConnectionType connectionType; int port; @@ -64,6 +63,21 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { return 0L; } + @Override + public String getHostName() { + return this.hostname; + } + + @Override + public int getPort() { + return this.port; + } + + @Override + public ChainableServer.ConnectionType getConnectionType() { + return this.connectionType; + } + @Override public boolean equals(Object other) { if (other == this) @@ -89,9 +103,9 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { return String.format("%s:%s:%d", this.connectionType.name(), this.hostname, this.port); } } - private Set servers = new HashSet<>(); - private List remainingServers = new ArrayList<>(); - private Set uselessServers = Collections.synchronizedSet(new HashSet<>()); + private Set servers = new HashSet<>(); + private List remainingServers = new ArrayList<>(); + private Set uselessServers = Collections.synchronizedSet(new HashSet<>()); private final String netId; private final String expectedGenesisHash; @@ -99,7 +113,7 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { private Bitcoiny blockchain; private final Object serverLock = new Object(); - private Server currentServer; + private ChainableServer currentServer; private ManagedChannel channel; private int nextId = 1; @@ -525,6 +539,24 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { throw new ForeignBlockchainException.NetworkException(String.format("Unexpected error code from Pirate Chain broadcastTransaction gRPC: %d", sendResponse.getErrorCode())); } + @Override + public Set getServers() { + return this.servers; + } + + @Override + public List getRemainingServers() { + return this.remainingServers; + } + + @Override + public Set getUselessServers() { + return this.uselessServers; + } + + @Override + public ChainableServer getCurrentServer() { return this.currentServer; } + // Class-private utility methods @@ -544,7 +576,7 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { if (!this.remainingServers.isEmpty()) { long averageResponseTime = this.currentServer.averageResponseTime(); if (averageResponseTime > MAX_AVG_RESPONSE_TIME) { - LOGGER.info("Slow average response time {}ms from {} - trying another server...", averageResponseTime, this.currentServer.hostname); + LOGGER.info("Slow average response time {}ms from {} - trying another server...", averageResponseTime, this.currentServer.getHostName()); this.closeServer(); continue; } @@ -568,11 +600,11 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { return true; while (!this.remainingServers.isEmpty()) { - Server server = this.remainingServers.remove(RANDOM.nextInt(this.remainingServers.size())); + ChainableServer server = this.remainingServers.remove(RANDOM.nextInt(this.remainingServers.size())); LOGGER.trace(() -> String.format("Connecting to %s", server)); try { - this.channel = ManagedChannelBuilder.forAddress(server.hostname, server.port).build(); + this.channel = ManagedChannelBuilder.forAddress(server.getHostName(), server.getPort()).build(); CompactTxStreamerGrpc.CompactTxStreamerBlockingStub stub = CompactTxStreamerGrpc.newBlockingStub(this.channel); LightdInfo lightdInfo = stub.getLightdInfo(Empty.newBuilder().build()); @@ -604,7 +636,7 @@ public class PirateLightClient extends BitcoinyBlockchainProvider { * Closes connection to server if it is currently connected server. * @param server */ - private void closeServer(Server server) { + private void closeServer(ChainableServer server) { synchronized (this.serverLock) { if (this.currentServer == null || !this.currentServer.equals(server) || this.channel == null) { return; diff --git a/src/main/java/org/qortal/crosschain/Ravencoin.java b/src/main/java/org/qortal/crosschain/Ravencoin.java index 6b267a00..d9301f48 100644 --- a/src/main/java/org/qortal/crosschain/Ravencoin.java +++ b/src/main/java/org/qortal/crosschain/Ravencoin.java @@ -7,7 +7,7 @@ import org.bitcoinj.params.RegTestParams; import org.bitcoinj.params.TestNet3Params; import org.libdohj.params.RavencoinMainNetParams; import org.qortal.crosschain.ElectrumX.Server; -import org.qortal.crosschain.ElectrumX.Server.ConnectionType; +import org.qortal.crosschain.ChainableServer.ConnectionType; import org.qortal.settings.Settings; import java.util.Arrays; diff --git a/src/main/java/org/qortal/crosschain/ServerConfigurationInfo.java b/src/main/java/org/qortal/crosschain/ServerConfigurationInfo.java new file mode 100644 index 00000000..89674ba5 --- /dev/null +++ b/src/main/java/org/qortal/crosschain/ServerConfigurationInfo.java @@ -0,0 +1,60 @@ +package org.qortal.crosschain; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import java.util.List; +import java.util.Objects; + +@XmlAccessorType(XmlAccessType.FIELD) +public class ServerConfigurationInfo { + + private List servers; + private List remainingServers; + private List uselessServers; + + public ServerConfigurationInfo() { + } + + public ServerConfigurationInfo( + List servers, + List remainingServers, + List uselessServers) { + this.servers = servers; + this.remainingServers = remainingServers; + this.uselessServers = uselessServers; + } + + public List getServers() { + return servers; + } + + public List getRemainingServers() { + return remainingServers; + } + + public List getUselessServers() { + return uselessServers; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ServerConfigurationInfo that = (ServerConfigurationInfo) o; + return Objects.equals(servers, that.servers) && Objects.equals(remainingServers, that.remainingServers) && Objects.equals(uselessServers, that.uselessServers); + } + + @Override + public int hashCode() { + return Objects.hash(servers, remainingServers, uselessServers); + } + + @Override + public String toString() { + return "ServerConfigurationInfo{" + + "servers=" + servers + + ", remainingServers=" + remainingServers + + ", uselessServers=" + uselessServers + + '}'; + } +} diff --git a/src/test/java/org/qortal/test/crosschain/ElectrumXTests.java b/src/test/java/org/qortal/test/crosschain/ElectrumXTests.java index c4c0acf1..7824a4a2 100644 --- a/src/test/java/org/qortal/test/crosschain/ElectrumXTests.java +++ b/src/test/java/org/qortal/test/crosschain/ElectrumXTests.java @@ -9,7 +9,7 @@ import org.bouncycastle.jsse.provider.BouncyCastleJsseProvider; import org.junit.Test; import org.qortal.crosschain.Bitcoin.BitcoinNet; import org.qortal.crosschain.*; -import org.qortal.crosschain.ElectrumX.Server.ConnectionType; +import org.qortal.crosschain.ChainableServer.ConnectionType; import org.qortal.utils.BitTwiddling; import java.security.Security; From 46a9075faf59212fdf299e9622ef25595cfe66f9 Mon Sep 17 00:00:00 2001 From: kennycud Date: Wed, 20 Dec 2023 04:24:51 -0800 Subject: [PATCH 11/47] Extracted Server classes into ChainableServer in order offer foreign blockchain server information to the Core API. They were not extracted into the ServerConfigurationInfo class as stated in a recent commit. --- .../qortal/api/resource/CrossChainUtils.java | 47 ++++++++++++ .../qortal/crosschain/ChainableServer.java | 15 ++++ .../org/qortal/crosschain/ServerInfo.java | 74 +++++++++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 src/main/java/org/qortal/api/resource/CrossChainUtils.java create mode 100644 src/main/java/org/qortal/crosschain/ChainableServer.java create mode 100644 src/main/java/org/qortal/crosschain/ServerInfo.java diff --git a/src/main/java/org/qortal/api/resource/CrossChainUtils.java b/src/main/java/org/qortal/api/resource/CrossChainUtils.java new file mode 100644 index 00000000..d45ba257 --- /dev/null +++ b/src/main/java/org/qortal/api/resource/CrossChainUtils.java @@ -0,0 +1,47 @@ +package org.qortal.api.resource; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.qortal.crosschain.*; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +public class CrossChainUtils { + private static final Logger LOGGER = LogManager.getLogger(CrossChainUtils.class); + + public static ServerConfigurationInfo buildServerConfigurationInfo(Bitcoiny blockchain) { + + BitcoinyBlockchainProvider blockchainProvider = blockchain.getBlockchainProvider(); + ChainableServer currentServer = blockchainProvider.getCurrentServer(); + + return new ServerConfigurationInfo( + buildInfos(blockchainProvider.getServers(), currentServer), + buildInfos(blockchainProvider.getRemainingServers(), currentServer), + buildInfos(blockchainProvider.getUselessServers(), currentServer) + ); + } + + public static ServerInfo buildInfo(ChainableServer server, boolean isCurrent) { + return new ServerInfo( + server.averageResponseTime(), + server.getHostName(), + server.getPort(), + server.getConnectionType().toString(), + isCurrent); + + } + + public static List buildInfos(Collection servers, ChainableServer currentServer) { + + List infos = new ArrayList<>( servers.size() ); + + for( ChainableServer server : servers ) + { + infos.add(buildInfo(server, server.equals(currentServer))); + } + + return infos; + } +} diff --git a/src/main/java/org/qortal/crosschain/ChainableServer.java b/src/main/java/org/qortal/crosschain/ChainableServer.java new file mode 100644 index 00000000..ac29e5f9 --- /dev/null +++ b/src/main/java/org/qortal/crosschain/ChainableServer.java @@ -0,0 +1,15 @@ +package org.qortal.crosschain; + +public interface ChainableServer { + public void addResponseTime(long responseTime); + + public long averageResponseTime(); + + public String getHostName(); + + public int getPort(); + + public ConnectionType getConnectionType(); + + public enum ConnectionType {TCP, SSL} +} diff --git a/src/main/java/org/qortal/crosschain/ServerInfo.java b/src/main/java/org/qortal/crosschain/ServerInfo.java new file mode 100644 index 00000000..0efe510b --- /dev/null +++ b/src/main/java/org/qortal/crosschain/ServerInfo.java @@ -0,0 +1,74 @@ +package org.qortal.crosschain; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; +import java.util.Objects; + +@XmlAccessorType(XmlAccessType.FIELD) +public class ServerInfo { + + private long averageResponseTime; + + private String hostName; + + private int port; + + private String connectionType; + + private boolean isCurrent; + + public ServerInfo() { + } + + public ServerInfo(long averageResponseTime, String hostName, int port, String connectionType, boolean isCurrent) { + this.averageResponseTime = averageResponseTime; + this.hostName = hostName; + this.port = port; + this.connectionType = connectionType; + this.isCurrent = isCurrent; + } + + public long getAverageResponseTime() { + return averageResponseTime; + } + + public String getHostName() { + return hostName; + } + + public int getPort() { + return port; + } + + public String getConnectionType() { + return connectionType; + } + + public boolean isCurrent() { + return isCurrent; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + ServerInfo that = (ServerInfo) o; + return averageResponseTime == that.averageResponseTime && port == that.port && isCurrent == that.isCurrent && Objects.equals(hostName, that.hostName) && Objects.equals(connectionType, that.connectionType); + } + + @Override + public int hashCode() { + return Objects.hash(averageResponseTime, hostName, port, connectionType, isCurrent); + } + + @Override + public String toString() { + return "ServerInfo{" + + "averageResponseTime=" + averageResponseTime + + ", hostName='" + hostName + '\'' + + ", port=" + port + + ", connectionType='" + connectionType + '\'' + + ", isCurrent=" + isCurrent + + '}'; + } +} From 423a1f7bed5fd44e736f47d31ce05e91f17ca173 Mon Sep 17 00:00:00 2001 From: kennycud Date: Fri, 22 Dec 2023 13:22:26 -0800 Subject: [PATCH 12/47] Practically rewrote the get unused receive address functionality. The prior implementation was skipping addresses. --- .../java/org/qortal/crosschain/Bitcoiny.java | 65 +++---------------- 1 file changed, 8 insertions(+), 57 deletions(-) diff --git a/src/main/java/org/qortal/crosschain/Bitcoiny.java b/src/main/java/org/qortal/crosschain/Bitcoiny.java index 1749cee9..d52043bb 100644 --- a/src/main/java/org/qortal/crosschain/Bitcoiny.java +++ b/src/main/java/org/qortal/crosschain/Bitcoiny.java @@ -11,6 +11,7 @@ import org.bitcoinj.crypto.DeterministicKey; import org.bitcoinj.script.Script.ScriptType; import org.bitcoinj.script.ScriptBuilder; import org.bitcoinj.wallet.DeterministicKeyChain; +import org.bitcoinj.wallet.KeyChain; import org.bitcoinj.wallet.SendRequest; import org.bitcoinj.wallet.Wallet; import org.qortal.api.model.SimpleForeignTransaction; @@ -720,7 +721,7 @@ public abstract class Bitcoiny implements ForeignBlockchain { } /** - * Returns first unused receive address given 'm' BIP32 key. + * Returns first unused receive address given a BIP32 key. * * @param key58 BIP32/HD extended Bitcoin private/public key * @return P2PKH address @@ -732,65 +733,15 @@ public abstract class Bitcoiny implements ForeignBlockchain { Wallet wallet = walletFromDeterministicKey58(key58); DeterministicKeyChain keyChain = wallet.getActiveKeyChain(); - keyChain.setLookaheadSize(Bitcoiny.WALLET_KEY_LOOKAHEAD_INCREMENT); - keyChain.maybeLookAhead(); - - final int keyChainPathSize = keyChain.getAccountPath().size(); - List keys = new ArrayList<>(keyChain.getLeafKeys()); - - int ki = 0; do { - for (; ki < keys.size(); ++ki) { - DeterministicKey dKey = keys.get(ki); - List dKeyPath = dKey.getPath(); + // the next receive funds address + Address address = Address.fromKey(this.params, keyChain.getKey(KeyChain.KeyPurpose.RECEIVE_FUNDS), ScriptType.P2PKH); - // If keyChain is based on 'm', then make sure dKey is m/0/ki - i.e. a 'receive' address, not 'change' (m/1/ki) - if (dKeyPath.size() != keyChainPathSize + 2 || dKeyPath.get(dKeyPath.size() - 2) != ChildNumber.ZERO) - continue; + // if zero transactions, return address + if( 0 == getAddressTransactions(ScriptBuilder.createOutputScript(address).getProgram(), true).size() ) + return address.toString(); - // Check unspent - Address address = Address.fromKey(this.params, dKey, ScriptType.P2PKH); - byte[] script = ScriptBuilder.createOutputScript(address).getProgram(); - - List unspentOutputs = this.blockchainProvider.getUnspentOutputs(script, false); - - /* - * If there are no unspent outputs then either: - * a) all the outputs have been spent - * b) address has never been used - * - * For case (a) we want to remember not to check this address (key) again. - */ - - if (unspentOutputs.isEmpty()) { - // If this is a known key that has been spent before, then we can skip asking for transaction history - if (this.spentKeys.contains(dKey)) { - wallet.getActiveKeyChain().markKeyAsUsed(dKey); - continue; - } - - // Ask for transaction history - if it's empty then key has never been used - List historicTransactionHashes = this.blockchainProvider.getAddressTransactions(script, false); - - if (!historicTransactionHashes.isEmpty()) { - // Fully spent key - case (a) - this.spentKeys.add(dKey); - wallet.getActiveKeyChain().markKeyAsUsed(dKey); - continue; - } - - // Key never been used - case (b) - return address.toString(); - } - - // Key has unspent outputs, hence used, so no good to us - this.spentKeys.remove(dKey); - } - - // Generate some more keys - keys.addAll(generateMoreKeys(keyChain)); - - // Process new keys + // else try the next receive funds address } while (true); } From 7dbf53261627b38fcce648d4e720336c687cd067 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Thu, 28 Dec 2023 14:22:01 +0100 Subject: [PATCH 13/47] Remove unusedaddress ( no more functional ) --- .../resource/CrossChainBitcoinResource.java | 39 ------------------- .../resource/CrossChainDigibyteResource.java | 39 ------------------- .../resource/CrossChainDogecoinResource.java | 39 ------------------- .../resource/CrossChainLitecoinResource.java | 39 ------------------- .../resource/CrossChainRavencoinResource.java | 39 ------------------- 5 files changed, 195 deletions(-) diff --git a/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java index 0abf7c0e..6f3b9f50 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java @@ -189,45 +189,6 @@ public class CrossChainBitcoinResource { } } - @POST - @Path("/unusedaddress") - @Operation( - summary = "Returns first unused address for hierarchical, deterministic BIP32 wallet", - description = "Supply BIP32 'm' private/public key in base58, starting with 'xprv'/'xpub' for mainnet, 'tprv'/'tpub' for testnet", - requestBody = @RequestBody( - required = true, - content = @Content( - mediaType = MediaType.TEXT_PLAIN, - schema = @Schema( - type = "string", - description = "BIP32 'm' private/public key in base58", - example = "tpubD6NzVbkrYhZ4XTPc4btCZ6SMgn8CxmWkj6VBVZ1tfcJfMq4UwAjZbG8U74gGSypL9XBYk2R2BLbDBe8pcEyBKM1edsGQEPKXNbEskZozeZc" - ) - ) - ), - responses = { - @ApiResponse( - content = @Content(array = @ArraySchema( schema = @Schema( implementation = SimpleTransaction.class ) ) ) - ) - } - ) - @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE}) - @SecurityRequirement(name = "apiKey") - public String getUnusedBitcoinReceiveAddress(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String key58) { - Security.checkApiCallAllowed(request); - - Bitcoin bitcoin = Bitcoin.getInstance(); - - if (!bitcoin.isValidDeterministicKey(key58)) - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_PRIVATE_KEY); - - try { - return bitcoin.getUnusedReceiveAddress(key58); - } catch (ForeignBlockchainException e) { - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE); - } - } - @POST @Path("/send") @Operation( diff --git a/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java b/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java index e675200b..898754d6 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java @@ -189,45 +189,6 @@ public class CrossChainDigibyteResource { } } - @POST - @Path("/unusedaddress") - @Operation( - summary = "Returns first unused address for hierarchical, deterministic BIP32 wallet", - description = "Supply BIP32 'm' private/public key in base58, starting with 'xprv'/'xpub' for mainnet, 'tprv'/'tpub' for testnet", - requestBody = @RequestBody( - required = true, - content = @Content( - mediaType = MediaType.TEXT_PLAIN, - schema = @Schema( - type = "string", - description = "BIP32 'm' private/public key in base58", - example = "tpubD6NzVbkrYhZ4XTPc4btCZ6SMgn8CxmWkj6VBVZ1tfcJfMq4UwAjZbG8U74gGSypL9XBYk2R2BLbDBe8pcEyBKM1edsGQEPKXNbEskZozeZc" - ) - ) - ), - responses = { - @ApiResponse( - content = @Content(array = @ArraySchema( schema = @Schema( implementation = SimpleTransaction.class ) ) ) - ) - } - ) - @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE}) - @SecurityRequirement(name = "apiKey") - public String getUnusedDigibyteReceiveAddress(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String key58) { - Security.checkApiCallAllowed(request); - - Digibyte digibyte = Digibyte.getInstance(); - - if (!digibyte.isValidDeterministicKey(key58)) - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_PRIVATE_KEY); - - try { - return digibyte.getUnusedReceiveAddress(key58); - } catch (ForeignBlockchainException e) { - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE); - } - } - @POST @Path("/send") @Operation( diff --git a/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java index e292f8e2..1608c90e 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java @@ -189,45 +189,6 @@ public class CrossChainDogecoinResource { } } - @POST - @Path("/unusedaddress") - @Operation( - summary = "Returns first unused address for hierarchical, deterministic BIP32 wallet", - description = "Supply BIP32 'm' private/public key in base58, starting with 'xprv'/'xpub' for mainnet, 'tprv'/'tpub' for testnet", - requestBody = @RequestBody( - required = true, - content = @Content( - mediaType = MediaType.TEXT_PLAIN, - schema = @Schema( - type = "string", - description = "BIP32 'm' private/public key in base58", - example = "tpubD6NzVbkrYhZ4XTPc4btCZ6SMgn8CxmWkj6VBVZ1tfcJfMq4UwAjZbG8U74gGSypL9XBYk2R2BLbDBe8pcEyBKM1edsGQEPKXNbEskZozeZc" - ) - ) - ), - responses = { - @ApiResponse( - content = @Content(array = @ArraySchema( schema = @Schema( implementation = SimpleTransaction.class ) ) ) - ) - } - ) - @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE}) - @SecurityRequirement(name = "apiKey") - public String getUnusedDogecoinReceiveAddress(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String key58) { - Security.checkApiCallAllowed(request); - - Dogecoin dogecoin = Dogecoin.getInstance(); - - if (!dogecoin.isValidDeterministicKey(key58)) - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_PRIVATE_KEY); - - try { - return dogecoin.getUnusedReceiveAddress(key58); - } catch (ForeignBlockchainException e) { - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE); - } - } - @POST @Path("/send") @Operation( diff --git a/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java index 38a8a598..5ad95344 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java @@ -189,45 +189,6 @@ public class CrossChainLitecoinResource { } } - @POST - @Path("/unusedaddress") - @Operation( - summary = "Returns first unused address for hierarchical, deterministic BIP32 wallet", - description = "Supply BIP32 'm' private/public key in base58, starting with 'xprv'/'xpub' for mainnet, 'tprv'/'tpub' for testnet", - requestBody = @RequestBody( - required = true, - content = @Content( - mediaType = MediaType.TEXT_PLAIN, - schema = @Schema( - type = "string", - description = "BIP32 'm' private/public key in base58", - example = "tpubD6NzVbkrYhZ4XTPc4btCZ6SMgn8CxmWkj6VBVZ1tfcJfMq4UwAjZbG8U74gGSypL9XBYk2R2BLbDBe8pcEyBKM1edsGQEPKXNbEskZozeZc" - ) - ) - ), - responses = { - @ApiResponse( - content = @Content(array = @ArraySchema( schema = @Schema( implementation = SimpleTransaction.class ) ) ) - ) - } - ) - @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE}) - @SecurityRequirement(name = "apiKey") - public String getUnusedLitecoinReceiveAddress(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String key58) { - Security.checkApiCallAllowed(request); - - Litecoin litecoin = Litecoin.getInstance(); - - if (!litecoin.isValidDeterministicKey(key58)) - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_PRIVATE_KEY); - - try { - return litecoin.getUnusedReceiveAddress(key58); - } catch (ForeignBlockchainException e) { - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE); - } - } - @POST @Path("/send") @Operation( diff --git a/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java index 64ebc136..9b702b25 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java @@ -189,45 +189,6 @@ public class CrossChainRavencoinResource { } } - @POST - @Path("/unusedaddress") - @Operation( - summary = "Returns first unused address for hierarchical, deterministic BIP32 wallet", - description = "Supply BIP32 'm' private/public key in base58, starting with 'xprv'/'xpub' for mainnet, 'tprv'/'tpub' for testnet", - requestBody = @RequestBody( - required = true, - content = @Content( - mediaType = MediaType.TEXT_PLAIN, - schema = @Schema( - type = "string", - description = "BIP32 'm' private/public key in base58", - example = "tpubD6NzVbkrYhZ4XTPc4btCZ6SMgn8CxmWkj6VBVZ1tfcJfMq4UwAjZbG8U74gGSypL9XBYk2R2BLbDBe8pcEyBKM1edsGQEPKXNbEskZozeZc" - ) - ) - ), - responses = { - @ApiResponse( - content = @Content(array = @ArraySchema( schema = @Schema( implementation = SimpleTransaction.class ) ) ) - ) - } - ) - @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE}) - @SecurityRequirement(name = "apiKey") - public String getUnusedRavencoinReceiveAddress(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String key58) { - Security.checkApiCallAllowed(request); - - Ravencoin ravencoin = Ravencoin.getInstance(); - - if (!ravencoin.isValidDeterministicKey(key58)) - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_PRIVATE_KEY); - - try { - return ravencoin.getUnusedReceiveAddress(key58); - } catch (ForeignBlockchainException e) { - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE); - } - } - @POST @Path("/send") @Operation( From 97b4db4095ddcf724176c2122aa56604f70c1b4a Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Thu, 28 Dec 2023 14:54:20 +0100 Subject: [PATCH 14/47] Update dependencies --- pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 4d736704..bff266a4 100644 --- a/pom.xml +++ b/pom.xml @@ -21,12 +21,12 @@ 1.2.2 0.12.3 4.9.10 - 1.60.0 - 32.1.3-jre + 1.60.1 + 33.0.0-jre 2.2 1.2.1 2.5.1 - 74.1 + 74.2 4.12 4.0.1 2.3.9 @@ -39,11 +39,11 @@ 1.0.0 2.21.1 1.5.0-b01 - 3.11.0 + 3.12.1 3.3.0 3.3.1 3.5.1 - 3.2.2 + 3.2.3 1.1.0 UTF-8 3.25.0 From 21796341f2c54d4b15ba87973d8ee5d4d76c7bfd Mon Sep 17 00:00:00 2001 From: kennycud Date: Thu, 28 Dec 2023 14:15:57 -0800 Subject: [PATCH 15/47] Added Core API endpoint to repair LTC wallets generated before 2024 by moving all the address balances to the first address. --- pom.xml | 10 +- .../resource/CrossChainBitcoinResource.java | 39 -------- .../resource/CrossChainDigibyteResource.java | 39 -------- .../resource/CrossChainDogecoinResource.java | 39 -------- .../resource/CrossChainLitecoinResource.java | 80 ++++++++-------- .../resource/CrossChainRavencoinResource.java | 39 -------- .../restricted/resource/AdminResource.java | 31 ++++++ .../org/qortal/controller/AutoUpdate.java | 96 +++++++++++++++++++ .../java/org/qortal/crosschain/Bitcoiny.java | 66 ++++++++++++- .../crosschain/BitcoinyUTXOProvider.java | 80 ++++++++++++++++ .../qortal/test/crosschain/BitcoinyTests.java | 8 ++ 11 files changed, 323 insertions(+), 204 deletions(-) create mode 100644 src/main/java/org/qortal/crosschain/BitcoinyUTXOProvider.java diff --git a/pom.xml b/pom.xml index 4d736704..bff266a4 100644 --- a/pom.xml +++ b/pom.xml @@ -21,12 +21,12 @@ 1.2.2 0.12.3 4.9.10 - 1.60.0 - 32.1.3-jre + 1.60.1 + 33.0.0-jre 2.2 1.2.1 2.5.1 - 74.1 + 74.2 4.12 4.0.1 2.3.9 @@ -39,11 +39,11 @@ 1.0.0 2.21.1 1.5.0-b01 - 3.11.0 + 3.12.1 3.3.0 3.3.1 3.5.1 - 3.2.2 + 3.2.3 1.1.0 UTF-8 3.25.0 diff --git a/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java index 0abf7c0e..6f3b9f50 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java @@ -189,45 +189,6 @@ public class CrossChainBitcoinResource { } } - @POST - @Path("/unusedaddress") - @Operation( - summary = "Returns first unused address for hierarchical, deterministic BIP32 wallet", - description = "Supply BIP32 'm' private/public key in base58, starting with 'xprv'/'xpub' for mainnet, 'tprv'/'tpub' for testnet", - requestBody = @RequestBody( - required = true, - content = @Content( - mediaType = MediaType.TEXT_PLAIN, - schema = @Schema( - type = "string", - description = "BIP32 'm' private/public key in base58", - example = "tpubD6NzVbkrYhZ4XTPc4btCZ6SMgn8CxmWkj6VBVZ1tfcJfMq4UwAjZbG8U74gGSypL9XBYk2R2BLbDBe8pcEyBKM1edsGQEPKXNbEskZozeZc" - ) - ) - ), - responses = { - @ApiResponse( - content = @Content(array = @ArraySchema( schema = @Schema( implementation = SimpleTransaction.class ) ) ) - ) - } - ) - @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE}) - @SecurityRequirement(name = "apiKey") - public String getUnusedBitcoinReceiveAddress(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String key58) { - Security.checkApiCallAllowed(request); - - Bitcoin bitcoin = Bitcoin.getInstance(); - - if (!bitcoin.isValidDeterministicKey(key58)) - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_PRIVATE_KEY); - - try { - return bitcoin.getUnusedReceiveAddress(key58); - } catch (ForeignBlockchainException e) { - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE); - } - } - @POST @Path("/send") @Operation( diff --git a/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java b/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java index e675200b..898754d6 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java @@ -189,45 +189,6 @@ public class CrossChainDigibyteResource { } } - @POST - @Path("/unusedaddress") - @Operation( - summary = "Returns first unused address for hierarchical, deterministic BIP32 wallet", - description = "Supply BIP32 'm' private/public key in base58, starting with 'xprv'/'xpub' for mainnet, 'tprv'/'tpub' for testnet", - requestBody = @RequestBody( - required = true, - content = @Content( - mediaType = MediaType.TEXT_PLAIN, - schema = @Schema( - type = "string", - description = "BIP32 'm' private/public key in base58", - example = "tpubD6NzVbkrYhZ4XTPc4btCZ6SMgn8CxmWkj6VBVZ1tfcJfMq4UwAjZbG8U74gGSypL9XBYk2R2BLbDBe8pcEyBKM1edsGQEPKXNbEskZozeZc" - ) - ) - ), - responses = { - @ApiResponse( - content = @Content(array = @ArraySchema( schema = @Schema( implementation = SimpleTransaction.class ) ) ) - ) - } - ) - @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE}) - @SecurityRequirement(name = "apiKey") - public String getUnusedDigibyteReceiveAddress(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String key58) { - Security.checkApiCallAllowed(request); - - Digibyte digibyte = Digibyte.getInstance(); - - if (!digibyte.isValidDeterministicKey(key58)) - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_PRIVATE_KEY); - - try { - return digibyte.getUnusedReceiveAddress(key58); - } catch (ForeignBlockchainException e) { - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE); - } - } - @POST @Path("/send") @Operation( diff --git a/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java index e292f8e2..1608c90e 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java @@ -189,45 +189,6 @@ public class CrossChainDogecoinResource { } } - @POST - @Path("/unusedaddress") - @Operation( - summary = "Returns first unused address for hierarchical, deterministic BIP32 wallet", - description = "Supply BIP32 'm' private/public key in base58, starting with 'xprv'/'xpub' for mainnet, 'tprv'/'tpub' for testnet", - requestBody = @RequestBody( - required = true, - content = @Content( - mediaType = MediaType.TEXT_PLAIN, - schema = @Schema( - type = "string", - description = "BIP32 'm' private/public key in base58", - example = "tpubD6NzVbkrYhZ4XTPc4btCZ6SMgn8CxmWkj6VBVZ1tfcJfMq4UwAjZbG8U74gGSypL9XBYk2R2BLbDBe8pcEyBKM1edsGQEPKXNbEskZozeZc" - ) - ) - ), - responses = { - @ApiResponse( - content = @Content(array = @ArraySchema( schema = @Schema( implementation = SimpleTransaction.class ) ) ) - ) - } - ) - @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE}) - @SecurityRequirement(name = "apiKey") - public String getUnusedDogecoinReceiveAddress(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String key58) { - Security.checkApiCallAllowed(request); - - Dogecoin dogecoin = Dogecoin.getInstance(); - - if (!dogecoin.isValidDeterministicKey(key58)) - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_PRIVATE_KEY); - - try { - return dogecoin.getUnusedReceiveAddress(key58); - } catch (ForeignBlockchainException e) { - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE); - } - } - @POST @Path("/send") @Operation( diff --git a/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java index 38a8a598..3296c3ca 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java @@ -189,45 +189,6 @@ public class CrossChainLitecoinResource { } } - @POST - @Path("/unusedaddress") - @Operation( - summary = "Returns first unused address for hierarchical, deterministic BIP32 wallet", - description = "Supply BIP32 'm' private/public key in base58, starting with 'xprv'/'xpub' for mainnet, 'tprv'/'tpub' for testnet", - requestBody = @RequestBody( - required = true, - content = @Content( - mediaType = MediaType.TEXT_PLAIN, - schema = @Schema( - type = "string", - description = "BIP32 'm' private/public key in base58", - example = "tpubD6NzVbkrYhZ4XTPc4btCZ6SMgn8CxmWkj6VBVZ1tfcJfMq4UwAjZbG8U74gGSypL9XBYk2R2BLbDBe8pcEyBKM1edsGQEPKXNbEskZozeZc" - ) - ) - ), - responses = { - @ApiResponse( - content = @Content(array = @ArraySchema( schema = @Schema( implementation = SimpleTransaction.class ) ) ) - ) - } - ) - @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE}) - @SecurityRequirement(name = "apiKey") - public String getUnusedLitecoinReceiveAddress(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String key58) { - Security.checkApiCallAllowed(request); - - Litecoin litecoin = Litecoin.getInstance(); - - if (!litecoin.isValidDeterministicKey(key58)) - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_PRIVATE_KEY); - - try { - return litecoin.getUnusedReceiveAddress(key58); - } catch (ForeignBlockchainException e) { - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE); - } - } - @POST @Path("/send") @Operation( @@ -304,4 +265,43 @@ public class CrossChainLitecoinResource { return CrossChainUtils.buildServerConfigurationInfo(Litecoin.getInstance()); } -} + + @POST + @Path("/repair") + @Operation( + summary = "Sends all coins in wallet to primary receive address", + description = "Supply BIP32 'm' private/public key in base58, starting with 'xprv'/'xpub' for mainnet, 'tprv'/'tpub' for testnet", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.TEXT_PLAIN, + schema = @Schema( + type = "string", + description = "BIP32 'm' private/public key in base58", + example = "tpubD6NzVbkrYhZ4XTPc4btCZ6SMgn8CxmWkj6VBVZ1tfcJfMq4UwAjZbG8U74gGSypL9XBYk2R2BLbDBe8pcEyBKM1edsGQEPKXNbEskZozeZc" + ) + ) + ), + responses = { + @ApiResponse( + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "string", description = "transaction hash")) + ) + } + ) + @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE}) + @SecurityRequirement(name = "apiKey") + public String repairOldWallet(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String key58) { + Security.checkApiCallAllowed(request); + + Litecoin litecoin = Litecoin.getInstance(); + + if (!litecoin.isValidDeterministicKey(key58)) + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_PRIVATE_KEY); + + try { + return litecoin.repairOldWallet(key58); + } catch (ForeignBlockchainException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java index 64ebc136..9b702b25 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java @@ -189,45 +189,6 @@ public class CrossChainRavencoinResource { } } - @POST - @Path("/unusedaddress") - @Operation( - summary = "Returns first unused address for hierarchical, deterministic BIP32 wallet", - description = "Supply BIP32 'm' private/public key in base58, starting with 'xprv'/'xpub' for mainnet, 'tprv'/'tpub' for testnet", - requestBody = @RequestBody( - required = true, - content = @Content( - mediaType = MediaType.TEXT_PLAIN, - schema = @Schema( - type = "string", - description = "BIP32 'm' private/public key in base58", - example = "tpubD6NzVbkrYhZ4XTPc4btCZ6SMgn8CxmWkj6VBVZ1tfcJfMq4UwAjZbG8U74gGSypL9XBYk2R2BLbDBe8pcEyBKM1edsGQEPKXNbEskZozeZc" - ) - ) - ), - responses = { - @ApiResponse( - content = @Content(array = @ArraySchema( schema = @Schema( implementation = SimpleTransaction.class ) ) ) - ) - } - ) - @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE}) - @SecurityRequirement(name = "apiKey") - public String getUnusedRavencoinReceiveAddress(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String key58) { - Security.checkApiCallAllowed(request); - - Ravencoin ravencoin = Ravencoin.getInstance(); - - if (!ravencoin.isValidDeterministicKey(key58)) - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_PRIVATE_KEY); - - try { - return ravencoin.getUnusedReceiveAddress(key58); - } catch (ForeignBlockchainException e) { - throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE); - } - } - @POST @Path("/send") @Operation( diff --git a/src/main/java/org/qortal/api/restricted/resource/AdminResource.java b/src/main/java/org/qortal/api/restricted/resource/AdminResource.java index f0e045ed..35bf9108 100644 --- a/src/main/java/org/qortal/api/restricted/resource/AdminResource.java +++ b/src/main/java/org/qortal/api/restricted/resource/AdminResource.java @@ -257,6 +257,37 @@ public class AdminResource { return "true"; } + @GET + @Path("/bootstrap") + @Operation( + summary = "Bootstrap", + description = "Delete and download new database archive", + responses = { + @ApiResponse( + description = "\"true\"", + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "string")) + ) + } + ) + @SecurityRequirement(name = "apiKey") + public String bootstrap(@HeaderParam(Security.API_KEY_HEADER) String apiKey) { + Security.checkApiCallAllowed(request); + + new Thread(() -> { + // Short sleep to allow HTTP response body to be emitted + try { + Thread.sleep(1000); + } catch (InterruptedException e) { + // Not important + } + + AutoUpdate.attemptBootstrap(); + + }).start(); + + return "true"; + } + @GET @Path("/summary") @Operation( diff --git a/src/main/java/org/qortal/controller/AutoUpdate.java b/src/main/java/org/qortal/controller/AutoUpdate.java index bc232e1b..0bdcfd48 100644 --- a/src/main/java/org/qortal/controller/AutoUpdate.java +++ b/src/main/java/org/qortal/controller/AutoUpdate.java @@ -23,9 +23,12 @@ import java.io.InputStream; import java.io.OutputStream; import java.lang.management.ManagementFactory; import java.nio.ByteBuffer; +import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; @@ -365,4 +368,97 @@ public class AutoUpdate extends Thread { } } + public static boolean attemptBootstrap() { + LOGGER.info(String.format("Bootstrapping node...")); + + // Give repository a chance to backup in case things go badly wrong (if enabled) + if (Settings.getInstance().getRepositoryBackupInterval() > 0) { + try { + // Timeout if the database isn't ready for backing up after 60 seconds + long timeout = 60 * 1000L; + RepositoryManager.backup(true, "backup", timeout); + + } catch (TimeoutException e) { + LOGGER.info("Attempt to backup repository failed due to timeout: {}", e.getMessage()); + // Continue with the bootstrap anyway... + } + } + + // Get the repository path from settings + String repositoryPath = Settings.getInstance().getRepositoryPath(); + LOGGER.debug(String.format("Repository path: %s", repositoryPath)); + + // Call ApplyUpdate to end this process (unlocking current JAR so it can be replaced) + String javaHome = System.getProperty("java.home"); + LOGGER.debug(String.format("Java home: %s", javaHome)); + + Path javaBinary = Paths.get(javaHome, "bin", "java"); + LOGGER.debug(String.format("Java binary: %s", javaBinary)); + + try { + Path directory = Paths.get(repositoryPath); + Files.walkFileTree(directory, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Files.delete(file); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + Files.delete(dir); + return FileVisitResult.CONTINUE; + } + }); + + List javaCmd = new ArrayList<>(); + + // Java runtime binary itself + javaCmd.add(javaBinary.toString()); + + // JVM arguments + javaCmd.addAll(ManagementFactory.getRuntimeMXBean().getInputArguments()); + + // Disable, but retain, any -agentlib JVM arg as sub-process might fail if it tries to reuse same port + javaCmd = javaCmd.stream() + .map(arg -> arg.replace("-agentlib", AGENTLIB_JVM_HOLDER_ARG)) + .collect(Collectors.toList()); + + // Remove JNI options as they won't be supported by command-line 'java' + // These are typically added by the AdvancedInstaller Java launcher EXE + javaCmd.removeAll(Arrays.asList("abort", "exit", "vfprintf")); + + // Call ApplyUpdate using JAR + javaCmd.addAll(Arrays.asList("-cp", JAR_FILENAME, ApplyUpdate.class.getCanonicalName())); + + // Add command-line args saved from start-up + String[] savedArgs = Controller.getInstance().getSavedArgs(); + if (savedArgs != null) + javaCmd.addAll(Arrays.asList(savedArgs)); + + LOGGER.info(String.format("Restarting node with: %s", String.join(" ", javaCmd))); + + SysTray.getInstance().showMessage(Translator.INSTANCE.translate("SysTray", "AUTO_UPDATE"), //TODO + Translator.INSTANCE.translate("SysTray", "APPLYING_UPDATE_AND_RESTARTING"), //TODO + MessageType.INFO); + + ProcessBuilder processBuilder = new ProcessBuilder(javaCmd); + + // New process will inherit our stdout and stderr + processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT); + processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT); + + Process process = processBuilder.start(); + + // Nothing to pipe to new process, so close output stream (process's stdin) + process.getOutputStream().close(); + + return true; // restarting node OK + } catch (Exception e) { + LOGGER.error(String.format("Failed to restart node: %s", e.getMessage())); + + return true; // repo was okay, even if applying update failed + } + } + } diff --git a/src/main/java/org/qortal/crosschain/Bitcoiny.java b/src/main/java/org/qortal/crosschain/Bitcoiny.java index d52043bb..b7614d1e 100644 --- a/src/main/java/org/qortal/crosschain/Bitcoiny.java +++ b/src/main/java/org/qortal/crosschain/Bitcoiny.java @@ -505,7 +505,7 @@ public abstract class Bitcoiny implements ForeignBlockchain { List candidates = this.getSpendingCandidateAddresses(key58); - for(DeterministicKey key : getWalletKeys(key58)) { + for(DeterministicKey key : getOldWalletKeys(key58)) { infos.add(buildAddressInfo(key, candidates)); } @@ -592,11 +592,23 @@ public abstract class Bitcoiny implements ForeignBlockchain { } } - private List getWalletKeys(String key58) throws ForeignBlockchainException { + /** + * Get Old Wallet Keys + * + * Get wallet keys using the old key generation algorithm. This is used for diagnosing and repairing wallets + * created before 2024. + * + * @param masterPrivateKey + * + * @return the keys + * + * @throws ForeignBlockchainException + */ + private List getOldWalletKeys(String masterPrivateKey) throws ForeignBlockchainException { synchronized (this) { Context.propagate(bitcoinjContext); - Wallet wallet = walletFromDeterministicKey58(key58); + Wallet wallet = walletFromDeterministicKey58(masterPrivateKey); DeterministicKeyChain keyChain = wallet.getActiveKeyChain(); keyChain.setLookaheadSize(Bitcoiny.WALLET_KEY_LOOKAHEAD_INCREMENT); @@ -998,4 +1010,52 @@ public abstract class Bitcoiny implements ForeignBlockchain { return Wallet.fromWatchingKeyB58(this.params, key58, DeterministicHierarchy.BIP32_STANDARDISATION_TIME_SECS); } + /** + * Repair Wallet + * + * Repair wallets generated before 2024 by moving all the address balances to the first address. + * + * @param privateMasterKey + * + * @return the transaction Id of the spend operation that moves the balances or the exception name if an exception + * is thrown + * + * @throws ForeignBlockchainException + */ + public String repairOldWallet(String privateMasterKey) throws ForeignBlockchainException { + + // create a deterministic wallet to satisfy the bitcoinj API + Wallet wallet = Wallet.createDeterministic(this.bitcoinjContext, ScriptType.P2PKH); + + // use the blockchain resources of this instance for UTXO provision + wallet.setUTXOProvider(new BitcoinyUTXOProvider( this )); + + // import in each that is generated using the old key generation algorithm + List walletKeys = getOldWalletKeys(privateMasterKey); + + for( DeterministicKey key : walletKeys) { + wallet.importKey(ECKey.fromPrivate(key.getPrivKey())); + } + + // get the primary receive address + Address firstAddress = Address.fromKey(this.params, walletKeys.get(0), ScriptType.P2PKH); + + // send all the imported coins to the primary receive address + SendRequest sendRequest = SendRequest.emptyWallet(firstAddress); + sendRequest.feePerKb = this.getFeePerKb(); + + try { + // allow the wallet to build the send request transaction and broadcast + wallet.completeTx(sendRequest); + broadcastTransaction(sendRequest.tx); + + // return the transaction Id + return sendRequest.tx.getTxId().toString(); + } + catch( Exception e ) { + // log error and return exception name + LOGGER.error(e.getMessage(), e); + return e.getClass().getSimpleName(); + } + } } diff --git a/src/main/java/org/qortal/crosschain/BitcoinyUTXOProvider.java b/src/main/java/org/qortal/crosschain/BitcoinyUTXOProvider.java new file mode 100644 index 00000000..df596de4 --- /dev/null +++ b/src/main/java/org/qortal/crosschain/BitcoinyUTXOProvider.java @@ -0,0 +1,80 @@ +package org.qortal.crosschain; + +import org.bitcoinj.core.*; +import org.bitcoinj.script.Script; +import org.bitcoinj.script.ScriptBuilder; + +import java.util.ArrayList; +import java.util.List; + +/** + * Class BitcoinyUTXOProvider + * + * Uses Bitcoiny resources for UTXO provision. + */ +public class BitcoinyUTXOProvider implements UTXOProvider { + + private Bitcoiny bitcoiny; + + public BitcoinyUTXOProvider(Bitcoiny bitcoiny) { + this.bitcoiny = bitcoiny; + } + + @Override + public List getOpenTransactionOutputs(List keys) throws UTXOProviderException { + try { + List utxos = new ArrayList<>(); + + for( ECKey key : keys) { + Address address = Address.fromKey(this.bitcoiny.params, key, Script.ScriptType.P2PKH); + byte[] script = ScriptBuilder.createOutputScript(address).getProgram(); + + // collection UTXO's for all confirmed unspent outputs + for (UnspentOutput output : this.bitcoiny.blockchainProvider.getUnspentOutputs(script, false)) { + utxos.add(toUTXO(output)); + } + } + return utxos; + } catch (ForeignBlockchainException e) { + throw new UTXOProviderException(e); + } + } + + /** + * Convert Unspent Output to a UTXO + * + * @param unspentOutput + * + * @return the UTXO + * + * @throws ForeignBlockchainException + */ + private UTXO toUTXO(UnspentOutput unspentOutput) throws ForeignBlockchainException { + List transactionOutputs = this.bitcoiny.getOutputs(unspentOutput.hash); + + TransactionOutput transactionOutput = transactionOutputs.get(unspentOutput.index); + + return new UTXO( + Sha256Hash.wrap(unspentOutput.hash), + unspentOutput.index, + Coin.valueOf(unspentOutput.value), + unspentOutput.height, + false, + transactionOutput.getScriptPubKey() + ); + } + + @Override + public int getChainHeadHeight() throws UTXOProviderException { + try { + return this.bitcoiny.blockchainProvider.getCurrentHeight(); + } catch (ForeignBlockchainException e) { + throw new UTXOProviderException(e); + } + } + + @Override + public NetworkParameters getParams() { + return this.bitcoiny.params; + } +} \ No newline at end of file diff --git a/src/test/java/org/qortal/test/crosschain/BitcoinyTests.java b/src/test/java/org/qortal/test/crosschain/BitcoinyTests.java index e5486bb7..35da08d3 100644 --- a/src/test/java/org/qortal/test/crosschain/BitcoinyTests.java +++ b/src/test/java/org/qortal/test/crosschain/BitcoinyTests.java @@ -99,6 +99,14 @@ public abstract class BitcoinyTests extends Common { transaction = bitcoiny.buildSpend(xprv58, recipient, amount); assertNotNull(transaction); } + @Test + public void testRepair() throws ForeignBlockchainException { + String xprv58 = getDeterministicKey58(); + + String transaction = bitcoiny.repairOldWallet(xprv58); + + assertNotNull(transaction); + } @Test public void testGetWalletBalance() throws ForeignBlockchainException { From 2d070f343b305272f132e412cce42457bd9cb614 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Mon, 1 Jan 2024 18:56:09 +0100 Subject: [PATCH 16/47] Update translations --- src/main/resources/i18n/SysTray_de.properties | 8 ++++++++ src/main/resources/i18n/SysTray_en.properties | 8 ++++++++ src/main/resources/i18n/SysTray_es.properties | 8 ++++++++ src/main/resources/i18n/SysTray_fi.properties | 8 ++++++++ src/main/resources/i18n/SysTray_fr.properties | 8 ++++++++ src/main/resources/i18n/SysTray_he.properties | 8 ++++++++ src/main/resources/i18n/SysTray_hu.properties | 8 ++++++++ src/main/resources/i18n/SysTray_it.properties | 8 ++++++++ src/main/resources/i18n/SysTray_jp.properties | 8 ++++++++ src/main/resources/i18n/SysTray_ko.properties | 8 ++++++++ src/main/resources/i18n/SysTray_nl.properties | 8 ++++++++ src/main/resources/i18n/SysTray_pl.properties | 8 ++++++++ src/main/resources/i18n/SysTray_ro.properties | 8 ++++++++ src/main/resources/i18n/SysTray_ru.properties | 8 ++++++++ src/main/resources/i18n/SysTray_sv.properties | 8 ++++++++ src/main/resources/i18n/SysTray_zh_CN.properties | 8 ++++++++ src/main/resources/i18n/SysTray_zh_TW.properties | 8 ++++++++ 17 files changed, 136 insertions(+) diff --git a/src/main/resources/i18n/SysTray_de.properties b/src/main/resources/i18n/SysTray_de.properties index c92130f1..4f09a3a2 100644 --- a/src/main/resources/i18n/SysTray_de.properties +++ b/src/main/resources/i18n/SysTray_de.properties @@ -46,3 +46,11 @@ SYNCHRONIZE_CLOCK = Synchronisiere Uhrzeit SYNCHRONIZING_BLOCKCHAIN = Synchronisiere SYNCHRONIZING_CLOCK = Uhrzeit wird synchronisiert + +RESTARTING_NODE = Knoten wird neu gestartet + +APPLYING_RESTARTING_NODE = Neustart des knotens wird angewendet. Bitte haben Sie Geduld... + +BOOTSTRAP_NODE = Bootstrapping-Knoten + +APPLYING_BOOTSTRAP_AND_RESTARTING = Bootstrap anwenden und Knoten neu starten. Bitte haben Sie Geduld... diff --git a/src/main/resources/i18n/SysTray_en.properties b/src/main/resources/i18n/SysTray_en.properties index 39940be0..afc8210c 100644 --- a/src/main/resources/i18n/SysTray_en.properties +++ b/src/main/resources/i18n/SysTray_en.properties @@ -46,3 +46,11 @@ SYNCHRONIZE_CLOCK = Synchronize clock SYNCHRONIZING_BLOCKCHAIN = Synchronizing SYNCHRONIZING_CLOCK = Synchronizing clock + +RESTARTING_NODE = Restarting Node + +APPLYING_RESTARTING_NODE = Applying restarting node. Please be patient... + +BOOTSTRAP_NODE = Bootstrapping Node + +APPLYING_BOOTSTRAP_AND_RESTARTING = Applying bootstrap and restarting node. Please be patient... diff --git a/src/main/resources/i18n/SysTray_es.properties b/src/main/resources/i18n/SysTray_es.properties index 36cbb22c..cc0ba7b2 100644 --- a/src/main/resources/i18n/SysTray_es.properties +++ b/src/main/resources/i18n/SysTray_es.properties @@ -44,3 +44,11 @@ SYNCHRONIZE_CLOCK = Sincronizar reloj SYNCHRONIZING_BLOCKCHAIN = Sincronizando SYNCHRONIZING_CLOCK = Sincronizando reloj + +RESTARTING_NODE = Reiniciando el nodo + +APPLYING_RESTARTING_NODE = Aplicando el nodo de reinicio. Por favor sea paciente... + +BOOTSTRAP_NODE = Nodo de arranque + +APPLYING_BOOTSTRAP_AND_RESTARTING = Aplicando bootstrap y reiniciando el nodo. Por favor sea paciente... diff --git a/src/main/resources/i18n/SysTray_fi.properties b/src/main/resources/i18n/SysTray_fi.properties index 4038d615..351bc921 100644 --- a/src/main/resources/i18n/SysTray_fi.properties +++ b/src/main/resources/i18n/SysTray_fi.properties @@ -46,3 +46,11 @@ SYNCHRONIZE_CLOCK = Synkronisoi kello SYNCHRONIZING_BLOCKCHAIN = Synkronisoi SYNCHRONIZING_CLOCK = Synkronisoi kelloa + +RESTARTING_NODE = Käynnistetään uudelleen solmu + +APPLYING_RESTARTING_NODE = Käytetään uudelleenkäynnistyssolmua. Olkaa kärsivällisiä... + +BOOTSTRAP_NODE = Käynnistyssolmu + +APPLYING_BOOTSTRAP_AND_RESTARTING = Käynnistetään ja käynnistetään solmu uudelleen. Olkaa kärsivällisiä... diff --git a/src/main/resources/i18n/SysTray_fr.properties b/src/main/resources/i18n/SysTray_fr.properties index 2e376842..39ac44e3 100644 --- a/src/main/resources/i18n/SysTray_fr.properties +++ b/src/main/resources/i18n/SysTray_fr.properties @@ -46,3 +46,11 @@ SYNCHRONIZE_CLOCK = Mettre l'heure à jour SYNCHRONIZING_BLOCKCHAIN = Synchronisation SYNCHRONIZING_CLOCK = Synchronisation de l'heure + +RESTARTING_NODE = Redémarrage du nœud + +APPLYING_RESTARTING_NODE = Application du redémarrage du nœud. S'il vous plaît, soyez patient... + +BOOTSTRAP_NODE = Nœud d'amorçage + +APPLYING_BOOTSTRAP_AND_RESTARTING = Application du bootstrap et redémarrage du nœud. S'il vous plaît, soyez patient... diff --git a/src/main/resources/i18n/SysTray_he.properties b/src/main/resources/i18n/SysTray_he.properties index 50ef8933..09a9f6dd 100644 --- a/src/main/resources/i18n/SysTray_he.properties +++ b/src/main/resources/i18n/SysTray_he.properties @@ -46,3 +46,11 @@ SYNCHRONIZE_CLOCK = סנכרן שעון SYNCHRONIZING_BLOCKCHAIN ​​= מסנכרן SYNCHRONIZING_CLOCK = מסנכרן שעון + +RESTARTING_NODE = הפעלה מחדש של צומת + +APPLYING_RESTARTING_NODE = החלת צומת הפעלה מחדש. אנא התאזר בסבלנות... + +BOOTSTRAP_NODE = צומת אתחול + +APPLYING_BOOTSTRAP_AND_RESTARTING = החלת אתחול והפעלת צומת diff --git a/src/main/resources/i18n/SysTray_hu.properties b/src/main/resources/i18n/SysTray_hu.properties index 74ab21ac..3b1da2cc 100644 --- a/src/main/resources/i18n/SysTray_hu.properties +++ b/src/main/resources/i18n/SysTray_hu.properties @@ -46,3 +46,11 @@ SYNCHRONIZE_CLOCK = Óra-szinkronizálás megkezdése SYNCHRONIZING_BLOCKCHAIN = Szinkronizálás SYNCHRONIZING_CLOCK = Óraszinkronizálás folyamatban + +RESTARTING_NODE = Csomópont újraindítása + +APPLYING_RESTARTING_NODE = Újraindító csomópont alkalmazása. Kérjük várjon... + +BOOTSTRAP_NODE = Rendszerindítási csomópont + +APPLYING_BOOTSTRAP_AND_RESTARTING = Bootstrap alkalmazása és csomópont újraindítása. Kérjük várjon... diff --git a/src/main/resources/i18n/SysTray_it.properties b/src/main/resources/i18n/SysTray_it.properties index d966d825..55cd4c83 100644 --- a/src/main/resources/i18n/SysTray_it.properties +++ b/src/main/resources/i18n/SysTray_it.properties @@ -46,3 +46,11 @@ SYNCHRONIZE_CLOCK = Sincronizzare l'orologio SYNCHRONIZING_BLOCKCHAIN = Sincronizzazione della blockchain SYNCHRONIZING_CLOCK = Sincronizzazione orologio + +RESTARTING_NODE = Riavvio del nodo + +APPLYING_RESTARTING_NODE = Applicazione del nodo di riavvio. Per favore sii paziente... + +BOOTSTRAP_NODE = Nodo di bootstrap + +APPLYING_BOOTSTRAP_AND_RESTARTING = Applicazione del bootstrap e riavvio del nodo. Per favore sii paziente... diff --git a/src/main/resources/i18n/SysTray_jp.properties b/src/main/resources/i18n/SysTray_jp.properties index c4cccb5b..036bf8f2 100644 --- a/src/main/resources/i18n/SysTray_jp.properties +++ b/src/main/resources/i18n/SysTray_jp.properties @@ -46,3 +46,11 @@ SYNCHRONIZE_CLOCK = 時刻を同期 SYNCHRONIZING_BLOCKCHAIN = ブロックチェーンを同期中 SYNCHRONIZING_CLOCK = 時刻を同期中 + +RESTARTING_NODE = ノードを再起動しています + +APPLYING_RESTARTING_NODE = 再起動ノードを適用しています。 しばらくお待ちください... + +BOOTSTRAP_NODE = ブートストラップ ノード + +APPLYING_BOOTSTRAP_AND_RESTARTING = ブートストラップを適用し、ノードを再起動します。 しばらくお待ちください... diff --git a/src/main/resources/i18n/SysTray_ko.properties b/src/main/resources/i18n/SysTray_ko.properties index dc6cb69b..0db49c53 100644 --- a/src/main/resources/i18n/SysTray_ko.properties +++ b/src/main/resources/i18n/SysTray_ko.properties @@ -46,3 +46,11 @@ SYNCHRONIZE_CLOCK = 시간 동기화 SYNCHRONIZING_BLOCKCHAIN = 동기화중 SYNCHRONIZING_CLOCK = 시간 동기화 + +RESTARTING_NODE = 노드 다시 시작 중 + +APPLYING_RESTARTING_NODE = 노드 재시작을 적용합니다. 기다려주십시오... + +BOOTSTRAP_NODE = 부트스트래핑 노드 + +APPLYING_BOOTSTRAP_AND_RESTARTING = 부트스트랩을 적용하고 노드를 다시 시작합니다. 기다려주십시오... diff --git a/src/main/resources/i18n/SysTray_nl.properties b/src/main/resources/i18n/SysTray_nl.properties index 3d7de024..776720d5 100644 --- a/src/main/resources/i18n/SysTray_nl.properties +++ b/src/main/resources/i18n/SysTray_nl.properties @@ -46,3 +46,11 @@ SYNCHRONIZE_CLOCK = Synchronizeer klok SYNCHRONIZING_BLOCKCHAIN = Bezig met synchronizeren SYNCHRONIZING_CLOCK = Klok wordt gesynchronizeerd + +RESTARTING_NODE = Knooppunt opnieuw starten + +APPLYING_RESTARTING_NODE = Herstartknooppunt toepassen. Wees alstublieft geduldig... + +BOOTSTRAP_NODE = Opstartknooppunt + +APPLYING_BOOTSTRAP_AND_RESTARTING = Bootstrap toepassen en knooppunt opnieuw starten. Wees alstublieft geduldig... diff --git a/src/main/resources/i18n/SysTray_pl.properties b/src/main/resources/i18n/SysTray_pl.properties index 84740da0..8ee40751 100644 --- a/src/main/resources/i18n/SysTray_pl.properties +++ b/src/main/resources/i18n/SysTray_pl.properties @@ -44,3 +44,11 @@ SYNCHRONIZE_CLOCK = Synchronizuj zegar SYNCHRONIZING_BLOCKCHAIN = Synchronizacja SYNCHRONIZING_CLOCK = Synchronizacja zegara + +RESTARTING_NODE = Ponowne uruchamianie węzła + +APPLYING_RESTARTING_NODE = Stosuję ponowne uruchomienie węzła. Proszę być cierpliwym... + +BOOTSTRAP_NODE = Węzeł ładowania początkowego + +APPLYING_BOOTSTRAP_AND_RESTARTING = Stosowanie ładowania początkowego i ponowne uruchamianie węzła. Proszę być cierpliwym... diff --git a/src/main/resources/i18n/SysTray_ro.properties b/src/main/resources/i18n/SysTray_ro.properties index 4130bbcb..f3cf76c9 100644 --- a/src/main/resources/i18n/SysTray_ro.properties +++ b/src/main/resources/i18n/SysTray_ro.properties @@ -46,3 +46,11 @@ SYNCHRONIZE_CLOCK = Sincronizare ceas SYNCHRONIZING_BLOCKCHAIN = Sincronizare SYNCHRONIZING_CLOCK = Se sincronizeaza ceasul + +RESTARTING_NODE = Repornirea nodului + +APPLYING_RESTARTING_NODE = Se aplica nodul de repornire. Te rog fii rabdator... + +BOOTSTRAP_NODE = Nod de bootstrap + +APPLYING_BOOTSTRAP_AND_RESTARTING = Se aplica bootstrap si se reporneste nodul. Te rog fii rabdator... diff --git a/src/main/resources/i18n/SysTray_ru.properties b/src/main/resources/i18n/SysTray_ru.properties index c8615f73..ddf0c0a0 100644 --- a/src/main/resources/i18n/SysTray_ru.properties +++ b/src/main/resources/i18n/SysTray_ru.properties @@ -46,3 +46,11 @@ SYNCHRONIZE_CLOCK = Синхронизировать время SYNCHRONIZING_BLOCKCHAIN = Синхронизация цепи SYNCHRONIZING_CLOCK = Проверка времени + +RESTARTING_NODE = Перезапуск узла + +APPLYING_RESTARTING_NODE = Применение перезапуска узла. Пожалуйста, будьте терпеливы... + +BOOTSTRAP_NODE = Узел начальной загрузки + +APPLYING_BOOTSTRAP_AND_RESTARTING = Применение начальной загрузки и перезапуск узла. Пожалуйста, будьте терпеливы... diff --git a/src/main/resources/i18n/SysTray_sv.properties b/src/main/resources/i18n/SysTray_sv.properties index 96f291b5..a38cca3a 100644 --- a/src/main/resources/i18n/SysTray_sv.properties +++ b/src/main/resources/i18n/SysTray_sv.properties @@ -44,3 +44,11 @@ SYNCHRONIZE_CLOCK = Synkronisera klockan SYNCHRONIZING_BLOCKCHAIN = Synkroniserar SYNCHRONIZING_CLOCK = Synkroniserar klockan + +RESTARTING_NODE = Mimitian deui Node + +APPLYING_RESTARTING_NODE = Nerapkeun titik ngamimitian deui. Mangga sing sabar... + +BOOTSTRAP_NODE = Bootstrapping Node + +APPLYING_BOOTSTRAP_AND_RESTARTING = Nerapkeun bootstrap sareng hurungkeun deui titik. Mangga sing sabar... diff --git a/src/main/resources/i18n/SysTray_zh_CN.properties b/src/main/resources/i18n/SysTray_zh_CN.properties index d6848a7c..7e84f3f2 100644 --- a/src/main/resources/i18n/SysTray_zh_CN.properties +++ b/src/main/resources/i18n/SysTray_zh_CN.properties @@ -46,3 +46,11 @@ SYNCHRONIZE_CLOCK = 同步时钟 SYNCHRONIZING_BLOCKCHAIN = 正在同步区块链 SYNCHRONIZING_CLOCK = 正在同步时钟 + +RESTARTING_NODE = 重新启动节点 + +APPLYING_RESTARTING_NODE = 应用重新启动节点。 请耐心等待... + +BOOTSTRAP_NODE = 引导节点 + +APPLYING_BOOTSTRAP_AND_RESTARTING = 应用引导程序并重新启动节点。 请耐心等待... diff --git a/src/main/resources/i18n/SysTray_zh_TW.properties b/src/main/resources/i18n/SysTray_zh_TW.properties index eabdbb63..d774bc11 100644 --- a/src/main/resources/i18n/SysTray_zh_TW.properties +++ b/src/main/resources/i18n/SysTray_zh_TW.properties @@ -46,3 +46,11 @@ SYNCHRONIZE_CLOCK = 同步時鐘 SYNCHRONIZING_BLOCKCHAIN = 正在同步區塊鏈 SYNCHRONIZING_CLOCK = 正在同步時鐘 + +RESTARTING_NODE = 重新啟動節點 + +APPLYING_RESTARTING_NODE = 應用重新啟動節點。 請耐心等待... + +BOOTSTRAP_NODE = 引導節點 + +APPLYING_BOOTSTRAP_AND_RESTARTING = 應用引導程式並重新啟動節點。 請耐心等待... From 677fd7a64fdb3f74b09f7ad080b26e72810c5e81 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Mon, 1 Jan 2024 19:31:22 +0100 Subject: [PATCH 17/47] Rework restart node and bootstrap node --- src/main/java/org/qortal/ApplyBootstrap.java | 227 ++++++++++++++++++ src/main/java/org/qortal/ApplyRestart.java | 196 +++++++++++++++ src/main/java/org/qortal/ApplyUpdate.java | 2 +- .../restricted/resource/AdminResource.java | 6 +- .../org/qortal/controller/AutoUpdate.java | 170 ------------- .../org/qortal/controller/BootstrapNode.java | 103 ++++++++ .../org/qortal/controller/RestartNode.java | 102 ++++++++ 7 files changed, 633 insertions(+), 173 deletions(-) create mode 100644 src/main/java/org/qortal/ApplyBootstrap.java create mode 100644 src/main/java/org/qortal/ApplyRestart.java create mode 100644 src/main/java/org/qortal/controller/BootstrapNode.java create mode 100644 src/main/java/org/qortal/controller/RestartNode.java diff --git a/src/main/java/org/qortal/ApplyBootstrap.java b/src/main/java/org/qortal/ApplyBootstrap.java new file mode 100644 index 00000000..547d8558 --- /dev/null +++ b/src/main/java/org/qortal/ApplyBootstrap.java @@ -0,0 +1,227 @@ +package org.qortal; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.jsse.provider.BouncyCastleJsseProvider; +import org.qortal.api.ApiKey; +import org.qortal.api.ApiRequest; +import org.qortal.controller.BootstrapNode; +import org.qortal.settings.Settings; + +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.attribute.BasicFileAttributes; +import java.security.Security; +import java.util.*; +import java.util.stream.Collectors; + +import static org.qortal.controller.BootstrapNode.AGENTLIB_JVM_HOLDER_ARG; + +public class ApplyBootstrap { + + static { + // This static block will be called before others if using ApplyBootstrap.main() + + // Log into different files for bootstrap - this has to be before LogManger.getLogger() calls + System.setProperty("log4j2.filenameTemplate", "log-apply-bootstrap.txt"); + + // This must go before any calls to LogManager/Logger + System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"); + } + + private static final Logger LOGGER = LogManager.getLogger(ApplyBootstrap.class); + private static final String JAR_FILENAME = BootstrapNode.JAR_FILENAME; + private static final String WINDOWS_EXE_LAUNCHER = "qortal.exe"; + private static final String JAVA_TOOL_OPTIONS_NAME = "JAVA_TOOL_OPTIONS"; + private static final String JAVA_TOOL_OPTIONS_VALUE = ""; + + private static final long CHECK_INTERVAL = 15 * 1000L; // ms + private static final int MAX_ATTEMPTS = 20; + + public static void main(String[] args) { + Security.insertProviderAt(new BouncyCastleProvider(), 0); + Security.insertProviderAt(new BouncyCastleJsseProvider(), 1); + + // Load/check settings, which potentially sets up blockchain config, etc. + if (args.length > 0) + Settings.fileInstance(args[0]); + else + Settings.getInstance(); + + LOGGER.info("Applying bootstrap..."); + + // Shutdown node using API + if (!shutdownNode()) + return; + + // Delete db + deleteDB(); + + // Restart node + restartNode(args); + + LOGGER.info("Bootstrapping..."); + } + + private static boolean shutdownNode() { + String baseUri = "http://localhost:" + Settings.getInstance().getApiPort() + "/"; + LOGGER.info(() -> String.format("Shutting down node using API via %s", baseUri)); + + // The /admin/stop endpoint requires an API key, which may or may not be already generated + boolean apiKeyNewlyGenerated = false; + ApiKey apiKey = null; + try { + apiKey = new ApiKey(); + if (!apiKey.generated()) { + apiKey.generate(); + apiKeyNewlyGenerated = true; + LOGGER.info("Generated API key"); + } + } catch (IOException e) { + LOGGER.info("Error loading API key: {}", e.getMessage()); + } + + // Create GET params + Map params = new HashMap<>(); + if (apiKey != null) { + params.put("apiKey", apiKey.toString()); + } + + // Attempt to stop the node + int attempt; + for (attempt = 0; attempt < MAX_ATTEMPTS; ++attempt) { + final int attemptForLogging = attempt; + LOGGER.info(() -> String.format("Attempt #%d out of %d to shutdown node", attemptForLogging + 1, MAX_ATTEMPTS)); + String response = ApiRequest.perform(baseUri + "admin/stop", params); + if (response == null) { + // No response - consider node shut down + if (apiKeyNewlyGenerated) { + // API key was newly generated for bootstrapping node, so we need to remove it + ApplyBootstrap.removeGeneratedApiKey(); + } + return true; + } + + LOGGER.info(() -> String.format("Response from API: %s", response)); + + try { + Thread.sleep(CHECK_INTERVAL); + } catch (InterruptedException e) { + // We still need to check... + break; + } + } + + if (apiKeyNewlyGenerated) { + // API key was newly generated for bootstrapping node, so we need to remove it + ApplyBootstrap.removeGeneratedApiKey(); + } + + if (attempt == MAX_ATTEMPTS) { + LOGGER.error("Failed to shutdown node - giving up"); + return false; + } + + return true; + } + + private static void removeGeneratedApiKey() { + try { + LOGGER.info("Removing newly generated API key..."); + + // Delete the API key since it was only generated for bootstrapping node + ApiKey apiKey = new ApiKey(); + apiKey.delete(); + + } catch (IOException e) { + LOGGER.info("Error loading or deleting API key: {}", e.getMessage()); + } + } + + private static void deleteDB() { + // Get the repository path from settings + String repositoryPath = Settings.getInstance().getRepositoryPath(); + LOGGER.info(String.format("Repository path: %s", repositoryPath)); + + try { + Path directory = Paths.get(repositoryPath); + Files.walkFileTree(directory, new SimpleFileVisitor() { + @Override + public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { + Files.delete(file); + return FileVisitResult.CONTINUE; + } + + @Override + public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { + Files.delete(dir); + return FileVisitResult.CONTINUE; + } + }); + } catch (IOException e) { + LOGGER.info("Error deleting DB: {}", e.getMessage()); + } + } + + private static void restartNode(String[] args) { + String javaHome = System.getProperty("java.home"); + LOGGER.info(() -> String.format("Java home: %s", javaHome)); + + Path javaBinary = Paths.get(javaHome, "bin", "java"); + LOGGER.info(() -> String.format("Java binary: %s", javaBinary)); + + Path exeLauncher = Paths.get(WINDOWS_EXE_LAUNCHER); + LOGGER.info(() -> String.format("Windows EXE launcher: %s", exeLauncher)); + + List javaCmd; + if (Files.exists(exeLauncher)) { + javaCmd = Arrays.asList(exeLauncher.toString()); + } else { + javaCmd = new ArrayList<>(); + // Java runtime binary itself + javaCmd.add(javaBinary.toString()); + + // JVM arguments + javaCmd.addAll(ManagementFactory.getRuntimeMXBean().getInputArguments()); + + // Reapply any retained, but disabled, -agentlib JVM arg + javaCmd = javaCmd.stream() + .map(arg -> arg.replace(AGENTLIB_JVM_HOLDER_ARG, "-agentlib")) + .collect(Collectors.toList()); + + // Call mainClass in JAR + javaCmd.addAll(Arrays.asList("-jar", JAR_FILENAME)); + + // Add saved command-line args + javaCmd.addAll(Arrays.asList(args)); + } + + try { + LOGGER.info(String.format("Restarting node with: %s", String.join(" ", javaCmd))); + + ProcessBuilder processBuilder = new ProcessBuilder(javaCmd); + + if (Files.exists(exeLauncher)) { + LOGGER.info(() -> String.format("Setting env %s to %s", JAVA_TOOL_OPTIONS_NAME, JAVA_TOOL_OPTIONS_VALUE)); + processBuilder.environment().put(JAVA_TOOL_OPTIONS_NAME, JAVA_TOOL_OPTIONS_VALUE); + } + + // New process will inherit our stdout and stderr + processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT); + processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT); + + Process process = processBuilder.start(); + + // Nothing to pipe to new process, so close output stream (process's stdin) + process.getOutputStream().close(); + } catch (Exception e) { + LOGGER.error(String.format("Failed to restart node (BAD): %s", e.getMessage())); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/qortal/ApplyRestart.java b/src/main/java/org/qortal/ApplyRestart.java new file mode 100644 index 00000000..4a7ad473 --- /dev/null +++ b/src/main/java/org/qortal/ApplyRestart.java @@ -0,0 +1,196 @@ +package org.qortal; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.jsse.provider.BouncyCastleJsseProvider; +import org.qortal.api.ApiKey; +import org.qortal.api.ApiRequest; +import org.qortal.controller.RestartNode; +import org.qortal.settings.Settings; + +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.security.Security; +import java.util.*; +import java.util.stream.Collectors; + +import static org.qortal.controller.RestartNode.AGENTLIB_JVM_HOLDER_ARG; + +public class ApplyRestart { + + static { + // This static block will be called before others if using ApplyRestart.main() + + // Log into different files for restart node - this has to be before LogManger.getLogger() calls + System.setProperty("log4j2.filenameTemplate", "log-apply-restart.txt"); + + // This must go before any calls to LogManager/Logger + System.setProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager"); + } + + private static final Logger LOGGER = LogManager.getLogger(ApplyRestart.class); + private static final String JAR_FILENAME = RestartNode.JAR_FILENAME; + private static final String WINDOWS_EXE_LAUNCHER = "qortal.exe"; + private static final String JAVA_TOOL_OPTIONS_NAME = "JAVA_TOOL_OPTIONS"; + private static final String JAVA_TOOL_OPTIONS_VALUE = ""; + + private static final long CHECK_INTERVAL = 10 * 1000L; // ms + private static final int MAX_ATTEMPTS = 12; + + public static void main(String[] args) { + Security.insertProviderAt(new BouncyCastleProvider(), 0); + Security.insertProviderAt(new BouncyCastleJsseProvider(), 1); + + // Load/check settings, which potentially sets up blockchain config, etc. + if (args.length > 0) + Settings.fileInstance(args[0]); + else + Settings.getInstance(); + + LOGGER.info("Applying restart..."); + + // Shutdown node using API + if (!shutdownNode()) + return; + + // Restart node + restartNode(args); + + LOGGER.info("Restarting..."); + } + + private static boolean shutdownNode() { + String baseUri = "http://localhost:" + Settings.getInstance().getApiPort() + "/"; + LOGGER.info(() -> String.format("Shutting down node using API via %s", baseUri)); + + // The /admin/stop endpoint requires an API key, which may or may not be already generated + boolean apiKeyNewlyGenerated = false; + ApiKey apiKey = null; + try { + apiKey = new ApiKey(); + if (!apiKey.generated()) { + apiKey.generate(); + apiKeyNewlyGenerated = true; + LOGGER.info("Generated API key"); + } + } catch (IOException e) { + LOGGER.info("Error loading API key: {}", e.getMessage()); + } + + // Create GET params + Map params = new HashMap<>(); + if (apiKey != null) { + params.put("apiKey", apiKey.toString()); + } + + // Attempt to stop the node + int attempt; + for (attempt = 0; attempt < MAX_ATTEMPTS; ++attempt) { + final int attemptForLogging = attempt; + LOGGER.info(() -> String.format("Attempt #%d out of %d to shutdown node", attemptForLogging + 1, MAX_ATTEMPTS)); + String response = ApiRequest.perform(baseUri + "admin/stop", params); + if (response == null) { + // No response - consider node shut down + if (apiKeyNewlyGenerated) { + // API key was newly generated for restarting node, so we need to remove it + ApplyRestart.removeGeneratedApiKey(); + } + return true; + } + + LOGGER.info(() -> String.format("Response from API: %s", response)); + + try { + Thread.sleep(CHECK_INTERVAL); + } catch (InterruptedException e) { + // We still need to check... + break; + } + } + + if (apiKeyNewlyGenerated) { + // API key was newly generated for restarting node, so we need to remove it + ApplyRestart.removeGeneratedApiKey(); + } + + if (attempt == MAX_ATTEMPTS) { + LOGGER.error("Failed to shutdown node - giving up"); + return false; + } + + return true; + } + + private static void removeGeneratedApiKey() { + try { + LOGGER.info("Removing newly generated API key..."); + + // Delete the API key since it was only generated for restarting node + ApiKey apiKey = new ApiKey(); + apiKey.delete(); + + } catch (IOException e) { + LOGGER.info("Error loading or deleting API key: {}", e.getMessage()); + } + } + + private static void restartNode(String[] args) { + String javaHome = System.getProperty("java.home"); + LOGGER.info(() -> String.format("Java home: %s", javaHome)); + + Path javaBinary = Paths.get(javaHome, "bin", "java"); + LOGGER.info(() -> String.format("Java binary: %s", javaBinary)); + + Path exeLauncher = Paths.get(WINDOWS_EXE_LAUNCHER); + LOGGER.info(() -> String.format("Windows EXE launcher: %s", exeLauncher)); + + List javaCmd; + if (Files.exists(exeLauncher)) { + javaCmd = Arrays.asList(exeLauncher.toString()); + } else { + javaCmd = new ArrayList<>(); + // Java runtime binary itself + javaCmd.add(javaBinary.toString()); + + // JVM arguments + javaCmd.addAll(ManagementFactory.getRuntimeMXBean().getInputArguments()); + + // Reapply any retained, but disabled, -agentlib JVM arg + javaCmd = javaCmd.stream() + .map(arg -> arg.replace(AGENTLIB_JVM_HOLDER_ARG, "-agentlib")) + .collect(Collectors.toList()); + + // Call mainClass in JAR + javaCmd.addAll(Arrays.asList("-jar", JAR_FILENAME)); + + // Add saved command-line args + javaCmd.addAll(Arrays.asList(args)); + } + + try { + LOGGER.info(String.format("Restarting node with: %s", String.join(" ", javaCmd))); + + ProcessBuilder processBuilder = new ProcessBuilder(javaCmd); + + if (Files.exists(exeLauncher)) { + LOGGER.info(() -> String.format("Setting env %s to %s", JAVA_TOOL_OPTIONS_NAME, JAVA_TOOL_OPTIONS_VALUE)); + processBuilder.environment().put(JAVA_TOOL_OPTIONS_NAME, JAVA_TOOL_OPTIONS_VALUE); + } + + // New process will inherit our stdout and stderr + processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT); + processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT); + + Process process = processBuilder.start(); + + // Nothing to pipe to new process, so close output stream (process's stdin) + process.getOutputStream().close(); + } catch (Exception e) { + LOGGER.error(String.format("Failed to restart node (BAD): %s", e.getMessage())); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/qortal/ApplyUpdate.java b/src/main/java/org/qortal/ApplyUpdate.java index f1f9d22f..768b1854 100644 --- a/src/main/java/org/qortal/ApplyUpdate.java +++ b/src/main/java/org/qortal/ApplyUpdate.java @@ -38,7 +38,7 @@ public class ApplyUpdate { private static final String NEW_JAR_FILENAME = AutoUpdate.NEW_JAR_FILENAME; private static final String WINDOWS_EXE_LAUNCHER = "qortal.exe"; private static final String JAVA_TOOL_OPTIONS_NAME = "JAVA_TOOL_OPTIONS"; - private static final String JAVA_TOOL_OPTIONS_VALUE = "-XX:MaxRAMFraction=4"; + private static final String JAVA_TOOL_OPTIONS_VALUE = ""; private static final long CHECK_INTERVAL = 30 * 1000L; // ms private static final int MAX_ATTEMPTS = 12; diff --git a/src/main/java/org/qortal/api/restricted/resource/AdminResource.java b/src/main/java/org/qortal/api/restricted/resource/AdminResource.java index 35bf9108..301e6562 100644 --- a/src/main/java/org/qortal/api/restricted/resource/AdminResource.java +++ b/src/main/java/org/qortal/api/restricted/resource/AdminResource.java @@ -25,7 +25,9 @@ import org.qortal.api.model.NodeInfo; import org.qortal.api.model.NodeStatus; import org.qortal.block.BlockChain; import org.qortal.controller.AutoUpdate; +import org.qortal.controller.BootstrapNode; import org.qortal.controller.Controller; +import org.qortal.controller.RestartNode; import org.qortal.controller.Synchronizer; import org.qortal.controller.Synchronizer.SynchronizationResult; import org.qortal.controller.repository.BlockArchiveRebuilder; @@ -250,7 +252,7 @@ public class AdminResource { // Not important } - AutoUpdate.attemptRestart(); + RestartNode.attemptToRestart(); }).start(); @@ -281,7 +283,7 @@ public class AdminResource { // Not important } - AutoUpdate.attemptBootstrap(); + BootstrapNode.attemptToBootstrap(); }).start(); diff --git a/src/main/java/org/qortal/controller/AutoUpdate.java b/src/main/java/org/qortal/controller/AutoUpdate.java index 0bdcfd48..4b315651 100644 --- a/src/main/java/org/qortal/controller/AutoUpdate.java +++ b/src/main/java/org/qortal/controller/AutoUpdate.java @@ -23,12 +23,9 @@ import java.io.InputStream; import java.io.OutputStream; import java.lang.management.ManagementFactory; import java.nio.ByteBuffer; -import java.nio.file.FileVisitResult; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; -import java.nio.file.SimpleFileVisitor; -import java.nio.file.attribute.BasicFileAttributes; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; @@ -294,171 +291,4 @@ public class AutoUpdate extends Thread { return true; // repo was okay, even if applying update failed } } - - public static boolean attemptRestart() { - LOGGER.info(String.format("Restarting node...")); - - // Give repository a chance to backup in case things go badly wrong (if enabled) - if (Settings.getInstance().getRepositoryBackupInterval() > 0) { - try { - // Timeout if the database isn't ready for backing up after 60 seconds - long timeout = 60 * 1000L; - RepositoryManager.backup(true, "backup", timeout); - - } catch (TimeoutException e) { - LOGGER.info("Attempt to backup repository failed due to timeout: {}", e.getMessage()); - // Continue with the node restart anyway... - } - } - - // Call ApplyUpdate to end this process (unlocking current JAR so it can be replaced) - String javaHome = System.getProperty("java.home"); - LOGGER.debug(String.format("Java home: %s", javaHome)); - - Path javaBinary = Paths.get(javaHome, "bin", "java"); - LOGGER.debug(String.format("Java binary: %s", javaBinary)); - - try { - List javaCmd = new ArrayList<>(); - // Java runtime binary itself - javaCmd.add(javaBinary.toString()); - - // JVM arguments - javaCmd.addAll(ManagementFactory.getRuntimeMXBean().getInputArguments()); - - // Disable, but retain, any -agentlib JVM arg as sub-process might fail if it tries to reuse same port - javaCmd = javaCmd.stream() - .map(arg -> arg.replace("-agentlib", AGENTLIB_JVM_HOLDER_ARG)) - .collect(Collectors.toList()); - - // Remove JNI options as they won't be supported by command-line 'java' - // These are typically added by the AdvancedInstaller Java launcher EXE - javaCmd.removeAll(Arrays.asList("abort", "exit", "vfprintf")); - - // Call ApplyUpdate using JAR - javaCmd.addAll(Arrays.asList("-cp", JAR_FILENAME, ApplyUpdate.class.getCanonicalName())); - - // Add command-line args saved from start-up - String[] savedArgs = Controller.getInstance().getSavedArgs(); - if (savedArgs != null) - javaCmd.addAll(Arrays.asList(savedArgs)); - - LOGGER.info(String.format("Restarting node with: %s", String.join(" ", javaCmd))); - - SysTray.getInstance().showMessage(Translator.INSTANCE.translate("SysTray", "AUTO_UPDATE"), //TODO - Translator.INSTANCE.translate("SysTray", "APPLYING_UPDATE_AND_RESTARTING"), //TODO - MessageType.INFO); - - ProcessBuilder processBuilder = new ProcessBuilder(javaCmd); - - // New process will inherit our stdout and stderr - processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT); - processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT); - - Process process = processBuilder.start(); - - // Nothing to pipe to new process, so close output stream (process's stdin) - process.getOutputStream().close(); - - return true; // restarting node OK - } catch (Exception e) { - LOGGER.error(String.format("Failed to restart node: %s", e.getMessage())); - - return true; // repo was okay, even if applying update failed - } - } - - public static boolean attemptBootstrap() { - LOGGER.info(String.format("Bootstrapping node...")); - - // Give repository a chance to backup in case things go badly wrong (if enabled) - if (Settings.getInstance().getRepositoryBackupInterval() > 0) { - try { - // Timeout if the database isn't ready for backing up after 60 seconds - long timeout = 60 * 1000L; - RepositoryManager.backup(true, "backup", timeout); - - } catch (TimeoutException e) { - LOGGER.info("Attempt to backup repository failed due to timeout: {}", e.getMessage()); - // Continue with the bootstrap anyway... - } - } - - // Get the repository path from settings - String repositoryPath = Settings.getInstance().getRepositoryPath(); - LOGGER.debug(String.format("Repository path: %s", repositoryPath)); - - // Call ApplyUpdate to end this process (unlocking current JAR so it can be replaced) - String javaHome = System.getProperty("java.home"); - LOGGER.debug(String.format("Java home: %s", javaHome)); - - Path javaBinary = Paths.get(javaHome, "bin", "java"); - LOGGER.debug(String.format("Java binary: %s", javaBinary)); - - try { - Path directory = Paths.get(repositoryPath); - Files.walkFileTree(directory, new SimpleFileVisitor() { - @Override - public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { - Files.delete(file); - return FileVisitResult.CONTINUE; - } - - @Override - public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException { - Files.delete(dir); - return FileVisitResult.CONTINUE; - } - }); - - List javaCmd = new ArrayList<>(); - - // Java runtime binary itself - javaCmd.add(javaBinary.toString()); - - // JVM arguments - javaCmd.addAll(ManagementFactory.getRuntimeMXBean().getInputArguments()); - - // Disable, but retain, any -agentlib JVM arg as sub-process might fail if it tries to reuse same port - javaCmd = javaCmd.stream() - .map(arg -> arg.replace("-agentlib", AGENTLIB_JVM_HOLDER_ARG)) - .collect(Collectors.toList()); - - // Remove JNI options as they won't be supported by command-line 'java' - // These are typically added by the AdvancedInstaller Java launcher EXE - javaCmd.removeAll(Arrays.asList("abort", "exit", "vfprintf")); - - // Call ApplyUpdate using JAR - javaCmd.addAll(Arrays.asList("-cp", JAR_FILENAME, ApplyUpdate.class.getCanonicalName())); - - // Add command-line args saved from start-up - String[] savedArgs = Controller.getInstance().getSavedArgs(); - if (savedArgs != null) - javaCmd.addAll(Arrays.asList(savedArgs)); - - LOGGER.info(String.format("Restarting node with: %s", String.join(" ", javaCmd))); - - SysTray.getInstance().showMessage(Translator.INSTANCE.translate("SysTray", "AUTO_UPDATE"), //TODO - Translator.INSTANCE.translate("SysTray", "APPLYING_UPDATE_AND_RESTARTING"), //TODO - MessageType.INFO); - - ProcessBuilder processBuilder = new ProcessBuilder(javaCmd); - - // New process will inherit our stdout and stderr - processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT); - processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT); - - Process process = processBuilder.start(); - - // Nothing to pipe to new process, so close output stream (process's stdin) - process.getOutputStream().close(); - - return true; // restarting node OK - } catch (Exception e) { - LOGGER.error(String.format("Failed to restart node: %s", e.getMessage())); - - return true; // repo was okay, even if applying update failed - } - } - } diff --git a/src/main/java/org/qortal/controller/BootstrapNode.java b/src/main/java/org/qortal/controller/BootstrapNode.java new file mode 100644 index 00000000..9d0f8b36 --- /dev/null +++ b/src/main/java/org/qortal/controller/BootstrapNode.java @@ -0,0 +1,103 @@ +package org.qortal.controller; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.qortal.ApplyBootstrap; +import org.qortal.globalization.Translator; +import org.qortal.gui.SysTray; +import org.qortal.repository.RepositoryManager; +import org.qortal.settings.Settings; + +import java.awt.TrayIcon.MessageType; +import java.lang.management.ManagementFactory; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; + +/* NOTE: It is CRITICAL that we use OpenJDK and not Java SE because our uber jar repacks BouncyCastle which, in turn, unsigns BC causing it to be rejected as a security provider by Java SE. */ + +public class BootstrapNode { + + public static final String JAR_FILENAME = "qortal.jar"; + public static final String AGENTLIB_JVM_HOLDER_ARG = "-DQORTAL_agentlib="; + + private static final Logger LOGGER = LogManager.getLogger(BootstrapNode.class); + + public static boolean attemptToBootstrap() { + LOGGER.info(String.format("Bootstrapping node...")); + + // Give repository a chance to backup in case things go badly wrong (if enabled) + if (Settings.getInstance().getRepositoryBackupInterval() > 0) { + try { + // Timeout if the database isn't ready for backing up after 60 seconds + long timeout = 60 * 1000L; + RepositoryManager.backup(true, "backup", timeout); + + } catch (TimeoutException e) { + LOGGER.info("Attempt to backup repository failed due to timeout: {}", e.getMessage()); + // Continue with the bootstrap anyway... + } + } + + // Call ApplyBootstrap to end this process + String javaHome = System.getProperty("java.home"); + LOGGER.debug(String.format("Java home: %s", javaHome)); + + Path javaBinary = Paths.get(javaHome, "bin", "java"); + LOGGER.debug(String.format("Java binary: %s", javaBinary)); + + try { + List javaCmd = new ArrayList<>(); + + // Java runtime binary itself + javaCmd.add(javaBinary.toString()); + + // JVM arguments + javaCmd.addAll(ManagementFactory.getRuntimeMXBean().getInputArguments()); + + // Disable, but retain, any -agentlib JVM arg as sub-process might fail if it tries to reuse same port + javaCmd = javaCmd.stream() + .map(arg -> arg.replace("-agentlib", AGENTLIB_JVM_HOLDER_ARG)) + .collect(Collectors.toList()); + + // Remove JNI options as they won't be supported by command-line 'java' + // These are typically added by the AdvancedInstaller Java launcher EXE + javaCmd.removeAll(Arrays.asList("abort", "exit", "vfprintf")); + + // Call ApplyBootstrap using JAR + javaCmd.addAll(Arrays.asList("-cp", JAR_FILENAME, ApplyBootstrap.class.getCanonicalName())); + + // Add command-line args saved from start-up + String[] savedArgs = Controller.getInstance().getSavedArgs(); + if (savedArgs != null) + javaCmd.addAll(Arrays.asList(savedArgs)); + + LOGGER.info(String.format("Restarting node with: %s", String.join(" ", javaCmd))); + + SysTray.getInstance().showMessage(Translator.INSTANCE.translate("SysTray", "BOOTSTRAP_NODE"), + Translator.INSTANCE.translate("SysTray", "APPLYING_BOOTSTRAP_AND_RESTARTING"), + MessageType.INFO); + + ProcessBuilder processBuilder = new ProcessBuilder(javaCmd); + + // New process will inherit our stdout and stderr + processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT); + processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT); + + Process process = processBuilder.start(); + + // Nothing to pipe to new process, so close output stream (process's stdin) + process.getOutputStream().close(); + + return true; // restarting node OK + } catch (Exception e) { + LOGGER.error(String.format("Failed to restart node: %s", e.getMessage())); + + return true; // repo was okay, even if applying bootstrap failed + } + } +} \ No newline at end of file diff --git a/src/main/java/org/qortal/controller/RestartNode.java b/src/main/java/org/qortal/controller/RestartNode.java new file mode 100644 index 00000000..4a64a87f --- /dev/null +++ b/src/main/java/org/qortal/controller/RestartNode.java @@ -0,0 +1,102 @@ +package org.qortal.controller; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.qortal.ApplyRestart;; +import org.qortal.globalization.Translator; +import org.qortal.gui.SysTray; +import org.qortal.repository.RepositoryManager; +import org.qortal.settings.Settings; + +import java.awt.TrayIcon.MessageType; +import java.lang.management.ManagementFactory; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.concurrent.TimeoutException; +import java.util.stream.Collectors; + +/* NOTE: It is CRITICAL that we use OpenJDK and not Java SE because our uber jar repacks BouncyCastle which, in turn, unsigns BC causing it to be rejected as a security provider by Java SE. */ + +public class RestartNode { + + public static final String JAR_FILENAME = "qortal.jar"; + public static final String AGENTLIB_JVM_HOLDER_ARG = "-DQORTAL_agentlib="; + + private static final Logger LOGGER = LogManager.getLogger(RestartNode.class); + + public static boolean attemptToRestart() { + LOGGER.info(String.format("Restarting node...")); + + // Give repository a chance to backup in case things go badly wrong (if enabled) + if (Settings.getInstance().getRepositoryBackupInterval() > 0) { + try { + // Timeout if the database isn't ready for backing up after 60 seconds + long timeout = 60 * 1000L; + RepositoryManager.backup(true, "backup", timeout); + + } catch (TimeoutException e) { + LOGGER.info("Attempt to backup repository failed due to timeout: {}", e.getMessage()); + // Continue with the node restart anyway... + } + } + + // Call ApplyRestart to end this process + String javaHome = System.getProperty("java.home"); + LOGGER.debug(String.format("Java home: %s", javaHome)); + + Path javaBinary = Paths.get(javaHome, "bin", "java"); + LOGGER.debug(String.format("Java binary: %s", javaBinary)); + + try { + List javaCmd = new ArrayList<>(); + // Java runtime binary itself + javaCmd.add(javaBinary.toString()); + + // JVM arguments + javaCmd.addAll(ManagementFactory.getRuntimeMXBean().getInputArguments()); + + // Disable, but retain, any -agentlib JVM arg as sub-process might fail if it tries to reuse same port + javaCmd = javaCmd.stream() + .map(arg -> arg.replace("-agentlib", AGENTLIB_JVM_HOLDER_ARG)) + .collect(Collectors.toList()); + + // Remove JNI options as they won't be supported by command-line 'java' + // These are typically added by the AdvancedInstaller Java launcher EXE + javaCmd.removeAll(Arrays.asList("abort", "exit", "vfprintf")); + + // Call ApplyRestart using JAR + javaCmd.addAll(Arrays.asList("-cp", JAR_FILENAME, ApplyRestart.class.getCanonicalName())); + + // Add command-line args saved from start-up + String[] savedArgs = Controller.getInstance().getSavedArgs(); + if (savedArgs != null) + javaCmd.addAll(Arrays.asList(savedArgs)); + + LOGGER.info(String.format("Restarting node with: %s", String.join(" ", javaCmd))); + + SysTray.getInstance().showMessage(Translator.INSTANCE.translate("SysTray", "RESTARTING_NODE"), + Translator.INSTANCE.translate("SysTray", "APPLYING_RESTARTING_NODE"), + MessageType.INFO); + + ProcessBuilder processBuilder = new ProcessBuilder(javaCmd); + + // New process will inherit our stdout and stderr + processBuilder.redirectOutput(ProcessBuilder.Redirect.INHERIT); + processBuilder.redirectError(ProcessBuilder.Redirect.INHERIT); + + Process process = processBuilder.start(); + + // Nothing to pipe to new process, so close output stream (process's stdin) + process.getOutputStream().close(); + + return true; // restarting node OK + } catch (Exception e) { + LOGGER.error(String.format("Failed to restart node: %s", e.getMessage())); + + return true; // repo was okay, even if applying restart failed + } + } +} \ No newline at end of file From 84974775b4ddc85963fa2622512395be8e0eb3ef Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Tue, 2 Jan 2024 14:17:21 +0100 Subject: [PATCH 18/47] Reduce log spam --- src/main/java/org/qortal/ApplyBootstrap.java | 12 ++++++------ src/main/java/org/qortal/ApplyRestart.java | 10 +++++----- src/main/java/org/qortal/ApplyUpdate.java | 12 ++++++------ .../api/restricted/resource/AdminResource.java | 1 - src/main/java/org/qortal/controller/RestartNode.java | 2 +- 5 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/qortal/ApplyBootstrap.java b/src/main/java/org/qortal/ApplyBootstrap.java index 547d8558..9b370f7a 100644 --- a/src/main/java/org/qortal/ApplyBootstrap.java +++ b/src/main/java/org/qortal/ApplyBootstrap.java @@ -147,7 +147,7 @@ public class ApplyBootstrap { private static void deleteDB() { // Get the repository path from settings String repositoryPath = Settings.getInstance().getRepositoryPath(); - LOGGER.info(String.format("Repository path: %s", repositoryPath)); + LOGGER.debug(String.format("Repository path: %s", repositoryPath)); try { Path directory = Paths.get(repositoryPath); @@ -165,19 +165,19 @@ public class ApplyBootstrap { } }); } catch (IOException e) { - LOGGER.info("Error deleting DB: {}", e.getMessage()); + LOGGER.error("Error deleting DB: {}", e.getMessage()); } } private static void restartNode(String[] args) { String javaHome = System.getProperty("java.home"); - LOGGER.info(() -> String.format("Java home: %s", javaHome)); + LOGGER.debug(() -> String.format("Java home: %s", javaHome)); Path javaBinary = Paths.get(javaHome, "bin", "java"); - LOGGER.info(() -> String.format("Java binary: %s", javaBinary)); + LOGGER.debug(() -> String.format("Java binary: %s", javaBinary)); Path exeLauncher = Paths.get(WINDOWS_EXE_LAUNCHER); - LOGGER.info(() -> String.format("Windows EXE launcher: %s", exeLauncher)); + LOGGER.debug(() -> String.format("Windows EXE launcher: %s", exeLauncher)); List javaCmd; if (Files.exists(exeLauncher)) { @@ -208,7 +208,7 @@ public class ApplyBootstrap { ProcessBuilder processBuilder = new ProcessBuilder(javaCmd); if (Files.exists(exeLauncher)) { - LOGGER.info(() -> String.format("Setting env %s to %s", JAVA_TOOL_OPTIONS_NAME, JAVA_TOOL_OPTIONS_VALUE)); + LOGGER.debug(() -> String.format("Setting env %s to %s", JAVA_TOOL_OPTIONS_NAME, JAVA_TOOL_OPTIONS_VALUE)); processBuilder.environment().put(JAVA_TOOL_OPTIONS_NAME, JAVA_TOOL_OPTIONS_VALUE); } diff --git a/src/main/java/org/qortal/ApplyRestart.java b/src/main/java/org/qortal/ApplyRestart.java index 4a7ad473..70d07df5 100644 --- a/src/main/java/org/qortal/ApplyRestart.java +++ b/src/main/java/org/qortal/ApplyRestart.java @@ -140,13 +140,13 @@ public class ApplyRestart { private static void restartNode(String[] args) { String javaHome = System.getProperty("java.home"); - LOGGER.info(() -> String.format("Java home: %s", javaHome)); + LOGGER.debug(() -> String.format("Java home: %s", javaHome)); Path javaBinary = Paths.get(javaHome, "bin", "java"); - LOGGER.info(() -> String.format("Java binary: %s", javaBinary)); + LOGGER.debug(() -> String.format("Java binary: %s", javaBinary)); Path exeLauncher = Paths.get(WINDOWS_EXE_LAUNCHER); - LOGGER.info(() -> String.format("Windows EXE launcher: %s", exeLauncher)); + LOGGER.debug(() -> String.format("Windows EXE launcher: %s", exeLauncher)); List javaCmd; if (Files.exists(exeLauncher)) { @@ -172,12 +172,12 @@ public class ApplyRestart { } try { - LOGGER.info(String.format("Restarting node with: %s", String.join(" ", javaCmd))); + LOGGER.debug(String.format("Restarting node with: %s", String.join(" ", javaCmd))); ProcessBuilder processBuilder = new ProcessBuilder(javaCmd); if (Files.exists(exeLauncher)) { - LOGGER.info(() -> String.format("Setting env %s to %s", JAVA_TOOL_OPTIONS_NAME, JAVA_TOOL_OPTIONS_VALUE)); + LOGGER.debug(() -> String.format("Setting env %s to %s", JAVA_TOOL_OPTIONS_NAME, JAVA_TOOL_OPTIONS_VALUE)); processBuilder.environment().put(JAVA_TOOL_OPTIONS_NAME, JAVA_TOOL_OPTIONS_VALUE); } diff --git a/src/main/java/org/qortal/ApplyUpdate.java b/src/main/java/org/qortal/ApplyUpdate.java index 768b1854..ba2e0860 100644 --- a/src/main/java/org/qortal/ApplyUpdate.java +++ b/src/main/java/org/qortal/ApplyUpdate.java @@ -139,7 +139,7 @@ public class ApplyUpdate { apiKey.delete(); } catch (IOException e) { - LOGGER.info("Error loading or deleting API key: {}", e.getMessage()); + LOGGER.error("Error loading or deleting API key: {}", e.getMessage()); } } @@ -181,13 +181,13 @@ public class ApplyUpdate { private static void restartNode(String[] args) { String javaHome = System.getProperty("java.home"); - LOGGER.info(() -> String.format("Java home: %s", javaHome)); + LOGGER.debug(() -> String.format("Java home: %s", javaHome)); Path javaBinary = Paths.get(javaHome, "bin", "java"); - LOGGER.info(() -> String.format("Java binary: %s", javaBinary)); + LOGGER.debug(() -> String.format("Java binary: %s", javaBinary)); Path exeLauncher = Paths.get(WINDOWS_EXE_LAUNCHER); - LOGGER.info(() -> String.format("Windows EXE launcher: %s", exeLauncher)); + LOGGER.debug(() -> String.format("Windows EXE launcher: %s", exeLauncher)); List javaCmd; if (Files.exists(exeLauncher)) { @@ -213,12 +213,12 @@ public class ApplyUpdate { } try { - LOGGER.info(String.format("Restarting node with: %s", String.join(" ", javaCmd))); + LOGGER.debug(String.format("Restarting node with: %s", String.join(" ", javaCmd))); ProcessBuilder processBuilder = new ProcessBuilder(javaCmd); if (Files.exists(exeLauncher)) { - LOGGER.info(() -> String.format("Setting env %s to %s", JAVA_TOOL_OPTIONS_NAME, JAVA_TOOL_OPTIONS_VALUE)); + LOGGER.debug(() -> String.format("Setting env %s to %s", JAVA_TOOL_OPTIONS_NAME, JAVA_TOOL_OPTIONS_VALUE)); processBuilder.environment().put(JAVA_TOOL_OPTIONS_NAME, JAVA_TOOL_OPTIONS_VALUE); } diff --git a/src/main/java/org/qortal/api/restricted/resource/AdminResource.java b/src/main/java/org/qortal/api/restricted/resource/AdminResource.java index 301e6562..837288e5 100644 --- a/src/main/java/org/qortal/api/restricted/resource/AdminResource.java +++ b/src/main/java/org/qortal/api/restricted/resource/AdminResource.java @@ -24,7 +24,6 @@ import org.qortal.api.model.ActivitySummary; import org.qortal.api.model.NodeInfo; import org.qortal.api.model.NodeStatus; import org.qortal.block.BlockChain; -import org.qortal.controller.AutoUpdate; import org.qortal.controller.BootstrapNode; import org.qortal.controller.Controller; import org.qortal.controller.RestartNode; diff --git a/src/main/java/org/qortal/controller/RestartNode.java b/src/main/java/org/qortal/controller/RestartNode.java index 4a64a87f..b8d81b85 100644 --- a/src/main/java/org/qortal/controller/RestartNode.java +++ b/src/main/java/org/qortal/controller/RestartNode.java @@ -75,7 +75,7 @@ public class RestartNode { if (savedArgs != null) javaCmd.addAll(Arrays.asList(savedArgs)); - LOGGER.info(String.format("Restarting node with: %s", String.join(" ", javaCmd))); + LOGGER.debug(String.format("Restarting node with: %s", String.join(" ", javaCmd))); SysTray.getInstance().showMessage(Translator.INSTANCE.translate("SysTray", "RESTARTING_NODE"), Translator.INSTANCE.translate("SysTray", "APPLYING_RESTARTING_NODE"), From cc02810f0c89064999c738a4b2e3b1b34ab492e3 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Tue, 2 Jan 2024 14:26:08 +0100 Subject: [PATCH 19/47] Update dependencies --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index bff266a4..2475c9b4 100644 --- a/pom.xml +++ b/pom.xml @@ -37,7 +37,7 @@ 1.17.1 5.10.0 1.0.0 - 2.21.1 + 2.22.0 1.5.0-b01 3.12.1 3.3.0 @@ -46,7 +46,7 @@ 3.2.3 1.1.0 UTF-8 - 3.25.0 + 3.25.1 1.5.3 0.16 1.17 From bac0f01007f0faf59840addd14118d1da8c2ece3 Mon Sep 17 00:00:00 2001 From: crowetic Date: Wed, 3 Jan 2024 17:06:04 -0800 Subject: [PATCH 20/47] Modified default settings for optimal QDN performance. --- .../java/org/qortal/settings/Settings.java | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java index 29c726b1..757722f8 100644 --- a/src/main/java/org/qortal/settings/Settings.java +++ b/src/main/java/org/qortal/settings/Settings.java @@ -68,8 +68,7 @@ public class Settings { "localhost", "127.0.0.1" }; private String[] uiRemoteServers = new String[] { - "node1.qortal.org", "node2.qortal.org", "node3.qortal.org", "node4.qortal.org", "node5.qortal.org", - "node6.qortal.org", "node7.qortal.org", "node8.qortal.org", "node9.qortal.org", "node10.qortal.org" + "none.exist.anymore" }; // API-related @@ -138,11 +137,11 @@ public class Settings { private long repositoryCheckpointInterval = 60 * 60 * 1000L; // 1 hour (ms) default /** Whether to show a notification when we perform repository 'checkpoint'. */ private boolean showCheckpointNotification = false; - /* How many blocks to cache locally. Defaulted to 10, which covers a typical Synchronizer request + a few spare */ - private int blockCacheSize = 10; + /* How many blocks to cache locally. Defaulted to 10, which covers a typical Synchronizer request + a few spare - increased to 100 */ + private int blockCacheSize = 100; /** Maximum number of transactions for the block minter to include in a block */ - private int maxTransactionsPerBlock = 50; + private int maxTransactionsPerBlock = 100; /** How long to keep old, full, AT state data (ms). */ private long atStatesMaxLifetime = 5 * 24 * 60 * 60 * 1000L; // milliseconds @@ -164,7 +163,7 @@ public class Settings { private boolean lite = false; /** Whether we should prune old data to reduce database size - * This prevents the node from being able to serve older blocks */ + * This prevents the node from being able to serve older blocks - No longer used */ private boolean topOnly = false; /** The amount of recent blocks we should keep when pruning */ private int pruneBlockLimit = 6000; @@ -205,13 +204,13 @@ public class Settings { /** Minimum number of peers to allow block minting / synchronization. */ private int minBlockchainPeers = 3; /** Target number of outbound connections to peers we should make. */ - private int minOutboundPeers = 16; + private int minOutboundPeers = 32; /** Maximum number of peer connections we allow. */ - private int maxPeers = 40; + private int maxPeers = 60; /** Number of slots to reserve for short-lived QDN data transfers */ - private int maxDataPeers = 4; + private int maxDataPeers = 5; /** Maximum number of threads for network engine. */ - private int maxNetworkThreadPoolSize = 120; + private int maxNetworkThreadPoolSize = 620; /** Maximum number of threads for network proof-of-work compute, used during handshaking. */ private int networkPoWComputePoolSize = 2; /** Maximum number of retry attempts if a peer fails to respond with the requested data */ @@ -269,7 +268,7 @@ public class Settings { /** Repository storage path. */ private String repositoryPath = "db"; /** Repository connection pool size. Needs to be a bit bigger than maxNetworkThreadPoolSize */ - private int repositoryConnectionPoolSize = 240; + private int repositoryConnectionPoolSize = 1920; private List fixedNetwork; // Export/import @@ -370,7 +369,7 @@ public class Settings { /** Whether to allow public (decryptable) data to be stored */ private boolean publicDataEnabled = true; /** Whether to allow private (non-decryptable) data to be stored */ - private boolean privateDataEnabled = false; + private boolean privateDataEnabled = true; /** Maximum total size of hosted data, in bytes. Unlimited if null */ private Long maxStorageCapacity = null; From 8062cace30debb338ba66e9f8c4ea4a455b25223 Mon Sep 17 00:00:00 2001 From: crowetic Date: Wed, 3 Jan 2024 17:23:23 -0800 Subject: [PATCH 21/47] Improve default JVM memory arguments for mac/linux. --- start.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/start.sh b/start.sh index a7a1419f..cc80dceb 100755 --- a/start.sh +++ b/start.sh @@ -34,7 +34,7 @@ fi # Comment out for bigger systems, e.g. non-routers # or when API documentation is enabled # Uncomment (remove '#' sign) line below if your system has less than 12GB of RAM for optimal RAM defaults -# JVM_MEMORY_ARGS="-Xss1256k -Xmx3128m" +JVM_MEMORY_ARGS="-Xss256m -XX:+UseSerialGC" # Although java.net.preferIPv4Stack is supposed to be false # by default in Java 11, on some platforms (e.g. FreeBSD 12), From 687667c8fe53ef0674d7d6bca97e1023b7adbd4c Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Thu, 4 Jan 2024 14:00:33 +0100 Subject: [PATCH 22/47] Update Settings.java --- src/main/java/org/qortal/settings/Settings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java index 757722f8..14ac5d82 100644 --- a/src/main/java/org/qortal/settings/Settings.java +++ b/src/main/java/org/qortal/settings/Settings.java @@ -68,7 +68,7 @@ public class Settings { "localhost", "127.0.0.1" }; private String[] uiRemoteServers = new String[] { - "none.exist.anymore" + // None exist anymore }; // API-related From 8caf5bf8be16f6c90ccf0e137202441c1e3fa75d Mon Sep 17 00:00:00 2001 From: QuickMythril Date: Thu, 4 Jan 2024 13:08:37 -0500 Subject: [PATCH 23/47] Remove code for unused "Open UI" function --- src/main/java/org/qortal/gui/SysTray.java | 51 ------------------- .../java/org/qortal/settings/Settings.java | 21 -------- src/main/resources/i18n/SysTray_de.properties | 2 - src/main/resources/i18n/SysTray_en.properties | 2 - src/main/resources/i18n/SysTray_es.properties | 2 - src/main/resources/i18n/SysTray_fi.properties | 2 - src/main/resources/i18n/SysTray_fr.properties | 2 - src/main/resources/i18n/SysTray_he.properties | 2 - src/main/resources/i18n/SysTray_hu.properties | 2 - src/main/resources/i18n/SysTray_it.properties | 2 - src/main/resources/i18n/SysTray_jp.properties | 2 - src/main/resources/i18n/SysTray_ko.properties | 2 - src/main/resources/i18n/SysTray_nl.properties | 2 - src/main/resources/i18n/SysTray_pl.properties | 2 - src/main/resources/i18n/SysTray_ro.properties | 4 +- src/main/resources/i18n/SysTray_ru.properties | 2 - src/main/resources/i18n/SysTray_sv.properties | 2 - .../resources/i18n/SysTray_zh_CN.properties | 2 - .../resources/i18n/SysTray_zh_TW.properties | 2 - .../qortal/test/apps/CheckTranslations.java | 2 +- 20 files changed, 2 insertions(+), 108 deletions(-) diff --git a/src/main/java/org/qortal/gui/SysTray.java b/src/main/java/org/qortal/gui/SysTray.java index abd433f3..74a68618 100644 --- a/src/main/java/org/qortal/gui/SysTray.java +++ b/src/main/java/org/qortal/gui/SysTray.java @@ -5,7 +5,6 @@ import org.apache.logging.log4j.Logger; import org.qortal.controller.Controller; import org.qortal.globalization.Translator; import org.qortal.settings.Settings; -import org.qortal.utils.RandomizeList; import org.qortal.utils.URLViewer; import javax.swing.*; @@ -140,14 +139,6 @@ public class SysTray { } }); - /* JMenuItem openUi = new JMenuItem(Translator.INSTANCE.translate("SysTray", "OPEN_UI")); - openUi.addActionListener(actionEvent -> { - destroyHiddenDialog(); - - new OpenUiWorker().execute(); - }); - menu.add(openUi); */ - JMenuItem openTimeCheck = new JMenuItem(Translator.INSTANCE.translate("SysTray", "CHECK_TIME_ACCURACY")); openTimeCheck.addActionListener(actionEvent -> { destroyHiddenDialog(); @@ -190,48 +181,6 @@ public class SysTray { return menu; } - static class OpenUiWorker extends SwingWorker { - @Override - protected Void doInBackground() { - List uiServers = new ArrayList<>(); - - String[] remoteUiServers = Settings.getInstance().getRemoteUiServers(); - uiServers.addAll(Arrays.asList(remoteUiServers)); - // Randomize remote servers - uiServers = RandomizeList.randomize(uiServers); - - // Prepend local servers - String[] localUiServers = Settings.getInstance().getLocalUiServers(); - uiServers.addAll(0, Arrays.asList(localUiServers)); - - // Check each server in turn before opening browser tab - int uiPort = Settings.getInstance().getUiServerPort(); - for (String uiServer : uiServers) { - InetSocketAddress socketAddress = new InetSocketAddress(uiServer, uiPort); - - // If we couldn't resolve try next - if (socketAddress.isUnresolved()) - continue; - - try (SocketChannel socketChannel = SocketChannel.open()) { - socketChannel.socket().connect(socketAddress, 100); - - // If we reach here, then socket connected to UI server! - URLViewer.openWebpage(new URL(String.format("http://%s:%d", uiServer, uiPort))); - - return null; - } catch (IOException e) { - // try next server - } catch (Exception e) { - LOGGER.error("Unable to open UI website in browser"); - return null; - } - } - - return null; - } - } - static class SynchronizeClockWorker extends SwingWorker { @Override protected Void doInBackground() { diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java index 14ac5d82..24d4512d 100644 --- a/src/main/java/org/qortal/settings/Settings.java +++ b/src/main/java/org/qortal/settings/Settings.java @@ -62,15 +62,6 @@ public class Settings { private String bindAddress = "::"; // Use IPv6 wildcard to listen on all local addresses private String bindAddressFallback = "0.0.0.0"; // Some systems are unable to bind using IPv6 - // UI servers - private int uiPort = 12388; - private String[] uiLocalServers = new String[] { - "localhost", "127.0.0.1" - }; - private String[] uiRemoteServers = new String[] { - // None exist anymore - }; - // API-related private boolean apiEnabled = true; private Integer apiPort; @@ -619,18 +610,6 @@ public class Settings { return this.localeLang; } - public int getUiServerPort() { - return this.uiPort; - } - - public String[] getLocalUiServers() { - return this.uiLocalServers; - } - - public String[] getRemoteUiServers() { - return this.uiRemoteServers; - } - public boolean isApiEnabled() { return this.apiEnabled; } diff --git a/src/main/resources/i18n/SysTray_de.properties b/src/main/resources/i18n/SysTray_de.properties index 4f09a3a2..c6815879 100644 --- a/src/main/resources/i18n/SysTray_de.properties +++ b/src/main/resources/i18n/SysTray_de.properties @@ -35,8 +35,6 @@ MINTING_DISABLED = Münzprägung inaktiv MINTING_ENABLED = \u2714 Münzprägung aktiv -OPEN_UI = Öffne Benutzeroberfläche - PERFORMING_DB_CHECKPOINT = Speichere unerfasste Datenbankänderungen... PERFORMING_DB_MAINTENANCE = Planmäßige Wartung wird durchgeführt... diff --git a/src/main/resources/i18n/SysTray_en.properties b/src/main/resources/i18n/SysTray_en.properties index afc8210c..302cc8d3 100644 --- a/src/main/resources/i18n/SysTray_en.properties +++ b/src/main/resources/i18n/SysTray_en.properties @@ -35,8 +35,6 @@ MINTING_DISABLED = NOT minting MINTING_ENABLED = \u2714 Minting -OPEN_UI = Open UI - PERFORMING_DB_CHECKPOINT = Saving uncommitted database changes... PERFORMING_DB_MAINTENANCE = Performing scheduled maintenance... diff --git a/src/main/resources/i18n/SysTray_es.properties b/src/main/resources/i18n/SysTray_es.properties index cc0ba7b2..8f2eec7d 100644 --- a/src/main/resources/i18n/SysTray_es.properties +++ b/src/main/resources/i18n/SysTray_es.properties @@ -33,8 +33,6 @@ MINTING_DISABLED = Acuñación NO habilitada MINTING_ENABLED = \u2714 Acuñación habilitada -OPEN_UI = IU abierta - PERFORMING_DB_CHECKPOINT = Guardando cambios de base de datos no confirmados... PERFORMING_DB_MAINTENANCE = Realizando mantenimiento programado... diff --git a/src/main/resources/i18n/SysTray_fi.properties b/src/main/resources/i18n/SysTray_fi.properties index 351bc921..8c810880 100644 --- a/src/main/resources/i18n/SysTray_fi.properties +++ b/src/main/resources/i18n/SysTray_fi.properties @@ -35,8 +35,6 @@ MINTING_DISABLED = EI lyö rahaa MINTING_ENABLED = \u2714 Lyö rahaa -OPEN_UI = Avaa UI - PERFORMING_DB_CHECKPOINT = Tallentaa kommittoidut tietokantamuutokset... PERFORMING_DB_MAINTENANCE = Suoritetaan määräaikaishuoltoa... diff --git a/src/main/resources/i18n/SysTray_fr.properties b/src/main/resources/i18n/SysTray_fr.properties index 39ac44e3..2ab71c72 100644 --- a/src/main/resources/i18n/SysTray_fr.properties +++ b/src/main/resources/i18n/SysTray_fr.properties @@ -35,8 +35,6 @@ MINTING_DISABLED = NE mint PAS MINTING_ENABLED = \u2714 Minting -OPEN_UI = Ouvrir l'interface - PERFORMING_DB_CHECKPOINT = Enregistrement des modifications de base de données non validées... PERFORMING_DB_MAINTENANCE = Entrain d'effectuer la maintenance programmée... diff --git a/src/main/resources/i18n/SysTray_he.properties b/src/main/resources/i18n/SysTray_he.properties index 09a9f6dd..6de7b7cc 100644 --- a/src/main/resources/i18n/SysTray_he.properties +++ b/src/main/resources/i18n/SysTray_he.properties @@ -35,8 +35,6 @@ MINTING_DISABLED = כרייה מבוטלת MINTING_ENABLED = \u2714 הטבעה -OPEN_UI = ממשק משתמש פתוח - PERFORMING_DB_CHECKPOINT = שומר שינויים לא מחויבים במסד הנתונים... PERFORMING_DB_MAINTENANCE = מבצע תחזוקה מתוזמנת... diff --git a/src/main/resources/i18n/SysTray_hu.properties b/src/main/resources/i18n/SysTray_hu.properties index 3b1da2cc..da3a7209 100644 --- a/src/main/resources/i18n/SysTray_hu.properties +++ b/src/main/resources/i18n/SysTray_hu.properties @@ -35,8 +35,6 @@ MINTING_DISABLED = QORT-érmeverés jelenleg nincs folyamatban MINTING_ENABLED = \u2714 QORT-érmeverés folyamatban -OPEN_UI = Felhasználói felület megnyitása - PERFORMING_DB_CHECKPOINT = Mentetlen adatbázis-módosítások mentése... PERFORMING_DB_MAINTENANCE = Ütemezett karbantartás... diff --git a/src/main/resources/i18n/SysTray_it.properties b/src/main/resources/i18n/SysTray_it.properties index 55cd4c83..c35feebc 100644 --- a/src/main/resources/i18n/SysTray_it.properties +++ b/src/main/resources/i18n/SysTray_it.properties @@ -35,8 +35,6 @@ MINTING_DISABLED = Conio disabilitato MINTING_ENABLED = \u2714 Conio abilitato -OPEN_UI = Apri UI - PERFORMING_DB_CHECKPOINT = Salvataggio delle modifiche del database non salvate... PERFORMING_DB_MAINTENANCE = Manutenzione programmata dell'efficienza... diff --git a/src/main/resources/i18n/SysTray_jp.properties b/src/main/resources/i18n/SysTray_jp.properties index 036bf8f2..d3cf13ad 100644 --- a/src/main/resources/i18n/SysTray_jp.properties +++ b/src/main/resources/i18n/SysTray_jp.properties @@ -35,8 +35,6 @@ MINTING_DISABLED = ミント一時中止中 MINTING_ENABLED = \u2714 ミント -OPEN_UI = UIを開く - PERFORMING_DB_CHECKPOINT = コミットされていないデータベースの変更を保存中... PERFORMING_DB_MAINTENANCE = 定期メンテナンスを実行中... diff --git a/src/main/resources/i18n/SysTray_ko.properties b/src/main/resources/i18n/SysTray_ko.properties index 0db49c53..5e165da3 100644 --- a/src/main/resources/i18n/SysTray_ko.properties +++ b/src/main/resources/i18n/SysTray_ko.properties @@ -35,8 +35,6 @@ MINTING_DISABLED = 민팅중이 아님 MINTING_ENABLED = \u2714 민팅 -OPEN_UI = UI 열기 - PERFORMING_DB_CHECKPOINT = 커밋되지 않은 데이터베이스 변경 내용을 저장하는 중... PERFORMING_DB_MAINTENANCE = 예약된 유지 관리 수행 중... diff --git a/src/main/resources/i18n/SysTray_nl.properties b/src/main/resources/i18n/SysTray_nl.properties index 776720d5..f42d3e96 100644 --- a/src/main/resources/i18n/SysTray_nl.properties +++ b/src/main/resources/i18n/SysTray_nl.properties @@ -35,8 +35,6 @@ MINTING_DISABLED = Minten is uitgeschakeld MINTING_ENABLED = \u2714 Minten is actief -OPEN_UI = Open UI - PERFORMING_DB_CHECKPOINT = De database wordt bijgewerkt... PERFORMING_DB_MAINTENANCE = Bezig met gepland onderhoud... diff --git a/src/main/resources/i18n/SysTray_pl.properties b/src/main/resources/i18n/SysTray_pl.properties index 8ee40751..12e49bda 100644 --- a/src/main/resources/i18n/SysTray_pl.properties +++ b/src/main/resources/i18n/SysTray_pl.properties @@ -33,8 +33,6 @@ MINTING_DISABLED = Mennica zamknięta MINTING_ENABLED = \u2714 Mennica aktywna -OPEN_UI = Otwórz interfejs użytkownika - PERFORMING_DB_CHECKPOINT = Zapisywanie niezaksięgowanych zmian w bazie danych... PERFORMING_DB_MAINTENANCE = Performing scheduled maintenance... diff --git a/src/main/resources/i18n/SysTray_ro.properties b/src/main/resources/i18n/SysTray_ro.properties index f3cf76c9..7e87af8d 100644 --- a/src/main/resources/i18n/SysTray_ro.properties +++ b/src/main/resources/i18n/SysTray_ro.properties @@ -35,11 +35,9 @@ MINTING_DISABLED = nu produce moneda MINTING_ENABLED = \u2714 Minting -OPEN_UI = Deschidere interfata utilizator IU - PERFORMING_DB_CHECKPOINT = Salvarea modificarilor nerealizate ale bazei de date... -PERFORMING_DB_MAINTENANCE = Efectuarea intretinerii programate +PERFORMING_DB_MAINTENANCE = Efectuarea intretinerii programate� SYNCHRONIZE_CLOCK = Sincronizare ceas diff --git a/src/main/resources/i18n/SysTray_ru.properties b/src/main/resources/i18n/SysTray_ru.properties index ddf0c0a0..8c2b50eb 100644 --- a/src/main/resources/i18n/SysTray_ru.properties +++ b/src/main/resources/i18n/SysTray_ru.properties @@ -35,8 +35,6 @@ MINTING_DISABLED = Чеканка отключена MINTING_ENABLED = \u2714 Чеканка активна -OPEN_UI = Открыть пользовательский интерфейс - PERFORMING_DB_CHECKPOINT = Сохранение незафиксированных изменений базы данных... PERFORMING_DB_MAINTENANCE = Выполнение планового технического обслуживания... diff --git a/src/main/resources/i18n/SysTray_sv.properties b/src/main/resources/i18n/SysTray_sv.properties index a38cca3a..8fcd3193 100644 --- a/src/main/resources/i18n/SysTray_sv.properties +++ b/src/main/resources/i18n/SysTray_sv.properties @@ -33,8 +33,6 @@ MINTING_DISABLED = Präglar INTE MINTING_ENABLED = \u2714 Präglar -OPEN_UI = Öppna UI - PERFORMING_DB_CHECKPOINT = Sparar oengagerade databasändringar... PERFORMING_DB_MAINTENANCE = Utför schemalagt underhåll... diff --git a/src/main/resources/i18n/SysTray_zh_CN.properties b/src/main/resources/i18n/SysTray_zh_CN.properties index 7e84f3f2..4a4e7ce6 100644 --- a/src/main/resources/i18n/SysTray_zh_CN.properties +++ b/src/main/resources/i18n/SysTray_zh_CN.properties @@ -35,8 +35,6 @@ MINTING_DISABLED = 没有铸币 MINTING_ENABLED = \u2714 铸币 -OPEN_UI = 开启Qortal界面 - PERFORMING_DB_CHECKPOINT = 正在保存未提交的数据库修订... PERFORMING_DB_MAINTENANCE = 正在执行定期数据库维护... diff --git a/src/main/resources/i18n/SysTray_zh_TW.properties b/src/main/resources/i18n/SysTray_zh_TW.properties index d774bc11..5dc07fe2 100644 --- a/src/main/resources/i18n/SysTray_zh_TW.properties +++ b/src/main/resources/i18n/SysTray_zh_TW.properties @@ -35,8 +35,6 @@ MINTING_DISABLED = 沒有鑄幣 MINTING_ENABLED = \u2714 鑄幣 -OPEN_UI = 開啓Qortal界面 - PERFORMING_DB_CHECKPOINT = 正在保存未提交的數據庫修訂... PERFORMING_DB_MAINTENANCE = 正在執行數據庫定期維護... diff --git a/src/test/java/org/qortal/test/apps/CheckTranslations.java b/src/test/java/org/qortal/test/apps/CheckTranslations.java index bf239611..68322bcf 100644 --- a/src/test/java/org/qortal/test/apps/CheckTranslations.java +++ b/src/test/java/org/qortal/test/apps/CheckTranslations.java @@ -15,7 +15,7 @@ public class CheckTranslations { private static final String[] SUPPORTED_LANGS = new String[] { "en", "de", "zh", "ru" }; private static final Set SYSTRAY_KEYS = Set.of("AUTO_UPDATE", "APPLYING_UPDATE_AND_RESTARTING", "BLOCK_HEIGHT", "BUILD_VERSION", "CHECK_TIME_ACCURACY", "CONNECTING", "CONNECTION", "CONNECTIONS", "CREATING_BACKUP_OF_DB_FILES", - "DB_BACKUP", "DB_CHECKPOINT", "EXIT", "LITE_NODE", "MINTING_DISABLED", "MINTING_ENABLED", "OPEN_UI", "PERFORMING_DB_CHECKPOINT", + "DB_BACKUP", "DB_CHECKPOINT", "EXIT", "LITE_NODE", "MINTING_DISABLED", "MINTING_ENABLED", "PERFORMING_DB_CHECKPOINT", "SYNCHRONIZE_CLOCK", "SYNCHRONIZING_BLOCKCHAIN", "SYNCHRONIZING_CLOCK"); private static String failurePrefix; From 1400e7ae804cc591f4babfa6ba38f98c6a3eb514 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 6 Jan 2024 12:25:24 +0100 Subject: [PATCH 24/47] Bump version to 4.4.1 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 2475c9b4..4f2304bd 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.qortal qortal - 4.4.0 + 4.4.1 jar true From d7f44376bec5d28e9e7736a8c20dcf41af5aef5b Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sun, 7 Jan 2024 14:32:12 +0100 Subject: [PATCH 25/47] Default minPeerVersion set to 4.4.1 --- src/main/java/org/qortal/settings/Settings.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java index 24d4512d..533e1639 100644 --- a/src/main/java/org/qortal/settings/Settings.java +++ b/src/main/java/org/qortal/settings/Settings.java @@ -211,7 +211,7 @@ public class Settings { public long recoveryModeTimeout = 9999999999999L; /** Minimum peer version number required in order to sync with them */ - private String minPeerVersion = "4.4.0"; + private String minPeerVersion = "4.4.1"; /** Whether to allow connections with peers below minPeerVersion * If true, we won't sync with them but they can still sync with us, and will show in the peers list * If false, sync will be blocked both ways, and they will not appear in the peers list */ From 83e324c4ad8bc77b7103d941fb994f85e4908fb6 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sun, 7 Jan 2024 14:34:20 +0100 Subject: [PATCH 26/47] Fix file ending --- AutoUpdates.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/AutoUpdates.md b/AutoUpdates.md index 7f248246..9e3c618c 100644 --- a/AutoUpdates.md +++ b/AutoUpdates.md @@ -8,7 +8,7 @@ * Build auto-update download: `tools/build-auto-update.sh` - uploads auto-update file into new git branch * Restart local node * Publish auto-update transaction using *private key* for **non-admin** member of "dev" group: - `tools/publish-auto-update.sh non-admin-dev-member-private-key-in-base58` + `tools/publish-auto-update.pl non-admin-dev-member-private-key-in-base58` * Wait for auto-update `ARBITRARY` transaction to be confirmed into a block * Have "dev" group admins 'approve' auto-update using `tools/approve-auto-update.sh` This tool will prompt for *private key* of **admin** of "dev" group From 41645ac7b4d567d5840c8b7a8ae5af30c071a029 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sun, 14 Jan 2024 18:40:40 +0100 Subject: [PATCH 27/47] Exclude reward share transactions from the online accounts blocks --- src/main/java/org/qortal/block/Block.java | 5 +- .../java/org/qortal/block/BlockChain.java | 7 +- .../org/qortal/controller/BlockMinter.java | 7 ++ .../transaction/RewardShareTransaction.java | 12 ++ .../org/qortal/transaction/Transaction.java | 9 ++ src/main/resources/blockchain.json | 3 +- .../qortal/test/minting/BatchRewardTests.java | 117 ++++++++++++++++++ .../test-chain-v2-block-timestamps.json | 3 +- .../test-chain-v2-disable-reference.json | 3 +- .../test-chain-v2-founder-rewards.json | 3 +- .../test-chain-v2-leftover-reward.json | 3 +- src/test/resources/test-chain-v2-minting.json | 3 +- .../test-chain-v2-qora-holder-extremes.json | 3 +- .../test-chain-v2-qora-holder-reduction.json | 3 +- .../resources/test-chain-v2-qora-holder.json | 3 +- .../test-chain-v2-reward-levels.json | 3 +- .../test-chain-v2-reward-scaling.json | 8 +- .../test-chain-v2-reward-shares.json | 3 +- .../test-chain-v2-self-sponsorship-algo.json | 3 +- src/test/resources/test-chain-v2.json | 3 +- 20 files changed, 187 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/qortal/block/Block.java b/src/main/java/org/qortal/block/Block.java index 41faf51b..af99e34e 100644 --- a/src/main/java/org/qortal/block/Block.java +++ b/src/main/java/org/qortal/block/Block.java @@ -1309,6 +1309,9 @@ public class Block { if (!transaction.isConfirmable()) { return ValidationResult.TRANSACTION_NOT_CONFIRMABLE; } + if (!transaction.isConfirmableAtHeight(this.blockData.getHeight())) { + return ValidationResult.TRANSACTION_NOT_CONFIRMABLE; + } } // Check transaction isn't already included in a block @@ -2088,7 +2091,7 @@ public class Block { return Block.isOnlineAccountsBlock(this.getBlockData().getHeight()); } - private static boolean isOnlineAccountsBlock(int height) { + public static boolean isOnlineAccountsBlock(int height) { // After feature trigger, only certain blocks contain online accounts if (height >= BlockChain.getInstance().getBlockRewardBatchStartHeight()) { final int leadingBlockCount = BlockChain.getInstance().getBlockRewardBatchAccountsBlockCount(); diff --git a/src/main/java/org/qortal/block/BlockChain.java b/src/main/java/org/qortal/block/BlockChain.java index aa2ab9bb..8013e7a5 100644 --- a/src/main/java/org/qortal/block/BlockChain.java +++ b/src/main/java/org/qortal/block/BlockChain.java @@ -75,7 +75,8 @@ public class BlockChain { selfSponsorshipAlgoV1Height, feeValidationFixTimestamp, chatReferenceTimestamp, - arbitraryOptionalFeeTimestamp; + arbitraryOptionalFeeTimestamp, + unconfirmableRewardSharesHeight; } // Custom transaction fees @@ -556,6 +557,10 @@ public class BlockChain { return this.featureTriggers.get(FeatureTrigger.arbitraryOptionalFeeTimestamp.name()).longValue(); } + public int getUnconfirmableRewardSharesHeight() { + return this.featureTriggers.get(FeatureTrigger.unconfirmableRewardSharesHeight.name()).intValue(); + } + // More complex getters for aspects that change by height or timestamp diff --git a/src/main/java/org/qortal/controller/BlockMinter.java b/src/main/java/org/qortal/controller/BlockMinter.java index 15bcb1d7..49831cba 100644 --- a/src/main/java/org/qortal/controller/BlockMinter.java +++ b/src/main/java/org/qortal/controller/BlockMinter.java @@ -474,6 +474,7 @@ public class BlockMinter extends Thread { Iterator unconfirmedTransactionsIterator = unconfirmedTransactions.iterator(); final long newBlockTimestamp = newBlock.getBlockData().getTimestamp(); + final int newBlockHeight = newBlock.getBlockData().getHeight(); while (unconfirmedTransactionsIterator.hasNext()) { TransactionData transactionData = unconfirmedTransactionsIterator.next(); @@ -481,6 +482,12 @@ public class BlockMinter extends Thread { // Ignore transactions that have expired before this block - they will be cleaned up later if (transactionData.getTimestamp() > newBlockTimestamp || Transaction.getDeadline(transactionData) <= newBlockTimestamp) unconfirmedTransactionsIterator.remove(); + + // Ignore transactions that are unconfirmable at this block height + Transaction transaction = Transaction.fromData(repository, transactionData); + if (!transaction.isConfirmableAtHeight(newBlockHeight)) { + unconfirmedTransactionsIterator.remove(); + } } // Sign to create block's signature, needed by Block.isValid() diff --git a/src/main/java/org/qortal/transaction/RewardShareTransaction.java b/src/main/java/org/qortal/transaction/RewardShareTransaction.java index ab66dec6..1b608a0c 100644 --- a/src/main/java/org/qortal/transaction/RewardShareTransaction.java +++ b/src/main/java/org/qortal/transaction/RewardShareTransaction.java @@ -3,6 +3,7 @@ package org.qortal.transaction; import org.qortal.account.Account; import org.qortal.account.PublicKeyAccount; import org.qortal.asset.Asset; +import org.qortal.block.Block; import org.qortal.block.BlockChain; import org.qortal.crypto.Crypto; import org.qortal.data.account.RewardShareData; @@ -180,6 +181,17 @@ public class RewardShareTransaction extends Transaction { // Nothing to do } + @Override + public boolean isConfirmableAtHeight(int height) { + if (height >= BlockChain.getInstance().getUnconfirmableRewardSharesHeight()) { + // Not confirmable in online accounts or distribution blocks + if (Block.isOnlineAccountsBlock(height) || Block.isBatchRewardDistributionBlock(height)) { + return false; + } + } + return true; + } + @Override public void process() throws DataException { PublicKeyAccount mintingAccount = getMintingAccount(); diff --git a/src/main/java/org/qortal/transaction/Transaction.java b/src/main/java/org/qortal/transaction/Transaction.java index 61b78ade..0b4f6e90 100644 --- a/src/main/java/org/qortal/transaction/Transaction.java +++ b/src/main/java/org/qortal/transaction/Transaction.java @@ -904,6 +904,15 @@ public abstract class Transaction { return true; } + /** + * Returns whether transaction is confirmable in a block at a given height. + * @return + */ + public boolean isConfirmableAtHeight(int height) { + /* To be optionally overridden */ + return true; + } + /** * Returns whether transaction can be added to the blockchain. *

diff --git a/src/main/resources/blockchain.json b/src/main/resources/blockchain.json index 2fc69347..23e43285 100644 --- a/src/main/resources/blockchain.json +++ b/src/main/resources/blockchain.json @@ -95,7 +95,8 @@ "selfSponsorshipAlgoV1Height": 1092400, "feeValidationFixTimestamp": 1671918000000, "chatReferenceTimestamp": 1674316800000, - "arbitraryOptionalFeeTimestamp": 1680278400000 + "arbitraryOptionalFeeTimestamp": 1680278400000, + "unconfirmableRewardSharesHeight": 99999500 }, "checkpoints": [ { "height": 1136300, "signature": "3BbwawEF2uN8Ni5ofpJXkukoU8ctAPxYoFB7whq9pKfBnjfZcpfEJT4R95NvBDoTP8WDyWvsUvbfHbcr9qSZuYpSKZjUQTvdFf6eqznHGEwhZApWfvXu6zjGCxYCp65F4jsVYYJjkzbjmkCg5WAwN5voudngA23kMK6PpTNygapCzXt" } diff --git a/src/test/java/org/qortal/test/minting/BatchRewardTests.java b/src/test/java/org/qortal/test/minting/BatchRewardTests.java index bd89384b..ad8d8d66 100644 --- a/src/test/java/org/qortal/test/minting/BatchRewardTests.java +++ b/src/test/java/org/qortal/test/minting/BatchRewardTests.java @@ -20,6 +20,7 @@ import org.qortal.settings.Settings; import org.qortal.test.common.*; import org.qortal.test.common.transaction.TestTransaction; import org.qortal.transaction.DeployAtTransaction; +import org.qortal.transaction.Transaction; import org.qortal.transform.TransformationException; import org.qortal.transform.block.BlockTransformer; import org.qortal.utils.NTP; @@ -679,4 +680,120 @@ public class BatchRewardTests extends Common { } } + @Test + public void testUnconfirmableRewardShares() throws DataException, IllegalAccessException { + // test-settings-v2-reward-scaling.json has unconfirmable reward share feature trigger enabled from block 500 + Common.useSettings("test-settings-v2-reward-scaling.json"); + + // Set reward batching to every 1000 blocks, starting at block 0, looking back the last 25 blocks for online accounts + FieldUtils.writeField(BlockChain.getInstance(), "blockRewardBatchStartHeight", 0, true); + FieldUtils.writeField(BlockChain.getInstance(), "blockRewardBatchSize", 1000, true); + FieldUtils.writeField(BlockChain.getInstance(), "blockRewardBatchAccountsBlockCount", 25, true); + + try (final Repository repository = RepositoryManager.getRepository()) { + + PrivateKeyAccount bob = Common.getTestAccount(repository, "bob"); + PrivateKeyAccount chloe = Common.getTestAccount(repository, "chloe"); + PrivateKeyAccount dilbert = Common.getTestAccount(repository, "dilbert"); + + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + PrivateKeyAccount bobSelfShare = Common.getTestAccount(repository, "bob-reward-share"); + PrivateKeyAccount chloeSelfShare = Common.getTestAccount(repository, "chloe-reward-share"); + + // Create self shares for bob, chloe and dilbert + AccountUtils.generateSelfShares(repository, List.of(bob, chloe, dilbert)); + + // Mint blocks 1-974 - these should have no online accounts or rewards + for (int i=1; i<974; i++) { + Block block = BlockUtils.mintBlockWithReorgs(repository, 2); + assertTrue(block.isBatchRewardDistributionActive()); + assertFalse(block.isRewardDistributionBlock()); + assertFalse(block.isBatchRewardDistributionBlock()); + assertFalse(block.isOnlineAccountsBlock()); + assertEquals(0, block.getBlockData().getOnlineAccountsCount()); + } + + // Mint blocks 975-998 - these should have online accounts but no rewards + for (int i=975; i<=998; i++) { + List onlineAccounts = Arrays.asList(aliceSelfShare, bobSelfShare, chloeSelfShare); + Block block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertTrue(block.isBatchRewardDistributionActive()); + assertFalse(block.isRewardDistributionBlock()); + assertFalse(block.isBatchRewardDistributionBlock()); + assertTrue(block.isOnlineAccountsBlock()); + assertEquals(3, block.getBlockData().getOnlineAccountsCount()); + } + + // Cancel Chloe's reward share + TransactionData transactionData = AccountUtils.createRewardShare(repository, chloe, chloe, -100, 10000000L); + TransactionUtils.signAndImportValid(repository, transactionData, chloe); + + // Mint block 999 - Chloe's account should still be included as the reward share cancellation is delayed + List onlineAccounts = Arrays.asList(aliceSelfShare, bobSelfShare, chloeSelfShare); + Block block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertTrue(block.isBatchRewardDistributionActive()); + assertFalse(block.isRewardDistributionBlock()); + assertFalse(block.isBatchRewardDistributionBlock()); + assertTrue(block.isOnlineAccountsBlock()); + assertEquals(3, block.getBlockData().getOnlineAccountsCount()); + + // Mint block 1000 + Block block1000 = BlockUtils.mintBlockWithReorgs(repository, 12); + + // Online accounts should be included from block 999 + assertEquals(3, block1000.getBlockData().getOnlineAccountsCount()); + + assertEquals(repository.getBlockRepository().getBlockchainHeight(), 1000); + + // It's a distribution block (which is technically also an online accounts block) + assertTrue(block1000.isBatchRewardDistributionBlock()); + assertTrue(block1000.isRewardDistributionBlock()); + assertTrue(block1000.isBatchRewardDistributionActive()); + assertTrue(block1000.isOnlineAccountsBlock()); + } + } + + @Test + public void testUnconfirmableRewardShareBlocks() throws DataException, IllegalAccessException { + // test-settings-v2-reward-scaling.json has unconfirmable reward share feature trigger enabled from block 500 + Common.useSettings("test-settings-v2-reward-scaling.json"); + + // Set reward batching to every 1000 blocks, starting at block 0, looking back the last 25 blocks for online accounts + FieldUtils.writeField(BlockChain.getInstance(), "blockRewardBatchStartHeight", 0, true); + FieldUtils.writeField(BlockChain.getInstance(), "blockRewardBatchSize", 1000, true); + FieldUtils.writeField(BlockChain.getInstance(), "blockRewardBatchAccountsBlockCount", 25, true); + + try (final Repository repository = RepositoryManager.getRepository()) { + + PrivateKeyAccount bob = Common.getTestAccount(repository, "bob"); + PrivateKeyAccount chloe = Common.getTestAccount(repository, "chloe"); + PrivateKeyAccount dilbert = Common.getTestAccount(repository, "dilbert"); + + // Create self shares for bob, chloe and dilbert + AccountUtils.generateSelfShares(repository, List.of(bob, chloe, dilbert)); + + // Create transaction to cancel chloe's reward share + TransactionData rewardShareTransactionData = AccountUtils.createRewardShare(repository, chloe, chloe, -100, 10000000L); + Transaction rewardShareTransaction = Transaction.fromData(repository, rewardShareTransactionData); + + // Mint a block + BlockUtils.mintBlock(repository); + + // Check block heights up to 974 - transaction should be confirmable + for (int height=2; height<974; height++) { + assertEquals(true, rewardShareTransaction.isConfirmableAtHeight(height)); + } + + // Check block heights 975-1000 - transaction should not be confirmable + for (int height=975; height<1000; height++) { + assertEquals(false, rewardShareTransaction.isConfirmableAtHeight(height)); + } + + // Check block heights 1001-1974 - transaction should be confirmable again + for (int height=1001; height<1974; height++) { + assertEquals(true, rewardShareTransaction.isConfirmableAtHeight(height)); + } + } + } + } diff --git a/src/test/resources/test-chain-v2-block-timestamps.json b/src/test/resources/test-chain-v2-block-timestamps.json index 2d3a6484..e5460bec 100644 --- a/src/test/resources/test-chain-v2-block-timestamps.json +++ b/src/test/resources/test-chain-v2-block-timestamps.json @@ -83,7 +83,8 @@ "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, - "arbitraryOptionalFeeTimestamp": 0 + "arbitraryOptionalFeeTimestamp": 0, + "unconfirmableRewardSharesHeight": 99999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-disable-reference.json b/src/test/resources/test-chain-v2-disable-reference.json index 30691293..3d76620a 100644 --- a/src/test/resources/test-chain-v2-disable-reference.json +++ b/src/test/resources/test-chain-v2-disable-reference.json @@ -86,7 +86,8 @@ "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, - "arbitraryOptionalFeeTimestamp": 0 + "arbitraryOptionalFeeTimestamp": 0, + "unconfirmableRewardSharesHeight": 99999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-founder-rewards.json b/src/test/resources/test-chain-v2-founder-rewards.json index 9b273323..e778f792 100644 --- a/src/test/resources/test-chain-v2-founder-rewards.json +++ b/src/test/resources/test-chain-v2-founder-rewards.json @@ -87,7 +87,8 @@ "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, - "arbitraryOptionalFeeTimestamp": 0 + "arbitraryOptionalFeeTimestamp": 0, + "unconfirmableRewardSharesHeight": 99999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-leftover-reward.json b/src/test/resources/test-chain-v2-leftover-reward.json index e7339947..ec64f5a9 100644 --- a/src/test/resources/test-chain-v2-leftover-reward.json +++ b/src/test/resources/test-chain-v2-leftover-reward.json @@ -87,7 +87,8 @@ "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, - "arbitraryOptionalFeeTimestamp": 0 + "arbitraryOptionalFeeTimestamp": 0, + "unconfirmableRewardSharesHeight": 99999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-minting.json b/src/test/resources/test-chain-v2-minting.json index fe03c37d..72051c29 100644 --- a/src/test/resources/test-chain-v2-minting.json +++ b/src/test/resources/test-chain-v2-minting.json @@ -87,7 +87,8 @@ "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, - "arbitraryOptionalFeeTimestamp": 9999999999999 + "arbitraryOptionalFeeTimestamp": 9999999999999, + "unconfirmableRewardSharesHeight": 99999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-qora-holder-extremes.json b/src/test/resources/test-chain-v2-qora-holder-extremes.json index 8acc0a35..4b8d4b80 100644 --- a/src/test/resources/test-chain-v2-qora-holder-extremes.json +++ b/src/test/resources/test-chain-v2-qora-holder-extremes.json @@ -87,7 +87,8 @@ "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, - "arbitraryOptionalFeeTimestamp": 0 + "arbitraryOptionalFeeTimestamp": 0, + "unconfirmableRewardSharesHeight": 99999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-qora-holder-reduction.json b/src/test/resources/test-chain-v2-qora-holder-reduction.json index 642c6415..5484745b 100644 --- a/src/test/resources/test-chain-v2-qora-holder-reduction.json +++ b/src/test/resources/test-chain-v2-qora-holder-reduction.json @@ -88,7 +88,8 @@ "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, - "arbitraryOptionalFeeTimestamp": 0 + "arbitraryOptionalFeeTimestamp": 0, + "unconfirmableRewardSharesHeight": 99999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-qora-holder.json b/src/test/resources/test-chain-v2-qora-holder.json index aa1a23f3..50b4910a 100644 --- a/src/test/resources/test-chain-v2-qora-holder.json +++ b/src/test/resources/test-chain-v2-qora-holder.json @@ -87,7 +87,8 @@ "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, - "arbitraryOptionalFeeTimestamp": 0 + "arbitraryOptionalFeeTimestamp": 0, + "unconfirmableRewardSharesHeight": 99999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-reward-levels.json b/src/test/resources/test-chain-v2-reward-levels.json index 3073dfa9..99c98e2f 100644 --- a/src/test/resources/test-chain-v2-reward-levels.json +++ b/src/test/resources/test-chain-v2-reward-levels.json @@ -87,7 +87,8 @@ "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, - "arbitraryOptionalFeeTimestamp": 0 + "arbitraryOptionalFeeTimestamp": 0, + "unconfirmableRewardSharesHeight": 99999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-reward-scaling.json b/src/test/resources/test-chain-v2-reward-scaling.json index d602de18..1c59476a 100644 --- a/src/test/resources/test-chain-v2-reward-scaling.json +++ b/src/test/resources/test-chain-v2-reward-scaling.json @@ -87,7 +87,8 @@ "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, - "arbitraryOptionalFeeTimestamp": 0 + "arbitraryOptionalFeeTimestamp": 0, + "unconfirmableRewardSharesHeight": 500 }, "genesisInfo": { "version": 4, @@ -107,7 +108,10 @@ { "type": "ACCOUNT_FLAGS", "target": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "andMask": -1, "orMask": 1, "xorMask": 0 }, { "type": "REWARD_SHARE", "minterPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "recipient": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "rewardSharePublicKey": "7PpfnvLSG7y4HPh8hE7KoqAjLCkv7Ui6xw4mKAkbZtox", "sharePercent": 100 }, - { "type": "ACCOUNT_LEVEL", "target": "Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er", "level": 8 } + { "type": "ACCOUNT_LEVEL", "target": "Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er", "level": 8 }, + { "type": "ACCOUNT_LEVEL", "target": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QixPbJUwsaHsVEofJdozU9zgVqkK6aYhrK", "level": 1 }, + { "type": "ACCOUNT_LEVEL", "target": "QaUpHNhT3Ygx6avRiKobuLdusppR5biXjL", "level": 1 } ] } } diff --git a/src/test/resources/test-chain-v2-reward-shares.json b/src/test/resources/test-chain-v2-reward-shares.json index 1261be0d..fd63add0 100644 --- a/src/test/resources/test-chain-v2-reward-shares.json +++ b/src/test/resources/test-chain-v2-reward-shares.json @@ -87,7 +87,8 @@ "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, - "arbitraryOptionalFeeTimestamp": 0 + "arbitraryOptionalFeeTimestamp": 0, + "unconfirmableRewardSharesHeight": 99999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-self-sponsorship-algo.json b/src/test/resources/test-chain-v2-self-sponsorship-algo.json index a63a395f..04e81e21 100644 --- a/src/test/resources/test-chain-v2-self-sponsorship-algo.json +++ b/src/test/resources/test-chain-v2-self-sponsorship-algo.json @@ -87,7 +87,8 @@ "selfSponsorshipAlgoV1Height": 20, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, - "arbitraryOptionalFeeTimestamp": 0 + "arbitraryOptionalFeeTimestamp": 0, + "unconfirmableRewardSharesHeight": 99999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2.json b/src/test/resources/test-chain-v2.json index 2a7aa362..a57a0fd4 100644 --- a/src/test/resources/test-chain-v2.json +++ b/src/test/resources/test-chain-v2.json @@ -88,7 +88,8 @@ "selfSponsorshipAlgoV1Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, - "arbitraryOptionalFeeTimestamp": 0 + "arbitraryOptionalFeeTimestamp": 0, + "unconfirmableRewardSharesHeight": 99999999 }, "genesisInfo": { "version": 4, From 03ba36729b5f5f3a17a618a49dcb9170c59a08c6 Mon Sep 17 00:00:00 2001 From: QuickMythril Date: Wed, 17 Jan 2024 06:08:09 -0500 Subject: [PATCH 28/47] Update ElectrumX servers --- .../java/org/qortal/crosschain/Bitcoin.java | 85 +++++++++---------- .../java/org/qortal/crosschain/Digibyte.java | 7 +- .../java/org/qortal/crosschain/Dogecoin.java | 5 +- .../java/org/qortal/crosschain/Litecoin.java | 9 +- .../org/qortal/crosschain/PirateChain.java | 1 - .../java/org/qortal/crosschain/Ravencoin.java | 5 +- 6 files changed, 45 insertions(+), 67 deletions(-) diff --git a/src/main/java/org/qortal/crosschain/Bitcoin.java b/src/main/java/org/qortal/crosschain/Bitcoin.java index b2a016e7..22956758 100644 --- a/src/main/java/org/qortal/crosschain/Bitcoin.java +++ b/src/main/java/org/qortal/crosschain/Bitcoin.java @@ -46,74 +46,62 @@ public class Bitcoin extends Bitcoiny { return Arrays.asList( // Servers chosen on NO BASIS WHATSOEVER from various sources! // Status verified at https://1209k.com/bitcoin-eye/ele.php?chain=btc - new Server("104.248.139.211", Server.ConnectionType.SSL, 50002), + new Server("104.198.149.61", Server.ConnectionType.SSL, 50002), new Server("128.0.190.26", Server.ConnectionType.SSL, 50002), - new Server("142.93.6.38", Server.ConnectionType.SSL, 50002), new Server("157.245.172.236", Server.ConnectionType.SSL, 50002), - new Server("167.172.226.175", Server.ConnectionType.SSL, 50002), - new Server("167.172.42.31", Server.ConnectionType.SSL, 50002), - new Server("178.62.80.20", Server.ConnectionType.SSL, 50002), - new Server("185.64.116.15", Server.ConnectionType.SSL, 50002), - new Server("188.165.206.215", Server.ConnectionType.SSL, 50002), - new Server("188.165.211.112", Server.ConnectionType.SSL, 50002), - new Server("2azzarita.hopto.org", Server.ConnectionType.SSL, 50002), - new Server("2electrumx.hopto.me", Server.ConnectionType.SSL, 56022), - new Server("2ex.digitaleveryware.com", Server.ConnectionType.SSL, 50002), - new Server("65.39.140.37", Server.ConnectionType.SSL, 50002), - new Server("68.183.188.105", Server.ConnectionType.SSL, 50002), - new Server("71.73.14.254", Server.ConnectionType.SSL, 50002), - new Server("94.23.247.135", Server.ConnectionType.SSL, 50002), - new Server("assuredly.not.fyi", Server.ConnectionType.SSL, 50002), - new Server("ax101.blockeng.ch", Server.ConnectionType.SSL, 50002), - new Server("ax102.blockeng.ch", Server.ConnectionType.SSL, 50002), + new Server("260.whyza.net", Server.ConnectionType.SSL, 50002), + new Server("34.136.93.37", Server.ConnectionType.SSL, 50002), + new Server("34.67.22.216", Server.ConnectionType.SSL, 50002), + new Server("34.68.133.78", Server.ConnectionType.SSL, 50002), + new Server("alviss.coinjoined.com", Server.ConnectionType.SSL, 50002), new Server("b.1209k.com", Server.ConnectionType.SSL, 50002), new Server("b6.1209k.com", Server.ConnectionType.SSL, 50002), new Server("bitcoin.dermichi.com", Server.ConnectionType.SSL, 50002), new Server("bitcoin.lu.ke", Server.ConnectionType.SSL, 50002), new Server("bitcoin.lukechilds.co", Server.ConnectionType.SSL, 50002), new Server("blkhub.net", Server.ConnectionType.SSL, 50002), - new Server("btc.electroncash.dk", Server.ConnectionType.SSL, 60002), + new Server("btc.aftrek.org", Server.ConnectionType.SSL, 50002), + new Server("btc.hodler.ninja", Server.ConnectionType.SSL, 50002), new Server("btc.ocf.sh", Server.ConnectionType.SSL, 50002), new Server("btce.iiiiiii.biz", Server.ConnectionType.SSL, 50002), new Server("caleb.vegas", Server.ConnectionType.SSL, 50002), + new Server("d762li0k0g.d.firewalla.org", Server.ConnectionType.SSL, 50002), + new Server("de.poiuty.com", Server.ConnectionType.SSL, 50002), + new Server("dijon.anties.org", Server.ConnectionType.SSL, 50002), new Server("eai.coincited.net", Server.ConnectionType.SSL, 50002), - new Server("electrum.bhoovd.com", Server.ConnectionType.SSL, 50002), new Server("electrum.bitaroo.net", Server.ConnectionType.SSL, 50002), - new Server("electrum.bitcoinlizard.net", Server.ConnectionType.SSL, 50002), - new Server("electrum.blockstream.info", Server.ConnectionType.SSL, 50002), + new Server("electrum.bitrefill.com", Server.ConnectionType.SSL, 50002), + new Server("electrum.brainshome.de", Server.ConnectionType.SSL, 50002), new Server("electrum.emzy.de", Server.ConnectionType.SSL, 50002), - new Server("electrum.exan.tech", Server.ConnectionType.SSL, 50002), + new Server("electrum.kcicom.net", Server.ConnectionType.SSL, 50002), new Server("electrum.kendigisland.xyz", Server.ConnectionType.SSL, 50002), - new Server("electrum.mmitech.info", Server.ConnectionType.SSL, 50002), - new Server("electrum.petrkr.net", Server.ConnectionType.SSL, 50002), - new Server("electrum.stippy.com", Server.ConnectionType.SSL, 50002), new Server("electrum.thomasfischbach.de", Server.ConnectionType.SSL, 50002), + new Server("electrum-btc.leblancnet.us", Server.ConnectionType.SSL, 50002), new Server("electrum0.snel.it", Server.ConnectionType.SSL, 50002), - new Server("electrum1.cipig.net", Server.ConnectionType.SSL, 50002), - new Server("electrum2.cipig.net", Server.ConnectionType.SSL, 50002), - new Server("electrum3.cipig.net", Server.ConnectionType.SSL, 50002), - new Server("electrumx.alexridevski.net", Server.ConnectionType.SSL, 50002), + new Server("electrum1.cipig.net", Server.ConnectionType.SSL, 20000), + new Server("electrum2.cipig.net", Server.ConnectionType.SSL, 20000), + new Server("electrum3.cipig.net", Server.ConnectionType.SSL, 20000), + new Server("electrumx.blockfinance-eco.li", Server.ConnectionType.SSL, 50002), + new Server("electrumx.indoor.app", Server.ConnectionType.SSL, 50002), + new Server("electrumx.iodata.org", Server.ConnectionType.SSL, 50002), new Server("electrumx-core.1209k.com", Server.ConnectionType.SSL, 50002), new Server("elx.bitske.com", Server.ConnectionType.SSL, 50002), - new Server("ex03.axalgo.com", Server.ConnectionType.SSL, 50002), - new Server("ex05.axalgo.com", Server.ConnectionType.SSL, 50002), - new Server("ex07.axalgo.com", Server.ConnectionType.SSL, 50002), + new Server("exs.dyshek.org", Server.ConnectionType.SSL, 50002), new Server("fortress.qtornado.com", Server.ConnectionType.SSL, 50002), - new Server("fulcrum.grey.pw", Server.ConnectionType.SSL, 50002), - new Server("fulcrum.sethforprivacy.com", Server.ConnectionType.SSL, 51002), new Server("guichet.centure.cc", Server.ConnectionType.SSL, 50002), + new Server("hodl.artyomk13.me", Server.ConnectionType.SSL, 50002), new Server("hodlers.beer", Server.ConnectionType.SSL, 50002), new Server("kareoke.qoppa.org", Server.ConnectionType.SSL, 50002), new Server("kirsche.emzy.de", Server.ConnectionType.SSL, 50002), + new Server("kittyserver.ddnsfree.com", Server.ConnectionType.SSL, 50002), + new Server("lille.anties.org", Server.ConnectionType.SSL, 50002), + new Server("marseille.anties.org", Server.ConnectionType.SSL, 50002), new Server("node1.btccuracao.com", Server.ConnectionType.SSL, 50002), new Server("osr1ex1.compumundohipermegared.one", Server.ConnectionType.SSL, 50002), - new Server("smmalis37.ddns.net", Server.ConnectionType.SSL, 50002), - new Server("ulrichard.ch", Server.ConnectionType.SSL, 50002), - new Server("vmd104012.contaboserver.net", Server.ConnectionType.SSL, 50002), - new Server("vmd104014.contaboserver.net", Server.ConnectionType.SSL, 50002), + new Server("paris.anties.org", Server.ConnectionType.SSL, 50002), + new Server("ragtor.duckdns.org", Server.ConnectionType.SSL, 50002), + new Server("stavver.dyshek.org", Server.ConnectionType.SSL, 50002), new Server("vmd63185.contaboserver.net", Server.ConnectionType.SSL, 50002), - new Server("vmd71287.contaboserver.net", Server.ConnectionType.SSL, 50002), - new Server("vmd84592.contaboserver.net", Server.ConnectionType.SSL, 50002), new Server("xtrum.com", Server.ConnectionType.SSL, 50002) ); } @@ -141,12 +129,17 @@ public class Bitcoin extends Bitcoiny { @Override public Collection getServers() { return Arrays.asList( - new Server("tn.not.fyi", Server.ConnectionType.SSL, 55002), - new Server("electrumx-test.1209k.com", Server.ConnectionType.SSL, 50002), - new Server("testnet.qtornado.com", Server.ConnectionType.SSL, 51002), - new Server("testnet.aranguren.org", Server.ConnectionType.TCP, 51001), + new Server("bitcoin.devmole.eu", Server.ConnectionType.TCP, 5000), + new Server("bitcoin.stagemole.eu", Server.ConnectionType.TCP, 5000), + new Server("blockstream.info", Server.ConnectionType.SSL, 993), + new Server("electrum.blockstream.info", Server.ConnectionType.SSL, 60002), + new Server("electrum1.cipig.net", Server.ConnectionType.TCP, 10068), + new Server("electrum2.cipig.net", Server.ConnectionType.TCP, 10068), + new Server("electrum3.cipig.net", Server.ConnectionType.TCP, 10068), new Server("testnet.aranguren.org", Server.ConnectionType.SSL, 51002), - new Server("testnet.hsmiths.com", Server.ConnectionType.SSL, 53012) + new Server("testnet.hsmiths.com", Server.ConnectionType.SSL, 53012), + new Server("testnet.qtornado.com", Server.ConnectionType.SSL, 51002), + new Server("v22019051929289916.bestsrv.de", Server.ConnectionType.SSL, 50002) ); } diff --git a/src/main/java/org/qortal/crosschain/Digibyte.java b/src/main/java/org/qortal/crosschain/Digibyte.java index bda6c18d..cfca9f3f 100644 --- a/src/main/java/org/qortal/crosschain/Digibyte.java +++ b/src/main/java/org/qortal/crosschain/Digibyte.java @@ -46,13 +46,10 @@ public class Digibyte extends Bitcoiny { // Servers chosen on NO BASIS WHATSOEVER from various sources! // Status verified at https://1209k.com/bitcoin-eye/ele.php?chain=dgb new Server("electrum.qortal.link", Server.ConnectionType.SSL, 55002), - new Server("electrum1-dgb.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum2-dgb.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum3-dgb.qortal.online", Server.ConnectionType.SSL, 40002), - new Server("electrum4-dgb.qortal.online", Server.ConnectionType.SSL, 40002), new Server("electrum1.cipig.net", Server.ConnectionType.SSL, 20059), new Server("electrum2.cipig.net", Server.ConnectionType.SSL, 20059), - new Server("electrum3.cipig.net", Server.ConnectionType.SSL, 20059) + new Server("electrum3.cipig.net", Server.ConnectionType.SSL, 20059), + new Server("electrum3-dgb.qortal.online", Server.ConnectionType.SSL, 40002) ); } diff --git a/src/main/java/org/qortal/crosschain/Dogecoin.java b/src/main/java/org/qortal/crosschain/Dogecoin.java index c687ca60..07a6da65 100644 --- a/src/main/java/org/qortal/crosschain/Dogecoin.java +++ b/src/main/java/org/qortal/crosschain/Dogecoin.java @@ -45,11 +45,8 @@ public class Dogecoin extends Bitcoiny { return Arrays.asList( // Servers chosen on NO BASIS WHATSOEVER from various sources! // Status verified at https://1209k.com/bitcoin-eye/ele.php?chain=doge + new Server("dogecoin.stackwallet.com", Server.ConnectionType.SSL, 50022), new Server("electrum.qortal.link", Server.ConnectionType.SSL, 54002), - new Server("electrum1-doge.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum2-doge.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum3-doge.qortal.online", Server.ConnectionType.SSL, 30002), - new Server("electrum4-doge.qortal.online", Server.ConnectionType.SSL, 30002), new Server("electrum1.cipig.net", Server.ConnectionType.SSL, 20060), new Server("electrum2.cipig.net", Server.ConnectionType.SSL, 20060), new Server("electrum3.cipig.net", Server.ConnectionType.SSL, 20060) diff --git a/src/main/java/org/qortal/crosschain/Litecoin.java b/src/main/java/org/qortal/crosschain/Litecoin.java index d87cd1a1..4ae5bfee 100644 --- a/src/main/java/org/qortal/crosschain/Litecoin.java +++ b/src/main/java/org/qortal/crosschain/Litecoin.java @@ -45,17 +45,14 @@ public class Litecoin extends Bitcoiny { return Arrays.asList( // Servers chosen on NO BASIS WHATSOEVER from various sources! // Status verified at https://1209k.com/bitcoin-eye/ele.php?chain=ltc - new Server("electrum.qortal.link", Server.ConnectionType.SSL, 50002), - new Server("electrum1-ltc.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum2-ltc.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum3-ltc.qortal.online", Server.ConnectionType.SSL, 20002), - new Server("electrum4-ltc.qortal.online", Server.ConnectionType.SSL, 20002), new Server("backup.electrum-ltc.org", Server.ConnectionType.SSL, 443), new Server("electrum.ltc.xurious.com", Server.ConnectionType.SSL, 50002), + new Server("electrum.qortal.link", Server.ConnectionType.SSL, 50002), new Server("electrum-ltc.petrkr.net", Server.ConnectionType.SSL, 60002), new Server("electrum1.cipig.net", Server.ConnectionType.SSL, 20063), new Server("electrum2.cipig.net", Server.ConnectionType.SSL, 20063), new Server("electrum3.cipig.net", Server.ConnectionType.SSL, 20063), + new Server("electrum4-ltc.qortal.online", Server.ConnectionType.SSL, 20002), new Server("ltc.rentonrisk.com", Server.ConnectionType.SSL, 50002) ); } @@ -80,9 +77,7 @@ public class Litecoin extends Bitcoiny { @Override public Collection getServers() { return Arrays.asList( - new Server("electrum-ltc.bysh.me", Server.ConnectionType.TCP, 51001), new Server("electrum-ltc.bysh.me", Server.ConnectionType.SSL, 51002), - new Server("electrum.ltc.xurious.com", Server.ConnectionType.TCP, 51001), new Server("electrum.ltc.xurious.com", Server.ConnectionType.SSL, 51002) ); } diff --git a/src/main/java/org/qortal/crosschain/PirateChain.java b/src/main/java/org/qortal/crosschain/PirateChain.java index 3f3cba47..30c7255e 100644 --- a/src/main/java/org/qortal/crosschain/PirateChain.java +++ b/src/main/java/org/qortal/crosschain/PirateChain.java @@ -51,7 +51,6 @@ public class PirateChain extends Bitcoiny { public Collection getServers() { return Arrays.asList( // Servers chosen on NO BASIS WHATSOEVER from various sources! - new Server("wallet-arrr1.qortal.online", Server.ConnectionType.SSL, 443), new Server("wallet-arrr2.qortal.online", Server.ConnectionType.SSL, 443), new Server("wallet-arrr3.qortal.online", Server.ConnectionType.SSL, 443), new Server("wallet-arrr4.qortal.online", Server.ConnectionType.SSL, 443), diff --git a/src/main/java/org/qortal/crosschain/Ravencoin.java b/src/main/java/org/qortal/crosschain/Ravencoin.java index d9301f48..e5ff9c98 100644 --- a/src/main/java/org/qortal/crosschain/Ravencoin.java +++ b/src/main/java/org/qortal/crosschain/Ravencoin.java @@ -46,13 +46,10 @@ public class Ravencoin extends Bitcoiny { // Servers chosen on NO BASIS WHATSOEVER from various sources! // Status verified at https://1209k.com/bitcoin-eye/ele.php?chain=rvn new Server("electrum.qortal.link", Server.ConnectionType.SSL, 56002), - new Server("electrum1-rvn.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum2-rvn.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum3-rvn.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum4-rvn.qortal.online", Server.ConnectionType.SSL, 50002), new Server("electrum1.cipig.net", Server.ConnectionType.SSL, 20051), new Server("electrum2.cipig.net", Server.ConnectionType.SSL, 20051), new Server("electrum3.cipig.net", Server.ConnectionType.SSL, 20051), + new Server("electrum3-rvn.qortal.online", Server.ConnectionType.SSL, 50002), new Server("rvn-dashboard.com", Server.ConnectionType.SSL, 50002), new Server("rvn4lyfe.com", Server.ConnectionType.SSL, 50002) ); From 15ae32efd93338e7a98b8f9d8b00d2a40b0e831b Mon Sep 17 00:00:00 2001 From: QuickMythril Date: Wed, 17 Jan 2024 06:56:06 -0500 Subject: [PATCH 29/47] Fix crosschain tests --- .../qortal/test/crosschain/BitcoinTests.java | 20 ------------------- .../qortal/test/crosschain/DigibyteTests.java | 6 +++--- .../test/crosschain/PirateChainTests.java | 4 ++++ .../test/crosschain/RavencoinTests.java | 4 ++-- 4 files changed, 9 insertions(+), 25 deletions(-) diff --git a/src/test/java/org/qortal/test/crosschain/BitcoinTests.java b/src/test/java/org/qortal/test/crosschain/BitcoinTests.java index e83afac2..8c41d2d2 100644 --- a/src/test/java/org/qortal/test/crosschain/BitcoinTests.java +++ b/src/test/java/org/qortal/test/crosschain/BitcoinTests.java @@ -41,24 +41,4 @@ public class BitcoinTests extends BitcoinyTests { protected String getRecipient() { return "2N8WCg52ULCtDSMjkgVTm5mtPdCsUptkHWE"; } - - @Test - @Ignore("Often fails due to unreliable BTC testnet ElectrumX servers") - public void testGetMedianBlockTime() {} - - @Test - @Ignore("Often fails due to unreliable BTC testnet ElectrumX servers") - public void testFindHtlcSecret() {} - - @Test - @Ignore("Often fails due to unreliable BTC testnet ElectrumX servers") - public void testBuildSpend() {} - - @Test - @Ignore("Often fails due to unreliable BTC testnet ElectrumX servers") - public void testGetWalletBalance() {} - - @Test - @Ignore("Often fails due to unreliable BTC testnet ElectrumX servers") - public void testGetUnusedReceiveAddress() {} } diff --git a/src/test/java/org/qortal/test/crosschain/DigibyteTests.java b/src/test/java/org/qortal/test/crosschain/DigibyteTests.java index 9e932bbf..5387539e 100644 --- a/src/test/java/org/qortal/test/crosschain/DigibyteTests.java +++ b/src/test/java/org/qortal/test/crosschain/DigibyteTests.java @@ -29,17 +29,17 @@ public class DigibyteTests extends BitcoinyTests { @Override protected String getDeterministicKey58() { - return "xpub661MyMwAqRbcEnabTLX5uebYcsE3uG5y7ve9jn1VK8iY1MaU3YLoLJEe8sTu2YVav5Zka5qf2dmMssfxmXJTqZnazZL2kL7M2tNKwEoC34R"; + return "xprv9z8QpS7vxwMC2fCnG1oZc6c4aFRLgsqSF86yWrJBKEzMY3T3ySCo85x8Uv5FxTavAQwgEDy1g3iLRT5kdtFjoNNBKukLTMzKwCUn1Abwoxg"; } @Override protected String getDeterministicPublicKey58() { - return "xpub661MyMwAqRbcEnabTLX5uebYcsE3uG5y7ve9jn1VK8iY1MaU3YLoLJEe8sTu2YVav5Zka5qf2dmMssfxmXJTqZnazZL2kL7M2tNKwEoC34R"; + return "xpub6D7mDwepoJuVF9HFN3LZyEYo8HFq6LZHcM2aKEhnsaXLQqnCWyX3ftGcLDcjYmiPCc9GNX4VjfT32hwvYQnh9H5Z5diAvMsXRrxFmckyNoR"; } @Override protected String getRecipient() { - return "2N8WCg52ULCtDSMjkgVTm5mtPdCsUptkHWE"; + return null; } @Test diff --git a/src/test/java/org/qortal/test/crosschain/PirateChainTests.java b/src/test/java/org/qortal/test/crosschain/PirateChainTests.java index a2c2a9ec..01b9449b 100644 --- a/src/test/java/org/qortal/test/crosschain/PirateChainTests.java +++ b/src/test/java/org/qortal/test/crosschain/PirateChainTests.java @@ -259,4 +259,8 @@ public class PirateChainTests extends BitcoinyTests { @Test @Ignore(value = "Needs adapting for Pirate Chain") public void testWalletSpendingCandidateAddresses() throws ForeignBlockchainException {} + + @Test + @Ignore(value = "Needs adapting for Pirate Chain") + public void testRepair() throws ForeignBlockchainException {} } \ No newline at end of file diff --git a/src/test/java/org/qortal/test/crosschain/RavencoinTests.java b/src/test/java/org/qortal/test/crosschain/RavencoinTests.java index 3d590199..f9e6f4ae 100644 --- a/src/test/java/org/qortal/test/crosschain/RavencoinTests.java +++ b/src/test/java/org/qortal/test/crosschain/RavencoinTests.java @@ -29,12 +29,12 @@ public class RavencoinTests extends BitcoinyTests { @Override protected String getDeterministicKey58() { - return "xpub661MyMwAqRbcEt3Ge1wNmkagyb1J7yTQu4Kquvy77Ycg2iPoh7Urg8s9Jdwp7YmrqGkDKJpUVjsZXSSsQgmAVUC17ZVQQeoWMzm7vDTt1y7"; + return "xprv9z8QpS7vxwMC2fCnG1oZc6c4aFRLgsqSF86yWrJBKEzMY3T3ySCo85x8Uv5FxTavAQwgEDy1g3iLRT5kdtFjoNNBKukLTMzKwCUn1Abwoxg"; } @Override protected String getDeterministicPublicKey58() { - return "xpub661MyMwAqRbcEt3Ge1wNmkagyb1J7yTQu4Kquvy77Ycg2iPoh7Urg8s9Jdwp7YmrqGkDKJpUVjsZXSSsQgmAVUC17ZVQQeoWMzm7vDTt1y7"; + return "xpub6D7mDwepoJuVF9HFN3LZyEYo8HFq6LZHcM2aKEhnsaXLQqnCWyX3ftGcLDcjYmiPCc9GNX4VjfT32hwvYQnh9H5Z5diAvMsXRrxFmckyNoR"; } @Override From 747b1a4f9de3e3c126fde60082b00f10de817d3e Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Wed, 17 Jan 2024 17:28:27 +0100 Subject: [PATCH 30/47] Update dependencies --- pom.xml | 8 ++++---- .../org/qortal/account/SelfSponsorshipAlgoV1.java | 15 +++++++++++---- src/main/java/org/qortal/block/Block.java | 9 +++++---- .../qortal/block/SelfSponsorshipAlgoV1Block.java | 3 +-- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/pom.xml b/pom.xml index 4f2304bd..42177e54 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ 1.2.2 0.12.3 4.9.10 - 1.60.1 + 1.61.0 33.0.0-jre 2.2 1.2.1 @@ -34,16 +34,16 @@ 9.4.53.v20231009 1.1.1 20231013 - 1.17.1 + 1.17.2 5.10.0 1.0.0 - 2.22.0 + 2.22.1 1.5.0-b01 3.12.1 3.3.0 3.3.1 3.5.1 - 3.2.3 + 3.2.5 1.1.0 UTF-8 3.25.1 diff --git a/src/main/java/org/qortal/account/SelfSponsorshipAlgoV1.java b/src/main/java/org/qortal/account/SelfSponsorshipAlgoV1.java index 725e53f5..2ed57f34 100644 --- a/src/main/java/org/qortal/account/SelfSponsorshipAlgoV1.java +++ b/src/main/java/org/qortal/account/SelfSponsorshipAlgoV1.java @@ -2,6 +2,7 @@ package org.qortal.account; import org.qortal.api.resource.TransactionsResource; import org.qortal.asset.Asset; +import org.qortal.block.BlockChain; import org.qortal.data.account.AccountData; import org.qortal.data.naming.NameData; import org.qortal.data.transaction.*; @@ -26,6 +27,7 @@ public class SelfSponsorshipAlgoV1 { private int consolidationCount = 0; private int bulkIssuanceCount = 0; private int recentSponsorshipCount = 0; + private int transferAssetsCount = 0; private List sponsorshipRewardShares = new ArrayList<>(); private final Map> paymentsByAddress = new HashMap<>(); @@ -33,6 +35,7 @@ public class SelfSponsorshipAlgoV1 { private Set consolidatedAddresses = new LinkedHashSet<>(); private final Set zeroTransactionAddreses = new LinkedHashSet<>(); private final Set penaltyAddresses = new LinkedHashSet<>(); + private final Set transferAssetsByAddress = new LinkedHashSet<>(); public SelfSponsorshipAlgoV1(Repository repository, String address, long snapshotTimestamp, boolean override) throws DataException { this.repository = repository; @@ -67,6 +70,7 @@ public class SelfSponsorshipAlgoV1 { this.findBulkIssuance(); this.findRegisteredNameCount(); this.findRecentSponsorshipCount(); + this.transferAssetsCount = this.transferAssetsByAddress.size(); int score = this.calculateScore(); if (score <= 0 && !override) { @@ -221,7 +225,9 @@ public class SelfSponsorshipAlgoV1 { } private void findRecentSponsorshipCount() { - final long referenceTimestamp = this.snapshotTimestamp - (365 * 24 * 60 * 60 * 1000L); + long snapshotTimestampBefore = BlockChain.getInstance().getSelfSponsorshipAlgoV1SnapshotTimestamp(); + long diffTimeBetween = this.snapshotTimestamp - snapshotTimestampBefore; + final long referenceTimestamp = this.snapshotTimestamp - diffTimeBetween; int recentSponsorshipCount = 0; for (RewardShareTransactionData rewardShare : sponsorshipRewardShares) { if (rewardShare.getTimestamp() >= referenceTimestamp) { @@ -232,12 +238,13 @@ public class SelfSponsorshipAlgoV1 { } private int calculateScore() { + final int transferAssetsMultiplier = (this.transferAssetsCount >= 5) ? 10 : 1; final int suspiciousMultiplier = (this.suspiciousCount >= 100) ? this.suspiciousPercent : 1; final int nameMultiplier = (this.sponsees.size() >= 50 && this.registeredNameCount == 0) ? 2 : 1; final int consolidationMultiplier = Math.max(this.consolidationCount, 1); final int bulkIssuanceMultiplier = Math.max(this.bulkIssuanceCount / 2, 1); final int offset = 9; - return suspiciousMultiplier * nameMultiplier * consolidationMultiplier * bulkIssuanceMultiplier - offset; + return transferAssetsMultiplier * suspiciousMultiplier * nameMultiplier * consolidationMultiplier * bulkIssuanceMultiplier - offset; } private void fetchSponsorshipRewardShares() throws DataException { @@ -322,6 +329,7 @@ public class SelfSponsorshipAlgoV1 { if (!Objects.equals(transferAssetTransactionData.getRecipient(), address)) { // Outgoing payment from this account outgoingPaymentRecipients.add(transferAssetTransactionData.getRecipient()); + this.transferAssetsByAddress.add(transferAssetTransactionData.getRecipient()); } } break; @@ -363,5 +371,4 @@ public class SelfSponsorshipAlgoV1 { return transactionDataList; } - -} +} \ No newline at end of file diff --git a/src/main/java/org/qortal/block/Block.java b/src/main/java/org/qortal/block/Block.java index af99e34e..475de70a 100644 --- a/src/main/java/org/qortal/block/Block.java +++ b/src/main/java/org/qortal/block/Block.java @@ -1548,12 +1548,14 @@ public class Block { processBlockRewards(); } - if (this.blockData.getHeight() == 212937) + if (this.blockData.getHeight() == 212937) { // Apply fix for block 212937 Block212937.processFix(this); + } - else if (this.blockData.getHeight() == BlockChain.getInstance().getSelfSponsorshipAlgoV1Height()) + if (this.blockData.getHeight() == BlockChain.getInstance().getUnconfirmableRewardSharesHeight()) { SelfSponsorshipAlgoV1Block.processAccountPenalties(this); + } } // We're about to (test-)process a batch of transactions, @@ -2542,5 +2544,4 @@ public class Block { LOGGER.info(() -> String.format("Unable to log block debugging info: %s", e.getMessage())); } } - -} +} \ No newline at end of file diff --git a/src/main/java/org/qortal/block/SelfSponsorshipAlgoV1Block.java b/src/main/java/org/qortal/block/SelfSponsorshipAlgoV1Block.java index c3c374d1..cea97593 100644 --- a/src/main/java/org/qortal/block/SelfSponsorshipAlgoV1Block.java +++ b/src/main/java/org/qortal/block/SelfSponsorshipAlgoV1Block.java @@ -64,7 +64,7 @@ public final class SelfSponsorshipAlgoV1Block { } public static Set getAccountPenalties(Repository repository, int penalty) throws DataException { - final long snapshotTimestamp = BlockChain.getInstance().getSelfSponsorshipAlgoV1SnapshotTimestamp(); + final long snapshotTimestamp = System.currentTimeMillis() - 10000; Set penalties = new LinkedHashSet<>(); List addresses = repository.getTransactionRepository().getConfirmedRewardShareCreatorsExcludingSelfShares(); for (String address : addresses) { @@ -132,5 +132,4 @@ public final class SelfSponsorshipAlgoV1Block { Collections.sort(penaltyAddresses); return Base58.encode(Crypto.digest(StringUtils.join(penaltyAddresses).getBytes(StandardCharsets.UTF_8))); } - } From 140f14f2f4ca5e6b19a50b8a11d277b5cdf1a08b Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Wed, 17 Jan 2024 17:49:05 +0100 Subject: [PATCH 31/47] Set exclude reward share transactions blockheight --- src/main/resources/blockchain.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/blockchain.json b/src/main/resources/blockchain.json index 23e43285..8631fbf4 100644 --- a/src/main/resources/blockchain.json +++ b/src/main/resources/blockchain.json @@ -96,7 +96,7 @@ "feeValidationFixTimestamp": 1671918000000, "chatReferenceTimestamp": 1674316800000, "arbitraryOptionalFeeTimestamp": 1680278400000, - "unconfirmableRewardSharesHeight": 99999500 + "unconfirmableRewardSharesHeight": 1575500 }, "checkpoints": [ { "height": 1136300, "signature": "3BbwawEF2uN8Ni5ofpJXkukoU8ctAPxYoFB7whq9pKfBnjfZcpfEJT4R95NvBDoTP8WDyWvsUvbfHbcr9qSZuYpSKZjUQTvdFf6eqznHGEwhZApWfvXu6zjGCxYCp65F4jsVYYJjkzbjmkCg5WAwN5voudngA23kMK6PpTNygapCzXt" } From 867fe764ca610b29a62258607ebcb476122a2ce5 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Wed, 17 Jan 2024 17:50:22 +0100 Subject: [PATCH 32/47] Bump version to 4.4.2 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 42177e54..a17fd5e3 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.qortal qortal - 4.4.1 + 4.4.2 jar true From 21c45535be484b64c7a1f844b3d029b16ff01ebf Mon Sep 17 00:00:00 2001 From: kennycud Date: Wed, 17 Jan 2024 18:19:09 -0800 Subject: [PATCH 33/47] Enabled fee updates for foreign coin trade transactions. --- .../resource/CrossChainBitcoinResource.java | 114 +++++++++++++++++ .../resource/CrossChainDigibyteResource.java | 115 +++++++++++++++++- .../resource/CrossChainDogecoinResource.java | 115 +++++++++++++++++- .../resource/CrossChainLitecoinResource.java | 113 +++++++++++++++++ .../CrossChainPirateChainResource.java | 113 +++++++++++++++++ .../resource/CrossChainRavencoinResource.java | 113 +++++++++++++++++ .../qortal/api/resource/CrossChainUtils.java | 43 ++++++- .../java/org/qortal/crosschain/Bitcoin.java | 30 +++-- .../java/org/qortal/crosschain/Bitcoiny.java | 15 ++- .../java/org/qortal/crosschain/Digibyte.java | 30 +++-- .../java/org/qortal/crosschain/Dogecoin.java | 30 +++-- .../java/org/qortal/crosschain/Litecoin.java | 31 +++-- .../org/qortal/crosschain/PirateChain.java | 31 +++-- .../java/org/qortal/crosschain/Ravencoin.java | 30 +++-- 14 files changed, 868 insertions(+), 55 deletions(-) diff --git a/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java index 6f3b9f50..ff4aee02 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainBitcoinResource.java @@ -8,6 +8,7 @@ import io.swagger.v3.oas.annotations.parameters.RequestBody; import io.swagger.v3.oas.annotations.responses.ApiResponse; import io.swagger.v3.oas.annotations.security.SecurityRequirement; import io.swagger.v3.oas.annotations.tags.Tag; +import org.bitcoinj.core.Coin; import org.bitcoinj.core.Transaction; import org.qortal.api.ApiError; import org.qortal.api.ApiErrors; @@ -265,4 +266,117 @@ public class CrossChainBitcoinResource { return CrossChainUtils.buildServerConfigurationInfo(Bitcoin.getInstance()); } + + @GET + @Path("/feekb") + @Operation( + summary = "Returns Bitcoin fee per Kb.", + description = "Returns Bitcoin fee per Kb.", + responses = { + @ApiResponse( + content = @Content( + schema = @Schema( + type = "number" + ) + ) + ) + } + ) + public String getBitcoinFeePerKb() { + Bitcoin bitcoin = Bitcoin.getInstance(); + + return String.valueOf(bitcoin.getFeePerKb().value); + } + + @POST + @Path("/updatefeekb") + @Operation( + summary = "Sets Bitcoin fee per Kb.", + description = "Sets Bitcoin fee per Kb.", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.TEXT_PLAIN, + schema = @Schema( + type = "number", + description = "the fee per Kb", + example = "100" + ) + ) + ), + responses = { + @ApiResponse( + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee")) + ) + } + ) + @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA}) + public String setBitcoinFeePerKb(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) { + Security.checkApiCallAllowed(request); + + Bitcoin bitcoin = Bitcoin.getInstance(); + + try { + return CrossChainUtils.setFeePerKb(bitcoin, fee); + } catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); + } + } + + @GET + @Path("/feeceiling") + @Operation( + summary = "Returns Bitcoin fee per Kb.", + description = "Returns Bitcoin fee per Kb.", + responses = { + @ApiResponse( + content = @Content( + schema = @Schema( + type = "number" + ) + ) + ) + } + ) + public String getBitcoinFeeCeiling() { + Bitcoin bitcoin = Bitcoin.getInstance(); + + return String.valueOf(bitcoin.getFeeCeiling()); + } + + @POST + @Path("/updatefeeceiling") + @Operation( + summary = "Sets Bitcoin fee ceiling.", + description = "Sets Bitcoin fee ceiling.", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.TEXT_PLAIN, + schema = @Schema( + type = "number", + description = "the fee", + example = "100" + ) + ) + ), + responses = { + @ApiResponse( + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee")) + ) + } + ) + @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA}) + public String setBitcoinFeeCeiling(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) { + Security.checkApiCallAllowed(request); + + Bitcoin bitcoin = Bitcoin.getInstance(); + + try { + return CrossChainUtils.setFeeCeiling(bitcoin, fee); + } + catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); + } + } } diff --git a/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java b/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java index 898754d6..d78a4ed9 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainDigibyteResource.java @@ -265,4 +265,117 @@ public class CrossChainDigibyteResource { return CrossChainUtils.buildServerConfigurationInfo(Digibyte.getInstance()); } -} + + @GET + @Path("/feekb") + @Operation( + summary = "Returns Digibyte fee per Kb.", + description = "Returns Digibyte fee per Kb.", + responses = { + @ApiResponse( + content = @Content( + schema = @Schema( + type = "number" + ) + ) + ) + } + ) + public String getDigibyteFeePerKb() { + Digibyte digibyte = Digibyte.getInstance(); + + return String.valueOf(digibyte.getFeePerKb().value); + } + + @POST + @Path("/updatefeekb") + @Operation( + summary = "Sets Digibyte fee per Kb.", + description = "Sets Digibyte fee per Kb.", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.TEXT_PLAIN, + schema = @Schema( + type = "number", + description = "the fee per Kb", + example = "100" + ) + ) + ), + responses = { + @ApiResponse( + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee")) + ) + } + ) + @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA}) + public String setDigibyteFeePerKb(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) { + Security.checkApiCallAllowed(request); + + Digibyte digibyte = Digibyte.getInstance(); + + try { + return CrossChainUtils.setFeePerKb(digibyte, fee); + } catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); + } + } + + @GET + @Path("/feeceiling") + @Operation( + summary = "Returns Digibyte fee per Kb.", + description = "Returns Digibyte fee per Kb.", + responses = { + @ApiResponse( + content = @Content( + schema = @Schema( + type = "number" + ) + ) + ) + } + ) + public String getDigibyteFeeCeiling() { + Digibyte digibyte = Digibyte.getInstance(); + + return String.valueOf(digibyte.getFeeCeiling()); + } + + @POST + @Path("/updatefeeceiling") + @Operation( + summary = "Sets Digibyte fee ceiling.", + description = "Sets Digibyte fee ceiling.", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.TEXT_PLAIN, + schema = @Schema( + type = "number", + description = "the fee", + example = "100" + ) + ) + ), + responses = { + @ApiResponse( + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee")) + ) + } + ) + @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA}) + public String setDigibyteFeeCeiling(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) { + Security.checkApiCallAllowed(request); + + Digibyte digibyte = Digibyte.getInstance(); + + try { + return CrossChainUtils.setFeeCeiling(digibyte, fee); + } + catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java index 1608c90e..8575a28d 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainDogecoinResource.java @@ -265,4 +265,117 @@ public class CrossChainDogecoinResource { return CrossChainUtils.buildServerConfigurationInfo(Dogecoin.getInstance()); } -} + + @GET + @Path("/feekb") + @Operation( + summary = "Returns Dogecoin fee per Kb.", + description = "Returns Dogecoin fee per Kb.", + responses = { + @ApiResponse( + content = @Content( + schema = @Schema( + type = "number" + ) + ) + ) + } + ) + public String getDogecoinFeePerKb() { + Dogecoin dogecoin = Dogecoin.getInstance(); + + return String.valueOf(dogecoin.getFeePerKb().value); + } + + @POST + @Path("/updatefeekb") + @Operation( + summary = "Sets Dogecoin fee per Kb.", + description = "Sets Dogecoin fee per Kb.", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.TEXT_PLAIN, + schema = @Schema( + type = "number", + description = "the fee per Kb", + example = "100" + ) + ) + ), + responses = { + @ApiResponse( + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee")) + ) + } + ) + @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA}) + public String setDogecoinFeePerKb(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) { + Security.checkApiCallAllowed(request); + + Dogecoin dogecoin = Dogecoin.getInstance(); + + try { + return CrossChainUtils.setFeePerKb(dogecoin, fee); + } catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); + } + } + + @GET + @Path("/feeceiling") + @Operation( + summary = "Returns Dogecoin fee per Kb.", + description = "Returns Dogecoin fee per Kb.", + responses = { + @ApiResponse( + content = @Content( + schema = @Schema( + type = "number" + ) + ) + ) + } + ) + public String getDogecoinFeeCeiling() { + Dogecoin dogecoin = Dogecoin.getInstance(); + + return String.valueOf(dogecoin.getFeeCeiling()); + } + + @POST + @Path("/updatefeeceiling") + @Operation( + summary = "Sets Dogecoin fee ceiling.", + description = "Sets Dogecoin fee ceiling.", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.TEXT_PLAIN, + schema = @Schema( + type = "number", + description = "the fee", + example = "100" + ) + ) + ), + responses = { + @ApiResponse( + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee")) + ) + } + ) + @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA}) + public String setDogecoinFeeCeiling(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) { + Security.checkApiCallAllowed(request); + + Dogecoin dogecoin = Dogecoin.getInstance(); + + try { + return CrossChainUtils.setFeeCeiling(dogecoin, fee); + } + catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); + } + } +} \ No newline at end of file diff --git a/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java index 3296c3ca..7667eea1 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainLitecoinResource.java @@ -304,4 +304,117 @@ public class CrossChainLitecoinResource { throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE); } } + + @GET + @Path("/feekb") + @Operation( + summary = "Returns Litecoin fee per Kb.", + description = "Returns Litecoin fee per Kb.", + responses = { + @ApiResponse( + content = @Content( + schema = @Schema( + type = "number" + ) + ) + ) + } + ) + public String getLitecoinFeePerKb() { + Litecoin litecoin = Litecoin.getInstance(); + + return String.valueOf(litecoin.getFeePerKb().value); + } + + @POST + @Path("/updatefeekb") + @Operation( + summary = "Sets Litecoin fee per Kb.", + description = "Sets Litecoin fee per Kb.", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.TEXT_PLAIN, + schema = @Schema( + type = "number", + description = "the fee per Kb", + example = "100" + ) + ) + ), + responses = { + @ApiResponse( + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee")) + ) + } + ) + @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA}) + public String setLitecoinFeePerKb(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) { + Security.checkApiCallAllowed(request); + + Litecoin litecoin = Litecoin.getInstance(); + + try { + return CrossChainUtils.setFeePerKb(litecoin, fee); + } catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); + } + } + + @GET + @Path("/feeceiling") + @Operation( + summary = "Returns Litecoin fee per Kb.", + description = "Returns Litecoin fee per Kb.", + responses = { + @ApiResponse( + content = @Content( + schema = @Schema( + type = "number" + ) + ) + ) + } + ) + public String getLitecoinFeeCeiling() { + Litecoin litecoin = Litecoin.getInstance(); + + return String.valueOf(litecoin.getFeeCeiling()); + } + + @POST + @Path("/updatefeeceiling") + @Operation( + summary = "Sets Litecoin fee ceiling.", + description = "Sets Litecoin fee ceiling.", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.TEXT_PLAIN, + schema = @Schema( + type = "number", + description = "the fee", + example = "100" + ) + ) + ), + responses = { + @ApiResponse( + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee")) + ) + } + ) + @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA}) + public String setLitecoinFeeCeiling(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) { + Security.checkApiCallAllowed(request); + + Litecoin litecoin = Litecoin.getInstance(); + + try { + return CrossChainUtils.setFeeCeiling(litecoin, fee); + } + catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); + } + } } \ No newline at end of file diff --git a/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java b/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java index 0e29e892..03ff43b8 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainPirateChainResource.java @@ -351,4 +351,117 @@ public class CrossChainPirateChainResource { return CrossChainUtils.buildServerConfigurationInfo(PirateChain.getInstance()); } + + @GET + @Path("/feekb") + @Operation( + summary = "Returns PirateChain fee per Kb.", + description = "Returns PirateChain fee per Kb.", + responses = { + @ApiResponse( + content = @Content( + schema = @Schema( + type = "number" + ) + ) + ) + } + ) + public String getPirateChainFeePerKb() { + PirateChain pirateChain = PirateChain.getInstance(); + + return String.valueOf(pirateChain.getFeePerKb().value); + } + + @POST + @Path("/updatefeekb") + @Operation( + summary = "Sets PirateChain fee per Kb.", + description = "Sets PirateChain fee per Kb.", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.TEXT_PLAIN, + schema = @Schema( + type = "number", + description = "the fee per Kb", + example = "100" + ) + ) + ), + responses = { + @ApiResponse( + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee")) + ) + } + ) + @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA}) + public String setPirateChainFeePerKb(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) { + Security.checkApiCallAllowed(request); + + PirateChain pirateChain = PirateChain.getInstance(); + + try { + return CrossChainUtils.setFeePerKb(pirateChain, fee); + } catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); + } + } + + @GET + @Path("/feeceiling") + @Operation( + summary = "Returns PirateChain fee per Kb.", + description = "Returns PirateChain fee per Kb.", + responses = { + @ApiResponse( + content = @Content( + schema = @Schema( + type = "number" + ) + ) + ) + } + ) + public String getPirateChainFeeCeiling() { + PirateChain pirateChain = PirateChain.getInstance(); + + return String.valueOf(pirateChain.getFeeCeiling()); + } + + @POST + @Path("/updatefeeceiling") + @Operation( + summary = "Sets PirateChain fee ceiling.", + description = "Sets PirateChain fee ceiling.", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.TEXT_PLAIN, + schema = @Schema( + type = "number", + description = "the fee", + example = "100" + ) + ) + ), + responses = { + @ApiResponse( + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee")) + ) + } + ) + @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA}) + public String setPirateChainFeeCeiling(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) { + Security.checkApiCallAllowed(request); + + PirateChain pirateChain = PirateChain.getInstance(); + + try { + return CrossChainUtils.setFeeCeiling(pirateChain, fee); + } + catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); + } + } } diff --git a/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java b/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java index 9b702b25..ce5cd668 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainRavencoinResource.java @@ -265,4 +265,117 @@ public class CrossChainRavencoinResource { return CrossChainUtils.buildServerConfigurationInfo(Ravencoin.getInstance()); } + + @GET + @Path("/feekb") + @Operation( + summary = "Returns Ravencoin fee per Kb.", + description = "Returns Ravencoin fee per Kb.", + responses = { + @ApiResponse( + content = @Content( + schema = @Schema( + type = "number" + ) + ) + ) + } + ) + public String getRavencoinFeePerKb() { + Ravencoin ravencoin = Ravencoin.getInstance(); + + return String.valueOf(ravencoin.getFeePerKb().value); + } + + @POST + @Path("/updatefeekb") + @Operation( + summary = "Sets Ravencoin fee per Kb.", + description = "Sets Ravencoin fee per Kb.", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.TEXT_PLAIN, + schema = @Schema( + type = "number", + description = "the fee per Kb", + example = "100" + ) + ) + ), + responses = { + @ApiResponse( + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee")) + ) + } + ) + @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA}) + public String setRavencoinFeePerKb(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) { + Security.checkApiCallAllowed(request); + + Ravencoin ravencoin = Ravencoin.getInstance(); + + try { + return CrossChainUtils.setFeePerKb(ravencoin, fee); + } catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); + } + } + + @GET + @Path("/feeceiling") + @Operation( + summary = "Returns Ravencoin fee per Kb.", + description = "Returns Ravencoin fee per Kb.", + responses = { + @ApiResponse( + content = @Content( + schema = @Schema( + type = "number" + ) + ) + ) + } + ) + public String getRavencoinFeeCeiling() { + Ravencoin ravencoin = Ravencoin.getInstance(); + + return String.valueOf(ravencoin.getFeeCeiling()); + } + + @POST + @Path("/updatefeeceiling") + @Operation( + summary = "Sets Ravencoin fee ceiling.", + description = "Sets Ravencoin fee ceiling.", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.TEXT_PLAIN, + schema = @Schema( + type = "number", + description = "the fee", + example = "100" + ) + ) + ), + responses = { + @ApiResponse( + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "number", description = "fee")) + ) + } + ) + @ApiErrors({ApiError.INVALID_PRIVATE_KEY, ApiError.INVALID_CRITERIA}) + public String setRavencoinFeeCeiling(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String fee) { + Security.checkApiCallAllowed(request); + + Ravencoin ravencoin = Ravencoin.getInstance(); + + try { + return CrossChainUtils.setFeeCeiling(ravencoin, fee); + } + catch (IllegalArgumentException e) { + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); + } + } } diff --git a/src/main/java/org/qortal/api/resource/CrossChainUtils.java b/src/main/java/org/qortal/api/resource/CrossChainUtils.java index d45ba257..6e631b7a 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainUtils.java +++ b/src/main/java/org/qortal/api/resource/CrossChainUtils.java @@ -2,6 +2,7 @@ package org.qortal.api.resource; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.bitcoinj.core.Coin; import org.qortal.crosschain.*; import java.util.ArrayList; @@ -44,4 +45,44 @@ public class CrossChainUtils { return infos; } -} + + /** + * Set Fee Per Kb + * + * @param bitcoiny the blockchain support + * @param fee the fee in satoshis + * + * @return the fee if valid + * + * @throws IllegalArgumentException if invalid + */ + public static String setFeePerKb(Bitcoiny bitcoiny, String fee) throws IllegalArgumentException { + + long satoshis = Long.parseLong(fee); + if( satoshis < 0 ) throw new IllegalArgumentException("can't set fee to negative number"); + + bitcoiny.setFeePerKb(Coin.valueOf(satoshis) ); + + return String.valueOf(bitcoiny.getFeePerKb().value); + } + + /** + * Set Fee Ceiling + * + * @param bitcoiny the blockchain support + * @param fee the fee in satoshis + * + * @return the fee if valid + * + * @throws IllegalArgumentException if invalid + */ + public static String setFeeCeiling(Bitcoiny bitcoiny, String fee) throws IllegalArgumentException{ + + long satoshis = Long.parseLong(fee); + if( satoshis < 0 ) throw new IllegalArgumentException("can't set fee to negative number"); + + bitcoiny.setFeeCeiling( Long.parseLong(fee)); + + return String.valueOf(bitcoiny.getFeeCeiling()); + } +} \ No newline at end of file diff --git a/src/main/java/org/qortal/crosschain/Bitcoin.java b/src/main/java/org/qortal/crosschain/Bitcoin.java index b2a016e7..e11dde0b 100644 --- a/src/main/java/org/qortal/crosschain/Bitcoin.java +++ b/src/main/java/org/qortal/crosschain/Bitcoin.java @@ -22,8 +22,6 @@ public class Bitcoin extends Bitcoiny { private static final long MINIMUM_ORDER_AMOUNT = 100000; // 0.001 BTC minimum order, due to high fees // Temporary values until a dynamic fee system is written. - private static final long OLD_FEE_AMOUNT = 4_000L; // Not 5000 so that existing P2SH-B can output 1000, avoiding dust issue, leaving 4000 for fees. - private static final long NEW_FEE_TIMESTAMP = 1598280000000L; // milliseconds since epoch private static final long NEW_FEE_AMOUNT = 6_000L; private static final long NON_MAINNET_FEE = 1000L; // enough for TESTNET3 and should be OK for REGTEST @@ -125,11 +123,7 @@ public class Bitcoin extends Bitcoiny { @Override public long getP2shFee(Long timestamp) { - // TODO: This will need to be replaced with something better in the near future! - if (timestamp != null && timestamp < NEW_FEE_TIMESTAMP) - return OLD_FEE_AMOUNT; - - return NEW_FEE_AMOUNT; + return this.getFeeCeiling(); } }, TEST3 { @@ -186,6 +180,16 @@ public class Bitcoin extends Bitcoiny { } }; + private long feeCeiling = NEW_FEE_AMOUNT; + + public long getFeeCeiling() { + return feeCeiling; + } + + public void setFeeCeiling(long feeCeiling) { + this.feeCeiling = feeCeiling; + } + public abstract NetworkParameters getParams(); public abstract Collection getServers(); public abstract String getGenesisHash(); @@ -199,7 +203,7 @@ public class Bitcoin extends Bitcoiny { // Constructors and instance private Bitcoin(BitcoinNet bitcoinNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) { - super(blockchain, bitcoinjContext, currencyCode); + super(blockchain, bitcoinjContext, currencyCode, bitcoinjContext.getFeePerKb()); this.bitcoinNet = bitcoinNet; LOGGER.info(() -> String.format("Starting Bitcoin support using %s", this.bitcoinNet.name())); @@ -244,6 +248,16 @@ public class Bitcoin extends Bitcoiny { return this.bitcoinNet.getP2shFee(timestamp); } + @Override + public long getFeeCeiling() { + return this.bitcoinNet.getFeeCeiling(); + } + + @Override + public void setFeeCeiling(long fee) { + + this.bitcoinNet.setFeeCeiling( fee ); + } /** * Returns bitcoinj transaction sending amount to recipient using 20 sat/byte fee. * diff --git a/src/main/java/org/qortal/crosschain/Bitcoiny.java b/src/main/java/org/qortal/crosschain/Bitcoiny.java index b7614d1e..1ae70fe9 100644 --- a/src/main/java/org/qortal/crosschain/Bitcoiny.java +++ b/src/main/java/org/qortal/crosschain/Bitcoiny.java @@ -53,12 +53,15 @@ public abstract class Bitcoiny implements ForeignBlockchain { /** Byte offset into raw block headers to block timestamp. */ private static final int TIMESTAMP_OFFSET = 4 + 32 + 32; + protected Coin feePerKb; + // Constructors and instance - protected Bitcoiny(BitcoinyBlockchainProvider blockchainProvider, Context bitcoinjContext, String currencyCode) { + protected Bitcoiny(BitcoinyBlockchainProvider blockchainProvider, Context bitcoinjContext, String currencyCode, Coin feePerKb) { this.blockchainProvider = blockchainProvider; this.bitcoinjContext = bitcoinjContext; this.currencyCode = currencyCode; + this.feePerKb = feePerKb; this.params = this.bitcoinjContext.getParams(); } @@ -167,7 +170,11 @@ public abstract class Bitcoiny implements ForeignBlockchain { /** Returns fee per transaction KB. To be overridden for testnet/regtest. */ public Coin getFeePerKb() { - return this.bitcoinjContext.getFeePerKb(); + return this.feePerKb; + } + + public void setFeePerKb(Coin feePerKb) { + this.feePerKb = feePerKb; } /** Returns minimum order size in sats. To be overridden for coins that need to restrict order size. */ @@ -757,6 +764,10 @@ public abstract class Bitcoiny implements ForeignBlockchain { } while (true); } + public abstract long getFeeCeiling(); + + public abstract void setFeeCeiling(long fee); + // UTXOProvider support static class WalletAwareUTXOProvider implements UTXOProvider { diff --git a/src/main/java/org/qortal/crosschain/Digibyte.java b/src/main/java/org/qortal/crosschain/Digibyte.java index bda6c18d..e8e8d7d3 100644 --- a/src/main/java/org/qortal/crosschain/Digibyte.java +++ b/src/main/java/org/qortal/crosschain/Digibyte.java @@ -63,8 +63,7 @@ public class Digibyte extends Bitcoiny { @Override public long getP2shFee(Long timestamp) { - // TODO: This will need to be replaced with something better in the near future! - return MAINNET_FEE; + return this.getFeeCeiling(); } }, TEST3 { @@ -114,6 +113,16 @@ public class Digibyte extends Bitcoiny { } }; + private long feeCeiling = MAINNET_FEE; + + public long getFeeCeiling() { + return feeCeiling; + } + + public void setFeeCeiling(long feeCeiling) { + this.feeCeiling = feeCeiling; + } + public abstract NetworkParameters getParams(); public abstract Collection getServers(); public abstract String getGenesisHash(); @@ -127,7 +136,7 @@ public class Digibyte extends Bitcoiny { // Constructors and instance private Digibyte(DigibyteNet digibyteNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) { - super(blockchain, bitcoinjContext, currencyCode); + super(blockchain, bitcoinjContext, currencyCode, DEFAULT_FEE_PER_KB); this.digibyteNet = digibyteNet; LOGGER.info(() -> String.format("Starting Digibyte support using %s", this.digibyteNet.name())); @@ -156,11 +165,6 @@ public class Digibyte extends Bitcoiny { // Actual useful methods for use by other classes - @Override - public Coin getFeePerKb() { - return DEFAULT_FEE_PER_KB; - } - @Override public long getMinimumOrderAmount() { return MINIMUM_ORDER_AMOUNT; @@ -177,4 +181,14 @@ public class Digibyte extends Bitcoiny { return this.digibyteNet.getP2shFee(timestamp); } + @Override + public long getFeeCeiling() { + return this.digibyteNet.getFeeCeiling(); + } + + @Override + public void setFeeCeiling(long fee) { + + this.digibyteNet.setFeeCeiling( fee ); + } } diff --git a/src/main/java/org/qortal/crosschain/Dogecoin.java b/src/main/java/org/qortal/crosschain/Dogecoin.java index c687ca60..ca96ef7c 100644 --- a/src/main/java/org/qortal/crosschain/Dogecoin.java +++ b/src/main/java/org/qortal/crosschain/Dogecoin.java @@ -63,8 +63,7 @@ public class Dogecoin extends Bitcoiny { @Override public long getP2shFee(Long timestamp) { - // TODO: This will need to be replaced with something better in the near future! - return MAINNET_FEE; + return this.getFeeCeiling(); } }, TEST3 { @@ -114,6 +113,16 @@ public class Dogecoin extends Bitcoiny { } }; + private long feeCeiling = MAINNET_FEE; + + public long getFeeCeiling() { + return feeCeiling; + } + + public void setFeeCeiling(long feeCeiling) { + this.feeCeiling = feeCeiling; + } + public abstract NetworkParameters getParams(); public abstract Collection getServers(); public abstract String getGenesisHash(); @@ -127,7 +136,7 @@ public class Dogecoin extends Bitcoiny { // Constructors and instance private Dogecoin(DogecoinNet dogecoinNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) { - super(blockchain, bitcoinjContext, currencyCode); + super(blockchain, bitcoinjContext, currencyCode, DEFAULT_FEE_PER_KB); this.dogecoinNet = dogecoinNet; LOGGER.info(() -> String.format("Starting Dogecoin support using %s", this.dogecoinNet.name())); @@ -156,11 +165,6 @@ public class Dogecoin extends Bitcoiny { // Actual useful methods for use by other classes - @Override - public Coin getFeePerKb() { - return DEFAULT_FEE_PER_KB; - } - @Override public long getMinimumOrderAmount() { return MINIMUM_ORDER_AMOUNT; @@ -177,4 +181,14 @@ public class Dogecoin extends Bitcoiny { return this.dogecoinNet.getP2shFee(timestamp); } + @Override + public long getFeeCeiling() { + return this.dogecoinNet.getFeeCeiling(); + } + + @Override + public void setFeeCeiling(long fee) { + + this.dogecoinNet.setFeeCeiling( fee ); + } } diff --git a/src/main/java/org/qortal/crosschain/Litecoin.java b/src/main/java/org/qortal/crosschain/Litecoin.java index d87cd1a1..96c13532 100644 --- a/src/main/java/org/qortal/crosschain/Litecoin.java +++ b/src/main/java/org/qortal/crosschain/Litecoin.java @@ -67,8 +67,7 @@ public class Litecoin extends Bitcoiny { @Override public long getP2shFee(Long timestamp) { - // TODO: This will need to be replaced with something better in the near future! - return MAINNET_FEE; + return this.getFeeCeiling(); } }, TEST3 { @@ -123,6 +122,16 @@ public class Litecoin extends Bitcoiny { } }; + private long feeCeiling = MAINNET_FEE; + + public long getFeeCeiling() { + return feeCeiling; + } + + public void setFeeCeiling(long feeCeiling) { + this.feeCeiling = feeCeiling; + } + public abstract NetworkParameters getParams(); public abstract Collection getServers(); public abstract String getGenesisHash(); @@ -136,7 +145,7 @@ public class Litecoin extends Bitcoiny { // Constructors and instance private Litecoin(LitecoinNet litecoinNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) { - super(blockchain, bitcoinjContext, currencyCode); + super(blockchain, bitcoinjContext, currencyCode, DEFAULT_FEE_PER_KB); this.litecoinNet = litecoinNet; LOGGER.info(() -> String.format("Starting Litecoin support using %s", this.litecoinNet.name())); @@ -165,12 +174,6 @@ public class Litecoin extends Bitcoiny { // Actual useful methods for use by other classes - /** Default Litecoin fee is lower than Bitcoin: only 10sats/byte. */ - @Override - public Coin getFeePerKb() { - return DEFAULT_FEE_PER_KB; - } - @Override public long getMinimumOrderAmount() { return MINIMUM_ORDER_AMOUNT; @@ -187,4 +190,14 @@ public class Litecoin extends Bitcoiny { return this.litecoinNet.getP2shFee(timestamp); } + @Override + public long getFeeCeiling() { + return this.litecoinNet.getFeeCeiling(); + } + + @Override + public void setFeeCeiling(long fee) { + + this.litecoinNet.setFeeCeiling( fee ); + } } diff --git a/src/main/java/org/qortal/crosschain/PirateChain.java b/src/main/java/org/qortal/crosschain/PirateChain.java index 3f3cba47..d0f9317d 100644 --- a/src/main/java/org/qortal/crosschain/PirateChain.java +++ b/src/main/java/org/qortal/crosschain/PirateChain.java @@ -67,8 +67,7 @@ public class PirateChain extends Bitcoiny { @Override public long getP2shFee(Long timestamp) { - // TODO: This will need to be replaced with something better in the near future! - return MAINNET_FEE; + return this.getFeeCeiling(); } }, TEST3 { @@ -118,6 +117,16 @@ public class PirateChain extends Bitcoiny { } }; + private long feeCeiling = MAINNET_FEE; + + public long getFeeCeiling() { + return feeCeiling; + } + + public void setFeeCeiling(long feeCeiling) { + this.feeCeiling = feeCeiling; + } + public abstract NetworkParameters getParams(); public abstract Collection getServers(); public abstract String getGenesisHash(); @@ -131,7 +140,7 @@ public class PirateChain extends Bitcoiny { // Constructors and instance private PirateChain(PirateChainNet pirateChainNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) { - super(blockchain, bitcoinjContext, currencyCode); + super(blockchain, bitcoinjContext, currencyCode, DEFAULT_FEE_PER_KB); this.pirateChainNet = pirateChainNet; LOGGER.info(() -> String.format("Starting Pirate Chain support using %s", this.pirateChainNet.name())); @@ -160,12 +169,6 @@ public class PirateChain extends Bitcoiny { // Actual useful methods for use by other classes - /** Default Litecoin fee is lower than Bitcoin: only 10sats/byte. */ - @Override - public Coin getFeePerKb() { - return DEFAULT_FEE_PER_KB; - } - @Override public long getMinimumOrderAmount() { return MINIMUM_ORDER_AMOUNT; @@ -182,6 +185,16 @@ public class PirateChain extends Bitcoiny { return this.pirateChainNet.getP2shFee(timestamp); } + @Override + public long getFeeCeiling() { + return this.pirateChainNet.getFeeCeiling(); + } + + @Override + public void setFeeCeiling(long fee) { + + this.pirateChainNet.setFeeCeiling( fee ); + } /** * Returns confirmed balance, based on passed payment script. *

diff --git a/src/main/java/org/qortal/crosschain/Ravencoin.java b/src/main/java/org/qortal/crosschain/Ravencoin.java index d9301f48..b4ed1a13 100644 --- a/src/main/java/org/qortal/crosschain/Ravencoin.java +++ b/src/main/java/org/qortal/crosschain/Ravencoin.java @@ -65,8 +65,7 @@ public class Ravencoin extends Bitcoiny { @Override public long getP2shFee(Long timestamp) { - // TODO: This will need to be replaced with something better in the near future! - return MAINNET_FEE; + return this.getFeeCeiling(); } }, TEST3 { @@ -116,6 +115,16 @@ public class Ravencoin extends Bitcoiny { } }; + private long feeCeiling = MAINNET_FEE; + + public long getFeeCeiling() { + return feeCeiling; + } + + public void setFeeCeiling(long feeCeiling) { + this.feeCeiling = feeCeiling; + } + public abstract NetworkParameters getParams(); public abstract Collection getServers(); public abstract String getGenesisHash(); @@ -129,7 +138,7 @@ public class Ravencoin extends Bitcoiny { // Constructors and instance private Ravencoin(RavencoinNet ravencoinNet, BitcoinyBlockchainProvider blockchain, Context bitcoinjContext, String currencyCode) { - super(blockchain, bitcoinjContext, currencyCode); + super(blockchain, bitcoinjContext, currencyCode, DEFAULT_FEE_PER_KB); this.ravencoinNet = ravencoinNet; LOGGER.info(() -> String.format("Starting Ravencoin support using %s", this.ravencoinNet.name())); @@ -158,11 +167,6 @@ public class Ravencoin extends Bitcoiny { // Actual useful methods for use by other classes - @Override - public Coin getFeePerKb() { - return DEFAULT_FEE_PER_KB; - } - @Override public long getMinimumOrderAmount() { return MINIMUM_ORDER_AMOUNT; @@ -179,4 +183,14 @@ public class Ravencoin extends Bitcoiny { return this.ravencoinNet.getP2shFee(timestamp); } + @Override + public long getFeeCeiling() { + return this.ravencoinNet.getFeeCeiling(); + } + + @Override + public void setFeeCeiling(long fee) { + + this.ravencoinNet.setFeeCeiling( fee ); + } } From b75c2029ac973574c18222ec2ceb63d36762938b Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sun, 21 Jan 2024 14:23:46 +0100 Subject: [PATCH 34/47] Out of Service --- src/main/java/org/qortal/crosschain/Digibyte.java | 4 ---- src/main/java/org/qortal/crosschain/Dogecoin.java | 4 ---- src/main/java/org/qortal/crosschain/Litecoin.java | 4 ---- src/main/java/org/qortal/crosschain/PirateChain.java | 5 ----- src/main/java/org/qortal/crosschain/Ravencoin.java | 4 ---- src/main/java/org/qortal/settings/Settings.java | 3 +-- 6 files changed, 1 insertion(+), 23 deletions(-) diff --git a/src/main/java/org/qortal/crosschain/Digibyte.java b/src/main/java/org/qortal/crosschain/Digibyte.java index bda6c18d..9d9f2171 100644 --- a/src/main/java/org/qortal/crosschain/Digibyte.java +++ b/src/main/java/org/qortal/crosschain/Digibyte.java @@ -46,10 +46,6 @@ public class Digibyte extends Bitcoiny { // Servers chosen on NO BASIS WHATSOEVER from various sources! // Status verified at https://1209k.com/bitcoin-eye/ele.php?chain=dgb new Server("electrum.qortal.link", Server.ConnectionType.SSL, 55002), - new Server("electrum1-dgb.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum2-dgb.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum3-dgb.qortal.online", Server.ConnectionType.SSL, 40002), - new Server("electrum4-dgb.qortal.online", Server.ConnectionType.SSL, 40002), new Server("electrum1.cipig.net", Server.ConnectionType.SSL, 20059), new Server("electrum2.cipig.net", Server.ConnectionType.SSL, 20059), new Server("electrum3.cipig.net", Server.ConnectionType.SSL, 20059) diff --git a/src/main/java/org/qortal/crosschain/Dogecoin.java b/src/main/java/org/qortal/crosschain/Dogecoin.java index c687ca60..433f115a 100644 --- a/src/main/java/org/qortal/crosschain/Dogecoin.java +++ b/src/main/java/org/qortal/crosschain/Dogecoin.java @@ -46,10 +46,6 @@ public class Dogecoin extends Bitcoiny { // Servers chosen on NO BASIS WHATSOEVER from various sources! // Status verified at https://1209k.com/bitcoin-eye/ele.php?chain=doge new Server("electrum.qortal.link", Server.ConnectionType.SSL, 54002), - new Server("electrum1-doge.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum2-doge.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum3-doge.qortal.online", Server.ConnectionType.SSL, 30002), - new Server("electrum4-doge.qortal.online", Server.ConnectionType.SSL, 30002), new Server("electrum1.cipig.net", Server.ConnectionType.SSL, 20060), new Server("electrum2.cipig.net", Server.ConnectionType.SSL, 20060), new Server("electrum3.cipig.net", Server.ConnectionType.SSL, 20060) diff --git a/src/main/java/org/qortal/crosschain/Litecoin.java b/src/main/java/org/qortal/crosschain/Litecoin.java index d87cd1a1..596935ba 100644 --- a/src/main/java/org/qortal/crosschain/Litecoin.java +++ b/src/main/java/org/qortal/crosschain/Litecoin.java @@ -46,10 +46,6 @@ public class Litecoin extends Bitcoiny { // Servers chosen on NO BASIS WHATSOEVER from various sources! // Status verified at https://1209k.com/bitcoin-eye/ele.php?chain=ltc new Server("electrum.qortal.link", Server.ConnectionType.SSL, 50002), - new Server("electrum1-ltc.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum2-ltc.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum3-ltc.qortal.online", Server.ConnectionType.SSL, 20002), - new Server("electrum4-ltc.qortal.online", Server.ConnectionType.SSL, 20002), new Server("backup.electrum-ltc.org", Server.ConnectionType.SSL, 443), new Server("electrum.ltc.xurious.com", Server.ConnectionType.SSL, 50002), new Server("electrum-ltc.petrkr.net", Server.ConnectionType.SSL, 60002), diff --git a/src/main/java/org/qortal/crosschain/PirateChain.java b/src/main/java/org/qortal/crosschain/PirateChain.java index 3f3cba47..434932d1 100644 --- a/src/main/java/org/qortal/crosschain/PirateChain.java +++ b/src/main/java/org/qortal/crosschain/PirateChain.java @@ -51,11 +51,6 @@ public class PirateChain extends Bitcoiny { public Collection getServers() { return Arrays.asList( // Servers chosen on NO BASIS WHATSOEVER from various sources! - new Server("wallet-arrr1.qortal.online", Server.ConnectionType.SSL, 443), - new Server("wallet-arrr2.qortal.online", Server.ConnectionType.SSL, 443), - new Server("wallet-arrr3.qortal.online", Server.ConnectionType.SSL, 443), - new Server("wallet-arrr4.qortal.online", Server.ConnectionType.SSL, 443), - new Server("wallet-arrr5.qortal.online", Server.ConnectionType.SSL, 443), new Server("lightd.pirate.black", Server.ConnectionType.SSL, 443) ); } diff --git a/src/main/java/org/qortal/crosschain/Ravencoin.java b/src/main/java/org/qortal/crosschain/Ravencoin.java index d9301f48..9adb1a06 100644 --- a/src/main/java/org/qortal/crosschain/Ravencoin.java +++ b/src/main/java/org/qortal/crosschain/Ravencoin.java @@ -46,10 +46,6 @@ public class Ravencoin extends Bitcoiny { // Servers chosen on NO BASIS WHATSOEVER from various sources! // Status verified at https://1209k.com/bitcoin-eye/ele.php?chain=rvn new Server("electrum.qortal.link", Server.ConnectionType.SSL, 56002), - new Server("electrum1-rvn.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum2-rvn.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum3-rvn.qortal.online", Server.ConnectionType.SSL, 50002), - new Server("electrum4-rvn.qortal.online", Server.ConnectionType.SSL, 50002), new Server("electrum1.cipig.net", Server.ConnectionType.SSL, 20051), new Server("electrum2.cipig.net", Server.ConnectionType.SSL, 20051), new Server("electrum3.cipig.net", Server.ConnectionType.SSL, 20051), diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java index 533e1639..973be319 100644 --- a/src/main/java/org/qortal/settings/Settings.java +++ b/src/main/java/org/qortal/settings/Settings.java @@ -272,8 +272,7 @@ public class Settings { private String[] bootstrapHosts = new String[] { "http://bootstrap.qortal.org", "http://bootstrap2.qortal.org", - "http://bootstrap3.qortal.org", - "http://bootstrap.qortal.online" + "http://bootstrap3.qortal.org" }; // Auto-update sources From 6051b85e5212827fdf0f19dd1b6199a402d1e2ad Mon Sep 17 00:00:00 2001 From: QuickMythril Date: Sun, 21 Jan 2024 08:42:05 -0500 Subject: [PATCH 35/47] Remove out of service --- src/main/java/org/qortal/crosschain/Digibyte.java | 3 +-- src/main/java/org/qortal/crosschain/Ravencoin.java | 1 - 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/qortal/crosschain/Digibyte.java b/src/main/java/org/qortal/crosschain/Digibyte.java index cfca9f3f..9d9f2171 100644 --- a/src/main/java/org/qortal/crosschain/Digibyte.java +++ b/src/main/java/org/qortal/crosschain/Digibyte.java @@ -48,8 +48,7 @@ public class Digibyte extends Bitcoiny { new Server("electrum.qortal.link", Server.ConnectionType.SSL, 55002), new Server("electrum1.cipig.net", Server.ConnectionType.SSL, 20059), new Server("electrum2.cipig.net", Server.ConnectionType.SSL, 20059), - new Server("electrum3.cipig.net", Server.ConnectionType.SSL, 20059), - new Server("electrum3-dgb.qortal.online", Server.ConnectionType.SSL, 40002) + new Server("electrum3.cipig.net", Server.ConnectionType.SSL, 20059) ); } diff --git a/src/main/java/org/qortal/crosschain/Ravencoin.java b/src/main/java/org/qortal/crosschain/Ravencoin.java index e5ff9c98..9adb1a06 100644 --- a/src/main/java/org/qortal/crosschain/Ravencoin.java +++ b/src/main/java/org/qortal/crosschain/Ravencoin.java @@ -49,7 +49,6 @@ public class Ravencoin extends Bitcoiny { new Server("electrum1.cipig.net", Server.ConnectionType.SSL, 20051), new Server("electrum2.cipig.net", Server.ConnectionType.SSL, 20051), new Server("electrum3.cipig.net", Server.ConnectionType.SSL, 20051), - new Server("electrum3-rvn.qortal.online", Server.ConnectionType.SSL, 50002), new Server("rvn-dashboard.com", Server.ConnectionType.SSL, 50002), new Server("rvn4lyfe.com", Server.ConnectionType.SSL, 50002) ); From 2120490f4bcfeee9e3549e683f25b17dd1f49ee7 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Tue, 30 Jan 2024 17:36:17 +0100 Subject: [PATCH 36/47] Fix wrong penaties This will set incorrectly penalized accounts from previous algo run back to previous state. --- .../qortal/account/SelfSponsorshipAlgoV1.java | 12 +- src/main/java/org/qortal/block/Block.java | 18 +- .../java/org/qortal/block/BlockChain.java | 41 +- .../java/org/qortal/block/PenaltyFix.java | 187 + .../block/SelfSponsorshipAlgoV1Block.java | 6 +- .../hsqldb/HSQLDBDatabaseUpdates.java | 5 + .../java/org/qortal/settings/Settings.java | 2 +- .../transaction/RewardShareTransaction.java | 6 + .../org/qortal/transaction/Transaction.java | 1 + .../transaction/TransferPrivsTransaction.java | 19 + src/main/resources/blockchain.json | 9 +- .../i18n/TransactionValidity_de.properties | 2 + .../i18n/TransactionValidity_en.properties | 2 + .../i18n/TransactionValidity_es.properties | 2 + .../i18n/TransactionValidity_fi.properties | 2 + .../i18n/TransactionValidity_fr.properties | 2 + .../i18n/TransactionValidity_he.properties | 2 + .../i18n/TransactionValidity_hu.properties | 2 + .../i18n/TransactionValidity_it.properties | 2 + .../i18n/TransactionValidity_jp.properties | 2 + .../i18n/TransactionValidity_ko.properties | 2 + .../i18n/TransactionValidity_nl.properties | 2 + .../i18n/TransactionValidity_pl.properties | 1 + .../i18n/TransactionValidity_ro.properties | 2 + .../i18n/TransactionValidity_ru.properties | 2 + .../i18n/TransactionValidity_sv.properties | 2 + .../i18n/TransactionValidity_zh_CN.properties | 2 + .../i18n/TransactionValidity_zh_TW.properties | 2 + src/main/resources/penalty-fix.json | 4729 +++++++++++++++++ .../java/org/qortal/test/PenaltyFixTests.java | 82 + .../test/SelfSponsorshipAlgoV1Tests.java | 2 +- .../test-chain-v2-block-timestamps.json | 7 +- .../test-chain-v2-disable-reference.json | 7 +- .../test-chain-v2-founder-rewards.json | 7 +- .../test-chain-v2-leftover-reward.json | 7 +- src/test/resources/test-chain-v2-minting.json | 7 +- .../resources/test-chain-v2-penalty-fix.json | 130 + .../test-chain-v2-qora-holder-extremes.json | 7 +- .../test-chain-v2-qora-holder-reduction.json | 7 +- .../resources/test-chain-v2-qora-holder.json | 7 +- .../test-chain-v2-reward-levels.json | 7 +- .../test-chain-v2-reward-scaling.json | 7 +- .../test-chain-v2-reward-shares.json | 7 +- ...st-chain-v2-self-sponsorship-algo-v1.json} | 7 +- src/test/resources/test-chain-v2.json | 7 +- .../test-settings-v2-penalty-fix.json | 20 + ...settings-v2-self-sponsorship-algo-v1.json} | 2 +- 47 files changed, 5358 insertions(+), 37 deletions(-) create mode 100644 src/main/java/org/qortal/block/PenaltyFix.java create mode 100644 src/main/resources/penalty-fix.json create mode 100644 src/test/java/org/qortal/test/PenaltyFixTests.java create mode 100644 src/test/resources/test-chain-v2-penalty-fix.json rename src/test/resources/{test-chain-v2-self-sponsorship-algo.json => test-chain-v2-self-sponsorship-algo-v1.json} (95%) create mode 100644 src/test/resources/test-settings-v2-penalty-fix.json rename src/test/resources/{test-settings-v2-self-sponsorship-algo.json => test-settings-v2-self-sponsorship-algo-v1.json} (95%) diff --git a/src/main/java/org/qortal/account/SelfSponsorshipAlgoV1.java b/src/main/java/org/qortal/account/SelfSponsorshipAlgoV1.java index 2ed57f34..65092602 100644 --- a/src/main/java/org/qortal/account/SelfSponsorshipAlgoV1.java +++ b/src/main/java/org/qortal/account/SelfSponsorshipAlgoV1.java @@ -2,7 +2,6 @@ package org.qortal.account; import org.qortal.api.resource.TransactionsResource; import org.qortal.asset.Asset; -import org.qortal.block.BlockChain; import org.qortal.data.account.AccountData; import org.qortal.data.naming.NameData; import org.qortal.data.transaction.*; @@ -27,7 +26,6 @@ public class SelfSponsorshipAlgoV1 { private int consolidationCount = 0; private int bulkIssuanceCount = 0; private int recentSponsorshipCount = 0; - private int transferAssetsCount = 0; private List sponsorshipRewardShares = new ArrayList<>(); private final Map> paymentsByAddress = new HashMap<>(); @@ -35,7 +33,6 @@ public class SelfSponsorshipAlgoV1 { private Set consolidatedAddresses = new LinkedHashSet<>(); private final Set zeroTransactionAddreses = new LinkedHashSet<>(); private final Set penaltyAddresses = new LinkedHashSet<>(); - private final Set transferAssetsByAddress = new LinkedHashSet<>(); public SelfSponsorshipAlgoV1(Repository repository, String address, long snapshotTimestamp, boolean override) throws DataException { this.repository = repository; @@ -70,7 +67,6 @@ public class SelfSponsorshipAlgoV1 { this.findBulkIssuance(); this.findRegisteredNameCount(); this.findRecentSponsorshipCount(); - this.transferAssetsCount = this.transferAssetsByAddress.size(); int score = this.calculateScore(); if (score <= 0 && !override) { @@ -225,9 +221,7 @@ public class SelfSponsorshipAlgoV1 { } private void findRecentSponsorshipCount() { - long snapshotTimestampBefore = BlockChain.getInstance().getSelfSponsorshipAlgoV1SnapshotTimestamp(); - long diffTimeBetween = this.snapshotTimestamp - snapshotTimestampBefore; - final long referenceTimestamp = this.snapshotTimestamp - diffTimeBetween; + final long referenceTimestamp = this.snapshotTimestamp - (365 * 24 * 60 * 60 * 1000L); int recentSponsorshipCount = 0; for (RewardShareTransactionData rewardShare : sponsorshipRewardShares) { if (rewardShare.getTimestamp() >= referenceTimestamp) { @@ -238,13 +232,12 @@ public class SelfSponsorshipAlgoV1 { } private int calculateScore() { - final int transferAssetsMultiplier = (this.transferAssetsCount >= 5) ? 10 : 1; final int suspiciousMultiplier = (this.suspiciousCount >= 100) ? this.suspiciousPercent : 1; final int nameMultiplier = (this.sponsees.size() >= 50 && this.registeredNameCount == 0) ? 2 : 1; final int consolidationMultiplier = Math.max(this.consolidationCount, 1); final int bulkIssuanceMultiplier = Math.max(this.bulkIssuanceCount / 2, 1); final int offset = 9; - return transferAssetsMultiplier * suspiciousMultiplier * nameMultiplier * consolidationMultiplier * bulkIssuanceMultiplier - offset; + return suspiciousMultiplier * nameMultiplier * consolidationMultiplier * bulkIssuanceMultiplier - offset; } private void fetchSponsorshipRewardShares() throws DataException { @@ -329,7 +322,6 @@ public class SelfSponsorshipAlgoV1 { if (!Objects.equals(transferAssetTransactionData.getRecipient(), address)) { // Outgoing payment from this account outgoingPaymentRecipients.add(transferAssetTransactionData.getRecipient()); - this.transferAssetsByAddress.add(transferAssetTransactionData.getRecipient()); } } break; diff --git a/src/main/java/org/qortal/block/Block.java b/src/main/java/org/qortal/block/Block.java index 475de70a..fb7cfada 100644 --- a/src/main/java/org/qortal/block/Block.java +++ b/src/main/java/org/qortal/block/Block.java @@ -1553,9 +1553,14 @@ public class Block { Block212937.processFix(this); } - if (this.blockData.getHeight() == BlockChain.getInstance().getUnconfirmableRewardSharesHeight()) { + if (this.blockData.getHeight() == BlockChain.getInstance().getSelfSponsorshipAlgoV1Height()) { SelfSponsorshipAlgoV1Block.processAccountPenalties(this); } + + if (this.blockData.getHeight() == BlockChain.getInstance().getPenaltyFixHeight()) { + // Apply fix for penalties + PenaltyFix.processPenaltiesFix(this); + } } // We're about to (test-)process a batch of transactions, @@ -1840,12 +1845,19 @@ public class Block { // Invalidate expandedAccounts as they may have changed due to orphaning TRANSFER_PRIVS transactions, etc. this.cachedExpandedAccounts = null; - if (this.blockData.getHeight() == 212937) + if (this.blockData.getHeight() == 212937) { // Revert fix for block 212937 Block212937.orphanFix(this); + } - else if (this.blockData.getHeight() == BlockChain.getInstance().getSelfSponsorshipAlgoV1Height()) + if (this.blockData.getHeight() == BlockChain.getInstance().getSelfSponsorshipAlgoV1Height()) { SelfSponsorshipAlgoV1Block.orphanAccountPenalties(this); + } + + if (this.blockData.getHeight() == BlockChain.getInstance().getPenaltyFixHeight()) { + // Revert fix for penalties + PenaltyFix.orphanPenaltiesFix(this); + } // Account levels and block rewards are only processed/orphaned on block reward distribution blocks if (this.isRewardDistributionBlock()) { diff --git a/src/main/java/org/qortal/block/BlockChain.java b/src/main/java/org/qortal/block/BlockChain.java index 8013e7a5..57c6a190 100644 --- a/src/main/java/org/qortal/block/BlockChain.java +++ b/src/main/java/org/qortal/block/BlockChain.java @@ -73,10 +73,14 @@ public class BlockChain { increaseOnlineAccountsDifficultyTimestamp, onlineAccountMinterLevelValidationHeight, selfSponsorshipAlgoV1Height, + selfSponsorshipAlgoV2Height, feeValidationFixTimestamp, chatReferenceTimestamp, arbitraryOptionalFeeTimestamp, - unconfirmableRewardSharesHeight; + unconfirmableRewardSharesHeight, + disableTransferPrivsTimestamp, + enableTransferPrivsTimestamp, + penaltyFixHeight } // Custom transaction fees @@ -199,6 +203,7 @@ public class BlockChain { /** Minimum time to retain online account signatures (ms) for block validity checks. */ private long onlineAccountSignaturesMinLifetime; + /** Maximum time to retain online account signatures (ms) for block validity checks, to allow for clock variance. */ private long onlineAccountSignaturesMaxLifetime; @@ -209,6 +214,9 @@ public class BlockChain { /** Snapshot timestamp for self sponsorship algo V1 */ private long selfSponsorshipAlgoV1SnapshotTimestamp; + /** Snapshot timestamp for self sponsorship algo V2 */ + private long selfSponsorshipAlgoV2SnapshotTimestamp; + /** Feature-trigger timestamp to modify behaviour of various transactions that support mempow */ private long mempowTransactionUpdatesTimestamp; @@ -225,6 +233,8 @@ public class BlockChain { * data and to base online accounts decisions on. */ private int blockRewardBatchAccountsBlockCount; + private String penaltyFixHash; + /** Max reward shares by block height */ public static class MaxRewardSharesByTimestamp { public long timestamp; @@ -267,7 +277,7 @@ public class BlockChain { try { // Create JAXB context aware of Settings jc = JAXBContextFactory.createContext(new Class[] { - BlockChain.class, GenesisBlock.GenesisInfo.class + BlockChain.class, GenesisBlock.GenesisInfo.class }, null); // Create unmarshaller @@ -395,12 +405,20 @@ public class BlockChain { return this.blockRewardBatchAccountsBlockCount; } + public String getPenaltyFixHash() { + return this.penaltyFixHash; + } - // Self sponsorship algo + // Self sponsorship algo V1 public long getSelfSponsorshipAlgoV1SnapshotTimestamp() { return this.selfSponsorshipAlgoV1SnapshotTimestamp; } + // Self sponsorship algo V2 + public long getSelfSponsorshipAlgoV2SnapshotTimestamp() { + return this.selfSponsorshipAlgoV2SnapshotTimestamp; + } + // Feature-trigger timestamp to modify behaviour of various transactions that support mempow public long getMemPoWTransactionUpdatesTimestamp() { return this.mempowTransactionUpdatesTimestamp; @@ -541,6 +559,10 @@ public class BlockChain { return this.featureTriggers.get(FeatureTrigger.selfSponsorshipAlgoV1Height.name()).intValue(); } + public int getSelfSponsorshipAlgoV2Height() { + return this.featureTriggers.get(FeatureTrigger.selfSponsorshipAlgoV2Height.name()).intValue(); + } + public long getOnlineAccountMinterLevelValidationHeight() { return this.featureTriggers.get(FeatureTrigger.onlineAccountMinterLevelValidationHeight.name()).intValue(); } @@ -561,6 +583,17 @@ public class BlockChain { return this.featureTriggers.get(FeatureTrigger.unconfirmableRewardSharesHeight.name()).intValue(); } + public long getDisableTransferPrivsTimestamp() { + return this.featureTriggers.get(FeatureTrigger.disableTransferPrivsTimestamp.name()).longValue(); + } + + public long getEnableTransferPrivsTimestamp() { + return this.featureTriggers.get(FeatureTrigger.enableTransferPrivsTimestamp.name()).longValue(); + } + + public int getPenaltyFixHeight() { + return this.featureTriggers.get(FeatureTrigger.penaltyFixHeight.name()).intValue(); + } // More complex getters for aspects that change by height or timestamp @@ -747,7 +780,7 @@ public class BlockChain { /** * Some sort of start-up/initialization/checking method. - * + * * @throws SQLException */ public static void validate() throws DataException { diff --git a/src/main/java/org/qortal/block/PenaltyFix.java b/src/main/java/org/qortal/block/PenaltyFix.java new file mode 100644 index 00000000..a1a1e89c --- /dev/null +++ b/src/main/java/org/qortal/block/PenaltyFix.java @@ -0,0 +1,187 @@ +package org.qortal.block; + +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.eclipse.persistence.jaxb.JAXBContextFactory; +import org.eclipse.persistence.jaxb.UnmarshallerProperties; +import org.qortal.api.model.AccountPenaltyStats; +import org.qortal.crypto.Crypto; +import org.qortal.data.account.AccountData; +import org.qortal.data.account.AccountPenaltyData; +import org.qortal.repository.DataException; +import org.qortal.repository.Repository; +import org.qortal.utils.Base58; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.JAXBException; +import javax.xml.bind.UnmarshalException; +import javax.xml.bind.Unmarshaller; +import javax.xml.transform.stream.StreamSource; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.stream.Collectors; + +public final class PenaltyFix { + + private static final Logger LOGGER = LogManager.getLogger(PenaltyFix.class); + + private static final String PENALTY_FIX_SOURCE = "penalty-fix.json"; + private static final String PENALTY_FIX_HASH = BlockChain.getInstance().getPenaltyFixHash(); + private static final List penalties = accountsPenaltyFix(); + + private PenaltyFix() { + /* Do not instantiate */ + } + + @SuppressWarnings("unchecked") + private static List accountsPenaltyFix() { + Unmarshaller unmarshaller; + + try { + // Create JAXB context aware of classes we need to unmarshal + JAXBContext pf = JAXBContextFactory.createContext(new Class[] { + AccountPenaltyData.class + }, null); + + // Create unmarshaller + unmarshaller = pf.createUnmarshaller(); + + // Set the unmarshaller media type to JSON + unmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, "application/json"); + + // Tell unmarshaller that there's no JSON root element in the JSON input + unmarshaller.setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT, false); + } catch (JAXBException e) { + String message = "Failed to setup unmarshaller for penalty fix"; + LOGGER.error(message, e); + throw new RuntimeException(message, e); + } + + ClassLoader classLoader = BlockChain.class.getClassLoader(); + InputStream pfIn = classLoader.getResourceAsStream(PENALTY_FIX_SOURCE); + StreamSource pfSource = new StreamSource(pfIn); + + try { + // Attempt to unmarshal JSON stream to BlockChain config + return (List) unmarshaller.unmarshal(pfSource, AccountPenaltyData.class).getValue(); + } catch (UnmarshalException e) { + String message = "Failed to parse penalty fix"; + LOGGER.error(message, e); + throw new RuntimeException(message, e); + } catch (JAXBException e) { + String message = "Unexpected JAXB issue while processing penalty fix"; + LOGGER.error(message, e); + throw new RuntimeException(message, e); + } + } + + public static void processPenaltiesFix(Block block) throws DataException { + + // Create reverse penalties + List reversePenalties = penalties.stream() + .map(penalty -> new AccountPenaltyData(penalty.getAddress(), 0 +5000000)) + .collect(Collectors.toList()); + + Set penaltiesFix = new HashSet(reversePenalties); + + final String PENALTY_FIX_HASH_VERIFY = getHash(penaltiesFix.stream().map(p -> p.getAddress()).collect(Collectors.toList())); + + // Verify if we are on same penalty hash + if (PENALTY_FIX_HASH.equals(PENALTY_FIX_HASH_VERIFY)) { + LOGGER.info("Verify hash passed! Running process penalty fix - this will take a while..."); + logPenaltyStats(block.repository); + long startTime = System.currentTimeMillis(); + block.repository.getAccountRepository().updateBlocksMintedPenalties(penaltiesFix); + long totalTime = System.currentTimeMillis() - startTime; + LOGGER.info("{} penalty addresses processed. Total time taken: {} seconds", reversePenalties.size(), (int)(totalTime / 1000.0f)); + logPenaltyStats(block.repository); + + int updatedCount = updateAccountLevels(block.repository, penaltiesFix); + LOGGER.info("Account levels updated for {} penalty addresses", updatedCount); + } else { + LOGGER.info("Verify hash failed! Stopping process penalty fix!"); + } + } + + public static void orphanPenaltiesFix(Block block) throws DataException { + + // Create inverse penalties + List inversePenalties = penalties.stream() + .map(penalty -> new AccountPenaltyData(penalty.getAddress(), 0 -5000000)) + .collect(Collectors.toList()); + + Set penaltiesFix = new HashSet(inversePenalties); + + final String PENALTY_FIX_HASH_VERIFY = getHash(penaltiesFix.stream().map(p -> p.getAddress()).collect(Collectors.toList())); + + // Verify if we are on same penalty hash + if (PENALTY_FIX_HASH.equals(PENALTY_FIX_HASH_VERIFY)) { + LOGGER.info("Verify hash passed! Running orphan penalty fix - this will take a while..."); + logPenaltyStats(block.repository); + long startTime = System.currentTimeMillis(); + block.repository.getAccountRepository().updateBlocksMintedPenalties(penaltiesFix); + long totalTime = System.currentTimeMillis() - startTime; + LOGGER.info("{} penalty addresses processed. Total time taken: {} seconds", inversePenalties.size(), (int)(totalTime / 1000.0f)); + logPenaltyStats(block.repository); + + int updatedCount = updateAccountLevels(block.repository, penaltiesFix); + LOGGER.info("Account levels updated for {} penalty addresses", updatedCount); + } else { + LOGGER.info("Verify hash failed! Stopping orphan penalty fix!"); + } + } + + private static int updateAccountLevels(Repository repository, Set accountPenalties) throws DataException { + final List cumulativeBlocksByLevel = BlockChain.getInstance().getCumulativeBlocksByLevel(); + final int maximumLevel = cumulativeBlocksByLevel.size() - 1; + + int updatedCount = 0; + + for (AccountPenaltyData penaltyData : accountPenalties) { + AccountData accountData = repository.getAccountRepository().getAccount(penaltyData.getAddress()); + final int effectiveBlocksMinted = accountData.getBlocksMinted() + accountData.getBlocksMintedAdjustment() + accountData.getBlocksMintedPenalty(); + + // Shortcut for penalties + if (effectiveBlocksMinted < 0) { + accountData.setLevel(0); + repository.getAccountRepository().setLevel(accountData); + updatedCount++; + LOGGER.trace(() -> String.format("Block minter %s dropped to level %d", accountData.getAddress(), accountData.getLevel())); + continue; + } + + for (int newLevel = maximumLevel; newLevel >= 0; --newLevel) { + if (effectiveBlocksMinted >= cumulativeBlocksByLevel.get(newLevel)) { + accountData.setLevel(newLevel); + repository.getAccountRepository().setLevel(accountData); + updatedCount++; + LOGGER.trace(() -> String.format("Block minter %s increased to level %d", accountData.getAddress(), accountData.getLevel())); + break; + } + } + } + return updatedCount; + } + + private static void logPenaltyStats(Repository repository) { + try { + LOGGER.info(getPenaltyStats(repository)); + } catch (DataException e) {} + } + + private static AccountPenaltyStats getPenaltyStats(Repository repository) throws DataException { + List accounts = repository.getAccountRepository().getPenaltyAccounts(); + return AccountPenaltyStats.fromAccounts(accounts); + } + + public static String getHash(List penaltyAddresses) { + if (penaltyAddresses == null || penaltyAddresses.isEmpty()) { + return null; + } + + Collections.sort(penaltyAddresses); + return Base58.encode(Crypto.digest(StringUtils.join(penaltyAddresses).getBytes(StandardCharsets.UTF_8))); + } +} \ No newline at end of file diff --git a/src/main/java/org/qortal/block/SelfSponsorshipAlgoV1Block.java b/src/main/java/org/qortal/block/SelfSponsorshipAlgoV1Block.java index cea97593..27b50a81 100644 --- a/src/main/java/org/qortal/block/SelfSponsorshipAlgoV1Block.java +++ b/src/main/java/org/qortal/block/SelfSponsorshipAlgoV1Block.java @@ -28,7 +28,6 @@ public final class SelfSponsorshipAlgoV1Block { private static final Logger LOGGER = LogManager.getLogger(SelfSponsorshipAlgoV1Block.class); - private SelfSponsorshipAlgoV1Block() { /* Do not instantiate */ } @@ -64,7 +63,7 @@ public final class SelfSponsorshipAlgoV1Block { } public static Set getAccountPenalties(Repository repository, int penalty) throws DataException { - final long snapshotTimestamp = System.currentTimeMillis() - 10000; + final long snapshotTimestamp = BlockChain.getInstance().getSelfSponsorshipAlgoV1SnapshotTimestamp(); Set penalties = new LinkedHashSet<>(); List addresses = repository.getTransactionRepository().getConfirmedRewardShareCreatorsExcludingSelfShares(); for (String address : addresses) { @@ -132,4 +131,5 @@ public final class SelfSponsorshipAlgoV1Block { Collections.sort(penaltyAddresses); return Base58.encode(Crypto.digest(StringUtils.join(penaltyAddresses).getBytes(StandardCharsets.UTF_8))); } -} + +} \ No newline at end of file diff --git a/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java b/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java index 829f7aab..54af22e9 100644 --- a/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java +++ b/src/main/java/org/qortal/repository/hsqldb/HSQLDBDatabaseUpdates.java @@ -1047,6 +1047,11 @@ public class HSQLDBDatabaseUpdates { stmt.execute("CREATE INDEX ArbitraryIdentifierIndex ON ArbitraryTransactions (identifier)"); break; + case 49: + // Update blocks minted penalty + stmt.execute("UPDATE Accounts SET blocks_minted_penalty = -5000000 WHERE blocks_minted_penalty < 0"); + break; + default: // nothing to do return false; diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java index 973be319..3ca86cc0 100644 --- a/src/main/java/org/qortal/settings/Settings.java +++ b/src/main/java/org/qortal/settings/Settings.java @@ -211,7 +211,7 @@ public class Settings { public long recoveryModeTimeout = 9999999999999L; /** Minimum peer version number required in order to sync with them */ - private String minPeerVersion = "4.4.1"; + private String minPeerVersion = "4.4.2"; /** Whether to allow connections with peers below minPeerVersion * If true, we won't sync with them but they can still sync with us, and will show in the peers list * If false, sync will be blocked both ways, and they will not appear in the peers list */ diff --git a/src/main/java/org/qortal/transaction/RewardShareTransaction.java b/src/main/java/org/qortal/transaction/RewardShareTransaction.java index 1b608a0c..45d48206 100644 --- a/src/main/java/org/qortal/transaction/RewardShareTransaction.java +++ b/src/main/java/org/qortal/transaction/RewardShareTransaction.java @@ -183,12 +183,18 @@ public class RewardShareTransaction extends Transaction { @Override public boolean isConfirmableAtHeight(int height) { + final int min = BlockChain.getInstance().getPenaltyFixHeight() - 50; + final int max = BlockChain.getInstance().getPenaltyFixHeight() + 50; if (height >= BlockChain.getInstance().getUnconfirmableRewardSharesHeight()) { // Not confirmable in online accounts or distribution blocks if (Block.isOnlineAccountsBlock(height) || Block.isBatchRewardDistributionBlock(height)) { return false; } } + // Not confirmable on penalty fix + if (height > min && height < max) { + return false; + } return true; } diff --git a/src/main/java/org/qortal/transaction/Transaction.java b/src/main/java/org/qortal/transaction/Transaction.java index 0b4f6e90..c142fff8 100644 --- a/src/main/java/org/qortal/transaction/Transaction.java +++ b/src/main/java/org/qortal/transaction/Transaction.java @@ -246,6 +246,7 @@ public abstract class Transaction { NAME_BLOCKED(97), GROUP_APPROVAL_REQUIRED(98), ACCOUNT_NOT_TRANSFERABLE(99), + TRANSFER_PRIVS_DISABLED(100), INVALID_BUT_OK(999), NOT_YET_RELEASED(1000), NOT_SUPPORTED(1001); diff --git a/src/main/java/org/qortal/transaction/TransferPrivsTransaction.java b/src/main/java/org/qortal/transaction/TransferPrivsTransaction.java index de3038d8..588f0d09 100644 --- a/src/main/java/org/qortal/transaction/TransferPrivsTransaction.java +++ b/src/main/java/org/qortal/transaction/TransferPrivsTransaction.java @@ -4,6 +4,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.qortal.account.Account; import org.qortal.asset.Asset; +import org.qortal.block.Block; import org.qortal.block.BlockChain; import org.qortal.crypto.Crypto; import org.qortal.data.account.AccountData; @@ -72,6 +73,13 @@ public class TransferPrivsTransaction extends Transaction { if (senderAccountData == null || senderAccountData.getBlocksMintedPenalty() != 0) return ValidationResult.ACCOUNT_NOT_TRANSFERABLE; + // Disable Transfer Privs (start - end) from feature trigger + long transactionTimestamp = this.transferPrivsTransactionData.getTimestamp(); + final long startTimestamp = BlockChain.getInstance().getDisableTransferPrivsTimestamp(); + final long endTimestamp = BlockChain.getInstance().getEnableTransferPrivsTimestamp(); + if (transactionTimestamp > startTimestamp && transactionTimestamp < endTimestamp) + return ValidationResult.TRANSFER_PRIVS_DISABLED; + return ValidationResult.OK; } @@ -80,6 +88,17 @@ public class TransferPrivsTransaction extends Transaction { // Nothing to do } + @Override + public boolean isConfirmableAtHeight(int height) { + if (height >= BlockChain.getInstance().getUnconfirmableRewardSharesHeight()) { + // Not confirmable in online accounts or distribution blocks + if (Block.isOnlineAccountsBlock(height) || Block.isBatchRewardDistributionBlock(height)) { + return false; + } + } + return true; + } + @Override public void process() throws DataException { Account sender = this.getSender(); diff --git a/src/main/resources/blockchain.json b/src/main/resources/blockchain.json index 8631fbf4..c0210fab 100644 --- a/src/main/resources/blockchain.json +++ b/src/main/resources/blockchain.json @@ -30,10 +30,12 @@ "onlineAccountSignaturesMaxLifetime": 86400000, "onlineAccountsModulusV2Timestamp": 1659801600000, "selfSponsorshipAlgoV1SnapshotTimestamp": 1670230000000, + "selfSponsorshipAlgoV2SnapshotTimestamp": 1706745600000, "mempowTransactionUpdatesTimestamp": 1693558800000, "blockRewardBatchStartHeight": 1508000, "blockRewardBatchSize": 1000, "blockRewardBatchAccountsBlockCount": 25, + "penaltyFixHash": "DG23E4Y63wC8FquG9FKAnfKwatvdJV3Z3iYnozMHn2A3", "rewardsByHeight": [ { "height": 1, "reward": 5.00 }, { "height": 259201, "reward": 4.75 }, @@ -93,10 +95,15 @@ "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, "onlineAccountMinterLevelValidationHeight": 1092000, "selfSponsorshipAlgoV1Height": 1092400, + "selfSponsorshipAlgoV2Height": 9999999, "feeValidationFixTimestamp": 1671918000000, "chatReferenceTimestamp": 1674316800000, "arbitraryOptionalFeeTimestamp": 1680278400000, - "unconfirmableRewardSharesHeight": 1575500 + "unconfirmableRewardSharesHeight": 1575500, + "disableTransferPrivsTimestamp": 1706745000000, + "enableTransferPrivsTimestamp": 1709251200000, + "penaltyFixHeight": 1589200 + }, "checkpoints": [ { "height": 1136300, "signature": "3BbwawEF2uN8Ni5ofpJXkukoU8ctAPxYoFB7whq9pKfBnjfZcpfEJT4R95NvBDoTP8WDyWvsUvbfHbcr9qSZuYpSKZjUQTvdFf6eqznHGEwhZApWfvXu6zjGCxYCp65F4jsVYYJjkzbjmkCg5WAwN5voudngA23kMK6PpTNygapCzXt" } diff --git a/src/main/resources/i18n/TransactionValidity_de.properties b/src/main/resources/i18n/TransactionValidity_de.properties index eab7fb9e..bdb88a29 100644 --- a/src/main/resources/i18n/TransactionValidity_de.properties +++ b/src/main/resources/i18n/TransactionValidity_de.properties @@ -193,3 +193,5 @@ TRANSACTION_ALREADY_EXISTS = Transaktion existiert bereits TRANSACTION_UNKNOWN = Transaktion unbekannt TX_GROUP_ID_MISMATCH = die Gruppen-ID der Transaktion stimmt nicht überein + +TRANSFER_PRIVS_DISABLED = Übertragungsberechtigungen deaktiviert diff --git a/src/main/resources/i18n/TransactionValidity_en.properties b/src/main/resources/i18n/TransactionValidity_en.properties index 3f33771d..0bfeeef2 100644 --- a/src/main/resources/i18n/TransactionValidity_en.properties +++ b/src/main/resources/i18n/TransactionValidity_en.properties @@ -193,3 +193,5 @@ TRANSACTION_ALREADY_EXISTS = transaction already exists TRANSACTION_UNKNOWN = transaction unknown TX_GROUP_ID_MISMATCH = transaction's group ID does not match + +TRANSFER_PRIVS_DISABLED = transfer privileges disabled diff --git a/src/main/resources/i18n/TransactionValidity_es.properties b/src/main/resources/i18n/TransactionValidity_es.properties index 7c357009..b3e981ae 100644 --- a/src/main/resources/i18n/TransactionValidity_es.properties +++ b/src/main/resources/i18n/TransactionValidity_es.properties @@ -193,3 +193,5 @@ TRANSACTION_ALREADY_EXISTS = la transacción ya existe TRANSACTION_UNKNOWN = transacción desconocida TX_GROUP_ID_MISMATCH = el ID de grupo de la transacción no coincide + +TRANSFER_PRIVS_DISABLED = privilegios de transferencia deshabilitados diff --git a/src/main/resources/i18n/TransactionValidity_fi.properties b/src/main/resources/i18n/TransactionValidity_fi.properties index ec658bc1..1a9b9f31 100644 --- a/src/main/resources/i18n/TransactionValidity_fi.properties +++ b/src/main/resources/i18n/TransactionValidity_fi.properties @@ -193,3 +193,5 @@ TRANSACTION_ALREADY_EXISTS = transaktio on jo olemassa TRANSACTION_UNKNOWN = tuntematon transaktio TX_GROUP_ID_MISMATCH = transaktion ryhmä-ID:n vastaavuusvirhe + +TRANSFER_PRIVS_DISABLED = siirtooikeudet poistettu käytöstä diff --git a/src/main/resources/i18n/TransactionValidity_fr.properties b/src/main/resources/i18n/TransactionValidity_fr.properties index e030bc0d..75fcf369 100644 --- a/src/main/resources/i18n/TransactionValidity_fr.properties +++ b/src/main/resources/i18n/TransactionValidity_fr.properties @@ -193,3 +193,5 @@ TRANSACTION_ALREADY_EXISTS = la transaction existe déjà TRANSACTION_UNKNOWN = transaction inconnue TX_GROUP_ID_MISMATCH = l'identifiant du groupe de transaction ne correspond pas + +TRANSFER_PRIVS_DISABLED = privilèges de transfert désactivés diff --git a/src/main/resources/i18n/TransactionValidity_he.properties b/src/main/resources/i18n/TransactionValidity_he.properties index 889d7b78..427f01e3 100644 --- a/src/main/resources/i18n/TransactionValidity_he.properties +++ b/src/main/resources/i18n/TransactionValidity_he.properties @@ -193,3 +193,5 @@ TRANSACTION_ALREADY_EXISTS = עסקה כבר קיימת TRANSACTION_UNKNOWN = עסקה לא ידועה TX_GROUP_ID_MISMATCH = מזהה הקבוצה של העסקה אינו תואם + +TRANSFER_PRIVS_DISABLED = הרשאות העברה מושבתות diff --git a/src/main/resources/i18n/TransactionValidity_hu.properties b/src/main/resources/i18n/TransactionValidity_hu.properties index 1b2558bb..77e7dcff 100644 --- a/src/main/resources/i18n/TransactionValidity_hu.properties +++ b/src/main/resources/i18n/TransactionValidity_hu.properties @@ -193,3 +193,5 @@ TRANSACTION_ALREADY_EXISTS = ez a tranzakció már létezik TRANSACTION_UNKNOWN = ismeretlen tranzakció TX_GROUP_ID_MISMATCH = a tranzakció csoportazonosítója nem egyezik + +TRANSFER_PRIVS_DISABLED = átviteli jogosultságok letiltva diff --git a/src/main/resources/i18n/TransactionValidity_it.properties b/src/main/resources/i18n/TransactionValidity_it.properties index 390f914a..02a13667 100644 --- a/src/main/resources/i18n/TransactionValidity_it.properties +++ b/src/main/resources/i18n/TransactionValidity_it.properties @@ -193,3 +193,5 @@ TRANSACTION_ALREADY_EXISTS = la transazione già esiste TRANSACTION_UNKNOWN = transazione sconosciuta TX_GROUP_ID_MISMATCH = identificazione di gruppo della transazione non corrisponde + +TRANSFER_PRIVS_DISABLED = privilegi di trasferimento disabilitati diff --git a/src/main/resources/i18n/TransactionValidity_jp.properties b/src/main/resources/i18n/TransactionValidity_jp.properties index 9540372a..10fa273c 100644 --- a/src/main/resources/i18n/TransactionValidity_jp.properties +++ b/src/main/resources/i18n/TransactionValidity_jp.properties @@ -193,3 +193,5 @@ TRANSACTION_ALREADY_EXISTS = 既にトランザクションは存在します TRANSACTION_UNKNOWN = 不明なトランザクション TX_GROUP_ID_MISMATCH = トランザクションのグループIDが一致しません + +TRANSFER_PRIVS_DISABLED = 転送権限が無効になっています diff --git a/src/main/resources/i18n/TransactionValidity_ko.properties b/src/main/resources/i18n/TransactionValidity_ko.properties index a12b33f6..cbab9190 100644 --- a/src/main/resources/i18n/TransactionValidity_ko.properties +++ b/src/main/resources/i18n/TransactionValidity_ko.properties @@ -193,3 +193,5 @@ TRANSACTION_ALREADY_EXISTS = 거래가 이미 존재합니다 TRANSACTION_UNKNOWN = 알 수 없는 거래 TX_GROUP_ID_MISMATCH = 트랜잭션의 그룹 ID가 일치하지 않습니다 + +TRANSFER_PRIVS_DISABLED = 권한 이전이 비활성화되었습니다. diff --git a/src/main/resources/i18n/TransactionValidity_nl.properties b/src/main/resources/i18n/TransactionValidity_nl.properties index f92adf72..933d6166 100644 --- a/src/main/resources/i18n/TransactionValidity_nl.properties +++ b/src/main/resources/i18n/TransactionValidity_nl.properties @@ -193,3 +193,5 @@ TRANSACTION_ALREADY_EXISTS = transactie bestaat reeds TRANSACTION_UNKNOWN = transactie onbekend TX_GROUP_ID_MISMATCH = groep-ID komt niet overeen + +TRANSFER_PRIVS_DISABLED = overdrachtsrechten uitgeschakeld diff --git a/src/main/resources/i18n/TransactionValidity_pl.properties b/src/main/resources/i18n/TransactionValidity_pl.properties index bcdceb6e..80cb4b12 100644 --- a/src/main/resources/i18n/TransactionValidity_pl.properties +++ b/src/main/resources/i18n/TransactionValidity_pl.properties @@ -194,3 +194,4 @@ TRANSACTION_UNKNOWN = transakcja nieznana TX_GROUP_ID_MISMATCH = niezgodność ID grupy transakcji +TRANSFER_PRIVS_DISABLED = uprawnienia do przenoszenia wyłączone diff --git a/src/main/resources/i18n/TransactionValidity_ro.properties b/src/main/resources/i18n/TransactionValidity_ro.properties index 6c67f31b..be0d8596 100644 --- a/src/main/resources/i18n/TransactionValidity_ro.properties +++ b/src/main/resources/i18n/TransactionValidity_ro.properties @@ -193,3 +193,5 @@ TRANSACTION_ALREADY_EXISTS = tranzactia exista deja TRANSACTION_UNKNOWN = tranzactie necunoscuta TX_GROUP_ID_MISMATCH = ID-ul de grup al tranzactiei nu se potriveste + +TRANSFER_PRIVS_DISABLED = privilegii de transfer dezactivate diff --git a/src/main/resources/i18n/TransactionValidity_ru.properties b/src/main/resources/i18n/TransactionValidity_ru.properties index 2818374a..55b19487 100644 --- a/src/main/resources/i18n/TransactionValidity_ru.properties +++ b/src/main/resources/i18n/TransactionValidity_ru.properties @@ -193,3 +193,5 @@ TRANSACTION_ALREADY_EXISTS = транзакция существует TRANSACTION_UNKNOWN = неизвестная транзакция TX_GROUP_ID_MISMATCH = не соответствие идентификатора группы в хэш транзации + +TRANSFER_PRIVS_DISABLED = права на передачу отключены diff --git a/src/main/resources/i18n/TransactionValidity_sv.properties b/src/main/resources/i18n/TransactionValidity_sv.properties index a3fec831..2f6f85d9 100644 --- a/src/main/resources/i18n/TransactionValidity_sv.properties +++ b/src/main/resources/i18n/TransactionValidity_sv.properties @@ -193,3 +193,5 @@ TRANSACTION_ALREADY_EXISTS = transaktionen finns redan TRANSACTION_UNKNOWN = okänd transaktion TX_GROUP_ID_MISMATCH = transaktionens grupp-ID matchar inte + +TRANSFER_PRIVS_DISABLED = överföringsprivilegier inaktiverade diff --git a/src/main/resources/i18n/TransactionValidity_zh_CN.properties b/src/main/resources/i18n/TransactionValidity_zh_CN.properties index d2a2ec7c..ce35b7b3 100644 --- a/src/main/resources/i18n/TransactionValidity_zh_CN.properties +++ b/src/main/resources/i18n/TransactionValidity_zh_CN.properties @@ -193,3 +193,5 @@ TRANSACTION_ALREADY_EXISTS = 此交易已存在 TRANSACTION_UNKNOWN = 未知的交易 TX_GROUP_ID_MISMATCH = 群组ID交易不吻合 + +TRANSFER_PRIVS_DISABLED = 传输权限已禁用 diff --git a/src/main/resources/i18n/TransactionValidity_zh_TW.properties b/src/main/resources/i18n/TransactionValidity_zh_TW.properties index e88addb9..13c1210e 100644 --- a/src/main/resources/i18n/TransactionValidity_zh_TW.properties +++ b/src/main/resources/i18n/TransactionValidity_zh_TW.properties @@ -193,3 +193,5 @@ TRANSACTION_ALREADY_EXISTS = 此交易已存在 TRANSACTION_UNKNOWN = 未知的交易 TX_GROUP_ID_MISMATCH = 群組ID交易不吻合 + +TRANSFER_PRIVS_DISABLED = 傳輸權限已停用 diff --git a/src/main/resources/penalty-fix.json b/src/main/resources/penalty-fix.json new file mode 100644 index 00000000..8bfaf4ea --- /dev/null +++ b/src/main/resources/penalty-fix.json @@ -0,0 +1,4729 @@ +[ + {"address": "QLcAQpko5egwNjifueCAeAsT8CAj2Sr5qJ", "blocksMintedPenalty": 0}, + {"address": "QLcPrbUgrTJnW74w4QPACiPx56zv3G4FFB", "blocksMintedPenalty": 0}, + {"address": "QLcjp73RUxv34EaM9V1KZDyBiHqFznEHFW", "blocksMintedPenalty": 0}, + {"address": "QLdHNZSo6fEjVrhdudyV6eWHvTN5Q5mTjA", "blocksMintedPenalty": 0}, + {"address": "QLdLERizUCYnuP7SstCULukV2CCZmKgbm3", "blocksMintedPenalty": 0}, + {"address": "QLeBoCaVC6zFd1u1etkB8fdvRF3euUAsqQ", "blocksMintedPenalty": 0}, + {"address": "QLeRakXwvhrxbjLscVdQ9PzNydZAECtBLL", "blocksMintedPenalty": 0}, + {"address": "QLf7KnrSWYPHEPeBLv121d3jkv8cbVrEd9", "blocksMintedPenalty": 0}, + {"address": "QLfCPxWgAyVzQqSK6StZb9vjco6R4XHCMj", "blocksMintedPenalty": 0}, + {"address": "QLfU8ZEHZzinsJvmzw5eidg3F3A7FznSAR", "blocksMintedPenalty": 0}, + {"address": "QLfV6RvPoxS6n6aXGQA7mv5eKsQ76AE4vB", "blocksMintedPenalty": 0}, + {"address": "QLfeRAjrAcpmU8KBqMpjcnSvDe3b7BrxX6", "blocksMintedPenalty": 0}, + {"address": "QLg6KWJZGN2hoHYakR92k1XRJmwzFKo1pm", "blocksMintedPenalty": 0}, + {"address": "QLgBcntJmPbP1gwMV94FXcVymyBcR7dhhQ", "blocksMintedPenalty": 0}, + {"address": "QLgCu3MHDHpbBsvbYNxAbzTh1UfCesY4Le", "blocksMintedPenalty": 0}, + {"address": "QLh2N1vuLQvyPSpnXKJffGwSfyaoX1rGj7", "blocksMintedPenalty": 0}, + {"address": "QLhAZKtH8k23wzEAkea2GTNiaRwS5PHg7t", "blocksMintedPenalty": 0}, + {"address": "QLhKZ4pF7im9sVdHSN12YkxFbWCxEg8PwW", "blocksMintedPenalty": 0}, + {"address": "QLhYzL1yG8mZ66XBEDkPttpKaXocK2r6XY", "blocksMintedPenalty": 0}, + {"address": "QLhes6pYh355KWa6Ghj3L9UgwZ5P8PXMP6", "blocksMintedPenalty": 0}, + {"address": "QLhzTKJzh7jaHFUu57ks23i2obXcoGJCQW", "blocksMintedPenalty": 0}, + {"address": "QLi5NbicG8qcyyKh9w4RdjdGxJrfNtSunT", "blocksMintedPenalty": 0}, + {"address": "QLiBn9FUZYYiN2C1pw53etpyXsh7UQhqaa", "blocksMintedPenalty": 0}, + {"address": "QLiJ15y4Ngx4pyGH96AyzenE5D2akxwiVi", "blocksMintedPenalty": 0}, + {"address": "QLiNgZqzdzPUpN9R6DpjtiLKCgJrkqZznd", "blocksMintedPenalty": 0}, + {"address": "QLiTyaRQDfGe9gzochuDvBbNJfHA783R7P", "blocksMintedPenalty": 0}, + {"address": "QLiZB1LBjGrR2SDCoFrG5Lo4rDzy5Toar8", "blocksMintedPenalty": 0}, + {"address": "QLiwW29kdLwRpbdiY4mGxxBNUer2KfYY5p", "blocksMintedPenalty": 0}, + {"address": "QLixJkhN4CGYgCvL8p5enZF1vEeGqos6Tr", "blocksMintedPenalty": 0}, + {"address": "QLjdyihhNEjWCAU4GfPShmQpwVGjgdT9qv", "blocksMintedPenalty": 0}, + {"address": "QLjheZEPRp5jr3uhMdpBtRKWy6X6qtwNZK", "blocksMintedPenalty": 0}, + {"address": "QLjrgiLMnn9EtwZAfppxMw4AdYey2sU9je", "blocksMintedPenalty": 0}, + {"address": "QLjyton4gRg6D6JJopBoVM3hJ2HdTjqDkP", "blocksMintedPenalty": 0}, + {"address": "QLkAKY3xfiRGJfajovZZf3b1qLLXFts8vA", "blocksMintedPenalty": 0}, + {"address": "QLkS7E9PWd9BBuEdDhxTUgNXSMk1uZNqsj", "blocksMintedPenalty": 0}, + {"address": "QLkaJVTFTJXe3eWSzZzxTR1DNtFmb8F497", "blocksMintedPenalty": 0}, + {"address": "QLkyk3q2tH4hU1mFyRLpsKm2MX3PQdpaad", "blocksMintedPenalty": 0}, + {"address": "QLm4QMUGpQV2sFET9McGvWKE7GvW9BFNgc", "blocksMintedPenalty": 0}, + {"address": "QLmfkyCMPKnM7VXow16VR5hwvGAQgjThCC", "blocksMintedPenalty": 0}, + {"address": "QLmg4JxyvXYwbxogbHGduzNVTmVZsPmFQF", "blocksMintedPenalty": 0}, + {"address": "QLmnzzxAu7mepWur8qK4bbWCVqFEwDNTEx", "blocksMintedPenalty": 0}, + {"address": "QLnCFn3Pcf1SZAWt3dff4azbmTR6wFPr2Q", "blocksMintedPenalty": 0}, + {"address": "QLnHe5jx31CGqq36C5SePTDUvFhiF1UfkQ", "blocksMintedPenalty": 0}, + {"address": "QLnSNaFzcwMLtjbGUDKk31aS9xESigKf6y", "blocksMintedPenalty": 0}, + {"address": "QLngTiMcVktUxJQydxT6QR5LaQc2aKhtRB", "blocksMintedPenalty": 0}, + {"address": "QLntweAVSAp5jFSZmYQDBYZvFbcVaVfHMF", "blocksMintedPenalty": 0}, + {"address": "QLoC6wtBcYbH5ZJRDrkcchLeyCm4JJ9Kep", "blocksMintedPenalty": 0}, + {"address": "QLoPBgM2CqJTuJsrirJiEMCygB1NTxq1g7", "blocksMintedPenalty": 0}, + {"address": "QLoPzx4Kw7vkr7FZKC47925ee3tEQmDKvt", "blocksMintedPenalty": 0}, + {"address": "QLoi39uNBqu94WDywJJLGFkvARzQZ55F2j", "blocksMintedPenalty": 0}, + {"address": "QLp6FeV1N88T9mdvN6qzJeAeJMZqTSCgbw", "blocksMintedPenalty": 0}, + {"address": "QLpDh1tVcc1GwrtCULTFiQxtRYDmH75jnU", "blocksMintedPenalty": 0}, + {"address": "QLpbukTUm3TzVxorZH9nDJQPFqpaNxMGcK", "blocksMintedPenalty": 0}, + {"address": "QLpi4h9MQ9PxYoKtpHpNiFqC2dbxNorpYt", "blocksMintedPenalty": 0}, + {"address": "QLqJYFFxUn4Q82qtT6mA2xFG6Do43T97Di", "blocksMintedPenalty": 0}, + {"address": "QLqSyVd2CH2KQZHsb6QGueowYABj8vvgKc", "blocksMintedPenalty": 0}, + {"address": "QLqaR2JrAvxCWvArnShbmCD1jxmaGZEbBf", "blocksMintedPenalty": 0}, + {"address": "QLqnPwdGsiLm1j4uSQrbHsTZJpTrau7PTi", "blocksMintedPenalty": 0}, + {"address": "QLqu2nHnx4aRD8zwUe34QmT3i6TWFmrtJ7", "blocksMintedPenalty": 0}, + {"address": "QLrUa14myMWu9Mpoq8SUtMerW2zNcdh23R", "blocksMintedPenalty": 0}, + {"address": "QLrYqGS9FXoZCtmGWTx5GEnYdt2bAjyGkA", "blocksMintedPenalty": 0}, + {"address": "QLruri6ShpU7BbFEW2bizYKw3Whm6zKAk7", "blocksMintedPenalty": 0}, + {"address": "QLsHYx1RPZzJ694Ew7b8UUndSTHmNV2dFx", "blocksMintedPenalty": 0}, + {"address": "QLsNS2PpwobiypHDXryTGhZzprwv1QRXxx", "blocksMintedPenalty": 0}, + {"address": "QLsxPqN5oTUW1yaKS9aBNTcGDiK5E2rfYj", "blocksMintedPenalty": 0}, + {"address": "QLtA2g6EiYbvks4iiv2sWyksmYpAK5zrg5", "blocksMintedPenalty": 0}, + {"address": "QLtGRLzLZ2fjtK4jFEwvXEt73q9RfrGhqm", "blocksMintedPenalty": 0}, + {"address": "QLtHEsLgsdZrKRh2H7fpNzcwjvuS5h7Gjq", "blocksMintedPenalty": 0}, + {"address": "QLtHhuoK2UYCfxW1ab21LmGGERdoNVvnpo", "blocksMintedPenalty": 0}, + {"address": "QLtNM25Dy4nGkQxjQAwLss3BS1TKEAh4wh", "blocksMintedPenalty": 0}, + {"address": "QLti6U3v23vvmpLrnWZUFPhiiRAqBnBQx8", "blocksMintedPenalty": 0}, + {"address": "QLtje5CSVRQnWak8LCCLNWYgKZkVgZWTg6", "blocksMintedPenalty": 0}, + {"address": "QLtuWJzw4tnWeD3KHK6skw9BAZQzdWNdkN", "blocksMintedPenalty": 0}, + {"address": "QLvGDsgTgYA5q5GW7C5rvDtDHUf7SZWCmQ", "blocksMintedPenalty": 0}, + {"address": "QLvxo89HgM7nA8v5MnZc6txL8c2a7qojxN", "blocksMintedPenalty": 0}, + {"address": "QLw8coFpMfYWsLmqGj5WoxTjJPz6MAVVGW", "blocksMintedPenalty": 0}, + {"address": "QLwg6qUwUtSvyZaDiueancT62M7LPi24mV", "blocksMintedPenalty": 0}, + {"address": "QLwqmzz2C23WSNKAiYPX1ehmQZhNvNEf13", "blocksMintedPenalty": 0}, + {"address": "QLxBz6NqUTDR5NYwFe4mgwF3g6UmwNcU4F", "blocksMintedPenalty": 0}, + {"address": "QLxCU8jsx57VnZAKy6CyqQWFHBNhQvkUe5", "blocksMintedPenalty": 0}, + {"address": "QLxGVpiXyaAXyyEsTSiDcrPThJpqHb4w5h", "blocksMintedPenalty": 0}, + {"address": "QLxPxSHt1oQy8Ch9SQA9ZuUEGybzW8atah", "blocksMintedPenalty": 0}, + {"address": "QLxT62eAh13fDWkGH8aANg3beP5ZM3buQa", "blocksMintedPenalty": 0}, + {"address": "QLxgnacYpr8FijAJfXJM6KNJGAY35gQth9", "blocksMintedPenalty": 0}, + {"address": "QLxjzFr7qFiB2dHJRRzqddSEpBFUcVGttR", "blocksMintedPenalty": 0}, + {"address": "QLxtgVcRxh92E5yvSghJ8qD38Ljh9ZVDYn", "blocksMintedPenalty": 0}, + {"address": "QLy89z4tWbzcPcyNpVavcNnAEEFmg4t4eE", "blocksMintedPenalty": 0}, + {"address": "QLz91s1qqo3xw1xm6iqqxcMLES9Gjvm2VJ", "blocksMintedPenalty": 0}, + {"address": "QLzB4Y1kaqE7DrNrTWq95VFyieKetGFRVK", "blocksMintedPenalty": 0}, + {"address": "QLzLiGUpNDtvbzWGZqxQzYC9Rvkyt8PYik", "blocksMintedPenalty": 0}, + {"address": "QLzZey9JfMxQWkSjbb8pvdNSVkSDWSmoDX", "blocksMintedPenalty": 0}, + {"address": "QM1PyhcbGPkfGp9iGyn4bZ3o1TRC9CKqvD", "blocksMintedPenalty": 0}, + {"address": "QM1QQBqj7fiUWWp5tBBPm28YYHdHFnnuRJ", "blocksMintedPenalty": 0}, + {"address": "QM1acfcXqgFBwgkMXdfczGvw3L9RUmLzvH", "blocksMintedPenalty": 0}, + {"address": "QM2Wxy2TL42MBn8AwPhGyhS7Wc91nuMLzH", "blocksMintedPenalty": 0}, + {"address": "QM39UdZ9DGGwdXuZ1bbVSFVT18tSKi3AWR", "blocksMintedPenalty": 0}, + {"address": "QM3LLv3WA7w8No2CHz5HJBebAmyZyFnZet", "blocksMintedPenalty": 0}, + {"address": "QM3gm47PheStm2cUykexymmWmyQ92zqHu3", "blocksMintedPenalty": 0}, + {"address": "QM3qEPiTWPduoyXwJGP6VSSnehuLgvdVtp", "blocksMintedPenalty": 0}, + {"address": "QM3zdqu8GxhnsQcy5vmmkMf3Bfa9rQTk1b", "blocksMintedPenalty": 0}, + {"address": "QM48dNevGqF7x2AnrVMps2PYA6v1RVEvWe", "blocksMintedPenalty": 0}, + {"address": "QM4JeM2WNvnp6iKFFWH88GDBixx1LbaJoK", "blocksMintedPenalty": 0}, + {"address": "QM4JwM24JxMzscUHBKyDuCEWCcj5h1FXT6", "blocksMintedPenalty": 0}, + {"address": "QM4QhXkCHwFA8UBXUzdfqwLGqQ2Yfpcrq6", "blocksMintedPenalty": 0}, + {"address": "QM4U5EjbfpjEMY9WF1iBDW9s13ehtZp1pX", "blocksMintedPenalty": 0}, + {"address": "QM6TTeDnYKc3fSgXP1FWiyJLF9EyEVcPoa", "blocksMintedPenalty": 0}, + {"address": "QM6pzEx3iivDGkzj6ZKHQ49XMBKhQVqd1M", "blocksMintedPenalty": 0}, + {"address": "QM7XoHyybCNTwgoGgCUqyupnyWYwAbnyGH", "blocksMintedPenalty": 0}, + {"address": "QM83Z2n7DUmLfQ5xmdyh7CuugR7kQqWijy", "blocksMintedPenalty": 0}, + {"address": "QM8VttuYken6sdoDLgLkaf4Y1qUvdDb1qR", "blocksMintedPenalty": 0}, + {"address": "QM8gFrHXPXBywq3HwEGbMycqCZHjbnBTRv", "blocksMintedPenalty": 0}, + {"address": "QM8u7swZU1ejRrF6KrPegJB2XUJ4bc55cS", "blocksMintedPenalty": 0}, + {"address": "QM8xSoBMsketUVbYWqjNLKsD845wNW54ub", "blocksMintedPenalty": 0}, + {"address": "QM9Nt7wZZ7dnewfLeNtjYVYj2qySCpFSpA", "blocksMintedPenalty": 0}, + {"address": "QM9TwQMTmYT8rirvG2W2gXp7fYQBXP1ZZD", "blocksMintedPenalty": 0}, + {"address": "QM9XYicQqdUeopNxhUAAmGXeLyXJzX3ZVT", "blocksMintedPenalty": 0}, + {"address": "QMA8K74HFVg9BHcHCBmCdt3JaVmdjdg6FE", "blocksMintedPenalty": 0}, + {"address": "QMAGUg5ssPUh22Z1Gc9Y3hrR4hDEdNVYmQ", "blocksMintedPenalty": 0}, + {"address": "QMBkcFyMWTtuQQrDm9CSGzJt1HwxbUc7FQ", "blocksMintedPenalty": 0}, + {"address": "QMC1goGQryzrNuPe6uY6pomavNPcaAvGJz", "blocksMintedPenalty": 0}, + {"address": "QMC2bcibaXF1px8EQoYqAxd6A88K1hx5xU", "blocksMintedPenalty": 0}, + {"address": "QMCtHi8KwHmU6SL1VjfQh3EP8YQxLWPFnA", "blocksMintedPenalty": 0}, + {"address": "QMCxYbYg58dS73X7wrn3inU4nTZWeijz32", "blocksMintedPenalty": 0}, + {"address": "QMCyBvgSRQLPw6T1DYMrkpKJBzLUFAgj81", "blocksMintedPenalty": 0}, + {"address": "QMD9seEQcj84XizqjcC2rUDZNdEi1PQusT", "blocksMintedPenalty": 0}, + {"address": "QMDbBYcxBDrrzSDR24XThDcSUJFE59Nx3Y", "blocksMintedPenalty": 0}, + {"address": "QMDyMyX6HbYHWac3Txke923fCZrDdhu9FY", "blocksMintedPenalty": 0}, + {"address": "QMEQrhyggeBQecEczdsxiLwY7tFHFQVJjw", "blocksMintedPenalty": 0}, + {"address": "QMESmyV8YDonwtswvKcz6DLAyg9XvhRcNr", "blocksMintedPenalty": 0}, + {"address": "QMEv1vnjkgxGGWWkkzaPQ5SYfEFG8sfRBQ", "blocksMintedPenalty": 0}, + {"address": "QMFJFzP8aSV2buhs6QPbrDKMtTgUovU2U3", "blocksMintedPenalty": 0}, + {"address": "QMFZEugiVmQXssfCghEXewbsyxroWce3dR", "blocksMintedPenalty": 0}, + {"address": "QMFprqTwENKD6F5N7rKhAQgTqLyWCjcRRn", "blocksMintedPenalty": 0}, + {"address": "QMFyR2iKwzPhi3RrMj4ARgNN5gnQX9vZst", "blocksMintedPenalty": 0}, + {"address": "QMG4rC9FffDDHssKnG8jbDSwpn2KvschdY", "blocksMintedPenalty": 0}, + {"address": "QMGxjdLogAKA7VVeKQmQvB12nxMZRH3Nja", "blocksMintedPenalty": 0}, + {"address": "QMHEvKCKtPnwLf3Y4ApY39xM7KDyrXE811", "blocksMintedPenalty": 0}, + {"address": "QMHJuL7MxMqBy5np4CYQZG5EkqgUrLkv2t", "blocksMintedPenalty": 0}, + {"address": "QMHuCtBC6eA5BAdixnjsSzP9GxavSvZLrx", "blocksMintedPenalty": 0}, + {"address": "QMJ9bsEHF1NxgVAthhiWkdH5wXPaatbH6k", "blocksMintedPenalty": 0}, + {"address": "QMKCZvoAWpJA2evBxekUNSrfLw69M4EcES", "blocksMintedPenalty": 0}, + {"address": "QMKebDWb9vnLW5AmqkYL9EnTk1hJqv4EGf", "blocksMintedPenalty": 0}, + {"address": "QMKeuyX9igkQ5tautUi9AzxBNCx5BHZmzF", "blocksMintedPenalty": 0}, + {"address": "QMKscx3wsimU6zTCchz1VLRqUKqV4gNzUN", "blocksMintedPenalty": 0}, + {"address": "QMKt1hVhpSQGr3RaSo2VKcP7wn6yfmVzRR", "blocksMintedPenalty": 0}, + {"address": "QMKv9YHkd6ewiad222Vv8JD9uqMBo3f1Pn", "blocksMintedPenalty": 0}, + {"address": "QMLfsJbbYkcRfdsRUGCKpaWJEdVAJPWkYX", "blocksMintedPenalty": 0}, + {"address": "QMLjMB2RfkWqS7Ta5oADoPt9KeqmzLtmty", "blocksMintedPenalty": 0}, + {"address": "QMM1aZasQHsMjLSsv6tNLXumPwjK5Y5oBv", "blocksMintedPenalty": 0}, + {"address": "QMMDd3Wz4LL32QFrgdgj5ZPBrFuKevfDd9", "blocksMintedPenalty": 0}, + {"address": "QMMEYneWsTUCsja7hcyxqDQvrthHuqUcXe", "blocksMintedPenalty": 0}, + {"address": "QMMgfpP6qGvxyX6PCKNtyBTSUKMhQifcHW", "blocksMintedPenalty": 0}, + {"address": "QMMnWcuVVPqbyWDBNkDMsBi7MPj1C2sWrK", "blocksMintedPenalty": 0}, + {"address": "QMNrivpqrX4rLR4zpoUjSrU39kcDTXTvYx", "blocksMintedPenalty": 0}, + {"address": "QMPZRgzqpTgQ3afBJt5pmhSsdRshmkb1WQ", "blocksMintedPenalty": 0}, + {"address": "QMPp7jVrDc4eQSgVJqdKgNdpQ16gRHjAwm", "blocksMintedPenalty": 0}, + {"address": "QMQBbuPGRXptG7yxqAsaAyZnQNc9Qvy2tF", "blocksMintedPenalty": 0}, + {"address": "QMQVJaJm1SKpEJxSXZjzqjJjeQMQDncb13", "blocksMintedPenalty": 0}, + {"address": "QMRSWhXqiPGqMJK3t1cxsVfeuTU9i3zfpc", "blocksMintedPenalty": 0}, + {"address": "QMRYuArqJzdcG7sqQMUeBTp1Xc62rvW7UU", "blocksMintedPenalty": 0}, + {"address": "QMRjBCGeRRBshku4LYv3PR8SJDPLTioSgD", "blocksMintedPenalty": 0}, + {"address": "QMRwM4r9knvpQ33S98kJNQyMapDu3YG4oU", "blocksMintedPenalty": 0}, + {"address": "QMS1aCyPWFGciAUy3v9k7Jj9QhawCB1eCH", "blocksMintedPenalty": 0}, + {"address": "QMS4M7sDvYLcYcupJ5eLuTGsV9oGYZxLTY", "blocksMintedPenalty": 0}, + {"address": "QMSGfiKFbvEYW45K4o1A1hsyWPNw7HPLH4", "blocksMintedPenalty": 0}, + {"address": "QMTAqscLtWdyVmqpjVStVtKvyEKWXRyGTd", "blocksMintedPenalty": 0}, + {"address": "QMTDUob97sWQkYW7Q86gc6GSddELEUUPnB", "blocksMintedPenalty": 0}, + {"address": "QMTLJYLHfBVdHyZeGiRxzmeHnReCBit39x", "blocksMintedPenalty": 0}, + {"address": "QMTLdXgqkRC76KQr7PEhEQSHPYxhdyathN", "blocksMintedPenalty": 0}, + {"address": "QMTYTEKAZqHhJ8wJ7Y2REghfqLdnpHM5NA", "blocksMintedPenalty": 0}, + {"address": "QMU5oZ2TMaxG97FVLN8Gjj6sy8EzuKzXE4", "blocksMintedPenalty": 0}, + {"address": "QMUCQxE6cuSUm8N5D2YASQa6pvLvS2ARKJ", "blocksMintedPenalty": 0}, + {"address": "QMUP4S5FCtKG4W47B8VWaiMhteoPzoUmz7", "blocksMintedPenalty": 0}, + {"address": "QMUgMjDMtWuceqi42GeY3YEeBNEtZjtxs6", "blocksMintedPenalty": 0}, + {"address": "QMUoys8sZEdjXTCuWin8s2REa5fzgmwqzR", "blocksMintedPenalty": 0}, + {"address": "QMVogEv4gXi5LWWeSynkZB7mCf2jbQtQtL", "blocksMintedPenalty": 0}, + {"address": "QMVs81CsStyzmaTMHnEwq4YjWZgGZovL9E", "blocksMintedPenalty": 0}, + {"address": "QMW8KyM5eoExyr2vX2fCb1yLUQH2zAygRB", "blocksMintedPenalty": 0}, + {"address": "QMWF6mEadRUxcqNKMtiQMM8uMYX84hXxJf", "blocksMintedPenalty": 0}, + {"address": "QMWN63gCXiCbkeStXXWof44GW41kVokHMR", "blocksMintedPenalty": 0}, + {"address": "QMWTSTbpHp3F1KCrqHdg3LvYNmpXV84uDq", "blocksMintedPenalty": 0}, + {"address": "QMWe73DzcwzhWsjb7ipwyAXv5rwWmAjRWr", "blocksMintedPenalty": 0}, + {"address": "QMWisvoRqXfw3hw4Qr6cW7qutnv72u5xWo", "blocksMintedPenalty": 0}, + {"address": "QMX39X6npKboZBqu2P3rFWXMYHGrCayPiq", "blocksMintedPenalty": 0}, + {"address": "QMXAHFifJRv9MP3Niqyj5Qnvza91voDrcd", "blocksMintedPenalty": 0}, + {"address": "QMXTwFKtmLE5XuKRpEL27evrLwrru1EH8x", "blocksMintedPenalty": 0}, + {"address": "QMY3nmDQSojt8uVxLwyeGT3SS214oJQ8to", "blocksMintedPenalty": 0}, + {"address": "QMYkksuRjpHQLk2CGkgVhAsib4p8qFAr62", "blocksMintedPenalty": 0}, + {"address": "QMYnhWRmbYGUkhP34dzhSEPyvUkxohghH2", "blocksMintedPenalty": 0}, + {"address": "QMZ46gmL3mgzzR2J4QChgpyp7gfKk2poCi", "blocksMintedPenalty": 0}, + {"address": "QMZCxHYLnpw1APfPiwB6iGwXHsYby8zCWk", "blocksMintedPenalty": 0}, + {"address": "QMZHicaNbCbVr4FzvYqigtnMJZz5u6S8F7", "blocksMintedPenalty": 0}, + {"address": "QMZNKGAmnioEfd38bgfDLTcu7GcLr8d1uq", "blocksMintedPenalty": 0}, + {"address": "QMZUtP8zNbVdfJHDprPZz39WZ4CFFS3k5j", "blocksMintedPenalty": 0}, + {"address": "QMZxZdT6sXKed4mVYPRQGu6qtMnFAptbsK", "blocksMintedPenalty": 0}, + {"address": "QMaFywtC4WwDp9BmMYaGwxMeEzcEMkCEA4", "blocksMintedPenalty": 0}, + {"address": "QMaMobqvZEakRBYhdqt1vR7WuJXSUZHvVX", "blocksMintedPenalty": 0}, + {"address": "QMaUFtiNtsTwva3jX2yeg6tEpeYUFuyyMS", "blocksMintedPenalty": 0}, + {"address": "QMaXdLcHBj9zmBHpZnci83sJirzzp4gbZF", "blocksMintedPenalty": 0}, + {"address": "QMbL7dMEi7dXgavVa4EmftdQnV2RVq5wDR", "blocksMintedPenalty": 0}, + {"address": "QMbL9fqDBCHRNihA8oZxm1wAMtBerTYmhN", "blocksMintedPenalty": 0}, + {"address": "QMbPPEBR2NFJGrRvrrJTSRFevDJUmx3jzb", "blocksMintedPenalty": 0}, + {"address": "QMbTbJJLdCPbhcyNuFgccettvUeZCMqUJo", "blocksMintedPenalty": 0}, + {"address": "QMbchRQXWhdRX4zm4SbSbv9tLusKzSdMei", "blocksMintedPenalty": 0}, + {"address": "QMc5jHzggmrXjXo3SPuSCcqGTnvSYrFCgQ", "blocksMintedPenalty": 0}, + {"address": "QMcA4hzBGjLdKFomJiiz7Gc1ooUq3ACwcm", "blocksMintedPenalty": 0}, + {"address": "QMdJjATsodVb1EuiFxjY5Tk5VygtteXscA", "blocksMintedPenalty": 0}, + {"address": "QMdNXxQeF5RkLy6LwAFBy8NRb61FWSpxrG", "blocksMintedPenalty": 0}, + {"address": "QMeMm5LiATScEUj3tESzQjREASRgyaKEgh", "blocksMintedPenalty": 0}, + {"address": "QMeXFr7g6tQE922BeEJc3G3ugBJAjfCcMs", "blocksMintedPenalty": 0}, + {"address": "QMenBsmit2eQyYmFG32EMgCqp8ykFVtKc6", "blocksMintedPenalty": 0}, + {"address": "QMezLZTnFdUyzinq1eyaiVjSVAsagZTEnm", "blocksMintedPenalty": 0}, + {"address": "QMhQ9BAgydE37Vx7Kta37a7A72qd3TNroN", "blocksMintedPenalty": 0}, + {"address": "QMhdSw6ncWXx56iuEHaef9UCm3cLYyn6aY", "blocksMintedPenalty": 0}, + {"address": "QMhpXohuQNsgtR2py9ZnZrVGpxPunWXbek", "blocksMintedPenalty": 0}, + {"address": "QMhscWLqorGbmygzACzfPNWey8juTsu1v7", "blocksMintedPenalty": 0}, + {"address": "QMiAWxQZy4HdUoGNwGadCroPo9dbTDw97p", "blocksMintedPenalty": 0}, + {"address": "QMjBxKPrnYaVjpEJixpAbuiznWQax72BCQ", "blocksMintedPenalty": 0}, + {"address": "QMjHfH99Gj3n6wP7G3wbK6CnJww1cxinu6", "blocksMintedPenalty": 0}, + {"address": "QMjp5bLspZeLhDPLyuteehwK3oyhYLenX2", "blocksMintedPenalty": 0}, + {"address": "QMkBkvwR5aTrzBUpqh5drTBpQFaY4QeXWA", "blocksMintedPenalty": 0}, + {"address": "QMkFhGtiYPazgfHxWH9StHGixPNa6FDChn", "blocksMintedPenalty": 0}, + {"address": "QMkZjeSc8XBhr6Mq593ByUiLcwF2x9Mw57", "blocksMintedPenalty": 0}, + {"address": "QMkhFc2XHHnYavL7urMYshhbPiWp2xAse6", "blocksMintedPenalty": 0}, + {"address": "QMmAp8W8t7HH9otwF86PPMSVrNVrRRJu2b", "blocksMintedPenalty": 0}, + {"address": "QMmgBppbKTh7cymczHGHQds7QtHRucQamv", "blocksMintedPenalty": 0}, + {"address": "QMnDXTCGYXnhBLGg2a9Ys7wDVxUCLth5Pb", "blocksMintedPenalty": 0}, + {"address": "QMnEsZ9MYcJexoYBQxiGxRC8osAo7UnayR", "blocksMintedPenalty": 0}, + {"address": "QMoDGDV5g7kT1Jp9GdXiAKfEmK9caBr6PA", "blocksMintedPenalty": 0}, + {"address": "QMoZA7awZsVyujWB1hMJcn1UN6hxa4cdst", "blocksMintedPenalty": 0}, + {"address": "QMp7WvvkyNP37VnEH4bBSj1Fqywg7g9LRw", "blocksMintedPenalty": 0}, + {"address": "QMprpZ48AehPU1pkpNQCjV5ZZtGG3tUqdP", "blocksMintedPenalty": 0}, + {"address": "QMqJxLR2Acv2HrDcfQ2PWWbMzMaVU9MpHp", "blocksMintedPenalty": 0}, + {"address": "QMqLohtTX4WA2GqDGx93aABXXjmF59m1s2", "blocksMintedPenalty": 0}, + {"address": "QMqNTdG2fkhzMEizaXc8c5phwMfjvAUN97", "blocksMintedPenalty": 0}, + {"address": "QMqXBym7PCsbxbgmEZV6ZWxLxwmGiQ6B1A", "blocksMintedPenalty": 0}, + {"address": "QMqaUq6SVXVYFiSdznbUuRVf77N7d2Ki89", "blocksMintedPenalty": 0}, + {"address": "QMr38ESUKyjdXypoxWFyMdo1Dir4n63Y9C", "blocksMintedPenalty": 0}, + {"address": "QMrEB8afGmcCebt3Hr2eBhnWQzUMatXisH", "blocksMintedPenalty": 0}, + {"address": "QMs5tUeuyPuB56h1t4qB6YZ38Ux9NcFQnT", "blocksMintedPenalty": 0}, + {"address": "QMsMxj7eabDPUM2mFCnqfPs4r7SSy6VnyW", "blocksMintedPenalty": 0}, + {"address": "QMsh4mJ18iYuRvpJ5ssRyCdxpcofi81ZCA", "blocksMintedPenalty": 0}, + {"address": "QMssSYmraGgMd5CJdGnjAd2LrbCDHmcRvp", "blocksMintedPenalty": 0}, + {"address": "QMt5axu3hVbnewpAq6CENMtjsUotqw64ic", "blocksMintedPenalty": 0}, + {"address": "QMt5qwEXgATfyj4sAEbTB3tZ4jZjYmtziC", "blocksMintedPenalty": 0}, + {"address": "QMtdBrF4REBgnwtEXWw6adMiFV1f3YKjXU", "blocksMintedPenalty": 0}, + {"address": "QMuqtCSbbUU6S6cod3iQWNDhUuViy9cAuo", "blocksMintedPenalty": 0}, + {"address": "QMv59Z4BoDo5nJKRuWWGa73oMpUuZX7P4K", "blocksMintedPenalty": 0}, + {"address": "QMv6Sem5wubJ6TwJr1pzT5U62P6t2jacCB", "blocksMintedPenalty": 0}, + {"address": "QMvCj2eQxjQgHLQo7xUKMKnmHdn9sh1Chs", "blocksMintedPenalty": 0}, + {"address": "QMvJKGCS4tRemzrWGQDhCSSdTbRhDRMRxf", "blocksMintedPenalty": 0}, + {"address": "QMvN5Py8Jm9HZuqzYCyhsBHFSuqWYaBnUY", "blocksMintedPenalty": 0}, + {"address": "QMvRcpmJ8ThziMrrtkBoy9MPwuW2FcYdUc", "blocksMintedPenalty": 0}, + {"address": "QMvctspcYiedkZgAxpTG24mu2eamdtRFfA", "blocksMintedPenalty": 0}, + {"address": "QMvqZcrDSkpf2kCBdgA7DwjF8QAtmiAJRt", "blocksMintedPenalty": 0}, + {"address": "QMw38AGurWxqHHnu1mhWBYbsKnCCKuk2pp", "blocksMintedPenalty": 0}, + {"address": "QMwLyuDgXFv91SaLvpEcexFKD4fS2kLCrK", "blocksMintedPenalty": 0}, + {"address": "QMwWiQcQ3DCfZn5UYqPYQg5tQcAZYiPxd4", "blocksMintedPenalty": 0}, + {"address": "QMwbBNbNgxvVJjWG1zUZg2pi8Zz79nWW8a", "blocksMintedPenalty": 0}, + {"address": "QMwep4Rv4J17KDq8jdeME1oWv2MwaGLHTC", "blocksMintedPenalty": 0}, + {"address": "QMwpR16ud7UgnPXbkSfiNVyHAd6m29ixCE", "blocksMintedPenalty": 0}, + {"address": "QMx2vvqakGQwxRQvAxWR86jyW1vf312Y7i", "blocksMintedPenalty": 0}, + {"address": "QMxA7wqzUStirrBxdDjTkihFAQnWbobEed", "blocksMintedPenalty": 0}, + {"address": "QMxQ1fzeVyWs6wGsb96maN3KSLPnkoDZfp", "blocksMintedPenalty": 0}, + {"address": "QMxei34mrgVgWhznrdZyUY1cjH77sgUAbU", "blocksMintedPenalty": 0}, + {"address": "QMxskEDL5mspwsv9hDrrKcYD1ntJysCjtd", "blocksMintedPenalty": 0}, + {"address": "QMxsuJgsH2FCPw1op4DS9cmYEDS7Pju9zu", "blocksMintedPenalty": 0}, + {"address": "QMy9ewSnzrWxXBu2yVY5yJZVfWMfguSfZZ", "blocksMintedPenalty": 0}, + {"address": "QMyLCjf9i5FD7RUmtEg3JDj9yivk9vBVqL", "blocksMintedPenalty": 0}, + {"address": "QMyPsGL1VLsBH4E8tA4zERgLjJvtWMPM2R", "blocksMintedPenalty": 0}, + {"address": "QMyTBytS1p83JDvk5od13WoopkmjM2mKQk", "blocksMintedPenalty": 0}, + {"address": "QMysFf9NzQKogsjixcKMTURUMRV6hbCgsa", "blocksMintedPenalty": 0}, + {"address": "QN1LkgELCjgMdMdn2rDK8sVRK1QuTLjxiC", "blocksMintedPenalty": 0}, + {"address": "QN1MBEiscAkMuVKvHKZ35XqStmf5dw2ga7", "blocksMintedPenalty": 0}, + {"address": "QN2BLvvcqWVdCA9U8ARTumJUCJeftWARDn", "blocksMintedPenalty": 0}, + {"address": "QN2PGLMN913Ak7UxYzf16uZWUinGhzvNRh", "blocksMintedPenalty": 0}, + {"address": "QN2tgAmbZ8CjgwkejtLgiYEuCB6dvgPpPS", "blocksMintedPenalty": 0}, + {"address": "QN31UW1b576Rv3ZpB3z6yAk8Zk2bsGMzzJ", "blocksMintedPenalty": 0}, + {"address": "QN36avKv6yRp7TCuTeqk74AE5nFnJeXqdN", "blocksMintedPenalty": 0}, + {"address": "QN3bHphcm3q11C85yHY41UjCizHGChA2Za", "blocksMintedPenalty": 0}, + {"address": "QN3fB3CSg7NbLFN2cRfSRJrneicaBzhUY6", "blocksMintedPenalty": 0}, + {"address": "QN3zhLp2aaCFFigSUMqWifq3YtzTsA7yWL", "blocksMintedPenalty": 0}, + {"address": "QN44koc4iQbS3cspyFVpMGQnvC1aZ8imG9", "blocksMintedPenalty": 0}, + {"address": "QN479iT2VaYEatAcjRRM8thqNmbGxv86dQ", "blocksMintedPenalty": 0}, + {"address": "QN4E3oEnTAqnKUSNYjFvS8Z6fT1UeFKupa", "blocksMintedPenalty": 0}, + {"address": "QN4R6arBDYg6YekEb2BU89jc5URjyoai9J", "blocksMintedPenalty": 0}, + {"address": "QN4WJVNeMzNhV1mWqR3T7B7rW6KYqqE9uX", "blocksMintedPenalty": 0}, + {"address": "QN5T4jbSdgPUZexNSEdwp7bzhq8Dxe4DB7", "blocksMintedPenalty": 0}, + {"address": "QN5k3xsiq5RCozAW3SYwH66ZQTVhhovxWE", "blocksMintedPenalty": 0}, + {"address": "QN5qLJqbsa9h7hrhUfa4GeHMMeGeCD8KZD", "blocksMintedPenalty": 0}, + {"address": "QN5yNf1eh2a8LaoWuAUoD6uNWUhKr9excQ", "blocksMintedPenalty": 0}, + {"address": "QN64a76pZ9aZmQfQppP4PN4SPFBr3SbpFb", "blocksMintedPenalty": 0}, + {"address": "QN73MyEr2qaMup3UQs1fKiVTfFpQgim5MM", "blocksMintedPenalty": 0}, + {"address": "QN7Qrr2Rt4KEXaKDEpwMsFqve1X4R1uuKL", "blocksMintedPenalty": 0}, + {"address": "QN7RB99zgKZZ9NS2VukNChiUTGsun838if", "blocksMintedPenalty": 0}, + {"address": "QN877r2bHzYBu2CvoEUMM38xkK9QCh3K1g", "blocksMintedPenalty": 0}, + {"address": "QN89StcfchKbesZcjrxcL9p4wztpfdhA4y", "blocksMintedPenalty": 0}, + {"address": "QN8GuJCfLw8iqCYsHW4PveG1mKsChbqe6n", "blocksMintedPenalty": 0}, + {"address": "QN8WvrsmRWQc4xLL5aceCWrG6GUtg2NysZ", "blocksMintedPenalty": 0}, + {"address": "QN8btmpmxFkre8ZTwaSkDU58rWmyqiYZzz", "blocksMintedPenalty": 0}, + {"address": "QN8eL8N7RG5v8uYMWfamkUKZwAQ9sSNd9f", "blocksMintedPenalty": 0}, + {"address": "QN8hxkz5Si1zhsECnodJrpZuN5Qs7pS5Jj", "blocksMintedPenalty": 0}, + {"address": "QN8ma6EeNSb3j3c9EFi9ec9d4kLfjfPex9", "blocksMintedPenalty": 0}, + {"address": "QN8xDHcpmdhAmzPFjBsbYZ5VuQP4Bj9jyr", "blocksMintedPenalty": 0}, + {"address": "QN92By6aHsRzgmkCAnUmqnESS4fLiuQKFP", "blocksMintedPenalty": 0}, + {"address": "QN98661LXfAdjnptuYdX1eD7WPwe8yMuzG", "blocksMintedPenalty": 0}, + {"address": "QN9BJeXCpS8hUkw74xSXkwvNEN7uqDXP57", "blocksMintedPenalty": 0}, + {"address": "QN9CVDXpfoy7XgyfGPvN59uBHnQBFJgHd9", "blocksMintedPenalty": 0}, + {"address": "QN9UEX9f4iLZMX51VU9xPkYWpTVsTk3rYk", "blocksMintedPenalty": 0}, + {"address": "QN9xgLkweNDH2D3Y4ThbNipEcrAJF4XbaU", "blocksMintedPenalty": 0}, + {"address": "QNAkeC8zvEDRVrpKuy5LbwYtefWBYKPxnX", "blocksMintedPenalty": 0}, + {"address": "QNBVjW433NyijXNvCz6hiDUMHhKRT44au2", "blocksMintedPenalty": 0}, + {"address": "QNCJEPpSz594jwmtqewYP2eSi4CE8Kn3em", "blocksMintedPenalty": 0}, + {"address": "QNCXQLNqR8BCJHAebuFeque9wzZRnP4RJk", "blocksMintedPenalty": 0}, + {"address": "QNCy8o9bReYpEc7PyzzdFvFCkFGyby5P25", "blocksMintedPenalty": 0}, + {"address": "QNDJryHp5Mp2C9mUT8jwBf9TybuCYUwoau", "blocksMintedPenalty": 0}, + {"address": "QNDhVGyMqZBEvpTSEPqZEEhu5xiSqzk3Yn", "blocksMintedPenalty": 0}, + {"address": "QNDmHeUtj747SfX8TzHedfCbgaiqCv5Ag6", "blocksMintedPenalty": 0}, + {"address": "QNENeFJdSeZcx6zsMKWoPrQVaME7fjADor", "blocksMintedPenalty": 0}, + {"address": "QNEydywqYgpZebpGzvBaA24KrGALjua6sE", "blocksMintedPenalty": 0}, + {"address": "QNFFTK9WUGT7mjSzBQziVD5Qg9U95hH5c8", "blocksMintedPenalty": 0}, + {"address": "QNFGAna5SS6gAuwbHbPL7ekszE993gYqDb", "blocksMintedPenalty": 0}, + {"address": "QNFQ4aNJtCmaxGJ5qifqQfjmqkTKs2Xc6M", "blocksMintedPenalty": 0}, + {"address": "QNFRqBNan9cFAwaVMUa4H4NKKS6LVgeKi4", "blocksMintedPenalty": 0}, + {"address": "QNGEBJCRyHTuB9BUXxK83KQHRjYhwVkrN6", "blocksMintedPenalty": 0}, + {"address": "QNGNqnYBhVqgmAVMBWsqnUgWrgs3oxjAvV", "blocksMintedPenalty": 0}, + {"address": "QNGQw8iJzvSbxrCLGdHNKx4Z5Ts411co34", "blocksMintedPenalty": 0}, + {"address": "QNGcKEAyFPhuprRczsrdk1HcR9YSMqBkdF", "blocksMintedPenalty": 0}, + {"address": "QNHPGtCr5obwyrdQTrMMitFJ1NgW4anDaZ", "blocksMintedPenalty": 0}, + {"address": "QNHiN85k79S3q8w7XSHXF5LvEvuqoDg9UD", "blocksMintedPenalty": 0}, + {"address": "QNHq6mzzhvTmQiJzBDfJoGpK8Qi9C2bxb7", "blocksMintedPenalty": 0}, + {"address": "QNHunh6CXbBpBRnQ9g33mw5hLzmANifa1j", "blocksMintedPenalty": 0}, + {"address": "QNJL2eoWUdWY5dCecg8LVRSPKw8avpxZhd", "blocksMintedPenalty": 0}, + {"address": "QNJs3tJUS47YVoAWtdmijFiFuodatrAXgZ", "blocksMintedPenalty": 0}, + {"address": "QNJxM8jBXexS7A6eZms41DJM9ickKU2MSq", "blocksMintedPenalty": 0}, + {"address": "QNKCGmCQXvqXwStNtpJJiqnjESNy4pcK37", "blocksMintedPenalty": 0}, + {"address": "QNKGMcUvQHVXVoJUCask2XbPMp6U1pwciK", "blocksMintedPenalty": 0}, + {"address": "QNKttS3SEKbfaaeLYxriipJ5xQdXVUeBiy", "blocksMintedPenalty": 0}, + {"address": "QNL4mbkfWDSprkDx8hHAzasPMdjYwXCB4x", "blocksMintedPenalty": 0}, + {"address": "QNLhEgqgAj3Pt5PtDZAtAYxske9PXx2ULL", "blocksMintedPenalty": 0}, + {"address": "QNLus6YRVx2YMG2hQtCawiCTfs8VuWHDEb", "blocksMintedPenalty": 0}, + {"address": "QNM49YLU9yGH4L6iYeKi8zWSJJzK1uUZeb", "blocksMintedPenalty": 0}, + {"address": "QNMZnDAbYDzKLYRVNpJFcEnr3411rQBguw", "blocksMintedPenalty": 0}, + {"address": "QNMf7PqURwqVjAQuxH89VMEokvZXzgZ2q6", "blocksMintedPenalty": 0}, + {"address": "QNMo1wHTP3pshKkk8sewfHrPi5zkRJ6UgB", "blocksMintedPenalty": 0}, + {"address": "QNN172DzLMe5SuiJumEseigW4mnccrVCTu", "blocksMintedPenalty": 0}, + {"address": "QNN2i1ZJDXoLBA3H9anbKKK16pM4rQV6MB", "blocksMintedPenalty": 0}, + {"address": "QNN8s6tSx5LCvfUnbgn63oNm84iEgeA7na", "blocksMintedPenalty": 0}, + {"address": "QNNSPNowqK6EgioG57SSTSfQpmssGxPw3r", "blocksMintedPenalty": 0}, + {"address": "QNNiZFCyKha14XodXFG5DiRdutgh677k19", "blocksMintedPenalty": 0}, + {"address": "QNPcBeB1pXTQcZWNmtbXrzSYtUrz6agi4c", "blocksMintedPenalty": 0}, + {"address": "QNPtd2PEoDd7M34oN7SfZ4VGoNkS65gVx5", "blocksMintedPenalty": 0}, + {"address": "QNPut8fUficZvWxgujWs1XSfnfqRdMpW7a", "blocksMintedPenalty": 0}, + {"address": "QNQ2qXSXGWNzxYgaFPpcWiXSEHPCQwoRJM", "blocksMintedPenalty": 0}, + {"address": "QNQAPsU5yWgRTBgc9ghgUmC72QvQ3N3Efj", "blocksMintedPenalty": 0}, + {"address": "QNQQ1BnKBJBbYxWoeFKZeqMSeaDdc9demt", "blocksMintedPenalty": 0}, + {"address": "QNQTh4sz3advGmSKDMDx46hDNWyEnnEpxg", "blocksMintedPenalty": 0}, + {"address": "QNQdbZ64e54i8wgMPKVpKkHd6TGTF3Ea2N", "blocksMintedPenalty": 0}, + {"address": "QNQmN5ryBeoB8Brwedbp5jZsWbcp4pk2XM", "blocksMintedPenalty": 0}, + {"address": "QNQoGeogoWEEQLMpAXfxKaNZ3xudvcN3y8", "blocksMintedPenalty": 0}, + {"address": "QNR1EKgDVprX78RZzXwLj8uuKTYybmxEyn", "blocksMintedPenalty": 0}, + {"address": "QNRErzmt53wAYVQ3oc5Nkyc8FeiWVZ7CK2", "blocksMintedPenalty": 0}, + {"address": "QNRR5gPJg5LSU6t4dD4FBkfCDge5CK6YT2", "blocksMintedPenalty": 0}, + {"address": "QNRWxwK3dvGhgqZChGyTuQ34pVrE5aUbcZ", "blocksMintedPenalty": 0}, + {"address": "QNRjSd7Gmid2pVRvbWqy8NNLmbFuRU9Jzk", "blocksMintedPenalty": 0}, + {"address": "QNRkzrPyjKHgswk29F5TmSCnkQpvnjBfVU", "blocksMintedPenalty": 0}, + {"address": "QNRyZZksK4Rz1NzoWvjMLpPMfnmXbxQLYB", "blocksMintedPenalty": 0}, + {"address": "QNSdd7xiRLvg4QDmxQ3JkwaGJZCf6tGzMc", "blocksMintedPenalty": 0}, + {"address": "QNSvWN8dhheK5HNPLvw2xVuDrhS3xJpavn", "blocksMintedPenalty": 0}, + {"address": "QNT2SETQkMtafw2TrDoSrBkqKSQJVfCRcx", "blocksMintedPenalty": 0}, + {"address": "QNTEEdFqSFe58N9JnknH4Txs5E9MD5fdUE", "blocksMintedPenalty": 0}, + {"address": "QNTNCtFUedxCTGzf5BjbFy3F3zfw3vEbGp", "blocksMintedPenalty": 0}, + {"address": "QNTQJDvtyUpgPFFuq1xricVCYENUmKMJH1", "blocksMintedPenalty": 0}, + {"address": "QNTifRrwZiM7emxXNemWu3ux8w3QaoWXRB", "blocksMintedPenalty": 0}, + {"address": "QNTs1qjHJjtrj97JkLFRmGUQcNBsNfZHPo", "blocksMintedPenalty": 0}, + {"address": "QNU1E7yc5ZajweqTdigcJcA2vriiENLAV9", "blocksMintedPenalty": 0}, + {"address": "QNU3WTs97QegptsrJaQqnCDi3VrasVrdhi", "blocksMintedPenalty": 0}, + {"address": "QNUCBWLfj2QwFAqmB8SYzhEABXvxzMmyME", "blocksMintedPenalty": 0}, + {"address": "QNUajBC5tDDr4aKNyvVGb79WH6jMQcQvNn", "blocksMintedPenalty": 0}, + {"address": "QNUniD5tmbMx8k59QWwm4ibirCkZkcpaAt", "blocksMintedPenalty": 0}, + {"address": "QNV3jksFPwwdXADT2BeST1WxPhPdeLJm6C", "blocksMintedPenalty": 0}, + {"address": "QNVFJZH9uAaRyeZJqUcSM3rFG5ZfU4cQ7j", "blocksMintedPenalty": 0}, + {"address": "QNVaMspn79CHfB8CW3GKWwTFYqeWiKcmKZ", "blocksMintedPenalty": 0}, + {"address": "QNVcUgzNkkts91K76jUJVrrFNCGf3objPe", "blocksMintedPenalty": 0}, + {"address": "QNVv2EgotxZH6hbnD75HH4peqHto5sCbYn", "blocksMintedPenalty": 0}, + {"address": "QNWCF1Po3LGeSYLrXGAnf4U9AEkJvnL468", "blocksMintedPenalty": 0}, + {"address": "QNWEyccwcFeYekWHxQqnWaHodcKdqg25UT", "blocksMintedPenalty": 0}, + {"address": "QNWVFk9E1Xs6EcHYHAHFboftAYXoTujp8N", "blocksMintedPenalty": 0}, + {"address": "QNWY9o2UzNxfM3Gn3TUeaxhUzGHKc7t9u8", "blocksMintedPenalty": 0}, + {"address": "QNWb7q8Qb9uf9sBE6Mrdes9r5UMq8TX2Y4", "blocksMintedPenalty": 0}, + {"address": "QNWgad5nFKqoBC9umXgFUVwBaacm96G64h", "blocksMintedPenalty": 0}, + {"address": "QNWjK6LYL2ZP41fZpUewkNd1u7nntET4JD", "blocksMintedPenalty": 0}, + {"address": "QNWp1kYkr8Cnx7R4P5BjM4xVn6iii5vmAy", "blocksMintedPenalty": 0}, + {"address": "QNXXyBVBz4x5s7GQUfpkPksJjiX39vUmec", "blocksMintedPenalty": 0}, + {"address": "QNXjR7LESA2RDVbrRDyZd25NbTdip5bgvr", "blocksMintedPenalty": 0}, + {"address": "QNY9ZuaqkkVztV3fcunrtRRQDYre6u4JDk", "blocksMintedPenalty": 0}, + {"address": "QNYSPEtehK49DSLpHXSqmYceixhia9x3u8", "blocksMintedPenalty": 0}, + {"address": "QNYqx4qNhjDTPxHKG5BxmuoRntjkQDKrzT", "blocksMintedPenalty": 0}, + {"address": "QNZ5GXKV9Z82hsg5etBQRdZJgJfKUUNZne", "blocksMintedPenalty": 0}, + {"address": "QNZsAxBBGm5tveeYVhKuxWdwWxUfg6jAJ1", "blocksMintedPenalty": 0}, + {"address": "QNa4bcSkDZdyw8cELMgo2hxTEyXjqscCL3", "blocksMintedPenalty": 0}, + {"address": "QNaiXbtbgfA7TLkK6V4EdhS1jauPrd6jvA", "blocksMintedPenalty": 0}, + {"address": "QNaxZ7zuuMW1BzNaijSicLth6DREvc4c8u", "blocksMintedPenalty": 0}, + {"address": "QNbv9i7QRn2ETfiQQxjgQvpa7UHNYv3FEX", "blocksMintedPenalty": 0}, + {"address": "QNc6HNUqib1NRvXbpDemTwj2B2JKckYnmR", "blocksMintedPenalty": 0}, + {"address": "QNcfp3Ngf5GPnmrntm4DXoKBQ2tZdNP9Gp", "blocksMintedPenalty": 0}, + {"address": "QNchpCD8HccXmDMCBM19HjAsoY2sjfJHk9", "blocksMintedPenalty": 0}, + {"address": "QNd4hNriYGkybyH3DHw7nVeuHHDasJWBRo", "blocksMintedPenalty": 0}, + {"address": "QNdJ8qujNVisMF6PrF26VzjZ8dgGKxi6mT", "blocksMintedPenalty": 0}, + {"address": "QNdjbTPBres1UmhBHiFJ1gX29kwdK4RhbC", "blocksMintedPenalty": 0}, + {"address": "QNdw2oxn1V21Xb444FqMeoFVLMxA5yRgTU", "blocksMintedPenalty": 0}, + {"address": "QNdxTr9wyeEWsEgY2p1V2q1oRU7iEdtFUi", "blocksMintedPenalty": 0}, + {"address": "QNdxvgVh7BFfdM4GWAczKSaXg8mwtjnH74", "blocksMintedPenalty": 0}, + {"address": "QNe22z7UV2GBz2QAqaddo9wdxrj91LLdNg", "blocksMintedPenalty": 0}, + {"address": "QNejBKf3Fg8cXNLXiy1KX7XwkmC61EtgAd", "blocksMintedPenalty": 0}, + {"address": "QNfBMZU93B2JrystZx5M9Yi8yhx4W9LRnB", "blocksMintedPenalty": 0}, + {"address": "QNfCVGvT6h4LzuCQW5DFoDqwnE3H84ofie", "blocksMintedPenalty": 0}, + {"address": "QNfsQZja8xDGdHe8Bmxtm4jmueH2YiKQJ3", "blocksMintedPenalty": 0}, + {"address": "QNgLFPxf5W5ksfPv1sdmtJ4igVgVkTi3LD", "blocksMintedPenalty": 0}, + {"address": "QNgNDyrZyeFPGtT6hMCkU74jBLbcFp7xEe", "blocksMintedPenalty": 0}, + {"address": "QNgRtqzBGTNxnEgheBXtbib3eVjB3EvfUt", "blocksMintedPenalty": 0}, + {"address": "QNgnP2C1BAknQZhnSxVA9zPBgedeSaeCcz", "blocksMintedPenalty": 0}, + {"address": "QNhgv6L4W2dWCXH6D72s6QDyD4L95i3m9K", "blocksMintedPenalty": 0}, + {"address": "QNi2eeruGPpmwuC1QbarV1JimbZFYjsJK7", "blocksMintedPenalty": 0}, + {"address": "QNiT6VLz5Sg3xMWkFXrWC5UAaL31WHQUj7", "blocksMintedPenalty": 0}, + {"address": "QNikTBjfwqSZKngVDFWfQmZESTS1WUoBHh", "blocksMintedPenalty": 0}, + {"address": "QNixVhZaEiK6mfW7xYHNbfuqkapivW5r85", "blocksMintedPenalty": 0}, + {"address": "QNjCEHyMbXWTB75PWEJvKxLrVFDnmButf1", "blocksMintedPenalty": 0}, + {"address": "QNjEgcHVKEY3xC4ADE8sWL5q87sbWbU7ix", "blocksMintedPenalty": 0}, + {"address": "QNjLvYbFGBzJhZ5Dwg4uvZ9rx7XshtiXPW", "blocksMintedPenalty": 0}, + {"address": "QNjNuiuEURjqGgkzgCRCcUpmCb7AoCCbfo", "blocksMintedPenalty": 0}, + {"address": "QNjiFTQsg3woWkU631wxN7jZE7y5NbKbxC", "blocksMintedPenalty": 0}, + {"address": "QNkEztAc85i7fjh2zU48XhVHbWHqo2jfsM", "blocksMintedPenalty": 0}, + {"address": "QNkffREoWZMaA8p2gMpeDPjV6u4Rk1jeXo", "blocksMintedPenalty": 0}, + {"address": "QNmr53j5FHmPjqrSVPxzNtHHwu1JxHDAn6", "blocksMintedPenalty": 0}, + {"address": "QNmyeKy5usGDyUsxk4qHJmnKRJG5jw87hc", "blocksMintedPenalty": 0}, + {"address": "QNnA39LKVQ7dRYQH5YrmUzVFDSyqADsT9J", "blocksMintedPenalty": 0}, + {"address": "QNnBhx1ccbWgHiuGKKq818dMoGz9fVZiWq", "blocksMintedPenalty": 0}, + {"address": "QNnbYuw4kBVV2dtNWQLHtMf35YhrQqqGSw", "blocksMintedPenalty": 0}, + {"address": "QNnxbm9ZmXQq2bjDXHsB6RnxqWiv6WtDkW", "blocksMintedPenalty": 0}, + {"address": "QNo8T55Ae6utU9eB3VqkM6XdikXEbTVHSY", "blocksMintedPenalty": 0}, + {"address": "QNoG6booQJZDApeGP9ra21bpoHNXrko1s7", "blocksMintedPenalty": 0}, + {"address": "QNoWo7Y1Bp5XL5R1hEVrVUScLhNXAA2NxG", "blocksMintedPenalty": 0}, + {"address": "QNp6ZDuzq4sZdvonagDirgspGjwVwYdwNj", "blocksMintedPenalty": 0}, + {"address": "QNpVG31w2fwU9VH6rn5HEchyqgJ4pn4VU3", "blocksMintedPenalty": 0}, + {"address": "QNpWRkWoLx3W3Tj1LqTCEMszzNFWFLVcRc", "blocksMintedPenalty": 0}, + {"address": "QNpfuTuTWR5EoShTjPKJ5761wx64WvsiCh", "blocksMintedPenalty": 0}, + {"address": "QNpfyAQ1oVrcdLxrWb5tcSaGGaurasC1kN", "blocksMintedPenalty": 0}, + {"address": "QNpktFJG3zDxwDjJFvQLdtSfjmLVUpsnH4", "blocksMintedPenalty": 0}, + {"address": "QNpn2rrRPJSDHSUZgJYmL4ATFJ3FXnLjj2", "blocksMintedPenalty": 0}, + {"address": "QNpzzEz7ihntYnhuVkVzviuQ8xNaruu4A9", "blocksMintedPenalty": 0}, + {"address": "QNq3k91FzfYmDYp9uRwFdhqgvWbNDSu9Xb", "blocksMintedPenalty": 0}, + {"address": "QNqPZFto7i6MdXad8eJruSuSe5RmdDALK6", "blocksMintedPenalty": 0}, + {"address": "QNqaCKj7ebvLyQzJPcxuSttXD2rodX7Gdu", "blocksMintedPenalty": 0}, + {"address": "QNqpPuvGxcqi1n1hFigDndBb419x52KfNt", "blocksMintedPenalty": 0}, + {"address": "QNqxGsvJ1osjsgU3ZjVXB9ZhryMUQ7PFHA", "blocksMintedPenalty": 0}, + {"address": "QNr1gjj9xBhubK21w1jJKt2szeRr2vfa4U", "blocksMintedPenalty": 0}, + {"address": "QNr4JLRQLq7fa2DCpGtfqXgC62TpTDaXoT", "blocksMintedPenalty": 0}, + {"address": "QNrjvzSdk44BR8eJjzv4EieMuc47gv9jKi", "blocksMintedPenalty": 0}, + {"address": "QNrwRr8fr9TWfQAx3vdtz6tQAgX6f1vy3U", "blocksMintedPenalty": 0}, + {"address": "QNs5V6T9xj7UKTd2ML1Ru6eiqkS1JvMrbm", "blocksMintedPenalty": 0}, + {"address": "QNs6hieByyFVdMg6JpQfixttPZRk6LQ63i", "blocksMintedPenalty": 0}, + {"address": "QNsRAxV9Q3ZeEcnyKVuBjEzK2dgtbgMGTF", "blocksMintedPenalty": 0}, + {"address": "QNsYjLLwJCxjbKF8XaKEcE8yUfjfUXRib6", "blocksMintedPenalty": 0}, + {"address": "QNsYjWzMgpj3sZ2U8vcKYHxYsV3mU8QXKJ", "blocksMintedPenalty": 0}, + {"address": "QNskrbjrKJbFgzsvAe6yxTPEFXpzpU73Uh", "blocksMintedPenalty": 0}, + {"address": "QNsnnzHboM1X3bRv6MXuQZUyMD3oXP42Lv", "blocksMintedPenalty": 0}, + {"address": "QNt7X3i3jjxn9D5ZVXoTZjcE6moVwji6YQ", "blocksMintedPenalty": 0}, + {"address": "QNtm9ufeSt27bjuBMmXyPTGVbDZBA62RRL", "blocksMintedPenalty": 0}, + {"address": "QNts8TeQ5phH5v92w4kntiU1PccsqwcQpK", "blocksMintedPenalty": 0}, + {"address": "QNtxdQPULksfDnS4SydLvwa3Poiy5RNhyk", "blocksMintedPenalty": 0}, + {"address": "QNuFGQojv4MwHFZFg66mWBoi4VrWm7edM3", "blocksMintedPenalty": 0}, + {"address": "QNuPya29fddZ1dyz1raMfsLrTvo3WezSkq", "blocksMintedPenalty": 0}, + {"address": "QNv5rwuqK8kFDwP3T35uMTTSEmiWsJnPUv", "blocksMintedPenalty": 0}, + {"address": "QNvgcLiVVg4R1ttj45uw9PJ2whBEoTtXnF", "blocksMintedPenalty": 0}, + {"address": "QNx5XU3btxVf1sqaN49NV4UnGstNp3AoHh", "blocksMintedPenalty": 0}, + {"address": "QNxSgozriH8xweAYrKQRobhyx33UNfwBdF", "blocksMintedPenalty": 0}, + {"address": "QNxZp63QQLcqqSeyMCj7mAJWB8qt1DisZa", "blocksMintedPenalty": 0}, + {"address": "QNy9jG2NTk7f8J8emstfZb96sQWfbXsJgi", "blocksMintedPenalty": 0}, + {"address": "QNyK2sMagWZUJVUZQhTR7Enqaz5jd9tJRz", "blocksMintedPenalty": 0}, + {"address": "QNyskqY6f8Z2xK9A8sEiawiyDFPNv42h4w", "blocksMintedPenalty": 0}, + {"address": "QNzMXgEr1zm1uMLfyevJBPemFvTANLs1qM", "blocksMintedPenalty": 0}, + {"address": "QP1H1HHwd18fbeirF6zDX1KsQrXWHAuMSc", "blocksMintedPenalty": 0}, + {"address": "QP1JPdw2aXgHLKFajg9YyW3E5tTium7Zcf", "blocksMintedPenalty": 0}, + {"address": "QP1LF361haEGp417Wfc5ych8LpQxSYuJZY", "blocksMintedPenalty": 0}, + {"address": "QP2niVgRdXRm1ChJcHyCty13UB5pabnBv9", "blocksMintedPenalty": 0}, + {"address": "QP2t4Kyk26kotTg67wGpe34iaJfnNqsxiW", "blocksMintedPenalty": 0}, + {"address": "QP38tGMwr2yKmob6XciQdpBTTn9eo4rmuj", "blocksMintedPenalty": 0}, + {"address": "QP3YrzGBnUNMkVhN9P9f1jutduFput8XiK", "blocksMintedPenalty": 0}, + {"address": "QP3a9KAVSBWKLRTzXKDghk43um8xYzeupR", "blocksMintedPenalty": 0}, + {"address": "QP3gFqs4wUWew1tAbXbMMpxeC8YbBw2RUC", "blocksMintedPenalty": 0}, + {"address": "QP4UBa2eg1o5Ey33x7hKq9FS8aAga5JYDt", "blocksMintedPenalty": 0}, + {"address": "QP4qpXMiuz6HrM5HYfmeYzSHfzeF4vyrmA", "blocksMintedPenalty": 0}, + {"address": "QP5WWegvG8PrAhzbYAFiYKkRVjw6R2sySM", "blocksMintedPenalty": 0}, + {"address": "QP5bEGPjfQVARZ7YYRgqEt3wAqnWegF1AC", "blocksMintedPenalty": 0}, + {"address": "QP5oMGSzNzq2fKBgywW7jKFqkLhnVLEyuD", "blocksMintedPenalty": 0}, + {"address": "QP5zMAxq2isH4NkC2orKroWen6bGC6HxgE", "blocksMintedPenalty": 0}, + {"address": "QP68gicTAh2LouCfzhPGuLimeAMZSn34Qe", "blocksMintedPenalty": 0}, + {"address": "QP6XMCtoLwMu92iR7rZCy3XnGE1PCbXoWg", "blocksMintedPenalty": 0}, + {"address": "QP6n2Rs2jEgac1WfprWeVS3HLNJTSaQUhq", "blocksMintedPenalty": 0}, + {"address": "QP7SkgU7qxvxcKbVrtKKodXTZDgjPd3hpW", "blocksMintedPenalty": 0}, + {"address": "QP7T553GVrfkVvDdVZwXWLJeZThKPme74k", "blocksMintedPenalty": 0}, + {"address": "QP7v7wSohkgBrWeeubdcHvYL7CYGJbBLfT", "blocksMintedPenalty": 0}, + {"address": "QP8JpkoNVmvjXdgfvBr8XCoGDrxGPQADnt", "blocksMintedPenalty": 0}, + {"address": "QP8rS863nvayrLSzvMRzTsrCFXH5vW5icF", "blocksMintedPenalty": 0}, + {"address": "QP8rdbQkqWzzU5ymriTwma7k53sBQehppm", "blocksMintedPenalty": 0}, + {"address": "QP8ue3Zi2WueEc9UEXj2J5d33iU74vQKwf", "blocksMintedPenalty": 0}, + {"address": "QP9VF1cf3aid2mhy2qf2KRF7KvhCJiULxb", "blocksMintedPenalty": 0}, + {"address": "QP9uTYPMqsiKXSZGwdAfwwvbG47hnGHYxZ", "blocksMintedPenalty": 0}, + {"address": "QPAhRbWA4v9rUUfZAWJgmHbWpFgMsA5PGp", "blocksMintedPenalty": 0}, + {"address": "QPBac7uiiuLdshyroSvjj35ep34H6btGih", "blocksMintedPenalty": 0}, + {"address": "QPCAc58spaHNpcmffFaCFZYUYW5xBxGqfN", "blocksMintedPenalty": 0}, + {"address": "QPCUkz8hcEmqRXwYYEGFXcS8SM6iZqownK", "blocksMintedPenalty": 0}, + {"address": "QPCrri9tFunUjdLpNhuSYDRaVNgXpX4TFW", "blocksMintedPenalty": 0}, + {"address": "QPCwpzeFQrZwrTqif4StA5PjW3b88PbXEZ", "blocksMintedPenalty": 0}, + {"address": "QPDYrXZteQqoTgT38SmbTcR8MF69HPg2yb", "blocksMintedPenalty": 0}, + {"address": "QPDnmiqiFzoooCVRVJEyZQmGxFw4XhasyU", "blocksMintedPenalty": 0}, + {"address": "QPDr4kYpEPFaT9pKxPbRA49umbVEQpENxg", "blocksMintedPenalty": 0}, + {"address": "QPE9HpurY9DRPgYNq5buS6WK3wycbfwa7S", "blocksMintedPenalty": 0}, + {"address": "QPESfQTH9QYyGFPgipCf9pvtuKns5nMwNe", "blocksMintedPenalty": 0}, + {"address": "QPEogAgWwTmYDBGEcYfjT3tPmqXcaA7xVj", "blocksMintedPenalty": 0}, + {"address": "QPEwYEmYV9KbrAN9c7w5LoVn12P2ZzhFCi", "blocksMintedPenalty": 0}, + {"address": "QPFGD7hcWS8tPPgsUutbN5Kv6gHiH8iL6s", "blocksMintedPenalty": 0}, + {"address": "QPFMXjikegGJhTXov1iZhuMYhwsWB9hFBq", "blocksMintedPenalty": 0}, + {"address": "QPFWxpmz6vammjhEz78UKQRTg14DPXcBS5", "blocksMintedPenalty": 0}, + {"address": "QPGGXfso4hrkxboshRVNgpigNLUjCLXsir", "blocksMintedPenalty": 0}, + {"address": "QPGvKDAhG86Z9UDyo6pSvDLUQkSCi44JfT", "blocksMintedPenalty": 0}, + {"address": "QPHMLPNFsD8zwEBGs8nVtV6VVRBM898Abt", "blocksMintedPenalty": 0}, + {"address": "QPHtZ7t4nYJCuCLNFuokfXmS6MRaezDQXB", "blocksMintedPenalty": 0}, + {"address": "QPJBoE7NqRGn8AF38A9YgBGmeryNjatA3S", "blocksMintedPenalty": 0}, + {"address": "QPJpsppaMRMAuD5BAvauHQREPGi4rQDmPT", "blocksMintedPenalty": 0}, + {"address": "QPK3dyLZ9huDuHKZZCwtu1iyt5x7gsknUu", "blocksMintedPenalty": 0}, + {"address": "QPK9eYcyJ8wcpJhsMt918mX4h7J1yusua3", "blocksMintedPenalty": 0}, + {"address": "QPKLzfE27UJJW1LbW5vaS2iMeKth2yuSsq", "blocksMintedPenalty": 0}, + {"address": "QPKdv3KwHSEK6Vh4D8n57b2e4eNSnE9hGB", "blocksMintedPenalty": 0}, + {"address": "QPKyEwnDLK1sLH4YZTreeEtbj1BZYMRZee", "blocksMintedPenalty": 0}, + {"address": "QPL5V2YyLinjzgzqck17YQB4ZSREw96Wdr", "blocksMintedPenalty": 0}, + {"address": "QPL6xusDP7vvRBX5aPa9aB77Hm9M8xWRd7", "blocksMintedPenalty": 0}, + {"address": "QPLMUaWitU8ZDozhLvnsiRFatRNafxVfhr", "blocksMintedPenalty": 0}, + {"address": "QPMS5Z6ntJeFoUAQRGXaCKFFKV6gWfAo4w", "blocksMintedPenalty": 0}, + {"address": "QPMiNRPgKPuGXcCzUJmyTsSb74iNjHzj1h", "blocksMintedPenalty": 0}, + {"address": "QPMnXUeJNm5MpE7EaVhjntWwyHEke5k23W", "blocksMintedPenalty": 0}, + {"address": "QPNx4neoPpg2BvpMwDxE5p3bpntvzNWA74", "blocksMintedPenalty": 0}, + {"address": "QPNxttWqJmxHmGproserYTVMzxPzxVmJYP", "blocksMintedPenalty": 0}, + {"address": "QPPdeLAbVpUxb6ARpskAS3xdBCyWjsMR5d", "blocksMintedPenalty": 0}, + {"address": "QPPe4sRwHhZnbrMMe7q68xtMX4k9hdvzP1", "blocksMintedPenalty": 0}, + {"address": "QPQCM45Ve5y8kqZzKGZBEcGcodThwy89Kc", "blocksMintedPenalty": 0}, + {"address": "QPQS1G4QqiCR7DEouDs1QG4Ge7m7fsQPR4", "blocksMintedPenalty": 0}, + {"address": "QPQcUbUTFkUaL2Lpes2vhLwoEc66qk4ftR", "blocksMintedPenalty": 0}, + {"address": "QPQkJsGDmmTXMJpucDN6imHuYp6j4zersE", "blocksMintedPenalty": 0}, + {"address": "QPRJ6FMtmR7RW9ug7hB3AdB6ejaUyAecuH", "blocksMintedPenalty": 0}, + {"address": "QPRLj8bpR7tTNaTQCZceqmcUDLm4bcc4xJ", "blocksMintedPenalty": 0}, + {"address": "QPRiLbiSsijGrWE2MtKidstu39B5s2Ljrr", "blocksMintedPenalty": 0}, + {"address": "QPRjGPqJxtJ22KTawBxZk2wdBG5DiKPiCi", "blocksMintedPenalty": 0}, + {"address": "QPRkeBfw6hkaGaTw4SkHtNzGi8Sk4bKZ5J", "blocksMintedPenalty": 0}, + {"address": "QPRmaSMfELTY5fQ3FuM2spQyZm7mPWMNGS", "blocksMintedPenalty": 0}, + {"address": "QPRvCosUk7yi2doyQPN3WEdUBdfZFDgPM8", "blocksMintedPenalty": 0}, + {"address": "QPRzFZVjkotWXLGmnen7CspqTyvEd7bmPf", "blocksMintedPenalty": 0}, + {"address": "QPS5ykraf9AiUvwDEZDuzXyDSaZYXVaCeb", "blocksMintedPenalty": 0}, + {"address": "QPSPq6HPXNraSrJubLADPPCjfqZps58jk2", "blocksMintedPenalty": 0}, + {"address": "QPSehoH4pnaF44hiSsCfmrCK2mrXLFQ4j3", "blocksMintedPenalty": 0}, + {"address": "QPTDAopeUm5KMZtiKoo5jDcR8V1q3hyw9q", "blocksMintedPenalty": 0}, + {"address": "QPTN1czj2K5dzDg7wjbXTHNDVmBwMk5UJV", "blocksMintedPenalty": 0}, + {"address": "QPTis2cGcW7YUeMpEzx4p3fAoC6ZmBfJbc", "blocksMintedPenalty": 0}, + {"address": "QPTujazNJwP1bRSdY6nCTWQ8VLdsxZTtAX", "blocksMintedPenalty": 0}, + {"address": "QPUEuLpu6nn2UuCf9ayMMDS6Rm2DDgwsuC", "blocksMintedPenalty": 0}, + {"address": "QPUNyo9zTEa3L1VTas59ujCbWqDo7bELyQ", "blocksMintedPenalty": 0}, + {"address": "QPUW5B3m9xYTFVN4RSjLDXnGAR6DmacwCc", "blocksMintedPenalty": 0}, + {"address": "QPUdPPm22uYRNByXT6j3LbyKfULDjphe43", "blocksMintedPenalty": 0}, + {"address": "QPVRMSWaXRDVG4M8HJpJoFvUGj4eE7p8z9", "blocksMintedPenalty": 0}, + {"address": "QPVURC9BJn5CvUdP31vHiZHtNNQyvkPxDn", "blocksMintedPenalty": 0}, + {"address": "QPVVTtobyEMvZYW4rWeocy9RpxKDEYzGHT", "blocksMintedPenalty": 0}, + {"address": "QPVrEfrJ5K8TKuiCK9VJnqFnUdqz2efPHQ", "blocksMintedPenalty": 0}, + {"address": "QPW6oUpVaPbnzbR6J24DWj7Q6wA1TxLtNh", "blocksMintedPenalty": 0}, + {"address": "QPWBySRtyHDMA6nuKmVc2fiJUM37tq6iiE", "blocksMintedPenalty": 0}, + {"address": "QPWcZh1qqFTLUtSfFnJ7xdk3fzTvJ2zxpc", "blocksMintedPenalty": 0}, + {"address": "QPWx8oEqXjcwiiEzQ3x9kQfWnC3CcoySZa", "blocksMintedPenalty": 0}, + {"address": "QPWzseBZj9UDGTASKeub5QTGwhpvTvGrAf", "blocksMintedPenalty": 0}, + {"address": "QPXHFRJ6dPTHPw1YgCAj16MT7sRJDckxTs", "blocksMintedPenalty": 0}, + {"address": "QPXLSvi4D8ier3FRfnwNssf6BgYeNn2o62", "blocksMintedPenalty": 0}, + {"address": "QPXZEU7V4HPr8xiiBWso68ZZ3hYq2nrQ4t", "blocksMintedPenalty": 0}, + {"address": "QPY6G624RCV3ZCM6tUBB2Gg47Frzitm3xd", "blocksMintedPenalty": 0}, + {"address": "QPYnG1FH3FXkMpJkj3Ue3FemGRn7ZQoNLM", "blocksMintedPenalty": 0}, + {"address": "QPYoT7nGc9MfRUezR4bTzQeWwXo9kUhWeP", "blocksMintedPenalty": 0}, + {"address": "QPZxWvRke3GA3hsePJGHXvWFP89SJtJt1q", "blocksMintedPenalty": 0}, + {"address": "QPa61EDZaMcoBZ5u3vax6TwvNxbkC7TQS2", "blocksMintedPenalty": 0}, + {"address": "QPa6QiZtKr9kketk6EFRqwCBFVpHueoJyX", "blocksMintedPenalty": 0}, + {"address": "QPaCFPtZsRsWXKkuZmtLAwrrGq8nUTRXuU", "blocksMintedPenalty": 0}, + {"address": "QPaN1nt3WnSXWRjGe939hGe2j75wTFGimm", "blocksMintedPenalty": 0}, + {"address": "QPaPoq6X6pyFo5vttWFP1cMvt2yYNzjLFX", "blocksMintedPenalty": 0}, + {"address": "QPaUT6Xd2YFTeLcU2XHRwk19KDD2YiuMWT", "blocksMintedPenalty": 0}, + {"address": "QPaYg7SG5ioBe27BgiyPQYjyzdJJ9dqtjn", "blocksMintedPenalty": 0}, + {"address": "QPbWJeJjgoeesH4VW8ZYfqasaQZjRnann6", "blocksMintedPenalty": 0}, + {"address": "QPbjKSZKfKbeiKQBnQPTCQeNikCXztmxyd", "blocksMintedPenalty": 0}, + {"address": "QPcA6MNT1ryA8Cm4KFWWvPfzLRzNCJMY6T", "blocksMintedPenalty": 0}, + {"address": "QPcMK57oA1KjdqUJTgNMx43sR2mJid9Hnm", "blocksMintedPenalty": 0}, + {"address": "QPdAhfAKUhkM6XDuTC7szQag7YudBKQGvE", "blocksMintedPenalty": 0}, + {"address": "QPdBG1MzmyfwwMqeaoRgyfN4N4VHj87Xwb", "blocksMintedPenalty": 0}, + {"address": "QPdTnLifyoeJ2ciLSepHqCrsQXULEGotiH", "blocksMintedPenalty": 0}, + {"address": "QPdfWtbhScw9YQ99fa43kbeHTSaxYCajEx", "blocksMintedPenalty": 0}, + {"address": "QPe8yoXjoKbt3qC3tZQVckvEP9VDKi7Hnu", "blocksMintedPenalty": 0}, + {"address": "QPeNRkgo8vhK9GoSNsXc6UpdRPLRUa9tHB", "blocksMintedPenalty": 0}, + {"address": "QPevYgHzNSFES21GEuyQU9jS4ioEnzR9fj", "blocksMintedPenalty": 0}, + {"address": "QPfJvKoSgdC7R7UosGvaV9SH3vSEoXuHqw", "blocksMintedPenalty": 0}, + {"address": "QPfMvAyhpXhL1PVfXZFPQbWAVeq39kVoeW", "blocksMintedPenalty": 0}, + {"address": "QPfPEmu5bEJrgjsvkyGeaU5rQdJ6NZHXui", "blocksMintedPenalty": 0}, + {"address": "QPfkdQ23dcp99bM25N8V8736tcnRmL2kRR", "blocksMintedPenalty": 0}, + {"address": "QPg79PfCaXfMYBUQFKmYSEmMaDPqh7eiCw", "blocksMintedPenalty": 0}, + {"address": "QPgCiwi9FSb7Hqr59crpkA7i8ZsXNy7nRE", "blocksMintedPenalty": 0}, + {"address": "QPgNbD8FeYdW7EtRooZG1PPPeaRRg3WwzW", "blocksMintedPenalty": 0}, + {"address": "QPhZT61KAtGoH4DFpVSj1XuGHkB5HwBpH1", "blocksMintedPenalty": 0}, + {"address": "QPhc4yTNpQnUSXrY2rDAAFNWA2w2voyUWy", "blocksMintedPenalty": 0}, + {"address": "QPhfvnkwg7JsD8Wx9UmEnvxp7PDVSk1CmW", "blocksMintedPenalty": 0}, + {"address": "QPhhpdePin3wWpbMcr9d76RnL8joQ1HRF5", "blocksMintedPenalty": 0}, + {"address": "QPhoNAUDA12h5YC6fggRQbsZ53irRGCepf", "blocksMintedPenalty": 0}, + {"address": "QPhxXjJEQfBxmyUWtmhMZ28HfKoUytEhAQ", "blocksMintedPenalty": 0}, + {"address": "QPiDD7mbxbdp1DnxGyMNZ8jLLhobf7tawZ", "blocksMintedPenalty": 0}, + {"address": "QPiuvgnyrTvQqvPVfMoTiVLnYY38CoEP9Q", "blocksMintedPenalty": 0}, + {"address": "QPjFCMXE2rTLQgrvxwhKeiMxe7zyTgTtUi", "blocksMintedPenalty": 0}, + {"address": "QPjidHLXyFTv38i6mANWU6goEUeFNLfKhX", "blocksMintedPenalty": 0}, + {"address": "QPk4aXvqukhUcSMnPTA4nacX3sBjWhaDgh", "blocksMintedPenalty": 0}, + {"address": "QPkJxJS6YVcJDqNX9Ri8kowacdxD7fw394", "blocksMintedPenalty": 0}, + {"address": "QPkXuadrjte7pX1XojouM6V6vfGLC3JqYf", "blocksMintedPenalty": 0}, + {"address": "QPkcijjTAWXHfjNjMHqg6Y4yfJWFkw3Kyb", "blocksMintedPenalty": 0}, + {"address": "QPkiUFZpcqAXjaE5bfF7ysF1EKLpNcv2op", "blocksMintedPenalty": 0}, + {"address": "QPmDzvXbyUtDB3E7TbbWWokQBwSMSNL2PQ", "blocksMintedPenalty": 0}, + {"address": "QPmeWwiZn8t8ZLJsuXu5c9oc9pYgWP15ce", "blocksMintedPenalty": 0}, + {"address": "QPnCwiUjK39MueB6VH3X8nV6QFg3PgcRRs", "blocksMintedPenalty": 0}, + {"address": "QPnWMqrpcJZK8zBKpFzAvUtYLJfecNhwRv", "blocksMintedPenalty": 0}, + {"address": "QPnfdCQNDDP4LTpUQPEiydgmp734mXNvb5", "blocksMintedPenalty": 0}, + {"address": "QPoXbuywRnPxsrGP5TnYF52wUDwhA7B52W", "blocksMintedPenalty": 0}, + {"address": "QPoqpawUaZsmPo8uUctvMJzNXD7teWY4ka", "blocksMintedPenalty": 0}, + {"address": "QPpbokV5Xn6Q7mxG6KCTqfyZsXkQo24g4h", "blocksMintedPenalty": 0}, + {"address": "QPprP6xgZxYGkesVMuBk15VZtVaJXhzAUS", "blocksMintedPenalty": 0}, + {"address": "QPpxgE3w8Tf9WNpXohMZAtQursNKjdnQmB", "blocksMintedPenalty": 0}, + {"address": "QPq1PzrnjhX87DVXnHxt9c36ps5LrvTGmf", "blocksMintedPenalty": 0}, + {"address": "QPq4TG3FRcvuFjja8n1yaopn4s7y2MbRMC", "blocksMintedPenalty": 0}, + {"address": "QPqKdXE8FwdQ1SPCJkpbtipD6iNxaa49NK", "blocksMintedPenalty": 0}, + {"address": "QPqTG1VNgyrKENgnsr8n7wNPMp5eazw53z", "blocksMintedPenalty": 0}, + {"address": "QPqTVMHASp2WaACV4HfynpEjkUCSkDTkvf", "blocksMintedPenalty": 0}, + {"address": "QPqnY4qK93yyiXumZ511BgFFPy2KnrqmK4", "blocksMintedPenalty": 0}, + {"address": "QPqzYymrhUJHxmDmDXgB75LkJdW9TwSga2", "blocksMintedPenalty": 0}, + {"address": "QPr8g8qZrPouTF9DVdFVDH1m8UWo1jvAen", "blocksMintedPenalty": 0}, + {"address": "QPrDVUGENrCLRJYjHKas8w6oU8shxdv9Fx", "blocksMintedPenalty": 0}, + {"address": "QPrK3DBzJbaEsoWzkqPfWjQbxmKJzjPjkL", "blocksMintedPenalty": 0}, + {"address": "QPryDceMEa8LybQC2eJeo72gcobns6kGzm", "blocksMintedPenalty": 0}, + {"address": "QPrz4ynkUzYc5ACXR3sQUzc7ePKK5zx2V7", "blocksMintedPenalty": 0}, + {"address": "QPsCQy5egqZJ8ffpnxR8Y2vJ8y6ixE69Gm", "blocksMintedPenalty": 0}, + {"address": "QPsMKCwhDuC1ScFMhU9ayFXygnTQoofZty", "blocksMintedPenalty": 0}, + {"address": "QPsPofjpFy7bAeJhjsECqwiGnbtGAtGebH", "blocksMintedPenalty": 0}, + {"address": "QPshn3MqbbsD2cA66KRTE5fxFsH4Pn7RJM", "blocksMintedPenalty": 0}, + {"address": "QPsjHoKhugEADrtSQP5xjFgsaQPn9WmE3Y", "blocksMintedPenalty": 0}, + {"address": "QPszZmrnkM3uWmJdvSfRzLNQ475t3ZYJAt", "blocksMintedPenalty": 0}, + {"address": "QPtGXh1Hs7JeBdkGMwzncxgEH5vDYsHXWU", "blocksMintedPenalty": 0}, + {"address": "QPtKjKFT18xvnBTEe5EPLAEUpFGTtJ2UE6", "blocksMintedPenalty": 0}, + {"address": "QPtrw2fa7dyPpq4kc4aLGWGhdJBNPztCok", "blocksMintedPenalty": 0}, + {"address": "QPuFZxX2iZ1GAbYf132RrocQW67Lzo3wHa", "blocksMintedPenalty": 0}, + {"address": "QPuPpemkxPvbb4mX5bNhmiMYFysKpChupk", "blocksMintedPenalty": 0}, + {"address": "QPueNXYGoAe16MaqWHrSwcL3D71SMFLqBf", "blocksMintedPenalty": 0}, + {"address": "QPv3TXNkWQ2RHg2k8roC1wqB3HzUrDhmnY", "blocksMintedPenalty": 0}, + {"address": "QPv8xFom8j3WwWN1X1y4cPYNH8EAX4e5qK", "blocksMintedPenalty": 0}, + {"address": "QPvbWzaPJRbFCek3KEhwwxmeqUagZVcPrd", "blocksMintedPenalty": 0}, + {"address": "QPvqRZCv7BvVrJhH2AHaAjBAUoqLRbR4Bm", "blocksMintedPenalty": 0}, + {"address": "QPwfCqQUbYH1DHT5UJn3cWqVyPngxAtTKm", "blocksMintedPenalty": 0}, + {"address": "QPwhabAHQckhQ68sfQ7oXWKsCmX2V45HWN", "blocksMintedPenalty": 0}, + {"address": "QPwkoLe44shMrHSnA9dozzxvhdyypG8Gge", "blocksMintedPenalty": 0}, + {"address": "QPxSnbD1xXqCUrsBMv4gpNXmUtaEM4W71y", "blocksMintedPenalty": 0}, + {"address": "QPxY3QsskAgDRHBvfji6Xe8fDDDGL1CzDh", "blocksMintedPenalty": 0}, + {"address": "QPxiNeXJ8ayfk43J2TaZgDBbuReNrBdo9S", "blocksMintedPenalty": 0}, + {"address": "QPxpqbgS6gVyiq9fH2zTfF1G4k5gvmBLPs", "blocksMintedPenalty": 0}, + {"address": "QPyKLMwrhkvxnycfj3Dq8hnEB6kjX71jEh", "blocksMintedPenalty": 0}, + {"address": "QPyRnvJv1nMDS5gjSarNkE81nNhGhSu7dE", "blocksMintedPenalty": 0}, + {"address": "QPyVdoMMPc7XenMy9uzgxwTmSh8eNRmuff", "blocksMintedPenalty": 0}, + {"address": "QPycH8KoNAWzXAAxeeMZnnUavDeRmKaYTY", "blocksMintedPenalty": 0}, + {"address": "QPz9NqBNK6Uy56CTCNHUDCxmofMzLo9D8y", "blocksMintedPenalty": 0}, + {"address": "QPzmYJYAUeVXA7ThtLGhp4swcvL9qn4kAW", "blocksMintedPenalty": 0}, + {"address": "QQ1BEHspzjHvBJw7S81Y79oXQWZ3MaYfAY", "blocksMintedPenalty": 0}, + {"address": "QQ1Jg81Ko6aXKJ2dkAd14bseoZcjv7zzVJ", "blocksMintedPenalty": 0}, + {"address": "QQ1Kb9LDrzFnkbHu2QKDu4PrhXD9d53Vni", "blocksMintedPenalty": 0}, + {"address": "QQ1sArMQVvBKSdZ3gMavuNkcwzGxKiXAd9", "blocksMintedPenalty": 0}, + {"address": "QQ1vrGs3d1gwdUWnczyEHXzeetC8Mkd9xy", "blocksMintedPenalty": 0}, + {"address": "QQ1wg2eS6u3JtJW39MXypiDkaqZt4imThR", "blocksMintedPenalty": 0}, + {"address": "QQ1zZVE1vXWLAc4vMDN4HiMVkdZErQUwxy", "blocksMintedPenalty": 0}, + {"address": "QQ2A4JGbM1b2TxiNYHvM11vr8WQVjyYi7J", "blocksMintedPenalty": 0}, + {"address": "QQ2RfMDjqup4FWfMdk5LynEcJXbuoXJwpV", "blocksMintedPenalty": 0}, + {"address": "QQ2SNjVrtfhyeCG5H4b7aoE1SZmrzivVcu", "blocksMintedPenalty": 0}, + {"address": "QQ2VvMW4WwnedKKH5SfZQuhYBs7rSGkyef", "blocksMintedPenalty": 0}, + {"address": "QQ2ckCHWwcnVmfYRRZgSg3YEAXBZkNXDKd", "blocksMintedPenalty": 0}, + {"address": "QQ2qNiHJn2deTvRQNbH6w6xdmHu2oKsZ3Y", "blocksMintedPenalty": 0}, + {"address": "QQ34L4Tn3UQdfhZWF4rJkX7U8ztpmrRqtt", "blocksMintedPenalty": 0}, + {"address": "QQ3AdeBRRbbbPNAJYUFeZeNZSsU1ngGDDZ", "blocksMintedPenalty": 0}, + {"address": "QQ3rdb6ApGyuggfdvJ1Su7Hd4igm9MGRux", "blocksMintedPenalty": 0}, + {"address": "QQ3ykrhYYcxC2maNSXCGEpQZ5zj8TM3o26", "blocksMintedPenalty": 0}, + {"address": "QQ48bVy6V6U3d7UHNTGpMBJsJAJYH9nnnM", "blocksMintedPenalty": 0}, + {"address": "QQ4DWEpBwkXBjAuqWoQk8aAobqw3xnTK5a", "blocksMintedPenalty": 0}, + {"address": "QQ4JC3avfmjkzoGd5uPDdB7Kua8Bfuf6n2", "blocksMintedPenalty": 0}, + {"address": "QQ4YxRYZoULjzfGyNUU6kx28biF7YYgo5b", "blocksMintedPenalty": 0}, + {"address": "QQ4owCu1zjet6zPpfvfybMnBaEGweaqyW2", "blocksMintedPenalty": 0}, + {"address": "QQ4puLiTvzCnNrGUuqwjZCujJ8j3xfGokN", "blocksMintedPenalty": 0}, + {"address": "QQ4ziysYhvKqgYvzq2to25Ngugb9aKNrmz", "blocksMintedPenalty": 0}, + {"address": "QQ56agJ6RuWw4BRp3VUWDAVXHu2CnXMN7t", "blocksMintedPenalty": 0}, + {"address": "QQ5KvchWujsk8mVDTQmV4eo4FRqrDbKBHR", "blocksMintedPenalty": 0}, + {"address": "QQ5QxWUSFd9cmCooL6yVnA32qUoqPYYEPR", "blocksMintedPenalty": 0}, + {"address": "QQ5p6N3wx2ZizhS3HkcRvTS3EKi5HioL1H", "blocksMintedPenalty": 0}, + {"address": "QQ6AdZ9gCjAi8xc5Pp9yYar142eVVDminC", "blocksMintedPenalty": 0}, + {"address": "QQ6RTZxQ25V2psdexqBvt7Wh8dYH28dXdp", "blocksMintedPenalty": 0}, + {"address": "QQ6WU98gADTvPHdvYywJeLYjwbWrVZbKPi", "blocksMintedPenalty": 0}, + {"address": "QQ7FnR1DcBeZReirCgN8pfveDnSMRgqRwq", "blocksMintedPenalty": 0}, + {"address": "QQ7Mg4xpQHKLsHvQhTAeZGbxaGLP5Uw8gC", "blocksMintedPenalty": 0}, + {"address": "QQ7UZJuDja9X9qb8Tfaa3fyLREPmR8ozux", "blocksMintedPenalty": 0}, + {"address": "QQ8Jc3c1G11iuttBNrFLmgkJGFwCsnZzLe", "blocksMintedPenalty": 0}, + {"address": "QQ8cuMgPMBqeHFBXFkkucTyMRu3sRYYsVA", "blocksMintedPenalty": 0}, + {"address": "QQ8rhGkLn14YRrpL9Gmo2Vm1GJUEVXep3n", "blocksMintedPenalty": 0}, + {"address": "QQ9fnibUNTmkbbBa8DyvDDNP1Gw3veMcSb", "blocksMintedPenalty": 0}, + {"address": "QQ9jwiSabrGyYHTS9jHai9prLky2tLNUuA", "blocksMintedPenalty": 0}, + {"address": "QQ9x3donkiVAtTtpwjwHd4TtoDpxUofnas", "blocksMintedPenalty": 0}, + {"address": "QQA1j7mPHdnhiaj4Th85sch7SXownw7ByX", "blocksMintedPenalty": 0}, + {"address": "QQA99Mai9sbR482AQiEjL8KnvPVmvc28Pn", "blocksMintedPenalty": 0}, + {"address": "QQAKy43zZGqEpyFdPRp3vuphNq9buELAgT", "blocksMintedPenalty": 0}, + {"address": "QQAb6o5tgbEEK4DSFWwpsN1ivCYjhozrmy", "blocksMintedPenalty": 0}, + {"address": "QQAsJiBScvtZ9gK9iErAkuEGpVeBFpUfzJ", "blocksMintedPenalty": 0}, + {"address": "QQB64ykHNXrBwrKbJ9SwVxHno8RVFTcDce", "blocksMintedPenalty": 0}, + {"address": "QQBLHsqYTNJKvvzRRqn5uux1ATWsyHTwaG", "blocksMintedPenalty": 0}, + {"address": "QQBTAwKabQGUY1puzYCWJRRVXJvHSohVBj", "blocksMintedPenalty": 0}, + {"address": "QQBgpSQU4T5YktvmKwiobi4JzmCp1UyD2A", "blocksMintedPenalty": 0}, + {"address": "QQBmxq5BLkL6mqGuuB1hp1ivS2EytyGaK9", "blocksMintedPenalty": 0}, + {"address": "QQBq57bLgxmsTkrurCtj1pTNn7mBHzAv6u", "blocksMintedPenalty": 0}, + {"address": "QQC6deEGCXYgqHuJjaZBJfTk5YiMMwDsp9", "blocksMintedPenalty": 0}, + {"address": "QQCMik7nWk2jLtz15TDuRAsgCktxoBhAac", "blocksMintedPenalty": 0}, + {"address": "QQCiBhV864sm5WeDiYovjFyMDUbhJDmQbr", "blocksMintedPenalty": 0}, + {"address": "QQDGyzyC1JcVLUVTt9YMUrqCBGu4vSJYkE", "blocksMintedPenalty": 0}, + {"address": "QQDKP19ipegSZMxcfqvgNim9Yvm7MbM2fN", "blocksMintedPenalty": 0}, + {"address": "QQDQGBiPgoNU6nB7UqtLxVzFVVihy1Q6cf", "blocksMintedPenalty": 0}, + {"address": "QQE5Lv8nCsTLgFrpDLGigT9VTHdp1eTfBz", "blocksMintedPenalty": 0}, + {"address": "QQEEMBidi5PKDjPnsoL76aNx7mxHdtyiKb", "blocksMintedPenalty": 0}, + {"address": "QQEPkXK4A1jXjUYhDBn71ZrNznnL2GA91E", "blocksMintedPenalty": 0}, + {"address": "QQEQH4usuuzvvdEF2T7vVLSDGuTC96ktkq", "blocksMintedPenalty": 0}, + {"address": "QQEtXMen7U55GJcnc9NA8iqdveQSg2yYwz", "blocksMintedPenalty": 0}, + {"address": "QQEztcmDSxrgzN2NdvjEUh3xeMDK5X7YW2", "blocksMintedPenalty": 0}, + {"address": "QQFNmoi4YXJQit9G64taAYusbK89S8MV9T", "blocksMintedPenalty": 0}, + {"address": "QQFTGupZBXdp1SRY6Q1XtJd9Lgf7CKnSho", "blocksMintedPenalty": 0}, + {"address": "QQFapUjGm6acuFtpy7B6t93DiDW4NU1kZq", "blocksMintedPenalty": 0}, + {"address": "QQGD5r9wuV3bjzYPAtG9VL2cs54SD6zDfK", "blocksMintedPenalty": 0}, + {"address": "QQGLQFajfT9ta6ZvCvtWQdjdtz9koWSPB3", "blocksMintedPenalty": 0}, + {"address": "QQGQHiPdmig2kkfMLSar63KXmtTCjPFQxT", "blocksMintedPenalty": 0}, + {"address": "QQGXRaNCuogDrSXFCSMUPxRUyhfKKb9dx1", "blocksMintedPenalty": 0}, + {"address": "QQHFXA6ughaDWEY5jxzmwjMrCmmj4pAFBj", "blocksMintedPenalty": 0}, + {"address": "QQHtrkdDbmAuK1Xxp6ULgVjZqvU6aEsV3X", "blocksMintedPenalty": 0}, + {"address": "QQHv7ozPP2DPyUXrEi3u95Tp9JMwXzQgo5", "blocksMintedPenalty": 0}, + {"address": "QQJRJgcWY3w86HB9MbSiRY1UCkrEhiAdGy", "blocksMintedPenalty": 0}, + {"address": "QQJYMwAL382TdWEaVjHarrhbMuoJFmAL1E", "blocksMintedPenalty": 0}, + {"address": "QQKKtCByYQ4esicaguPV4XakwGfjMnGtp4", "blocksMintedPenalty": 0}, + {"address": "QQKL47MTE4ETG91uxefx9XiMkgUrBCCw5R", "blocksMintedPenalty": 0}, + {"address": "QQL3iobsimKXkJNmSmTnirzH8b2Nyp5Z81", "blocksMintedPenalty": 0}, + {"address": "QQL8AoJdFH3kdgGsUbogeynpFq5zJpjXX1", "blocksMintedPenalty": 0}, + {"address": "QQLJEcb5DbiBdHbG2yNMqsJzVzTZ6ZyR9z", "blocksMintedPenalty": 0}, + {"address": "QQMiatBzpLasCvG5dBJMjEkQ233pe3QVgD", "blocksMintedPenalty": 0}, + {"address": "QQNCZLUWw9LfmAiYRcF7WSgmZKJ4ix71Za", "blocksMintedPenalty": 0}, + {"address": "QQNMpVBuY6noh8MxmoKFW6x6VHCmpvfZMt", "blocksMintedPenalty": 0}, + {"address": "QQNkwaVZwuA2EmSa8T9MNpxipfSQMAD3xV", "blocksMintedPenalty": 0}, + {"address": "QQNuorBCwKKMwzp86Xr9otBBYknqExinQB", "blocksMintedPenalty": 0}, + {"address": "QQQDsYuAyR39e8SKjLnMkJ6WuoCxRAH8Wi", "blocksMintedPenalty": 0}, + {"address": "QQQMLmrbx7RH1KaRcXjEiVecowmJ1KtvjX", "blocksMintedPenalty": 0}, + {"address": "QQQQ7TDebKDwfrNoN2h1wHq6DzZJppdJRf", "blocksMintedPenalty": 0}, + {"address": "QQQUK8VcKXCHpgmSaQppducbyfKorDyuEY", "blocksMintedPenalty": 0}, + {"address": "QQQaPnAXJrrD3uk7ou18hCyDpLXiRGSB73", "blocksMintedPenalty": 0}, + {"address": "QQQpgEHFaoivuro958kGKbBJ4Z1Rev2Ypn", "blocksMintedPenalty": 0}, + {"address": "QQR87w7gM1NG9s2BxgDqnzTdz9hzVPyFTz", "blocksMintedPenalty": 0}, + {"address": "QQRGMtQuHV77tPQRVk1ejAqMD5Ev9o3kV7", "blocksMintedPenalty": 0}, + {"address": "QQRTgyLCMFaxSJyH1pwoFjbTVUgEvXtk7c", "blocksMintedPenalty": 0}, + {"address": "QQRdDZ1L82kgSXf3G6LdTjCcyaJu2C7NkA", "blocksMintedPenalty": 0}, + {"address": "QQS2jVY323CX7MyRz5ExQsYhTpDwfeLr33", "blocksMintedPenalty": 0}, + {"address": "QQSFur8jQWR6HYBsqgD4bVtGVNwR3eyis9", "blocksMintedPenalty": 0}, + {"address": "QQTF5z6KcE7Bw1sxyNvMsowMNPRzcmjVGH", "blocksMintedPenalty": 0}, + {"address": "QQTZzJ3PZBJCoV5nYSQNwj67qJ982c7bfa", "blocksMintedPenalty": 0}, + {"address": "QQTf93L9ZrYFNRKTMQGEc9ZetivDxSCMM3", "blocksMintedPenalty": 0}, + {"address": "QQThofcN6Zteq2nDfB1aW5caJanicDVoyU", "blocksMintedPenalty": 0}, + {"address": "QQTywusG6qWJ9vSAbg7D6udkLk7oPH9Yy3", "blocksMintedPenalty": 0}, + {"address": "QQV7hwMGQMvo1nUYMNVuZkHPRH35CMf6qY", "blocksMintedPenalty": 0}, + {"address": "QQVuSAxGrAFmDdeSt39kgXwNmCBWqzu5e6", "blocksMintedPenalty": 0}, + {"address": "QQWC4vynQeVaozTvuqj983bAr3vmGZfgHb", "blocksMintedPenalty": 0}, + {"address": "QQWkvFBqDe5rNJjNYuEx2z3LQhLtnmsjgL", "blocksMintedPenalty": 0}, + {"address": "QQWr8wboVNDgKxoEAu3BneBTxNcXYXEDYy", "blocksMintedPenalty": 0}, + {"address": "QQWryDYS6MVSfRtaGpgz8T2dmsTF9EwVoa", "blocksMintedPenalty": 0}, + {"address": "QQX8B8PoMP7tHHQbVzG17VafUoJ8rV6cz9", "blocksMintedPenalty": 0}, + {"address": "QQXPQnVNxb19mEZv1necVnGV9eFFutTn7L", "blocksMintedPenalty": 0}, + {"address": "QQXVgKgRHqQ7tEJYfkuKPwHcsL3r9eoFgu", "blocksMintedPenalty": 0}, + {"address": "QQXgH4CnQCB76BbXhsApu6ShhohFfvoXv7", "blocksMintedPenalty": 0}, + {"address": "QQY7QH2eKq12Yz6a22QHiY4YBoWgb7CuXX", "blocksMintedPenalty": 0}, + {"address": "QQYCMdTxLwABWHHmkiGD8SM5PzeBCTnsZr", "blocksMintedPenalty": 0}, + {"address": "QQYHtLf53TsRmhmeE34x6dDiunGpysr4Z6", "blocksMintedPenalty": 0}, + {"address": "QQYM24t4yiEMpqJvy1bPpiUvGxbWLUBggL", "blocksMintedPenalty": 0}, + {"address": "QQYXt8FJCZTE9pg3CLNpdmGA9JoJmyNQDS", "blocksMintedPenalty": 0}, + {"address": "QQYicwd7DKUx5EF4r6B2PyQWfvUkQKVgw2", "blocksMintedPenalty": 0}, + {"address": "QQZ3onJiJcWnBHW3j5N6oyrBpPtmvVaLUH", "blocksMintedPenalty": 0}, + {"address": "QQZ4bAPJmWWuYPGj4h52EWjb1MX8sTSq5F", "blocksMintedPenalty": 0}, + {"address": "QQa97pDL6aJXzQHxwSPZ2u2AvSLt2P9ALA", "blocksMintedPenalty": 0}, + {"address": "QQaK78HvkcGdVwHuvUgLV9ahbXoueX81eX", "blocksMintedPenalty": 0}, + {"address": "QQaRAB8kV6S1FiSL9Ae54qpbYAQK3mLAvk", "blocksMintedPenalty": 0}, + {"address": "QQanbLRY9xJ8vjfNBtbomMmBpyLAPFRtMf", "blocksMintedPenalty": 0}, + {"address": "QQauRBZ4yhmHLzcdHSZVoEzjPVmozvpDpX", "blocksMintedPenalty": 0}, + {"address": "QQaw85GKyvuMMAiff8UuzeKBM3bmK2rxAj", "blocksMintedPenalty": 0}, + {"address": "QQb4jnu1fu2GHRNGKkgZcsuox4ovSrDanx", "blocksMintedPenalty": 0}, + {"address": "QQbEwkkxY2RsHGACTJEirq6Ppu3tLGu5yQ", "blocksMintedPenalty": 0}, + {"address": "QQbGMo6hwHnFL77q7SyBjneAFrN2jDmwE6", "blocksMintedPenalty": 0}, + {"address": "QQbN2UnXFk1UK4dqc3n54mH4UJWxtqXC2c", "blocksMintedPenalty": 0}, + {"address": "QQbPPkWXe3ECQtdiZynCq3LVhwJL28mXee", "blocksMintedPenalty": 0}, + {"address": "QQbSTLQs9kWcZEU9JBVFcK6HNvZusv2dQV", "blocksMintedPenalty": 0}, + {"address": "QQbwZCg36JNiZDKboeLZvYW6PzhhgvSpth", "blocksMintedPenalty": 0}, + {"address": "QQcD6gGRfrQ9tQ1DnR56ZvUby8k8K1ei4e", "blocksMintedPenalty": 0}, + {"address": "QQcmFkNsbBGMJUGxCWS5ZFJN4ZyqdTi1KY", "blocksMintedPenalty": 0}, + {"address": "QQdZ36SGrHtWuv7iAYHYFaHw9grhpEsJ6a", "blocksMintedPenalty": 0}, + {"address": "QQdbw7LV9iWAMzT6b8cm8Nk28Ex2dFfz5D", "blocksMintedPenalty": 0}, + {"address": "QQddDmV39Wp1abBvFskxTtDMbSADv1srra", "blocksMintedPenalty": 0}, + {"address": "QQdec5Q5mhqcEQp9uMAkc4Ugx5xjJdVsWR", "blocksMintedPenalty": 0}, + {"address": "QQdpjarE5QW5L7GNShdnx1Zw7dbmAWKQJN", "blocksMintedPenalty": 0}, + {"address": "QQe115Xco3RU7KgvEqtFgJHQMXacBb1XwS", "blocksMintedPenalty": 0}, + {"address": "QQeYo2ASkHhwm9dXoZ7bCqiuSbmnixdz7K", "blocksMintedPenalty": 0}, + {"address": "QQeu7RoSdyHF5SEfB2AgxcgNyQogL6Vzwq", "blocksMintedPenalty": 0}, + {"address": "QQeujvwx6kvNRSNiWHQY5uMn3s7DnukaTa", "blocksMintedPenalty": 0}, + {"address": "QQfCSyQFWVxyhzPLfDVat1jK1jP6PNH1CD", "blocksMintedPenalty": 0}, + {"address": "QQfRNWYX6hdcAUohYRRyk46vw7VyUMMVrh", "blocksMintedPenalty": 0}, + {"address": "QQfYQtc5bHQy7HGVR9gRvt2JfxYmAME8Pu", "blocksMintedPenalty": 0}, + {"address": "QQfkyESaNT5r9WiFLwrdhBcB7xpRavqe9a", "blocksMintedPenalty": 0}, + {"address": "QQfucqV2K714F8aq29UfL7BioF1g4Sd9g1", "blocksMintedPenalty": 0}, + {"address": "QQgvkjaToKcNcBtPozHZmCKwV7EyyJSMLP", "blocksMintedPenalty": 0}, + {"address": "QQgyuNAmz35dyXD6oAgF8fMd5iJqTfdDfM", "blocksMintedPenalty": 0}, + {"address": "QQh8wsxzP7oSyhsiQoParhFYsL4BGWWvyN", "blocksMintedPenalty": 0}, + {"address": "QQhHEPpy3WWW7UxovhfYhoysWeuktZbCU3", "blocksMintedPenalty": 0}, + {"address": "QQhaJtw7UMWzne1hgMWg7b1e7U7Rpp6zSk", "blocksMintedPenalty": 0}, + {"address": "QQhiNDRLCzct658e9NymmNM6hQQkLMJ9fm", "blocksMintedPenalty": 0}, + {"address": "QQhvUyCiW5d1rFpAsb4RZ5zYtgfYb48CfT", "blocksMintedPenalty": 0}, + {"address": "QQiTfR9MpMnD1RUS8UuCLso8fo1FhPtyZW", "blocksMintedPenalty": 0}, + {"address": "QQiq6SfijyPRRe24AJSPMAHe4PnZLcbfe5", "blocksMintedPenalty": 0}, + {"address": "QQizEF2FWXcyJ432G3tRV4yrR8FrYDtKkb", "blocksMintedPenalty": 0}, + {"address": "QQjTkSVRKKz4oBQrP85L53xpEjDXm3sqy6", "blocksMintedPenalty": 0}, + {"address": "QQjiCpwLkxEdvYa5EQvrKoxAL6dA6uJCq7", "blocksMintedPenalty": 0}, + {"address": "QQjq5LDLCcmLBK6kBjAPTSUH3hoq5WPhyL", "blocksMintedPenalty": 0}, + {"address": "QQjtvAJHhybC7JdPte97mL69vBrsDc5MzJ", "blocksMintedPenalty": 0}, + {"address": "QQjuZ2pY1Z8Evh42qH8boNtY3QmNDiz7fE", "blocksMintedPenalty": 0}, + {"address": "QQk21DvS9soWachQcfejCiaGyMEYtciHu4", "blocksMintedPenalty": 0}, + {"address": "QQk4WkXMzKkCZ9uh2QVh4CAmnTGvkwa2SB", "blocksMintedPenalty": 0}, + {"address": "QQk89QT3ttgWZyybNjRkqZjt8fxjLoj8ya", "blocksMintedPenalty": 0}, + {"address": "QQkHepEBe2FJMVDxWNNnqdNHviA9XTJ27g", "blocksMintedPenalty": 0}, + {"address": "QQkHnCKdjNzeLEizk8KAN3ngjd7AKnDbbB", "blocksMintedPenalty": 0}, + {"address": "QQkjfsvftFEnKHW1m3cnTknsTv4wgPicZP", "blocksMintedPenalty": 0}, + {"address": "QQkk3kVhrR1PSVyPz8SpPm4Ar1KB56fdYN", "blocksMintedPenalty": 0}, + {"address": "QQm8DCh2eBRjiXufeU4UyBwPVVwxBLjDVB", "blocksMintedPenalty": 0}, + {"address": "QQmF2jdvfumbmLQ49oqt6wURdJtMCxCnib", "blocksMintedPenalty": 0}, + {"address": "QQmfKtkZLyQgdbXBMqxmE2z84VnviAFegd", "blocksMintedPenalty": 0}, + {"address": "QQnZJjMaEWALeBouKY62unhRc8MjzVYV6Y", "blocksMintedPenalty": 0}, + {"address": "QQntnAvii7HgRDxscPS2GRiUURUeC5WQ6i", "blocksMintedPenalty": 0}, + {"address": "QQo2UKNh9GAkbshkknm7C2wp5xdqZjJV3v", "blocksMintedPenalty": 0}, + {"address": "QQoTtD3tsERc2NjWhar2osR73puEu9b6We", "blocksMintedPenalty": 0}, + {"address": "QQobpEvA422rZiCSvw6K9pZEcmVpxfM4vx", "blocksMintedPenalty": 0}, + {"address": "QQohiDqche8BzUW7xL4pzUEh32n8AJi28q", "blocksMintedPenalty": 0}, + {"address": "QQopbj3ZdckKCiWjntbWSB37SxSz7493ia", "blocksMintedPenalty": 0}, + {"address": "QQos7dDEFhx1TMpoRckMowmAQhd5kkEM65", "blocksMintedPenalty": 0}, + {"address": "QQotz1gRGoRL8Q2WayqdjYKm1QVjDeA8dS", "blocksMintedPenalty": 0}, + {"address": "QQpTdwbaEbvwvVuTpTipZpR5BBqWy6RDiD", "blocksMintedPenalty": 0}, + {"address": "QQpViwECii3BRUFcFQJDuqHxAAENt6ZN1i", "blocksMintedPenalty": 0}, + {"address": "QQpX98q5PfFLU8Hs2x5Y1ygALhC7z7rXaN", "blocksMintedPenalty": 0}, + {"address": "QQphcmZVUmMKe4ABBNCr55cz1hMwQG9rSm", "blocksMintedPenalty": 0}, + {"address": "QQpmK34E15T86aRdczTa49anYE8TebVQGc", "blocksMintedPenalty": 0}, + {"address": "QQpy11YDZyCczWBh6KkUW2CRKWXFZnnnzR", "blocksMintedPenalty": 0}, + {"address": "QQqMC1MCu2EMrc5wYpazaLreGFUvkAcXeb", "blocksMintedPenalty": 0}, + {"address": "QQqQt5N3TzqmJJiB8J2TkfbnqxYqUeur8F", "blocksMintedPenalty": 0}, + {"address": "QQqWywByoToLoCy87tueYbkRNcta3kdXK4", "blocksMintedPenalty": 0}, + {"address": "QQqdoczpYUcmcXMUUBsvbENs6Vv43VBxXa", "blocksMintedPenalty": 0}, + {"address": "QQqqmKMx1XVaij5ckFQrVCqunoCE21sR1g", "blocksMintedPenalty": 0}, + {"address": "QQqxKQZynhuwVVkkgFkoCa4ja48gbXhWZ4", "blocksMintedPenalty": 0}, + {"address": "QQr17yB1SD1Xyrq43dfxVegBRxHTLGg32Q", "blocksMintedPenalty": 0}, + {"address": "QQs29LJ3ncCrST2P5A2NnoJAQUNi6zM9j3", "blocksMintedPenalty": 0}, + {"address": "QQs5ypSjU6MBebHVNdbsJaypTbK7FVS9MK", "blocksMintedPenalty": 0}, + {"address": "QQsXsTj32dx6PBRDX5RcXC6sd7ctXj3XDB", "blocksMintedPenalty": 0}, + {"address": "QQsbmnc7KbHtC2EimXoSfsYobCerYzdsBh", "blocksMintedPenalty": 0}, + {"address": "QQskRozD5h8Mqi1tep3o1USRLQWsRtfdFX", "blocksMintedPenalty": 0}, + {"address": "QQsqmz1bJVXki4nnwoujTCH8nnwVjcgMkM", "blocksMintedPenalty": 0}, + {"address": "QQt94zRXQcaD4decArvbqkjVAaRLHAVEQR", "blocksMintedPenalty": 0}, + {"address": "QQtCv9NFLoK97DwzUxRUAN2ZNERyDftEXo", "blocksMintedPenalty": 0}, + {"address": "QQtJk2sRU55bbqoQWR9jTQXksx7UfoECX7", "blocksMintedPenalty": 0}, + {"address": "QQtT3JPHurzQi2kcT3yYhEXzHa7a3iqnM7", "blocksMintedPenalty": 0}, + {"address": "QQtU8o7TBGc9CCoebDqeUAshPd4N1xS198", "blocksMintedPenalty": 0}, + {"address": "QQtzwqkmZMUa9BcDAYHVLRywSf6Z1qbp5J", "blocksMintedPenalty": 0}, + {"address": "QQu1jxovEv5sLr7KoDK1W6HxnMi5983k1X", "blocksMintedPenalty": 0}, + {"address": "QQu5nHs2NbKG9UqYo5j2yZawpAJDy4zepc", "blocksMintedPenalty": 0}, + {"address": "QQuFucy2VVrV6uKHF95Ks1mXyE6vib5sSj", "blocksMintedPenalty": 0}, + {"address": "QQuQJcD1pw6nMNXPTvB1cuUQtHXHfcmiHo", "blocksMintedPenalty": 0}, + {"address": "QQuS2Xwh3xeL4chLRuiAJRVaU9SFqPnf7x", "blocksMintedPenalty": 0}, + {"address": "QQvAZkXUitgkAymawoxL6krpWbsQoWtkiy", "blocksMintedPenalty": 0}, + {"address": "QQvDmGQqGcVrULmCw1mbgA2FZTfoXDSAwz", "blocksMintedPenalty": 0}, + {"address": "QQvqPdm84RTTgzi3cTp2JVYRDkk9eZmhTd", "blocksMintedPenalty": 0}, + {"address": "QQwwFe4zUWpa4mGZ5vycoVYcDfMCQyvFJ4", "blocksMintedPenalty": 0}, + {"address": "QQwx5Bv9M5KVVkZeBn7fkgVBd9HyUZ7gq2", "blocksMintedPenalty": 0}, + {"address": "QQxLj5FFuuXzL576d3UwNWyoFx1FQ7cfQC", "blocksMintedPenalty": 0}, + {"address": "QQxieJdzx7Wavs7qkD1QAUwkpnTiZ685Cb", "blocksMintedPenalty": 0}, + {"address": "QQy9pvfqXTgkPR4LSfNSXN8zRLSQu4EN3Y", "blocksMintedPenalty": 0}, + {"address": "QQyHikW6qkW1LHPQPAQFFowV9YrNr2XdKC", "blocksMintedPenalty": 0}, + {"address": "QQyUBZuXMuJfp9MuhDWzeHPnu3WDJMEvQM", "blocksMintedPenalty": 0}, + {"address": "QQyuqYm4h1XCXeZcWpTWgqAgrFpwH5XZBJ", "blocksMintedPenalty": 0}, + {"address": "QQyxhTXaA9JQ7gswbNRmy5zPncwYeDVES8", "blocksMintedPenalty": 0}, + {"address": "QQz2srBuCNnCL5EryV3hSXXpFgvp4JBgRP", "blocksMintedPenalty": 0}, + {"address": "QQzMijJXbffvJD824FeCFtYo5DTV4rb27m", "blocksMintedPenalty": 0}, + {"address": "QQzT2YMW7ow6vW5g7botqbTx6CX2m8MWDy", "blocksMintedPenalty": 0}, + {"address": "QQzdsnwQaR79GeVcVVViiJtFHwJQfquH7j", "blocksMintedPenalty": 0}, + {"address": "QQzg74qqJFurcivNc65LGzJLhf3V8goxNi", "blocksMintedPenalty": 0}, + {"address": "QQzgxYVcz5gE5yFRthzYPrXML62uBphKFh", "blocksMintedPenalty": 0}, + {"address": "QQzkyrkBNGW2Z6piyS8QhYCo9fiJ6g6mRW", "blocksMintedPenalty": 0}, + {"address": "QQznCAhuEWfA6qc6jX6qKW1zfa97FfyPSt", "blocksMintedPenalty": 0}, + {"address": "QQznPMxHdkFJkW6UJTzGoELpMsHQMQTpWi", "blocksMintedPenalty": 0}, + {"address": "QQzzCy4m8cJBj71BCuMv3g8iYJrE4nD4mZ", "blocksMintedPenalty": 0}, + {"address": "QR1U7H1uxpPMQDZfcJkmhP7rN5muR6CYim", "blocksMintedPenalty": 0}, + {"address": "QR1jgGiTycqJNyBXGm5yZBgdQzZyDM2JEN", "blocksMintedPenalty": 0}, + {"address": "QR1xPjV5tC6khDAQBNY3QtN92BFFpHxQvs", "blocksMintedPenalty": 0}, + {"address": "QR3JHe1u3ezoPvaxsVAvvNYqSkThjkqeKV", "blocksMintedPenalty": 0}, + {"address": "QR4JqCUP9eu7ZYU6TcjogfwtdNMu4oDXg4", "blocksMintedPenalty": 0}, + {"address": "QR4yJUhM649ZhNbHX14pA3Wh4HH3W3NXzS", "blocksMintedPenalty": 0}, + {"address": "QR5YccTikhfxhSDP6aGYqwbqRr84sVWVqA", "blocksMintedPenalty": 0}, + {"address": "QR5uwr2nYNoYG3FXsSNqb2bwHyVeebNbd4", "blocksMintedPenalty": 0}, + {"address": "QR5xsQro2R42oU1bcXoZoqxqBsaKvoZkPG", "blocksMintedPenalty": 0}, + {"address": "QR6SrtcoaNyAT1jwWdV7cCy3RsWaDtEurL", "blocksMintedPenalty": 0}, + {"address": "QR6Uxji1yoDKHRzTnnNBB4RzXbmeQVnzNm", "blocksMintedPenalty": 0}, + {"address": "QR6azc2v4ZTgV5sBG96ZNKWHcDUXMyqX88", "blocksMintedPenalty": 0}, + {"address": "QR6i2FR6fk86VHZkKdo4g2Karh8aQUbyyK", "blocksMintedPenalty": 0}, + {"address": "QR7Evdqxegc9a42bewh3THMtUixmQKNHd4", "blocksMintedPenalty": 0}, + {"address": "QR7HTrycD6ZuP1LABeGjzRdiUUvFcrv1Lh", "blocksMintedPenalty": 0}, + {"address": "QR7RiVyd9NRXBrR2tNctCyGsKqh2mX51KF", "blocksMintedPenalty": 0}, + {"address": "QR7jsaN1q2dPVacYNATbzFRnavk7NSXZHA", "blocksMintedPenalty": 0}, + {"address": "QR8Lcv6MKdmh64ct7zwv1s8n4L3bxEpe5o", "blocksMintedPenalty": 0}, + {"address": "QR8gZ4opSbutAFjqu7QdKkV2jtho4Nti9Z", "blocksMintedPenalty": 0}, + {"address": "QR8oDBHHbP9gZDKmCVj47zWfcRcq6p8Pmo", "blocksMintedPenalty": 0}, + {"address": "QR9RQP8XwPYxVhp5U8s6APuFUX2FqUmKcS", "blocksMintedPenalty": 0}, + {"address": "QR9kC8EWXvHjSP4EiJNPqXhegxNCQs6Xjr", "blocksMintedPenalty": 0}, + {"address": "QR9nMMTycNHkuaAA6G2LjRrXinLKXUQy9U", "blocksMintedPenalty": 0}, + {"address": "QRA2YcuQKYJikDNMGUz5wqENgejNYiWaDz", "blocksMintedPenalty": 0}, + {"address": "QRA4nkGEKCjMospCnodE61tocyfzGuiQnx", "blocksMintedPenalty": 0}, + {"address": "QRACF5ZkSoJowTXT8i1Uwk5K9pbeCnfFMx", "blocksMintedPenalty": 0}, + {"address": "QRB1SyjRGX7qxkwv6PmW6LfJswSDFVnjzL", "blocksMintedPenalty": 0}, + {"address": "QRB3pEoR3HURvVMmfXBhuxThgNMxxjPCoo", "blocksMintedPenalty": 0}, + {"address": "QRBiy8vdcWtwsB76mviTYooio3u7XVnZEL", "blocksMintedPenalty": 0}, + {"address": "QRC3cvonx2PTEM3ayuH67rtgQeVAQAetSt", "blocksMintedPenalty": 0}, + {"address": "QRCe91nhFCXnNmdK28vXgkm8LL4vZUyQuw", "blocksMintedPenalty": 0}, + {"address": "QRCiozzu2KQ9hRiSMw924g9uVb8pXgpV1s", "blocksMintedPenalty": 0}, + {"address": "QRCowt2NMDF1UXRgaJBHcVd7nVddoxn5Zn", "blocksMintedPenalty": 0}, + {"address": "QRD2FT37YJvCPbbT7CMPWbHcqQhP6MB823", "blocksMintedPenalty": 0}, + {"address": "QRD65V4svyA9pHXbi3z8ieua8JM5hxPhH7", "blocksMintedPenalty": 0}, + {"address": "QRDCz6xpY9i3WLip6NCmk4wh5LwsKc2E1b", "blocksMintedPenalty": 0}, + {"address": "QRDYaiCpxPSaLJ9vWemTy1Eg7pChA6UFjM", "blocksMintedPenalty": 0}, + {"address": "QREB4bi4T7YDS9BWqKcUyxTR6DpXEzMtDF", "blocksMintedPenalty": 0}, + {"address": "QREKT8owepgL1e28oEnoB3QeB3wBCWzvZg", "blocksMintedPenalty": 0}, + {"address": "QREd8LbMJh91FrjDf9QDJSMW8p6kohoj7j", "blocksMintedPenalty": 0}, + {"address": "QREhR16svR1vdewmGxVMr6CvFaKoRswp2y", "blocksMintedPenalty": 0}, + {"address": "QRExt8Q2VzUhg7apUWMjDU5iB58yFqRReq", "blocksMintedPenalty": 0}, + {"address": "QRFJDLRfnBawZcHzd4Wwws2vJFSAJpurAd", "blocksMintedPenalty": 0}, + {"address": "QRFLmmvnyJrMdQhiGNGRjh8DXtZxgfa1KR", "blocksMintedPenalty": 0}, + {"address": "QRFMEydffGAaXJdYe3zKjwzjEBKKjbQ1ya", "blocksMintedPenalty": 0}, + {"address": "QRFaCMfmd1ME29Lwtt3WLtunUexWBKCH8e", "blocksMintedPenalty": 0}, + {"address": "QRGF61gKHNW1aGcXdfvXjS3t1vKgUC99Ff", "blocksMintedPenalty": 0}, + {"address": "QRJ4j8JdiWAJDemDXQx9JZHDYaGebMEw5z", "blocksMintedPenalty": 0}, + {"address": "QRJCMCCFcSnDPcD1c7QLYBXTRUryWMQqfM", "blocksMintedPenalty": 0}, + {"address": "QRJF8fgnJQab3bPCqr67tXyKRwRuUp5rir", "blocksMintedPenalty": 0}, + {"address": "QRJMZ86RbrT9pSQ7ZDWs4Ceqeh9LUuGjos", "blocksMintedPenalty": 0}, + {"address": "QRJNMURUtNiWgzD34F6JKgMhUjUmpr81iM", "blocksMintedPenalty": 0}, + {"address": "QRJQ1pL7GBC18JJUPUPtzjc8kNZDL4xSLp", "blocksMintedPenalty": 0}, + {"address": "QRJnMpKXSuZ8D72XQH7XmPMX9JLAfMbwUB", "blocksMintedPenalty": 0}, + {"address": "QRKCN3YiDam1dNWiSiMqfhb5stoi6nAHKQ", "blocksMintedPenalty": 0}, + {"address": "QRKTDC4S3zZWb9QjYt4vVrBQkrqMsEZ7bq", "blocksMintedPenalty": 0}, + {"address": "QRKWT7NWSUVst3HP3a4d8qSGCqY9SKrrXU", "blocksMintedPenalty": 0}, + {"address": "QRKjJCD6G1kQfcQEj45xQEnpfm65hcZgue", "blocksMintedPenalty": 0}, + {"address": "QRLB133hVRizFpPg4Pq2yCPjjCnAMyhits", "blocksMintedPenalty": 0}, + {"address": "QRLCwaXte3xTVFdifRMHi25Aceen8tZ5tt", "blocksMintedPenalty": 0}, + {"address": "QRLM6MX2QKjiNqvaR9jxupBUw1y7D5KLG9", "blocksMintedPenalty": 0}, + {"address": "QRLXXrNKHKkHnujDbGVMvgUiFaXPYa8hG6", "blocksMintedPenalty": 0}, + {"address": "QRLkj8jFzarMY7K19zQRSFm5dTLPuL8FKJ", "blocksMintedPenalty": 0}, + {"address": "QRLxiYqSWSR14ZB7C92SwFaKACHtMWu7z9", "blocksMintedPenalty": 0}, + {"address": "QRMFEAXUigeU7nyUNmEj9gJyhaPds2jkdi", "blocksMintedPenalty": 0}, + {"address": "QRMQuZRz1o8rdfW33ffqtQyrWYi5dB27mA", "blocksMintedPenalty": 0}, + {"address": "QRMZgVsBme1wpnU8BZ2N5fbV1SvQpsSBsY", "blocksMintedPenalty": 0}, + {"address": "QRMw85CmS2efRibarXxVSegxaNTi2u9J1e", "blocksMintedPenalty": 0}, + {"address": "QRNZCcPei3udz2M79aBUyJfogumv5mwG3C", "blocksMintedPenalty": 0}, + {"address": "QRNmFFZZatngUGWzo5cAe4H2ge9ic6cEWP", "blocksMintedPenalty": 0}, + {"address": "QRP4UhiCwZCZpxJReEPvLqz7tDCpxamGFR", "blocksMintedPenalty": 0}, + {"address": "QRPqj8bfqbdpfo3DPdx6wgZiNMJRnpAEvC", "blocksMintedPenalty": 0}, + {"address": "QRRa37mDxEuBV1iQzSw6m6DbWdmUUKgtCz", "blocksMintedPenalty": 0}, + {"address": "QRRbXehUa6S5wHx4RQASqCosmHAhfeQoWn", "blocksMintedPenalty": 0}, + {"address": "QRRidnNwrXCJdDua6ETTMVzwZfXRiHLWHV", "blocksMintedPenalty": 0}, + {"address": "QRRoBoSmXSXRsBGURa1z865TAyR4o255DH", "blocksMintedPenalty": 0}, + {"address": "QRRoK2LVNBaSmQe7Vv4C9PU4E74rXtN2FX", "blocksMintedPenalty": 0}, + {"address": "QRRxfu83Xda15bxiQnnz8zYZqfqM4wQyWE", "blocksMintedPenalty": 0}, + {"address": "QRS5B2stTi6WxwjgcguEYDkwYyychDZrKL", "blocksMintedPenalty": 0}, + {"address": "QRSAnsLe6U8n6KVvgQguVbrhBZJH6u8GAo", "blocksMintedPenalty": 0}, + {"address": "QRSLgEdJCMN5KdRXPrZB2kM5opdGoeP2DY", "blocksMintedPenalty": 0}, + {"address": "QRSfHYBEXEJKLKjzLpsXfkwSFsBKGuqPcF", "blocksMintedPenalty": 0}, + {"address": "QRT7nY9odxEsEvdRrBMdQV4Tc2krkXNS18", "blocksMintedPenalty": 0}, + {"address": "QRTYjXGz7kHHi8VRmwdd5DQWXKMa1BZnP2", "blocksMintedPenalty": 0}, + {"address": "QRTmwZZsoCrVTGoWfyv1kjjtPLKfon3Ngg", "blocksMintedPenalty": 0}, + {"address": "QRTszJURMFW7TDTR9QgtxMXNQPjShGkL5N", "blocksMintedPenalty": 0}, + {"address": "QRU3daFu7KPNV7daNALphb3k8dU8ppgNf1", "blocksMintedPenalty": 0}, + {"address": "QRUJdgSZhMVAKxPuAabSyg1yWboHwPqrv4", "blocksMintedPenalty": 0}, + {"address": "QRURkUsk7f2dN8s7KpcFPeMUEQunsQ5cEH", "blocksMintedPenalty": 0}, + {"address": "QRUbzEbLd7fRjAx2fBdXAH4QS1WQyetvDc", "blocksMintedPenalty": 0}, + {"address": "QRUe6ajZesw25UAXesvsDt8NnUueR19ZUn", "blocksMintedPenalty": 0}, + {"address": "QRV5NseKdRzzwZ5Y53KbzSYa3nqNAcsnUs", "blocksMintedPenalty": 0}, + {"address": "QRVKR2T1EEVPwViPnyJkYL7fu7MHjKjDGa", "blocksMintedPenalty": 0}, + {"address": "QRVbVuSKNe472k8HMqZ3oMtiXBiqs2M6ws", "blocksMintedPenalty": 0}, + {"address": "QRVbgp67vFqv3EogKv55C7xcRHrKmnTTLe", "blocksMintedPenalty": 0}, + {"address": "QRVmq18y9GhNnGBsrGvrbWUkPdBUDzhPmw", "blocksMintedPenalty": 0}, + {"address": "QRWLZqe59io4jUE72GG14hZV88Q4EXkgDe", "blocksMintedPenalty": 0}, + {"address": "QRWPNwSdL7dd7sR6KnNSXkEoGgA8nWwU3G", "blocksMintedPenalty": 0}, + {"address": "QRWQTyjryByDkdFXEvoDeK7MuhC4LRV3TG", "blocksMintedPenalty": 0}, + {"address": "QRWit7rRwsGkPiiCt5m2esGtMuhAwR94F2", "blocksMintedPenalty": 0}, + {"address": "QRWkXKAgsiLiHK4dK5bXnMsCKE7a9Kv4wh", "blocksMintedPenalty": 0}, + {"address": "QRWob7zBJXaqe9ygGqT66tSa5xXeStpJ2s", "blocksMintedPenalty": 0}, + {"address": "QRWopyzeyeDRP7ehyaL1xphYfFcXkp5XRH", "blocksMintedPenalty": 0}, + {"address": "QRWqso1sWLP2zrFcxpJGN7KbA7jjVajegA", "blocksMintedPenalty": 0}, + {"address": "QRWr5QX56weRY72k88htKuvRjdvkWDKFxJ", "blocksMintedPenalty": 0}, + {"address": "QRXNpDFGD1mu258rDWdFo5wGSgJLxbjwgY", "blocksMintedPenalty": 0}, + {"address": "QRYiwj13Dm7QMSBNQevLg1Xz838bpo1rBk", "blocksMintedPenalty": 0}, + {"address": "QRZEgUKTWLWytyZhF3tsq2zVffg2v4Wdn8", "blocksMintedPenalty": 0}, + {"address": "QRZsvTuUXLDqrDtWTEsXU119EwibpbAMKo", "blocksMintedPenalty": 0}, + {"address": "QRZtyH7jPNaVMNRYgiJ9mdj8BPWiuHVMXG", "blocksMintedPenalty": 0}, + {"address": "QRaDfarLJdrt1q861EpLN76VKTV4JDXeXD", "blocksMintedPenalty": 0}, + {"address": "QRaxhMqbgtuQPkcHLLdaBCrVgvxnDrqpgE", "blocksMintedPenalty": 0}, + {"address": "QRb9ZwaY37sMp14cz2kB2BUDKhkDes6oBP", "blocksMintedPenalty": 0}, + {"address": "QRbzLoBVaiLdJPkrsKXT8bHbWZAUhB3Tc7", "blocksMintedPenalty": 0}, + {"address": "QRckkTnsABG7eUGU7mg7ajY4s4viEbgJb1", "blocksMintedPenalty": 0}, + {"address": "QRcm2ipvG6L2aAVAqKDHN5e3LsEB4SHV8u", "blocksMintedPenalty": 0}, + {"address": "QRcrJktsfYwntwhkVxz6QAbhS86DeQ1WPG", "blocksMintedPenalty": 0}, + {"address": "QRcyEesPNpppfEtj9hs4bXs9ePA1M5XRw9", "blocksMintedPenalty": 0}, + {"address": "QRdGLeRqm6jyj91u1DXmNaC5sFPQpbuNMo", "blocksMintedPenalty": 0}, + {"address": "QRdhrw6s6cYjwKinEfPMAyQzn8SCzmGgBH", "blocksMintedPenalty": 0}, + {"address": "QReDYaYC4ccoyzku2UV8TZo5JopLEzqFgH", "blocksMintedPenalty": 0}, + {"address": "QReZLme4AnQDEedYyGL4jv4mLDn7BEK1tM", "blocksMintedPenalty": 0}, + {"address": "QReeJBfUkJre85bytdYicVkePvHtEXYAG2", "blocksMintedPenalty": 0}, + {"address": "QRexATwMCoacaabhF2NamfKKAbFTSu6D7C", "blocksMintedPenalty": 0}, + {"address": "QRfUBgquJEppVkEm3gLci3ALQLtJdXjBpo", "blocksMintedPenalty": 0}, + {"address": "QRfXXYUdncYPshhrD8evYBU3z5FQnpTUVW", "blocksMintedPenalty": 0}, + {"address": "QRfZqJHAprRYihXNiPLx4EFjiYnZEyLdj4", "blocksMintedPenalty": 0}, + {"address": "QRfbVLnEDvqCihhpMicBqSsuZ5Pk27VVjZ", "blocksMintedPenalty": 0}, + {"address": "QRgw7rXTqtPJvNLrjktQxS7vjbBNyZbpSG", "blocksMintedPenalty": 0}, + {"address": "QRh4RC6aPdK76UQBXj6TWV9briXLzQq1im", "blocksMintedPenalty": 0}, + {"address": "QRhBm7s96Jc9wwbYMQRoq3qrXuDzXnr4Lo", "blocksMintedPenalty": 0}, + {"address": "QRhKugcJYyU2DgFepf23ovrV1KhBy1keVE", "blocksMintedPenalty": 0}, + {"address": "QRhTvsrhoeEaCgfRUHMcwrASUKDJbXR9TK", "blocksMintedPenalty": 0}, + {"address": "QRhYNax34qJsBSfSdxaigALhJHtyR2uNMc", "blocksMintedPenalty": 0}, + {"address": "QRheZS81XvrAhmLTfcDJ2XEDGjZ4duKNoG", "blocksMintedPenalty": 0}, + {"address": "QRhqFvWNUL72KR6TueSYn3PXnc8dW88cpf", "blocksMintedPenalty": 0}, + {"address": "QRhzgTVsr6VJWDiCjvLgk1iKLUX6XEhou8", "blocksMintedPenalty": 0}, + {"address": "QRhzh2vC416HPy6egbkzpQT56AbJ9Csznn", "blocksMintedPenalty": 0}, + {"address": "QRiJGMF27h9uKzi5sXBmbbCdsVC8AkSvDB", "blocksMintedPenalty": 0}, + {"address": "QRieC6Rv1z9tS11CHZdsUSkvotEUWf9fAU", "blocksMintedPenalty": 0}, + {"address": "QRig9MNNa1eC45HQvD8xYhtWadFrT7P8CT", "blocksMintedPenalty": 0}, + {"address": "QRikYVQRkcJxUhch7qXrUB4Y9zGEfLfuYV", "blocksMintedPenalty": 0}, + {"address": "QRkatFY6HJCz2JuNrEXvHSpPRRrnSAqzJb", "blocksMintedPenalty": 0}, + {"address": "QRkcKf2646eivvTViHMv1v2EryEVKpgLwM", "blocksMintedPenalty": 0}, + {"address": "QRm8oc6gQdHg5K8QoaemnEx9kiTPbUrb7j", "blocksMintedPenalty": 0}, + {"address": "QRm9G438EGDjHhLDBfLNv1kZZGSrNgCc3m", "blocksMintedPenalty": 0}, + {"address": "QRmQxUj3un28SbY2X25MwqjXBkDnNqN1Z9", "blocksMintedPenalty": 0}, + {"address": "QRn78KQG6bA73MVn5sjttMHfgcLYo3KCeK", "blocksMintedPenalty": 0}, + {"address": "QRnC3vti2A5b9r3QfCNmPLZAcvrWY9FVWe", "blocksMintedPenalty": 0}, + {"address": "QRnmELAKFpN6c6532hPKqn56WxvP283Fzk", "blocksMintedPenalty": 0}, + {"address": "QRpA9jdynFNjAv1xe8qtZcQfCiMHBwm6dh", "blocksMintedPenalty": 0}, + {"address": "QRpFbaGVDdmqvcsySUohDG79B536x8ks9n", "blocksMintedPenalty": 0}, + {"address": "QRpK1gaiYQWr7VsShHeq3cCvo39osreP9P", "blocksMintedPenalty": 0}, + {"address": "QRqALwTtuD9qeXCrDBzQBR6nY5KQPGmpzR", "blocksMintedPenalty": 0}, + {"address": "QRqUybd7T25eWEoyCKBAio3PhCTLRN8BnE", "blocksMintedPenalty": 0}, + {"address": "QRqj7wV3NAYra6p2GdimKeS1u6M4H9fB9D", "blocksMintedPenalty": 0}, + {"address": "QRqjEYYZUMxfzYRxDgtBoLoxSgPJzYafLU", "blocksMintedPenalty": 0}, + {"address": "QRr1GALKhr6xcC5NNWePbhnhRycjJ7dYw6", "blocksMintedPenalty": 0}, + {"address": "QRsRWBBB66Fe23ygAJJmLdpmhRSZpxWWJs", "blocksMintedPenalty": 0}, + {"address": "QRsjkn6KiReRyX626Ji4Egz1W385x34iMm", "blocksMintedPenalty": 0}, + {"address": "QRtjEZAkhRhCD85gXDpo3K1ge64XiB6sX3", "blocksMintedPenalty": 0}, + {"address": "QRu7CWu8TMbniT1Xd7LFVaFpQhRCnYqtYp", "blocksMintedPenalty": 0}, + {"address": "QRuA5LhZ3e7YUPCwsQMijB8vq8MMBma3Du", "blocksMintedPenalty": 0}, + {"address": "QRuB9a4Mb5YsLFW9EaUjcLbPQArnhzDWBK", "blocksMintedPenalty": 0}, + {"address": "QRut7Tk3Dfo36vAvEUCHtKc4Z4gzpfMqsc", "blocksMintedPenalty": 0}, + {"address": "QRv8DxuQDoCt6YKp7kwZqgULYifsq539nQ", "blocksMintedPenalty": 0}, + {"address": "QRvGN1ompjYEoLzqRz4zoJgfUMbTUoTj1p", "blocksMintedPenalty": 0}, + {"address": "QRw7icD18LaM2fJ1opin6rdiQ87hz9Vui8", "blocksMintedPenalty": 0}, + {"address": "QRwXcG5pKKMfphzPcuHkD8ueQppqCy8sQ1", "blocksMintedPenalty": 0}, + {"address": "QRwihANdfba2BdmhdW8DmsciNmSCDeEFtK", "blocksMintedPenalty": 0}, + {"address": "QRwnuYVPUnaoP8RHrdvnXKBBHnEeUNEMDH", "blocksMintedPenalty": 0}, + {"address": "QRwt5hLgG28RX4r7y5ofe8nt5vkuj5zhTE", "blocksMintedPenalty": 0}, + {"address": "QRxR6XvEjUyGsN7vNPToZvPrKE3mddEu9K", "blocksMintedPenalty": 0}, + {"address": "QRxX1NeBwSwJTByxEoE3TJhz7bhsvcwU2W", "blocksMintedPenalty": 0}, + {"address": "QRxczRs3aqSvQk22bPc5WJedTektiGDF6C", "blocksMintedPenalty": 0}, + {"address": "QRxiERWBAHegN59fV6eH5DwmzGc121bTq6", "blocksMintedPenalty": 0}, + {"address": "QRyCssXBqS6DUR6to9iSeCwBZSBBKhbYCs", "blocksMintedPenalty": 0}, + {"address": "QRyPv5ay8pk8BQBNw6XEETjeWK7PYuXBbQ", "blocksMintedPenalty": 0}, + {"address": "QRyRScM9pTtdqoyZy382PYgVFgEiE6FHgR", "blocksMintedPenalty": 0}, + {"address": "QRyunn3X2Xp8EhUGp1ZzJtJz2emVj4viwt", "blocksMintedPenalty": 0}, + {"address": "QRz9cekiXcsC39g6ZLtJ5JRh9SPLk87Utw", "blocksMintedPenalty": 0}, + {"address": "QRzHpHywadTvEJ1fbF9h1tPGg1NKQrP8V5", "blocksMintedPenalty": 0}, + {"address": "QRzR8ort1L3ozJBaF56UGgJpr7J1qEi3QW", "blocksMintedPenalty": 0}, + {"address": "QRzTBMEfY6jFpRcAgiSL6obBVsTss5yooq", "blocksMintedPenalty": 0}, + {"address": "QRztHxp2rB932YnpRUhDVmaLnTqWQZsXaK", "blocksMintedPenalty": 0}, + {"address": "QRztKVhnQMXZzsnXFcgbqz1HDb81P25BHm", "blocksMintedPenalty": 0}, + {"address": "QS1TDcXhTa6qnMUcHYGSg7gyTGdUFEuSZf", "blocksMintedPenalty": 0}, + {"address": "QS1TPZWZv3dBhr3wd5wszSnAkDb7wpthGb", "blocksMintedPenalty": 0}, + {"address": "QS1izq2m1efZJKt2vLzby4j5UeXY4djTjV", "blocksMintedPenalty": 0}, + {"address": "QS1uUUFgXpBJ5oYqGXb8AqtLFLw8YAU9KL", "blocksMintedPenalty": 0}, + {"address": "QS25X9fVEBKQG7tvQnhfSqXXfxDLqYg7hC", "blocksMintedPenalty": 0}, + {"address": "QS2GyUuzQQECKm4pqi21aJwRYJ7NrczRwz", "blocksMintedPenalty": 0}, + {"address": "QS2Sksisf28iyLq7pJnLW6C4kKMY3SqsSS", "blocksMintedPenalty": 0}, + {"address": "QS2UP9LwrMt7mgAxPmN2k5zhg7TsK723rF", "blocksMintedPenalty": 0}, + {"address": "QS2vPctBWZbJ1h4Mk6PU1xXzUn2sYUhQYp", "blocksMintedPenalty": 0}, + {"address": "QS3UiEM4yWoQDcHRWrBiA94BtzrhyD567U", "blocksMintedPenalty": 0}, + {"address": "QS48pLS2xuJ9mFz7Pj7wnjDGrDJjHoApDJ", "blocksMintedPenalty": 0}, + {"address": "QS4EGtWzrUtmtegzfUjgH9xxRYXvwohKa3", "blocksMintedPenalty": 0}, + {"address": "QS5PMtbcrN4EVcvkTg9Dq4F9AXi3ttsf4H", "blocksMintedPenalty": 0}, + {"address": "QS5XeRX4QxQ46Q71GQSRVK16j6Td8CjoyD", "blocksMintedPenalty": 0}, + {"address": "QS5mWgyKAevjZGNETHSpmy27cSjpRkJKtM", "blocksMintedPenalty": 0}, + {"address": "QS5wbaYpNPQfSn71iDugGrW5EXCGGRdSvh", "blocksMintedPenalty": 0}, + {"address": "QS6WAT1Cqj44tGwLqTGzzjMNzCFUJHoqzQ", "blocksMintedPenalty": 0}, + {"address": "QS6cQMfttAfEBqhUM7JXYAhZdVZogYMRQS", "blocksMintedPenalty": 0}, + {"address": "QS6dm3eKqSNSxkiagzsbdfyzVn6bLLwgNE", "blocksMintedPenalty": 0}, + {"address": "QS6eH9erj4skLpx84dBgLdwqMGTon9gi79", "blocksMintedPenalty": 0}, + {"address": "QS6qBZbV88NCURWVCuSxK8ZnWYaQpnbMed", "blocksMintedPenalty": 0}, + {"address": "QS6wPSDh6opaLjH9aoqipsdvGnJdcbLYsw", "blocksMintedPenalty": 0}, + {"address": "QS71MayX7tob1jauMyGkSLWJitAhPHBYrt", "blocksMintedPenalty": 0}, + {"address": "QS7xcLZbutXTVE26esqvRnocjydrN4nWkW", "blocksMintedPenalty": 0}, + {"address": "QS7yjcT5o33kBzjFsY8JF3MmaibavBLVMC", "blocksMintedPenalty": 0}, + {"address": "QS83KXFgAWbAeJm4QMDYdemA6CKemGd8tS", "blocksMintedPenalty": 0}, + {"address": "QS83nAQAVUCJTrj7SKFFGrYoHK5PVYPyPo", "blocksMintedPenalty": 0}, + {"address": "QS8Y2ozxw81ih6YTF6c5ZUFanwMSKhhTfC", "blocksMintedPenalty": 0}, + {"address": "QS8u5CgraHStSJWixpGJCoQcdceojSPa6v", "blocksMintedPenalty": 0}, + {"address": "QS9AVT47nygVEg4EGmWUbnmTtu62CBhcwk", "blocksMintedPenalty": 0}, + {"address": "QSA5wvpQEaixAKGqJQQd5MNYp9M9EZfynw", "blocksMintedPenalty": 0}, + {"address": "QSAd32J96u9hHUegV9hL4dZVL5NSzMftBp", "blocksMintedPenalty": 0}, + {"address": "QSAtzJb4joZTjjPGeF5Jfud4V7TWWeDcSU", "blocksMintedPenalty": 0}, + {"address": "QSBJTLj7v8a55AhPX46mrAm77fMSqRyCDJ", "blocksMintedPenalty": 0}, + {"address": "QSBL3Wn1Z8yt6NEJgcJkWQew8mY4X5jeWn", "blocksMintedPenalty": 0}, + {"address": "QSBRvvByBWwmZUyx9gb6Fsyps8cfUdj8ei", "blocksMintedPenalty": 0}, + {"address": "QSBfsDVJopjw4hXxGSdz3NrThaESTQ21dA", "blocksMintedPenalty": 0}, + {"address": "QSC4DeeeWMF9j1DG66HYyFxC39drKVkLZZ", "blocksMintedPenalty": 0}, + {"address": "QSCK5a9TEPQRxQXs54KuxZF8emehooFJfx", "blocksMintedPenalty": 0}, + {"address": "QSCPzusS47RLbtruZwJL1ctFqVefFGNwXb", "blocksMintedPenalty": 0}, + {"address": "QSCzwM4nvDUfLXMYsD5HGywS2PBHNU31MG", "blocksMintedPenalty": 0}, + {"address": "QSDYRKA2cMdYKj7tL5SQMDByTQpo3Dqimd", "blocksMintedPenalty": 0}, + {"address": "QSDgDMEetKG9ZP33fKiBNTd8H6CdNUv2hf", "blocksMintedPenalty": 0}, + {"address": "QSDnTJ5AovjkYeCw26HCr3Q3dr37Sg83iY", "blocksMintedPenalty": 0}, + {"address": "QSDyR9HazMo3bewMtJmPS145TtyWgUgtQL", "blocksMintedPenalty": 0}, + {"address": "QSEELqb27Kiteo6mDiLRFbzguEN2pF4eDW", "blocksMintedPenalty": 0}, + {"address": "QSEfRSmeFnHpARKEuy5vrBRWCu1Pw6uTgE", "blocksMintedPenalty": 0}, + {"address": "QSEgKFh7qSyKzXymDvJJZKBu9MZ8KaB6Lp", "blocksMintedPenalty": 0}, + {"address": "QSEq4QFvcVPBY2B1oEEnsLe5sNZ7bFgodr", "blocksMintedPenalty": 0}, + {"address": "QSF8o3DskzpFkKoPn6ixw6HUGjFvqrEnJF", "blocksMintedPenalty": 0}, + {"address": "QSG2weqnHKSZB6dh4PNeiMkKQvWs2ghK9j", "blocksMintedPenalty": 0}, + {"address": "QSGnwfFx4yd4pZcihsod9VC8QBHb2Kos5A", "blocksMintedPenalty": 0}, + {"address": "QSGx6P9rvjPH4qBBG8jDMXPTvNoFJ2GAwR", "blocksMintedPenalty": 0}, + {"address": "QSH3v4Vv86qdNCAAgVt1KvpvUMPZoaVW9J", "blocksMintedPenalty": 0}, + {"address": "QSJ2JnthzLmkKtph81dJEt6nbjBTuMhC3i", "blocksMintedPenalty": 0}, + {"address": "QSJRSoyGW3P5CcGdvzGG8G5b4xMGS28iuA", "blocksMintedPenalty": 0}, + {"address": "QSJvPMGh8eiyaYn9gMqRNCbgFrCWvoBYoW", "blocksMintedPenalty": 0}, + {"address": "QSKB1QYgU3rCiikyvFPPzodsBHyfc1vFfL", "blocksMintedPenalty": 0}, + {"address": "QSKDER5djRi8USodf2x4xSe297a22w73Js", "blocksMintedPenalty": 0}, + {"address": "QSKLxw2dU1Vc1gr1niBzZdYcBVGvDc67Eh", "blocksMintedPenalty": 0}, + {"address": "QSKXDKpex96Dn8NcqaVJQa1wWjUY7JeBfJ", "blocksMintedPenalty": 0}, + {"address": "QSL8oN5MfRFmrmdKXXAphRJ8EwNn9VnNFN", "blocksMintedPenalty": 0}, + {"address": "QSLKVJ9S7Lv1zeB5x24JwnUjcXEDUcLQTA", "blocksMintedPenalty": 0}, + {"address": "QSLWG4wa5WYCXRMm239ZtMmqn4p88PUVjL", "blocksMintedPenalty": 0}, + {"address": "QSLjJ2gh4iJbqrJ2SRSuPXeEcqKUbeEewc", "blocksMintedPenalty": 0}, + {"address": "QSLte7Nb2Yfr5JB8YoE2eUDty3zG5b4frB", "blocksMintedPenalty": 0}, + {"address": "QSLuLB6PYeGy8qEPv1tTFGEdSoUrNUmWVU", "blocksMintedPenalty": 0}, + {"address": "QSM3ykyqSJ9TwwFooiwQP781FFku5mQrxU", "blocksMintedPenalty": 0}, + {"address": "QSMMUjebEqV5oN8Da8LJj3nyfgozSDJ73E", "blocksMintedPenalty": 0}, + {"address": "QSMfLwNTpCabGCnjEs5KdYWEiX2K6g8NeB", "blocksMintedPenalty": 0}, + {"address": "QSMkriXyS9nMY5UkWFPCvp5JNW29stMQa1", "blocksMintedPenalty": 0}, + {"address": "QSMqLri9jNxAyXj1VrdBpiWXjN1Decxp2s", "blocksMintedPenalty": 0}, + {"address": "QSMyYwa2jYmnu4ftFdJa9Q2SrPeDiSciez", "blocksMintedPenalty": 0}, + {"address": "QSN9JL6PqDb7CiWJVigxMvxsjEb2G1kghF", "blocksMintedPenalty": 0}, + {"address": "QSNSBzudRjMN5FRkgJiyYRtZg1Whfpyb3s", "blocksMintedPenalty": 0}, + {"address": "QSNkmVX8cCFRaAJTzELmYPaTZJngdnTCJx", "blocksMintedPenalty": 0}, + {"address": "QSP5aB3K24opG9avsxmDX2Vpw7fhLTJLmo", "blocksMintedPenalty": 0}, + {"address": "QSPMbojeDaMDd7foraVhhhLTma6xdHhNSC", "blocksMintedPenalty": 0}, + {"address": "QSPnJrGKkEp9YM87ZJJY7GSu7UcDJayaci", "blocksMintedPenalty": 0}, + {"address": "QSQY4EobKhfowXNsBBLCkoxa7gq7nLyNHK", "blocksMintedPenalty": 0}, + {"address": "QSQba2bjekx9W1gio73zphSNyKu8jPpYyx", "blocksMintedPenalty": 0}, + {"address": "QSQzzLtLmzrPJXBVrBXyoGTL7gyezc6oae", "blocksMintedPenalty": 0}, + {"address": "QSR4ce2r9F6vLqKeHuJ21Wjn8Cq2n4gTb3", "blocksMintedPenalty": 0}, + {"address": "QSRUZTmSFyG7AwAzXsgErWQanZPRHACsD2", "blocksMintedPenalty": 0}, + {"address": "QSRrF6Xb7fHZHAzxVqbMoKCMNc27TMBinw", "blocksMintedPenalty": 0}, + {"address": "QSSL7SowbBVgZ4ujRoTbZgmGUtFRraeF4c", "blocksMintedPenalty": 0}, + {"address": "QSSejk9tyrDjirKJUSU4AwBZQupcfjPwhw", "blocksMintedPenalty": 0}, + {"address": "QST7ec3D8MBT1SZLzBECVeyEYFnAcYEupd", "blocksMintedPenalty": 0}, + {"address": "QSTDBZCEdmuJBZzUBFc4y5mRzbPMeu8m63", "blocksMintedPenalty": 0}, + {"address": "QSTJ3mNfCfNb5RcnNZHkGCxW5UXduqdyUt", "blocksMintedPenalty": 0}, + {"address": "QSTJfen2UT21DBLm87GDDpy1hJDoYdQLna", "blocksMintedPenalty": 0}, + {"address": "QSTLVn7NjorAobCDTrzHyT9JaJXfeyDEo1", "blocksMintedPenalty": 0}, + {"address": "QSToUAARqHr8i1s6TJaRxo9hnMzzcvAwqp", "blocksMintedPenalty": 0}, + {"address": "QSV5bLb5hxhZgknM6Sd2t2uisyFoNoPy2K", "blocksMintedPenalty": 0}, + {"address": "QSVAn7jdHDme7sWS7gCXZwLehPF3UR39N5", "blocksMintedPenalty": 0}, + {"address": "QSVEJbCxf5mN77mRec4CvXY817Uo5pkGjw", "blocksMintedPenalty": 0}, + {"address": "QSVGvNbFRJKLf2ETq4tR5CjNVmuYjU5rpS", "blocksMintedPenalty": 0}, + {"address": "QSVys5uHG8ktRvtrcYaQ6uZJmxv3paxcye", "blocksMintedPenalty": 0}, + {"address": "QSWCPPfFP6Sscgqx5JRGVombP9bXkrGmzW", "blocksMintedPenalty": 0}, + {"address": "QSWECHmUy6V59PhgynBvjmbP7ZDUdxtNag", "blocksMintedPenalty": 0}, + {"address": "QSWJqMqo1xBaETfgZ8aoNEKyqeiEzV4GEu", "blocksMintedPenalty": 0}, + {"address": "QSWcCEfXNibv9G2AVU8eEVh82wUX7Kc8Gb", "blocksMintedPenalty": 0}, + {"address": "QSWoy2X5sWiAVNoyE2fgu65wQo9w9Ps1r4", "blocksMintedPenalty": 0}, + {"address": "QSXNU76q9Pt36XyeZdHDj8NkZ8BVozFRQ4", "blocksMintedPenalty": 0}, + {"address": "QSXSwW3NwSmdRvm6GmQXzYygtkBvJbgZFX", "blocksMintedPenalty": 0}, + {"address": "QSXaGmh2JcpiKTuJ1Mt3LwP1k6cqaJMhWc", "blocksMintedPenalty": 0}, + {"address": "QSXaS1mDCdGsBU2sLNYxFSqhUfHMF6xfvr", "blocksMintedPenalty": 0}, + {"address": "QSXb93Luqh5kDSDXbYzZErroH4ptYgRyK2", "blocksMintedPenalty": 0}, + {"address": "QSXwqJv9eEjMXCUr2UTMzKTNCx8w8W6m8e", "blocksMintedPenalty": 0}, + {"address": "QSZ2Gm4ySJaffFrgU8tqQNSMuwQn35tFSt", "blocksMintedPenalty": 0}, + {"address": "QSZPzp4e49XiQuN5cUDJAyw3amFnt8xwnp", "blocksMintedPenalty": 0}, + {"address": "QSZrYw2fDuJfgQnpb1QQCdkZDPxnQsMtmU", "blocksMintedPenalty": 0}, + {"address": "QSaDKdNqeBdNPyk54LwGjNExWYPKsrir5M", "blocksMintedPenalty": 0}, + {"address": "QSasgMJRhf5EubrcT39CZxM4S1zZpK73hS", "blocksMintedPenalty": 0}, + {"address": "QSbiUSa48CDu2gs3W33H8GnMk9Nf4zoz6A", "blocksMintedPenalty": 0}, + {"address": "QScA7k474KiY65ZzpZTqYePwkYSBpEVLXi", "blocksMintedPenalty": 0}, + {"address": "QScK5Mhry2qN5gj98Zd1Pd43GRDSd4fizs", "blocksMintedPenalty": 0}, + {"address": "QScRBX71dPBofoRz4WFXuRqNXF7vSNPMvf", "blocksMintedPenalty": 0}, + {"address": "QScXD64ij6htjw4QiXWSeLSLvsFdp6ANvC", "blocksMintedPenalty": 0}, + {"address": "QScyiiyXmS9rJqcT4aWc9at5Hdy9v1H1UA", "blocksMintedPenalty": 0}, + {"address": "QSdQhEMXLJgYyNkVcZQQjWVg7ToMqK2pKX", "blocksMintedPenalty": 0}, + {"address": "QSdSYPW2BhoG3g3roYaxeXqre5iFvqg3Wz", "blocksMintedPenalty": 0}, + {"address": "QSdU3mWB1cSHpgA4BNteDFg9rSd5er3W6s", "blocksMintedPenalty": 0}, + {"address": "QSdcHB5Ux311ZctUp2RH4icXABjv6k5j2n", "blocksMintedPenalty": 0}, + {"address": "QSde1H4zYKMTpY3EKz1oFtKn7DDxPWc5hY", "blocksMintedPenalty": 0}, + {"address": "QSdxB43sezmrw6eXPxm6JEJZpK1rc6rzuz", "blocksMintedPenalty": 0}, + {"address": "QSdyWdm3AM2bq7G6UHTEVi1opPLkrVoY75", "blocksMintedPenalty": 0}, + {"address": "QSe3aZpoF89yxvX9HH4nX7wNbABMJmaoBz", "blocksMintedPenalty": 0}, + {"address": "QSe4dcDE1q1La4Wn9RDekwJ94Vxamc6aHq", "blocksMintedPenalty": 0}, + {"address": "QSehZkwUFHGq55dYMcLq4AiQRaeVneWfGw", "blocksMintedPenalty": 0}, + {"address": "QSfNZZNiLa3UVbCB2SFKo8V55mRJ6hY6U1", "blocksMintedPenalty": 0}, + {"address": "QSfTCK3oeHxyHBA7aP1U2UP3PyQg2ZTxJP", "blocksMintedPenalty": 0}, + {"address": "QSffZQLJcgZyYp1THRxxnycLZp7kyZfPoD", "blocksMintedPenalty": 0}, + {"address": "QSfkkzs4vuSZZEV7dAxXi4RJB5Nvd8sDQo", "blocksMintedPenalty": 0}, + {"address": "QSfqKxQypR1NFzHs5L96afQQXsra4W7xgu", "blocksMintedPenalty": 0}, + {"address": "QSfxHmo3qA52MKvC73dm3Be3XQkTbuPu7R", "blocksMintedPenalty": 0}, + {"address": "QSfz6VgoZ9NuJdEJu1j3zj3efbYKmmTGrL", "blocksMintedPenalty": 0}, + {"address": "QSfzTYqSboeKHM8ZKGPhrD7CTbEFVzBKWa", "blocksMintedPenalty": 0}, + {"address": "QSg8oNJD3xHYE9fzVta6GmmCfnPMEQrKLz", "blocksMintedPenalty": 0}, + {"address": "QSgGRGkBfNDnXRFkZ1dMw3odERvahU4mXP", "blocksMintedPenalty": 0}, + {"address": "QSgJVfqNY8pDrmfpShDmcV3t5o5L9XxzQu", "blocksMintedPenalty": 0}, + {"address": "QSgSncp1jgq2hok6FpMzmTnLjpYJbBGLon", "blocksMintedPenalty": 0}, + {"address": "QSgU6ufxDVkeSiWZLMNKGMFecz8PaoT3e8", "blocksMintedPenalty": 0}, + {"address": "QSgd9d9hPZpMNn842JPo2c9tmk2pg9Ke1j", "blocksMintedPenalty": 0}, + {"address": "QSh2LSPcx2ekRQJFv3643tViwjsTMgqJwb", "blocksMintedPenalty": 0}, + {"address": "QShUWZXqvYt8ynqATtanbxnQrDyHgfbbwK", "blocksMintedPenalty": 0}, + {"address": "QShfkcVCp9As6yQRJHy8nJaaWqpBptDKcf", "blocksMintedPenalty": 0}, + {"address": "QSi5yTQ9LJkNGSkNfLM7m7AzTQndbv4Wz1", "blocksMintedPenalty": 0}, + {"address": "QSiXiSNsiVAj31iUMmQgrC1h8aYCMGFeSo", "blocksMintedPenalty": 0}, + {"address": "QSiYkr1DrD3bAHGxqoD6cgquwYdSCKkQtc", "blocksMintedPenalty": 0}, + {"address": "QSie64bcpEPuCxmHrQMNZhs3j7Zi9uQ6xU", "blocksMintedPenalty": 0}, + {"address": "QSijCpxDgCiUXiYnsUUx3oA9dqJqT5yUGC", "blocksMintedPenalty": 0}, + {"address": "QSjHqo5x8LdJPhtJz7uA8N5x3Zemtyf4oC", "blocksMintedPenalty": 0}, + {"address": "QSjMmC89F4TraZjxAMv491CCaW6aKTAWLF", "blocksMintedPenalty": 0}, + {"address": "QSjNrHcDZvd6pDmRxzWCAKkhxTPAAJj86w", "blocksMintedPenalty": 0}, + {"address": "QSjbPVv3Ecjf2Z67uMzmJbKcSyryDMFb6h", "blocksMintedPenalty": 0}, + {"address": "QSjiV1EcWZUGbTsWdNAxmDd9uvHWTr2rdf", "blocksMintedPenalty": 0}, + {"address": "QSkGgVECk3yFhDfRFtfAF8cXW7bESknNCB", "blocksMintedPenalty": 0}, + {"address": "QSknfAheyaEn878fmszkrupPZ4YwtNrsR4", "blocksMintedPenalty": 0}, + {"address": "QSnJV3meEzKeW3RNzys2TTE72g9QceFyqy", "blocksMintedPenalty": 0}, + {"address": "QSnTfLzcrHgiciRCiNMXC9BoASh2Kohsjf", "blocksMintedPenalty": 0}, + {"address": "QSnhuN1EV2i2tMGhB1aJC1mmaxsF8Pzphp", "blocksMintedPenalty": 0}, + {"address": "QSnrDsWFBA4EhtcBQNyh7rmfaqq7X6gj1U", "blocksMintedPenalty": 0}, + {"address": "QSo1FsB3JnmVMwdrU82vmQcRGmvFgjA8n2", "blocksMintedPenalty": 0}, + {"address": "QSoR4nse1meezhCjkdxsAzEzJtdHY8gbmK", "blocksMintedPenalty": 0}, + {"address": "QSoSnTfqzqzwq5f9Z1qPaXqkTsh5VyRcwQ", "blocksMintedPenalty": 0}, + {"address": "QSp6WhkviZnVUXrLVayndTiWaUBknaddCz", "blocksMintedPenalty": 0}, + {"address": "QSp7AdcGSRdELtbBAu9wwpC3ih3TNKCvtr", "blocksMintedPenalty": 0}, + {"address": "QSpCEqKCa8WCVeBi8VwCFcBtn3czfYnvq2", "blocksMintedPenalty": 0}, + {"address": "QSpCTveXXk4AdFSYfcn5i3gwBM5sR3HKVL", "blocksMintedPenalty": 0}, + {"address": "QSpa9yh6yA8oPcRbhHVPpVVvRVFSj6SWKr", "blocksMintedPenalty": 0}, + {"address": "QSpumTF6SJUDYmDgNik99mcYbRTwujUQAe", "blocksMintedPenalty": 0}, + {"address": "QSqCqxLSPf98bUXX1xqh9yGhsKcJ2BRpNX", "blocksMintedPenalty": 0}, + {"address": "QSqGtvNTz9DcuDLZuGQSFju83E7zWEpoGR", "blocksMintedPenalty": 0}, + {"address": "QSrAuNah727hQU4nZFkxd9AdeKkLmUJb5o", "blocksMintedPenalty": 0}, + {"address": "QSs6g28Qmk5kFnznAbq1oNHRX8MM3LdiuP", "blocksMintedPenalty": 0}, + {"address": "QSsDS7wW6JeAbobortvXgfCPWTRv6qkpaU", "blocksMintedPenalty": 0}, + {"address": "QSsJTRd1qmmm3H8SGKsiBNy5zBars6GgXP", "blocksMintedPenalty": 0}, + {"address": "QSscW8dtBxecSnJT3tqsAnEg62Ur5HczCP", "blocksMintedPenalty": 0}, + {"address": "QSskqdeTG7nMaaebFVJWdu5bjHE7UhMFki", "blocksMintedPenalty": 0}, + {"address": "QSsoq1byDGkYYTF3Q89mFMqSV5yUJ1ga7i", "blocksMintedPenalty": 0}, + {"address": "QSsrrixGjQ9mZEhEFhP2LsjRVMhAJ1PTNe", "blocksMintedPenalty": 0}, + {"address": "QStYpM4zJ8BW5E2gmbn5kDKMgqjSDSQva8", "blocksMintedPenalty": 0}, + {"address": "QStuZbygH2EquRcn9D6SqHCg247W2FsjhR", "blocksMintedPenalty": 0}, + {"address": "QSuDJkGjUo83EpHbcU9zpnRkLBEr4WoWe5", "blocksMintedPenalty": 0}, + {"address": "QSuDZkJyCS6Y3v2cim6jV4ySxaCkauX8ih", "blocksMintedPenalty": 0}, + {"address": "QSukoXVdPN8Aa5jqgXruVBHyveHckWs7vE", "blocksMintedPenalty": 0}, + {"address": "QSup2mtdr3zueBLGWfizzRxLbFCZVjgLy8", "blocksMintedPenalty": 0}, + {"address": "QSvVHZisMLZFjo27wd8PtB7pHs63j8VtT4", "blocksMintedPenalty": 0}, + {"address": "QSvwHxGTQrmy9WEaCt2nfPZtgfRtUuQHCK", "blocksMintedPenalty": 0}, + {"address": "QSvyv1VKQkcZ58EnsDEHZav6tw4rvANBFy", "blocksMintedPenalty": 0}, + {"address": "QSwLmVRKS39rMCCSL8utsd8XmbhvC1Scpx", "blocksMintedPenalty": 0}, + {"address": "QSwtKLJksjPZ7yD1A6Q8mDQCmSL6UtuDpi", "blocksMintedPenalty": 0}, + {"address": "QSy3EAhPJnHdQWcZw8svyNmvU4YnPufnNb", "blocksMintedPenalty": 0}, + {"address": "QSyGVd26GtNygwopyCXtX1WfSEMC1tJrHU", "blocksMintedPenalty": 0}, + {"address": "QSyPEM1UhUzD4B3Mz4aHmv7stiQk9NQ2pz", "blocksMintedPenalty": 0}, + {"address": "QSyQw9QJGat8a9p2yKrqtYv6FeSQmwgnpC", "blocksMintedPenalty": 0}, + {"address": "QSycqKcuFJ3Crq2tfTNGZ6RkPNv3au9F8K", "blocksMintedPenalty": 0}, + {"address": "QSyjw3kTbZts2M4udKCy249P5su4WNo5qS", "blocksMintedPenalty": 0}, + {"address": "QSzdnvv2KM7HMbGQ52Nm1fNx7RuVCxiY3N", "blocksMintedPenalty": 0}, + {"address": "QT19zW5jWo2D3kNtSEHSQ1NHkjcaPnJEFJ", "blocksMintedPenalty": 0}, + {"address": "QT2LoGXtVGYKdfdkUaSscK1gFvh3TxFgSL", "blocksMintedPenalty": 0}, + {"address": "QT2RDa24AABKywwUmkWTPpAYorrcdU8rvA", "blocksMintedPenalty": 0}, + {"address": "QT2iEovg7wUoaHuB5EAL6stsFv4LWzxE2U", "blocksMintedPenalty": 0}, + {"address": "QT2kbw4L6NM7hTGK3WNduYEnYgZSMGVfto", "blocksMintedPenalty": 0}, + {"address": "QT33hnKSi6wRX3xuQ7ygo4bvJQ9saAdmLt", "blocksMintedPenalty": 0}, + {"address": "QT3PHbMYJZcX9rtNWJHrRJGz7vHzkiHzQM", "blocksMintedPenalty": 0}, + {"address": "QT3mP9Qe3j7Gb7E1yqDkuZ6uu79FxYJuyk", "blocksMintedPenalty": 0}, + {"address": "QT3u9nVRpnKgECoPpgw4sAmjYCR4bQZnXq", "blocksMintedPenalty": 0}, + {"address": "QT4Q9xGiPjt5z9taHQfSqT1P2MYoUgQC2z", "blocksMintedPenalty": 0}, + {"address": "QT4X6XRYahGpkvb1yYbqDAU2bZhk8xrjkW", "blocksMintedPenalty": 0}, + {"address": "QT4YQYAYsxU3c4BXt3A9xqom9r6vRESaT6", "blocksMintedPenalty": 0}, + {"address": "QT4hqaEKMonHyBc2HMuZucFEGLH7jFPWJo", "blocksMintedPenalty": 0}, + {"address": "QT4t2iYyeww4S82EcNq9nWCV2A2ktvYQp7", "blocksMintedPenalty": 0}, + {"address": "QT4tyt118c47cZ86xWRLzkh47HgfYcrMSL", "blocksMintedPenalty": 0}, + {"address": "QT5XxJmATYUSpXDbENeU7TTZPALLNfrCin", "blocksMintedPenalty": 0}, + {"address": "QT5bTTgNRPnRDksQQJtb1i1WBaiPbt8A2T", "blocksMintedPenalty": 0}, + {"address": "QT5bsrsW3bWocvszUSZv5AxGNJTDBvVqEG", "blocksMintedPenalty": 0}, + {"address": "QT6HRj6rNHMFhN3uqgs56gyncfgDfUCtse", "blocksMintedPenalty": 0}, + {"address": "QT6XBLEugawde1pgX1gZHZSgR1w9nxEh8W", "blocksMintedPenalty": 0}, + {"address": "QT6syjsA7qG4ZHr49W3XVCSG59auw1mcpZ", "blocksMintedPenalty": 0}, + {"address": "QT7cMhLxsLfvzkMMRXXNCnUWX5eXq98Lms", "blocksMintedPenalty": 0}, + {"address": "QT8MqM5XRoQpQvgSbgBbqXXGVXVDzJLVt3", "blocksMintedPenalty": 0}, + {"address": "QT8e48n1Ywwy7bF6wqCD8JzFuyFNMJwpvc", "blocksMintedPenalty": 0}, + {"address": "QT8tdoQqiKJgWSPMqVVr7PCS7YTGGDMxmW", "blocksMintedPenalty": 0}, + {"address": "QT91WjmCW3uUDGXFuZhbpSfnaaq7kphYmf", "blocksMintedPenalty": 0}, + {"address": "QT957jsLca5uHrqjjb4X9rEjPWSjPVKuNn", "blocksMintedPenalty": 0}, + {"address": "QT95MVr5vyFH55gWwkLV9GCXmepwi7NfUR", "blocksMintedPenalty": 0}, + {"address": "QT95joXHS6bRLkWsedmwKN2q4PgQKWJ38x", "blocksMintedPenalty": 0}, + {"address": "QT9LMQ5Du33Y5o8bZsxYQDe8AKRQffrVow", "blocksMintedPenalty": 0}, + {"address": "QT9VFa1vnDLEShzfhwrhPU7Eho76SmYgVz", "blocksMintedPenalty": 0}, + {"address": "QT9awerx9qFha1rpjhdHMPzqcQJj1gnfGR", "blocksMintedPenalty": 0}, + {"address": "QT9dxwTWQHX62uCE6R9NtTotw5Feeo7kKA", "blocksMintedPenalty": 0}, + {"address": "QT9jT9rj4t6XSA4LUSArQovpUrFtaJaXWQ", "blocksMintedPenalty": 0}, + {"address": "QTASwAXA2b2EKkia6U7ZuYrzikQC5rHNfX", "blocksMintedPenalty": 0}, + {"address": "QTAXmdu2yXAaAHtgUBfuZ8idfTjELa6mk3", "blocksMintedPenalty": 0}, + {"address": "QTApzpfHwY3KM9zvGQaqAx1AM753XaTLpJ", "blocksMintedPenalty": 0}, + {"address": "QTB1B5e8QfA1JsUGPuf2vsgdwXQ5FDeUJq", "blocksMintedPenalty": 0}, + {"address": "QTB6rmQW8fSQFizadr42zcE3vBTfjnAVUK", "blocksMintedPenalty": 0}, + {"address": "QTBccPvzMzhZdWchqniHAVdkuGGpqQ7tjc", "blocksMintedPenalty": 0}, + {"address": "QTCFuMfpzjE3sR58bTgUfTXgazWSYkqrTC", "blocksMintedPenalty": 0}, + {"address": "QTCPrDVozq9NN28hu5LEX8jrRhfYkmxqGY", "blocksMintedPenalty": 0}, + {"address": "QTCPy6AWQxsaBxBVzcovj9WgyayvcoBJV9", "blocksMintedPenalty": 0}, + {"address": "QTCXbdmCboyiHnvRhwKvhV51JFdhM22za8", "blocksMintedPenalty": 0}, + {"address": "QTCxpdMEtjAKZQMhNcXfQ2uChS2egJjAe9", "blocksMintedPenalty": 0}, + {"address": "QTDFaXKTHUdw6HfL98j3uddp3gsyaSV84B", "blocksMintedPenalty": 0}, + {"address": "QTDWpttAiwkqKjN1geAB8QUtBkFfMuzoDu", "blocksMintedPenalty": 0}, + {"address": "QTDfuXnQfLVs67m45YL6pmU1yU1vu48biM", "blocksMintedPenalty": 0}, + {"address": "QTE3tzLYtpdsjP5skWaikpSVH5eCnkGqyG", "blocksMintedPenalty": 0}, + {"address": "QTE858yYVifMDiutdLEmKFqFrGsWk2LDa2", "blocksMintedPenalty": 0}, + {"address": "QTEGeg8746zzwvPjKHWLUqFFDTJegAR1qy", "blocksMintedPenalty": 0}, + {"address": "QTEfTJty6fMLiwZJVJ86VEU35ZTFBtcNbk", "blocksMintedPenalty": 0}, + {"address": "QTF1jF9yLXfECsehaE1ps47TYXF5CqnkwN", "blocksMintedPenalty": 0}, + {"address": "QTF96vjWrXQ5pDGq6TNsCVNcLRLtKP9AaZ", "blocksMintedPenalty": 0}, + {"address": "QTFE4NUrGiWTZ62MgdE1wb3CZ21soqrVfh", "blocksMintedPenalty": 0}, + {"address": "QTFRer5iZQWjmdoamjNjHn8Mb93i9AMpx6", "blocksMintedPenalty": 0}, + {"address": "QTFh8uc2KHuW66b98k14w6h6ro1bJ4rnma", "blocksMintedPenalty": 0}, + {"address": "QTFou1YQxfXN3muVisFGo7YDtVrK3RBQ8W", "blocksMintedPenalty": 0}, + {"address": "QTGNSfLrKVND8o9ueENru9Sw8TXJfBgKFn", "blocksMintedPenalty": 0}, + {"address": "QTGrnBGRNKQvNDCDdd7eMfq3BrSLhkC8NM", "blocksMintedPenalty": 0}, + {"address": "QTGs26MhS14BfAjaW35SfTExG2YkfatASF", "blocksMintedPenalty": 0}, + {"address": "QTHS2thEZzw2kS83SSqpT6P9VjkUGbVaJ2", "blocksMintedPenalty": 0}, + {"address": "QTHUnk2dAQi8SUJVimVUmDdXJCQStSKTVV", "blocksMintedPenalty": 0}, + {"address": "QTJaEBomzZaz7REWaJa5S6m7YBbRkxv9jg", "blocksMintedPenalty": 0}, + {"address": "QTJkcXgtw1qpyaM3aqyzjnYVvYuhfjZxVu", "blocksMintedPenalty": 0}, + {"address": "QTJtTooSwJLu7MM8JBLUc263Vpb7ALBMCx", "blocksMintedPenalty": 0}, + {"address": "QTK9ZA7oULGWFLDwCPQryHtsGqaNiZdcPZ", "blocksMintedPenalty": 0}, + {"address": "QTKSWnTPWqcUuuzXnDwfQbQXeRYuiCdrte", "blocksMintedPenalty": 0}, + {"address": "QTKZxJgLMjStAcLkyFL5rq9xgeVeXQkbsz", "blocksMintedPenalty": 0}, + {"address": "QTLEcTrizAM2MhfzR7mouzMttPiS6sPXTM", "blocksMintedPenalty": 0}, + {"address": "QTLMAgQwNEt6opB5wMW4jFF8RK7L21RSDU", "blocksMintedPenalty": 0}, + {"address": "QTLiH7x3tXFUKw1sSAKnYqdDw3SC2wqWRL", "blocksMintedPenalty": 0}, + {"address": "QTLw2bfdY2o8ja6cF4T1V2QaJs8zmmLpqJ", "blocksMintedPenalty": 0}, + {"address": "QTMVYYJQ2Syn2DGaik2aoFWAxGdfM3c5zT", "blocksMintedPenalty": 0}, + {"address": "QTMjUnCHw2gPhDmemi6nrCTd8dCzoGw1Ym", "blocksMintedPenalty": 0}, + {"address": "QTMw23J3ofd23Chvsbc4TVheZUbZXAGTAr", "blocksMintedPenalty": 0}, + {"address": "QTMwjQpBwCgmPHca3RvgUY8AKfFZNtJx4f", "blocksMintedPenalty": 0}, + {"address": "QTNP7HQWErAg1MP8snQkH6XDgmpcnYEhhk", "blocksMintedPenalty": 0}, + {"address": "QTNYvU3cGAP5ZRt4ZWQutVJSu11YEe22Yu", "blocksMintedPenalty": 0}, + {"address": "QTNZYrHbn7wKKMghv7xGPU4BkZjfw2Tom2", "blocksMintedPenalty": 0}, + {"address": "QTPDXxoGn1WqLRYSJHVmYriBpc5W79XH1p", "blocksMintedPenalty": 0}, + {"address": "QTPFAi1T4HJg6Q76aENAt7tofPvC12w1up", "blocksMintedPenalty": 0}, + {"address": "QTPJxqMkJqAoPrQHPDj3Hxm88pKJz6dxRB", "blocksMintedPenalty": 0}, + {"address": "QTPSVKgZkcQ4AhZbstcqB5ReBD2icqRsFv", "blocksMintedPenalty": 0}, + {"address": "QTPh5qZzUmWS23yyHjD49p9uckwiYsHQRW", "blocksMintedPenalty": 0}, + {"address": "QTPpPe4iPWjzYdfvToGdptmaKhCCNNxzsd", "blocksMintedPenalty": 0}, + {"address": "QTPqWcCvsUHLV6NsmiKn6dnFREb7qGzVWc", "blocksMintedPenalty": 0}, + {"address": "QTQ5U4ix5uNy1a8Faq9y6YJ5m3nqbza3T3", "blocksMintedPenalty": 0}, + {"address": "QTQZ67oSE3TxZiLtcSmWoPMD7BNBbuwniA", "blocksMintedPenalty": 0}, + {"address": "QTQrQr2A3jtvSMZEBP156FSRawv9U1udUy", "blocksMintedPenalty": 0}, + {"address": "QTRXvxjXTjXkwbPx9KwGnKqYhd2CTSGYxV", "blocksMintedPenalty": 0}, + {"address": "QTRdnXg1biiiqLRYmo9Jz3b8goweUt6P4B", "blocksMintedPenalty": 0}, + {"address": "QTRwJCkG6t9AAJBNzbrwMJeWvdYS4BNUyf", "blocksMintedPenalty": 0}, + {"address": "QTSRHcakVMxxLYzx3z8SQqDkk3cQruFrs9", "blocksMintedPenalty": 0}, + {"address": "QTSYnWAdoEYjDDRJreDf3ubpXbzaxHtyx5", "blocksMintedPenalty": 0}, + {"address": "QTSmJg5TfFNU5bLbNNpPtbBgEh3paTrZk9", "blocksMintedPenalty": 0}, + {"address": "QTT5y9WnT47JhRt1Z9bergEnhGNAgdR61f", "blocksMintedPenalty": 0}, + {"address": "QTT6D9kWJ7ByZ32SKUNUPXRaX64QtztRoL", "blocksMintedPenalty": 0}, + {"address": "QTTSZiLc6Xxj8o6AGWoYPT4AdthsNB6jfE", "blocksMintedPenalty": 0}, + {"address": "QTTgY8hjCpKKsAcCqteQ1k6xqH7iDx1Pis", "blocksMintedPenalty": 0}, + {"address": "QTTrebMMTH5fsjicsQXH6tUj6AvpZtB3oS", "blocksMintedPenalty": 0}, + {"address": "QTUHWQTTNqVzL2XzjhjsoVuuwkC7CEjYnn", "blocksMintedPenalty": 0}, + {"address": "QTUKp4REacPHSLvkBQ5ehd3pzZPWuAgaM9", "blocksMintedPenalty": 0}, + {"address": "QTUkrcfFsQpesqfbF7FSVuSAn8KpPipNra", "blocksMintedPenalty": 0}, + {"address": "QTVpGQXMzv8hWou3SkB624He5kgpAMUc6z", "blocksMintedPenalty": 0}, + {"address": "QTVrqYjPbbf2L8t73GSEdjgqb6fagBg966", "blocksMintedPenalty": 0}, + {"address": "QTVtXfSV5ybtZgLrw7cHNb5vsvLGWZhmaj", "blocksMintedPenalty": 0}, + {"address": "QTVwQhftJcLDfnb8mapujwWyBwwiwTFu9E", "blocksMintedPenalty": 0}, + {"address": "QTXWdYHvW9x2qUcKuw9GWYQiLzh3hCnMHW", "blocksMintedPenalty": 0}, + {"address": "QTXiBT8idkdGk96RV2EKqJbBPWk21FpTb3", "blocksMintedPenalty": 0}, + {"address": "QTYJenVA5snCJyzREFvKrXG8YUxnr9JDDG", "blocksMintedPenalty": 0}, + {"address": "QTYfuyVTXfEpgeNgp4Kjm84HqujpaBHQef", "blocksMintedPenalty": 0}, + {"address": "QTYkgo1dsG8cEY3Nq5hx4vpT9rb4LLY13E", "blocksMintedPenalty": 0}, + {"address": "QTYzWYXZ1eXzcyCMSFrSwaDFmWMfarcef1", "blocksMintedPenalty": 0}, + {"address": "QTZ5wdPfo11BAvwBPvT9Vg5WYr1SuU2NDc", "blocksMintedPenalty": 0}, + {"address": "QTZfvBvmxkgdrBFVsERUbUyFQ6PtKJHJ2g", "blocksMintedPenalty": 0}, + {"address": "QTZkKYcS2oDfhuffCgxsFoc4XWE8EKNGzo", "blocksMintedPenalty": 0}, + {"address": "QTa1nBRKzAHRABbJPf1tQh8mfxijwgFCMi", "blocksMintedPenalty": 0}, + {"address": "QTa9qR9zc6oKr9szJ1ZHdWQmWMvK464Vx3", "blocksMintedPenalty": 0}, + {"address": "QTaEvQrhj5ybW4uDEFtXgVdTnCqHiQjEcY", "blocksMintedPenalty": 0}, + {"address": "QTaL213z2Po9otZyqFAJTCwD7DgHkNqqCE", "blocksMintedPenalty": 0}, + {"address": "QTacyidYNPLGCSmVcPMhGaRc2r6ub3c1V2", "blocksMintedPenalty": 0}, + {"address": "QTbK5pscR9R5V8V77jWhdQaikvxksdqQpH", "blocksMintedPenalty": 0}, + {"address": "QTc96xveQR4Ez7nYkFkxgcmDEnW4bi6cDE", "blocksMintedPenalty": 0}, + {"address": "QTcMoTpTYKiE1DUHoFia7KAASGYWMeQUS6", "blocksMintedPenalty": 0}, + {"address": "QTcPFSHwDBvZW8FEpdAX7aRkDJTaPVNGJC", "blocksMintedPenalty": 0}, + {"address": "QTcQoLCaTAwLwLGpDvqQcu2LFuL2fFfXNg", "blocksMintedPenalty": 0}, + {"address": "QTcxYA5VNBj28Sqj4uxgE9zgydDHjWqqqJ", "blocksMintedPenalty": 0}, + {"address": "QTd61dfBPRJGrQANM6esP5YjeGQiaZhBtv", "blocksMintedPenalty": 0}, + {"address": "QTd9Cm4G4j4WUUvKJkQSVN49nWFQhknwzq", "blocksMintedPenalty": 0}, + {"address": "QTd9qECgqFRyDCR95cEXHJ6ikRKGp5P47y", "blocksMintedPenalty": 0}, + {"address": "QTdWujAFt2ErKotw4cjiorqLUqCiWCMz9i", "blocksMintedPenalty": 0}, + {"address": "QTdiNqxGaGZ3yACkakRvUh714TsimupQT7", "blocksMintedPenalty": 0}, + {"address": "QTdrGKCFoGYsCb5GxoTEoMmovnqpRTCKy7", "blocksMintedPenalty": 0}, + {"address": "QTe4t3M94e2DL3DaGajDAqfUSuagbUp1ic", "blocksMintedPenalty": 0}, + {"address": "QTe7ry2K3pNWVZqHsHtcN9hWKdeFQpNs3u", "blocksMintedPenalty": 0}, + {"address": "QTe9pxgFcRNpLuPrf3WGSV9KU3fkmL7Fsu", "blocksMintedPenalty": 0}, + {"address": "QTeFsVvGApz9aacSgTnKDhyZfA274kcLXt", "blocksMintedPenalty": 0}, + {"address": "QTfVuHCoTPdush3E2WzTgmLtjzXcvCNWKx", "blocksMintedPenalty": 0}, + {"address": "QTfzDpjxMBuQxaageKBTtGyNVPhyqWRGxB", "blocksMintedPenalty": 0}, + {"address": "QTgCX2UCdKiLgHWPZ9VU8GV4fCoeiW5PMV", "blocksMintedPenalty": 0}, + {"address": "QTgKSRnba6Fcj9dBcr4utqgY15BhsFGbxJ", "blocksMintedPenalty": 0}, + {"address": "QThFLuJ9eLjrW9RpSAftckzxvhC2CL5FmL", "blocksMintedPenalty": 0}, + {"address": "QTha9Dum6edqCCUjRxGw2hzeFKRc5KcWHn", "blocksMintedPenalty": 0}, + {"address": "QThtxCdHVbSMmHd3FpjMfsRBN6ZpsMtcDB", "blocksMintedPenalty": 0}, + {"address": "QThubwPchwDG8JXM15MWnNBHcXJ7TEACb5", "blocksMintedPenalty": 0}, + {"address": "QTiRJVCznr4nxKJ9YH6A5wx6ZzF4ni1ZL9", "blocksMintedPenalty": 0}, + {"address": "QTipzPJGhQkgEoK2kFemhmx1VEEx29ndDs", "blocksMintedPenalty": 0}, + {"address": "QTj9C3B7urfz3ey3k8c58h2wMakP3asHA9", "blocksMintedPenalty": 0}, + {"address": "QTjHggxPrxFPzmPuwcoBNArK1PMKsVgiJB", "blocksMintedPenalty": 0}, + {"address": "QTjTF5jrUVfSAkr3qKJjn9NA7ZWYqvixWV", "blocksMintedPenalty": 0}, + {"address": "QTjiZXGcRjkCGVkCAfj3PTZBSyDVphgvdZ", "blocksMintedPenalty": 0}, + {"address": "QTjkZtiGPUNBzn9oZwtNFARWSDZ8FDgyv5", "blocksMintedPenalty": 0}, + {"address": "QTk4XoYGE55hdKREXbxPnTC5Bw7uKXoTzT", "blocksMintedPenalty": 0}, + {"address": "QTkBg6hrYQ6vHosQqh1End9dU1nTn3PErp", "blocksMintedPenalty": 0}, + {"address": "QTkKUyzQwfVCQzWtki2gC9TNFooX6jx5Yt", "blocksMintedPenalty": 0}, + {"address": "QTkj5jdruMgm8GoMN5BtDJvBFe9USCDwsi", "blocksMintedPenalty": 0}, + {"address": "QTmG8VPHLLsgtJSrGd7eFzEduB4kN9PJGy", "blocksMintedPenalty": 0}, + {"address": "QTmaQ79rcchguBvjxPNDqikTnxLmHp2hS8", "blocksMintedPenalty": 0}, + {"address": "QTnFnEZvzmTDZqYyGgssFVf6wyU2ZjucYm", "blocksMintedPenalty": 0}, + {"address": "QTnjEyCxefdFSTFDbsiyhTLiPkXFJtjnxM", "blocksMintedPenalty": 0}, + {"address": "QTo1vpnQJWbwZ16JQSFGPuTsbxEmmwfJE8", "blocksMintedPenalty": 0}, + {"address": "QToJsvT84xxmkpoNkY1n154wUVnNf4hfA1", "blocksMintedPenalty": 0}, + {"address": "QTobXHLb6gZqCQznFmoufEyb2iCekKy1cw", "blocksMintedPenalty": 0}, + {"address": "QTodBDoALWZkGxDFkePn46cdvRYyojBzHi", "blocksMintedPenalty": 0}, + {"address": "QTofCqQsh9pvV2vaMwc2Nstwj4kWUCXA9D", "blocksMintedPenalty": 0}, + {"address": "QTouB3e5QCRKt1ugemK2zyXXzB2PQGtFvZ", "blocksMintedPenalty": 0}, + {"address": "QTp8hp325XbQRaLsu1yaVfgbGKaETuRXNT", "blocksMintedPenalty": 0}, + {"address": "QTpMk1ZCZKcHAz3Hr2aD4snqVJUJ6Nrdv6", "blocksMintedPenalty": 0}, + {"address": "QTpiDktH7z7HnQdN8bB1R4gsAsmFZWowib", "blocksMintedPenalty": 0}, + {"address": "QTq2cRTu9U5N1sQ8vA9M1YDCaBsuLBLiKT", "blocksMintedPenalty": 0}, + {"address": "QTqYau4JdVK1VDLCfSs1b4jgsqrtK1fbLG", "blocksMintedPenalty": 0}, + {"address": "QTqeKGJnm6HAWR7NJB8HMudwG3AJZPvMvW", "blocksMintedPenalty": 0}, + {"address": "QTqwU9AcKZodc9dep9QKTCXrB7NqxJty45", "blocksMintedPenalty": 0}, + {"address": "QTrKJBs2hSWQDtTNtNF5QMLr1iPVN6vw1E", "blocksMintedPenalty": 0}, + {"address": "QTs5TcGtjctivtAFkg5WkU6gt5iqBr51zb", "blocksMintedPenalty": 0}, + {"address": "QTsWFT1pJkSRbnyit7Tra9AMkfiNYJp5qQ", "blocksMintedPenalty": 0}, + {"address": "QTsYAqW1UTBs8XyNfY9MMb2EwiYWyzPzkJ", "blocksMintedPenalty": 0}, + {"address": "QTsYjpJeFg9WrMSxeEH9r5Dnq9pnGdUBze", "blocksMintedPenalty": 0}, + {"address": "QTsgdYUTw2kxJNRjwhK33pBrzn4Ent6ogk", "blocksMintedPenalty": 0}, + {"address": "QTsuQrEDWXFo1v6hN12tjb5bKngmzrBS6U", "blocksMintedPenalty": 0}, + {"address": "QTt63FxeicmQDTkCciU8Sm8mk1wVaX7CGn", "blocksMintedPenalty": 0}, + {"address": "QTtHDUuEeKmuQK6TKmftkzMZhTEEfR9HeA", "blocksMintedPenalty": 0}, + {"address": "QTtHLydK75bSwDof2PPwPB9BFo7A3DSu76", "blocksMintedPenalty": 0}, + {"address": "QTtcFfoDWg6CVFN1NRx9FF9SvYE1Bbq6U7", "blocksMintedPenalty": 0}, + {"address": "QTtquobrmawUxSXf8tfMoUsQTvGWG8K95M", "blocksMintedPenalty": 0}, + {"address": "QTtzABMtBbp3QYMXfTSAbk6FHYYcz6TXuo", "blocksMintedPenalty": 0}, + {"address": "QTuQPAaXTydBNZw35ZPBrQBkof62NYCsDb", "blocksMintedPenalty": 0}, + {"address": "QTv5uQbHdRjHaVhkfDygSAPgwt1iDt2n8H", "blocksMintedPenalty": 0}, + {"address": "QTvK9E2grVsdSbZoCa1B3eQCkPT4aNZPBD", "blocksMintedPenalty": 0}, + {"address": "QTvf2FpjtB6gXBqgoaLTQjaDmtx9xqkDwn", "blocksMintedPenalty": 0}, + {"address": "QTviERBFdpnQe9sZaTFcokpznNPaZ4xVX6", "blocksMintedPenalty": 0}, + {"address": "QTvwmbxja7jA9Xtz2kyKVZZz9zA1yG8gu4", "blocksMintedPenalty": 0}, + {"address": "QTvxuCJUQ7xF3JE7E6d1dUNFrnut5kdxLB", "blocksMintedPenalty": 0}, + {"address": "QTw26wgoBzdadwAHgQThsWHJuEkBzDr5Eh", "blocksMintedPenalty": 0}, + {"address": "QTwJ8VTUNFv9ZCxc9h5MpQbFASKyCX2k4o", "blocksMintedPenalty": 0}, + {"address": "QTwzC3r62iiDW6QRE61FsN9dXpEAGsKZdb", "blocksMintedPenalty": 0}, + {"address": "QTxLU8vFBXQ7XZCRKBv6gdhmjLgjUACsVn", "blocksMintedPenalty": 0}, + {"address": "QTxV3Gb5n4Hqbk4ZcmJeo2LoeW2HnkBF7G", "blocksMintedPenalty": 0}, + {"address": "QTxX8ySsYV6NvkQsoZahyQLtt48vSehfXB", "blocksMintedPenalty": 0}, + {"address": "QTxY3pZUrHcsCXCdQikc5codctcqjeJLre", "blocksMintedPenalty": 0}, + {"address": "QTyg6z293aqsFLEFZ6dzTYaTgxq6jubgoW", "blocksMintedPenalty": 0}, + {"address": "QTymzB9pWPVLVtzvGd5zBSSaa8PY8rr88Z", "blocksMintedPenalty": 0}, + {"address": "QTzDKdJuwAWqBr2gME5RWHf3t5cZLfKzVa", "blocksMintedPenalty": 0}, + {"address": "QTzU9QhDt3dsa23ZNzKukx7B27u1KKMTrr", "blocksMintedPenalty": 0}, + {"address": "QU1i9jzACMsrnu5KTRY8YuM71xmQMr33GG", "blocksMintedPenalty": 0}, + {"address": "QU1zEVe9S9eDZ3rMQK3zYmdZ3UXE7DhsHw", "blocksMintedPenalty": 0}, + {"address": "QU21yLJ6tj75XcWk3Dto4REVYtWSv5MjkS", "blocksMintedPenalty": 0}, + {"address": "QU2M5m2Jm7Rf7qK1D4f5QRvSgK3A8gk5Q8", "blocksMintedPenalty": 0}, + {"address": "QU2RyAZ527gpdJmLm4oUoPfm9kiU1stFw4", "blocksMintedPenalty": 0}, + {"address": "QU2uzvZnpvGtUXNF66W9K9APxfVgCSqu7x", "blocksMintedPenalty": 0}, + {"address": "QU3hYw5jsGWHXiMg8AUXdmKeDgh3msM9X4", "blocksMintedPenalty": 0}, + {"address": "QU3yyPNZNmJURKvwnCeFvK5LnBrFpMH9UM", "blocksMintedPenalty": 0}, + {"address": "QU414PT2F8TzcDg7rGgW95P2MioSzrCCXw", "blocksMintedPenalty": 0}, + {"address": "QU46ETURh66uELtxyfi3HazrD1FzLQ9fB6", "blocksMintedPenalty": 0}, + {"address": "QU4GhNYmAnLzdiDuwM6xjXW1bKrZE3NipA", "blocksMintedPenalty": 0}, + {"address": "QU4KnwLfNcVLRaJgpPo8m7DharV1Jk63eu", "blocksMintedPenalty": 0}, + {"address": "QU4yLMp86v3JFhvTLvQZKiYLnGg4bG2Fwo", "blocksMintedPenalty": 0}, + {"address": "QU5HzHHR9kQQciB5F1hnqqba65bpekqovh", "blocksMintedPenalty": 0}, + {"address": "QU5hBdojd8js4HZsqv6wKZnPVefat8WboQ", "blocksMintedPenalty": 0}, + {"address": "QU6vN4Bq5m4bJXAKfwTdCJZd1dpo8bfZRP", "blocksMintedPenalty": 0}, + {"address": "QU78dwm3yKc6aMe4o44kyiqAFSrrLMy1n5", "blocksMintedPenalty": 0}, + {"address": "QU8Cy9HohWHVoeHC3EeTPg8UbyK6yjz3ZX", "blocksMintedPenalty": 0}, + {"address": "QU9h1yYK2hBwduBcUB8ya9SywNQaMujPfn", "blocksMintedPenalty": 0}, + {"address": "QU9rERaPV9WTPG8hLZGpx6L1pNXwPhd8yj", "blocksMintedPenalty": 0}, + {"address": "QUAVG5RDDxkfMx9VcfAE4SWmMW2JNvhmvT", "blocksMintedPenalty": 0}, + {"address": "QUAv6ijNx68VXjP5zcRREQyv5yAK5wdXqQ", "blocksMintedPenalty": 0}, + {"address": "QUB5z8scsEECC1sFR4H6dw1h7o991PV31k", "blocksMintedPenalty": 0}, + {"address": "QUBtqjMgQ1xTc5i77eMD6dqEwYDtvPurFn", "blocksMintedPenalty": 0}, + {"address": "QUCQMs5ZoNTYaEG58aznyW4rWGr8boErnD", "blocksMintedPenalty": 0}, + {"address": "QUD2PYQ2ddXuauFNBBZszCDftM3Q7fzq5b", "blocksMintedPenalty": 0}, + {"address": "QUDACfuDBdB4KJKE9dqSEatLBNRLk3F6LK", "blocksMintedPenalty": 0}, + {"address": "QUDWm8aQoGZFnUiRMvgPEPZkYChWU4tc3q", "blocksMintedPenalty": 0}, + {"address": "QUDi4eNijmcX7MjSeK4WKc2FsFD2S8ox9U", "blocksMintedPenalty": 0}, + {"address": "QUE13TomQ9Eh3mKfz3UWjUKepLELQPykja", "blocksMintedPenalty": 0}, + {"address": "QUE2SfsvENqb6nnEfaP2LMKkd8n1v8beCE", "blocksMintedPenalty": 0}, + {"address": "QUEVVpUhrGWNTQFVbjfHk485j4BhXynKVr", "blocksMintedPenalty": 0}, + {"address": "QUEXZDqFaPZfe4z2kvAGA8K2yU8bbnxTfX", "blocksMintedPenalty": 0}, + {"address": "QUErhafsSbRX8QoMgpKYqeQokZjp3AJfPP", "blocksMintedPenalty": 0}, + {"address": "QUFVKTeo4jinArppr1XwnrqDC64iAeYmRQ", "blocksMintedPenalty": 0}, + {"address": "QUFgHCvX94K2aQvT1b5NNsmtGZZwnJq137", "blocksMintedPenalty": 0}, + {"address": "QUH31FaJYEbtWnGN5TUsQJaQnrDttq9kjv", "blocksMintedPenalty": 0}, + {"address": "QUHEuLJHHgtRotKZJPtKXp7QF8y6YbWEPJ", "blocksMintedPenalty": 0}, + {"address": "QUHXHtm1oVifkvVKkjo66BbYnVg8zrE8am", "blocksMintedPenalty": 0}, + {"address": "QUHYuRLSBNTUTT94ayDN4e9WBm47FbsmSC", "blocksMintedPenalty": 0}, + {"address": "QUHgtTTehJL1YbLivEe3JzUahykmkTUy75", "blocksMintedPenalty": 0}, + {"address": "QUJqyBFLvYijQzLUq3T7ujyoUyKskXUE4s", "blocksMintedPenalty": 0}, + {"address": "QUKD5Wt5x7wuutrKbMBeNM4pw9VWKiP8Dw", "blocksMintedPenalty": 0}, + {"address": "QUL7xwAJk7afj6m8Yoy8RRVUoasTQ5i2iP", "blocksMintedPenalty": 0}, + {"address": "QULGQxPNB5rrtJKvjZAGbgHf9yAx6t4EqQ", "blocksMintedPenalty": 0}, + {"address": "QULvFowMrg8LDsPVpZSV2uYrGDvB6b25uv", "blocksMintedPenalty": 0}, + {"address": "QULzRAa3H2vtWkmy46fChGDYQGXNmtxeKo", "blocksMintedPenalty": 0}, + {"address": "QUMD21YV8For8znLnFJN21tZHcDZYth9Jf", "blocksMintedPenalty": 0}, + {"address": "QUMJpZMFu7hrR5FsXXrZm2ChWgVC2Dm7Mm", "blocksMintedPenalty": 0}, + {"address": "QUMLuWHG5BNzGEvN28EGnjvJzVp3Y8va66", "blocksMintedPenalty": 0}, + {"address": "QUMZRWp3drjGgzaqH41KajMuxbUuZzVAyx", "blocksMintedPenalty": 0}, + {"address": "QUMidWskJxXEGvth61eMWmWgsBkuZTisXS", "blocksMintedPenalty": 0}, + {"address": "QUN2pBJ6oL5pGd7dV6jn33wWVBMMcyEPo7", "blocksMintedPenalty": 0}, + {"address": "QUNN8unMsfMf4mRWpYaFwrWwxEsTRu2GA6", "blocksMintedPenalty": 0}, + {"address": "QUNaw77uesLCXYasejwFJvJ9g23pHYKDER", "blocksMintedPenalty": 0}, + {"address": "QUNdcamQ4HdZxrwCzu66SYiR4eF63M32ZB", "blocksMintedPenalty": 0}, + {"address": "QUPA5AxxvzbKnLCZKhEnMD29ewRfiWS4rD", "blocksMintedPenalty": 0}, + {"address": "QUPByFNwyVapzyQhMTjrG95AUwpf1jwQVC", "blocksMintedPenalty": 0}, + {"address": "QUPMGSM5YfJtxPJB6BAUQrkXgTc9uYBoav", "blocksMintedPenalty": 0}, + {"address": "QUPR4GPMDHRMoELgcuFUZQTJXTkU4gWUVQ", "blocksMintedPenalty": 0}, + {"address": "QUPb9GFR4g2e5FJrnYdVxKkt7dfat9LYQZ", "blocksMintedPenalty": 0}, + {"address": "QUPqwfWM9z7QocW3irzsi8raRLcU32aqXv", "blocksMintedPenalty": 0}, + {"address": "QUQ69rSdbyGosg32eHjBmwFpkLnB8rFSjz", "blocksMintedPenalty": 0}, + {"address": "QUQ7A3XuD62vJmEgwhpVzS5yCh8QopZTLP", "blocksMintedPenalty": 0}, + {"address": "QUQRBurMKdV5LLT1AxGV7ZW5dCcpt7Mx5z", "blocksMintedPenalty": 0}, + {"address": "QUQZnRFh6fCYtL5gUvZRbj7xk9G1DL8y6s", "blocksMintedPenalty": 0}, + {"address": "QUQbn3Dv7NQKCBPMw634yhe1hmPqoHBJKz", "blocksMintedPenalty": 0}, + {"address": "QUQjr5P5mkS7hS5cehFT8DEaKAuShTtJsM", "blocksMintedPenalty": 0}, + {"address": "QUQrHnmka3Hu1yffS7UxuJG6vvLXNNPaX2", "blocksMintedPenalty": 0}, + {"address": "QUQrxkZjA8A3dXvinsYj8cKscNimkZctWv", "blocksMintedPenalty": 0}, + {"address": "QUQwKq8x3pMNjfyUeRRTwnxPWqHwMQX3gQ", "blocksMintedPenalty": 0}, + {"address": "QURKQuV621Ac7DcMETKiAjEyYf8BeXsRsT", "blocksMintedPenalty": 0}, + {"address": "QURPbnXfmNdR82LjoF2jS3qB1yqijEzLss", "blocksMintedPenalty": 0}, + {"address": "QURTSiyRCHKCAAxogpjhhdUBXh8xogkn8t", "blocksMintedPenalty": 0}, + {"address": "QURZSiXH717kRK9DSQNjJo1BwsZWknrnS8", "blocksMintedPenalty": 0}, + {"address": "QUSLbxxuP66zz4gTawCU7CrdpZvqGXtZw7", "blocksMintedPenalty": 0}, + {"address": "QUSbxrLF3enzi881PnCpxoTdqLFjztS8bC", "blocksMintedPenalty": 0}, + {"address": "QUSdNXecF5HWfWfKimms9MQRQbfz6cYsHU", "blocksMintedPenalty": 0}, + {"address": "QUSiVR1ij5oWWs64AzXPjnUeDbL1EUJuVC", "blocksMintedPenalty": 0}, + {"address": "QUSir1a68nGF7QoFkFiM2mveTtaRCe1uHB", "blocksMintedPenalty": 0}, + {"address": "QUTEQkAWMGDJGHJ2oRrP9APAX6bdvjSJXC", "blocksMintedPenalty": 0}, + {"address": "QUTjMPoVYwzwBue7kqPWkRSZSEPpyhWDa9", "blocksMintedPenalty": 0}, + {"address": "QUTz1tPqtc1xUPPMiU3vcfKvMRA8kPmjEH", "blocksMintedPenalty": 0}, + {"address": "QUUTr1X1L3iM48xgB7QdRNg4hACCgucsh9", "blocksMintedPenalty": 0}, + {"address": "QUVED115p15SgqMx7DHPjDSQg8yyHhSNS2", "blocksMintedPenalty": 0}, + {"address": "QUVHjEH2PVBqrP97qeFRz1Cc7Raw4Ze2JX", "blocksMintedPenalty": 0}, + {"address": "QUVx36g8o6rxkjxBDjLdB7GTMwm1WU3XxS", "blocksMintedPenalty": 0}, + {"address": "QUWGwmNL4fv19YfcULLDQCiYKmXfeBTBEs", "blocksMintedPenalty": 0}, + {"address": "QUWZNMdxgwNLHqhu1Jink7VZojYogbuUmQ", "blocksMintedPenalty": 0}, + {"address": "QUWuTJLD5g8wErTAvCmhpn3BVcJWwCGyDJ", "blocksMintedPenalty": 0}, + {"address": "QUYjTTF5EeYdvt6i4qZneXjPdVTEuGJX4q", "blocksMintedPenalty": 0}, + {"address": "QUYrAznr3cYTgf285XbHrgA5ZC8FxuAfF3", "blocksMintedPenalty": 0}, + {"address": "QUYyGGXoFM5ZDQG1cHVL2CTrDJ4pvMSUMm", "blocksMintedPenalty": 0}, + {"address": "QUZ5c4DAbwmV5Jbjx5WnUh6UdpTi9YxPBw", "blocksMintedPenalty": 0}, + {"address": "QUZS74uFkXNHdD8HfwzGvhja313uauEi8k", "blocksMintedPenalty": 0}, + {"address": "QUZYu8eKCvrpUBg87o515uEX29Tjxw8vz3", "blocksMintedPenalty": 0}, + {"address": "QUZqvGB6zDhUmsFicVCrwrLUZxqc5xZgag", "blocksMintedPenalty": 0}, + {"address": "QUZrrhjVCYoiMqgGqjfvqnspLBGCVpNMzk", "blocksMintedPenalty": 0}, + {"address": "QUZx6njfVAwMchp424AmnHUpuVrc6iGy2F", "blocksMintedPenalty": 0}, + {"address": "QUZxVGuzpLbRxfuEFqyGjjtRWAAEhZaNWJ", "blocksMintedPenalty": 0}, + {"address": "QUZxWdUCFRpwuHW6YCHb4LHogvNCpmMjQd", "blocksMintedPenalty": 0}, + {"address": "QUZxZABLQeuTskZYdaPcU4geVpgrtqnNmo", "blocksMintedPenalty": 0}, + {"address": "QUaDWpVUzpxLwBh9JQFwPYTVLPMxVEgEjA", "blocksMintedPenalty": 0}, + {"address": "QUaECSBTyqYQPvAmiyiuTScBamsAgwKaEP", "blocksMintedPenalty": 0}, + {"address": "QUabtxMib5RDyjHkzyEkdYSWYVW2KR9DbP", "blocksMintedPenalty": 0}, + {"address": "QUaovPWgjjdGNtQN19Vtvy1N53trok2bpD", "blocksMintedPenalty": 0}, + {"address": "QUavrpzozPtLPY4Mrt72RaocA7grGEve86", "blocksMintedPenalty": 0}, + {"address": "QUbEincC3d6pmczssVBwQQkMWWL8HMTRts", "blocksMintedPenalty": 0}, + {"address": "QUbWzfn2TyFNvAutuhuxuqeaTpAPPQ7VfS", "blocksMintedPenalty": 0}, + {"address": "QUbZCK3ZXBc5jP3Zde9rQ9LLdg4DhLjJYD", "blocksMintedPenalty": 0}, + {"address": "QUcGhKYufT3QAJU9TJhvj1pSoqMmjQmAxW", "blocksMintedPenalty": 0}, + {"address": "QUd8mqvwDnAzsrqQutTvW4EZQ1Tsn8NUUv", "blocksMintedPenalty": 0}, + {"address": "QUdVUhfrJ7qmzo1p8XUbMT3GC5CrjudBnF", "blocksMintedPenalty": 0}, + {"address": "QUdXcCmvfD5B2Y7Sax8tkWKDALEyGfC9eK", "blocksMintedPenalty": 0}, + {"address": "QUdjqijDoyc83K4WcMW1sCn7zLd2t1WTqn", "blocksMintedPenalty": 0}, + {"address": "QUdmsygeD8hsM1J1hFhTQK41GNLwzm73hK", "blocksMintedPenalty": 0}, + {"address": "QUepfjN1iR1Spva3DomAgrhd1TXHzFffQN", "blocksMintedPenalty": 0}, + {"address": "QUephD8gEKCuyeyY59Y9b99pRgucbBorqw", "blocksMintedPenalty": 0}, + {"address": "QUerUtDu5Tf6u3kveTtgX6TLg7gxRN8Frn", "blocksMintedPenalty": 0}, + {"address": "QUf8TVSDJrFaWuqGTBg1MpVyyZ918C18Mm", "blocksMintedPenalty": 0}, + {"address": "QUfabYhHWQykDYtqoGEpkaxqr35oNNG51g", "blocksMintedPenalty": 0}, + {"address": "QUfjMQMMoojgx7YXnTt2CjqTYjJ6YV9vTQ", "blocksMintedPenalty": 0}, + {"address": "QUfydqxwAXXQHbGNBf5WY8EyiHFiWSwZq1", "blocksMintedPenalty": 0}, + {"address": "QUgcrnbGvN9RH8kazkY7QuX5KLz7ujF7UW", "blocksMintedPenalty": 0}, + {"address": "QUgocxxXA22hrmEtv1dvLorrkDcf9ihaAu", "blocksMintedPenalty": 0}, + {"address": "QUgsFfw3Fx1pJszwtoDdJUDywwZrra29kh", "blocksMintedPenalty": 0}, + {"address": "QUhjmgCBu7FRHZckDbTZJN5Bo8YNYhYMgs", "blocksMintedPenalty": 0}, + {"address": "QUhtaiTSEbe1Ke8BF8w7bZJDLA54JpF84t", "blocksMintedPenalty": 0}, + {"address": "QUhxQNwxgHZsgAGgepATc1rPdwRtpttdvt", "blocksMintedPenalty": 0}, + {"address": "QUiLCtkzyczR44ADS2sYnN4gdapX6hCYzW", "blocksMintedPenalty": 0}, + {"address": "QUiMXE7Ur8QB9XXgMPRcJnw3pDYEwiUaxH", "blocksMintedPenalty": 0}, + {"address": "QUiYEvfNBoV7vRdmCBPBsgjXfWuukTwQFz", "blocksMintedPenalty": 0}, + {"address": "QUijx4pCCJXiYH82F753fVVfhpT91uYfvb", "blocksMintedPenalty": 0}, + {"address": "QUiqgyUUaGYdBdMyesbjeFKQL36xZzZTxd", "blocksMintedPenalty": 0}, + {"address": "QUj6iAQY4efeTBf4r3r6yG5vrKTjgYXHPp", "blocksMintedPenalty": 0}, + {"address": "QUjcZYLfVsmJdB57w4rbvPKuSe26hoX8nA", "blocksMintedPenalty": 0}, + {"address": "QUkNLGZ9Yi1UAgQM1xFW4WEdi6cUDTAU61", "blocksMintedPenalty": 0}, + {"address": "QUksGtgy8ptWwDo34nYxVENQQsDnqW9yBZ", "blocksMintedPenalty": 0}, + {"address": "QUkstM1EVkRc54XfqeT4gBGKHLiVXyeNUk", "blocksMintedPenalty": 0}, + {"address": "QUm6gSHkEWucUmTSg4JhteueQyTm9rVjCX", "blocksMintedPenalty": 0}, + {"address": "QUmm21NAYspb3QjWojGckBqmcdahVREMCU", "blocksMintedPenalty": 0}, + {"address": "QUmrHqX3c6i223dR21KdYsWVyfZEFk8khh", "blocksMintedPenalty": 0}, + {"address": "QUn9wwns7rE9oG2mGtkAwh9XDrmAuGB2tH", "blocksMintedPenalty": 0}, + {"address": "QUnHr6pAcrWPMaw4i1mesyUG5oAdzF4NJV", "blocksMintedPenalty": 0}, + {"address": "QUnRfnqJMswi2qdUDbpTX22HX2Q8AXcQxt", "blocksMintedPenalty": 0}, + {"address": "QUo8PWAKCWChAA4bjozDX1HenQDmEJgZCu", "blocksMintedPenalty": 0}, + {"address": "QUo988NuBLLVSQzRXYSc4eXa4Vkxuywcmd", "blocksMintedPenalty": 0}, + {"address": "QUofUYpiWYnNPBVMhFDuksp1vDEaeyQytF", "blocksMintedPenalty": 0}, + {"address": "QUoiJuLg9Rn91mYaWpPFe9vM71hyqqyxf2", "blocksMintedPenalty": 0}, + {"address": "QUotu2eLqwTUgyuEjWb8EyiBDHAS7Wqju5", "blocksMintedPenalty": 0}, + {"address": "QUp6iERxbWjaNMYBn4UwmyoEd89prY4Wwa", "blocksMintedPenalty": 0}, + {"address": "QUpRvfP7TzRkRYcpibuKALhgTQRMAzS3o8", "blocksMintedPenalty": 0}, + {"address": "QUpSNRZAtLcNmUU6Zk5G8C3BAkPzMdLfvz", "blocksMintedPenalty": 0}, + {"address": "QUqW6Jj12bTtacb5UhS5C8nEYYDmnvfQFm", "blocksMintedPenalty": 0}, + {"address": "QUqmVTyhdP3PaUGgoHRapq9Ljo1b7pnEqa", "blocksMintedPenalty": 0}, + {"address": "QUr8MtJtqTyPPpEkiUApMyCXsNYurMqEP9", "blocksMintedPenalty": 0}, + {"address": "QUrzLLsN4qJG9WWBDKuteuqn7YZfL3TUHX", "blocksMintedPenalty": 0}, + {"address": "QUrzrAXFaCa7Me4tMiLXSzjzyNShntfzCj", "blocksMintedPenalty": 0}, + {"address": "QUsGNvPPP3M26Wsy7Y1LSRr4VrSq29zp97", "blocksMintedPenalty": 0}, + {"address": "QUt2fb9Mvv2BV1ZUy3c6LAQA4nEMrKtu2G", "blocksMintedPenalty": 0}, + {"address": "QUt4smE7xcpurmgkRBQ6q3C6ssmeYMqjNE", "blocksMintedPenalty": 0}, + {"address": "QUtcbaE7HT9Kg7beo6BWYLyLnTo5zFguhp", "blocksMintedPenalty": 0}, + {"address": "QUtdwLdSzis4MsvTNAfEZFQvGeLPCspnuW", "blocksMintedPenalty": 0}, + {"address": "QUthLmfB7E4zNBWH9cAJ9WNkgTjckU4VY6", "blocksMintedPenalty": 0}, + {"address": "QUu4mfx8i1fgSGyfmuJBwdya4rgMCYSNLP", "blocksMintedPenalty": 0}, + {"address": "QUuAzbYd5i1nkDhM7DzAJkFgP94WX8NjBe", "blocksMintedPenalty": 0}, + {"address": "QUuKtGytPWXkZtaK8ny1WFbMLvKtosrX2g", "blocksMintedPenalty": 0}, + {"address": "QUuNWrcSCxbQbv9BaP9oMN5tUM5g5aL7ET", "blocksMintedPenalty": 0}, + {"address": "QUuaNQji2ZDexRgJCtJeKqbgY3WuwvgK7u", "blocksMintedPenalty": 0}, + {"address": "QUuhWK9DQFL47PBukqxJonMRjds7QM4WRV", "blocksMintedPenalty": 0}, + {"address": "QUujv55egQL26JNiu3gddpkCYtw5TQUNWx", "blocksMintedPenalty": 0}, + {"address": "QUv5jgtETXcWHbrW3VDcrowEqmX2chTZA7", "blocksMintedPenalty": 0}, + {"address": "QUv9EZiaAPxVMhnzAUp1EK1MvBqcWDGEbb", "blocksMintedPenalty": 0}, + {"address": "QUvJamL17WXWEjUmpi5fqG3C8V4rjKwgdQ", "blocksMintedPenalty": 0}, + {"address": "QUvRmqSd3HRasL9yjiRWN8hGR7NRUEMQcF", "blocksMintedPenalty": 0}, + {"address": "QUvr77kdBJ88dwA4KxjrUR7LPomA5K3P9R", "blocksMintedPenalty": 0}, + {"address": "QUwzXQ93ye16sJsMPJycbSNDFVajURUQno", "blocksMintedPenalty": 0}, + {"address": "QUxA9eBELpwvpA116HzCmySJfzLofCFLYq", "blocksMintedPenalty": 0}, + {"address": "QUxCje11LASyx4wKooz1QJisfGAtucYKwo", "blocksMintedPenalty": 0}, + {"address": "QUxJ4vESJ2Ay3rajmx3EbDfovXtBtYx8VG", "blocksMintedPenalty": 0}, + {"address": "QUxSR1LvARWpucygJGcqXnTEcTsA5kUJ9T", "blocksMintedPenalty": 0}, + {"address": "QUzAUHzJUs9f5U2RjqsScQtvMRxjo2Mggh", "blocksMintedPenalty": 0}, + {"address": "QUzWBPdtZABUJ5goaxvmXTMbzPKgQeW4LY", "blocksMintedPenalty": 0}, + {"address": "QUzj1h4NuVrTV3vP4Xix3ZUWNsP5Lo4WY3", "blocksMintedPenalty": 0}, + {"address": "QV1zDDohdj1r4LBumajPygjDtG8h8yKutw", "blocksMintedPenalty": 0}, + {"address": "QV2AtBpu7NGmeZdbNRyyE1p7sJ87CSKwi6", "blocksMintedPenalty": 0}, + {"address": "QV3LrCEgyJKnn4oLHntLieTUPuwYfeEeAm", "blocksMintedPenalty": 0}, + {"address": "QV3PaYQsM879rrB1wwDXBD4FDzxz71YsNE", "blocksMintedPenalty": 0}, + {"address": "QV3VGFHmm4Jr4jg3VVtxkX2QBsjmggET2e", "blocksMintedPenalty": 0}, + {"address": "QV3dy3RbSQS8HMRKcJD95rwdLHSpqEgtQZ", "blocksMintedPenalty": 0}, + {"address": "QV3guVYkAM7sGyWaqucuEFKmY9vCuwnYiK", "blocksMintedPenalty": 0}, + {"address": "QV3jrG1GSy62HaFkNC4XuJLL9CikustxUu", "blocksMintedPenalty": 0}, + {"address": "QV3sEg4vMp9RPV4GaRNhLNbenyob9A1ho1", "blocksMintedPenalty": 0}, + {"address": "QV4496JU7VU9hwfZBwwprEGUv2d1RedQWz", "blocksMintedPenalty": 0}, + {"address": "QV4ktNTDNCqiNh7uKv1mf1XCXxyokBkJNL", "blocksMintedPenalty": 0}, + {"address": "QV51MWH9tPjsFz3KVotFFMGnpitMPexwaq", "blocksMintedPenalty": 0}, + {"address": "QV51yNX3iGCBGzuBM33GYY6rBddKN3bYC9", "blocksMintedPenalty": 0}, + {"address": "QV5XbinXRGikq5auoK3EjiiwZDHR8kyGKw", "blocksMintedPenalty": 0}, + {"address": "QV5aVtGmY3xFrdyipJNF7K6DaRvnovF6UK", "blocksMintedPenalty": 0}, + {"address": "QV5mi8uJjzv66x8LDoVNxk66eJsTM1gsTW", "blocksMintedPenalty": 0}, + {"address": "QV6S4yVs9yC6EjNeswJciBHGFK9Zq8neA6", "blocksMintedPenalty": 0}, + {"address": "QV6gHVRYtnCTq9MxDEfoogZHzXq2e8LAzT", "blocksMintedPenalty": 0}, + {"address": "QV6n7K9TyMsUcSrrUbWnvF2H4ssi3Ny3D4", "blocksMintedPenalty": 0}, + {"address": "QV78UvgvqLiCGsuBFCDXrCSYB4XhBNa121", "blocksMintedPenalty": 0}, + {"address": "QV79fuCt7fPMEwT7X3NC3EKJ6fb8ta5DCh", "blocksMintedPenalty": 0}, + {"address": "QV7fyZ6tRQjE3WPTU153r4nUjj9Xof382w", "blocksMintedPenalty": 0}, + {"address": "QV7sSBUvyRbwvCkkwrmrBw4D52UKGHbqtT", "blocksMintedPenalty": 0}, + {"address": "QV829LP9FTVFSyUuEUm67qTyTcPq9kcC25", "blocksMintedPenalty": 0}, + {"address": "QV8RY9pMLYjM527EsEUishLpRdCyRBim1A", "blocksMintedPenalty": 0}, + {"address": "QV8W4ieMQofvEWtnMLW7joGJHjh12XeLE7", "blocksMintedPenalty": 0}, + {"address": "QV9SHLWraBEkGK3bDUtggC8Ca7kGbcU4YG", "blocksMintedPenalty": 0}, + {"address": "QV9a8KGn1kn3M365Y1A1C7XGPnjv22ViGH", "blocksMintedPenalty": 0}, + {"address": "QV9nFRjTVHadYpsrrGXg83o2zb4bpBc4gu", "blocksMintedPenalty": 0}, + {"address": "QV9qZ27WBdfjPoXyZ2twBFEtKjqBfSYFWE", "blocksMintedPenalty": 0}, + {"address": "QVAmJevuuE2D9mS5Vz5wdK7jrhViMpw8Ji", "blocksMintedPenalty": 0}, + {"address": "QVB34fLoXnjDb3bCYqmTpNLZoZ8kDpEVNC", "blocksMintedPenalty": 0}, + {"address": "QVBbL2iGqXKZF6EPcLATyz794unStr3j5N", "blocksMintedPenalty": 0}, + {"address": "QVCFungyPKik3Kirww7ChiCbF8sN9E5qZM", "blocksMintedPenalty": 0}, + {"address": "QVCPNQq2JvMjnwnZDzq8VZi47e64prDNDv", "blocksMintedPenalty": 0}, + {"address": "QVCVSVnhTxdANzT3LoK7WEhyhLsLFLnVBi", "blocksMintedPenalty": 0}, + {"address": "QVCyqbDQQC491jmugV1siV7b7uhDGVUimZ", "blocksMintedPenalty": 0}, + {"address": "QVD29tcBPgJp2N1sj8YPFsLgPzmY8ihWeo", "blocksMintedPenalty": 0}, + {"address": "QVDBzPPZLBfpH16p6uamEy7xG9a6tpGGL1", "blocksMintedPenalty": 0}, + {"address": "QVDMpAD1VPVs3acuHLnMwMmyTBt2oESeC4", "blocksMintedPenalty": 0}, + {"address": "QVDXpHGtMnLf2fzHhWTV3CmYnkdgNuLc3k", "blocksMintedPenalty": 0}, + {"address": "QVDmGtDbU4aRyCbiwn6bEK3jKvy3j15bPn", "blocksMintedPenalty": 0}, + {"address": "QVE9RTtiHatXYwn4AZBeNLVitLtd2sNPZn", "blocksMintedPenalty": 0}, + {"address": "QVEVfciek7nqoD6fdyyEg7TSjXRYD7vtNC", "blocksMintedPenalty": 0}, + {"address": "QVEutZYsAWULTbUUmHkvUZwvisiqsd9Mkh", "blocksMintedPenalty": 0}, + {"address": "QVF4UyoNBXHgAryAgkmMmtARqMkFN42Awx", "blocksMintedPenalty": 0}, + {"address": "QVFCh9Th6b9f15s2KbEehBXHKq5Awh3NcV", "blocksMintedPenalty": 0}, + {"address": "QVFDaGSdmM8aapySoQLwHaVce3D1eNM2U3", "blocksMintedPenalty": 0}, + {"address": "QVFTXcdpkhfSUEqsZJ2gMBniDAV1Nxt5gc", "blocksMintedPenalty": 0}, + {"address": "QVFWwCvCvzQTotYcrhWG1PRTxxceVRXbzR", "blocksMintedPenalty": 0}, + {"address": "QVFcQ3KaxEtZF8hKyHVNfKVJAfBShKFP1U", "blocksMintedPenalty": 0}, + {"address": "QVFqDAvdBsQMRL4hFC4bUv5LMVx9CdU2TD", "blocksMintedPenalty": 0}, + {"address": "QVFsRx9NJVPuPS1iXeNJZHteeaNEPaB1d5", "blocksMintedPenalty": 0}, + {"address": "QVGNpr5arL14uauDCCagSJHQJY39Gcxrsm", "blocksMintedPenalty": 0}, + {"address": "QVGn2XCXnZsgkjBbXbcC4yzbFHN6GQ2Aak", "blocksMintedPenalty": 0}, + {"address": "QVGsE9KSxdw1Gvvws7RfEJsYAfQfxPVDq3", "blocksMintedPenalty": 0}, + {"address": "QVHkS5wgkj5hwVknWN2spYXs5yVtrcXhtK", "blocksMintedPenalty": 0}, + {"address": "QVJPhF3ZjZZxWQwzYjJkioCAPAS7cwyizJ", "blocksMintedPenalty": 0}, + {"address": "QVJbSYfkq6icCFevWqcyiXMD1t6uUN6qPd", "blocksMintedPenalty": 0}, + {"address": "QVJkUyvnmFXVPFE2sGxdZ3jjAQuaLdKg5E", "blocksMintedPenalty": 0}, + {"address": "QVJxzSy8Wh8JcTca7RwAs93NdAxPQvXNvy", "blocksMintedPenalty": 0}, + {"address": "QVK1T3jqL8DTTet9Dx26XK8cvhEQN1TqKb", "blocksMintedPenalty": 0}, + {"address": "QVK3wTbieGoy8vf8ooqyCyBUeZaG93t532", "blocksMintedPenalty": 0}, + {"address": "QVKABihASGZaSzDVgVY97wnVxGTW7KXBRc", "blocksMintedPenalty": 0}, + {"address": "QVKMjiwD5GzUHa7RyuHhaEuWeGwN26rMJS", "blocksMintedPenalty": 0}, + {"address": "QVKgmMmZjDJZdbD6aBCaQuZmjnNdNZkDmS", "blocksMintedPenalty": 0}, + {"address": "QVKndxUMaCdBedPXLPSxZs6t9t8bU9fg55", "blocksMintedPenalty": 0}, + {"address": "QVKsAUFKz5Y3dwZTHx18p2XzN4ZAHCNnFJ", "blocksMintedPenalty": 0}, + {"address": "QVKwiCjWoiqwZYbPHDFf3ocn2fabt1Ddab", "blocksMintedPenalty": 0}, + {"address": "QVL6xd56UKNRd9JCoiCAKA3BAqe8Ptuxh9", "blocksMintedPenalty": 0}, + {"address": "QVL9Dj4spx3xdSq5sVYPbKmnStGke6Brm6", "blocksMintedPenalty": 0}, + {"address": "QVLMJA7f4DEw6T8TohgW4LgvNaAmQiziB9", "blocksMintedPenalty": 0}, + {"address": "QVLQUsrDeNYEva4i3vkhwjYpLz97jM45f6", "blocksMintedPenalty": 0}, + {"address": "QVLYoxcqNCASTtMcic6iVbNBLMvtVRMKZe", "blocksMintedPenalty": 0}, + {"address": "QVLfpDkWRBNt5UMAWkUAAfkcPpiGTnovrc", "blocksMintedPenalty": 0}, + {"address": "QVM4oXUhWqcJ3QxLEQcYTsBa9NAXaEz96S", "blocksMintedPenalty": 0}, + {"address": "QVMX6jrpoUTTm8RKZDMppKzKWG5pyagTPW", "blocksMintedPenalty": 0}, + {"address": "QVN24ocCLbR3EedvpBndwLSaieU3Tfqypv", "blocksMintedPenalty": 0}, + {"address": "QVNsaYXSp76dyqDbEdewPd3YzjdP7eu9X5", "blocksMintedPenalty": 0}, + {"address": "QVP6sdHQyB9e9FuFk6kobfMDSZBSf4miZz", "blocksMintedPenalty": 0}, + {"address": "QVPXtXGfjZzLYTzJtenp8kZN4BJjNxrvow", "blocksMintedPenalty": 0}, + {"address": "QVPeymEwitirstavUcgmKnq3rtZc7ARs1r", "blocksMintedPenalty": 0}, + {"address": "QVPgZJCfq4EmLXZ6beEAfM5a7nT4qb7E9q", "blocksMintedPenalty": 0}, + {"address": "QVPm2AxvGMiJnCNuDxaF6sAKjZ744RjNKw", "blocksMintedPenalty": 0}, + {"address": "QVPwGJUQtC1K1GetMAndg5bK57T5UjwQgn", "blocksMintedPenalty": 0}, + {"address": "QVQ5N8X65a1qpfzaevCGh1KtQhKKmyVVrZ", "blocksMintedPenalty": 0}, + {"address": "QVQCuhrd22sCNbdXkASg4hZz841E95xbvh", "blocksMintedPenalty": 0}, + {"address": "QVQNLupodxAXz3e2j1qEENNRsTegTEo6is", "blocksMintedPenalty": 0}, + {"address": "QVQWxKJnxKaCQVmzNHGzLyfPsbmXNNGjsD", "blocksMintedPenalty": 0}, + {"address": "QVQa1s1t2CGmpTrtW551QZ7MUXuGiCYz3w", "blocksMintedPenalty": 0}, + {"address": "QVQd2XTJdvD6qqKNXsxAa7kXTNLJHoaLVb", "blocksMintedPenalty": 0}, + {"address": "QVQoYgBvfe3gM27oAJD5NgLybZRQMzRFRU", "blocksMintedPenalty": 0}, + {"address": "QVRKV4U3cDkvgpwTuw1uowc2ZK2qfQFCiF", "blocksMintedPenalty": 0}, + {"address": "QVRLgqQ4GzXoVjNMH6yciUotypLsa4Dcah", "blocksMintedPenalty": 0}, + {"address": "QVRtjnxhMG5yzL31ZsU5LrvMXqueZaTg5Y", "blocksMintedPenalty": 0}, + {"address": "QVSVErUtn9FwowHWpPT2U9DynT9TcQFvXZ", "blocksMintedPenalty": 0}, + {"address": "QVTEcqdfqGobwJkHVfiHV5oPsBLMp3QwCZ", "blocksMintedPenalty": 0}, + {"address": "QVTQMpx72dzPpjed89jB9ygzNFMdY3BUHw", "blocksMintedPenalty": 0}, + {"address": "QVToUPoLL9KUzMSjX9HYTUYxb36qqxH7y8", "blocksMintedPenalty": 0}, + {"address": "QVUP7qUamUz7QX8M3ydjtJCEsrARpw5GiR", "blocksMintedPenalty": 0}, + {"address": "QVUWNBUDaPLGgsfEbCzAK7KSju3MKHjzbd", "blocksMintedPenalty": 0}, + {"address": "QVUk7p8etmQASmCevoyXNanqKQHs6DDCPB", "blocksMintedPenalty": 0}, + {"address": "QVUxxvUgiqjt1aSr2v2Hqy6rt1dP8HA3DC", "blocksMintedPenalty": 0}, + {"address": "QVVFcm23Myd3j5BqaxwNDURATfpL9rhdnT", "blocksMintedPenalty": 0}, + {"address": "QVVn7qVjevE1egTNUmGAmp5aiUNrtYRrdq", "blocksMintedPenalty": 0}, + {"address": "QVVuDK5KpCYpRnG6tKKwE8stfCu51ecNbz", "blocksMintedPenalty": 0}, + {"address": "QVVzACksaD3FPC6dzuAoQxeYRq3UFi8QiB", "blocksMintedPenalty": 0}, + {"address": "QVW4kwKhTqR4yfZa84eBkyn3QJ7UTXyb1i", "blocksMintedPenalty": 0}, + {"address": "QVWCz9wP911MWRtSAKSdhLdC3vvgj3D353", "blocksMintedPenalty": 0}, + {"address": "QVWMaahBrvyquMsoyummquEyTqqHRveCHn", "blocksMintedPenalty": 0}, + {"address": "QVXGEXoNenfVH45JK2RkgUf4zYuth4aJaM", "blocksMintedPenalty": 0}, + {"address": "QVY9pVuYr9QB1FYoQbi4qCkoemhUZCHAeq", "blocksMintedPenalty": 0}, + {"address": "QVYdxQZ7U3f3wKU7YXMZdjXUWHvjPdNHa7", "blocksMintedPenalty": 0}, + {"address": "QVZEGr9M5A1L2woeb5cRdQaZp7a3txpMdU", "blocksMintedPenalty": 0}, + {"address": "QVaCPdRvQk2FmfZmsvUqAaqqiWw1mm1168", "blocksMintedPenalty": 0}, + {"address": "QVaLQG6FBvomhXihQcXV3xPZ9NRs2eUK4K", "blocksMintedPenalty": 0}, + {"address": "QVaYgjQgACuhX1WbFAtmE74AB7qpNfH7jP", "blocksMintedPenalty": 0}, + {"address": "QVafDY6BS8pGtT1DDJxTo85uM9fzCRExEQ", "blocksMintedPenalty": 0}, + {"address": "QVaifjYtMXB3iCLT3X3szSTMmJDHrUgomw", "blocksMintedPenalty": 0}, + {"address": "QVaqUd6w1VewffeLMdNPnon7q6WJMD5fYG", "blocksMintedPenalty": 0}, + {"address": "QVb4cVYne5hCLs43jRqGp6oMXWrdXzYrhN", "blocksMintedPenalty": 0}, + {"address": "QVbPkMMrksSx4hXNEZeP2S6S5yYjp8yaU7", "blocksMintedPenalty": 0}, + {"address": "QVbfrg8bGtXf8LRcMHLUfdUGhENRuuwS9W", "blocksMintedPenalty": 0}, + {"address": "QVcwFC1jE8Ct64Hajk2W11yBND3ndT79gs", "blocksMintedPenalty": 0}, + {"address": "QVdMb5DFjwMQCQdSx6VP48rLRkLh6FHwUi", "blocksMintedPenalty": 0}, + {"address": "QVdt1WYAjvTsbuWus7zdmSNRn4erWNi3zC", "blocksMintedPenalty": 0}, + {"address": "QVdtTNQhJTcf5aUbyDmqnhBFmteWBGnJxj", "blocksMintedPenalty": 0}, + {"address": "QVegktB3xcR3oBsiU5jHvM38v8kMFWzzWL", "blocksMintedPenalty": 0}, + {"address": "QVenZc5qR26EfReGtLqpqbvkC3EY3Q7Cg6", "blocksMintedPenalty": 0}, + {"address": "QVeqEdhXVLvNr3guGTHdqFRsc4dc94KZzD", "blocksMintedPenalty": 0}, + {"address": "QVfF1UsiocmbMcxj3Tg1MALZLkE8BskgzH", "blocksMintedPenalty": 0}, + {"address": "QVfPCxcYDhtuu1Z5XrPazHwM9jEaKboZw9", "blocksMintedPenalty": 0}, + {"address": "QVfZh3TSRTcQRSAsMPTYRARfEFc26hZZUN", "blocksMintedPenalty": 0}, + {"address": "QVfbMe9mRNhPoGnjrXTPajXLkV3AnaxSDz", "blocksMintedPenalty": 0}, + {"address": "QVgCEEecsYKBDU8QggPg1P5nEqai9xddYp", "blocksMintedPenalty": 0}, + {"address": "QVgXSP3W5tb6L2nhH6WSAyjbUzfzyNNv88", "blocksMintedPenalty": 0}, + {"address": "QVhCf6AJGb4pko1WTrnjC2EyhzqjXfCgi6", "blocksMintedPenalty": 0}, + {"address": "QVhDNqWptwcwVcYLEhthzUCb1etpLqm3k7", "blocksMintedPenalty": 0}, + {"address": "QVhGQjVt6pKPf4GZzBih9YoafTnbhtBqeZ", "blocksMintedPenalty": 0}, + {"address": "QVhqp7pmPV32cBD7mosTsJoKk1THNLpFCz", "blocksMintedPenalty": 0}, + {"address": "QVhy7ReLjmKy1TdRmRNwPUrnkrHDV1cD7z", "blocksMintedPenalty": 0}, + {"address": "QViGLgFm3arizGNponq3miL9B2sd47EK3k", "blocksMintedPenalty": 0}, + {"address": "QViVvwGVnKGSVGw5eALfo7SSXXH4R3viyW", "blocksMintedPenalty": 0}, + {"address": "QVifGsTGKCsAtEAtLfjRU3ToSZYnar7kzh", "blocksMintedPenalty": 0}, + {"address": "QVihS3sta3NdTv8fxyW6CHQxVbBbPaJwUQ", "blocksMintedPenalty": 0}, + {"address": "QVincDNELoePaC7Jqoyn2LEzK8mfdubnts", "blocksMintedPenalty": 0}, + {"address": "QVj6ogok9UGEeTY5edM7bxQf1hyWGMJNqX", "blocksMintedPenalty": 0}, + {"address": "QVjQNESV6V4qeRae9FdaEUEuqLnLt5ui4Q", "blocksMintedPenalty": 0}, + {"address": "QVjQrMHV4txc4cxDvPe6PtbJpMMEKvPG3x", "blocksMintedPenalty": 0}, + {"address": "QVjgcKKfCa521Who4RgJbH4rRd1YJESMJJ", "blocksMintedPenalty": 0}, + {"address": "QVjtvavAkwywV2DGiZf7jCcrc75D8jNm1C", "blocksMintedPenalty": 0}, + {"address": "QVkPtoqxjoZc2XcJpxnQq9oL4ocgZikHEL", "blocksMintedPenalty": 0}, + {"address": "QVkU9BkB2e5QzBNPaL7MF7wbJRzY5QhpNa", "blocksMintedPenalty": 0}, + {"address": "QVkyiRTaEd8kTjLH4KccXiMkZv44vDbyGo", "blocksMintedPenalty": 0}, + {"address": "QVnc4KhVwye2UG7Hfwu4fgxcA5VGyhcZLX", "blocksMintedPenalty": 0}, + {"address": "QVo5gUgaCr74cN3iUGZPQovavDteZgin8j", "blocksMintedPenalty": 0}, + {"address": "QVo5wuxofwD4QHHUcUZyCggXdZmyg6Brxw", "blocksMintedPenalty": 0}, + {"address": "QVoLeMeA9VvxNjb7q1PKcJBE1AhgF6ifSa", "blocksMintedPenalty": 0}, + {"address": "QVoZ6qWcrp59si8zJrbfG4nLnDqZozxcus", "blocksMintedPenalty": 0}, + {"address": "QVotbszSaMJ5u2rDbu7QaXaS3EESxMKKYd", "blocksMintedPenalty": 0}, + {"address": "QVp78qBkz8tcoVirS9ff4P2NkQRDTeJQrV", "blocksMintedPenalty": 0}, + {"address": "QVpWgtJ8t6zEQW5yje4MdDbAJbDpjub1ts", "blocksMintedPenalty": 0}, + {"address": "QVpg4aHE7KmHZgYp4rYRCFKjJUznnzW3VL", "blocksMintedPenalty": 0}, + {"address": "QVpnrjnoh7osuMeRjXj2oXButHaX5unB2u", "blocksMintedPenalty": 0}, + {"address": "QVpxYc443ZP2cgxxvJac3XD5KVHTjvFPm2", "blocksMintedPenalty": 0}, + {"address": "QVq9CmzK5VGACVKxQuAA9npQ6zatdYVeiX", "blocksMintedPenalty": 0}, + {"address": "QVsSciGEY5wCFRNNj5s55tfFmEFuyD8BbX", "blocksMintedPenalty": 0}, + {"address": "QVsiQNzxg4FbeGoY3LDiz7FxD6EpnQ3zJZ", "blocksMintedPenalty": 0}, + {"address": "QVsoYTErYB9Qeb23rGSvx6j1riXMXX32R1", "blocksMintedPenalty": 0}, + {"address": "QVsoqDoUukrcGrX3je9brdqjDjFfSNtaNt", "blocksMintedPenalty": 0}, + {"address": "QVswAxp1qKbkTZcqtAgo9NiWmVLa4B7ZBg", "blocksMintedPenalty": 0}, + {"address": "QVt16nQkKbYMvGmuep3scgxdiCimEbyr32", "blocksMintedPenalty": 0}, + {"address": "QVt8a2goaAFUqkDB6hqnpEH44q4MFyQXVk", "blocksMintedPenalty": 0}, + {"address": "QVtPUJW7FuoYGnt1QCyva9jfdN7BVs97sQ", "blocksMintedPenalty": 0}, + {"address": "QVto6VC7o8v9AY5uCWwYTyAqVr6F2XTV4k", "blocksMintedPenalty": 0}, + {"address": "QVuVgDWk3E9VJKectc17tpRLrEWYEoJqEr", "blocksMintedPenalty": 0}, + {"address": "QVuZK9ofcwQQUwPHAY3gsaDNCXXfZeUYa7", "blocksMintedPenalty": 0}, + {"address": "QVuksgNt3QAr7KCrkxtE5FWrczfgLKxs4H", "blocksMintedPenalty": 0}, + {"address": "QVutytLraMr1NyQUmvob4vQ5GGLjPmLDdY", "blocksMintedPenalty": 0}, + {"address": "QVuuNtp1k6oXFXggc2YXqjfe7aMYFXXLoJ", "blocksMintedPenalty": 0}, + {"address": "QVvHHQATanKT8yTwhVCrncJxHDv9174QGu", "blocksMintedPenalty": 0}, + {"address": "QVvK15gYwhNJ6FxMcCRU4ZX4GfH4AFGh54", "blocksMintedPenalty": 0}, + {"address": "QVvMfK8iHSehgJfHnHg94KkdTDx2gmvNj3", "blocksMintedPenalty": 0}, + {"address": "QVvMfkqJobVwEbwrRZoszKbpT65dWpJXUR", "blocksMintedPenalty": 0}, + {"address": "QVvSeDNMjVFx1y1VCQtVRqMYzwFBoUuoHW", "blocksMintedPenalty": 0}, + {"address": "QVvfpYEDjzJRs9QSZ2YnaVNFiWQMLk8uV4", "blocksMintedPenalty": 0}, + {"address": "QVwGyRfG1Eo9zaRzsZafSJua4MEwu9uSBr", "blocksMintedPenalty": 0}, + {"address": "QVwKKG2SbvVjWWLzcn1wKwnnxZcatUwUf7", "blocksMintedPenalty": 0}, + {"address": "QVwYrSC7uWQ94rARXPrFswDmx6YZ5AtSA7", "blocksMintedPenalty": 0}, + {"address": "QVwjURoX598mRpMxPY7heGgx9yWBqfKJsQ", "blocksMintedPenalty": 0}, + {"address": "QVwvnKcxBML3exdBXEkSqTVRSDK1Q8e6vn", "blocksMintedPenalty": 0}, + {"address": "QVxJCd9tR9YjwtgAPFB65YghjoHKX792PR", "blocksMintedPenalty": 0}, + {"address": "QVxYg9zvosdkvwCQ3fNZzmrt4EGf33RAgp", "blocksMintedPenalty": 0}, + {"address": "QVxshkvACUwJTeErp4ewvKHHRxk6QCpdwN", "blocksMintedPenalty": 0}, + {"address": "QVy6J2b4TFE1a3WkG2qL4UfGpjYUEpjWNk", "blocksMintedPenalty": 0}, + {"address": "QVyPK1iPg8u8GwpKnjbeaV3vAakRzVwxhh", "blocksMintedPenalty": 0}, + {"address": "QVyRFuC1o6qpYc5nZ54uSPDFKjf318izd7", "blocksMintedPenalty": 0}, + {"address": "QVycGZmMYoozmDWiG6V5frX7TgaNjiiiJi", "blocksMintedPenalty": 0}, + {"address": "QVyrwSUuWjsq4fTejmwh9gLiRGUBi2woKq", "blocksMintedPenalty": 0}, + {"address": "QVyyaux3AYs7H7e6cntctSGdjScvzGcf9Z", "blocksMintedPenalty": 0}, + {"address": "QVzBtDbJuLLZWrYxShNRSSuwa46iKgJxGG", "blocksMintedPenalty": 0}, + {"address": "QVzN9kuNZq6ouswvP1h4NmoJo219TSaeSR", "blocksMintedPenalty": 0}, + {"address": "QVzbL4yu7J269QrtRJKqNoSP8jB4E8JFvo", "blocksMintedPenalty": 0}, + {"address": "QVzfoxeN5kDMT6bwVzkrwBw2uUXwoenqG5", "blocksMintedPenalty": 0}, + {"address": "QVzqhXtyJsq66ubAJvFsE8PEYLYTueLziW", "blocksMintedPenalty": 0}, + {"address": "QVzyHr4rm44VogB8cXk1dDp6H3QRBhBjw7", "blocksMintedPenalty": 0}, + {"address": "QW1LLG1cbmdrvMzXLRBcRFmyQAE4jVZhS3", "blocksMintedPenalty": 0}, + {"address": "QW1RPR9rZs3AuvD7kVEuFZeGQWuHFfqBDm", "blocksMintedPenalty": 0}, + {"address": "QW2BgTAQ9WACnz3VqBAJBMyciLb3ZEJH53", "blocksMintedPenalty": 0}, + {"address": "QW2noV2oBrk7Ug9TBGVA6zMLGWMuex4yaF", "blocksMintedPenalty": 0}, + {"address": "QW3CMqD8cKVc4VCVr3jGqdE1FzgVTxJysN", "blocksMintedPenalty": 0}, + {"address": "QW3CqXLfCxQUtztuH8DjQKxBegmR4aBCX5", "blocksMintedPenalty": 0}, + {"address": "QW3FeeQcqUtriPVgpZBjGxgd6gYbgjB1J8", "blocksMintedPenalty": 0}, + {"address": "QW3nh4rMZHXaUnknVvRSsrF5gUuBEqvtP2", "blocksMintedPenalty": 0}, + {"address": "QW3spDt6uUf9D3hpRfXv6vdq2WSjRiYCJT", "blocksMintedPenalty": 0}, + {"address": "QW42652DMkVvAbFUNDYpLAv9Qrxf3ci7EF", "blocksMintedPenalty": 0}, + {"address": "QW4Jsd6njJdiE3Ucz3EGZQayCiYAvYjfJP", "blocksMintedPenalty": 0}, + {"address": "QW4XLRN3qQ1pd3rQ3r3GW28MzrFKMXhFSR", "blocksMintedPenalty": 0}, + {"address": "QW4y4j68keoytVempxkgajUbWX1rjXQARK", "blocksMintedPenalty": 0}, + {"address": "QW5DhhACoAdVcAvnCpqS1qcm6jHAyDiAiT", "blocksMintedPenalty": 0}, + {"address": "QW5NKdmGZKRxFfWAG4LnuAKjx7LBfPvbHM", "blocksMintedPenalty": 0}, + {"address": "QW5TVRMdA6bkGkQEgoEfJTcFbEsmBVXJH6", "blocksMintedPenalty": 0}, + {"address": "QW5VPRQqQ1VevMAQ4Z7qtEDg43e7toRsTf", "blocksMintedPenalty": 0}, + {"address": "QW7L6GLUK23vdj8dWgkYq3yaK7vkb9gF25", "blocksMintedPenalty": 0}, + {"address": "QW7NTEP9BC4vzJ4rSa6V8MXDsS9oUKPUGr", "blocksMintedPenalty": 0}, + {"address": "QW7VuvTQPpGP811bqb9u8BxN7E3zFYZu7x", "blocksMintedPenalty": 0}, + {"address": "QW7f9AvBUTSkfb2hjrBRJn1y6mXf6pD2i9", "blocksMintedPenalty": 0}, + {"address": "QW8UqiAeRHzc3Wt98P4NgSdKrxbjHVpbvW", "blocksMintedPenalty": 0}, + {"address": "QW8cRNTmFdqMXhohxYzPkrRjwwnkmhhoLH", "blocksMintedPenalty": 0}, + {"address": "QW8wBfAKuJkKEY6d8a44y8CDUgomXTt7UU", "blocksMintedPenalty": 0}, + {"address": "QW9QQwevmginzAYaGmCqcUtwyTvwUR4G3y", "blocksMintedPenalty": 0}, + {"address": "QW9VLxd8N2cC4DAGQ3U8c77Q7xbSmKDsdh", "blocksMintedPenalty": 0}, + {"address": "QWANwpY1W7ucxShgLY9yT97tVuQPNkzNvC", "blocksMintedPenalty": 0}, + {"address": "QWARZhzA2Wa6RH78QPU2hPXZt7MuZbZPvU", "blocksMintedPenalty": 0}, + {"address": "QWAZLYeyCvqrfnvNvMWrYFEerPQnzDjLDJ", "blocksMintedPenalty": 0}, + {"address": "QWBH87Movy9bhUiGF2v7ZtDZdanmRHrpp9", "blocksMintedPenalty": 0}, + {"address": "QWCRntcZXepXf5RntgchW3soaDmd6Hkzgq", "blocksMintedPenalty": 0}, + {"address": "QWCakK8GBRjbfcY5ZJzTMGNNg1iF3t8qaC", "blocksMintedPenalty": 0}, + {"address": "QWCbPTLPycPY1KPubUpdmQAVRtGL9n2Vgx", "blocksMintedPenalty": 0}, + {"address": "QWCccAJLsyLbhny8rwc2oV5fwbSnPm2N8H", "blocksMintedPenalty": 0}, + {"address": "QWCrT2bKwnFTBJAWFec21KPewgFYZrFykd", "blocksMintedPenalty": 0}, + {"address": "QWDJ4gbUtMUBum2whWQQPtE4KeLDnNcUx8", "blocksMintedPenalty": 0}, + {"address": "QWDsaGKzgVGsqn62AznrvHfL6nWvRxY8eg", "blocksMintedPenalty": 0}, + {"address": "QWEXZBRmxLBHxtoJRefvd5AM26GEoAWDNm", "blocksMintedPenalty": 0}, + {"address": "QWErXURFoJi3HyGZcXzPrh7XUoisLVCjdx", "blocksMintedPenalty": 0}, + {"address": "QWEvk9Dm2ZsNkQu56VckuWmYasBSBUCmdk", "blocksMintedPenalty": 0}, + {"address": "QWEz2MjWHrwFCqQMt7uQddfQQuJ2bwJYHL", "blocksMintedPenalty": 0}, + {"address": "QWEzkHKdfmhVNUtxYqr7p4udMwdv1F47rc", "blocksMintedPenalty": 0}, + {"address": "QWFEDU6qLvyXGhHu83rH6YRtoWuyhcyF9V", "blocksMintedPenalty": 0}, + {"address": "QWFaycMPqxLN2mEyFRV8eQ4D6Ggh9P8b6Z", "blocksMintedPenalty": 0}, + {"address": "QWFmPj1mVLYXYoYvar6r3Nz8mqACWu8Cic", "blocksMintedPenalty": 0}, + {"address": "QWG192ywgpVnSS62K75CxdfnCV2njb4jJz", "blocksMintedPenalty": 0}, + {"address": "QWG8pcH2iRYs9TBJhrvdktGePgATPSKT55", "blocksMintedPenalty": 0}, + {"address": "QWGEgiJLLcGEZSYkbkTerQxx2fE9t4xaYX", "blocksMintedPenalty": 0}, + {"address": "QWGmiMfKUdbGFy12MceEBanNs8e88T71Ah", "blocksMintedPenalty": 0}, + {"address": "QWGuzHMpHJxe6PPxNQYtGg9dPXh2MJ2KJT", "blocksMintedPenalty": 0}, + {"address": "QWHCroEtHUv724eNm7z1Sc3MDqBpgwVcBa", "blocksMintedPenalty": 0}, + {"address": "QWHn9pFcenKe4R4L5c34X6BxxxQhTQiuTw", "blocksMintedPenalty": 0}, + {"address": "QWHohU9TT1UqrhtzxmVagiso883XKtVaTb", "blocksMintedPenalty": 0}, + {"address": "QWJJCCNZFWEJG33B26bxJVq9eEMKfSDMX7", "blocksMintedPenalty": 0}, + {"address": "QWJMuXfwrBou4Q8NWMQUejuqVrjPxVoXkH", "blocksMintedPenalty": 0}, + {"address": "QWJYTjeA8rPkMFZjRdQMr4rKTSGFyyXmmJ", "blocksMintedPenalty": 0}, + {"address": "QWJftgc95HAMap76F6bQp9vyajzQwNUbFm", "blocksMintedPenalty": 0}, + {"address": "QWJqWW134GoUPiBN8gXkBNA3wPsUk5iZH1", "blocksMintedPenalty": 0}, + {"address": "QWKNZpsDEYoSwdYdspKaLZC3LdRgvxXXGE", "blocksMintedPenalty": 0}, + {"address": "QWKe6PPZXF1sGcQdLZRRLmrg9HuP48ueHP", "blocksMintedPenalty": 0}, + {"address": "QWL2o26DK9yqSepf29UKfgqYLRCj37bwZK", "blocksMintedPenalty": 0}, + {"address": "QWLCnP8WXgYdyW3x78nZssbwC8nk42egP8", "blocksMintedPenalty": 0}, + {"address": "QWLQKdTHEtUvtxkDixGbZjwVgSrSADAzkx", "blocksMintedPenalty": 0}, + {"address": "QWLTkHMHNS8HfXCeXPwWSRd62nnRKFfsSb", "blocksMintedPenalty": 0}, + {"address": "QWLaBNzPzpYeBRwLuEnXX3W2DDu93PDpKv", "blocksMintedPenalty": 0}, + {"address": "QWLfparZiy1d94KBimxLz1PhHVgA7qzX3V", "blocksMintedPenalty": 0}, + {"address": "QWLfzH9C3QBjpEewiFPe41anZNacwdUHmj", "blocksMintedPenalty": 0}, + {"address": "QWLkVr13e17L1Mes2Q7fEGKDqPrjc2VVsa", "blocksMintedPenalty": 0}, + {"address": "QWMPSccMyQJqCDdyRqqu89ZPWJTHUsqSre", "blocksMintedPenalty": 0}, + {"address": "QWMQaLXHG8bfxBcKW36m1dNCHV3enMoshy", "blocksMintedPenalty": 0}, + {"address": "QWMVHqJzsbHZyVEph5JHh5YqiQSB55xkfc", "blocksMintedPenalty": 0}, + {"address": "QWMh8tEPzrFtLVppJF6wG3WjKBRmWWUBtT", "blocksMintedPenalty": 0}, + {"address": "QWN88EjtMpH2gYFj8fBDYCn3uArsBRfkKs", "blocksMintedPenalty": 0}, + {"address": "QWNQWqEaSEybicPzodMbP88aAZEn4jwYMc", "blocksMintedPenalty": 0}, + {"address": "QWNVfWPXvobke3rYphJjs7hkrna43BJwFD", "blocksMintedPenalty": 0}, + {"address": "QWNi8uDKWx9STG5gxaWMrCotJtS87Y9G1Z", "blocksMintedPenalty": 0}, + {"address": "QWNpAy8i1iQyMb3h3WKyuK63JotEXUWXY5", "blocksMintedPenalty": 0}, + {"address": "QWNpCXzwvKM1iSNgemCMxdV77HrDqLKM9w", "blocksMintedPenalty": 0}, + {"address": "QWPDJUV4qyRpap6YsciBveqP2CFjwjFcLd", "blocksMintedPenalty": 0}, + {"address": "QWPJvygUhDwqtgYFLAuWsA6b1J9rHLr39S", "blocksMintedPenalty": 0}, + {"address": "QWPLuLgEX2AcGLxh911DFPNu7ZTdhB3fSC", "blocksMintedPenalty": 0}, + {"address": "QWPReQofMcGrX2attnBHs1k93deGPdL8sV", "blocksMintedPenalty": 0}, + {"address": "QWQAMxUUEPYzQHuZ9JW4A5aYnYJcfhZkL9", "blocksMintedPenalty": 0}, + {"address": "QWQQWGoGBCDRfhAJLsXwsKuhKpeUzgiUVP", "blocksMintedPenalty": 0}, + {"address": "QWQkTRaveNA6ETv88UP3SVzRNhsQW47RGQ", "blocksMintedPenalty": 0}, + {"address": "QWR3L8mdFDdErbZFgAJjTi19N4LLXogar5", "blocksMintedPenalty": 0}, + {"address": "QWRU8WVoy24qG4cs1vRS5sssYZSwS2bibE", "blocksMintedPenalty": 0}, + {"address": "QWRgRZrwqGvo53LsgJii6JG2dN97fPqhvi", "blocksMintedPenalty": 0}, + {"address": "QWSUoMTN5ZLkj7phyiqFnCYmgMP88CLb58", "blocksMintedPenalty": 0}, + {"address": "QWSiUJfy8Mfzfg2Wb7grLHDiB1Bot2SzpX", "blocksMintedPenalty": 0}, + {"address": "QWSkYMXkNj19CNpP35VpRDAJihR8xoNPmQ", "blocksMintedPenalty": 0}, + {"address": "QWSuZ7rdZU8S5fmYnSDJ6AMaMRzogUfj1h", "blocksMintedPenalty": 0}, + {"address": "QWUL8aEzQoAAgrnNGquXuLtENPS8cQXLvG", "blocksMintedPenalty": 0}, + {"address": "QWUaQEsCNRZAoSnawfFcjwgbXNTumebZEE", "blocksMintedPenalty": 0}, + {"address": "QWUkN1XzhcAF2FuW8JhS6mzg1CssF6NqXq", "blocksMintedPenalty": 0}, + {"address": "QWUoBd3mcDeb5p8LKwYhDzjAZUcRSzvDLm", "blocksMintedPenalty": 0}, + {"address": "QWUtvCY3u8HvxMj4SeXRWm3w72kRQnz5RW", "blocksMintedPenalty": 0}, + {"address": "QWUuTfnbZ8X4BV9RogusDCfHnZcLpmJNtF", "blocksMintedPenalty": 0}, + {"address": "QWVCRrgQwCA5pDqVXyMnPW5866pewALxT2", "blocksMintedPenalty": 0}, + {"address": "QWVEa5h6HJx7781o6M4svVgDann6tXeQLK", "blocksMintedPenalty": 0}, + {"address": "QWVTS69usQ5peW12waiZudC36yKMiBBdvx", "blocksMintedPenalty": 0}, + {"address": "QWVvngrGrTRL3SUDRgsaQ45pFgXKU5GEFK", "blocksMintedPenalty": 0}, + {"address": "QWWF78PWEJY7KDtzSdCK3BdLXK3Lo4ytZ2", "blocksMintedPenalty": 0}, + {"address": "QWWWKgZ5C1y5KtzwL9oqz4jUKbpP8Z7Z4Q", "blocksMintedPenalty": 0}, + {"address": "QWXQ3yMUDGGHsLB8uMwPw5phoTpLhEtEMG", "blocksMintedPenalty": 0}, + {"address": "QWXWPk7PmTobgpYov1oGXejh3nBX5dj2sz", "blocksMintedPenalty": 0}, + {"address": "QWXfeQCMJZ7EEe1wcPhagfA6bYE8Ma7E8A", "blocksMintedPenalty": 0}, + {"address": "QWY9KtzJjVnA5G1wy5x9qSzKDeHobauRE7", "blocksMintedPenalty": 0}, + {"address": "QWYUpHqu6Nmz94TRpp6mDvuSWj56Bfwmur", "blocksMintedPenalty": 0}, + {"address": "QWYXtJyHJYwAyk6bAxXtpyEy81aKyCjoA6", "blocksMintedPenalty": 0}, + {"address": "QWYgcbhwdsEe68VMqqvrSfGZ7SwayiQMh6", "blocksMintedPenalty": 0}, + {"address": "QWZ2uhP1nG9QiBwWjauUpyUshAszXsMCXo", "blocksMintedPenalty": 0}, + {"address": "QWZRtPejGnf4vQnxJNdHRmbj6oWZGnDbzw", "blocksMintedPenalty": 0}, + {"address": "QWZVaom75do2Xz9L6ESRYo9gH6Ru4C3su2", "blocksMintedPenalty": 0}, + {"address": "QWZXykZ1ruKHa1NfQ1ykmc31a3agbiHmq4", "blocksMintedPenalty": 0}, + {"address": "QWa4tPZV1im1a4Jp4Wa84TrYTiqjR4z6rZ", "blocksMintedPenalty": 0}, + {"address": "QWaJXdEphGUwDBY7zidCsAGaYZfT59eajJ", "blocksMintedPenalty": 0}, + {"address": "QWahzuPj3w5BbTRMd8WhuTt1LCdw3kyQC6", "blocksMintedPenalty": 0}, + {"address": "QWausFyvuCYxx9aTrAN8riS5mGsXNLr4i4", "blocksMintedPenalty": 0}, + {"address": "QWbNaFXiShE3ge8pE3krGP5Bgpc6ZZN5ii", "blocksMintedPenalty": 0}, + {"address": "QWbSDSKM6cc7GVSAyndVNZJLztwyJaHqDh", "blocksMintedPenalty": 0}, + {"address": "QWbepMe1TQm3VkSU1vUFAMGoMN8c1zcqyb", "blocksMintedPenalty": 0}, + {"address": "QWbpeBxWmovjsQzuRZjwxNS62uiUfLWFLV", "blocksMintedPenalty": 0}, + {"address": "QWbqDM6FXPRbBWsRC8MesRck11aos6Pcvt", "blocksMintedPenalty": 0}, + {"address": "QWcHwfwTd43S4uchSJEiwgYX5JrxCGtr7D", "blocksMintedPenalty": 0}, + {"address": "QWcYi4wro3fS8T1fiRtdLmDct4JoygNNxb", "blocksMintedPenalty": 0}, + {"address": "QWdPeKE6kkAGvseMwvUFuCKKoFqLtnwZc4", "blocksMintedPenalty": 0}, + {"address": "QWdgs6gcMg7c6p9nFanwxHRsoGKtEcg4NX", "blocksMintedPenalty": 0}, + {"address": "QWfvCgZVJBCHniWpPpRdHDq2GUpHs9FisW", "blocksMintedPenalty": 0}, + {"address": "QWg2KqKdcLMEMytCXCgtc1ahH6xre43exN", "blocksMintedPenalty": 0}, + {"address": "QWg5BuxvqRZeasEJMztZubqHL5Bgr9T6Mr", "blocksMintedPenalty": 0}, + {"address": "QWgQStWc5x32LMCdoYywjHxY9BKqzn9rrr", "blocksMintedPenalty": 0}, + {"address": "QWhWDbCUcJ7gAMwa6jVjhn8UwRp3WgVp6s", "blocksMintedPenalty": 0}, + {"address": "QWi7VW46uaPmYjEbv16rVpK8yswx8qt9n8", "blocksMintedPenalty": 0}, + {"address": "QWiASLKKZaqbE8XKvKrxb6Db4ww4cKyQcg", "blocksMintedPenalty": 0}, + {"address": "QWiGoWNpz5jmpfFTziUkvYYAaJ3Y4TiAn7", "blocksMintedPenalty": 0}, + {"address": "QWigG4GAT8eQ6rmNo4AdcGjF5ygSTAV1Q1", "blocksMintedPenalty": 0}, + {"address": "QWj1eXBC9N48t1zLj5AjsrB8zogJYy3Rsq", "blocksMintedPenalty": 0}, + {"address": "QWj46NSSX6i57FKHdNpithdsrTZgYpqToA", "blocksMintedPenalty": 0}, + {"address": "QWjJAgkDzVj4woLSJxKZtX2uLt9hupd35B", "blocksMintedPenalty": 0}, + {"address": "QWjTeggrWW7NAgNFF8YXSjenAJ2H4aXs5Y", "blocksMintedPenalty": 0}, + {"address": "QWjXBhmR7YusHmxkRtThg1owbo5oqTnqXM", "blocksMintedPenalty": 0}, + {"address": "QWjjUQ1iA5KhXEhXfpPbDwS9xiDfu8WxrS", "blocksMintedPenalty": 0}, + {"address": "QWjjxvNoHthrdgMBbimkkhZy4xr5YRfAyM", "blocksMintedPenalty": 0}, + {"address": "QWk8g7RyXDNG55QF7J1SriwV9uq7ukkdap", "blocksMintedPenalty": 0}, + {"address": "QWk93G98KUmaWxRBH6rzv7bsZRZXYaUkwU", "blocksMintedPenalty": 0}, + {"address": "QWkModp4mU4ELoa81JbxMPFQjWFUoVzegr", "blocksMintedPenalty": 0}, + {"address": "QWkTDCuTWbpBMPz3fHPU6GegBXaYXR6xSH", "blocksMintedPenalty": 0}, + {"address": "QWkgb7YssnpsX3SX8F7Zcth5DSttiusnzv", "blocksMintedPenalty": 0}, + {"address": "QWkhiCLpkW8Mz1RzBp9knFNcfejEebJwQE", "blocksMintedPenalty": 0}, + {"address": "QWkofaNbSXHofyjFGjTvLHrUj11RHm1usm", "blocksMintedPenalty": 0}, + {"address": "QWkuXLigr5QdpxpTffYuL9CbKXHicFwZyX", "blocksMintedPenalty": 0}, + {"address": "QWmLRwNgAaLQjyk7eFLeu7YmxkFLnJdHdz", "blocksMintedPenalty": 0}, + {"address": "QWmhGrt1crQi5zbKmC6wm7C9PyfTzWx3Xb", "blocksMintedPenalty": 0}, + {"address": "QWmk4ndvrbo2Zd1WitBUirfdjt8k42hz72", "blocksMintedPenalty": 0}, + {"address": "QWn5aZm71voPXW2e587nLuWrs7DRJah3f1", "blocksMintedPenalty": 0}, + {"address": "QWn9JjVAutrT7K9EdrEfMEvbMRHz37LgCx", "blocksMintedPenalty": 0}, + {"address": "QWnQ4FsUdCi4SUQmksa53VVktVoWC2P8Gy", "blocksMintedPenalty": 0}, + {"address": "QWo4NT5Dr9qQZXsKfNuLfGEwsN6bjRtNuK", "blocksMintedPenalty": 0}, + {"address": "QWoGfGScds4yRV6viJJvwt1gKn52w7CeGv", "blocksMintedPenalty": 0}, + {"address": "QWoVG9foZJfRDcdumdiwzVEEZFcacZdA9j", "blocksMintedPenalty": 0}, + {"address": "QWogMaLjMnz5gvAtb6ZnF2ppS8mGSzahZ3", "blocksMintedPenalty": 0}, + {"address": "QWojvsNbWbHpdJgGdSDKB8ttt6ajNTbiir", "blocksMintedPenalty": 0}, + {"address": "QWonYHiMS4q2V3SZKUhcEvn82CnjWg9eby", "blocksMintedPenalty": 0}, + {"address": "QWos5EhnqwACrj61jX32MRdCmQRsBg8J68", "blocksMintedPenalty": 0}, + {"address": "QWpFc1a1Rf2fuK49G9gLYf4QAcwbvAc2Ws", "blocksMintedPenalty": 0}, + {"address": "QWpSS4vsDAw5AjrB78e1xvcdvR8xM8aj2F", "blocksMintedPenalty": 0}, + {"address": "QWpUpd5QGezW43Db19ehGrHHkru4qCY5du", "blocksMintedPenalty": 0}, + {"address": "QWpe2QS8JgcvMFxJmfbrakScKXswK7XrgH", "blocksMintedPenalty": 0}, + {"address": "QWpvgVRmf3V55B8JJwuDoPm7SV7HCrcuGD", "blocksMintedPenalty": 0}, + {"address": "QWqRyAyYnJkWo2AhCVysjvfWSumBuKcWBu", "blocksMintedPenalty": 0}, + {"address": "QWqcQqVzWNa5WTkpTstZmWkxLhtVkAgWN6", "blocksMintedPenalty": 0}, + {"address": "QWquBGXFQY4Hzy9xHZ8pFXP49qZhTowKgr", "blocksMintedPenalty": 0}, + {"address": "QWrKgFZVuZ7RbSCaxHiiRw6nCEfzVDoVVR", "blocksMintedPenalty": 0}, + {"address": "QWsXavMa53WnvkUx3seV57o6VEMUxoJZEv", "blocksMintedPenalty": 0}, + {"address": "QWsc9hJ9hNbaNKNuyHUqKcaEfndogZYTaS", "blocksMintedPenalty": 0}, + {"address": "QWspaffcKonTghC1hM6vcryBVDJeYd54oE", "blocksMintedPenalty": 0}, + {"address": "QWt1jSLUMrT4T2ReEK2SQtNExK4fLBWEd6", "blocksMintedPenalty": 0}, + {"address": "QWtNSdqbZKy3VkzWLYcG3ES2UF9zNXps7S", "blocksMintedPenalty": 0}, + {"address": "QWuNHJPsLbV7nfPojMgg5ZfKHzL8nxrydY", "blocksMintedPenalty": 0}, + {"address": "QWudqrVNNSsFEg4Ufb9hprvbYkxebWAsUh", "blocksMintedPenalty": 0}, + {"address": "QWujXiKww6pBX2NaJ6XJHYeHWcznVPVuR3", "blocksMintedPenalty": 0}, + {"address": "QWv3JjoitgsH2pcLTmdVewYYpj3jEccjn8", "blocksMintedPenalty": 0}, + {"address": "QWvbFEpzrQkKixJo4Z8ZXwsf4DcM1cnYPv", "blocksMintedPenalty": 0}, + {"address": "QWvc3aGifVny6jkG4f1gAB5RsfhT9wLHKv", "blocksMintedPenalty": 0}, + {"address": "QWvxVikWiaV97VbtsCm6gj7hWGY1WtFFCF", "blocksMintedPenalty": 0}, + {"address": "QWwDEkphnJeSrhNhTJRANznfsSattkuH8y", "blocksMintedPenalty": 0}, + {"address": "QWwZV52Jj6sA2Endob1CJuG2CKcyBuMC9a", "blocksMintedPenalty": 0}, + {"address": "QWwjS73D3ZupUYLZZZrY1GtGfbqkp7pRZk", "blocksMintedPenalty": 0}, + {"address": "QWxBVNQSCRd4dPzm5CGmPPRRVqKto2cFde", "blocksMintedPenalty": 0}, + {"address": "QWxD8sr8JVgN7gkcF7VB9Zkt82VhJQo7Lh", "blocksMintedPenalty": 0}, + {"address": "QWxbvDE629mMN2ACDrxJnawZ6Nt4DyYs8p", "blocksMintedPenalty": 0}, + {"address": "QWxi9QT4M7izrHEKsK649AoyLGwnHh4gFp", "blocksMintedPenalty": 0}, + {"address": "QWxjQmStGA2qaR1ovmzRLQ3YBe1PFrAgDA", "blocksMintedPenalty": 0}, + {"address": "QWyJuyYQgGBzJfQwSBY8f67QvHSwpJeSKh", "blocksMintedPenalty": 0}, + {"address": "QWyn45hQGp2UCjHJuNCKbaVEpWkVUMGepz", "blocksMintedPenalty": 0}, + {"address": "QWz3iiDKzDG2QkVue7rSN5Gw8NBYGq931V", "blocksMintedPenalty": 0}, + {"address": "QWzT9EZTFhB4ZKUgX3JWZYs66GoH7ewcFZ", "blocksMintedPenalty": 0}, + {"address": "QWzb68f2yLtmcMrdXBoufBD3FfBfKYKPHG", "blocksMintedPenalty": 0}, + {"address": "QWzhpqbYX1WrdvGkTJymESDtsrqi6gtV12", "blocksMintedPenalty": 0}, + {"address": "QWzuznnt7QAmkmfytcpjWwqk7QKr176Xfi", "blocksMintedPenalty": 0}, + {"address": "QX1GetpERepEkdEidz4PU7cTP3F8bAcfYc", "blocksMintedPenalty": 0}, + {"address": "QX1d22xE1upzqR8W9cpW1oZRKwYb8ZG978", "blocksMintedPenalty": 0}, + {"address": "QX1eS4YixcS1YYBkN6L7iUY6tsbmnwChAZ", "blocksMintedPenalty": 0}, + {"address": "QX1gSLRyavaXfwWtwoTqi8ErrbV1LTTbrK", "blocksMintedPenalty": 0}, + {"address": "QX1uoEkWyPZC9ug7nswL9gCcDSYEbXSG7C", "blocksMintedPenalty": 0}, + {"address": "QX1vakJZbVZq6ohqpkQEQM3X97mC9k9xSw", "blocksMintedPenalty": 0}, + {"address": "QX24xm2o3BWxtxRQ12r4YWaKVouKwpS6YS", "blocksMintedPenalty": 0}, + {"address": "QX2kQ6Jq3Sm9CxyypCcg5X9Vmw2S15nVw2", "blocksMintedPenalty": 0}, + {"address": "QX2meCtF98vpSCR49VLwgRNnqzFD1UfCZZ", "blocksMintedPenalty": 0}, + {"address": "QX2nTs5xAs2bdXnWLbfTnyU19s7kvNn2mR", "blocksMintedPenalty": 0}, + {"address": "QX3FccLBX6qrM5SQJ5KQHLomsyU5M97SV5", "blocksMintedPenalty": 0}, + {"address": "QX3n3DKcS8uQPJwEGKq3LvTJi6CnTym8Zk", "blocksMintedPenalty": 0}, + {"address": "QX4D8j5dd6RyfRoePY4WdhDF9CWskEuYhq", "blocksMintedPenalty": 0}, + {"address": "QX4K7NoAyJYTcCMfdX5T9EADBZsLM9Vko6", "blocksMintedPenalty": 0}, + {"address": "QX4NEHQcHbJpkLoKbQabQHDxWQMKoc2tLz", "blocksMintedPenalty": 0}, + {"address": "QX4YQxk2gUWoX5yvSKrhxpV22PQQbednpm", "blocksMintedPenalty": 0}, + {"address": "QX4gb8p7AWppd7UBmiYPsoNGd1XNqUTaFn", "blocksMintedPenalty": 0}, + {"address": "QX4j9eTWm3yZccBtLVTvvidyWLEAppmP9T", "blocksMintedPenalty": 0}, + {"address": "QX543FL6CARHNgETkzmfp8rA42jfSbTSvs", "blocksMintedPenalty": 0}, + {"address": "QX5RV9RVca71bBPH51SJDxeJtpfU3a9j6o", "blocksMintedPenalty": 0}, + {"address": "QX5bcZca7uga6SyBeNV1VEu4yowTFjrXhj", "blocksMintedPenalty": 0}, + {"address": "QX639fq365FUruYkVNS67QT6AdVNR1zjQx", "blocksMintedPenalty": 0}, + {"address": "QX65wYgfF11MdncH4e4P8RWPeGFupSqkSj", "blocksMintedPenalty": 0}, + {"address": "QX6PPaiYoRBK2o5oNv9fXeSsMzVJoWVfK2", "blocksMintedPenalty": 0}, + {"address": "QX7J5PQFJ8DWeCWvhDFzu7JHJXr8HzRttg", "blocksMintedPenalty": 0}, + {"address": "QX7KP7BYeXcz1ZerbijV2g5rxeWkwEUgBT", "blocksMintedPenalty": 0}, + {"address": "QX7tfRPhkCLwLmJx9PaXjeyDKR5r2PdgjT", "blocksMintedPenalty": 0}, + {"address": "QX7zJa8KgQidX9iXgDkg1jRDrxvHE9MmEv", "blocksMintedPenalty": 0}, + {"address": "QX8MZtv7C8QLTW38FXh9DboBVk9Vrix2hC", "blocksMintedPenalty": 0}, + {"address": "QX8QcLMyHHyjorTrKhew6Jn8bWM8Lyi49n", "blocksMintedPenalty": 0}, + {"address": "QX8V3h3futYzKVWo1kxmTZsZXbXLjoJ6MP", "blocksMintedPenalty": 0}, + {"address": "QX8djkmxoA42cfKb8VmPvK6dNgmV5Q1E7Q", "blocksMintedPenalty": 0}, + {"address": "QX97bMffeEKAkDsZBXovowC9FuEM3qPmxg", "blocksMintedPenalty": 0}, + {"address": "QX9CtmS3pcb8cJVjHj2X5S7FSxJzNytusC", "blocksMintedPenalty": 0}, + {"address": "QX9einQijP8UcCQm8yGT2KD1yeXEAb38eq", "blocksMintedPenalty": 0}, + {"address": "QXAM4CuLBu7SZmcmMxLe3Pd5yCBUksPFXr", "blocksMintedPenalty": 0}, + {"address": "QXAN8XJF9N72QLuYLXj3bwPktG2Q2AHF4X", "blocksMintedPenalty": 0}, + {"address": "QXAePfutyRxpxVH9Me4WF9BBZUkzKXda5j", "blocksMintedPenalty": 0}, + {"address": "QXAuK8k5QnhoSn4PsuVWpiWajS25tXyZLE", "blocksMintedPenalty": 0}, + {"address": "QXAyCorobBRvL5unMx6qhHSP1sc1YbGgXc", "blocksMintedPenalty": 0}, + {"address": "QXAz5e4R7aUYvYnmXF9GM9k9koto1g9hYH", "blocksMintedPenalty": 0}, + {"address": "QXBHyKMRGUqm3qs92phv5hmXpFdhFiJYQ4", "blocksMintedPenalty": 0}, + {"address": "QXBrVQDTL5p8BzcDbjNNSNjfvYeLS2N8Pt", "blocksMintedPenalty": 0}, + {"address": "QXBvjKWRhKvPsQ487Q186zZUVxSitWdhQR", "blocksMintedPenalty": 0}, + {"address": "QXByTxtudcPe88RaUs9Py7Lm7VZmB6Ccqg", "blocksMintedPenalty": 0}, + {"address": "QXCLTo2xhMh35x2EAeL21iEt34C1TBbf9S", "blocksMintedPenalty": 0}, + {"address": "QXCPcbLpMsaZXvPKZXiDL67iBz8bfnwXCb", "blocksMintedPenalty": 0}, + {"address": "QXD1adVFCPYWKbx14NEaXcBvLA2YsKfCZa", "blocksMintedPenalty": 0}, + {"address": "QXD4MrYeSwfFREYFTzs2WDzRj9AAviqdZ2", "blocksMintedPenalty": 0}, + {"address": "QXDvhV8YtCrTjEpZ7hYokswFuE6yb6NQoJ", "blocksMintedPenalty": 0}, + {"address": "QXE3eofRPPXHB8meKo6Lm3eWkJrq5b3aLF", "blocksMintedPenalty": 0}, + {"address": "QXEYE8DxhFudjPsMq5vqWrdEEKJdodqTTE", "blocksMintedPenalty": 0}, + {"address": "QXEmJgi6d8yyTzQTvnsggEZFuBQyCreG1c", "blocksMintedPenalty": 0}, + {"address": "QXFDGiQD2VsE15SfDzUfz7kHmS5dFPMLKa", "blocksMintedPenalty": 0}, + {"address": "QXG3dnX3xNLZMgAuTE1CQPVF9afu29AQAH", "blocksMintedPenalty": 0}, + {"address": "QXG73QVH5S9wiytUnP1RHfPgwLpv5sCNsr", "blocksMintedPenalty": 0}, + {"address": "QXGBhpFxPXLDPGgWsRpWmddRAn34hu7f8b", "blocksMintedPenalty": 0}, + {"address": "QXGiktg2pgA9BZTiQuNF3ueGRyWdUQfJef", "blocksMintedPenalty": 0}, + {"address": "QXGqhH2HVeB3u1DsZTk2cadAX1zQGAviwK", "blocksMintedPenalty": 0}, + {"address": "QXGxRTG26YenYGtxsAsWyRdwQRKaA9zDVa", "blocksMintedPenalty": 0}, + {"address": "QXGxzsE9MiygyiCoJtpe6nprrgMLxuLAHQ", "blocksMintedPenalty": 0}, + {"address": "QXH34cCu9w3kKs7Brq6F4i6jXmpDVxje1L", "blocksMintedPenalty": 0}, + {"address": "QXJ4p9bgJRH3S2MbZBvUhoULq9RXeLe4WM", "blocksMintedPenalty": 0}, + {"address": "QXJm5mBpKdSnjb5C8g54brbicropeQyoBE", "blocksMintedPenalty": 0}, + {"address": "QXJs2kN4BBzysTtBcvzsJ8NDcbmNMo8n6x", "blocksMintedPenalty": 0}, + {"address": "QXKNdQgZFPMvRLmLxZEixJDuZUneqvSe5P", "blocksMintedPenalty": 0}, + {"address": "QXKYgWmjDPfci7vmUqSEEasKLfVpGgg6V8", "blocksMintedPenalty": 0}, + {"address": "QXKpw2Lmx3cdkqnTBQBfDz4JBHzfMzmwju", "blocksMintedPenalty": 0}, + {"address": "QXL8XVjD9PD33V6REGzM9MVnvoH7oLAjKS", "blocksMintedPenalty": 0}, + {"address": "QXLBj9JMCiAZcNd83HJFw41BGcccDFhuAd", "blocksMintedPenalty": 0}, + {"address": "QXLH2syBuHkHDn7CGYGBuoM6uXrV49zY7v", "blocksMintedPenalty": 0}, + {"address": "QXLfrSjFJFjue5JZrKfUwqznQq9peErzkZ", "blocksMintedPenalty": 0}, + {"address": "QXLjNnBYtY4Dp7xMwa4Jggs6rjukHSht66", "blocksMintedPenalty": 0}, + {"address": "QXLjk2PsmNFDJb3pHag84fEG6p2VJokLdC", "blocksMintedPenalty": 0}, + {"address": "QXLwUwD6yNzD2ZnYG7BKZyhUCHeYhJxTgy", "blocksMintedPenalty": 0}, + {"address": "QXMeaTEy1pGqwH9ENMJVR9ch3wCUsNuwyK", "blocksMintedPenalty": 0}, + {"address": "QXMhDmx4uZLf34cBB1mkVM4rSunbHY4UrZ", "blocksMintedPenalty": 0}, + {"address": "QXMmuxh9Cto16sjdYP68m67dX2LZ8KGESs", "blocksMintedPenalty": 0}, + {"address": "QXN2muiYty19YF7QamAgstjVUyZUh9j5v3", "blocksMintedPenalty": 0}, + {"address": "QXNaEKX4LE8Tn87kNo8172oCucjFhKDLcJ", "blocksMintedPenalty": 0}, + {"address": "QXNaZd2uxNNKQUZx87SpWhFNrd1vohwXXc", "blocksMintedPenalty": 0}, + {"address": "QXP4Y9CK3ZthWyJXpkaDXyouHm6GFZNaew", "blocksMintedPenalty": 0}, + {"address": "QXPEEk36oc1kxUqZivxj1iZ2uB7iHxhwij", "blocksMintedPenalty": 0}, + {"address": "QXPUkwqqbHhpR8Yvqm5uZUbwKhq6QzKf5e", "blocksMintedPenalty": 0}, + {"address": "QXPik5TumxY7nHxrXNFbBUpQ8TKCRX9isy", "blocksMintedPenalty": 0}, + {"address": "QXPmiUFQ9LVXZWhGmMVEHE7rQVZvuGrXCC", "blocksMintedPenalty": 0}, + {"address": "QXQbyArTKuRCLmmuAuC7LpyXH4PLapjKib", "blocksMintedPenalty": 0}, + {"address": "QXQu8C3UZMJnSrQEuED2bUNZ2XY4sRJWZW", "blocksMintedPenalty": 0}, + {"address": "QXQuhfJJNoXaB46WxE4p4MbvhhURiEyudL", "blocksMintedPenalty": 0}, + {"address": "QXRYKNXnaQvmWUnkkQQ4FAbcMW1xq9SyXX", "blocksMintedPenalty": 0}, + {"address": "QXRZaTs2zZMc1GpaDiS22UjJhjBZdxvZWk", "blocksMintedPenalty": 0}, + {"address": "QXRcVtoKwvmdu6SzvtaX3M6PHSdDkiMcRs", "blocksMintedPenalty": 0}, + {"address": "QXRg1z24k33g4MpNitBopUFCgLboGxyefc", "blocksMintedPenalty": 0}, + {"address": "QXRq2JWpb2TmkGG3yXnwDpZTBuVRGbopuS", "blocksMintedPenalty": 0}, + {"address": "QXRsUU4yeD2CCozgnusUkipHhabhZovzEu", "blocksMintedPenalty": 0}, + {"address": "QXS1S62B81Qy7Q9bCajjoJGyid6pnrnkKn", "blocksMintedPenalty": 0}, + {"address": "QXSDHJfocXUSdXLE9f73YhAUJmYawVMRLi", "blocksMintedPenalty": 0}, + {"address": "QXSFGVvscA4jTHgT7UPojFvF7dNkazdRsL", "blocksMintedPenalty": 0}, + {"address": "QXTNG3PCVRyFtyDruZUZXmVR3nmTf4amYh", "blocksMintedPenalty": 0}, + {"address": "QXTaSoZCpkv2my38sedzEUaPHXaNnpRosP", "blocksMintedPenalty": 0}, + {"address": "QXTuoHTMqEgJJAyKejmMHfrFLWDycg4oe5", "blocksMintedPenalty": 0}, + {"address": "QXTyBHjuaQ952QLMrENrFotpsUefDJoLG5", "blocksMintedPenalty": 0}, + {"address": "QXU6bfthAK31eT6swoMNUHKBU74NjA78d2", "blocksMintedPenalty": 0}, + {"address": "QXUXyy1XGAJqL2Sia3auN53yAutEHRjUYs", "blocksMintedPenalty": 0}, + {"address": "QXUr2t3mcjyrPceKoqLJb9YBdw3RunmRaW", "blocksMintedPenalty": 0}, + {"address": "QXUs22Rnr1tXgPYDK2bEVtdXZEZf2V8eAx", "blocksMintedPenalty": 0}, + {"address": "QXVEDSy51aFWP15yC6HVzCV6XsSeBKUf3T", "blocksMintedPenalty": 0}, + {"address": "QXVjCJzX8pcST47oyyJqHTjnhcCj1JPSp5", "blocksMintedPenalty": 0}, + {"address": "QXW71HcJjoffdyC4RbjPZRxDsAWLiTryXo", "blocksMintedPenalty": 0}, + {"address": "QXW7GWsSGfZcMURovaaApvWz2GrCGnykZN", "blocksMintedPenalty": 0}, + {"address": "QXWDrWQvd8Bi4s8KUmxBNR6JNb2SUB3v1b", "blocksMintedPenalty": 0}, + {"address": "QXXTRS3W4CuuxWCcr5jPH8hFETQwpTNSHX", "blocksMintedPenalty": 0}, + {"address": "QXY6yKWP9DHXcmFzkWa4EYENrg3EeUdyT5", "blocksMintedPenalty": 0}, + {"address": "QXYEJF43nXuhniRb8bLkyQz9vWY6EotG7B", "blocksMintedPenalty": 0}, + {"address": "QXYhZeYpnVtA7A8G9Y65uXvAZg41Dkyrm8", "blocksMintedPenalty": 0}, + {"address": "QXZ2GbCLN42KCbaFyiNvXuXWRanrES8q7e", "blocksMintedPenalty": 0}, + {"address": "QXZ6riBEpfKv9Qpk7D62e5kPHkLwLwjU8s", "blocksMintedPenalty": 0}, + {"address": "QXZCjMArbq1TjMwq8kQnq3kNGzVDWhH669", "blocksMintedPenalty": 0}, + {"address": "QXZLSP761EC5wyz7iz5yJgvhWEKAU6BB7E", "blocksMintedPenalty": 0}, + {"address": "QXZkFnxocwGZA1DPVn82typ9Rzdoj3G1YQ", "blocksMintedPenalty": 0}, + {"address": "QXa8fs1AevFH2sGeXNd61TDAvh3m74obmf", "blocksMintedPenalty": 0}, + {"address": "QXaDuL5X7Rb5Wa5ctFnqe59vi69rxLYNs1", "blocksMintedPenalty": 0}, + {"address": "QXaH4J3TGcQ4imSJ2PH3pt1cZ2RWtEALw3", "blocksMintedPenalty": 0}, + {"address": "QXb4jrire59HwjgHquocwL31foyaxKAty1", "blocksMintedPenalty": 0}, + {"address": "QXbG5L2BZ6A2HW5jMyPTUUTHrZeQ41efwk", "blocksMintedPenalty": 0}, + {"address": "QXcZmcen7VwL8AStUc3hUKV7zkJ2qqRzr3", "blocksMintedPenalty": 0}, + {"address": "QXcsdFeNiBBxAD5MAbZXBYTABjHoCNqYJJ", "blocksMintedPenalty": 0}, + {"address": "QXdBkuWkEKpENSMYMnExZ9EcgiBNi5SckR", "blocksMintedPenalty": 0}, + {"address": "QXdDzH9PGJVTFu7zSAxzNmbv1W7kHM12Uc", "blocksMintedPenalty": 0}, + {"address": "QXdExCBjSkeYdagD9YKuA8GhuyVCsaYD8N", "blocksMintedPenalty": 0}, + {"address": "QXdcE7me1ABHaeUFKiZHJEvnEWo36Ceqsv", "blocksMintedPenalty": 0}, + {"address": "QXdqgNLqrZVdiPhaFT8YJSts1oRWkjCikg", "blocksMintedPenalty": 0}, + {"address": "QXeS6rVQpiWcLkf3FsGzBa2kBwSts79uXW", "blocksMintedPenalty": 0}, + {"address": "QXeUhYd1gHwSjN2nthh1FHED9qGMd2dvC6", "blocksMintedPenalty": 0}, + {"address": "QXegFcB1KfzW23xqHCPmvSHNjz8QAcknWk", "blocksMintedPenalty": 0}, + {"address": "QXfKxdnCLkeE5ZNPFzg346ahNAQ7RGTFut", "blocksMintedPenalty": 0}, + {"address": "QXfMJvmSjMHj1PzXdbumrVJp8UjAR7RHoh", "blocksMintedPenalty": 0}, + {"address": "QXfhVdraK6Br6XTznFVe5AkCQyzqaAiaDs", "blocksMintedPenalty": 0}, + {"address": "QXfspgi2puFzjHn855g6ocCMPnKFu9mYoG", "blocksMintedPenalty": 0}, + {"address": "QXg8eQ6se7AXekwnWYVP98oto3Puy7foV8", "blocksMintedPenalty": 0}, + {"address": "QXgD4bWCad2bshq7hsMGz9j22AgaUAL2Lh", "blocksMintedPenalty": 0}, + {"address": "QXgx1VgEkgnktyknSMkLkqNkT6q7yGgYGa", "blocksMintedPenalty": 0}, + {"address": "QXgzL68JknencTV3yEnZDCcHPkuG8SfkuF", "blocksMintedPenalty": 0}, + {"address": "QXhcwKRiqbHzLxj3d3ecZeWkfB31tNNL2n", "blocksMintedPenalty": 0}, + {"address": "QXhtkRfePDEg15akDm7agt46eXUv3SHCRW", "blocksMintedPenalty": 0}, + {"address": "QXiJk73iE3A6XdgsGd2kMioAb7dY4oUHtK", "blocksMintedPenalty": 0}, + {"address": "QXj9eZPtmTQ6RSYgzvCo2UMR1dqAwSRiAx", "blocksMintedPenalty": 0}, + {"address": "QXjPykF6tybnGwEdL3m1KxSy8ZSC7SDHzu", "blocksMintedPenalty": 0}, + {"address": "QXk5ovDwLNNCQQt3YMDTaKRRzo2rqARvUh", "blocksMintedPenalty": 0}, + {"address": "QXk9XbPebk1NZSJvuhHRHM8fPNgmiufdZp", "blocksMintedPenalty": 0}, + {"address": "QXkSsRqNUzz7EpR5pSZZN4KSrPRUUum3iY", "blocksMintedPenalty": 0}, + {"address": "QXkVjG4eC7zhDBvNTiGBnqe9Z5qiSWDdZ8", "blocksMintedPenalty": 0}, + {"address": "QXmGmpgZdPu9RGvYy5Nsqjp7yi1Uk16B5u", "blocksMintedPenalty": 0}, + {"address": "QXmQKyMs4KNYatbtPsJdY2mAb9sUPiZDnd", "blocksMintedPenalty": 0}, + {"address": "QXmg4JDzAeHzXNvsVkanjaPP9e8YsJB578", "blocksMintedPenalty": 0}, + {"address": "QXmhivDHGfW8mumvtPCs6cDFmsczGCJ9pW", "blocksMintedPenalty": 0}, + {"address": "QXn8gaz2DxdM62aedzWGHCx2KVQ1ris8Ts", "blocksMintedPenalty": 0}, + {"address": "QXnHzf6bNSzWjwWvm1eSCZcRQzuppFZunT", "blocksMintedPenalty": 0}, + {"address": "QXnt6dhFmZGMJoJ6mz7FxFXYHnnB5KQuzA", "blocksMintedPenalty": 0}, + {"address": "QXnxD8GiEDYnP3dNmo4GzGdTuQKLXyRvpa", "blocksMintedPenalty": 0}, + {"address": "QXnxXuD2wrr7YbGnxqipdsY7dg5M16EBGJ", "blocksMintedPenalty": 0}, + {"address": "QXoZEPiUWmg6rekJi5jMNWwNA4Ymf6Fs8r", "blocksMintedPenalty": 0}, + {"address": "QXoZXm2ahewWrzUKQV7zXzpXAn9z7LAGpa", "blocksMintedPenalty": 0}, + {"address": "QXodgxVBp5E3xSKcwx6EynPiyuqs1xFv5v", "blocksMintedPenalty": 0}, + {"address": "QXojw3UQBfjpqwc1W8kxSpipuiFvJKtWvE", "blocksMintedPenalty": 0}, + {"address": "QXpCPBRcf6zAFVkUBQ3THYA1zrGRpbRJyX", "blocksMintedPenalty": 0}, + {"address": "QXpZXTcQRqUPu43P9QbHHTaPyWvgkC1iz6", "blocksMintedPenalty": 0}, + {"address": "QXqA7v7zXoU52X9pbKkjrbbUKE2q9xnPiH", "blocksMintedPenalty": 0}, + {"address": "QXqTdXXWKAaVSfLCoJth3GaV8mYm9VcvAn", "blocksMintedPenalty": 0}, + {"address": "QXqYhp8DWdmQTW3HGgEuttbYT2g9WMBi5s", "blocksMintedPenalty": 0}, + {"address": "QXqnRQdmMgCcoamvshZ1x7BmZxGtxchHQm", "blocksMintedPenalty": 0}, + {"address": "QXrFaeCQTuxfQT1cVLsFpgzgk1UMSHNjUU", "blocksMintedPenalty": 0}, + {"address": "QXrYyMbSLM1LM5QTNfRrnHRe2HW9ysA7hD", "blocksMintedPenalty": 0}, + {"address": "QXrvhdkJUscesQDZ5qv9Se2Yk3jjHS2gDS", "blocksMintedPenalty": 0}, + {"address": "QXsiWC86nNqUiJSM68YJbr8A94kyWrwixn", "blocksMintedPenalty": 0}, + {"address": "QXt3hxGnV7nU4khsksf8GvwwGssKRmNcin", "blocksMintedPenalty": 0}, + {"address": "QXt8NJG7PTHPk4TS5s619se44QD5aThhKJ", "blocksMintedPenalty": 0}, + {"address": "QXtDxLaeFeGFuC4AyqyKujC1hWHSqwft4j", "blocksMintedPenalty": 0}, + {"address": "QXtJaqagJn56yaSxPZkPrXK7hX6c9gfyhs", "blocksMintedPenalty": 0}, + {"address": "QXtSf3Cadtnv914UEEqvDSDVhuKErEeEtC", "blocksMintedPenalty": 0}, + {"address": "QXtTFo2nvB35Vs9v6sG41tsypEa3VmaSgJ", "blocksMintedPenalty": 0}, + {"address": "QXtgY3R3yoNeignxNPt7aVoUdxLHTcUtLT", "blocksMintedPenalty": 0}, + {"address": "QXuASERR85SrdJmhDLEYnoxdcH8kdmt5nU", "blocksMintedPenalty": 0}, + {"address": "QXuHwC9AV4iuTwC9NhywYwpn4BZE5jqvyw", "blocksMintedPenalty": 0}, + {"address": "QXuU1aZZczPTjh96V3ZuLPwWrAEAGDbdx2", "blocksMintedPenalty": 0}, + {"address": "QXuXpHuydtgnG8tYtpCaLokpp9g52hqWhk", "blocksMintedPenalty": 0}, + {"address": "QXv6uwUFZHRE6uopF5ZY5b2Gv8YefggKtu", "blocksMintedPenalty": 0}, + {"address": "QXvQD7hHHsF5B58vhup4bDq2q6xLbspkA5", "blocksMintedPenalty": 0}, + {"address": "QXvQJQYQZ77HcuK7PnvqYvfgDzpfuLVNgA", "blocksMintedPenalty": 0}, + {"address": "QXvbeipzm2xxEHAoufYcx5EPC3F1du1hed", "blocksMintedPenalty": 0}, + {"address": "QXwAUtYrtTK9D3iaMfmgw49GvWFaGL4qDo", "blocksMintedPenalty": 0}, + {"address": "QXwbQH6L4rxb9jbSkfbCd2Cv7Lpoc26FYi", "blocksMintedPenalty": 0}, + {"address": "QXwvHcga8Tur7Xa1cqezUqrA9zGF5ziFPE", "blocksMintedPenalty": 0}, + {"address": "QXx7Di2DJazhMnhBpTgh2g9fM6AMUwHQS9", "blocksMintedPenalty": 0}, + {"address": "QXxaT9FHxVm9uk4o57MScWdNjcYcyDZ2cb", "blocksMintedPenalty": 0}, + {"address": "QXxgNdRWo5cfQPpAgrbL3eLjAnkVmgcR4p", "blocksMintedPenalty": 0}, + {"address": "QXxy8VkdTK9MSxnWzmzTY9Q2fXDAWaKHh5", "blocksMintedPenalty": 0}, + {"address": "QXyLbT7zVxrc9eKQEFc2D4JYAiJof8ZQX9", "blocksMintedPenalty": 0}, + {"address": "QXyLoLPh8Z54dBfsWtCAP3QunMQuqTWQUw", "blocksMintedPenalty": 0}, + {"address": "QXyWGHH1ByQKRnGxq9RYywCPwTKtGFh9aB", "blocksMintedPenalty": 0}, + {"address": "QXyy81VrhF4KbtELdmGZdP2LoEaumzfzNg", "blocksMintedPenalty": 0}, + {"address": "QXzX7FgDKEHJBJr7mq2mwGjtUDRwQ9QVWo", "blocksMintedPenalty": 0}, + {"address": "QXzzCsRp5LhE61qarYA42UW1FFe987eajh", "blocksMintedPenalty": 0}, + {"address": "QY1DFmBcKwDBBAsWDFrv2qpNwjy2uUUuNu", "blocksMintedPenalty": 0}, + {"address": "QY1d49zuEp4iwnN7X41zBDz1ciyt2vs5LH", "blocksMintedPenalty": 0}, + {"address": "QY1dHR4PHGG3PrLtZbcobJWAyRxf1BaNZL", "blocksMintedPenalty": 0}, + {"address": "QY1m7eYApj5DmQ9vs5eR7favyfJ1KG6Zpg", "blocksMintedPenalty": 0}, + {"address": "QY1tiXGi6kFpCcG3eZq9vXRddMcqDDwcYP", "blocksMintedPenalty": 0}, + {"address": "QY23M1RHUKxw6sWDxAJndH9RUfDbuSVbYG", "blocksMintedPenalty": 0}, + {"address": "QY2B6NEbggyPTSHAvWSn7gBH6x3Pes3gy3", "blocksMintedPenalty": 0}, + {"address": "QY2EJZDMpk4dUUH6SChbPYt1ZvfqKkUpjd", "blocksMintedPenalty": 0}, + {"address": "QY2VoM4xDMf24r2X75s5uurR1TAzuJygsm", "blocksMintedPenalty": 0}, + {"address": "QY2Yk1KqovM58sHWxMAxEMPjo692WwcspD", "blocksMintedPenalty": 0}, + {"address": "QY2xbuTq7WuGvdcKgusvEimBizRmQWtxKu", "blocksMintedPenalty": 0}, + {"address": "QY3HM7e5mqCrgc3zzXkUnxXvB67efYaUwV", "blocksMintedPenalty": 0}, + {"address": "QY3czcz6miMvDkjooGNzFLRKZXmFVSWwfu", "blocksMintedPenalty": 0}, + {"address": "QY3hZBHLWJMsLKyVK6WB5juncvHoRRZXWx", "blocksMintedPenalty": 0}, + {"address": "QY47zVGGdpSVsBcVdAHuz5TxcwpN13Q7kR", "blocksMintedPenalty": 0}, + {"address": "QY4m5DCLGXcCNCJdqEALGARgGpgz1YpVSQ", "blocksMintedPenalty": 0}, + {"address": "QY4yYNn6YVZPTgLfweWdSsDBvcWU7Svt6d", "blocksMintedPenalty": 0}, + {"address": "QY5TrNaH3NJaV8oqLQgP11xRE4JzRsDhJ1", "blocksMintedPenalty": 0}, + {"address": "QY5XGLejFHdDoeTGQRaD9TXuHEZHmrzp4m", "blocksMintedPenalty": 0}, + {"address": "QY5aQRNYSrT3NSAAsaD9frtA2Fq3TQdycS", "blocksMintedPenalty": 0}, + {"address": "QY5yBzRQKiYEMfmt5eWaCZXnCWwBpaj2Bi", "blocksMintedPenalty": 0}, + {"address": "QY68RqVgRpgsmsLxSHtGHHrqEgXjmpsZeG", "blocksMintedPenalty": 0}, + {"address": "QY6UkE9eJXUwpvAKRtTd49aMsMGhmhq8vG", "blocksMintedPenalty": 0}, + {"address": "QY6t3QiGA3a57eqoNck4gYUkP3zJNVxLaB", "blocksMintedPenalty": 0}, + {"address": "QY77jR3nQMVkSd6cXTf4XVHez8WJ63HbkP", "blocksMintedPenalty": 0}, + {"address": "QY7RWZz8QVUkE95ACi96Buavq8yxhK1eSr", "blocksMintedPenalty": 0}, + {"address": "QY7XYkLd17VCrkeMjUsW8MwCRomc1ZL1mZ", "blocksMintedPenalty": 0}, + {"address": "QY8EnoeuHLPZDVvGdnk5bgSAWC1v355ZCm", "blocksMintedPenalty": 0}, + {"address": "QY8huxBGRgzwzXTutqtG5vwLqy7VJbCrkj", "blocksMintedPenalty": 0}, + {"address": "QY8xs2zfo9HZAp249CNXwyiStHSrzUtgvV", "blocksMintedPenalty": 0}, + {"address": "QY9BeCYhZRjr2EkF8xQ6GbXrQucnUojryh", "blocksMintedPenalty": 0}, + {"address": "QY9MtiwR9nG2xQJPScCeEP1XiS5SwECmfj", "blocksMintedPenalty": 0}, + {"address": "QY9iRZXFZRG4jnKfy1JbPNmwjEvAnqtDSf", "blocksMintedPenalty": 0}, + {"address": "QY9oBjzctHNNJujRnH8Z7LbnGMydWvjsVW", "blocksMintedPenalty": 0}, + {"address": "QY9r9gNCBBSN97a3BvetFfEaSxZGNBfWrn", "blocksMintedPenalty": 0}, + {"address": "QYAKDg4sF5a6FQULSn96rE71uXCcJBEaMr", "blocksMintedPenalty": 0}, + {"address": "QYAwHB9SSVHFuHFPCsXbfwafYzaNB2yKfK", "blocksMintedPenalty": 0}, + {"address": "QYAxCeQWFAe93fT5WA1D8Pz6RrrWK9DqB1", "blocksMintedPenalty": 0}, + {"address": "QYBDMiSx2ek5pPaUethZjcfhPxND4U6UAM", "blocksMintedPenalty": 0}, + {"address": "QYBNStqUztjuikzSGS5DFmTumr9wnD13pp", "blocksMintedPenalty": 0}, + {"address": "QYBT1ZTXGwHb7vMjwDUjo12yRm9hefC4aW", "blocksMintedPenalty": 0}, + {"address": "QYBTgTrmfi5EYTT2a5o6dTG4vGuVsxKsEm", "blocksMintedPenalty": 0}, + {"address": "QYBkE6gdiNug1NcwvtywBhAXEbRzVmjg1J", "blocksMintedPenalty": 0}, + {"address": "QYBqZrF4aKNoSZ25Qme4UD8WXu4xVqnMzi", "blocksMintedPenalty": 0}, + {"address": "QYCL2jfCVPGpEXiTG5GTMbZvjzqHsaUoMQ", "blocksMintedPenalty": 0}, + {"address": "QYDXuWA3pooBk5bArV6vHEEeH1w9G6Tgk3", "blocksMintedPenalty": 0}, + {"address": "QYDkRkqCLuecv9PZUQfChL7w9MW1VZ96Zd", "blocksMintedPenalty": 0}, + {"address": "QYDnXwRJBGoFsqtQtijWmv34PMYsF9uPea", "blocksMintedPenalty": 0}, + {"address": "QYDwarvEjKUFWhzsmeWuvwVHxqhDFN2zm7", "blocksMintedPenalty": 0}, + {"address": "QYDyfQqrQERcJKLSN2AerGB56MVqEM67gq", "blocksMintedPenalty": 0}, + {"address": "QYE8acT99U8btHcbSnLjbdi7AyBC4N6sSG", "blocksMintedPenalty": 0}, + {"address": "QYEFcjF7dfwkyt2drNhGTNkNJVznghmtqr", "blocksMintedPenalty": 0}, + {"address": "QYEYEWxY6aipjYDdEiWH4qKxmf8rhb4mef", "blocksMintedPenalty": 0}, + {"address": "QYFQTFKqDvKSJzRzmbr8FcUttTCnZhod6T", "blocksMintedPenalty": 0}, + {"address": "QYFSt31Jp1akuYCu7nTjxYeQdejsWVPP2E", "blocksMintedPenalty": 0}, + {"address": "QYFhjqvQ39zagvwLMRis8CiaJ2HvkiGkRc", "blocksMintedPenalty": 0}, + {"address": "QYFi134bJoo67nn83HUhDuxMdRbEFpMbn3", "blocksMintedPenalty": 0}, + {"address": "QYFxjNYARmD7d3VGwXmfcdejyZ4pvUUs13", "blocksMintedPenalty": 0}, + {"address": "QYG4kv8Vmq7TmBQct4bLai6wShVStdHLvc", "blocksMintedPenalty": 0}, + {"address": "QYGSUcmQLsb9DrsUUnp8LZfQUwcHG2fXvE", "blocksMintedPenalty": 0}, + {"address": "QYGanzHrRvbqFYrNaGBqU1qdoCHrDkhoFb", "blocksMintedPenalty": 0}, + {"address": "QYHRsi4gwWhhE4cXFqsX1XX9H9idinKS7D", "blocksMintedPenalty": 0}, + {"address": "QYHuT1WVkDupvRKTjQ8SQkMqtak5yi5UgK", "blocksMintedPenalty": 0}, + {"address": "QYHw1peCJzKbsnJYeWTd5Fhw4JWfYXjw4f", "blocksMintedPenalty": 0}, + {"address": "QYJYsPvvPS3ZKX5QBL6PpmbD5b5mT9nzXW", "blocksMintedPenalty": 0}, + {"address": "QYJvFNT4Ytme1qxhcBWVEctCVHXMi91dbr", "blocksMintedPenalty": 0}, + {"address": "QYKGhPs8HQCLhnt8Aj7GdtoEgfG7qRkMnp", "blocksMintedPenalty": 0}, + {"address": "QYLWHKGPJDuShoPynHTWCtAZdUX9ck8zQL", "blocksMintedPenalty": 0}, + {"address": "QYLkpSe54qNPAcoRmsSh9BBQhVLqQ8JW5Q", "blocksMintedPenalty": 0}, + {"address": "QYM2kNcnhtZ47LMFnQUv3kL1gb7CrbTtUB", "blocksMintedPenalty": 0}, + {"address": "QYMyRerBNjoFN8kbLamCEy4t2nqXXAJTvj", "blocksMintedPenalty": 0}, + {"address": "QYNJxG97RPEtF2aauvRGyYKsbgo8ZRWWUU", "blocksMintedPenalty": 0}, + {"address": "QYNNziCj8JYnuBmPxM6BZBCGaCp6ANvdDG", "blocksMintedPenalty": 0}, + {"address": "QYPWK5LZGzVe6xYHni79JhvVJ9ErF8Kyoe", "blocksMintedPenalty": 0}, + {"address": "QYPsZvRXQDduvCgQKY7659f367gN8wR58i", "blocksMintedPenalty": 0}, + {"address": "QYPzR9eav1dPVT9k6toR8BxxZ7xqx7TFxp", "blocksMintedPenalty": 0}, + {"address": "QYQbuQbDoLMMxt8mDnmzMFBFHk1Strotsc", "blocksMintedPenalty": 0}, + {"address": "QYRERZVS2ngvFawsy4Mx8zRPmnsBLXVnP5", "blocksMintedPenalty": 0}, + {"address": "QYRgLSVkFmFHRybmwjESaoZ1J192759LDW", "blocksMintedPenalty": 0}, + {"address": "QYSXuECngGVg4JP4iZ8Y97NCj7NdJQwaao", "blocksMintedPenalty": 0}, + {"address": "QYSsoLnjGN9ZJAJYLXN4ahCbD3FCu4Ki5i", "blocksMintedPenalty": 0}, + {"address": "QYSxcfk4q4kikiVSpGWmGfLFjxLTSQxDS4", "blocksMintedPenalty": 0}, + {"address": "QYSyGkYtvYZYas6STuqwBnHG4d7LGTfFUp", "blocksMintedPenalty": 0}, + {"address": "QYSz2adAVTpch23Vz3GJmLMV2We6b2gZyr", "blocksMintedPenalty": 0}, + {"address": "QYT3Z4qb4k53CmvSD9nRRnZdEbkaYYiA1P", "blocksMintedPenalty": 0}, + {"address": "QYT7xiyjSxVt7L3UC9FMfrTw8CR4891CLZ", "blocksMintedPenalty": 0}, + {"address": "QYTJ9CV27wixNqNTccLXWR51w6QP8iwBVP", "blocksMintedPenalty": 0}, + {"address": "QYTKcRGFEB2JYdTbBcrgciCekuKsZzPXvH", "blocksMintedPenalty": 0}, + {"address": "QYTbieTdEZfRJATnjR9sbJ4pu3kzTRUscC", "blocksMintedPenalty": 0}, + {"address": "QYTmcqqTYBMX6BPmZDqMsxHp3KFKkznbN1", "blocksMintedPenalty": 0}, + {"address": "QYTtWpi8ZwbbrjmAof2n2u4nbRhrFDRY2L", "blocksMintedPenalty": 0}, + {"address": "QYTwVYw281gpkar6u7Kzn9Sp4qwxeN7JHh", "blocksMintedPenalty": 0}, + {"address": "QYUUtMVe9DYVhTYefV1UpYGgcVNkud2F5J", "blocksMintedPenalty": 0}, + {"address": "QYUXEVjJDJWMscZTwuKAfH8h6zV1i454aa", "blocksMintedPenalty": 0}, + {"address": "QYVSBWTt4nJPjVRqAuqhMCUQKdXFTpiEAw", "blocksMintedPenalty": 0}, + {"address": "QYVTGi7YG1yMp3LBSbDgVbj6JbcKs5XdMC", "blocksMintedPenalty": 0}, + {"address": "QYVVHQWRzade3pmjSmFdPbJUUX6U3eLHHy", "blocksMintedPenalty": 0}, + {"address": "QYVYy98eLm5VaKm3sa2yNvfQiPBzoiEKRP", "blocksMintedPenalty": 0}, + {"address": "QYVd3XiCVuFVmx22y4vRc6zwu4m7YWzUYk", "blocksMintedPenalty": 0}, + {"address": "QYVdHkfrdnzRnbtXN2iZH81b3TNQcg5R9z", "blocksMintedPenalty": 0}, + {"address": "QYVqxTRiM5URgiC7UXHogEXactMViyVqZb", "blocksMintedPenalty": 0}, + {"address": "QYW7c1kyyaSbgjSbZH71Q2i4UzjDLq8i4y", "blocksMintedPenalty": 0}, + {"address": "QYWKhveSADxbqfqDL6s2XCuLzgmCNRiHXK", "blocksMintedPenalty": 0}, + {"address": "QYWZCWvDfhQbnoXw3oKrNxgQbDB4ymzL6r", "blocksMintedPenalty": 0}, + {"address": "QYXv4QgDLPowGXWrBFsi3h7Wp6mbLTWgxY", "blocksMintedPenalty": 0}, + {"address": "QYXvnvEPFHRqrUjnyFwJ8VwnDK98BFPNmw", "blocksMintedPenalty": 0}, + {"address": "QYY7eT1ecmVCy2vz43zhyZXFJcEXkLBtpZ", "blocksMintedPenalty": 0}, + {"address": "QYYdex6RGqR1XEGBUXd9N1PuRd5J8Fj1u2", "blocksMintedPenalty": 0}, + {"address": "QYYokhdG6JPvYLotHFb8pkGAE62QV6VGC8", "blocksMintedPenalty": 0}, + {"address": "QYYxQfZPdjREimkF3kPMPQJiFYg1RWT8RN", "blocksMintedPenalty": 0}, + {"address": "QYZ5anakuxBs6yPRjqijJpr8XGTrgZ8y6t", "blocksMintedPenalty": 0}, + {"address": "QYZBNWtv88Vpvy4npo7avP2riuPFki63VX", "blocksMintedPenalty": 0}, + {"address": "QYZBtfFswjVCsDcK9y6SyfvMKEidxqyitg", "blocksMintedPenalty": 0}, + {"address": "QYZYGqKsDQEKo7bN9tDwxtAcasNZNRRfsX", "blocksMintedPenalty": 0}, + {"address": "QYZte7RVQ3DEjQAwfECr9kaYztskDcAPeA", "blocksMintedPenalty": 0}, + {"address": "QYZwuEu3UF7gANrVF4V9MQs5tjA2cXumuM", "blocksMintedPenalty": 0}, + {"address": "QYa5shfemxUNThF8twM34ktD9wZZCuj54u", "blocksMintedPenalty": 0}, + {"address": "QYaVgXQQuyjyF9jzoWW9n8TiXArjAfLS1w", "blocksMintedPenalty": 0}, + {"address": "QYavuNL1R5F4kaTLGfi4HrLUzraxNo1KLs", "blocksMintedPenalty": 0}, + {"address": "QYb1JQh8s1n6exuCETMHa9GmP2nbTQ3EaS", "blocksMintedPenalty": 0}, + {"address": "QYbGyytNL76wLUDik77FD15CXAw6KpNS3S", "blocksMintedPenalty": 0}, + {"address": "QYbbxiPADUEUd7FrmfZ92uGMPuEaSX53xp", "blocksMintedPenalty": 0}, + {"address": "QYbckXX6LVGJZFWekTs7t5x1kGu182igbT", "blocksMintedPenalty": 0}, + {"address": "QYbdofufonhV7wApNoyvxsVMjaDh7Z19Ba", "blocksMintedPenalty": 0}, + {"address": "QYbjYgnhNEGugaEtRopbwZSa1SJzxdicZt", "blocksMintedPenalty": 0}, + {"address": "QYbqLRLYPh37UsygmYi5CjC4Rez85YDTRf", "blocksMintedPenalty": 0}, + {"address": "QYbsc3Xq5q7XGf1AmN4Fj96py8nupfc26J", "blocksMintedPenalty": 0}, + {"address": "QYbvfcPRqwSs8ustAu5ftacuaqXrf6vzbo", "blocksMintedPenalty": 0}, + {"address": "QYcMNYCwjGRgRtwcGAhy6CgiphJnyBDa2t", "blocksMintedPenalty": 0}, + {"address": "QYccd7u9jbsRwDJik5D8XeX3vUAsN3e3Rq", "blocksMintedPenalty": 0}, + {"address": "QYd7xhf1F1g6KQhnrB7E9oXngWFTYAtEab", "blocksMintedPenalty": 0}, + {"address": "QYdCzjaf4UcCgxZ9f3wDmHd2s7PrXr4YZn", "blocksMintedPenalty": 0}, + {"address": "QYdVhdrJirNkf917geVjBLSpoBJRDwk8cu", "blocksMintedPenalty": 0}, + {"address": "QYdXoptoELHq3gQn1hRdh1xdqX43FjtKsG", "blocksMintedPenalty": 0}, + {"address": "QYdtZJMMvwWPQn7e9BnYFJqD3TqQtay7wu", "blocksMintedPenalty": 0}, + {"address": "QYej1rwZJKVJmQrrYPoZ6VsWC5X8RgcVgA", "blocksMintedPenalty": 0}, + {"address": "QYenGVWbhekBGRStTwwRhz73NfyJFXJFAY", "blocksMintedPenalty": 0}, + {"address": "QYfmptKACs64FYUzNK4Ub7Y1EcDGQZsikB", "blocksMintedPenalty": 0}, + {"address": "QYfphtzfrihptG85tXbbH6YgubJnDMjyyf", "blocksMintedPenalty": 0}, + {"address": "QYgGW8QzRKGfr6hSZSaGC59Ha7KudsdDx9", "blocksMintedPenalty": 0}, + {"address": "QYgnXHv97EEjwVviGjqsnpQjuSS28oPBBQ", "blocksMintedPenalty": 0}, + {"address": "QYguzP9V8KZ9NFgrozDWUfRMxEmBuUQzX1", "blocksMintedPenalty": 0}, + {"address": "QYgzYYxrQ6hCicXtVAg8LuMzHACYWnqESp", "blocksMintedPenalty": 0}, + {"address": "QYh3U3gpEqeXvBvMW7pKXNifUCvm6mwUVq", "blocksMintedPenalty": 0}, + {"address": "QYhPwjypqbhFzTyB5wHgoGzhMErmLpjD1B", "blocksMintedPenalty": 0}, + {"address": "QYhx9nvhj17mtXXC4pR4W4ujzvTJRqFwvd", "blocksMintedPenalty": 0}, + {"address": "QYi3LCD5ukmMzs9bnFpX2d63QEcFMDVqyZ", "blocksMintedPenalty": 0}, + {"address": "QYi3gMt1jkJJFZLQCjydhyHiWNjG2yUSqn", "blocksMintedPenalty": 0}, + {"address": "QYiNoSHSJbEeSR7Wbc5Pi6b5muzCx977Dg", "blocksMintedPenalty": 0}, + {"address": "QYib3gfFNrbwqN9tqjRBM2eN3mm2GkkiBH", "blocksMintedPenalty": 0}, + {"address": "QYihJra14QhktjBs2ziDtEze4PTLgRdoBr", "blocksMintedPenalty": 0}, + {"address": "QYjapnSDs6Qn3xWbNrn8sDQp6RPaWzeTvq", "blocksMintedPenalty": 0}, + {"address": "QYjfPGDKXLxx3hf4uQ3dd1thpaP4FNQfAP", "blocksMintedPenalty": 0}, + {"address": "QYjpN1EGhowxSTcTxktmfuYgYh5hj97XTP", "blocksMintedPenalty": 0}, + {"address": "QYjuaZamanCfCSzDx5u2Kvq2CW6w1TAaMz", "blocksMintedPenalty": 0}, + {"address": "QYkELPiymoJhidA3Vnv7TqsTtSqn8jekV8", "blocksMintedPenalty": 0}, + {"address": "QYkMhpBGqnWFnzU28iGseZhcrTpbSgZB18", "blocksMintedPenalty": 0}, + {"address": "QYkXJBt2DkqhfN3xBBzXBdsNLXWTy9MypQ", "blocksMintedPenalty": 0}, + {"address": "QYkab6QFQBvocJVQABJ9KdyzvrVPoKb2bi", "blocksMintedPenalty": 0}, + {"address": "QYkuWG3X9zXTussWDdo1fRmJHkRVbi7udT", "blocksMintedPenalty": 0}, + {"address": "QYmLqcEmp5VoTGbtuxJujVii9w64pnUqBu", "blocksMintedPenalty": 0}, + {"address": "QYmbPh7Ebk4rkWRiLFwGhgGh9TGP3axrdT", "blocksMintedPenalty": 0}, + {"address": "QYmiapeNwbzWYaoosv1QFmq4oRiYR1KiT7", "blocksMintedPenalty": 0}, + {"address": "QYoVQK2RVANbZ1BrJDSiBgAEdrVJAGKu3A", "blocksMintedPenalty": 0}, + {"address": "QYocYqR4AwgmaVYpTET5Gd2mWzVReDgv3G", "blocksMintedPenalty": 0}, + {"address": "QYogryXKVBJ2zxK2M4XTmoBFEdJZTKjzeN", "blocksMintedPenalty": 0}, + {"address": "QYp3WbksRD6PvJJbNXbisehD8vPTAcMaSV", "blocksMintedPenalty": 0}, + {"address": "QYp7fQviDVLc51SCHzZUrKfdcsuJekuYKj", "blocksMintedPenalty": 0}, + {"address": "QYpdqxScQLR2X3eTPxGb2BtPg1g2YBPna1", "blocksMintedPenalty": 0}, + {"address": "QYphDYA1te9acFNc7FEmFBu3FTTomp4ATZ", "blocksMintedPenalty": 0}, + {"address": "QYq5yhFUXsBrKSmsm1JnXFewD5r3NjESmh", "blocksMintedPenalty": 0}, + {"address": "QYqDwFH1epJjaWitxDk4aPBboCdbH4kYDa", "blocksMintedPenalty": 0}, + {"address": "QYqUEbnDH2E2eFFigHtW1q2b71VW4SK3yE", "blocksMintedPenalty": 0}, + {"address": "QYqv1Gc4LMHwtV4NLBCT59LYRo85aML4Hr", "blocksMintedPenalty": 0}, + {"address": "QYrHsrZyffjSVS6xxSwJ1zNyohL7qM7Ycv", "blocksMintedPenalty": 0}, + {"address": "QYrWA5ggyb3pjg8ZZcc44Huej8HVrm8asc", "blocksMintedPenalty": 0}, + {"address": "QYrX4S7j8apzPp654EdnAhcTJqoiYZV6D7", "blocksMintedPenalty": 0}, + {"address": "QYraQa2brsWHfq4k2gymezjUahxWCz3m6X", "blocksMintedPenalty": 0}, + {"address": "QYrjqCzgEHrefpQm4ETFvZheZ8a86dyG5m", "blocksMintedPenalty": 0}, + {"address": "QYsRRLQtWdXqUtTeV4pkUaW7p3XakfZwcg", "blocksMintedPenalty": 0}, + {"address": "QYsbr5YhbwfNWbnoNpMg8RmzLAGHRVHx3y", "blocksMintedPenalty": 0}, + {"address": "QYscq62xih4qe3uVicfLHX6YPnZPXYNQrh", "blocksMintedPenalty": 0}, + {"address": "QYsk5rh4v3eyPU5jGwLLrXriAkrqouN1VK", "blocksMintedPenalty": 0}, + {"address": "QYsrRJfaoG4qvBKp2Ubs2afAWLdSSL1pnZ", "blocksMintedPenalty": 0}, + {"address": "QYsxXwZjVqNgeU1T6sVvMLro9eM9YLaCRr", "blocksMintedPenalty": 0}, + {"address": "QYtXhAqGN8XmxEhzDWyXzNSrdXiyS1Ddax", "blocksMintedPenalty": 0}, + {"address": "QYtjEuzqk42BGCAhdQfW6tMzbVQAACF6Ar", "blocksMintedPenalty": 0}, + {"address": "QYtyy5G91joYkRmTAuh6daGEAN6xm4oNQE", "blocksMintedPenalty": 0}, + {"address": "QYuth2DzxueiVDPMKBTc5E5XX5YsoNBdZd", "blocksMintedPenalty": 0}, + {"address": "QYv3pHy7vyWErbxZaXdMo5fGaG2pTN1qKT", "blocksMintedPenalty": 0}, + {"address": "QYv9sbsML4BepKpN75J1AHyZHYy7DSgoXp", "blocksMintedPenalty": 0}, + {"address": "QYvkNDQzMpCbLTuKPvfVLRYsa1GXWfgxFC", "blocksMintedPenalty": 0}, + {"address": "QYvmddBh9xF8Mc2iKqkZDkmcGWmX7ptSf7", "blocksMintedPenalty": 0}, + {"address": "QYvuCYpwn9qrBUFzcqj6T4adXGrz2n8QYe", "blocksMintedPenalty": 0}, + {"address": "QYvvCh951pjoxAJkEiNRDEiV9rTky6XjDW", "blocksMintedPenalty": 0}, + {"address": "QYwYHCrmeBXoXVJTfeYjxK1TE8gSei57co", "blocksMintedPenalty": 0}, + {"address": "QYx2K8HAs4gNHA3vURjzSxP4i53D6BWhEQ", "blocksMintedPenalty": 0}, + {"address": "QYx2paa5eaYwC8cnMWcu8xEjfSXH9creS8", "blocksMintedPenalty": 0}, + {"address": "QYx8HmJcmgaspSWDS193Pt2M9W7xrNCCxP", "blocksMintedPenalty": 0}, + {"address": "QYxxEgEjXpW6FHSPvUGYsbiz4tSJRvRKFu", "blocksMintedPenalty": 0}, + {"address": "QYyLPAzY9YB8EzAF8Unve6SMh6r9xzqUCm", "blocksMintedPenalty": 0}, + {"address": "QYyLwEHs3HYzmxqZXTjUiqKLrLc9woEju5", "blocksMintedPenalty": 0}, + {"address": "QYyZTzQ1dYsqhyoyevJwJh35pNGissKMzN", "blocksMintedPenalty": 0}, + {"address": "QYyeCtg6ZBjHPgWA4iL4CbfBmYs1SxkyWb", "blocksMintedPenalty": 0}, + {"address": "QYyjRB78nis5iKnBoiHGMMwEitpnRXxsLG", "blocksMintedPenalty": 0}, + {"address": "QYyxxskMnwwaY8nbjyfz9cmvxGnT53bQ3F", "blocksMintedPenalty": 0}, + {"address": "QYz13rAMCvEYS8L7zPU5oSFzmviAQQU13r", "blocksMintedPenalty": 0}, + {"address": "QYz75LEirH1suKHS7uVesjZF3gbgAmuiy6", "blocksMintedPenalty": 0}, + {"address": "QYz7LmHvEHcYvWBE22hVf9stBmk3zCVzpR", "blocksMintedPenalty": 0}, + {"address": "QYzJEzysfnpYaBZs4GbZca3zkLTV9uBBNC", "blocksMintedPenalty": 0}, + {"address": "QZ1A7gM81hqywBsc3BYMYgzNN9VRTKNwyW", "blocksMintedPenalty": 0}, + {"address": "QZ28d8mixSsqmMvDeXApnL6NCBVkF1zh4e", "blocksMintedPenalty": 0}, + {"address": "QZ2f48hq5CrgA6f91dnJ9Quy7aaPjTCcyC", "blocksMintedPenalty": 0}, + {"address": "QZ2m1ygMB3ctxgpPcWHuWtvty6m3JZmM3D", "blocksMintedPenalty": 0}, + {"address": "QZ2qiMrwb4697ukbcx7Wu9ggQWTi4Bsfms", "blocksMintedPenalty": 0}, + {"address": "QZ31iAovmFWzMCKNyJVV3zBTmyPJGH4Fkt", "blocksMintedPenalty": 0}, + {"address": "QZ3T5BvyNLQRoHA4s3hxgAHRZ8HQZmqCoS", "blocksMintedPenalty": 0}, + {"address": "QZ3neufggmG7qV5ADh13tQQZmjkfJnccQF", "blocksMintedPenalty": 0}, + {"address": "QZ4BtEeJ8MZNzZwVLjcb2Lma9gkY128KKb", "blocksMintedPenalty": 0}, + {"address": "QZ4S7xaXZSyXUn754cFovz27vWxkFiVzsB", "blocksMintedPenalty": 0}, + {"address": "QZ4Sd5gFKSXMfAkQ1kjioy6CMAeJSJtpoS", "blocksMintedPenalty": 0}, + {"address": "QZ4jVhry6q4uA4nwE7QUwik4uN8Gd2TEdV", "blocksMintedPenalty": 0}, + {"address": "QZ4nLaSMMTNurL2TjncEPhf8XagKYiV9XG", "blocksMintedPenalty": 0}, + {"address": "QZ4yxyGBPYUn24HrXMN6iqURpJrUhcockr", "blocksMintedPenalty": 0}, + {"address": "QZ5FwpcCCSdxf37VPkYwJR12B57dNFPqNX", "blocksMintedPenalty": 0}, + {"address": "QZ5XQrNJJSkdX2oxoHgEwMrB3k3iBZfErj", "blocksMintedPenalty": 0}, + {"address": "QZ5ptWLCAwQndAAJXU1NANrf3Qnj5qjofw", "blocksMintedPenalty": 0}, + {"address": "QZ61xEF1Ba5xoSRnMXdEUymzz18uiSJ2Lq", "blocksMintedPenalty": 0}, + {"address": "QZ62EYtWuHzRVSaZJ2u2LY7c9oq6uwYX4Y", "blocksMintedPenalty": 0}, + {"address": "QZ6GYGXoab7yrHeS81ZcM4SpdkSgPTv3Wc", "blocksMintedPenalty": 0}, + {"address": "QZ6MuURt6cKHLJEgjyiFcHp1S1gBEydN8U", "blocksMintedPenalty": 0}, + {"address": "QZ6Nyd5M7YEetwodCQKzsZbweyjmJ3ZYrX", "blocksMintedPenalty": 0}, + {"address": "QZ6myDY7EDyLf6rA8evWvVxmKRAYj3agnq", "blocksMintedPenalty": 0}, + {"address": "QZ6sYB89JR2NT5e67tjykENMZSEhrHQe8G", "blocksMintedPenalty": 0}, + {"address": "QZ6viPQNzaYMkfdNAE2kZYAVHvKzePfYiT", "blocksMintedPenalty": 0}, + {"address": "QZ7jCYhdE71Xv8YEKGeEBi1qXk3qr8ih5D", "blocksMintedPenalty": 0}, + {"address": "QZ7jjuMSRdcPQGCoH7Bnc6amqkJXYAg7gn", "blocksMintedPenalty": 0}, + {"address": "QZ7nVgA87mZ8W7ZPMFzDRgcHX3NmYCP53e", "blocksMintedPenalty": 0}, + {"address": "QZ7tcvNMBsY9taLXnLiFCj1bKxGFzMkZsy", "blocksMintedPenalty": 0}, + {"address": "QZ7wvWAUcHKRhvQ3ijdrqM4zucQKCgQ1hQ", "blocksMintedPenalty": 0}, + {"address": "QZ8G32dS3U1BACQoo5uv59iuxaPQjszQXf", "blocksMintedPenalty": 0}, + {"address": "QZ8GSZTT29rv7L1jUdG3tkX47xqZd4dpb1", "blocksMintedPenalty": 0}, + {"address": "QZ8RMcNpsEtBkNNjK8GHrgeQecksWk4AFi", "blocksMintedPenalty": 0}, + {"address": "QZ8W8qKhW3rmpSDdxPsEta22cxgJRBMJjc", "blocksMintedPenalty": 0}, + {"address": "QZ8a45PncF3wCGFJrxmLSRZ7sNhP35AABU", "blocksMintedPenalty": 0}, + {"address": "QZ8mKM8zSU4bhkrnD6F4dDPqJ4xkRKMieP", "blocksMintedPenalty": 0}, + {"address": "QZ99sZmFXt8yKrRQ7qiBZNzht8X5m4yynP", "blocksMintedPenalty": 0}, + {"address": "QZ9DDZfR7BRf7RzcH2S7p4myd2GsPVNcx6", "blocksMintedPenalty": 0}, + {"address": "QZ9jg2XF1qcjELbE4PwuNpapZou88kZjd6", "blocksMintedPenalty": 0}, + {"address": "QZ9pg4p3XN48HDtibiGMdDigsS8PtjDYae", "blocksMintedPenalty": 0}, + {"address": "QZ9tB5RTWpN31EYKCR3mfSR2uFTHEZGoCV", "blocksMintedPenalty": 0}, + {"address": "QZA4Fk6M5GsoJRJyUGn89tMBZH5Tk2WsdT", "blocksMintedPenalty": 0}, + {"address": "QZAFaiQCspd7MXpyv7xdZ5yUVU8m4tX4TJ", "blocksMintedPenalty": 0}, + {"address": "QZB9f8Ha9jvWvswme2HvdKUApmK3m6JRfU", "blocksMintedPenalty": 0}, + {"address": "QZBNjevgds5TprnCyAZm38j3kFty6mSnmd", "blocksMintedPenalty": 0}, + {"address": "QZBQEyaTkJYZE9pgFpEQp4x4jsyL1zcw2s", "blocksMintedPenalty": 0}, + {"address": "QZBTBtc6ht9Sx8xT1WuLUXAioSmVkYLmu3", "blocksMintedPenalty": 0}, + {"address": "QZBUCNj9qqewh77HsYh3pmMY7bjVF1adTT", "blocksMintedPenalty": 0}, + {"address": "QZC4U7zDhkhh5Rj7F87a9c8E3hGf7L4eDd", "blocksMintedPenalty": 0}, + {"address": "QZCA7xNKzbZJr8XLYqsmFJ5KnFx5ixbmLL", "blocksMintedPenalty": 0}, + {"address": "QZCUHe6ffPdgGHAFKd8qNXNegMVXfhvQuV", "blocksMintedPenalty": 0}, + {"address": "QZDSYw9WYwuhWbYqJksRpN2scSqT6yW2DC", "blocksMintedPenalty": 0}, + {"address": "QZE6oJCPmiqESX47fPKQt5mPKEccMGn6N3", "blocksMintedPenalty": 0}, + {"address": "QZEEdHDH3nMhVnx695nYnPQ4aepspNTi79", "blocksMintedPenalty": 0}, + {"address": "QZEFRe67tTWChKBsBgaG6tZb9MT6gbPfb9", "blocksMintedPenalty": 0}, + {"address": "QZENsHWQkb7dsrugknVSaRpNyB5MsADXZe", "blocksMintedPenalty": 0}, + {"address": "QZEUQTeY4ZNgf96FJPGiVPpvQP3tqPPkoA", "blocksMintedPenalty": 0}, + {"address": "QZEhkW1Eoi5KPwWjD4dLyVCMrfAieEeZJt", "blocksMintedPenalty": 0}, + {"address": "QZF5tr4FK3RRfDq7ejqmyYQLF94geqcKvD", "blocksMintedPenalty": 0}, + {"address": "QZFRC6WZxAknY4gekSFThxCQfwnrSDj2yD", "blocksMintedPenalty": 0}, + {"address": "QZFd5xdFuL9SQ82Kihn6QmswFWKF8DeVrd", "blocksMintedPenalty": 0}, + {"address": "QZFs2CnALpdT1VEg2Q4RaryWzhvagYFZaq", "blocksMintedPenalty": 0}, + {"address": "QZGEREC66Tok3BEUvsjMw7AqJ7SGd17VLw", "blocksMintedPenalty": 0}, + {"address": "QZGfEGnBGth5h5WyFyPT51GkUygMULvdKL", "blocksMintedPenalty": 0}, + {"address": "QZGgiS3gkov4b4jDj9fAp2BoeE8D7aHxyn", "blocksMintedPenalty": 0}, + {"address": "QZGk3aibyp4CdKnWti6FE4fbGAEnh4mm7U", "blocksMintedPenalty": 0}, + {"address": "QZH2durtdKPJgEKgJ5Co5AtRFacSetWJ2F", "blocksMintedPenalty": 0}, + {"address": "QZHEKkmUDRDcYDP46Au5cxVdaNCCg9BuJq", "blocksMintedPenalty": 0}, + {"address": "QZHNDoUJVgLVzwkYLWpvQbjS2JuscC7mEG", "blocksMintedPenalty": 0}, + {"address": "QZHU1itDrskpnwca8PYzpu8xXenoZN1MrJ", "blocksMintedPenalty": 0}, + {"address": "QZHVrsBfqGn5nyficaY4veCxF9NstVLtXG", "blocksMintedPenalty": 0}, + {"address": "QZHZnrc8PwEU9wEACmAQBeTcvkpRYMMGMr", "blocksMintedPenalty": 0}, + {"address": "QZHjex6k7cK7MVMDkyuoFRYspDFEVUzLRq", "blocksMintedPenalty": 0}, + {"address": "QZJ6pjRbUrj6eoQ4drFT9SCp3eC6tD7DhB", "blocksMintedPenalty": 0}, + {"address": "QZJXJUU3FaVBk8Hd2iPmNe8c2BwZ4SCNyb", "blocksMintedPenalty": 0}, + {"address": "QZJvRvFmfAbqUnQ4rpUAm6RxAzaBApJeJS", "blocksMintedPenalty": 0}, + {"address": "QZJyG8cnB3ecaLQ299KYWhTuZLij7GCGQZ", "blocksMintedPenalty": 0}, + {"address": "QZK3BSSJ6VirRgGePNffuVngAnQCuRT8Qv", "blocksMintedPenalty": 0}, + {"address": "QZK6LNFrmgxrTwAdabHbaVymXfavXqHhuu", "blocksMintedPenalty": 0}, + {"address": "QZKWDpFNkzxRknxPqyLiYqukq1Tq9Q2or2", "blocksMintedPenalty": 0}, + {"address": "QZKYQPK3LR4NJADKs1wt7GpYJfz9BGWTnk", "blocksMintedPenalty": 0}, + {"address": "QZKca9TevdKxtUz7KBCF8KCsruzVgwEEie", "blocksMintedPenalty": 0}, + {"address": "QZLEQthsanmPb8sMdBcujK6Vg1Pn5wVrfc", "blocksMintedPenalty": 0}, + {"address": "QZLFJSHNhNVhbfMvhTbsuJhDNn4zdehFEd", "blocksMintedPenalty": 0}, + {"address": "QZLQmTaBsabFaUAozbdBuXjpmqSND4jURs", "blocksMintedPenalty": 0}, + {"address": "QZLaV54we4WKTq9MvXm3NQe3Lj2NYi1W7d", "blocksMintedPenalty": 0}, + {"address": "QZLdA5iAEApDKCNSCjUJp8fm3RStkEX4cV", "blocksMintedPenalty": 0}, + {"address": "QZLoKXPSp9X378X7ToSNE1JEe3FK1XTLLK", "blocksMintedPenalty": 0}, + {"address": "QZLuiwjT9BxE6JrWDKP12VyzEgcPLrBqW9", "blocksMintedPenalty": 0}, + {"address": "QZMDbkZPy28GcPy5gh9unZM4z4Tgf4Xtcp", "blocksMintedPenalty": 0}, + {"address": "QZMFjoL6GTzCpeXFmcqppFznBYrBAwzE8o", "blocksMintedPenalty": 0}, + {"address": "QZMHjFobGeCtduw9uMWHdtuTHZkAycBN3V", "blocksMintedPenalty": 0}, + {"address": "QZMgeNF4f2AyNKf6FHt4oZSWVdbFaWYReu", "blocksMintedPenalty": 0}, + {"address": "QZN5ssw549BFReAFQuCTdTy2mDEgE9PBLN", "blocksMintedPenalty": 0}, + {"address": "QZNDuZzaf5Ekiqmehz2gBCWPvWKA9tzZJK", "blocksMintedPenalty": 0}, + {"address": "QZP262ydDSr23veDB6BYaFeuC9eT9twy76", "blocksMintedPenalty": 0}, + {"address": "QZPzRH8DRqERBSchGXXJpVg3XpUYaM1E2Q", "blocksMintedPenalty": 0}, + {"address": "QZQTEnAtPcyuo1pCVbkHhsMPgBbgcvyuRT", "blocksMintedPenalty": 0}, + {"address": "QZQbZ3yWpWAzK1vBJLNGc8cneHb9BW3PDJ", "blocksMintedPenalty": 0}, + {"address": "QZR951c4vFuJUuTa9MvoA7J7KgVcWh4D4J", "blocksMintedPenalty": 0}, + {"address": "QZRZXbDSxB2zJs1myFgYE59sUhXMS8V78D", "blocksMintedPenalty": 0}, + {"address": "QZRsuC9Av9DDPriRdVVM5AtsX61aQqnvwh", "blocksMintedPenalty": 0}, + {"address": "QZRvMNVk785ZeQdNGRGKMed5yTZkvBfXok", "blocksMintedPenalty": 0}, + {"address": "QZSNxXgpEQzy7LEUHpqU2sq3foV8Sa7hMY", "blocksMintedPenalty": 0}, + {"address": "QZSXuP9vGU17XdE1EfoNLyLnHrFuaeBGov", "blocksMintedPenalty": 0}, + {"address": "QZSiakCNFQpcfRHM6MZKczgPEv93GsyoQw", "blocksMintedPenalty": 0}, + {"address": "QZSuRHhv1C3bsVifHCcvEJ4D4paeyzn73Z", "blocksMintedPenalty": 0}, + {"address": "QZSzsEpQxdD13ez1qG5JJWKuYjga3PtVQL", "blocksMintedPenalty": 0}, + {"address": "QZT4spa58znsA5Gt47T95v7wiizMTycPbu", "blocksMintedPenalty": 0}, + {"address": "QZTGg4jKzhWn6Q2jSHU7o67Aj7iVwCkTP1", "blocksMintedPenalty": 0}, + {"address": "QZTKdd9W3uBX6itcftLUaV1gzrakzZHEpK", "blocksMintedPenalty": 0}, + {"address": "QZTxNgHGYPiuuN9dCGSguYSMthLnzLkqnM", "blocksMintedPenalty": 0}, + {"address": "QZU48VmrzAoXebArYEyxBq7Qro7sYnX5fB", "blocksMintedPenalty": 0}, + {"address": "QZUKcpub6BKysq7mtPMk59udhNcppVi1oR", "blocksMintedPenalty": 0}, + {"address": "QZUaqEybsVJUYqzHbG8ETT4wvqiKVK2B6R", "blocksMintedPenalty": 0}, + {"address": "QZUwC4kZxd5YdH67vGjsxabHParrMvrFaW", "blocksMintedPenalty": 0}, + {"address": "QZV8TaGD22Cco6PREPeFgF5epzkeGc1hNR", "blocksMintedPenalty": 0}, + {"address": "QZVaRa56b77kViTjhKUD7GFQYXJVmfqdoL", "blocksMintedPenalty": 0}, + {"address": "QZVbbVPkwDYZUgr5uJiEm9tuTYVSZj6Ay7", "blocksMintedPenalty": 0}, + {"address": "QZVczQPFWg1pNuX2YNtpcqxYENfBZ7iA9C", "blocksMintedPenalty": 0}, + {"address": "QZW5vP1hzyfxR6CBkDYFRHGJZG9UnH7Nm3", "blocksMintedPenalty": 0}, + {"address": "QZWFxzXhaaSzffyVkcuGZGAqTCjopLfnsz", "blocksMintedPenalty": 0}, + {"address": "QZWKtYd6v2Lrj8ELo7ErBRB1cocV3Az7Ah", "blocksMintedPenalty": 0}, + {"address": "QZWj9ke33hL4noapRmm2HeAjSeVD9qDEQr", "blocksMintedPenalty": 0}, + {"address": "QZX8U4wHvBbjWdvYQUXDhoaq7JwSSUAFoK", "blocksMintedPenalty": 0}, + {"address": "QZXjVQkpYkpTrDPNYUHAarAJS4fdkA4fnd", "blocksMintedPenalty": 0}, + {"address": "QZXkh11FwznVBrtEneh3ftZpvURoGFVbzi", "blocksMintedPenalty": 0}, + {"address": "QZY1jJQd38t15z26zE8KzZBuMjJrobbRHA", "blocksMintedPenalty": 0}, + {"address": "QZYGnDK1PBfZ8jhZ8ZVhRvAB41ytERScLq", "blocksMintedPenalty": 0}, + {"address": "QZYLPnQtPT1s2GcMJsDBnoxG9CXF3eJqVA", "blocksMintedPenalty": 0}, + {"address": "QZYbWU7gy7KggcFjhMfWihsGhayjNH1cdS", "blocksMintedPenalty": 0}, + {"address": "QZYhoSnN2pFGwfD99s7XtNLEHcRwAsrway", "blocksMintedPenalty": 0}, + {"address": "QZYuYm81PVWkL69RWQmsgLPVDbjgeoUMK4", "blocksMintedPenalty": 0}, + {"address": "QZZ9XsiqP4J6XYmQzDCY32bY8QwiKCAaqE", "blocksMintedPenalty": 0}, + {"address": "QZZGyC3tP6z1kQ5zfMr9YEszxRJRW9vPMW", "blocksMintedPenalty": 0}, + {"address": "QZZPZZJZZfk9J2uffcQiyxABcZ1UEZEvEq", "blocksMintedPenalty": 0}, + {"address": "QZZUYProuknmUEn6UxGwSsbbFQo17nvXdH", "blocksMintedPenalty": 0}, + {"address": "QZZpuT4ryAijzXrdoyxVsrbeRNQjFYhQCE", "blocksMintedPenalty": 0}, + {"address": "QZZvDxSVcdDziEnkgiR1kJRFBSVMGRHxWx", "blocksMintedPenalty": 0}, + {"address": "QZaACZ6XgWcEBh1jDqJ849CsFGBCuoNcG5", "blocksMintedPenalty": 0}, + {"address": "QZaCzvPzS94hRiV9dxS4rExZDyc2CyJTkm", "blocksMintedPenalty": 0}, + {"address": "QZaLfuTYLNT9EweHXjhT1jmv4fwWfmZvvv", "blocksMintedPenalty": 0}, + {"address": "QZacTB4HVgcqKwvF5o78SnLHQpDHdHqjyS", "blocksMintedPenalty": 0}, + {"address": "QZarUCCweP8gzYZ4G9mW9jjru8v7v9qxGc", "blocksMintedPenalty": 0}, + {"address": "QZauwN4hiwRVEDThXyF3sTkuBsswNNHtQy", "blocksMintedPenalty": 0}, + {"address": "QZbFz1gDusCATdgpRbGA19AMNgtzijmnNF", "blocksMintedPenalty": 0}, + {"address": "QZbKgXTeRYyASUoyL1DH6JA6hwUEV5KCNv", "blocksMintedPenalty": 0}, + {"address": "QZbMnpCvCdW2edUH257JLvKGghKNfkWfZ9", "blocksMintedPenalty": 0}, + {"address": "QZc65iGBULQE1m6mmVs82dvwL9E7aYt1Zz", "blocksMintedPenalty": 0}, + {"address": "QZcEGBQyFUVyJQEe69udggzaU3AMT5ER2W", "blocksMintedPenalty": 0}, + {"address": "QZcVfnvFm81pwZFxRVux4edQBzMFmJqssf", "blocksMintedPenalty": 0}, + {"address": "QZd2Urwc2YRFpCa8xVnHhLNJ9RhAsMe2eh", "blocksMintedPenalty": 0}, + {"address": "QZdFZbZ5fxgSTvuDQdrUJSuwBiVptWFMoz", "blocksMintedPenalty": 0}, + {"address": "QZdTmBCQhSzzKtZZZ3D45zTZovVKc2gJ31", "blocksMintedPenalty": 0}, + {"address": "QZdUU9KxgfJXRPDCYtPTyENsRAFhuvXsoi", "blocksMintedPenalty": 0}, + {"address": "QZfHoNfyHbSuGKzEL8U3awpzKNzUawY85C", "blocksMintedPenalty": 0}, + {"address": "QZfMu7Kn1ar6fNMJVum5nWDGoC74ecUoQG", "blocksMintedPenalty": 0}, + {"address": "QZfrdb9MLpw1qzmsYfBJtbash7fnf6Chd9", "blocksMintedPenalty": 0}, + {"address": "QZgsEamWVQYXiaHNAXLjAE94ahN7w8XuyB", "blocksMintedPenalty": 0}, + {"address": "QZh35onkNqmdFhkUeQJTNuDUTQ3TPkdNqb", "blocksMintedPenalty": 0}, + {"address": "QZhLJCFT6s4WPUAypHGqHvhPSmCNxh8dJP", "blocksMintedPenalty": 0}, + {"address": "QZhUkmMJduNCvosxBeyQu3QTgs7MyMt3zA", "blocksMintedPenalty": 0}, + {"address": "QZhcDhqRZ5nV9xSjd4wcGCTvke46vE7v8A", "blocksMintedPenalty": 0}, + {"address": "QZhxLttt3FZnt1jVcnv1Mr6L8Bjtf13pm3", "blocksMintedPenalty": 0}, + {"address": "QZi3C7UMrFoCyGUzUHJU2fmDmpvMnSStzS", "blocksMintedPenalty": 0}, + {"address": "QZiFwCDEGFZoY8uXQFgraS8QeEywULEHfS", "blocksMintedPenalty": 0}, + {"address": "QZiUZd8gsaAhHYKC4d3PBbCLNjyCpDhrA4", "blocksMintedPenalty": 0}, + {"address": "QZiVjLyAVXrujDnekrmjktmgh1d17DSdAU", "blocksMintedPenalty": 0}, + {"address": "QZio4k86Ky8n2xRurNWLaBvVLwfY2hB9HA", "blocksMintedPenalty": 0}, + {"address": "QZirzvZE4GLyNf2739TzoJV7FQaUYUK9dw", "blocksMintedPenalty": 0}, + {"address": "QZjDHpT8UwLpSo6ew2mo9FvJrXCuFWxBps", "blocksMintedPenalty": 0}, + {"address": "QZjMqAXeNSMcNBmnvzPoSYPH2NMeejgymz", "blocksMintedPenalty": 0}, + {"address": "QZkVQdZXqGLUVuRZdTAXtsKoiojfzdxSRo", "blocksMintedPenalty": 0}, + {"address": "QZkWZxhhHsALaA1nzKWW2gGM2WcSjhxhKB", "blocksMintedPenalty": 0}, + {"address": "QZknweXQFEnkmH5Eo2vWUStJKJvzYvdGP9", "blocksMintedPenalty": 0}, + {"address": "QZm3SEdDESXGS9petTwJZ5G6HyhaWuetnv", "blocksMintedPenalty": 0}, + {"address": "QZmJ57fZrPxeHDTRo1zDDtjMi6e8Di8gra", "blocksMintedPenalty": 0}, + {"address": "QZmUhFSdcMMF3CuPWZpiqucSsyvRgvWg4n", "blocksMintedPenalty": 0}, + {"address": "QZmdBRSN2d5ZQDGjJT28cPRjHYkc2LZfpv", "blocksMintedPenalty": 0}, + {"address": "QZn2p41dafpAro4jGNENLnTaBHmU9ZzEMb", "blocksMintedPenalty": 0}, + {"address": "QZnL5zSe6iG3sbFu6cPkKfDUwJNTHEyxGf", "blocksMintedPenalty": 0}, + {"address": "QZnkNN6gFhoy9e3fhsFCrgaYqAsNXSezp3", "blocksMintedPenalty": 0}, + {"address": "QZnprsmJZRwizTQKsaPTNDX5jDNTZQCJtG", "blocksMintedPenalty": 0}, + {"address": "QZnyhbqLRzYYWRTgUAqEzwYrNsD2oq6o88", "blocksMintedPenalty": 0}, + {"address": "QZoDesL4nR54Tf25uSqZRYP7Y2vcppfKCq", "blocksMintedPenalty": 0}, + {"address": "QZprtc5E7T2C7JzeWeZAasF79jX3v87ek5", "blocksMintedPenalty": 0}, + {"address": "QZq1tx9nwJYcvnmHpAo5nY2L3m9TRLHyDQ", "blocksMintedPenalty": 0}, + {"address": "QZqGgQoy5Kd1UZDfdpwV1tRuQ1t6cEtM8J", "blocksMintedPenalty": 0}, + {"address": "QZrYvYMfrJJNjv8oxiZFq9XNPfwb4muvsH", "blocksMintedPenalty": 0}, + {"address": "QZrd8kE5ztSVEmAwdrafixB3bfQrKfYzNV", "blocksMintedPenalty": 0}, + {"address": "QZrjmemLnVekb7SWG1DEStD8HDkVqiA9pK", "blocksMintedPenalty": 0}, + {"address": "QZs94ZQHduxKkucmgSSC7tuWpkDwFUZiZq", "blocksMintedPenalty": 0}, + {"address": "QZsPhj9ng3x6ZjQVtMUVPtZU87RriwwS7R", "blocksMintedPenalty": 0}, + {"address": "QZtVzTqPwLj2XSoZM2UEL11p5aC78S37dp", "blocksMintedPenalty": 0}, + {"address": "QZtnxkkDvnjXPZhhBLU4z6ju1NgdcYJyJ7", "blocksMintedPenalty": 0}, + {"address": "QZtoRcFanrwX5n1uuLERRRbQ2NZxo5JTbV", "blocksMintedPenalty": 0}, + {"address": "QZuEhsoVq5R5SnWBNnwusPTd3ccVeBYWwa", "blocksMintedPenalty": 0}, + {"address": "QZuZ5xyyutkhtzE1G2X4nj5VgtPxpPEpbL", "blocksMintedPenalty": 0}, + {"address": "QZumYi18RmTaMewRvMFL2FNSShfWYnfA1X", "blocksMintedPenalty": 0}, + {"address": "QZvoHf48upkABYfhEYssvizA7G3iGP71Jw", "blocksMintedPenalty": 0}, + {"address": "QZvxVPGX2ZjbcUmozHTuk9uCEGfw9CieTj", "blocksMintedPenalty": 0}, + {"address": "QZvyeekGR925qWf34XVZMQZyZ3scCmBjan", "blocksMintedPenalty": 0}, + {"address": "QZw5fXM42Te6iGLGpyr2dxe84XAaL1RDTr", "blocksMintedPenalty": 0}, + {"address": "QZwDyBW7fDQcmimfcKef1u1ZmRY3aWa1LD", "blocksMintedPenalty": 0}, + {"address": "QZwMnBQmAqfod2UyJQRytY5RpD9xWfuEHe", "blocksMintedPenalty": 0}, + {"address": "QZwxrpQsBFhfuPXWGCYtjBqiybk9gEo233", "blocksMintedPenalty": 0}, + {"address": "QZx7De8qnvA29r239UhGKj1BiUYEoDFpPb", "blocksMintedPenalty": 0}, + {"address": "QZxJaSbYSG6bpSsVcTDcybUNuXzxh7ojrU", "blocksMintedPenalty": 0}, + {"address": "QZxRpPUbQ1rJKu522s1yRxNiNQhDGGHiEv", "blocksMintedPenalty": 0}, + {"address": "QZxqbgXTSxtPhY1RA9ygxwKtFjuqVpfNS5", "blocksMintedPenalty": 0}, + {"address": "QZxy4XebhvuihpcyP31o7B3Lk6SKdnodnk", "blocksMintedPenalty": 0}, + {"address": "QZy2uH98rPsz2HkHcne6Esa73WneoJDnx9", "blocksMintedPenalty": 0}, + {"address": "QZyJBebcPx26JC6kQSdFC8Swrxxy9dbXBQ", "blocksMintedPenalty": 0}, + {"address": "QZyMB9De4Lw1zjrXnkM2xnccAWcMLZXtoi", "blocksMintedPenalty": 0}, + {"address": "QZypJTSRQYSXTNmernVRgcSpQrN7E7MGae", "blocksMintedPenalty": 0}, + {"address": "QZz4wZWhcxXPNV2xfSRpf39P8PGEmNJFQu", "blocksMintedPenalty": 0}, + {"address": "QZzWnYGbLKZqxyfTbDsFDp8PHchR9MjVRw", "blocksMintedPenalty": 0}, + {"address": "Qa1EVbUuKRp6FsdLmE53SaE7WTJU3wJkjf", "blocksMintedPenalty": 0}, + {"address": "Qa1Lse1C2BcJjUeJ5yx3jLkpgTbRattmDk", "blocksMintedPenalty": 0}, + {"address": "Qa1Nx2cCmGqJkJbXa7aP7JirPTWpdUZqx5", "blocksMintedPenalty": 0}, + {"address": "Qa1cEqZH8JpaeG724f298FH31LeS4ns2bM", "blocksMintedPenalty": 0}, + {"address": "Qa254wkM3x6pRsmF6h8RLFy4sJ28khNxxG", "blocksMintedPenalty": 0}, + {"address": "Qa25woHuDgVntN12Li4JsaFEBjpBZznGVm", "blocksMintedPenalty": 0}, + {"address": "Qa27e2udMmTtFB878hzQiGYLWjcsy3pgdf", "blocksMintedPenalty": 0}, + {"address": "Qa2KDh3EajjFr1nXM5JUsCxA23cQ1FNYYq", "blocksMintedPenalty": 0}, + {"address": "Qa2LqhMP6kQDgozizzDsJw3gdWZTcUfA56", "blocksMintedPenalty": 0}, + {"address": "Qa2R43pWRK2TtVU8HcieNYEkdJKVmUUARr", "blocksMintedPenalty": 0}, + {"address": "Qa2RoGKYS89jGFqp9Xp2mxjWYmPAbk7KC9", "blocksMintedPenalty": 0}, + {"address": "Qa2qHbDPZ7BBp3veVKbDR3BJXY85R3LzpH", "blocksMintedPenalty": 0}, + {"address": "Qa2uSt77LS7NVMzHvf8LZUBqC6PDDTuiBQ", "blocksMintedPenalty": 0}, + {"address": "Qa2w84HpoD2iwvdJWibJB6xSPFQj8sAEbA", "blocksMintedPenalty": 0}, + {"address": "Qa3BxTTRPVXXfNAqMxZ8CF7v6JqzAtBL7V", "blocksMintedPenalty": 0}, + {"address": "Qa3HrzpBc3bnixz63pPkXdqxQnEBYNKEKc", "blocksMintedPenalty": 0}, + {"address": "Qa3VmkdqXEtz3hoc7UL4YecWPb7uUQF61R", "blocksMintedPenalty": 0}, + {"address": "Qa3qSNoCtoMyerod8hWZRoAaDEpuxnQtzu", "blocksMintedPenalty": 0}, + {"address": "Qa4ZU7vh6mrYWZyyH77mWkhdVyx4R7q242", "blocksMintedPenalty": 0}, + {"address": "Qa4dPFTBvCAg9skJJvXYfWo8QrH2gL8on4", "blocksMintedPenalty": 0}, + {"address": "Qa4pVh6dXtAVUtv2BfCGt6FsocDWweUckH", "blocksMintedPenalty": 0}, + {"address": "Qa4qngyt8ZJyXTvt1R75KDtbU9PLhAfNJL", "blocksMintedPenalty": 0}, + {"address": "Qa5aEy2oaEYJpW2DxQBsmYVReyKxVJ8d42", "blocksMintedPenalty": 0}, + {"address": "Qa6GUCjgzvGk9rLGU8uN6yNjVaH8FTarCr", "blocksMintedPenalty": 0}, + {"address": "Qa6eQNECS56zuCHUxWD7iUD6N6RZSvULjT", "blocksMintedPenalty": 0}, + {"address": "Qa6wR4ac3QerYE69sE2HqDzj6WK6hu1Gh1", "blocksMintedPenalty": 0}, + {"address": "Qa6wgc5FPQ12wgxQxsX4fnR5Goci6gpZBZ", "blocksMintedPenalty": 0}, + {"address": "Qa7i9hKWMxBy8eb7e6cU5jdoixi36HsLBE", "blocksMintedPenalty": 0}, + {"address": "Qa8HEsqCavw9GvRcGbozT39tTsmh2yFxWK", "blocksMintedPenalty": 0}, + {"address": "Qa8HxybT5v39Ur7gHgweJ8CEPPRuuE7xbM", "blocksMintedPenalty": 0}, + {"address": "Qa8KcQkSn3r7Tx8EijvB6CMCPm1YCKTjyw", "blocksMintedPenalty": 0}, + {"address": "Qa8VwCydZRWpFDCwKR2B5fEbmi4z3o1XXu", "blocksMintedPenalty": 0}, + {"address": "Qa8dkhXswkZEq92hVW4z372Q6KGGqdYNDb", "blocksMintedPenalty": 0}, + {"address": "Qa9eQX5nZiFdgBK3AJ6oEgKAmZWqSVKBbi", "blocksMintedPenalty": 0}, + {"address": "Qa9ivi9c4zMwbsZ19cxE8r5hu1Dz7ueaB5", "blocksMintedPenalty": 0}, + {"address": "QaAGqZsQYTcfuJFzU7TiNT5HpLNrdhdLng", "blocksMintedPenalty": 0}, + {"address": "QaAJVrYo827cguYt6p19erCJzJ6Suns6gs", "blocksMintedPenalty": 0}, + {"address": "QaARzmBZhceibaw2Esg8qs9CeXAc3ZMyQP", "blocksMintedPenalty": 0}, + {"address": "QaAScrLb1Zas7xaST3Lb4W7wh1JNhS86jT", "blocksMintedPenalty": 0}, + {"address": "QaAVZSGFpWZgfXGxemwRHb981qAjEWxU5j", "blocksMintedPenalty": 0}, + {"address": "QaB1cS3sy5EPdkQEcoB8hQhMhfX1wcqYo2", "blocksMintedPenalty": 0}, + {"address": "QaB2VFqGmeueCVcgcUvtmmqZobR9KqMoEp", "blocksMintedPenalty": 0}, + {"address": "QaCe786j5uPNus6AFfreokVaUGARmBCpaC", "blocksMintedPenalty": 0}, + {"address": "QaCkFeLX2PaghdhAwGtozUVFLfxzk9CwkF", "blocksMintedPenalty": 0}, + {"address": "QaCuSaChjMA9vPToTnsdnR3apmU7inHZNe", "blocksMintedPenalty": 0}, + {"address": "QaDEJyw6TRE8uHZjiYy3BQRFEpn92t9AEy", "blocksMintedPenalty": 0}, + {"address": "QaDXZ6vQsc88MhDQuN8kGxf4P1Tz5GBWKE", "blocksMintedPenalty": 0}, + {"address": "QaDa4MHyXrfD91YLGJ8PJT7Mfi9S3Rrp14", "blocksMintedPenalty": 0}, + {"address": "QaDvvhWopjRqorSMkBBLMzzJFNyT9S6bpw", "blocksMintedPenalty": 0}, + {"address": "QaETMWd2WUfWG3egxNZRvnWdBAMQRX7ctG", "blocksMintedPenalty": 0}, + {"address": "QaEohSdfWaHiVffkbVrme6Qen5QSqFHz9h", "blocksMintedPenalty": 0}, + {"address": "QaFLNKNz3K2BoMHmZFBSPMmxLfZTXR3Jpm", "blocksMintedPenalty": 0}, + {"address": "QaFST2gwDQipk6Wb7ttoqxSm1RTkYBVdvM", "blocksMintedPenalty": 0}, + {"address": "QaGEDJ6cctNg57nxHnKd3VzRRbc7HjdT2M", "blocksMintedPenalty": 0}, + {"address": "QaGEpi4UMZfgugUg99Uno3Ek2fG5vDqXrf", "blocksMintedPenalty": 0}, + {"address": "QaGje5U5tgczkxXDreFhsXHk3aT6hUT4Vc", "blocksMintedPenalty": 0}, + {"address": "QaGwARLib97mtnTEjdxmdh2oZrPPjeH4Ms", "blocksMintedPenalty": 0}, + {"address": "QaHLnJeW6XB1wZsdZB6TLXFmNCciyre4gY", "blocksMintedPenalty": 0}, + {"address": "QaJ4UxNdAB2iZ7D7KmnUSXFHswjeViXuUW", "blocksMintedPenalty": 0}, + {"address": "QaJDMSWpJdzJhwzqDuwaDmuSSyAyP3oMuU", "blocksMintedPenalty": 0}, + {"address": "QaJGaUyncVTMVrR6fPCaFnGRUmzJWb7rgJ", "blocksMintedPenalty": 0}, + {"address": "QaJarJeBy3WpYPCkwfVkFSoW4SPri7iwd7", "blocksMintedPenalty": 0}, + {"address": "QaKNQyG5wf7yEGT77EXHgDymzmqCXDPYtW", "blocksMintedPenalty": 0}, + {"address": "QaKhDTSy9zfFJL1ZXjPWcjnpJPAjevLT99", "blocksMintedPenalty": 0}, + {"address": "QaKteLMEHkvP5fM5Y2LuV15QZN64zVS9zk", "blocksMintedPenalty": 0}, + {"address": "QaKw56VTVp2WydpjWYYudJokr5vEfajQMX", "blocksMintedPenalty": 0}, + {"address": "QaLDKyeHR1qnuoacFaiDCPBuKwX7zoVyHC", "blocksMintedPenalty": 0}, + {"address": "QaLRrcyEqHMcn8VQLHjuxWs38xw5F7pyrt", "blocksMintedPenalty": 0}, + {"address": "QaMPYKAj425YPsowBHD5bS9Q1bckevfgJs", "blocksMintedPenalty": 0}, + {"address": "QaNJe5n75c6iyoFpg9CpeNfCgDhoB1eWt1", "blocksMintedPenalty": 0}, + {"address": "QaNUqPaJ7xEBdfkqfygTR9MFAVSibjpHBS", "blocksMintedPenalty": 0}, + {"address": "QaNrsUDNLdEQdtngjyvA2LJgDFfhZofsjj", "blocksMintedPenalty": 0}, + {"address": "QaPETfEkeXiNrfecbjF9XnUpvTCjeDbBbp", "blocksMintedPenalty": 0}, + {"address": "QaPJWFU7H6hWBnb7DdyPRBAnq9pZuHWqdL", "blocksMintedPenalty": 0}, + {"address": "QaPZDJfw41uJPy4KbTj2T3LnmE7TQb9TLG", "blocksMintedPenalty": 0}, + {"address": "QaPm97TMqtjWMN9HnWHDPDUoVSUNgZYwqJ", "blocksMintedPenalty": 0}, + {"address": "QaPssWoXxnJzPaLBusFUNPSKu9C2MKa3yC", "blocksMintedPenalty": 0}, + {"address": "QaPwqWVEGRi4FmVwtcqkmWtrUXkupFVbDx", "blocksMintedPenalty": 0}, + {"address": "QaQ7AV3ctm3KiLxNam93433bh5gjmZLqvZ", "blocksMintedPenalty": 0}, + {"address": "QaQAgS8J75h5P5xHRJ56dcMg4JQPUu7mdv", "blocksMintedPenalty": 0}, + {"address": "QaQBWFRAvhzF6SkoY7M3RNrMJZQXxs6Zhf", "blocksMintedPenalty": 0}, + {"address": "QaQQS84EMssptEs65ehAsU64LBLwhsUSiq", "blocksMintedPenalty": 0}, + {"address": "QaQSUP3NHnZJ7mq5bPYuaEdWUUyCJdSinj", "blocksMintedPenalty": 0}, + {"address": "QaQdUeAbuqqbYvLqrjSyePUeHh3Emu5m8b", "blocksMintedPenalty": 0}, + {"address": "QaQqyHAjMUJ8Md7oy2UzpdVkXkajS92aMj", "blocksMintedPenalty": 0}, + {"address": "QaRaQCgR5R5jZA4fg7VcXY2kUFCTiuRpdW", "blocksMintedPenalty": 0}, + {"address": "QaRitcZ8RNUMPFRHDfwYppV7L1ZcYhe38Y", "blocksMintedPenalty": 0}, + {"address": "QaSmwfr3u3tCirZpEtn2GLU69GZviDsK4V", "blocksMintedPenalty": 0}, + {"address": "QaTDFcDkZxAD3KoHaU1ZkBmgEyfzA7SXez", "blocksMintedPenalty": 0}, + {"address": "QaTPgeVPi3nYUm6qPouxYVQ1PMeeS63kY7", "blocksMintedPenalty": 0}, + {"address": "QaTSRv9gEqAEtFZysjNbh5Rdxwi8iJ3vWv", "blocksMintedPenalty": 0}, + {"address": "QaTUcyvyTjBoSE3x9zD5FeoUJ3Pqhf3V9p", "blocksMintedPenalty": 0}, + {"address": "QaTYPV7ptx9YhtJMZ17N2ADZn2y8QK71bN", "blocksMintedPenalty": 0}, + {"address": "QaTbDK8DvU9KDizkZhSAK967VzhaCZb3SD", "blocksMintedPenalty": 0}, + {"address": "QaTkFTcn4xu9yg17WkVQpyuEJp6tgahYVa", "blocksMintedPenalty": 0}, + {"address": "QaTsgBgV3FWi4aLoEDaCWZx4QR7Py4Au6M", "blocksMintedPenalty": 0}, + {"address": "QaUQ8oGmeqCJamjrr8ACnniZ1VwBxFcnVE", "blocksMintedPenalty": 0}, + {"address": "QaUQL141bZKDMqvzCLfuoygrvdS2E3AbeB", "blocksMintedPenalty": 0}, + {"address": "QaUVgDZYyfMrSiWfAjFL38wKagDQbBZfvZ", "blocksMintedPenalty": 0}, + {"address": "QaUYiCigsfF2CwFJHUZZwiT1g3vqNipctD", "blocksMintedPenalty": 0}, + {"address": "QaUzSZZSdBxX8GsqUvuh7DUxHkDKoedYB2", "blocksMintedPenalty": 0}, + {"address": "QaVFQD1z9X4m7MyKZ2KrwG3wdbYFAGxVvk", "blocksMintedPenalty": 0}, + {"address": "QaVN256MDPWQ6PmiD6VW2HWBkvWDH8pfto", "blocksMintedPenalty": 0}, + {"address": "QaW6mybrzkRvU1XhvEbNQGEyTULrjRfYCH", "blocksMintedPenalty": 0}, + {"address": "QaW6zsALZnoGx1CTSzMY6QWsRBfdNVPYfi", "blocksMintedPenalty": 0}, + {"address": "QaWP6TexKTiVcpkYB9aX2zA21EaXPTH8o5", "blocksMintedPenalty": 0}, + {"address": "QaWSJ5hyTx8LjcNd8UbjVLGYmSkeF5QEsX", "blocksMintedPenalty": 0}, + {"address": "QaWWZrQmSze4WJ6Wsw3pLNdzEWKZqdJZuF", "blocksMintedPenalty": 0}, + {"address": "QaXJqp3Lgsoacs6UzHCRa1eB8pheeGeVm4", "blocksMintedPenalty": 0}, + {"address": "QaXNKpYQnRUdVgWQ92UDaX5pKf3dQnLbHa", "blocksMintedPenalty": 0}, + {"address": "QaXb5dZc2AAgJuhAyekjonC1HZzCkWWA45", "blocksMintedPenalty": 0}, + {"address": "QaXzJUar9ZkXGTqo6sT1TFQPDYmEbUrrqt", "blocksMintedPenalty": 0}, + {"address": "QaY3yXMw4ruev6hkk1VZNGpVQe3njPGSP8", "blocksMintedPenalty": 0}, + {"address": "QaY6zAe2kMs9Xpx2LqTSUn5atA6BeJmVo3", "blocksMintedPenalty": 0}, + {"address": "QaYfaCU2J4tgKq4HxgqSLhi6hHC1gdDas9", "blocksMintedPenalty": 0}, + {"address": "QaYiEtB1pd31igJRFUGY72wvhuka8otK84", "blocksMintedPenalty": 0}, + {"address": "QaZ3wLycuCMzxbhynAj6XWZKLi7mG8FEeP", "blocksMintedPenalty": 0}, + {"address": "QaZTMGUjhgcjq6q1sWrMBgeFydC3wFZtyV", "blocksMintedPenalty": 0}, + {"address": "QaZs97g4Mbq9tXMoBWbhw3jFvBBVkWKS5F", "blocksMintedPenalty": 0}, + {"address": "Qaa9FTpjm3GseofKy66LBXLRzPN5qy8o8e", "blocksMintedPenalty": 0}, + {"address": "QaaQgZqRwxPCZiT5x6vrZDvncVVBJMrYoX", "blocksMintedPenalty": 0}, + {"address": "QaaUV36iNBWwmEjmtVRpJYF4YAz5TZyQhr", "blocksMintedPenalty": 0}, + {"address": "QaaguPH622PPEUwwBVMkZWPfMw6Q2YHu43", "blocksMintedPenalty": 0}, + {"address": "QaatHHnyyMiR6xpfWZNaYAB4yqELHrGExK", "blocksMintedPenalty": 0}, + {"address": "QabX5saT6FFJ71S9RobtMtkD9Z3f3vcmC3", "blocksMintedPenalty": 0}, + {"address": "QabatMoTRdS3S9q2eAdzfYgf9Zb7tQvzds", "blocksMintedPenalty": 0}, + {"address": "QadPNKeEJtHuhQGCDssEw7emUuMAMxxhrU", "blocksMintedPenalty": 0}, + {"address": "QadUhTL1KJjNRkGotmHSNigCVKmMrQ8un6", "blocksMintedPenalty": 0}, + {"address": "Qae8HRLVNG65KJHPE9EijyEybL8fCq2wJD", "blocksMintedPenalty": 0}, + {"address": "QaeEWW1nZXDdPenNx7Avws9LiyJz3BGGrC", "blocksMintedPenalty": 0}, + {"address": "QaebrKYe2PnaJ1uHgLyJxa9FwpPvVum5Dr", "blocksMintedPenalty": 0}, + {"address": "QaeobW8ymA57enmoKJhqbiCQjX2eq88WoU", "blocksMintedPenalty": 0}, + {"address": "Qaeq6jNApYuscWxGm3t5ZNmebggCsNwrKX", "blocksMintedPenalty": 0}, + {"address": "QaewnyCZPTevdtAzNS2i8oWiWtAe9GAuAe", "blocksMintedPenalty": 0}, + {"address": "QaezHBEVzK2qySeJsUcsYGYjy6pdNwRBHh", "blocksMintedPenalty": 0}, + {"address": "Qaf1tpbkC7Qe2DWD9KRbFFT2XCLkNh4z7W", "blocksMintedPenalty": 0}, + {"address": "QafL4Fz91h2WtTABFXpqTdRQGXQSQg5Uae", "blocksMintedPenalty": 0}, + {"address": "QafdEhT1tdUqUxYaSwJWZ7TpYEV1YqGaya", "blocksMintedPenalty": 0}, + {"address": "Qafn5bRbfUxfBsmMUjGbsrM2QYJ1uFY3xf", "blocksMintedPenalty": 0}, + {"address": "Qafr6irZ4eYS23wRxUB2E6tSf1Kpb3tQhw", "blocksMintedPenalty": 0}, + {"address": "QafsorF8UCUj2BTXEWeMwa4Y24y6vFCNDd", "blocksMintedPenalty": 0}, + {"address": "Qag37cFWNEdTzd3AJhp5VpKb9mhDZSK7Rt", "blocksMintedPenalty": 0}, + {"address": "Qag6aYpwhXjZbymrKjhA8C1YkUyVsgC5e8", "blocksMintedPenalty": 0}, + {"address": "QagWjzQzTAvcBfsNWNW4yM6dm7zM9EkGWg", "blocksMintedPenalty": 0}, + {"address": "QagXjkcB1VTCzxgRVsCGmdPwqpcyy1CTar", "blocksMintedPenalty": 0}, + {"address": "QagYZj9khYgZCDeLfowAn49LegpLRT8Foy", "blocksMintedPenalty": 0}, + {"address": "QagZduEap5snXNPB8PNC65XxdHGdUbkBRu", "blocksMintedPenalty": 0}, + {"address": "QagbdpFk5mYMJc6Uy83dmt3miixyXJqnFN", "blocksMintedPenalty": 0}, + {"address": "QahQL1dnT2M5uBDY8XTfZ7NUmBwT5w6ZAk", "blocksMintedPenalty": 0}, + {"address": "QahZ1xN3tRn3SAxrSeSAz6RDt87CEK5gE5", "blocksMintedPenalty": 0}, + {"address": "QahcQP35xFpeiJeaPMyhpJLPfL9hC1Es1h", "blocksMintedPenalty": 0}, + {"address": "QaheJzoz3hmzLKdC3pC9SPQifukCsjw8FJ", "blocksMintedPenalty": 0}, + {"address": "Qahri32GJwEk8kKywV1PsYhQKV5xKxFzss", "blocksMintedPenalty": 0}, + {"address": "QaiYqcEAyPe7Lfn82n1RT2wVxdsai36Q1n", "blocksMintedPenalty": 0}, + {"address": "QaidTVFB4RxE7F1szg4uNdpj19gUJWmCsJ", "blocksMintedPenalty": 0}, + {"address": "QakK9cM2KcBnA1GWsu8peii6e1S41dQaHJ", "blocksMintedPenalty": 0}, + {"address": "QakKrwnxnoiCuFaN1ptZBZeFVeVysdSsZr", "blocksMintedPenalty": 0}, + {"address": "QakZANSJUUr33mdwpUAgcVo1gUC2NYcoG9", "blocksMintedPenalty": 0}, + {"address": "QamPG8YCd7GVo8Zafxz4hg8GYdASo5H9V5", "blocksMintedPenalty": 0}, + {"address": "QamnzfeiTFkGXP75ruo7L6MbtgVMgafGSv", "blocksMintedPenalty": 0}, + {"address": "QamwyCwWcetN5PAajY8ejeCiLQdY3szgKi", "blocksMintedPenalty": 0}, + {"address": "QanLSXme9N8J2Bndq2kZTweuJZTdZMWqJD", "blocksMintedPenalty": 0}, + {"address": "QanMNBoXTuvn6QRqhSAqbUNtYTHYaBqJuK", "blocksMintedPenalty": 0}, + {"address": "QanMwjDmFYoyeJFjbsgH36CnJvC6qxLWzb", "blocksMintedPenalty": 0}, + {"address": "QanZr1xc7aESRWrkb2KiPQNqvjeLsc2qdi", "blocksMintedPenalty": 0}, + {"address": "Qane1QRvhg8XKc9AwthuZybkjT4Jm3VV9R", "blocksMintedPenalty": 0}, + {"address": "QaoFigmo8eWA8jd2M9T9JVDc3at7YughPY", "blocksMintedPenalty": 0}, + {"address": "QaoSHrU6TchUPFaPvvGKAfYFa76Crd6R3Y", "blocksMintedPenalty": 0}, + {"address": "QaoZw8iWvukJxY6d4L6DhMVBM68cH3P3J5", "blocksMintedPenalty": 0}, + {"address": "Qaogm2W6GEUwVaWFQBPAMzNZgQFTzH2uir", "blocksMintedPenalty": 0}, + {"address": "QapTWgpzN4nxMvCTg6V9UmeiCfrbydtx1Q", "blocksMintedPenalty": 0}, + {"address": "QapUQDAHayXNn15WoFrkwRtuRJ9M3sT9qv", "blocksMintedPenalty": 0}, + {"address": "Qaq4sV9wkdSSSgJtaPuuSV15tqsVPD78rz", "blocksMintedPenalty": 0}, + {"address": "QaqEBdzHeGz6rBn2rkgkJyyMHVAbLC1Kaq", "blocksMintedPenalty": 0}, + {"address": "QaqgqA3ZT4mby2RCEKpy4uLoK22xz5sNZG", "blocksMintedPenalty": 0}, + {"address": "Qar4VdQhxbHiKybaPD3kWH66Z4JqS1GqYv", "blocksMintedPenalty": 0}, + {"address": "Qar4W6fo9SUaPE6v69Mr7xBJMwnyuJWHQ9", "blocksMintedPenalty": 0}, + {"address": "Qas1cQ5HZxdrXSp4Y5wkvkA4BWzbxiTw38", "blocksMintedPenalty": 0}, + {"address": "Qas2gqRefX6MZrxUzXU8BsXWQamUfKvKcj", "blocksMintedPenalty": 0}, + {"address": "QaseLQG3NBQRfposggsrTvfBg6WNiPYaQi", "blocksMintedPenalty": 0}, + {"address": "QastuxrMVpDBCEZjfcvCxUyWWDcK7RiJHP", "blocksMintedPenalty": 0}, + {"address": "QatWTgE1iBrTiVSuH4U5EpLYdX7cN8eZBk", "blocksMintedPenalty": 0}, + {"address": "QatuyGYfBfHChQWSe24n3PtenvaaH5UEpw", "blocksMintedPenalty": 0}, + {"address": "Qau1G6RsVSHxipDAXXuViausTsUngnTH1h", "blocksMintedPenalty": 0}, + {"address": "QauR42yCkvuvA1rkJ328F5J8F8oY3ECWk7", "blocksMintedPenalty": 0}, + {"address": "QauhfAwtrreqyukFpT9sqSUhBrPq3vwZ5y", "blocksMintedPenalty": 0}, + {"address": "Qav3PBFdXVkMmyFmTugvSR5o1sY9fEKxtr", "blocksMintedPenalty": 0}, + {"address": "Qav65JdjPzDzUTc1NAefUsPiTqNptfQoKq", "blocksMintedPenalty": 0}, + {"address": "Qav6MHPUmD7CXWFbDJpGAfhEycRHVnvvp7", "blocksMintedPenalty": 0}, + {"address": "Qav6hGarjjX5V229u69wUNcgGPboZEMokP", "blocksMintedPenalty": 0}, + {"address": "QavCfxzdLvNBTYv7qmNVegESXM9DosSGp9", "blocksMintedPenalty": 0}, + {"address": "QavGR3NCMcsov5CztZpQf7gVbgZpoQ14YX", "blocksMintedPenalty": 0}, + {"address": "QavWbYoEFzarUXTVSndkL5zSj9o8bAwbtj", "blocksMintedPenalty": 0}, + {"address": "Qavbj9AafgbVwE2egfnJATnRZNwrTFznBo", "blocksMintedPenalty": 0}, + {"address": "Qavv8eppJmMGcwCZeoFUevvk8wAokRVZXT", "blocksMintedPenalty": 0}, + {"address": "Qaw2GtxxGfmTL56JyvCZc2nbBvpPqfRofr", "blocksMintedPenalty": 0}, + {"address": "Qawxhpvrg66fvfs43p6pFoKJUSoRC2aWT4", "blocksMintedPenalty": 0}, + {"address": "Qax8NXN3jBmq1fAm7tSEgddC6U2fHnwac1", "blocksMintedPenalty": 0}, + {"address": "QaxWgcGGDTn8yFWt4VB8Vo7b9wYhMmxLHJ", "blocksMintedPenalty": 0}, + {"address": "QaxWqkhhQMR94o9d2tpCrHFpzYU4xHAWdJ", "blocksMintedPenalty": 0}, + {"address": "QaxfmJeb5ouMBZQzyuYvjHSeebtMjSyiXb", "blocksMintedPenalty": 0}, + {"address": "QaxovnxXmBA2byxSk6K7Y8jc2T7fJhxbpy", "blocksMintedPenalty": 0}, + {"address": "Qay8Jr8XDKCJDsHnCz55ygWBVSzBePvp4Y", "blocksMintedPenalty": 0}, + {"address": "QazPMfYNeyLUnuRAFVqQnTDWUeEBKTgMK1", "blocksMintedPenalty": 0}, + {"address": "Qb1JTcRripw154AVokeZDshdRpdyUptANF", "blocksMintedPenalty": 0}, + {"address": "Qb1bojhojdejq8jVFJRiy1uWhc685nHGWj", "blocksMintedPenalty": 0}, + {"address": "Qb1nXucp894bdbC3PtVpjTF2T914zZwXMG", "blocksMintedPenalty": 0}, + {"address": "Qb1zbSPJ6iH4EttuBkfT2d5bGuWjeTVD4g", "blocksMintedPenalty": 0}, + {"address": "Qb22jhC6eajMm1FLUds1UgJjP9qgtnMrL1", "blocksMintedPenalty": 0}, + {"address": "Qb2R5cBDCbK5gUQJtu6AwMdkxihoR43imu", "blocksMintedPenalty": 0}, + {"address": "Qb2RM1pP6MYutLsUqp7noeirfT2Ln9CBr9", "blocksMintedPenalty": 0}, + {"address": "Qb2cS3oMFZQk3CDbxQWPqvYk8RALLYc2Vh", "blocksMintedPenalty": 0}, + {"address": "Qb3gzpq7UN9zrvYtYrQiNtrDGt7UiZVQXZ", "blocksMintedPenalty": 0}, + {"address": "Qb3txzr23HPno2UVZFEBH5veErY3t5hZ1L", "blocksMintedPenalty": 0}, + {"address": "Qb41X7oRCMUaHfQVjrZXt1mjeKp7ZtWgVP", "blocksMintedPenalty": 0}, + {"address": "Qb4CrZBsFvoQvau3rydRxAAKgg5CRs5M2N", "blocksMintedPenalty": 0}, + {"address": "Qb4EitiqpEvGWbD19azvtdiQ6CbZ1v8TXA", "blocksMintedPenalty": 0}, + {"address": "Qb4TL36LbP9Pi7RgYxUFUHBxg1zfpJMDFz", "blocksMintedPenalty": 0}, + {"address": "Qb4eRuTXsitc22PXpnSrN5EUDVxgeHXxVc", "blocksMintedPenalty": 0}, + {"address": "Qb4nhNC4YjjA3jtTnbWP3CgPgUymn6H5fJ", "blocksMintedPenalty": 0}, + {"address": "Qb5RQKMH2jt8mL65R6rMGGJgp1vq5DhJWP", "blocksMintedPenalty": 0}, + {"address": "Qb5arHBdEF2FzycGWaZhTULotFRihfMeNx", "blocksMintedPenalty": 0}, + {"address": "Qb5sotDYxYvwCLKCzyVXfbJhggtBvuUWmC", "blocksMintedPenalty": 0}, + {"address": "Qb6FkscLJiRfk4cSnn7ux1UHTfJswtUgAV", "blocksMintedPenalty": 0}, + {"address": "Qb7KvT93sn5wDbrdgcm8rJZXNwJTsuhJ9w", "blocksMintedPenalty": 0}, + {"address": "Qb7xDGyipxw3Y1prKHd2tRkGTsNzbupiTL", "blocksMintedPenalty": 0}, + {"address": "Qb87H29RhLDUS5LsGnSkbudjsasr1U1ukT", "blocksMintedPenalty": 0}, + {"address": "Qb8n1duaHSVxdWcSxbgnMyYPPyWEJ6r3ZX", "blocksMintedPenalty": 0}, + {"address": "Qb8nPKXj4gyZwnz3vixJZc7BPcC3vYnunW", "blocksMintedPenalty": 0}, + {"address": "Qb9i5m5cqpb2oLWwM2EfZfNEaThZEkj9xz", "blocksMintedPenalty": 0}, + {"address": "QbAquzoesdwZNbnow2FUfU9cW8j67y5Hkg", "blocksMintedPenalty": 0}, + {"address": "QbB2dxrSf3otWX383kePXn8jDgeJMmFpt3", "blocksMintedPenalty": 0}, + {"address": "QbB5AXpiRMaxvd1DCYKyzhP43Anh5jvjch", "blocksMintedPenalty": 0}, + {"address": "QbBBwNoQDsFGq4e7A6Un9pYDE5mHNuV8BN", "blocksMintedPenalty": 0}, + {"address": "QbBS1wFkobstQkF7uTZKL8hMJy97Nd8qPM", "blocksMintedPenalty": 0}, + {"address": "QbBfmzFFrc6npj9NuojCNSEGg3U6gaqZbz", "blocksMintedPenalty": 0}, + {"address": "QbC35RyMdrUhZqdku6Nn9RyCrsc75wz91v", "blocksMintedPenalty": 0}, + {"address": "QbC5PSiKn9ovAf9F1txYYoe6khz7ED5vKr", "blocksMintedPenalty": 0}, + {"address": "QbCA6u56LSNXGh9n1faSrk8Ui5VcmQPuJs", "blocksMintedPenalty": 0}, + {"address": "QbCSJiCg3jvxG4dnxREQYjDLyq5kNAHJhj", "blocksMintedPenalty": 0}, + {"address": "QbCVNnksmMPtQ26VQXZSsSjLzghSCV4S4m", "blocksMintedPenalty": 0}, + {"address": "QbCWBnpcqD2BAHahnpxR8w1Hy98YDZezgX", "blocksMintedPenalty": 0}, + {"address": "QbCyJxVMfdQc3g7RXDAMRycovkpnFJbrMk", "blocksMintedPenalty": 0}, + {"address": "QbDPJwd1nSUaXjSeGTjLpJWE2KbzFwis8d", "blocksMintedPenalty": 0}, + {"address": "QbDTLcCqaoWoqEGvCQmJHbqAebBzUys3Zz", "blocksMintedPenalty": 0}, + {"address": "QbDn8DDF79c8jt9apSt7yY6JwPEaEY98bZ", "blocksMintedPenalty": 0}, + {"address": "QbDyuqXcZCvj5TVopEbw9Zgi6WpW2WLZPe", "blocksMintedPenalty": 0}, + {"address": "QbDz8xYs3e5p4rw1cPR3AGpv3nGb8kN5n6", "blocksMintedPenalty": 0}, + {"address": "QbEPo8CH6xdHhsEW6PCQcTBcyTnD4meWgn", "blocksMintedPenalty": 0}, + {"address": "QbEQZFX3YQj5LwsboP9VutWNDedK4Kv37R", "blocksMintedPenalty": 0}, + {"address": "QbFTGXZLb3XNd1gBjw5o4tGKhmvc8hJBUP", "blocksMintedPenalty": 0}, + {"address": "QbFYUEznLWzo63GmEQtFkTtPh3mq1ezqnW", "blocksMintedPenalty": 0}, + {"address": "QbFg2PteV2qP3kK8MFv4YWA4JiXT42pf9k", "blocksMintedPenalty": 0}, + {"address": "QbGaG8AWG2gGDSvK4Yega1Ahv2tMeZRc5A", "blocksMintedPenalty": 0}, + {"address": "QbHJD8BxN1kZJe25Y2SUPgL9JJh8D77hEv", "blocksMintedPenalty": 0}, + {"address": "QbHZiYCK1qwsKA9PJXwDEZyHSWeF58bKci", "blocksMintedPenalty": 0}, + {"address": "QbHj38AHySrhvBJVxVWQoBvzAKxhctyw6V", "blocksMintedPenalty": 0}, + {"address": "QbHnYbvN1XEh6oyFfJmGWSNTVu3zEW85Ap", "blocksMintedPenalty": 0}, + {"address": "QbHz6CtQWu83bb49WkoxDdA74f9QPCi6R3", "blocksMintedPenalty": 0}, + {"address": "QbJJho6sTHnqL2ECivtfUrYZTuEgemEha2", "blocksMintedPenalty": 0}, + {"address": "QbJNcfwBeaiWgrn95rdLEGdqRckFh3zLGW", "blocksMintedPenalty": 0}, + {"address": "QbJarEfewUcCJJ88mpTYUQYWkvK7uhejys", "blocksMintedPenalty": 0}, + {"address": "QbJerx5PgCN8ceTnBNpXjwUfNddZSaqydv", "blocksMintedPenalty": 0}, + {"address": "QbKV2Ekn6F6snsJFbczFqCrmRdQyDAvwnM", "blocksMintedPenalty": 0}, + {"address": "QbKjTsfFqm3SuTaV9mcgf4QHUA4iGmWCxq", "blocksMintedPenalty": 0}, + {"address": "QbKusF72ZA8bCR5pVbAM87co4PR1FT53P9", "blocksMintedPenalty": 0}, + {"address": "QbLX34r1Wb1mMr9DK4g2h6NN93qHeT3pEY", "blocksMintedPenalty": 0}, + {"address": "QbLY3yUNFqVNchbaYRv7mLGShfGPK4QbP6", "blocksMintedPenalty": 0}, + {"address": "QbLcczu6cyCCMvXGoHt1rLMMbWszfnuMvq", "blocksMintedPenalty": 0}, + {"address": "QbLf98i2wgG7tMQ4JFhyQj6RmLS3RQKv7Z", "blocksMintedPenalty": 0}, + {"address": "QbLr1VvprQHygUiopMGQgTaqXkKzrDcSfU", "blocksMintedPenalty": 0}, + {"address": "QbM71A14FYXXY12JDRXXJZdRVaUBXbhoBc", "blocksMintedPenalty": 0}, + {"address": "QbMrELosbzv1i83eSRo2GLH3CPWuSozSLu", "blocksMintedPenalty": 0}, + {"address": "QbNHbEb32gngEFQg7Vb5GDnnqkFMioAfYh", "blocksMintedPenalty": 0}, + {"address": "QbNWHNV6mkeyGZ35ppAKm4RQEpqbVw3qXp", "blocksMintedPenalty": 0}, + {"address": "QbNXB59yks5TXLY1UUMN5S38Qeayk5f3xG", "blocksMintedPenalty": 0}, + {"address": "QbNbCFoYkZR3QzRXCM4fWhuhnh9GCSWodD", "blocksMintedPenalty": 0}, + {"address": "QbNbrPx1gSxXadjnSR42r6qC7PN5c8cbiH", "blocksMintedPenalty": 0}, + {"address": "QbNcVYtQDNubi1pbBhrixYsuGQFZieQS6r", "blocksMintedPenalty": 0}, + {"address": "QbNhddEWWcDVft2hrD6Yhi3BqevH92AFHt", "blocksMintedPenalty": 0}, + {"address": "QbPjJHHEeGMfSPS1ycZtRjgfh4nQwPeaAM", "blocksMintedPenalty": 0}, + {"address": "QbQ4Rv8Pp2X7x1rgQuz1BLVQcQgyLw4SRF", "blocksMintedPenalty": 0}, + {"address": "QbQViGUfU5gTRWJ65doFNnGtZM7kwarYF8", "blocksMintedPenalty": 0}, + {"address": "QbQXegYrbA9igw2fHEhxZUymhtwra9XDR7", "blocksMintedPenalty": 0}, + {"address": "QbQXzgtdGzQ5BZvoksNPg4BZW2aKHmM3DD", "blocksMintedPenalty": 0}, + {"address": "QbQnd7EGkQRmBVkjpX9RikYF1MMpoCXNwd", "blocksMintedPenalty": 0}, + {"address": "QbRFvU4d4p6PM6PaVooT4aBK2h2acDfxRw", "blocksMintedPenalty": 0}, + {"address": "QbS3Y41m9VtUAhNYyfx2XHVFxjNQUghAjn", "blocksMintedPenalty": 0}, + {"address": "QbSCSLjN7Xgg2eSi1tEtVYqgRjqCvKPU1F", "blocksMintedPenalty": 0}, + {"address": "QbSyUZXLdbom9vY5UUyzJYUwUuKQvsodTA", "blocksMintedPenalty": 0}, + {"address": "QbT4L8XY1Bi35XcLMCNr1sYFyYquzfQx5n", "blocksMintedPenalty": 0}, + {"address": "QbTFErRa1GVYFX97femqLUqLDZVUR78r8f", "blocksMintedPenalty": 0}, + {"address": "QbTJ7WFfULy6C1HYoRMg9jnMFEbQ3ruqon", "blocksMintedPenalty": 0}, + {"address": "QbTg46vhQ3QTY8W3N87rppkzkF8auMWHAj", "blocksMintedPenalty": 0}, + {"address": "QbTotBJFsDD6EYjwX5VwoDh1G3gcmvxvP3", "blocksMintedPenalty": 0}, + {"address": "QbUkwiApGEttGd2z8CQmyro3PaSjz3JPYj", "blocksMintedPenalty": 0}, + {"address": "QbUy5djKfQ2hU4wjYdrABq2KrCsNNLkZ74", "blocksMintedPenalty": 0}, + {"address": "QbVE2toCta4nNC6RVjzzY1MHw5LnJa1m1j", "blocksMintedPenalty": 0}, + {"address": "QbVLPw9qcL32zLZREYMtG5KBfdzStHDgYh", "blocksMintedPenalty": 0}, + {"address": "QbVNJ8btmhm8Tpj7DBXSvLjLrCENp3S3zh", "blocksMintedPenalty": 0}, + {"address": "QbVkVMrDU6xSHZLPeaf5Exj5kpurScfapv", "blocksMintedPenalty": 0}, + {"address": "QbW16RSeGyEjdcDEYttaUATbMEReh5rCUZ", "blocksMintedPenalty": 0}, + {"address": "QbW7Zctkehn8U5s3JBVARYZZVyAy72rRFf", "blocksMintedPenalty": 0}, + {"address": "QbWFsVZUbs4QDGXC5PKt6DKxuwXwd522CK", "blocksMintedPenalty": 0}, + {"address": "QbWVQHB2gFdu6x72hXg77uPUKajHDSZa93", "blocksMintedPenalty": 0}, + {"address": "QbWWPusZ9RUcR9fKt5zmLMtvVLgzo8RFKX", "blocksMintedPenalty": 0}, + {"address": "QbX4AFs7T87iiKL9DVyDvesw9gWJ5vnHcu", "blocksMintedPenalty": 0}, + {"address": "QbXA3sf1tb5ALrBw1cpPW2w6gf5i4a2m9q", "blocksMintedPenalty": 0}, + {"address": "QbXEtm9opWA1bqk1q1EyUcyErYbSaohhoV", "blocksMintedPenalty": 0}, + {"address": "QbXznXa8WMw2fgneg37avvLM5Eo57ExrxN", "blocksMintedPenalty": 0}, + {"address": "QbYZe8RyZ41jdGGVDouBTrhVmYeG4ZR4mb", "blocksMintedPenalty": 0}, + {"address": "QbYaUQcNydbEsmrQDuoB3PkETMDwTbKc4n", "blocksMintedPenalty": 0}, + {"address": "QbYxJ5iw242ecPKmXmo1cgrteqmue2s2y9", "blocksMintedPenalty": 0}, + {"address": "QbYyn8xaxRfrZoEuBjEQdaPm2fZ48xeQM3", "blocksMintedPenalty": 0}, + {"address": "QbZ2doBAZCCJuZYyPLKpj1BQaGs2j6gnhy", "blocksMintedPenalty": 0}, + {"address": "QbZ6Cc9zJp4di5x7vEDP9EBZnY6rGEQoaD", "blocksMintedPenalty": 0}, + {"address": "QbZQsFdmSrvY7d3BMYjgmnzomUtjttTt6T", "blocksMintedPenalty": 0}, + {"address": "QbZUH5oLyVMxxS5fGJ86hD7rMKaq2Px5Z8", "blocksMintedPenalty": 0}, + {"address": "QbZazK5AfQJQaEnZS8odkAm8Wp9um3vMd6", "blocksMintedPenalty": 0}, + {"address": "QbZqawcrk75FaRTBJ6rM5D35vGbv98KQkp", "blocksMintedPenalty": 0}, + {"address": "QbaPU6EB26iHyef3aYhrktEXZAJ2sKuAFL", "blocksMintedPenalty": 0}, + {"address": "QbaTNqaj75zrmbnKecz2DWjKQfJK2ppdfH", "blocksMintedPenalty": 0}, + {"address": "Qbb3CfHNv7XuSLFYzRsD5kPS7QNdnjvLtL", "blocksMintedPenalty": 0}, + {"address": "Qbc4WWP5wrj8n38FpyCXTAVBX1FWLQsmbP", "blocksMintedPenalty": 0}, + {"address": "QbcNagBFDKkEy3ixsLEWxmJDUoGGwHKb5J", "blocksMintedPenalty": 0}, + {"address": "QbckCRgUs8CkY2AsSG9YjywSQS3jULpjds", "blocksMintedPenalty": 0}, + {"address": "QbcrLb6zonrovG6GHBK48R58NhHeR9WbqB", "blocksMintedPenalty": 0}, + {"address": "QbczCBuRjaMWaREjud5XGreGCETtXc1u7F", "blocksMintedPenalty": 0}, + {"address": "QbdVgGsnBGhVSU6DuWryTEDWAguxFdm7cw", "blocksMintedPenalty": 0}, + {"address": "QbeDyJEunNszYeQAVs8nGVpZPsU9Bu4Kxr", "blocksMintedPenalty": 0}, + {"address": "Qbed46t1Anueb5esPwxUNKiu3BSzYgZ7tR", "blocksMintedPenalty": 0}, + {"address": "Qbf4PqiAcDTLSQ6npKAqAFcxcHmEBusxDB", "blocksMintedPenalty": 0}, + {"address": "QbfmGFtrZjSiGXjnDH7ejkTeoBU5uvPrcn", "blocksMintedPenalty": 0}, + {"address": "QbgMRc9sxdTNN7Jg78D6fC5bVzJgpQ1BQz", "blocksMintedPenalty": 0}, + {"address": "QbgPyNrSRX29KFWU6h6K5N3YrRD8PT9UpR", "blocksMintedPenalty": 0}, + {"address": "QbgWnetYhLQPZQBerR3dpEECasgqnqaQw3", "blocksMintedPenalty": 0}, + {"address": "QbgcjPdSV6SR6zWRYHhzMMNhTh1yhSDNKA", "blocksMintedPenalty": 0}, + {"address": "QbgjHLevJyYfNjPjGMxNheXGvZAZbJ6aVc", "blocksMintedPenalty": 0}, + {"address": "QbgnajDCfF6tZM3HgqMQTnru9Vc8XrQq3v", "blocksMintedPenalty": 0}, + {"address": "QbgwgamSPRBLxmFptwrNkBteB6Pu1ddffi", "blocksMintedPenalty": 0}, + {"address": "QbgzpEp8pzmeb1tq5JHUHXkdHZea3yWgDg", "blocksMintedPenalty": 0}, + {"address": "QbhBGKDGuuPboQAuK4VXXM4XcRveonZTjL", "blocksMintedPenalty": 0}, + {"address": "QbhG4GVMLCQFxB66zGGyfgu5p8UefB1JZT", "blocksMintedPenalty": 0}, + {"address": "QbhVcsjW27ADhgXJtE8Mm3pPieh6TTrWjf", "blocksMintedPenalty": 0}, + {"address": "QbhaJuMF8KcghHt5grqFuyAF6A2SunFrbN", "blocksMintedPenalty": 0}, + {"address": "Qbho5ANvWKCES5FF5oZ8suFGDtfRehYMXF", "blocksMintedPenalty": 0}, + {"address": "QbiKpCFFTRJBpi9zxu8Pe6u3jh7EDxyW4x", "blocksMintedPenalty": 0}, + {"address": "QbiYsRBck4iLYk5hU3ZrsLcnLjPV9Ym2Xi", "blocksMintedPenalty": 0}, + {"address": "Qbiom4rXvTUDQ8Vg5yYprm42HhUL71E9F3", "blocksMintedPenalty": 0}, + {"address": "QbiomJHdkixKvPYov3b4wKccTWdGvbm3pC", "blocksMintedPenalty": 0}, + {"address": "QbirBjPD9SCBZDxqK9F4zHX3ATGcDXfa2d", "blocksMintedPenalty": 0}, + {"address": "Qbj1CDdWYbquCQMwUDhr85nju4MLNhLKAU", "blocksMintedPenalty": 0}, + {"address": "Qbj4Dmpo55pDaJfXetGR8j6AtDBFjEP2KF", "blocksMintedPenalty": 0}, + {"address": "Qbj6YEt25LfTbsG3NBcWgSkQzqUgjUr7z2", "blocksMintedPenalty": 0}, + {"address": "Qbj7mBJpQmmqJ7ADWceLbx9yHPKm6dpHRW", "blocksMintedPenalty": 0}, + {"address": "Qbj84iyTFaJMm3KqsAWezijeG3ZjbyCGL4", "blocksMintedPenalty": 0}, + {"address": "QbjP3hStJ31nBJyhipYvnrZu8R2yPrqRp7", "blocksMintedPenalty": 0}, + {"address": "QbjrMFLbmPd3juDunHHttzHQF45pZ9reEg", "blocksMintedPenalty": 0}, + {"address": "Qbk5qcGzbkLUTztHzAHjEK4fPrTiUbYe3J", "blocksMintedPenalty": 0}, + {"address": "QbkYhiE6qoynoU5e1pe5RZMCrxhmzYy9id", "blocksMintedPenalty": 0}, + {"address": "QbkizShsUkVt6LTjjkBGwKcJgXrLdA2caC", "blocksMintedPenalty": 0}, + {"address": "Qbkj1JGajidrs2hetwLZT8CwUjBwGerQJP", "blocksMintedPenalty": 0}, + {"address": "QbkyAFziF2P6vKzPTH5xQAvpkKSpzYRX5K", "blocksMintedPenalty": 0}, + {"address": "QbkyUGApqpZVsoaSTtj72rQPC8NajTBmcP", "blocksMintedPenalty": 0}, + {"address": "QbmYZSEHjs8wDAuB8ncB6tD8rb6Q8EjtRV", "blocksMintedPenalty": 0}, + {"address": "QbmkUDm1N6Zb6npxpUkx1dibZR6ZnAkf9Q", "blocksMintedPenalty": 0}, + {"address": "QbnDRcCbShrbLJJuzbsVpNeRRwSShZPqUD", "blocksMintedPenalty": 0}, + {"address": "QbnJGzjZbh4gb16BV1m9M85Ev2tHSM4FQZ", "blocksMintedPenalty": 0}, + {"address": "QbnSfvRHs2KJTDW3RdskuACLV8StAbq7Cm", "blocksMintedPenalty": 0}, + {"address": "Qbo1JQ5sAb8QCLbHYQEX3EgAMsQGZjQEnN", "blocksMintedPenalty": 0}, + {"address": "Qboi1pet6f4t4ypYr3bhqs3PoPdWYtUFKL", "blocksMintedPenalty": 0}, + {"address": "QbooPLkNiaM2zsRk1KXQJENZWnbm1PG6iC", "blocksMintedPenalty": 0}, + {"address": "QbooX3R8KzT3JVB9XuykuuWryL2uUjgWAA", "blocksMintedPenalty": 0}, + {"address": "QbpCivV9Tg54qnFw4P8XAkHLnt3Azd8zp2", "blocksMintedPenalty": 0}, + {"address": "QbpG3L9fiZvkvUyZALvb8sumH3ZGdf6L3H", "blocksMintedPenalty": 0}, + {"address": "QbpUmRF1pYF1wwpNfEsy1RniCeKzVzrm7N", "blocksMintedPenalty": 0}, + {"address": "QbpcuNhfbuGDX3HEFNEHKAV6x5kxFisuAt", "blocksMintedPenalty": 0}, + {"address": "QbpfZ3vuwmK17ywWhrAHu5ew4wLaoxP6Ng", "blocksMintedPenalty": 0}, + {"address": "QbpfyMCbu3YaRR6YQ5Lcw3iwJqvW4ok8i8", "blocksMintedPenalty": 0}, + {"address": "QbppER5E51SxwmTpAN6RytG67ncSzqJuiV", "blocksMintedPenalty": 0}, + {"address": "Qbr597FtiZuECi52niBrbsh9kEWLFMHH4s", "blocksMintedPenalty": 0}, + {"address": "QbrH2UciN4zgpbQrYiN3F9KPSoT16bu2N6", "blocksMintedPenalty": 0}, + {"address": "QbrPj3QNP6WYb1KKeHSmJ4igmS2MinW3Ss", "blocksMintedPenalty": 0}, + {"address": "QbsCzHJyzBc6m9kGgJqSTg7R5NXTMEamWN", "blocksMintedPenalty": 0}, + {"address": "QbsDqUYGo3LcuASrR6LhACTd7KdcEBNmak", "blocksMintedPenalty": 0}, + {"address": "Qbt9DbwTNv3x2H2sXyvZtQPqEeziWSSueX", "blocksMintedPenalty": 0}, + {"address": "QbtNKaESdYdLc1x51SMqJ2bJ2brbZ6F4PL", "blocksMintedPenalty": 0}, + {"address": "Qbtut4Z8a37Mokd5uvsA54WXfBHN1Ho1Kx", "blocksMintedPenalty": 0}, + {"address": "QbuKpXJXKYkM9cypoqbg2h8ZQTzpbRfW5h", "blocksMintedPenalty": 0}, + {"address": "QbuXoHEnFZAkB2T1iC38Y1AxEe1UDy2Qs7", "blocksMintedPenalty": 0}, + {"address": "QbvzZh7AMzxK7QyheDRpHqH95Bjag11Gef", "blocksMintedPenalty": 0}, + {"address": "Qbw8zMRcP8SQzknbU8EvpkmqXbagiQghxM", "blocksMintedPenalty": 0}, + {"address": "Qbw9s8Bqzx6yi3QSLUTHXiv3VXfM2V3q5E", "blocksMintedPenalty": 0}, + {"address": "QbwdYWoqqNEZcUjPAQXzZQavaAnrnkNRc1", "blocksMintedPenalty": 0}, + {"address": "QbweffsvsfibM6cQ6mtKdk17Qndifmq15v", "blocksMintedPenalty": 0}, + {"address": "QbwiLPoZKTKMgVg1wDwjui6PSQ54PAbsEY", "blocksMintedPenalty": 0}, + {"address": "QbwjZJz4UrnFW42rPByrAkuxQQXz2bw6uK", "blocksMintedPenalty": 0}, + {"address": "QbwniiN5akKAg9FYcKTxDYemSWu5npC2Sz", "blocksMintedPenalty": 0}, + {"address": "QbxC82k8qvC1n7bLQh33xeT1kQNR1iegNU", "blocksMintedPenalty": 0}, + {"address": "QbxMHyZ8uNpNwkA9CgB1FzNmgdYWFqAXRx", "blocksMintedPenalty": 0}, + {"address": "QbxcL22t4hfDn1p5r1Z3XkuVvdHPMomT6T", "blocksMintedPenalty": 0}, + {"address": "QbxjMhHcAS6yoJhNUL3VodLT6pybaEbtPQ", "blocksMintedPenalty": 0}, + {"address": "QbyCfHFJWPQenguB9QvGEvV45ZMk2KBfVK", "blocksMintedPenalty": 0}, + {"address": "QbyoMh1Sd4P9R3JT1RQzdqKD4Z2ZoV8g78", "blocksMintedPenalty": 0}, + {"address": "QbzE5CPaHdrkiACanqpnNYwMesSmQ1mp1R", "blocksMintedPenalty": 0}, + {"address": "QbzH5T5eBqrrqZjYZ85EkMfiJHb8dybYvx", "blocksMintedPenalty": 0}, + {"address": "QbzVX1qXFPrjGA4Bu3PpWkktAaSuiLVb7k", "blocksMintedPenalty": 0}, + {"address": "QbzbbdJhRDsNWmkamHiEpgqDRwtyjXhPnC", "blocksMintedPenalty": 0}, + {"address": "Qbzkwk6n3EM6hhmZo6X5n3V3MosgD4CFPL", "blocksMintedPenalty": 0}, + {"address": "QbzyLZ83jRfa8j8TVy7JGz6p5mebd1zaKg", "blocksMintedPenalty": 0}, + {"address": "Qc15FWcEr3Mr72yqXfy9opzijLGDA8w9WL", "blocksMintedPenalty": 0}, + {"address": "Qc1QN63fmLEatW6qjZfw86owiqTNtSo6ET", "blocksMintedPenalty": 0}, + {"address": "Qc1Z54XJVDG5LaawFj8LsPQWd8shoaPFKo", "blocksMintedPenalty": 0}, + {"address": "Qc1fiKWySdPm32kUdSQvWVPUnoqcyj1aYf", "blocksMintedPenalty": 0}, + {"address": "Qc1kGS9oKbGibUoWSw8DUeAd3dRDot7AF4", "blocksMintedPenalty": 0}, + {"address": "Qc2JXiCvCpMRz49qodcVYeg8ffBW8P6Ve8", "blocksMintedPenalty": 0}, + {"address": "Qc2pZq1yhEcyTStRsCbQx6Cc1wX3Yox1yz", "blocksMintedPenalty": 0}, + {"address": "Qc2znXoq2QtvfRtaCwctNHsMLRCFFDRAcg", "blocksMintedPenalty": 0}, + {"address": "Qc2zoLsrVTTxXvTuxuCJD2oTuHu6BKU4TG", "blocksMintedPenalty": 0}, + {"address": "Qc3HHDZnRix4K1WKREzTsUQ6ZnLb9614Cz", "blocksMintedPenalty": 0}, + {"address": "Qc3JkJazJiaoXFh8at7Nsysg5TYy1uJtxF", "blocksMintedPenalty": 0}, + {"address": "Qc3VgNBfbFJynWENpXce5S4jDk2MofBdR2", "blocksMintedPenalty": 0}, + {"address": "Qc3X4BEdD1rAQahjn9pkyPprnbokpZbGW2", "blocksMintedPenalty": 0}, + {"address": "Qc49ykVb7JGoka1p3UKzcBmTpEw1446mFW", "blocksMintedPenalty": 0}, + {"address": "Qc4LEYzZy8FVtsjsjvchrCbQCWcKTAk9oo", "blocksMintedPenalty": 0}, + {"address": "Qc4LTP2WCWdWwoPuyryqzVsCE3oWw4Y9aY", "blocksMintedPenalty": 0}, + {"address": "Qc4YrXXcaUfqYYvo6AM1qR4W3qBWziUuya", "blocksMintedPenalty": 0}, + {"address": "Qc4aVQnrBvjZ41SEykxzTuQboB1rPcgcSi", "blocksMintedPenalty": 0}, + {"address": "Qc4dXBUg4Ywg8azCLawKxcjGnuTZDsvAYX", "blocksMintedPenalty": 0}, + {"address": "Qc5ve7sKhKZaa1fJVb5yWC7p72g5qaFXCK", "blocksMintedPenalty": 0}, + {"address": "Qc62HScY6vxm9iqQdV8qGy9CXmKNuRT4eJ", "blocksMintedPenalty": 0}, + {"address": "Qc6xxsXjtfxWuuJTuJ1wUqY4rJEuDSDg9D", "blocksMintedPenalty": 0}, + {"address": "Qc79T4aG3QvvhY58DRbctHEYBeYuj36nn5", "blocksMintedPenalty": 0}, + {"address": "Qc7sH4KsGZRAQa9Em6T8ZFFox1VJ5d21N2", "blocksMintedPenalty": 0}, + {"address": "Qc8L2dyTygsmbBsBwHC5ntM785t4qMtTWq", "blocksMintedPenalty": 0}, + {"address": "Qc943SQFyKdMxoVV9SM4SPVY5qFv1VRoUs", "blocksMintedPenalty": 0}, + {"address": "Qc9VKShamXTotg7CS4GnvjNMwm72eTqWjP", "blocksMintedPenalty": 0}, + {"address": "Qc9ZoiHpBD286gngHhziCQbGAzA7fguu67", "blocksMintedPenalty": 0}, + {"address": "Qc9bZo6U9DezkBrS5NFdQzjV3xpQo8Afd5", "blocksMintedPenalty": 0}, + {"address": "Qc9hu26GvEaSv4XSpFpRhgRTXxt5xL7UZd", "blocksMintedPenalty": 0}, + {"address": "Qc9jyUoPdB3Yrx6wk9daDp8E8aLEqTqJq2", "blocksMintedPenalty": 0}, + {"address": "QcA9j5tUWMruH5yFQ8qkyef3g4SBPFfdqa", "blocksMintedPenalty": 0}, + {"address": "QcAUjwM6WAkz41QbuHJLwx9TR4rWJVuncg", "blocksMintedPenalty": 0}, + {"address": "QcAnotEx63Qx7voswNvg7QtfeX2XDuWA5x", "blocksMintedPenalty": 0}, + {"address": "QcAxPbSwnbkwhq8LMEmpLkL61R2sBuHkRp", "blocksMintedPenalty": 0}, + {"address": "QcB7hifKHg7yChq2cmGQQpeFqz6MPWwtxT", "blocksMintedPenalty": 0}, + {"address": "QcBQt5Jo9Hx1Z3Z6zL21rbQcCh21aCtMrf", "blocksMintedPenalty": 0}, + {"address": "QcBhxHtMgPzxK9WvkTjf8YwdDRRUJG5fBT", "blocksMintedPenalty": 0}, + {"address": "QcC19adAPmwmCAqtjQHiN26hiPbQnZNcmj", "blocksMintedPenalty": 0}, + {"address": "QcCS4Swe7CC4GVDRJ9KS6PdXTHkBKsbQGV", "blocksMintedPenalty": 0}, + {"address": "QcDQ6pf1Zz3HY74WWvxh1bZi1PZQrD2vKw", "blocksMintedPenalty": 0}, + {"address": "QcDZUqng14H5mMVkph56dXKkTtNRJeWWLY", "blocksMintedPenalty": 0}, + {"address": "QcDeK6cryB862zYyQVt4gumUtqpdKDSGnJ", "blocksMintedPenalty": 0}, + {"address": "QcE2hS4Av3CNptBChnY9XN1LurV94royWD", "blocksMintedPenalty": 0}, + {"address": "QcE5tKuSSY5BwZq975k6AFiVHsWefRKueJ", "blocksMintedPenalty": 0}, + {"address": "QcE8pCqxNaSAktTbotkJuNTEvjENcrCPoQ", "blocksMintedPenalty": 0}, + {"address": "QcEBjcG7mHM2w3hhuecCKkTwAT3SDkc33R", "blocksMintedPenalty": 0}, + {"address": "QcET27WVaV679xBSAKPqxA7hBqYDbnQ1qA", "blocksMintedPenalty": 0}, + {"address": "QcEUkwNG77T533JSCtZiPtYwGa3gSVzRM4", "blocksMintedPenalty": 0}, + {"address": "QcEaFDsERhPpjaXc1zK1SbpxQKtobddLaw", "blocksMintedPenalty": 0}, + {"address": "QcEeM6aMuCrXp5TB1Ywwg7ues614wvSSqx", "blocksMintedPenalty": 0}, + {"address": "QcEmbJ2bC2HD2hBeH4npCXzRuMDkJWfTnM", "blocksMintedPenalty": 0}, + {"address": "QcF9n5LUEs9bx4uiUkJfhKVCxb9PH5HMAA", "blocksMintedPenalty": 0}, + {"address": "QcG5gbQDMdfsKvT4ACiPskRddGiEuJt18Q", "blocksMintedPenalty": 0}, + {"address": "QcGBZR2JWBfxefrKHjgpJjnfwj3tNEsR6y", "blocksMintedPenalty": 0}, + {"address": "QcGgHvFTnUjxnk5n2JC5geHCpyGZHZTNA7", "blocksMintedPenalty": 0}, + {"address": "QcGzEQ2eJ7PKEz5NN6G9vYFzasXWmRkV7U", "blocksMintedPenalty": 0}, + {"address": "QcH13bcNk1jWw6VykcnejPFV5qyJpTLWie", "blocksMintedPenalty": 0}, + {"address": "QcHAbRVS56BxJ351P5LpWPAeSjuZAAgfDp", "blocksMintedPenalty": 0}, + {"address": "QcHZjvDQdWwo3TtP2wxBvGNB4bmyAm8vDi", "blocksMintedPenalty": 0}, + {"address": "QcHhDSnx2je5yma4dbJR92LBqhfh1pi1Le", "blocksMintedPenalty": 0}, + {"address": "QcHwm9VTxPCKSr3hm9PDJ5ZRCHobLpsNn1", "blocksMintedPenalty": 0}, + {"address": "QcJSvgpHGaP9y4QtuhDR6Lrb42iSBTbRTS", "blocksMintedPenalty": 0}, + {"address": "QcJX37giGA1iKcxUeEJtSR45VZtHRpMBci", "blocksMintedPenalty": 0}, + {"address": "QcJbkMdM7yXJLohDyu5tBzDhQednKfUdxR", "blocksMintedPenalty": 0}, + {"address": "QcJgprHVzmZdVMav4NEabTrRi1N75JcDhD", "blocksMintedPenalty": 0}, + {"address": "QcJvBBnMKGbPBmL6Aazfp5PUGAEiBAZmf4", "blocksMintedPenalty": 0}, + {"address": "QcKDi49iTWBa4nE1QqU7eGXaXYjgnrwBE2", "blocksMintedPenalty": 0}, + {"address": "QcKMRd52VET8FvT7N6LwqppXEd6gZo9da4", "blocksMintedPenalty": 0}, + {"address": "QcKZriDfGU27ag7SgvSihCdqwZ3TQrjTCp", "blocksMintedPenalty": 0}, + {"address": "QcKthLeqTWhL3rG2zpHdeKgqoGCb3FkZas", "blocksMintedPenalty": 0}, + {"address": "QcLqxs5QRYXGp3u9zzTseUQLcwCbi6U9dS", "blocksMintedPenalty": 0}, + {"address": "QcLzGBVnzSV2hoAfq1psiJHa5ntL9aVDi2", "blocksMintedPenalty": 0}, + {"address": "QcMDJjDukVQRAX49kpESokKWtCadcTBZgX", "blocksMintedPenalty": 0}, + {"address": "QcMDT5uR23HUZ97yaTW1rCF2sLFaaQAWFr", "blocksMintedPenalty": 0}, + {"address": "QcMMznMG6ugRMRn1CNedG2p5xNpjwyNuC3", "blocksMintedPenalty": 0}, + {"address": "QcMfdeEhf1z4uhpbkgfSzPUk22cCJ5V6XE", "blocksMintedPenalty": 0}, + {"address": "QcMoU5qzwaJ9j9n3TsfvqEsij1QkZCKH8P", "blocksMintedPenalty": 0}, + {"address": "QcN5X1iHC3Egrvo4seQ1Rhk4AnArHij4rU", "blocksMintedPenalty": 0}, + {"address": "QcNE1hth9Rw39DG7riWn4JkK2EECFcyVYL", "blocksMintedPenalty": 0}, + {"address": "QcNNFDYGLC3pv9ocBL57ejds4fkwG3rh64", "blocksMintedPenalty": 0}, + {"address": "QcNebhBnFqfXR5rj7t2vLYDfGESeWne9iE", "blocksMintedPenalty": 0}, + {"address": "QcNyuekPFuebtiZRmjzH5LjLjqg2jaVnuH", "blocksMintedPenalty": 0}, + {"address": "QcP8FT2oMbYc9XTrvtLmpFb9pWoPbj5G9c", "blocksMintedPenalty": 0}, + {"address": "QcPw7WLrobSReK7dMGZziCpouC9Pcm95cv", "blocksMintedPenalty": 0}, + {"address": "QcREWbv6khtNsWBxHa2ALKumCnnnukPhxw", "blocksMintedPenalty": 0}, + {"address": "QcRQ6XU6Kq4nVV5XeVDKKErN72TbS9rGPC", "blocksMintedPenalty": 0}, + {"address": "QcRQGxVeXbEa4j7X1JiKQYwoFecCoGrzhh", "blocksMintedPenalty": 0}, + {"address": "QcRfZKXjoJrEPMiBw76LjvgpBwKvjJQRcC", "blocksMintedPenalty": 0}, + {"address": "QcS1exmw9b3rjjFkUDhsmTSsMzZV1NExKC", "blocksMintedPenalty": 0}, + {"address": "QcT1EG823qo4uv3D6o792ji32ociJF6Pt3", "blocksMintedPenalty": 0}, + {"address": "QcTWQJPtbx3Qrz3QMkZSPcPwuTCJLo1HHP", "blocksMintedPenalty": 0}, + {"address": "QcTu32LfNMqokcRJdX4kkb7b7HBqyRXNSF", "blocksMintedPenalty": 0}, + {"address": "QcU2gj4TSp1VeP6X5PA6dkejEqCvjbyEhh", "blocksMintedPenalty": 0}, + {"address": "QcUMYZDE8qApfSCk8TxqGW6aKmrXbxPqLW", "blocksMintedPenalty": 0}, + {"address": "QcUWRGXxS8WUj9z7rihZqM2kj8vbbHb1A2", "blocksMintedPenalty": 0}, + {"address": "QcUmnMTdsa5YQLCauovXd7NSiiPVfNyfxx", "blocksMintedPenalty": 0}, + {"address": "QcUzD9gwi8wWLiUV4bHXi9os5xnaZedUXr", "blocksMintedPenalty": 0}, + {"address": "QcV4VhzdpqN5DVBNqs4LTs4h5R2b3bH7SU", "blocksMintedPenalty": 0}, + {"address": "QcVEzxK3kgkytFFeehj5YTetTC2RHLzYNE", "blocksMintedPenalty": 0}, + {"address": "QcVVSy6jTfbery9CyuogyVsMdz9BJQYuNo", "blocksMintedPenalty": 0}, + {"address": "QcVyfJqErxzg7vLhiygXuWohL12EimZhTd", "blocksMintedPenalty": 0}, + {"address": "QcWAZbWiiKANYaDZKkf2qjCfBmHiNRRqFy", "blocksMintedPenalty": 0}, + {"address": "QcWHgfFSWKvSskhmfvXAfgbxncQZcSE8nU", "blocksMintedPenalty": 0}, + {"address": "QcWPvXd6Bf9shMVBiAc2Dd5kYdTMPRPemn", "blocksMintedPenalty": 0}, + {"address": "QcWa7riNYT6d8rEVoZ2vzNkTbSvKJxwW5R", "blocksMintedPenalty": 0}, + {"address": "QcWerQFZXYiF23hKvarHFA4BGaut4X7EC3", "blocksMintedPenalty": 0}, + {"address": "QcWknnNETm7Ye3uYcVuHEEh2rtNkDTPLcg", "blocksMintedPenalty": 0}, + {"address": "QcWwfdzHYm2QGRnPGeRkpcvuWfdtj4dQJe", "blocksMintedPenalty": 0}, + {"address": "QcXH7tjf5LHSbQBHtXY5PFu78xS1GJAUbR", "blocksMintedPenalty": 0}, + {"address": "QcXRR5BhYdvjkSQZuRzz8RNNCz8mVETqyg", "blocksMintedPenalty": 0}, + {"address": "QcXZECRR1bEXoHKJD95L413TLGyknCzY8x", "blocksMintedPenalty": 0}, + {"address": "QcXfuQmRZ6u3A3GZKTWrvxUWZr2zvjEqnN", "blocksMintedPenalty": 0}, + {"address": "QcZGUCKeX1d1ApGJMTWM4ahayLdnwbFTBy", "blocksMintedPenalty": 0}, + {"address": "QcZJ2B5RpAs2vu7hbEDwDRrDZ98kD8v5WQ", "blocksMintedPenalty": 0}, + {"address": "QcZyiw4Y5fs6vSSLwkAZNjcXxWnNEiXX3Y", "blocksMintedPenalty": 0}, + {"address": "QcaG2Luwv2RZTYsJhUjv8Beoa715658dfJ", "blocksMintedPenalty": 0}, + {"address": "QcaL6m9Hkck2u1DFs74Fkk6dykHjWxJf6T", "blocksMintedPenalty": 0}, + {"address": "Qcbk5owEYvzKW24S2au215mfKiRt4MhYiG", "blocksMintedPenalty": 0}, + {"address": "QcbkWSKQ7zudr7J3WRSJ2X3YvT4s8jTAGW", "blocksMintedPenalty": 0}, + {"address": "Qcbp3fUZPwsesBPJnf7GPnnK6iL3i3L5eM", "blocksMintedPenalty": 0}, + {"address": "QcbspAV9yts6pRLHxsnfszzsqDR7nw3kRR", "blocksMintedPenalty": 0}, + {"address": "QccuVR1LQZXqB8aLhR9Jmx2KPWuKZ2XMDm", "blocksMintedPenalty": 0}, + {"address": "Qcd14decwfSpDz2TuKSAeRyF1mgvpoQK3J", "blocksMintedPenalty": 0}, + {"address": "Qcd2tgajF7QLeMRdHFUtFr3N8niTU5SJif", "blocksMintedPenalty": 0}, + {"address": "Qcd86xojLYq28LSfxMkwrcKAXirccKWsCh", "blocksMintedPenalty": 0}, + {"address": "QcdUn4HZyLGfhb2y6HiAMDMaAPdv9ydsYq", "blocksMintedPenalty": 0}, + {"address": "QcdXWiXrKwWAJuXQx4vePs3XqzvzNCcxAe", "blocksMintedPenalty": 0}, + {"address": "Qcde84DQjFMFQhY1UumtKUKRybrxxc2TjX", "blocksMintedPenalty": 0}, + {"address": "QcdjC4Jv9iuJqCYAZRsZ7bHS1oMV9EgeQC", "blocksMintedPenalty": 0}, + {"address": "Qcdoy8hpiUrJZXd3djTWfvTYiq9gYeXkoR", "blocksMintedPenalty": 0}, + {"address": "Qce3hsTR6GFJEcUGUeAMFKBGDxYkGyR94v", "blocksMintedPenalty": 0}, + {"address": "QceBR26svMFUAE4g7hXbim42jVdU2t8wb7", "blocksMintedPenalty": 0}, + {"address": "Qcef3zQjNxwhF7MCMNL4SusT3cqMq6inRb", "blocksMintedPenalty": 0}, + {"address": "QcegnMjEBeVS2yMviEKyzNciVXBAoy9aXb", "blocksMintedPenalty": 0}, + {"address": "Qcf3H97BJfiaw4yWZxQToFSsXzngfNH3J9", "blocksMintedPenalty": 0}, + {"address": "QcfLJcyap9c7BAsniE3prawaH2uLa68YDw", "blocksMintedPenalty": 0}, + {"address": "QcfLzRyLGyua9dPSYLbEGo3r1Wgn7CZfH9", "blocksMintedPenalty": 0}, + {"address": "QcfU4DXcZsQnmnNzSiodfpodVXMmoBw3GY", "blocksMintedPenalty": 0}, + {"address": "Qcfs23epurw5yZmaajU5CNKqgQwhzT85pr", "blocksMintedPenalty": 0}, + {"address": "QcgQk3exXAK8gAirY3TuzgbQPLf1guuJU2", "blocksMintedPenalty": 0}, + {"address": "Qcgcn98dodMQCH6K3xbLgDxUD87xMLnf9B", "blocksMintedPenalty": 0}, + {"address": "QcgjwuUQuNMRsmT1PZDNR1K8kSGfKkqLTg", "blocksMintedPenalty": 0}, + {"address": "QcgqWhPnPAbJgA37QpDdFdZtCU1J1sp19S", "blocksMintedPenalty": 0}, + {"address": "Qch31bMbMkfkbJf2ZA9hH1Bo5wXFAGUvcL", "blocksMintedPenalty": 0}, + {"address": "Qch7DnsGwvagksuBxSNzm9KeAotrqstYzG", "blocksMintedPenalty": 0}, + {"address": "QchEqu1iquD5ti4B7R8uCcrBo7XSm9A8rH", "blocksMintedPenalty": 0}, + {"address": "Qchg38svhvcyLg1mGCCYe9qc2r1bnvTCsn", "blocksMintedPenalty": 0}, + {"address": "QchmArm18R1RFMBkw3qSF38qSa1XWV3MFF", "blocksMintedPenalty": 0}, + {"address": "QchtVQ2gj6EEeMhB4c6zsVvxZi5KZiHmyC", "blocksMintedPenalty": 0}, + {"address": "QciHT7tdCHT5iAZHvwspJqCP4ZjuxWsnum", "blocksMintedPenalty": 0}, + {"address": "QciMRqYcnZrvyoQPLUUf7P4GtnrW63Kn7U", "blocksMintedPenalty": 0}, + {"address": "QciV8JtUycuFuxRgHN9SozrpVLfQgykodB", "blocksMintedPenalty": 0}, + {"address": "QciVctR4wQVL2YfJoYBJNSz3AuSNJe9Wsm", "blocksMintedPenalty": 0}, + {"address": "QcikvS4nkuDxKu2SNWzQuPYL9Vq7vvr6w3", "blocksMintedPenalty": 0}, + {"address": "QcjCoiYA24KMk9RWyhKFbgKaPH2cUrFTGz", "blocksMintedPenalty": 0}, + {"address": "QcjKn5V4EvN6J2k7yFSr6DbsVPSVvgSqWU", "blocksMintedPenalty": 0}, + {"address": "QckPy42u9DC4gjxz7LkJLjziKMEW3cCjjN", "blocksMintedPenalty": 0}, + {"address": "QckyAHQXEwGM8UxT6oMUJNLqWEgneqswNg", "blocksMintedPenalty": 0}, + {"address": "Qcm9BLjFHTnvydCcY4bas5zDjYz3ZZDEDB", "blocksMintedPenalty": 0}, + {"address": "QcmDcgx7CxCrdPp1f6UDAycKhTo5awyr56", "blocksMintedPenalty": 0}, + {"address": "QcmEdKKSUio7HFfhGRDh5TMzAMKaFaKN3m", "blocksMintedPenalty": 0}, + {"address": "QcmVacrsVeXJ1rLWnhzdB8aFZzzRkMyMdC", "blocksMintedPenalty": 0}, + {"address": "Qcn8xDewqryxmawDt6wdLYwsSNJipzCaFQ", "blocksMintedPenalty": 0}, + {"address": "QcnMg4muXJ8HhD56zGdQbWnmDjHfPEDcsi", "blocksMintedPenalty": 0}, + {"address": "QcnRiRHaj22kmjy97UKBNX3QrwyDGfBcGr", "blocksMintedPenalty": 0}, + {"address": "QcnqmWkG5hodiNS6tVaGWeZmb5Rad13PmU", "blocksMintedPenalty": 0}, + {"address": "QcoPff5GWpLJDXWuMunZXuqwG4nTJ2Y1gB", "blocksMintedPenalty": 0}, + {"address": "QcoV9G6XtbCfxejV9uZt7Ba6EgMCGbpUR6", "blocksMintedPenalty": 0}, + {"address": "QcoXDLmxmsctunBERkarLPAeaQ3r8dn7jW", "blocksMintedPenalty": 0}, + {"address": "QcoqgfE81xpcxcy2qhZv9wBmqsDtWNb1he", "blocksMintedPenalty": 0}, + {"address": "QcpCohRBLyuGaajw1LyVjgqt9o28BSBRpF", "blocksMintedPenalty": 0}, + {"address": "QcpD3NpF99ufDTYLSz5GKYumacegoRkF72", "blocksMintedPenalty": 0}, + {"address": "QcpUahNUdLoFLqMcrkvNnui1RdGLvkgk2X", "blocksMintedPenalty": 0}, + {"address": "QcqNTQVhC76vHgWK4yXY7cfqDibH4AdvR4", "blocksMintedPenalty": 0}, + {"address": "QcqagayNQnFcH6kg6LEHtJQhYcNmFnTcFx", "blocksMintedPenalty": 0}, + {"address": "QcqqKs4JxxBq7WMRadow4b8Kx4USCnvJ1b", "blocksMintedPenalty": 0}, + {"address": "QcrFCc6rBYDUQHbMQ2NVDNqT11GgYm6koK", "blocksMintedPenalty": 0}, + {"address": "QcrpSLu37BAqP8diZXeFW1Ym8VfFftc2oC", "blocksMintedPenalty": 0}, + {"address": "QcrxLLs4VvixEVLrNGNP9rp7YyjTtagHVj", "blocksMintedPenalty": 0}, + {"address": "QcsG7hBfApFmjRspMpg6Rz2hgAbTPkBdMV", "blocksMintedPenalty": 0}, + {"address": "QcsKSUm92pQzYcyjmjAT17ustTkr9rr37J", "blocksMintedPenalty": 0}, + {"address": "QcsRq3oXv7Ce2P3tfAjFUSPU86dFeTeKMX", "blocksMintedPenalty": 0}, + {"address": "QcshHW9NbkTAUx9nG1MUrs7QFYEvp3mLGh", "blocksMintedPenalty": 0}, + {"address": "Qcsiep3EJWatqQyX2q6GLQ4qmQ6VtBh5mE", "blocksMintedPenalty": 0}, + {"address": "QcssPrPTxznsy3V9Zv559MohBiNmYhH9yq", "blocksMintedPenalty": 0}, + {"address": "Qct1YA5BmUByN1Xd3XevHPkkCKjYTQuroV", "blocksMintedPenalty": 0}, + {"address": "Qctfwsjr8UoNx1BRskU99hVjRHW7zD5vni", "blocksMintedPenalty": 0}, + {"address": "Qcu97Nqrt4NNw1uSZLsKU5X9tsWM2vKaGV", "blocksMintedPenalty": 0}, + {"address": "QcuN7yFhT5jKTUqSCZvx6ywBzWqhzqeUBc", "blocksMintedPenalty": 0}, + {"address": "QcujiWRg18LLLrbYrZuwHezEj85jFRvyB1", "blocksMintedPenalty": 0}, + {"address": "QcvAJSUWR8PdGqkeiyt387FL8dxQQdp8xe", "blocksMintedPenalty": 0}, + {"address": "QcwBhDE8fBJ9ksJNV6Y7in6Ez5iLpAiRPY", "blocksMintedPenalty": 0}, + {"address": "QcwiGuj51FiwNrH7auMdabPf95cyU9RDEp", "blocksMintedPenalty": 0}, + {"address": "Qcwvt4FPV1k4m3QFYNAmPwz1B1dYXNuP7T", "blocksMintedPenalty": 0}, + {"address": "QcxD9MHruNRkgFEdTcMweKk1AfkkmdimWU", "blocksMintedPenalty": 0}, + {"address": "QcxWpJJqz1z8Yeb5kRtsDGGwVu3AjS9FsL", "blocksMintedPenalty": 0}, + {"address": "QcxgKG8e7DwyBaTQ8XU2zjgv9vAUBRYQ4i", "blocksMintedPenalty": 0}, + {"address": "QcxoWUYp3EAKsEqF4iywEGir5P87LUgWn4", "blocksMintedPenalty": 0}, + {"address": "QcxtHsdS3L9XRDyrU1TKSufQCzc6E6NZiv", "blocksMintedPenalty": 0}, + {"address": "Qcxuwawy3rf6sBCbA3e2Gc3LNkaGCzGFbp", "blocksMintedPenalty": 0}, + {"address": "Qcy3SUxAhkmQ6FrUj9SpHoSgKMVmCwnBZU", "blocksMintedPenalty": 0}, + {"address": "Qcy4guGVyonLoGvG7XN1vD6zTjnAGcjqDR", "blocksMintedPenalty": 0}, + {"address": "QcyECMVaTU4ykboqaEcEAzSUMHRW8PwsgU", "blocksMintedPenalty": 0}, + {"address": "QcyGkvFC1EVxPTfW36WJddgobrVxv8jjZM", "blocksMintedPenalty": 0}, + {"address": "QcybTpWTJijDmNy7Vhm5xYp3Utp3e34v1B", "blocksMintedPenalty": 0}, + {"address": "Qcym32pmfiuyTTtDqtXyj7dBdi6XBswxdK", "blocksMintedPenalty": 0}, + {"address": "QcynXfV3CtNfvxZ83MPwZhj6xXLMyPrUUt", "blocksMintedPenalty": 0}, + {"address": "Qcz8RqoK8s9vy2CbDy13pBbyfzfSnC9F4B", "blocksMintedPenalty": 0}, + {"address": "Qcz8SXbBTJMyKK7i3mZpmZH198f6bg3pY4", "blocksMintedPenalty": 0}, + {"address": "QczoKfVcN2XYL5hxXRMXxtHjtR7S9W3J7K", "blocksMintedPenalty": 0}, + {"address": "Qczvb8b1v5cFSJAnapHNuzxxwvRgtRREsW", "blocksMintedPenalty": 0}, + {"address": "Qd1HH1EJ558fVFcMD9J5i2StTSCLXktZkm", "blocksMintedPenalty": 0}, + {"address": "Qd1U7qW8xURWBt4AGVQv6whug3UGDyA6tj", "blocksMintedPenalty": 0}, + {"address": "Qd1WcaFLj66ukqfzBeSB1TZjhRpL28mdUL", "blocksMintedPenalty": 0}, + {"address": "Qd1qVuFpEAiiF5CXiSQ7yFy7CB3dQTBqRE", "blocksMintedPenalty": 0}, + {"address": "Qd23cHAoNNWfxDjhhvVHooSyTxArn5hnT7", "blocksMintedPenalty": 0}, + {"address": "Qd2MBEnF41yxLRqi8wvDgYmb8qqEoVChBR", "blocksMintedPenalty": 0}, + {"address": "Qd2Wsi61uDYWDQBmPnnDBajWDeHj6peZ2n", "blocksMintedPenalty": 0}, + {"address": "Qd2mLJFuXfRRoG2tbCHXf4dU5ssjXWdPL1", "blocksMintedPenalty": 0}, + {"address": "Qd2yQPdAgxJUnFXBUhD5TnnpmvLEqTy3cL", "blocksMintedPenalty": 0}, + {"address": "Qd34NSjYUwk4czbNCPwKhe6tJ38KneNYn4", "blocksMintedPenalty": 0}, + {"address": "Qd3JRtvALHH2iNfKpGMFgVt44qmpfRtHk8", "blocksMintedPenalty": 0}, + {"address": "Qd3WEyA34h5DazvwvRiATcRbM92r9iCPuw", "blocksMintedPenalty": 0}, + {"address": "Qd3Y5QxfiieByNe45Hbnho4e1BwEeLVzhq", "blocksMintedPenalty": 0}, + {"address": "Qd3ZyyccemHtGRN9dHvgqT55ABKFyvRL5W", "blocksMintedPenalty": 0}, + {"address": "Qd3zis4NQsU1cMgAaq4wsA6n6FqL9EQwm4", "blocksMintedPenalty": 0}, + {"address": "Qd44FCAgJCcwhUywPXopQ8CSwHPjF2bHzZ", "blocksMintedPenalty": 0}, + {"address": "Qd474mK5s7fUYMA1DxJWZSQQsbSq6maeug", "blocksMintedPenalty": 0}, + {"address": "Qd4LEcYaKTLFr4jw1RwSVef6SP8L6djsJf", "blocksMintedPenalty": 0}, + {"address": "Qd5Mi5q1yNrvMFQ3XYbjy2kJnF8KHTkjEc", "blocksMintedPenalty": 0}, + {"address": "Qd5RF1NTuto8FuynQUL6qfTV2T9QjqcuNY", "blocksMintedPenalty": 0}, + {"address": "Qd6v5v89xv66MUxGbEDVXt5da4jCjv7JJf", "blocksMintedPenalty": 0}, + {"address": "Qd7FQPpwFNg8pFi1vT2bx72BK7sjAP2qEP", "blocksMintedPenalty": 0}, + {"address": "Qd7caxrAxPFYND2MDgJkhqTuMUv6HDpU5P", "blocksMintedPenalty": 0}, + {"address": "Qd7d1Ak6EXo3bpZy2nnGLC5AkZL8rnRQ2H", "blocksMintedPenalty": 0}, + {"address": "Qd7eMhKGqVcLwLHJBBNZsB6WNzehSYofWQ", "blocksMintedPenalty": 0}, + {"address": "Qd85RL7kkhHNkm9Hvo2wM2Q5J9Qh8Degqc", "blocksMintedPenalty": 0}, + {"address": "Qd8Mws1gVhSnwsFvF1qxehcRpn4ystY29A", "blocksMintedPenalty": 0}, + {"address": "Qd8SgwgTHvMUXLRb1VRFL128tzFdQ5MKsW", "blocksMintedPenalty": 0}, + {"address": "Qd8WLb5erTTqqzdx6VPrvjftaAADFApc2U", "blocksMintedPenalty": 0}, + {"address": "Qd8eKkfhPzfa9gP8bLfCSeH9oif9xmGj1k", "blocksMintedPenalty": 0}, + {"address": "Qd8sQdcaMatxKNLvEt8EoDCskY9G1ukM44", "blocksMintedPenalty": 0}, + {"address": "Qd9NvfAyFVho15wwjUctM9Qds2LzPaaCE3", "blocksMintedPenalty": 0}, + {"address": "Qd9T4yoVVpCietdH5M4Q6AvNKrC3Yn9Mq6", "blocksMintedPenalty": 0}, + {"address": "QdAQJ7brQV5NthHLTFtTApEsJbSZZm7pMP", "blocksMintedPenalty": 0}, + {"address": "QdAU9Z3n1DTTnVWXqRizpy72TPeGgLZihL", "blocksMintedPenalty": 0}, + {"address": "QdB9XECYVoWHCbMJG2e3LbbHEj6pe42HXM", "blocksMintedPenalty": 0}, + {"address": "QdBFoMiGy3hg7uBvD9x9CM5VQKuX397gaB", "blocksMintedPenalty": 0}, + {"address": "QdBcL3vSXikRjFZXDezGtQayiSe3NrxGqv", "blocksMintedPenalty": 0}, + {"address": "QdCE8Aiwr1aj4bCo2BaYMMUQEVmjFuvz41", "blocksMintedPenalty": 0}, + {"address": "QdCFiWx5SNzcHxwQNkerta43pXhkeWiDr6", "blocksMintedPenalty": 0}, + {"address": "QdCRrW4grDwizUEeVRVFEYXJfstbuoHUR4", "blocksMintedPenalty": 0}, + {"address": "QdCZ3h6uLQ2W46sgmytdeLXghyYsXKfU5j", "blocksMintedPenalty": 0}, + {"address": "QdD5ff2285NdKpRyjGadW5kLHdLznPtnRq", "blocksMintedPenalty": 0}, + {"address": "QdDKmFomSNjxtHzwBjQF9P381jzcwhFsEj", "blocksMintedPenalty": 0}, + {"address": "QdE1eHuPxCvKzKLE5uyBRdsx4d2ATZqszm", "blocksMintedPenalty": 0}, + {"address": "QdE4akyPuxVhxe5VQcF42TdvK8NhEcepf6", "blocksMintedPenalty": 0}, + {"address": "QdEWxrYT9a6CfkmgEjdtvwtY2GvRdHqRYZ", "blocksMintedPenalty": 0}, + {"address": "QdEj8sWwVC6euChgWZF6RTewLXfEzY4xh8", "blocksMintedPenalty": 0}, + {"address": "QdEm7oKBcsxJmfPuVYpjAWXDUMHCre3RmR", "blocksMintedPenalty": 0}, + {"address": "QdEniXLp2DkEeKu3q4mnxyZerXgmFVG8vb", "blocksMintedPenalty": 0}, + {"address": "QdEpmoh34MTTZ4BJzFoGCY5cVHYszjwBma", "blocksMintedPenalty": 0}, + {"address": "QdEuwGyWm8SGSkuC1CV6tPubNf6t9abxer", "blocksMintedPenalty": 0}, + {"address": "QdFNQYy6u9uTaF2vXb6zN1HgnVSbqtjmcJ", "blocksMintedPenalty": 0}, + {"address": "QdFSMGKMsE9hhmMoQRHGxSb7p7sDabVFsp", "blocksMintedPenalty": 0}, + {"address": "QdFjYrwdYksaxUCgAmFHd9AyM231fhYz65", "blocksMintedPenalty": 0}, + {"address": "QdFtkvDtDVdXpeZ8MsrBBNS6YaqEgXxsWD", "blocksMintedPenalty": 0}, + {"address": "QdG9VJrfUTNsRL684xhLrk3hUvVedJDYhy", "blocksMintedPenalty": 0}, + {"address": "QdGeAucUZxJu2DXWHft8bCfwUtP2DX46Hk", "blocksMintedPenalty": 0}, + {"address": "QdHc49iRMiCaanZfD8kGiTZaZxJneDTU7j", "blocksMintedPenalty": 0}, + {"address": "QdHrGjFBNiLtvyv5Gvkni56dgQgRZ11Qis", "blocksMintedPenalty": 0}, + {"address": "QdHtGhGtcY84oKLpWUiqcNnNS3a5c5Csq8", "blocksMintedPenalty": 0}, + {"address": "QdJezy7mCokKwFwq8Px2FWVaeWeXv4Z4aV", "blocksMintedPenalty": 0}, + {"address": "QdJqzEorFH8VUtEshjxMj6Eq84bQxqGCvT", "blocksMintedPenalty": 0}, + {"address": "QdK9LcvzYJ43x6hoYRbaRwhCWsHSzbosNy", "blocksMintedPenalty": 0}, + {"address": "QdL5YSPb7jnTbAZoC7rxH792zy4ZSt48uy", "blocksMintedPenalty": 0}, + {"address": "QdLFGiFNKuaRCr3Yiunbia3gM8Ps7Z2Bf3", "blocksMintedPenalty": 0}, + {"address": "QdLxHM6HkHEQ7HDhsLXkjsdLj7yrixa4de", "blocksMintedPenalty": 0}, + {"address": "QdM5gXn1cYaRq1eUXY8uJ4cWXTJyxiey5Z", "blocksMintedPenalty": 0}, + {"address": "QdMRuy5FrAibzcBcdCM9Nh5greYbPVRgWz", "blocksMintedPenalty": 0}, + {"address": "QdMVf8EeZd14Avgy1e7v45DntnkLSc7wW7", "blocksMintedPenalty": 0}, + {"address": "QdN4aZRmM3o7Lzh9RSQBjWzKdfHHp8U72J", "blocksMintedPenalty": 0}, + {"address": "QdNAqb9dZhQpnLiLpF5HDNTe9QnDBqHa5X", "blocksMintedPenalty": 0}, + {"address": "QdNbnHEMhU9dQbdQmjDzoBNEbMBZhMxb8L", "blocksMintedPenalty": 0}, + {"address": "QdP6rQLDa8AGVm4R9H9qos8o8zpR8eZoA2", "blocksMintedPenalty": 0}, + {"address": "QdPKzZwbzwFgmSanWRE2Kdmiz7U2iGdDHM", "blocksMintedPenalty": 0}, + {"address": "QdPNHYPpu6s8YccVfTPqNuoPdyCDYLJ9K9", "blocksMintedPenalty": 0}, + {"address": "QdPZmoRmi7udbXgUqVN7BUURS8b3JJ9HqM", "blocksMintedPenalty": 0}, + {"address": "QdPf5Xo9PQ4hnhFdkmF5xQXHVDVqaAWBuC", "blocksMintedPenalty": 0}, + {"address": "QdPnRERVyEEwAkWuL8Br4dFdSQEZtYZToB", "blocksMintedPenalty": 0}, + {"address": "QdPsM1hgsrQf5LTr4HFKWYoxxQGwR2NM5p", "blocksMintedPenalty": 0}, + {"address": "QdPvKfHnSHjymQcQpYncxsn49FNJnN7jVG", "blocksMintedPenalty": 0}, + {"address": "QdQ4d3mtHs4ed75eiCA7x2M7LWFCup2bWF", "blocksMintedPenalty": 0}, + {"address": "QdQC5mC3mw2WFydYqAPFUFAZpCdW1Y6Zxh", "blocksMintedPenalty": 0}, + {"address": "QdQT3RCsn8gdBs1A5XKTLzuAxKu8LAvYSw", "blocksMintedPenalty": 0}, + {"address": "QdQa5PgH3xin8UoUM5EFPPorLByqGBHk4b", "blocksMintedPenalty": 0}, + {"address": "QdQb21rZaTtKpXHHfXh3pir2tBe2eDBUtx", "blocksMintedPenalty": 0}, + {"address": "QdQukyZuy5AodBBhYrHBdZknxcBUGVfyKe", "blocksMintedPenalty": 0}, + {"address": "QdQvKaM9HS5r4UUDb7qN44XPvTDEdXHVro", "blocksMintedPenalty": 0}, + {"address": "QdRA6qHQNVqZEuMzesDqB1J44FPtgonTLQ", "blocksMintedPenalty": 0}, + {"address": "QdRH7tr77Sib9Bzh5KrPSPUncj3SinVcAT", "blocksMintedPenalty": 0}, + {"address": "QdRMYB7aBBFNR3s8zFTBTaqbcPd6cZTFpZ", "blocksMintedPenalty": 0}, + {"address": "QdRPNFNdMVWhipksPzQT6vKv9ZvK5ujxef", "blocksMintedPenalty": 0}, + {"address": "QdRVXog7SzbNQq8bKmHF5bkubc58stXpXu", "blocksMintedPenalty": 0}, + {"address": "QdRsCe6EsswGPnY1iakF26tg3AYi6eUPeF", "blocksMintedPenalty": 0}, + {"address": "QdS9dc8GFHna6rnfU5Dj6XxM4Rcn9siZYn", "blocksMintedPenalty": 0}, + {"address": "QdSHgoRVkJsxDpUAAStQqx17hN8ULzpctN", "blocksMintedPenalty": 0}, + {"address": "QdSUHxPbHtwrZSYvD9yb3vQRP5zWGMJXyR", "blocksMintedPenalty": 0}, + {"address": "QdSWGzwyEbUmojE7ZTEvqG5iR6mMUghhoB", "blocksMintedPenalty": 0}, + {"address": "QdT3xKwUP22U85pScY1BnjSJY5JbEdiuLF", "blocksMintedPenalty": 0}, + {"address": "QdTfQFQa28N9rMFTvego5x7fSyK3a4ETrJ", "blocksMintedPenalty": 0}, + {"address": "QdTmFtWY3v5ekKL5hxTRd5Haa34PY38rYQ", "blocksMintedPenalty": 0}, + {"address": "QdU3Sgd2ptjzry3XQc8D4wAZ5C7uBi3wSG", "blocksMintedPenalty": 0}, + {"address": "QdUN2H5Lt3gCbkKxcxuucQffDyozTB4QrL", "blocksMintedPenalty": 0}, + {"address": "QdUvkUHW2AvEdqb61yNMVk5tZVtyRCbddX", "blocksMintedPenalty": 0}, + {"address": "QdUvqVU4STEhBPDMV4BgGwqZZouBXp4CXs", "blocksMintedPenalty": 0}, + {"address": "QdVcyw4HGvyr9Z2aJxsJEzE2BddeVU9LUQ", "blocksMintedPenalty": 0}, + {"address": "QdVgqEeSEVaB4wb5ZD9rjhYPtrDqdwyzZd", "blocksMintedPenalty": 0}, + {"address": "QdVkw5cid2rnMPxFXb3XnpsTwGhypSLCWb", "blocksMintedPenalty": 0}, + {"address": "QdWKTnRdnRBfc2uGvdA7qMR7bevowq4HSX", "blocksMintedPenalty": 0}, + {"address": "QdWduqrZTVGpdFHB61pFHgZUF1Xuj19hvq", "blocksMintedPenalty": 0}, + {"address": "QdWeUAk7EwtAWhvo1KY66FwjWF6Fh3HoWH", "blocksMintedPenalty": 0}, + {"address": "QdXFRfdzbQZ2te9gASz7937G47BxxZYn5w", "blocksMintedPenalty": 0}, + {"address": "QdY1aWFMAg9fQ1UezdvzKx1rFdLz71cBPy", "blocksMintedPenalty": 0}, + {"address": "QdYFD6BedZ2rY6ucjXGXXtEnqqwVnQP3dG", "blocksMintedPenalty": 0}, + {"address": "QdYJcsdGLnyEF6koN19WdHdTFa81p4dtjs", "blocksMintedPenalty": 0}, + {"address": "QdYTz1vdTrByTfHGv8r4am1d9MHusazMfP", "blocksMintedPenalty": 0}, + {"address": "QdYinBHaCPNLzSaPRvEU4yWKNGBeJvb96C", "blocksMintedPenalty": 0}, + {"address": "QdZE26NN9cWpsG3BsyZ712ucyczJ5p2rtp", "blocksMintedPenalty": 0}, + {"address": "QdZFhcqV65ySD8XRN7PQMaLdxv6TM2cWCx", "blocksMintedPenalty": 0}, + {"address": "QdZNjFztdRk52Vdv9SDibTqWBAn9aGY1cM", "blocksMintedPenalty": 0}, + {"address": "QdZgscwqB8pVDx1hsjB41MKEbfHVBmo3Cj", "blocksMintedPenalty": 0}, + {"address": "QdaPAeoCQdUxxRrR7AweyUFn3BfdUs2CYJ", "blocksMintedPenalty": 0}, + {"address": "QdanjsNV7nejFP4QS4iDNgFgb4Zwa1qQ6S", "blocksMintedPenalty": 0}, + {"address": "Qdb1CVNUKwmQxSVnKKGfMJQ1pGdPoRvP44", "blocksMintedPenalty": 0}, + {"address": "Qdb5HuRgtptarotgrGc4vQLWnyi9muAWof", "blocksMintedPenalty": 0}, + {"address": "QdbQ8Dw8xM5sLEoxne4sJ3JvT426hScSEt", "blocksMintedPenalty": 0}, + {"address": "QdbaUAJEiJfy5NMQxgLazYa5MZoNJ7zntK", "blocksMintedPenalty": 0}, + {"address": "QdbwspwZmGNi2T1vzkvF7VCyDvT1YHizsm", "blocksMintedPenalty": 0}, + {"address": "Qdc15t7bRktNprs2dh72NHF8sTKQ6eE8Sf", "blocksMintedPenalty": 0}, + {"address": "QdcRtFHLzq1MrYp8gRdx28d6AWBkNHWDWJ", "blocksMintedPenalty": 0}, + {"address": "QdcZh8j6isZYQJYhWwxKiX5xMj5jCaNpiu", "blocksMintedPenalty": 0}, + {"address": "QddEByceFUByiqxmvmksgL4cJnxH5z5D1q", "blocksMintedPenalty": 0}, + {"address": "QddeyP5AbzfswY2LTgGLuSqEdBDLQ4uJou", "blocksMintedPenalty": 0}, + {"address": "Qddmp7EVyhPxBooLJJeWNx9ChuAvNdY9pU", "blocksMintedPenalty": 0}, + {"address": "Qddrq4msygAxs7bqeUyFkHu4RLT4eqRvHW", "blocksMintedPenalty": 0}, + {"address": "Qddt8zMq5TLJTMXLcu4S63AYPL18fhYN1c", "blocksMintedPenalty": 0}, + {"address": "QdeRSt63gD8vncJ3xFqJtiKuLTNpY9XU9w", "blocksMintedPenalty": 0}, + {"address": "Qdeh7ZJ8WV7L2B3UqWUt3X1HyrvY6uwJX2", "blocksMintedPenalty": 0}, + {"address": "Qdf9gU1SJZwt8cuiAx4coiGKCdUMcyGtan", "blocksMintedPenalty": 0}, + {"address": "QdfJwj5xVhPuTWeBLRJNQPGLFv9fsZxCps", "blocksMintedPenalty": 0}, + {"address": "QdfQctDdic2k7XFKjA6Kf3cWonyoYuWd84", "blocksMintedPenalty": 0}, + {"address": "Qdfo34qskTPZMKg1g1ja6UsqxLYyGiVaf6", "blocksMintedPenalty": 0}, + {"address": "QdgP7NhWcqJJTm4ZwUcyiTpTSR9xfrhg8a", "blocksMintedPenalty": 0}, + {"address": "Qdgj1tYQSvkHqLhUns7iYmkQne2EcASC5S", "blocksMintedPenalty": 0}, + {"address": "Qdgv7Nr4R5y7hHWWy7gMYf2kBdUavt7NS7", "blocksMintedPenalty": 0}, + {"address": "Qdhba4CTrfUmGWgcAwq7eDDjTmBc9dHyV6", "blocksMintedPenalty": 0}, + {"address": "Qdi5TGL516wuTRWpssjZ7BMAw3HEmDMX4C", "blocksMintedPenalty": 0}, + {"address": "Qdi6hFCLZuQGxxKiXo4bYMTajBZcsKbY1i", "blocksMintedPenalty": 0}, + {"address": "QdiJYFfswv2R4Yts93WwHzom9NB3X3BZxk", "blocksMintedPenalty": 0}, + {"address": "QdicpiKnWX7LcrgqDuDE6bPHW99MqLLtHV", "blocksMintedPenalty": 0}, + {"address": "QdjRU9ctCxay5Qu34xLrwsQr2zid1GgbNi", "blocksMintedPenalty": 0}, + {"address": "QdkY4ZHD8B2b4tTxFDJeMtiz912CKngTcw", "blocksMintedPenalty": 0}, + {"address": "Qdm53RNbv7WWPwT6HNgG1X9gYg4pRU37Pt", "blocksMintedPenalty": 0}, + {"address": "QdmG4dU5sD158RJvUTGffDR5aM2jf6HnQw", "blocksMintedPenalty": 0}, + {"address": "QdmMZLFaa9cBtMYHUjs1ggDukuDSCbYTXw", "blocksMintedPenalty": 0}, + {"address": "QdmgwzzKjFDoUDPi11MKvKPJwqNvVdBWwh", "blocksMintedPenalty": 0}, + {"address": "Qdmmaxc3dZ8zUQ5LjkUsbdhQ3B3YgfWrUb", "blocksMintedPenalty": 0}, + {"address": "Qdmt5QeeDBnoyYBAmjw1ku3JrEnptu3kgw", "blocksMintedPenalty": 0}, + {"address": "QdmuCh1RmnMkQ3Qk7ESvCW5iT6FHZjaHcT", "blocksMintedPenalty": 0}, + {"address": "QdmuTSY5CNaBJwVtNAx6aEicE32WnoH9e8", "blocksMintedPenalty": 0}, + {"address": "QdnbYwZRzRkCEJPd6KQqeb1eXn4tBnCdYU", "blocksMintedPenalty": 0}, + {"address": "QdnuKtVhEH9Z852Knb3tPGZeqJTkRk5x2D", "blocksMintedPenalty": 0}, + {"address": "QdoQU626TRaAecbgk8AQN8dAs9Yhexcwxn", "blocksMintedPenalty": 0}, + {"address": "QdoibyacXDQyAxh3CnwCYCaV1JRVxatrLb", "blocksMintedPenalty": 0}, + {"address": "Qdp18qz6TdC1tNTkzgxubmMVcWbDPtkaHw", "blocksMintedPenalty": 0}, + {"address": "Qdp9m1kSqDCwQcPbnAmqdiKFvwrWqyH5LC", "blocksMintedPenalty": 0}, + {"address": "QdpH9fUB3WZWtHp1aEauhtwRGZuR9GBqxq", "blocksMintedPenalty": 0}, + {"address": "QdpU5Lf6p3QJfBBUtYLaa5btikpuktJqoZ", "blocksMintedPenalty": 0}, + {"address": "Qdpgv5Jp8G5jHEUvo8Zx4Y4uU95hKFBqP4", "blocksMintedPenalty": 0}, + {"address": "Qdppt334QBb7pMHtNyHBpaKugT9Q827wgs", "blocksMintedPenalty": 0}, + {"address": "QdqMArkqfEQiH3jMFc765nwEmSXbhSzJgk", "blocksMintedPenalty": 0}, + {"address": "QdqeKR8Y3mNCk1jB7xLh5xF7sn1M6f2TdU", "blocksMintedPenalty": 0}, + {"address": "QdqfQ7s5Ej96iYoN52T7ScgsNfvg6wm6iY", "blocksMintedPenalty": 0}, + {"address": "QdqhVxqYi4WYYqCNFpTWLBikhF68MEgTQj", "blocksMintedPenalty": 0}, + {"address": "QdqiEpKqdiwPcXjNsSuznEraXs1ukDBm3F", "blocksMintedPenalty": 0}, + {"address": "Qdr5V2zD4CPQzhxQLp4zno6ZAdLAsWvfbT", "blocksMintedPenalty": 0}, + {"address": "QdrFVXb1y4cEkPdE2V4evPedGF2kVCs5Tx", "blocksMintedPenalty": 0}, + {"address": "QdrJ1fXcAxrMag62iH3hTthR1eCBduzfy6", "blocksMintedPenalty": 0}, + {"address": "QdrSQo2obdXX1kUJWh19NJLgpy7YJE15Js", "blocksMintedPenalty": 0}, + {"address": "QdrdRnXfhaCiQgSjQZAsR3P75Rs8mpYj7g", "blocksMintedPenalty": 0}, + {"address": "Qdrue7k3YU74tV7hX11kFvE6ddvqfxHK2x", "blocksMintedPenalty": 0}, + {"address": "QdsQrtQgVb5z3pwyYvp9tMwFsdYiu3VkSQ", "blocksMintedPenalty": 0}, + {"address": "QdsTzMCowjvn7ivefdeVfsDmrLjmpz4BNA", "blocksMintedPenalty": 0}, + {"address": "Qdsd7ywv4WheaS5oh7DCWKyjVGoZdJ81wm", "blocksMintedPenalty": 0}, + {"address": "QdshBsKeqkgdbmSvkhncYKXjcxC8x1cKRH", "blocksMintedPenalty": 0}, + {"address": "QdtQjB51iKsz5P3QDBWtsT7Len578RGHUy", "blocksMintedPenalty": 0}, + {"address": "QdtmzRCwuVvUvJn15LDry8G66DSPJddbgv", "blocksMintedPenalty": 0}, + {"address": "QdtsTBqMfcWafi1kS5VJKg3anJgoV8GvQ6", "blocksMintedPenalty": 0}, + {"address": "Qdu3VVRxkXNHbBUJGVd6N5U2Ewd2tjN1bB", "blocksMintedPenalty": 0}, + {"address": "QduGZ8JomeGm2A4xReaJ3CX7yc5qYggk41", "blocksMintedPenalty": 0}, + {"address": "Qdumw6qgf5MrP9PgwS4ES8wPdtunGHgJ9r", "blocksMintedPenalty": 0}, + {"address": "QduwoSQMfCmBJPgyXTFBicVmGi68HouzES", "blocksMintedPenalty": 0}, + {"address": "QduxPJv6pHE1nfUSka6GosJWLPdNa36ym7", "blocksMintedPenalty": 0}, + {"address": "Qdv9fg1qreGbvDFrfew8syVzGuE2wSNoKP", "blocksMintedPenalty": 0}, + {"address": "QdvCCNGpKpqZvarGXpgc1tjoQrdgddh1ap", "blocksMintedPenalty": 0}, + {"address": "QdvtNVjAh1egF8R96uEoJ3vYjSXGUboNmm", "blocksMintedPenalty": 0}, + {"address": "QdwAogLYeYu1rnxJ5bCfocMiDyWkyZYTpF", "blocksMintedPenalty": 0}, + {"address": "QdwCf5ACXNxEG3J9BwTQCDFDaYAqTR2dhQ", "blocksMintedPenalty": 0}, + {"address": "QdwE3Tzmi9FJDi3SbN4UQdhvWwYGuAfRKo", "blocksMintedPenalty": 0}, + {"address": "QdwE9AFy1UN528LaewtnyjQRJYMcfTzp3Y", "blocksMintedPenalty": 0}, + {"address": "QdwSeQEWSDT3tRHmeGVR1LBxXMrze8CHnW", "blocksMintedPenalty": 0}, + {"address": "QdwXJ71mhUN8JLAgXevbx7hAEH1RbYhTW1", "blocksMintedPenalty": 0}, + {"address": "QdwYNeK6LNEnCLJhBZGmXig7Qu5cT6ZVsi", "blocksMintedPenalty": 0}, + {"address": "QdwcqhSUoNktnY1CALQRrk6eQnxndgQ3fK", "blocksMintedPenalty": 0}, + {"address": "QdwmAgrA2V6aBunU72stBjv8DzMzAmne53", "blocksMintedPenalty": 0}, + {"address": "QdxDaHTEX5cUg4S6ohMAi6mE8wQZCqQBoT", "blocksMintedPenalty": 0}, + {"address": "QdyJZgvLRGPwapJJie5kDmCrApeXc7k8Cx", "blocksMintedPenalty": 0}, + {"address": "QdytXtRDghB23b91G8a3EmL7EZjJqphnzW", "blocksMintedPenalty": 0}, + {"address": "QdzZQpjqvik6MR22tq4Zb3RZRoSs6rTsa4", "blocksMintedPenalty": 0}, + {"address": "Qdzao5D6UbnoUkiskjceGRGCeEnMyb7R2E", "blocksMintedPenalty": 0}, + {"address": "QdznPoNNQRom8eJq7LEq89NE5J5RzUpztr", "blocksMintedPenalty": 0}, + {"address": "QdzuZVQnF8T3vRe9bLXX4hcqpo8feG2mk4", "blocksMintedPenalty": 0}, + {"address": "Qe1T1JXhcAzAdEZSqYEsgCkGEC66QpPg6p", "blocksMintedPenalty": 0}, + {"address": "Qe1UWFXa4z92uKMQvtFpvin5Y4fPfPij2U", "blocksMintedPenalty": 0}, + {"address": "Qe1VTz3uyvzhufVPLTPiAiANr25RExtT1n", "blocksMintedPenalty": 0}, + {"address": "Qe1iUmv1aST7rys4z1ZiXxXoPfoVzUnFZU", "blocksMintedPenalty": 0}, + {"address": "Qe2HHHdP14HLYMftV8JqtCj6FGbXBPWLJW", "blocksMintedPenalty": 0}, + {"address": "Qe2bY7XooDD96cRHtKDtC8omWEKAjvj45w", "blocksMintedPenalty": 0}, + {"address": "Qe3VJAwgyYNbeH2LfDdpzbDYUm7YJR8oYs", "blocksMintedPenalty": 0}, + {"address": "Qe3XePjyDQaNxxe1E8YofN6DuXAxGz7Zch", "blocksMintedPenalty": 0}, + {"address": "Qe3oieqCCJRMbEToJ8Pn2hag8FbxiNA34N", "blocksMintedPenalty": 0}, + {"address": "Qe4CScdjTkoLgkPQdZf5rr6uPoV9ogFMtG", "blocksMintedPenalty": 0}, + {"address": "Qe4eubxeEJ9L3VoEr52HQE3mwTHgFkRphV", "blocksMintedPenalty": 0}, + {"address": "Qe4wDttVTQ4UuzhouGdRS1h2YmduwoJ9W1", "blocksMintedPenalty": 0}, + {"address": "Qe4xHzWG1pN3WfreAeCG7vtKXRTmDNaDL7", "blocksMintedPenalty": 0}, + {"address": "Qe5AL5vRcoeJrvYfizLF1pBnN4owD9TMzk", "blocksMintedPenalty": 0}, + {"address": "Qe5L5xmA9BRHX8Jf7bM1bzwrCGa9aTnvoK", "blocksMintedPenalty": 0}, + {"address": "Qe5fcxgymmaz5U2E4MpZTkZmurEwn7V1NT", "blocksMintedPenalty": 0}, + {"address": "Qe5nbyTcMcmcx2GDgJW2FyZ4msop1HdhEs", "blocksMintedPenalty": 0}, + {"address": "Qe61iC4UNukTT5to9K4zGV2NMPaHbrEXsg", "blocksMintedPenalty": 0}, + {"address": "Qe6GJwMkJR4VW6XqWxWS72U4SosueEazwi", "blocksMintedPenalty": 0}, + {"address": "Qe83kJcbVuUZSUsfzcnsyM865SgECpiXD2", "blocksMintedPenalty": 0}, + {"address": "Qe87og2YGh3qptAXi2NzAfzJuLATuBQD8P", "blocksMintedPenalty": 0}, + {"address": "Qe9BGTofJJhtcViZHcz8Xda9zgWjRTQt6G", "blocksMintedPenalty": 0}, + {"address": "QeA3ao5LFiAbZuHdjXGRMXuKniPCY6bsTp", "blocksMintedPenalty": 0}, + {"address": "QeA6MJgiFLwz8imdBRU2gfJ9wx4KPXQGLX", "blocksMintedPenalty": 0}, + {"address": "QeAHXst5usrjP3c2WqZFDZzxH3KoxdZQLw", "blocksMintedPenalty": 0}, + {"address": "QeARkeHszES9onj6yo5mm3DnUBiMpsjHj8", "blocksMintedPenalty": 0}, + {"address": "QeARoriSz7AbTmcdwnSUQtb1zxEQExX8GE", "blocksMintedPenalty": 0}, + {"address": "QeAgJEYRBfYuC87athvDWjKgjxTzJARfZP", "blocksMintedPenalty": 0}, + {"address": "QeAwSptBQ5QAhojiRGQZ7XKWANFRVeNzqz", "blocksMintedPenalty": 0}, + {"address": "QeAzdhvw9HHLXr5uSe8GdKtXtsHFo9VUaa", "blocksMintedPenalty": 0}, + {"address": "QeB7BqUvuovnoVX2iXbhzqbD9brUHBWHQ6", "blocksMintedPenalty": 0}, + {"address": "QeBKBQvMiriGRzfbm7NiiBb6hXgyaVp1Dx", "blocksMintedPenalty": 0}, + {"address": "QeBnj2qdgaiuiPPryoiVeazQGTyMGSGK1g", "blocksMintedPenalty": 0}, + {"address": "QeBpMJD9MLUX8QtxGsfzwXGP4sEUDWTo4J", "blocksMintedPenalty": 0}, + {"address": "QeBzSZ9EdpQvVJhLenE6Xv3zSpCmjc8bNR", "blocksMintedPenalty": 0}, + {"address": "QeCSyufzEFnWXBLGpajSLG8ryXZkrEzS7Z", "blocksMintedPenalty": 0}, + {"address": "QeCZdcQtfuZeKNPSJtSRHQvVC85CurDmrN", "blocksMintedPenalty": 0}, + {"address": "QeCbxUJs94cGkJkrM4jQrTkU6xbyAeJnvh", "blocksMintedPenalty": 0}, + {"address": "QeChYsHzaXw8xaP7Zw1zMPNuxig2VBomXa", "blocksMintedPenalty": 0}, + {"address": "QeCxY7DwSByPEnYNnGN3T6iUAxeUzrr38u", "blocksMintedPenalty": 0}, + {"address": "QeD2PVuUi5gXYr6xUxfdGuGFAdvDV7HHFk", "blocksMintedPenalty": 0}, + {"address": "QeD394RLKGR9kPkqBtXYXpXCzPKfb3godV", "blocksMintedPenalty": 0}, + {"address": "QeDdegTgKuNBKystQDf5g3VLVukB2Thd2h", "blocksMintedPenalty": 0}, + {"address": "QeDgWRhpVSCSiiobA7oaAqU7WAPhuXGA64", "blocksMintedPenalty": 0}, + {"address": "QeDpiTVxsUDyVCFxSMvWWhtosCUDasqePw", "blocksMintedPenalty": 0}, + {"address": "QeEg5QN4tcaXojuwDFNr8RXV34irto59Bn", "blocksMintedPenalty": 0}, + {"address": "QeEvoAv5914sL8SeKVUVW95BzY6536rNuH", "blocksMintedPenalty": 0}, + {"address": "QeFgBpbobpH2vW4dP42ryMg4vmbT96FiAN", "blocksMintedPenalty": 0}, + {"address": "QeGmgGAm6YYmGqUvCbYsFtFjUSyhyN6jzv", "blocksMintedPenalty": 0}, + {"address": "QeGqg8STXXe4h3R7WzPYpSwNMZtcsBeHsp", "blocksMintedPenalty": 0}, + {"address": "QeH1aiyMZCvd19g5iHemAW1g16eh79CrpL", "blocksMintedPenalty": 0}, + {"address": "QeH5g8c9AYa6BNZBrp4qG6NrzTJb1tfJPW", "blocksMintedPenalty": 0}, + {"address": "QeHnckGCEzhf2LHN2RqMe8rbTPusDq9XCN", "blocksMintedPenalty": 0}, + {"address": "QeHo8aKn8ZPvqyPhWPEhQS8iDVJsGYEKBe", "blocksMintedPenalty": 0}, + {"address": "QeJApVyWvbyyLWXumZzDXoTSsHn97uLw3D", "blocksMintedPenalty": 0}, + {"address": "QeJXux2kpPK7wT1Yoddej7cSjW3hrP4NNb", "blocksMintedPenalty": 0}, + {"address": "QeJfFgq1KtMGk4SxAk7dczj9NfYZBU5rUQ", "blocksMintedPenalty": 0}, + {"address": "QeKN4bFrVUFJwVty6o1kvKtM3heUC4Nini", "blocksMintedPenalty": 0}, + {"address": "QeKUzziwEhC4gnhy5Nv42HaLqcN7gqYMzY", "blocksMintedPenalty": 0}, + {"address": "QeKnSeckADDz4b1VrqNMx4vjATY4Tv9bd5", "blocksMintedPenalty": 0}, + {"address": "QeKuTkgQbsAm7T3eBd8QfqUtquLAbVTbVK", "blocksMintedPenalty": 0}, + {"address": "QeL8DFUqxWW6HMqYtAh5fzQNnnUCoe9kAU", "blocksMintedPenalty": 0}, + {"address": "QeLE72TdFyy2ibFZnRdKwB9Wf38T9boCbE", "blocksMintedPenalty": 0}, + {"address": "QeLF5wmqmHMnJR7rHGxyXJFsSLFSWFHejK", "blocksMintedPenalty": 0}, + {"address": "QeLYs2UzCKMKbMgRCkdsCMkvzn5vHxiVZY", "blocksMintedPenalty": 0}, + {"address": "QeLz3Q5mHQV9x1kFDUN1Qk75a2oXgcK5QH", "blocksMintedPenalty": 0}, + {"address": "QeM9qyuWqqQEbbJWFV3ksqERJeasSMByk2", "blocksMintedPenalty": 0}, + {"address": "QeMRKnAKCDLbmSkmvDv37geqLTbuEPy2X5", "blocksMintedPenalty": 0}, + {"address": "QeMSAeqzQpbZDNuBvDF75FT1zfJue7vXqF", "blocksMintedPenalty": 0}, + {"address": "QeNNjd3x8tQnHYmS4nK3bY9xFqDv8GTk9N", "blocksMintedPenalty": 0}, + {"address": "QeNSTjpmEjDcAPPZwM2hfVHMUJWiZADFXo", "blocksMintedPenalty": 0}, + {"address": "QeNV5YCTSBH2SrER3aRgnSv5zzm8KDyUJh", "blocksMintedPenalty": 0}, + {"address": "QeNgaUJdxCcnciW6NmxR2ZBPLtZ95URa9g", "blocksMintedPenalty": 0}, + {"address": "QeP8YLMspiyLEiUk81222gNufrrki19pbZ", "blocksMintedPenalty": 0}, + {"address": "QePEeXWEWzJ7CzA6MKxZKQK6u5h59Sh5tA", "blocksMintedPenalty": 0}, + {"address": "QePMhuKV43sV5vCuqNf74D4ZmccyQVZQTB", "blocksMintedPenalty": 0}, + {"address": "QePRbKhBbbcoH1jPJYLkY6YZqjWJ7T9DAJ", "blocksMintedPenalty": 0}, + {"address": "QePcYT5aVFERDeUXGsyLYTVXAFPeprEkYB", "blocksMintedPenalty": 0}, + {"address": "QePgyK9PziRK6V3jCFuUX3dXt3RLJinMzh", "blocksMintedPenalty": 0}, + {"address": "QePsHupuxJa5gJHWDqTeiGGjW2AZw82uUH", "blocksMintedPenalty": 0}, + {"address": "QeQiYjWp8rXQSRqHpW831FAnYCJPRLkn3H", "blocksMintedPenalty": 0}, + {"address": "QeRC61rsnZGMqEFFDcngZUs6pYULiJGVj6", "blocksMintedPenalty": 0}, + {"address": "QeRGxLRa3TYDxyjFTZTrnaRVrsxdt2i8eu", "blocksMintedPenalty": 0}, + {"address": "QeRPJ2rhNJ3oMpgvbLFewEdwyQsDtdxF3T", "blocksMintedPenalty": 0}, + {"address": "QeRfSyvy8g4hdqbj6txDa6chcjXWMBpRrP", "blocksMintedPenalty": 0}, + {"address": "QeRv9du5dN7T2baHca36r7Jmvqu7QRrFeY", "blocksMintedPenalty": 0}, + {"address": "QeRwAnGE8M25E1V34q3wp2vHC9VGYWDXjk", "blocksMintedPenalty": 0}, + {"address": "QeSWc5k3DbR3WNdcg2GsmPZjNBpy3kjHxA", "blocksMintedPenalty": 0}, + {"address": "QeT1ud6wr7T8V19h5bLmyDYUYc8QG5cLYd", "blocksMintedPenalty": 0}, + {"address": "QeT76Ta6vfpbRYbyGX8UBsAGq6WmPi6Hiv", "blocksMintedPenalty": 0}, + {"address": "QeT85j7vGVmWHskNngaZgrzppHbfGidqF9", "blocksMintedPenalty": 0}, + {"address": "QeTV7N6fYo6opyc2H7Vb1N1ZqiLdCmmBE7", "blocksMintedPenalty": 0}, + {"address": "QeTWKQw2Ruv25Nk2AxsPH4Vrxnv6vkMpxK", "blocksMintedPenalty": 0}, + {"address": "QeTnPbb4b6jVfPtaarCh8UjqFceWZEviK7", "blocksMintedPenalty": 0}, + {"address": "QeUE1o9KEW8p4VdsGiJB8Rx9GbJBkcNn83", "blocksMintedPenalty": 0}, + {"address": "QeUgFx4kuhF5LhUAXpHjQXtSPnKRW7qqX8", "blocksMintedPenalty": 0}, + {"address": "QeWHz4hA4jiGA9ecbYeYM6Uh8dvLoxXsWW", "blocksMintedPenalty": 0}, + {"address": "QeWn29AxyFUoyudozU66DnPUExy7hCTQmZ", "blocksMintedPenalty": 0}, + {"address": "QeXD7X1voKjm3uadyaDTJqZ7w9WyJBJx4y", "blocksMintedPenalty": 0}, + {"address": "QeXMdxgySi6WksqY6mPCTa5KZPoHMdXzYz", "blocksMintedPenalty": 0}, + {"address": "QeXXNVqR7nLq46kbaqUL3ByJFaqbsYiviD", "blocksMintedPenalty": 0}, + {"address": "QeXpDUTwH7hKBarni19qeBaYfF69dMCbRy", "blocksMintedPenalty": 0}, + {"address": "QeXsRCBcnAxMmhAJ7VrDuMj2eoCDgzhyKu", "blocksMintedPenalty": 0}, + {"address": "QeY1HepXWwTu5XDTANtJ16yhRgSqQ94S5g", "blocksMintedPenalty": 0}, + {"address": "QeYCu2D8J5UUWXDwYKpwrDyWPpH6U6iTrm", "blocksMintedPenalty": 0}, + {"address": "QeYrJpWhDtSRgPd1Lr7JzARRmBsyu9ekcs", "blocksMintedPenalty": 0}, + {"address": "QeYuyNgLhhcw4M6Z8mQEyP7mEp1o25JhKS", "blocksMintedPenalty": 0}, + {"address": "QeZRGdDBDDUoJRbjvJQkiB4WovxSdgKvth", "blocksMintedPenalty": 0}, + {"address": "QeZp79BM1WbyVcaaakw4ahaM6HP6nSRTaQ", "blocksMintedPenalty": 0}, + {"address": "QeZu4jysyu4rHjKhHCbndTYrmrMpf9VSgV", "blocksMintedPenalty": 0}, + {"address": "QeaCzaEVZ4cfeP1KtConb5UWaSxvv6m5Rx", "blocksMintedPenalty": 0}, + {"address": "QeaUmQEAjSGKQvKiWpw2E7Qf4MihHHCnCc", "blocksMintedPenalty": 0}, + {"address": "QeahCHN8tbswJrop759WKsooCdF7Kyuxo7", "blocksMintedPenalty": 0}, + {"address": "QeboAEnRHkYdEqxs3WDbCjQKqsAP5K33e2", "blocksMintedPenalty": 0}, + {"address": "Qebzpis17w4oWGyDFBTJUccpRjWki9kQ97", "blocksMintedPenalty": 0}, + {"address": "Qec1gnk8HRFVQTJjLiFmnnau7cfto1tGUM", "blocksMintedPenalty": 0}, + {"address": "Qec2ufvw52tUbdCuAT6ugzxLo4rG7E5Byr", "blocksMintedPenalty": 0}, + {"address": "Qec3t4zp5QV6H5cVhn8VN2LMm4HZzBeWAz", "blocksMintedPenalty": 0}, + {"address": "QecF4nCvPBwXvCu5WetJN1Pfoa55TQgVj5", "blocksMintedPenalty": 0}, + {"address": "QecGy5YQeJg7QZ8q5W5gvJaxkjAeEznsbq", "blocksMintedPenalty": 0}, + {"address": "QecJZ3LEMvXS7J1VpGraouPqKYt2qBnP2t", "blocksMintedPenalty": 0}, + {"address": "QecQZWmuTn4hYFw8nZVqQykLZskfBCfbw3", "blocksMintedPenalty": 0}, + {"address": "QecZorhBry897PyoUBNmoKgHgudGDJkVLx", "blocksMintedPenalty": 0}, + {"address": "QecfFrDmms4yqJN5iqJN3o1kbAndB9Kmkn", "blocksMintedPenalty": 0}, + {"address": "QecnmAjECLiLH5s6vBVH5pMKdTKLmEwiq2", "blocksMintedPenalty": 0}, + {"address": "Qecp5Gp3igCTSyCpLa1MK9GqzhooBrJHss", "blocksMintedPenalty": 0}, + {"address": "Qed8ikyshEWsHoAZFs8QWpM9tDidj2ffeC", "blocksMintedPenalty": 0}, + {"address": "Qeec4HchiP3EPAZseJ3yFfM4mUX3dp8f1p", "blocksMintedPenalty": 0}, + {"address": "QeejFfheu1rBRMGRJxeRknzxDBnWCBGNEC", "blocksMintedPenalty": 0}, + {"address": "QeerqqutwosdhTJMrQ8CuJKBsS9Fbf6C1J", "blocksMintedPenalty": 0}, + {"address": "QeeuZWRYMCH64g3kShR2KXffeMUfqjXj84", "blocksMintedPenalty": 0}, + {"address": "QefGiSFZgYmxudLjwX8jUA6Liwe24vpDjQ", "blocksMintedPenalty": 0}, + {"address": "Qefe5ybFWXyHkP96U5Ad3d1rFft9FaEYmu", "blocksMintedPenalty": 0}, + {"address": "QegVLaz3GN7MeRdqst234twBNaZZvHkGU2", "blocksMintedPenalty": 0}, + {"address": "QegaQLri57ACzdLfRKB29CjPeyQEmwPVrw", "blocksMintedPenalty": 0}, + {"address": "QehCkQq8GVtG7BVQR8TpBXhQrYRB24jwc5", "blocksMintedPenalty": 0}, + {"address": "QehHWGi4HtezuD1xbLu1iFoVBLpWRaih7Z", "blocksMintedPenalty": 0}, + {"address": "QehPDV2c9smcKqoHRfQ8jVfU8zRWG2q6AW", "blocksMintedPenalty": 0}, + {"address": "Qehfev2C1Yhxc6BSRAxthGuHFrF1Lemk75", "blocksMintedPenalty": 0}, + {"address": "QehxNtMkUXLyGuZfsnGxRzR17fCRdeQEX5", "blocksMintedPenalty": 0}, + {"address": "QehzVDLP4nDQhumFZrWet2SYCtzT3H9GS6", "blocksMintedPenalty": 0}, + {"address": "QeiMJzki5emikA9qvAvJ1e3yNcsNBxtpD9", "blocksMintedPenalty": 0}, + {"address": "Qej3hxubNnNhvCZyJTUcvfo7Y3CH4SH322", "blocksMintedPenalty": 0}, + {"address": "Qej4o8pcuJ4VWExdw5Rr5mdyD9NsTfEs6j", "blocksMintedPenalty": 0}, + {"address": "QejCCwUThn8xzoEKBd6gGRMTrLXgGjYgp4", "blocksMintedPenalty": 0}, + {"address": "QejWfgm9vLr7c7KayasYhuPsFxVBmciPbR", "blocksMintedPenalty": 0}, + {"address": "QejcF2z1AtyZ6UeVcRmcnoPiBg2UncBEhH", "blocksMintedPenalty": 0}, + {"address": "Qek788b82i9TLyGAiprG32imraGyiFSadp", "blocksMintedPenalty": 0}, + {"address": "QekYj2N7QQ4GTRQEiXFB5e61YNVo4TiEUp", "blocksMintedPenalty": 0}, + {"address": "Qekq7dS3MnezZ2TzMBFxVSWgdxKb9UU9E5", "blocksMintedPenalty": 0}, + {"address": "Qem4JS6UZGMVskCAJnaX97jsPCSY9rcVfm", "blocksMintedPenalty": 0}, + {"address": "QemwnUapoAYQ3xhyNq7rasHMunKg54acyw", "blocksMintedPenalty": 0}, + {"address": "Qen9DXzXUgbpcPEfo6yqNXqrpgax2DTtnT", "blocksMintedPenalty": 0}, + {"address": "QenHL156b91KqHXXLL3RLxzTn9keAwVNU1", "blocksMintedPenalty": 0}, + {"address": "QenqdQ5t6Zhr9maPmKxJkMKE5Vz2NSWiGT", "blocksMintedPenalty": 0}, + {"address": "QeoyU1apqP8xf3L3VE2ZP2fexH9MBvDJLL", "blocksMintedPenalty": 0}, + {"address": "Qep9xkUDy4ohmHLrDRqNygMVmWAo5sxtM7", "blocksMintedPenalty": 0}, + {"address": "QepHETfYTr6HtdMs3F5aYbvte6WsK9qYjX", "blocksMintedPenalty": 0}, + {"address": "QepV4BXBi274A6spYhkeUk9zpMp6z6eKTj", "blocksMintedPenalty": 0}, + {"address": "QepVtouPs4Piu4HLM7mPqcxxRvbMZZcnjM", "blocksMintedPenalty": 0}, + {"address": "Qepf6BZvxgNx8eR5FzGvD41HzzqiGar7jN", "blocksMintedPenalty": 0}, + {"address": "QeqFqV9akRtizef1y4JFXqGwQLLhfqN1tL", "blocksMintedPenalty": 0}, + {"address": "QeqUzrzz3gGh96ZD7wAwJnLyJafHtvV1pt", "blocksMintedPenalty": 0}, + {"address": "QeqYng38AsXwt4eKE1h6j7jqu9hxGUdhC5", "blocksMintedPenalty": 0}, + {"address": "QeqrRhhNSVhWWo3rGCwG8uzxyVvAATkA7z", "blocksMintedPenalty": 0}, + {"address": "Qeqx8dQXaep3qLn4trLVijpa47s4LKwHDo", "blocksMintedPenalty": 0}, + {"address": "QerAMAkiQB4pgYCQvecarToCMUvoau85uS", "blocksMintedPenalty": 0}, + {"address": "QerDWJJTRDEK43D3XebmvLfHDajo5aqm4m", "blocksMintedPenalty": 0}, + {"address": "QerFs54XeHRzPuv8e4k7LcPsumPz3FaXBP", "blocksMintedPenalty": 0}, + {"address": "Qertx2j1zsthWtCqw75hNXm3RtK4T6DetU", "blocksMintedPenalty": 0}, + {"address": "Qes16taf9xDT8mDCh1kzS9CLMiuzz8k3py", "blocksMintedPenalty": 0}, + {"address": "Qes8tu9WMWbhog8ysymS5mfykU71C2rSj7", "blocksMintedPenalty": 0}, + {"address": "QetPsjZZXKrDAtcMZU6Dj93niBGMhBhkHk", "blocksMintedPenalty": 0}, + {"address": "QetdRqqtF63DogeHcLacGjymny25q7EN7J", "blocksMintedPenalty": 0}, + {"address": "QetuNA4vbHsiM4HiNiZL3g8MhX6XP8CGZR", "blocksMintedPenalty": 0}, + {"address": "Qeu6TimqMfusVrzaVGsNtCKw4UnRzC9Gsz", "blocksMintedPenalty": 0}, + {"address": "QeuSrm2hgfLwk9C4jiiishNa9wTH7adU1W", "blocksMintedPenalty": 0}, + {"address": "QeuWAC6Ued6i5ddXYCnV7TvpKZfMyvUNoS", "blocksMintedPenalty": 0}, + {"address": "Qeujh3TbUempgiDnz9cQCV2UCPZa4RLs19", "blocksMintedPenalty": 0}, + {"address": "QeujkgT5KUfAdpRURok8vZzwgTZGYH8DQ4", "blocksMintedPenalty": 0}, + {"address": "Qev35vsSWsMLtok7ntGzDUn7ZP8a8Z28Df", "blocksMintedPenalty": 0}, + {"address": "Qev7CBhwBJPHv4ectrNskbAYUS1FdsBoAd", "blocksMintedPenalty": 0}, + {"address": "QevbEgTDXApia8Y3qw6Tb3usfAs6XoDqtk", "blocksMintedPenalty": 0}, + {"address": "QevgxC9u4ybT1bMvu8g1j6KMEsSvbkRSmH", "blocksMintedPenalty": 0}, + {"address": "QevrrxMEz3bP8BbxjA7U78pd2HmfDjWaH1", "blocksMintedPenalty": 0}, + {"address": "QewJRCjamZk8nhkqU3vo1EoEVj3XSioyLj", "blocksMintedPenalty": 0}, + {"address": "QewVdfNVLrDw65f9tbuEpvyo9aUVTAakfF", "blocksMintedPenalty": 0}, + {"address": "QeweXCuYPmV1nxtuu6K6HkVVuCSB2f7oqC", "blocksMintedPenalty": 0}, + {"address": "QewnSggPEqvQ3fwXmDvqQQZZLnx6BPHKvf", "blocksMintedPenalty": 0}, + {"address": "QexPCPTRqykNDMRC8NAMJRWCZzXY6NuVRo", "blocksMintedPenalty": 0}, + {"address": "Qey98aKanA3QSzgEUWvY4wYbdLfzsoprod", "blocksMintedPenalty": 0}, + {"address": "QeyLeHPJ4wNpvCjkJMw17i7ePbGaMtnV3z", "blocksMintedPenalty": 0}, + {"address": "QeyNpyDzYvsKi9AavZA1g1R4t2vpN12DtY", "blocksMintedPenalty": 0}, + {"address": "QeyPsNW7yoWHAXTCHRnDRmQRuC4VDGGbFM", "blocksMintedPenalty": 0}, + {"address": "QeyktnDd4aJuBF6cjJekj1bkRDWQV4iaQc", "blocksMintedPenalty": 0}, + {"address": "QezUx7ypfFyis629QUxAoc6bFgMm9L8e6a", "blocksMintedPenalty": 0}, + {"address": "QezbNLR4EVLMA8vATekPUttWquHpykh44h", "blocksMintedPenalty": 0}, + {"address": "Qf1F8fuJ7VxsdsHQtvrLNg9Q12UvForZKL", "blocksMintedPenalty": 0}, + {"address": "Qf1UdkLbZpxGP9miEbBiB53EecDW1eyiYh", "blocksMintedPenalty": 0}, + {"address": "Qf1c8aEb5FRoiCXHJiqAmSvicopTQJ1HmB", "blocksMintedPenalty": 0}, + {"address": "Qf1v4KyrEeKVUDLzQbZ2eRXaodTwnJVyuT", "blocksMintedPenalty": 0}, + {"address": "Qf2NPFj4vUzvBiHt35LPzgKKphs3jjzsXn", "blocksMintedPenalty": 0}, + {"address": "Qf2RfHRGjSbcVw1AC7buMXpCYkF7fPEMzc", "blocksMintedPenalty": 0}, + {"address": "Qf2VNAs4KP2P5WgK9xgnSXsCsjC2vpq7ft", "blocksMintedPenalty": 0}, + {"address": "Qf2cP32vYmeT8TSxkKeAsnhvNDiFo1fCbs", "blocksMintedPenalty": 0}, + {"address": "Qf2rahgq8afjhc5YxtNrRZ8DhsAzdg6BXg", "blocksMintedPenalty": 0}, + {"address": "Qf3FLZjseg4UzDJiU2uUg4XXMNTwoZ51fm", "blocksMintedPenalty": 0}, + {"address": "Qf3LRZgpspFKZFMug3fvBXp5X1rHTjz1gv", "blocksMintedPenalty": 0}, + {"address": "Qf3hCwN74tAoequ1RQFKZeCDfvgqmDheVL", "blocksMintedPenalty": 0}, + {"address": "Qf3tvhWWtg6j1b5sMF2a4Akj3dRDjxeoUj", "blocksMintedPenalty": 0}, + {"address": "Qf4HwahG99ZER8nwMFJQcKermkB1bQGyjj", "blocksMintedPenalty": 0}, + {"address": "Qf4ZrKwRAz8bPtG8rswyBVkQUnFv9KgwUf", "blocksMintedPenalty": 0}, + {"address": "Qf4nVpmiWvrrje7uM6ecJykQqn5aCSSohj", "blocksMintedPenalty": 0}, + {"address": "Qf4zSnkpYVhZVoVUZHwexsyo4UThzHN11y", "blocksMintedPenalty": 0}, + {"address": "Qf543s8iSYyVACmLbPMYywAzEHBEbpi9RL", "blocksMintedPenalty": 0}, + {"address": "Qf54FAbTgiEjGF1Do1e9XYEZjiHTf8tw8p", "blocksMintedPenalty": 0}, + {"address": "Qf5fAgF9bbsvrzXwd2ooYXC9dRMRG8RwYL", "blocksMintedPenalty": 0}, + {"address": "Qf5iPTw6ajaJKmNbxz12HfaVhwndcpr6uX", "blocksMintedPenalty": 0}, + {"address": "Qf5rN2oaXXqbKUYEmW43fwFixxawwj2sDp", "blocksMintedPenalty": 0}, + {"address": "Qf5sDFpFFgX2TSrgPtqEAp2GiH1x2KRAit", "blocksMintedPenalty": 0}, + {"address": "Qf62YK22o3TwVepFSh7wSgVKaLi8cZJKgF", "blocksMintedPenalty": 0}, + {"address": "Qf6RbBRM5GT7gRvBNLyh5LM9bHEgkGNP1m", "blocksMintedPenalty": 0}, + {"address": "Qf6qUpugY1RaCFyrd5UgwWCFwifH75Rb1c", "blocksMintedPenalty": 0}, + {"address": "Qf71USG9dngAa8dJWfuaS3HQfvcBP22wK5", "blocksMintedPenalty": 0}, + {"address": "Qf7CFeN79pSK1QHSTcNKKYYuPYGS5vi68C", "blocksMintedPenalty": 0}, + {"address": "Qf7CWr1qxK7aw7tkPPmRXaX7MRKkVUJ99o", "blocksMintedPenalty": 0}, + {"address": "Qf7DccZLzVoiFPzqR5XekZcdxLBdkRxf6i", "blocksMintedPenalty": 0}, + {"address": "Qf7QdGDfNbShDFpWyNAhh46JAcoYCVQD3P", "blocksMintedPenalty": 0}, + {"address": "Qf7g1HN2V5eeWYbupCZBqmnRWm4HJPHRLg", "blocksMintedPenalty": 0}, + {"address": "Qf7sY92xroH8yk5ka4ofNddSecfjowA4m6", "blocksMintedPenalty": 0}, + {"address": "Qf87hsMndqhPqGwYaunJdokWQubiaFy59K", "blocksMintedPenalty": 0}, + {"address": "Qf8BZgfCvHTTYxS86mw5PrDmwdDEbFVqxa", "blocksMintedPenalty": 0}, + {"address": "Qf8hFp4YVbAJkJr9tn1kizh9VkRtc29g4J", "blocksMintedPenalty": 0}, + {"address": "Qf8wpPL2ptEhhxAdhSU1RCF4TqKHuFkxhP", "blocksMintedPenalty": 0}, + {"address": "Qf9WLKWAKVMVfd7c2fU4uYQJkJpbamYuFN", "blocksMintedPenalty": 0}, + {"address": "Qf9hwccB76EXaUGSrR6iRwWCP8AoKkKD4M", "blocksMintedPenalty": 0}, + {"address": "Qf9jtfDwP6Poujd1fiWBuBU3kvAUTTtaRP", "blocksMintedPenalty": 0}, + {"address": "Qf9xims5zrVhzRhrLrd22WdNb3VkYQ6HNa", "blocksMintedPenalty": 0}, + {"address": "QfA2ro4sJLvmwyW9qZZSFsZavhFcm9CfAx", "blocksMintedPenalty": 0}, + {"address": "QfAK7QFLPnRThgfAid7ATvTQ4qMixqp6Ak", "blocksMintedPenalty": 0}, + {"address": "QfAaPM5puZZuRh73GCGaPkPqbczipBr5Zi", "blocksMintedPenalty": 0}, + {"address": "QfAy8cmuJqbRue5M44e1XPLXTcjKUuBKPw", "blocksMintedPenalty": 0}, + {"address": "QfB2piPgusRw112NdUycxd6jNvj6ju5ws5", "blocksMintedPenalty": 0}, + {"address": "QfBDnFGqLvvfpsqF1WhUJLkGuhQJwUzDqG", "blocksMintedPenalty": 0}, + {"address": "QfBKBqrMdXCwqu232Cqe348YdL7oXgcpXs", "blocksMintedPenalty": 0}, + {"address": "QfBNDZenkCzXHjrx7u6jfH69avVmE9Cjmm", "blocksMintedPenalty": 0}, + {"address": "QfBerTk7hbUcuvzv9w49q9qQYUxtKd3Bjw", "blocksMintedPenalty": 0}, + {"address": "QfBvZL6D7seCWZCErKZPhkZMYBkDn3sZrB", "blocksMintedPenalty": 0}, + {"address": "QfCdAjywYeytw51XqVT6UU1hSvNsbsg9tB", "blocksMintedPenalty": 0}, + {"address": "QfChTuFv6HV69eSPxxjrDxzfaih2hQXuET", "blocksMintedPenalty": 0}, + {"address": "QfEBSibA7zbjyrYqHNicYLqCrKMkNYws9b", "blocksMintedPenalty": 0}, + {"address": "QfEXnpWCmdBxqTM9fgWvSKRmm4Cx4wgGRW", "blocksMintedPenalty": 0}, + {"address": "QfEbAhkCKzwvtVm3sZ3wpkGGbhicFN51XF", "blocksMintedPenalty": 0}, + {"address": "QfEpkjvMnGPs2KjPPTJJdPHVyMK8uo1tgn", "blocksMintedPenalty": 0}, + {"address": "QfEqmom356oHh7DPLNiYUsoSTTSipJi5Zn", "blocksMintedPenalty": 0}, + {"address": "QfEvvafWyPxK48TT3bp4RkAZYUi7cUvkbe", "blocksMintedPenalty": 0}, + {"address": "QfFD4onUxa35qtHyXyytG3z45FdY9UuquW", "blocksMintedPenalty": 0}, + {"address": "QfFpRZtJH9Tf6mfNURczjwKFuBTuSDf4RM", "blocksMintedPenalty": 0}, + {"address": "QfG2dwzt2w6nKwbHqvAFdkwgdZU6C2cZN9", "blocksMintedPenalty": 0}, + {"address": "QfGGprgKjut4P8FMC5NrHPY1nP7qiRu6T4", "blocksMintedPenalty": 0}, + {"address": "QfHFsSZoQNCQ1DYTcU7GkgKUHNokZsJcaM", "blocksMintedPenalty": 0}, + {"address": "QfJ7hQgHxY1FvixxFy4woJs8LeFWuW2efx", "blocksMintedPenalty": 0}, + {"address": "QfJDg4ZzNm64dVJZ2HxaMst17BtX85EsfE", "blocksMintedPenalty": 0}, + {"address": "QfJmit1k2SirGe6Z9XHJcZ3nXfQQakpL4M", "blocksMintedPenalty": 0}, + {"address": "QfJtjHvFeoZZz2vvNprX6MaY4c7ktGokFp", "blocksMintedPenalty": 0}, + {"address": "QfJudKhydWZazKFz97VxUbGz8LgDK1GjLV", "blocksMintedPenalty": 0}, + {"address": "QfK4SUsmLwgdrVB98NKTDAHocqKjm8xeug", "blocksMintedPenalty": 0}, + {"address": "QfKFx1HMpeqhQjQNKd5pshmxFdGaKu5hn8", "blocksMintedPenalty": 0}, + {"address": "QfKgAQyaiVFRURz8uhgpknG7E1mJRjnwGL", "blocksMintedPenalty": 0}, + {"address": "QfLFa5myqHCXuETZePJ6dBvWqDsGPkvCx7", "blocksMintedPenalty": 0}, + {"address": "QfLVgy8wQwHsE1FNqihfbVRhUFAeNwt2EB", "blocksMintedPenalty": 0}, + {"address": "QfLaQR7uxGPGE8ZxtN9s192xuAq2ijBmrN", "blocksMintedPenalty": 0}, + {"address": "QfLbuoRK83aFRDHf9e7ZKGEDUkcT3bfXEB", "blocksMintedPenalty": 0}, + {"address": "QfLobnwhFy4sfxwSfUjBQ9Hk4BrPShzXuu", "blocksMintedPenalty": 0}, + {"address": "QfLtk82TfUV89NywLmLjBK5ULm5LUy1nz1", "blocksMintedPenalty": 0}, + {"address": "QfLvzoTA9HPM4W75sApZs9attJWAuY9GwS", "blocksMintedPenalty": 0}, + {"address": "QfMATriw6ZrwM43Q7JeDz27TX4ERBhNsCv", "blocksMintedPenalty": 0}, + {"address": "QfN73SMyL4RLWzHwkJLRRMmYwMwAnLQuf3", "blocksMintedPenalty": 0}, + {"address": "QfNEZEtH3epXBuri1zUmyCXot4K4JbM4Hx", "blocksMintedPenalty": 0}, + {"address": "QfNP1fToCKcbNnTy6uEFN7CDvVuqZgWJQP", "blocksMintedPenalty": 0}, + {"address": "QfNqgFeVjirUWHnk1Tq6oK5gty3o1Mbjzz", "blocksMintedPenalty": 0}, + {"address": "QfNwuuYR9sH2XQcAGeEsNzi25aZ4WRoH6J", "blocksMintedPenalty": 0}, + {"address": "QfPQM9BSsiV4UVqQAeEAyknkHZX4WUiPzs", "blocksMintedPenalty": 0}, + {"address": "QfPQNq7QXQQfkuZKtz3Pk1GhSFTL8FQSGM", "blocksMintedPenalty": 0}, + {"address": "QfPdVcLyj2tZ1ERpaVK9zyYDe9fTWEDn6o", "blocksMintedPenalty": 0}, + {"address": "QfQHF8idPFEuZjqo1xPnQJNXRtPQzHQZ4j", "blocksMintedPenalty": 0}, + {"address": "QfQSDJmK6LqZaJhTD9EyB5DiinKQRU93K9", "blocksMintedPenalty": 0}, + {"address": "QfQrBpCFsH1MdtRMwiKi14C3rbzhpn4hEM", "blocksMintedPenalty": 0}, + {"address": "QfRvXRtaT4JcaBKrYYFPrTyrdvXdEAzatB", "blocksMintedPenalty": 0}, + {"address": "QfSgaq3bHTGPAzKsXSjkkDuvKLpn2a7vLP", "blocksMintedPenalty": 0}, + {"address": "QfSuWRfrztoNaLsqHHFwwc1Q1cfsEZ2kcM", "blocksMintedPenalty": 0}, + {"address": "QfT2dQjWJwSUxDsLMMMxmS3HMd8nGc1Xak", "blocksMintedPenalty": 0}, + {"address": "QfT69ePmJfH1AJE4i4BRjkASRY8t7dHkL8", "blocksMintedPenalty": 0}, + {"address": "QfTKctrVRdw96qpVZ1fNG5AbZkg234xC5L", "blocksMintedPenalty": 0}, + {"address": "QfTVEKx3Gb5yERVrUraN1VWZgkZ6piAMLE", "blocksMintedPenalty": 0}, + {"address": "QfU446XhA7L7PEkZxAu5xZLW5e1MtmM9r1", "blocksMintedPenalty": 0}, + {"address": "QfU53sTNBVSY6s3mk7XPLzWZWyhiSDamzq", "blocksMintedPenalty": 0}, + {"address": "QfUGtZC8CPdmijbxJdWzkPLi5GPPCzCMdg", "blocksMintedPenalty": 0}, + {"address": "QfUKWk6pm7q18ZiFGSpPR6uuqFCEZfX6aS", "blocksMintedPenalty": 0}, + {"address": "QfUKbdbrPdxpokeZfwRAbk1GpRWRMh7sxB", "blocksMintedPenalty": 0}, + {"address": "QfUNhuQpTLXiWpt1PEJXwv5FHdP72rjhFy", "blocksMintedPenalty": 0}, + {"address": "QfUkWcAQV97Nx6vcus7jVBBRpwds3VHKYk", "blocksMintedPenalty": 0}, + {"address": "QfUmp5fQCYfGJv6nG9ttgYGuJDMbRuFouk", "blocksMintedPenalty": 0}, + {"address": "QfUvMcRJnK2rxe9LteEx1ZdrHG4vxUYmNV", "blocksMintedPenalty": 0}, + {"address": "QfV2zxsYBXFpW3SED6fA21x5ji41XMJzeD", "blocksMintedPenalty": 0}, + {"address": "QfVirUp7AfudrKiYCtQTt4KfBkH1oxyxDc", "blocksMintedPenalty": 0}, + {"address": "QfVmipWvpEGuWMtajZ3WPUfJLUr91EqSbb", "blocksMintedPenalty": 0}, + {"address": "QfVyJ87Lari96jJ9BxUkYZwBn99xArH8jU", "blocksMintedPenalty": 0}, + {"address": "QfWCT4asXj31ayfhe3HZopTLB12oeVnyp5", "blocksMintedPenalty": 0}, + {"address": "QfWX29ZsxmzazmTFGnT6ccR8yHiwfXFZc8", "blocksMintedPenalty": 0}, + {"address": "QfWseKGfT63iCsXUrHyQNaDUn37hJsKk6r", "blocksMintedPenalty": 0}, + {"address": "QfXN2WVBosXGXgYHSmaq2sgnT9vv3DYBHR", "blocksMintedPenalty": 0}, + {"address": "QfYNde9kJ2A5bxR6UbkerKJSe6bNtyULcF", "blocksMintedPenalty": 0}, + {"address": "QfYSQAbKrEhs4ePGYCJ9yFGunVb1izm7UA", "blocksMintedPenalty": 0}, + {"address": "QfYY6sfCTXugsiRFnfq4CYeuBPzmW4R5C7", "blocksMintedPenalty": 0}, + {"address": "QfZCyj8kobpw2nCM8exRCLzAgSssRsXCQd", "blocksMintedPenalty": 0}, + {"address": "QfZKLdYNjVXyL5Yn8V5q9xxqq47FJ8knhM", "blocksMintedPenalty": 0}, + {"address": "QfZKc2rbtDYSYkU6SaVVoCzz7K7e2fpacb", "blocksMintedPenalty": 0}, + {"address": "QfZaDcaGjrrQbPfABr7ekdjpNS8jEKvvzL", "blocksMintedPenalty": 0}, + {"address": "QfaGAi4pu1dRpZUyR8huVYLaobbsA8eE6X", "blocksMintedPenalty": 0}, + {"address": "QfaTPxvdrsPh9VTZYwqeB5AgsENuvjB4vj", "blocksMintedPenalty": 0}, + {"address": "Qfbof9kmk3wCkXhadT3J4nTzLGx4GSEoau", "blocksMintedPenalty": 0}, + {"address": "QfbrdSZv5YBJus26gaH9DbWMAHDzqyYpp5", "blocksMintedPenalty": 0}, + {"address": "QfbtxRpQxmmsHPPMf3iuUuYxZmNQCN5cwq", "blocksMintedPenalty": 0}, + {"address": "Qfc77E1J1MBKQpVEPuBbjs9rHa8GnTphXP", "blocksMintedPenalty": 0}, + {"address": "QfdEXpL6TFWURU9gbdezdHwhSqnW2KR67S", "blocksMintedPenalty": 0}, + {"address": "QfdFnn6z3U9cxbBZpJgtiSX9j9TUmBNviw", "blocksMintedPenalty": 0}, + {"address": "QfdUqcWmdTEwRNiqKFk2qF3QooSSUuu6pZ", "blocksMintedPenalty": 0}, + {"address": "QfdWDz53zZFLigY6dHZE4XwKs8eud9Yc7w", "blocksMintedPenalty": 0}, + {"address": "Qfe59nnJfd9tR6L1svddLHm3nbFw5jqH1J", "blocksMintedPenalty": 0}, + {"address": "QfeUum9QLGVdVoVkgDCrEuDXuV4iDSJC2e", "blocksMintedPenalty": 0}, + {"address": "QfedxzGKA515LCt94xXgbof6b1Ax9T4D1D", "blocksMintedPenalty": 0}, + {"address": "Qfen3cjc34WaZxPQUQPEm82ne2iuUzCewj", "blocksMintedPenalty": 0}, + {"address": "QffDSXW7tTUUdwEX6d7q7gsF1h98yN7jgo", "blocksMintedPenalty": 0}, + {"address": "Qfg23uQEuMyCf8zAZbXewKyVdpXneuVPjh", "blocksMintedPenalty": 0}, + {"address": "QfgLCh1hdQvk8WpmuGY1YDeLJ882Lg56B9", "blocksMintedPenalty": 0}, + {"address": "QfgWJRndpUU8HPGCRmfbRczq9vvDu9iekD", "blocksMintedPenalty": 0}, + {"address": "QfgjtFWyHCrB6x5TpJR2GFYCvqPtGWtJQX", "blocksMintedPenalty": 0}, + {"address": "QfhEqC8U8Km3yynaNxruWTvdnpCjh3hcop", "blocksMintedPenalty": 0}, + {"address": "QficuSoiD47jePyKnL14RBRkasRjkWgU9i", "blocksMintedPenalty": 0}, + {"address": "Qfim9S5xpwii9gRujrugTgZpcXaCNiTB2h", "blocksMintedPenalty": 0}, + {"address": "QfinbaHadxEaHHcfsTxhFsYVEKDbWYnHJ2", "blocksMintedPenalty": 0}, + {"address": "QfiuB7NP4zGsrwKZijN8ZLN46znoJ6NZEf", "blocksMintedPenalty": 0}, + {"address": "QfiuLyt6og92HpPJ62jQoSP1D88gUzoRNE", "blocksMintedPenalty": 0}, + {"address": "Qfjy6jgH3SXoVkzVwx5VwNKjR8JWQioLKa", "blocksMintedPenalty": 0}, + {"address": "Qfk9cTF6z3ZBQJ2wMjKE2zdessQWf5nBYK", "blocksMintedPenalty": 0}, + {"address": "QfkhqpC9BiNrhvP2WrXZnrj4ZSBCENcqgX", "blocksMintedPenalty": 0}, + {"address": "QfmCLHgWgsYnqxudmsQ9qwNGvB6XXy5zLM", "blocksMintedPenalty": 0}, + {"address": "QfmCm5sKUK6xMXApy5pN3asVFAgZUbXjGi", "blocksMintedPenalty": 0}, + {"address": "QfmEPPbZtu1BZhMpToTmUDNwg6Mikdpxf7", "blocksMintedPenalty": 0}, + {"address": "QfmTJgEGQZ7WHUMEHiyJmbaCn9pcTr1uFt", "blocksMintedPenalty": 0}, + {"address": "QfmrJZBnkkWo3iZgNBDHRWyJHxf9WxvDEa", "blocksMintedPenalty": 0}, + {"address": "QfnRGcNw2JxSS5eNJ6DQ2Z9zjRFAxwJJ9A", "blocksMintedPenalty": 0}, + {"address": "QfnX1oN3rCSaQH9jaEy5jTQ4KkC19zqAc6", "blocksMintedPenalty": 0}, + {"address": "QfnbnWrRQ4HNDQvtg3wG2B1eC4ycUsFqZz", "blocksMintedPenalty": 0}, + {"address": "QfnnCdpjfWfM97BVYZLKiS822GkeD1argN", "blocksMintedPenalty": 0}, + {"address": "Qfnyo7MLdJh5TdkrXiYN7rHdCktfeTz8GC", "blocksMintedPenalty": 0}, + {"address": "QfoPTVEkX2tKQoMLEWoB2a3Uj131jNCoUW", "blocksMintedPenalty": 0}, + {"address": "Qfoc6yAviV811atfsjF7S2ZQH7wuQQAn7T", "blocksMintedPenalty": 0}, + {"address": "Qfojzu2u3kKaW4W4fuE9YSVzBpvS45nHZG", "blocksMintedPenalty": 0}, + {"address": "QforR1zMVsJDUiG9mjj5sz3LSpZMP8E2QR", "blocksMintedPenalty": 0}, + {"address": "Qfp2QZLUvrU8obR1GNGPZMqccuC8eiy9Hb", "blocksMintedPenalty": 0}, + {"address": "Qfp83jQGj7Q3igpfhpNkFwZXfrShCwJWHj", "blocksMintedPenalty": 0}, + {"address": "QfpDJsxUhn5k418YNfjjbphuy7nhtTLaDY", "blocksMintedPenalty": 0}, + {"address": "QfpestrLjpJw77udrRCo4Y4sEKCjrs8R4W", "blocksMintedPenalty": 0}, + {"address": "Qfq8HH5H2k9NtAyDA44Gb7Yh9csHg8X5eP", "blocksMintedPenalty": 0}, + {"address": "QfqFwQZffd8TbJvSXdNxGjy68Ak7aWEQa5", "blocksMintedPenalty": 0}, + {"address": "QfqGYRtGphxkvU3awJx62qDLvUFFRWexco", "blocksMintedPenalty": 0}, + {"address": "Qfr2fFmuXZ5GdDCDNpfwXZg9aVSfFEHGkk", "blocksMintedPenalty": 0}, + {"address": "QfrAnHffEcsYnQrMgr3x3G8vxAnWygLqgi", "blocksMintedPenalty": 0}, + {"address": "QfrAzZsAh174JkimA9bVS2iecwcFy4LtRq", "blocksMintedPenalty": 0}, + {"address": "QfrF7QPKA7wihJpe5nfvT8PHMRagM2Z5St", "blocksMintedPenalty": 0}, + {"address": "QfrKoUBwahanMjD2E7SNeDEgLAVwwMRmKW", "blocksMintedPenalty": 0}, + {"address": "QfrN9K7hDDKqzuhKNcBdzMKSmdeXzt3nZt", "blocksMintedPenalty": 0}, + {"address": "QfriA1UwzgYJjwNU2vuQqSWM6K76uAtLa1", "blocksMintedPenalty": 0}, + {"address": "Qfrio6ePkbSq7YDWp2JCPwJ1TTkm9Z6Xpw", "blocksMintedPenalty": 0}, + {"address": "Qfrx9mX1naXfxXFzcmMEmRFchMNnj41S89", "blocksMintedPenalty": 0}, + {"address": "QfsN4hGoBr91E1DQDYnnA9ZhMVuoDyuTLL", "blocksMintedPenalty": 0}, + {"address": "QfsR1YM9Si2RfPXVS3wmyp6KDL1zSerA1H", "blocksMintedPenalty": 0}, + {"address": "Qfsc3V6xqiVMEDbLwh6jbQJ95VZAwGv8w9", "blocksMintedPenalty": 0}, + {"address": "Qfsehk2BoEzyvsg7vvmbEaz9KFbbjtrUds", "blocksMintedPenalty": 0}, + {"address": "Qft5U9Aq3gNWrPqupCYM5vu482P1xNtMEW", "blocksMintedPenalty": 0}, + {"address": "QftGG8nh4cpSpaFc5peexos8G1Yk6VcVZn", "blocksMintedPenalty": 0}, + {"address": "QftTJrFyZGKeedj5WxHrDrZtjzAxUf9ALu", "blocksMintedPenalty": 0}, + {"address": "QftYvnnxE3SqQfyUhpEhLGdp792daN9e4E", "blocksMintedPenalty": 0}, + {"address": "QftsPE5nkDnTdUg8SQabJScvLPBsLWesXR", "blocksMintedPenalty": 0}, + {"address": "Qfu2u6hgWyTyQBF3BdUjuPktJbFTbG39K6", "blocksMintedPenalty": 0}, + {"address": "QfuAFJet2j6fhSCQWiSchc6JqyYuVfVrXs", "blocksMintedPenalty": 0}, + {"address": "QfuYZs8JPomm2xvNe8z1AaZKQBcvyKFvBk", "blocksMintedPenalty": 0}, + {"address": "QfuaWviGJzuEZZVBjAEizN19fQDoEEQnBM", "blocksMintedPenalty": 0}, + {"address": "QfuePXR5HDJRtApYe1NhxWvf2Tmatx3nNk", "blocksMintedPenalty": 0}, + {"address": "QfupYC51nivqGzFs8MJbK1v3yTwoQGA4Pf", "blocksMintedPenalty": 0}, + {"address": "Qfvhxwp2JpbAh6jCzFQ8cxs6vCGQfwiNLn", "blocksMintedPenalty": 0}, + {"address": "Qfw7EmMuMbtGEBwdf21r8jABvZnygz8cgK", "blocksMintedPenalty": 0}, + {"address": "Qfw7MDC2vFzABAJ7RwZFcY9Djed7AsQGjK", "blocksMintedPenalty": 0}, + {"address": "QfwuG11SNuvP7tiL1LYiqX67AqKEeVnYvh", "blocksMintedPenalty": 0}, + {"address": "Qfx1odbGUdU5nezsbmq9jczUbmfRLASAEp", "blocksMintedPenalty": 0}, + {"address": "QfxKqFWXbpVaFPEFz2ktr8tmJ2zPaLw1XW", "blocksMintedPenalty": 0}, + {"address": "Qfxi1R4drUPNK1giKyKecBTGCS3PNAB6Mo", "blocksMintedPenalty": 0}, + {"address": "QfxjgNexWJy8mDRXoqXfuXZqaEtfUv7sG2", "blocksMintedPenalty": 0}, + {"address": "Qfxp6ddzQqSvpBsvAfKW5hW9Vz9kTbwGds", "blocksMintedPenalty": 0}, + {"address": "Qfy2bQfgAs835oBgHLMcnoHT2KSuNhQq2Q", "blocksMintedPenalty": 0}, + {"address": "QfyD9cdf52NehWpTb561U9Mf4tNivNa98f", "blocksMintedPenalty": 0}, + {"address": "QfyESsppKgCqCe456SXxiQqShjQPhFsSpP", "blocksMintedPenalty": 0}, + {"address": "QfyKt5Td92FstEfqH6SJoh4x3YxTZ6DH2m", "blocksMintedPenalty": 0}, + {"address": "QfyVdsAmfGiz9dD2VBHDw1g8GDEmAMq5gP", "blocksMintedPenalty": 0}, + {"address": "Qfyc2n5wAzUttpjZiKMGzV7vTaC8w8tEfY", "blocksMintedPenalty": 0}, + {"address": "QfynLyjHbyuLiQrB6KVZjxymEkmhKF8hx8", "blocksMintedPenalty": 0}, + {"address": "Qfyq1TLZKYjC1nSYQ3cZDqko9hQRr11Lrx", "blocksMintedPenalty": 0}, + {"address": "Qfyq7MyArzt2GuaxcaiCfZ8t5myQpm2kQg", "blocksMintedPenalty": 0}, + {"address": "Qfyr3KkRA4i3pqC5b7TNNC2dNcuh6yRTvs", "blocksMintedPenalty": 0}, + {"address": "QfytkQPp3SdPqPNdAepSiqTqMy1vYVzVXe", "blocksMintedPenalty": 0}, + {"address": "QfzmLLLPTFPns8xGfpYvRwikz65q7bGtPb", "blocksMintedPenalty": 0}, + {"address": "Qg18anmHsqoDXDcnhazcb12TPWA5qCDUbT", "blocksMintedPenalty": 0}, + {"address": "Qg1jjdHu6MzPDaeBGD5eYEVvq7qmq5bPd5", "blocksMintedPenalty": 0}, + {"address": "Qg1yoX7f585AyJSp2Cqo8CE1FfGMku6r52", "blocksMintedPenalty": 0}, + {"address": "Qg2CKeMC1F4G77hA1qcsC1VRJdxJn8ae9h", "blocksMintedPenalty": 0}, + {"address": "Qg2E7XSY8eNuZJGhFAsD5vNxgm34x2QZtd", "blocksMintedPenalty": 0}, + {"address": "Qg2hDz4H6crfvAi22666buzWPkPqRVRCtq", "blocksMintedPenalty": 0}, + {"address": "Qg2spRxZ5dhAMKXABHRgWdeH6Q4UbV7tSL", "blocksMintedPenalty": 0}, + {"address": "Qg3TNto7hGd3kHb1extNHpaKLRrihtkd4K", "blocksMintedPenalty": 0}, + {"address": "Qg3VH9WUMLcV4TVncqicdeJSAqETHTH3oc", "blocksMintedPenalty": 0}, + {"address": "Qg3a6A8PJ9zwMCr5eXxzNoxcELWY8fbm9N", "blocksMintedPenalty": 0}, + {"address": "Qg3zxrT4EgJC52Piqrat6SCWV2DstVfqi6", "blocksMintedPenalty": 0}, + {"address": "Qg4JpdDTJ3bDdisFURajiZudQ2bDpFHGBR", "blocksMintedPenalty": 0}, + {"address": "Qg4Xt9cTyMFA24qyZ2krwg67RrKqFhxkB2", "blocksMintedPenalty": 0}, + {"address": "Qg4diCUN1NqkJht6YdirqwZegZ4URbwimi", "blocksMintedPenalty": 0}, + {"address": "Qg4kUWoGLCdXUoLosh1eZ95Jh62Famg1U5", "blocksMintedPenalty": 0}, + {"address": "Qg51cpVz2HxAw5u6dWMtCqyzd3XK62wktF", "blocksMintedPenalty": 0}, + {"address": "Qg5JjDaQDavfdkVLxg6T4UPrXk3aZT7dSi", "blocksMintedPenalty": 0}, + {"address": "Qg6Z7HaQWko2JeP3f9uuqmn1qaQY71Ky1k", "blocksMintedPenalty": 0}, + {"address": "Qg6kA4JDvo23t1WGFTQ3MtZTNTwKiiAzaJ", "blocksMintedPenalty": 0}, + {"address": "Qg6zAit44isxgBxY9rGk3koiGVg7Gvnzjw", "blocksMintedPenalty": 0}, + {"address": "Qg7SNqi3B8YQpy5ZvjugNHtuffg5KdtttA", "blocksMintedPenalty": 0}, + {"address": "Qg7w7sjvAt2uGk9kch8mqfR6EZZTUoPJyD", "blocksMintedPenalty": 0}, + {"address": "Qg85rSbazHEBBpat5AxsRcgjDuXTWDQyfu", "blocksMintedPenalty": 0}, + {"address": "Qg9EYzEZZpHHfhNb8S6Rn2bPBjrzgCyctF", "blocksMintedPenalty": 0}, + {"address": "Qg9VMfShRpGcHFjUQ2f8Ye6uGqXm36oHGx", "blocksMintedPenalty": 0}, + {"address": "Qg9VMygic4vUNJi7nLJ1x7qiGB8bQcS6dv", "blocksMintedPenalty": 0}, + {"address": "Qg9dXQ8GDwCZcnz6oLhnBwM7MixqR9KnJe", "blocksMintedPenalty": 0}, + {"address": "Qg9uK69KqPk5PTwv5o1kTZFuBBrjWVbFZc", "blocksMintedPenalty": 0}, + {"address": "QgAkZjsm62YoaYVA5MfTECaw1qrYjYAu6e", "blocksMintedPenalty": 0}, + {"address": "QgAv2Z2LRS3w7tmaSrV86aBUgj91C4RxzY", "blocksMintedPenalty": 0}, + {"address": "QgAysfQdHVErXDQsBfCLuDeV4x5ZcLH33K", "blocksMintedPenalty": 0}, + {"address": "QgBE1FjoW6xT8TKEW53Q66xAfhhEpkWw3W", "blocksMintedPenalty": 0}, + {"address": "QgBJBzCiwqFFZRTvVdxUtbGS2Jdh2yhgBs", "blocksMintedPenalty": 0}, + {"address": "QgBUecYn7V1f1fGRVQuZvkWKm9GTCbQWc9", "blocksMintedPenalty": 0}, + {"address": "QgBZWQFjYehBk8x93rutAy9LJoksWXyCJs", "blocksMintedPenalty": 0}, + {"address": "QgCHCGnsQFzaUA2iGzx7G9DioxWLKSisCV", "blocksMintedPenalty": 0}, + {"address": "QgCNVYNFU3e191a5Cd8MbKHHwzYvQrnUfa", "blocksMintedPenalty": 0}, + {"address": "QgCYSjBfQSk1iuMLS2FDpWrvVKHt6sNuS2", "blocksMintedPenalty": 0}, + {"address": "QgCwgoSaUdPar2VQVsomkTPRZZkELTWEaq", "blocksMintedPenalty": 0}, + {"address": "QgDQUo28QYcr5Uz6TZpP8oWJuvZYrxyk8c", "blocksMintedPenalty": 0}, + {"address": "QgDcyuRBGVV7vRiVMsujp5swARusoSVWM7", "blocksMintedPenalty": 0}, + {"address": "QgDdh77ywTgDkdEt11QuftZzSN2CNw7zRY", "blocksMintedPenalty": 0}, + {"address": "QgE2FsFQ7Nj2Sjm4aM5smVz81qGfzorJmu", "blocksMintedPenalty": 0}, + {"address": "QgE8z8ShetQix2q1ZTEKBsCKkUzupGftJx", "blocksMintedPenalty": 0}, + {"address": "QgEJSq7od7iuTGki71ReTKFvYQ9FKE7nDq", "blocksMintedPenalty": 0}, + {"address": "QgEZMhSnzoeDQeCsmQzNioS5xwPYWupkih", "blocksMintedPenalty": 0}, + {"address": "QgEeXH8xSyjZqoLejfnkLsWqeo4QV1GAwZ", "blocksMintedPenalty": 0}, + {"address": "QgEfrLHGzkXW77mGYW61ECrunDbyL8na6s", "blocksMintedPenalty": 0}, + {"address": "QgEsKiMHodR3LZjQpjwXgLrfRDdpzocCEX", "blocksMintedPenalty": 0}, + {"address": "QgFJoXENg9quztjKrgcxFcSHKnyuq4tqHr", "blocksMintedPenalty": 0}, + {"address": "QgFVyjEKSpSUXKemfNgBy6TKF2YE8WN8KF", "blocksMintedPenalty": 0}, + {"address": "QgFzybay4WdSyhQesegPRbGqN6AyCB7nWT", "blocksMintedPenalty": 0}, + {"address": "QgGGMaUbn7u5mUwwbU93CRmgYqXMGD1ARB", "blocksMintedPenalty": 0}, + {"address": "QgGr1sgmrR27A63Ajhq3JMgNMo8YDAwQwW", "blocksMintedPenalty": 0}, + {"address": "QgGzwSNPq1gLg1y9ErkQUW5cyUih2egL2A", "blocksMintedPenalty": 0}, + {"address": "QgH7noGVK32dYJ1x5yqxWSbhTvG6Gmn7aq", "blocksMintedPenalty": 0}, + {"address": "QgH9K8khFEHgCC9CoyWANaXaaYHjTPkc8m", "blocksMintedPenalty": 0}, + {"address": "QgHUMnLxLobTXyn2R8GRathSQT9s7N9wdM", "blocksMintedPenalty": 0}, + {"address": "QgHc5a1Sn8VTg1rL2KpwFp3WZVKafrJuLy", "blocksMintedPenalty": 0}, + {"address": "QgHmXefxoftARiTyGUxENH16W1Wi6dHdrq", "blocksMintedPenalty": 0}, + {"address": "QgJaTcXK3qhf2y81J6ewPVYRw26zCT64yH", "blocksMintedPenalty": 0}, + {"address": "QgJf9VyYUmDduCNG9KisuYBVmAuydbhR1A", "blocksMintedPenalty": 0}, + {"address": "QgJirvM6EFdcP85tSrhNJDZt2bLGpyBRfP", "blocksMintedPenalty": 0}, + {"address": "QgJyHzkign9H58AGddfXUPAbbFJnMiwMn5", "blocksMintedPenalty": 0}, + {"address": "QgK62Zn8YgmjD3vvLa3FBS237jhLGdZCPP", "blocksMintedPenalty": 0}, + {"address": "QgKie4xueGbwHu6cUp3o131T3UJcHDMfSc", "blocksMintedPenalty": 0}, + {"address": "QgLJv2bYCN7VC45mPTwn3Wny5YuvEKxNYV", "blocksMintedPenalty": 0}, + {"address": "QgLig9XYmd4kb21awUXc6qUptziHvjgvvb", "blocksMintedPenalty": 0}, + {"address": "QgM3UCUzXKGsrkgL1vYDewnxeDdj9SzRC7", "blocksMintedPenalty": 0}, + {"address": "QgMDSqogX8AytfTuGJL9mjmePndoJxwLk9", "blocksMintedPenalty": 0}, + {"address": "QgMDfabPCtwWY19ZaU61H8MLV8bwS1r314", "blocksMintedPenalty": 0}, + {"address": "QgMSvNKQMbYgeJnjtLoM66hZPyaS8F32wR", "blocksMintedPenalty": 0}, + {"address": "QgMYvSji9s3mjBpyyFZLYKcjQXGan1FHZL", "blocksMintedPenalty": 0}, + {"address": "QgN35hvLx1MB5sFHNzmSp4aZdGqLaWLMbd", "blocksMintedPenalty": 0}, + {"address": "QgN4kX3MuaGvyhbeaoRus3pqze36pVnKja", "blocksMintedPenalty": 0}, + {"address": "QgNUF1szonZUphjyHLSDPoycqrDNY7J4Fr", "blocksMintedPenalty": 0}, + {"address": "QgNWya9KrWXXBycBrDmZCFJnpqmhHh7whX", "blocksMintedPenalty": 0}, + {"address": "QgNX39pm2LPLqooQZ7UZom4bzv52BQceMj", "blocksMintedPenalty": 0}, + {"address": "QgNbHy6jrFXVMjDwdn5LuRE55MgkZJRN7Q", "blocksMintedPenalty": 0}, + {"address": "QgQ2QdMoJARQMY7AfqAnWdPNdvNmYCjis8", "blocksMintedPenalty": 0}, + {"address": "QgQ8PQebh99jGtVGAsccynBZRLsGxG8Ygg", "blocksMintedPenalty": 0}, + {"address": "QgQCyYUCwNgYnwqJU9VDAq4KtKUiXUWppZ", "blocksMintedPenalty": 0}, + {"address": "QgQJK2UuqRJU5fZ8ntUPsHVmzMp4XqDcB2", "blocksMintedPenalty": 0}, + {"address": "QgQJTBHQDrGcbyYi3rYEBhRC4EiMzLNYQu", "blocksMintedPenalty": 0}, + {"address": "QgQUHvEiGnjSuxNiwXjULjQiD5EYgPJmth", "blocksMintedPenalty": 0}, + {"address": "QgQegkDpr23G2SnfeaHLjs1zTHomt5Pukt", "blocksMintedPenalty": 0}, + {"address": "QgQssh3Y9T5Qbq9pPkfV9D4T1ER8LDYcT5", "blocksMintedPenalty": 0}, + {"address": "QgR3R68cLeJuLJ6TgdWxeXDBAdG7tANrba", "blocksMintedPenalty": 0}, + {"address": "QgR3kuGFsaxBHPkpRagFaw4NQnVAACZ5EA", "blocksMintedPenalty": 0}, + {"address": "QgR4i5cTRsUVGrtQuNjNLxebmGcQV4Dt3W", "blocksMintedPenalty": 0}, + {"address": "QgRFx45F6aQrkUcZN6FKCs3mVgtqRhQC6U", "blocksMintedPenalty": 0}, + {"address": "QgRPTSazDHhEWLG9UZxNjt9SgPUA3Qct3A", "blocksMintedPenalty": 0}, + {"address": "QgRVNKU4oYkvLtAdSwer85ai2vasD7eibA", "blocksMintedPenalty": 0}, + {"address": "QgRWdmnjyzhZ6XCZhEYHLDQSLwp4FR38vZ", "blocksMintedPenalty": 0}, + {"address": "QgRf2JmaXETxFfTKJ3aqZmV3sqKLN79rij", "blocksMintedPenalty": 0}, + {"address": "QgRjFqZVzt39fnGfaZMAFSp9TRLUEst7ef", "blocksMintedPenalty": 0}, + {"address": "QgRptPHs7x9NRWMt9cC89umq2zKpt5u5Sc", "blocksMintedPenalty": 0}, + {"address": "QgRxrG6btrcSXmEQUWdqxU1yGnQMXLLRpx", "blocksMintedPenalty": 0}, + {"address": "QgS8eASUXnfKLXzJmXphMPRdqo3X9YRydt", "blocksMintedPenalty": 0}, + {"address": "QgSBxp4YxaQ4bMd3GrfVw69R5zKgBWgGq5", "blocksMintedPenalty": 0}, + {"address": "QgSX2PnAvwA1ddLxwCZncQoTK4CXtvGb59", "blocksMintedPenalty": 0}, + {"address": "QgSZ83nGmPtFtN5mySLdZL4gBvWnRpxvsr", "blocksMintedPenalty": 0}, + {"address": "QgT2BYdw2HAt3TgPcWiNJYDpAqPjH1zWJv", "blocksMintedPenalty": 0}, + {"address": "QgT8iGKXsMJ8u9Q5vY26sjayWt4Hcf6fPC", "blocksMintedPenalty": 0}, + {"address": "QgTJW5VestYkbUDkWJAVUFG4z7hwufLHHw", "blocksMintedPenalty": 0}, + {"address": "QgTR1eQ122qXVnyRsv854nbqkCjwLrMCmu", "blocksMintedPenalty": 0}, + {"address": "QgTSQaxxFqquJJyuU7U6y7bc9uKAjtKjBA", "blocksMintedPenalty": 0}, + {"address": "QgUBs29dSUXjwmjWNRYsrdnY5jzKx5f3Pf", "blocksMintedPenalty": 0}, + {"address": "QgUF8WAKkfWqc4ro4YRPJoyehohwci3Bg6", "blocksMintedPenalty": 0}, + {"address": "QgUQ6kn52ZEDSrFWLkQGwtT8UzoGCa7TNq", "blocksMintedPenalty": 0}, + {"address": "QgUefbndq1zZfTFTrxzCiyMUWMYyxT5MJ2", "blocksMintedPenalty": 0}, + {"address": "QgUoYLdDX7QBPXENvYWJu7vwpGffXaekTX", "blocksMintedPenalty": 0}, + {"address": "QgVFtCKPSpy5ovJvFYgfwNrfAopFuQjJ3v", "blocksMintedPenalty": 0}, + {"address": "QgWJcdiHfLGRXQcZ3fDB86q4jHCxH8N4Lr", "blocksMintedPenalty": 0}, + {"address": "QgWM6BXAgo2XmJ5R3Nfpv5Sgc9VPbsDFkQ", "blocksMintedPenalty": 0}, + {"address": "QgWZUaynF3cUsNrheUoewt3v6xz1o3gYhy", "blocksMintedPenalty": 0}, + {"address": "QgX6h1fTbVXLhvMoACYW5fRsd2jVbvjtVM", "blocksMintedPenalty": 0}, + {"address": "QgXXAGBCuThb8SCrheF3PvTqidPiQZXMdf", "blocksMintedPenalty": 0}, + {"address": "QgY1wjt8S28varMaWeEQM1htDvG3i4Rs23", "blocksMintedPenalty": 0}, + {"address": "QgYDTmMhJV6aEjihSwnj6DP8A5Vfjs4bgC", "blocksMintedPenalty": 0}, + {"address": "QgYH6XLHESMLcmiEXwZx6ygh9GHBgaWegG", "blocksMintedPenalty": 0}, + {"address": "QgYKYSktUGfnYKkMHGx6frDWVxGB1GeoEG", "blocksMintedPenalty": 0}, + {"address": "QgYiYCch4j7HSPpWaUxJ7BKRqDb6gApiwM", "blocksMintedPenalty": 0}, + {"address": "QgYijAkC8kb1S1JuPnouyN1RZnaaPNTqcX", "blocksMintedPenalty": 0}, + {"address": "QgYnEDH6ZruDcdqgiFZzv55tQ5fUCFiUfa", "blocksMintedPenalty": 0}, + {"address": "QgZ9AAyzZFagf7iGWpc8MNGjEynzd97aGW", "blocksMintedPenalty": 0}, + {"address": "QgZFEsaPe1NK3ZFExYwDkMq17MnYHFU271", "blocksMintedPenalty": 0}, + {"address": "QgZo6Cd7mRzxq65Ga4W5PyAuE3SSYTQPFY", "blocksMintedPenalty": 0}, + {"address": "QgaNvs5P2HJ9qWxbt7xp9qtWsXR6cuFXSS", "blocksMintedPenalty": 0}, + {"address": "QgaU2uiJtbEoz2eKys2Qbb9NNsRQbAjJzM", "blocksMintedPenalty": 0}, + {"address": "QgagEga4y7UQ8vMiZ16bDa2VDEiK9T5gbL", "blocksMintedPenalty": 0}, + {"address": "Qgb4X1UyTzcdARW8tJDnxLi5cndB9J1W3o", "blocksMintedPenalty": 0}, + {"address": "Qgbg6hcwZ9XzkQ2CUhQAQ92h2MDD9Dypcc", "blocksMintedPenalty": 0}, + {"address": "Qgbn16wmyS7zq91m3nwbViHdeth43yCwY1", "blocksMintedPenalty": 0}, + {"address": "Qgcc7xKqNeVEBdY89iYCGUprg6NB5ACYAS", "blocksMintedPenalty": 0}, + {"address": "Qgcpu26dQyjcDU4W6m6LYYY2ujEKGeiDa9", "blocksMintedPenalty": 0}, + {"address": "Qgctx13nCLeDo6nHUJoFHGGdCDU3bbW6kb", "blocksMintedPenalty": 0}, + {"address": "Qgd182EoUAAJRzcsSymm1g74yLvUy3y3Rk", "blocksMintedPenalty": 0}, + {"address": "QgdXupMvswAWSTGcTe4Rki6ngsXFCtwQSv", "blocksMintedPenalty": 0}, + {"address": "QgdYVfwCi7cVh7Loej2ELC6ff2txfBHASu", "blocksMintedPenalty": 0}, + {"address": "QgdfakaZH6VCheJFnUGtWewV3ag2ZKcFjz", "blocksMintedPenalty": 0}, + {"address": "Qge9AHfa9Fn6j4QFpP9JJrFn8RXs4frj4b", "blocksMintedPenalty": 0}, + {"address": "QgeXZg3gerFfFRoAeaFQJeTr275vjmzDAL", "blocksMintedPenalty": 0}, + {"address": "Qgf1akL6HPSh5jKLpxzGwrQbNAdBpFbdkZ", "blocksMintedPenalty": 0}, + {"address": "QgfFWoQp3dJkcRMFiqJT33YhRpA8ekpw9H", "blocksMintedPenalty": 0}, + {"address": "QgfGmQ8KGuhvUDGqe93ZCvS7hxs6Z7gPrz", "blocksMintedPenalty": 0}, + {"address": "Qgfh143pRJyxpS92JoazjXNMH1uZueQBZ2", "blocksMintedPenalty": 0}, + {"address": "Qgg6ENrJUF3bMB9r7Rbg7cJBw5AfxERoWJ", "blocksMintedPenalty": 0}, + {"address": "QghB68LMRcuuUHDz5kA2Enr2h2mZCRLi7q", "blocksMintedPenalty": 0}, + {"address": "QghNMgGxjQNUtgoYuCFFbvtoKj9Z8h6jCr", "blocksMintedPenalty": 0}, + {"address": "QghPP8rBgMwNzazCUny6TzaaLRLt3h9XBW", "blocksMintedPenalty": 0}, + {"address": "QghUmZyqaaaqBD4RJHLn7ib3yRuEaJoF39", "blocksMintedPenalty": 0}, + {"address": "QghVs5Ks9u6tGrtYqFizEoTGGyREo6zJY8", "blocksMintedPenalty": 0}, + {"address": "QghegJYEjY67qds9nnuxkj1kbEduKnmHhV", "blocksMintedPenalty": 0}, + {"address": "QghgWe9B2CPKrdu3bxDccTtVYrq63T9oAS", "blocksMintedPenalty": 0}, + {"address": "QghpmeuHgBTLykF8Q2mJbWoMvj3zKoJFnT", "blocksMintedPenalty": 0}, + {"address": "Qgi2Ma7EzqGWEmZEc3YD6S8uDBCWThiJmT", "blocksMintedPenalty": 0}, + {"address": "Qgi8u4HeFabYMtotGysYyXEJ4ngpeuufP5", "blocksMintedPenalty": 0}, + {"address": "QgkC4KfDk4F2bjcPN1WJgdB1V84ZLehGmS", "blocksMintedPenalty": 0}, + {"address": "QgmEQCUQr21rrw3EbCsEBitUcR86KkS8Qt", "blocksMintedPenalty": 0}, + {"address": "Qgmibxh6yxdm39W6SpRS5z7sXZcshJDyt1", "blocksMintedPenalty": 0}, + {"address": "QgnCNdhJpB4bvqmZ5hMrCxSfNcXq6QCnns", "blocksMintedPenalty": 0}, + {"address": "Qgo4AQcjWdWXifdjuJtr9swGCv5LE8VzAR", "blocksMintedPenalty": 0}, + {"address": "QgoRtrXNbLVNQT5rvqt7qhVbQQU8ZUw8Gd", "blocksMintedPenalty": 0}, + {"address": "QgorN5DKx4dGnY4gvra8EbtGFhoi6KHtGJ", "blocksMintedPenalty": 0}, + {"address": "QgpDGYc9KTyr8VU1MwoaeuCsQLJ5s5Ejak", "blocksMintedPenalty": 0}, + {"address": "Qgpk6PU1CgHH716XJLNadVTpVFb9fhaCTu", "blocksMintedPenalty": 0}, + {"address": "QgpvRcGz8UTZkQSR7YYTN3ZpgD4vyhPHDW", "blocksMintedPenalty": 0}, + {"address": "Qgq1b7Tyjr3RV85cPGfJtXWdcBpuCeEGkK", "blocksMintedPenalty": 0}, + {"address": "Qgqc2ikmqnDUkLJKpUsKxH8cmphC6bBBmj", "blocksMintedPenalty": 0}, + {"address": "QgrmJ1YbZyZ7npjDVpZB2XEEUPGycBoQRf", "blocksMintedPenalty": 0}, + {"address": "QgroHt8PTMWDnjHAyZFbSVsDr55UeALmVr", "blocksMintedPenalty": 0}, + {"address": "QgrxJicPKzXsgMfDrMEyTxWs99RWcfVtcT", "blocksMintedPenalty": 0}, + {"address": "QgsifXqfJtdsNbxqGYh3hExEpWWZDg9rKK", "blocksMintedPenalty": 0}, + {"address": "QgskouP5MuArnCMbqeNmqL9s1nWN6SVrWL", "blocksMintedPenalty": 0}, + {"address": "QgsozXr7iF9N91qXaAhg1CGsD94Ghsfkxa", "blocksMintedPenalty": 0}, + {"address": "QgsqJvDJuW5UfVhNSurN5aQvxmsxCGSBNj", "blocksMintedPenalty": 0}, + {"address": "QgtKhcYhU6EkJ5bNW63veR4L8icjDbuH36", "blocksMintedPenalty": 0}, + {"address": "Qgtdr2BvZhbu4AeSm3WB69yoAkGa6sZ3tu", "blocksMintedPenalty": 0}, + {"address": "Qgu3943joAqJSnwdCf63qfDtjFs1PZYhzU", "blocksMintedPenalty": 0}, + {"address": "Qgu4f4QMcTvSkVYPWNNvkipvrSTSedXQeN", "blocksMintedPenalty": 0}, + {"address": "Qgu8fo4Bgj3z4kP6rHjp7rPm1FJM73e9b9", "blocksMintedPenalty": 0}, + {"address": "QguVbCfB34HsDShuXyTFmT8Kexj1Cw1s9f", "blocksMintedPenalty": 0}, + {"address": "QgubgyuEdaGL4wyL5GJ6aLes2BNxksh7Vg", "blocksMintedPenalty": 0}, + {"address": "QgvorBFedtJMVLLryy1RbPBUyBuKSoGdyM", "blocksMintedPenalty": 0}, + {"address": "Qgw4xKhLTdF2EhJjreWCmDqmNDoHnFQuNU", "blocksMintedPenalty": 0}, + {"address": "Qgwsx17qH45DyMyoPC24Raf7WUKHHbUrpN", "blocksMintedPenalty": 0}, + {"address": "QgwuqdNQA8KmJgdgMCJ5rdxiekfukBKWH6", "blocksMintedPenalty": 0}, + {"address": "Qgx59bxu3agBsBADzqqUWb4fLuRG925NFF", "blocksMintedPenalty": 0}, + {"address": "QgxF8e6RfneeFw31YCpDpD7pLNR9GqpzTj", "blocksMintedPenalty": 0}, + {"address": "QgxXtg6pCwY45HyMfwBFmWaDriHZXEMsUa", "blocksMintedPenalty": 0}, + {"address": "Qgy19XvBz5V73WB1wrgMQJvrhW1uJL5mcx", "blocksMintedPenalty": 0}, + {"address": "QgyU3uvzv6kcJnpFySAeT6uhDgGCrx615Z", "blocksMintedPenalty": 0}, + {"address": "QgyjJhKdrm4AhNb4UAG7gG7DWqe6r2ZF8i", "blocksMintedPenalty": 0}, + {"address": "QgywVHenDV3oSbbNY25NpNnv6CjtVRsffa", "blocksMintedPenalty": 0}, + {"address": "Qgz8zNd5ybVNAMiYLMs98KQSJwuFih7UMN", "blocksMintedPenalty": 0}, + {"address": "Qgz9yRz7vUrJmjHZMfP7RvpwjXM4yH42jh", "blocksMintedPenalty": 0}, + {"address": "QgzFhCYVMygYdEwjBYpb8NVMXuuXEa78GC", "blocksMintedPenalty": 0}, + {"address": "QgzHUK4ji8sBbZE7MzZRtqFGnz8QDYi2gT", "blocksMintedPenalty": 0}, + {"address": "QgzLTwhRn1bgmpDBq1WCeZjrLGNZRdZMse", "blocksMintedPenalty": 0}, + {"address": "QgzmLQYKi9zWf389Q2RjcxkGgwxSp7ME4T", "blocksMintedPenalty": 0}, + {"address": "Qh1A1KT4y67w8Ka8Q3xebvt58t9CdiWDXq", "blocksMintedPenalty": 0}, + {"address": "Qh1SmM3TKtsJNZcWjjass6xzbTXqRjLher", "blocksMintedPenalty": 0}, + {"address": "Qh1mT4cWjynimWzoqbX2iu5qSs8YHb8bCk", "blocksMintedPenalty": 0}, + {"address": "Qh2DoQfvzdQCX4g6KYVB3tQKH1JEcp3MZ8", "blocksMintedPenalty": 0}, + {"address": "Qh39ue8yfRajkVfR6d5kamctv622sri349", "blocksMintedPenalty": 0}, + {"address": "Qh3Api7ZMkq6hE51F61Bkr9PSSUSDzEPCh", "blocksMintedPenalty": 0}, + {"address": "Qh3QKXfePVC2w5PpGuRnrJwdtdXLxYhVB9", "blocksMintedPenalty": 0}, + {"address": "Qh3crSPwk2TdSBMYiWPqDsQTLCWrnLwJk1", "blocksMintedPenalty": 0}, + {"address": "Qh3krjGWcBrJRMvoCF55nGyuBJxJYA9si1", "blocksMintedPenalty": 0}, + {"address": "Qh4XawiUvmr5qPu587K3vXQoJ6YPQYqLdX", "blocksMintedPenalty": 0}, + {"address": "Qh4XtfJrV2aorkussLgEyPR5Eh7nCqjsXZ", "blocksMintedPenalty": 0}, + {"address": "Qh4YyNwHsZX4dC6uhus8G4sdJRc78zBe67", "blocksMintedPenalty": 0}, + {"address": "Qh4vAumuZT11Q35QZzKyYgnKFyqByK6FHB", "blocksMintedPenalty": 0}, + {"address": "Qh4xsAM48W8BfEFAVNdyfnPYJugsutSPog", "blocksMintedPenalty": 0}, + {"address": "Qh62JcVJRV2ZLjGzxpRMqHjfm43pRjB8K7", "blocksMintedPenalty": 0}, + {"address": "Qh6325Fyw965jwBNmjDwYNq614T6vStkVF", "blocksMintedPenalty": 0}, + {"address": "Qh6CPZL5E88mRUFzk2rB3PSk5tTbZhUPNg", "blocksMintedPenalty": 0}, + {"address": "Qh728BZWZUn5v3pT1zfqz81VQFyTXuoYgs", "blocksMintedPenalty": 0}, + {"address": "Qh7FyaV4kjowv1n83FUUKkVtnpM8ogxVmW", "blocksMintedPenalty": 0}, + {"address": "Qh91QY48YeYUjpZH6mtADwE8CYA8rJ13vr", "blocksMintedPenalty": 0}, + {"address": "Qh9DHiBiYRPd9j6enwMYupc1tneynaTz8f", "blocksMintedPenalty": 0}, + {"address": "Qh9dQHsWJWyyziBVVArYFW9y5GGZUu8Sjx", "blocksMintedPenalty": 0}, + {"address": "Qh9gHDDqFWN7AVh3skpWsDU7pz8iXL7DMH", "blocksMintedPenalty": 0}, + {"address": "QhAPBdVTM2NjrKWcDMkrEy5FreAqVV84qb", "blocksMintedPenalty": 0}, + {"address": "QhBXkhDXGu2GZj3wtSeeaznq1onwjsQMkU", "blocksMintedPenalty": 0}, + {"address": "QhC6zJaBKCbisH5tHe5XW1ojkr1k53Ug9r", "blocksMintedPenalty": 0}, + {"address": "QhCEtAafi25mApM986b5Kjb9eJrSS3D2NF", "blocksMintedPenalty": 0}, + {"address": "QhCUhE1BgsztDv5pQZ6ZPVXpBpM4dWZF7y", "blocksMintedPenalty": 0}, + {"address": "QhCgxfyNn3587tEw8iZjocEJ1YK3uatrhx", "blocksMintedPenalty": 0}, + {"address": "QhDVFhFa2C5SbpqvzywVDd3z1Fi4pMe5cE", "blocksMintedPenalty": 0}, + {"address": "QhDifCxtzsXDSgPHVboKdDpNZYSy1gxe1U", "blocksMintedPenalty": 0}, + {"address": "QhErHKBCPYacEGh1ecTVGgwSDr13r7fJm7", "blocksMintedPenalty": 0}, + {"address": "QhEv2XWgEdoE1zM2sU4fkQzy6R9xfbNW1s", "blocksMintedPenalty": 0}, + {"address": "QhFXAXGaZmtbhXTVvch1jHEym7N8hUkVcy", "blocksMintedPenalty": 0}, + {"address": "QhFyPJvHTuqcQezKzKb15UbKVUPtg8Nezb", "blocksMintedPenalty": 0}, + {"address": "QhFysRpq9594hctQXs4HYckKVm4cnp97hG", "blocksMintedPenalty": 0}, + {"address": "QhGDpt1Q2RWLViHPDTRECmJwyM48stuCTs", "blocksMintedPenalty": 0}, + {"address": "QhGjhH6g9FmGZkJ2WqhSakGoX8kdDdD76G", "blocksMintedPenalty": 0}, + {"address": "QhGmpKdZ2mSYLiPkzDVpyN3hF3YpCzX6Zm", "blocksMintedPenalty": 0}, + {"address": "QhJNGWjBdsfzRP4YyhcWYN5L7FbK9v9GoQ", "blocksMintedPenalty": 0}, + {"address": "QhJhZsUfaSwyPLNpCy6iwHkeD9JdcLXMdJ", "blocksMintedPenalty": 0}, + {"address": "QhJvVqd1UysfbjnVs7WTFS3Ytzefy9oCtd", "blocksMintedPenalty": 0}, + {"address": "QhJwXCHYrgH1pNm9dMqysQBvHNYtLm5DFW", "blocksMintedPenalty": 0}, + {"address": "QhJzEpGk8XcRqAV2CYedGVebWFvvRXLt2R", "blocksMintedPenalty": 0}, + {"address": "QhK5bbud63tfeQb5oGcJDk1KC9PZWdS88S", "blocksMintedPenalty": 0}, + {"address": "QhKDDgpfyqSzBs85n6UKN7HdoAvq2e8rnH", "blocksMintedPenalty": 0}, + {"address": "QhKJQfaxccCHdJxU2jtdJZTgN7z9gcMwyu", "blocksMintedPenalty": 0}, + {"address": "QhKXDBBPJPAntbz7b1XGWwuGN3jQtjVpxW", "blocksMintedPenalty": 0}, + {"address": "QhKfmyjhLjehLKdLN13cZ89NiPe9UPCrb5", "blocksMintedPenalty": 0}, + {"address": "QhLZez8dAyPp2uYU2jLrEqmYDac3BSopEG", "blocksMintedPenalty": 0}, + {"address": "QhLaxxAyM38s4KMb7BDwWsqMom1jiFZ3cU", "blocksMintedPenalty": 0}, + {"address": "QhLq6uX4GRVSQDdeT5hP9B4XxhMUiyxESN", "blocksMintedPenalty": 0}, + {"address": "QhNJs7GkckWo2vmupYrFvcHGZkk4fYSBVj", "blocksMintedPenalty": 0}, + {"address": "QhNXU47g1PXcuRhofEZLqxjrWmfAE4MzNj", "blocksMintedPenalty": 0}, + {"address": "QhNboRsW8ZnQzDcSHAnJaiJWSqTXTZiqCy", "blocksMintedPenalty": 0}, + {"address": "QhNpZj9pCUFEDEQyD7ciewcSPYRJy7NCfX", "blocksMintedPenalty": 0}, + {"address": "QhNtVUc9ddn2z4FU3DiiaLY9ni8DKamKte", "blocksMintedPenalty": 0}, + {"address": "QhP2vouACGafQ92fWiRP6TiDwjXvdnY4Qc", "blocksMintedPenalty": 0}, + {"address": "QhP9ZiZKjtzoVukJMu7gpuUJC9dU1kkyp2", "blocksMintedPenalty": 0}, + {"address": "QhQTWoTL5Drypwf7jwA3cMayBgiREjALNc", "blocksMintedPenalty": 0}, + {"address": "QhQoJEJGwPLxizgrhTNhcmg594zGjHQ2va", "blocksMintedPenalty": 0}, + {"address": "QhR6YSN2W1FH6mkGteTk7nVWChSyekDiUP", "blocksMintedPenalty": 0}, + {"address": "QhRDuu4FeQd1tqHVUMg5G3xSem273b22p5", "blocksMintedPenalty": 0}, + {"address": "QhRH9dPV5V7yVe9hj3zurFEXHBRsikvvo3", "blocksMintedPenalty": 0}, + {"address": "QhRJUkeiBm8yR1P9i3TmQ6sMTiHHmi5Jkw", "blocksMintedPenalty": 0}, + {"address": "QhRPDUwDJBu7UvhH4iMFXxUxgDj9E3ptKu", "blocksMintedPenalty": 0}, + {"address": "QhRYVfs6nTz8S43t3xaLso5o3xutCUf5Vd", "blocksMintedPenalty": 0}, + {"address": "QhS6N3PhpRBb2iHXwXYKxpQfhNr6ux2UUN", "blocksMintedPenalty": 0}, + {"address": "QhSNKUqLSDVS35bNaSiDKst5JgAf3Vr8wp", "blocksMintedPenalty": 0}, + {"address": "QhSks4mm288R3mKQkgs3V2yYN5VTZhciGA", "blocksMintedPenalty": 0}, + {"address": "QhSqPLdqTS7xzAqTSB4tsMorjc3arKCmNK", "blocksMintedPenalty": 0}, + {"address": "QhSvJ4Wo5qfaknKRvuAr9eRU4dejSaKhCU", "blocksMintedPenalty": 0}, + {"address": "QhSvrRsSfGCva5gAZ2cL7ccRVq396mMw1Q", "blocksMintedPenalty": 0}, + {"address": "QhT1HCUMoHRw1w5wcjPG6ETZcPxthnVehm", "blocksMintedPenalty": 0}, + {"address": "QhTCFPL714Y8vQjbw7VZYjbFsBEBtfVxS5", "blocksMintedPenalty": 0}, + {"address": "QhUaNessbpAfKrFHw3GEYHNTPmuyJpjsPT", "blocksMintedPenalty": 0}, + {"address": "QhUstuypjvztHY3SAq4nd3Zpkf4FW5PTcN", "blocksMintedPenalty": 0}, + {"address": "QhUtmd9WdwKduAoLKyBPvLd4L6Mbp9stDw", "blocksMintedPenalty": 0}, + {"address": "QhVGgdaugmGUrqdm5Pdc5JME9nfo5cjw6H", "blocksMintedPenalty": 0}, + {"address": "QhXCHKapnVihs26RPdA3ZGpVsDEnpvhhb2", "blocksMintedPenalty": 0}, + {"address": "QhXPj4hfcRtq5HmSz2FnCrKb7EBQwc7q8a", "blocksMintedPenalty": 0}, + {"address": "QhXVg6TejmJqraB3mGG9RxSXD1xQohhGbF", "blocksMintedPenalty": 0}, + {"address": "QhXr33LKj3orgdx36rKgmdyxNQXgxYwjqM", "blocksMintedPenalty": 0}, + {"address": "QhYFybchfEESQrsY6YkpMn9mSfDe23epfC", "blocksMintedPenalty": 0}, + {"address": "QhYG6p1cHCWLwktArnpUjfB84Qfa3rAdDE", "blocksMintedPenalty": 0}, + {"address": "QhYWhdeXnJ8MU33WLXTy7ZhjYBe6RSGJgm", "blocksMintedPenalty": 0}, + {"address": "QhYbh9pYPq5JGUK4R9qbWUXav1GvxEkkA2", "blocksMintedPenalty": 0}, + {"address": "QhYjMwF5ADVj1dn1p3dsjSYJ2eUCrrLwZQ", "blocksMintedPenalty": 0}, + {"address": "QhZ2m2sZUjkFh5YKAqQmKwchHvqmZ1jQma", "blocksMintedPenalty": 0}, + {"address": "QhZ8AkbW9v6GeFdpTPSbewLbrw8aeQ4s9j", "blocksMintedPenalty": 0}, + {"address": "QhZWGvoo9z6XkmkacjMT33ZqkQerYGCJxY", "blocksMintedPenalty": 0}, + {"address": "QhZZDgpjVJimriahsbqtxeHs7y5yYSZAtA", "blocksMintedPenalty": 0}, + {"address": "QhZj3CwbTemVYMWVd3nj6Gd6CDNja8uk25", "blocksMintedPenalty": 0}, + {"address": "QhZq6fStDxvhgpUf218Qys81AAYCVCJ9RR", "blocksMintedPenalty": 0}, + {"address": "Qha2yCiwhtrxEbv2BpA5ro9VzuCgEZqRNW", "blocksMintedPenalty": 0}, + {"address": "Qha3XAqwK4fJf8Xz8W6vLRb1EvpiAS8HDv", "blocksMintedPenalty": 0}, + {"address": "QhapVhV7pNTHaZDHK2QPZyhkPwmHAL22Ht", "blocksMintedPenalty": 0}, + {"address": "Qhb9jfNCVycnVjSF6f6tWUmadCjzqiTKwc", "blocksMintedPenalty": 0}, + {"address": "QhbVZxYUuMR6L7hqKw1wSMJZcTMgKYZR5B", "blocksMintedPenalty": 0}, + {"address": "QhbuARAQThJTja8iCae8FzdJHbgy3TkAea", "blocksMintedPenalty": 0}, + {"address": "QhbuMgDYsoq8pyRSsnFL85gAvNZK5AyLpF", "blocksMintedPenalty": 0}, + {"address": "Qhc9Ep9yZXRHT3Ew8rMSrozwgdqptJL7Vk", "blocksMintedPenalty": 0}, + {"address": "QhcBBZrfDHFjnXNjVarQunMbKfLDzjmcTf", "blocksMintedPenalty": 0}, + {"address": "QhcoEYPeU78yxntNSn2X5nBXHo8SnStSJU", "blocksMintedPenalty": 0}, + {"address": "QhdT7CBFYsq8tr7mBAkTmNgJhFGbL71Fq9", "blocksMintedPenalty": 0}, + {"address": "QhdTQtVQrvA1RYfH6NAAyiBFWFSt5bji5H", "blocksMintedPenalty": 0}, + {"address": "QhdXVUE6nAVW5C4ZRnTa9221wr4DZM43Bp", "blocksMintedPenalty": 0}, + {"address": "QhddKWKaLTpFwhPzdNE1PXBEfvD3t2KTw9", "blocksMintedPenalty": 0}, + {"address": "QhdfARooQuw5dsvwUvYmjDfrNWXxVYuzZf", "blocksMintedPenalty": 0}, + {"address": "QhdoQaznQQKEoPTF9EC3N64T94ChqLcJnE", "blocksMintedPenalty": 0}, + {"address": "Qhdqxb5HhzJhgxM6ZmRHbngazNia1KwLJ7", "blocksMintedPenalty": 0}, + {"address": "QheGzUE7K8R8xi6gm92s1MUDwrrhydHEqp", "blocksMintedPenalty": 0}, + {"address": "Qhehg1xhyAHUz1dsLyVcRtggKuNGEQCyjY", "blocksMintedPenalty": 0}, + {"address": "QhfADjeXs9yRuTiRg6KDp8fyRfZsKRj4tD", "blocksMintedPenalty": 0}, + {"address": "QhfVP8ufyQDasMYjVohmpxatMnvK8YZGsD", "blocksMintedPenalty": 0}, + {"address": "QhfcQViRadoJnUvwdYNKhxPFoJxw7XR4Jk", "blocksMintedPenalty": 0}, + {"address": "QhgTtXLRTKr1iBUW3FJaEYDmTPygNSyyxo", "blocksMintedPenalty": 0}, + {"address": "Qhgw7sNkwqZb9dYXk44GHbvNSeeAmp5rEr", "blocksMintedPenalty": 0}, + {"address": "Qhh5FZfxV9KzdHJjrm9m6Ri5A7FPYSDdy4", "blocksMintedPenalty": 0}, + {"address": "QhhN9wRj99VFyJFLQkpdhcyneggaaQHpn9", "blocksMintedPenalty": 0}, + {"address": "QhhPBPQC5eGmgbRLhefDcnhLdYjfiiCoYw", "blocksMintedPenalty": 0}, + {"address": "QhhwEM9A9ctRYsHM4Z5cRpA77FAjUPty5J", "blocksMintedPenalty": 0}, + {"address": "Qhi1ZvYQRcEb8sX5TFDakQF51V4T8ocwCE", "blocksMintedPenalty": 0}, + {"address": "QhiCMcss1fB7MpKHMwPawU4R66gf3DKVNX", "blocksMintedPenalty": 0}, + {"address": "QhiDUYzZHMpzA4bqrDv9fspNyf9UHgcxQQ", "blocksMintedPenalty": 0}, + {"address": "Qhj7SiFnsFhpFSdPD63eYW5ePQnT8sViZ1", "blocksMintedPenalty": 0}, + {"address": "QhjYVHcryAopQRzbYvCVuJJYezZ4ZpWY2a", "blocksMintedPenalty": 0}, + {"address": "Qhje9C5g7JMB9mG9iybzgmVmEQzZGMxesY", "blocksMintedPenalty": 0}, + {"address": "QhjeowmVcBzdAyMWjfk6GoVvx4Cv2oFoFY", "blocksMintedPenalty": 0}, + {"address": "QhjmKnXHGSgdQScEev8MdkyyDaVmkncBQT", "blocksMintedPenalty": 0}, + {"address": "Qhm72D7gKRdCWw9k3GWwC4rA5byJLagfR8", "blocksMintedPenalty": 0}, + {"address": "Qhm93ShmKFRhuGN97G3PbiMfW1xQwrB7oV", "blocksMintedPenalty": 0}, + {"address": "QhmQdtesXqz8PcjXvw3hgDiAxwkQKiGU7M", "blocksMintedPenalty": 0}, + {"address": "QhmufUv7ErjBRDcCBh4QU1dNfp1Hbx1Aup", "blocksMintedPenalty": 0}, + {"address": "QhnBp5qVPqDXQNcLMVDtUZ5jmoaEfiUbsU", "blocksMintedPenalty": 0}, + {"address": "QhnH9VhzVaFSHu41RLejzaGk9NGPA1dRZh", "blocksMintedPenalty": 0}, + {"address": "QhnQzMsQQ9UoQsH6N7KTSpWr9JQyMCQ5Cs", "blocksMintedPenalty": 0}, + {"address": "QhnTiHhK38wZfnNQbMwpYbzNQCfZUySjG5", "blocksMintedPenalty": 0}, + {"address": "QhnUxRyWgYe3DHUPKvHJA9zh4DTfLb4Pis", "blocksMintedPenalty": 0}, + {"address": "QhnYrfuS1V8BwyV5nMmbPjqeCGEJ4euJdM", "blocksMintedPenalty": 0}, + {"address": "QhoMM9y7ZN3YvSJ5fkZdpTXhdV9kFfCFVj", "blocksMintedPenalty": 0}, + {"address": "QhoYs9fXiw5Ew64FfjGPiii66h1as4dNb8", "blocksMintedPenalty": 0}, + {"address": "Qhoc2gwVtGGZH21pAn1bRiNEFvsSD366cy", "blocksMintedPenalty": 0}, + {"address": "QhotJevb8JSeYEYSMzREQ3oc9DYLWxWuNx", "blocksMintedPenalty": 0}, + {"address": "QhqGi5P735WsVVYokM5djNM5RwUA8Sw9Bx", "blocksMintedPenalty": 0}, + {"address": "QhqHyJLhtSLB6jwdz1Ro6nTaLs5yABk5nM", "blocksMintedPenalty": 0}, + {"address": "QhqYLLdiHMdZNAr6V1cUU6wE1nEua296FV", "blocksMintedPenalty": 0}, + {"address": "Qhqu9T9XxUdf1JERpaeExApkqEcaEwPpaw", "blocksMintedPenalty": 0}, + {"address": "Qhr1PPGmbVmvHL7Xor1RKoU6wdjqZqFm9A", "blocksMintedPenalty": 0}, + {"address": "Qhr7Yub6uguMzVW1DFF7AtKiTeeEvaYqTw", "blocksMintedPenalty": 0}, + {"address": "QhrDuXfU5Q4AnhB6heejkdMMmuKdNfy31u", "blocksMintedPenalty": 0}, + {"address": "QhrVUgLftNdEMJzLD7H6U1UjiWpc8zMGVf", "blocksMintedPenalty": 0}, + {"address": "Qhreji3ui9FDExJd5iRn3PjuGx9sU1LbY8", "blocksMintedPenalty": 0}, + {"address": "QhsR5EmbTgnaD5EnkCDYEkK8iAPpQcxbF1", "blocksMintedPenalty": 0}, + {"address": "QhsVheHSyLQN4DTzyrE3RjKpLHkUuqzNaS", "blocksMintedPenalty": 0}, + {"address": "QhspjaTessFhiUBnthDqAyREf2nU8TDCUr", "blocksMintedPenalty": 0}, + {"address": "QhsvzicS9EQJ5VJitYsi51STeZs2QfqVeF", "blocksMintedPenalty": 0}, + {"address": "Qht6vdT7q7d7KZ8FDTSAj7SFKhJX9mfRz5", "blocksMintedPenalty": 0}, + {"address": "QhtfkeZHcj8dt9bPYhXgBFzAp3gzj3cur8", "blocksMintedPenalty": 0}, + {"address": "Qhue7o3mB5nfxFoteWzgGdrGsoqkByTVAC", "blocksMintedPenalty": 0}, + {"address": "QhugLYq2PmF6ReS4p1oPbR9PmZt7nJiVhN", "blocksMintedPenalty": 0}, + {"address": "Qhus3RLQKpgwfiz6enujiatjUFjndffmdt", "blocksMintedPenalty": 0}, + {"address": "QhvmEWp4XF2UpqG12CBzxa7cJi57BCRabS", "blocksMintedPenalty": 0}, + {"address": "Qhvmg9veFG5eGvsC42S9ytpED9VT2927hQ", "blocksMintedPenalty": 0}, + {"address": "QhvrtLZNnv7pAmhNFk2H2sWRVj2gtB3yDy", "blocksMintedPenalty": 0}, + {"address": "Qhvtu9V7VYr5BoSVGthSCsFvnQ85BFUyEb", "blocksMintedPenalty": 0}, + {"address": "QhvxSRBZvvXySpcgEouoWpRcsKoLheX1sj", "blocksMintedPenalty": 0}, + {"address": "Qhw8K4ztoAsRhYvU8dBFSarcszQhNLTdmB", "blocksMintedPenalty": 0}, + {"address": "QhwjyqMLKv2xsmy4sH7bN4F2scEkh9Dm9n", "blocksMintedPenalty": 0}, + {"address": "Qhx3EroZCGVJo1CLRD2WXsio64iysSQqBm", "blocksMintedPenalty": 0}, + {"address": "QhxHCaTSBfhj5ahPauiPz7eBxv6zNJFgDh", "blocksMintedPenalty": 0}, + {"address": "QhxSj9dGGuLSv1LUbe3SXnZCLAU2Nopzsd", "blocksMintedPenalty": 0}, + {"address": "QhxVUgmMSgZi3yneJUiPAVGfytfa4KsWPy", "blocksMintedPenalty": 0}, + {"address": "QhxuAWnQMNc26BBLGruoAgwcfunwj9Sh97", "blocksMintedPenalty": 0}, + {"address": "Qhxury1neFcNbDGcXFUZenCzHQrmRTgfSp", "blocksMintedPenalty": 0}, + {"address": "QhxySpV5BEvS25CJ5gKZgi5vHadXDpmfUT", "blocksMintedPenalty": 0}, + {"address": "Qhyc1Ax5worhLanwpR1Yj3CErDdN5Z1d8u", "blocksMintedPenalty": 0}, + {"address": "Qhyn1REHRLRZZv3Hh42s84Qu56474SVZob", "blocksMintedPenalty": 0}, + {"address": "Qhz1ZUcwgUoYGMLhkLAM6Qpef9QYPYyMhZ", "blocksMintedPenalty": 0}, + {"address": "Qhz7obyitxKvjYqUPsPyZq7cDdGfJ2Ejpa", "blocksMintedPenalty": 0}, + {"address": "QhzRkxY4Y3qGjSUXZVv3HEKMAqzPw3r2K5", "blocksMintedPenalty": 0}, + {"address": "QhzgNpA3veYTZXpdvGBaRBiFbApFRyGHZH", "blocksMintedPenalty": 0}, + {"address": "Qi1DnGf2eRTVmAD1uN7E5yafhASS3bLzFQ", "blocksMintedPenalty": 0}, + {"address": "Qi1zhKzqtTXujsSSpjkECv5VwRMWTLZBRJ", "blocksMintedPenalty": 0}, + {"address": "Qi28A5Shsb3v3rhsTUzXaEhFV2Ls2J5MhW", "blocksMintedPenalty": 0}, + {"address": "Qi2n8zve8YoAcAnuc5bfRvoBpMJKp2QQpX", "blocksMintedPenalty": 0}, + {"address": "Qi35PZZJG34tywzGDvsRV64GoWVaSNqXpe", "blocksMintedPenalty": 0}, + {"address": "Qi3A9bgPjD65dPrutojgNHsXcAb53B5so5", "blocksMintedPenalty": 0}, + {"address": "Qi3GcwM9TEnbB7r13KPFaF3FzbdHHjhCn3", "blocksMintedPenalty": 0}, + {"address": "Qi3LjtdYdyxNrmDYnJNWD96tBdFeLFKDMQ", "blocksMintedPenalty": 0}, + {"address": "Qi3QVgHQ3Dz9DZqPSUXxVuEPCi9oJwGJ7G", "blocksMintedPenalty": 0}, + {"address": "Qi3SHHzeUutLrEky2WhVdmn9rH6ihNViAR", "blocksMintedPenalty": 0}, + {"address": "Qi3YYFLrUxJB36RzU5F6yCzkmzzArLk9GT", "blocksMintedPenalty": 0}, + {"address": "Qi3rj7oKSVz7RuZWKWEDCuaAqC6RAL8vpH", "blocksMintedPenalty": 0}, + {"address": "Qi415aBz7TSw2nmddVBMmbNVWEyKSN79aB", "blocksMintedPenalty": 0}, + {"address": "Qi41GZ1KG68Wx7AghgHHSLvXa5vSCYSqXr", "blocksMintedPenalty": 0}, + {"address": "Qi4318BPc5Ef11N3Q8wHEyDbtoqJQnuii8", "blocksMintedPenalty": 0}, + {"address": "Qi43G12pjrtUXmCigXK4cX338sioKGvxqR", "blocksMintedPenalty": 0}, + {"address": "Qi4RCSuhRD3i1JkVEeXViMLRk4WFXL3DWG", "blocksMintedPenalty": 0}, + {"address": "Qi4dtAuBvmikP6xUAL6ZB1NWAx7Grzay4S", "blocksMintedPenalty": 0}, + {"address": "Qi5bsUnZCGWfG9BXTPjtGfx4WitjQMuWGZ", "blocksMintedPenalty": 0}, + {"address": "Qi69aGyM7U4PcaSBGNXmT6JeZcdFQGRpXa", "blocksMintedPenalty": 0}, + {"address": "Qi6FyJCxNs6KKKmJ588q21MVTyRkGLW5Pq", "blocksMintedPenalty": 0}, + {"address": "Qi6Gakfv6EA28BSRz3goizHPDLjxjPhzby", "blocksMintedPenalty": 0}, + {"address": "Qi6NKwijLVuFBVGZETfxANCAHagFcp7jzJ", "blocksMintedPenalty": 0}, + {"address": "Qi6c1yws9aR96VmS7wPBHs9FVBN7DV2mvY", "blocksMintedPenalty": 0}, + {"address": "Qi75qMPsL1MV6aMjUm78w6LYAXH1cLL22v", "blocksMintedPenalty": 0}, + {"address": "Qi7K7gt8sDTR4GgpShf14DVxK1bwwCZqJm", "blocksMintedPenalty": 0}, + {"address": "Qi7XhWEqhdM8EAYtsGGh13fVmyRZqiYmB7", "blocksMintedPenalty": 0}, + {"address": "Qi7ZNEBgSSBabHSYM8S9EFp4HRcEt1PwDg", "blocksMintedPenalty": 0}, + {"address": "Qi7hNxgTt5oA9676Xzs62s3umYPRToym5S", "blocksMintedPenalty": 0}, + {"address": "Qi8S3cP7juJYBjy62LEhtergnjgGQ6MrV7", "blocksMintedPenalty": 0}, + {"address": "Qi8VtJUpm5uyyo6bKrnU4BZJMvcsVtvmWU", "blocksMintedPenalty": 0}, + {"address": "Qi8fPB5qvXUmJh6wgvvec5zKwAqYSnRj49", "blocksMintedPenalty": 0}, + {"address": "Qi8hFD947KXctRHEUt48L8HRKnzrE7p6U7", "blocksMintedPenalty": 0}, + {"address": "Qi9AX1QjvwkgWH34jRuwF859Hfnkcfj5PW", "blocksMintedPenalty": 0}, + {"address": "Qi9ePbCaKEPDjegiiYuxEs6i24FnoU5vs1", "blocksMintedPenalty": 0}, + {"address": "Qi9iHfdWQjWqAJ3toQ67bJCnoHXE4Xqsps", "blocksMintedPenalty": 0}, + {"address": "Qi9qcox1udzfU7KTSGQpvPVVGwMjW4Y8Kq", "blocksMintedPenalty": 0}, + {"address": "Qi9yYKgo5wWEQsPr72jycLrJ2MB3VV61DS", "blocksMintedPenalty": 0}, + {"address": "QiA68A9eCJjmNumPgyw6q8kDZtDRyyTWtA", "blocksMintedPenalty": 0}, + {"address": "QiAKsfkwYxEk5inD97RqZJpq9FNY96RCUG", "blocksMintedPenalty": 0}, + {"address": "QiALFPJ41xtRCVHF5iEcsgQChZHfq3HUVd", "blocksMintedPenalty": 0}, + {"address": "QiAYQCTSZ93PXiJKJsnVE8E8hSMeFPiKWu", "blocksMintedPenalty": 0}, + {"address": "QiB4f7jqsG5YnHrq2nUguoJSJ8o37HkY3U", "blocksMintedPenalty": 0}, + {"address": "QiB96hPfv4tCjsyMHCzbguP79HdBJeZWK6", "blocksMintedPenalty": 0}, + {"address": "QiBQweK8Cp1NZfTHQBJHceGivco7tF5fVL", "blocksMintedPenalty": 0}, + {"address": "QiCdMG4Am2wnpP6Bb3vMpgtNqLtaLbsAN1", "blocksMintedPenalty": 0}, + {"address": "QiCxqvnJvp7wv4SsqvTBHnCET9T7bidjGk", "blocksMintedPenalty": 0}, + {"address": "QiD8boifB6p6Cu72GRsCastmq4MjagKiFs", "blocksMintedPenalty": 0}, + {"address": "QiD9aDtHTAfCBvvuEAuABo1fwuWdEAw9S4", "blocksMintedPenalty": 0}, + {"address": "QiDqczqu9nu15yehQj2w8GcMZpBu3hDVFi", "blocksMintedPenalty": 0}, + {"address": "QiECgv8y1vz37r3CmBZW68CMqGY8KDk6H6", "blocksMintedPenalty": 0}, + {"address": "QiERL4zeySk6VWp4oecTkZLAagpYi9UFWt", "blocksMintedPenalty": 0}, + {"address": "QiEepRg4ZYWeLNr1xhngedYbWtz3nsNvAs", "blocksMintedPenalty": 0}, + {"address": "QiF2dS1ABiDHhJR6qgm4XQjbkfm7USZ9Ar", "blocksMintedPenalty": 0}, + {"address": "QiFVjNdmWuLHd7vJwBVKCzZU15zEkyTATT", "blocksMintedPenalty": 0}, + {"address": "QiFuqZ78kCNHThUFpixib5e6ZmmxSzS9Vv", "blocksMintedPenalty": 0}, + {"address": "QiFvFMhYRHWXeMu2Pi41BJqPWWSHRTSvKu", "blocksMintedPenalty": 0}, + {"address": "QiGBmXdS3JthXKJzXYTHKQzXhUGb7q1H4m", "blocksMintedPenalty": 0}, + {"address": "QiGmjuh3gxCXV93rGcESDizd2hAdtxM3m3", "blocksMintedPenalty": 0}, + {"address": "QiH39rHGMfgX6RGgvaASgaToWTVDmzUB9w", "blocksMintedPenalty": 0}, + {"address": "QiH7BhDjckQ1YBYW7Srb9oAgAYD1XJH9vi", "blocksMintedPenalty": 0}, + {"address": "QiHKa8zJHuSPrHzwTNWEykpLC7VZaTtgNg", "blocksMintedPenalty": 0}, + {"address": "QiHYiYu6nNmpcCNTdzahRWeY4XA8bPdpig", "blocksMintedPenalty": 0}, + {"address": "QiHas58k7bCNz5Yfnr7FoBsgSMRwBuGeUt", "blocksMintedPenalty": 0}, + {"address": "QiHibtBZH3Zt8dDHTVth9vtkTu4hySpcxk", "blocksMintedPenalty": 0}, + {"address": "QiHpEhcxCgtXQgFtfj9vDHbmR7JjoirgaU", "blocksMintedPenalty": 0}, + {"address": "QiHteoXgRHWVhVpLm5yBsqUzNHMNAFnDAr", "blocksMintedPenalty": 0}, + {"address": "QiJdCGzpieUYnHVXoFgxecJT6xgWJdUM2T", "blocksMintedPenalty": 0}, + {"address": "QiK9iB5CDheiRfDF4SYDyXT1aKv1DT6ixT", "blocksMintedPenalty": 0}, + {"address": "QiK9kv6eJxkzmFscKeEgqeAFmdxzBHkQ7Y", "blocksMintedPenalty": 0}, + {"address": "QiKAbEuEzqB2NhTKVA6DGPCUeCNuguLVmw", "blocksMintedPenalty": 0}, + {"address": "QiLHDj66pqHYrRattE1phyJZXq6AjwFsZB", "blocksMintedPenalty": 0}, + {"address": "QiLSrsKauRt3NAm34xkbLUW6oEZTG3EycT", "blocksMintedPenalty": 0}, + {"address": "QiLbLy3ZCqHLnxqT8h6j3exRTbsduWo9eB", "blocksMintedPenalty": 0}, + {"address": "QiMDE3k31BvQAxfpzetdYBxMt4aNnsRf5p", "blocksMintedPenalty": 0}, + {"address": "QiMpgbaJKuFnQGRuBsjnvarusLKVsxV5Wb", "blocksMintedPenalty": 0}, + {"address": "QiN5pcggfP7RKPtq34c7XY5HggBLnqzjsT", "blocksMintedPenalty": 0}, + {"address": "QiNKXRfnX9mTodSed1yRQexhL1HA42RHHo", "blocksMintedPenalty": 0}, + {"address": "QiNebqTbLLs65pqu9wD8jxK7mmt1RSYmuo", "blocksMintedPenalty": 0}, + {"address": "QiNnzh6f6AZYTUgePtWA92vKFbMALchReW", "blocksMintedPenalty": 0}, + {"address": "QiP2SKRHqmC2A9zsGqmCQcjamASBGKRNcb", "blocksMintedPenalty": 0}, + {"address": "QiPtAyLqtFvCBeBtPxqcF1KVurHWjBXtwx", "blocksMintedPenalty": 0}, + {"address": "QiQ7e5ZuJN2GsvzRbmXek8Vq8HGPPfP4nL", "blocksMintedPenalty": 0}, + {"address": "QiQAmZTksiGaTrKX7NGCUYxkqb5chp7Yy3", "blocksMintedPenalty": 0}, + {"address": "QiQCHAcDe6fbWLrcek53oYUTzbHM9xSp2j", "blocksMintedPenalty": 0}, + {"address": "QiQEHvsYvTRMCKc5ABtwM2hdxaMNuiRuZt", "blocksMintedPenalty": 0}, + {"address": "QiQVqSeaB5gUiB2UebtcSL2AW2Kqhofb2s", "blocksMintedPenalty": 0}, + {"address": "QiQtMuuUpv1WTKbFNVhRKi1upuoPaqCN3E", "blocksMintedPenalty": 0}, + {"address": "QiRNRnKgeDmsXyce83GkfAEGnK5cQ83JBW", "blocksMintedPenalty": 0}, + {"address": "QiRgmUVftGFKKwWC3fCanFJ8srdWdQUzPZ", "blocksMintedPenalty": 0}, + {"address": "QiSE26D7GZrFs6v76FuGqHz19VGdUEJWLR", "blocksMintedPenalty": 0}, + {"address": "QiSEchqiTSuZT1mgoxtf6ftofao7jw87zq", "blocksMintedPenalty": 0}, + {"address": "QiSKFLjErHUdL7k4wChgqqifG95AL9C8Dt", "blocksMintedPenalty": 0}, + {"address": "QiSjZ73Pyd2dG8XgoFKxLw1hajLVP3tGhb", "blocksMintedPenalty": 0}, + {"address": "QiSqjucECR1HC3GxtYvvAPncYA6q83Zda9", "blocksMintedPenalty": 0}, + {"address": "QiSx3pw2a8BkT5MpV9oBsuviba6aUiPuHf", "blocksMintedPenalty": 0}, + {"address": "QiTHAzC3sQHdbQAZZURn69Lx1vMyztdmDY", "blocksMintedPenalty": 0}, + {"address": "QiTMqsMpGQmcCHJB3TuSQ1XcKq26tqDJ6j", "blocksMintedPenalty": 0}, + {"address": "QiTR2EQVSLQxUohKUmEKCRzhE6rP5d5Fv6", "blocksMintedPenalty": 0}, + {"address": "QiTvrWxvGXoKfv2WPVQuXQuEZSksBdVjUt", "blocksMintedPenalty": 0}, + {"address": "QiUDFGq1gRfvv1vQmHLEXBmtUGvUSwpUKW", "blocksMintedPenalty": 0}, + {"address": "QiUEUisz73QgL52o8K6d9A8U8dvH4uNNaZ", "blocksMintedPenalty": 0}, + {"address": "QiUpmFtzvPdvHNJmmF9ohckV2CCFxFfRnq", "blocksMintedPenalty": 0}, + {"address": "QiVVBe8NzYr6jVHCh9fkvtBfXgmcm7zYSG", "blocksMintedPenalty": 0}, + {"address": "QiVcmyMQko1i4yyjFLGwfAkNLXR44jPQHH", "blocksMintedPenalty": 0}, + {"address": "QiVxexxLsAktBmHFS8d86uBfMAtJPzjRar", "blocksMintedPenalty": 0}, + {"address": "QiW9gzkfWKeD28z1iLvjVghPz2imCANmJV", "blocksMintedPenalty": 0}, + {"address": "QiWzQiyBmxbKLRoDn2Y1HxL9wEKEHVB9Cd", "blocksMintedPenalty": 0}, + {"address": "QiXpBEQwGiHjsBJEuesjzD3j5bB8FDjRgJ", "blocksMintedPenalty": 0}, + {"address": "QiXqwxp4Hc5CFJCZjQSXLoH9TDYh9Ld7FL", "blocksMintedPenalty": 0}, + {"address": "QiXyVzeXFCG7TEeCz9TSfrpcnx91F8JFp8", "blocksMintedPenalty": 0}, + {"address": "QiYf41oLJSJH99sYGk2EZR6sAAZbDtt7ej", "blocksMintedPenalty": 0}, + {"address": "QiYwnwLK5L1TmKRLs7eCgHez48VGds6G6c", "blocksMintedPenalty": 0}, + {"address": "QiZteJ4sXVpCjDu1EBhLAanCaPB17a99YR", "blocksMintedPenalty": 0}, + {"address": "QiaHaBkVjDzyaYy1sy7cYZqbhrQpWUKTVg", "blocksMintedPenalty": 0}, + {"address": "QiagDurFdqMjMmXt3WAcenw5ebm5Lw14YP", "blocksMintedPenalty": 0}, + {"address": "QibDH5wNWqnXQcMiDsB5m4HyVFDekXg8hs", "blocksMintedPenalty": 0}, + {"address": "QibJxGWj29y7kdNm7Ut5YH83tR69w7aNuF", "blocksMintedPenalty": 0}, + {"address": "QibWLSNGwNeqP6APVVLRaCQdDB39k1JUGC", "blocksMintedPenalty": 0}, + {"address": "QicA4vz9aiWPQjBq8uCjCCTe2LpsoGB5p6", "blocksMintedPenalty": 0}, + {"address": "QicSMUkBYFdmYQzTENjUia9qc6tqWkZHzr", "blocksMintedPenalty": 0}, + {"address": "QicTnk1EiAhVQyK2fjgZ2BCB7ngoQKckqN", "blocksMintedPenalty": 0}, + {"address": "QickSqkXkVf7onNGSPUPFT6cF73hrSn8TK", "blocksMintedPenalty": 0}, + {"address": "QidCdXBzZdkEuzmBhB4wdsaJscF46Sg9x3", "blocksMintedPenalty": 0}, + {"address": "QideKRbaUvRpNSU2Mkf6mAto9XggArsgt5", "blocksMintedPenalty": 0}, + {"address": "QidjHNw1nHsG6f9R1FWPdVU4mmr1VPMDGv", "blocksMintedPenalty": 0}, + {"address": "Qidotvu59nuMmCcTGr7HGxXeDFzco4LW7P", "blocksMintedPenalty": 0}, + {"address": "Qie38ED9zT3o2vZHLakEfFvJfY1m4SjMC2", "blocksMintedPenalty": 0}, + {"address": "Qie5sjwjJw8beoxHvsBrv74uNK6hsKQfM3", "blocksMintedPenalty": 0}, + {"address": "QieKqEiVrWm4hvT6GkLoBQqqmdBKJpQxPi", "blocksMintedPenalty": 0}, + {"address": "Qif19g7LHeAAbSfEWexFAcbKevEerAdN8P", "blocksMintedPenalty": 0}, + {"address": "QifWMvNWHR9pHrm8JUdrRBCdhKcSGRLhw2", "blocksMintedPenalty": 0}, + {"address": "QifZCHiuEozhUKekgsvv6Qy4qMP2uYDzaS", "blocksMintedPenalty": 0}, + {"address": "QifgBRq5DE5sh11rX8eLP1pyEvpHkAHopu", "blocksMintedPenalty": 0}, + {"address": "QifzfVseCvXzfeNN6eQDWkn5GgrQeuEt5F", "blocksMintedPenalty": 0}, + {"address": "QigLB7XhcnfSgD5YXhLNBkkoQVhECxwLeW", "blocksMintedPenalty": 0}, + {"address": "QigRWhiSRckg2RRPsTZdJWNntJmFpoGDBj", "blocksMintedPenalty": 0}, + {"address": "Qigsnd3GojB9tNM7P7EmKRbCy9mBkvVkRQ", "blocksMintedPenalty": 0}, + {"address": "Qigw5NUVp9xTitEUQxMV9n4DTAQb25RWVa", "blocksMintedPenalty": 0}, + {"address": "QihycTKrqRhYFox59WTdWHuLZuEQ7DYwR9", "blocksMintedPenalty": 0}, + {"address": "QijHAGvq6CKjgVXyWT6bM7d754dyjYyHtL", "blocksMintedPenalty": 0}, + {"address": "QijJHU6tDCDPzumqJVxw9dHR9dRGBouGko", "blocksMintedPenalty": 0}, + {"address": "QijTmhnL8HBuYZiadow4tJUjT6GcTWDkN2", "blocksMintedPenalty": 0}, + {"address": "QijcTThW4QQCaSpbViGB2ogsKVTsekyGTF", "blocksMintedPenalty": 0}, + {"address": "QikLT9HksYBFm74Dgefes6RKuLDb417hRS", "blocksMintedPenalty": 0}, + {"address": "Qikv6EXyFAF8YDZ21MkUojKi1e6NiZxmQ6", "blocksMintedPenalty": 0}, + {"address": "QimeifdEa2bBJbnN5jZzGi2sotAiUjwWQk", "blocksMintedPenalty": 0}, + {"address": "QimzFzDYUUmkDnUNJuDCmR7LVJ8XC17D1V", "blocksMintedPenalty": 0}, + {"address": "Qin3nHDknhdHr5YbBbNHny5VM9EQBsox2g", "blocksMintedPenalty": 0}, + {"address": "QinRhT1ZeFYGft5uEHU2Rk3caAYshatW4e", "blocksMintedPenalty": 0}, + {"address": "Qini2BxRvZEyKfkiXaneTPczwPe7iCbgep", "blocksMintedPenalty": 0}, + {"address": "QinymAGzooazefdykPawLKLBt22ehcj7sG", "blocksMintedPenalty": 0}, + {"address": "QinzBkiTgXR9hWqSbJh1yaxjxCBuSEhNp6", "blocksMintedPenalty": 0}, + {"address": "Qio42VNwKdwqBTn6yTUGnSLZfhepyc1KPi", "blocksMintedPenalty": 0}, + {"address": "QioBbosmSQZ3cwjuVqNBFPRMarGZNGUNcq", "blocksMintedPenalty": 0}, + {"address": "Qiodx8pWAcB5MA1nKAdfKmrXgHqu6QYSsR", "blocksMintedPenalty": 0}, + {"address": "QioiMUDomNramMQdPWVAY9LNqg8Rmtxk22", "blocksMintedPenalty": 0}, + {"address": "QipLYcLZFaH5qzgUyW5L2pf22y62FErg8F", "blocksMintedPenalty": 0}, + {"address": "QipShPjuTeqVHXC6RX9ShzoVzxQ9HUbFmG", "blocksMintedPenalty": 0}, + {"address": "QipzFsWczmadRUcSSXqPbKpnXt4zJBv3cd", "blocksMintedPenalty": 0}, + {"address": "Qiq9eV7zFo26oSBm77jHLT3jZqpKxgf4Vm", "blocksMintedPenalty": 0}, + {"address": "QiqFFYnNW2dHXHBsrnskM6HcjKAKXzByUh", "blocksMintedPenalty": 0}, + {"address": "QiqKmxzQzesURuV5wZBKfCxJgaDQe3M4kg", "blocksMintedPenalty": 0}, + {"address": "QiqNsfhJNZf7ScsWswcUukdMDngiSXLjn8", "blocksMintedPenalty": 0}, + {"address": "QiqQJhP9zi2ydP7EzJzBREUPsKojZDjtme", "blocksMintedPenalty": 0}, + {"address": "QirkSErDSzczrRAd9fCz2xbeuHEfrvAqx7", "blocksMintedPenalty": 0}, + {"address": "QirqVu4Yk75SUe7ogRkn5VC9cWTmsugDGd", "blocksMintedPenalty": 0}, + {"address": "Qiseu6fGxHcmAwjuFxzvgNZXiUzE6oigx5", "blocksMintedPenalty": 0}, + {"address": "QiskeHug546KSpqiiRebE6LvsUoe41xdZa", "blocksMintedPenalty": 0}, + {"address": "Qit6d2N1YayuuXpu5Litv9GYhcnqTpz7xL", "blocksMintedPenalty": 0}, + {"address": "QitPXtRSR7xcRYVAknXZ4xKhezAd9N2w3e", "blocksMintedPenalty": 0}, + {"address": "Qiuk4CKTf4Faowpw39wErMN466MiDxAVTU", "blocksMintedPenalty": 0}, + {"address": "Qiukd7iKaWYTZdeJeeSWDqajuu8uiV1uL7", "blocksMintedPenalty": 0}, + {"address": "QiuwwcjAoyxqNvJXFaXNF6FxBN7t4DF9NX", "blocksMintedPenalty": 0}, + {"address": "Qivijbafm1qLHjDEpRJcP18u6Z7iuBcrPn", "blocksMintedPenalty": 0}, + {"address": "Qiw4vsu8CVaAemGmeZohkSJRRDnQwk7Ey8", "blocksMintedPenalty": 0}, + {"address": "QiwMkmTpn9WuzMtNK4kDJLa3qmCJXY18WW", "blocksMintedPenalty": 0}, + {"address": "Qix4NmtJa5c2wJF3jdkjnyPd3d4UU2ZepT", "blocksMintedPenalty": 0}, + {"address": "QixXmh6g8FceSC7AhrvFwqC6gFoCNRMnvV", "blocksMintedPenalty": 0}, + {"address": "QixqRjrv8TESD3x4ELUksVhGwbcHdxqNsa", "blocksMintedPenalty": 0}, + {"address": "Qiy48nBmiuk5PLKqmHeV936jHeMpMtqsXw", "blocksMintedPenalty": 0}, + {"address": "QiyQGa6FbLm3Fef39Ryr3oLynUuhxA5YS2", "blocksMintedPenalty": 0}, + {"address": "QiyVKMvFHSwt9obwRtWNP2MQPu8SjwqEMm", "blocksMintedPenalty": 0}, + {"address": "QiyaH8he3n65EKefJmbmaWpKAhSA3okfdY", "blocksMintedPenalty": 0}, + {"address": "Qiyg5FtvZeTYf3oSUbchu5PzAKWqQaz5sf", "blocksMintedPenalty": 0}, + {"address": "Qiyvf43DDLmD7zUDvugC4cbtaswBQSDPKG", "blocksMintedPenalty": 0}, + {"address": "Qiz4yjVmE8ZpPCUxghJrtMLqAHcYKVuWBz", "blocksMintedPenalty": 0}, + {"address": "QizGvpsmoSmK8CP5evtZkwxqCArF5DdXgj", "blocksMintedPenalty": 0}, + {"address": "QizjzY6GEnKXWuGWq69suxnGJR7szXBx5j", "blocksMintedPenalty": 0}, + {"address": "QizwxsJifgGEfeQdYNEX99pHeWrKroM8T1", "blocksMintedPenalty": 0}, + {"address": "QizxeHQe3u9xFh2LqSb24cmWUDNEed9vzB", "blocksMintedPenalty": 0}, + {"address": "Qj1NEfvLfXr19CqTVCdE1hDSXMS4evjLQc", "blocksMintedPenalty": 0}, + {"address": "Qj1it843s3J2Hs5NJWyf4iBdVKFw9xFUrw", "blocksMintedPenalty": 0}, + {"address": "Qj2KMKdhsPoA6UWMTGrQVv589dwiSc3tTS", "blocksMintedPenalty": 0}, + {"address": "Qj2Tk1KDeX9wXbJpQTYHaBELdgUyJXFHQ4", "blocksMintedPenalty": 0}, + {"address": "Qj2qGCJe81P7JrhtJKQYnZEbdi4HUZSPy8", "blocksMintedPenalty": 0}, + {"address": "Qj3BJi7bV34A9zMFrzCAgJ4rKaFMabY93X", "blocksMintedPenalty": 0}, + {"address": "Qj3HzGcGC77eJFWx1xQHwS6QArtffLDfRo", "blocksMintedPenalty": 0}, + {"address": "Qj3RLZKF9qtu5kmTqJthbAJ3cWGH1g7q9U", "blocksMintedPenalty": 0}, + {"address": "Qj4LNxY3gALHJwbY1WvgMsogJqZVY9yBvx", "blocksMintedPenalty": 0}, + {"address": "Qj4eXFS7rerY8cfuzMjrqvBturSgkGUkuY", "blocksMintedPenalty": 0}, + {"address": "Qj4kadRYmzWz7PAC4mJXVQegq1B7ZN6ATx", "blocksMintedPenalty": 0}, + {"address": "Qj4pn4RiiukUmyK2e5oLz2yD8V9NoYNxpQ", "blocksMintedPenalty": 0}, + {"address": "Qj4zGs4Vjy4dtW5MMmQGnbiSHwQqKm1JyN", "blocksMintedPenalty": 0}, + {"address": "Qj52piEzAryyH36Ahqoo9kTL8Qwku6AD9g", "blocksMintedPenalty": 0}, + {"address": "Qj5K4yW2LtE8LUxPspSMExScXJqyrcS2vh", "blocksMintedPenalty": 0}, + {"address": "Qj5ojSVte2DC9SwcN3vjGrWLUY4ZsUbiuW", "blocksMintedPenalty": 0}, + {"address": "Qj6FUF6wBtVsPEyMyTA3iWHZRyXVoK79zH", "blocksMintedPenalty": 0}, + {"address": "Qj6YeDBmp7peV4Uo3gotZ6iQZ3NjQh1eLd", "blocksMintedPenalty": 0}, + {"address": "Qj6nk7RCJcB6gB5SZYGnKrqk6umyVD2XWT", "blocksMintedPenalty": 0}, + {"address": "Qj7Bz5ZroUBELRoz9Z4p4RievfEUAEuGH3", "blocksMintedPenalty": 0}, + {"address": "Qj8Cgn3FGdEt9mXWNQ7Vtj3BeFqDxWJhtF", "blocksMintedPenalty": 0}, + {"address": "Qj8MELPaRq8aFsNXPc3omJrUbWo5JaZQ2n", "blocksMintedPenalty": 0}, + {"address": "Qj8cst6mwGaDjDJDmQiubAQ4mr8wxcodur", "blocksMintedPenalty": 0}, + {"address": "Qj8ib3Yv3n9a8xJKCVgxJWFmG32VjPG29p", "blocksMintedPenalty": 0}, + {"address": "Qj8qZe2Q3MMeaksjtNrhxCybxYzsR3eDEx", "blocksMintedPenalty": 0}, + {"address": "Qj9CTpJpbSmc2Zck5ry1XHEYZkdq7nwxJe", "blocksMintedPenalty": 0}, + {"address": "Qj9LMX3g28xghGB6u1yYk3xztkLTzeWqq3", "blocksMintedPenalty": 0}, + {"address": "Qj9XrYTGvLjV5V5UzWDHZyTFgDmxEYyQZZ", "blocksMintedPenalty": 0}, + {"address": "Qj9ZevqHnhhghYGQzi8XFn6LtZhWKedCxT", "blocksMintedPenalty": 0}, + {"address": "Qj9kzpYGyxR1rNQfGVS2sD6ZK9BdPTuXqP", "blocksMintedPenalty": 0}, + {"address": "QjAYoXUodDnMqCYwC2N2F2ip1etPUarrLi", "blocksMintedPenalty": 0}, + {"address": "QjAaGCkrcZMbevPxQx6dxQFgcSShdwLsf1", "blocksMintedPenalty": 0}, + {"address": "QjB1cxvVx2hhgAHRrvS4wAYSigGZ6AAQ8B", "blocksMintedPenalty": 0}, + {"address": "QjB6gxZyQMGmjdvFM48TB2zQ8zbPkhmy9z", "blocksMintedPenalty": 0}, + {"address": "QjBUYj9SzWKAkwESSBBPPNfKpK6SfTt8LH", "blocksMintedPenalty": 0}, + {"address": "QjBniir8DeeDng4UHu43PLVtiiahSosaLc", "blocksMintedPenalty": 0}, + {"address": "QjCBgcNoJKTm44JjU8TR65KviFPeRGLbxa", "blocksMintedPenalty": 0}, + {"address": "QjCRcdH76U2mra8sUy3aWPCYpiZhtwCeHN", "blocksMintedPenalty": 0}, + {"address": "QjChYJCJUMByj2uiK8ay76uqMiyYiW9DQ4", "blocksMintedPenalty": 0}, + {"address": "QjDMZNQs9B9r32u6FvNKpwhFb7zXjFsyz2", "blocksMintedPenalty": 0}, + {"address": "QjDVYHqwB4jeHHmZtEFshgAT4Vm3eKf3Pn", "blocksMintedPenalty": 0}, + {"address": "QjEDBYiwe5p8peQX2cJiNE1pimZFdZBH6b", "blocksMintedPenalty": 0}, + {"address": "QjEDMh1qmHe24HjcPaTAWD9uD6EkncGNMa", "blocksMintedPenalty": 0}, + {"address": "QjEWcns9hX2jKqYAhKpm8ptCN3xBEHK6eM", "blocksMintedPenalty": 0}, + {"address": "QjEa6sUZQRhApBbz1teem9ab8vYBSSTiBN", "blocksMintedPenalty": 0}, + {"address": "QjFfCcafy2sTbDPka5DpCSqvsi9Hs4FsyG", "blocksMintedPenalty": 0}, + {"address": "QjFqeANtKkQBQsmRubssEEwwJ8CbMCxhTd", "blocksMintedPenalty": 0}, + {"address": "QjFsNcPT2L5RqVuPHG5V3NVUZn4gm2FH7T", "blocksMintedPenalty": 0}, + {"address": "QjG31BBWwWN6XNQpWyWa5QstRSqUpGg8Hw", "blocksMintedPenalty": 0}, + {"address": "QjG7Qb3QuounutYL6ipk57rsAr3YZe51QQ", "blocksMintedPenalty": 0}, + {"address": "QjG7xzoc7tZomVN66vVmgxxBZZbgNe1QAg", "blocksMintedPenalty": 0}, + {"address": "QjGmXoy2havevrFjnYUptKaYhJXqwfMDw8", "blocksMintedPenalty": 0}, + {"address": "QjHZSKaJTwmL7VQxzQXPnWth8RoN6oCA9X", "blocksMintedPenalty": 0}, + {"address": "QjHbaAzkp9ocZJU9gJcS4pLoFxYYq2iKq9", "blocksMintedPenalty": 0}, + {"address": "QjHqSVKL7LH6CZkMimf3Jgr3jU1CfiR76z", "blocksMintedPenalty": 0}, + {"address": "QjHxKaCGSLMEmz2fwdyKvw1FFcSmiJhGXN", "blocksMintedPenalty": 0}, + {"address": "QjJ5MNvUQoAgsHdUQanJNaBKij4uddj2S3", "blocksMintedPenalty": 0}, + {"address": "QjJgfXUhBWZeHUNtwTV4qVcafuYuosPkPU", "blocksMintedPenalty": 0}, + {"address": "QjJtWN8b444ugFdGD8FnWqhTDX3GceZnwp", "blocksMintedPenalty": 0}, + {"address": "QjKiC8ZRWs9pansQmpq4pu3pEj6oi4ZgLm", "blocksMintedPenalty": 0}, + {"address": "QjKqBXSk9LcejdEZMnzsX8fXrZxft6dBkj", "blocksMintedPenalty": 0}, + {"address": "QjKrcrLLorrvgtHAg7ycahjghbWaMDrbcs", "blocksMintedPenalty": 0}, + {"address": "QjL2gAjTWi6vYQxgNDtSFyqJ1Nv1qFy6RP", "blocksMintedPenalty": 0}, + {"address": "QjL8RcRnQXxuVT7uHkqv5bfdtrchhEFz8v", "blocksMintedPenalty": 0}, + {"address": "QjLjkRsZNq6dQvZqdQCgqXGZhHQRPChdLd", "blocksMintedPenalty": 0}, + {"address": "QjM6VfAq9pvJtbLcL349uFMG74FrmEkioq", "blocksMintedPenalty": 0}, + {"address": "QjMrVFLSapjbipM5CNTJRjr5QNYQJdyzkE", "blocksMintedPenalty": 0}, + {"address": "QjNHon3EyXNCmELzZA3DwvGQnXEskNvazN", "blocksMintedPenalty": 0}, + {"address": "QjNJncWBbuEz1huGWS7ifeAYQqZ2sWDHoH", "blocksMintedPenalty": 0}, + {"address": "QjNbJV2644GuoSv5EmS248DdZKsgM8ukh4", "blocksMintedPenalty": 0}, + {"address": "QjNeFqzSdhEugrG6J1LaBofQB5pQeMipHo", "blocksMintedPenalty": 0}, + {"address": "QjNxPZuvN5AiH3cfgMXcNid33hNpLnGAfT", "blocksMintedPenalty": 0}, + {"address": "QjP2pf2KVyzhTyb1VfCucuzLNdYHMZRyvP", "blocksMintedPenalty": 0}, + {"address": "QjPJy45QGPng8R5gda4fWdxbhwWxxgm3mT", "blocksMintedPenalty": 0}, + {"address": "QjPM7SngNKgQL5XG71EUVrn7MNmJjikE1E", "blocksMintedPenalty": 0}, + {"address": "QjPhJZwsGk6CstHiC9iZvEUkaG2ZuwENT7", "blocksMintedPenalty": 0}, + {"address": "QjPxpog8hzWhp3xDsUBq4Ywy9EHAHtmZSo", "blocksMintedPenalty": 0}, + {"address": "QjPy15sacACwjqDALHAHTxTyv8VE4KnZSG", "blocksMintedPenalty": 0}, + {"address": "QjRkAcdJgFUTWE94DFiSxphBP4VeqKgWay", "blocksMintedPenalty": 0}, + {"address": "QjSKSfJ4iGCGXwkz9eJjWTpTs2TR8HsHCh", "blocksMintedPenalty": 0}, + {"address": "QjSgNyGR9wYp1TcwctJkweeU66H9au7Smi", "blocksMintedPenalty": 0}, + {"address": "QjT7ciDuS1WE4WKoyRchUnd9f31PQPbynv", "blocksMintedPenalty": 0}, + {"address": "QjTQDynC1TTrsNX1YKVZpashfBFwvUkLyu", "blocksMintedPenalty": 0}, + {"address": "QjTZFHyHh7MdpNyUHShW5pE5YFqBUq7bVJ", "blocksMintedPenalty": 0}, + {"address": "QjU6UJQ7UvBFh1ow8HbmuM7QehFibSJp5q", "blocksMintedPenalty": 0}, + {"address": "QjUPHuVpWFhaNaTjywkipPKQ6rGYzBqPTp", "blocksMintedPenalty": 0}, + {"address": "QjUaqMQgwJwyJUBveZrVb3kD2kZJufFuFt", "blocksMintedPenalty": 0}, + {"address": "QjVHwcSG7N68y2SerZSPJiKUsg7UkqX9yV", "blocksMintedPenalty": 0}, + {"address": "QjVeG2bomJJqBVRJC2PKe4cTmxsYEUrcZ9", "blocksMintedPenalty": 0}, + {"address": "QjVqaXEDttCN2UXJH9gHhNZKReudBjWtBZ", "blocksMintedPenalty": 0}, + {"address": "QjW77GD3QMaQXFiwg4d4iNH5h11nZLSNay", "blocksMintedPenalty": 0}, + {"address": "QjWJrssfukWLSDazd8sQbURPj9sFmWVCuL", "blocksMintedPenalty": 0}, + {"address": "QjWQ7kePE5Yj1pwcJa8Cyz4fSwJirzQcjw", "blocksMintedPenalty": 0}, + {"address": "QjWwyvcotD1Zf4kCSENUYvKnAM6hUeBEEp", "blocksMintedPenalty": 0}, + {"address": "QjX7341A9JmQPNFcT3qQXb3uzYKpNpLtbk", "blocksMintedPenalty": 0}, + {"address": "QjXAvoXs3aW33kLcUbdcVAHpKBXGBwuKGg", "blocksMintedPenalty": 0}, + {"address": "QjXE274jrMSpBwV3AnBsS2MQqMmmHfStmf", "blocksMintedPenalty": 0}, + {"address": "QjXJYdrZm1voWQ7xdEGS1DQrzZhj45u753", "blocksMintedPenalty": 0}, + {"address": "QjXPDRyTTfPLZrsawbsidJu6PnSuJFbTmV", "blocksMintedPenalty": 0}, + {"address": "QjXawfW8SbdXscKSbX5qUjfk9PFWyNWmQS", "blocksMintedPenalty": 0}, + {"address": "QjXi1GrK9JirpaHk8oKW4MqJa3eqdXQErk", "blocksMintedPenalty": 0}, + {"address": "QjYyiWSSLBnA1tFZ4rs6jXEM66itcTBmZD", "blocksMintedPenalty": 0}, + {"address": "QjZPhkqUdXXCJZBFdZN9YfUFHr8m2rLBUP", "blocksMintedPenalty": 0}, + {"address": "QjZtkBb1j8GxsUnFh4GJH1BS6peRFJ5jwT", "blocksMintedPenalty": 0}, + {"address": "Qja6JNVKLyFwU9dWYcorWxQJ75Bm6LETQu", "blocksMintedPenalty": 0}, + {"address": "QjaD8KkpgdLncNdxMCmemWULmpoRQ15Azz", "blocksMintedPenalty": 0}, + {"address": "QjawhFQthMZDKe6dRpZXprnrVJenEseyMi", "blocksMintedPenalty": 0}, + {"address": "QjazPZMJXYGB4gFZQH7QukRaAp9Lct1Q9k", "blocksMintedPenalty": 0}, + {"address": "QjbiotzKxNtFqCnF2PFFMJNR1x2By5qEr9", "blocksMintedPenalty": 0}, + {"address": "QjbjLkvgJCRzMwVAgQe7j9Y7F79mtMZA5H", "blocksMintedPenalty": 0}, + {"address": "QjcEGR4bRK2TZVKr2gAexibedTgtJbSTr4", "blocksMintedPenalty": 0}, + {"address": "QjcJro7aDd3nUoXw2ZCN9XQyCde5dcTH9o", "blocksMintedPenalty": 0}, + {"address": "QjcSakKUQDRpUrbqXfzYTebNxj91WBRYkA", "blocksMintedPenalty": 0}, + {"address": "QjcUFSCrAJHQzDdMz2KDXGorfYW4Afsv2K", "blocksMintedPenalty": 0}, + {"address": "QjcefQRxYxe4rMwjPyo1P4kBis37Y1RAhv", "blocksMintedPenalty": 0}, + {"address": "QjdHvqudnLjudnE6ec9ZQeDiTxb5ytNdhc", "blocksMintedPenalty": 0}, + {"address": "QjdRfWnJvTZ72nmqc5q1g2iAJF93MEiZu5", "blocksMintedPenalty": 0}, + {"address": "QjeWJYNo8k3Yos5VJoA3ke1s557AdZaty1", "blocksMintedPenalty": 0}, + {"address": "QjecR8ZA6F6NeXX8trteKXQgJ5qqYZGSuM", "blocksMintedPenalty": 0}, + {"address": "QjeqWcLPYHCT5jdx6WUzLsMojacmFoQye9", "blocksMintedPenalty": 0}, + {"address": "Qjf4BwYQcesSuRuRgGF7T1zN4rfH5z5DXj", "blocksMintedPenalty": 0}, + {"address": "QjfQCUHN3AdftAvo1h2TUffusiakhiWavQ", "blocksMintedPenalty": 0}, + {"address": "QjgBcdmYUD4WMKRspeZmadynr1tS87WBDk", "blocksMintedPenalty": 0}, + {"address": "QjgC8ZZ7jBVAwx2WP1b6dY44BN3gQ174Sz", "blocksMintedPenalty": 0}, + {"address": "QjgLUkCWbLBf4JDQw7iuq1P42XHHr5Kz74", "blocksMintedPenalty": 0}, + {"address": "Qjgic64cuVfyDnLp2LErVc5dmsBQzTPVhX", "blocksMintedPenalty": 0}, + {"address": "QjhuHJEF4k2HVUfv2Q3RjZYBgc6L5nw8bC", "blocksMintedPenalty": 0}, + {"address": "Qji5KonZTRGgrt3MS2RBX2KtvXYiiAQCZr", "blocksMintedPenalty": 0}, + {"address": "Qji9cKwGcb9PKcNJ9TaQzwi5SjzAXcP3gU", "blocksMintedPenalty": 0}, + {"address": "QjiQ9YfNZccUZaWXcnsgoLEnzbg4z7X1cR", "blocksMintedPenalty": 0}, + {"address": "QjiU2twLEEjdTBAmA5fqtNbav1BzFdmDGd", "blocksMintedPenalty": 0}, + {"address": "Qjib1FMTSNaA1DbLRQapJeKJ7AYCRnHzat", "blocksMintedPenalty": 0}, + {"address": "Qjit3Hs53joLQPUZJZDq2M7gfHubReqZAk", "blocksMintedPenalty": 0}, + {"address": "QjjRz2eRtzuJ33xhyXFYawLhJtDhLxpp9a", "blocksMintedPenalty": 0}, + {"address": "QjjtR9KiUaFqiJKqit5WrkfPoCY5omWftP", "blocksMintedPenalty": 0}, + {"address": "QjjxGrae4x4Ntw34HkqZU1R5p1NxSwER51", "blocksMintedPenalty": 0}, + {"address": "QjjxwNQ4b8NBE3W6fPp2NE51HLxWHoMTHg", "blocksMintedPenalty": 0}, + {"address": "QjkEiC1QFjHxWQ8zfcqpoyYwGmijKUkp1E", "blocksMintedPenalty": 0}, + {"address": "QjkHCLU81KoYPyW3aF9ezyuJE7NM64RwHp", "blocksMintedPenalty": 0}, + {"address": "QjkJvcEodk5JV1EomxMERGAnjtdSYTSmMN", "blocksMintedPenalty": 0}, + {"address": "QjkNAvvnPE4Poy1WHkZX9ibRPpUud9CmfZ", "blocksMintedPenalty": 0}, + {"address": "QjkThvXs6DmWE4cGGfr1coXhT2cq84Ab8C", "blocksMintedPenalty": 0}, + {"address": "QjkbkBxkKfCBA8BryVnEzqaCXUJsmfhRgA", "blocksMintedPenalty": 0}, + {"address": "Qjko16TA6jpNXeN9ruRpWbJofPt5gFbf6n", "blocksMintedPenalty": 0}, + {"address": "Qjm9fQkBXBhdVDgbcUzkin87gLVTUUkPTG", "blocksMintedPenalty": 0}, + {"address": "QjmFbTEb3onkog3WN2ysXwDcBDXNxaPCCd", "blocksMintedPenalty": 0}, + {"address": "QjmLPuPvb6ok1jL1AH6JuKo3UViNoPT437", "blocksMintedPenalty": 0}, + {"address": "QjmResDkootY2ThvjAzwMn62S95bYSBVtB", "blocksMintedPenalty": 0}, + {"address": "QjmgFuFEazCfPANMxwjyGDp3bhV3RRfmJS", "blocksMintedPenalty": 0}, + {"address": "QjmxpDHKN9SRcCrWxse8JimFTXNXuCErb1", "blocksMintedPenalty": 0}, + {"address": "Qjn2Au4ESL5rzvAZ2M6Jwc78hzHj6Hr6au", "blocksMintedPenalty": 0}, + {"address": "Qjn8eF5Nq1nT4TA98zeNjXkXRNvxQGb5n6", "blocksMintedPenalty": 0}, + {"address": "QjnBvwTkqMyCEyDq7dyth2YsXsnSTf4GH6", "blocksMintedPenalty": 0}, + {"address": "QjnwdvofEo1FKYjcMkSF1C6usKot7MtQvr", "blocksMintedPenalty": 0}, + {"address": "Qjny4Vp3D76bYdyhCYCMWtouBPoP7JuoaT", "blocksMintedPenalty": 0}, + {"address": "QjoLALkgfTXgjJe8vgHBup4AmL7hzADxkb", "blocksMintedPenalty": 0}, + {"address": "QjoMvcLc7er7vZadpk2q98u6pKH3kdmkVa", "blocksMintedPenalty": 0}, + {"address": "QjoWGyKN1eytRvd8KaAwx1tBF7Xo5jTQRW", "blocksMintedPenalty": 0}, + {"address": "QjomB7jXd8FZ8zjTkki1zdN5hCE31pvy3D", "blocksMintedPenalty": 0}, + {"address": "Qjp2xJjaRFS4MinztcHVvHH5HUxgScuEiT", "blocksMintedPenalty": 0}, + {"address": "Qjp7wNp6ttCgyebqBNX2WS4z2Xbzv3bESJ", "blocksMintedPenalty": 0}, + {"address": "QjpCVMm7J3C8sXjxo6TkTnQ6PXpujcPbZ6", "blocksMintedPenalty": 0}, + {"address": "QjpRkGNJq1LYoU2PMVoXAgCfuWLqVjuzyN", "blocksMintedPenalty": 0}, + {"address": "QjqGpuZrPYbSxRXuxBCmEKR4USECjGBkrG", "blocksMintedPenalty": 0}, + {"address": "QjqSGHvWxM8XxPAeWAPh44w1aJ9jt4sULf", "blocksMintedPenalty": 0}, + {"address": "QjrEMcvwnEmjAW87nGpVQgVGVqxrB2zPVx", "blocksMintedPenalty": 0}, + {"address": "QjsWj55f5yd2p4M1dgbxQkw7mNZyMwWVh4", "blocksMintedPenalty": 0}, + {"address": "QjskwdMw4guZWKsvPwVSRw83rR3LJpwSr8", "blocksMintedPenalty": 0}, + {"address": "QjsybkmBnTJLmRXuZLuqoRzJfQCn9HP9Dh", "blocksMintedPenalty": 0}, + {"address": "QjtSn7X8gbYHuDSvMjLGTKGJ3G55WFEPRh", "blocksMintedPenalty": 0}, + {"address": "QjthKgGbivdBjpVyjwvwvGxcd5dZt9bTi7", "blocksMintedPenalty": 0}, + {"address": "Qjtnw3un3rYxdS2SQRMA9ZMx6E4oJMKwmW", "blocksMintedPenalty": 0}, + {"address": "Qjto6EtHvFiqrckS5B3V7yAQTwZYauTYGR", "blocksMintedPenalty": 0}, + {"address": "QjtyaMpCAQHSAj3STqpYswy17CwxJyPPQG", "blocksMintedPenalty": 0}, + {"address": "QjuAJmD9wLYvSux5ZGouuW6pBJhbuKnKAp", "blocksMintedPenalty": 0}, + {"address": "QjuFKUBw2sGxesaKVxAeR1YZAXvfPtC9u1", "blocksMintedPenalty": 0}, + {"address": "QjuWf8Usbui4bLCtgcq4XpvsGWXzQL43CL", "blocksMintedPenalty": 0}, + {"address": "QjupVV34yGFGw7XmmnTSyj95MkdyS7hhbn", "blocksMintedPenalty": 0}, + {"address": "Qjur1iSZPdTorZYhWBvV4ePKiqGcEwHo5L", "blocksMintedPenalty": 0}, + {"address": "QjvJE3cjGQFA5vbXdqJfQpttuvWaVtVsZe", "blocksMintedPenalty": 0}, + {"address": "QjvQ7EZ5be51oo4kiDKpK4LhGnJQsAhh7i", "blocksMintedPenalty": 0}, + {"address": "QjvfMFMMazfq4XYAS6j4SkPNdgCGTqof8t", "blocksMintedPenalty": 0}, + {"address": "QjvzTkEbhSbSwxGqHBTXXULnJdcXVxZNEw", "blocksMintedPenalty": 0} +] \ No newline at end of file diff --git a/src/test/java/org/qortal/test/PenaltyFixTests.java b/src/test/java/org/qortal/test/PenaltyFixTests.java new file mode 100644 index 00000000..6d06f5f1 --- /dev/null +++ b/src/test/java/org/qortal/test/PenaltyFixTests.java @@ -0,0 +1,82 @@ +package org.qortal.test; + +import org.junit.Before; +import org.junit.Test; +import org.qortal.account.Account; +import org.qortal.account.PrivateKeyAccount; +import org.qortal.block.Block; +import org.qortal.controller.BlockMinter; +import org.qortal.data.transaction.PaymentTransactionData; +import org.qortal.data.transaction.TransactionData; +import org.qortal.repository.DataException; +import org.qortal.repository.Repository; +import org.qortal.repository.RepositoryManager; +import org.qortal.settings.Settings; +import org.qortal.test.common.BlockUtils; +import org.qortal.test.common.Common; +import org.qortal.test.common.TransactionUtils; +import org.qortal.test.common.transaction.TestTransaction; +import org.qortal.utils.NTP; + +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.*; + +public class PenaltyFixTests extends Common { + + @Before + public void beforeTest() throws DataException { + Common.useSettings("test-settings-v2-penalty-fix.json"); + NTP.setFixedOffset(Settings.getInstance().getTestNtpOffset()); + } + + @Test + public void testSingleSponsor() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + + // Alice self share online, and will be used to mint the blocks + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + List onlineAccounts = new ArrayList<>(); + onlineAccounts.add(aliceSelfShare); + + PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob"); + + // Test account from real penalty data (pen-revert.json) + Account penaltyAccount = new Account(repository, "QLcAQpko5egwNjifueCAeAsT8CAj2Sr5qJ"); + + // Bob sends a payment to the penalty account, so that it gets a row in the Accounts table + TransactionData paymentData = new PaymentTransactionData(TestTransaction.generateBase(bobAccount), penaltyAccount.getAddress(), 1); + TransactionUtils.signAndImportValid(repository, paymentData, bobAccount); // updates paymentData's signature + + // Mint blocks up to height 4 + Block block = null; + for (int i = 2; i <= 4; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + assertEquals(4, (int)block.getBlockData().getHeight()); + + // Check blocks minted penalty of penalty account + assertEquals(0, (int) penaltyAccount.getBlocksMintedPenalty()); + + // Penalty revert code runs at block 5 + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(5, (int)block.getBlockData().getHeight()); + + // +5000000 blocks minted penalty should be applied + assertEquals(5000000, (int) penaltyAccount.getBlocksMintedPenalty()); + + // Orphan the last block, to simulate a re-org + BlockUtils.orphanLastBlock(repository); + + assertEquals(0, (int) penaltyAccount.getBlocksMintedPenalty()); + + // Penalty revert code runs again + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(5, (int)block.getBlockData().getHeight()); + + // Penalty should still be 5000000, rather than doubled up to 10000000 + assertEquals(5000000, (int) penaltyAccount.getBlocksMintedPenalty()); + } + } +} \ No newline at end of file diff --git a/src/test/java/org/qortal/test/SelfSponsorshipAlgoV1Tests.java b/src/test/java/org/qortal/test/SelfSponsorshipAlgoV1Tests.java index 5c038de2..fe0556ca 100644 --- a/src/test/java/org/qortal/test/SelfSponsorshipAlgoV1Tests.java +++ b/src/test/java/org/qortal/test/SelfSponsorshipAlgoV1Tests.java @@ -38,7 +38,7 @@ public class SelfSponsorshipAlgoV1Tests extends Common { @Before public void beforeTest() throws DataException { - Common.useSettings("test-settings-v2-self-sponsorship-algo.json"); + Common.useSettings("test-settings-v2-self-sponsorship-algo-v1.json"); NTP.setFixedOffset(Settings.getInstance().getTestNtpOffset()); } diff --git a/src/test/resources/test-chain-v2-block-timestamps.json b/src/test/resources/test-chain-v2-block-timestamps.json index e5460bec..8f863ada 100644 --- a/src/test/resources/test-chain-v2-block-timestamps.json +++ b/src/test/resources/test-chain-v2-block-timestamps.json @@ -18,6 +18,7 @@ "onlineAccountSignaturesMinLifetime": 3600000, "onlineAccountSignaturesMaxLifetime": 86400000, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -84,7 +85,11 @@ "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, - "unconfirmableRewardSharesHeight": 99999999 + "unconfirmableRewardSharesHeight": 99999999, + "selfSponsorshipAlgoV2Height": 9999999, + "disableTransferPrivsTimestamp": 9999999999500, + "enableTransferPrivsTimestamp": 9999999999950, + "penaltyFixHeight": 9999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-disable-reference.json b/src/test/resources/test-chain-v2-disable-reference.json index 3d76620a..f5938c01 100644 --- a/src/test/resources/test-chain-v2-disable-reference.json +++ b/src/test/resources/test-chain-v2-disable-reference.json @@ -22,6 +22,7 @@ "onlineAccountSignaturesMinLifetime": 3600000, "onlineAccountSignaturesMaxLifetime": 86400000, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -87,7 +88,11 @@ "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, - "unconfirmableRewardSharesHeight": 99999999 + "unconfirmableRewardSharesHeight": 99999999, + "selfSponsorshipAlgoV2Height": 9999999, + "disableTransferPrivsTimestamp": 9999999999500, + "enableTransferPrivsTimestamp": 9999999999950, + "penaltyFixHeight": 9999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-founder-rewards.json b/src/test/resources/test-chain-v2-founder-rewards.json index e778f792..9fda74f5 100644 --- a/src/test/resources/test-chain-v2-founder-rewards.json +++ b/src/test/resources/test-chain-v2-founder-rewards.json @@ -23,6 +23,7 @@ "onlineAccountSignaturesMaxLifetime": 86400000, "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -88,7 +89,11 @@ "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, - "unconfirmableRewardSharesHeight": 99999999 + "unconfirmableRewardSharesHeight": 99999999, + "selfSponsorshipAlgoV2Height": 9999999, + "disableTransferPrivsTimestamp": 9999999999500, + "enableTransferPrivsTimestamp": 9999999999950, + "penaltyFixHeight": 9999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-leftover-reward.json b/src/test/resources/test-chain-v2-leftover-reward.json index ec64f5a9..20a85b8a 100644 --- a/src/test/resources/test-chain-v2-leftover-reward.json +++ b/src/test/resources/test-chain-v2-leftover-reward.json @@ -23,6 +23,7 @@ "onlineAccountSignaturesMaxLifetime": 86400000, "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -88,7 +89,11 @@ "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, - "unconfirmableRewardSharesHeight": 99999999 + "unconfirmableRewardSharesHeight": 99999999, + "selfSponsorshipAlgoV2Height": 9999999, + "disableTransferPrivsTimestamp": 9999999999500, + "enableTransferPrivsTimestamp": 9999999999950, + "penaltyFixHeight": 9999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-minting.json b/src/test/resources/test-chain-v2-minting.json index 72051c29..7c28435a 100644 --- a/src/test/resources/test-chain-v2-minting.json +++ b/src/test/resources/test-chain-v2-minting.json @@ -23,6 +23,7 @@ "onlineAccountSignaturesMaxLifetime": 86400000, "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, "mempowTransactionUpdatesTimestamp": 9999999999999, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -88,7 +89,11 @@ "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 9999999999999, - "unconfirmableRewardSharesHeight": 99999999 + "unconfirmableRewardSharesHeight": 99999999, + "selfSponsorshipAlgoV2Height": 9999999, + "disableTransferPrivsTimestamp": 9999999999500, + "enableTransferPrivsTimestamp": 9999999999950, + "penaltyFixHeight": 9999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-penalty-fix.json b/src/test/resources/test-chain-v2-penalty-fix.json new file mode 100644 index 00000000..e62fc9f2 --- /dev/null +++ b/src/test/resources/test-chain-v2-penalty-fix.json @@ -0,0 +1,130 @@ +{ + "isTestChain": true, + "blockTimestampMargin": 500, + "transactionExpiryPeriod": 86400000, + "maxBlockSize": 2097152, + "maxBytesPerUnitFee": 0, + "unitFees": [ + { "timestamp": 0, "fee": "0.00000001" } + ], + "nameRegistrationUnitFees": [ + { "timestamp": 0, "fee": "0.00000001" }, + { "timestamp": 1645372800000, "fee": "5" } + ], + "requireGroupForApproval": false, + "minAccountLevelToRewardShare": 5, + "maxRewardSharesPerFounderMintingAccount": 20, + "maxRewardSharesByTimestamp": [ + { "timestamp": 0, "maxShares": 20 }, + { "timestamp": 9999999999999, "maxShares": 3 } + ], + "founderEffectiveMintingLevel": 10, + "onlineAccountSignaturesMinLifetime": 3600000, + "onlineAccountSignaturesMaxLifetime": 86400000, + "onlineAccountsModulusV2Timestamp": 9999999999999, + "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, + "mempowTransactionUpdatesTimestamp": 0, + "blockRewardBatchStartHeight": 999999000, + "blockRewardBatchSize": 10, + "blockRewardBatchAccountsBlockCount": 3, + "rewardsByHeight": [ + { "height": 1, "reward": 100 }, + { "height": 11, "reward": 10 }, + { "height": 21, "reward": 1 } + ], + "sharesByLevelV1": [ + { "id": 1, "levels": [ 1, 2 ], "share": 0.05 }, + { "id": 2, "levels": [ 3, 4 ], "share": 0.10 }, + { "id": 3, "levels": [ 5, 6 ], "share": 0.15 }, + { "id": 4, "levels": [ 7, 8 ], "share": 0.20 }, + { "id": 5, "levels": [ 9, 10 ], "share": 0.25 } + ], + "sharesByLevelV2": [ + { "id": 1, "levels": [ 1, 2 ], "share": 0.06 }, + { "id": 2, "levels": [ 3, 4 ], "share": 0.13 }, + { "id": 3, "levels": [ 5, 6 ], "share": 0.19 }, + { "id": 4, "levels": [ 7, 8 ], "share": 0.26 }, + { "id": 5, "levels": [ 9, 10 ], "share": 0.32 } + ], + "qoraHoldersShareByHeight": [ + { "height": 1, "share": 0.20 }, + { "height": 1000000, "share": 0.01 } + ], + "qoraPerQortReward": 250, + "minAccountsToActivateShareBin": 0, + "shareBinActivationMinLevel": 7, + "blocksNeededByLevel": [ 5, 20, 30, 40, 50, 60, 18, 80, 90, 100 ], + "blockTimingsByHeight": [ + { "height": 1, "target": 60000, "deviation": 30000, "power": 0.2 } + ], + "ciyamAtSettings": { + "feePerStep": "0.0001", + "maxStepsPerRound": 500, + "stepsPerFunctionCall": 10, + "minutesPerBlock": 1 + }, + "featureTriggers": { + "messageHeight": 0, + "atHeight": 0, + "assetsTimestamp": 0, + "votingTimestamp": 0, + "arbitraryTimestamp": 0, + "powfixTimestamp": 0, + "qortalTimestamp": 0, + "newAssetPricingTimestamp": 0, + "groupApprovalTimestamp": 0, + "atFindNextTransactionFix": 0, + "newBlockSigHeight": 999999, + "shareBinFix": 999999, + "sharesByLevelV2Height": 999999, + "rewardShareLimitTimestamp": 9999999999999, + "calcChainWeightTimestamp": 0, + "transactionV5Timestamp": 0, + "transactionV6Timestamp": 0, + "disableReferenceTimestamp": 9999999999999, + "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, + "onlineAccountMinterLevelValidationHeight": 0, + "selfSponsorshipAlgoV1Height": 99999999, + "feeValidationFixTimestamp": 0, + "chatReferenceTimestamp": 0, + "arbitraryOptionalFeeTimestamp": 0, + "unconfirmableRewardSharesHeight": 99999999, + "selfSponsorshipAlgoV2Height": 9999999, + "disableTransferPrivsTimestamp": 9999999999500, + "enableTransferPrivsTimestamp": 9999999999950, + "penaltyFixHeight": 5 + }, + "genesisInfo": { + "version": 4, + "timestamp": 0, + "transactions": [ + { "type": "ISSUE_ASSET", "assetName": "QORT", "description": "QORT native coin", "data": "", "quantity": 0, "isDivisible": true, "fee": 0 }, + { "type": "ISSUE_ASSET", "assetName": "Legacy-QORA", "description": "Representative legacy QORA", "quantity": 0, "isDivisible": true, "data": "{}", "isUnspendable": true }, + { "type": "ISSUE_ASSET", "assetName": "QORT-from-QORA", "description": "QORT gained from holding legacy QORA", "quantity": 0, "isDivisible": true, "data": "{}", "isUnspendable": true }, + + { "type": "GENESIS", "recipient": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "amount": "1000000000" }, + { "type": "GENESIS", "recipient": "QixPbJUwsaHsVEofJdozU9zgVqkK6aYhrK", "amount": "1000000" }, + { "type": "GENESIS", "recipient": "QaUpHNhT3Ygx6avRiKobuLdusppR5biXjL", "amount": "1000000" }, + { "type": "GENESIS", "recipient": "Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er", "amount": "1000000" }, + + { "type": "CREATE_GROUP", "creatorPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "groupName": "dev-group", "description": "developer group", "isOpen": false, "approvalThreshold": "PCT100", "minimumBlockDelay": 0, "maximumBlockDelay": 1440 }, + + { "type": "UPDATE_GROUP", "ownerPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "groupId": 1, "newOwner": "QdSnUy6sUiEnaN87dWmE92g1uQjrvPgrWG", "newDescription": "developer group", "newIsOpen": false, "newApprovalThreshold": "PCT40", "minimumBlockDelay": 10, "maximumBlockDelay": 1440 }, + + { "type": "ISSUE_ASSET", "issuerPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "assetName": "TEST", "description": "test asset", "data": "", "quantity": "1000000", "isDivisible": true, "fee": 0 }, + { "type": "ISSUE_ASSET", "issuerPublicKey": "C6wuddsBV3HzRrXUtezE7P5MoRXp5m3mEDokRDGZB6ry", "assetName": "OTHER", "description": "other test asset", "data": "", "quantity": "1000000", "isDivisible": true, "fee": 0 }, + { "type": "ISSUE_ASSET", "issuerPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "assetName": "GOLD", "description": "gold test asset", "data": "", "quantity": "1000000", "isDivisible": true, "fee": 0 }, + + { "type": "ACCOUNT_FLAGS", "target": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "REWARD_SHARE", "minterPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "recipient": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "rewardSharePublicKey": "7PpfnvLSG7y4HPh8hE7KoqAjLCkv7Ui6xw4mKAkbZtox", "sharePercent": "100" }, + + { "type": "ACCOUNT_LEVEL", "target": "QixPbJUwsaHsVEofJdozU9zgVqkK6aYhrK", "level": 5 }, + { "type": "REWARD_SHARE", "minterPublicKey": "C6wuddsBV3HzRrXUtezE7P5MoRXp5m3mEDokRDGZB6ry", "recipient": "QixPbJUwsaHsVEofJdozU9zgVqkK6aYhrK", "rewardSharePublicKey": "CcABzvk26TFEHG7Yok84jxyd4oBtLkx8RJdGFVz2csvp", "sharePercent": 100 }, + + { "type": "ACCOUNT_LEVEL", "target": "Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QaUpHNhT3Ygx6avRiKobuLdusppR5biXjL", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er", "level": 6 } + ] + } +} diff --git a/src/test/resources/test-chain-v2-qora-holder-extremes.json b/src/test/resources/test-chain-v2-qora-holder-extremes.json index 4b8d4b80..0372ba4f 100644 --- a/src/test/resources/test-chain-v2-qora-holder-extremes.json +++ b/src/test/resources/test-chain-v2-qora-holder-extremes.json @@ -23,6 +23,7 @@ "onlineAccountSignaturesMaxLifetime": 86400000, "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -88,7 +89,11 @@ "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, - "unconfirmableRewardSharesHeight": 99999999 + "unconfirmableRewardSharesHeight": 99999999, + "selfSponsorshipAlgoV2Height": 9999999, + "disableTransferPrivsTimestamp": 9999999999500, + "enableTransferPrivsTimestamp": 9999999999950, + "penaltyFixHeight": 9999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-qora-holder-reduction.json b/src/test/resources/test-chain-v2-qora-holder-reduction.json index 5484745b..9fbeb317 100644 --- a/src/test/resources/test-chain-v2-qora-holder-reduction.json +++ b/src/test/resources/test-chain-v2-qora-holder-reduction.json @@ -23,6 +23,7 @@ "onlineAccountSignaturesMaxLifetime": 86400000, "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -89,7 +90,11 @@ "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, - "unconfirmableRewardSharesHeight": 99999999 + "unconfirmableRewardSharesHeight": 99999999, + "selfSponsorshipAlgoV2Height": 9999999, + "disableTransferPrivsTimestamp": 9999999999500, + "enableTransferPrivsTimestamp": 9999999999950, + "penaltyFixHeight": 9999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-qora-holder.json b/src/test/resources/test-chain-v2-qora-holder.json index 50b4910a..e9a2b485 100644 --- a/src/test/resources/test-chain-v2-qora-holder.json +++ b/src/test/resources/test-chain-v2-qora-holder.json @@ -23,6 +23,7 @@ "onlineAccountSignaturesMaxLifetime": 86400000, "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -88,7 +89,11 @@ "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, - "unconfirmableRewardSharesHeight": 99999999 + "unconfirmableRewardSharesHeight": 99999999, + "selfSponsorshipAlgoV2Height": 9999999, + "disableTransferPrivsTimestamp": 9999999999500, + "enableTransferPrivsTimestamp": 9999999999950, + "penaltyFixHeight": 9999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-reward-levels.json b/src/test/resources/test-chain-v2-reward-levels.json index 99c98e2f..b4993aee 100644 --- a/src/test/resources/test-chain-v2-reward-levels.json +++ b/src/test/resources/test-chain-v2-reward-levels.json @@ -23,6 +23,7 @@ "onlineAccountSignaturesMaxLifetime": 86400000, "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -88,7 +89,11 @@ "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, - "unconfirmableRewardSharesHeight": 99999999 + "unconfirmableRewardSharesHeight": 99999999, + "selfSponsorshipAlgoV2Height": 9999999, + "disableTransferPrivsTimestamp": 9999999999500, + "enableTransferPrivsTimestamp": 9999999999950, + "penaltyFixHeight": 9999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-reward-scaling.json b/src/test/resources/test-chain-v2-reward-scaling.json index 1c59476a..4c3595bf 100644 --- a/src/test/resources/test-chain-v2-reward-scaling.json +++ b/src/test/resources/test-chain-v2-reward-scaling.json @@ -23,6 +23,7 @@ "onlineAccountSignaturesMaxLifetime": 86400000, "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -88,7 +89,11 @@ "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, - "unconfirmableRewardSharesHeight": 500 + "unconfirmableRewardSharesHeight": 500, + "selfSponsorshipAlgoV2Height": 9999999, + "disableTransferPrivsTimestamp": 9999999999500, + "enableTransferPrivsTimestamp": 9999999999950, + "penaltyFixHeight": 9999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-reward-shares.json b/src/test/resources/test-chain-v2-reward-shares.json index fd63add0..243a3ead 100644 --- a/src/test/resources/test-chain-v2-reward-shares.json +++ b/src/test/resources/test-chain-v2-reward-shares.json @@ -22,6 +22,7 @@ "onlineAccountSignaturesMinLifetime": 3600000, "onlineAccountSignaturesMaxLifetime": 86400000, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -88,7 +89,11 @@ "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, - "unconfirmableRewardSharesHeight": 99999999 + "unconfirmableRewardSharesHeight": 99999999, + "selfSponsorshipAlgoV2Height": 9999999, + "disableTransferPrivsTimestamp": 9999999999500, + "enableTransferPrivsTimestamp": 9999999999950, + "penaltyFixHeight": 9999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-self-sponsorship-algo.json b/src/test/resources/test-chain-v2-self-sponsorship-algo-v1.json similarity index 95% rename from src/test/resources/test-chain-v2-self-sponsorship-algo.json rename to src/test/resources/test-chain-v2-self-sponsorship-algo-v1.json index 04e81e21..caf8ffe7 100644 --- a/src/test/resources/test-chain-v2-self-sponsorship-algo.json +++ b/src/test/resources/test-chain-v2-self-sponsorship-algo-v1.json @@ -23,6 +23,7 @@ "onlineAccountSignaturesMaxLifetime": 86400000, "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -88,7 +89,11 @@ "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, - "unconfirmableRewardSharesHeight": 99999999 + "unconfirmableRewardSharesHeight": 99999999, + "selfSponsorshipAlgoV2Height": 9999999, + "disableTransferPrivsTimestamp": 9999999999500, + "enableTransferPrivsTimestamp": 9999999999950, + "penaltyFixHeight": 9999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2.json b/src/test/resources/test-chain-v2.json index a57a0fd4..f867aa46 100644 --- a/src/test/resources/test-chain-v2.json +++ b/src/test/resources/test-chain-v2.json @@ -24,6 +24,7 @@ "onlineAccountSignaturesMaxLifetime": 86400000, "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -89,7 +90,11 @@ "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, - "unconfirmableRewardSharesHeight": 99999999 + "unconfirmableRewardSharesHeight": 99999999, + "selfSponsorshipAlgoV2Height": 9999999, + "disableTransferPrivsTimestamp": 9999999999500, + "enableTransferPrivsTimestamp": 9999999999950, + "penaltyFixHeight": 9999999 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-settings-v2-penalty-fix.json b/src/test/resources/test-settings-v2-penalty-fix.json new file mode 100644 index 00000000..d575e5aa --- /dev/null +++ b/src/test/resources/test-settings-v2-penalty-fix.json @@ -0,0 +1,20 @@ +{ + "repositoryPath": "testdb", + "bitcoinNet": "TEST3", + "litecoinNet": "TEST3", + "restrictedApi": false, + "blockchainConfig": "src/test/resources/test-chain-v2-penalty-fix.json", + "exportPath": "qortal-backup-test", + "bootstrap": false, + "wipeUnconfirmedOnStart": false, + "testNtpOffset": 0, + "minPeers": 0, + "pruneBlockLimit": 100, + "bootstrapFilenamePrefix": "test-", + "dataPath": "data-test", + "tempDataPath": "data-test/_temp", + "listsPath": "lists-test", + "storagePolicy": "FOLLOWED_OR_VIEWED", + "maxStorageCapacity": 104857600, + "arrrDefaultBirthday": 1900000 +} diff --git a/src/test/resources/test-settings-v2-self-sponsorship-algo.json b/src/test/resources/test-settings-v2-self-sponsorship-algo-v1.json similarity index 95% rename from src/test/resources/test-settings-v2-self-sponsorship-algo.json rename to src/test/resources/test-settings-v2-self-sponsorship-algo-v1.json index 5ea42e66..a963b125 100644 --- a/src/test/resources/test-settings-v2-self-sponsorship-algo.json +++ b/src/test/resources/test-settings-v2-self-sponsorship-algo-v1.json @@ -3,7 +3,7 @@ "bitcoinNet": "TEST3", "litecoinNet": "TEST3", "restrictedApi": false, - "blockchainConfig": "src/test/resources/test-chain-v2-self-sponsorship-algo.json", + "blockchainConfig": "src/test/resources/test-chain-v2-self-sponsorship-algo-v1.json", "exportPath": "qortal-backup-test", "bootstrap": false, "wipeUnconfirmedOnStart": false, From 070f14b3ddf19b54c30006b689d90f8d8722d290 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Tue, 30 Jan 2024 17:38:34 +0100 Subject: [PATCH 37/47] Bump version to 4.5.0 --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index a17fd5e3..eb797523 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.qortal qortal - 4.4.2 + 4.5.0 jar true From f78764880c4b17871aa6d7660e1404ff0df4cf20 Mon Sep 17 00:00:00 2001 From: QuickMythril Date: Wed, 31 Jan 2024 21:13:19 -0500 Subject: [PATCH 38/47] Fixed vote weight results API call blocksMintedPenalty is a negative value, so it should be added to blocksMinted, not subtracted. --- src/main/java/org/qortal/api/resource/PollsResource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/qortal/api/resource/PollsResource.java b/src/main/java/org/qortal/api/resource/PollsResource.java index 2b9020ab..8b00d3cd 100644 --- a/src/main/java/org/qortal/api/resource/PollsResource.java +++ b/src/main/java/org/qortal/api/resource/PollsResource.java @@ -142,7 +142,7 @@ public class PollsResource { for (VoteOnPollData vote : votes) { String voter = Crypto.toAddress(vote.getVoterPublicKey()); AccountData voterData = repository.getAccountRepository().getAccount(voter); - int voteWeight = voterData.getBlocksMinted() - voterData.getBlocksMintedPenalty(); + int voteWeight = voterData.getBlocksMinted() + voterData.getBlocksMintedPenalty(); if (voteWeight < 0) voteWeight = 0; totalWeight += voteWeight; From 4f9a4a20910a82adabf6ccc8df175919c35e0947 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Fri, 2 Feb 2024 16:40:00 +0100 Subject: [PATCH 39/47] Disable fix in order for the chain history to remain valid --- src/main/java/org/qortal/block/Block.java | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/qortal/block/Block.java b/src/main/java/org/qortal/block/Block.java index fb7cfada..16ae78a0 100644 --- a/src/main/java/org/qortal/block/Block.java +++ b/src/main/java/org/qortal/block/Block.java @@ -1557,10 +1557,10 @@ public class Block { SelfSponsorshipAlgoV1Block.processAccountPenalties(this); } - if (this.blockData.getHeight() == BlockChain.getInstance().getPenaltyFixHeight()) { - // Apply fix for penalties - PenaltyFix.processPenaltiesFix(this); - } + // Disabled because is fixed + //if (this.blockData.getHeight() == BlockChain.getInstance().getPenaltyFixHeight()) { + // PenaltyFix.processPenaltiesFix(this); + //} } // We're about to (test-)process a batch of transactions, @@ -1854,10 +1854,10 @@ public class Block { SelfSponsorshipAlgoV1Block.orphanAccountPenalties(this); } - if (this.blockData.getHeight() == BlockChain.getInstance().getPenaltyFixHeight()) { - // Revert fix for penalties - PenaltyFix.orphanPenaltiesFix(this); - } + // Disabled because is fixed + //if (this.blockData.getHeight() == BlockChain.getInstance().getPenaltyFixHeight()) { + // PenaltyFix.orphanPenaltiesFix(this); + //} // Account levels and block rewards are only processed/orphaned on block reward distribution blocks if (this.isRewardDistributionBlock()) { @@ -2556,4 +2556,4 @@ public class Block { LOGGER.info(() -> String.format("Unable to log block debugging info: %s", e.getMessage())); } } -} \ No newline at end of file +} From 55f941467f1becca6cb17a878b66288de787210e Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 3 Feb 2024 14:05:11 +0100 Subject: [PATCH 40/47] Remove fix in order for the chain history to remain valid --- src/main/java/org/qortal/block/Block.java | 10 - .../java/org/qortal/block/BlockChain.java | 7 +- .../java/org/qortal/block/PenaltyFix.java | 187 - src/main/resources/blockchain.json | 5 +- src/main/resources/penalty-fix.json | 4729 ----------------- 5 files changed, 2 insertions(+), 4936 deletions(-) delete mode 100644 src/main/java/org/qortal/block/PenaltyFix.java delete mode 100644 src/main/resources/penalty-fix.json diff --git a/src/main/java/org/qortal/block/Block.java b/src/main/java/org/qortal/block/Block.java index 16ae78a0..22e6e9f1 100644 --- a/src/main/java/org/qortal/block/Block.java +++ b/src/main/java/org/qortal/block/Block.java @@ -1556,11 +1556,6 @@ public class Block { if (this.blockData.getHeight() == BlockChain.getInstance().getSelfSponsorshipAlgoV1Height()) { SelfSponsorshipAlgoV1Block.processAccountPenalties(this); } - - // Disabled because is fixed - //if (this.blockData.getHeight() == BlockChain.getInstance().getPenaltyFixHeight()) { - // PenaltyFix.processPenaltiesFix(this); - //} } // We're about to (test-)process a batch of transactions, @@ -1854,11 +1849,6 @@ public class Block { SelfSponsorshipAlgoV1Block.orphanAccountPenalties(this); } - // Disabled because is fixed - //if (this.blockData.getHeight() == BlockChain.getInstance().getPenaltyFixHeight()) { - // PenaltyFix.orphanPenaltiesFix(this); - //} - // Account levels and block rewards are only processed/orphaned on block reward distribution blocks if (this.isRewardDistributionBlock()) { // Block rewards, including transaction fees, removed after transactions undone diff --git a/src/main/java/org/qortal/block/BlockChain.java b/src/main/java/org/qortal/block/BlockChain.java index 57c6a190..eb98000e 100644 --- a/src/main/java/org/qortal/block/BlockChain.java +++ b/src/main/java/org/qortal/block/BlockChain.java @@ -79,8 +79,7 @@ public class BlockChain { arbitraryOptionalFeeTimestamp, unconfirmableRewardSharesHeight, disableTransferPrivsTimestamp, - enableTransferPrivsTimestamp, - penaltyFixHeight + enableTransferPrivsTimestamp } // Custom transaction fees @@ -591,10 +590,6 @@ public class BlockChain { return this.featureTriggers.get(FeatureTrigger.enableTransferPrivsTimestamp.name()).longValue(); } - public int getPenaltyFixHeight() { - return this.featureTriggers.get(FeatureTrigger.penaltyFixHeight.name()).intValue(); - } - // More complex getters for aspects that change by height or timestamp public long getRewardAtHeight(int ourHeight) { diff --git a/src/main/java/org/qortal/block/PenaltyFix.java b/src/main/java/org/qortal/block/PenaltyFix.java deleted file mode 100644 index a1a1e89c..00000000 --- a/src/main/java/org/qortal/block/PenaltyFix.java +++ /dev/null @@ -1,187 +0,0 @@ -package org.qortal.block; - -import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.eclipse.persistence.jaxb.JAXBContextFactory; -import org.eclipse.persistence.jaxb.UnmarshallerProperties; -import org.qortal.api.model.AccountPenaltyStats; -import org.qortal.crypto.Crypto; -import org.qortal.data.account.AccountData; -import org.qortal.data.account.AccountPenaltyData; -import org.qortal.repository.DataException; -import org.qortal.repository.Repository; -import org.qortal.utils.Base58; - -import javax.xml.bind.JAXBContext; -import javax.xml.bind.JAXBException; -import javax.xml.bind.UnmarshalException; -import javax.xml.bind.Unmarshaller; -import javax.xml.transform.stream.StreamSource; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.*; -import java.util.stream.Collectors; - -public final class PenaltyFix { - - private static final Logger LOGGER = LogManager.getLogger(PenaltyFix.class); - - private static final String PENALTY_FIX_SOURCE = "penalty-fix.json"; - private static final String PENALTY_FIX_HASH = BlockChain.getInstance().getPenaltyFixHash(); - private static final List penalties = accountsPenaltyFix(); - - private PenaltyFix() { - /* Do not instantiate */ - } - - @SuppressWarnings("unchecked") - private static List accountsPenaltyFix() { - Unmarshaller unmarshaller; - - try { - // Create JAXB context aware of classes we need to unmarshal - JAXBContext pf = JAXBContextFactory.createContext(new Class[] { - AccountPenaltyData.class - }, null); - - // Create unmarshaller - unmarshaller = pf.createUnmarshaller(); - - // Set the unmarshaller media type to JSON - unmarshaller.setProperty(UnmarshallerProperties.MEDIA_TYPE, "application/json"); - - // Tell unmarshaller that there's no JSON root element in the JSON input - unmarshaller.setProperty(UnmarshallerProperties.JSON_INCLUDE_ROOT, false); - } catch (JAXBException e) { - String message = "Failed to setup unmarshaller for penalty fix"; - LOGGER.error(message, e); - throw new RuntimeException(message, e); - } - - ClassLoader classLoader = BlockChain.class.getClassLoader(); - InputStream pfIn = classLoader.getResourceAsStream(PENALTY_FIX_SOURCE); - StreamSource pfSource = new StreamSource(pfIn); - - try { - // Attempt to unmarshal JSON stream to BlockChain config - return (List) unmarshaller.unmarshal(pfSource, AccountPenaltyData.class).getValue(); - } catch (UnmarshalException e) { - String message = "Failed to parse penalty fix"; - LOGGER.error(message, e); - throw new RuntimeException(message, e); - } catch (JAXBException e) { - String message = "Unexpected JAXB issue while processing penalty fix"; - LOGGER.error(message, e); - throw new RuntimeException(message, e); - } - } - - public static void processPenaltiesFix(Block block) throws DataException { - - // Create reverse penalties - List reversePenalties = penalties.stream() - .map(penalty -> new AccountPenaltyData(penalty.getAddress(), 0 +5000000)) - .collect(Collectors.toList()); - - Set penaltiesFix = new HashSet(reversePenalties); - - final String PENALTY_FIX_HASH_VERIFY = getHash(penaltiesFix.stream().map(p -> p.getAddress()).collect(Collectors.toList())); - - // Verify if we are on same penalty hash - if (PENALTY_FIX_HASH.equals(PENALTY_FIX_HASH_VERIFY)) { - LOGGER.info("Verify hash passed! Running process penalty fix - this will take a while..."); - logPenaltyStats(block.repository); - long startTime = System.currentTimeMillis(); - block.repository.getAccountRepository().updateBlocksMintedPenalties(penaltiesFix); - long totalTime = System.currentTimeMillis() - startTime; - LOGGER.info("{} penalty addresses processed. Total time taken: {} seconds", reversePenalties.size(), (int)(totalTime / 1000.0f)); - logPenaltyStats(block.repository); - - int updatedCount = updateAccountLevels(block.repository, penaltiesFix); - LOGGER.info("Account levels updated for {} penalty addresses", updatedCount); - } else { - LOGGER.info("Verify hash failed! Stopping process penalty fix!"); - } - } - - public static void orphanPenaltiesFix(Block block) throws DataException { - - // Create inverse penalties - List inversePenalties = penalties.stream() - .map(penalty -> new AccountPenaltyData(penalty.getAddress(), 0 -5000000)) - .collect(Collectors.toList()); - - Set penaltiesFix = new HashSet(inversePenalties); - - final String PENALTY_FIX_HASH_VERIFY = getHash(penaltiesFix.stream().map(p -> p.getAddress()).collect(Collectors.toList())); - - // Verify if we are on same penalty hash - if (PENALTY_FIX_HASH.equals(PENALTY_FIX_HASH_VERIFY)) { - LOGGER.info("Verify hash passed! Running orphan penalty fix - this will take a while..."); - logPenaltyStats(block.repository); - long startTime = System.currentTimeMillis(); - block.repository.getAccountRepository().updateBlocksMintedPenalties(penaltiesFix); - long totalTime = System.currentTimeMillis() - startTime; - LOGGER.info("{} penalty addresses processed. Total time taken: {} seconds", inversePenalties.size(), (int)(totalTime / 1000.0f)); - logPenaltyStats(block.repository); - - int updatedCount = updateAccountLevels(block.repository, penaltiesFix); - LOGGER.info("Account levels updated for {} penalty addresses", updatedCount); - } else { - LOGGER.info("Verify hash failed! Stopping orphan penalty fix!"); - } - } - - private static int updateAccountLevels(Repository repository, Set accountPenalties) throws DataException { - final List cumulativeBlocksByLevel = BlockChain.getInstance().getCumulativeBlocksByLevel(); - final int maximumLevel = cumulativeBlocksByLevel.size() - 1; - - int updatedCount = 0; - - for (AccountPenaltyData penaltyData : accountPenalties) { - AccountData accountData = repository.getAccountRepository().getAccount(penaltyData.getAddress()); - final int effectiveBlocksMinted = accountData.getBlocksMinted() + accountData.getBlocksMintedAdjustment() + accountData.getBlocksMintedPenalty(); - - // Shortcut for penalties - if (effectiveBlocksMinted < 0) { - accountData.setLevel(0); - repository.getAccountRepository().setLevel(accountData); - updatedCount++; - LOGGER.trace(() -> String.format("Block minter %s dropped to level %d", accountData.getAddress(), accountData.getLevel())); - continue; - } - - for (int newLevel = maximumLevel; newLevel >= 0; --newLevel) { - if (effectiveBlocksMinted >= cumulativeBlocksByLevel.get(newLevel)) { - accountData.setLevel(newLevel); - repository.getAccountRepository().setLevel(accountData); - updatedCount++; - LOGGER.trace(() -> String.format("Block minter %s increased to level %d", accountData.getAddress(), accountData.getLevel())); - break; - } - } - } - return updatedCount; - } - - private static void logPenaltyStats(Repository repository) { - try { - LOGGER.info(getPenaltyStats(repository)); - } catch (DataException e) {} - } - - private static AccountPenaltyStats getPenaltyStats(Repository repository) throws DataException { - List accounts = repository.getAccountRepository().getPenaltyAccounts(); - return AccountPenaltyStats.fromAccounts(accounts); - } - - public static String getHash(List penaltyAddresses) { - if (penaltyAddresses == null || penaltyAddresses.isEmpty()) { - return null; - } - - Collections.sort(penaltyAddresses); - return Base58.encode(Crypto.digest(StringUtils.join(penaltyAddresses).getBytes(StandardCharsets.UTF_8))); - } -} \ No newline at end of file diff --git a/src/main/resources/blockchain.json b/src/main/resources/blockchain.json index c0210fab..ff3d1c37 100644 --- a/src/main/resources/blockchain.json +++ b/src/main/resources/blockchain.json @@ -35,7 +35,6 @@ "blockRewardBatchStartHeight": 1508000, "blockRewardBatchSize": 1000, "blockRewardBatchAccountsBlockCount": 25, - "penaltyFixHash": "DG23E4Y63wC8FquG9FKAnfKwatvdJV3Z3iYnozMHn2A3", "rewardsByHeight": [ { "height": 1, "reward": 5.00 }, { "height": 259201, "reward": 4.75 }, @@ -101,9 +100,7 @@ "arbitraryOptionalFeeTimestamp": 1680278400000, "unconfirmableRewardSharesHeight": 1575500, "disableTransferPrivsTimestamp": 1706745000000, - "enableTransferPrivsTimestamp": 1709251200000, - "penaltyFixHeight": 1589200 - + "enableTransferPrivsTimestamp": 1709251200000 }, "checkpoints": [ { "height": 1136300, "signature": "3BbwawEF2uN8Ni5ofpJXkukoU8ctAPxYoFB7whq9pKfBnjfZcpfEJT4R95NvBDoTP8WDyWvsUvbfHbcr9qSZuYpSKZjUQTvdFf6eqznHGEwhZApWfvXu6zjGCxYCp65F4jsVYYJjkzbjmkCg5WAwN5voudngA23kMK6PpTNygapCzXt" } diff --git a/src/main/resources/penalty-fix.json b/src/main/resources/penalty-fix.json deleted file mode 100644 index 8bfaf4ea..00000000 --- a/src/main/resources/penalty-fix.json +++ /dev/null @@ -1,4729 +0,0 @@ -[ - {"address": "QLcAQpko5egwNjifueCAeAsT8CAj2Sr5qJ", "blocksMintedPenalty": 0}, - {"address": "QLcPrbUgrTJnW74w4QPACiPx56zv3G4FFB", "blocksMintedPenalty": 0}, - {"address": "QLcjp73RUxv34EaM9V1KZDyBiHqFznEHFW", "blocksMintedPenalty": 0}, - {"address": "QLdHNZSo6fEjVrhdudyV6eWHvTN5Q5mTjA", "blocksMintedPenalty": 0}, - {"address": "QLdLERizUCYnuP7SstCULukV2CCZmKgbm3", "blocksMintedPenalty": 0}, - {"address": "QLeBoCaVC6zFd1u1etkB8fdvRF3euUAsqQ", "blocksMintedPenalty": 0}, - {"address": "QLeRakXwvhrxbjLscVdQ9PzNydZAECtBLL", "blocksMintedPenalty": 0}, - {"address": "QLf7KnrSWYPHEPeBLv121d3jkv8cbVrEd9", "blocksMintedPenalty": 0}, - {"address": "QLfCPxWgAyVzQqSK6StZb9vjco6R4XHCMj", "blocksMintedPenalty": 0}, - {"address": "QLfU8ZEHZzinsJvmzw5eidg3F3A7FznSAR", "blocksMintedPenalty": 0}, - {"address": "QLfV6RvPoxS6n6aXGQA7mv5eKsQ76AE4vB", "blocksMintedPenalty": 0}, - {"address": "QLfeRAjrAcpmU8KBqMpjcnSvDe3b7BrxX6", "blocksMintedPenalty": 0}, - {"address": "QLg6KWJZGN2hoHYakR92k1XRJmwzFKo1pm", "blocksMintedPenalty": 0}, - {"address": "QLgBcntJmPbP1gwMV94FXcVymyBcR7dhhQ", "blocksMintedPenalty": 0}, - {"address": "QLgCu3MHDHpbBsvbYNxAbzTh1UfCesY4Le", "blocksMintedPenalty": 0}, - {"address": "QLh2N1vuLQvyPSpnXKJffGwSfyaoX1rGj7", "blocksMintedPenalty": 0}, - {"address": "QLhAZKtH8k23wzEAkea2GTNiaRwS5PHg7t", "blocksMintedPenalty": 0}, - {"address": "QLhKZ4pF7im9sVdHSN12YkxFbWCxEg8PwW", "blocksMintedPenalty": 0}, - {"address": "QLhYzL1yG8mZ66XBEDkPttpKaXocK2r6XY", "blocksMintedPenalty": 0}, - {"address": "QLhes6pYh355KWa6Ghj3L9UgwZ5P8PXMP6", "blocksMintedPenalty": 0}, - {"address": "QLhzTKJzh7jaHFUu57ks23i2obXcoGJCQW", "blocksMintedPenalty": 0}, - {"address": "QLi5NbicG8qcyyKh9w4RdjdGxJrfNtSunT", "blocksMintedPenalty": 0}, - {"address": "QLiBn9FUZYYiN2C1pw53etpyXsh7UQhqaa", "blocksMintedPenalty": 0}, - {"address": "QLiJ15y4Ngx4pyGH96AyzenE5D2akxwiVi", "blocksMintedPenalty": 0}, - {"address": "QLiNgZqzdzPUpN9R6DpjtiLKCgJrkqZznd", "blocksMintedPenalty": 0}, - {"address": "QLiTyaRQDfGe9gzochuDvBbNJfHA783R7P", "blocksMintedPenalty": 0}, - {"address": "QLiZB1LBjGrR2SDCoFrG5Lo4rDzy5Toar8", "blocksMintedPenalty": 0}, - {"address": "QLiwW29kdLwRpbdiY4mGxxBNUer2KfYY5p", "blocksMintedPenalty": 0}, - {"address": "QLixJkhN4CGYgCvL8p5enZF1vEeGqos6Tr", "blocksMintedPenalty": 0}, - {"address": "QLjdyihhNEjWCAU4GfPShmQpwVGjgdT9qv", "blocksMintedPenalty": 0}, - {"address": "QLjheZEPRp5jr3uhMdpBtRKWy6X6qtwNZK", "blocksMintedPenalty": 0}, - {"address": "QLjrgiLMnn9EtwZAfppxMw4AdYey2sU9je", "blocksMintedPenalty": 0}, - {"address": "QLjyton4gRg6D6JJopBoVM3hJ2HdTjqDkP", "blocksMintedPenalty": 0}, - {"address": "QLkAKY3xfiRGJfajovZZf3b1qLLXFts8vA", "blocksMintedPenalty": 0}, - {"address": "QLkS7E9PWd9BBuEdDhxTUgNXSMk1uZNqsj", "blocksMintedPenalty": 0}, - {"address": "QLkaJVTFTJXe3eWSzZzxTR1DNtFmb8F497", "blocksMintedPenalty": 0}, - {"address": "QLkyk3q2tH4hU1mFyRLpsKm2MX3PQdpaad", "blocksMintedPenalty": 0}, - {"address": "QLm4QMUGpQV2sFET9McGvWKE7GvW9BFNgc", "blocksMintedPenalty": 0}, - {"address": "QLmfkyCMPKnM7VXow16VR5hwvGAQgjThCC", "blocksMintedPenalty": 0}, - {"address": "QLmg4JxyvXYwbxogbHGduzNVTmVZsPmFQF", "blocksMintedPenalty": 0}, - {"address": "QLmnzzxAu7mepWur8qK4bbWCVqFEwDNTEx", "blocksMintedPenalty": 0}, - {"address": "QLnCFn3Pcf1SZAWt3dff4azbmTR6wFPr2Q", "blocksMintedPenalty": 0}, - {"address": "QLnHe5jx31CGqq36C5SePTDUvFhiF1UfkQ", "blocksMintedPenalty": 0}, - {"address": "QLnSNaFzcwMLtjbGUDKk31aS9xESigKf6y", "blocksMintedPenalty": 0}, - {"address": "QLngTiMcVktUxJQydxT6QR5LaQc2aKhtRB", "blocksMintedPenalty": 0}, - {"address": "QLntweAVSAp5jFSZmYQDBYZvFbcVaVfHMF", "blocksMintedPenalty": 0}, - {"address": "QLoC6wtBcYbH5ZJRDrkcchLeyCm4JJ9Kep", "blocksMintedPenalty": 0}, - {"address": "QLoPBgM2CqJTuJsrirJiEMCygB1NTxq1g7", "blocksMintedPenalty": 0}, - {"address": "QLoPzx4Kw7vkr7FZKC47925ee3tEQmDKvt", "blocksMintedPenalty": 0}, - {"address": "QLoi39uNBqu94WDywJJLGFkvARzQZ55F2j", "blocksMintedPenalty": 0}, - {"address": "QLp6FeV1N88T9mdvN6qzJeAeJMZqTSCgbw", "blocksMintedPenalty": 0}, - {"address": "QLpDh1tVcc1GwrtCULTFiQxtRYDmH75jnU", "blocksMintedPenalty": 0}, - {"address": "QLpbukTUm3TzVxorZH9nDJQPFqpaNxMGcK", "blocksMintedPenalty": 0}, - {"address": "QLpi4h9MQ9PxYoKtpHpNiFqC2dbxNorpYt", "blocksMintedPenalty": 0}, - {"address": "QLqJYFFxUn4Q82qtT6mA2xFG6Do43T97Di", "blocksMintedPenalty": 0}, - {"address": "QLqSyVd2CH2KQZHsb6QGueowYABj8vvgKc", "blocksMintedPenalty": 0}, - {"address": "QLqaR2JrAvxCWvArnShbmCD1jxmaGZEbBf", "blocksMintedPenalty": 0}, - {"address": "QLqnPwdGsiLm1j4uSQrbHsTZJpTrau7PTi", "blocksMintedPenalty": 0}, - {"address": "QLqu2nHnx4aRD8zwUe34QmT3i6TWFmrtJ7", "blocksMintedPenalty": 0}, - {"address": "QLrUa14myMWu9Mpoq8SUtMerW2zNcdh23R", "blocksMintedPenalty": 0}, - {"address": "QLrYqGS9FXoZCtmGWTx5GEnYdt2bAjyGkA", "blocksMintedPenalty": 0}, - {"address": "QLruri6ShpU7BbFEW2bizYKw3Whm6zKAk7", "blocksMintedPenalty": 0}, - {"address": "QLsHYx1RPZzJ694Ew7b8UUndSTHmNV2dFx", "blocksMintedPenalty": 0}, - {"address": "QLsNS2PpwobiypHDXryTGhZzprwv1QRXxx", "blocksMintedPenalty": 0}, - {"address": "QLsxPqN5oTUW1yaKS9aBNTcGDiK5E2rfYj", "blocksMintedPenalty": 0}, - {"address": "QLtA2g6EiYbvks4iiv2sWyksmYpAK5zrg5", "blocksMintedPenalty": 0}, - {"address": "QLtGRLzLZ2fjtK4jFEwvXEt73q9RfrGhqm", "blocksMintedPenalty": 0}, - {"address": "QLtHEsLgsdZrKRh2H7fpNzcwjvuS5h7Gjq", "blocksMintedPenalty": 0}, - {"address": "QLtHhuoK2UYCfxW1ab21LmGGERdoNVvnpo", "blocksMintedPenalty": 0}, - {"address": "QLtNM25Dy4nGkQxjQAwLss3BS1TKEAh4wh", "blocksMintedPenalty": 0}, - {"address": "QLti6U3v23vvmpLrnWZUFPhiiRAqBnBQx8", "blocksMintedPenalty": 0}, - {"address": "QLtje5CSVRQnWak8LCCLNWYgKZkVgZWTg6", "blocksMintedPenalty": 0}, - {"address": "QLtuWJzw4tnWeD3KHK6skw9BAZQzdWNdkN", "blocksMintedPenalty": 0}, - {"address": "QLvGDsgTgYA5q5GW7C5rvDtDHUf7SZWCmQ", "blocksMintedPenalty": 0}, - {"address": "QLvxo89HgM7nA8v5MnZc6txL8c2a7qojxN", "blocksMintedPenalty": 0}, - {"address": "QLw8coFpMfYWsLmqGj5WoxTjJPz6MAVVGW", "blocksMintedPenalty": 0}, - {"address": "QLwg6qUwUtSvyZaDiueancT62M7LPi24mV", "blocksMintedPenalty": 0}, - {"address": "QLwqmzz2C23WSNKAiYPX1ehmQZhNvNEf13", "blocksMintedPenalty": 0}, - {"address": "QLxBz6NqUTDR5NYwFe4mgwF3g6UmwNcU4F", "blocksMintedPenalty": 0}, - {"address": "QLxCU8jsx57VnZAKy6CyqQWFHBNhQvkUe5", "blocksMintedPenalty": 0}, - {"address": "QLxGVpiXyaAXyyEsTSiDcrPThJpqHb4w5h", "blocksMintedPenalty": 0}, - {"address": "QLxPxSHt1oQy8Ch9SQA9ZuUEGybzW8atah", "blocksMintedPenalty": 0}, - {"address": "QLxT62eAh13fDWkGH8aANg3beP5ZM3buQa", "blocksMintedPenalty": 0}, - {"address": "QLxgnacYpr8FijAJfXJM6KNJGAY35gQth9", "blocksMintedPenalty": 0}, - {"address": "QLxjzFr7qFiB2dHJRRzqddSEpBFUcVGttR", "blocksMintedPenalty": 0}, - {"address": "QLxtgVcRxh92E5yvSghJ8qD38Ljh9ZVDYn", "blocksMintedPenalty": 0}, - {"address": "QLy89z4tWbzcPcyNpVavcNnAEEFmg4t4eE", "blocksMintedPenalty": 0}, - {"address": "QLz91s1qqo3xw1xm6iqqxcMLES9Gjvm2VJ", "blocksMintedPenalty": 0}, - {"address": "QLzB4Y1kaqE7DrNrTWq95VFyieKetGFRVK", "blocksMintedPenalty": 0}, - {"address": "QLzLiGUpNDtvbzWGZqxQzYC9Rvkyt8PYik", "blocksMintedPenalty": 0}, - {"address": "QLzZey9JfMxQWkSjbb8pvdNSVkSDWSmoDX", "blocksMintedPenalty": 0}, - {"address": "QM1PyhcbGPkfGp9iGyn4bZ3o1TRC9CKqvD", "blocksMintedPenalty": 0}, - {"address": "QM1QQBqj7fiUWWp5tBBPm28YYHdHFnnuRJ", "blocksMintedPenalty": 0}, - {"address": "QM1acfcXqgFBwgkMXdfczGvw3L9RUmLzvH", "blocksMintedPenalty": 0}, - {"address": "QM2Wxy2TL42MBn8AwPhGyhS7Wc91nuMLzH", "blocksMintedPenalty": 0}, - {"address": "QM39UdZ9DGGwdXuZ1bbVSFVT18tSKi3AWR", "blocksMintedPenalty": 0}, - {"address": "QM3LLv3WA7w8No2CHz5HJBebAmyZyFnZet", "blocksMintedPenalty": 0}, - {"address": "QM3gm47PheStm2cUykexymmWmyQ92zqHu3", "blocksMintedPenalty": 0}, - {"address": "QM3qEPiTWPduoyXwJGP6VSSnehuLgvdVtp", "blocksMintedPenalty": 0}, - {"address": "QM3zdqu8GxhnsQcy5vmmkMf3Bfa9rQTk1b", "blocksMintedPenalty": 0}, - {"address": "QM48dNevGqF7x2AnrVMps2PYA6v1RVEvWe", "blocksMintedPenalty": 0}, - {"address": "QM4JeM2WNvnp6iKFFWH88GDBixx1LbaJoK", "blocksMintedPenalty": 0}, - {"address": "QM4JwM24JxMzscUHBKyDuCEWCcj5h1FXT6", "blocksMintedPenalty": 0}, - {"address": "QM4QhXkCHwFA8UBXUzdfqwLGqQ2Yfpcrq6", "blocksMintedPenalty": 0}, - {"address": "QM4U5EjbfpjEMY9WF1iBDW9s13ehtZp1pX", "blocksMintedPenalty": 0}, - {"address": "QM6TTeDnYKc3fSgXP1FWiyJLF9EyEVcPoa", "blocksMintedPenalty": 0}, - {"address": "QM6pzEx3iivDGkzj6ZKHQ49XMBKhQVqd1M", "blocksMintedPenalty": 0}, - {"address": "QM7XoHyybCNTwgoGgCUqyupnyWYwAbnyGH", "blocksMintedPenalty": 0}, - {"address": "QM83Z2n7DUmLfQ5xmdyh7CuugR7kQqWijy", "blocksMintedPenalty": 0}, - {"address": "QM8VttuYken6sdoDLgLkaf4Y1qUvdDb1qR", "blocksMintedPenalty": 0}, - {"address": "QM8gFrHXPXBywq3HwEGbMycqCZHjbnBTRv", "blocksMintedPenalty": 0}, - {"address": "QM8u7swZU1ejRrF6KrPegJB2XUJ4bc55cS", "blocksMintedPenalty": 0}, - {"address": "QM8xSoBMsketUVbYWqjNLKsD845wNW54ub", "blocksMintedPenalty": 0}, - {"address": "QM9Nt7wZZ7dnewfLeNtjYVYj2qySCpFSpA", "blocksMintedPenalty": 0}, - {"address": "QM9TwQMTmYT8rirvG2W2gXp7fYQBXP1ZZD", "blocksMintedPenalty": 0}, - {"address": "QM9XYicQqdUeopNxhUAAmGXeLyXJzX3ZVT", "blocksMintedPenalty": 0}, - {"address": "QMA8K74HFVg9BHcHCBmCdt3JaVmdjdg6FE", "blocksMintedPenalty": 0}, - {"address": "QMAGUg5ssPUh22Z1Gc9Y3hrR4hDEdNVYmQ", "blocksMintedPenalty": 0}, - {"address": "QMBkcFyMWTtuQQrDm9CSGzJt1HwxbUc7FQ", "blocksMintedPenalty": 0}, - {"address": "QMC1goGQryzrNuPe6uY6pomavNPcaAvGJz", "blocksMintedPenalty": 0}, - {"address": "QMC2bcibaXF1px8EQoYqAxd6A88K1hx5xU", "blocksMintedPenalty": 0}, - {"address": "QMCtHi8KwHmU6SL1VjfQh3EP8YQxLWPFnA", "blocksMintedPenalty": 0}, - {"address": "QMCxYbYg58dS73X7wrn3inU4nTZWeijz32", "blocksMintedPenalty": 0}, - {"address": "QMCyBvgSRQLPw6T1DYMrkpKJBzLUFAgj81", "blocksMintedPenalty": 0}, - {"address": "QMD9seEQcj84XizqjcC2rUDZNdEi1PQusT", "blocksMintedPenalty": 0}, - {"address": "QMDbBYcxBDrrzSDR24XThDcSUJFE59Nx3Y", "blocksMintedPenalty": 0}, - {"address": "QMDyMyX6HbYHWac3Txke923fCZrDdhu9FY", "blocksMintedPenalty": 0}, - {"address": "QMEQrhyggeBQecEczdsxiLwY7tFHFQVJjw", "blocksMintedPenalty": 0}, - {"address": "QMESmyV8YDonwtswvKcz6DLAyg9XvhRcNr", "blocksMintedPenalty": 0}, - {"address": "QMEv1vnjkgxGGWWkkzaPQ5SYfEFG8sfRBQ", "blocksMintedPenalty": 0}, - {"address": "QMFJFzP8aSV2buhs6QPbrDKMtTgUovU2U3", "blocksMintedPenalty": 0}, - {"address": "QMFZEugiVmQXssfCghEXewbsyxroWce3dR", "blocksMintedPenalty": 0}, - {"address": "QMFprqTwENKD6F5N7rKhAQgTqLyWCjcRRn", "blocksMintedPenalty": 0}, - {"address": "QMFyR2iKwzPhi3RrMj4ARgNN5gnQX9vZst", "blocksMintedPenalty": 0}, - {"address": "QMG4rC9FffDDHssKnG8jbDSwpn2KvschdY", "blocksMintedPenalty": 0}, - {"address": "QMGxjdLogAKA7VVeKQmQvB12nxMZRH3Nja", "blocksMintedPenalty": 0}, - {"address": "QMHEvKCKtPnwLf3Y4ApY39xM7KDyrXE811", "blocksMintedPenalty": 0}, - {"address": "QMHJuL7MxMqBy5np4CYQZG5EkqgUrLkv2t", "blocksMintedPenalty": 0}, - {"address": "QMHuCtBC6eA5BAdixnjsSzP9GxavSvZLrx", "blocksMintedPenalty": 0}, - {"address": "QMJ9bsEHF1NxgVAthhiWkdH5wXPaatbH6k", "blocksMintedPenalty": 0}, - {"address": "QMKCZvoAWpJA2evBxekUNSrfLw69M4EcES", "blocksMintedPenalty": 0}, - {"address": "QMKebDWb9vnLW5AmqkYL9EnTk1hJqv4EGf", "blocksMintedPenalty": 0}, - {"address": "QMKeuyX9igkQ5tautUi9AzxBNCx5BHZmzF", "blocksMintedPenalty": 0}, - {"address": "QMKscx3wsimU6zTCchz1VLRqUKqV4gNzUN", "blocksMintedPenalty": 0}, - {"address": "QMKt1hVhpSQGr3RaSo2VKcP7wn6yfmVzRR", "blocksMintedPenalty": 0}, - {"address": "QMKv9YHkd6ewiad222Vv8JD9uqMBo3f1Pn", "blocksMintedPenalty": 0}, - {"address": "QMLfsJbbYkcRfdsRUGCKpaWJEdVAJPWkYX", "blocksMintedPenalty": 0}, - {"address": "QMLjMB2RfkWqS7Ta5oADoPt9KeqmzLtmty", "blocksMintedPenalty": 0}, - {"address": "QMM1aZasQHsMjLSsv6tNLXumPwjK5Y5oBv", "blocksMintedPenalty": 0}, - {"address": "QMMDd3Wz4LL32QFrgdgj5ZPBrFuKevfDd9", "blocksMintedPenalty": 0}, - {"address": "QMMEYneWsTUCsja7hcyxqDQvrthHuqUcXe", "blocksMintedPenalty": 0}, - {"address": "QMMgfpP6qGvxyX6PCKNtyBTSUKMhQifcHW", "blocksMintedPenalty": 0}, - {"address": "QMMnWcuVVPqbyWDBNkDMsBi7MPj1C2sWrK", "blocksMintedPenalty": 0}, - {"address": "QMNrivpqrX4rLR4zpoUjSrU39kcDTXTvYx", "blocksMintedPenalty": 0}, - {"address": "QMPZRgzqpTgQ3afBJt5pmhSsdRshmkb1WQ", "blocksMintedPenalty": 0}, - {"address": "QMPp7jVrDc4eQSgVJqdKgNdpQ16gRHjAwm", "blocksMintedPenalty": 0}, - {"address": "QMQBbuPGRXptG7yxqAsaAyZnQNc9Qvy2tF", "blocksMintedPenalty": 0}, - {"address": "QMQVJaJm1SKpEJxSXZjzqjJjeQMQDncb13", "blocksMintedPenalty": 0}, - {"address": "QMRSWhXqiPGqMJK3t1cxsVfeuTU9i3zfpc", "blocksMintedPenalty": 0}, - {"address": "QMRYuArqJzdcG7sqQMUeBTp1Xc62rvW7UU", "blocksMintedPenalty": 0}, - {"address": "QMRjBCGeRRBshku4LYv3PR8SJDPLTioSgD", "blocksMintedPenalty": 0}, - {"address": "QMRwM4r9knvpQ33S98kJNQyMapDu3YG4oU", "blocksMintedPenalty": 0}, - {"address": "QMS1aCyPWFGciAUy3v9k7Jj9QhawCB1eCH", "blocksMintedPenalty": 0}, - {"address": "QMS4M7sDvYLcYcupJ5eLuTGsV9oGYZxLTY", "blocksMintedPenalty": 0}, - {"address": "QMSGfiKFbvEYW45K4o1A1hsyWPNw7HPLH4", "blocksMintedPenalty": 0}, - {"address": "QMTAqscLtWdyVmqpjVStVtKvyEKWXRyGTd", "blocksMintedPenalty": 0}, - {"address": "QMTDUob97sWQkYW7Q86gc6GSddELEUUPnB", "blocksMintedPenalty": 0}, - {"address": "QMTLJYLHfBVdHyZeGiRxzmeHnReCBit39x", "blocksMintedPenalty": 0}, - {"address": "QMTLdXgqkRC76KQr7PEhEQSHPYxhdyathN", "blocksMintedPenalty": 0}, - {"address": "QMTYTEKAZqHhJ8wJ7Y2REghfqLdnpHM5NA", "blocksMintedPenalty": 0}, - {"address": "QMU5oZ2TMaxG97FVLN8Gjj6sy8EzuKzXE4", "blocksMintedPenalty": 0}, - {"address": "QMUCQxE6cuSUm8N5D2YASQa6pvLvS2ARKJ", "blocksMintedPenalty": 0}, - {"address": "QMUP4S5FCtKG4W47B8VWaiMhteoPzoUmz7", "blocksMintedPenalty": 0}, - {"address": "QMUgMjDMtWuceqi42GeY3YEeBNEtZjtxs6", "blocksMintedPenalty": 0}, - {"address": "QMUoys8sZEdjXTCuWin8s2REa5fzgmwqzR", "blocksMintedPenalty": 0}, - {"address": "QMVogEv4gXi5LWWeSynkZB7mCf2jbQtQtL", "blocksMintedPenalty": 0}, - {"address": "QMVs81CsStyzmaTMHnEwq4YjWZgGZovL9E", "blocksMintedPenalty": 0}, - {"address": "QMW8KyM5eoExyr2vX2fCb1yLUQH2zAygRB", "blocksMintedPenalty": 0}, - {"address": "QMWF6mEadRUxcqNKMtiQMM8uMYX84hXxJf", "blocksMintedPenalty": 0}, - {"address": "QMWN63gCXiCbkeStXXWof44GW41kVokHMR", "blocksMintedPenalty": 0}, - {"address": "QMWTSTbpHp3F1KCrqHdg3LvYNmpXV84uDq", "blocksMintedPenalty": 0}, - {"address": "QMWe73DzcwzhWsjb7ipwyAXv5rwWmAjRWr", "blocksMintedPenalty": 0}, - {"address": "QMWisvoRqXfw3hw4Qr6cW7qutnv72u5xWo", "blocksMintedPenalty": 0}, - {"address": "QMX39X6npKboZBqu2P3rFWXMYHGrCayPiq", "blocksMintedPenalty": 0}, - {"address": "QMXAHFifJRv9MP3Niqyj5Qnvza91voDrcd", "blocksMintedPenalty": 0}, - {"address": "QMXTwFKtmLE5XuKRpEL27evrLwrru1EH8x", "blocksMintedPenalty": 0}, - {"address": "QMY3nmDQSojt8uVxLwyeGT3SS214oJQ8to", "blocksMintedPenalty": 0}, - {"address": "QMYkksuRjpHQLk2CGkgVhAsib4p8qFAr62", "blocksMintedPenalty": 0}, - {"address": "QMYnhWRmbYGUkhP34dzhSEPyvUkxohghH2", "blocksMintedPenalty": 0}, - {"address": "QMZ46gmL3mgzzR2J4QChgpyp7gfKk2poCi", "blocksMintedPenalty": 0}, - {"address": "QMZCxHYLnpw1APfPiwB6iGwXHsYby8zCWk", "blocksMintedPenalty": 0}, - {"address": "QMZHicaNbCbVr4FzvYqigtnMJZz5u6S8F7", "blocksMintedPenalty": 0}, - {"address": "QMZNKGAmnioEfd38bgfDLTcu7GcLr8d1uq", "blocksMintedPenalty": 0}, - {"address": "QMZUtP8zNbVdfJHDprPZz39WZ4CFFS3k5j", "blocksMintedPenalty": 0}, - {"address": "QMZxZdT6sXKed4mVYPRQGu6qtMnFAptbsK", "blocksMintedPenalty": 0}, - {"address": "QMaFywtC4WwDp9BmMYaGwxMeEzcEMkCEA4", "blocksMintedPenalty": 0}, - {"address": "QMaMobqvZEakRBYhdqt1vR7WuJXSUZHvVX", "blocksMintedPenalty": 0}, - {"address": "QMaUFtiNtsTwva3jX2yeg6tEpeYUFuyyMS", "blocksMintedPenalty": 0}, - {"address": "QMaXdLcHBj9zmBHpZnci83sJirzzp4gbZF", "blocksMintedPenalty": 0}, - {"address": "QMbL7dMEi7dXgavVa4EmftdQnV2RVq5wDR", "blocksMintedPenalty": 0}, - {"address": "QMbL9fqDBCHRNihA8oZxm1wAMtBerTYmhN", "blocksMintedPenalty": 0}, - {"address": "QMbPPEBR2NFJGrRvrrJTSRFevDJUmx3jzb", "blocksMintedPenalty": 0}, - {"address": "QMbTbJJLdCPbhcyNuFgccettvUeZCMqUJo", "blocksMintedPenalty": 0}, - {"address": "QMbchRQXWhdRX4zm4SbSbv9tLusKzSdMei", "blocksMintedPenalty": 0}, - {"address": "QMc5jHzggmrXjXo3SPuSCcqGTnvSYrFCgQ", "blocksMintedPenalty": 0}, - {"address": "QMcA4hzBGjLdKFomJiiz7Gc1ooUq3ACwcm", "blocksMintedPenalty": 0}, - {"address": "QMdJjATsodVb1EuiFxjY5Tk5VygtteXscA", "blocksMintedPenalty": 0}, - {"address": "QMdNXxQeF5RkLy6LwAFBy8NRb61FWSpxrG", "blocksMintedPenalty": 0}, - {"address": "QMeMm5LiATScEUj3tESzQjREASRgyaKEgh", "blocksMintedPenalty": 0}, - {"address": "QMeXFr7g6tQE922BeEJc3G3ugBJAjfCcMs", "blocksMintedPenalty": 0}, - {"address": "QMenBsmit2eQyYmFG32EMgCqp8ykFVtKc6", "blocksMintedPenalty": 0}, - {"address": "QMezLZTnFdUyzinq1eyaiVjSVAsagZTEnm", "blocksMintedPenalty": 0}, - {"address": "QMhQ9BAgydE37Vx7Kta37a7A72qd3TNroN", "blocksMintedPenalty": 0}, - {"address": "QMhdSw6ncWXx56iuEHaef9UCm3cLYyn6aY", "blocksMintedPenalty": 0}, - {"address": "QMhpXohuQNsgtR2py9ZnZrVGpxPunWXbek", "blocksMintedPenalty": 0}, - {"address": "QMhscWLqorGbmygzACzfPNWey8juTsu1v7", "blocksMintedPenalty": 0}, - {"address": "QMiAWxQZy4HdUoGNwGadCroPo9dbTDw97p", "blocksMintedPenalty": 0}, - {"address": "QMjBxKPrnYaVjpEJixpAbuiznWQax72BCQ", "blocksMintedPenalty": 0}, - {"address": "QMjHfH99Gj3n6wP7G3wbK6CnJww1cxinu6", "blocksMintedPenalty": 0}, - {"address": "QMjp5bLspZeLhDPLyuteehwK3oyhYLenX2", "blocksMintedPenalty": 0}, - {"address": "QMkBkvwR5aTrzBUpqh5drTBpQFaY4QeXWA", "blocksMintedPenalty": 0}, - {"address": "QMkFhGtiYPazgfHxWH9StHGixPNa6FDChn", "blocksMintedPenalty": 0}, - {"address": "QMkZjeSc8XBhr6Mq593ByUiLcwF2x9Mw57", "blocksMintedPenalty": 0}, - {"address": "QMkhFc2XHHnYavL7urMYshhbPiWp2xAse6", "blocksMintedPenalty": 0}, - {"address": "QMmAp8W8t7HH9otwF86PPMSVrNVrRRJu2b", "blocksMintedPenalty": 0}, - {"address": "QMmgBppbKTh7cymczHGHQds7QtHRucQamv", "blocksMintedPenalty": 0}, - {"address": "QMnDXTCGYXnhBLGg2a9Ys7wDVxUCLth5Pb", "blocksMintedPenalty": 0}, - {"address": "QMnEsZ9MYcJexoYBQxiGxRC8osAo7UnayR", "blocksMintedPenalty": 0}, - {"address": "QMoDGDV5g7kT1Jp9GdXiAKfEmK9caBr6PA", "blocksMintedPenalty": 0}, - {"address": "QMoZA7awZsVyujWB1hMJcn1UN6hxa4cdst", "blocksMintedPenalty": 0}, - {"address": "QMp7WvvkyNP37VnEH4bBSj1Fqywg7g9LRw", "blocksMintedPenalty": 0}, - {"address": "QMprpZ48AehPU1pkpNQCjV5ZZtGG3tUqdP", "blocksMintedPenalty": 0}, - {"address": "QMqJxLR2Acv2HrDcfQ2PWWbMzMaVU9MpHp", "blocksMintedPenalty": 0}, - {"address": "QMqLohtTX4WA2GqDGx93aABXXjmF59m1s2", "blocksMintedPenalty": 0}, - {"address": "QMqNTdG2fkhzMEizaXc8c5phwMfjvAUN97", "blocksMintedPenalty": 0}, - {"address": "QMqXBym7PCsbxbgmEZV6ZWxLxwmGiQ6B1A", "blocksMintedPenalty": 0}, - {"address": "QMqaUq6SVXVYFiSdznbUuRVf77N7d2Ki89", "blocksMintedPenalty": 0}, - {"address": "QMr38ESUKyjdXypoxWFyMdo1Dir4n63Y9C", "blocksMintedPenalty": 0}, - {"address": "QMrEB8afGmcCebt3Hr2eBhnWQzUMatXisH", "blocksMintedPenalty": 0}, - {"address": "QMs5tUeuyPuB56h1t4qB6YZ38Ux9NcFQnT", "blocksMintedPenalty": 0}, - {"address": "QMsMxj7eabDPUM2mFCnqfPs4r7SSy6VnyW", "blocksMintedPenalty": 0}, - {"address": "QMsh4mJ18iYuRvpJ5ssRyCdxpcofi81ZCA", "blocksMintedPenalty": 0}, - {"address": "QMssSYmraGgMd5CJdGnjAd2LrbCDHmcRvp", "blocksMintedPenalty": 0}, - {"address": "QMt5axu3hVbnewpAq6CENMtjsUotqw64ic", "blocksMintedPenalty": 0}, - {"address": "QMt5qwEXgATfyj4sAEbTB3tZ4jZjYmtziC", "blocksMintedPenalty": 0}, - {"address": "QMtdBrF4REBgnwtEXWw6adMiFV1f3YKjXU", "blocksMintedPenalty": 0}, - {"address": "QMuqtCSbbUU6S6cod3iQWNDhUuViy9cAuo", "blocksMintedPenalty": 0}, - {"address": "QMv59Z4BoDo5nJKRuWWGa73oMpUuZX7P4K", "blocksMintedPenalty": 0}, - {"address": "QMv6Sem5wubJ6TwJr1pzT5U62P6t2jacCB", "blocksMintedPenalty": 0}, - {"address": "QMvCj2eQxjQgHLQo7xUKMKnmHdn9sh1Chs", "blocksMintedPenalty": 0}, - {"address": "QMvJKGCS4tRemzrWGQDhCSSdTbRhDRMRxf", "blocksMintedPenalty": 0}, - {"address": "QMvN5Py8Jm9HZuqzYCyhsBHFSuqWYaBnUY", "blocksMintedPenalty": 0}, - {"address": "QMvRcpmJ8ThziMrrtkBoy9MPwuW2FcYdUc", "blocksMintedPenalty": 0}, - {"address": "QMvctspcYiedkZgAxpTG24mu2eamdtRFfA", "blocksMintedPenalty": 0}, - {"address": "QMvqZcrDSkpf2kCBdgA7DwjF8QAtmiAJRt", "blocksMintedPenalty": 0}, - {"address": "QMw38AGurWxqHHnu1mhWBYbsKnCCKuk2pp", "blocksMintedPenalty": 0}, - {"address": "QMwLyuDgXFv91SaLvpEcexFKD4fS2kLCrK", "blocksMintedPenalty": 0}, - {"address": "QMwWiQcQ3DCfZn5UYqPYQg5tQcAZYiPxd4", "blocksMintedPenalty": 0}, - {"address": "QMwbBNbNgxvVJjWG1zUZg2pi8Zz79nWW8a", "blocksMintedPenalty": 0}, - {"address": "QMwep4Rv4J17KDq8jdeME1oWv2MwaGLHTC", "blocksMintedPenalty": 0}, - {"address": "QMwpR16ud7UgnPXbkSfiNVyHAd6m29ixCE", "blocksMintedPenalty": 0}, - {"address": "QMx2vvqakGQwxRQvAxWR86jyW1vf312Y7i", "blocksMintedPenalty": 0}, - {"address": "QMxA7wqzUStirrBxdDjTkihFAQnWbobEed", "blocksMintedPenalty": 0}, - {"address": "QMxQ1fzeVyWs6wGsb96maN3KSLPnkoDZfp", "blocksMintedPenalty": 0}, - {"address": "QMxei34mrgVgWhznrdZyUY1cjH77sgUAbU", "blocksMintedPenalty": 0}, - {"address": "QMxskEDL5mspwsv9hDrrKcYD1ntJysCjtd", "blocksMintedPenalty": 0}, - {"address": "QMxsuJgsH2FCPw1op4DS9cmYEDS7Pju9zu", "blocksMintedPenalty": 0}, - {"address": "QMy9ewSnzrWxXBu2yVY5yJZVfWMfguSfZZ", "blocksMintedPenalty": 0}, - {"address": "QMyLCjf9i5FD7RUmtEg3JDj9yivk9vBVqL", "blocksMintedPenalty": 0}, - {"address": "QMyPsGL1VLsBH4E8tA4zERgLjJvtWMPM2R", "blocksMintedPenalty": 0}, - {"address": "QMyTBytS1p83JDvk5od13WoopkmjM2mKQk", "blocksMintedPenalty": 0}, - {"address": "QMysFf9NzQKogsjixcKMTURUMRV6hbCgsa", "blocksMintedPenalty": 0}, - {"address": "QN1LkgELCjgMdMdn2rDK8sVRK1QuTLjxiC", "blocksMintedPenalty": 0}, - {"address": "QN1MBEiscAkMuVKvHKZ35XqStmf5dw2ga7", "blocksMintedPenalty": 0}, - {"address": "QN2BLvvcqWVdCA9U8ARTumJUCJeftWARDn", "blocksMintedPenalty": 0}, - {"address": "QN2PGLMN913Ak7UxYzf16uZWUinGhzvNRh", "blocksMintedPenalty": 0}, - {"address": "QN2tgAmbZ8CjgwkejtLgiYEuCB6dvgPpPS", "blocksMintedPenalty": 0}, - {"address": "QN31UW1b576Rv3ZpB3z6yAk8Zk2bsGMzzJ", "blocksMintedPenalty": 0}, - {"address": "QN36avKv6yRp7TCuTeqk74AE5nFnJeXqdN", "blocksMintedPenalty": 0}, - {"address": "QN3bHphcm3q11C85yHY41UjCizHGChA2Za", "blocksMintedPenalty": 0}, - {"address": "QN3fB3CSg7NbLFN2cRfSRJrneicaBzhUY6", "blocksMintedPenalty": 0}, - {"address": "QN3zhLp2aaCFFigSUMqWifq3YtzTsA7yWL", "blocksMintedPenalty": 0}, - {"address": "QN44koc4iQbS3cspyFVpMGQnvC1aZ8imG9", "blocksMintedPenalty": 0}, - {"address": "QN479iT2VaYEatAcjRRM8thqNmbGxv86dQ", "blocksMintedPenalty": 0}, - {"address": "QN4E3oEnTAqnKUSNYjFvS8Z6fT1UeFKupa", "blocksMintedPenalty": 0}, - {"address": "QN4R6arBDYg6YekEb2BU89jc5URjyoai9J", "blocksMintedPenalty": 0}, - {"address": "QN4WJVNeMzNhV1mWqR3T7B7rW6KYqqE9uX", "blocksMintedPenalty": 0}, - {"address": "QN5T4jbSdgPUZexNSEdwp7bzhq8Dxe4DB7", "blocksMintedPenalty": 0}, - {"address": "QN5k3xsiq5RCozAW3SYwH66ZQTVhhovxWE", "blocksMintedPenalty": 0}, - {"address": "QN5qLJqbsa9h7hrhUfa4GeHMMeGeCD8KZD", "blocksMintedPenalty": 0}, - {"address": "QN5yNf1eh2a8LaoWuAUoD6uNWUhKr9excQ", "blocksMintedPenalty": 0}, - {"address": "QN64a76pZ9aZmQfQppP4PN4SPFBr3SbpFb", "blocksMintedPenalty": 0}, - {"address": "QN73MyEr2qaMup3UQs1fKiVTfFpQgim5MM", "blocksMintedPenalty": 0}, - {"address": "QN7Qrr2Rt4KEXaKDEpwMsFqve1X4R1uuKL", "blocksMintedPenalty": 0}, - {"address": "QN7RB99zgKZZ9NS2VukNChiUTGsun838if", "blocksMintedPenalty": 0}, - {"address": "QN877r2bHzYBu2CvoEUMM38xkK9QCh3K1g", "blocksMintedPenalty": 0}, - {"address": "QN89StcfchKbesZcjrxcL9p4wztpfdhA4y", "blocksMintedPenalty": 0}, - {"address": "QN8GuJCfLw8iqCYsHW4PveG1mKsChbqe6n", "blocksMintedPenalty": 0}, - {"address": "QN8WvrsmRWQc4xLL5aceCWrG6GUtg2NysZ", "blocksMintedPenalty": 0}, - {"address": "QN8btmpmxFkre8ZTwaSkDU58rWmyqiYZzz", "blocksMintedPenalty": 0}, - {"address": "QN8eL8N7RG5v8uYMWfamkUKZwAQ9sSNd9f", "blocksMintedPenalty": 0}, - {"address": "QN8hxkz5Si1zhsECnodJrpZuN5Qs7pS5Jj", "blocksMintedPenalty": 0}, - {"address": "QN8ma6EeNSb3j3c9EFi9ec9d4kLfjfPex9", "blocksMintedPenalty": 0}, - {"address": "QN8xDHcpmdhAmzPFjBsbYZ5VuQP4Bj9jyr", "blocksMintedPenalty": 0}, - {"address": "QN92By6aHsRzgmkCAnUmqnESS4fLiuQKFP", "blocksMintedPenalty": 0}, - {"address": "QN98661LXfAdjnptuYdX1eD7WPwe8yMuzG", "blocksMintedPenalty": 0}, - {"address": "QN9BJeXCpS8hUkw74xSXkwvNEN7uqDXP57", "blocksMintedPenalty": 0}, - {"address": "QN9CVDXpfoy7XgyfGPvN59uBHnQBFJgHd9", "blocksMintedPenalty": 0}, - {"address": "QN9UEX9f4iLZMX51VU9xPkYWpTVsTk3rYk", "blocksMintedPenalty": 0}, - {"address": "QN9xgLkweNDH2D3Y4ThbNipEcrAJF4XbaU", "blocksMintedPenalty": 0}, - {"address": "QNAkeC8zvEDRVrpKuy5LbwYtefWBYKPxnX", "blocksMintedPenalty": 0}, - {"address": "QNBVjW433NyijXNvCz6hiDUMHhKRT44au2", "blocksMintedPenalty": 0}, - {"address": "QNCJEPpSz594jwmtqewYP2eSi4CE8Kn3em", "blocksMintedPenalty": 0}, - {"address": "QNCXQLNqR8BCJHAebuFeque9wzZRnP4RJk", "blocksMintedPenalty": 0}, - {"address": "QNCy8o9bReYpEc7PyzzdFvFCkFGyby5P25", "blocksMintedPenalty": 0}, - {"address": "QNDJryHp5Mp2C9mUT8jwBf9TybuCYUwoau", "blocksMintedPenalty": 0}, - {"address": "QNDhVGyMqZBEvpTSEPqZEEhu5xiSqzk3Yn", "blocksMintedPenalty": 0}, - {"address": "QNDmHeUtj747SfX8TzHedfCbgaiqCv5Ag6", "blocksMintedPenalty": 0}, - {"address": "QNENeFJdSeZcx6zsMKWoPrQVaME7fjADor", "blocksMintedPenalty": 0}, - {"address": "QNEydywqYgpZebpGzvBaA24KrGALjua6sE", "blocksMintedPenalty": 0}, - {"address": "QNFFTK9WUGT7mjSzBQziVD5Qg9U95hH5c8", "blocksMintedPenalty": 0}, - {"address": "QNFGAna5SS6gAuwbHbPL7ekszE993gYqDb", "blocksMintedPenalty": 0}, - {"address": "QNFQ4aNJtCmaxGJ5qifqQfjmqkTKs2Xc6M", "blocksMintedPenalty": 0}, - {"address": "QNFRqBNan9cFAwaVMUa4H4NKKS6LVgeKi4", "blocksMintedPenalty": 0}, - {"address": "QNGEBJCRyHTuB9BUXxK83KQHRjYhwVkrN6", "blocksMintedPenalty": 0}, - {"address": "QNGNqnYBhVqgmAVMBWsqnUgWrgs3oxjAvV", "blocksMintedPenalty": 0}, - {"address": "QNGQw8iJzvSbxrCLGdHNKx4Z5Ts411co34", "blocksMintedPenalty": 0}, - {"address": "QNGcKEAyFPhuprRczsrdk1HcR9YSMqBkdF", "blocksMintedPenalty": 0}, - {"address": "QNHPGtCr5obwyrdQTrMMitFJ1NgW4anDaZ", "blocksMintedPenalty": 0}, - {"address": "QNHiN85k79S3q8w7XSHXF5LvEvuqoDg9UD", "blocksMintedPenalty": 0}, - {"address": "QNHq6mzzhvTmQiJzBDfJoGpK8Qi9C2bxb7", "blocksMintedPenalty": 0}, - {"address": "QNHunh6CXbBpBRnQ9g33mw5hLzmANifa1j", "blocksMintedPenalty": 0}, - {"address": "QNJL2eoWUdWY5dCecg8LVRSPKw8avpxZhd", "blocksMintedPenalty": 0}, - {"address": "QNJs3tJUS47YVoAWtdmijFiFuodatrAXgZ", "blocksMintedPenalty": 0}, - {"address": "QNJxM8jBXexS7A6eZms41DJM9ickKU2MSq", "blocksMintedPenalty": 0}, - {"address": "QNKCGmCQXvqXwStNtpJJiqnjESNy4pcK37", "blocksMintedPenalty": 0}, - {"address": "QNKGMcUvQHVXVoJUCask2XbPMp6U1pwciK", "blocksMintedPenalty": 0}, - {"address": "QNKttS3SEKbfaaeLYxriipJ5xQdXVUeBiy", "blocksMintedPenalty": 0}, - {"address": "QNL4mbkfWDSprkDx8hHAzasPMdjYwXCB4x", "blocksMintedPenalty": 0}, - {"address": "QNLhEgqgAj3Pt5PtDZAtAYxske9PXx2ULL", "blocksMintedPenalty": 0}, - {"address": "QNLus6YRVx2YMG2hQtCawiCTfs8VuWHDEb", "blocksMintedPenalty": 0}, - {"address": "QNM49YLU9yGH4L6iYeKi8zWSJJzK1uUZeb", "blocksMintedPenalty": 0}, - {"address": "QNMZnDAbYDzKLYRVNpJFcEnr3411rQBguw", "blocksMintedPenalty": 0}, - {"address": "QNMf7PqURwqVjAQuxH89VMEokvZXzgZ2q6", "blocksMintedPenalty": 0}, - {"address": "QNMo1wHTP3pshKkk8sewfHrPi5zkRJ6UgB", "blocksMintedPenalty": 0}, - {"address": "QNN172DzLMe5SuiJumEseigW4mnccrVCTu", "blocksMintedPenalty": 0}, - {"address": "QNN2i1ZJDXoLBA3H9anbKKK16pM4rQV6MB", "blocksMintedPenalty": 0}, - {"address": "QNN8s6tSx5LCvfUnbgn63oNm84iEgeA7na", "blocksMintedPenalty": 0}, - {"address": "QNNSPNowqK6EgioG57SSTSfQpmssGxPw3r", "blocksMintedPenalty": 0}, - {"address": "QNNiZFCyKha14XodXFG5DiRdutgh677k19", "blocksMintedPenalty": 0}, - {"address": "QNPcBeB1pXTQcZWNmtbXrzSYtUrz6agi4c", "blocksMintedPenalty": 0}, - {"address": "QNPtd2PEoDd7M34oN7SfZ4VGoNkS65gVx5", "blocksMintedPenalty": 0}, - {"address": "QNPut8fUficZvWxgujWs1XSfnfqRdMpW7a", "blocksMintedPenalty": 0}, - {"address": "QNQ2qXSXGWNzxYgaFPpcWiXSEHPCQwoRJM", "blocksMintedPenalty": 0}, - {"address": "QNQAPsU5yWgRTBgc9ghgUmC72QvQ3N3Efj", "blocksMintedPenalty": 0}, - {"address": "QNQQ1BnKBJBbYxWoeFKZeqMSeaDdc9demt", "blocksMintedPenalty": 0}, - {"address": "QNQTh4sz3advGmSKDMDx46hDNWyEnnEpxg", "blocksMintedPenalty": 0}, - {"address": "QNQdbZ64e54i8wgMPKVpKkHd6TGTF3Ea2N", "blocksMintedPenalty": 0}, - {"address": "QNQmN5ryBeoB8Brwedbp5jZsWbcp4pk2XM", "blocksMintedPenalty": 0}, - {"address": "QNQoGeogoWEEQLMpAXfxKaNZ3xudvcN3y8", "blocksMintedPenalty": 0}, - {"address": "QNR1EKgDVprX78RZzXwLj8uuKTYybmxEyn", "blocksMintedPenalty": 0}, - {"address": "QNRErzmt53wAYVQ3oc5Nkyc8FeiWVZ7CK2", "blocksMintedPenalty": 0}, - {"address": "QNRR5gPJg5LSU6t4dD4FBkfCDge5CK6YT2", "blocksMintedPenalty": 0}, - {"address": "QNRWxwK3dvGhgqZChGyTuQ34pVrE5aUbcZ", "blocksMintedPenalty": 0}, - {"address": "QNRjSd7Gmid2pVRvbWqy8NNLmbFuRU9Jzk", "blocksMintedPenalty": 0}, - {"address": "QNRkzrPyjKHgswk29F5TmSCnkQpvnjBfVU", "blocksMintedPenalty": 0}, - {"address": "QNRyZZksK4Rz1NzoWvjMLpPMfnmXbxQLYB", "blocksMintedPenalty": 0}, - {"address": "QNSdd7xiRLvg4QDmxQ3JkwaGJZCf6tGzMc", "blocksMintedPenalty": 0}, - {"address": "QNSvWN8dhheK5HNPLvw2xVuDrhS3xJpavn", "blocksMintedPenalty": 0}, - {"address": "QNT2SETQkMtafw2TrDoSrBkqKSQJVfCRcx", "blocksMintedPenalty": 0}, - {"address": "QNTEEdFqSFe58N9JnknH4Txs5E9MD5fdUE", "blocksMintedPenalty": 0}, - {"address": "QNTNCtFUedxCTGzf5BjbFy3F3zfw3vEbGp", "blocksMintedPenalty": 0}, - {"address": "QNTQJDvtyUpgPFFuq1xricVCYENUmKMJH1", "blocksMintedPenalty": 0}, - {"address": "QNTifRrwZiM7emxXNemWu3ux8w3QaoWXRB", "blocksMintedPenalty": 0}, - {"address": "QNTs1qjHJjtrj97JkLFRmGUQcNBsNfZHPo", "blocksMintedPenalty": 0}, - {"address": "QNU1E7yc5ZajweqTdigcJcA2vriiENLAV9", "blocksMintedPenalty": 0}, - {"address": "QNU3WTs97QegptsrJaQqnCDi3VrasVrdhi", "blocksMintedPenalty": 0}, - {"address": "QNUCBWLfj2QwFAqmB8SYzhEABXvxzMmyME", "blocksMintedPenalty": 0}, - {"address": "QNUajBC5tDDr4aKNyvVGb79WH6jMQcQvNn", "blocksMintedPenalty": 0}, - {"address": "QNUniD5tmbMx8k59QWwm4ibirCkZkcpaAt", "blocksMintedPenalty": 0}, - {"address": "QNV3jksFPwwdXADT2BeST1WxPhPdeLJm6C", "blocksMintedPenalty": 0}, - {"address": "QNVFJZH9uAaRyeZJqUcSM3rFG5ZfU4cQ7j", "blocksMintedPenalty": 0}, - {"address": "QNVaMspn79CHfB8CW3GKWwTFYqeWiKcmKZ", "blocksMintedPenalty": 0}, - {"address": "QNVcUgzNkkts91K76jUJVrrFNCGf3objPe", "blocksMintedPenalty": 0}, - {"address": "QNVv2EgotxZH6hbnD75HH4peqHto5sCbYn", "blocksMintedPenalty": 0}, - {"address": "QNWCF1Po3LGeSYLrXGAnf4U9AEkJvnL468", "blocksMintedPenalty": 0}, - {"address": "QNWEyccwcFeYekWHxQqnWaHodcKdqg25UT", "blocksMintedPenalty": 0}, - {"address": "QNWVFk9E1Xs6EcHYHAHFboftAYXoTujp8N", "blocksMintedPenalty": 0}, - {"address": "QNWY9o2UzNxfM3Gn3TUeaxhUzGHKc7t9u8", "blocksMintedPenalty": 0}, - {"address": "QNWb7q8Qb9uf9sBE6Mrdes9r5UMq8TX2Y4", "blocksMintedPenalty": 0}, - {"address": "QNWgad5nFKqoBC9umXgFUVwBaacm96G64h", "blocksMintedPenalty": 0}, - {"address": "QNWjK6LYL2ZP41fZpUewkNd1u7nntET4JD", "blocksMintedPenalty": 0}, - {"address": "QNWp1kYkr8Cnx7R4P5BjM4xVn6iii5vmAy", "blocksMintedPenalty": 0}, - {"address": "QNXXyBVBz4x5s7GQUfpkPksJjiX39vUmec", "blocksMintedPenalty": 0}, - {"address": "QNXjR7LESA2RDVbrRDyZd25NbTdip5bgvr", "blocksMintedPenalty": 0}, - {"address": "QNY9ZuaqkkVztV3fcunrtRRQDYre6u4JDk", "blocksMintedPenalty": 0}, - {"address": "QNYSPEtehK49DSLpHXSqmYceixhia9x3u8", "blocksMintedPenalty": 0}, - {"address": "QNYqx4qNhjDTPxHKG5BxmuoRntjkQDKrzT", "blocksMintedPenalty": 0}, - {"address": "QNZ5GXKV9Z82hsg5etBQRdZJgJfKUUNZne", "blocksMintedPenalty": 0}, - {"address": "QNZsAxBBGm5tveeYVhKuxWdwWxUfg6jAJ1", "blocksMintedPenalty": 0}, - {"address": "QNa4bcSkDZdyw8cELMgo2hxTEyXjqscCL3", "blocksMintedPenalty": 0}, - {"address": "QNaiXbtbgfA7TLkK6V4EdhS1jauPrd6jvA", "blocksMintedPenalty": 0}, - {"address": "QNaxZ7zuuMW1BzNaijSicLth6DREvc4c8u", "blocksMintedPenalty": 0}, - {"address": "QNbv9i7QRn2ETfiQQxjgQvpa7UHNYv3FEX", "blocksMintedPenalty": 0}, - {"address": "QNc6HNUqib1NRvXbpDemTwj2B2JKckYnmR", "blocksMintedPenalty": 0}, - {"address": "QNcfp3Ngf5GPnmrntm4DXoKBQ2tZdNP9Gp", "blocksMintedPenalty": 0}, - {"address": "QNchpCD8HccXmDMCBM19HjAsoY2sjfJHk9", "blocksMintedPenalty": 0}, - {"address": "QNd4hNriYGkybyH3DHw7nVeuHHDasJWBRo", "blocksMintedPenalty": 0}, - {"address": "QNdJ8qujNVisMF6PrF26VzjZ8dgGKxi6mT", "blocksMintedPenalty": 0}, - {"address": "QNdjbTPBres1UmhBHiFJ1gX29kwdK4RhbC", "blocksMintedPenalty": 0}, - {"address": "QNdw2oxn1V21Xb444FqMeoFVLMxA5yRgTU", "blocksMintedPenalty": 0}, - {"address": "QNdxTr9wyeEWsEgY2p1V2q1oRU7iEdtFUi", "blocksMintedPenalty": 0}, - {"address": "QNdxvgVh7BFfdM4GWAczKSaXg8mwtjnH74", "blocksMintedPenalty": 0}, - {"address": "QNe22z7UV2GBz2QAqaddo9wdxrj91LLdNg", "blocksMintedPenalty": 0}, - {"address": "QNejBKf3Fg8cXNLXiy1KX7XwkmC61EtgAd", "blocksMintedPenalty": 0}, - {"address": "QNfBMZU93B2JrystZx5M9Yi8yhx4W9LRnB", "blocksMintedPenalty": 0}, - {"address": "QNfCVGvT6h4LzuCQW5DFoDqwnE3H84ofie", "blocksMintedPenalty": 0}, - {"address": "QNfsQZja8xDGdHe8Bmxtm4jmueH2YiKQJ3", "blocksMintedPenalty": 0}, - {"address": "QNgLFPxf5W5ksfPv1sdmtJ4igVgVkTi3LD", "blocksMintedPenalty": 0}, - {"address": "QNgNDyrZyeFPGtT6hMCkU74jBLbcFp7xEe", "blocksMintedPenalty": 0}, - {"address": "QNgRtqzBGTNxnEgheBXtbib3eVjB3EvfUt", "blocksMintedPenalty": 0}, - {"address": "QNgnP2C1BAknQZhnSxVA9zPBgedeSaeCcz", "blocksMintedPenalty": 0}, - {"address": "QNhgv6L4W2dWCXH6D72s6QDyD4L95i3m9K", "blocksMintedPenalty": 0}, - {"address": "QNi2eeruGPpmwuC1QbarV1JimbZFYjsJK7", "blocksMintedPenalty": 0}, - {"address": "QNiT6VLz5Sg3xMWkFXrWC5UAaL31WHQUj7", "blocksMintedPenalty": 0}, - {"address": "QNikTBjfwqSZKngVDFWfQmZESTS1WUoBHh", "blocksMintedPenalty": 0}, - {"address": "QNixVhZaEiK6mfW7xYHNbfuqkapivW5r85", "blocksMintedPenalty": 0}, - {"address": "QNjCEHyMbXWTB75PWEJvKxLrVFDnmButf1", "blocksMintedPenalty": 0}, - {"address": "QNjEgcHVKEY3xC4ADE8sWL5q87sbWbU7ix", "blocksMintedPenalty": 0}, - {"address": "QNjLvYbFGBzJhZ5Dwg4uvZ9rx7XshtiXPW", "blocksMintedPenalty": 0}, - {"address": "QNjNuiuEURjqGgkzgCRCcUpmCb7AoCCbfo", "blocksMintedPenalty": 0}, - {"address": "QNjiFTQsg3woWkU631wxN7jZE7y5NbKbxC", "blocksMintedPenalty": 0}, - {"address": "QNkEztAc85i7fjh2zU48XhVHbWHqo2jfsM", "blocksMintedPenalty": 0}, - {"address": "QNkffREoWZMaA8p2gMpeDPjV6u4Rk1jeXo", "blocksMintedPenalty": 0}, - {"address": "QNmr53j5FHmPjqrSVPxzNtHHwu1JxHDAn6", "blocksMintedPenalty": 0}, - {"address": "QNmyeKy5usGDyUsxk4qHJmnKRJG5jw87hc", "blocksMintedPenalty": 0}, - {"address": "QNnA39LKVQ7dRYQH5YrmUzVFDSyqADsT9J", "blocksMintedPenalty": 0}, - {"address": "QNnBhx1ccbWgHiuGKKq818dMoGz9fVZiWq", "blocksMintedPenalty": 0}, - {"address": "QNnbYuw4kBVV2dtNWQLHtMf35YhrQqqGSw", "blocksMintedPenalty": 0}, - {"address": "QNnxbm9ZmXQq2bjDXHsB6RnxqWiv6WtDkW", "blocksMintedPenalty": 0}, - {"address": "QNo8T55Ae6utU9eB3VqkM6XdikXEbTVHSY", "blocksMintedPenalty": 0}, - {"address": "QNoG6booQJZDApeGP9ra21bpoHNXrko1s7", "blocksMintedPenalty": 0}, - {"address": "QNoWo7Y1Bp5XL5R1hEVrVUScLhNXAA2NxG", "blocksMintedPenalty": 0}, - {"address": "QNp6ZDuzq4sZdvonagDirgspGjwVwYdwNj", "blocksMintedPenalty": 0}, - {"address": "QNpVG31w2fwU9VH6rn5HEchyqgJ4pn4VU3", "blocksMintedPenalty": 0}, - {"address": "QNpWRkWoLx3W3Tj1LqTCEMszzNFWFLVcRc", "blocksMintedPenalty": 0}, - {"address": "QNpfuTuTWR5EoShTjPKJ5761wx64WvsiCh", "blocksMintedPenalty": 0}, - {"address": "QNpfyAQ1oVrcdLxrWb5tcSaGGaurasC1kN", "blocksMintedPenalty": 0}, - {"address": "QNpktFJG3zDxwDjJFvQLdtSfjmLVUpsnH4", "blocksMintedPenalty": 0}, - {"address": "QNpn2rrRPJSDHSUZgJYmL4ATFJ3FXnLjj2", "blocksMintedPenalty": 0}, - {"address": "QNpzzEz7ihntYnhuVkVzviuQ8xNaruu4A9", "blocksMintedPenalty": 0}, - {"address": "QNq3k91FzfYmDYp9uRwFdhqgvWbNDSu9Xb", "blocksMintedPenalty": 0}, - {"address": "QNqPZFto7i6MdXad8eJruSuSe5RmdDALK6", "blocksMintedPenalty": 0}, - {"address": "QNqaCKj7ebvLyQzJPcxuSttXD2rodX7Gdu", "blocksMintedPenalty": 0}, - {"address": "QNqpPuvGxcqi1n1hFigDndBb419x52KfNt", "blocksMintedPenalty": 0}, - {"address": "QNqxGsvJ1osjsgU3ZjVXB9ZhryMUQ7PFHA", "blocksMintedPenalty": 0}, - {"address": "QNr1gjj9xBhubK21w1jJKt2szeRr2vfa4U", "blocksMintedPenalty": 0}, - {"address": "QNr4JLRQLq7fa2DCpGtfqXgC62TpTDaXoT", "blocksMintedPenalty": 0}, - {"address": "QNrjvzSdk44BR8eJjzv4EieMuc47gv9jKi", "blocksMintedPenalty": 0}, - {"address": "QNrwRr8fr9TWfQAx3vdtz6tQAgX6f1vy3U", "blocksMintedPenalty": 0}, - {"address": "QNs5V6T9xj7UKTd2ML1Ru6eiqkS1JvMrbm", "blocksMintedPenalty": 0}, - {"address": "QNs6hieByyFVdMg6JpQfixttPZRk6LQ63i", "blocksMintedPenalty": 0}, - {"address": "QNsRAxV9Q3ZeEcnyKVuBjEzK2dgtbgMGTF", "blocksMintedPenalty": 0}, - {"address": "QNsYjLLwJCxjbKF8XaKEcE8yUfjfUXRib6", "blocksMintedPenalty": 0}, - {"address": "QNsYjWzMgpj3sZ2U8vcKYHxYsV3mU8QXKJ", "blocksMintedPenalty": 0}, - {"address": "QNskrbjrKJbFgzsvAe6yxTPEFXpzpU73Uh", "blocksMintedPenalty": 0}, - {"address": "QNsnnzHboM1X3bRv6MXuQZUyMD3oXP42Lv", "blocksMintedPenalty": 0}, - {"address": "QNt7X3i3jjxn9D5ZVXoTZjcE6moVwji6YQ", "blocksMintedPenalty": 0}, - {"address": "QNtm9ufeSt27bjuBMmXyPTGVbDZBA62RRL", "blocksMintedPenalty": 0}, - {"address": "QNts8TeQ5phH5v92w4kntiU1PccsqwcQpK", "blocksMintedPenalty": 0}, - {"address": "QNtxdQPULksfDnS4SydLvwa3Poiy5RNhyk", "blocksMintedPenalty": 0}, - {"address": "QNuFGQojv4MwHFZFg66mWBoi4VrWm7edM3", "blocksMintedPenalty": 0}, - {"address": "QNuPya29fddZ1dyz1raMfsLrTvo3WezSkq", "blocksMintedPenalty": 0}, - {"address": "QNv5rwuqK8kFDwP3T35uMTTSEmiWsJnPUv", "blocksMintedPenalty": 0}, - {"address": "QNvgcLiVVg4R1ttj45uw9PJ2whBEoTtXnF", "blocksMintedPenalty": 0}, - {"address": "QNx5XU3btxVf1sqaN49NV4UnGstNp3AoHh", "blocksMintedPenalty": 0}, - {"address": "QNxSgozriH8xweAYrKQRobhyx33UNfwBdF", "blocksMintedPenalty": 0}, - {"address": "QNxZp63QQLcqqSeyMCj7mAJWB8qt1DisZa", "blocksMintedPenalty": 0}, - {"address": "QNy9jG2NTk7f8J8emstfZb96sQWfbXsJgi", "blocksMintedPenalty": 0}, - {"address": "QNyK2sMagWZUJVUZQhTR7Enqaz5jd9tJRz", "blocksMintedPenalty": 0}, - {"address": "QNyskqY6f8Z2xK9A8sEiawiyDFPNv42h4w", "blocksMintedPenalty": 0}, - {"address": "QNzMXgEr1zm1uMLfyevJBPemFvTANLs1qM", "blocksMintedPenalty": 0}, - {"address": "QP1H1HHwd18fbeirF6zDX1KsQrXWHAuMSc", "blocksMintedPenalty": 0}, - {"address": "QP1JPdw2aXgHLKFajg9YyW3E5tTium7Zcf", "blocksMintedPenalty": 0}, - {"address": "QP1LF361haEGp417Wfc5ych8LpQxSYuJZY", "blocksMintedPenalty": 0}, - {"address": "QP2niVgRdXRm1ChJcHyCty13UB5pabnBv9", "blocksMintedPenalty": 0}, - {"address": "QP2t4Kyk26kotTg67wGpe34iaJfnNqsxiW", "blocksMintedPenalty": 0}, - {"address": "QP38tGMwr2yKmob6XciQdpBTTn9eo4rmuj", "blocksMintedPenalty": 0}, - {"address": "QP3YrzGBnUNMkVhN9P9f1jutduFput8XiK", "blocksMintedPenalty": 0}, - {"address": "QP3a9KAVSBWKLRTzXKDghk43um8xYzeupR", "blocksMintedPenalty": 0}, - {"address": "QP3gFqs4wUWew1tAbXbMMpxeC8YbBw2RUC", "blocksMintedPenalty": 0}, - {"address": "QP4UBa2eg1o5Ey33x7hKq9FS8aAga5JYDt", "blocksMintedPenalty": 0}, - {"address": "QP4qpXMiuz6HrM5HYfmeYzSHfzeF4vyrmA", "blocksMintedPenalty": 0}, - {"address": "QP5WWegvG8PrAhzbYAFiYKkRVjw6R2sySM", "blocksMintedPenalty": 0}, - {"address": "QP5bEGPjfQVARZ7YYRgqEt3wAqnWegF1AC", "blocksMintedPenalty": 0}, - {"address": "QP5oMGSzNzq2fKBgywW7jKFqkLhnVLEyuD", "blocksMintedPenalty": 0}, - {"address": "QP5zMAxq2isH4NkC2orKroWen6bGC6HxgE", "blocksMintedPenalty": 0}, - {"address": "QP68gicTAh2LouCfzhPGuLimeAMZSn34Qe", "blocksMintedPenalty": 0}, - {"address": "QP6XMCtoLwMu92iR7rZCy3XnGE1PCbXoWg", "blocksMintedPenalty": 0}, - {"address": "QP6n2Rs2jEgac1WfprWeVS3HLNJTSaQUhq", "blocksMintedPenalty": 0}, - {"address": "QP7SkgU7qxvxcKbVrtKKodXTZDgjPd3hpW", "blocksMintedPenalty": 0}, - {"address": "QP7T553GVrfkVvDdVZwXWLJeZThKPme74k", "blocksMintedPenalty": 0}, - {"address": "QP7v7wSohkgBrWeeubdcHvYL7CYGJbBLfT", "blocksMintedPenalty": 0}, - {"address": "QP8JpkoNVmvjXdgfvBr8XCoGDrxGPQADnt", "blocksMintedPenalty": 0}, - {"address": "QP8rS863nvayrLSzvMRzTsrCFXH5vW5icF", "blocksMintedPenalty": 0}, - {"address": "QP8rdbQkqWzzU5ymriTwma7k53sBQehppm", "blocksMintedPenalty": 0}, - {"address": "QP8ue3Zi2WueEc9UEXj2J5d33iU74vQKwf", "blocksMintedPenalty": 0}, - {"address": "QP9VF1cf3aid2mhy2qf2KRF7KvhCJiULxb", "blocksMintedPenalty": 0}, - {"address": "QP9uTYPMqsiKXSZGwdAfwwvbG47hnGHYxZ", "blocksMintedPenalty": 0}, - {"address": "QPAhRbWA4v9rUUfZAWJgmHbWpFgMsA5PGp", "blocksMintedPenalty": 0}, - {"address": "QPBac7uiiuLdshyroSvjj35ep34H6btGih", "blocksMintedPenalty": 0}, - {"address": "QPCAc58spaHNpcmffFaCFZYUYW5xBxGqfN", "blocksMintedPenalty": 0}, - {"address": "QPCUkz8hcEmqRXwYYEGFXcS8SM6iZqownK", "blocksMintedPenalty": 0}, - {"address": "QPCrri9tFunUjdLpNhuSYDRaVNgXpX4TFW", "blocksMintedPenalty": 0}, - {"address": "QPCwpzeFQrZwrTqif4StA5PjW3b88PbXEZ", "blocksMintedPenalty": 0}, - {"address": "QPDYrXZteQqoTgT38SmbTcR8MF69HPg2yb", "blocksMintedPenalty": 0}, - {"address": "QPDnmiqiFzoooCVRVJEyZQmGxFw4XhasyU", "blocksMintedPenalty": 0}, - {"address": "QPDr4kYpEPFaT9pKxPbRA49umbVEQpENxg", "blocksMintedPenalty": 0}, - {"address": "QPE9HpurY9DRPgYNq5buS6WK3wycbfwa7S", "blocksMintedPenalty": 0}, - {"address": "QPESfQTH9QYyGFPgipCf9pvtuKns5nMwNe", "blocksMintedPenalty": 0}, - {"address": "QPEogAgWwTmYDBGEcYfjT3tPmqXcaA7xVj", "blocksMintedPenalty": 0}, - {"address": "QPEwYEmYV9KbrAN9c7w5LoVn12P2ZzhFCi", "blocksMintedPenalty": 0}, - {"address": "QPFGD7hcWS8tPPgsUutbN5Kv6gHiH8iL6s", "blocksMintedPenalty": 0}, - {"address": "QPFMXjikegGJhTXov1iZhuMYhwsWB9hFBq", "blocksMintedPenalty": 0}, - {"address": "QPFWxpmz6vammjhEz78UKQRTg14DPXcBS5", "blocksMintedPenalty": 0}, - {"address": "QPGGXfso4hrkxboshRVNgpigNLUjCLXsir", "blocksMintedPenalty": 0}, - {"address": "QPGvKDAhG86Z9UDyo6pSvDLUQkSCi44JfT", "blocksMintedPenalty": 0}, - {"address": "QPHMLPNFsD8zwEBGs8nVtV6VVRBM898Abt", "blocksMintedPenalty": 0}, - {"address": "QPHtZ7t4nYJCuCLNFuokfXmS6MRaezDQXB", "blocksMintedPenalty": 0}, - {"address": "QPJBoE7NqRGn8AF38A9YgBGmeryNjatA3S", "blocksMintedPenalty": 0}, - {"address": "QPJpsppaMRMAuD5BAvauHQREPGi4rQDmPT", "blocksMintedPenalty": 0}, - {"address": "QPK3dyLZ9huDuHKZZCwtu1iyt5x7gsknUu", "blocksMintedPenalty": 0}, - {"address": "QPK9eYcyJ8wcpJhsMt918mX4h7J1yusua3", "blocksMintedPenalty": 0}, - {"address": "QPKLzfE27UJJW1LbW5vaS2iMeKth2yuSsq", "blocksMintedPenalty": 0}, - {"address": "QPKdv3KwHSEK6Vh4D8n57b2e4eNSnE9hGB", "blocksMintedPenalty": 0}, - {"address": "QPKyEwnDLK1sLH4YZTreeEtbj1BZYMRZee", "blocksMintedPenalty": 0}, - {"address": "QPL5V2YyLinjzgzqck17YQB4ZSREw96Wdr", "blocksMintedPenalty": 0}, - {"address": "QPL6xusDP7vvRBX5aPa9aB77Hm9M8xWRd7", "blocksMintedPenalty": 0}, - {"address": "QPLMUaWitU8ZDozhLvnsiRFatRNafxVfhr", "blocksMintedPenalty": 0}, - {"address": "QPMS5Z6ntJeFoUAQRGXaCKFFKV6gWfAo4w", "blocksMintedPenalty": 0}, - {"address": "QPMiNRPgKPuGXcCzUJmyTsSb74iNjHzj1h", "blocksMintedPenalty": 0}, - {"address": "QPMnXUeJNm5MpE7EaVhjntWwyHEke5k23W", "blocksMintedPenalty": 0}, - {"address": "QPNx4neoPpg2BvpMwDxE5p3bpntvzNWA74", "blocksMintedPenalty": 0}, - {"address": "QPNxttWqJmxHmGproserYTVMzxPzxVmJYP", "blocksMintedPenalty": 0}, - {"address": "QPPdeLAbVpUxb6ARpskAS3xdBCyWjsMR5d", "blocksMintedPenalty": 0}, - {"address": "QPPe4sRwHhZnbrMMe7q68xtMX4k9hdvzP1", "blocksMintedPenalty": 0}, - {"address": "QPQCM45Ve5y8kqZzKGZBEcGcodThwy89Kc", "blocksMintedPenalty": 0}, - {"address": "QPQS1G4QqiCR7DEouDs1QG4Ge7m7fsQPR4", "blocksMintedPenalty": 0}, - {"address": "QPQcUbUTFkUaL2Lpes2vhLwoEc66qk4ftR", "blocksMintedPenalty": 0}, - {"address": "QPQkJsGDmmTXMJpucDN6imHuYp6j4zersE", "blocksMintedPenalty": 0}, - {"address": "QPRJ6FMtmR7RW9ug7hB3AdB6ejaUyAecuH", "blocksMintedPenalty": 0}, - {"address": "QPRLj8bpR7tTNaTQCZceqmcUDLm4bcc4xJ", "blocksMintedPenalty": 0}, - {"address": "QPRiLbiSsijGrWE2MtKidstu39B5s2Ljrr", "blocksMintedPenalty": 0}, - {"address": "QPRjGPqJxtJ22KTawBxZk2wdBG5DiKPiCi", "blocksMintedPenalty": 0}, - {"address": "QPRkeBfw6hkaGaTw4SkHtNzGi8Sk4bKZ5J", "blocksMintedPenalty": 0}, - {"address": "QPRmaSMfELTY5fQ3FuM2spQyZm7mPWMNGS", "blocksMintedPenalty": 0}, - {"address": "QPRvCosUk7yi2doyQPN3WEdUBdfZFDgPM8", "blocksMintedPenalty": 0}, - {"address": "QPRzFZVjkotWXLGmnen7CspqTyvEd7bmPf", "blocksMintedPenalty": 0}, - {"address": "QPS5ykraf9AiUvwDEZDuzXyDSaZYXVaCeb", "blocksMintedPenalty": 0}, - {"address": "QPSPq6HPXNraSrJubLADPPCjfqZps58jk2", "blocksMintedPenalty": 0}, - {"address": "QPSehoH4pnaF44hiSsCfmrCK2mrXLFQ4j3", "blocksMintedPenalty": 0}, - {"address": "QPTDAopeUm5KMZtiKoo5jDcR8V1q3hyw9q", "blocksMintedPenalty": 0}, - {"address": "QPTN1czj2K5dzDg7wjbXTHNDVmBwMk5UJV", "blocksMintedPenalty": 0}, - {"address": "QPTis2cGcW7YUeMpEzx4p3fAoC6ZmBfJbc", "blocksMintedPenalty": 0}, - {"address": "QPTujazNJwP1bRSdY6nCTWQ8VLdsxZTtAX", "blocksMintedPenalty": 0}, - {"address": "QPUEuLpu6nn2UuCf9ayMMDS6Rm2DDgwsuC", "blocksMintedPenalty": 0}, - {"address": "QPUNyo9zTEa3L1VTas59ujCbWqDo7bELyQ", "blocksMintedPenalty": 0}, - {"address": "QPUW5B3m9xYTFVN4RSjLDXnGAR6DmacwCc", "blocksMintedPenalty": 0}, - {"address": "QPUdPPm22uYRNByXT6j3LbyKfULDjphe43", "blocksMintedPenalty": 0}, - {"address": "QPVRMSWaXRDVG4M8HJpJoFvUGj4eE7p8z9", "blocksMintedPenalty": 0}, - {"address": "QPVURC9BJn5CvUdP31vHiZHtNNQyvkPxDn", "blocksMintedPenalty": 0}, - {"address": "QPVVTtobyEMvZYW4rWeocy9RpxKDEYzGHT", "blocksMintedPenalty": 0}, - {"address": "QPVrEfrJ5K8TKuiCK9VJnqFnUdqz2efPHQ", "blocksMintedPenalty": 0}, - {"address": "QPW6oUpVaPbnzbR6J24DWj7Q6wA1TxLtNh", "blocksMintedPenalty": 0}, - {"address": "QPWBySRtyHDMA6nuKmVc2fiJUM37tq6iiE", "blocksMintedPenalty": 0}, - {"address": "QPWcZh1qqFTLUtSfFnJ7xdk3fzTvJ2zxpc", "blocksMintedPenalty": 0}, - {"address": "QPWx8oEqXjcwiiEzQ3x9kQfWnC3CcoySZa", "blocksMintedPenalty": 0}, - {"address": "QPWzseBZj9UDGTASKeub5QTGwhpvTvGrAf", "blocksMintedPenalty": 0}, - {"address": "QPXHFRJ6dPTHPw1YgCAj16MT7sRJDckxTs", "blocksMintedPenalty": 0}, - {"address": "QPXLSvi4D8ier3FRfnwNssf6BgYeNn2o62", "blocksMintedPenalty": 0}, - {"address": "QPXZEU7V4HPr8xiiBWso68ZZ3hYq2nrQ4t", "blocksMintedPenalty": 0}, - {"address": "QPY6G624RCV3ZCM6tUBB2Gg47Frzitm3xd", "blocksMintedPenalty": 0}, - {"address": "QPYnG1FH3FXkMpJkj3Ue3FemGRn7ZQoNLM", "blocksMintedPenalty": 0}, - {"address": "QPYoT7nGc9MfRUezR4bTzQeWwXo9kUhWeP", "blocksMintedPenalty": 0}, - {"address": "QPZxWvRke3GA3hsePJGHXvWFP89SJtJt1q", "blocksMintedPenalty": 0}, - {"address": "QPa61EDZaMcoBZ5u3vax6TwvNxbkC7TQS2", "blocksMintedPenalty": 0}, - {"address": "QPa6QiZtKr9kketk6EFRqwCBFVpHueoJyX", "blocksMintedPenalty": 0}, - {"address": "QPaCFPtZsRsWXKkuZmtLAwrrGq8nUTRXuU", "blocksMintedPenalty": 0}, - {"address": "QPaN1nt3WnSXWRjGe939hGe2j75wTFGimm", "blocksMintedPenalty": 0}, - {"address": "QPaPoq6X6pyFo5vttWFP1cMvt2yYNzjLFX", "blocksMintedPenalty": 0}, - {"address": "QPaUT6Xd2YFTeLcU2XHRwk19KDD2YiuMWT", "blocksMintedPenalty": 0}, - {"address": "QPaYg7SG5ioBe27BgiyPQYjyzdJJ9dqtjn", "blocksMintedPenalty": 0}, - {"address": "QPbWJeJjgoeesH4VW8ZYfqasaQZjRnann6", "blocksMintedPenalty": 0}, - {"address": "QPbjKSZKfKbeiKQBnQPTCQeNikCXztmxyd", "blocksMintedPenalty": 0}, - {"address": "QPcA6MNT1ryA8Cm4KFWWvPfzLRzNCJMY6T", "blocksMintedPenalty": 0}, - {"address": "QPcMK57oA1KjdqUJTgNMx43sR2mJid9Hnm", "blocksMintedPenalty": 0}, - {"address": "QPdAhfAKUhkM6XDuTC7szQag7YudBKQGvE", "blocksMintedPenalty": 0}, - {"address": "QPdBG1MzmyfwwMqeaoRgyfN4N4VHj87Xwb", "blocksMintedPenalty": 0}, - {"address": "QPdTnLifyoeJ2ciLSepHqCrsQXULEGotiH", "blocksMintedPenalty": 0}, - {"address": "QPdfWtbhScw9YQ99fa43kbeHTSaxYCajEx", "blocksMintedPenalty": 0}, - {"address": "QPe8yoXjoKbt3qC3tZQVckvEP9VDKi7Hnu", "blocksMintedPenalty": 0}, - {"address": "QPeNRkgo8vhK9GoSNsXc6UpdRPLRUa9tHB", "blocksMintedPenalty": 0}, - {"address": "QPevYgHzNSFES21GEuyQU9jS4ioEnzR9fj", "blocksMintedPenalty": 0}, - {"address": "QPfJvKoSgdC7R7UosGvaV9SH3vSEoXuHqw", "blocksMintedPenalty": 0}, - {"address": "QPfMvAyhpXhL1PVfXZFPQbWAVeq39kVoeW", "blocksMintedPenalty": 0}, - {"address": "QPfPEmu5bEJrgjsvkyGeaU5rQdJ6NZHXui", "blocksMintedPenalty": 0}, - {"address": "QPfkdQ23dcp99bM25N8V8736tcnRmL2kRR", "blocksMintedPenalty": 0}, - {"address": "QPg79PfCaXfMYBUQFKmYSEmMaDPqh7eiCw", "blocksMintedPenalty": 0}, - {"address": "QPgCiwi9FSb7Hqr59crpkA7i8ZsXNy7nRE", "blocksMintedPenalty": 0}, - {"address": "QPgNbD8FeYdW7EtRooZG1PPPeaRRg3WwzW", "blocksMintedPenalty": 0}, - {"address": "QPhZT61KAtGoH4DFpVSj1XuGHkB5HwBpH1", "blocksMintedPenalty": 0}, - {"address": "QPhc4yTNpQnUSXrY2rDAAFNWA2w2voyUWy", "blocksMintedPenalty": 0}, - {"address": "QPhfvnkwg7JsD8Wx9UmEnvxp7PDVSk1CmW", "blocksMintedPenalty": 0}, - {"address": "QPhhpdePin3wWpbMcr9d76RnL8joQ1HRF5", "blocksMintedPenalty": 0}, - {"address": "QPhoNAUDA12h5YC6fggRQbsZ53irRGCepf", "blocksMintedPenalty": 0}, - {"address": "QPhxXjJEQfBxmyUWtmhMZ28HfKoUytEhAQ", "blocksMintedPenalty": 0}, - {"address": "QPiDD7mbxbdp1DnxGyMNZ8jLLhobf7tawZ", "blocksMintedPenalty": 0}, - {"address": "QPiuvgnyrTvQqvPVfMoTiVLnYY38CoEP9Q", "blocksMintedPenalty": 0}, - {"address": "QPjFCMXE2rTLQgrvxwhKeiMxe7zyTgTtUi", "blocksMintedPenalty": 0}, - {"address": "QPjidHLXyFTv38i6mANWU6goEUeFNLfKhX", "blocksMintedPenalty": 0}, - {"address": "QPk4aXvqukhUcSMnPTA4nacX3sBjWhaDgh", "blocksMintedPenalty": 0}, - {"address": "QPkJxJS6YVcJDqNX9Ri8kowacdxD7fw394", "blocksMintedPenalty": 0}, - {"address": "QPkXuadrjte7pX1XojouM6V6vfGLC3JqYf", "blocksMintedPenalty": 0}, - {"address": "QPkcijjTAWXHfjNjMHqg6Y4yfJWFkw3Kyb", "blocksMintedPenalty": 0}, - {"address": "QPkiUFZpcqAXjaE5bfF7ysF1EKLpNcv2op", "blocksMintedPenalty": 0}, - {"address": "QPmDzvXbyUtDB3E7TbbWWokQBwSMSNL2PQ", "blocksMintedPenalty": 0}, - {"address": "QPmeWwiZn8t8ZLJsuXu5c9oc9pYgWP15ce", "blocksMintedPenalty": 0}, - {"address": "QPnCwiUjK39MueB6VH3X8nV6QFg3PgcRRs", "blocksMintedPenalty": 0}, - {"address": "QPnWMqrpcJZK8zBKpFzAvUtYLJfecNhwRv", "blocksMintedPenalty": 0}, - {"address": "QPnfdCQNDDP4LTpUQPEiydgmp734mXNvb5", "blocksMintedPenalty": 0}, - {"address": "QPoXbuywRnPxsrGP5TnYF52wUDwhA7B52W", "blocksMintedPenalty": 0}, - {"address": "QPoqpawUaZsmPo8uUctvMJzNXD7teWY4ka", "blocksMintedPenalty": 0}, - {"address": "QPpbokV5Xn6Q7mxG6KCTqfyZsXkQo24g4h", "blocksMintedPenalty": 0}, - {"address": "QPprP6xgZxYGkesVMuBk15VZtVaJXhzAUS", "blocksMintedPenalty": 0}, - {"address": "QPpxgE3w8Tf9WNpXohMZAtQursNKjdnQmB", "blocksMintedPenalty": 0}, - {"address": "QPq1PzrnjhX87DVXnHxt9c36ps5LrvTGmf", "blocksMintedPenalty": 0}, - {"address": "QPq4TG3FRcvuFjja8n1yaopn4s7y2MbRMC", "blocksMintedPenalty": 0}, - {"address": "QPqKdXE8FwdQ1SPCJkpbtipD6iNxaa49NK", "blocksMintedPenalty": 0}, - {"address": "QPqTG1VNgyrKENgnsr8n7wNPMp5eazw53z", "blocksMintedPenalty": 0}, - {"address": "QPqTVMHASp2WaACV4HfynpEjkUCSkDTkvf", "blocksMintedPenalty": 0}, - {"address": "QPqnY4qK93yyiXumZ511BgFFPy2KnrqmK4", "blocksMintedPenalty": 0}, - {"address": "QPqzYymrhUJHxmDmDXgB75LkJdW9TwSga2", "blocksMintedPenalty": 0}, - {"address": "QPr8g8qZrPouTF9DVdFVDH1m8UWo1jvAen", "blocksMintedPenalty": 0}, - {"address": "QPrDVUGENrCLRJYjHKas8w6oU8shxdv9Fx", "blocksMintedPenalty": 0}, - {"address": "QPrK3DBzJbaEsoWzkqPfWjQbxmKJzjPjkL", "blocksMintedPenalty": 0}, - {"address": "QPryDceMEa8LybQC2eJeo72gcobns6kGzm", "blocksMintedPenalty": 0}, - {"address": "QPrz4ynkUzYc5ACXR3sQUzc7ePKK5zx2V7", "blocksMintedPenalty": 0}, - {"address": "QPsCQy5egqZJ8ffpnxR8Y2vJ8y6ixE69Gm", "blocksMintedPenalty": 0}, - {"address": "QPsMKCwhDuC1ScFMhU9ayFXygnTQoofZty", "blocksMintedPenalty": 0}, - {"address": "QPsPofjpFy7bAeJhjsECqwiGnbtGAtGebH", "blocksMintedPenalty": 0}, - {"address": "QPshn3MqbbsD2cA66KRTE5fxFsH4Pn7RJM", "blocksMintedPenalty": 0}, - {"address": "QPsjHoKhugEADrtSQP5xjFgsaQPn9WmE3Y", "blocksMintedPenalty": 0}, - {"address": "QPszZmrnkM3uWmJdvSfRzLNQ475t3ZYJAt", "blocksMintedPenalty": 0}, - {"address": "QPtGXh1Hs7JeBdkGMwzncxgEH5vDYsHXWU", "blocksMintedPenalty": 0}, - {"address": "QPtKjKFT18xvnBTEe5EPLAEUpFGTtJ2UE6", "blocksMintedPenalty": 0}, - {"address": "QPtrw2fa7dyPpq4kc4aLGWGhdJBNPztCok", "blocksMintedPenalty": 0}, - {"address": "QPuFZxX2iZ1GAbYf132RrocQW67Lzo3wHa", "blocksMintedPenalty": 0}, - {"address": "QPuPpemkxPvbb4mX5bNhmiMYFysKpChupk", "blocksMintedPenalty": 0}, - {"address": "QPueNXYGoAe16MaqWHrSwcL3D71SMFLqBf", "blocksMintedPenalty": 0}, - {"address": "QPv3TXNkWQ2RHg2k8roC1wqB3HzUrDhmnY", "blocksMintedPenalty": 0}, - {"address": "QPv8xFom8j3WwWN1X1y4cPYNH8EAX4e5qK", "blocksMintedPenalty": 0}, - {"address": "QPvbWzaPJRbFCek3KEhwwxmeqUagZVcPrd", "blocksMintedPenalty": 0}, - {"address": "QPvqRZCv7BvVrJhH2AHaAjBAUoqLRbR4Bm", "blocksMintedPenalty": 0}, - {"address": "QPwfCqQUbYH1DHT5UJn3cWqVyPngxAtTKm", "blocksMintedPenalty": 0}, - {"address": "QPwhabAHQckhQ68sfQ7oXWKsCmX2V45HWN", "blocksMintedPenalty": 0}, - {"address": "QPwkoLe44shMrHSnA9dozzxvhdyypG8Gge", "blocksMintedPenalty": 0}, - {"address": "QPxSnbD1xXqCUrsBMv4gpNXmUtaEM4W71y", "blocksMintedPenalty": 0}, - {"address": "QPxY3QsskAgDRHBvfji6Xe8fDDDGL1CzDh", "blocksMintedPenalty": 0}, - {"address": "QPxiNeXJ8ayfk43J2TaZgDBbuReNrBdo9S", "blocksMintedPenalty": 0}, - {"address": "QPxpqbgS6gVyiq9fH2zTfF1G4k5gvmBLPs", "blocksMintedPenalty": 0}, - {"address": "QPyKLMwrhkvxnycfj3Dq8hnEB6kjX71jEh", "blocksMintedPenalty": 0}, - {"address": "QPyRnvJv1nMDS5gjSarNkE81nNhGhSu7dE", "blocksMintedPenalty": 0}, - {"address": "QPyVdoMMPc7XenMy9uzgxwTmSh8eNRmuff", "blocksMintedPenalty": 0}, - {"address": "QPycH8KoNAWzXAAxeeMZnnUavDeRmKaYTY", "blocksMintedPenalty": 0}, - {"address": "QPz9NqBNK6Uy56CTCNHUDCxmofMzLo9D8y", "blocksMintedPenalty": 0}, - {"address": "QPzmYJYAUeVXA7ThtLGhp4swcvL9qn4kAW", "blocksMintedPenalty": 0}, - {"address": "QQ1BEHspzjHvBJw7S81Y79oXQWZ3MaYfAY", "blocksMintedPenalty": 0}, - {"address": "QQ1Jg81Ko6aXKJ2dkAd14bseoZcjv7zzVJ", "blocksMintedPenalty": 0}, - {"address": "QQ1Kb9LDrzFnkbHu2QKDu4PrhXD9d53Vni", "blocksMintedPenalty": 0}, - {"address": "QQ1sArMQVvBKSdZ3gMavuNkcwzGxKiXAd9", "blocksMintedPenalty": 0}, - {"address": "QQ1vrGs3d1gwdUWnczyEHXzeetC8Mkd9xy", "blocksMintedPenalty": 0}, - {"address": "QQ1wg2eS6u3JtJW39MXypiDkaqZt4imThR", "blocksMintedPenalty": 0}, - {"address": "QQ1zZVE1vXWLAc4vMDN4HiMVkdZErQUwxy", "blocksMintedPenalty": 0}, - {"address": "QQ2A4JGbM1b2TxiNYHvM11vr8WQVjyYi7J", "blocksMintedPenalty": 0}, - {"address": "QQ2RfMDjqup4FWfMdk5LynEcJXbuoXJwpV", "blocksMintedPenalty": 0}, - {"address": "QQ2SNjVrtfhyeCG5H4b7aoE1SZmrzivVcu", "blocksMintedPenalty": 0}, - {"address": "QQ2VvMW4WwnedKKH5SfZQuhYBs7rSGkyef", "blocksMintedPenalty": 0}, - {"address": "QQ2ckCHWwcnVmfYRRZgSg3YEAXBZkNXDKd", "blocksMintedPenalty": 0}, - {"address": "QQ2qNiHJn2deTvRQNbH6w6xdmHu2oKsZ3Y", "blocksMintedPenalty": 0}, - {"address": "QQ34L4Tn3UQdfhZWF4rJkX7U8ztpmrRqtt", "blocksMintedPenalty": 0}, - {"address": "QQ3AdeBRRbbbPNAJYUFeZeNZSsU1ngGDDZ", "blocksMintedPenalty": 0}, - {"address": "QQ3rdb6ApGyuggfdvJ1Su7Hd4igm9MGRux", "blocksMintedPenalty": 0}, - {"address": "QQ3ykrhYYcxC2maNSXCGEpQZ5zj8TM3o26", "blocksMintedPenalty": 0}, - {"address": "QQ48bVy6V6U3d7UHNTGpMBJsJAJYH9nnnM", "blocksMintedPenalty": 0}, - {"address": "QQ4DWEpBwkXBjAuqWoQk8aAobqw3xnTK5a", "blocksMintedPenalty": 0}, - {"address": "QQ4JC3avfmjkzoGd5uPDdB7Kua8Bfuf6n2", "blocksMintedPenalty": 0}, - {"address": "QQ4YxRYZoULjzfGyNUU6kx28biF7YYgo5b", "blocksMintedPenalty": 0}, - {"address": "QQ4owCu1zjet6zPpfvfybMnBaEGweaqyW2", "blocksMintedPenalty": 0}, - {"address": "QQ4puLiTvzCnNrGUuqwjZCujJ8j3xfGokN", "blocksMintedPenalty": 0}, - {"address": "QQ4ziysYhvKqgYvzq2to25Ngugb9aKNrmz", "blocksMintedPenalty": 0}, - {"address": "QQ56agJ6RuWw4BRp3VUWDAVXHu2CnXMN7t", "blocksMintedPenalty": 0}, - {"address": "QQ5KvchWujsk8mVDTQmV4eo4FRqrDbKBHR", "blocksMintedPenalty": 0}, - {"address": "QQ5QxWUSFd9cmCooL6yVnA32qUoqPYYEPR", "blocksMintedPenalty": 0}, - {"address": "QQ5p6N3wx2ZizhS3HkcRvTS3EKi5HioL1H", "blocksMintedPenalty": 0}, - {"address": "QQ6AdZ9gCjAi8xc5Pp9yYar142eVVDminC", "blocksMintedPenalty": 0}, - {"address": "QQ6RTZxQ25V2psdexqBvt7Wh8dYH28dXdp", "blocksMintedPenalty": 0}, - {"address": "QQ6WU98gADTvPHdvYywJeLYjwbWrVZbKPi", "blocksMintedPenalty": 0}, - {"address": "QQ7FnR1DcBeZReirCgN8pfveDnSMRgqRwq", "blocksMintedPenalty": 0}, - {"address": "QQ7Mg4xpQHKLsHvQhTAeZGbxaGLP5Uw8gC", "blocksMintedPenalty": 0}, - {"address": "QQ7UZJuDja9X9qb8Tfaa3fyLREPmR8ozux", "blocksMintedPenalty": 0}, - {"address": "QQ8Jc3c1G11iuttBNrFLmgkJGFwCsnZzLe", "blocksMintedPenalty": 0}, - {"address": "QQ8cuMgPMBqeHFBXFkkucTyMRu3sRYYsVA", "blocksMintedPenalty": 0}, - {"address": "QQ8rhGkLn14YRrpL9Gmo2Vm1GJUEVXep3n", "blocksMintedPenalty": 0}, - {"address": "QQ9fnibUNTmkbbBa8DyvDDNP1Gw3veMcSb", "blocksMintedPenalty": 0}, - {"address": "QQ9jwiSabrGyYHTS9jHai9prLky2tLNUuA", "blocksMintedPenalty": 0}, - {"address": "QQ9x3donkiVAtTtpwjwHd4TtoDpxUofnas", "blocksMintedPenalty": 0}, - {"address": "QQA1j7mPHdnhiaj4Th85sch7SXownw7ByX", "blocksMintedPenalty": 0}, - {"address": "QQA99Mai9sbR482AQiEjL8KnvPVmvc28Pn", "blocksMintedPenalty": 0}, - {"address": "QQAKy43zZGqEpyFdPRp3vuphNq9buELAgT", "blocksMintedPenalty": 0}, - {"address": "QQAb6o5tgbEEK4DSFWwpsN1ivCYjhozrmy", "blocksMintedPenalty": 0}, - {"address": "QQAsJiBScvtZ9gK9iErAkuEGpVeBFpUfzJ", "blocksMintedPenalty": 0}, - {"address": "QQB64ykHNXrBwrKbJ9SwVxHno8RVFTcDce", "blocksMintedPenalty": 0}, - {"address": "QQBLHsqYTNJKvvzRRqn5uux1ATWsyHTwaG", "blocksMintedPenalty": 0}, - {"address": "QQBTAwKabQGUY1puzYCWJRRVXJvHSohVBj", "blocksMintedPenalty": 0}, - {"address": "QQBgpSQU4T5YktvmKwiobi4JzmCp1UyD2A", "blocksMintedPenalty": 0}, - {"address": "QQBmxq5BLkL6mqGuuB1hp1ivS2EytyGaK9", "blocksMintedPenalty": 0}, - {"address": "QQBq57bLgxmsTkrurCtj1pTNn7mBHzAv6u", "blocksMintedPenalty": 0}, - {"address": "QQC6deEGCXYgqHuJjaZBJfTk5YiMMwDsp9", "blocksMintedPenalty": 0}, - {"address": "QQCMik7nWk2jLtz15TDuRAsgCktxoBhAac", "blocksMintedPenalty": 0}, - {"address": "QQCiBhV864sm5WeDiYovjFyMDUbhJDmQbr", "blocksMintedPenalty": 0}, - {"address": "QQDGyzyC1JcVLUVTt9YMUrqCBGu4vSJYkE", "blocksMintedPenalty": 0}, - {"address": "QQDKP19ipegSZMxcfqvgNim9Yvm7MbM2fN", "blocksMintedPenalty": 0}, - {"address": "QQDQGBiPgoNU6nB7UqtLxVzFVVihy1Q6cf", "blocksMintedPenalty": 0}, - {"address": "QQE5Lv8nCsTLgFrpDLGigT9VTHdp1eTfBz", "blocksMintedPenalty": 0}, - {"address": "QQEEMBidi5PKDjPnsoL76aNx7mxHdtyiKb", "blocksMintedPenalty": 0}, - {"address": "QQEPkXK4A1jXjUYhDBn71ZrNznnL2GA91E", "blocksMintedPenalty": 0}, - {"address": "QQEQH4usuuzvvdEF2T7vVLSDGuTC96ktkq", "blocksMintedPenalty": 0}, - {"address": "QQEtXMen7U55GJcnc9NA8iqdveQSg2yYwz", "blocksMintedPenalty": 0}, - {"address": "QQEztcmDSxrgzN2NdvjEUh3xeMDK5X7YW2", "blocksMintedPenalty": 0}, - {"address": "QQFNmoi4YXJQit9G64taAYusbK89S8MV9T", "blocksMintedPenalty": 0}, - {"address": "QQFTGupZBXdp1SRY6Q1XtJd9Lgf7CKnSho", "blocksMintedPenalty": 0}, - {"address": "QQFapUjGm6acuFtpy7B6t93DiDW4NU1kZq", "blocksMintedPenalty": 0}, - {"address": "QQGD5r9wuV3bjzYPAtG9VL2cs54SD6zDfK", "blocksMintedPenalty": 0}, - {"address": "QQGLQFajfT9ta6ZvCvtWQdjdtz9koWSPB3", "blocksMintedPenalty": 0}, - {"address": "QQGQHiPdmig2kkfMLSar63KXmtTCjPFQxT", "blocksMintedPenalty": 0}, - {"address": "QQGXRaNCuogDrSXFCSMUPxRUyhfKKb9dx1", "blocksMintedPenalty": 0}, - {"address": "QQHFXA6ughaDWEY5jxzmwjMrCmmj4pAFBj", "blocksMintedPenalty": 0}, - {"address": "QQHtrkdDbmAuK1Xxp6ULgVjZqvU6aEsV3X", "blocksMintedPenalty": 0}, - {"address": "QQHv7ozPP2DPyUXrEi3u95Tp9JMwXzQgo5", "blocksMintedPenalty": 0}, - {"address": "QQJRJgcWY3w86HB9MbSiRY1UCkrEhiAdGy", "blocksMintedPenalty": 0}, - {"address": "QQJYMwAL382TdWEaVjHarrhbMuoJFmAL1E", "blocksMintedPenalty": 0}, - {"address": "QQKKtCByYQ4esicaguPV4XakwGfjMnGtp4", "blocksMintedPenalty": 0}, - {"address": "QQKL47MTE4ETG91uxefx9XiMkgUrBCCw5R", "blocksMintedPenalty": 0}, - {"address": "QQL3iobsimKXkJNmSmTnirzH8b2Nyp5Z81", "blocksMintedPenalty": 0}, - {"address": "QQL8AoJdFH3kdgGsUbogeynpFq5zJpjXX1", "blocksMintedPenalty": 0}, - {"address": "QQLJEcb5DbiBdHbG2yNMqsJzVzTZ6ZyR9z", "blocksMintedPenalty": 0}, - {"address": "QQMiatBzpLasCvG5dBJMjEkQ233pe3QVgD", "blocksMintedPenalty": 0}, - {"address": "QQNCZLUWw9LfmAiYRcF7WSgmZKJ4ix71Za", "blocksMintedPenalty": 0}, - {"address": "QQNMpVBuY6noh8MxmoKFW6x6VHCmpvfZMt", "blocksMintedPenalty": 0}, - {"address": "QQNkwaVZwuA2EmSa8T9MNpxipfSQMAD3xV", "blocksMintedPenalty": 0}, - {"address": "QQNuorBCwKKMwzp86Xr9otBBYknqExinQB", "blocksMintedPenalty": 0}, - {"address": "QQQDsYuAyR39e8SKjLnMkJ6WuoCxRAH8Wi", "blocksMintedPenalty": 0}, - {"address": "QQQMLmrbx7RH1KaRcXjEiVecowmJ1KtvjX", "blocksMintedPenalty": 0}, - {"address": "QQQQ7TDebKDwfrNoN2h1wHq6DzZJppdJRf", "blocksMintedPenalty": 0}, - {"address": "QQQUK8VcKXCHpgmSaQppducbyfKorDyuEY", "blocksMintedPenalty": 0}, - {"address": "QQQaPnAXJrrD3uk7ou18hCyDpLXiRGSB73", "blocksMintedPenalty": 0}, - {"address": "QQQpgEHFaoivuro958kGKbBJ4Z1Rev2Ypn", "blocksMintedPenalty": 0}, - {"address": "QQR87w7gM1NG9s2BxgDqnzTdz9hzVPyFTz", "blocksMintedPenalty": 0}, - {"address": "QQRGMtQuHV77tPQRVk1ejAqMD5Ev9o3kV7", "blocksMintedPenalty": 0}, - {"address": "QQRTgyLCMFaxSJyH1pwoFjbTVUgEvXtk7c", "blocksMintedPenalty": 0}, - {"address": "QQRdDZ1L82kgSXf3G6LdTjCcyaJu2C7NkA", "blocksMintedPenalty": 0}, - {"address": "QQS2jVY323CX7MyRz5ExQsYhTpDwfeLr33", "blocksMintedPenalty": 0}, - {"address": "QQSFur8jQWR6HYBsqgD4bVtGVNwR3eyis9", "blocksMintedPenalty": 0}, - {"address": "QQTF5z6KcE7Bw1sxyNvMsowMNPRzcmjVGH", "blocksMintedPenalty": 0}, - {"address": "QQTZzJ3PZBJCoV5nYSQNwj67qJ982c7bfa", "blocksMintedPenalty": 0}, - {"address": "QQTf93L9ZrYFNRKTMQGEc9ZetivDxSCMM3", "blocksMintedPenalty": 0}, - {"address": "QQThofcN6Zteq2nDfB1aW5caJanicDVoyU", "blocksMintedPenalty": 0}, - {"address": "QQTywusG6qWJ9vSAbg7D6udkLk7oPH9Yy3", "blocksMintedPenalty": 0}, - {"address": "QQV7hwMGQMvo1nUYMNVuZkHPRH35CMf6qY", "blocksMintedPenalty": 0}, - {"address": "QQVuSAxGrAFmDdeSt39kgXwNmCBWqzu5e6", "blocksMintedPenalty": 0}, - {"address": "QQWC4vynQeVaozTvuqj983bAr3vmGZfgHb", "blocksMintedPenalty": 0}, - {"address": "QQWkvFBqDe5rNJjNYuEx2z3LQhLtnmsjgL", "blocksMintedPenalty": 0}, - {"address": "QQWr8wboVNDgKxoEAu3BneBTxNcXYXEDYy", "blocksMintedPenalty": 0}, - {"address": "QQWryDYS6MVSfRtaGpgz8T2dmsTF9EwVoa", "blocksMintedPenalty": 0}, - {"address": "QQX8B8PoMP7tHHQbVzG17VafUoJ8rV6cz9", "blocksMintedPenalty": 0}, - {"address": "QQXPQnVNxb19mEZv1necVnGV9eFFutTn7L", "blocksMintedPenalty": 0}, - {"address": "QQXVgKgRHqQ7tEJYfkuKPwHcsL3r9eoFgu", "blocksMintedPenalty": 0}, - {"address": "QQXgH4CnQCB76BbXhsApu6ShhohFfvoXv7", "blocksMintedPenalty": 0}, - {"address": "QQY7QH2eKq12Yz6a22QHiY4YBoWgb7CuXX", "blocksMintedPenalty": 0}, - {"address": "QQYCMdTxLwABWHHmkiGD8SM5PzeBCTnsZr", "blocksMintedPenalty": 0}, - {"address": "QQYHtLf53TsRmhmeE34x6dDiunGpysr4Z6", "blocksMintedPenalty": 0}, - {"address": "QQYM24t4yiEMpqJvy1bPpiUvGxbWLUBggL", "blocksMintedPenalty": 0}, - {"address": "QQYXt8FJCZTE9pg3CLNpdmGA9JoJmyNQDS", "blocksMintedPenalty": 0}, - {"address": "QQYicwd7DKUx5EF4r6B2PyQWfvUkQKVgw2", "blocksMintedPenalty": 0}, - {"address": "QQZ3onJiJcWnBHW3j5N6oyrBpPtmvVaLUH", "blocksMintedPenalty": 0}, - {"address": "QQZ4bAPJmWWuYPGj4h52EWjb1MX8sTSq5F", "blocksMintedPenalty": 0}, - {"address": "QQa97pDL6aJXzQHxwSPZ2u2AvSLt2P9ALA", "blocksMintedPenalty": 0}, - {"address": "QQaK78HvkcGdVwHuvUgLV9ahbXoueX81eX", "blocksMintedPenalty": 0}, - {"address": "QQaRAB8kV6S1FiSL9Ae54qpbYAQK3mLAvk", "blocksMintedPenalty": 0}, - {"address": "QQanbLRY9xJ8vjfNBtbomMmBpyLAPFRtMf", "blocksMintedPenalty": 0}, - {"address": "QQauRBZ4yhmHLzcdHSZVoEzjPVmozvpDpX", "blocksMintedPenalty": 0}, - {"address": "QQaw85GKyvuMMAiff8UuzeKBM3bmK2rxAj", "blocksMintedPenalty": 0}, - {"address": "QQb4jnu1fu2GHRNGKkgZcsuox4ovSrDanx", "blocksMintedPenalty": 0}, - {"address": "QQbEwkkxY2RsHGACTJEirq6Ppu3tLGu5yQ", "blocksMintedPenalty": 0}, - {"address": "QQbGMo6hwHnFL77q7SyBjneAFrN2jDmwE6", "blocksMintedPenalty": 0}, - {"address": "QQbN2UnXFk1UK4dqc3n54mH4UJWxtqXC2c", "blocksMintedPenalty": 0}, - {"address": "QQbPPkWXe3ECQtdiZynCq3LVhwJL28mXee", "blocksMintedPenalty": 0}, - {"address": "QQbSTLQs9kWcZEU9JBVFcK6HNvZusv2dQV", "blocksMintedPenalty": 0}, - {"address": "QQbwZCg36JNiZDKboeLZvYW6PzhhgvSpth", "blocksMintedPenalty": 0}, - {"address": "QQcD6gGRfrQ9tQ1DnR56ZvUby8k8K1ei4e", "blocksMintedPenalty": 0}, - {"address": "QQcmFkNsbBGMJUGxCWS5ZFJN4ZyqdTi1KY", "blocksMintedPenalty": 0}, - {"address": "QQdZ36SGrHtWuv7iAYHYFaHw9grhpEsJ6a", "blocksMintedPenalty": 0}, - {"address": "QQdbw7LV9iWAMzT6b8cm8Nk28Ex2dFfz5D", "blocksMintedPenalty": 0}, - {"address": "QQddDmV39Wp1abBvFskxTtDMbSADv1srra", "blocksMintedPenalty": 0}, - {"address": "QQdec5Q5mhqcEQp9uMAkc4Ugx5xjJdVsWR", "blocksMintedPenalty": 0}, - {"address": "QQdpjarE5QW5L7GNShdnx1Zw7dbmAWKQJN", "blocksMintedPenalty": 0}, - {"address": "QQe115Xco3RU7KgvEqtFgJHQMXacBb1XwS", "blocksMintedPenalty": 0}, - {"address": "QQeYo2ASkHhwm9dXoZ7bCqiuSbmnixdz7K", "blocksMintedPenalty": 0}, - {"address": "QQeu7RoSdyHF5SEfB2AgxcgNyQogL6Vzwq", "blocksMintedPenalty": 0}, - {"address": "QQeujvwx6kvNRSNiWHQY5uMn3s7DnukaTa", "blocksMintedPenalty": 0}, - {"address": "QQfCSyQFWVxyhzPLfDVat1jK1jP6PNH1CD", "blocksMintedPenalty": 0}, - {"address": "QQfRNWYX6hdcAUohYRRyk46vw7VyUMMVrh", "blocksMintedPenalty": 0}, - {"address": "QQfYQtc5bHQy7HGVR9gRvt2JfxYmAME8Pu", "blocksMintedPenalty": 0}, - {"address": "QQfkyESaNT5r9WiFLwrdhBcB7xpRavqe9a", "blocksMintedPenalty": 0}, - {"address": "QQfucqV2K714F8aq29UfL7BioF1g4Sd9g1", "blocksMintedPenalty": 0}, - {"address": "QQgvkjaToKcNcBtPozHZmCKwV7EyyJSMLP", "blocksMintedPenalty": 0}, - {"address": "QQgyuNAmz35dyXD6oAgF8fMd5iJqTfdDfM", "blocksMintedPenalty": 0}, - {"address": "QQh8wsxzP7oSyhsiQoParhFYsL4BGWWvyN", "blocksMintedPenalty": 0}, - {"address": "QQhHEPpy3WWW7UxovhfYhoysWeuktZbCU3", "blocksMintedPenalty": 0}, - {"address": "QQhaJtw7UMWzne1hgMWg7b1e7U7Rpp6zSk", "blocksMintedPenalty": 0}, - {"address": "QQhiNDRLCzct658e9NymmNM6hQQkLMJ9fm", "blocksMintedPenalty": 0}, - {"address": "QQhvUyCiW5d1rFpAsb4RZ5zYtgfYb48CfT", "blocksMintedPenalty": 0}, - {"address": "QQiTfR9MpMnD1RUS8UuCLso8fo1FhPtyZW", "blocksMintedPenalty": 0}, - {"address": "QQiq6SfijyPRRe24AJSPMAHe4PnZLcbfe5", "blocksMintedPenalty": 0}, - {"address": "QQizEF2FWXcyJ432G3tRV4yrR8FrYDtKkb", "blocksMintedPenalty": 0}, - {"address": "QQjTkSVRKKz4oBQrP85L53xpEjDXm3sqy6", "blocksMintedPenalty": 0}, - {"address": "QQjiCpwLkxEdvYa5EQvrKoxAL6dA6uJCq7", "blocksMintedPenalty": 0}, - {"address": "QQjq5LDLCcmLBK6kBjAPTSUH3hoq5WPhyL", "blocksMintedPenalty": 0}, - {"address": "QQjtvAJHhybC7JdPte97mL69vBrsDc5MzJ", "blocksMintedPenalty": 0}, - {"address": "QQjuZ2pY1Z8Evh42qH8boNtY3QmNDiz7fE", "blocksMintedPenalty": 0}, - {"address": "QQk21DvS9soWachQcfejCiaGyMEYtciHu4", "blocksMintedPenalty": 0}, - {"address": "QQk4WkXMzKkCZ9uh2QVh4CAmnTGvkwa2SB", "blocksMintedPenalty": 0}, - {"address": "QQk89QT3ttgWZyybNjRkqZjt8fxjLoj8ya", "blocksMintedPenalty": 0}, - {"address": "QQkHepEBe2FJMVDxWNNnqdNHviA9XTJ27g", "blocksMintedPenalty": 0}, - {"address": "QQkHnCKdjNzeLEizk8KAN3ngjd7AKnDbbB", "blocksMintedPenalty": 0}, - {"address": "QQkjfsvftFEnKHW1m3cnTknsTv4wgPicZP", "blocksMintedPenalty": 0}, - {"address": "QQkk3kVhrR1PSVyPz8SpPm4Ar1KB56fdYN", "blocksMintedPenalty": 0}, - {"address": "QQm8DCh2eBRjiXufeU4UyBwPVVwxBLjDVB", "blocksMintedPenalty": 0}, - {"address": "QQmF2jdvfumbmLQ49oqt6wURdJtMCxCnib", "blocksMintedPenalty": 0}, - {"address": "QQmfKtkZLyQgdbXBMqxmE2z84VnviAFegd", "blocksMintedPenalty": 0}, - {"address": "QQnZJjMaEWALeBouKY62unhRc8MjzVYV6Y", "blocksMintedPenalty": 0}, - {"address": "QQntnAvii7HgRDxscPS2GRiUURUeC5WQ6i", "blocksMintedPenalty": 0}, - {"address": "QQo2UKNh9GAkbshkknm7C2wp5xdqZjJV3v", "blocksMintedPenalty": 0}, - {"address": "QQoTtD3tsERc2NjWhar2osR73puEu9b6We", "blocksMintedPenalty": 0}, - {"address": "QQobpEvA422rZiCSvw6K9pZEcmVpxfM4vx", "blocksMintedPenalty": 0}, - {"address": "QQohiDqche8BzUW7xL4pzUEh32n8AJi28q", "blocksMintedPenalty": 0}, - {"address": "QQopbj3ZdckKCiWjntbWSB37SxSz7493ia", "blocksMintedPenalty": 0}, - {"address": "QQos7dDEFhx1TMpoRckMowmAQhd5kkEM65", "blocksMintedPenalty": 0}, - {"address": "QQotz1gRGoRL8Q2WayqdjYKm1QVjDeA8dS", "blocksMintedPenalty": 0}, - {"address": "QQpTdwbaEbvwvVuTpTipZpR5BBqWy6RDiD", "blocksMintedPenalty": 0}, - {"address": "QQpViwECii3BRUFcFQJDuqHxAAENt6ZN1i", "blocksMintedPenalty": 0}, - {"address": "QQpX98q5PfFLU8Hs2x5Y1ygALhC7z7rXaN", "blocksMintedPenalty": 0}, - {"address": "QQphcmZVUmMKe4ABBNCr55cz1hMwQG9rSm", "blocksMintedPenalty": 0}, - {"address": "QQpmK34E15T86aRdczTa49anYE8TebVQGc", "blocksMintedPenalty": 0}, - {"address": "QQpy11YDZyCczWBh6KkUW2CRKWXFZnnnzR", "blocksMintedPenalty": 0}, - {"address": "QQqMC1MCu2EMrc5wYpazaLreGFUvkAcXeb", "blocksMintedPenalty": 0}, - {"address": "QQqQt5N3TzqmJJiB8J2TkfbnqxYqUeur8F", "blocksMintedPenalty": 0}, - {"address": "QQqWywByoToLoCy87tueYbkRNcta3kdXK4", "blocksMintedPenalty": 0}, - {"address": "QQqdoczpYUcmcXMUUBsvbENs6Vv43VBxXa", "blocksMintedPenalty": 0}, - {"address": "QQqqmKMx1XVaij5ckFQrVCqunoCE21sR1g", "blocksMintedPenalty": 0}, - {"address": "QQqxKQZynhuwVVkkgFkoCa4ja48gbXhWZ4", "blocksMintedPenalty": 0}, - {"address": "QQr17yB1SD1Xyrq43dfxVegBRxHTLGg32Q", "blocksMintedPenalty": 0}, - {"address": "QQs29LJ3ncCrST2P5A2NnoJAQUNi6zM9j3", "blocksMintedPenalty": 0}, - {"address": "QQs5ypSjU6MBebHVNdbsJaypTbK7FVS9MK", "blocksMintedPenalty": 0}, - {"address": "QQsXsTj32dx6PBRDX5RcXC6sd7ctXj3XDB", "blocksMintedPenalty": 0}, - {"address": "QQsbmnc7KbHtC2EimXoSfsYobCerYzdsBh", "blocksMintedPenalty": 0}, - {"address": "QQskRozD5h8Mqi1tep3o1USRLQWsRtfdFX", "blocksMintedPenalty": 0}, - {"address": "QQsqmz1bJVXki4nnwoujTCH8nnwVjcgMkM", "blocksMintedPenalty": 0}, - {"address": "QQt94zRXQcaD4decArvbqkjVAaRLHAVEQR", "blocksMintedPenalty": 0}, - {"address": "QQtCv9NFLoK97DwzUxRUAN2ZNERyDftEXo", "blocksMintedPenalty": 0}, - {"address": "QQtJk2sRU55bbqoQWR9jTQXksx7UfoECX7", "blocksMintedPenalty": 0}, - {"address": "QQtT3JPHurzQi2kcT3yYhEXzHa7a3iqnM7", "blocksMintedPenalty": 0}, - {"address": "QQtU8o7TBGc9CCoebDqeUAshPd4N1xS198", "blocksMintedPenalty": 0}, - {"address": "QQtzwqkmZMUa9BcDAYHVLRywSf6Z1qbp5J", "blocksMintedPenalty": 0}, - {"address": "QQu1jxovEv5sLr7KoDK1W6HxnMi5983k1X", "blocksMintedPenalty": 0}, - {"address": "QQu5nHs2NbKG9UqYo5j2yZawpAJDy4zepc", "blocksMintedPenalty": 0}, - {"address": "QQuFucy2VVrV6uKHF95Ks1mXyE6vib5sSj", "blocksMintedPenalty": 0}, - {"address": "QQuQJcD1pw6nMNXPTvB1cuUQtHXHfcmiHo", "blocksMintedPenalty": 0}, - {"address": "QQuS2Xwh3xeL4chLRuiAJRVaU9SFqPnf7x", "blocksMintedPenalty": 0}, - {"address": "QQvAZkXUitgkAymawoxL6krpWbsQoWtkiy", "blocksMintedPenalty": 0}, - {"address": "QQvDmGQqGcVrULmCw1mbgA2FZTfoXDSAwz", "blocksMintedPenalty": 0}, - {"address": "QQvqPdm84RTTgzi3cTp2JVYRDkk9eZmhTd", "blocksMintedPenalty": 0}, - {"address": "QQwwFe4zUWpa4mGZ5vycoVYcDfMCQyvFJ4", "blocksMintedPenalty": 0}, - {"address": "QQwx5Bv9M5KVVkZeBn7fkgVBd9HyUZ7gq2", "blocksMintedPenalty": 0}, - {"address": "QQxLj5FFuuXzL576d3UwNWyoFx1FQ7cfQC", "blocksMintedPenalty": 0}, - {"address": "QQxieJdzx7Wavs7qkD1QAUwkpnTiZ685Cb", "blocksMintedPenalty": 0}, - {"address": "QQy9pvfqXTgkPR4LSfNSXN8zRLSQu4EN3Y", "blocksMintedPenalty": 0}, - {"address": "QQyHikW6qkW1LHPQPAQFFowV9YrNr2XdKC", "blocksMintedPenalty": 0}, - {"address": "QQyUBZuXMuJfp9MuhDWzeHPnu3WDJMEvQM", "blocksMintedPenalty": 0}, - {"address": "QQyuqYm4h1XCXeZcWpTWgqAgrFpwH5XZBJ", "blocksMintedPenalty": 0}, - {"address": "QQyxhTXaA9JQ7gswbNRmy5zPncwYeDVES8", "blocksMintedPenalty": 0}, - {"address": "QQz2srBuCNnCL5EryV3hSXXpFgvp4JBgRP", "blocksMintedPenalty": 0}, - {"address": "QQzMijJXbffvJD824FeCFtYo5DTV4rb27m", "blocksMintedPenalty": 0}, - {"address": "QQzT2YMW7ow6vW5g7botqbTx6CX2m8MWDy", "blocksMintedPenalty": 0}, - {"address": "QQzdsnwQaR79GeVcVVViiJtFHwJQfquH7j", "blocksMintedPenalty": 0}, - {"address": "QQzg74qqJFurcivNc65LGzJLhf3V8goxNi", "blocksMintedPenalty": 0}, - {"address": "QQzgxYVcz5gE5yFRthzYPrXML62uBphKFh", "blocksMintedPenalty": 0}, - {"address": "QQzkyrkBNGW2Z6piyS8QhYCo9fiJ6g6mRW", "blocksMintedPenalty": 0}, - {"address": "QQznCAhuEWfA6qc6jX6qKW1zfa97FfyPSt", "blocksMintedPenalty": 0}, - {"address": "QQznPMxHdkFJkW6UJTzGoELpMsHQMQTpWi", "blocksMintedPenalty": 0}, - {"address": "QQzzCy4m8cJBj71BCuMv3g8iYJrE4nD4mZ", "blocksMintedPenalty": 0}, - {"address": "QR1U7H1uxpPMQDZfcJkmhP7rN5muR6CYim", "blocksMintedPenalty": 0}, - {"address": "QR1jgGiTycqJNyBXGm5yZBgdQzZyDM2JEN", "blocksMintedPenalty": 0}, - {"address": "QR1xPjV5tC6khDAQBNY3QtN92BFFpHxQvs", "blocksMintedPenalty": 0}, - {"address": "QR3JHe1u3ezoPvaxsVAvvNYqSkThjkqeKV", "blocksMintedPenalty": 0}, - {"address": "QR4JqCUP9eu7ZYU6TcjogfwtdNMu4oDXg4", "blocksMintedPenalty": 0}, - {"address": "QR4yJUhM649ZhNbHX14pA3Wh4HH3W3NXzS", "blocksMintedPenalty": 0}, - {"address": "QR5YccTikhfxhSDP6aGYqwbqRr84sVWVqA", "blocksMintedPenalty": 0}, - {"address": "QR5uwr2nYNoYG3FXsSNqb2bwHyVeebNbd4", "blocksMintedPenalty": 0}, - {"address": "QR5xsQro2R42oU1bcXoZoqxqBsaKvoZkPG", "blocksMintedPenalty": 0}, - {"address": "QR6SrtcoaNyAT1jwWdV7cCy3RsWaDtEurL", "blocksMintedPenalty": 0}, - {"address": "QR6Uxji1yoDKHRzTnnNBB4RzXbmeQVnzNm", "blocksMintedPenalty": 0}, - {"address": "QR6azc2v4ZTgV5sBG96ZNKWHcDUXMyqX88", "blocksMintedPenalty": 0}, - {"address": "QR6i2FR6fk86VHZkKdo4g2Karh8aQUbyyK", "blocksMintedPenalty": 0}, - {"address": "QR7Evdqxegc9a42bewh3THMtUixmQKNHd4", "blocksMintedPenalty": 0}, - {"address": "QR7HTrycD6ZuP1LABeGjzRdiUUvFcrv1Lh", "blocksMintedPenalty": 0}, - {"address": "QR7RiVyd9NRXBrR2tNctCyGsKqh2mX51KF", "blocksMintedPenalty": 0}, - {"address": "QR7jsaN1q2dPVacYNATbzFRnavk7NSXZHA", "blocksMintedPenalty": 0}, - {"address": "QR8Lcv6MKdmh64ct7zwv1s8n4L3bxEpe5o", "blocksMintedPenalty": 0}, - {"address": "QR8gZ4opSbutAFjqu7QdKkV2jtho4Nti9Z", "blocksMintedPenalty": 0}, - {"address": "QR8oDBHHbP9gZDKmCVj47zWfcRcq6p8Pmo", "blocksMintedPenalty": 0}, - {"address": "QR9RQP8XwPYxVhp5U8s6APuFUX2FqUmKcS", "blocksMintedPenalty": 0}, - {"address": "QR9kC8EWXvHjSP4EiJNPqXhegxNCQs6Xjr", "blocksMintedPenalty": 0}, - {"address": "QR9nMMTycNHkuaAA6G2LjRrXinLKXUQy9U", "blocksMintedPenalty": 0}, - {"address": "QRA2YcuQKYJikDNMGUz5wqENgejNYiWaDz", "blocksMintedPenalty": 0}, - {"address": "QRA4nkGEKCjMospCnodE61tocyfzGuiQnx", "blocksMintedPenalty": 0}, - {"address": "QRACF5ZkSoJowTXT8i1Uwk5K9pbeCnfFMx", "blocksMintedPenalty": 0}, - {"address": "QRB1SyjRGX7qxkwv6PmW6LfJswSDFVnjzL", "blocksMintedPenalty": 0}, - {"address": "QRB3pEoR3HURvVMmfXBhuxThgNMxxjPCoo", "blocksMintedPenalty": 0}, - {"address": "QRBiy8vdcWtwsB76mviTYooio3u7XVnZEL", "blocksMintedPenalty": 0}, - {"address": "QRC3cvonx2PTEM3ayuH67rtgQeVAQAetSt", "blocksMintedPenalty": 0}, - {"address": "QRCe91nhFCXnNmdK28vXgkm8LL4vZUyQuw", "blocksMintedPenalty": 0}, - {"address": "QRCiozzu2KQ9hRiSMw924g9uVb8pXgpV1s", "blocksMintedPenalty": 0}, - {"address": "QRCowt2NMDF1UXRgaJBHcVd7nVddoxn5Zn", "blocksMintedPenalty": 0}, - {"address": "QRD2FT37YJvCPbbT7CMPWbHcqQhP6MB823", "blocksMintedPenalty": 0}, - {"address": "QRD65V4svyA9pHXbi3z8ieua8JM5hxPhH7", "blocksMintedPenalty": 0}, - {"address": "QRDCz6xpY9i3WLip6NCmk4wh5LwsKc2E1b", "blocksMintedPenalty": 0}, - {"address": "QRDYaiCpxPSaLJ9vWemTy1Eg7pChA6UFjM", "blocksMintedPenalty": 0}, - {"address": "QREB4bi4T7YDS9BWqKcUyxTR6DpXEzMtDF", "blocksMintedPenalty": 0}, - {"address": "QREKT8owepgL1e28oEnoB3QeB3wBCWzvZg", "blocksMintedPenalty": 0}, - {"address": "QREd8LbMJh91FrjDf9QDJSMW8p6kohoj7j", "blocksMintedPenalty": 0}, - {"address": "QREhR16svR1vdewmGxVMr6CvFaKoRswp2y", "blocksMintedPenalty": 0}, - {"address": "QRExt8Q2VzUhg7apUWMjDU5iB58yFqRReq", "blocksMintedPenalty": 0}, - {"address": "QRFJDLRfnBawZcHzd4Wwws2vJFSAJpurAd", "blocksMintedPenalty": 0}, - {"address": "QRFLmmvnyJrMdQhiGNGRjh8DXtZxgfa1KR", "blocksMintedPenalty": 0}, - {"address": "QRFMEydffGAaXJdYe3zKjwzjEBKKjbQ1ya", "blocksMintedPenalty": 0}, - {"address": "QRFaCMfmd1ME29Lwtt3WLtunUexWBKCH8e", "blocksMintedPenalty": 0}, - {"address": "QRGF61gKHNW1aGcXdfvXjS3t1vKgUC99Ff", "blocksMintedPenalty": 0}, - {"address": "QRJ4j8JdiWAJDemDXQx9JZHDYaGebMEw5z", "blocksMintedPenalty": 0}, - {"address": "QRJCMCCFcSnDPcD1c7QLYBXTRUryWMQqfM", "blocksMintedPenalty": 0}, - {"address": "QRJF8fgnJQab3bPCqr67tXyKRwRuUp5rir", "blocksMintedPenalty": 0}, - {"address": "QRJMZ86RbrT9pSQ7ZDWs4Ceqeh9LUuGjos", "blocksMintedPenalty": 0}, - {"address": "QRJNMURUtNiWgzD34F6JKgMhUjUmpr81iM", "blocksMintedPenalty": 0}, - {"address": "QRJQ1pL7GBC18JJUPUPtzjc8kNZDL4xSLp", "blocksMintedPenalty": 0}, - {"address": "QRJnMpKXSuZ8D72XQH7XmPMX9JLAfMbwUB", "blocksMintedPenalty": 0}, - {"address": "QRKCN3YiDam1dNWiSiMqfhb5stoi6nAHKQ", "blocksMintedPenalty": 0}, - {"address": "QRKTDC4S3zZWb9QjYt4vVrBQkrqMsEZ7bq", "blocksMintedPenalty": 0}, - {"address": "QRKWT7NWSUVst3HP3a4d8qSGCqY9SKrrXU", "blocksMintedPenalty": 0}, - {"address": "QRKjJCD6G1kQfcQEj45xQEnpfm65hcZgue", "blocksMintedPenalty": 0}, - {"address": "QRLB133hVRizFpPg4Pq2yCPjjCnAMyhits", "blocksMintedPenalty": 0}, - {"address": "QRLCwaXte3xTVFdifRMHi25Aceen8tZ5tt", "blocksMintedPenalty": 0}, - {"address": "QRLM6MX2QKjiNqvaR9jxupBUw1y7D5KLG9", "blocksMintedPenalty": 0}, - {"address": "QRLXXrNKHKkHnujDbGVMvgUiFaXPYa8hG6", "blocksMintedPenalty": 0}, - {"address": "QRLkj8jFzarMY7K19zQRSFm5dTLPuL8FKJ", "blocksMintedPenalty": 0}, - {"address": "QRLxiYqSWSR14ZB7C92SwFaKACHtMWu7z9", "blocksMintedPenalty": 0}, - {"address": "QRMFEAXUigeU7nyUNmEj9gJyhaPds2jkdi", "blocksMintedPenalty": 0}, - {"address": "QRMQuZRz1o8rdfW33ffqtQyrWYi5dB27mA", "blocksMintedPenalty": 0}, - {"address": "QRMZgVsBme1wpnU8BZ2N5fbV1SvQpsSBsY", "blocksMintedPenalty": 0}, - {"address": "QRMw85CmS2efRibarXxVSegxaNTi2u9J1e", "blocksMintedPenalty": 0}, - {"address": "QRNZCcPei3udz2M79aBUyJfogumv5mwG3C", "blocksMintedPenalty": 0}, - {"address": "QRNmFFZZatngUGWzo5cAe4H2ge9ic6cEWP", "blocksMintedPenalty": 0}, - {"address": "QRP4UhiCwZCZpxJReEPvLqz7tDCpxamGFR", "blocksMintedPenalty": 0}, - {"address": "QRPqj8bfqbdpfo3DPdx6wgZiNMJRnpAEvC", "blocksMintedPenalty": 0}, - {"address": "QRRa37mDxEuBV1iQzSw6m6DbWdmUUKgtCz", "blocksMintedPenalty": 0}, - {"address": "QRRbXehUa6S5wHx4RQASqCosmHAhfeQoWn", "blocksMintedPenalty": 0}, - {"address": "QRRidnNwrXCJdDua6ETTMVzwZfXRiHLWHV", "blocksMintedPenalty": 0}, - {"address": "QRRoBoSmXSXRsBGURa1z865TAyR4o255DH", "blocksMintedPenalty": 0}, - {"address": "QRRoK2LVNBaSmQe7Vv4C9PU4E74rXtN2FX", "blocksMintedPenalty": 0}, - {"address": "QRRxfu83Xda15bxiQnnz8zYZqfqM4wQyWE", "blocksMintedPenalty": 0}, - {"address": "QRS5B2stTi6WxwjgcguEYDkwYyychDZrKL", "blocksMintedPenalty": 0}, - {"address": "QRSAnsLe6U8n6KVvgQguVbrhBZJH6u8GAo", "blocksMintedPenalty": 0}, - {"address": "QRSLgEdJCMN5KdRXPrZB2kM5opdGoeP2DY", "blocksMintedPenalty": 0}, - {"address": "QRSfHYBEXEJKLKjzLpsXfkwSFsBKGuqPcF", "blocksMintedPenalty": 0}, - {"address": "QRT7nY9odxEsEvdRrBMdQV4Tc2krkXNS18", "blocksMintedPenalty": 0}, - {"address": "QRTYjXGz7kHHi8VRmwdd5DQWXKMa1BZnP2", "blocksMintedPenalty": 0}, - {"address": "QRTmwZZsoCrVTGoWfyv1kjjtPLKfon3Ngg", "blocksMintedPenalty": 0}, - {"address": "QRTszJURMFW7TDTR9QgtxMXNQPjShGkL5N", "blocksMintedPenalty": 0}, - {"address": "QRU3daFu7KPNV7daNALphb3k8dU8ppgNf1", "blocksMintedPenalty": 0}, - {"address": "QRUJdgSZhMVAKxPuAabSyg1yWboHwPqrv4", "blocksMintedPenalty": 0}, - {"address": "QRURkUsk7f2dN8s7KpcFPeMUEQunsQ5cEH", "blocksMintedPenalty": 0}, - {"address": "QRUbzEbLd7fRjAx2fBdXAH4QS1WQyetvDc", "blocksMintedPenalty": 0}, - {"address": "QRUe6ajZesw25UAXesvsDt8NnUueR19ZUn", "blocksMintedPenalty": 0}, - {"address": "QRV5NseKdRzzwZ5Y53KbzSYa3nqNAcsnUs", "blocksMintedPenalty": 0}, - {"address": "QRVKR2T1EEVPwViPnyJkYL7fu7MHjKjDGa", "blocksMintedPenalty": 0}, - {"address": "QRVbVuSKNe472k8HMqZ3oMtiXBiqs2M6ws", "blocksMintedPenalty": 0}, - {"address": "QRVbgp67vFqv3EogKv55C7xcRHrKmnTTLe", "blocksMintedPenalty": 0}, - {"address": "QRVmq18y9GhNnGBsrGvrbWUkPdBUDzhPmw", "blocksMintedPenalty": 0}, - {"address": "QRWLZqe59io4jUE72GG14hZV88Q4EXkgDe", "blocksMintedPenalty": 0}, - {"address": "QRWPNwSdL7dd7sR6KnNSXkEoGgA8nWwU3G", "blocksMintedPenalty": 0}, - {"address": "QRWQTyjryByDkdFXEvoDeK7MuhC4LRV3TG", "blocksMintedPenalty": 0}, - {"address": "QRWit7rRwsGkPiiCt5m2esGtMuhAwR94F2", "blocksMintedPenalty": 0}, - {"address": "QRWkXKAgsiLiHK4dK5bXnMsCKE7a9Kv4wh", "blocksMintedPenalty": 0}, - {"address": "QRWob7zBJXaqe9ygGqT66tSa5xXeStpJ2s", "blocksMintedPenalty": 0}, - {"address": "QRWopyzeyeDRP7ehyaL1xphYfFcXkp5XRH", "blocksMintedPenalty": 0}, - {"address": "QRWqso1sWLP2zrFcxpJGN7KbA7jjVajegA", "blocksMintedPenalty": 0}, - {"address": "QRWr5QX56weRY72k88htKuvRjdvkWDKFxJ", "blocksMintedPenalty": 0}, - {"address": "QRXNpDFGD1mu258rDWdFo5wGSgJLxbjwgY", "blocksMintedPenalty": 0}, - {"address": "QRYiwj13Dm7QMSBNQevLg1Xz838bpo1rBk", "blocksMintedPenalty": 0}, - {"address": "QRZEgUKTWLWytyZhF3tsq2zVffg2v4Wdn8", "blocksMintedPenalty": 0}, - {"address": "QRZsvTuUXLDqrDtWTEsXU119EwibpbAMKo", "blocksMintedPenalty": 0}, - {"address": "QRZtyH7jPNaVMNRYgiJ9mdj8BPWiuHVMXG", "blocksMintedPenalty": 0}, - {"address": "QRaDfarLJdrt1q861EpLN76VKTV4JDXeXD", "blocksMintedPenalty": 0}, - {"address": "QRaxhMqbgtuQPkcHLLdaBCrVgvxnDrqpgE", "blocksMintedPenalty": 0}, - {"address": "QRb9ZwaY37sMp14cz2kB2BUDKhkDes6oBP", "blocksMintedPenalty": 0}, - {"address": "QRbzLoBVaiLdJPkrsKXT8bHbWZAUhB3Tc7", "blocksMintedPenalty": 0}, - {"address": "QRckkTnsABG7eUGU7mg7ajY4s4viEbgJb1", "blocksMintedPenalty": 0}, - {"address": "QRcm2ipvG6L2aAVAqKDHN5e3LsEB4SHV8u", "blocksMintedPenalty": 0}, - {"address": "QRcrJktsfYwntwhkVxz6QAbhS86DeQ1WPG", "blocksMintedPenalty": 0}, - {"address": "QRcyEesPNpppfEtj9hs4bXs9ePA1M5XRw9", "blocksMintedPenalty": 0}, - {"address": "QRdGLeRqm6jyj91u1DXmNaC5sFPQpbuNMo", "blocksMintedPenalty": 0}, - {"address": "QRdhrw6s6cYjwKinEfPMAyQzn8SCzmGgBH", "blocksMintedPenalty": 0}, - {"address": "QReDYaYC4ccoyzku2UV8TZo5JopLEzqFgH", "blocksMintedPenalty": 0}, - {"address": "QReZLme4AnQDEedYyGL4jv4mLDn7BEK1tM", "blocksMintedPenalty": 0}, - {"address": "QReeJBfUkJre85bytdYicVkePvHtEXYAG2", "blocksMintedPenalty": 0}, - {"address": "QRexATwMCoacaabhF2NamfKKAbFTSu6D7C", "blocksMintedPenalty": 0}, - {"address": "QRfUBgquJEppVkEm3gLci3ALQLtJdXjBpo", "blocksMintedPenalty": 0}, - {"address": "QRfXXYUdncYPshhrD8evYBU3z5FQnpTUVW", "blocksMintedPenalty": 0}, - {"address": "QRfZqJHAprRYihXNiPLx4EFjiYnZEyLdj4", "blocksMintedPenalty": 0}, - {"address": "QRfbVLnEDvqCihhpMicBqSsuZ5Pk27VVjZ", "blocksMintedPenalty": 0}, - {"address": "QRgw7rXTqtPJvNLrjktQxS7vjbBNyZbpSG", "blocksMintedPenalty": 0}, - {"address": "QRh4RC6aPdK76UQBXj6TWV9briXLzQq1im", "blocksMintedPenalty": 0}, - {"address": "QRhBm7s96Jc9wwbYMQRoq3qrXuDzXnr4Lo", "blocksMintedPenalty": 0}, - {"address": "QRhKugcJYyU2DgFepf23ovrV1KhBy1keVE", "blocksMintedPenalty": 0}, - {"address": "QRhTvsrhoeEaCgfRUHMcwrASUKDJbXR9TK", "blocksMintedPenalty": 0}, - {"address": "QRhYNax34qJsBSfSdxaigALhJHtyR2uNMc", "blocksMintedPenalty": 0}, - {"address": "QRheZS81XvrAhmLTfcDJ2XEDGjZ4duKNoG", "blocksMintedPenalty": 0}, - {"address": "QRhqFvWNUL72KR6TueSYn3PXnc8dW88cpf", "blocksMintedPenalty": 0}, - {"address": "QRhzgTVsr6VJWDiCjvLgk1iKLUX6XEhou8", "blocksMintedPenalty": 0}, - {"address": "QRhzh2vC416HPy6egbkzpQT56AbJ9Csznn", "blocksMintedPenalty": 0}, - {"address": "QRiJGMF27h9uKzi5sXBmbbCdsVC8AkSvDB", "blocksMintedPenalty": 0}, - {"address": "QRieC6Rv1z9tS11CHZdsUSkvotEUWf9fAU", "blocksMintedPenalty": 0}, - {"address": "QRig9MNNa1eC45HQvD8xYhtWadFrT7P8CT", "blocksMintedPenalty": 0}, - {"address": "QRikYVQRkcJxUhch7qXrUB4Y9zGEfLfuYV", "blocksMintedPenalty": 0}, - {"address": "QRkatFY6HJCz2JuNrEXvHSpPRRrnSAqzJb", "blocksMintedPenalty": 0}, - {"address": "QRkcKf2646eivvTViHMv1v2EryEVKpgLwM", "blocksMintedPenalty": 0}, - {"address": "QRm8oc6gQdHg5K8QoaemnEx9kiTPbUrb7j", "blocksMintedPenalty": 0}, - {"address": "QRm9G438EGDjHhLDBfLNv1kZZGSrNgCc3m", "blocksMintedPenalty": 0}, - {"address": "QRmQxUj3un28SbY2X25MwqjXBkDnNqN1Z9", "blocksMintedPenalty": 0}, - {"address": "QRn78KQG6bA73MVn5sjttMHfgcLYo3KCeK", "blocksMintedPenalty": 0}, - {"address": "QRnC3vti2A5b9r3QfCNmPLZAcvrWY9FVWe", "blocksMintedPenalty": 0}, - {"address": "QRnmELAKFpN6c6532hPKqn56WxvP283Fzk", "blocksMintedPenalty": 0}, - {"address": "QRpA9jdynFNjAv1xe8qtZcQfCiMHBwm6dh", "blocksMintedPenalty": 0}, - {"address": "QRpFbaGVDdmqvcsySUohDG79B536x8ks9n", "blocksMintedPenalty": 0}, - {"address": "QRpK1gaiYQWr7VsShHeq3cCvo39osreP9P", "blocksMintedPenalty": 0}, - {"address": "QRqALwTtuD9qeXCrDBzQBR6nY5KQPGmpzR", "blocksMintedPenalty": 0}, - {"address": "QRqUybd7T25eWEoyCKBAio3PhCTLRN8BnE", "blocksMintedPenalty": 0}, - {"address": "QRqj7wV3NAYra6p2GdimKeS1u6M4H9fB9D", "blocksMintedPenalty": 0}, - {"address": "QRqjEYYZUMxfzYRxDgtBoLoxSgPJzYafLU", "blocksMintedPenalty": 0}, - {"address": "QRr1GALKhr6xcC5NNWePbhnhRycjJ7dYw6", "blocksMintedPenalty": 0}, - {"address": "QRsRWBBB66Fe23ygAJJmLdpmhRSZpxWWJs", "blocksMintedPenalty": 0}, - {"address": "QRsjkn6KiReRyX626Ji4Egz1W385x34iMm", "blocksMintedPenalty": 0}, - {"address": "QRtjEZAkhRhCD85gXDpo3K1ge64XiB6sX3", "blocksMintedPenalty": 0}, - {"address": "QRu7CWu8TMbniT1Xd7LFVaFpQhRCnYqtYp", "blocksMintedPenalty": 0}, - {"address": "QRuA5LhZ3e7YUPCwsQMijB8vq8MMBma3Du", "blocksMintedPenalty": 0}, - {"address": "QRuB9a4Mb5YsLFW9EaUjcLbPQArnhzDWBK", "blocksMintedPenalty": 0}, - {"address": "QRut7Tk3Dfo36vAvEUCHtKc4Z4gzpfMqsc", "blocksMintedPenalty": 0}, - {"address": "QRv8DxuQDoCt6YKp7kwZqgULYifsq539nQ", "blocksMintedPenalty": 0}, - {"address": "QRvGN1ompjYEoLzqRz4zoJgfUMbTUoTj1p", "blocksMintedPenalty": 0}, - {"address": "QRw7icD18LaM2fJ1opin6rdiQ87hz9Vui8", "blocksMintedPenalty": 0}, - {"address": "QRwXcG5pKKMfphzPcuHkD8ueQppqCy8sQ1", "blocksMintedPenalty": 0}, - {"address": "QRwihANdfba2BdmhdW8DmsciNmSCDeEFtK", "blocksMintedPenalty": 0}, - {"address": "QRwnuYVPUnaoP8RHrdvnXKBBHnEeUNEMDH", "blocksMintedPenalty": 0}, - {"address": "QRwt5hLgG28RX4r7y5ofe8nt5vkuj5zhTE", "blocksMintedPenalty": 0}, - {"address": "QRxR6XvEjUyGsN7vNPToZvPrKE3mddEu9K", "blocksMintedPenalty": 0}, - {"address": "QRxX1NeBwSwJTByxEoE3TJhz7bhsvcwU2W", "blocksMintedPenalty": 0}, - {"address": "QRxczRs3aqSvQk22bPc5WJedTektiGDF6C", "blocksMintedPenalty": 0}, - {"address": "QRxiERWBAHegN59fV6eH5DwmzGc121bTq6", "blocksMintedPenalty": 0}, - {"address": "QRyCssXBqS6DUR6to9iSeCwBZSBBKhbYCs", "blocksMintedPenalty": 0}, - {"address": "QRyPv5ay8pk8BQBNw6XEETjeWK7PYuXBbQ", "blocksMintedPenalty": 0}, - {"address": "QRyRScM9pTtdqoyZy382PYgVFgEiE6FHgR", "blocksMintedPenalty": 0}, - {"address": "QRyunn3X2Xp8EhUGp1ZzJtJz2emVj4viwt", "blocksMintedPenalty": 0}, - {"address": "QRz9cekiXcsC39g6ZLtJ5JRh9SPLk87Utw", "blocksMintedPenalty": 0}, - {"address": "QRzHpHywadTvEJ1fbF9h1tPGg1NKQrP8V5", "blocksMintedPenalty": 0}, - {"address": "QRzR8ort1L3ozJBaF56UGgJpr7J1qEi3QW", "blocksMintedPenalty": 0}, - {"address": "QRzTBMEfY6jFpRcAgiSL6obBVsTss5yooq", "blocksMintedPenalty": 0}, - {"address": "QRztHxp2rB932YnpRUhDVmaLnTqWQZsXaK", "blocksMintedPenalty": 0}, - {"address": "QRztKVhnQMXZzsnXFcgbqz1HDb81P25BHm", "blocksMintedPenalty": 0}, - {"address": "QS1TDcXhTa6qnMUcHYGSg7gyTGdUFEuSZf", "blocksMintedPenalty": 0}, - {"address": "QS1TPZWZv3dBhr3wd5wszSnAkDb7wpthGb", "blocksMintedPenalty": 0}, - {"address": "QS1izq2m1efZJKt2vLzby4j5UeXY4djTjV", "blocksMintedPenalty": 0}, - {"address": "QS1uUUFgXpBJ5oYqGXb8AqtLFLw8YAU9KL", "blocksMintedPenalty": 0}, - {"address": "QS25X9fVEBKQG7tvQnhfSqXXfxDLqYg7hC", "blocksMintedPenalty": 0}, - {"address": "QS2GyUuzQQECKm4pqi21aJwRYJ7NrczRwz", "blocksMintedPenalty": 0}, - {"address": "QS2Sksisf28iyLq7pJnLW6C4kKMY3SqsSS", "blocksMintedPenalty": 0}, - {"address": "QS2UP9LwrMt7mgAxPmN2k5zhg7TsK723rF", "blocksMintedPenalty": 0}, - {"address": "QS2vPctBWZbJ1h4Mk6PU1xXzUn2sYUhQYp", "blocksMintedPenalty": 0}, - {"address": "QS3UiEM4yWoQDcHRWrBiA94BtzrhyD567U", "blocksMintedPenalty": 0}, - {"address": "QS48pLS2xuJ9mFz7Pj7wnjDGrDJjHoApDJ", "blocksMintedPenalty": 0}, - {"address": "QS4EGtWzrUtmtegzfUjgH9xxRYXvwohKa3", "blocksMintedPenalty": 0}, - {"address": "QS5PMtbcrN4EVcvkTg9Dq4F9AXi3ttsf4H", "blocksMintedPenalty": 0}, - {"address": "QS5XeRX4QxQ46Q71GQSRVK16j6Td8CjoyD", "blocksMintedPenalty": 0}, - {"address": "QS5mWgyKAevjZGNETHSpmy27cSjpRkJKtM", "blocksMintedPenalty": 0}, - {"address": "QS5wbaYpNPQfSn71iDugGrW5EXCGGRdSvh", "blocksMintedPenalty": 0}, - {"address": "QS6WAT1Cqj44tGwLqTGzzjMNzCFUJHoqzQ", "blocksMintedPenalty": 0}, - {"address": "QS6cQMfttAfEBqhUM7JXYAhZdVZogYMRQS", "blocksMintedPenalty": 0}, - {"address": "QS6dm3eKqSNSxkiagzsbdfyzVn6bLLwgNE", "blocksMintedPenalty": 0}, - {"address": "QS6eH9erj4skLpx84dBgLdwqMGTon9gi79", "blocksMintedPenalty": 0}, - {"address": "QS6qBZbV88NCURWVCuSxK8ZnWYaQpnbMed", "blocksMintedPenalty": 0}, - {"address": "QS6wPSDh6opaLjH9aoqipsdvGnJdcbLYsw", "blocksMintedPenalty": 0}, - {"address": "QS71MayX7tob1jauMyGkSLWJitAhPHBYrt", "blocksMintedPenalty": 0}, - {"address": "QS7xcLZbutXTVE26esqvRnocjydrN4nWkW", "blocksMintedPenalty": 0}, - {"address": "QS7yjcT5o33kBzjFsY8JF3MmaibavBLVMC", "blocksMintedPenalty": 0}, - {"address": "QS83KXFgAWbAeJm4QMDYdemA6CKemGd8tS", "blocksMintedPenalty": 0}, - {"address": "QS83nAQAVUCJTrj7SKFFGrYoHK5PVYPyPo", "blocksMintedPenalty": 0}, - {"address": "QS8Y2ozxw81ih6YTF6c5ZUFanwMSKhhTfC", "blocksMintedPenalty": 0}, - {"address": "QS8u5CgraHStSJWixpGJCoQcdceojSPa6v", "blocksMintedPenalty": 0}, - {"address": "QS9AVT47nygVEg4EGmWUbnmTtu62CBhcwk", "blocksMintedPenalty": 0}, - {"address": "QSA5wvpQEaixAKGqJQQd5MNYp9M9EZfynw", "blocksMintedPenalty": 0}, - {"address": "QSAd32J96u9hHUegV9hL4dZVL5NSzMftBp", "blocksMintedPenalty": 0}, - {"address": "QSAtzJb4joZTjjPGeF5Jfud4V7TWWeDcSU", "blocksMintedPenalty": 0}, - {"address": "QSBJTLj7v8a55AhPX46mrAm77fMSqRyCDJ", "blocksMintedPenalty": 0}, - {"address": "QSBL3Wn1Z8yt6NEJgcJkWQew8mY4X5jeWn", "blocksMintedPenalty": 0}, - {"address": "QSBRvvByBWwmZUyx9gb6Fsyps8cfUdj8ei", "blocksMintedPenalty": 0}, - {"address": "QSBfsDVJopjw4hXxGSdz3NrThaESTQ21dA", "blocksMintedPenalty": 0}, - {"address": "QSC4DeeeWMF9j1DG66HYyFxC39drKVkLZZ", "blocksMintedPenalty": 0}, - {"address": "QSCK5a9TEPQRxQXs54KuxZF8emehooFJfx", "blocksMintedPenalty": 0}, - {"address": "QSCPzusS47RLbtruZwJL1ctFqVefFGNwXb", "blocksMintedPenalty": 0}, - {"address": "QSCzwM4nvDUfLXMYsD5HGywS2PBHNU31MG", "blocksMintedPenalty": 0}, - {"address": "QSDYRKA2cMdYKj7tL5SQMDByTQpo3Dqimd", "blocksMintedPenalty": 0}, - {"address": "QSDgDMEetKG9ZP33fKiBNTd8H6CdNUv2hf", "blocksMintedPenalty": 0}, - {"address": "QSDnTJ5AovjkYeCw26HCr3Q3dr37Sg83iY", "blocksMintedPenalty": 0}, - {"address": "QSDyR9HazMo3bewMtJmPS145TtyWgUgtQL", "blocksMintedPenalty": 0}, - {"address": "QSEELqb27Kiteo6mDiLRFbzguEN2pF4eDW", "blocksMintedPenalty": 0}, - {"address": "QSEfRSmeFnHpARKEuy5vrBRWCu1Pw6uTgE", "blocksMintedPenalty": 0}, - {"address": "QSEgKFh7qSyKzXymDvJJZKBu9MZ8KaB6Lp", "blocksMintedPenalty": 0}, - {"address": "QSEq4QFvcVPBY2B1oEEnsLe5sNZ7bFgodr", "blocksMintedPenalty": 0}, - {"address": "QSF8o3DskzpFkKoPn6ixw6HUGjFvqrEnJF", "blocksMintedPenalty": 0}, - {"address": "QSG2weqnHKSZB6dh4PNeiMkKQvWs2ghK9j", "blocksMintedPenalty": 0}, - {"address": "QSGnwfFx4yd4pZcihsod9VC8QBHb2Kos5A", "blocksMintedPenalty": 0}, - {"address": "QSGx6P9rvjPH4qBBG8jDMXPTvNoFJ2GAwR", "blocksMintedPenalty": 0}, - {"address": "QSH3v4Vv86qdNCAAgVt1KvpvUMPZoaVW9J", "blocksMintedPenalty": 0}, - {"address": "QSJ2JnthzLmkKtph81dJEt6nbjBTuMhC3i", "blocksMintedPenalty": 0}, - {"address": "QSJRSoyGW3P5CcGdvzGG8G5b4xMGS28iuA", "blocksMintedPenalty": 0}, - {"address": "QSJvPMGh8eiyaYn9gMqRNCbgFrCWvoBYoW", "blocksMintedPenalty": 0}, - {"address": "QSKB1QYgU3rCiikyvFPPzodsBHyfc1vFfL", "blocksMintedPenalty": 0}, - {"address": "QSKDER5djRi8USodf2x4xSe297a22w73Js", "blocksMintedPenalty": 0}, - {"address": "QSKLxw2dU1Vc1gr1niBzZdYcBVGvDc67Eh", "blocksMintedPenalty": 0}, - {"address": "QSKXDKpex96Dn8NcqaVJQa1wWjUY7JeBfJ", "blocksMintedPenalty": 0}, - {"address": "QSL8oN5MfRFmrmdKXXAphRJ8EwNn9VnNFN", "blocksMintedPenalty": 0}, - {"address": "QSLKVJ9S7Lv1zeB5x24JwnUjcXEDUcLQTA", "blocksMintedPenalty": 0}, - {"address": "QSLWG4wa5WYCXRMm239ZtMmqn4p88PUVjL", "blocksMintedPenalty": 0}, - {"address": "QSLjJ2gh4iJbqrJ2SRSuPXeEcqKUbeEewc", "blocksMintedPenalty": 0}, - {"address": "QSLte7Nb2Yfr5JB8YoE2eUDty3zG5b4frB", "blocksMintedPenalty": 0}, - {"address": "QSLuLB6PYeGy8qEPv1tTFGEdSoUrNUmWVU", "blocksMintedPenalty": 0}, - {"address": "QSM3ykyqSJ9TwwFooiwQP781FFku5mQrxU", "blocksMintedPenalty": 0}, - {"address": "QSMMUjebEqV5oN8Da8LJj3nyfgozSDJ73E", "blocksMintedPenalty": 0}, - {"address": "QSMfLwNTpCabGCnjEs5KdYWEiX2K6g8NeB", "blocksMintedPenalty": 0}, - {"address": "QSMkriXyS9nMY5UkWFPCvp5JNW29stMQa1", "blocksMintedPenalty": 0}, - {"address": "QSMqLri9jNxAyXj1VrdBpiWXjN1Decxp2s", "blocksMintedPenalty": 0}, - {"address": "QSMyYwa2jYmnu4ftFdJa9Q2SrPeDiSciez", "blocksMintedPenalty": 0}, - {"address": "QSN9JL6PqDb7CiWJVigxMvxsjEb2G1kghF", "blocksMintedPenalty": 0}, - {"address": "QSNSBzudRjMN5FRkgJiyYRtZg1Whfpyb3s", "blocksMintedPenalty": 0}, - {"address": "QSNkmVX8cCFRaAJTzELmYPaTZJngdnTCJx", "blocksMintedPenalty": 0}, - {"address": "QSP5aB3K24opG9avsxmDX2Vpw7fhLTJLmo", "blocksMintedPenalty": 0}, - {"address": "QSPMbojeDaMDd7foraVhhhLTma6xdHhNSC", "blocksMintedPenalty": 0}, - {"address": "QSPnJrGKkEp9YM87ZJJY7GSu7UcDJayaci", "blocksMintedPenalty": 0}, - {"address": "QSQY4EobKhfowXNsBBLCkoxa7gq7nLyNHK", "blocksMintedPenalty": 0}, - {"address": "QSQba2bjekx9W1gio73zphSNyKu8jPpYyx", "blocksMintedPenalty": 0}, - {"address": "QSQzzLtLmzrPJXBVrBXyoGTL7gyezc6oae", "blocksMintedPenalty": 0}, - {"address": "QSR4ce2r9F6vLqKeHuJ21Wjn8Cq2n4gTb3", "blocksMintedPenalty": 0}, - {"address": "QSRUZTmSFyG7AwAzXsgErWQanZPRHACsD2", "blocksMintedPenalty": 0}, - {"address": "QSRrF6Xb7fHZHAzxVqbMoKCMNc27TMBinw", "blocksMintedPenalty": 0}, - {"address": "QSSL7SowbBVgZ4ujRoTbZgmGUtFRraeF4c", "blocksMintedPenalty": 0}, - {"address": "QSSejk9tyrDjirKJUSU4AwBZQupcfjPwhw", "blocksMintedPenalty": 0}, - {"address": "QST7ec3D8MBT1SZLzBECVeyEYFnAcYEupd", "blocksMintedPenalty": 0}, - {"address": "QSTDBZCEdmuJBZzUBFc4y5mRzbPMeu8m63", "blocksMintedPenalty": 0}, - {"address": "QSTJ3mNfCfNb5RcnNZHkGCxW5UXduqdyUt", "blocksMintedPenalty": 0}, - {"address": "QSTJfen2UT21DBLm87GDDpy1hJDoYdQLna", "blocksMintedPenalty": 0}, - {"address": "QSTLVn7NjorAobCDTrzHyT9JaJXfeyDEo1", "blocksMintedPenalty": 0}, - {"address": "QSToUAARqHr8i1s6TJaRxo9hnMzzcvAwqp", "blocksMintedPenalty": 0}, - {"address": "QSV5bLb5hxhZgknM6Sd2t2uisyFoNoPy2K", "blocksMintedPenalty": 0}, - {"address": "QSVAn7jdHDme7sWS7gCXZwLehPF3UR39N5", "blocksMintedPenalty": 0}, - {"address": "QSVEJbCxf5mN77mRec4CvXY817Uo5pkGjw", "blocksMintedPenalty": 0}, - {"address": "QSVGvNbFRJKLf2ETq4tR5CjNVmuYjU5rpS", "blocksMintedPenalty": 0}, - {"address": "QSVys5uHG8ktRvtrcYaQ6uZJmxv3paxcye", "blocksMintedPenalty": 0}, - {"address": "QSWCPPfFP6Sscgqx5JRGVombP9bXkrGmzW", "blocksMintedPenalty": 0}, - {"address": "QSWECHmUy6V59PhgynBvjmbP7ZDUdxtNag", "blocksMintedPenalty": 0}, - {"address": "QSWJqMqo1xBaETfgZ8aoNEKyqeiEzV4GEu", "blocksMintedPenalty": 0}, - {"address": "QSWcCEfXNibv9G2AVU8eEVh82wUX7Kc8Gb", "blocksMintedPenalty": 0}, - {"address": "QSWoy2X5sWiAVNoyE2fgu65wQo9w9Ps1r4", "blocksMintedPenalty": 0}, - {"address": "QSXNU76q9Pt36XyeZdHDj8NkZ8BVozFRQ4", "blocksMintedPenalty": 0}, - {"address": "QSXSwW3NwSmdRvm6GmQXzYygtkBvJbgZFX", "blocksMintedPenalty": 0}, - {"address": "QSXaGmh2JcpiKTuJ1Mt3LwP1k6cqaJMhWc", "blocksMintedPenalty": 0}, - {"address": "QSXaS1mDCdGsBU2sLNYxFSqhUfHMF6xfvr", "blocksMintedPenalty": 0}, - {"address": "QSXb93Luqh5kDSDXbYzZErroH4ptYgRyK2", "blocksMintedPenalty": 0}, - {"address": "QSXwqJv9eEjMXCUr2UTMzKTNCx8w8W6m8e", "blocksMintedPenalty": 0}, - {"address": "QSZ2Gm4ySJaffFrgU8tqQNSMuwQn35tFSt", "blocksMintedPenalty": 0}, - {"address": "QSZPzp4e49XiQuN5cUDJAyw3amFnt8xwnp", "blocksMintedPenalty": 0}, - {"address": "QSZrYw2fDuJfgQnpb1QQCdkZDPxnQsMtmU", "blocksMintedPenalty": 0}, - {"address": "QSaDKdNqeBdNPyk54LwGjNExWYPKsrir5M", "blocksMintedPenalty": 0}, - {"address": "QSasgMJRhf5EubrcT39CZxM4S1zZpK73hS", "blocksMintedPenalty": 0}, - {"address": "QSbiUSa48CDu2gs3W33H8GnMk9Nf4zoz6A", "blocksMintedPenalty": 0}, - {"address": "QScA7k474KiY65ZzpZTqYePwkYSBpEVLXi", "blocksMintedPenalty": 0}, - {"address": "QScK5Mhry2qN5gj98Zd1Pd43GRDSd4fizs", "blocksMintedPenalty": 0}, - {"address": "QScRBX71dPBofoRz4WFXuRqNXF7vSNPMvf", "blocksMintedPenalty": 0}, - {"address": "QScXD64ij6htjw4QiXWSeLSLvsFdp6ANvC", "blocksMintedPenalty": 0}, - {"address": "QScyiiyXmS9rJqcT4aWc9at5Hdy9v1H1UA", "blocksMintedPenalty": 0}, - {"address": "QSdQhEMXLJgYyNkVcZQQjWVg7ToMqK2pKX", "blocksMintedPenalty": 0}, - {"address": "QSdSYPW2BhoG3g3roYaxeXqre5iFvqg3Wz", "blocksMintedPenalty": 0}, - {"address": "QSdU3mWB1cSHpgA4BNteDFg9rSd5er3W6s", "blocksMintedPenalty": 0}, - {"address": "QSdcHB5Ux311ZctUp2RH4icXABjv6k5j2n", "blocksMintedPenalty": 0}, - {"address": "QSde1H4zYKMTpY3EKz1oFtKn7DDxPWc5hY", "blocksMintedPenalty": 0}, - {"address": "QSdxB43sezmrw6eXPxm6JEJZpK1rc6rzuz", "blocksMintedPenalty": 0}, - {"address": "QSdyWdm3AM2bq7G6UHTEVi1opPLkrVoY75", "blocksMintedPenalty": 0}, - {"address": "QSe3aZpoF89yxvX9HH4nX7wNbABMJmaoBz", "blocksMintedPenalty": 0}, - {"address": "QSe4dcDE1q1La4Wn9RDekwJ94Vxamc6aHq", "blocksMintedPenalty": 0}, - {"address": "QSehZkwUFHGq55dYMcLq4AiQRaeVneWfGw", "blocksMintedPenalty": 0}, - {"address": "QSfNZZNiLa3UVbCB2SFKo8V55mRJ6hY6U1", "blocksMintedPenalty": 0}, - {"address": "QSfTCK3oeHxyHBA7aP1U2UP3PyQg2ZTxJP", "blocksMintedPenalty": 0}, - {"address": "QSffZQLJcgZyYp1THRxxnycLZp7kyZfPoD", "blocksMintedPenalty": 0}, - {"address": "QSfkkzs4vuSZZEV7dAxXi4RJB5Nvd8sDQo", "blocksMintedPenalty": 0}, - {"address": "QSfqKxQypR1NFzHs5L96afQQXsra4W7xgu", "blocksMintedPenalty": 0}, - {"address": "QSfxHmo3qA52MKvC73dm3Be3XQkTbuPu7R", "blocksMintedPenalty": 0}, - {"address": "QSfz6VgoZ9NuJdEJu1j3zj3efbYKmmTGrL", "blocksMintedPenalty": 0}, - {"address": "QSfzTYqSboeKHM8ZKGPhrD7CTbEFVzBKWa", "blocksMintedPenalty": 0}, - {"address": "QSg8oNJD3xHYE9fzVta6GmmCfnPMEQrKLz", "blocksMintedPenalty": 0}, - {"address": "QSgGRGkBfNDnXRFkZ1dMw3odERvahU4mXP", "blocksMintedPenalty": 0}, - {"address": "QSgJVfqNY8pDrmfpShDmcV3t5o5L9XxzQu", "blocksMintedPenalty": 0}, - {"address": "QSgSncp1jgq2hok6FpMzmTnLjpYJbBGLon", "blocksMintedPenalty": 0}, - {"address": "QSgU6ufxDVkeSiWZLMNKGMFecz8PaoT3e8", "blocksMintedPenalty": 0}, - {"address": "QSgd9d9hPZpMNn842JPo2c9tmk2pg9Ke1j", "blocksMintedPenalty": 0}, - {"address": "QSh2LSPcx2ekRQJFv3643tViwjsTMgqJwb", "blocksMintedPenalty": 0}, - {"address": "QShUWZXqvYt8ynqATtanbxnQrDyHgfbbwK", "blocksMintedPenalty": 0}, - {"address": "QShfkcVCp9As6yQRJHy8nJaaWqpBptDKcf", "blocksMintedPenalty": 0}, - {"address": "QSi5yTQ9LJkNGSkNfLM7m7AzTQndbv4Wz1", "blocksMintedPenalty": 0}, - {"address": "QSiXiSNsiVAj31iUMmQgrC1h8aYCMGFeSo", "blocksMintedPenalty": 0}, - {"address": "QSiYkr1DrD3bAHGxqoD6cgquwYdSCKkQtc", "blocksMintedPenalty": 0}, - {"address": "QSie64bcpEPuCxmHrQMNZhs3j7Zi9uQ6xU", "blocksMintedPenalty": 0}, - {"address": "QSijCpxDgCiUXiYnsUUx3oA9dqJqT5yUGC", "blocksMintedPenalty": 0}, - {"address": "QSjHqo5x8LdJPhtJz7uA8N5x3Zemtyf4oC", "blocksMintedPenalty": 0}, - {"address": "QSjMmC89F4TraZjxAMv491CCaW6aKTAWLF", "blocksMintedPenalty": 0}, - {"address": "QSjNrHcDZvd6pDmRxzWCAKkhxTPAAJj86w", "blocksMintedPenalty": 0}, - {"address": "QSjbPVv3Ecjf2Z67uMzmJbKcSyryDMFb6h", "blocksMintedPenalty": 0}, - {"address": "QSjiV1EcWZUGbTsWdNAxmDd9uvHWTr2rdf", "blocksMintedPenalty": 0}, - {"address": "QSkGgVECk3yFhDfRFtfAF8cXW7bESknNCB", "blocksMintedPenalty": 0}, - {"address": "QSknfAheyaEn878fmszkrupPZ4YwtNrsR4", "blocksMintedPenalty": 0}, - {"address": "QSnJV3meEzKeW3RNzys2TTE72g9QceFyqy", "blocksMintedPenalty": 0}, - {"address": "QSnTfLzcrHgiciRCiNMXC9BoASh2Kohsjf", "blocksMintedPenalty": 0}, - {"address": "QSnhuN1EV2i2tMGhB1aJC1mmaxsF8Pzphp", "blocksMintedPenalty": 0}, - {"address": "QSnrDsWFBA4EhtcBQNyh7rmfaqq7X6gj1U", "blocksMintedPenalty": 0}, - {"address": "QSo1FsB3JnmVMwdrU82vmQcRGmvFgjA8n2", "blocksMintedPenalty": 0}, - {"address": "QSoR4nse1meezhCjkdxsAzEzJtdHY8gbmK", "blocksMintedPenalty": 0}, - {"address": "QSoSnTfqzqzwq5f9Z1qPaXqkTsh5VyRcwQ", "blocksMintedPenalty": 0}, - {"address": "QSp6WhkviZnVUXrLVayndTiWaUBknaddCz", "blocksMintedPenalty": 0}, - {"address": "QSp7AdcGSRdELtbBAu9wwpC3ih3TNKCvtr", "blocksMintedPenalty": 0}, - {"address": "QSpCEqKCa8WCVeBi8VwCFcBtn3czfYnvq2", "blocksMintedPenalty": 0}, - {"address": "QSpCTveXXk4AdFSYfcn5i3gwBM5sR3HKVL", "blocksMintedPenalty": 0}, - {"address": "QSpa9yh6yA8oPcRbhHVPpVVvRVFSj6SWKr", "blocksMintedPenalty": 0}, - {"address": "QSpumTF6SJUDYmDgNik99mcYbRTwujUQAe", "blocksMintedPenalty": 0}, - {"address": "QSqCqxLSPf98bUXX1xqh9yGhsKcJ2BRpNX", "blocksMintedPenalty": 0}, - {"address": "QSqGtvNTz9DcuDLZuGQSFju83E7zWEpoGR", "blocksMintedPenalty": 0}, - {"address": "QSrAuNah727hQU4nZFkxd9AdeKkLmUJb5o", "blocksMintedPenalty": 0}, - {"address": "QSs6g28Qmk5kFnznAbq1oNHRX8MM3LdiuP", "blocksMintedPenalty": 0}, - {"address": "QSsDS7wW6JeAbobortvXgfCPWTRv6qkpaU", "blocksMintedPenalty": 0}, - {"address": "QSsJTRd1qmmm3H8SGKsiBNy5zBars6GgXP", "blocksMintedPenalty": 0}, - {"address": "QSscW8dtBxecSnJT3tqsAnEg62Ur5HczCP", "blocksMintedPenalty": 0}, - {"address": "QSskqdeTG7nMaaebFVJWdu5bjHE7UhMFki", "blocksMintedPenalty": 0}, - {"address": "QSsoq1byDGkYYTF3Q89mFMqSV5yUJ1ga7i", "blocksMintedPenalty": 0}, - {"address": "QSsrrixGjQ9mZEhEFhP2LsjRVMhAJ1PTNe", "blocksMintedPenalty": 0}, - {"address": "QStYpM4zJ8BW5E2gmbn5kDKMgqjSDSQva8", "blocksMintedPenalty": 0}, - {"address": "QStuZbygH2EquRcn9D6SqHCg247W2FsjhR", "blocksMintedPenalty": 0}, - {"address": "QSuDJkGjUo83EpHbcU9zpnRkLBEr4WoWe5", "blocksMintedPenalty": 0}, - {"address": "QSuDZkJyCS6Y3v2cim6jV4ySxaCkauX8ih", "blocksMintedPenalty": 0}, - {"address": "QSukoXVdPN8Aa5jqgXruVBHyveHckWs7vE", "blocksMintedPenalty": 0}, - {"address": "QSup2mtdr3zueBLGWfizzRxLbFCZVjgLy8", "blocksMintedPenalty": 0}, - {"address": "QSvVHZisMLZFjo27wd8PtB7pHs63j8VtT4", "blocksMintedPenalty": 0}, - {"address": "QSvwHxGTQrmy9WEaCt2nfPZtgfRtUuQHCK", "blocksMintedPenalty": 0}, - {"address": "QSvyv1VKQkcZ58EnsDEHZav6tw4rvANBFy", "blocksMintedPenalty": 0}, - {"address": "QSwLmVRKS39rMCCSL8utsd8XmbhvC1Scpx", "blocksMintedPenalty": 0}, - {"address": "QSwtKLJksjPZ7yD1A6Q8mDQCmSL6UtuDpi", "blocksMintedPenalty": 0}, - {"address": "QSy3EAhPJnHdQWcZw8svyNmvU4YnPufnNb", "blocksMintedPenalty": 0}, - {"address": "QSyGVd26GtNygwopyCXtX1WfSEMC1tJrHU", "blocksMintedPenalty": 0}, - {"address": "QSyPEM1UhUzD4B3Mz4aHmv7stiQk9NQ2pz", "blocksMintedPenalty": 0}, - {"address": "QSyQw9QJGat8a9p2yKrqtYv6FeSQmwgnpC", "blocksMintedPenalty": 0}, - {"address": "QSycqKcuFJ3Crq2tfTNGZ6RkPNv3au9F8K", "blocksMintedPenalty": 0}, - {"address": "QSyjw3kTbZts2M4udKCy249P5su4WNo5qS", "blocksMintedPenalty": 0}, - {"address": "QSzdnvv2KM7HMbGQ52Nm1fNx7RuVCxiY3N", "blocksMintedPenalty": 0}, - {"address": "QT19zW5jWo2D3kNtSEHSQ1NHkjcaPnJEFJ", "blocksMintedPenalty": 0}, - {"address": "QT2LoGXtVGYKdfdkUaSscK1gFvh3TxFgSL", "blocksMintedPenalty": 0}, - {"address": "QT2RDa24AABKywwUmkWTPpAYorrcdU8rvA", "blocksMintedPenalty": 0}, - {"address": "QT2iEovg7wUoaHuB5EAL6stsFv4LWzxE2U", "blocksMintedPenalty": 0}, - {"address": "QT2kbw4L6NM7hTGK3WNduYEnYgZSMGVfto", "blocksMintedPenalty": 0}, - {"address": "QT33hnKSi6wRX3xuQ7ygo4bvJQ9saAdmLt", "blocksMintedPenalty": 0}, - {"address": "QT3PHbMYJZcX9rtNWJHrRJGz7vHzkiHzQM", "blocksMintedPenalty": 0}, - {"address": "QT3mP9Qe3j7Gb7E1yqDkuZ6uu79FxYJuyk", "blocksMintedPenalty": 0}, - {"address": "QT3u9nVRpnKgECoPpgw4sAmjYCR4bQZnXq", "blocksMintedPenalty": 0}, - {"address": "QT4Q9xGiPjt5z9taHQfSqT1P2MYoUgQC2z", "blocksMintedPenalty": 0}, - {"address": "QT4X6XRYahGpkvb1yYbqDAU2bZhk8xrjkW", "blocksMintedPenalty": 0}, - {"address": "QT4YQYAYsxU3c4BXt3A9xqom9r6vRESaT6", "blocksMintedPenalty": 0}, - {"address": "QT4hqaEKMonHyBc2HMuZucFEGLH7jFPWJo", "blocksMintedPenalty": 0}, - {"address": "QT4t2iYyeww4S82EcNq9nWCV2A2ktvYQp7", "blocksMintedPenalty": 0}, - {"address": "QT4tyt118c47cZ86xWRLzkh47HgfYcrMSL", "blocksMintedPenalty": 0}, - {"address": "QT5XxJmATYUSpXDbENeU7TTZPALLNfrCin", "blocksMintedPenalty": 0}, - {"address": "QT5bTTgNRPnRDksQQJtb1i1WBaiPbt8A2T", "blocksMintedPenalty": 0}, - {"address": "QT5bsrsW3bWocvszUSZv5AxGNJTDBvVqEG", "blocksMintedPenalty": 0}, - {"address": "QT6HRj6rNHMFhN3uqgs56gyncfgDfUCtse", "blocksMintedPenalty": 0}, - {"address": "QT6XBLEugawde1pgX1gZHZSgR1w9nxEh8W", "blocksMintedPenalty": 0}, - {"address": "QT6syjsA7qG4ZHr49W3XVCSG59auw1mcpZ", "blocksMintedPenalty": 0}, - {"address": "QT7cMhLxsLfvzkMMRXXNCnUWX5eXq98Lms", "blocksMintedPenalty": 0}, - {"address": "QT8MqM5XRoQpQvgSbgBbqXXGVXVDzJLVt3", "blocksMintedPenalty": 0}, - {"address": "QT8e48n1Ywwy7bF6wqCD8JzFuyFNMJwpvc", "blocksMintedPenalty": 0}, - {"address": "QT8tdoQqiKJgWSPMqVVr7PCS7YTGGDMxmW", "blocksMintedPenalty": 0}, - {"address": "QT91WjmCW3uUDGXFuZhbpSfnaaq7kphYmf", "blocksMintedPenalty": 0}, - {"address": "QT957jsLca5uHrqjjb4X9rEjPWSjPVKuNn", "blocksMintedPenalty": 0}, - {"address": "QT95MVr5vyFH55gWwkLV9GCXmepwi7NfUR", "blocksMintedPenalty": 0}, - {"address": "QT95joXHS6bRLkWsedmwKN2q4PgQKWJ38x", "blocksMintedPenalty": 0}, - {"address": "QT9LMQ5Du33Y5o8bZsxYQDe8AKRQffrVow", "blocksMintedPenalty": 0}, - {"address": "QT9VFa1vnDLEShzfhwrhPU7Eho76SmYgVz", "blocksMintedPenalty": 0}, - {"address": "QT9awerx9qFha1rpjhdHMPzqcQJj1gnfGR", "blocksMintedPenalty": 0}, - {"address": "QT9dxwTWQHX62uCE6R9NtTotw5Feeo7kKA", "blocksMintedPenalty": 0}, - {"address": "QT9jT9rj4t6XSA4LUSArQovpUrFtaJaXWQ", "blocksMintedPenalty": 0}, - {"address": "QTASwAXA2b2EKkia6U7ZuYrzikQC5rHNfX", "blocksMintedPenalty": 0}, - {"address": "QTAXmdu2yXAaAHtgUBfuZ8idfTjELa6mk3", "blocksMintedPenalty": 0}, - {"address": "QTApzpfHwY3KM9zvGQaqAx1AM753XaTLpJ", "blocksMintedPenalty": 0}, - {"address": "QTB1B5e8QfA1JsUGPuf2vsgdwXQ5FDeUJq", "blocksMintedPenalty": 0}, - {"address": "QTB6rmQW8fSQFizadr42zcE3vBTfjnAVUK", "blocksMintedPenalty": 0}, - {"address": "QTBccPvzMzhZdWchqniHAVdkuGGpqQ7tjc", "blocksMintedPenalty": 0}, - {"address": "QTCFuMfpzjE3sR58bTgUfTXgazWSYkqrTC", "blocksMintedPenalty": 0}, - {"address": "QTCPrDVozq9NN28hu5LEX8jrRhfYkmxqGY", "blocksMintedPenalty": 0}, - {"address": "QTCPy6AWQxsaBxBVzcovj9WgyayvcoBJV9", "blocksMintedPenalty": 0}, - {"address": "QTCXbdmCboyiHnvRhwKvhV51JFdhM22za8", "blocksMintedPenalty": 0}, - {"address": "QTCxpdMEtjAKZQMhNcXfQ2uChS2egJjAe9", "blocksMintedPenalty": 0}, - {"address": "QTDFaXKTHUdw6HfL98j3uddp3gsyaSV84B", "blocksMintedPenalty": 0}, - {"address": "QTDWpttAiwkqKjN1geAB8QUtBkFfMuzoDu", "blocksMintedPenalty": 0}, - {"address": "QTDfuXnQfLVs67m45YL6pmU1yU1vu48biM", "blocksMintedPenalty": 0}, - {"address": "QTE3tzLYtpdsjP5skWaikpSVH5eCnkGqyG", "blocksMintedPenalty": 0}, - {"address": "QTE858yYVifMDiutdLEmKFqFrGsWk2LDa2", "blocksMintedPenalty": 0}, - {"address": "QTEGeg8746zzwvPjKHWLUqFFDTJegAR1qy", "blocksMintedPenalty": 0}, - {"address": "QTEfTJty6fMLiwZJVJ86VEU35ZTFBtcNbk", "blocksMintedPenalty": 0}, - {"address": "QTF1jF9yLXfECsehaE1ps47TYXF5CqnkwN", "blocksMintedPenalty": 0}, - {"address": "QTF96vjWrXQ5pDGq6TNsCVNcLRLtKP9AaZ", "blocksMintedPenalty": 0}, - {"address": "QTFE4NUrGiWTZ62MgdE1wb3CZ21soqrVfh", "blocksMintedPenalty": 0}, - {"address": "QTFRer5iZQWjmdoamjNjHn8Mb93i9AMpx6", "blocksMintedPenalty": 0}, - {"address": "QTFh8uc2KHuW66b98k14w6h6ro1bJ4rnma", "blocksMintedPenalty": 0}, - {"address": "QTFou1YQxfXN3muVisFGo7YDtVrK3RBQ8W", "blocksMintedPenalty": 0}, - {"address": "QTGNSfLrKVND8o9ueENru9Sw8TXJfBgKFn", "blocksMintedPenalty": 0}, - {"address": "QTGrnBGRNKQvNDCDdd7eMfq3BrSLhkC8NM", "blocksMintedPenalty": 0}, - {"address": "QTGs26MhS14BfAjaW35SfTExG2YkfatASF", "blocksMintedPenalty": 0}, - {"address": "QTHS2thEZzw2kS83SSqpT6P9VjkUGbVaJ2", "blocksMintedPenalty": 0}, - {"address": "QTHUnk2dAQi8SUJVimVUmDdXJCQStSKTVV", "blocksMintedPenalty": 0}, - {"address": "QTJaEBomzZaz7REWaJa5S6m7YBbRkxv9jg", "blocksMintedPenalty": 0}, - {"address": "QTJkcXgtw1qpyaM3aqyzjnYVvYuhfjZxVu", "blocksMintedPenalty": 0}, - {"address": "QTJtTooSwJLu7MM8JBLUc263Vpb7ALBMCx", "blocksMintedPenalty": 0}, - {"address": "QTK9ZA7oULGWFLDwCPQryHtsGqaNiZdcPZ", "blocksMintedPenalty": 0}, - {"address": "QTKSWnTPWqcUuuzXnDwfQbQXeRYuiCdrte", "blocksMintedPenalty": 0}, - {"address": "QTKZxJgLMjStAcLkyFL5rq9xgeVeXQkbsz", "blocksMintedPenalty": 0}, - {"address": "QTLEcTrizAM2MhfzR7mouzMttPiS6sPXTM", "blocksMintedPenalty": 0}, - {"address": "QTLMAgQwNEt6opB5wMW4jFF8RK7L21RSDU", "blocksMintedPenalty": 0}, - {"address": "QTLiH7x3tXFUKw1sSAKnYqdDw3SC2wqWRL", "blocksMintedPenalty": 0}, - {"address": "QTLw2bfdY2o8ja6cF4T1V2QaJs8zmmLpqJ", "blocksMintedPenalty": 0}, - {"address": "QTMVYYJQ2Syn2DGaik2aoFWAxGdfM3c5zT", "blocksMintedPenalty": 0}, - {"address": "QTMjUnCHw2gPhDmemi6nrCTd8dCzoGw1Ym", "blocksMintedPenalty": 0}, - {"address": "QTMw23J3ofd23Chvsbc4TVheZUbZXAGTAr", "blocksMintedPenalty": 0}, - {"address": "QTMwjQpBwCgmPHca3RvgUY8AKfFZNtJx4f", "blocksMintedPenalty": 0}, - {"address": "QTNP7HQWErAg1MP8snQkH6XDgmpcnYEhhk", "blocksMintedPenalty": 0}, - {"address": "QTNYvU3cGAP5ZRt4ZWQutVJSu11YEe22Yu", "blocksMintedPenalty": 0}, - {"address": "QTNZYrHbn7wKKMghv7xGPU4BkZjfw2Tom2", "blocksMintedPenalty": 0}, - {"address": "QTPDXxoGn1WqLRYSJHVmYriBpc5W79XH1p", "blocksMintedPenalty": 0}, - {"address": "QTPFAi1T4HJg6Q76aENAt7tofPvC12w1up", "blocksMintedPenalty": 0}, - {"address": "QTPJxqMkJqAoPrQHPDj3Hxm88pKJz6dxRB", "blocksMintedPenalty": 0}, - {"address": "QTPSVKgZkcQ4AhZbstcqB5ReBD2icqRsFv", "blocksMintedPenalty": 0}, - {"address": "QTPh5qZzUmWS23yyHjD49p9uckwiYsHQRW", "blocksMintedPenalty": 0}, - {"address": "QTPpPe4iPWjzYdfvToGdptmaKhCCNNxzsd", "blocksMintedPenalty": 0}, - {"address": "QTPqWcCvsUHLV6NsmiKn6dnFREb7qGzVWc", "blocksMintedPenalty": 0}, - {"address": "QTQ5U4ix5uNy1a8Faq9y6YJ5m3nqbza3T3", "blocksMintedPenalty": 0}, - {"address": "QTQZ67oSE3TxZiLtcSmWoPMD7BNBbuwniA", "blocksMintedPenalty": 0}, - {"address": "QTQrQr2A3jtvSMZEBP156FSRawv9U1udUy", "blocksMintedPenalty": 0}, - {"address": "QTRXvxjXTjXkwbPx9KwGnKqYhd2CTSGYxV", "blocksMintedPenalty": 0}, - {"address": "QTRdnXg1biiiqLRYmo9Jz3b8goweUt6P4B", "blocksMintedPenalty": 0}, - {"address": "QTRwJCkG6t9AAJBNzbrwMJeWvdYS4BNUyf", "blocksMintedPenalty": 0}, - {"address": "QTSRHcakVMxxLYzx3z8SQqDkk3cQruFrs9", "blocksMintedPenalty": 0}, - {"address": "QTSYnWAdoEYjDDRJreDf3ubpXbzaxHtyx5", "blocksMintedPenalty": 0}, - {"address": "QTSmJg5TfFNU5bLbNNpPtbBgEh3paTrZk9", "blocksMintedPenalty": 0}, - {"address": "QTT5y9WnT47JhRt1Z9bergEnhGNAgdR61f", "blocksMintedPenalty": 0}, - {"address": "QTT6D9kWJ7ByZ32SKUNUPXRaX64QtztRoL", "blocksMintedPenalty": 0}, - {"address": "QTTSZiLc6Xxj8o6AGWoYPT4AdthsNB6jfE", "blocksMintedPenalty": 0}, - {"address": "QTTgY8hjCpKKsAcCqteQ1k6xqH7iDx1Pis", "blocksMintedPenalty": 0}, - {"address": "QTTrebMMTH5fsjicsQXH6tUj6AvpZtB3oS", "blocksMintedPenalty": 0}, - {"address": "QTUHWQTTNqVzL2XzjhjsoVuuwkC7CEjYnn", "blocksMintedPenalty": 0}, - {"address": "QTUKp4REacPHSLvkBQ5ehd3pzZPWuAgaM9", "blocksMintedPenalty": 0}, - {"address": "QTUkrcfFsQpesqfbF7FSVuSAn8KpPipNra", "blocksMintedPenalty": 0}, - {"address": "QTVpGQXMzv8hWou3SkB624He5kgpAMUc6z", "blocksMintedPenalty": 0}, - {"address": "QTVrqYjPbbf2L8t73GSEdjgqb6fagBg966", "blocksMintedPenalty": 0}, - {"address": "QTVtXfSV5ybtZgLrw7cHNb5vsvLGWZhmaj", "blocksMintedPenalty": 0}, - {"address": "QTVwQhftJcLDfnb8mapujwWyBwwiwTFu9E", "blocksMintedPenalty": 0}, - {"address": "QTXWdYHvW9x2qUcKuw9GWYQiLzh3hCnMHW", "blocksMintedPenalty": 0}, - {"address": "QTXiBT8idkdGk96RV2EKqJbBPWk21FpTb3", "blocksMintedPenalty": 0}, - {"address": "QTYJenVA5snCJyzREFvKrXG8YUxnr9JDDG", "blocksMintedPenalty": 0}, - {"address": "QTYfuyVTXfEpgeNgp4Kjm84HqujpaBHQef", "blocksMintedPenalty": 0}, - {"address": "QTYkgo1dsG8cEY3Nq5hx4vpT9rb4LLY13E", "blocksMintedPenalty": 0}, - {"address": "QTYzWYXZ1eXzcyCMSFrSwaDFmWMfarcef1", "blocksMintedPenalty": 0}, - {"address": "QTZ5wdPfo11BAvwBPvT9Vg5WYr1SuU2NDc", "blocksMintedPenalty": 0}, - {"address": "QTZfvBvmxkgdrBFVsERUbUyFQ6PtKJHJ2g", "blocksMintedPenalty": 0}, - {"address": "QTZkKYcS2oDfhuffCgxsFoc4XWE8EKNGzo", "blocksMintedPenalty": 0}, - {"address": "QTa1nBRKzAHRABbJPf1tQh8mfxijwgFCMi", "blocksMintedPenalty": 0}, - {"address": "QTa9qR9zc6oKr9szJ1ZHdWQmWMvK464Vx3", "blocksMintedPenalty": 0}, - {"address": "QTaEvQrhj5ybW4uDEFtXgVdTnCqHiQjEcY", "blocksMintedPenalty": 0}, - {"address": "QTaL213z2Po9otZyqFAJTCwD7DgHkNqqCE", "blocksMintedPenalty": 0}, - {"address": "QTacyidYNPLGCSmVcPMhGaRc2r6ub3c1V2", "blocksMintedPenalty": 0}, - {"address": "QTbK5pscR9R5V8V77jWhdQaikvxksdqQpH", "blocksMintedPenalty": 0}, - {"address": "QTc96xveQR4Ez7nYkFkxgcmDEnW4bi6cDE", "blocksMintedPenalty": 0}, - {"address": "QTcMoTpTYKiE1DUHoFia7KAASGYWMeQUS6", "blocksMintedPenalty": 0}, - {"address": "QTcPFSHwDBvZW8FEpdAX7aRkDJTaPVNGJC", "blocksMintedPenalty": 0}, - {"address": "QTcQoLCaTAwLwLGpDvqQcu2LFuL2fFfXNg", "blocksMintedPenalty": 0}, - {"address": "QTcxYA5VNBj28Sqj4uxgE9zgydDHjWqqqJ", "blocksMintedPenalty": 0}, - {"address": "QTd61dfBPRJGrQANM6esP5YjeGQiaZhBtv", "blocksMintedPenalty": 0}, - {"address": "QTd9Cm4G4j4WUUvKJkQSVN49nWFQhknwzq", "blocksMintedPenalty": 0}, - {"address": "QTd9qECgqFRyDCR95cEXHJ6ikRKGp5P47y", "blocksMintedPenalty": 0}, - {"address": "QTdWujAFt2ErKotw4cjiorqLUqCiWCMz9i", "blocksMintedPenalty": 0}, - {"address": "QTdiNqxGaGZ3yACkakRvUh714TsimupQT7", "blocksMintedPenalty": 0}, - {"address": "QTdrGKCFoGYsCb5GxoTEoMmovnqpRTCKy7", "blocksMintedPenalty": 0}, - {"address": "QTe4t3M94e2DL3DaGajDAqfUSuagbUp1ic", "blocksMintedPenalty": 0}, - {"address": "QTe7ry2K3pNWVZqHsHtcN9hWKdeFQpNs3u", "blocksMintedPenalty": 0}, - {"address": "QTe9pxgFcRNpLuPrf3WGSV9KU3fkmL7Fsu", "blocksMintedPenalty": 0}, - {"address": "QTeFsVvGApz9aacSgTnKDhyZfA274kcLXt", "blocksMintedPenalty": 0}, - {"address": "QTfVuHCoTPdush3E2WzTgmLtjzXcvCNWKx", "blocksMintedPenalty": 0}, - {"address": "QTfzDpjxMBuQxaageKBTtGyNVPhyqWRGxB", "blocksMintedPenalty": 0}, - {"address": "QTgCX2UCdKiLgHWPZ9VU8GV4fCoeiW5PMV", "blocksMintedPenalty": 0}, - {"address": "QTgKSRnba6Fcj9dBcr4utqgY15BhsFGbxJ", "blocksMintedPenalty": 0}, - {"address": "QThFLuJ9eLjrW9RpSAftckzxvhC2CL5FmL", "blocksMintedPenalty": 0}, - {"address": "QTha9Dum6edqCCUjRxGw2hzeFKRc5KcWHn", "blocksMintedPenalty": 0}, - {"address": "QThtxCdHVbSMmHd3FpjMfsRBN6ZpsMtcDB", "blocksMintedPenalty": 0}, - {"address": "QThubwPchwDG8JXM15MWnNBHcXJ7TEACb5", "blocksMintedPenalty": 0}, - {"address": "QTiRJVCznr4nxKJ9YH6A5wx6ZzF4ni1ZL9", "blocksMintedPenalty": 0}, - {"address": "QTipzPJGhQkgEoK2kFemhmx1VEEx29ndDs", "blocksMintedPenalty": 0}, - {"address": "QTj9C3B7urfz3ey3k8c58h2wMakP3asHA9", "blocksMintedPenalty": 0}, - {"address": "QTjHggxPrxFPzmPuwcoBNArK1PMKsVgiJB", "blocksMintedPenalty": 0}, - {"address": "QTjTF5jrUVfSAkr3qKJjn9NA7ZWYqvixWV", "blocksMintedPenalty": 0}, - {"address": "QTjiZXGcRjkCGVkCAfj3PTZBSyDVphgvdZ", "blocksMintedPenalty": 0}, - {"address": "QTjkZtiGPUNBzn9oZwtNFARWSDZ8FDgyv5", "blocksMintedPenalty": 0}, - {"address": "QTk4XoYGE55hdKREXbxPnTC5Bw7uKXoTzT", "blocksMintedPenalty": 0}, - {"address": "QTkBg6hrYQ6vHosQqh1End9dU1nTn3PErp", "blocksMintedPenalty": 0}, - {"address": "QTkKUyzQwfVCQzWtki2gC9TNFooX6jx5Yt", "blocksMintedPenalty": 0}, - {"address": "QTkj5jdruMgm8GoMN5BtDJvBFe9USCDwsi", "blocksMintedPenalty": 0}, - {"address": "QTmG8VPHLLsgtJSrGd7eFzEduB4kN9PJGy", "blocksMintedPenalty": 0}, - {"address": "QTmaQ79rcchguBvjxPNDqikTnxLmHp2hS8", "blocksMintedPenalty": 0}, - {"address": "QTnFnEZvzmTDZqYyGgssFVf6wyU2ZjucYm", "blocksMintedPenalty": 0}, - {"address": "QTnjEyCxefdFSTFDbsiyhTLiPkXFJtjnxM", "blocksMintedPenalty": 0}, - {"address": "QTo1vpnQJWbwZ16JQSFGPuTsbxEmmwfJE8", "blocksMintedPenalty": 0}, - {"address": "QToJsvT84xxmkpoNkY1n154wUVnNf4hfA1", "blocksMintedPenalty": 0}, - {"address": "QTobXHLb6gZqCQznFmoufEyb2iCekKy1cw", "blocksMintedPenalty": 0}, - {"address": "QTodBDoALWZkGxDFkePn46cdvRYyojBzHi", "blocksMintedPenalty": 0}, - {"address": "QTofCqQsh9pvV2vaMwc2Nstwj4kWUCXA9D", "blocksMintedPenalty": 0}, - {"address": "QTouB3e5QCRKt1ugemK2zyXXzB2PQGtFvZ", "blocksMintedPenalty": 0}, - {"address": "QTp8hp325XbQRaLsu1yaVfgbGKaETuRXNT", "blocksMintedPenalty": 0}, - {"address": "QTpMk1ZCZKcHAz3Hr2aD4snqVJUJ6Nrdv6", "blocksMintedPenalty": 0}, - {"address": "QTpiDktH7z7HnQdN8bB1R4gsAsmFZWowib", "blocksMintedPenalty": 0}, - {"address": "QTq2cRTu9U5N1sQ8vA9M1YDCaBsuLBLiKT", "blocksMintedPenalty": 0}, - {"address": "QTqYau4JdVK1VDLCfSs1b4jgsqrtK1fbLG", "blocksMintedPenalty": 0}, - {"address": "QTqeKGJnm6HAWR7NJB8HMudwG3AJZPvMvW", "blocksMintedPenalty": 0}, - {"address": "QTqwU9AcKZodc9dep9QKTCXrB7NqxJty45", "blocksMintedPenalty": 0}, - {"address": "QTrKJBs2hSWQDtTNtNF5QMLr1iPVN6vw1E", "blocksMintedPenalty": 0}, - {"address": "QTs5TcGtjctivtAFkg5WkU6gt5iqBr51zb", "blocksMintedPenalty": 0}, - {"address": "QTsWFT1pJkSRbnyit7Tra9AMkfiNYJp5qQ", "blocksMintedPenalty": 0}, - {"address": "QTsYAqW1UTBs8XyNfY9MMb2EwiYWyzPzkJ", "blocksMintedPenalty": 0}, - {"address": "QTsYjpJeFg9WrMSxeEH9r5Dnq9pnGdUBze", "blocksMintedPenalty": 0}, - {"address": "QTsgdYUTw2kxJNRjwhK33pBrzn4Ent6ogk", "blocksMintedPenalty": 0}, - {"address": "QTsuQrEDWXFo1v6hN12tjb5bKngmzrBS6U", "blocksMintedPenalty": 0}, - {"address": "QTt63FxeicmQDTkCciU8Sm8mk1wVaX7CGn", "blocksMintedPenalty": 0}, - {"address": "QTtHDUuEeKmuQK6TKmftkzMZhTEEfR9HeA", "blocksMintedPenalty": 0}, - {"address": "QTtHLydK75bSwDof2PPwPB9BFo7A3DSu76", "blocksMintedPenalty": 0}, - {"address": "QTtcFfoDWg6CVFN1NRx9FF9SvYE1Bbq6U7", "blocksMintedPenalty": 0}, - {"address": "QTtquobrmawUxSXf8tfMoUsQTvGWG8K95M", "blocksMintedPenalty": 0}, - {"address": "QTtzABMtBbp3QYMXfTSAbk6FHYYcz6TXuo", "blocksMintedPenalty": 0}, - {"address": "QTuQPAaXTydBNZw35ZPBrQBkof62NYCsDb", "blocksMintedPenalty": 0}, - {"address": "QTv5uQbHdRjHaVhkfDygSAPgwt1iDt2n8H", "blocksMintedPenalty": 0}, - {"address": "QTvK9E2grVsdSbZoCa1B3eQCkPT4aNZPBD", "blocksMintedPenalty": 0}, - {"address": "QTvf2FpjtB6gXBqgoaLTQjaDmtx9xqkDwn", "blocksMintedPenalty": 0}, - {"address": "QTviERBFdpnQe9sZaTFcokpznNPaZ4xVX6", "blocksMintedPenalty": 0}, - {"address": "QTvwmbxja7jA9Xtz2kyKVZZz9zA1yG8gu4", "blocksMintedPenalty": 0}, - {"address": "QTvxuCJUQ7xF3JE7E6d1dUNFrnut5kdxLB", "blocksMintedPenalty": 0}, - {"address": "QTw26wgoBzdadwAHgQThsWHJuEkBzDr5Eh", "blocksMintedPenalty": 0}, - {"address": "QTwJ8VTUNFv9ZCxc9h5MpQbFASKyCX2k4o", "blocksMintedPenalty": 0}, - {"address": "QTwzC3r62iiDW6QRE61FsN9dXpEAGsKZdb", "blocksMintedPenalty": 0}, - {"address": "QTxLU8vFBXQ7XZCRKBv6gdhmjLgjUACsVn", "blocksMintedPenalty": 0}, - {"address": "QTxV3Gb5n4Hqbk4ZcmJeo2LoeW2HnkBF7G", "blocksMintedPenalty": 0}, - {"address": "QTxX8ySsYV6NvkQsoZahyQLtt48vSehfXB", "blocksMintedPenalty": 0}, - {"address": "QTxY3pZUrHcsCXCdQikc5codctcqjeJLre", "blocksMintedPenalty": 0}, - {"address": "QTyg6z293aqsFLEFZ6dzTYaTgxq6jubgoW", "blocksMintedPenalty": 0}, - {"address": "QTymzB9pWPVLVtzvGd5zBSSaa8PY8rr88Z", "blocksMintedPenalty": 0}, - {"address": "QTzDKdJuwAWqBr2gME5RWHf3t5cZLfKzVa", "blocksMintedPenalty": 0}, - {"address": "QTzU9QhDt3dsa23ZNzKukx7B27u1KKMTrr", "blocksMintedPenalty": 0}, - {"address": "QU1i9jzACMsrnu5KTRY8YuM71xmQMr33GG", "blocksMintedPenalty": 0}, - {"address": "QU1zEVe9S9eDZ3rMQK3zYmdZ3UXE7DhsHw", "blocksMintedPenalty": 0}, - {"address": "QU21yLJ6tj75XcWk3Dto4REVYtWSv5MjkS", "blocksMintedPenalty": 0}, - {"address": "QU2M5m2Jm7Rf7qK1D4f5QRvSgK3A8gk5Q8", "blocksMintedPenalty": 0}, - {"address": "QU2RyAZ527gpdJmLm4oUoPfm9kiU1stFw4", "blocksMintedPenalty": 0}, - {"address": "QU2uzvZnpvGtUXNF66W9K9APxfVgCSqu7x", "blocksMintedPenalty": 0}, - {"address": "QU3hYw5jsGWHXiMg8AUXdmKeDgh3msM9X4", "blocksMintedPenalty": 0}, - {"address": "QU3yyPNZNmJURKvwnCeFvK5LnBrFpMH9UM", "blocksMintedPenalty": 0}, - {"address": "QU414PT2F8TzcDg7rGgW95P2MioSzrCCXw", "blocksMintedPenalty": 0}, - {"address": "QU46ETURh66uELtxyfi3HazrD1FzLQ9fB6", "blocksMintedPenalty": 0}, - {"address": "QU4GhNYmAnLzdiDuwM6xjXW1bKrZE3NipA", "blocksMintedPenalty": 0}, - {"address": "QU4KnwLfNcVLRaJgpPo8m7DharV1Jk63eu", "blocksMintedPenalty": 0}, - {"address": "QU4yLMp86v3JFhvTLvQZKiYLnGg4bG2Fwo", "blocksMintedPenalty": 0}, - {"address": "QU5HzHHR9kQQciB5F1hnqqba65bpekqovh", "blocksMintedPenalty": 0}, - {"address": "QU5hBdojd8js4HZsqv6wKZnPVefat8WboQ", "blocksMintedPenalty": 0}, - {"address": "QU6vN4Bq5m4bJXAKfwTdCJZd1dpo8bfZRP", "blocksMintedPenalty": 0}, - {"address": "QU78dwm3yKc6aMe4o44kyiqAFSrrLMy1n5", "blocksMintedPenalty": 0}, - {"address": "QU8Cy9HohWHVoeHC3EeTPg8UbyK6yjz3ZX", "blocksMintedPenalty": 0}, - {"address": "QU9h1yYK2hBwduBcUB8ya9SywNQaMujPfn", "blocksMintedPenalty": 0}, - {"address": "QU9rERaPV9WTPG8hLZGpx6L1pNXwPhd8yj", "blocksMintedPenalty": 0}, - {"address": "QUAVG5RDDxkfMx9VcfAE4SWmMW2JNvhmvT", "blocksMintedPenalty": 0}, - {"address": "QUAv6ijNx68VXjP5zcRREQyv5yAK5wdXqQ", "blocksMintedPenalty": 0}, - {"address": "QUB5z8scsEECC1sFR4H6dw1h7o991PV31k", "blocksMintedPenalty": 0}, - {"address": "QUBtqjMgQ1xTc5i77eMD6dqEwYDtvPurFn", "blocksMintedPenalty": 0}, - {"address": "QUCQMs5ZoNTYaEG58aznyW4rWGr8boErnD", "blocksMintedPenalty": 0}, - {"address": "QUD2PYQ2ddXuauFNBBZszCDftM3Q7fzq5b", "blocksMintedPenalty": 0}, - {"address": "QUDACfuDBdB4KJKE9dqSEatLBNRLk3F6LK", "blocksMintedPenalty": 0}, - {"address": "QUDWm8aQoGZFnUiRMvgPEPZkYChWU4tc3q", "blocksMintedPenalty": 0}, - {"address": "QUDi4eNijmcX7MjSeK4WKc2FsFD2S8ox9U", "blocksMintedPenalty": 0}, - {"address": "QUE13TomQ9Eh3mKfz3UWjUKepLELQPykja", "blocksMintedPenalty": 0}, - {"address": "QUE2SfsvENqb6nnEfaP2LMKkd8n1v8beCE", "blocksMintedPenalty": 0}, - {"address": "QUEVVpUhrGWNTQFVbjfHk485j4BhXynKVr", "blocksMintedPenalty": 0}, - {"address": "QUEXZDqFaPZfe4z2kvAGA8K2yU8bbnxTfX", "blocksMintedPenalty": 0}, - {"address": "QUErhafsSbRX8QoMgpKYqeQokZjp3AJfPP", "blocksMintedPenalty": 0}, - {"address": "QUFVKTeo4jinArppr1XwnrqDC64iAeYmRQ", "blocksMintedPenalty": 0}, - {"address": "QUFgHCvX94K2aQvT1b5NNsmtGZZwnJq137", "blocksMintedPenalty": 0}, - {"address": "QUH31FaJYEbtWnGN5TUsQJaQnrDttq9kjv", "blocksMintedPenalty": 0}, - {"address": "QUHEuLJHHgtRotKZJPtKXp7QF8y6YbWEPJ", "blocksMintedPenalty": 0}, - {"address": "QUHXHtm1oVifkvVKkjo66BbYnVg8zrE8am", "blocksMintedPenalty": 0}, - {"address": "QUHYuRLSBNTUTT94ayDN4e9WBm47FbsmSC", "blocksMintedPenalty": 0}, - {"address": "QUHgtTTehJL1YbLivEe3JzUahykmkTUy75", "blocksMintedPenalty": 0}, - {"address": "QUJqyBFLvYijQzLUq3T7ujyoUyKskXUE4s", "blocksMintedPenalty": 0}, - {"address": "QUKD5Wt5x7wuutrKbMBeNM4pw9VWKiP8Dw", "blocksMintedPenalty": 0}, - {"address": "QUL7xwAJk7afj6m8Yoy8RRVUoasTQ5i2iP", "blocksMintedPenalty": 0}, - {"address": "QULGQxPNB5rrtJKvjZAGbgHf9yAx6t4EqQ", "blocksMintedPenalty": 0}, - {"address": "QULvFowMrg8LDsPVpZSV2uYrGDvB6b25uv", "blocksMintedPenalty": 0}, - {"address": "QULzRAa3H2vtWkmy46fChGDYQGXNmtxeKo", "blocksMintedPenalty": 0}, - {"address": "QUMD21YV8For8znLnFJN21tZHcDZYth9Jf", "blocksMintedPenalty": 0}, - {"address": "QUMJpZMFu7hrR5FsXXrZm2ChWgVC2Dm7Mm", "blocksMintedPenalty": 0}, - {"address": "QUMLuWHG5BNzGEvN28EGnjvJzVp3Y8va66", "blocksMintedPenalty": 0}, - {"address": "QUMZRWp3drjGgzaqH41KajMuxbUuZzVAyx", "blocksMintedPenalty": 0}, - {"address": "QUMidWskJxXEGvth61eMWmWgsBkuZTisXS", "blocksMintedPenalty": 0}, - {"address": "QUN2pBJ6oL5pGd7dV6jn33wWVBMMcyEPo7", "blocksMintedPenalty": 0}, - {"address": "QUNN8unMsfMf4mRWpYaFwrWwxEsTRu2GA6", "blocksMintedPenalty": 0}, - {"address": "QUNaw77uesLCXYasejwFJvJ9g23pHYKDER", "blocksMintedPenalty": 0}, - {"address": "QUNdcamQ4HdZxrwCzu66SYiR4eF63M32ZB", "blocksMintedPenalty": 0}, - {"address": "QUPA5AxxvzbKnLCZKhEnMD29ewRfiWS4rD", "blocksMintedPenalty": 0}, - {"address": "QUPByFNwyVapzyQhMTjrG95AUwpf1jwQVC", "blocksMintedPenalty": 0}, - {"address": "QUPMGSM5YfJtxPJB6BAUQrkXgTc9uYBoav", "blocksMintedPenalty": 0}, - {"address": "QUPR4GPMDHRMoELgcuFUZQTJXTkU4gWUVQ", "blocksMintedPenalty": 0}, - {"address": "QUPb9GFR4g2e5FJrnYdVxKkt7dfat9LYQZ", "blocksMintedPenalty": 0}, - {"address": "QUPqwfWM9z7QocW3irzsi8raRLcU32aqXv", "blocksMintedPenalty": 0}, - {"address": "QUQ69rSdbyGosg32eHjBmwFpkLnB8rFSjz", "blocksMintedPenalty": 0}, - {"address": "QUQ7A3XuD62vJmEgwhpVzS5yCh8QopZTLP", "blocksMintedPenalty": 0}, - {"address": "QUQRBurMKdV5LLT1AxGV7ZW5dCcpt7Mx5z", "blocksMintedPenalty": 0}, - {"address": "QUQZnRFh6fCYtL5gUvZRbj7xk9G1DL8y6s", "blocksMintedPenalty": 0}, - {"address": "QUQbn3Dv7NQKCBPMw634yhe1hmPqoHBJKz", "blocksMintedPenalty": 0}, - {"address": "QUQjr5P5mkS7hS5cehFT8DEaKAuShTtJsM", "blocksMintedPenalty": 0}, - {"address": "QUQrHnmka3Hu1yffS7UxuJG6vvLXNNPaX2", "blocksMintedPenalty": 0}, - {"address": "QUQrxkZjA8A3dXvinsYj8cKscNimkZctWv", "blocksMintedPenalty": 0}, - {"address": "QUQwKq8x3pMNjfyUeRRTwnxPWqHwMQX3gQ", "blocksMintedPenalty": 0}, - {"address": "QURKQuV621Ac7DcMETKiAjEyYf8BeXsRsT", "blocksMintedPenalty": 0}, - {"address": "QURPbnXfmNdR82LjoF2jS3qB1yqijEzLss", "blocksMintedPenalty": 0}, - {"address": "QURTSiyRCHKCAAxogpjhhdUBXh8xogkn8t", "blocksMintedPenalty": 0}, - {"address": "QURZSiXH717kRK9DSQNjJo1BwsZWknrnS8", "blocksMintedPenalty": 0}, - {"address": "QUSLbxxuP66zz4gTawCU7CrdpZvqGXtZw7", "blocksMintedPenalty": 0}, - {"address": "QUSbxrLF3enzi881PnCpxoTdqLFjztS8bC", "blocksMintedPenalty": 0}, - {"address": "QUSdNXecF5HWfWfKimms9MQRQbfz6cYsHU", "blocksMintedPenalty": 0}, - {"address": "QUSiVR1ij5oWWs64AzXPjnUeDbL1EUJuVC", "blocksMintedPenalty": 0}, - {"address": "QUSir1a68nGF7QoFkFiM2mveTtaRCe1uHB", "blocksMintedPenalty": 0}, - {"address": "QUTEQkAWMGDJGHJ2oRrP9APAX6bdvjSJXC", "blocksMintedPenalty": 0}, - {"address": "QUTjMPoVYwzwBue7kqPWkRSZSEPpyhWDa9", "blocksMintedPenalty": 0}, - {"address": "QUTz1tPqtc1xUPPMiU3vcfKvMRA8kPmjEH", "blocksMintedPenalty": 0}, - {"address": "QUUTr1X1L3iM48xgB7QdRNg4hACCgucsh9", "blocksMintedPenalty": 0}, - {"address": "QUVED115p15SgqMx7DHPjDSQg8yyHhSNS2", "blocksMintedPenalty": 0}, - {"address": "QUVHjEH2PVBqrP97qeFRz1Cc7Raw4Ze2JX", "blocksMintedPenalty": 0}, - {"address": "QUVx36g8o6rxkjxBDjLdB7GTMwm1WU3XxS", "blocksMintedPenalty": 0}, - {"address": "QUWGwmNL4fv19YfcULLDQCiYKmXfeBTBEs", "blocksMintedPenalty": 0}, - {"address": "QUWZNMdxgwNLHqhu1Jink7VZojYogbuUmQ", "blocksMintedPenalty": 0}, - {"address": "QUWuTJLD5g8wErTAvCmhpn3BVcJWwCGyDJ", "blocksMintedPenalty": 0}, - {"address": "QUYjTTF5EeYdvt6i4qZneXjPdVTEuGJX4q", "blocksMintedPenalty": 0}, - {"address": "QUYrAznr3cYTgf285XbHrgA5ZC8FxuAfF3", "blocksMintedPenalty": 0}, - {"address": "QUYyGGXoFM5ZDQG1cHVL2CTrDJ4pvMSUMm", "blocksMintedPenalty": 0}, - {"address": "QUZ5c4DAbwmV5Jbjx5WnUh6UdpTi9YxPBw", "blocksMintedPenalty": 0}, - {"address": "QUZS74uFkXNHdD8HfwzGvhja313uauEi8k", "blocksMintedPenalty": 0}, - {"address": "QUZYu8eKCvrpUBg87o515uEX29Tjxw8vz3", "blocksMintedPenalty": 0}, - {"address": "QUZqvGB6zDhUmsFicVCrwrLUZxqc5xZgag", "blocksMintedPenalty": 0}, - {"address": "QUZrrhjVCYoiMqgGqjfvqnspLBGCVpNMzk", "blocksMintedPenalty": 0}, - {"address": "QUZx6njfVAwMchp424AmnHUpuVrc6iGy2F", "blocksMintedPenalty": 0}, - {"address": "QUZxVGuzpLbRxfuEFqyGjjtRWAAEhZaNWJ", "blocksMintedPenalty": 0}, - {"address": "QUZxWdUCFRpwuHW6YCHb4LHogvNCpmMjQd", "blocksMintedPenalty": 0}, - {"address": "QUZxZABLQeuTskZYdaPcU4geVpgrtqnNmo", "blocksMintedPenalty": 0}, - {"address": "QUaDWpVUzpxLwBh9JQFwPYTVLPMxVEgEjA", "blocksMintedPenalty": 0}, - {"address": "QUaECSBTyqYQPvAmiyiuTScBamsAgwKaEP", "blocksMintedPenalty": 0}, - {"address": "QUabtxMib5RDyjHkzyEkdYSWYVW2KR9DbP", "blocksMintedPenalty": 0}, - {"address": "QUaovPWgjjdGNtQN19Vtvy1N53trok2bpD", "blocksMintedPenalty": 0}, - {"address": "QUavrpzozPtLPY4Mrt72RaocA7grGEve86", "blocksMintedPenalty": 0}, - {"address": "QUbEincC3d6pmczssVBwQQkMWWL8HMTRts", "blocksMintedPenalty": 0}, - {"address": "QUbWzfn2TyFNvAutuhuxuqeaTpAPPQ7VfS", "blocksMintedPenalty": 0}, - {"address": "QUbZCK3ZXBc5jP3Zde9rQ9LLdg4DhLjJYD", "blocksMintedPenalty": 0}, - {"address": "QUcGhKYufT3QAJU9TJhvj1pSoqMmjQmAxW", "blocksMintedPenalty": 0}, - {"address": "QUd8mqvwDnAzsrqQutTvW4EZQ1Tsn8NUUv", "blocksMintedPenalty": 0}, - {"address": "QUdVUhfrJ7qmzo1p8XUbMT3GC5CrjudBnF", "blocksMintedPenalty": 0}, - {"address": "QUdXcCmvfD5B2Y7Sax8tkWKDALEyGfC9eK", "blocksMintedPenalty": 0}, - {"address": "QUdjqijDoyc83K4WcMW1sCn7zLd2t1WTqn", "blocksMintedPenalty": 0}, - {"address": "QUdmsygeD8hsM1J1hFhTQK41GNLwzm73hK", "blocksMintedPenalty": 0}, - {"address": "QUepfjN1iR1Spva3DomAgrhd1TXHzFffQN", "blocksMintedPenalty": 0}, - {"address": "QUephD8gEKCuyeyY59Y9b99pRgucbBorqw", "blocksMintedPenalty": 0}, - {"address": "QUerUtDu5Tf6u3kveTtgX6TLg7gxRN8Frn", "blocksMintedPenalty": 0}, - {"address": "QUf8TVSDJrFaWuqGTBg1MpVyyZ918C18Mm", "blocksMintedPenalty": 0}, - {"address": "QUfabYhHWQykDYtqoGEpkaxqr35oNNG51g", "blocksMintedPenalty": 0}, - {"address": "QUfjMQMMoojgx7YXnTt2CjqTYjJ6YV9vTQ", "blocksMintedPenalty": 0}, - {"address": "QUfydqxwAXXQHbGNBf5WY8EyiHFiWSwZq1", "blocksMintedPenalty": 0}, - {"address": "QUgcrnbGvN9RH8kazkY7QuX5KLz7ujF7UW", "blocksMintedPenalty": 0}, - {"address": "QUgocxxXA22hrmEtv1dvLorrkDcf9ihaAu", "blocksMintedPenalty": 0}, - {"address": "QUgsFfw3Fx1pJszwtoDdJUDywwZrra29kh", "blocksMintedPenalty": 0}, - {"address": "QUhjmgCBu7FRHZckDbTZJN5Bo8YNYhYMgs", "blocksMintedPenalty": 0}, - {"address": "QUhtaiTSEbe1Ke8BF8w7bZJDLA54JpF84t", "blocksMintedPenalty": 0}, - {"address": "QUhxQNwxgHZsgAGgepATc1rPdwRtpttdvt", "blocksMintedPenalty": 0}, - {"address": "QUiLCtkzyczR44ADS2sYnN4gdapX6hCYzW", "blocksMintedPenalty": 0}, - {"address": "QUiMXE7Ur8QB9XXgMPRcJnw3pDYEwiUaxH", "blocksMintedPenalty": 0}, - {"address": "QUiYEvfNBoV7vRdmCBPBsgjXfWuukTwQFz", "blocksMintedPenalty": 0}, - {"address": "QUijx4pCCJXiYH82F753fVVfhpT91uYfvb", "blocksMintedPenalty": 0}, - {"address": "QUiqgyUUaGYdBdMyesbjeFKQL36xZzZTxd", "blocksMintedPenalty": 0}, - {"address": "QUj6iAQY4efeTBf4r3r6yG5vrKTjgYXHPp", "blocksMintedPenalty": 0}, - {"address": "QUjcZYLfVsmJdB57w4rbvPKuSe26hoX8nA", "blocksMintedPenalty": 0}, - {"address": "QUkNLGZ9Yi1UAgQM1xFW4WEdi6cUDTAU61", "blocksMintedPenalty": 0}, - {"address": "QUksGtgy8ptWwDo34nYxVENQQsDnqW9yBZ", "blocksMintedPenalty": 0}, - {"address": "QUkstM1EVkRc54XfqeT4gBGKHLiVXyeNUk", "blocksMintedPenalty": 0}, - {"address": "QUm6gSHkEWucUmTSg4JhteueQyTm9rVjCX", "blocksMintedPenalty": 0}, - {"address": "QUmm21NAYspb3QjWojGckBqmcdahVREMCU", "blocksMintedPenalty": 0}, - {"address": "QUmrHqX3c6i223dR21KdYsWVyfZEFk8khh", "blocksMintedPenalty": 0}, - {"address": "QUn9wwns7rE9oG2mGtkAwh9XDrmAuGB2tH", "blocksMintedPenalty": 0}, - {"address": "QUnHr6pAcrWPMaw4i1mesyUG5oAdzF4NJV", "blocksMintedPenalty": 0}, - {"address": "QUnRfnqJMswi2qdUDbpTX22HX2Q8AXcQxt", "blocksMintedPenalty": 0}, - {"address": "QUo8PWAKCWChAA4bjozDX1HenQDmEJgZCu", "blocksMintedPenalty": 0}, - {"address": "QUo988NuBLLVSQzRXYSc4eXa4Vkxuywcmd", "blocksMintedPenalty": 0}, - {"address": "QUofUYpiWYnNPBVMhFDuksp1vDEaeyQytF", "blocksMintedPenalty": 0}, - {"address": "QUoiJuLg9Rn91mYaWpPFe9vM71hyqqyxf2", "blocksMintedPenalty": 0}, - {"address": "QUotu2eLqwTUgyuEjWb8EyiBDHAS7Wqju5", "blocksMintedPenalty": 0}, - {"address": "QUp6iERxbWjaNMYBn4UwmyoEd89prY4Wwa", "blocksMintedPenalty": 0}, - {"address": "QUpRvfP7TzRkRYcpibuKALhgTQRMAzS3o8", "blocksMintedPenalty": 0}, - {"address": "QUpSNRZAtLcNmUU6Zk5G8C3BAkPzMdLfvz", "blocksMintedPenalty": 0}, - {"address": "QUqW6Jj12bTtacb5UhS5C8nEYYDmnvfQFm", "blocksMintedPenalty": 0}, - {"address": "QUqmVTyhdP3PaUGgoHRapq9Ljo1b7pnEqa", "blocksMintedPenalty": 0}, - {"address": "QUr8MtJtqTyPPpEkiUApMyCXsNYurMqEP9", "blocksMintedPenalty": 0}, - {"address": "QUrzLLsN4qJG9WWBDKuteuqn7YZfL3TUHX", "blocksMintedPenalty": 0}, - {"address": "QUrzrAXFaCa7Me4tMiLXSzjzyNShntfzCj", "blocksMintedPenalty": 0}, - {"address": "QUsGNvPPP3M26Wsy7Y1LSRr4VrSq29zp97", "blocksMintedPenalty": 0}, - {"address": "QUt2fb9Mvv2BV1ZUy3c6LAQA4nEMrKtu2G", "blocksMintedPenalty": 0}, - {"address": "QUt4smE7xcpurmgkRBQ6q3C6ssmeYMqjNE", "blocksMintedPenalty": 0}, - {"address": "QUtcbaE7HT9Kg7beo6BWYLyLnTo5zFguhp", "blocksMintedPenalty": 0}, - {"address": "QUtdwLdSzis4MsvTNAfEZFQvGeLPCspnuW", "blocksMintedPenalty": 0}, - {"address": "QUthLmfB7E4zNBWH9cAJ9WNkgTjckU4VY6", "blocksMintedPenalty": 0}, - {"address": "QUu4mfx8i1fgSGyfmuJBwdya4rgMCYSNLP", "blocksMintedPenalty": 0}, - {"address": "QUuAzbYd5i1nkDhM7DzAJkFgP94WX8NjBe", "blocksMintedPenalty": 0}, - {"address": "QUuKtGytPWXkZtaK8ny1WFbMLvKtosrX2g", "blocksMintedPenalty": 0}, - {"address": "QUuNWrcSCxbQbv9BaP9oMN5tUM5g5aL7ET", "blocksMintedPenalty": 0}, - {"address": "QUuaNQji2ZDexRgJCtJeKqbgY3WuwvgK7u", "blocksMintedPenalty": 0}, - {"address": "QUuhWK9DQFL47PBukqxJonMRjds7QM4WRV", "blocksMintedPenalty": 0}, - {"address": "QUujv55egQL26JNiu3gddpkCYtw5TQUNWx", "blocksMintedPenalty": 0}, - {"address": "QUv5jgtETXcWHbrW3VDcrowEqmX2chTZA7", "blocksMintedPenalty": 0}, - {"address": "QUv9EZiaAPxVMhnzAUp1EK1MvBqcWDGEbb", "blocksMintedPenalty": 0}, - {"address": "QUvJamL17WXWEjUmpi5fqG3C8V4rjKwgdQ", "blocksMintedPenalty": 0}, - {"address": "QUvRmqSd3HRasL9yjiRWN8hGR7NRUEMQcF", "blocksMintedPenalty": 0}, - {"address": "QUvr77kdBJ88dwA4KxjrUR7LPomA5K3P9R", "blocksMintedPenalty": 0}, - {"address": "QUwzXQ93ye16sJsMPJycbSNDFVajURUQno", "blocksMintedPenalty": 0}, - {"address": "QUxA9eBELpwvpA116HzCmySJfzLofCFLYq", "blocksMintedPenalty": 0}, - {"address": "QUxCje11LASyx4wKooz1QJisfGAtucYKwo", "blocksMintedPenalty": 0}, - {"address": "QUxJ4vESJ2Ay3rajmx3EbDfovXtBtYx8VG", "blocksMintedPenalty": 0}, - {"address": "QUxSR1LvARWpucygJGcqXnTEcTsA5kUJ9T", "blocksMintedPenalty": 0}, - {"address": "QUzAUHzJUs9f5U2RjqsScQtvMRxjo2Mggh", "blocksMintedPenalty": 0}, - {"address": "QUzWBPdtZABUJ5goaxvmXTMbzPKgQeW4LY", "blocksMintedPenalty": 0}, - {"address": "QUzj1h4NuVrTV3vP4Xix3ZUWNsP5Lo4WY3", "blocksMintedPenalty": 0}, - {"address": "QV1zDDohdj1r4LBumajPygjDtG8h8yKutw", "blocksMintedPenalty": 0}, - {"address": "QV2AtBpu7NGmeZdbNRyyE1p7sJ87CSKwi6", "blocksMintedPenalty": 0}, - {"address": "QV3LrCEgyJKnn4oLHntLieTUPuwYfeEeAm", "blocksMintedPenalty": 0}, - {"address": "QV3PaYQsM879rrB1wwDXBD4FDzxz71YsNE", "blocksMintedPenalty": 0}, - {"address": "QV3VGFHmm4Jr4jg3VVtxkX2QBsjmggET2e", "blocksMintedPenalty": 0}, - {"address": "QV3dy3RbSQS8HMRKcJD95rwdLHSpqEgtQZ", "blocksMintedPenalty": 0}, - {"address": "QV3guVYkAM7sGyWaqucuEFKmY9vCuwnYiK", "blocksMintedPenalty": 0}, - {"address": "QV3jrG1GSy62HaFkNC4XuJLL9CikustxUu", "blocksMintedPenalty": 0}, - {"address": "QV3sEg4vMp9RPV4GaRNhLNbenyob9A1ho1", "blocksMintedPenalty": 0}, - {"address": "QV4496JU7VU9hwfZBwwprEGUv2d1RedQWz", "blocksMintedPenalty": 0}, - {"address": "QV4ktNTDNCqiNh7uKv1mf1XCXxyokBkJNL", "blocksMintedPenalty": 0}, - {"address": "QV51MWH9tPjsFz3KVotFFMGnpitMPexwaq", "blocksMintedPenalty": 0}, - {"address": "QV51yNX3iGCBGzuBM33GYY6rBddKN3bYC9", "blocksMintedPenalty": 0}, - {"address": "QV5XbinXRGikq5auoK3EjiiwZDHR8kyGKw", "blocksMintedPenalty": 0}, - {"address": "QV5aVtGmY3xFrdyipJNF7K6DaRvnovF6UK", "blocksMintedPenalty": 0}, - {"address": "QV5mi8uJjzv66x8LDoVNxk66eJsTM1gsTW", "blocksMintedPenalty": 0}, - {"address": "QV6S4yVs9yC6EjNeswJciBHGFK9Zq8neA6", "blocksMintedPenalty": 0}, - {"address": "QV6gHVRYtnCTq9MxDEfoogZHzXq2e8LAzT", "blocksMintedPenalty": 0}, - {"address": "QV6n7K9TyMsUcSrrUbWnvF2H4ssi3Ny3D4", "blocksMintedPenalty": 0}, - {"address": "QV78UvgvqLiCGsuBFCDXrCSYB4XhBNa121", "blocksMintedPenalty": 0}, - {"address": "QV79fuCt7fPMEwT7X3NC3EKJ6fb8ta5DCh", "blocksMintedPenalty": 0}, - {"address": "QV7fyZ6tRQjE3WPTU153r4nUjj9Xof382w", "blocksMintedPenalty": 0}, - {"address": "QV7sSBUvyRbwvCkkwrmrBw4D52UKGHbqtT", "blocksMintedPenalty": 0}, - {"address": "QV829LP9FTVFSyUuEUm67qTyTcPq9kcC25", "blocksMintedPenalty": 0}, - {"address": "QV8RY9pMLYjM527EsEUishLpRdCyRBim1A", "blocksMintedPenalty": 0}, - {"address": "QV8W4ieMQofvEWtnMLW7joGJHjh12XeLE7", "blocksMintedPenalty": 0}, - {"address": "QV9SHLWraBEkGK3bDUtggC8Ca7kGbcU4YG", "blocksMintedPenalty": 0}, - {"address": "QV9a8KGn1kn3M365Y1A1C7XGPnjv22ViGH", "blocksMintedPenalty": 0}, - {"address": "QV9nFRjTVHadYpsrrGXg83o2zb4bpBc4gu", "blocksMintedPenalty": 0}, - {"address": "QV9qZ27WBdfjPoXyZ2twBFEtKjqBfSYFWE", "blocksMintedPenalty": 0}, - {"address": "QVAmJevuuE2D9mS5Vz5wdK7jrhViMpw8Ji", "blocksMintedPenalty": 0}, - {"address": "QVB34fLoXnjDb3bCYqmTpNLZoZ8kDpEVNC", "blocksMintedPenalty": 0}, - {"address": "QVBbL2iGqXKZF6EPcLATyz794unStr3j5N", "blocksMintedPenalty": 0}, - {"address": "QVCFungyPKik3Kirww7ChiCbF8sN9E5qZM", "blocksMintedPenalty": 0}, - {"address": "QVCPNQq2JvMjnwnZDzq8VZi47e64prDNDv", "blocksMintedPenalty": 0}, - {"address": "QVCVSVnhTxdANzT3LoK7WEhyhLsLFLnVBi", "blocksMintedPenalty": 0}, - {"address": "QVCyqbDQQC491jmugV1siV7b7uhDGVUimZ", "blocksMintedPenalty": 0}, - {"address": "QVD29tcBPgJp2N1sj8YPFsLgPzmY8ihWeo", "blocksMintedPenalty": 0}, - {"address": "QVDBzPPZLBfpH16p6uamEy7xG9a6tpGGL1", "blocksMintedPenalty": 0}, - {"address": "QVDMpAD1VPVs3acuHLnMwMmyTBt2oESeC4", "blocksMintedPenalty": 0}, - {"address": "QVDXpHGtMnLf2fzHhWTV3CmYnkdgNuLc3k", "blocksMintedPenalty": 0}, - {"address": "QVDmGtDbU4aRyCbiwn6bEK3jKvy3j15bPn", "blocksMintedPenalty": 0}, - {"address": "QVE9RTtiHatXYwn4AZBeNLVitLtd2sNPZn", "blocksMintedPenalty": 0}, - {"address": "QVEVfciek7nqoD6fdyyEg7TSjXRYD7vtNC", "blocksMintedPenalty": 0}, - {"address": "QVEutZYsAWULTbUUmHkvUZwvisiqsd9Mkh", "blocksMintedPenalty": 0}, - {"address": "QVF4UyoNBXHgAryAgkmMmtARqMkFN42Awx", "blocksMintedPenalty": 0}, - {"address": "QVFCh9Th6b9f15s2KbEehBXHKq5Awh3NcV", "blocksMintedPenalty": 0}, - {"address": "QVFDaGSdmM8aapySoQLwHaVce3D1eNM2U3", "blocksMintedPenalty": 0}, - {"address": "QVFTXcdpkhfSUEqsZJ2gMBniDAV1Nxt5gc", "blocksMintedPenalty": 0}, - {"address": "QVFWwCvCvzQTotYcrhWG1PRTxxceVRXbzR", "blocksMintedPenalty": 0}, - {"address": "QVFcQ3KaxEtZF8hKyHVNfKVJAfBShKFP1U", "blocksMintedPenalty": 0}, - {"address": "QVFqDAvdBsQMRL4hFC4bUv5LMVx9CdU2TD", "blocksMintedPenalty": 0}, - {"address": "QVFsRx9NJVPuPS1iXeNJZHteeaNEPaB1d5", "blocksMintedPenalty": 0}, - {"address": "QVGNpr5arL14uauDCCagSJHQJY39Gcxrsm", "blocksMintedPenalty": 0}, - {"address": "QVGn2XCXnZsgkjBbXbcC4yzbFHN6GQ2Aak", "blocksMintedPenalty": 0}, - {"address": "QVGsE9KSxdw1Gvvws7RfEJsYAfQfxPVDq3", "blocksMintedPenalty": 0}, - {"address": "QVHkS5wgkj5hwVknWN2spYXs5yVtrcXhtK", "blocksMintedPenalty": 0}, - {"address": "QVJPhF3ZjZZxWQwzYjJkioCAPAS7cwyizJ", "blocksMintedPenalty": 0}, - {"address": "QVJbSYfkq6icCFevWqcyiXMD1t6uUN6qPd", "blocksMintedPenalty": 0}, - {"address": "QVJkUyvnmFXVPFE2sGxdZ3jjAQuaLdKg5E", "blocksMintedPenalty": 0}, - {"address": "QVJxzSy8Wh8JcTca7RwAs93NdAxPQvXNvy", "blocksMintedPenalty": 0}, - {"address": "QVK1T3jqL8DTTet9Dx26XK8cvhEQN1TqKb", "blocksMintedPenalty": 0}, - {"address": "QVK3wTbieGoy8vf8ooqyCyBUeZaG93t532", "blocksMintedPenalty": 0}, - {"address": "QVKABihASGZaSzDVgVY97wnVxGTW7KXBRc", "blocksMintedPenalty": 0}, - {"address": "QVKMjiwD5GzUHa7RyuHhaEuWeGwN26rMJS", "blocksMintedPenalty": 0}, - {"address": "QVKgmMmZjDJZdbD6aBCaQuZmjnNdNZkDmS", "blocksMintedPenalty": 0}, - {"address": "QVKndxUMaCdBedPXLPSxZs6t9t8bU9fg55", "blocksMintedPenalty": 0}, - {"address": "QVKsAUFKz5Y3dwZTHx18p2XzN4ZAHCNnFJ", "blocksMintedPenalty": 0}, - {"address": "QVKwiCjWoiqwZYbPHDFf3ocn2fabt1Ddab", "blocksMintedPenalty": 0}, - {"address": "QVL6xd56UKNRd9JCoiCAKA3BAqe8Ptuxh9", "blocksMintedPenalty": 0}, - {"address": "QVL9Dj4spx3xdSq5sVYPbKmnStGke6Brm6", "blocksMintedPenalty": 0}, - {"address": "QVLMJA7f4DEw6T8TohgW4LgvNaAmQiziB9", "blocksMintedPenalty": 0}, - {"address": "QVLQUsrDeNYEva4i3vkhwjYpLz97jM45f6", "blocksMintedPenalty": 0}, - {"address": "QVLYoxcqNCASTtMcic6iVbNBLMvtVRMKZe", "blocksMintedPenalty": 0}, - {"address": "QVLfpDkWRBNt5UMAWkUAAfkcPpiGTnovrc", "blocksMintedPenalty": 0}, - {"address": "QVM4oXUhWqcJ3QxLEQcYTsBa9NAXaEz96S", "blocksMintedPenalty": 0}, - {"address": "QVMX6jrpoUTTm8RKZDMppKzKWG5pyagTPW", "blocksMintedPenalty": 0}, - {"address": "QVN24ocCLbR3EedvpBndwLSaieU3Tfqypv", "blocksMintedPenalty": 0}, - {"address": "QVNsaYXSp76dyqDbEdewPd3YzjdP7eu9X5", "blocksMintedPenalty": 0}, - {"address": "QVP6sdHQyB9e9FuFk6kobfMDSZBSf4miZz", "blocksMintedPenalty": 0}, - {"address": "QVPXtXGfjZzLYTzJtenp8kZN4BJjNxrvow", "blocksMintedPenalty": 0}, - {"address": "QVPeymEwitirstavUcgmKnq3rtZc7ARs1r", "blocksMintedPenalty": 0}, - {"address": "QVPgZJCfq4EmLXZ6beEAfM5a7nT4qb7E9q", "blocksMintedPenalty": 0}, - {"address": "QVPm2AxvGMiJnCNuDxaF6sAKjZ744RjNKw", "blocksMintedPenalty": 0}, - {"address": "QVPwGJUQtC1K1GetMAndg5bK57T5UjwQgn", "blocksMintedPenalty": 0}, - {"address": "QVQ5N8X65a1qpfzaevCGh1KtQhKKmyVVrZ", "blocksMintedPenalty": 0}, - {"address": "QVQCuhrd22sCNbdXkASg4hZz841E95xbvh", "blocksMintedPenalty": 0}, - {"address": "QVQNLupodxAXz3e2j1qEENNRsTegTEo6is", "blocksMintedPenalty": 0}, - {"address": "QVQWxKJnxKaCQVmzNHGzLyfPsbmXNNGjsD", "blocksMintedPenalty": 0}, - {"address": "QVQa1s1t2CGmpTrtW551QZ7MUXuGiCYz3w", "blocksMintedPenalty": 0}, - {"address": "QVQd2XTJdvD6qqKNXsxAa7kXTNLJHoaLVb", "blocksMintedPenalty": 0}, - {"address": "QVQoYgBvfe3gM27oAJD5NgLybZRQMzRFRU", "blocksMintedPenalty": 0}, - {"address": "QVRKV4U3cDkvgpwTuw1uowc2ZK2qfQFCiF", "blocksMintedPenalty": 0}, - {"address": "QVRLgqQ4GzXoVjNMH6yciUotypLsa4Dcah", "blocksMintedPenalty": 0}, - {"address": "QVRtjnxhMG5yzL31ZsU5LrvMXqueZaTg5Y", "blocksMintedPenalty": 0}, - {"address": "QVSVErUtn9FwowHWpPT2U9DynT9TcQFvXZ", "blocksMintedPenalty": 0}, - {"address": "QVTEcqdfqGobwJkHVfiHV5oPsBLMp3QwCZ", "blocksMintedPenalty": 0}, - {"address": "QVTQMpx72dzPpjed89jB9ygzNFMdY3BUHw", "blocksMintedPenalty": 0}, - {"address": "QVToUPoLL9KUzMSjX9HYTUYxb36qqxH7y8", "blocksMintedPenalty": 0}, - {"address": "QVUP7qUamUz7QX8M3ydjtJCEsrARpw5GiR", "blocksMintedPenalty": 0}, - {"address": "QVUWNBUDaPLGgsfEbCzAK7KSju3MKHjzbd", "blocksMintedPenalty": 0}, - {"address": "QVUk7p8etmQASmCevoyXNanqKQHs6DDCPB", "blocksMintedPenalty": 0}, - {"address": "QVUxxvUgiqjt1aSr2v2Hqy6rt1dP8HA3DC", "blocksMintedPenalty": 0}, - {"address": "QVVFcm23Myd3j5BqaxwNDURATfpL9rhdnT", "blocksMintedPenalty": 0}, - {"address": "QVVn7qVjevE1egTNUmGAmp5aiUNrtYRrdq", "blocksMintedPenalty": 0}, - {"address": "QVVuDK5KpCYpRnG6tKKwE8stfCu51ecNbz", "blocksMintedPenalty": 0}, - {"address": "QVVzACksaD3FPC6dzuAoQxeYRq3UFi8QiB", "blocksMintedPenalty": 0}, - {"address": "QVW4kwKhTqR4yfZa84eBkyn3QJ7UTXyb1i", "blocksMintedPenalty": 0}, - {"address": "QVWCz9wP911MWRtSAKSdhLdC3vvgj3D353", "blocksMintedPenalty": 0}, - {"address": "QVWMaahBrvyquMsoyummquEyTqqHRveCHn", "blocksMintedPenalty": 0}, - {"address": "QVXGEXoNenfVH45JK2RkgUf4zYuth4aJaM", "blocksMintedPenalty": 0}, - {"address": "QVY9pVuYr9QB1FYoQbi4qCkoemhUZCHAeq", "blocksMintedPenalty": 0}, - {"address": "QVYdxQZ7U3f3wKU7YXMZdjXUWHvjPdNHa7", "blocksMintedPenalty": 0}, - {"address": "QVZEGr9M5A1L2woeb5cRdQaZp7a3txpMdU", "blocksMintedPenalty": 0}, - {"address": "QVaCPdRvQk2FmfZmsvUqAaqqiWw1mm1168", "blocksMintedPenalty": 0}, - {"address": "QVaLQG6FBvomhXihQcXV3xPZ9NRs2eUK4K", "blocksMintedPenalty": 0}, - {"address": "QVaYgjQgACuhX1WbFAtmE74AB7qpNfH7jP", "blocksMintedPenalty": 0}, - {"address": "QVafDY6BS8pGtT1DDJxTo85uM9fzCRExEQ", "blocksMintedPenalty": 0}, - {"address": "QVaifjYtMXB3iCLT3X3szSTMmJDHrUgomw", "blocksMintedPenalty": 0}, - {"address": "QVaqUd6w1VewffeLMdNPnon7q6WJMD5fYG", "blocksMintedPenalty": 0}, - {"address": "QVb4cVYne5hCLs43jRqGp6oMXWrdXzYrhN", "blocksMintedPenalty": 0}, - {"address": "QVbPkMMrksSx4hXNEZeP2S6S5yYjp8yaU7", "blocksMintedPenalty": 0}, - {"address": "QVbfrg8bGtXf8LRcMHLUfdUGhENRuuwS9W", "blocksMintedPenalty": 0}, - {"address": "QVcwFC1jE8Ct64Hajk2W11yBND3ndT79gs", "blocksMintedPenalty": 0}, - {"address": "QVdMb5DFjwMQCQdSx6VP48rLRkLh6FHwUi", "blocksMintedPenalty": 0}, - {"address": "QVdt1WYAjvTsbuWus7zdmSNRn4erWNi3zC", "blocksMintedPenalty": 0}, - {"address": "QVdtTNQhJTcf5aUbyDmqnhBFmteWBGnJxj", "blocksMintedPenalty": 0}, - {"address": "QVegktB3xcR3oBsiU5jHvM38v8kMFWzzWL", "blocksMintedPenalty": 0}, - {"address": "QVenZc5qR26EfReGtLqpqbvkC3EY3Q7Cg6", "blocksMintedPenalty": 0}, - {"address": "QVeqEdhXVLvNr3guGTHdqFRsc4dc94KZzD", "blocksMintedPenalty": 0}, - {"address": "QVfF1UsiocmbMcxj3Tg1MALZLkE8BskgzH", "blocksMintedPenalty": 0}, - {"address": "QVfPCxcYDhtuu1Z5XrPazHwM9jEaKboZw9", "blocksMintedPenalty": 0}, - {"address": "QVfZh3TSRTcQRSAsMPTYRARfEFc26hZZUN", "blocksMintedPenalty": 0}, - {"address": "QVfbMe9mRNhPoGnjrXTPajXLkV3AnaxSDz", "blocksMintedPenalty": 0}, - {"address": "QVgCEEecsYKBDU8QggPg1P5nEqai9xddYp", "blocksMintedPenalty": 0}, - {"address": "QVgXSP3W5tb6L2nhH6WSAyjbUzfzyNNv88", "blocksMintedPenalty": 0}, - {"address": "QVhCf6AJGb4pko1WTrnjC2EyhzqjXfCgi6", "blocksMintedPenalty": 0}, - {"address": "QVhDNqWptwcwVcYLEhthzUCb1etpLqm3k7", "blocksMintedPenalty": 0}, - {"address": "QVhGQjVt6pKPf4GZzBih9YoafTnbhtBqeZ", "blocksMintedPenalty": 0}, - {"address": "QVhqp7pmPV32cBD7mosTsJoKk1THNLpFCz", "blocksMintedPenalty": 0}, - {"address": "QVhy7ReLjmKy1TdRmRNwPUrnkrHDV1cD7z", "blocksMintedPenalty": 0}, - {"address": "QViGLgFm3arizGNponq3miL9B2sd47EK3k", "blocksMintedPenalty": 0}, - {"address": "QViVvwGVnKGSVGw5eALfo7SSXXH4R3viyW", "blocksMintedPenalty": 0}, - {"address": "QVifGsTGKCsAtEAtLfjRU3ToSZYnar7kzh", "blocksMintedPenalty": 0}, - {"address": "QVihS3sta3NdTv8fxyW6CHQxVbBbPaJwUQ", "blocksMintedPenalty": 0}, - {"address": "QVincDNELoePaC7Jqoyn2LEzK8mfdubnts", "blocksMintedPenalty": 0}, - {"address": "QVj6ogok9UGEeTY5edM7bxQf1hyWGMJNqX", "blocksMintedPenalty": 0}, - {"address": "QVjQNESV6V4qeRae9FdaEUEuqLnLt5ui4Q", "blocksMintedPenalty": 0}, - {"address": "QVjQrMHV4txc4cxDvPe6PtbJpMMEKvPG3x", "blocksMintedPenalty": 0}, - {"address": "QVjgcKKfCa521Who4RgJbH4rRd1YJESMJJ", "blocksMintedPenalty": 0}, - {"address": "QVjtvavAkwywV2DGiZf7jCcrc75D8jNm1C", "blocksMintedPenalty": 0}, - {"address": "QVkPtoqxjoZc2XcJpxnQq9oL4ocgZikHEL", "blocksMintedPenalty": 0}, - {"address": "QVkU9BkB2e5QzBNPaL7MF7wbJRzY5QhpNa", "blocksMintedPenalty": 0}, - {"address": "QVkyiRTaEd8kTjLH4KccXiMkZv44vDbyGo", "blocksMintedPenalty": 0}, - {"address": "QVnc4KhVwye2UG7Hfwu4fgxcA5VGyhcZLX", "blocksMintedPenalty": 0}, - {"address": "QVo5gUgaCr74cN3iUGZPQovavDteZgin8j", "blocksMintedPenalty": 0}, - {"address": "QVo5wuxofwD4QHHUcUZyCggXdZmyg6Brxw", "blocksMintedPenalty": 0}, - {"address": "QVoLeMeA9VvxNjb7q1PKcJBE1AhgF6ifSa", "blocksMintedPenalty": 0}, - {"address": "QVoZ6qWcrp59si8zJrbfG4nLnDqZozxcus", "blocksMintedPenalty": 0}, - {"address": "QVotbszSaMJ5u2rDbu7QaXaS3EESxMKKYd", "blocksMintedPenalty": 0}, - {"address": "QVp78qBkz8tcoVirS9ff4P2NkQRDTeJQrV", "blocksMintedPenalty": 0}, - {"address": "QVpWgtJ8t6zEQW5yje4MdDbAJbDpjub1ts", "blocksMintedPenalty": 0}, - {"address": "QVpg4aHE7KmHZgYp4rYRCFKjJUznnzW3VL", "blocksMintedPenalty": 0}, - {"address": "QVpnrjnoh7osuMeRjXj2oXButHaX5unB2u", "blocksMintedPenalty": 0}, - {"address": "QVpxYc443ZP2cgxxvJac3XD5KVHTjvFPm2", "blocksMintedPenalty": 0}, - {"address": "QVq9CmzK5VGACVKxQuAA9npQ6zatdYVeiX", "blocksMintedPenalty": 0}, - {"address": "QVsSciGEY5wCFRNNj5s55tfFmEFuyD8BbX", "blocksMintedPenalty": 0}, - {"address": "QVsiQNzxg4FbeGoY3LDiz7FxD6EpnQ3zJZ", "blocksMintedPenalty": 0}, - {"address": "QVsoYTErYB9Qeb23rGSvx6j1riXMXX32R1", "blocksMintedPenalty": 0}, - {"address": "QVsoqDoUukrcGrX3je9brdqjDjFfSNtaNt", "blocksMintedPenalty": 0}, - {"address": "QVswAxp1qKbkTZcqtAgo9NiWmVLa4B7ZBg", "blocksMintedPenalty": 0}, - {"address": "QVt16nQkKbYMvGmuep3scgxdiCimEbyr32", "blocksMintedPenalty": 0}, - {"address": "QVt8a2goaAFUqkDB6hqnpEH44q4MFyQXVk", "blocksMintedPenalty": 0}, - {"address": "QVtPUJW7FuoYGnt1QCyva9jfdN7BVs97sQ", "blocksMintedPenalty": 0}, - {"address": "QVto6VC7o8v9AY5uCWwYTyAqVr6F2XTV4k", "blocksMintedPenalty": 0}, - {"address": "QVuVgDWk3E9VJKectc17tpRLrEWYEoJqEr", "blocksMintedPenalty": 0}, - {"address": "QVuZK9ofcwQQUwPHAY3gsaDNCXXfZeUYa7", "blocksMintedPenalty": 0}, - {"address": "QVuksgNt3QAr7KCrkxtE5FWrczfgLKxs4H", "blocksMintedPenalty": 0}, - {"address": "QVutytLraMr1NyQUmvob4vQ5GGLjPmLDdY", "blocksMintedPenalty": 0}, - {"address": "QVuuNtp1k6oXFXggc2YXqjfe7aMYFXXLoJ", "blocksMintedPenalty": 0}, - {"address": "QVvHHQATanKT8yTwhVCrncJxHDv9174QGu", "blocksMintedPenalty": 0}, - {"address": "QVvK15gYwhNJ6FxMcCRU4ZX4GfH4AFGh54", "blocksMintedPenalty": 0}, - {"address": "QVvMfK8iHSehgJfHnHg94KkdTDx2gmvNj3", "blocksMintedPenalty": 0}, - {"address": "QVvMfkqJobVwEbwrRZoszKbpT65dWpJXUR", "blocksMintedPenalty": 0}, - {"address": "QVvSeDNMjVFx1y1VCQtVRqMYzwFBoUuoHW", "blocksMintedPenalty": 0}, - {"address": "QVvfpYEDjzJRs9QSZ2YnaVNFiWQMLk8uV4", "blocksMintedPenalty": 0}, - {"address": "QVwGyRfG1Eo9zaRzsZafSJua4MEwu9uSBr", "blocksMintedPenalty": 0}, - {"address": "QVwKKG2SbvVjWWLzcn1wKwnnxZcatUwUf7", "blocksMintedPenalty": 0}, - {"address": "QVwYrSC7uWQ94rARXPrFswDmx6YZ5AtSA7", "blocksMintedPenalty": 0}, - {"address": "QVwjURoX598mRpMxPY7heGgx9yWBqfKJsQ", "blocksMintedPenalty": 0}, - {"address": "QVwvnKcxBML3exdBXEkSqTVRSDK1Q8e6vn", "blocksMintedPenalty": 0}, - {"address": "QVxJCd9tR9YjwtgAPFB65YghjoHKX792PR", "blocksMintedPenalty": 0}, - {"address": "QVxYg9zvosdkvwCQ3fNZzmrt4EGf33RAgp", "blocksMintedPenalty": 0}, - {"address": "QVxshkvACUwJTeErp4ewvKHHRxk6QCpdwN", "blocksMintedPenalty": 0}, - {"address": "QVy6J2b4TFE1a3WkG2qL4UfGpjYUEpjWNk", "blocksMintedPenalty": 0}, - {"address": "QVyPK1iPg8u8GwpKnjbeaV3vAakRzVwxhh", "blocksMintedPenalty": 0}, - {"address": "QVyRFuC1o6qpYc5nZ54uSPDFKjf318izd7", "blocksMintedPenalty": 0}, - {"address": "QVycGZmMYoozmDWiG6V5frX7TgaNjiiiJi", "blocksMintedPenalty": 0}, - {"address": "QVyrwSUuWjsq4fTejmwh9gLiRGUBi2woKq", "blocksMintedPenalty": 0}, - {"address": "QVyyaux3AYs7H7e6cntctSGdjScvzGcf9Z", "blocksMintedPenalty": 0}, - {"address": "QVzBtDbJuLLZWrYxShNRSSuwa46iKgJxGG", "blocksMintedPenalty": 0}, - {"address": "QVzN9kuNZq6ouswvP1h4NmoJo219TSaeSR", "blocksMintedPenalty": 0}, - {"address": "QVzbL4yu7J269QrtRJKqNoSP8jB4E8JFvo", "blocksMintedPenalty": 0}, - {"address": "QVzfoxeN5kDMT6bwVzkrwBw2uUXwoenqG5", "blocksMintedPenalty": 0}, - {"address": "QVzqhXtyJsq66ubAJvFsE8PEYLYTueLziW", "blocksMintedPenalty": 0}, - {"address": "QVzyHr4rm44VogB8cXk1dDp6H3QRBhBjw7", "blocksMintedPenalty": 0}, - {"address": "QW1LLG1cbmdrvMzXLRBcRFmyQAE4jVZhS3", "blocksMintedPenalty": 0}, - {"address": "QW1RPR9rZs3AuvD7kVEuFZeGQWuHFfqBDm", "blocksMintedPenalty": 0}, - {"address": "QW2BgTAQ9WACnz3VqBAJBMyciLb3ZEJH53", "blocksMintedPenalty": 0}, - {"address": "QW2noV2oBrk7Ug9TBGVA6zMLGWMuex4yaF", "blocksMintedPenalty": 0}, - {"address": "QW3CMqD8cKVc4VCVr3jGqdE1FzgVTxJysN", "blocksMintedPenalty": 0}, - {"address": "QW3CqXLfCxQUtztuH8DjQKxBegmR4aBCX5", "blocksMintedPenalty": 0}, - {"address": "QW3FeeQcqUtriPVgpZBjGxgd6gYbgjB1J8", "blocksMintedPenalty": 0}, - {"address": "QW3nh4rMZHXaUnknVvRSsrF5gUuBEqvtP2", "blocksMintedPenalty": 0}, - {"address": "QW3spDt6uUf9D3hpRfXv6vdq2WSjRiYCJT", "blocksMintedPenalty": 0}, - {"address": "QW42652DMkVvAbFUNDYpLAv9Qrxf3ci7EF", "blocksMintedPenalty": 0}, - {"address": "QW4Jsd6njJdiE3Ucz3EGZQayCiYAvYjfJP", "blocksMintedPenalty": 0}, - {"address": "QW4XLRN3qQ1pd3rQ3r3GW28MzrFKMXhFSR", "blocksMintedPenalty": 0}, - {"address": "QW4y4j68keoytVempxkgajUbWX1rjXQARK", "blocksMintedPenalty": 0}, - {"address": "QW5DhhACoAdVcAvnCpqS1qcm6jHAyDiAiT", "blocksMintedPenalty": 0}, - {"address": "QW5NKdmGZKRxFfWAG4LnuAKjx7LBfPvbHM", "blocksMintedPenalty": 0}, - {"address": "QW5TVRMdA6bkGkQEgoEfJTcFbEsmBVXJH6", "blocksMintedPenalty": 0}, - {"address": "QW5VPRQqQ1VevMAQ4Z7qtEDg43e7toRsTf", "blocksMintedPenalty": 0}, - {"address": "QW7L6GLUK23vdj8dWgkYq3yaK7vkb9gF25", "blocksMintedPenalty": 0}, - {"address": "QW7NTEP9BC4vzJ4rSa6V8MXDsS9oUKPUGr", "blocksMintedPenalty": 0}, - {"address": "QW7VuvTQPpGP811bqb9u8BxN7E3zFYZu7x", "blocksMintedPenalty": 0}, - {"address": "QW7f9AvBUTSkfb2hjrBRJn1y6mXf6pD2i9", "blocksMintedPenalty": 0}, - {"address": "QW8UqiAeRHzc3Wt98P4NgSdKrxbjHVpbvW", "blocksMintedPenalty": 0}, - {"address": "QW8cRNTmFdqMXhohxYzPkrRjwwnkmhhoLH", "blocksMintedPenalty": 0}, - {"address": "QW8wBfAKuJkKEY6d8a44y8CDUgomXTt7UU", "blocksMintedPenalty": 0}, - {"address": "QW9QQwevmginzAYaGmCqcUtwyTvwUR4G3y", "blocksMintedPenalty": 0}, - {"address": "QW9VLxd8N2cC4DAGQ3U8c77Q7xbSmKDsdh", "blocksMintedPenalty": 0}, - {"address": "QWANwpY1W7ucxShgLY9yT97tVuQPNkzNvC", "blocksMintedPenalty": 0}, - {"address": "QWARZhzA2Wa6RH78QPU2hPXZt7MuZbZPvU", "blocksMintedPenalty": 0}, - {"address": "QWAZLYeyCvqrfnvNvMWrYFEerPQnzDjLDJ", "blocksMintedPenalty": 0}, - {"address": "QWBH87Movy9bhUiGF2v7ZtDZdanmRHrpp9", "blocksMintedPenalty": 0}, - {"address": "QWCRntcZXepXf5RntgchW3soaDmd6Hkzgq", "blocksMintedPenalty": 0}, - {"address": "QWCakK8GBRjbfcY5ZJzTMGNNg1iF3t8qaC", "blocksMintedPenalty": 0}, - {"address": "QWCbPTLPycPY1KPubUpdmQAVRtGL9n2Vgx", "blocksMintedPenalty": 0}, - {"address": "QWCccAJLsyLbhny8rwc2oV5fwbSnPm2N8H", "blocksMintedPenalty": 0}, - {"address": "QWCrT2bKwnFTBJAWFec21KPewgFYZrFykd", "blocksMintedPenalty": 0}, - {"address": "QWDJ4gbUtMUBum2whWQQPtE4KeLDnNcUx8", "blocksMintedPenalty": 0}, - {"address": "QWDsaGKzgVGsqn62AznrvHfL6nWvRxY8eg", "blocksMintedPenalty": 0}, - {"address": "QWEXZBRmxLBHxtoJRefvd5AM26GEoAWDNm", "blocksMintedPenalty": 0}, - {"address": "QWErXURFoJi3HyGZcXzPrh7XUoisLVCjdx", "blocksMintedPenalty": 0}, - {"address": "QWEvk9Dm2ZsNkQu56VckuWmYasBSBUCmdk", "blocksMintedPenalty": 0}, - {"address": "QWEz2MjWHrwFCqQMt7uQddfQQuJ2bwJYHL", "blocksMintedPenalty": 0}, - {"address": "QWEzkHKdfmhVNUtxYqr7p4udMwdv1F47rc", "blocksMintedPenalty": 0}, - {"address": "QWFEDU6qLvyXGhHu83rH6YRtoWuyhcyF9V", "blocksMintedPenalty": 0}, - {"address": "QWFaycMPqxLN2mEyFRV8eQ4D6Ggh9P8b6Z", "blocksMintedPenalty": 0}, - {"address": "QWFmPj1mVLYXYoYvar6r3Nz8mqACWu8Cic", "blocksMintedPenalty": 0}, - {"address": "QWG192ywgpVnSS62K75CxdfnCV2njb4jJz", "blocksMintedPenalty": 0}, - {"address": "QWG8pcH2iRYs9TBJhrvdktGePgATPSKT55", "blocksMintedPenalty": 0}, - {"address": "QWGEgiJLLcGEZSYkbkTerQxx2fE9t4xaYX", "blocksMintedPenalty": 0}, - {"address": "QWGmiMfKUdbGFy12MceEBanNs8e88T71Ah", "blocksMintedPenalty": 0}, - {"address": "QWGuzHMpHJxe6PPxNQYtGg9dPXh2MJ2KJT", "blocksMintedPenalty": 0}, - {"address": "QWHCroEtHUv724eNm7z1Sc3MDqBpgwVcBa", "blocksMintedPenalty": 0}, - {"address": "QWHn9pFcenKe4R4L5c34X6BxxxQhTQiuTw", "blocksMintedPenalty": 0}, - {"address": "QWHohU9TT1UqrhtzxmVagiso883XKtVaTb", "blocksMintedPenalty": 0}, - {"address": "QWJJCCNZFWEJG33B26bxJVq9eEMKfSDMX7", "blocksMintedPenalty": 0}, - {"address": "QWJMuXfwrBou4Q8NWMQUejuqVrjPxVoXkH", "blocksMintedPenalty": 0}, - {"address": "QWJYTjeA8rPkMFZjRdQMr4rKTSGFyyXmmJ", "blocksMintedPenalty": 0}, - {"address": "QWJftgc95HAMap76F6bQp9vyajzQwNUbFm", "blocksMintedPenalty": 0}, - {"address": "QWJqWW134GoUPiBN8gXkBNA3wPsUk5iZH1", "blocksMintedPenalty": 0}, - {"address": "QWKNZpsDEYoSwdYdspKaLZC3LdRgvxXXGE", "blocksMintedPenalty": 0}, - {"address": "QWKe6PPZXF1sGcQdLZRRLmrg9HuP48ueHP", "blocksMintedPenalty": 0}, - {"address": "QWL2o26DK9yqSepf29UKfgqYLRCj37bwZK", "blocksMintedPenalty": 0}, - {"address": "QWLCnP8WXgYdyW3x78nZssbwC8nk42egP8", "blocksMintedPenalty": 0}, - {"address": "QWLQKdTHEtUvtxkDixGbZjwVgSrSADAzkx", "blocksMintedPenalty": 0}, - {"address": "QWLTkHMHNS8HfXCeXPwWSRd62nnRKFfsSb", "blocksMintedPenalty": 0}, - {"address": "QWLaBNzPzpYeBRwLuEnXX3W2DDu93PDpKv", "blocksMintedPenalty": 0}, - {"address": "QWLfparZiy1d94KBimxLz1PhHVgA7qzX3V", "blocksMintedPenalty": 0}, - {"address": "QWLfzH9C3QBjpEewiFPe41anZNacwdUHmj", "blocksMintedPenalty": 0}, - {"address": "QWLkVr13e17L1Mes2Q7fEGKDqPrjc2VVsa", "blocksMintedPenalty": 0}, - {"address": "QWMPSccMyQJqCDdyRqqu89ZPWJTHUsqSre", "blocksMintedPenalty": 0}, - {"address": "QWMQaLXHG8bfxBcKW36m1dNCHV3enMoshy", "blocksMintedPenalty": 0}, - {"address": "QWMVHqJzsbHZyVEph5JHh5YqiQSB55xkfc", "blocksMintedPenalty": 0}, - {"address": "QWMh8tEPzrFtLVppJF6wG3WjKBRmWWUBtT", "blocksMintedPenalty": 0}, - {"address": "QWN88EjtMpH2gYFj8fBDYCn3uArsBRfkKs", "blocksMintedPenalty": 0}, - {"address": "QWNQWqEaSEybicPzodMbP88aAZEn4jwYMc", "blocksMintedPenalty": 0}, - {"address": "QWNVfWPXvobke3rYphJjs7hkrna43BJwFD", "blocksMintedPenalty": 0}, - {"address": "QWNi8uDKWx9STG5gxaWMrCotJtS87Y9G1Z", "blocksMintedPenalty": 0}, - {"address": "QWNpAy8i1iQyMb3h3WKyuK63JotEXUWXY5", "blocksMintedPenalty": 0}, - {"address": "QWNpCXzwvKM1iSNgemCMxdV77HrDqLKM9w", "blocksMintedPenalty": 0}, - {"address": "QWPDJUV4qyRpap6YsciBveqP2CFjwjFcLd", "blocksMintedPenalty": 0}, - {"address": "QWPJvygUhDwqtgYFLAuWsA6b1J9rHLr39S", "blocksMintedPenalty": 0}, - {"address": "QWPLuLgEX2AcGLxh911DFPNu7ZTdhB3fSC", "blocksMintedPenalty": 0}, - {"address": "QWPReQofMcGrX2attnBHs1k93deGPdL8sV", "blocksMintedPenalty": 0}, - {"address": "QWQAMxUUEPYzQHuZ9JW4A5aYnYJcfhZkL9", "blocksMintedPenalty": 0}, - {"address": "QWQQWGoGBCDRfhAJLsXwsKuhKpeUzgiUVP", "blocksMintedPenalty": 0}, - {"address": "QWQkTRaveNA6ETv88UP3SVzRNhsQW47RGQ", "blocksMintedPenalty": 0}, - {"address": "QWR3L8mdFDdErbZFgAJjTi19N4LLXogar5", "blocksMintedPenalty": 0}, - {"address": "QWRU8WVoy24qG4cs1vRS5sssYZSwS2bibE", "blocksMintedPenalty": 0}, - {"address": "QWRgRZrwqGvo53LsgJii6JG2dN97fPqhvi", "blocksMintedPenalty": 0}, - {"address": "QWSUoMTN5ZLkj7phyiqFnCYmgMP88CLb58", "blocksMintedPenalty": 0}, - {"address": "QWSiUJfy8Mfzfg2Wb7grLHDiB1Bot2SzpX", "blocksMintedPenalty": 0}, - {"address": "QWSkYMXkNj19CNpP35VpRDAJihR8xoNPmQ", "blocksMintedPenalty": 0}, - {"address": "QWSuZ7rdZU8S5fmYnSDJ6AMaMRzogUfj1h", "blocksMintedPenalty": 0}, - {"address": "QWUL8aEzQoAAgrnNGquXuLtENPS8cQXLvG", "blocksMintedPenalty": 0}, - {"address": "QWUaQEsCNRZAoSnawfFcjwgbXNTumebZEE", "blocksMintedPenalty": 0}, - {"address": "QWUkN1XzhcAF2FuW8JhS6mzg1CssF6NqXq", "blocksMintedPenalty": 0}, - {"address": "QWUoBd3mcDeb5p8LKwYhDzjAZUcRSzvDLm", "blocksMintedPenalty": 0}, - {"address": "QWUtvCY3u8HvxMj4SeXRWm3w72kRQnz5RW", "blocksMintedPenalty": 0}, - {"address": "QWUuTfnbZ8X4BV9RogusDCfHnZcLpmJNtF", "blocksMintedPenalty": 0}, - {"address": "QWVCRrgQwCA5pDqVXyMnPW5866pewALxT2", "blocksMintedPenalty": 0}, - {"address": "QWVEa5h6HJx7781o6M4svVgDann6tXeQLK", "blocksMintedPenalty": 0}, - {"address": "QWVTS69usQ5peW12waiZudC36yKMiBBdvx", "blocksMintedPenalty": 0}, - {"address": "QWVvngrGrTRL3SUDRgsaQ45pFgXKU5GEFK", "blocksMintedPenalty": 0}, - {"address": "QWWF78PWEJY7KDtzSdCK3BdLXK3Lo4ytZ2", "blocksMintedPenalty": 0}, - {"address": "QWWWKgZ5C1y5KtzwL9oqz4jUKbpP8Z7Z4Q", "blocksMintedPenalty": 0}, - {"address": "QWXQ3yMUDGGHsLB8uMwPw5phoTpLhEtEMG", "blocksMintedPenalty": 0}, - {"address": "QWXWPk7PmTobgpYov1oGXejh3nBX5dj2sz", "blocksMintedPenalty": 0}, - {"address": "QWXfeQCMJZ7EEe1wcPhagfA6bYE8Ma7E8A", "blocksMintedPenalty": 0}, - {"address": "QWY9KtzJjVnA5G1wy5x9qSzKDeHobauRE7", "blocksMintedPenalty": 0}, - {"address": "QWYUpHqu6Nmz94TRpp6mDvuSWj56Bfwmur", "blocksMintedPenalty": 0}, - {"address": "QWYXtJyHJYwAyk6bAxXtpyEy81aKyCjoA6", "blocksMintedPenalty": 0}, - {"address": "QWYgcbhwdsEe68VMqqvrSfGZ7SwayiQMh6", "blocksMintedPenalty": 0}, - {"address": "QWZ2uhP1nG9QiBwWjauUpyUshAszXsMCXo", "blocksMintedPenalty": 0}, - {"address": "QWZRtPejGnf4vQnxJNdHRmbj6oWZGnDbzw", "blocksMintedPenalty": 0}, - {"address": "QWZVaom75do2Xz9L6ESRYo9gH6Ru4C3su2", "blocksMintedPenalty": 0}, - {"address": "QWZXykZ1ruKHa1NfQ1ykmc31a3agbiHmq4", "blocksMintedPenalty": 0}, - {"address": "QWa4tPZV1im1a4Jp4Wa84TrYTiqjR4z6rZ", "blocksMintedPenalty": 0}, - {"address": "QWaJXdEphGUwDBY7zidCsAGaYZfT59eajJ", "blocksMintedPenalty": 0}, - {"address": "QWahzuPj3w5BbTRMd8WhuTt1LCdw3kyQC6", "blocksMintedPenalty": 0}, - {"address": "QWausFyvuCYxx9aTrAN8riS5mGsXNLr4i4", "blocksMintedPenalty": 0}, - {"address": "QWbNaFXiShE3ge8pE3krGP5Bgpc6ZZN5ii", "blocksMintedPenalty": 0}, - {"address": "QWbSDSKM6cc7GVSAyndVNZJLztwyJaHqDh", "blocksMintedPenalty": 0}, - {"address": "QWbepMe1TQm3VkSU1vUFAMGoMN8c1zcqyb", "blocksMintedPenalty": 0}, - {"address": "QWbpeBxWmovjsQzuRZjwxNS62uiUfLWFLV", "blocksMintedPenalty": 0}, - {"address": "QWbqDM6FXPRbBWsRC8MesRck11aos6Pcvt", "blocksMintedPenalty": 0}, - {"address": "QWcHwfwTd43S4uchSJEiwgYX5JrxCGtr7D", "blocksMintedPenalty": 0}, - {"address": "QWcYi4wro3fS8T1fiRtdLmDct4JoygNNxb", "blocksMintedPenalty": 0}, - {"address": "QWdPeKE6kkAGvseMwvUFuCKKoFqLtnwZc4", "blocksMintedPenalty": 0}, - {"address": "QWdgs6gcMg7c6p9nFanwxHRsoGKtEcg4NX", "blocksMintedPenalty": 0}, - {"address": "QWfvCgZVJBCHniWpPpRdHDq2GUpHs9FisW", "blocksMintedPenalty": 0}, - {"address": "QWg2KqKdcLMEMytCXCgtc1ahH6xre43exN", "blocksMintedPenalty": 0}, - {"address": "QWg5BuxvqRZeasEJMztZubqHL5Bgr9T6Mr", "blocksMintedPenalty": 0}, - {"address": "QWgQStWc5x32LMCdoYywjHxY9BKqzn9rrr", "blocksMintedPenalty": 0}, - {"address": "QWhWDbCUcJ7gAMwa6jVjhn8UwRp3WgVp6s", "blocksMintedPenalty": 0}, - {"address": "QWi7VW46uaPmYjEbv16rVpK8yswx8qt9n8", "blocksMintedPenalty": 0}, - {"address": "QWiASLKKZaqbE8XKvKrxb6Db4ww4cKyQcg", "blocksMintedPenalty": 0}, - {"address": "QWiGoWNpz5jmpfFTziUkvYYAaJ3Y4TiAn7", "blocksMintedPenalty": 0}, - {"address": "QWigG4GAT8eQ6rmNo4AdcGjF5ygSTAV1Q1", "blocksMintedPenalty": 0}, - {"address": "QWj1eXBC9N48t1zLj5AjsrB8zogJYy3Rsq", "blocksMintedPenalty": 0}, - {"address": "QWj46NSSX6i57FKHdNpithdsrTZgYpqToA", "blocksMintedPenalty": 0}, - {"address": "QWjJAgkDzVj4woLSJxKZtX2uLt9hupd35B", "blocksMintedPenalty": 0}, - {"address": "QWjTeggrWW7NAgNFF8YXSjenAJ2H4aXs5Y", "blocksMintedPenalty": 0}, - {"address": "QWjXBhmR7YusHmxkRtThg1owbo5oqTnqXM", "blocksMintedPenalty": 0}, - {"address": "QWjjUQ1iA5KhXEhXfpPbDwS9xiDfu8WxrS", "blocksMintedPenalty": 0}, - {"address": "QWjjxvNoHthrdgMBbimkkhZy4xr5YRfAyM", "blocksMintedPenalty": 0}, - {"address": "QWk8g7RyXDNG55QF7J1SriwV9uq7ukkdap", "blocksMintedPenalty": 0}, - {"address": "QWk93G98KUmaWxRBH6rzv7bsZRZXYaUkwU", "blocksMintedPenalty": 0}, - {"address": "QWkModp4mU4ELoa81JbxMPFQjWFUoVzegr", "blocksMintedPenalty": 0}, - {"address": "QWkTDCuTWbpBMPz3fHPU6GegBXaYXR6xSH", "blocksMintedPenalty": 0}, - {"address": "QWkgb7YssnpsX3SX8F7Zcth5DSttiusnzv", "blocksMintedPenalty": 0}, - {"address": "QWkhiCLpkW8Mz1RzBp9knFNcfejEebJwQE", "blocksMintedPenalty": 0}, - {"address": "QWkofaNbSXHofyjFGjTvLHrUj11RHm1usm", "blocksMintedPenalty": 0}, - {"address": "QWkuXLigr5QdpxpTffYuL9CbKXHicFwZyX", "blocksMintedPenalty": 0}, - {"address": "QWmLRwNgAaLQjyk7eFLeu7YmxkFLnJdHdz", "blocksMintedPenalty": 0}, - {"address": "QWmhGrt1crQi5zbKmC6wm7C9PyfTzWx3Xb", "blocksMintedPenalty": 0}, - {"address": "QWmk4ndvrbo2Zd1WitBUirfdjt8k42hz72", "blocksMintedPenalty": 0}, - {"address": "QWn5aZm71voPXW2e587nLuWrs7DRJah3f1", "blocksMintedPenalty": 0}, - {"address": "QWn9JjVAutrT7K9EdrEfMEvbMRHz37LgCx", "blocksMintedPenalty": 0}, - {"address": "QWnQ4FsUdCi4SUQmksa53VVktVoWC2P8Gy", "blocksMintedPenalty": 0}, - {"address": "QWo4NT5Dr9qQZXsKfNuLfGEwsN6bjRtNuK", "blocksMintedPenalty": 0}, - {"address": "QWoGfGScds4yRV6viJJvwt1gKn52w7CeGv", "blocksMintedPenalty": 0}, - {"address": "QWoVG9foZJfRDcdumdiwzVEEZFcacZdA9j", "blocksMintedPenalty": 0}, - {"address": "QWogMaLjMnz5gvAtb6ZnF2ppS8mGSzahZ3", "blocksMintedPenalty": 0}, - {"address": "QWojvsNbWbHpdJgGdSDKB8ttt6ajNTbiir", "blocksMintedPenalty": 0}, - {"address": "QWonYHiMS4q2V3SZKUhcEvn82CnjWg9eby", "blocksMintedPenalty": 0}, - {"address": "QWos5EhnqwACrj61jX32MRdCmQRsBg8J68", "blocksMintedPenalty": 0}, - {"address": "QWpFc1a1Rf2fuK49G9gLYf4QAcwbvAc2Ws", "blocksMintedPenalty": 0}, - {"address": "QWpSS4vsDAw5AjrB78e1xvcdvR8xM8aj2F", "blocksMintedPenalty": 0}, - {"address": "QWpUpd5QGezW43Db19ehGrHHkru4qCY5du", "blocksMintedPenalty": 0}, - {"address": "QWpe2QS8JgcvMFxJmfbrakScKXswK7XrgH", "blocksMintedPenalty": 0}, - {"address": "QWpvgVRmf3V55B8JJwuDoPm7SV7HCrcuGD", "blocksMintedPenalty": 0}, - {"address": "QWqRyAyYnJkWo2AhCVysjvfWSumBuKcWBu", "blocksMintedPenalty": 0}, - {"address": "QWqcQqVzWNa5WTkpTstZmWkxLhtVkAgWN6", "blocksMintedPenalty": 0}, - {"address": "QWquBGXFQY4Hzy9xHZ8pFXP49qZhTowKgr", "blocksMintedPenalty": 0}, - {"address": "QWrKgFZVuZ7RbSCaxHiiRw6nCEfzVDoVVR", "blocksMintedPenalty": 0}, - {"address": "QWsXavMa53WnvkUx3seV57o6VEMUxoJZEv", "blocksMintedPenalty": 0}, - {"address": "QWsc9hJ9hNbaNKNuyHUqKcaEfndogZYTaS", "blocksMintedPenalty": 0}, - {"address": "QWspaffcKonTghC1hM6vcryBVDJeYd54oE", "blocksMintedPenalty": 0}, - {"address": "QWt1jSLUMrT4T2ReEK2SQtNExK4fLBWEd6", "blocksMintedPenalty": 0}, - {"address": "QWtNSdqbZKy3VkzWLYcG3ES2UF9zNXps7S", "blocksMintedPenalty": 0}, - {"address": "QWuNHJPsLbV7nfPojMgg5ZfKHzL8nxrydY", "blocksMintedPenalty": 0}, - {"address": "QWudqrVNNSsFEg4Ufb9hprvbYkxebWAsUh", "blocksMintedPenalty": 0}, - {"address": "QWujXiKww6pBX2NaJ6XJHYeHWcznVPVuR3", "blocksMintedPenalty": 0}, - {"address": "QWv3JjoitgsH2pcLTmdVewYYpj3jEccjn8", "blocksMintedPenalty": 0}, - {"address": "QWvbFEpzrQkKixJo4Z8ZXwsf4DcM1cnYPv", "blocksMintedPenalty": 0}, - {"address": "QWvc3aGifVny6jkG4f1gAB5RsfhT9wLHKv", "blocksMintedPenalty": 0}, - {"address": "QWvxVikWiaV97VbtsCm6gj7hWGY1WtFFCF", "blocksMintedPenalty": 0}, - {"address": "QWwDEkphnJeSrhNhTJRANznfsSattkuH8y", "blocksMintedPenalty": 0}, - {"address": "QWwZV52Jj6sA2Endob1CJuG2CKcyBuMC9a", "blocksMintedPenalty": 0}, - {"address": "QWwjS73D3ZupUYLZZZrY1GtGfbqkp7pRZk", "blocksMintedPenalty": 0}, - {"address": "QWxBVNQSCRd4dPzm5CGmPPRRVqKto2cFde", "blocksMintedPenalty": 0}, - {"address": "QWxD8sr8JVgN7gkcF7VB9Zkt82VhJQo7Lh", "blocksMintedPenalty": 0}, - {"address": "QWxbvDE629mMN2ACDrxJnawZ6Nt4DyYs8p", "blocksMintedPenalty": 0}, - {"address": "QWxi9QT4M7izrHEKsK649AoyLGwnHh4gFp", "blocksMintedPenalty": 0}, - {"address": "QWxjQmStGA2qaR1ovmzRLQ3YBe1PFrAgDA", "blocksMintedPenalty": 0}, - {"address": "QWyJuyYQgGBzJfQwSBY8f67QvHSwpJeSKh", "blocksMintedPenalty": 0}, - {"address": "QWyn45hQGp2UCjHJuNCKbaVEpWkVUMGepz", "blocksMintedPenalty": 0}, - {"address": "QWz3iiDKzDG2QkVue7rSN5Gw8NBYGq931V", "blocksMintedPenalty": 0}, - {"address": "QWzT9EZTFhB4ZKUgX3JWZYs66GoH7ewcFZ", "blocksMintedPenalty": 0}, - {"address": "QWzb68f2yLtmcMrdXBoufBD3FfBfKYKPHG", "blocksMintedPenalty": 0}, - {"address": "QWzhpqbYX1WrdvGkTJymESDtsrqi6gtV12", "blocksMintedPenalty": 0}, - {"address": "QWzuznnt7QAmkmfytcpjWwqk7QKr176Xfi", "blocksMintedPenalty": 0}, - {"address": "QX1GetpERepEkdEidz4PU7cTP3F8bAcfYc", "blocksMintedPenalty": 0}, - {"address": "QX1d22xE1upzqR8W9cpW1oZRKwYb8ZG978", "blocksMintedPenalty": 0}, - {"address": "QX1eS4YixcS1YYBkN6L7iUY6tsbmnwChAZ", "blocksMintedPenalty": 0}, - {"address": "QX1gSLRyavaXfwWtwoTqi8ErrbV1LTTbrK", "blocksMintedPenalty": 0}, - {"address": "QX1uoEkWyPZC9ug7nswL9gCcDSYEbXSG7C", "blocksMintedPenalty": 0}, - {"address": "QX1vakJZbVZq6ohqpkQEQM3X97mC9k9xSw", "blocksMintedPenalty": 0}, - {"address": "QX24xm2o3BWxtxRQ12r4YWaKVouKwpS6YS", "blocksMintedPenalty": 0}, - {"address": "QX2kQ6Jq3Sm9CxyypCcg5X9Vmw2S15nVw2", "blocksMintedPenalty": 0}, - {"address": "QX2meCtF98vpSCR49VLwgRNnqzFD1UfCZZ", "blocksMintedPenalty": 0}, - {"address": "QX2nTs5xAs2bdXnWLbfTnyU19s7kvNn2mR", "blocksMintedPenalty": 0}, - {"address": "QX3FccLBX6qrM5SQJ5KQHLomsyU5M97SV5", "blocksMintedPenalty": 0}, - {"address": "QX3n3DKcS8uQPJwEGKq3LvTJi6CnTym8Zk", "blocksMintedPenalty": 0}, - {"address": "QX4D8j5dd6RyfRoePY4WdhDF9CWskEuYhq", "blocksMintedPenalty": 0}, - {"address": "QX4K7NoAyJYTcCMfdX5T9EADBZsLM9Vko6", "blocksMintedPenalty": 0}, - {"address": "QX4NEHQcHbJpkLoKbQabQHDxWQMKoc2tLz", "blocksMintedPenalty": 0}, - {"address": "QX4YQxk2gUWoX5yvSKrhxpV22PQQbednpm", "blocksMintedPenalty": 0}, - {"address": "QX4gb8p7AWppd7UBmiYPsoNGd1XNqUTaFn", "blocksMintedPenalty": 0}, - {"address": "QX4j9eTWm3yZccBtLVTvvidyWLEAppmP9T", "blocksMintedPenalty": 0}, - {"address": "QX543FL6CARHNgETkzmfp8rA42jfSbTSvs", "blocksMintedPenalty": 0}, - {"address": "QX5RV9RVca71bBPH51SJDxeJtpfU3a9j6o", "blocksMintedPenalty": 0}, - {"address": "QX5bcZca7uga6SyBeNV1VEu4yowTFjrXhj", "blocksMintedPenalty": 0}, - {"address": "QX639fq365FUruYkVNS67QT6AdVNR1zjQx", "blocksMintedPenalty": 0}, - {"address": "QX65wYgfF11MdncH4e4P8RWPeGFupSqkSj", "blocksMintedPenalty": 0}, - {"address": "QX6PPaiYoRBK2o5oNv9fXeSsMzVJoWVfK2", "blocksMintedPenalty": 0}, - {"address": "QX7J5PQFJ8DWeCWvhDFzu7JHJXr8HzRttg", "blocksMintedPenalty": 0}, - {"address": "QX7KP7BYeXcz1ZerbijV2g5rxeWkwEUgBT", "blocksMintedPenalty": 0}, - {"address": "QX7tfRPhkCLwLmJx9PaXjeyDKR5r2PdgjT", "blocksMintedPenalty": 0}, - {"address": "QX7zJa8KgQidX9iXgDkg1jRDrxvHE9MmEv", "blocksMintedPenalty": 0}, - {"address": "QX8MZtv7C8QLTW38FXh9DboBVk9Vrix2hC", "blocksMintedPenalty": 0}, - {"address": "QX8QcLMyHHyjorTrKhew6Jn8bWM8Lyi49n", "blocksMintedPenalty": 0}, - {"address": "QX8V3h3futYzKVWo1kxmTZsZXbXLjoJ6MP", "blocksMintedPenalty": 0}, - {"address": "QX8djkmxoA42cfKb8VmPvK6dNgmV5Q1E7Q", "blocksMintedPenalty": 0}, - {"address": "QX97bMffeEKAkDsZBXovowC9FuEM3qPmxg", "blocksMintedPenalty": 0}, - {"address": "QX9CtmS3pcb8cJVjHj2X5S7FSxJzNytusC", "blocksMintedPenalty": 0}, - {"address": "QX9einQijP8UcCQm8yGT2KD1yeXEAb38eq", "blocksMintedPenalty": 0}, - {"address": "QXAM4CuLBu7SZmcmMxLe3Pd5yCBUksPFXr", "blocksMintedPenalty": 0}, - {"address": "QXAN8XJF9N72QLuYLXj3bwPktG2Q2AHF4X", "blocksMintedPenalty": 0}, - {"address": "QXAePfutyRxpxVH9Me4WF9BBZUkzKXda5j", "blocksMintedPenalty": 0}, - {"address": "QXAuK8k5QnhoSn4PsuVWpiWajS25tXyZLE", "blocksMintedPenalty": 0}, - {"address": "QXAyCorobBRvL5unMx6qhHSP1sc1YbGgXc", "blocksMintedPenalty": 0}, - {"address": "QXAz5e4R7aUYvYnmXF9GM9k9koto1g9hYH", "blocksMintedPenalty": 0}, - {"address": "QXBHyKMRGUqm3qs92phv5hmXpFdhFiJYQ4", "blocksMintedPenalty": 0}, - {"address": "QXBrVQDTL5p8BzcDbjNNSNjfvYeLS2N8Pt", "blocksMintedPenalty": 0}, - {"address": "QXBvjKWRhKvPsQ487Q186zZUVxSitWdhQR", "blocksMintedPenalty": 0}, - {"address": "QXByTxtudcPe88RaUs9Py7Lm7VZmB6Ccqg", "blocksMintedPenalty": 0}, - {"address": "QXCLTo2xhMh35x2EAeL21iEt34C1TBbf9S", "blocksMintedPenalty": 0}, - {"address": "QXCPcbLpMsaZXvPKZXiDL67iBz8bfnwXCb", "blocksMintedPenalty": 0}, - {"address": "QXD1adVFCPYWKbx14NEaXcBvLA2YsKfCZa", "blocksMintedPenalty": 0}, - {"address": "QXD4MrYeSwfFREYFTzs2WDzRj9AAviqdZ2", "blocksMintedPenalty": 0}, - {"address": "QXDvhV8YtCrTjEpZ7hYokswFuE6yb6NQoJ", "blocksMintedPenalty": 0}, - {"address": "QXE3eofRPPXHB8meKo6Lm3eWkJrq5b3aLF", "blocksMintedPenalty": 0}, - {"address": "QXEYE8DxhFudjPsMq5vqWrdEEKJdodqTTE", "blocksMintedPenalty": 0}, - {"address": "QXEmJgi6d8yyTzQTvnsggEZFuBQyCreG1c", "blocksMintedPenalty": 0}, - {"address": "QXFDGiQD2VsE15SfDzUfz7kHmS5dFPMLKa", "blocksMintedPenalty": 0}, - {"address": "QXG3dnX3xNLZMgAuTE1CQPVF9afu29AQAH", "blocksMintedPenalty": 0}, - {"address": "QXG73QVH5S9wiytUnP1RHfPgwLpv5sCNsr", "blocksMintedPenalty": 0}, - {"address": "QXGBhpFxPXLDPGgWsRpWmddRAn34hu7f8b", "blocksMintedPenalty": 0}, - {"address": "QXGiktg2pgA9BZTiQuNF3ueGRyWdUQfJef", "blocksMintedPenalty": 0}, - {"address": "QXGqhH2HVeB3u1DsZTk2cadAX1zQGAviwK", "blocksMintedPenalty": 0}, - {"address": "QXGxRTG26YenYGtxsAsWyRdwQRKaA9zDVa", "blocksMintedPenalty": 0}, - {"address": "QXGxzsE9MiygyiCoJtpe6nprrgMLxuLAHQ", "blocksMintedPenalty": 0}, - {"address": "QXH34cCu9w3kKs7Brq6F4i6jXmpDVxje1L", "blocksMintedPenalty": 0}, - {"address": "QXJ4p9bgJRH3S2MbZBvUhoULq9RXeLe4WM", "blocksMintedPenalty": 0}, - {"address": "QXJm5mBpKdSnjb5C8g54brbicropeQyoBE", "blocksMintedPenalty": 0}, - {"address": "QXJs2kN4BBzysTtBcvzsJ8NDcbmNMo8n6x", "blocksMintedPenalty": 0}, - {"address": "QXKNdQgZFPMvRLmLxZEixJDuZUneqvSe5P", "blocksMintedPenalty": 0}, - {"address": "QXKYgWmjDPfci7vmUqSEEasKLfVpGgg6V8", "blocksMintedPenalty": 0}, - {"address": "QXKpw2Lmx3cdkqnTBQBfDz4JBHzfMzmwju", "blocksMintedPenalty": 0}, - {"address": "QXL8XVjD9PD33V6REGzM9MVnvoH7oLAjKS", "blocksMintedPenalty": 0}, - {"address": "QXLBj9JMCiAZcNd83HJFw41BGcccDFhuAd", "blocksMintedPenalty": 0}, - {"address": "QXLH2syBuHkHDn7CGYGBuoM6uXrV49zY7v", "blocksMintedPenalty": 0}, - {"address": "QXLfrSjFJFjue5JZrKfUwqznQq9peErzkZ", "blocksMintedPenalty": 0}, - {"address": "QXLjNnBYtY4Dp7xMwa4Jggs6rjukHSht66", "blocksMintedPenalty": 0}, - {"address": "QXLjk2PsmNFDJb3pHag84fEG6p2VJokLdC", "blocksMintedPenalty": 0}, - {"address": "QXLwUwD6yNzD2ZnYG7BKZyhUCHeYhJxTgy", "blocksMintedPenalty": 0}, - {"address": "QXMeaTEy1pGqwH9ENMJVR9ch3wCUsNuwyK", "blocksMintedPenalty": 0}, - {"address": "QXMhDmx4uZLf34cBB1mkVM4rSunbHY4UrZ", "blocksMintedPenalty": 0}, - {"address": "QXMmuxh9Cto16sjdYP68m67dX2LZ8KGESs", "blocksMintedPenalty": 0}, - {"address": "QXN2muiYty19YF7QamAgstjVUyZUh9j5v3", "blocksMintedPenalty": 0}, - {"address": "QXNaEKX4LE8Tn87kNo8172oCucjFhKDLcJ", "blocksMintedPenalty": 0}, - {"address": "QXNaZd2uxNNKQUZx87SpWhFNrd1vohwXXc", "blocksMintedPenalty": 0}, - {"address": "QXP4Y9CK3ZthWyJXpkaDXyouHm6GFZNaew", "blocksMintedPenalty": 0}, - {"address": "QXPEEk36oc1kxUqZivxj1iZ2uB7iHxhwij", "blocksMintedPenalty": 0}, - {"address": "QXPUkwqqbHhpR8Yvqm5uZUbwKhq6QzKf5e", "blocksMintedPenalty": 0}, - {"address": "QXPik5TumxY7nHxrXNFbBUpQ8TKCRX9isy", "blocksMintedPenalty": 0}, - {"address": "QXPmiUFQ9LVXZWhGmMVEHE7rQVZvuGrXCC", "blocksMintedPenalty": 0}, - {"address": "QXQbyArTKuRCLmmuAuC7LpyXH4PLapjKib", "blocksMintedPenalty": 0}, - {"address": "QXQu8C3UZMJnSrQEuED2bUNZ2XY4sRJWZW", "blocksMintedPenalty": 0}, - {"address": "QXQuhfJJNoXaB46WxE4p4MbvhhURiEyudL", "blocksMintedPenalty": 0}, - {"address": "QXRYKNXnaQvmWUnkkQQ4FAbcMW1xq9SyXX", "blocksMintedPenalty": 0}, - {"address": "QXRZaTs2zZMc1GpaDiS22UjJhjBZdxvZWk", "blocksMintedPenalty": 0}, - {"address": "QXRcVtoKwvmdu6SzvtaX3M6PHSdDkiMcRs", "blocksMintedPenalty": 0}, - {"address": "QXRg1z24k33g4MpNitBopUFCgLboGxyefc", "blocksMintedPenalty": 0}, - {"address": "QXRq2JWpb2TmkGG3yXnwDpZTBuVRGbopuS", "blocksMintedPenalty": 0}, - {"address": "QXRsUU4yeD2CCozgnusUkipHhabhZovzEu", "blocksMintedPenalty": 0}, - {"address": "QXS1S62B81Qy7Q9bCajjoJGyid6pnrnkKn", "blocksMintedPenalty": 0}, - {"address": "QXSDHJfocXUSdXLE9f73YhAUJmYawVMRLi", "blocksMintedPenalty": 0}, - {"address": "QXSFGVvscA4jTHgT7UPojFvF7dNkazdRsL", "blocksMintedPenalty": 0}, - {"address": "QXTNG3PCVRyFtyDruZUZXmVR3nmTf4amYh", "blocksMintedPenalty": 0}, - {"address": "QXTaSoZCpkv2my38sedzEUaPHXaNnpRosP", "blocksMintedPenalty": 0}, - {"address": "QXTuoHTMqEgJJAyKejmMHfrFLWDycg4oe5", "blocksMintedPenalty": 0}, - {"address": "QXTyBHjuaQ952QLMrENrFotpsUefDJoLG5", "blocksMintedPenalty": 0}, - {"address": "QXU6bfthAK31eT6swoMNUHKBU74NjA78d2", "blocksMintedPenalty": 0}, - {"address": "QXUXyy1XGAJqL2Sia3auN53yAutEHRjUYs", "blocksMintedPenalty": 0}, - {"address": "QXUr2t3mcjyrPceKoqLJb9YBdw3RunmRaW", "blocksMintedPenalty": 0}, - {"address": "QXUs22Rnr1tXgPYDK2bEVtdXZEZf2V8eAx", "blocksMintedPenalty": 0}, - {"address": "QXVEDSy51aFWP15yC6HVzCV6XsSeBKUf3T", "blocksMintedPenalty": 0}, - {"address": "QXVjCJzX8pcST47oyyJqHTjnhcCj1JPSp5", "blocksMintedPenalty": 0}, - {"address": "QXW71HcJjoffdyC4RbjPZRxDsAWLiTryXo", "blocksMintedPenalty": 0}, - {"address": "QXW7GWsSGfZcMURovaaApvWz2GrCGnykZN", "blocksMintedPenalty": 0}, - {"address": "QXWDrWQvd8Bi4s8KUmxBNR6JNb2SUB3v1b", "blocksMintedPenalty": 0}, - {"address": "QXXTRS3W4CuuxWCcr5jPH8hFETQwpTNSHX", "blocksMintedPenalty": 0}, - {"address": "QXY6yKWP9DHXcmFzkWa4EYENrg3EeUdyT5", "blocksMintedPenalty": 0}, - {"address": "QXYEJF43nXuhniRb8bLkyQz9vWY6EotG7B", "blocksMintedPenalty": 0}, - {"address": "QXYhZeYpnVtA7A8G9Y65uXvAZg41Dkyrm8", "blocksMintedPenalty": 0}, - {"address": "QXZ2GbCLN42KCbaFyiNvXuXWRanrES8q7e", "blocksMintedPenalty": 0}, - {"address": "QXZ6riBEpfKv9Qpk7D62e5kPHkLwLwjU8s", "blocksMintedPenalty": 0}, - {"address": "QXZCjMArbq1TjMwq8kQnq3kNGzVDWhH669", "blocksMintedPenalty": 0}, - {"address": "QXZLSP761EC5wyz7iz5yJgvhWEKAU6BB7E", "blocksMintedPenalty": 0}, - {"address": "QXZkFnxocwGZA1DPVn82typ9Rzdoj3G1YQ", "blocksMintedPenalty": 0}, - {"address": "QXa8fs1AevFH2sGeXNd61TDAvh3m74obmf", "blocksMintedPenalty": 0}, - {"address": "QXaDuL5X7Rb5Wa5ctFnqe59vi69rxLYNs1", "blocksMintedPenalty": 0}, - {"address": "QXaH4J3TGcQ4imSJ2PH3pt1cZ2RWtEALw3", "blocksMintedPenalty": 0}, - {"address": "QXb4jrire59HwjgHquocwL31foyaxKAty1", "blocksMintedPenalty": 0}, - {"address": "QXbG5L2BZ6A2HW5jMyPTUUTHrZeQ41efwk", "blocksMintedPenalty": 0}, - {"address": "QXcZmcen7VwL8AStUc3hUKV7zkJ2qqRzr3", "blocksMintedPenalty": 0}, - {"address": "QXcsdFeNiBBxAD5MAbZXBYTABjHoCNqYJJ", "blocksMintedPenalty": 0}, - {"address": "QXdBkuWkEKpENSMYMnExZ9EcgiBNi5SckR", "blocksMintedPenalty": 0}, - {"address": "QXdDzH9PGJVTFu7zSAxzNmbv1W7kHM12Uc", "blocksMintedPenalty": 0}, - {"address": "QXdExCBjSkeYdagD9YKuA8GhuyVCsaYD8N", "blocksMintedPenalty": 0}, - {"address": "QXdcE7me1ABHaeUFKiZHJEvnEWo36Ceqsv", "blocksMintedPenalty": 0}, - {"address": "QXdqgNLqrZVdiPhaFT8YJSts1oRWkjCikg", "blocksMintedPenalty": 0}, - {"address": "QXeS6rVQpiWcLkf3FsGzBa2kBwSts79uXW", "blocksMintedPenalty": 0}, - {"address": "QXeUhYd1gHwSjN2nthh1FHED9qGMd2dvC6", "blocksMintedPenalty": 0}, - {"address": "QXegFcB1KfzW23xqHCPmvSHNjz8QAcknWk", "blocksMintedPenalty": 0}, - {"address": "QXfKxdnCLkeE5ZNPFzg346ahNAQ7RGTFut", "blocksMintedPenalty": 0}, - {"address": "QXfMJvmSjMHj1PzXdbumrVJp8UjAR7RHoh", "blocksMintedPenalty": 0}, - {"address": "QXfhVdraK6Br6XTznFVe5AkCQyzqaAiaDs", "blocksMintedPenalty": 0}, - {"address": "QXfspgi2puFzjHn855g6ocCMPnKFu9mYoG", "blocksMintedPenalty": 0}, - {"address": "QXg8eQ6se7AXekwnWYVP98oto3Puy7foV8", "blocksMintedPenalty": 0}, - {"address": "QXgD4bWCad2bshq7hsMGz9j22AgaUAL2Lh", "blocksMintedPenalty": 0}, - {"address": "QXgx1VgEkgnktyknSMkLkqNkT6q7yGgYGa", "blocksMintedPenalty": 0}, - {"address": "QXgzL68JknencTV3yEnZDCcHPkuG8SfkuF", "blocksMintedPenalty": 0}, - {"address": "QXhcwKRiqbHzLxj3d3ecZeWkfB31tNNL2n", "blocksMintedPenalty": 0}, - {"address": "QXhtkRfePDEg15akDm7agt46eXUv3SHCRW", "blocksMintedPenalty": 0}, - {"address": "QXiJk73iE3A6XdgsGd2kMioAb7dY4oUHtK", "blocksMintedPenalty": 0}, - {"address": "QXj9eZPtmTQ6RSYgzvCo2UMR1dqAwSRiAx", "blocksMintedPenalty": 0}, - {"address": "QXjPykF6tybnGwEdL3m1KxSy8ZSC7SDHzu", "blocksMintedPenalty": 0}, - {"address": "QXk5ovDwLNNCQQt3YMDTaKRRzo2rqARvUh", "blocksMintedPenalty": 0}, - {"address": "QXk9XbPebk1NZSJvuhHRHM8fPNgmiufdZp", "blocksMintedPenalty": 0}, - {"address": "QXkSsRqNUzz7EpR5pSZZN4KSrPRUUum3iY", "blocksMintedPenalty": 0}, - {"address": "QXkVjG4eC7zhDBvNTiGBnqe9Z5qiSWDdZ8", "blocksMintedPenalty": 0}, - {"address": "QXmGmpgZdPu9RGvYy5Nsqjp7yi1Uk16B5u", "blocksMintedPenalty": 0}, - {"address": "QXmQKyMs4KNYatbtPsJdY2mAb9sUPiZDnd", "blocksMintedPenalty": 0}, - {"address": "QXmg4JDzAeHzXNvsVkanjaPP9e8YsJB578", "blocksMintedPenalty": 0}, - {"address": "QXmhivDHGfW8mumvtPCs6cDFmsczGCJ9pW", "blocksMintedPenalty": 0}, - {"address": "QXn8gaz2DxdM62aedzWGHCx2KVQ1ris8Ts", "blocksMintedPenalty": 0}, - {"address": "QXnHzf6bNSzWjwWvm1eSCZcRQzuppFZunT", "blocksMintedPenalty": 0}, - {"address": "QXnt6dhFmZGMJoJ6mz7FxFXYHnnB5KQuzA", "blocksMintedPenalty": 0}, - {"address": "QXnxD8GiEDYnP3dNmo4GzGdTuQKLXyRvpa", "blocksMintedPenalty": 0}, - {"address": "QXnxXuD2wrr7YbGnxqipdsY7dg5M16EBGJ", "blocksMintedPenalty": 0}, - {"address": "QXoZEPiUWmg6rekJi5jMNWwNA4Ymf6Fs8r", "blocksMintedPenalty": 0}, - {"address": "QXoZXm2ahewWrzUKQV7zXzpXAn9z7LAGpa", "blocksMintedPenalty": 0}, - {"address": "QXodgxVBp5E3xSKcwx6EynPiyuqs1xFv5v", "blocksMintedPenalty": 0}, - {"address": "QXojw3UQBfjpqwc1W8kxSpipuiFvJKtWvE", "blocksMintedPenalty": 0}, - {"address": "QXpCPBRcf6zAFVkUBQ3THYA1zrGRpbRJyX", "blocksMintedPenalty": 0}, - {"address": "QXpZXTcQRqUPu43P9QbHHTaPyWvgkC1iz6", "blocksMintedPenalty": 0}, - {"address": "QXqA7v7zXoU52X9pbKkjrbbUKE2q9xnPiH", "blocksMintedPenalty": 0}, - {"address": "QXqTdXXWKAaVSfLCoJth3GaV8mYm9VcvAn", "blocksMintedPenalty": 0}, - {"address": "QXqYhp8DWdmQTW3HGgEuttbYT2g9WMBi5s", "blocksMintedPenalty": 0}, - {"address": "QXqnRQdmMgCcoamvshZ1x7BmZxGtxchHQm", "blocksMintedPenalty": 0}, - {"address": "QXrFaeCQTuxfQT1cVLsFpgzgk1UMSHNjUU", "blocksMintedPenalty": 0}, - {"address": "QXrYyMbSLM1LM5QTNfRrnHRe2HW9ysA7hD", "blocksMintedPenalty": 0}, - {"address": "QXrvhdkJUscesQDZ5qv9Se2Yk3jjHS2gDS", "blocksMintedPenalty": 0}, - {"address": "QXsiWC86nNqUiJSM68YJbr8A94kyWrwixn", "blocksMintedPenalty": 0}, - {"address": "QXt3hxGnV7nU4khsksf8GvwwGssKRmNcin", "blocksMintedPenalty": 0}, - {"address": "QXt8NJG7PTHPk4TS5s619se44QD5aThhKJ", "blocksMintedPenalty": 0}, - {"address": "QXtDxLaeFeGFuC4AyqyKujC1hWHSqwft4j", "blocksMintedPenalty": 0}, - {"address": "QXtJaqagJn56yaSxPZkPrXK7hX6c9gfyhs", "blocksMintedPenalty": 0}, - {"address": "QXtSf3Cadtnv914UEEqvDSDVhuKErEeEtC", "blocksMintedPenalty": 0}, - {"address": "QXtTFo2nvB35Vs9v6sG41tsypEa3VmaSgJ", "blocksMintedPenalty": 0}, - {"address": "QXtgY3R3yoNeignxNPt7aVoUdxLHTcUtLT", "blocksMintedPenalty": 0}, - {"address": "QXuASERR85SrdJmhDLEYnoxdcH8kdmt5nU", "blocksMintedPenalty": 0}, - {"address": "QXuHwC9AV4iuTwC9NhywYwpn4BZE5jqvyw", "blocksMintedPenalty": 0}, - {"address": "QXuU1aZZczPTjh96V3ZuLPwWrAEAGDbdx2", "blocksMintedPenalty": 0}, - {"address": "QXuXpHuydtgnG8tYtpCaLokpp9g52hqWhk", "blocksMintedPenalty": 0}, - {"address": "QXv6uwUFZHRE6uopF5ZY5b2Gv8YefggKtu", "blocksMintedPenalty": 0}, - {"address": "QXvQD7hHHsF5B58vhup4bDq2q6xLbspkA5", "blocksMintedPenalty": 0}, - {"address": "QXvQJQYQZ77HcuK7PnvqYvfgDzpfuLVNgA", "blocksMintedPenalty": 0}, - {"address": "QXvbeipzm2xxEHAoufYcx5EPC3F1du1hed", "blocksMintedPenalty": 0}, - {"address": "QXwAUtYrtTK9D3iaMfmgw49GvWFaGL4qDo", "blocksMintedPenalty": 0}, - {"address": "QXwbQH6L4rxb9jbSkfbCd2Cv7Lpoc26FYi", "blocksMintedPenalty": 0}, - {"address": "QXwvHcga8Tur7Xa1cqezUqrA9zGF5ziFPE", "blocksMintedPenalty": 0}, - {"address": "QXx7Di2DJazhMnhBpTgh2g9fM6AMUwHQS9", "blocksMintedPenalty": 0}, - {"address": "QXxaT9FHxVm9uk4o57MScWdNjcYcyDZ2cb", "blocksMintedPenalty": 0}, - {"address": "QXxgNdRWo5cfQPpAgrbL3eLjAnkVmgcR4p", "blocksMintedPenalty": 0}, - {"address": "QXxy8VkdTK9MSxnWzmzTY9Q2fXDAWaKHh5", "blocksMintedPenalty": 0}, - {"address": "QXyLbT7zVxrc9eKQEFc2D4JYAiJof8ZQX9", "blocksMintedPenalty": 0}, - {"address": "QXyLoLPh8Z54dBfsWtCAP3QunMQuqTWQUw", "blocksMintedPenalty": 0}, - {"address": "QXyWGHH1ByQKRnGxq9RYywCPwTKtGFh9aB", "blocksMintedPenalty": 0}, - {"address": "QXyy81VrhF4KbtELdmGZdP2LoEaumzfzNg", "blocksMintedPenalty": 0}, - {"address": "QXzX7FgDKEHJBJr7mq2mwGjtUDRwQ9QVWo", "blocksMintedPenalty": 0}, - {"address": "QXzzCsRp5LhE61qarYA42UW1FFe987eajh", "blocksMintedPenalty": 0}, - {"address": "QY1DFmBcKwDBBAsWDFrv2qpNwjy2uUUuNu", "blocksMintedPenalty": 0}, - {"address": "QY1d49zuEp4iwnN7X41zBDz1ciyt2vs5LH", "blocksMintedPenalty": 0}, - {"address": "QY1dHR4PHGG3PrLtZbcobJWAyRxf1BaNZL", "blocksMintedPenalty": 0}, - {"address": "QY1m7eYApj5DmQ9vs5eR7favyfJ1KG6Zpg", "blocksMintedPenalty": 0}, - {"address": "QY1tiXGi6kFpCcG3eZq9vXRddMcqDDwcYP", "blocksMintedPenalty": 0}, - {"address": "QY23M1RHUKxw6sWDxAJndH9RUfDbuSVbYG", "blocksMintedPenalty": 0}, - {"address": "QY2B6NEbggyPTSHAvWSn7gBH6x3Pes3gy3", "blocksMintedPenalty": 0}, - {"address": "QY2EJZDMpk4dUUH6SChbPYt1ZvfqKkUpjd", "blocksMintedPenalty": 0}, - {"address": "QY2VoM4xDMf24r2X75s5uurR1TAzuJygsm", "blocksMintedPenalty": 0}, - {"address": "QY2Yk1KqovM58sHWxMAxEMPjo692WwcspD", "blocksMintedPenalty": 0}, - {"address": "QY2xbuTq7WuGvdcKgusvEimBizRmQWtxKu", "blocksMintedPenalty": 0}, - {"address": "QY3HM7e5mqCrgc3zzXkUnxXvB67efYaUwV", "blocksMintedPenalty": 0}, - {"address": "QY3czcz6miMvDkjooGNzFLRKZXmFVSWwfu", "blocksMintedPenalty": 0}, - {"address": "QY3hZBHLWJMsLKyVK6WB5juncvHoRRZXWx", "blocksMintedPenalty": 0}, - {"address": "QY47zVGGdpSVsBcVdAHuz5TxcwpN13Q7kR", "blocksMintedPenalty": 0}, - {"address": "QY4m5DCLGXcCNCJdqEALGARgGpgz1YpVSQ", "blocksMintedPenalty": 0}, - {"address": "QY4yYNn6YVZPTgLfweWdSsDBvcWU7Svt6d", "blocksMintedPenalty": 0}, - {"address": "QY5TrNaH3NJaV8oqLQgP11xRE4JzRsDhJ1", "blocksMintedPenalty": 0}, - {"address": "QY5XGLejFHdDoeTGQRaD9TXuHEZHmrzp4m", "blocksMintedPenalty": 0}, - {"address": "QY5aQRNYSrT3NSAAsaD9frtA2Fq3TQdycS", "blocksMintedPenalty": 0}, - {"address": "QY5yBzRQKiYEMfmt5eWaCZXnCWwBpaj2Bi", "blocksMintedPenalty": 0}, - {"address": "QY68RqVgRpgsmsLxSHtGHHrqEgXjmpsZeG", "blocksMintedPenalty": 0}, - {"address": "QY6UkE9eJXUwpvAKRtTd49aMsMGhmhq8vG", "blocksMintedPenalty": 0}, - {"address": "QY6t3QiGA3a57eqoNck4gYUkP3zJNVxLaB", "blocksMintedPenalty": 0}, - {"address": "QY77jR3nQMVkSd6cXTf4XVHez8WJ63HbkP", "blocksMintedPenalty": 0}, - {"address": "QY7RWZz8QVUkE95ACi96Buavq8yxhK1eSr", "blocksMintedPenalty": 0}, - {"address": "QY7XYkLd17VCrkeMjUsW8MwCRomc1ZL1mZ", "blocksMintedPenalty": 0}, - {"address": "QY8EnoeuHLPZDVvGdnk5bgSAWC1v355ZCm", "blocksMintedPenalty": 0}, - {"address": "QY8huxBGRgzwzXTutqtG5vwLqy7VJbCrkj", "blocksMintedPenalty": 0}, - {"address": "QY8xs2zfo9HZAp249CNXwyiStHSrzUtgvV", "blocksMintedPenalty": 0}, - {"address": "QY9BeCYhZRjr2EkF8xQ6GbXrQucnUojryh", "blocksMintedPenalty": 0}, - {"address": "QY9MtiwR9nG2xQJPScCeEP1XiS5SwECmfj", "blocksMintedPenalty": 0}, - {"address": "QY9iRZXFZRG4jnKfy1JbPNmwjEvAnqtDSf", "blocksMintedPenalty": 0}, - {"address": "QY9oBjzctHNNJujRnH8Z7LbnGMydWvjsVW", "blocksMintedPenalty": 0}, - {"address": "QY9r9gNCBBSN97a3BvetFfEaSxZGNBfWrn", "blocksMintedPenalty": 0}, - {"address": "QYAKDg4sF5a6FQULSn96rE71uXCcJBEaMr", "blocksMintedPenalty": 0}, - {"address": "QYAwHB9SSVHFuHFPCsXbfwafYzaNB2yKfK", "blocksMintedPenalty": 0}, - {"address": "QYAxCeQWFAe93fT5WA1D8Pz6RrrWK9DqB1", "blocksMintedPenalty": 0}, - {"address": "QYBDMiSx2ek5pPaUethZjcfhPxND4U6UAM", "blocksMintedPenalty": 0}, - {"address": "QYBNStqUztjuikzSGS5DFmTumr9wnD13pp", "blocksMintedPenalty": 0}, - {"address": "QYBT1ZTXGwHb7vMjwDUjo12yRm9hefC4aW", "blocksMintedPenalty": 0}, - {"address": "QYBTgTrmfi5EYTT2a5o6dTG4vGuVsxKsEm", "blocksMintedPenalty": 0}, - {"address": "QYBkE6gdiNug1NcwvtywBhAXEbRzVmjg1J", "blocksMintedPenalty": 0}, - {"address": "QYBqZrF4aKNoSZ25Qme4UD8WXu4xVqnMzi", "blocksMintedPenalty": 0}, - {"address": "QYCL2jfCVPGpEXiTG5GTMbZvjzqHsaUoMQ", "blocksMintedPenalty": 0}, - {"address": "QYDXuWA3pooBk5bArV6vHEEeH1w9G6Tgk3", "blocksMintedPenalty": 0}, - {"address": "QYDkRkqCLuecv9PZUQfChL7w9MW1VZ96Zd", "blocksMintedPenalty": 0}, - {"address": "QYDnXwRJBGoFsqtQtijWmv34PMYsF9uPea", "blocksMintedPenalty": 0}, - {"address": "QYDwarvEjKUFWhzsmeWuvwVHxqhDFN2zm7", "blocksMintedPenalty": 0}, - {"address": "QYDyfQqrQERcJKLSN2AerGB56MVqEM67gq", "blocksMintedPenalty": 0}, - {"address": "QYE8acT99U8btHcbSnLjbdi7AyBC4N6sSG", "blocksMintedPenalty": 0}, - {"address": "QYEFcjF7dfwkyt2drNhGTNkNJVznghmtqr", "blocksMintedPenalty": 0}, - {"address": "QYEYEWxY6aipjYDdEiWH4qKxmf8rhb4mef", "blocksMintedPenalty": 0}, - {"address": "QYFQTFKqDvKSJzRzmbr8FcUttTCnZhod6T", "blocksMintedPenalty": 0}, - {"address": "QYFSt31Jp1akuYCu7nTjxYeQdejsWVPP2E", "blocksMintedPenalty": 0}, - {"address": "QYFhjqvQ39zagvwLMRis8CiaJ2HvkiGkRc", "blocksMintedPenalty": 0}, - {"address": "QYFi134bJoo67nn83HUhDuxMdRbEFpMbn3", "blocksMintedPenalty": 0}, - {"address": "QYFxjNYARmD7d3VGwXmfcdejyZ4pvUUs13", "blocksMintedPenalty": 0}, - {"address": "QYG4kv8Vmq7TmBQct4bLai6wShVStdHLvc", "blocksMintedPenalty": 0}, - {"address": "QYGSUcmQLsb9DrsUUnp8LZfQUwcHG2fXvE", "blocksMintedPenalty": 0}, - {"address": "QYGanzHrRvbqFYrNaGBqU1qdoCHrDkhoFb", "blocksMintedPenalty": 0}, - {"address": "QYHRsi4gwWhhE4cXFqsX1XX9H9idinKS7D", "blocksMintedPenalty": 0}, - {"address": "QYHuT1WVkDupvRKTjQ8SQkMqtak5yi5UgK", "blocksMintedPenalty": 0}, - {"address": "QYHw1peCJzKbsnJYeWTd5Fhw4JWfYXjw4f", "blocksMintedPenalty": 0}, - {"address": "QYJYsPvvPS3ZKX5QBL6PpmbD5b5mT9nzXW", "blocksMintedPenalty": 0}, - {"address": "QYJvFNT4Ytme1qxhcBWVEctCVHXMi91dbr", "blocksMintedPenalty": 0}, - {"address": "QYKGhPs8HQCLhnt8Aj7GdtoEgfG7qRkMnp", "blocksMintedPenalty": 0}, - {"address": "QYLWHKGPJDuShoPynHTWCtAZdUX9ck8zQL", "blocksMintedPenalty": 0}, - {"address": "QYLkpSe54qNPAcoRmsSh9BBQhVLqQ8JW5Q", "blocksMintedPenalty": 0}, - {"address": "QYM2kNcnhtZ47LMFnQUv3kL1gb7CrbTtUB", "blocksMintedPenalty": 0}, - {"address": "QYMyRerBNjoFN8kbLamCEy4t2nqXXAJTvj", "blocksMintedPenalty": 0}, - {"address": "QYNJxG97RPEtF2aauvRGyYKsbgo8ZRWWUU", "blocksMintedPenalty": 0}, - {"address": "QYNNziCj8JYnuBmPxM6BZBCGaCp6ANvdDG", "blocksMintedPenalty": 0}, - {"address": "QYPWK5LZGzVe6xYHni79JhvVJ9ErF8Kyoe", "blocksMintedPenalty": 0}, - {"address": "QYPsZvRXQDduvCgQKY7659f367gN8wR58i", "blocksMintedPenalty": 0}, - {"address": "QYPzR9eav1dPVT9k6toR8BxxZ7xqx7TFxp", "blocksMintedPenalty": 0}, - {"address": "QYQbuQbDoLMMxt8mDnmzMFBFHk1Strotsc", "blocksMintedPenalty": 0}, - {"address": "QYRERZVS2ngvFawsy4Mx8zRPmnsBLXVnP5", "blocksMintedPenalty": 0}, - {"address": "QYRgLSVkFmFHRybmwjESaoZ1J192759LDW", "blocksMintedPenalty": 0}, - {"address": "QYSXuECngGVg4JP4iZ8Y97NCj7NdJQwaao", "blocksMintedPenalty": 0}, - {"address": "QYSsoLnjGN9ZJAJYLXN4ahCbD3FCu4Ki5i", "blocksMintedPenalty": 0}, - {"address": "QYSxcfk4q4kikiVSpGWmGfLFjxLTSQxDS4", "blocksMintedPenalty": 0}, - {"address": "QYSyGkYtvYZYas6STuqwBnHG4d7LGTfFUp", "blocksMintedPenalty": 0}, - {"address": "QYSz2adAVTpch23Vz3GJmLMV2We6b2gZyr", "blocksMintedPenalty": 0}, - {"address": "QYT3Z4qb4k53CmvSD9nRRnZdEbkaYYiA1P", "blocksMintedPenalty": 0}, - {"address": "QYT7xiyjSxVt7L3UC9FMfrTw8CR4891CLZ", "blocksMintedPenalty": 0}, - {"address": "QYTJ9CV27wixNqNTccLXWR51w6QP8iwBVP", "blocksMintedPenalty": 0}, - {"address": "QYTKcRGFEB2JYdTbBcrgciCekuKsZzPXvH", "blocksMintedPenalty": 0}, - {"address": "QYTbieTdEZfRJATnjR9sbJ4pu3kzTRUscC", "blocksMintedPenalty": 0}, - {"address": "QYTmcqqTYBMX6BPmZDqMsxHp3KFKkznbN1", "blocksMintedPenalty": 0}, - {"address": "QYTtWpi8ZwbbrjmAof2n2u4nbRhrFDRY2L", "blocksMintedPenalty": 0}, - {"address": "QYTwVYw281gpkar6u7Kzn9Sp4qwxeN7JHh", "blocksMintedPenalty": 0}, - {"address": "QYUUtMVe9DYVhTYefV1UpYGgcVNkud2F5J", "blocksMintedPenalty": 0}, - {"address": "QYUXEVjJDJWMscZTwuKAfH8h6zV1i454aa", "blocksMintedPenalty": 0}, - {"address": "QYVSBWTt4nJPjVRqAuqhMCUQKdXFTpiEAw", "blocksMintedPenalty": 0}, - {"address": "QYVTGi7YG1yMp3LBSbDgVbj6JbcKs5XdMC", "blocksMintedPenalty": 0}, - {"address": "QYVVHQWRzade3pmjSmFdPbJUUX6U3eLHHy", "blocksMintedPenalty": 0}, - {"address": "QYVYy98eLm5VaKm3sa2yNvfQiPBzoiEKRP", "blocksMintedPenalty": 0}, - {"address": "QYVd3XiCVuFVmx22y4vRc6zwu4m7YWzUYk", "blocksMintedPenalty": 0}, - {"address": "QYVdHkfrdnzRnbtXN2iZH81b3TNQcg5R9z", "blocksMintedPenalty": 0}, - {"address": "QYVqxTRiM5URgiC7UXHogEXactMViyVqZb", "blocksMintedPenalty": 0}, - {"address": "QYW7c1kyyaSbgjSbZH71Q2i4UzjDLq8i4y", "blocksMintedPenalty": 0}, - {"address": "QYWKhveSADxbqfqDL6s2XCuLzgmCNRiHXK", "blocksMintedPenalty": 0}, - {"address": "QYWZCWvDfhQbnoXw3oKrNxgQbDB4ymzL6r", "blocksMintedPenalty": 0}, - {"address": "QYXv4QgDLPowGXWrBFsi3h7Wp6mbLTWgxY", "blocksMintedPenalty": 0}, - {"address": "QYXvnvEPFHRqrUjnyFwJ8VwnDK98BFPNmw", "blocksMintedPenalty": 0}, - {"address": "QYY7eT1ecmVCy2vz43zhyZXFJcEXkLBtpZ", "blocksMintedPenalty": 0}, - {"address": "QYYdex6RGqR1XEGBUXd9N1PuRd5J8Fj1u2", "blocksMintedPenalty": 0}, - {"address": "QYYokhdG6JPvYLotHFb8pkGAE62QV6VGC8", "blocksMintedPenalty": 0}, - {"address": "QYYxQfZPdjREimkF3kPMPQJiFYg1RWT8RN", "blocksMintedPenalty": 0}, - {"address": "QYZ5anakuxBs6yPRjqijJpr8XGTrgZ8y6t", "blocksMintedPenalty": 0}, - {"address": "QYZBNWtv88Vpvy4npo7avP2riuPFki63VX", "blocksMintedPenalty": 0}, - {"address": "QYZBtfFswjVCsDcK9y6SyfvMKEidxqyitg", "blocksMintedPenalty": 0}, - {"address": "QYZYGqKsDQEKo7bN9tDwxtAcasNZNRRfsX", "blocksMintedPenalty": 0}, - {"address": "QYZte7RVQ3DEjQAwfECr9kaYztskDcAPeA", "blocksMintedPenalty": 0}, - {"address": "QYZwuEu3UF7gANrVF4V9MQs5tjA2cXumuM", "blocksMintedPenalty": 0}, - {"address": "QYa5shfemxUNThF8twM34ktD9wZZCuj54u", "blocksMintedPenalty": 0}, - {"address": "QYaVgXQQuyjyF9jzoWW9n8TiXArjAfLS1w", "blocksMintedPenalty": 0}, - {"address": "QYavuNL1R5F4kaTLGfi4HrLUzraxNo1KLs", "blocksMintedPenalty": 0}, - {"address": "QYb1JQh8s1n6exuCETMHa9GmP2nbTQ3EaS", "blocksMintedPenalty": 0}, - {"address": "QYbGyytNL76wLUDik77FD15CXAw6KpNS3S", "blocksMintedPenalty": 0}, - {"address": "QYbbxiPADUEUd7FrmfZ92uGMPuEaSX53xp", "blocksMintedPenalty": 0}, - {"address": "QYbckXX6LVGJZFWekTs7t5x1kGu182igbT", "blocksMintedPenalty": 0}, - {"address": "QYbdofufonhV7wApNoyvxsVMjaDh7Z19Ba", "blocksMintedPenalty": 0}, - {"address": "QYbjYgnhNEGugaEtRopbwZSa1SJzxdicZt", "blocksMintedPenalty": 0}, - {"address": "QYbqLRLYPh37UsygmYi5CjC4Rez85YDTRf", "blocksMintedPenalty": 0}, - {"address": "QYbsc3Xq5q7XGf1AmN4Fj96py8nupfc26J", "blocksMintedPenalty": 0}, - {"address": "QYbvfcPRqwSs8ustAu5ftacuaqXrf6vzbo", "blocksMintedPenalty": 0}, - {"address": "QYcMNYCwjGRgRtwcGAhy6CgiphJnyBDa2t", "blocksMintedPenalty": 0}, - {"address": "QYccd7u9jbsRwDJik5D8XeX3vUAsN3e3Rq", "blocksMintedPenalty": 0}, - {"address": "QYd7xhf1F1g6KQhnrB7E9oXngWFTYAtEab", "blocksMintedPenalty": 0}, - {"address": "QYdCzjaf4UcCgxZ9f3wDmHd2s7PrXr4YZn", "blocksMintedPenalty": 0}, - {"address": "QYdVhdrJirNkf917geVjBLSpoBJRDwk8cu", "blocksMintedPenalty": 0}, - {"address": "QYdXoptoELHq3gQn1hRdh1xdqX43FjtKsG", "blocksMintedPenalty": 0}, - {"address": "QYdtZJMMvwWPQn7e9BnYFJqD3TqQtay7wu", "blocksMintedPenalty": 0}, - {"address": "QYej1rwZJKVJmQrrYPoZ6VsWC5X8RgcVgA", "blocksMintedPenalty": 0}, - {"address": "QYenGVWbhekBGRStTwwRhz73NfyJFXJFAY", "blocksMintedPenalty": 0}, - {"address": "QYfmptKACs64FYUzNK4Ub7Y1EcDGQZsikB", "blocksMintedPenalty": 0}, - {"address": "QYfphtzfrihptG85tXbbH6YgubJnDMjyyf", "blocksMintedPenalty": 0}, - {"address": "QYgGW8QzRKGfr6hSZSaGC59Ha7KudsdDx9", "blocksMintedPenalty": 0}, - {"address": "QYgnXHv97EEjwVviGjqsnpQjuSS28oPBBQ", "blocksMintedPenalty": 0}, - {"address": "QYguzP9V8KZ9NFgrozDWUfRMxEmBuUQzX1", "blocksMintedPenalty": 0}, - {"address": "QYgzYYxrQ6hCicXtVAg8LuMzHACYWnqESp", "blocksMintedPenalty": 0}, - {"address": "QYh3U3gpEqeXvBvMW7pKXNifUCvm6mwUVq", "blocksMintedPenalty": 0}, - {"address": "QYhPwjypqbhFzTyB5wHgoGzhMErmLpjD1B", "blocksMintedPenalty": 0}, - {"address": "QYhx9nvhj17mtXXC4pR4W4ujzvTJRqFwvd", "blocksMintedPenalty": 0}, - {"address": "QYi3LCD5ukmMzs9bnFpX2d63QEcFMDVqyZ", "blocksMintedPenalty": 0}, - {"address": "QYi3gMt1jkJJFZLQCjydhyHiWNjG2yUSqn", "blocksMintedPenalty": 0}, - {"address": "QYiNoSHSJbEeSR7Wbc5Pi6b5muzCx977Dg", "blocksMintedPenalty": 0}, - {"address": "QYib3gfFNrbwqN9tqjRBM2eN3mm2GkkiBH", "blocksMintedPenalty": 0}, - {"address": "QYihJra14QhktjBs2ziDtEze4PTLgRdoBr", "blocksMintedPenalty": 0}, - {"address": "QYjapnSDs6Qn3xWbNrn8sDQp6RPaWzeTvq", "blocksMintedPenalty": 0}, - {"address": "QYjfPGDKXLxx3hf4uQ3dd1thpaP4FNQfAP", "blocksMintedPenalty": 0}, - {"address": "QYjpN1EGhowxSTcTxktmfuYgYh5hj97XTP", "blocksMintedPenalty": 0}, - {"address": "QYjuaZamanCfCSzDx5u2Kvq2CW6w1TAaMz", "blocksMintedPenalty": 0}, - {"address": "QYkELPiymoJhidA3Vnv7TqsTtSqn8jekV8", "blocksMintedPenalty": 0}, - {"address": "QYkMhpBGqnWFnzU28iGseZhcrTpbSgZB18", "blocksMintedPenalty": 0}, - {"address": "QYkXJBt2DkqhfN3xBBzXBdsNLXWTy9MypQ", "blocksMintedPenalty": 0}, - {"address": "QYkab6QFQBvocJVQABJ9KdyzvrVPoKb2bi", "blocksMintedPenalty": 0}, - {"address": "QYkuWG3X9zXTussWDdo1fRmJHkRVbi7udT", "blocksMintedPenalty": 0}, - {"address": "QYmLqcEmp5VoTGbtuxJujVii9w64pnUqBu", "blocksMintedPenalty": 0}, - {"address": "QYmbPh7Ebk4rkWRiLFwGhgGh9TGP3axrdT", "blocksMintedPenalty": 0}, - {"address": "QYmiapeNwbzWYaoosv1QFmq4oRiYR1KiT7", "blocksMintedPenalty": 0}, - {"address": "QYoVQK2RVANbZ1BrJDSiBgAEdrVJAGKu3A", "blocksMintedPenalty": 0}, - {"address": "QYocYqR4AwgmaVYpTET5Gd2mWzVReDgv3G", "blocksMintedPenalty": 0}, - {"address": "QYogryXKVBJ2zxK2M4XTmoBFEdJZTKjzeN", "blocksMintedPenalty": 0}, - {"address": "QYp3WbksRD6PvJJbNXbisehD8vPTAcMaSV", "blocksMintedPenalty": 0}, - {"address": "QYp7fQviDVLc51SCHzZUrKfdcsuJekuYKj", "blocksMintedPenalty": 0}, - {"address": "QYpdqxScQLR2X3eTPxGb2BtPg1g2YBPna1", "blocksMintedPenalty": 0}, - {"address": "QYphDYA1te9acFNc7FEmFBu3FTTomp4ATZ", "blocksMintedPenalty": 0}, - {"address": "QYq5yhFUXsBrKSmsm1JnXFewD5r3NjESmh", "blocksMintedPenalty": 0}, - {"address": "QYqDwFH1epJjaWitxDk4aPBboCdbH4kYDa", "blocksMintedPenalty": 0}, - {"address": "QYqUEbnDH2E2eFFigHtW1q2b71VW4SK3yE", "blocksMintedPenalty": 0}, - {"address": "QYqv1Gc4LMHwtV4NLBCT59LYRo85aML4Hr", "blocksMintedPenalty": 0}, - {"address": "QYrHsrZyffjSVS6xxSwJ1zNyohL7qM7Ycv", "blocksMintedPenalty": 0}, - {"address": "QYrWA5ggyb3pjg8ZZcc44Huej8HVrm8asc", "blocksMintedPenalty": 0}, - {"address": "QYrX4S7j8apzPp654EdnAhcTJqoiYZV6D7", "blocksMintedPenalty": 0}, - {"address": "QYraQa2brsWHfq4k2gymezjUahxWCz3m6X", "blocksMintedPenalty": 0}, - {"address": "QYrjqCzgEHrefpQm4ETFvZheZ8a86dyG5m", "blocksMintedPenalty": 0}, - {"address": "QYsRRLQtWdXqUtTeV4pkUaW7p3XakfZwcg", "blocksMintedPenalty": 0}, - {"address": "QYsbr5YhbwfNWbnoNpMg8RmzLAGHRVHx3y", "blocksMintedPenalty": 0}, - {"address": "QYscq62xih4qe3uVicfLHX6YPnZPXYNQrh", "blocksMintedPenalty": 0}, - {"address": "QYsk5rh4v3eyPU5jGwLLrXriAkrqouN1VK", "blocksMintedPenalty": 0}, - {"address": "QYsrRJfaoG4qvBKp2Ubs2afAWLdSSL1pnZ", "blocksMintedPenalty": 0}, - {"address": "QYsxXwZjVqNgeU1T6sVvMLro9eM9YLaCRr", "blocksMintedPenalty": 0}, - {"address": "QYtXhAqGN8XmxEhzDWyXzNSrdXiyS1Ddax", "blocksMintedPenalty": 0}, - {"address": "QYtjEuzqk42BGCAhdQfW6tMzbVQAACF6Ar", "blocksMintedPenalty": 0}, - {"address": "QYtyy5G91joYkRmTAuh6daGEAN6xm4oNQE", "blocksMintedPenalty": 0}, - {"address": "QYuth2DzxueiVDPMKBTc5E5XX5YsoNBdZd", "blocksMintedPenalty": 0}, - {"address": "QYv3pHy7vyWErbxZaXdMo5fGaG2pTN1qKT", "blocksMintedPenalty": 0}, - {"address": "QYv9sbsML4BepKpN75J1AHyZHYy7DSgoXp", "blocksMintedPenalty": 0}, - {"address": "QYvkNDQzMpCbLTuKPvfVLRYsa1GXWfgxFC", "blocksMintedPenalty": 0}, - {"address": "QYvmddBh9xF8Mc2iKqkZDkmcGWmX7ptSf7", "blocksMintedPenalty": 0}, - {"address": "QYvuCYpwn9qrBUFzcqj6T4adXGrz2n8QYe", "blocksMintedPenalty": 0}, - {"address": "QYvvCh951pjoxAJkEiNRDEiV9rTky6XjDW", "blocksMintedPenalty": 0}, - {"address": "QYwYHCrmeBXoXVJTfeYjxK1TE8gSei57co", "blocksMintedPenalty": 0}, - {"address": "QYx2K8HAs4gNHA3vURjzSxP4i53D6BWhEQ", "blocksMintedPenalty": 0}, - {"address": "QYx2paa5eaYwC8cnMWcu8xEjfSXH9creS8", "blocksMintedPenalty": 0}, - {"address": "QYx8HmJcmgaspSWDS193Pt2M9W7xrNCCxP", "blocksMintedPenalty": 0}, - {"address": "QYxxEgEjXpW6FHSPvUGYsbiz4tSJRvRKFu", "blocksMintedPenalty": 0}, - {"address": "QYyLPAzY9YB8EzAF8Unve6SMh6r9xzqUCm", "blocksMintedPenalty": 0}, - {"address": "QYyLwEHs3HYzmxqZXTjUiqKLrLc9woEju5", "blocksMintedPenalty": 0}, - {"address": "QYyZTzQ1dYsqhyoyevJwJh35pNGissKMzN", "blocksMintedPenalty": 0}, - {"address": "QYyeCtg6ZBjHPgWA4iL4CbfBmYs1SxkyWb", "blocksMintedPenalty": 0}, - {"address": "QYyjRB78nis5iKnBoiHGMMwEitpnRXxsLG", "blocksMintedPenalty": 0}, - {"address": "QYyxxskMnwwaY8nbjyfz9cmvxGnT53bQ3F", "blocksMintedPenalty": 0}, - {"address": "QYz13rAMCvEYS8L7zPU5oSFzmviAQQU13r", "blocksMintedPenalty": 0}, - {"address": "QYz75LEirH1suKHS7uVesjZF3gbgAmuiy6", "blocksMintedPenalty": 0}, - {"address": "QYz7LmHvEHcYvWBE22hVf9stBmk3zCVzpR", "blocksMintedPenalty": 0}, - {"address": "QYzJEzysfnpYaBZs4GbZca3zkLTV9uBBNC", "blocksMintedPenalty": 0}, - {"address": "QZ1A7gM81hqywBsc3BYMYgzNN9VRTKNwyW", "blocksMintedPenalty": 0}, - {"address": "QZ28d8mixSsqmMvDeXApnL6NCBVkF1zh4e", "blocksMintedPenalty": 0}, - {"address": "QZ2f48hq5CrgA6f91dnJ9Quy7aaPjTCcyC", "blocksMintedPenalty": 0}, - {"address": "QZ2m1ygMB3ctxgpPcWHuWtvty6m3JZmM3D", "blocksMintedPenalty": 0}, - {"address": "QZ2qiMrwb4697ukbcx7Wu9ggQWTi4Bsfms", "blocksMintedPenalty": 0}, - {"address": "QZ31iAovmFWzMCKNyJVV3zBTmyPJGH4Fkt", "blocksMintedPenalty": 0}, - {"address": "QZ3T5BvyNLQRoHA4s3hxgAHRZ8HQZmqCoS", "blocksMintedPenalty": 0}, - {"address": "QZ3neufggmG7qV5ADh13tQQZmjkfJnccQF", "blocksMintedPenalty": 0}, - {"address": "QZ4BtEeJ8MZNzZwVLjcb2Lma9gkY128KKb", "blocksMintedPenalty": 0}, - {"address": "QZ4S7xaXZSyXUn754cFovz27vWxkFiVzsB", "blocksMintedPenalty": 0}, - {"address": "QZ4Sd5gFKSXMfAkQ1kjioy6CMAeJSJtpoS", "blocksMintedPenalty": 0}, - {"address": "QZ4jVhry6q4uA4nwE7QUwik4uN8Gd2TEdV", "blocksMintedPenalty": 0}, - {"address": "QZ4nLaSMMTNurL2TjncEPhf8XagKYiV9XG", "blocksMintedPenalty": 0}, - {"address": "QZ4yxyGBPYUn24HrXMN6iqURpJrUhcockr", "blocksMintedPenalty": 0}, - {"address": "QZ5FwpcCCSdxf37VPkYwJR12B57dNFPqNX", "blocksMintedPenalty": 0}, - {"address": "QZ5XQrNJJSkdX2oxoHgEwMrB3k3iBZfErj", "blocksMintedPenalty": 0}, - {"address": "QZ5ptWLCAwQndAAJXU1NANrf3Qnj5qjofw", "blocksMintedPenalty": 0}, - {"address": "QZ61xEF1Ba5xoSRnMXdEUymzz18uiSJ2Lq", "blocksMintedPenalty": 0}, - {"address": "QZ62EYtWuHzRVSaZJ2u2LY7c9oq6uwYX4Y", "blocksMintedPenalty": 0}, - {"address": "QZ6GYGXoab7yrHeS81ZcM4SpdkSgPTv3Wc", "blocksMintedPenalty": 0}, - {"address": "QZ6MuURt6cKHLJEgjyiFcHp1S1gBEydN8U", "blocksMintedPenalty": 0}, - {"address": "QZ6Nyd5M7YEetwodCQKzsZbweyjmJ3ZYrX", "blocksMintedPenalty": 0}, - {"address": "QZ6myDY7EDyLf6rA8evWvVxmKRAYj3agnq", "blocksMintedPenalty": 0}, - {"address": "QZ6sYB89JR2NT5e67tjykENMZSEhrHQe8G", "blocksMintedPenalty": 0}, - {"address": "QZ6viPQNzaYMkfdNAE2kZYAVHvKzePfYiT", "blocksMintedPenalty": 0}, - {"address": "QZ7jCYhdE71Xv8YEKGeEBi1qXk3qr8ih5D", "blocksMintedPenalty": 0}, - {"address": "QZ7jjuMSRdcPQGCoH7Bnc6amqkJXYAg7gn", "blocksMintedPenalty": 0}, - {"address": "QZ7nVgA87mZ8W7ZPMFzDRgcHX3NmYCP53e", "blocksMintedPenalty": 0}, - {"address": "QZ7tcvNMBsY9taLXnLiFCj1bKxGFzMkZsy", "blocksMintedPenalty": 0}, - {"address": "QZ7wvWAUcHKRhvQ3ijdrqM4zucQKCgQ1hQ", "blocksMintedPenalty": 0}, - {"address": "QZ8G32dS3U1BACQoo5uv59iuxaPQjszQXf", "blocksMintedPenalty": 0}, - {"address": "QZ8GSZTT29rv7L1jUdG3tkX47xqZd4dpb1", "blocksMintedPenalty": 0}, - {"address": "QZ8RMcNpsEtBkNNjK8GHrgeQecksWk4AFi", "blocksMintedPenalty": 0}, - {"address": "QZ8W8qKhW3rmpSDdxPsEta22cxgJRBMJjc", "blocksMintedPenalty": 0}, - {"address": "QZ8a45PncF3wCGFJrxmLSRZ7sNhP35AABU", "blocksMintedPenalty": 0}, - {"address": "QZ8mKM8zSU4bhkrnD6F4dDPqJ4xkRKMieP", "blocksMintedPenalty": 0}, - {"address": "QZ99sZmFXt8yKrRQ7qiBZNzht8X5m4yynP", "blocksMintedPenalty": 0}, - {"address": "QZ9DDZfR7BRf7RzcH2S7p4myd2GsPVNcx6", "blocksMintedPenalty": 0}, - {"address": "QZ9jg2XF1qcjELbE4PwuNpapZou88kZjd6", "blocksMintedPenalty": 0}, - {"address": "QZ9pg4p3XN48HDtibiGMdDigsS8PtjDYae", "blocksMintedPenalty": 0}, - {"address": "QZ9tB5RTWpN31EYKCR3mfSR2uFTHEZGoCV", "blocksMintedPenalty": 0}, - {"address": "QZA4Fk6M5GsoJRJyUGn89tMBZH5Tk2WsdT", "blocksMintedPenalty": 0}, - {"address": "QZAFaiQCspd7MXpyv7xdZ5yUVU8m4tX4TJ", "blocksMintedPenalty": 0}, - {"address": "QZB9f8Ha9jvWvswme2HvdKUApmK3m6JRfU", "blocksMintedPenalty": 0}, - {"address": "QZBNjevgds5TprnCyAZm38j3kFty6mSnmd", "blocksMintedPenalty": 0}, - {"address": "QZBQEyaTkJYZE9pgFpEQp4x4jsyL1zcw2s", "blocksMintedPenalty": 0}, - {"address": "QZBTBtc6ht9Sx8xT1WuLUXAioSmVkYLmu3", "blocksMintedPenalty": 0}, - {"address": "QZBUCNj9qqewh77HsYh3pmMY7bjVF1adTT", "blocksMintedPenalty": 0}, - {"address": "QZC4U7zDhkhh5Rj7F87a9c8E3hGf7L4eDd", "blocksMintedPenalty": 0}, - {"address": "QZCA7xNKzbZJr8XLYqsmFJ5KnFx5ixbmLL", "blocksMintedPenalty": 0}, - {"address": "QZCUHe6ffPdgGHAFKd8qNXNegMVXfhvQuV", "blocksMintedPenalty": 0}, - {"address": "QZDSYw9WYwuhWbYqJksRpN2scSqT6yW2DC", "blocksMintedPenalty": 0}, - {"address": "QZE6oJCPmiqESX47fPKQt5mPKEccMGn6N3", "blocksMintedPenalty": 0}, - {"address": "QZEEdHDH3nMhVnx695nYnPQ4aepspNTi79", "blocksMintedPenalty": 0}, - {"address": "QZEFRe67tTWChKBsBgaG6tZb9MT6gbPfb9", "blocksMintedPenalty": 0}, - {"address": "QZENsHWQkb7dsrugknVSaRpNyB5MsADXZe", "blocksMintedPenalty": 0}, - {"address": "QZEUQTeY4ZNgf96FJPGiVPpvQP3tqPPkoA", "blocksMintedPenalty": 0}, - {"address": "QZEhkW1Eoi5KPwWjD4dLyVCMrfAieEeZJt", "blocksMintedPenalty": 0}, - {"address": "QZF5tr4FK3RRfDq7ejqmyYQLF94geqcKvD", "blocksMintedPenalty": 0}, - {"address": "QZFRC6WZxAknY4gekSFThxCQfwnrSDj2yD", "blocksMintedPenalty": 0}, - {"address": "QZFd5xdFuL9SQ82Kihn6QmswFWKF8DeVrd", "blocksMintedPenalty": 0}, - {"address": "QZFs2CnALpdT1VEg2Q4RaryWzhvagYFZaq", "blocksMintedPenalty": 0}, - {"address": "QZGEREC66Tok3BEUvsjMw7AqJ7SGd17VLw", "blocksMintedPenalty": 0}, - {"address": "QZGfEGnBGth5h5WyFyPT51GkUygMULvdKL", "blocksMintedPenalty": 0}, - {"address": "QZGgiS3gkov4b4jDj9fAp2BoeE8D7aHxyn", "blocksMintedPenalty": 0}, - {"address": "QZGk3aibyp4CdKnWti6FE4fbGAEnh4mm7U", "blocksMintedPenalty": 0}, - {"address": "QZH2durtdKPJgEKgJ5Co5AtRFacSetWJ2F", "blocksMintedPenalty": 0}, - {"address": "QZHEKkmUDRDcYDP46Au5cxVdaNCCg9BuJq", "blocksMintedPenalty": 0}, - {"address": "QZHNDoUJVgLVzwkYLWpvQbjS2JuscC7mEG", "blocksMintedPenalty": 0}, - {"address": "QZHU1itDrskpnwca8PYzpu8xXenoZN1MrJ", "blocksMintedPenalty": 0}, - {"address": "QZHVrsBfqGn5nyficaY4veCxF9NstVLtXG", "blocksMintedPenalty": 0}, - {"address": "QZHZnrc8PwEU9wEACmAQBeTcvkpRYMMGMr", "blocksMintedPenalty": 0}, - {"address": "QZHjex6k7cK7MVMDkyuoFRYspDFEVUzLRq", "blocksMintedPenalty": 0}, - {"address": "QZJ6pjRbUrj6eoQ4drFT9SCp3eC6tD7DhB", "blocksMintedPenalty": 0}, - {"address": "QZJXJUU3FaVBk8Hd2iPmNe8c2BwZ4SCNyb", "blocksMintedPenalty": 0}, - {"address": "QZJvRvFmfAbqUnQ4rpUAm6RxAzaBApJeJS", "blocksMintedPenalty": 0}, - {"address": "QZJyG8cnB3ecaLQ299KYWhTuZLij7GCGQZ", "blocksMintedPenalty": 0}, - {"address": "QZK3BSSJ6VirRgGePNffuVngAnQCuRT8Qv", "blocksMintedPenalty": 0}, - {"address": "QZK6LNFrmgxrTwAdabHbaVymXfavXqHhuu", "blocksMintedPenalty": 0}, - {"address": "QZKWDpFNkzxRknxPqyLiYqukq1Tq9Q2or2", "blocksMintedPenalty": 0}, - {"address": "QZKYQPK3LR4NJADKs1wt7GpYJfz9BGWTnk", "blocksMintedPenalty": 0}, - {"address": "QZKca9TevdKxtUz7KBCF8KCsruzVgwEEie", "blocksMintedPenalty": 0}, - {"address": "QZLEQthsanmPb8sMdBcujK6Vg1Pn5wVrfc", "blocksMintedPenalty": 0}, - {"address": "QZLFJSHNhNVhbfMvhTbsuJhDNn4zdehFEd", "blocksMintedPenalty": 0}, - {"address": "QZLQmTaBsabFaUAozbdBuXjpmqSND4jURs", "blocksMintedPenalty": 0}, - {"address": "QZLaV54we4WKTq9MvXm3NQe3Lj2NYi1W7d", "blocksMintedPenalty": 0}, - {"address": "QZLdA5iAEApDKCNSCjUJp8fm3RStkEX4cV", "blocksMintedPenalty": 0}, - {"address": "QZLoKXPSp9X378X7ToSNE1JEe3FK1XTLLK", "blocksMintedPenalty": 0}, - {"address": "QZLuiwjT9BxE6JrWDKP12VyzEgcPLrBqW9", "blocksMintedPenalty": 0}, - {"address": "QZMDbkZPy28GcPy5gh9unZM4z4Tgf4Xtcp", "blocksMintedPenalty": 0}, - {"address": "QZMFjoL6GTzCpeXFmcqppFznBYrBAwzE8o", "blocksMintedPenalty": 0}, - {"address": "QZMHjFobGeCtduw9uMWHdtuTHZkAycBN3V", "blocksMintedPenalty": 0}, - {"address": "QZMgeNF4f2AyNKf6FHt4oZSWVdbFaWYReu", "blocksMintedPenalty": 0}, - {"address": "QZN5ssw549BFReAFQuCTdTy2mDEgE9PBLN", "blocksMintedPenalty": 0}, - {"address": "QZNDuZzaf5Ekiqmehz2gBCWPvWKA9tzZJK", "blocksMintedPenalty": 0}, - {"address": "QZP262ydDSr23veDB6BYaFeuC9eT9twy76", "blocksMintedPenalty": 0}, - {"address": "QZPzRH8DRqERBSchGXXJpVg3XpUYaM1E2Q", "blocksMintedPenalty": 0}, - {"address": "QZQTEnAtPcyuo1pCVbkHhsMPgBbgcvyuRT", "blocksMintedPenalty": 0}, - {"address": "QZQbZ3yWpWAzK1vBJLNGc8cneHb9BW3PDJ", "blocksMintedPenalty": 0}, - {"address": "QZR951c4vFuJUuTa9MvoA7J7KgVcWh4D4J", "blocksMintedPenalty": 0}, - {"address": "QZRZXbDSxB2zJs1myFgYE59sUhXMS8V78D", "blocksMintedPenalty": 0}, - {"address": "QZRsuC9Av9DDPriRdVVM5AtsX61aQqnvwh", "blocksMintedPenalty": 0}, - {"address": "QZRvMNVk785ZeQdNGRGKMed5yTZkvBfXok", "blocksMintedPenalty": 0}, - {"address": "QZSNxXgpEQzy7LEUHpqU2sq3foV8Sa7hMY", "blocksMintedPenalty": 0}, - {"address": "QZSXuP9vGU17XdE1EfoNLyLnHrFuaeBGov", "blocksMintedPenalty": 0}, - {"address": "QZSiakCNFQpcfRHM6MZKczgPEv93GsyoQw", "blocksMintedPenalty": 0}, - {"address": "QZSuRHhv1C3bsVifHCcvEJ4D4paeyzn73Z", "blocksMintedPenalty": 0}, - {"address": "QZSzsEpQxdD13ez1qG5JJWKuYjga3PtVQL", "blocksMintedPenalty": 0}, - {"address": "QZT4spa58znsA5Gt47T95v7wiizMTycPbu", "blocksMintedPenalty": 0}, - {"address": "QZTGg4jKzhWn6Q2jSHU7o67Aj7iVwCkTP1", "blocksMintedPenalty": 0}, - {"address": "QZTKdd9W3uBX6itcftLUaV1gzrakzZHEpK", "blocksMintedPenalty": 0}, - {"address": "QZTxNgHGYPiuuN9dCGSguYSMthLnzLkqnM", "blocksMintedPenalty": 0}, - {"address": "QZU48VmrzAoXebArYEyxBq7Qro7sYnX5fB", "blocksMintedPenalty": 0}, - {"address": "QZUKcpub6BKysq7mtPMk59udhNcppVi1oR", "blocksMintedPenalty": 0}, - {"address": "QZUaqEybsVJUYqzHbG8ETT4wvqiKVK2B6R", "blocksMintedPenalty": 0}, - {"address": "QZUwC4kZxd5YdH67vGjsxabHParrMvrFaW", "blocksMintedPenalty": 0}, - {"address": "QZV8TaGD22Cco6PREPeFgF5epzkeGc1hNR", "blocksMintedPenalty": 0}, - {"address": "QZVaRa56b77kViTjhKUD7GFQYXJVmfqdoL", "blocksMintedPenalty": 0}, - {"address": "QZVbbVPkwDYZUgr5uJiEm9tuTYVSZj6Ay7", "blocksMintedPenalty": 0}, - {"address": "QZVczQPFWg1pNuX2YNtpcqxYENfBZ7iA9C", "blocksMintedPenalty": 0}, - {"address": "QZW5vP1hzyfxR6CBkDYFRHGJZG9UnH7Nm3", "blocksMintedPenalty": 0}, - {"address": "QZWFxzXhaaSzffyVkcuGZGAqTCjopLfnsz", "blocksMintedPenalty": 0}, - {"address": "QZWKtYd6v2Lrj8ELo7ErBRB1cocV3Az7Ah", "blocksMintedPenalty": 0}, - {"address": "QZWj9ke33hL4noapRmm2HeAjSeVD9qDEQr", "blocksMintedPenalty": 0}, - {"address": "QZX8U4wHvBbjWdvYQUXDhoaq7JwSSUAFoK", "blocksMintedPenalty": 0}, - {"address": "QZXjVQkpYkpTrDPNYUHAarAJS4fdkA4fnd", "blocksMintedPenalty": 0}, - {"address": "QZXkh11FwznVBrtEneh3ftZpvURoGFVbzi", "blocksMintedPenalty": 0}, - {"address": "QZY1jJQd38t15z26zE8KzZBuMjJrobbRHA", "blocksMintedPenalty": 0}, - {"address": "QZYGnDK1PBfZ8jhZ8ZVhRvAB41ytERScLq", "blocksMintedPenalty": 0}, - {"address": "QZYLPnQtPT1s2GcMJsDBnoxG9CXF3eJqVA", "blocksMintedPenalty": 0}, - {"address": "QZYbWU7gy7KggcFjhMfWihsGhayjNH1cdS", "blocksMintedPenalty": 0}, - {"address": "QZYhoSnN2pFGwfD99s7XtNLEHcRwAsrway", "blocksMintedPenalty": 0}, - {"address": "QZYuYm81PVWkL69RWQmsgLPVDbjgeoUMK4", "blocksMintedPenalty": 0}, - {"address": "QZZ9XsiqP4J6XYmQzDCY32bY8QwiKCAaqE", "blocksMintedPenalty": 0}, - {"address": "QZZGyC3tP6z1kQ5zfMr9YEszxRJRW9vPMW", "blocksMintedPenalty": 0}, - {"address": "QZZPZZJZZfk9J2uffcQiyxABcZ1UEZEvEq", "blocksMintedPenalty": 0}, - {"address": "QZZUYProuknmUEn6UxGwSsbbFQo17nvXdH", "blocksMintedPenalty": 0}, - {"address": "QZZpuT4ryAijzXrdoyxVsrbeRNQjFYhQCE", "blocksMintedPenalty": 0}, - {"address": "QZZvDxSVcdDziEnkgiR1kJRFBSVMGRHxWx", "blocksMintedPenalty": 0}, - {"address": "QZaACZ6XgWcEBh1jDqJ849CsFGBCuoNcG5", "blocksMintedPenalty": 0}, - {"address": "QZaCzvPzS94hRiV9dxS4rExZDyc2CyJTkm", "blocksMintedPenalty": 0}, - {"address": "QZaLfuTYLNT9EweHXjhT1jmv4fwWfmZvvv", "blocksMintedPenalty": 0}, - {"address": "QZacTB4HVgcqKwvF5o78SnLHQpDHdHqjyS", "blocksMintedPenalty": 0}, - {"address": "QZarUCCweP8gzYZ4G9mW9jjru8v7v9qxGc", "blocksMintedPenalty": 0}, - {"address": "QZauwN4hiwRVEDThXyF3sTkuBsswNNHtQy", "blocksMintedPenalty": 0}, - {"address": "QZbFz1gDusCATdgpRbGA19AMNgtzijmnNF", "blocksMintedPenalty": 0}, - {"address": "QZbKgXTeRYyASUoyL1DH6JA6hwUEV5KCNv", "blocksMintedPenalty": 0}, - {"address": "QZbMnpCvCdW2edUH257JLvKGghKNfkWfZ9", "blocksMintedPenalty": 0}, - {"address": "QZc65iGBULQE1m6mmVs82dvwL9E7aYt1Zz", "blocksMintedPenalty": 0}, - {"address": "QZcEGBQyFUVyJQEe69udggzaU3AMT5ER2W", "blocksMintedPenalty": 0}, - {"address": "QZcVfnvFm81pwZFxRVux4edQBzMFmJqssf", "blocksMintedPenalty": 0}, - {"address": "QZd2Urwc2YRFpCa8xVnHhLNJ9RhAsMe2eh", "blocksMintedPenalty": 0}, - {"address": "QZdFZbZ5fxgSTvuDQdrUJSuwBiVptWFMoz", "blocksMintedPenalty": 0}, - {"address": "QZdTmBCQhSzzKtZZZ3D45zTZovVKc2gJ31", "blocksMintedPenalty": 0}, - {"address": "QZdUU9KxgfJXRPDCYtPTyENsRAFhuvXsoi", "blocksMintedPenalty": 0}, - {"address": "QZfHoNfyHbSuGKzEL8U3awpzKNzUawY85C", "blocksMintedPenalty": 0}, - {"address": "QZfMu7Kn1ar6fNMJVum5nWDGoC74ecUoQG", "blocksMintedPenalty": 0}, - {"address": "QZfrdb9MLpw1qzmsYfBJtbash7fnf6Chd9", "blocksMintedPenalty": 0}, - {"address": "QZgsEamWVQYXiaHNAXLjAE94ahN7w8XuyB", "blocksMintedPenalty": 0}, - {"address": "QZh35onkNqmdFhkUeQJTNuDUTQ3TPkdNqb", "blocksMintedPenalty": 0}, - {"address": "QZhLJCFT6s4WPUAypHGqHvhPSmCNxh8dJP", "blocksMintedPenalty": 0}, - {"address": "QZhUkmMJduNCvosxBeyQu3QTgs7MyMt3zA", "blocksMintedPenalty": 0}, - {"address": "QZhcDhqRZ5nV9xSjd4wcGCTvke46vE7v8A", "blocksMintedPenalty": 0}, - {"address": "QZhxLttt3FZnt1jVcnv1Mr6L8Bjtf13pm3", "blocksMintedPenalty": 0}, - {"address": "QZi3C7UMrFoCyGUzUHJU2fmDmpvMnSStzS", "blocksMintedPenalty": 0}, - {"address": "QZiFwCDEGFZoY8uXQFgraS8QeEywULEHfS", "blocksMintedPenalty": 0}, - {"address": "QZiUZd8gsaAhHYKC4d3PBbCLNjyCpDhrA4", "blocksMintedPenalty": 0}, - {"address": "QZiVjLyAVXrujDnekrmjktmgh1d17DSdAU", "blocksMintedPenalty": 0}, - {"address": "QZio4k86Ky8n2xRurNWLaBvVLwfY2hB9HA", "blocksMintedPenalty": 0}, - {"address": "QZirzvZE4GLyNf2739TzoJV7FQaUYUK9dw", "blocksMintedPenalty": 0}, - {"address": "QZjDHpT8UwLpSo6ew2mo9FvJrXCuFWxBps", "blocksMintedPenalty": 0}, - {"address": "QZjMqAXeNSMcNBmnvzPoSYPH2NMeejgymz", "blocksMintedPenalty": 0}, - {"address": "QZkVQdZXqGLUVuRZdTAXtsKoiojfzdxSRo", "blocksMintedPenalty": 0}, - {"address": "QZkWZxhhHsALaA1nzKWW2gGM2WcSjhxhKB", "blocksMintedPenalty": 0}, - {"address": "QZknweXQFEnkmH5Eo2vWUStJKJvzYvdGP9", "blocksMintedPenalty": 0}, - {"address": "QZm3SEdDESXGS9petTwJZ5G6HyhaWuetnv", "blocksMintedPenalty": 0}, - {"address": "QZmJ57fZrPxeHDTRo1zDDtjMi6e8Di8gra", "blocksMintedPenalty": 0}, - {"address": "QZmUhFSdcMMF3CuPWZpiqucSsyvRgvWg4n", "blocksMintedPenalty": 0}, - {"address": "QZmdBRSN2d5ZQDGjJT28cPRjHYkc2LZfpv", "blocksMintedPenalty": 0}, - {"address": "QZn2p41dafpAro4jGNENLnTaBHmU9ZzEMb", "blocksMintedPenalty": 0}, - {"address": "QZnL5zSe6iG3sbFu6cPkKfDUwJNTHEyxGf", "blocksMintedPenalty": 0}, - {"address": "QZnkNN6gFhoy9e3fhsFCrgaYqAsNXSezp3", "blocksMintedPenalty": 0}, - {"address": "QZnprsmJZRwizTQKsaPTNDX5jDNTZQCJtG", "blocksMintedPenalty": 0}, - {"address": "QZnyhbqLRzYYWRTgUAqEzwYrNsD2oq6o88", "blocksMintedPenalty": 0}, - {"address": "QZoDesL4nR54Tf25uSqZRYP7Y2vcppfKCq", "blocksMintedPenalty": 0}, - {"address": "QZprtc5E7T2C7JzeWeZAasF79jX3v87ek5", "blocksMintedPenalty": 0}, - {"address": "QZq1tx9nwJYcvnmHpAo5nY2L3m9TRLHyDQ", "blocksMintedPenalty": 0}, - {"address": "QZqGgQoy5Kd1UZDfdpwV1tRuQ1t6cEtM8J", "blocksMintedPenalty": 0}, - {"address": "QZrYvYMfrJJNjv8oxiZFq9XNPfwb4muvsH", "blocksMintedPenalty": 0}, - {"address": "QZrd8kE5ztSVEmAwdrafixB3bfQrKfYzNV", "blocksMintedPenalty": 0}, - {"address": "QZrjmemLnVekb7SWG1DEStD8HDkVqiA9pK", "blocksMintedPenalty": 0}, - {"address": "QZs94ZQHduxKkucmgSSC7tuWpkDwFUZiZq", "blocksMintedPenalty": 0}, - {"address": "QZsPhj9ng3x6ZjQVtMUVPtZU87RriwwS7R", "blocksMintedPenalty": 0}, - {"address": "QZtVzTqPwLj2XSoZM2UEL11p5aC78S37dp", "blocksMintedPenalty": 0}, - {"address": "QZtnxkkDvnjXPZhhBLU4z6ju1NgdcYJyJ7", "blocksMintedPenalty": 0}, - {"address": "QZtoRcFanrwX5n1uuLERRRbQ2NZxo5JTbV", "blocksMintedPenalty": 0}, - {"address": "QZuEhsoVq5R5SnWBNnwusPTd3ccVeBYWwa", "blocksMintedPenalty": 0}, - {"address": "QZuZ5xyyutkhtzE1G2X4nj5VgtPxpPEpbL", "blocksMintedPenalty": 0}, - {"address": "QZumYi18RmTaMewRvMFL2FNSShfWYnfA1X", "blocksMintedPenalty": 0}, - {"address": "QZvoHf48upkABYfhEYssvizA7G3iGP71Jw", "blocksMintedPenalty": 0}, - {"address": "QZvxVPGX2ZjbcUmozHTuk9uCEGfw9CieTj", "blocksMintedPenalty": 0}, - {"address": "QZvyeekGR925qWf34XVZMQZyZ3scCmBjan", "blocksMintedPenalty": 0}, - {"address": "QZw5fXM42Te6iGLGpyr2dxe84XAaL1RDTr", "blocksMintedPenalty": 0}, - {"address": "QZwDyBW7fDQcmimfcKef1u1ZmRY3aWa1LD", "blocksMintedPenalty": 0}, - {"address": "QZwMnBQmAqfod2UyJQRytY5RpD9xWfuEHe", "blocksMintedPenalty": 0}, - {"address": "QZwxrpQsBFhfuPXWGCYtjBqiybk9gEo233", "blocksMintedPenalty": 0}, - {"address": "QZx7De8qnvA29r239UhGKj1BiUYEoDFpPb", "blocksMintedPenalty": 0}, - {"address": "QZxJaSbYSG6bpSsVcTDcybUNuXzxh7ojrU", "blocksMintedPenalty": 0}, - {"address": "QZxRpPUbQ1rJKu522s1yRxNiNQhDGGHiEv", "blocksMintedPenalty": 0}, - {"address": "QZxqbgXTSxtPhY1RA9ygxwKtFjuqVpfNS5", "blocksMintedPenalty": 0}, - {"address": "QZxy4XebhvuihpcyP31o7B3Lk6SKdnodnk", "blocksMintedPenalty": 0}, - {"address": "QZy2uH98rPsz2HkHcne6Esa73WneoJDnx9", "blocksMintedPenalty": 0}, - {"address": "QZyJBebcPx26JC6kQSdFC8Swrxxy9dbXBQ", "blocksMintedPenalty": 0}, - {"address": "QZyMB9De4Lw1zjrXnkM2xnccAWcMLZXtoi", "blocksMintedPenalty": 0}, - {"address": "QZypJTSRQYSXTNmernVRgcSpQrN7E7MGae", "blocksMintedPenalty": 0}, - {"address": "QZz4wZWhcxXPNV2xfSRpf39P8PGEmNJFQu", "blocksMintedPenalty": 0}, - {"address": "QZzWnYGbLKZqxyfTbDsFDp8PHchR9MjVRw", "blocksMintedPenalty": 0}, - {"address": "Qa1EVbUuKRp6FsdLmE53SaE7WTJU3wJkjf", "blocksMintedPenalty": 0}, - {"address": "Qa1Lse1C2BcJjUeJ5yx3jLkpgTbRattmDk", "blocksMintedPenalty": 0}, - {"address": "Qa1Nx2cCmGqJkJbXa7aP7JirPTWpdUZqx5", "blocksMintedPenalty": 0}, - {"address": "Qa1cEqZH8JpaeG724f298FH31LeS4ns2bM", "blocksMintedPenalty": 0}, - {"address": "Qa254wkM3x6pRsmF6h8RLFy4sJ28khNxxG", "blocksMintedPenalty": 0}, - {"address": "Qa25woHuDgVntN12Li4JsaFEBjpBZznGVm", "blocksMintedPenalty": 0}, - {"address": "Qa27e2udMmTtFB878hzQiGYLWjcsy3pgdf", "blocksMintedPenalty": 0}, - {"address": "Qa2KDh3EajjFr1nXM5JUsCxA23cQ1FNYYq", "blocksMintedPenalty": 0}, - {"address": "Qa2LqhMP6kQDgozizzDsJw3gdWZTcUfA56", "blocksMintedPenalty": 0}, - {"address": "Qa2R43pWRK2TtVU8HcieNYEkdJKVmUUARr", "blocksMintedPenalty": 0}, - {"address": "Qa2RoGKYS89jGFqp9Xp2mxjWYmPAbk7KC9", "blocksMintedPenalty": 0}, - {"address": "Qa2qHbDPZ7BBp3veVKbDR3BJXY85R3LzpH", "blocksMintedPenalty": 0}, - {"address": "Qa2uSt77LS7NVMzHvf8LZUBqC6PDDTuiBQ", "blocksMintedPenalty": 0}, - {"address": "Qa2w84HpoD2iwvdJWibJB6xSPFQj8sAEbA", "blocksMintedPenalty": 0}, - {"address": "Qa3BxTTRPVXXfNAqMxZ8CF7v6JqzAtBL7V", "blocksMintedPenalty": 0}, - {"address": "Qa3HrzpBc3bnixz63pPkXdqxQnEBYNKEKc", "blocksMintedPenalty": 0}, - {"address": "Qa3VmkdqXEtz3hoc7UL4YecWPb7uUQF61R", "blocksMintedPenalty": 0}, - {"address": "Qa3qSNoCtoMyerod8hWZRoAaDEpuxnQtzu", "blocksMintedPenalty": 0}, - {"address": "Qa4ZU7vh6mrYWZyyH77mWkhdVyx4R7q242", "blocksMintedPenalty": 0}, - {"address": "Qa4dPFTBvCAg9skJJvXYfWo8QrH2gL8on4", "blocksMintedPenalty": 0}, - {"address": "Qa4pVh6dXtAVUtv2BfCGt6FsocDWweUckH", "blocksMintedPenalty": 0}, - {"address": "Qa4qngyt8ZJyXTvt1R75KDtbU9PLhAfNJL", "blocksMintedPenalty": 0}, - {"address": "Qa5aEy2oaEYJpW2DxQBsmYVReyKxVJ8d42", "blocksMintedPenalty": 0}, - {"address": "Qa6GUCjgzvGk9rLGU8uN6yNjVaH8FTarCr", "blocksMintedPenalty": 0}, - {"address": "Qa6eQNECS56zuCHUxWD7iUD6N6RZSvULjT", "blocksMintedPenalty": 0}, - {"address": "Qa6wR4ac3QerYE69sE2HqDzj6WK6hu1Gh1", "blocksMintedPenalty": 0}, - {"address": "Qa6wgc5FPQ12wgxQxsX4fnR5Goci6gpZBZ", "blocksMintedPenalty": 0}, - {"address": "Qa7i9hKWMxBy8eb7e6cU5jdoixi36HsLBE", "blocksMintedPenalty": 0}, - {"address": "Qa8HEsqCavw9GvRcGbozT39tTsmh2yFxWK", "blocksMintedPenalty": 0}, - {"address": "Qa8HxybT5v39Ur7gHgweJ8CEPPRuuE7xbM", "blocksMintedPenalty": 0}, - {"address": "Qa8KcQkSn3r7Tx8EijvB6CMCPm1YCKTjyw", "blocksMintedPenalty": 0}, - {"address": "Qa8VwCydZRWpFDCwKR2B5fEbmi4z3o1XXu", "blocksMintedPenalty": 0}, - {"address": "Qa8dkhXswkZEq92hVW4z372Q6KGGqdYNDb", "blocksMintedPenalty": 0}, - {"address": "Qa9eQX5nZiFdgBK3AJ6oEgKAmZWqSVKBbi", "blocksMintedPenalty": 0}, - {"address": "Qa9ivi9c4zMwbsZ19cxE8r5hu1Dz7ueaB5", "blocksMintedPenalty": 0}, - {"address": "QaAGqZsQYTcfuJFzU7TiNT5HpLNrdhdLng", "blocksMintedPenalty": 0}, - {"address": "QaAJVrYo827cguYt6p19erCJzJ6Suns6gs", "blocksMintedPenalty": 0}, - {"address": "QaARzmBZhceibaw2Esg8qs9CeXAc3ZMyQP", "blocksMintedPenalty": 0}, - {"address": "QaAScrLb1Zas7xaST3Lb4W7wh1JNhS86jT", "blocksMintedPenalty": 0}, - {"address": "QaAVZSGFpWZgfXGxemwRHb981qAjEWxU5j", "blocksMintedPenalty": 0}, - {"address": "QaB1cS3sy5EPdkQEcoB8hQhMhfX1wcqYo2", "blocksMintedPenalty": 0}, - {"address": "QaB2VFqGmeueCVcgcUvtmmqZobR9KqMoEp", "blocksMintedPenalty": 0}, - {"address": "QaCe786j5uPNus6AFfreokVaUGARmBCpaC", "blocksMintedPenalty": 0}, - {"address": "QaCkFeLX2PaghdhAwGtozUVFLfxzk9CwkF", "blocksMintedPenalty": 0}, - {"address": "QaCuSaChjMA9vPToTnsdnR3apmU7inHZNe", "blocksMintedPenalty": 0}, - {"address": "QaDEJyw6TRE8uHZjiYy3BQRFEpn92t9AEy", "blocksMintedPenalty": 0}, - {"address": "QaDXZ6vQsc88MhDQuN8kGxf4P1Tz5GBWKE", "blocksMintedPenalty": 0}, - {"address": "QaDa4MHyXrfD91YLGJ8PJT7Mfi9S3Rrp14", "blocksMintedPenalty": 0}, - {"address": "QaDvvhWopjRqorSMkBBLMzzJFNyT9S6bpw", "blocksMintedPenalty": 0}, - {"address": "QaETMWd2WUfWG3egxNZRvnWdBAMQRX7ctG", "blocksMintedPenalty": 0}, - {"address": "QaEohSdfWaHiVffkbVrme6Qen5QSqFHz9h", "blocksMintedPenalty": 0}, - {"address": "QaFLNKNz3K2BoMHmZFBSPMmxLfZTXR3Jpm", "blocksMintedPenalty": 0}, - {"address": "QaFST2gwDQipk6Wb7ttoqxSm1RTkYBVdvM", "blocksMintedPenalty": 0}, - {"address": "QaGEDJ6cctNg57nxHnKd3VzRRbc7HjdT2M", "blocksMintedPenalty": 0}, - {"address": "QaGEpi4UMZfgugUg99Uno3Ek2fG5vDqXrf", "blocksMintedPenalty": 0}, - {"address": "QaGje5U5tgczkxXDreFhsXHk3aT6hUT4Vc", "blocksMintedPenalty": 0}, - {"address": "QaGwARLib97mtnTEjdxmdh2oZrPPjeH4Ms", "blocksMintedPenalty": 0}, - {"address": "QaHLnJeW6XB1wZsdZB6TLXFmNCciyre4gY", "blocksMintedPenalty": 0}, - {"address": "QaJ4UxNdAB2iZ7D7KmnUSXFHswjeViXuUW", "blocksMintedPenalty": 0}, - {"address": "QaJDMSWpJdzJhwzqDuwaDmuSSyAyP3oMuU", "blocksMintedPenalty": 0}, - {"address": "QaJGaUyncVTMVrR6fPCaFnGRUmzJWb7rgJ", "blocksMintedPenalty": 0}, - {"address": "QaJarJeBy3WpYPCkwfVkFSoW4SPri7iwd7", "blocksMintedPenalty": 0}, - {"address": "QaKNQyG5wf7yEGT77EXHgDymzmqCXDPYtW", "blocksMintedPenalty": 0}, - {"address": "QaKhDTSy9zfFJL1ZXjPWcjnpJPAjevLT99", "blocksMintedPenalty": 0}, - {"address": "QaKteLMEHkvP5fM5Y2LuV15QZN64zVS9zk", "blocksMintedPenalty": 0}, - {"address": "QaKw56VTVp2WydpjWYYudJokr5vEfajQMX", "blocksMintedPenalty": 0}, - {"address": "QaLDKyeHR1qnuoacFaiDCPBuKwX7zoVyHC", "blocksMintedPenalty": 0}, - {"address": "QaLRrcyEqHMcn8VQLHjuxWs38xw5F7pyrt", "blocksMintedPenalty": 0}, - {"address": "QaMPYKAj425YPsowBHD5bS9Q1bckevfgJs", "blocksMintedPenalty": 0}, - {"address": "QaNJe5n75c6iyoFpg9CpeNfCgDhoB1eWt1", "blocksMintedPenalty": 0}, - {"address": "QaNUqPaJ7xEBdfkqfygTR9MFAVSibjpHBS", "blocksMintedPenalty": 0}, - {"address": "QaNrsUDNLdEQdtngjyvA2LJgDFfhZofsjj", "blocksMintedPenalty": 0}, - {"address": "QaPETfEkeXiNrfecbjF9XnUpvTCjeDbBbp", "blocksMintedPenalty": 0}, - {"address": "QaPJWFU7H6hWBnb7DdyPRBAnq9pZuHWqdL", "blocksMintedPenalty": 0}, - {"address": "QaPZDJfw41uJPy4KbTj2T3LnmE7TQb9TLG", "blocksMintedPenalty": 0}, - {"address": "QaPm97TMqtjWMN9HnWHDPDUoVSUNgZYwqJ", "blocksMintedPenalty": 0}, - {"address": "QaPssWoXxnJzPaLBusFUNPSKu9C2MKa3yC", "blocksMintedPenalty": 0}, - {"address": "QaPwqWVEGRi4FmVwtcqkmWtrUXkupFVbDx", "blocksMintedPenalty": 0}, - {"address": "QaQ7AV3ctm3KiLxNam93433bh5gjmZLqvZ", "blocksMintedPenalty": 0}, - {"address": "QaQAgS8J75h5P5xHRJ56dcMg4JQPUu7mdv", "blocksMintedPenalty": 0}, - {"address": "QaQBWFRAvhzF6SkoY7M3RNrMJZQXxs6Zhf", "blocksMintedPenalty": 0}, - {"address": "QaQQS84EMssptEs65ehAsU64LBLwhsUSiq", "blocksMintedPenalty": 0}, - {"address": "QaQSUP3NHnZJ7mq5bPYuaEdWUUyCJdSinj", "blocksMintedPenalty": 0}, - {"address": "QaQdUeAbuqqbYvLqrjSyePUeHh3Emu5m8b", "blocksMintedPenalty": 0}, - {"address": "QaQqyHAjMUJ8Md7oy2UzpdVkXkajS92aMj", "blocksMintedPenalty": 0}, - {"address": "QaRaQCgR5R5jZA4fg7VcXY2kUFCTiuRpdW", "blocksMintedPenalty": 0}, - {"address": "QaRitcZ8RNUMPFRHDfwYppV7L1ZcYhe38Y", "blocksMintedPenalty": 0}, - {"address": "QaSmwfr3u3tCirZpEtn2GLU69GZviDsK4V", "blocksMintedPenalty": 0}, - {"address": "QaTDFcDkZxAD3KoHaU1ZkBmgEyfzA7SXez", "blocksMintedPenalty": 0}, - {"address": "QaTPgeVPi3nYUm6qPouxYVQ1PMeeS63kY7", "blocksMintedPenalty": 0}, - {"address": "QaTSRv9gEqAEtFZysjNbh5Rdxwi8iJ3vWv", "blocksMintedPenalty": 0}, - {"address": "QaTUcyvyTjBoSE3x9zD5FeoUJ3Pqhf3V9p", "blocksMintedPenalty": 0}, - {"address": "QaTYPV7ptx9YhtJMZ17N2ADZn2y8QK71bN", "blocksMintedPenalty": 0}, - {"address": "QaTbDK8DvU9KDizkZhSAK967VzhaCZb3SD", "blocksMintedPenalty": 0}, - {"address": "QaTkFTcn4xu9yg17WkVQpyuEJp6tgahYVa", "blocksMintedPenalty": 0}, - {"address": "QaTsgBgV3FWi4aLoEDaCWZx4QR7Py4Au6M", "blocksMintedPenalty": 0}, - {"address": "QaUQ8oGmeqCJamjrr8ACnniZ1VwBxFcnVE", "blocksMintedPenalty": 0}, - {"address": "QaUQL141bZKDMqvzCLfuoygrvdS2E3AbeB", "blocksMintedPenalty": 0}, - {"address": "QaUVgDZYyfMrSiWfAjFL38wKagDQbBZfvZ", "blocksMintedPenalty": 0}, - {"address": "QaUYiCigsfF2CwFJHUZZwiT1g3vqNipctD", "blocksMintedPenalty": 0}, - {"address": "QaUzSZZSdBxX8GsqUvuh7DUxHkDKoedYB2", "blocksMintedPenalty": 0}, - {"address": "QaVFQD1z9X4m7MyKZ2KrwG3wdbYFAGxVvk", "blocksMintedPenalty": 0}, - {"address": "QaVN256MDPWQ6PmiD6VW2HWBkvWDH8pfto", "blocksMintedPenalty": 0}, - {"address": "QaW6mybrzkRvU1XhvEbNQGEyTULrjRfYCH", "blocksMintedPenalty": 0}, - {"address": "QaW6zsALZnoGx1CTSzMY6QWsRBfdNVPYfi", "blocksMintedPenalty": 0}, - {"address": "QaWP6TexKTiVcpkYB9aX2zA21EaXPTH8o5", "blocksMintedPenalty": 0}, - {"address": "QaWSJ5hyTx8LjcNd8UbjVLGYmSkeF5QEsX", "blocksMintedPenalty": 0}, - {"address": "QaWWZrQmSze4WJ6Wsw3pLNdzEWKZqdJZuF", "blocksMintedPenalty": 0}, - {"address": "QaXJqp3Lgsoacs6UzHCRa1eB8pheeGeVm4", "blocksMintedPenalty": 0}, - {"address": "QaXNKpYQnRUdVgWQ92UDaX5pKf3dQnLbHa", "blocksMintedPenalty": 0}, - {"address": "QaXb5dZc2AAgJuhAyekjonC1HZzCkWWA45", "blocksMintedPenalty": 0}, - {"address": "QaXzJUar9ZkXGTqo6sT1TFQPDYmEbUrrqt", "blocksMintedPenalty": 0}, - {"address": "QaY3yXMw4ruev6hkk1VZNGpVQe3njPGSP8", "blocksMintedPenalty": 0}, - {"address": "QaY6zAe2kMs9Xpx2LqTSUn5atA6BeJmVo3", "blocksMintedPenalty": 0}, - {"address": "QaYfaCU2J4tgKq4HxgqSLhi6hHC1gdDas9", "blocksMintedPenalty": 0}, - {"address": "QaYiEtB1pd31igJRFUGY72wvhuka8otK84", "blocksMintedPenalty": 0}, - {"address": "QaZ3wLycuCMzxbhynAj6XWZKLi7mG8FEeP", "blocksMintedPenalty": 0}, - {"address": "QaZTMGUjhgcjq6q1sWrMBgeFydC3wFZtyV", "blocksMintedPenalty": 0}, - {"address": "QaZs97g4Mbq9tXMoBWbhw3jFvBBVkWKS5F", "blocksMintedPenalty": 0}, - {"address": "Qaa9FTpjm3GseofKy66LBXLRzPN5qy8o8e", "blocksMintedPenalty": 0}, - {"address": "QaaQgZqRwxPCZiT5x6vrZDvncVVBJMrYoX", "blocksMintedPenalty": 0}, - {"address": "QaaUV36iNBWwmEjmtVRpJYF4YAz5TZyQhr", "blocksMintedPenalty": 0}, - {"address": "QaaguPH622PPEUwwBVMkZWPfMw6Q2YHu43", "blocksMintedPenalty": 0}, - {"address": "QaatHHnyyMiR6xpfWZNaYAB4yqELHrGExK", "blocksMintedPenalty": 0}, - {"address": "QabX5saT6FFJ71S9RobtMtkD9Z3f3vcmC3", "blocksMintedPenalty": 0}, - {"address": "QabatMoTRdS3S9q2eAdzfYgf9Zb7tQvzds", "blocksMintedPenalty": 0}, - {"address": "QadPNKeEJtHuhQGCDssEw7emUuMAMxxhrU", "blocksMintedPenalty": 0}, - {"address": "QadUhTL1KJjNRkGotmHSNigCVKmMrQ8un6", "blocksMintedPenalty": 0}, - {"address": "Qae8HRLVNG65KJHPE9EijyEybL8fCq2wJD", "blocksMintedPenalty": 0}, - {"address": "QaeEWW1nZXDdPenNx7Avws9LiyJz3BGGrC", "blocksMintedPenalty": 0}, - {"address": "QaebrKYe2PnaJ1uHgLyJxa9FwpPvVum5Dr", "blocksMintedPenalty": 0}, - {"address": "QaeobW8ymA57enmoKJhqbiCQjX2eq88WoU", "blocksMintedPenalty": 0}, - {"address": "Qaeq6jNApYuscWxGm3t5ZNmebggCsNwrKX", "blocksMintedPenalty": 0}, - {"address": "QaewnyCZPTevdtAzNS2i8oWiWtAe9GAuAe", "blocksMintedPenalty": 0}, - {"address": "QaezHBEVzK2qySeJsUcsYGYjy6pdNwRBHh", "blocksMintedPenalty": 0}, - {"address": "Qaf1tpbkC7Qe2DWD9KRbFFT2XCLkNh4z7W", "blocksMintedPenalty": 0}, - {"address": "QafL4Fz91h2WtTABFXpqTdRQGXQSQg5Uae", "blocksMintedPenalty": 0}, - {"address": "QafdEhT1tdUqUxYaSwJWZ7TpYEV1YqGaya", "blocksMintedPenalty": 0}, - {"address": "Qafn5bRbfUxfBsmMUjGbsrM2QYJ1uFY3xf", "blocksMintedPenalty": 0}, - {"address": "Qafr6irZ4eYS23wRxUB2E6tSf1Kpb3tQhw", "blocksMintedPenalty": 0}, - {"address": "QafsorF8UCUj2BTXEWeMwa4Y24y6vFCNDd", "blocksMintedPenalty": 0}, - {"address": "Qag37cFWNEdTzd3AJhp5VpKb9mhDZSK7Rt", "blocksMintedPenalty": 0}, - {"address": "Qag6aYpwhXjZbymrKjhA8C1YkUyVsgC5e8", "blocksMintedPenalty": 0}, - {"address": "QagWjzQzTAvcBfsNWNW4yM6dm7zM9EkGWg", "blocksMintedPenalty": 0}, - {"address": "QagXjkcB1VTCzxgRVsCGmdPwqpcyy1CTar", "blocksMintedPenalty": 0}, - {"address": "QagYZj9khYgZCDeLfowAn49LegpLRT8Foy", "blocksMintedPenalty": 0}, - {"address": "QagZduEap5snXNPB8PNC65XxdHGdUbkBRu", "blocksMintedPenalty": 0}, - {"address": "QagbdpFk5mYMJc6Uy83dmt3miixyXJqnFN", "blocksMintedPenalty": 0}, - {"address": "QahQL1dnT2M5uBDY8XTfZ7NUmBwT5w6ZAk", "blocksMintedPenalty": 0}, - {"address": "QahZ1xN3tRn3SAxrSeSAz6RDt87CEK5gE5", "blocksMintedPenalty": 0}, - {"address": "QahcQP35xFpeiJeaPMyhpJLPfL9hC1Es1h", "blocksMintedPenalty": 0}, - {"address": "QaheJzoz3hmzLKdC3pC9SPQifukCsjw8FJ", "blocksMintedPenalty": 0}, - {"address": "Qahri32GJwEk8kKywV1PsYhQKV5xKxFzss", "blocksMintedPenalty": 0}, - {"address": "QaiYqcEAyPe7Lfn82n1RT2wVxdsai36Q1n", "blocksMintedPenalty": 0}, - {"address": "QaidTVFB4RxE7F1szg4uNdpj19gUJWmCsJ", "blocksMintedPenalty": 0}, - {"address": "QakK9cM2KcBnA1GWsu8peii6e1S41dQaHJ", "blocksMintedPenalty": 0}, - {"address": "QakKrwnxnoiCuFaN1ptZBZeFVeVysdSsZr", "blocksMintedPenalty": 0}, - {"address": "QakZANSJUUr33mdwpUAgcVo1gUC2NYcoG9", "blocksMintedPenalty": 0}, - {"address": "QamPG8YCd7GVo8Zafxz4hg8GYdASo5H9V5", "blocksMintedPenalty": 0}, - {"address": "QamnzfeiTFkGXP75ruo7L6MbtgVMgafGSv", "blocksMintedPenalty": 0}, - {"address": "QamwyCwWcetN5PAajY8ejeCiLQdY3szgKi", "blocksMintedPenalty": 0}, - {"address": "QanLSXme9N8J2Bndq2kZTweuJZTdZMWqJD", "blocksMintedPenalty": 0}, - {"address": "QanMNBoXTuvn6QRqhSAqbUNtYTHYaBqJuK", "blocksMintedPenalty": 0}, - {"address": "QanMwjDmFYoyeJFjbsgH36CnJvC6qxLWzb", "blocksMintedPenalty": 0}, - {"address": "QanZr1xc7aESRWrkb2KiPQNqvjeLsc2qdi", "blocksMintedPenalty": 0}, - {"address": "Qane1QRvhg8XKc9AwthuZybkjT4Jm3VV9R", "blocksMintedPenalty": 0}, - {"address": "QaoFigmo8eWA8jd2M9T9JVDc3at7YughPY", "blocksMintedPenalty": 0}, - {"address": "QaoSHrU6TchUPFaPvvGKAfYFa76Crd6R3Y", "blocksMintedPenalty": 0}, - {"address": "QaoZw8iWvukJxY6d4L6DhMVBM68cH3P3J5", "blocksMintedPenalty": 0}, - {"address": "Qaogm2W6GEUwVaWFQBPAMzNZgQFTzH2uir", "blocksMintedPenalty": 0}, - {"address": "QapTWgpzN4nxMvCTg6V9UmeiCfrbydtx1Q", "blocksMintedPenalty": 0}, - {"address": "QapUQDAHayXNn15WoFrkwRtuRJ9M3sT9qv", "blocksMintedPenalty": 0}, - {"address": "Qaq4sV9wkdSSSgJtaPuuSV15tqsVPD78rz", "blocksMintedPenalty": 0}, - {"address": "QaqEBdzHeGz6rBn2rkgkJyyMHVAbLC1Kaq", "blocksMintedPenalty": 0}, - {"address": "QaqgqA3ZT4mby2RCEKpy4uLoK22xz5sNZG", "blocksMintedPenalty": 0}, - {"address": "Qar4VdQhxbHiKybaPD3kWH66Z4JqS1GqYv", "blocksMintedPenalty": 0}, - {"address": "Qar4W6fo9SUaPE6v69Mr7xBJMwnyuJWHQ9", "blocksMintedPenalty": 0}, - {"address": "Qas1cQ5HZxdrXSp4Y5wkvkA4BWzbxiTw38", "blocksMintedPenalty": 0}, - {"address": "Qas2gqRefX6MZrxUzXU8BsXWQamUfKvKcj", "blocksMintedPenalty": 0}, - {"address": "QaseLQG3NBQRfposggsrTvfBg6WNiPYaQi", "blocksMintedPenalty": 0}, - {"address": "QastuxrMVpDBCEZjfcvCxUyWWDcK7RiJHP", "blocksMintedPenalty": 0}, - {"address": "QatWTgE1iBrTiVSuH4U5EpLYdX7cN8eZBk", "blocksMintedPenalty": 0}, - {"address": "QatuyGYfBfHChQWSe24n3PtenvaaH5UEpw", "blocksMintedPenalty": 0}, - {"address": "Qau1G6RsVSHxipDAXXuViausTsUngnTH1h", "blocksMintedPenalty": 0}, - {"address": "QauR42yCkvuvA1rkJ328F5J8F8oY3ECWk7", "blocksMintedPenalty": 0}, - {"address": "QauhfAwtrreqyukFpT9sqSUhBrPq3vwZ5y", "blocksMintedPenalty": 0}, - {"address": "Qav3PBFdXVkMmyFmTugvSR5o1sY9fEKxtr", "blocksMintedPenalty": 0}, - {"address": "Qav65JdjPzDzUTc1NAefUsPiTqNptfQoKq", "blocksMintedPenalty": 0}, - {"address": "Qav6MHPUmD7CXWFbDJpGAfhEycRHVnvvp7", "blocksMintedPenalty": 0}, - {"address": "Qav6hGarjjX5V229u69wUNcgGPboZEMokP", "blocksMintedPenalty": 0}, - {"address": "QavCfxzdLvNBTYv7qmNVegESXM9DosSGp9", "blocksMintedPenalty": 0}, - {"address": "QavGR3NCMcsov5CztZpQf7gVbgZpoQ14YX", "blocksMintedPenalty": 0}, - {"address": "QavWbYoEFzarUXTVSndkL5zSj9o8bAwbtj", "blocksMintedPenalty": 0}, - {"address": "Qavbj9AafgbVwE2egfnJATnRZNwrTFznBo", "blocksMintedPenalty": 0}, - {"address": "Qavv8eppJmMGcwCZeoFUevvk8wAokRVZXT", "blocksMintedPenalty": 0}, - {"address": "Qaw2GtxxGfmTL56JyvCZc2nbBvpPqfRofr", "blocksMintedPenalty": 0}, - {"address": "Qawxhpvrg66fvfs43p6pFoKJUSoRC2aWT4", "blocksMintedPenalty": 0}, - {"address": "Qax8NXN3jBmq1fAm7tSEgddC6U2fHnwac1", "blocksMintedPenalty": 0}, - {"address": "QaxWgcGGDTn8yFWt4VB8Vo7b9wYhMmxLHJ", "blocksMintedPenalty": 0}, - {"address": "QaxWqkhhQMR94o9d2tpCrHFpzYU4xHAWdJ", "blocksMintedPenalty": 0}, - {"address": "QaxfmJeb5ouMBZQzyuYvjHSeebtMjSyiXb", "blocksMintedPenalty": 0}, - {"address": "QaxovnxXmBA2byxSk6K7Y8jc2T7fJhxbpy", "blocksMintedPenalty": 0}, - {"address": "Qay8Jr8XDKCJDsHnCz55ygWBVSzBePvp4Y", "blocksMintedPenalty": 0}, - {"address": "QazPMfYNeyLUnuRAFVqQnTDWUeEBKTgMK1", "blocksMintedPenalty": 0}, - {"address": "Qb1JTcRripw154AVokeZDshdRpdyUptANF", "blocksMintedPenalty": 0}, - {"address": "Qb1bojhojdejq8jVFJRiy1uWhc685nHGWj", "blocksMintedPenalty": 0}, - {"address": "Qb1nXucp894bdbC3PtVpjTF2T914zZwXMG", "blocksMintedPenalty": 0}, - {"address": "Qb1zbSPJ6iH4EttuBkfT2d5bGuWjeTVD4g", "blocksMintedPenalty": 0}, - {"address": "Qb22jhC6eajMm1FLUds1UgJjP9qgtnMrL1", "blocksMintedPenalty": 0}, - {"address": "Qb2R5cBDCbK5gUQJtu6AwMdkxihoR43imu", "blocksMintedPenalty": 0}, - {"address": "Qb2RM1pP6MYutLsUqp7noeirfT2Ln9CBr9", "blocksMintedPenalty": 0}, - {"address": "Qb2cS3oMFZQk3CDbxQWPqvYk8RALLYc2Vh", "blocksMintedPenalty": 0}, - {"address": "Qb3gzpq7UN9zrvYtYrQiNtrDGt7UiZVQXZ", "blocksMintedPenalty": 0}, - {"address": "Qb3txzr23HPno2UVZFEBH5veErY3t5hZ1L", "blocksMintedPenalty": 0}, - {"address": "Qb41X7oRCMUaHfQVjrZXt1mjeKp7ZtWgVP", "blocksMintedPenalty": 0}, - {"address": "Qb4CrZBsFvoQvau3rydRxAAKgg5CRs5M2N", "blocksMintedPenalty": 0}, - {"address": "Qb4EitiqpEvGWbD19azvtdiQ6CbZ1v8TXA", "blocksMintedPenalty": 0}, - {"address": "Qb4TL36LbP9Pi7RgYxUFUHBxg1zfpJMDFz", "blocksMintedPenalty": 0}, - {"address": "Qb4eRuTXsitc22PXpnSrN5EUDVxgeHXxVc", "blocksMintedPenalty": 0}, - {"address": "Qb4nhNC4YjjA3jtTnbWP3CgPgUymn6H5fJ", "blocksMintedPenalty": 0}, - {"address": "Qb5RQKMH2jt8mL65R6rMGGJgp1vq5DhJWP", "blocksMintedPenalty": 0}, - {"address": "Qb5arHBdEF2FzycGWaZhTULotFRihfMeNx", "blocksMintedPenalty": 0}, - {"address": "Qb5sotDYxYvwCLKCzyVXfbJhggtBvuUWmC", "blocksMintedPenalty": 0}, - {"address": "Qb6FkscLJiRfk4cSnn7ux1UHTfJswtUgAV", "blocksMintedPenalty": 0}, - {"address": "Qb7KvT93sn5wDbrdgcm8rJZXNwJTsuhJ9w", "blocksMintedPenalty": 0}, - {"address": "Qb7xDGyipxw3Y1prKHd2tRkGTsNzbupiTL", "blocksMintedPenalty": 0}, - {"address": "Qb87H29RhLDUS5LsGnSkbudjsasr1U1ukT", "blocksMintedPenalty": 0}, - {"address": "Qb8n1duaHSVxdWcSxbgnMyYPPyWEJ6r3ZX", "blocksMintedPenalty": 0}, - {"address": "Qb8nPKXj4gyZwnz3vixJZc7BPcC3vYnunW", "blocksMintedPenalty": 0}, - {"address": "Qb9i5m5cqpb2oLWwM2EfZfNEaThZEkj9xz", "blocksMintedPenalty": 0}, - {"address": "QbAquzoesdwZNbnow2FUfU9cW8j67y5Hkg", "blocksMintedPenalty": 0}, - {"address": "QbB2dxrSf3otWX383kePXn8jDgeJMmFpt3", "blocksMintedPenalty": 0}, - {"address": "QbB5AXpiRMaxvd1DCYKyzhP43Anh5jvjch", "blocksMintedPenalty": 0}, - {"address": "QbBBwNoQDsFGq4e7A6Un9pYDE5mHNuV8BN", "blocksMintedPenalty": 0}, - {"address": "QbBS1wFkobstQkF7uTZKL8hMJy97Nd8qPM", "blocksMintedPenalty": 0}, - {"address": "QbBfmzFFrc6npj9NuojCNSEGg3U6gaqZbz", "blocksMintedPenalty": 0}, - {"address": "QbC35RyMdrUhZqdku6Nn9RyCrsc75wz91v", "blocksMintedPenalty": 0}, - {"address": "QbC5PSiKn9ovAf9F1txYYoe6khz7ED5vKr", "blocksMintedPenalty": 0}, - {"address": "QbCA6u56LSNXGh9n1faSrk8Ui5VcmQPuJs", "blocksMintedPenalty": 0}, - {"address": "QbCSJiCg3jvxG4dnxREQYjDLyq5kNAHJhj", "blocksMintedPenalty": 0}, - {"address": "QbCVNnksmMPtQ26VQXZSsSjLzghSCV4S4m", "blocksMintedPenalty": 0}, - {"address": "QbCWBnpcqD2BAHahnpxR8w1Hy98YDZezgX", "blocksMintedPenalty": 0}, - {"address": "QbCyJxVMfdQc3g7RXDAMRycovkpnFJbrMk", "blocksMintedPenalty": 0}, - {"address": "QbDPJwd1nSUaXjSeGTjLpJWE2KbzFwis8d", "blocksMintedPenalty": 0}, - {"address": "QbDTLcCqaoWoqEGvCQmJHbqAebBzUys3Zz", "blocksMintedPenalty": 0}, - {"address": "QbDn8DDF79c8jt9apSt7yY6JwPEaEY98bZ", "blocksMintedPenalty": 0}, - {"address": "QbDyuqXcZCvj5TVopEbw9Zgi6WpW2WLZPe", "blocksMintedPenalty": 0}, - {"address": "QbDz8xYs3e5p4rw1cPR3AGpv3nGb8kN5n6", "blocksMintedPenalty": 0}, - {"address": "QbEPo8CH6xdHhsEW6PCQcTBcyTnD4meWgn", "blocksMintedPenalty": 0}, - {"address": "QbEQZFX3YQj5LwsboP9VutWNDedK4Kv37R", "blocksMintedPenalty": 0}, - {"address": "QbFTGXZLb3XNd1gBjw5o4tGKhmvc8hJBUP", "blocksMintedPenalty": 0}, - {"address": "QbFYUEznLWzo63GmEQtFkTtPh3mq1ezqnW", "blocksMintedPenalty": 0}, - {"address": "QbFg2PteV2qP3kK8MFv4YWA4JiXT42pf9k", "blocksMintedPenalty": 0}, - {"address": "QbGaG8AWG2gGDSvK4Yega1Ahv2tMeZRc5A", "blocksMintedPenalty": 0}, - {"address": "QbHJD8BxN1kZJe25Y2SUPgL9JJh8D77hEv", "blocksMintedPenalty": 0}, - {"address": "QbHZiYCK1qwsKA9PJXwDEZyHSWeF58bKci", "blocksMintedPenalty": 0}, - {"address": "QbHj38AHySrhvBJVxVWQoBvzAKxhctyw6V", "blocksMintedPenalty": 0}, - {"address": "QbHnYbvN1XEh6oyFfJmGWSNTVu3zEW85Ap", "blocksMintedPenalty": 0}, - {"address": "QbHz6CtQWu83bb49WkoxDdA74f9QPCi6R3", "blocksMintedPenalty": 0}, - {"address": "QbJJho6sTHnqL2ECivtfUrYZTuEgemEha2", "blocksMintedPenalty": 0}, - {"address": "QbJNcfwBeaiWgrn95rdLEGdqRckFh3zLGW", "blocksMintedPenalty": 0}, - {"address": "QbJarEfewUcCJJ88mpTYUQYWkvK7uhejys", "blocksMintedPenalty": 0}, - {"address": "QbJerx5PgCN8ceTnBNpXjwUfNddZSaqydv", "blocksMintedPenalty": 0}, - {"address": "QbKV2Ekn6F6snsJFbczFqCrmRdQyDAvwnM", "blocksMintedPenalty": 0}, - {"address": "QbKjTsfFqm3SuTaV9mcgf4QHUA4iGmWCxq", "blocksMintedPenalty": 0}, - {"address": "QbKusF72ZA8bCR5pVbAM87co4PR1FT53P9", "blocksMintedPenalty": 0}, - {"address": "QbLX34r1Wb1mMr9DK4g2h6NN93qHeT3pEY", "blocksMintedPenalty": 0}, - {"address": "QbLY3yUNFqVNchbaYRv7mLGShfGPK4QbP6", "blocksMintedPenalty": 0}, - {"address": "QbLcczu6cyCCMvXGoHt1rLMMbWszfnuMvq", "blocksMintedPenalty": 0}, - {"address": "QbLf98i2wgG7tMQ4JFhyQj6RmLS3RQKv7Z", "blocksMintedPenalty": 0}, - {"address": "QbLr1VvprQHygUiopMGQgTaqXkKzrDcSfU", "blocksMintedPenalty": 0}, - {"address": "QbM71A14FYXXY12JDRXXJZdRVaUBXbhoBc", "blocksMintedPenalty": 0}, - {"address": "QbMrELosbzv1i83eSRo2GLH3CPWuSozSLu", "blocksMintedPenalty": 0}, - {"address": "QbNHbEb32gngEFQg7Vb5GDnnqkFMioAfYh", "blocksMintedPenalty": 0}, - {"address": "QbNWHNV6mkeyGZ35ppAKm4RQEpqbVw3qXp", "blocksMintedPenalty": 0}, - {"address": "QbNXB59yks5TXLY1UUMN5S38Qeayk5f3xG", "blocksMintedPenalty": 0}, - {"address": "QbNbCFoYkZR3QzRXCM4fWhuhnh9GCSWodD", "blocksMintedPenalty": 0}, - {"address": "QbNbrPx1gSxXadjnSR42r6qC7PN5c8cbiH", "blocksMintedPenalty": 0}, - {"address": "QbNcVYtQDNubi1pbBhrixYsuGQFZieQS6r", "blocksMintedPenalty": 0}, - {"address": "QbNhddEWWcDVft2hrD6Yhi3BqevH92AFHt", "blocksMintedPenalty": 0}, - {"address": "QbPjJHHEeGMfSPS1ycZtRjgfh4nQwPeaAM", "blocksMintedPenalty": 0}, - {"address": "QbQ4Rv8Pp2X7x1rgQuz1BLVQcQgyLw4SRF", "blocksMintedPenalty": 0}, - {"address": "QbQViGUfU5gTRWJ65doFNnGtZM7kwarYF8", "blocksMintedPenalty": 0}, - {"address": "QbQXegYrbA9igw2fHEhxZUymhtwra9XDR7", "blocksMintedPenalty": 0}, - {"address": "QbQXzgtdGzQ5BZvoksNPg4BZW2aKHmM3DD", "blocksMintedPenalty": 0}, - {"address": "QbQnd7EGkQRmBVkjpX9RikYF1MMpoCXNwd", "blocksMintedPenalty": 0}, - {"address": "QbRFvU4d4p6PM6PaVooT4aBK2h2acDfxRw", "blocksMintedPenalty": 0}, - {"address": "QbS3Y41m9VtUAhNYyfx2XHVFxjNQUghAjn", "blocksMintedPenalty": 0}, - {"address": "QbSCSLjN7Xgg2eSi1tEtVYqgRjqCvKPU1F", "blocksMintedPenalty": 0}, - {"address": "QbSyUZXLdbom9vY5UUyzJYUwUuKQvsodTA", "blocksMintedPenalty": 0}, - {"address": "QbT4L8XY1Bi35XcLMCNr1sYFyYquzfQx5n", "blocksMintedPenalty": 0}, - {"address": "QbTFErRa1GVYFX97femqLUqLDZVUR78r8f", "blocksMintedPenalty": 0}, - {"address": "QbTJ7WFfULy6C1HYoRMg9jnMFEbQ3ruqon", "blocksMintedPenalty": 0}, - {"address": "QbTg46vhQ3QTY8W3N87rppkzkF8auMWHAj", "blocksMintedPenalty": 0}, - {"address": "QbTotBJFsDD6EYjwX5VwoDh1G3gcmvxvP3", "blocksMintedPenalty": 0}, - {"address": "QbUkwiApGEttGd2z8CQmyro3PaSjz3JPYj", "blocksMintedPenalty": 0}, - {"address": "QbUy5djKfQ2hU4wjYdrABq2KrCsNNLkZ74", "blocksMintedPenalty": 0}, - {"address": "QbVE2toCta4nNC6RVjzzY1MHw5LnJa1m1j", "blocksMintedPenalty": 0}, - {"address": "QbVLPw9qcL32zLZREYMtG5KBfdzStHDgYh", "blocksMintedPenalty": 0}, - {"address": "QbVNJ8btmhm8Tpj7DBXSvLjLrCENp3S3zh", "blocksMintedPenalty": 0}, - {"address": "QbVkVMrDU6xSHZLPeaf5Exj5kpurScfapv", "blocksMintedPenalty": 0}, - {"address": "QbW16RSeGyEjdcDEYttaUATbMEReh5rCUZ", "blocksMintedPenalty": 0}, - {"address": "QbW7Zctkehn8U5s3JBVARYZZVyAy72rRFf", "blocksMintedPenalty": 0}, - {"address": "QbWFsVZUbs4QDGXC5PKt6DKxuwXwd522CK", "blocksMintedPenalty": 0}, - {"address": "QbWVQHB2gFdu6x72hXg77uPUKajHDSZa93", "blocksMintedPenalty": 0}, - {"address": "QbWWPusZ9RUcR9fKt5zmLMtvVLgzo8RFKX", "blocksMintedPenalty": 0}, - {"address": "QbX4AFs7T87iiKL9DVyDvesw9gWJ5vnHcu", "blocksMintedPenalty": 0}, - {"address": "QbXA3sf1tb5ALrBw1cpPW2w6gf5i4a2m9q", "blocksMintedPenalty": 0}, - {"address": "QbXEtm9opWA1bqk1q1EyUcyErYbSaohhoV", "blocksMintedPenalty": 0}, - {"address": "QbXznXa8WMw2fgneg37avvLM5Eo57ExrxN", "blocksMintedPenalty": 0}, - {"address": "QbYZe8RyZ41jdGGVDouBTrhVmYeG4ZR4mb", "blocksMintedPenalty": 0}, - {"address": "QbYaUQcNydbEsmrQDuoB3PkETMDwTbKc4n", "blocksMintedPenalty": 0}, - {"address": "QbYxJ5iw242ecPKmXmo1cgrteqmue2s2y9", "blocksMintedPenalty": 0}, - {"address": "QbYyn8xaxRfrZoEuBjEQdaPm2fZ48xeQM3", "blocksMintedPenalty": 0}, - {"address": "QbZ2doBAZCCJuZYyPLKpj1BQaGs2j6gnhy", "blocksMintedPenalty": 0}, - {"address": "QbZ6Cc9zJp4di5x7vEDP9EBZnY6rGEQoaD", "blocksMintedPenalty": 0}, - {"address": "QbZQsFdmSrvY7d3BMYjgmnzomUtjttTt6T", "blocksMintedPenalty": 0}, - {"address": "QbZUH5oLyVMxxS5fGJ86hD7rMKaq2Px5Z8", "blocksMintedPenalty": 0}, - {"address": "QbZazK5AfQJQaEnZS8odkAm8Wp9um3vMd6", "blocksMintedPenalty": 0}, - {"address": "QbZqawcrk75FaRTBJ6rM5D35vGbv98KQkp", "blocksMintedPenalty": 0}, - {"address": "QbaPU6EB26iHyef3aYhrktEXZAJ2sKuAFL", "blocksMintedPenalty": 0}, - {"address": "QbaTNqaj75zrmbnKecz2DWjKQfJK2ppdfH", "blocksMintedPenalty": 0}, - {"address": "Qbb3CfHNv7XuSLFYzRsD5kPS7QNdnjvLtL", "blocksMintedPenalty": 0}, - {"address": "Qbc4WWP5wrj8n38FpyCXTAVBX1FWLQsmbP", "blocksMintedPenalty": 0}, - {"address": "QbcNagBFDKkEy3ixsLEWxmJDUoGGwHKb5J", "blocksMintedPenalty": 0}, - {"address": "QbckCRgUs8CkY2AsSG9YjywSQS3jULpjds", "blocksMintedPenalty": 0}, - {"address": "QbcrLb6zonrovG6GHBK48R58NhHeR9WbqB", "blocksMintedPenalty": 0}, - {"address": "QbczCBuRjaMWaREjud5XGreGCETtXc1u7F", "blocksMintedPenalty": 0}, - {"address": "QbdVgGsnBGhVSU6DuWryTEDWAguxFdm7cw", "blocksMintedPenalty": 0}, - {"address": "QbeDyJEunNszYeQAVs8nGVpZPsU9Bu4Kxr", "blocksMintedPenalty": 0}, - {"address": "Qbed46t1Anueb5esPwxUNKiu3BSzYgZ7tR", "blocksMintedPenalty": 0}, - {"address": "Qbf4PqiAcDTLSQ6npKAqAFcxcHmEBusxDB", "blocksMintedPenalty": 0}, - {"address": "QbfmGFtrZjSiGXjnDH7ejkTeoBU5uvPrcn", "blocksMintedPenalty": 0}, - {"address": "QbgMRc9sxdTNN7Jg78D6fC5bVzJgpQ1BQz", "blocksMintedPenalty": 0}, - {"address": "QbgPyNrSRX29KFWU6h6K5N3YrRD8PT9UpR", "blocksMintedPenalty": 0}, - {"address": "QbgWnetYhLQPZQBerR3dpEECasgqnqaQw3", "blocksMintedPenalty": 0}, - {"address": "QbgcjPdSV6SR6zWRYHhzMMNhTh1yhSDNKA", "blocksMintedPenalty": 0}, - {"address": "QbgjHLevJyYfNjPjGMxNheXGvZAZbJ6aVc", "blocksMintedPenalty": 0}, - {"address": "QbgnajDCfF6tZM3HgqMQTnru9Vc8XrQq3v", "blocksMintedPenalty": 0}, - {"address": "QbgwgamSPRBLxmFptwrNkBteB6Pu1ddffi", "blocksMintedPenalty": 0}, - {"address": "QbgzpEp8pzmeb1tq5JHUHXkdHZea3yWgDg", "blocksMintedPenalty": 0}, - {"address": "QbhBGKDGuuPboQAuK4VXXM4XcRveonZTjL", "blocksMintedPenalty": 0}, - {"address": "QbhG4GVMLCQFxB66zGGyfgu5p8UefB1JZT", "blocksMintedPenalty": 0}, - {"address": "QbhVcsjW27ADhgXJtE8Mm3pPieh6TTrWjf", "blocksMintedPenalty": 0}, - {"address": "QbhaJuMF8KcghHt5grqFuyAF6A2SunFrbN", "blocksMintedPenalty": 0}, - {"address": "Qbho5ANvWKCES5FF5oZ8suFGDtfRehYMXF", "blocksMintedPenalty": 0}, - {"address": "QbiKpCFFTRJBpi9zxu8Pe6u3jh7EDxyW4x", "blocksMintedPenalty": 0}, - {"address": "QbiYsRBck4iLYk5hU3ZrsLcnLjPV9Ym2Xi", "blocksMintedPenalty": 0}, - {"address": "Qbiom4rXvTUDQ8Vg5yYprm42HhUL71E9F3", "blocksMintedPenalty": 0}, - {"address": "QbiomJHdkixKvPYov3b4wKccTWdGvbm3pC", "blocksMintedPenalty": 0}, - {"address": "QbirBjPD9SCBZDxqK9F4zHX3ATGcDXfa2d", "blocksMintedPenalty": 0}, - {"address": "Qbj1CDdWYbquCQMwUDhr85nju4MLNhLKAU", "blocksMintedPenalty": 0}, - {"address": "Qbj4Dmpo55pDaJfXetGR8j6AtDBFjEP2KF", "blocksMintedPenalty": 0}, - {"address": "Qbj6YEt25LfTbsG3NBcWgSkQzqUgjUr7z2", "blocksMintedPenalty": 0}, - {"address": "Qbj7mBJpQmmqJ7ADWceLbx9yHPKm6dpHRW", "blocksMintedPenalty": 0}, - {"address": "Qbj84iyTFaJMm3KqsAWezijeG3ZjbyCGL4", "blocksMintedPenalty": 0}, - {"address": "QbjP3hStJ31nBJyhipYvnrZu8R2yPrqRp7", "blocksMintedPenalty": 0}, - {"address": "QbjrMFLbmPd3juDunHHttzHQF45pZ9reEg", "blocksMintedPenalty": 0}, - {"address": "Qbk5qcGzbkLUTztHzAHjEK4fPrTiUbYe3J", "blocksMintedPenalty": 0}, - {"address": "QbkYhiE6qoynoU5e1pe5RZMCrxhmzYy9id", "blocksMintedPenalty": 0}, - {"address": "QbkizShsUkVt6LTjjkBGwKcJgXrLdA2caC", "blocksMintedPenalty": 0}, - {"address": "Qbkj1JGajidrs2hetwLZT8CwUjBwGerQJP", "blocksMintedPenalty": 0}, - {"address": "QbkyAFziF2P6vKzPTH5xQAvpkKSpzYRX5K", "blocksMintedPenalty": 0}, - {"address": "QbkyUGApqpZVsoaSTtj72rQPC8NajTBmcP", "blocksMintedPenalty": 0}, - {"address": "QbmYZSEHjs8wDAuB8ncB6tD8rb6Q8EjtRV", "blocksMintedPenalty": 0}, - {"address": "QbmkUDm1N6Zb6npxpUkx1dibZR6ZnAkf9Q", "blocksMintedPenalty": 0}, - {"address": "QbnDRcCbShrbLJJuzbsVpNeRRwSShZPqUD", "blocksMintedPenalty": 0}, - {"address": "QbnJGzjZbh4gb16BV1m9M85Ev2tHSM4FQZ", "blocksMintedPenalty": 0}, - {"address": "QbnSfvRHs2KJTDW3RdskuACLV8StAbq7Cm", "blocksMintedPenalty": 0}, - {"address": "Qbo1JQ5sAb8QCLbHYQEX3EgAMsQGZjQEnN", "blocksMintedPenalty": 0}, - {"address": "Qboi1pet6f4t4ypYr3bhqs3PoPdWYtUFKL", "blocksMintedPenalty": 0}, - {"address": "QbooPLkNiaM2zsRk1KXQJENZWnbm1PG6iC", "blocksMintedPenalty": 0}, - {"address": "QbooX3R8KzT3JVB9XuykuuWryL2uUjgWAA", "blocksMintedPenalty": 0}, - {"address": "QbpCivV9Tg54qnFw4P8XAkHLnt3Azd8zp2", "blocksMintedPenalty": 0}, - {"address": "QbpG3L9fiZvkvUyZALvb8sumH3ZGdf6L3H", "blocksMintedPenalty": 0}, - {"address": "QbpUmRF1pYF1wwpNfEsy1RniCeKzVzrm7N", "blocksMintedPenalty": 0}, - {"address": "QbpcuNhfbuGDX3HEFNEHKAV6x5kxFisuAt", "blocksMintedPenalty": 0}, - {"address": "QbpfZ3vuwmK17ywWhrAHu5ew4wLaoxP6Ng", "blocksMintedPenalty": 0}, - {"address": "QbpfyMCbu3YaRR6YQ5Lcw3iwJqvW4ok8i8", "blocksMintedPenalty": 0}, - {"address": "QbppER5E51SxwmTpAN6RytG67ncSzqJuiV", "blocksMintedPenalty": 0}, - {"address": "Qbr597FtiZuECi52niBrbsh9kEWLFMHH4s", "blocksMintedPenalty": 0}, - {"address": "QbrH2UciN4zgpbQrYiN3F9KPSoT16bu2N6", "blocksMintedPenalty": 0}, - {"address": "QbrPj3QNP6WYb1KKeHSmJ4igmS2MinW3Ss", "blocksMintedPenalty": 0}, - {"address": "QbsCzHJyzBc6m9kGgJqSTg7R5NXTMEamWN", "blocksMintedPenalty": 0}, - {"address": "QbsDqUYGo3LcuASrR6LhACTd7KdcEBNmak", "blocksMintedPenalty": 0}, - {"address": "Qbt9DbwTNv3x2H2sXyvZtQPqEeziWSSueX", "blocksMintedPenalty": 0}, - {"address": "QbtNKaESdYdLc1x51SMqJ2bJ2brbZ6F4PL", "blocksMintedPenalty": 0}, - {"address": "Qbtut4Z8a37Mokd5uvsA54WXfBHN1Ho1Kx", "blocksMintedPenalty": 0}, - {"address": "QbuKpXJXKYkM9cypoqbg2h8ZQTzpbRfW5h", "blocksMintedPenalty": 0}, - {"address": "QbuXoHEnFZAkB2T1iC38Y1AxEe1UDy2Qs7", "blocksMintedPenalty": 0}, - {"address": "QbvzZh7AMzxK7QyheDRpHqH95Bjag11Gef", "blocksMintedPenalty": 0}, - {"address": "Qbw8zMRcP8SQzknbU8EvpkmqXbagiQghxM", "blocksMintedPenalty": 0}, - {"address": "Qbw9s8Bqzx6yi3QSLUTHXiv3VXfM2V3q5E", "blocksMintedPenalty": 0}, - {"address": "QbwdYWoqqNEZcUjPAQXzZQavaAnrnkNRc1", "blocksMintedPenalty": 0}, - {"address": "QbweffsvsfibM6cQ6mtKdk17Qndifmq15v", "blocksMintedPenalty": 0}, - {"address": "QbwiLPoZKTKMgVg1wDwjui6PSQ54PAbsEY", "blocksMintedPenalty": 0}, - {"address": "QbwjZJz4UrnFW42rPByrAkuxQQXz2bw6uK", "blocksMintedPenalty": 0}, - {"address": "QbwniiN5akKAg9FYcKTxDYemSWu5npC2Sz", "blocksMintedPenalty": 0}, - {"address": "QbxC82k8qvC1n7bLQh33xeT1kQNR1iegNU", "blocksMintedPenalty": 0}, - {"address": "QbxMHyZ8uNpNwkA9CgB1FzNmgdYWFqAXRx", "blocksMintedPenalty": 0}, - {"address": "QbxcL22t4hfDn1p5r1Z3XkuVvdHPMomT6T", "blocksMintedPenalty": 0}, - {"address": "QbxjMhHcAS6yoJhNUL3VodLT6pybaEbtPQ", "blocksMintedPenalty": 0}, - {"address": "QbyCfHFJWPQenguB9QvGEvV45ZMk2KBfVK", "blocksMintedPenalty": 0}, - {"address": "QbyoMh1Sd4P9R3JT1RQzdqKD4Z2ZoV8g78", "blocksMintedPenalty": 0}, - {"address": "QbzE5CPaHdrkiACanqpnNYwMesSmQ1mp1R", "blocksMintedPenalty": 0}, - {"address": "QbzH5T5eBqrrqZjYZ85EkMfiJHb8dybYvx", "blocksMintedPenalty": 0}, - {"address": "QbzVX1qXFPrjGA4Bu3PpWkktAaSuiLVb7k", "blocksMintedPenalty": 0}, - {"address": "QbzbbdJhRDsNWmkamHiEpgqDRwtyjXhPnC", "blocksMintedPenalty": 0}, - {"address": "Qbzkwk6n3EM6hhmZo6X5n3V3MosgD4CFPL", "blocksMintedPenalty": 0}, - {"address": "QbzyLZ83jRfa8j8TVy7JGz6p5mebd1zaKg", "blocksMintedPenalty": 0}, - {"address": "Qc15FWcEr3Mr72yqXfy9opzijLGDA8w9WL", "blocksMintedPenalty": 0}, - {"address": "Qc1QN63fmLEatW6qjZfw86owiqTNtSo6ET", "blocksMintedPenalty": 0}, - {"address": "Qc1Z54XJVDG5LaawFj8LsPQWd8shoaPFKo", "blocksMintedPenalty": 0}, - {"address": "Qc1fiKWySdPm32kUdSQvWVPUnoqcyj1aYf", "blocksMintedPenalty": 0}, - {"address": "Qc1kGS9oKbGibUoWSw8DUeAd3dRDot7AF4", "blocksMintedPenalty": 0}, - {"address": "Qc2JXiCvCpMRz49qodcVYeg8ffBW8P6Ve8", "blocksMintedPenalty": 0}, - {"address": "Qc2pZq1yhEcyTStRsCbQx6Cc1wX3Yox1yz", "blocksMintedPenalty": 0}, - {"address": "Qc2znXoq2QtvfRtaCwctNHsMLRCFFDRAcg", "blocksMintedPenalty": 0}, - {"address": "Qc2zoLsrVTTxXvTuxuCJD2oTuHu6BKU4TG", "blocksMintedPenalty": 0}, - {"address": "Qc3HHDZnRix4K1WKREzTsUQ6ZnLb9614Cz", "blocksMintedPenalty": 0}, - {"address": "Qc3JkJazJiaoXFh8at7Nsysg5TYy1uJtxF", "blocksMintedPenalty": 0}, - {"address": "Qc3VgNBfbFJynWENpXce5S4jDk2MofBdR2", "blocksMintedPenalty": 0}, - {"address": "Qc3X4BEdD1rAQahjn9pkyPprnbokpZbGW2", "blocksMintedPenalty": 0}, - {"address": "Qc49ykVb7JGoka1p3UKzcBmTpEw1446mFW", "blocksMintedPenalty": 0}, - {"address": "Qc4LEYzZy8FVtsjsjvchrCbQCWcKTAk9oo", "blocksMintedPenalty": 0}, - {"address": "Qc4LTP2WCWdWwoPuyryqzVsCE3oWw4Y9aY", "blocksMintedPenalty": 0}, - {"address": "Qc4YrXXcaUfqYYvo6AM1qR4W3qBWziUuya", "blocksMintedPenalty": 0}, - {"address": "Qc4aVQnrBvjZ41SEykxzTuQboB1rPcgcSi", "blocksMintedPenalty": 0}, - {"address": "Qc4dXBUg4Ywg8azCLawKxcjGnuTZDsvAYX", "blocksMintedPenalty": 0}, - {"address": "Qc5ve7sKhKZaa1fJVb5yWC7p72g5qaFXCK", "blocksMintedPenalty": 0}, - {"address": "Qc62HScY6vxm9iqQdV8qGy9CXmKNuRT4eJ", "blocksMintedPenalty": 0}, - {"address": "Qc6xxsXjtfxWuuJTuJ1wUqY4rJEuDSDg9D", "blocksMintedPenalty": 0}, - {"address": "Qc79T4aG3QvvhY58DRbctHEYBeYuj36nn5", "blocksMintedPenalty": 0}, - {"address": "Qc7sH4KsGZRAQa9Em6T8ZFFox1VJ5d21N2", "blocksMintedPenalty": 0}, - {"address": "Qc8L2dyTygsmbBsBwHC5ntM785t4qMtTWq", "blocksMintedPenalty": 0}, - {"address": "Qc943SQFyKdMxoVV9SM4SPVY5qFv1VRoUs", "blocksMintedPenalty": 0}, - {"address": "Qc9VKShamXTotg7CS4GnvjNMwm72eTqWjP", "blocksMintedPenalty": 0}, - {"address": "Qc9ZoiHpBD286gngHhziCQbGAzA7fguu67", "blocksMintedPenalty": 0}, - {"address": "Qc9bZo6U9DezkBrS5NFdQzjV3xpQo8Afd5", "blocksMintedPenalty": 0}, - {"address": "Qc9hu26GvEaSv4XSpFpRhgRTXxt5xL7UZd", "blocksMintedPenalty": 0}, - {"address": "Qc9jyUoPdB3Yrx6wk9daDp8E8aLEqTqJq2", "blocksMintedPenalty": 0}, - {"address": "QcA9j5tUWMruH5yFQ8qkyef3g4SBPFfdqa", "blocksMintedPenalty": 0}, - {"address": "QcAUjwM6WAkz41QbuHJLwx9TR4rWJVuncg", "blocksMintedPenalty": 0}, - {"address": "QcAnotEx63Qx7voswNvg7QtfeX2XDuWA5x", "blocksMintedPenalty": 0}, - {"address": "QcAxPbSwnbkwhq8LMEmpLkL61R2sBuHkRp", "blocksMintedPenalty": 0}, - {"address": "QcB7hifKHg7yChq2cmGQQpeFqz6MPWwtxT", "blocksMintedPenalty": 0}, - {"address": "QcBQt5Jo9Hx1Z3Z6zL21rbQcCh21aCtMrf", "blocksMintedPenalty": 0}, - {"address": "QcBhxHtMgPzxK9WvkTjf8YwdDRRUJG5fBT", "blocksMintedPenalty": 0}, - {"address": "QcC19adAPmwmCAqtjQHiN26hiPbQnZNcmj", "blocksMintedPenalty": 0}, - {"address": "QcCS4Swe7CC4GVDRJ9KS6PdXTHkBKsbQGV", "blocksMintedPenalty": 0}, - {"address": "QcDQ6pf1Zz3HY74WWvxh1bZi1PZQrD2vKw", "blocksMintedPenalty": 0}, - {"address": "QcDZUqng14H5mMVkph56dXKkTtNRJeWWLY", "blocksMintedPenalty": 0}, - {"address": "QcDeK6cryB862zYyQVt4gumUtqpdKDSGnJ", "blocksMintedPenalty": 0}, - {"address": "QcE2hS4Av3CNptBChnY9XN1LurV94royWD", "blocksMintedPenalty": 0}, - {"address": "QcE5tKuSSY5BwZq975k6AFiVHsWefRKueJ", "blocksMintedPenalty": 0}, - {"address": "QcE8pCqxNaSAktTbotkJuNTEvjENcrCPoQ", "blocksMintedPenalty": 0}, - {"address": "QcEBjcG7mHM2w3hhuecCKkTwAT3SDkc33R", "blocksMintedPenalty": 0}, - {"address": "QcET27WVaV679xBSAKPqxA7hBqYDbnQ1qA", "blocksMintedPenalty": 0}, - {"address": "QcEUkwNG77T533JSCtZiPtYwGa3gSVzRM4", "blocksMintedPenalty": 0}, - {"address": "QcEaFDsERhPpjaXc1zK1SbpxQKtobddLaw", "blocksMintedPenalty": 0}, - {"address": "QcEeM6aMuCrXp5TB1Ywwg7ues614wvSSqx", "blocksMintedPenalty": 0}, - {"address": "QcEmbJ2bC2HD2hBeH4npCXzRuMDkJWfTnM", "blocksMintedPenalty": 0}, - {"address": "QcF9n5LUEs9bx4uiUkJfhKVCxb9PH5HMAA", "blocksMintedPenalty": 0}, - {"address": "QcG5gbQDMdfsKvT4ACiPskRddGiEuJt18Q", "blocksMintedPenalty": 0}, - {"address": "QcGBZR2JWBfxefrKHjgpJjnfwj3tNEsR6y", "blocksMintedPenalty": 0}, - {"address": "QcGgHvFTnUjxnk5n2JC5geHCpyGZHZTNA7", "blocksMintedPenalty": 0}, - {"address": "QcGzEQ2eJ7PKEz5NN6G9vYFzasXWmRkV7U", "blocksMintedPenalty": 0}, - {"address": "QcH13bcNk1jWw6VykcnejPFV5qyJpTLWie", "blocksMintedPenalty": 0}, - {"address": "QcHAbRVS56BxJ351P5LpWPAeSjuZAAgfDp", "blocksMintedPenalty": 0}, - {"address": "QcHZjvDQdWwo3TtP2wxBvGNB4bmyAm8vDi", "blocksMintedPenalty": 0}, - {"address": "QcHhDSnx2je5yma4dbJR92LBqhfh1pi1Le", "blocksMintedPenalty": 0}, - {"address": "QcHwm9VTxPCKSr3hm9PDJ5ZRCHobLpsNn1", "blocksMintedPenalty": 0}, - {"address": "QcJSvgpHGaP9y4QtuhDR6Lrb42iSBTbRTS", "blocksMintedPenalty": 0}, - {"address": "QcJX37giGA1iKcxUeEJtSR45VZtHRpMBci", "blocksMintedPenalty": 0}, - {"address": "QcJbkMdM7yXJLohDyu5tBzDhQednKfUdxR", "blocksMintedPenalty": 0}, - {"address": "QcJgprHVzmZdVMav4NEabTrRi1N75JcDhD", "blocksMintedPenalty": 0}, - {"address": "QcJvBBnMKGbPBmL6Aazfp5PUGAEiBAZmf4", "blocksMintedPenalty": 0}, - {"address": "QcKDi49iTWBa4nE1QqU7eGXaXYjgnrwBE2", "blocksMintedPenalty": 0}, - {"address": "QcKMRd52VET8FvT7N6LwqppXEd6gZo9da4", "blocksMintedPenalty": 0}, - {"address": "QcKZriDfGU27ag7SgvSihCdqwZ3TQrjTCp", "blocksMintedPenalty": 0}, - {"address": "QcKthLeqTWhL3rG2zpHdeKgqoGCb3FkZas", "blocksMintedPenalty": 0}, - {"address": "QcLqxs5QRYXGp3u9zzTseUQLcwCbi6U9dS", "blocksMintedPenalty": 0}, - {"address": "QcLzGBVnzSV2hoAfq1psiJHa5ntL9aVDi2", "blocksMintedPenalty": 0}, - {"address": "QcMDJjDukVQRAX49kpESokKWtCadcTBZgX", "blocksMintedPenalty": 0}, - {"address": "QcMDT5uR23HUZ97yaTW1rCF2sLFaaQAWFr", "blocksMintedPenalty": 0}, - {"address": "QcMMznMG6ugRMRn1CNedG2p5xNpjwyNuC3", "blocksMintedPenalty": 0}, - {"address": "QcMfdeEhf1z4uhpbkgfSzPUk22cCJ5V6XE", "blocksMintedPenalty": 0}, - {"address": "QcMoU5qzwaJ9j9n3TsfvqEsij1QkZCKH8P", "blocksMintedPenalty": 0}, - {"address": "QcN5X1iHC3Egrvo4seQ1Rhk4AnArHij4rU", "blocksMintedPenalty": 0}, - {"address": "QcNE1hth9Rw39DG7riWn4JkK2EECFcyVYL", "blocksMintedPenalty": 0}, - {"address": "QcNNFDYGLC3pv9ocBL57ejds4fkwG3rh64", "blocksMintedPenalty": 0}, - {"address": "QcNebhBnFqfXR5rj7t2vLYDfGESeWne9iE", "blocksMintedPenalty": 0}, - {"address": "QcNyuekPFuebtiZRmjzH5LjLjqg2jaVnuH", "blocksMintedPenalty": 0}, - {"address": "QcP8FT2oMbYc9XTrvtLmpFb9pWoPbj5G9c", "blocksMintedPenalty": 0}, - {"address": "QcPw7WLrobSReK7dMGZziCpouC9Pcm95cv", "blocksMintedPenalty": 0}, - {"address": "QcREWbv6khtNsWBxHa2ALKumCnnnukPhxw", "blocksMintedPenalty": 0}, - {"address": "QcRQ6XU6Kq4nVV5XeVDKKErN72TbS9rGPC", "blocksMintedPenalty": 0}, - {"address": "QcRQGxVeXbEa4j7X1JiKQYwoFecCoGrzhh", "blocksMintedPenalty": 0}, - {"address": "QcRfZKXjoJrEPMiBw76LjvgpBwKvjJQRcC", "blocksMintedPenalty": 0}, - {"address": "QcS1exmw9b3rjjFkUDhsmTSsMzZV1NExKC", "blocksMintedPenalty": 0}, - {"address": "QcT1EG823qo4uv3D6o792ji32ociJF6Pt3", "blocksMintedPenalty": 0}, - {"address": "QcTWQJPtbx3Qrz3QMkZSPcPwuTCJLo1HHP", "blocksMintedPenalty": 0}, - {"address": "QcTu32LfNMqokcRJdX4kkb7b7HBqyRXNSF", "blocksMintedPenalty": 0}, - {"address": "QcU2gj4TSp1VeP6X5PA6dkejEqCvjbyEhh", "blocksMintedPenalty": 0}, - {"address": "QcUMYZDE8qApfSCk8TxqGW6aKmrXbxPqLW", "blocksMintedPenalty": 0}, - {"address": "QcUWRGXxS8WUj9z7rihZqM2kj8vbbHb1A2", "blocksMintedPenalty": 0}, - {"address": "QcUmnMTdsa5YQLCauovXd7NSiiPVfNyfxx", "blocksMintedPenalty": 0}, - {"address": "QcUzD9gwi8wWLiUV4bHXi9os5xnaZedUXr", "blocksMintedPenalty": 0}, - {"address": "QcV4VhzdpqN5DVBNqs4LTs4h5R2b3bH7SU", "blocksMintedPenalty": 0}, - {"address": "QcVEzxK3kgkytFFeehj5YTetTC2RHLzYNE", "blocksMintedPenalty": 0}, - {"address": "QcVVSy6jTfbery9CyuogyVsMdz9BJQYuNo", "blocksMintedPenalty": 0}, - {"address": "QcVyfJqErxzg7vLhiygXuWohL12EimZhTd", "blocksMintedPenalty": 0}, - {"address": "QcWAZbWiiKANYaDZKkf2qjCfBmHiNRRqFy", "blocksMintedPenalty": 0}, - {"address": "QcWHgfFSWKvSskhmfvXAfgbxncQZcSE8nU", "blocksMintedPenalty": 0}, - {"address": "QcWPvXd6Bf9shMVBiAc2Dd5kYdTMPRPemn", "blocksMintedPenalty": 0}, - {"address": "QcWa7riNYT6d8rEVoZ2vzNkTbSvKJxwW5R", "blocksMintedPenalty": 0}, - {"address": "QcWerQFZXYiF23hKvarHFA4BGaut4X7EC3", "blocksMintedPenalty": 0}, - {"address": "QcWknnNETm7Ye3uYcVuHEEh2rtNkDTPLcg", "blocksMintedPenalty": 0}, - {"address": "QcWwfdzHYm2QGRnPGeRkpcvuWfdtj4dQJe", "blocksMintedPenalty": 0}, - {"address": "QcXH7tjf5LHSbQBHtXY5PFu78xS1GJAUbR", "blocksMintedPenalty": 0}, - {"address": "QcXRR5BhYdvjkSQZuRzz8RNNCz8mVETqyg", "blocksMintedPenalty": 0}, - {"address": "QcXZECRR1bEXoHKJD95L413TLGyknCzY8x", "blocksMintedPenalty": 0}, - {"address": "QcXfuQmRZ6u3A3GZKTWrvxUWZr2zvjEqnN", "blocksMintedPenalty": 0}, - {"address": "QcZGUCKeX1d1ApGJMTWM4ahayLdnwbFTBy", "blocksMintedPenalty": 0}, - {"address": "QcZJ2B5RpAs2vu7hbEDwDRrDZ98kD8v5WQ", "blocksMintedPenalty": 0}, - {"address": "QcZyiw4Y5fs6vSSLwkAZNjcXxWnNEiXX3Y", "blocksMintedPenalty": 0}, - {"address": "QcaG2Luwv2RZTYsJhUjv8Beoa715658dfJ", "blocksMintedPenalty": 0}, - {"address": "QcaL6m9Hkck2u1DFs74Fkk6dykHjWxJf6T", "blocksMintedPenalty": 0}, - {"address": "Qcbk5owEYvzKW24S2au215mfKiRt4MhYiG", "blocksMintedPenalty": 0}, - {"address": "QcbkWSKQ7zudr7J3WRSJ2X3YvT4s8jTAGW", "blocksMintedPenalty": 0}, - {"address": "Qcbp3fUZPwsesBPJnf7GPnnK6iL3i3L5eM", "blocksMintedPenalty": 0}, - {"address": "QcbspAV9yts6pRLHxsnfszzsqDR7nw3kRR", "blocksMintedPenalty": 0}, - {"address": "QccuVR1LQZXqB8aLhR9Jmx2KPWuKZ2XMDm", "blocksMintedPenalty": 0}, - {"address": "Qcd14decwfSpDz2TuKSAeRyF1mgvpoQK3J", "blocksMintedPenalty": 0}, - {"address": "Qcd2tgajF7QLeMRdHFUtFr3N8niTU5SJif", "blocksMintedPenalty": 0}, - {"address": "Qcd86xojLYq28LSfxMkwrcKAXirccKWsCh", "blocksMintedPenalty": 0}, - {"address": "QcdUn4HZyLGfhb2y6HiAMDMaAPdv9ydsYq", "blocksMintedPenalty": 0}, - {"address": "QcdXWiXrKwWAJuXQx4vePs3XqzvzNCcxAe", "blocksMintedPenalty": 0}, - {"address": "Qcde84DQjFMFQhY1UumtKUKRybrxxc2TjX", "blocksMintedPenalty": 0}, - {"address": "QcdjC4Jv9iuJqCYAZRsZ7bHS1oMV9EgeQC", "blocksMintedPenalty": 0}, - {"address": "Qcdoy8hpiUrJZXd3djTWfvTYiq9gYeXkoR", "blocksMintedPenalty": 0}, - {"address": "Qce3hsTR6GFJEcUGUeAMFKBGDxYkGyR94v", "blocksMintedPenalty": 0}, - {"address": "QceBR26svMFUAE4g7hXbim42jVdU2t8wb7", "blocksMintedPenalty": 0}, - {"address": "Qcef3zQjNxwhF7MCMNL4SusT3cqMq6inRb", "blocksMintedPenalty": 0}, - {"address": "QcegnMjEBeVS2yMviEKyzNciVXBAoy9aXb", "blocksMintedPenalty": 0}, - {"address": "Qcf3H97BJfiaw4yWZxQToFSsXzngfNH3J9", "blocksMintedPenalty": 0}, - {"address": "QcfLJcyap9c7BAsniE3prawaH2uLa68YDw", "blocksMintedPenalty": 0}, - {"address": "QcfLzRyLGyua9dPSYLbEGo3r1Wgn7CZfH9", "blocksMintedPenalty": 0}, - {"address": "QcfU4DXcZsQnmnNzSiodfpodVXMmoBw3GY", "blocksMintedPenalty": 0}, - {"address": "Qcfs23epurw5yZmaajU5CNKqgQwhzT85pr", "blocksMintedPenalty": 0}, - {"address": "QcgQk3exXAK8gAirY3TuzgbQPLf1guuJU2", "blocksMintedPenalty": 0}, - {"address": "Qcgcn98dodMQCH6K3xbLgDxUD87xMLnf9B", "blocksMintedPenalty": 0}, - {"address": "QcgjwuUQuNMRsmT1PZDNR1K8kSGfKkqLTg", "blocksMintedPenalty": 0}, - {"address": "QcgqWhPnPAbJgA37QpDdFdZtCU1J1sp19S", "blocksMintedPenalty": 0}, - {"address": "Qch31bMbMkfkbJf2ZA9hH1Bo5wXFAGUvcL", "blocksMintedPenalty": 0}, - {"address": "Qch7DnsGwvagksuBxSNzm9KeAotrqstYzG", "blocksMintedPenalty": 0}, - {"address": "QchEqu1iquD5ti4B7R8uCcrBo7XSm9A8rH", "blocksMintedPenalty": 0}, - {"address": "Qchg38svhvcyLg1mGCCYe9qc2r1bnvTCsn", "blocksMintedPenalty": 0}, - {"address": "QchmArm18R1RFMBkw3qSF38qSa1XWV3MFF", "blocksMintedPenalty": 0}, - {"address": "QchtVQ2gj6EEeMhB4c6zsVvxZi5KZiHmyC", "blocksMintedPenalty": 0}, - {"address": "QciHT7tdCHT5iAZHvwspJqCP4ZjuxWsnum", "blocksMintedPenalty": 0}, - {"address": "QciMRqYcnZrvyoQPLUUf7P4GtnrW63Kn7U", "blocksMintedPenalty": 0}, - {"address": "QciV8JtUycuFuxRgHN9SozrpVLfQgykodB", "blocksMintedPenalty": 0}, - {"address": "QciVctR4wQVL2YfJoYBJNSz3AuSNJe9Wsm", "blocksMintedPenalty": 0}, - {"address": "QcikvS4nkuDxKu2SNWzQuPYL9Vq7vvr6w3", "blocksMintedPenalty": 0}, - {"address": "QcjCoiYA24KMk9RWyhKFbgKaPH2cUrFTGz", "blocksMintedPenalty": 0}, - {"address": "QcjKn5V4EvN6J2k7yFSr6DbsVPSVvgSqWU", "blocksMintedPenalty": 0}, - {"address": "QckPy42u9DC4gjxz7LkJLjziKMEW3cCjjN", "blocksMintedPenalty": 0}, - {"address": "QckyAHQXEwGM8UxT6oMUJNLqWEgneqswNg", "blocksMintedPenalty": 0}, - {"address": "Qcm9BLjFHTnvydCcY4bas5zDjYz3ZZDEDB", "blocksMintedPenalty": 0}, - {"address": "QcmDcgx7CxCrdPp1f6UDAycKhTo5awyr56", "blocksMintedPenalty": 0}, - {"address": "QcmEdKKSUio7HFfhGRDh5TMzAMKaFaKN3m", "blocksMintedPenalty": 0}, - {"address": "QcmVacrsVeXJ1rLWnhzdB8aFZzzRkMyMdC", "blocksMintedPenalty": 0}, - {"address": "Qcn8xDewqryxmawDt6wdLYwsSNJipzCaFQ", "blocksMintedPenalty": 0}, - {"address": "QcnMg4muXJ8HhD56zGdQbWnmDjHfPEDcsi", "blocksMintedPenalty": 0}, - {"address": "QcnRiRHaj22kmjy97UKBNX3QrwyDGfBcGr", "blocksMintedPenalty": 0}, - {"address": "QcnqmWkG5hodiNS6tVaGWeZmb5Rad13PmU", "blocksMintedPenalty": 0}, - {"address": "QcoPff5GWpLJDXWuMunZXuqwG4nTJ2Y1gB", "blocksMintedPenalty": 0}, - {"address": "QcoV9G6XtbCfxejV9uZt7Ba6EgMCGbpUR6", "blocksMintedPenalty": 0}, - {"address": "QcoXDLmxmsctunBERkarLPAeaQ3r8dn7jW", "blocksMintedPenalty": 0}, - {"address": "QcoqgfE81xpcxcy2qhZv9wBmqsDtWNb1he", "blocksMintedPenalty": 0}, - {"address": "QcpCohRBLyuGaajw1LyVjgqt9o28BSBRpF", "blocksMintedPenalty": 0}, - {"address": "QcpD3NpF99ufDTYLSz5GKYumacegoRkF72", "blocksMintedPenalty": 0}, - {"address": "QcpUahNUdLoFLqMcrkvNnui1RdGLvkgk2X", "blocksMintedPenalty": 0}, - {"address": "QcqNTQVhC76vHgWK4yXY7cfqDibH4AdvR4", "blocksMintedPenalty": 0}, - {"address": "QcqagayNQnFcH6kg6LEHtJQhYcNmFnTcFx", "blocksMintedPenalty": 0}, - {"address": "QcqqKs4JxxBq7WMRadow4b8Kx4USCnvJ1b", "blocksMintedPenalty": 0}, - {"address": "QcrFCc6rBYDUQHbMQ2NVDNqT11GgYm6koK", "blocksMintedPenalty": 0}, - {"address": "QcrpSLu37BAqP8diZXeFW1Ym8VfFftc2oC", "blocksMintedPenalty": 0}, - {"address": "QcrxLLs4VvixEVLrNGNP9rp7YyjTtagHVj", "blocksMintedPenalty": 0}, - {"address": "QcsG7hBfApFmjRspMpg6Rz2hgAbTPkBdMV", "blocksMintedPenalty": 0}, - {"address": "QcsKSUm92pQzYcyjmjAT17ustTkr9rr37J", "blocksMintedPenalty": 0}, - {"address": "QcsRq3oXv7Ce2P3tfAjFUSPU86dFeTeKMX", "blocksMintedPenalty": 0}, - {"address": "QcshHW9NbkTAUx9nG1MUrs7QFYEvp3mLGh", "blocksMintedPenalty": 0}, - {"address": "Qcsiep3EJWatqQyX2q6GLQ4qmQ6VtBh5mE", "blocksMintedPenalty": 0}, - {"address": "QcssPrPTxznsy3V9Zv559MohBiNmYhH9yq", "blocksMintedPenalty": 0}, - {"address": "Qct1YA5BmUByN1Xd3XevHPkkCKjYTQuroV", "blocksMintedPenalty": 0}, - {"address": "Qctfwsjr8UoNx1BRskU99hVjRHW7zD5vni", "blocksMintedPenalty": 0}, - {"address": "Qcu97Nqrt4NNw1uSZLsKU5X9tsWM2vKaGV", "blocksMintedPenalty": 0}, - {"address": "QcuN7yFhT5jKTUqSCZvx6ywBzWqhzqeUBc", "blocksMintedPenalty": 0}, - {"address": "QcujiWRg18LLLrbYrZuwHezEj85jFRvyB1", "blocksMintedPenalty": 0}, - {"address": "QcvAJSUWR8PdGqkeiyt387FL8dxQQdp8xe", "blocksMintedPenalty": 0}, - {"address": "QcwBhDE8fBJ9ksJNV6Y7in6Ez5iLpAiRPY", "blocksMintedPenalty": 0}, - {"address": "QcwiGuj51FiwNrH7auMdabPf95cyU9RDEp", "blocksMintedPenalty": 0}, - {"address": "Qcwvt4FPV1k4m3QFYNAmPwz1B1dYXNuP7T", "blocksMintedPenalty": 0}, - {"address": "QcxD9MHruNRkgFEdTcMweKk1AfkkmdimWU", "blocksMintedPenalty": 0}, - {"address": "QcxWpJJqz1z8Yeb5kRtsDGGwVu3AjS9FsL", "blocksMintedPenalty": 0}, - {"address": "QcxgKG8e7DwyBaTQ8XU2zjgv9vAUBRYQ4i", "blocksMintedPenalty": 0}, - {"address": "QcxoWUYp3EAKsEqF4iywEGir5P87LUgWn4", "blocksMintedPenalty": 0}, - {"address": "QcxtHsdS3L9XRDyrU1TKSufQCzc6E6NZiv", "blocksMintedPenalty": 0}, - {"address": "Qcxuwawy3rf6sBCbA3e2Gc3LNkaGCzGFbp", "blocksMintedPenalty": 0}, - {"address": "Qcy3SUxAhkmQ6FrUj9SpHoSgKMVmCwnBZU", "blocksMintedPenalty": 0}, - {"address": "Qcy4guGVyonLoGvG7XN1vD6zTjnAGcjqDR", "blocksMintedPenalty": 0}, - {"address": "QcyECMVaTU4ykboqaEcEAzSUMHRW8PwsgU", "blocksMintedPenalty": 0}, - {"address": "QcyGkvFC1EVxPTfW36WJddgobrVxv8jjZM", "blocksMintedPenalty": 0}, - {"address": "QcybTpWTJijDmNy7Vhm5xYp3Utp3e34v1B", "blocksMintedPenalty": 0}, - {"address": "Qcym32pmfiuyTTtDqtXyj7dBdi6XBswxdK", "blocksMintedPenalty": 0}, - {"address": "QcynXfV3CtNfvxZ83MPwZhj6xXLMyPrUUt", "blocksMintedPenalty": 0}, - {"address": "Qcz8RqoK8s9vy2CbDy13pBbyfzfSnC9F4B", "blocksMintedPenalty": 0}, - {"address": "Qcz8SXbBTJMyKK7i3mZpmZH198f6bg3pY4", "blocksMintedPenalty": 0}, - {"address": "QczoKfVcN2XYL5hxXRMXxtHjtR7S9W3J7K", "blocksMintedPenalty": 0}, - {"address": "Qczvb8b1v5cFSJAnapHNuzxxwvRgtRREsW", "blocksMintedPenalty": 0}, - {"address": "Qd1HH1EJ558fVFcMD9J5i2StTSCLXktZkm", "blocksMintedPenalty": 0}, - {"address": "Qd1U7qW8xURWBt4AGVQv6whug3UGDyA6tj", "blocksMintedPenalty": 0}, - {"address": "Qd1WcaFLj66ukqfzBeSB1TZjhRpL28mdUL", "blocksMintedPenalty": 0}, - {"address": "Qd1qVuFpEAiiF5CXiSQ7yFy7CB3dQTBqRE", "blocksMintedPenalty": 0}, - {"address": "Qd23cHAoNNWfxDjhhvVHooSyTxArn5hnT7", "blocksMintedPenalty": 0}, - {"address": "Qd2MBEnF41yxLRqi8wvDgYmb8qqEoVChBR", "blocksMintedPenalty": 0}, - {"address": "Qd2Wsi61uDYWDQBmPnnDBajWDeHj6peZ2n", "blocksMintedPenalty": 0}, - {"address": "Qd2mLJFuXfRRoG2tbCHXf4dU5ssjXWdPL1", "blocksMintedPenalty": 0}, - {"address": "Qd2yQPdAgxJUnFXBUhD5TnnpmvLEqTy3cL", "blocksMintedPenalty": 0}, - {"address": "Qd34NSjYUwk4czbNCPwKhe6tJ38KneNYn4", "blocksMintedPenalty": 0}, - {"address": "Qd3JRtvALHH2iNfKpGMFgVt44qmpfRtHk8", "blocksMintedPenalty": 0}, - {"address": "Qd3WEyA34h5DazvwvRiATcRbM92r9iCPuw", "blocksMintedPenalty": 0}, - {"address": "Qd3Y5QxfiieByNe45Hbnho4e1BwEeLVzhq", "blocksMintedPenalty": 0}, - {"address": "Qd3ZyyccemHtGRN9dHvgqT55ABKFyvRL5W", "blocksMintedPenalty": 0}, - {"address": "Qd3zis4NQsU1cMgAaq4wsA6n6FqL9EQwm4", "blocksMintedPenalty": 0}, - {"address": "Qd44FCAgJCcwhUywPXopQ8CSwHPjF2bHzZ", "blocksMintedPenalty": 0}, - {"address": "Qd474mK5s7fUYMA1DxJWZSQQsbSq6maeug", "blocksMintedPenalty": 0}, - {"address": "Qd4LEcYaKTLFr4jw1RwSVef6SP8L6djsJf", "blocksMintedPenalty": 0}, - {"address": "Qd5Mi5q1yNrvMFQ3XYbjy2kJnF8KHTkjEc", "blocksMintedPenalty": 0}, - {"address": "Qd5RF1NTuto8FuynQUL6qfTV2T9QjqcuNY", "blocksMintedPenalty": 0}, - {"address": "Qd6v5v89xv66MUxGbEDVXt5da4jCjv7JJf", "blocksMintedPenalty": 0}, - {"address": "Qd7FQPpwFNg8pFi1vT2bx72BK7sjAP2qEP", "blocksMintedPenalty": 0}, - {"address": "Qd7caxrAxPFYND2MDgJkhqTuMUv6HDpU5P", "blocksMintedPenalty": 0}, - {"address": "Qd7d1Ak6EXo3bpZy2nnGLC5AkZL8rnRQ2H", "blocksMintedPenalty": 0}, - {"address": "Qd7eMhKGqVcLwLHJBBNZsB6WNzehSYofWQ", "blocksMintedPenalty": 0}, - {"address": "Qd85RL7kkhHNkm9Hvo2wM2Q5J9Qh8Degqc", "blocksMintedPenalty": 0}, - {"address": "Qd8Mws1gVhSnwsFvF1qxehcRpn4ystY29A", "blocksMintedPenalty": 0}, - {"address": "Qd8SgwgTHvMUXLRb1VRFL128tzFdQ5MKsW", "blocksMintedPenalty": 0}, - {"address": "Qd8WLb5erTTqqzdx6VPrvjftaAADFApc2U", "blocksMintedPenalty": 0}, - {"address": "Qd8eKkfhPzfa9gP8bLfCSeH9oif9xmGj1k", "blocksMintedPenalty": 0}, - {"address": "Qd8sQdcaMatxKNLvEt8EoDCskY9G1ukM44", "blocksMintedPenalty": 0}, - {"address": "Qd9NvfAyFVho15wwjUctM9Qds2LzPaaCE3", "blocksMintedPenalty": 0}, - {"address": "Qd9T4yoVVpCietdH5M4Q6AvNKrC3Yn9Mq6", "blocksMintedPenalty": 0}, - {"address": "QdAQJ7brQV5NthHLTFtTApEsJbSZZm7pMP", "blocksMintedPenalty": 0}, - {"address": "QdAU9Z3n1DTTnVWXqRizpy72TPeGgLZihL", "blocksMintedPenalty": 0}, - {"address": "QdB9XECYVoWHCbMJG2e3LbbHEj6pe42HXM", "blocksMintedPenalty": 0}, - {"address": "QdBFoMiGy3hg7uBvD9x9CM5VQKuX397gaB", "blocksMintedPenalty": 0}, - {"address": "QdBcL3vSXikRjFZXDezGtQayiSe3NrxGqv", "blocksMintedPenalty": 0}, - {"address": "QdCE8Aiwr1aj4bCo2BaYMMUQEVmjFuvz41", "blocksMintedPenalty": 0}, - {"address": "QdCFiWx5SNzcHxwQNkerta43pXhkeWiDr6", "blocksMintedPenalty": 0}, - {"address": "QdCRrW4grDwizUEeVRVFEYXJfstbuoHUR4", "blocksMintedPenalty": 0}, - {"address": "QdCZ3h6uLQ2W46sgmytdeLXghyYsXKfU5j", "blocksMintedPenalty": 0}, - {"address": "QdD5ff2285NdKpRyjGadW5kLHdLznPtnRq", "blocksMintedPenalty": 0}, - {"address": "QdDKmFomSNjxtHzwBjQF9P381jzcwhFsEj", "blocksMintedPenalty": 0}, - {"address": "QdE1eHuPxCvKzKLE5uyBRdsx4d2ATZqszm", "blocksMintedPenalty": 0}, - {"address": "QdE4akyPuxVhxe5VQcF42TdvK8NhEcepf6", "blocksMintedPenalty": 0}, - {"address": "QdEWxrYT9a6CfkmgEjdtvwtY2GvRdHqRYZ", "blocksMintedPenalty": 0}, - {"address": "QdEj8sWwVC6euChgWZF6RTewLXfEzY4xh8", "blocksMintedPenalty": 0}, - {"address": "QdEm7oKBcsxJmfPuVYpjAWXDUMHCre3RmR", "blocksMintedPenalty": 0}, - {"address": "QdEniXLp2DkEeKu3q4mnxyZerXgmFVG8vb", "blocksMintedPenalty": 0}, - {"address": "QdEpmoh34MTTZ4BJzFoGCY5cVHYszjwBma", "blocksMintedPenalty": 0}, - {"address": "QdEuwGyWm8SGSkuC1CV6tPubNf6t9abxer", "blocksMintedPenalty": 0}, - {"address": "QdFNQYy6u9uTaF2vXb6zN1HgnVSbqtjmcJ", "blocksMintedPenalty": 0}, - {"address": "QdFSMGKMsE9hhmMoQRHGxSb7p7sDabVFsp", "blocksMintedPenalty": 0}, - {"address": "QdFjYrwdYksaxUCgAmFHd9AyM231fhYz65", "blocksMintedPenalty": 0}, - {"address": "QdFtkvDtDVdXpeZ8MsrBBNS6YaqEgXxsWD", "blocksMintedPenalty": 0}, - {"address": "QdG9VJrfUTNsRL684xhLrk3hUvVedJDYhy", "blocksMintedPenalty": 0}, - {"address": "QdGeAucUZxJu2DXWHft8bCfwUtP2DX46Hk", "blocksMintedPenalty": 0}, - {"address": "QdHc49iRMiCaanZfD8kGiTZaZxJneDTU7j", "blocksMintedPenalty": 0}, - {"address": "QdHrGjFBNiLtvyv5Gvkni56dgQgRZ11Qis", "blocksMintedPenalty": 0}, - {"address": "QdHtGhGtcY84oKLpWUiqcNnNS3a5c5Csq8", "blocksMintedPenalty": 0}, - {"address": "QdJezy7mCokKwFwq8Px2FWVaeWeXv4Z4aV", "blocksMintedPenalty": 0}, - {"address": "QdJqzEorFH8VUtEshjxMj6Eq84bQxqGCvT", "blocksMintedPenalty": 0}, - {"address": "QdK9LcvzYJ43x6hoYRbaRwhCWsHSzbosNy", "blocksMintedPenalty": 0}, - {"address": "QdL5YSPb7jnTbAZoC7rxH792zy4ZSt48uy", "blocksMintedPenalty": 0}, - {"address": "QdLFGiFNKuaRCr3Yiunbia3gM8Ps7Z2Bf3", "blocksMintedPenalty": 0}, - {"address": "QdLxHM6HkHEQ7HDhsLXkjsdLj7yrixa4de", "blocksMintedPenalty": 0}, - {"address": "QdM5gXn1cYaRq1eUXY8uJ4cWXTJyxiey5Z", "blocksMintedPenalty": 0}, - {"address": "QdMRuy5FrAibzcBcdCM9Nh5greYbPVRgWz", "blocksMintedPenalty": 0}, - {"address": "QdMVf8EeZd14Avgy1e7v45DntnkLSc7wW7", "blocksMintedPenalty": 0}, - {"address": "QdN4aZRmM3o7Lzh9RSQBjWzKdfHHp8U72J", "blocksMintedPenalty": 0}, - {"address": "QdNAqb9dZhQpnLiLpF5HDNTe9QnDBqHa5X", "blocksMintedPenalty": 0}, - {"address": "QdNbnHEMhU9dQbdQmjDzoBNEbMBZhMxb8L", "blocksMintedPenalty": 0}, - {"address": "QdP6rQLDa8AGVm4R9H9qos8o8zpR8eZoA2", "blocksMintedPenalty": 0}, - {"address": "QdPKzZwbzwFgmSanWRE2Kdmiz7U2iGdDHM", "blocksMintedPenalty": 0}, - {"address": "QdPNHYPpu6s8YccVfTPqNuoPdyCDYLJ9K9", "blocksMintedPenalty": 0}, - {"address": "QdPZmoRmi7udbXgUqVN7BUURS8b3JJ9HqM", "blocksMintedPenalty": 0}, - {"address": "QdPf5Xo9PQ4hnhFdkmF5xQXHVDVqaAWBuC", "blocksMintedPenalty": 0}, - {"address": "QdPnRERVyEEwAkWuL8Br4dFdSQEZtYZToB", "blocksMintedPenalty": 0}, - {"address": "QdPsM1hgsrQf5LTr4HFKWYoxxQGwR2NM5p", "blocksMintedPenalty": 0}, - {"address": "QdPvKfHnSHjymQcQpYncxsn49FNJnN7jVG", "blocksMintedPenalty": 0}, - {"address": "QdQ4d3mtHs4ed75eiCA7x2M7LWFCup2bWF", "blocksMintedPenalty": 0}, - {"address": "QdQC5mC3mw2WFydYqAPFUFAZpCdW1Y6Zxh", "blocksMintedPenalty": 0}, - {"address": "QdQT3RCsn8gdBs1A5XKTLzuAxKu8LAvYSw", "blocksMintedPenalty": 0}, - {"address": "QdQa5PgH3xin8UoUM5EFPPorLByqGBHk4b", "blocksMintedPenalty": 0}, - {"address": "QdQb21rZaTtKpXHHfXh3pir2tBe2eDBUtx", "blocksMintedPenalty": 0}, - {"address": "QdQukyZuy5AodBBhYrHBdZknxcBUGVfyKe", "blocksMintedPenalty": 0}, - {"address": "QdQvKaM9HS5r4UUDb7qN44XPvTDEdXHVro", "blocksMintedPenalty": 0}, - {"address": "QdRA6qHQNVqZEuMzesDqB1J44FPtgonTLQ", "blocksMintedPenalty": 0}, - {"address": "QdRH7tr77Sib9Bzh5KrPSPUncj3SinVcAT", "blocksMintedPenalty": 0}, - {"address": "QdRMYB7aBBFNR3s8zFTBTaqbcPd6cZTFpZ", "blocksMintedPenalty": 0}, - {"address": "QdRPNFNdMVWhipksPzQT6vKv9ZvK5ujxef", "blocksMintedPenalty": 0}, - {"address": "QdRVXog7SzbNQq8bKmHF5bkubc58stXpXu", "blocksMintedPenalty": 0}, - {"address": "QdRsCe6EsswGPnY1iakF26tg3AYi6eUPeF", "blocksMintedPenalty": 0}, - {"address": "QdS9dc8GFHna6rnfU5Dj6XxM4Rcn9siZYn", "blocksMintedPenalty": 0}, - {"address": "QdSHgoRVkJsxDpUAAStQqx17hN8ULzpctN", "blocksMintedPenalty": 0}, - {"address": "QdSUHxPbHtwrZSYvD9yb3vQRP5zWGMJXyR", "blocksMintedPenalty": 0}, - {"address": "QdSWGzwyEbUmojE7ZTEvqG5iR6mMUghhoB", "blocksMintedPenalty": 0}, - {"address": "QdT3xKwUP22U85pScY1BnjSJY5JbEdiuLF", "blocksMintedPenalty": 0}, - {"address": "QdTfQFQa28N9rMFTvego5x7fSyK3a4ETrJ", "blocksMintedPenalty": 0}, - {"address": "QdTmFtWY3v5ekKL5hxTRd5Haa34PY38rYQ", "blocksMintedPenalty": 0}, - {"address": "QdU3Sgd2ptjzry3XQc8D4wAZ5C7uBi3wSG", "blocksMintedPenalty": 0}, - {"address": "QdUN2H5Lt3gCbkKxcxuucQffDyozTB4QrL", "blocksMintedPenalty": 0}, - {"address": "QdUvkUHW2AvEdqb61yNMVk5tZVtyRCbddX", "blocksMintedPenalty": 0}, - {"address": "QdUvqVU4STEhBPDMV4BgGwqZZouBXp4CXs", "blocksMintedPenalty": 0}, - {"address": "QdVcyw4HGvyr9Z2aJxsJEzE2BddeVU9LUQ", "blocksMintedPenalty": 0}, - {"address": "QdVgqEeSEVaB4wb5ZD9rjhYPtrDqdwyzZd", "blocksMintedPenalty": 0}, - {"address": "QdVkw5cid2rnMPxFXb3XnpsTwGhypSLCWb", "blocksMintedPenalty": 0}, - {"address": "QdWKTnRdnRBfc2uGvdA7qMR7bevowq4HSX", "blocksMintedPenalty": 0}, - {"address": "QdWduqrZTVGpdFHB61pFHgZUF1Xuj19hvq", "blocksMintedPenalty": 0}, - {"address": "QdWeUAk7EwtAWhvo1KY66FwjWF6Fh3HoWH", "blocksMintedPenalty": 0}, - {"address": "QdXFRfdzbQZ2te9gASz7937G47BxxZYn5w", "blocksMintedPenalty": 0}, - {"address": "QdY1aWFMAg9fQ1UezdvzKx1rFdLz71cBPy", "blocksMintedPenalty": 0}, - {"address": "QdYFD6BedZ2rY6ucjXGXXtEnqqwVnQP3dG", "blocksMintedPenalty": 0}, - {"address": "QdYJcsdGLnyEF6koN19WdHdTFa81p4dtjs", "blocksMintedPenalty": 0}, - {"address": "QdYTz1vdTrByTfHGv8r4am1d9MHusazMfP", "blocksMintedPenalty": 0}, - {"address": "QdYinBHaCPNLzSaPRvEU4yWKNGBeJvb96C", "blocksMintedPenalty": 0}, - {"address": "QdZE26NN9cWpsG3BsyZ712ucyczJ5p2rtp", "blocksMintedPenalty": 0}, - {"address": "QdZFhcqV65ySD8XRN7PQMaLdxv6TM2cWCx", "blocksMintedPenalty": 0}, - {"address": "QdZNjFztdRk52Vdv9SDibTqWBAn9aGY1cM", "blocksMintedPenalty": 0}, - {"address": "QdZgscwqB8pVDx1hsjB41MKEbfHVBmo3Cj", "blocksMintedPenalty": 0}, - {"address": "QdaPAeoCQdUxxRrR7AweyUFn3BfdUs2CYJ", "blocksMintedPenalty": 0}, - {"address": "QdanjsNV7nejFP4QS4iDNgFgb4Zwa1qQ6S", "blocksMintedPenalty": 0}, - {"address": "Qdb1CVNUKwmQxSVnKKGfMJQ1pGdPoRvP44", "blocksMintedPenalty": 0}, - {"address": "Qdb5HuRgtptarotgrGc4vQLWnyi9muAWof", "blocksMintedPenalty": 0}, - {"address": "QdbQ8Dw8xM5sLEoxne4sJ3JvT426hScSEt", "blocksMintedPenalty": 0}, - {"address": "QdbaUAJEiJfy5NMQxgLazYa5MZoNJ7zntK", "blocksMintedPenalty": 0}, - {"address": "QdbwspwZmGNi2T1vzkvF7VCyDvT1YHizsm", "blocksMintedPenalty": 0}, - {"address": "Qdc15t7bRktNprs2dh72NHF8sTKQ6eE8Sf", "blocksMintedPenalty": 0}, - {"address": "QdcRtFHLzq1MrYp8gRdx28d6AWBkNHWDWJ", "blocksMintedPenalty": 0}, - {"address": "QdcZh8j6isZYQJYhWwxKiX5xMj5jCaNpiu", "blocksMintedPenalty": 0}, - {"address": "QddEByceFUByiqxmvmksgL4cJnxH5z5D1q", "blocksMintedPenalty": 0}, - {"address": "QddeyP5AbzfswY2LTgGLuSqEdBDLQ4uJou", "blocksMintedPenalty": 0}, - {"address": "Qddmp7EVyhPxBooLJJeWNx9ChuAvNdY9pU", "blocksMintedPenalty": 0}, - {"address": "Qddrq4msygAxs7bqeUyFkHu4RLT4eqRvHW", "blocksMintedPenalty": 0}, - {"address": "Qddt8zMq5TLJTMXLcu4S63AYPL18fhYN1c", "blocksMintedPenalty": 0}, - {"address": "QdeRSt63gD8vncJ3xFqJtiKuLTNpY9XU9w", "blocksMintedPenalty": 0}, - {"address": "Qdeh7ZJ8WV7L2B3UqWUt3X1HyrvY6uwJX2", "blocksMintedPenalty": 0}, - {"address": "Qdf9gU1SJZwt8cuiAx4coiGKCdUMcyGtan", "blocksMintedPenalty": 0}, - {"address": "QdfJwj5xVhPuTWeBLRJNQPGLFv9fsZxCps", "blocksMintedPenalty": 0}, - {"address": "QdfQctDdic2k7XFKjA6Kf3cWonyoYuWd84", "blocksMintedPenalty": 0}, - {"address": "Qdfo34qskTPZMKg1g1ja6UsqxLYyGiVaf6", "blocksMintedPenalty": 0}, - {"address": "QdgP7NhWcqJJTm4ZwUcyiTpTSR9xfrhg8a", "blocksMintedPenalty": 0}, - {"address": "Qdgj1tYQSvkHqLhUns7iYmkQne2EcASC5S", "blocksMintedPenalty": 0}, - {"address": "Qdgv7Nr4R5y7hHWWy7gMYf2kBdUavt7NS7", "blocksMintedPenalty": 0}, - {"address": "Qdhba4CTrfUmGWgcAwq7eDDjTmBc9dHyV6", "blocksMintedPenalty": 0}, - {"address": "Qdi5TGL516wuTRWpssjZ7BMAw3HEmDMX4C", "blocksMintedPenalty": 0}, - {"address": "Qdi6hFCLZuQGxxKiXo4bYMTajBZcsKbY1i", "blocksMintedPenalty": 0}, - {"address": "QdiJYFfswv2R4Yts93WwHzom9NB3X3BZxk", "blocksMintedPenalty": 0}, - {"address": "QdicpiKnWX7LcrgqDuDE6bPHW99MqLLtHV", "blocksMintedPenalty": 0}, - {"address": "QdjRU9ctCxay5Qu34xLrwsQr2zid1GgbNi", "blocksMintedPenalty": 0}, - {"address": "QdkY4ZHD8B2b4tTxFDJeMtiz912CKngTcw", "blocksMintedPenalty": 0}, - {"address": "Qdm53RNbv7WWPwT6HNgG1X9gYg4pRU37Pt", "blocksMintedPenalty": 0}, - {"address": "QdmG4dU5sD158RJvUTGffDR5aM2jf6HnQw", "blocksMintedPenalty": 0}, - {"address": "QdmMZLFaa9cBtMYHUjs1ggDukuDSCbYTXw", "blocksMintedPenalty": 0}, - {"address": "QdmgwzzKjFDoUDPi11MKvKPJwqNvVdBWwh", "blocksMintedPenalty": 0}, - {"address": "Qdmmaxc3dZ8zUQ5LjkUsbdhQ3B3YgfWrUb", "blocksMintedPenalty": 0}, - {"address": "Qdmt5QeeDBnoyYBAmjw1ku3JrEnptu3kgw", "blocksMintedPenalty": 0}, - {"address": "QdmuCh1RmnMkQ3Qk7ESvCW5iT6FHZjaHcT", "blocksMintedPenalty": 0}, - {"address": "QdmuTSY5CNaBJwVtNAx6aEicE32WnoH9e8", "blocksMintedPenalty": 0}, - {"address": "QdnbYwZRzRkCEJPd6KQqeb1eXn4tBnCdYU", "blocksMintedPenalty": 0}, - {"address": "QdnuKtVhEH9Z852Knb3tPGZeqJTkRk5x2D", "blocksMintedPenalty": 0}, - {"address": "QdoQU626TRaAecbgk8AQN8dAs9Yhexcwxn", "blocksMintedPenalty": 0}, - {"address": "QdoibyacXDQyAxh3CnwCYCaV1JRVxatrLb", "blocksMintedPenalty": 0}, - {"address": "Qdp18qz6TdC1tNTkzgxubmMVcWbDPtkaHw", "blocksMintedPenalty": 0}, - {"address": "Qdp9m1kSqDCwQcPbnAmqdiKFvwrWqyH5LC", "blocksMintedPenalty": 0}, - {"address": "QdpH9fUB3WZWtHp1aEauhtwRGZuR9GBqxq", "blocksMintedPenalty": 0}, - {"address": "QdpU5Lf6p3QJfBBUtYLaa5btikpuktJqoZ", "blocksMintedPenalty": 0}, - {"address": "Qdpgv5Jp8G5jHEUvo8Zx4Y4uU95hKFBqP4", "blocksMintedPenalty": 0}, - {"address": "Qdppt334QBb7pMHtNyHBpaKugT9Q827wgs", "blocksMintedPenalty": 0}, - {"address": "QdqMArkqfEQiH3jMFc765nwEmSXbhSzJgk", "blocksMintedPenalty": 0}, - {"address": "QdqeKR8Y3mNCk1jB7xLh5xF7sn1M6f2TdU", "blocksMintedPenalty": 0}, - {"address": "QdqfQ7s5Ej96iYoN52T7ScgsNfvg6wm6iY", "blocksMintedPenalty": 0}, - {"address": "QdqhVxqYi4WYYqCNFpTWLBikhF68MEgTQj", "blocksMintedPenalty": 0}, - {"address": "QdqiEpKqdiwPcXjNsSuznEraXs1ukDBm3F", "blocksMintedPenalty": 0}, - {"address": "Qdr5V2zD4CPQzhxQLp4zno6ZAdLAsWvfbT", "blocksMintedPenalty": 0}, - {"address": "QdrFVXb1y4cEkPdE2V4evPedGF2kVCs5Tx", "blocksMintedPenalty": 0}, - {"address": "QdrJ1fXcAxrMag62iH3hTthR1eCBduzfy6", "blocksMintedPenalty": 0}, - {"address": "QdrSQo2obdXX1kUJWh19NJLgpy7YJE15Js", "blocksMintedPenalty": 0}, - {"address": "QdrdRnXfhaCiQgSjQZAsR3P75Rs8mpYj7g", "blocksMintedPenalty": 0}, - {"address": "Qdrue7k3YU74tV7hX11kFvE6ddvqfxHK2x", "blocksMintedPenalty": 0}, - {"address": "QdsQrtQgVb5z3pwyYvp9tMwFsdYiu3VkSQ", "blocksMintedPenalty": 0}, - {"address": "QdsTzMCowjvn7ivefdeVfsDmrLjmpz4BNA", "blocksMintedPenalty": 0}, - {"address": "Qdsd7ywv4WheaS5oh7DCWKyjVGoZdJ81wm", "blocksMintedPenalty": 0}, - {"address": "QdshBsKeqkgdbmSvkhncYKXjcxC8x1cKRH", "blocksMintedPenalty": 0}, - {"address": "QdtQjB51iKsz5P3QDBWtsT7Len578RGHUy", "blocksMintedPenalty": 0}, - {"address": "QdtmzRCwuVvUvJn15LDry8G66DSPJddbgv", "blocksMintedPenalty": 0}, - {"address": "QdtsTBqMfcWafi1kS5VJKg3anJgoV8GvQ6", "blocksMintedPenalty": 0}, - {"address": "Qdu3VVRxkXNHbBUJGVd6N5U2Ewd2tjN1bB", "blocksMintedPenalty": 0}, - {"address": "QduGZ8JomeGm2A4xReaJ3CX7yc5qYggk41", "blocksMintedPenalty": 0}, - {"address": "Qdumw6qgf5MrP9PgwS4ES8wPdtunGHgJ9r", "blocksMintedPenalty": 0}, - {"address": "QduwoSQMfCmBJPgyXTFBicVmGi68HouzES", "blocksMintedPenalty": 0}, - {"address": "QduxPJv6pHE1nfUSka6GosJWLPdNa36ym7", "blocksMintedPenalty": 0}, - {"address": "Qdv9fg1qreGbvDFrfew8syVzGuE2wSNoKP", "blocksMintedPenalty": 0}, - {"address": "QdvCCNGpKpqZvarGXpgc1tjoQrdgddh1ap", "blocksMintedPenalty": 0}, - {"address": "QdvtNVjAh1egF8R96uEoJ3vYjSXGUboNmm", "blocksMintedPenalty": 0}, - {"address": "QdwAogLYeYu1rnxJ5bCfocMiDyWkyZYTpF", "blocksMintedPenalty": 0}, - {"address": "QdwCf5ACXNxEG3J9BwTQCDFDaYAqTR2dhQ", "blocksMintedPenalty": 0}, - {"address": "QdwE3Tzmi9FJDi3SbN4UQdhvWwYGuAfRKo", "blocksMintedPenalty": 0}, - {"address": "QdwE9AFy1UN528LaewtnyjQRJYMcfTzp3Y", "blocksMintedPenalty": 0}, - {"address": "QdwSeQEWSDT3tRHmeGVR1LBxXMrze8CHnW", "blocksMintedPenalty": 0}, - {"address": "QdwXJ71mhUN8JLAgXevbx7hAEH1RbYhTW1", "blocksMintedPenalty": 0}, - {"address": "QdwYNeK6LNEnCLJhBZGmXig7Qu5cT6ZVsi", "blocksMintedPenalty": 0}, - {"address": "QdwcqhSUoNktnY1CALQRrk6eQnxndgQ3fK", "blocksMintedPenalty": 0}, - {"address": "QdwmAgrA2V6aBunU72stBjv8DzMzAmne53", "blocksMintedPenalty": 0}, - {"address": "QdxDaHTEX5cUg4S6ohMAi6mE8wQZCqQBoT", "blocksMintedPenalty": 0}, - {"address": "QdyJZgvLRGPwapJJie5kDmCrApeXc7k8Cx", "blocksMintedPenalty": 0}, - {"address": "QdytXtRDghB23b91G8a3EmL7EZjJqphnzW", "blocksMintedPenalty": 0}, - {"address": "QdzZQpjqvik6MR22tq4Zb3RZRoSs6rTsa4", "blocksMintedPenalty": 0}, - {"address": "Qdzao5D6UbnoUkiskjceGRGCeEnMyb7R2E", "blocksMintedPenalty": 0}, - {"address": "QdznPoNNQRom8eJq7LEq89NE5J5RzUpztr", "blocksMintedPenalty": 0}, - {"address": "QdzuZVQnF8T3vRe9bLXX4hcqpo8feG2mk4", "blocksMintedPenalty": 0}, - {"address": "Qe1T1JXhcAzAdEZSqYEsgCkGEC66QpPg6p", "blocksMintedPenalty": 0}, - {"address": "Qe1UWFXa4z92uKMQvtFpvin5Y4fPfPij2U", "blocksMintedPenalty": 0}, - {"address": "Qe1VTz3uyvzhufVPLTPiAiANr25RExtT1n", "blocksMintedPenalty": 0}, - {"address": "Qe1iUmv1aST7rys4z1ZiXxXoPfoVzUnFZU", "blocksMintedPenalty": 0}, - {"address": "Qe2HHHdP14HLYMftV8JqtCj6FGbXBPWLJW", "blocksMintedPenalty": 0}, - {"address": "Qe2bY7XooDD96cRHtKDtC8omWEKAjvj45w", "blocksMintedPenalty": 0}, - {"address": "Qe3VJAwgyYNbeH2LfDdpzbDYUm7YJR8oYs", "blocksMintedPenalty": 0}, - {"address": "Qe3XePjyDQaNxxe1E8YofN6DuXAxGz7Zch", "blocksMintedPenalty": 0}, - {"address": "Qe3oieqCCJRMbEToJ8Pn2hag8FbxiNA34N", "blocksMintedPenalty": 0}, - {"address": "Qe4CScdjTkoLgkPQdZf5rr6uPoV9ogFMtG", "blocksMintedPenalty": 0}, - {"address": "Qe4eubxeEJ9L3VoEr52HQE3mwTHgFkRphV", "blocksMintedPenalty": 0}, - {"address": "Qe4wDttVTQ4UuzhouGdRS1h2YmduwoJ9W1", "blocksMintedPenalty": 0}, - {"address": "Qe4xHzWG1pN3WfreAeCG7vtKXRTmDNaDL7", "blocksMintedPenalty": 0}, - {"address": "Qe5AL5vRcoeJrvYfizLF1pBnN4owD9TMzk", "blocksMintedPenalty": 0}, - {"address": "Qe5L5xmA9BRHX8Jf7bM1bzwrCGa9aTnvoK", "blocksMintedPenalty": 0}, - {"address": "Qe5fcxgymmaz5U2E4MpZTkZmurEwn7V1NT", "blocksMintedPenalty": 0}, - {"address": "Qe5nbyTcMcmcx2GDgJW2FyZ4msop1HdhEs", "blocksMintedPenalty": 0}, - {"address": "Qe61iC4UNukTT5to9K4zGV2NMPaHbrEXsg", "blocksMintedPenalty": 0}, - {"address": "Qe6GJwMkJR4VW6XqWxWS72U4SosueEazwi", "blocksMintedPenalty": 0}, - {"address": "Qe83kJcbVuUZSUsfzcnsyM865SgECpiXD2", "blocksMintedPenalty": 0}, - {"address": "Qe87og2YGh3qptAXi2NzAfzJuLATuBQD8P", "blocksMintedPenalty": 0}, - {"address": "Qe9BGTofJJhtcViZHcz8Xda9zgWjRTQt6G", "blocksMintedPenalty": 0}, - {"address": "QeA3ao5LFiAbZuHdjXGRMXuKniPCY6bsTp", "blocksMintedPenalty": 0}, - {"address": "QeA6MJgiFLwz8imdBRU2gfJ9wx4KPXQGLX", "blocksMintedPenalty": 0}, - {"address": "QeAHXst5usrjP3c2WqZFDZzxH3KoxdZQLw", "blocksMintedPenalty": 0}, - {"address": "QeARkeHszES9onj6yo5mm3DnUBiMpsjHj8", "blocksMintedPenalty": 0}, - {"address": "QeARoriSz7AbTmcdwnSUQtb1zxEQExX8GE", "blocksMintedPenalty": 0}, - {"address": "QeAgJEYRBfYuC87athvDWjKgjxTzJARfZP", "blocksMintedPenalty": 0}, - {"address": "QeAwSptBQ5QAhojiRGQZ7XKWANFRVeNzqz", "blocksMintedPenalty": 0}, - {"address": "QeAzdhvw9HHLXr5uSe8GdKtXtsHFo9VUaa", "blocksMintedPenalty": 0}, - {"address": "QeB7BqUvuovnoVX2iXbhzqbD9brUHBWHQ6", "blocksMintedPenalty": 0}, - {"address": "QeBKBQvMiriGRzfbm7NiiBb6hXgyaVp1Dx", "blocksMintedPenalty": 0}, - {"address": "QeBnj2qdgaiuiPPryoiVeazQGTyMGSGK1g", "blocksMintedPenalty": 0}, - {"address": "QeBpMJD9MLUX8QtxGsfzwXGP4sEUDWTo4J", "blocksMintedPenalty": 0}, - {"address": "QeBzSZ9EdpQvVJhLenE6Xv3zSpCmjc8bNR", "blocksMintedPenalty": 0}, - {"address": "QeCSyufzEFnWXBLGpajSLG8ryXZkrEzS7Z", "blocksMintedPenalty": 0}, - {"address": "QeCZdcQtfuZeKNPSJtSRHQvVC85CurDmrN", "blocksMintedPenalty": 0}, - {"address": "QeCbxUJs94cGkJkrM4jQrTkU6xbyAeJnvh", "blocksMintedPenalty": 0}, - {"address": "QeChYsHzaXw8xaP7Zw1zMPNuxig2VBomXa", "blocksMintedPenalty": 0}, - {"address": "QeCxY7DwSByPEnYNnGN3T6iUAxeUzrr38u", "blocksMintedPenalty": 0}, - {"address": "QeD2PVuUi5gXYr6xUxfdGuGFAdvDV7HHFk", "blocksMintedPenalty": 0}, - {"address": "QeD394RLKGR9kPkqBtXYXpXCzPKfb3godV", "blocksMintedPenalty": 0}, - {"address": "QeDdegTgKuNBKystQDf5g3VLVukB2Thd2h", "blocksMintedPenalty": 0}, - {"address": "QeDgWRhpVSCSiiobA7oaAqU7WAPhuXGA64", "blocksMintedPenalty": 0}, - {"address": "QeDpiTVxsUDyVCFxSMvWWhtosCUDasqePw", "blocksMintedPenalty": 0}, - {"address": "QeEg5QN4tcaXojuwDFNr8RXV34irto59Bn", "blocksMintedPenalty": 0}, - {"address": "QeEvoAv5914sL8SeKVUVW95BzY6536rNuH", "blocksMintedPenalty": 0}, - {"address": "QeFgBpbobpH2vW4dP42ryMg4vmbT96FiAN", "blocksMintedPenalty": 0}, - {"address": "QeGmgGAm6YYmGqUvCbYsFtFjUSyhyN6jzv", "blocksMintedPenalty": 0}, - {"address": "QeGqg8STXXe4h3R7WzPYpSwNMZtcsBeHsp", "blocksMintedPenalty": 0}, - {"address": "QeH1aiyMZCvd19g5iHemAW1g16eh79CrpL", "blocksMintedPenalty": 0}, - {"address": "QeH5g8c9AYa6BNZBrp4qG6NrzTJb1tfJPW", "blocksMintedPenalty": 0}, - {"address": "QeHnckGCEzhf2LHN2RqMe8rbTPusDq9XCN", "blocksMintedPenalty": 0}, - {"address": "QeHo8aKn8ZPvqyPhWPEhQS8iDVJsGYEKBe", "blocksMintedPenalty": 0}, - {"address": "QeJApVyWvbyyLWXumZzDXoTSsHn97uLw3D", "blocksMintedPenalty": 0}, - {"address": "QeJXux2kpPK7wT1Yoddej7cSjW3hrP4NNb", "blocksMintedPenalty": 0}, - {"address": "QeJfFgq1KtMGk4SxAk7dczj9NfYZBU5rUQ", "blocksMintedPenalty": 0}, - {"address": "QeKN4bFrVUFJwVty6o1kvKtM3heUC4Nini", "blocksMintedPenalty": 0}, - {"address": "QeKUzziwEhC4gnhy5Nv42HaLqcN7gqYMzY", "blocksMintedPenalty": 0}, - {"address": "QeKnSeckADDz4b1VrqNMx4vjATY4Tv9bd5", "blocksMintedPenalty": 0}, - {"address": "QeKuTkgQbsAm7T3eBd8QfqUtquLAbVTbVK", "blocksMintedPenalty": 0}, - {"address": "QeL8DFUqxWW6HMqYtAh5fzQNnnUCoe9kAU", "blocksMintedPenalty": 0}, - {"address": "QeLE72TdFyy2ibFZnRdKwB9Wf38T9boCbE", "blocksMintedPenalty": 0}, - {"address": "QeLF5wmqmHMnJR7rHGxyXJFsSLFSWFHejK", "blocksMintedPenalty": 0}, - {"address": "QeLYs2UzCKMKbMgRCkdsCMkvzn5vHxiVZY", "blocksMintedPenalty": 0}, - {"address": "QeLz3Q5mHQV9x1kFDUN1Qk75a2oXgcK5QH", "blocksMintedPenalty": 0}, - {"address": "QeM9qyuWqqQEbbJWFV3ksqERJeasSMByk2", "blocksMintedPenalty": 0}, - {"address": "QeMRKnAKCDLbmSkmvDv37geqLTbuEPy2X5", "blocksMintedPenalty": 0}, - {"address": "QeMSAeqzQpbZDNuBvDF75FT1zfJue7vXqF", "blocksMintedPenalty": 0}, - {"address": "QeNNjd3x8tQnHYmS4nK3bY9xFqDv8GTk9N", "blocksMintedPenalty": 0}, - {"address": "QeNSTjpmEjDcAPPZwM2hfVHMUJWiZADFXo", "blocksMintedPenalty": 0}, - {"address": "QeNV5YCTSBH2SrER3aRgnSv5zzm8KDyUJh", "blocksMintedPenalty": 0}, - {"address": "QeNgaUJdxCcnciW6NmxR2ZBPLtZ95URa9g", "blocksMintedPenalty": 0}, - {"address": "QeP8YLMspiyLEiUk81222gNufrrki19pbZ", "blocksMintedPenalty": 0}, - {"address": "QePEeXWEWzJ7CzA6MKxZKQK6u5h59Sh5tA", "blocksMintedPenalty": 0}, - {"address": "QePMhuKV43sV5vCuqNf74D4ZmccyQVZQTB", "blocksMintedPenalty": 0}, - {"address": "QePRbKhBbbcoH1jPJYLkY6YZqjWJ7T9DAJ", "blocksMintedPenalty": 0}, - {"address": "QePcYT5aVFERDeUXGsyLYTVXAFPeprEkYB", "blocksMintedPenalty": 0}, - {"address": "QePgyK9PziRK6V3jCFuUX3dXt3RLJinMzh", "blocksMintedPenalty": 0}, - {"address": "QePsHupuxJa5gJHWDqTeiGGjW2AZw82uUH", "blocksMintedPenalty": 0}, - {"address": "QeQiYjWp8rXQSRqHpW831FAnYCJPRLkn3H", "blocksMintedPenalty": 0}, - {"address": "QeRC61rsnZGMqEFFDcngZUs6pYULiJGVj6", "blocksMintedPenalty": 0}, - {"address": "QeRGxLRa3TYDxyjFTZTrnaRVrsxdt2i8eu", "blocksMintedPenalty": 0}, - {"address": "QeRPJ2rhNJ3oMpgvbLFewEdwyQsDtdxF3T", "blocksMintedPenalty": 0}, - {"address": "QeRfSyvy8g4hdqbj6txDa6chcjXWMBpRrP", "blocksMintedPenalty": 0}, - {"address": "QeRv9du5dN7T2baHca36r7Jmvqu7QRrFeY", "blocksMintedPenalty": 0}, - {"address": "QeRwAnGE8M25E1V34q3wp2vHC9VGYWDXjk", "blocksMintedPenalty": 0}, - {"address": "QeSWc5k3DbR3WNdcg2GsmPZjNBpy3kjHxA", "blocksMintedPenalty": 0}, - {"address": "QeT1ud6wr7T8V19h5bLmyDYUYc8QG5cLYd", "blocksMintedPenalty": 0}, - {"address": "QeT76Ta6vfpbRYbyGX8UBsAGq6WmPi6Hiv", "blocksMintedPenalty": 0}, - {"address": "QeT85j7vGVmWHskNngaZgrzppHbfGidqF9", "blocksMintedPenalty": 0}, - {"address": "QeTV7N6fYo6opyc2H7Vb1N1ZqiLdCmmBE7", "blocksMintedPenalty": 0}, - {"address": "QeTWKQw2Ruv25Nk2AxsPH4Vrxnv6vkMpxK", "blocksMintedPenalty": 0}, - {"address": "QeTnPbb4b6jVfPtaarCh8UjqFceWZEviK7", "blocksMintedPenalty": 0}, - {"address": "QeUE1o9KEW8p4VdsGiJB8Rx9GbJBkcNn83", "blocksMintedPenalty": 0}, - {"address": "QeUgFx4kuhF5LhUAXpHjQXtSPnKRW7qqX8", "blocksMintedPenalty": 0}, - {"address": "QeWHz4hA4jiGA9ecbYeYM6Uh8dvLoxXsWW", "blocksMintedPenalty": 0}, - {"address": "QeWn29AxyFUoyudozU66DnPUExy7hCTQmZ", "blocksMintedPenalty": 0}, - {"address": "QeXD7X1voKjm3uadyaDTJqZ7w9WyJBJx4y", "blocksMintedPenalty": 0}, - {"address": "QeXMdxgySi6WksqY6mPCTa5KZPoHMdXzYz", "blocksMintedPenalty": 0}, - {"address": "QeXXNVqR7nLq46kbaqUL3ByJFaqbsYiviD", "blocksMintedPenalty": 0}, - {"address": "QeXpDUTwH7hKBarni19qeBaYfF69dMCbRy", "blocksMintedPenalty": 0}, - {"address": "QeXsRCBcnAxMmhAJ7VrDuMj2eoCDgzhyKu", "blocksMintedPenalty": 0}, - {"address": "QeY1HepXWwTu5XDTANtJ16yhRgSqQ94S5g", "blocksMintedPenalty": 0}, - {"address": "QeYCu2D8J5UUWXDwYKpwrDyWPpH6U6iTrm", "blocksMintedPenalty": 0}, - {"address": "QeYrJpWhDtSRgPd1Lr7JzARRmBsyu9ekcs", "blocksMintedPenalty": 0}, - {"address": "QeYuyNgLhhcw4M6Z8mQEyP7mEp1o25JhKS", "blocksMintedPenalty": 0}, - {"address": "QeZRGdDBDDUoJRbjvJQkiB4WovxSdgKvth", "blocksMintedPenalty": 0}, - {"address": "QeZp79BM1WbyVcaaakw4ahaM6HP6nSRTaQ", "blocksMintedPenalty": 0}, - {"address": "QeZu4jysyu4rHjKhHCbndTYrmrMpf9VSgV", "blocksMintedPenalty": 0}, - {"address": "QeaCzaEVZ4cfeP1KtConb5UWaSxvv6m5Rx", "blocksMintedPenalty": 0}, - {"address": "QeaUmQEAjSGKQvKiWpw2E7Qf4MihHHCnCc", "blocksMintedPenalty": 0}, - {"address": "QeahCHN8tbswJrop759WKsooCdF7Kyuxo7", "blocksMintedPenalty": 0}, - {"address": "QeboAEnRHkYdEqxs3WDbCjQKqsAP5K33e2", "blocksMintedPenalty": 0}, - {"address": "Qebzpis17w4oWGyDFBTJUccpRjWki9kQ97", "blocksMintedPenalty": 0}, - {"address": "Qec1gnk8HRFVQTJjLiFmnnau7cfto1tGUM", "blocksMintedPenalty": 0}, - {"address": "Qec2ufvw52tUbdCuAT6ugzxLo4rG7E5Byr", "blocksMintedPenalty": 0}, - {"address": "Qec3t4zp5QV6H5cVhn8VN2LMm4HZzBeWAz", "blocksMintedPenalty": 0}, - {"address": "QecF4nCvPBwXvCu5WetJN1Pfoa55TQgVj5", "blocksMintedPenalty": 0}, - {"address": "QecGy5YQeJg7QZ8q5W5gvJaxkjAeEznsbq", "blocksMintedPenalty": 0}, - {"address": "QecJZ3LEMvXS7J1VpGraouPqKYt2qBnP2t", "blocksMintedPenalty": 0}, - {"address": "QecQZWmuTn4hYFw8nZVqQykLZskfBCfbw3", "blocksMintedPenalty": 0}, - {"address": "QecZorhBry897PyoUBNmoKgHgudGDJkVLx", "blocksMintedPenalty": 0}, - {"address": "QecfFrDmms4yqJN5iqJN3o1kbAndB9Kmkn", "blocksMintedPenalty": 0}, - {"address": "QecnmAjECLiLH5s6vBVH5pMKdTKLmEwiq2", "blocksMintedPenalty": 0}, - {"address": "Qecp5Gp3igCTSyCpLa1MK9GqzhooBrJHss", "blocksMintedPenalty": 0}, - {"address": "Qed8ikyshEWsHoAZFs8QWpM9tDidj2ffeC", "blocksMintedPenalty": 0}, - {"address": "Qeec4HchiP3EPAZseJ3yFfM4mUX3dp8f1p", "blocksMintedPenalty": 0}, - {"address": "QeejFfheu1rBRMGRJxeRknzxDBnWCBGNEC", "blocksMintedPenalty": 0}, - {"address": "QeerqqutwosdhTJMrQ8CuJKBsS9Fbf6C1J", "blocksMintedPenalty": 0}, - {"address": "QeeuZWRYMCH64g3kShR2KXffeMUfqjXj84", "blocksMintedPenalty": 0}, - {"address": "QefGiSFZgYmxudLjwX8jUA6Liwe24vpDjQ", "blocksMintedPenalty": 0}, - {"address": "Qefe5ybFWXyHkP96U5Ad3d1rFft9FaEYmu", "blocksMintedPenalty": 0}, - {"address": "QegVLaz3GN7MeRdqst234twBNaZZvHkGU2", "blocksMintedPenalty": 0}, - {"address": "QegaQLri57ACzdLfRKB29CjPeyQEmwPVrw", "blocksMintedPenalty": 0}, - {"address": "QehCkQq8GVtG7BVQR8TpBXhQrYRB24jwc5", "blocksMintedPenalty": 0}, - {"address": "QehHWGi4HtezuD1xbLu1iFoVBLpWRaih7Z", "blocksMintedPenalty": 0}, - {"address": "QehPDV2c9smcKqoHRfQ8jVfU8zRWG2q6AW", "blocksMintedPenalty": 0}, - {"address": "Qehfev2C1Yhxc6BSRAxthGuHFrF1Lemk75", "blocksMintedPenalty": 0}, - {"address": "QehxNtMkUXLyGuZfsnGxRzR17fCRdeQEX5", "blocksMintedPenalty": 0}, - {"address": "QehzVDLP4nDQhumFZrWet2SYCtzT3H9GS6", "blocksMintedPenalty": 0}, - {"address": "QeiMJzki5emikA9qvAvJ1e3yNcsNBxtpD9", "blocksMintedPenalty": 0}, - {"address": "Qej3hxubNnNhvCZyJTUcvfo7Y3CH4SH322", "blocksMintedPenalty": 0}, - {"address": "Qej4o8pcuJ4VWExdw5Rr5mdyD9NsTfEs6j", "blocksMintedPenalty": 0}, - {"address": "QejCCwUThn8xzoEKBd6gGRMTrLXgGjYgp4", "blocksMintedPenalty": 0}, - {"address": "QejWfgm9vLr7c7KayasYhuPsFxVBmciPbR", "blocksMintedPenalty": 0}, - {"address": "QejcF2z1AtyZ6UeVcRmcnoPiBg2UncBEhH", "blocksMintedPenalty": 0}, - {"address": "Qek788b82i9TLyGAiprG32imraGyiFSadp", "blocksMintedPenalty": 0}, - {"address": "QekYj2N7QQ4GTRQEiXFB5e61YNVo4TiEUp", "blocksMintedPenalty": 0}, - {"address": "Qekq7dS3MnezZ2TzMBFxVSWgdxKb9UU9E5", "blocksMintedPenalty": 0}, - {"address": "Qem4JS6UZGMVskCAJnaX97jsPCSY9rcVfm", "blocksMintedPenalty": 0}, - {"address": "QemwnUapoAYQ3xhyNq7rasHMunKg54acyw", "blocksMintedPenalty": 0}, - {"address": "Qen9DXzXUgbpcPEfo6yqNXqrpgax2DTtnT", "blocksMintedPenalty": 0}, - {"address": "QenHL156b91KqHXXLL3RLxzTn9keAwVNU1", "blocksMintedPenalty": 0}, - {"address": "QenqdQ5t6Zhr9maPmKxJkMKE5Vz2NSWiGT", "blocksMintedPenalty": 0}, - {"address": "QeoyU1apqP8xf3L3VE2ZP2fexH9MBvDJLL", "blocksMintedPenalty": 0}, - {"address": "Qep9xkUDy4ohmHLrDRqNygMVmWAo5sxtM7", "blocksMintedPenalty": 0}, - {"address": "QepHETfYTr6HtdMs3F5aYbvte6WsK9qYjX", "blocksMintedPenalty": 0}, - {"address": "QepV4BXBi274A6spYhkeUk9zpMp6z6eKTj", "blocksMintedPenalty": 0}, - {"address": "QepVtouPs4Piu4HLM7mPqcxxRvbMZZcnjM", "blocksMintedPenalty": 0}, - {"address": "Qepf6BZvxgNx8eR5FzGvD41HzzqiGar7jN", "blocksMintedPenalty": 0}, - {"address": "QeqFqV9akRtizef1y4JFXqGwQLLhfqN1tL", "blocksMintedPenalty": 0}, - {"address": "QeqUzrzz3gGh96ZD7wAwJnLyJafHtvV1pt", "blocksMintedPenalty": 0}, - {"address": "QeqYng38AsXwt4eKE1h6j7jqu9hxGUdhC5", "blocksMintedPenalty": 0}, - {"address": "QeqrRhhNSVhWWo3rGCwG8uzxyVvAATkA7z", "blocksMintedPenalty": 0}, - {"address": "Qeqx8dQXaep3qLn4trLVijpa47s4LKwHDo", "blocksMintedPenalty": 0}, - {"address": "QerAMAkiQB4pgYCQvecarToCMUvoau85uS", "blocksMintedPenalty": 0}, - {"address": "QerDWJJTRDEK43D3XebmvLfHDajo5aqm4m", "blocksMintedPenalty": 0}, - {"address": "QerFs54XeHRzPuv8e4k7LcPsumPz3FaXBP", "blocksMintedPenalty": 0}, - {"address": "Qertx2j1zsthWtCqw75hNXm3RtK4T6DetU", "blocksMintedPenalty": 0}, - {"address": "Qes16taf9xDT8mDCh1kzS9CLMiuzz8k3py", "blocksMintedPenalty": 0}, - {"address": "Qes8tu9WMWbhog8ysymS5mfykU71C2rSj7", "blocksMintedPenalty": 0}, - {"address": "QetPsjZZXKrDAtcMZU6Dj93niBGMhBhkHk", "blocksMintedPenalty": 0}, - {"address": "QetdRqqtF63DogeHcLacGjymny25q7EN7J", "blocksMintedPenalty": 0}, - {"address": "QetuNA4vbHsiM4HiNiZL3g8MhX6XP8CGZR", "blocksMintedPenalty": 0}, - {"address": "Qeu6TimqMfusVrzaVGsNtCKw4UnRzC9Gsz", "blocksMintedPenalty": 0}, - {"address": "QeuSrm2hgfLwk9C4jiiishNa9wTH7adU1W", "blocksMintedPenalty": 0}, - {"address": "QeuWAC6Ued6i5ddXYCnV7TvpKZfMyvUNoS", "blocksMintedPenalty": 0}, - {"address": "Qeujh3TbUempgiDnz9cQCV2UCPZa4RLs19", "blocksMintedPenalty": 0}, - {"address": "QeujkgT5KUfAdpRURok8vZzwgTZGYH8DQ4", "blocksMintedPenalty": 0}, - {"address": "Qev35vsSWsMLtok7ntGzDUn7ZP8a8Z28Df", "blocksMintedPenalty": 0}, - {"address": "Qev7CBhwBJPHv4ectrNskbAYUS1FdsBoAd", "blocksMintedPenalty": 0}, - {"address": "QevbEgTDXApia8Y3qw6Tb3usfAs6XoDqtk", "blocksMintedPenalty": 0}, - {"address": "QevgxC9u4ybT1bMvu8g1j6KMEsSvbkRSmH", "blocksMintedPenalty": 0}, - {"address": "QevrrxMEz3bP8BbxjA7U78pd2HmfDjWaH1", "blocksMintedPenalty": 0}, - {"address": "QewJRCjamZk8nhkqU3vo1EoEVj3XSioyLj", "blocksMintedPenalty": 0}, - {"address": "QewVdfNVLrDw65f9tbuEpvyo9aUVTAakfF", "blocksMintedPenalty": 0}, - {"address": "QeweXCuYPmV1nxtuu6K6HkVVuCSB2f7oqC", "blocksMintedPenalty": 0}, - {"address": "QewnSggPEqvQ3fwXmDvqQQZZLnx6BPHKvf", "blocksMintedPenalty": 0}, - {"address": "QexPCPTRqykNDMRC8NAMJRWCZzXY6NuVRo", "blocksMintedPenalty": 0}, - {"address": "Qey98aKanA3QSzgEUWvY4wYbdLfzsoprod", "blocksMintedPenalty": 0}, - {"address": "QeyLeHPJ4wNpvCjkJMw17i7ePbGaMtnV3z", "blocksMintedPenalty": 0}, - {"address": "QeyNpyDzYvsKi9AavZA1g1R4t2vpN12DtY", "blocksMintedPenalty": 0}, - {"address": "QeyPsNW7yoWHAXTCHRnDRmQRuC4VDGGbFM", "blocksMintedPenalty": 0}, - {"address": "QeyktnDd4aJuBF6cjJekj1bkRDWQV4iaQc", "blocksMintedPenalty": 0}, - {"address": "QezUx7ypfFyis629QUxAoc6bFgMm9L8e6a", "blocksMintedPenalty": 0}, - {"address": "QezbNLR4EVLMA8vATekPUttWquHpykh44h", "blocksMintedPenalty": 0}, - {"address": "Qf1F8fuJ7VxsdsHQtvrLNg9Q12UvForZKL", "blocksMintedPenalty": 0}, - {"address": "Qf1UdkLbZpxGP9miEbBiB53EecDW1eyiYh", "blocksMintedPenalty": 0}, - {"address": "Qf1c8aEb5FRoiCXHJiqAmSvicopTQJ1HmB", "blocksMintedPenalty": 0}, - {"address": "Qf1v4KyrEeKVUDLzQbZ2eRXaodTwnJVyuT", "blocksMintedPenalty": 0}, - {"address": "Qf2NPFj4vUzvBiHt35LPzgKKphs3jjzsXn", "blocksMintedPenalty": 0}, - {"address": "Qf2RfHRGjSbcVw1AC7buMXpCYkF7fPEMzc", "blocksMintedPenalty": 0}, - {"address": "Qf2VNAs4KP2P5WgK9xgnSXsCsjC2vpq7ft", "blocksMintedPenalty": 0}, - {"address": "Qf2cP32vYmeT8TSxkKeAsnhvNDiFo1fCbs", "blocksMintedPenalty": 0}, - {"address": "Qf2rahgq8afjhc5YxtNrRZ8DhsAzdg6BXg", "blocksMintedPenalty": 0}, - {"address": "Qf3FLZjseg4UzDJiU2uUg4XXMNTwoZ51fm", "blocksMintedPenalty": 0}, - {"address": "Qf3LRZgpspFKZFMug3fvBXp5X1rHTjz1gv", "blocksMintedPenalty": 0}, - {"address": "Qf3hCwN74tAoequ1RQFKZeCDfvgqmDheVL", "blocksMintedPenalty": 0}, - {"address": "Qf3tvhWWtg6j1b5sMF2a4Akj3dRDjxeoUj", "blocksMintedPenalty": 0}, - {"address": "Qf4HwahG99ZER8nwMFJQcKermkB1bQGyjj", "blocksMintedPenalty": 0}, - {"address": "Qf4ZrKwRAz8bPtG8rswyBVkQUnFv9KgwUf", "blocksMintedPenalty": 0}, - {"address": "Qf4nVpmiWvrrje7uM6ecJykQqn5aCSSohj", "blocksMintedPenalty": 0}, - {"address": "Qf4zSnkpYVhZVoVUZHwexsyo4UThzHN11y", "blocksMintedPenalty": 0}, - {"address": "Qf543s8iSYyVACmLbPMYywAzEHBEbpi9RL", "blocksMintedPenalty": 0}, - {"address": "Qf54FAbTgiEjGF1Do1e9XYEZjiHTf8tw8p", "blocksMintedPenalty": 0}, - {"address": "Qf5fAgF9bbsvrzXwd2ooYXC9dRMRG8RwYL", "blocksMintedPenalty": 0}, - {"address": "Qf5iPTw6ajaJKmNbxz12HfaVhwndcpr6uX", "blocksMintedPenalty": 0}, - {"address": "Qf5rN2oaXXqbKUYEmW43fwFixxawwj2sDp", "blocksMintedPenalty": 0}, - {"address": "Qf5sDFpFFgX2TSrgPtqEAp2GiH1x2KRAit", "blocksMintedPenalty": 0}, - {"address": "Qf62YK22o3TwVepFSh7wSgVKaLi8cZJKgF", "blocksMintedPenalty": 0}, - {"address": "Qf6RbBRM5GT7gRvBNLyh5LM9bHEgkGNP1m", "blocksMintedPenalty": 0}, - {"address": "Qf6qUpugY1RaCFyrd5UgwWCFwifH75Rb1c", "blocksMintedPenalty": 0}, - {"address": "Qf71USG9dngAa8dJWfuaS3HQfvcBP22wK5", "blocksMintedPenalty": 0}, - {"address": "Qf7CFeN79pSK1QHSTcNKKYYuPYGS5vi68C", "blocksMintedPenalty": 0}, - {"address": "Qf7CWr1qxK7aw7tkPPmRXaX7MRKkVUJ99o", "blocksMintedPenalty": 0}, - {"address": "Qf7DccZLzVoiFPzqR5XekZcdxLBdkRxf6i", "blocksMintedPenalty": 0}, - {"address": "Qf7QdGDfNbShDFpWyNAhh46JAcoYCVQD3P", "blocksMintedPenalty": 0}, - {"address": "Qf7g1HN2V5eeWYbupCZBqmnRWm4HJPHRLg", "blocksMintedPenalty": 0}, - {"address": "Qf7sY92xroH8yk5ka4ofNddSecfjowA4m6", "blocksMintedPenalty": 0}, - {"address": "Qf87hsMndqhPqGwYaunJdokWQubiaFy59K", "blocksMintedPenalty": 0}, - {"address": "Qf8BZgfCvHTTYxS86mw5PrDmwdDEbFVqxa", "blocksMintedPenalty": 0}, - {"address": "Qf8hFp4YVbAJkJr9tn1kizh9VkRtc29g4J", "blocksMintedPenalty": 0}, - {"address": "Qf8wpPL2ptEhhxAdhSU1RCF4TqKHuFkxhP", "blocksMintedPenalty": 0}, - {"address": "Qf9WLKWAKVMVfd7c2fU4uYQJkJpbamYuFN", "blocksMintedPenalty": 0}, - {"address": "Qf9hwccB76EXaUGSrR6iRwWCP8AoKkKD4M", "blocksMintedPenalty": 0}, - {"address": "Qf9jtfDwP6Poujd1fiWBuBU3kvAUTTtaRP", "blocksMintedPenalty": 0}, - {"address": "Qf9xims5zrVhzRhrLrd22WdNb3VkYQ6HNa", "blocksMintedPenalty": 0}, - {"address": "QfA2ro4sJLvmwyW9qZZSFsZavhFcm9CfAx", "blocksMintedPenalty": 0}, - {"address": "QfAK7QFLPnRThgfAid7ATvTQ4qMixqp6Ak", "blocksMintedPenalty": 0}, - {"address": "QfAaPM5puZZuRh73GCGaPkPqbczipBr5Zi", "blocksMintedPenalty": 0}, - {"address": "QfAy8cmuJqbRue5M44e1XPLXTcjKUuBKPw", "blocksMintedPenalty": 0}, - {"address": "QfB2piPgusRw112NdUycxd6jNvj6ju5ws5", "blocksMintedPenalty": 0}, - {"address": "QfBDnFGqLvvfpsqF1WhUJLkGuhQJwUzDqG", "blocksMintedPenalty": 0}, - {"address": "QfBKBqrMdXCwqu232Cqe348YdL7oXgcpXs", "blocksMintedPenalty": 0}, - {"address": "QfBNDZenkCzXHjrx7u6jfH69avVmE9Cjmm", "blocksMintedPenalty": 0}, - {"address": "QfBerTk7hbUcuvzv9w49q9qQYUxtKd3Bjw", "blocksMintedPenalty": 0}, - {"address": "QfBvZL6D7seCWZCErKZPhkZMYBkDn3sZrB", "blocksMintedPenalty": 0}, - {"address": "QfCdAjywYeytw51XqVT6UU1hSvNsbsg9tB", "blocksMintedPenalty": 0}, - {"address": "QfChTuFv6HV69eSPxxjrDxzfaih2hQXuET", "blocksMintedPenalty": 0}, - {"address": "QfEBSibA7zbjyrYqHNicYLqCrKMkNYws9b", "blocksMintedPenalty": 0}, - {"address": "QfEXnpWCmdBxqTM9fgWvSKRmm4Cx4wgGRW", "blocksMintedPenalty": 0}, - {"address": "QfEbAhkCKzwvtVm3sZ3wpkGGbhicFN51XF", "blocksMintedPenalty": 0}, - {"address": "QfEpkjvMnGPs2KjPPTJJdPHVyMK8uo1tgn", "blocksMintedPenalty": 0}, - {"address": "QfEqmom356oHh7DPLNiYUsoSTTSipJi5Zn", "blocksMintedPenalty": 0}, - {"address": "QfEvvafWyPxK48TT3bp4RkAZYUi7cUvkbe", "blocksMintedPenalty": 0}, - {"address": "QfFD4onUxa35qtHyXyytG3z45FdY9UuquW", "blocksMintedPenalty": 0}, - {"address": "QfFpRZtJH9Tf6mfNURczjwKFuBTuSDf4RM", "blocksMintedPenalty": 0}, - {"address": "QfG2dwzt2w6nKwbHqvAFdkwgdZU6C2cZN9", "blocksMintedPenalty": 0}, - {"address": "QfGGprgKjut4P8FMC5NrHPY1nP7qiRu6T4", "blocksMintedPenalty": 0}, - {"address": "QfHFsSZoQNCQ1DYTcU7GkgKUHNokZsJcaM", "blocksMintedPenalty": 0}, - {"address": "QfJ7hQgHxY1FvixxFy4woJs8LeFWuW2efx", "blocksMintedPenalty": 0}, - {"address": "QfJDg4ZzNm64dVJZ2HxaMst17BtX85EsfE", "blocksMintedPenalty": 0}, - {"address": "QfJmit1k2SirGe6Z9XHJcZ3nXfQQakpL4M", "blocksMintedPenalty": 0}, - {"address": "QfJtjHvFeoZZz2vvNprX6MaY4c7ktGokFp", "blocksMintedPenalty": 0}, - {"address": "QfJudKhydWZazKFz97VxUbGz8LgDK1GjLV", "blocksMintedPenalty": 0}, - {"address": "QfK4SUsmLwgdrVB98NKTDAHocqKjm8xeug", "blocksMintedPenalty": 0}, - {"address": "QfKFx1HMpeqhQjQNKd5pshmxFdGaKu5hn8", "blocksMintedPenalty": 0}, - {"address": "QfKgAQyaiVFRURz8uhgpknG7E1mJRjnwGL", "blocksMintedPenalty": 0}, - {"address": "QfLFa5myqHCXuETZePJ6dBvWqDsGPkvCx7", "blocksMintedPenalty": 0}, - {"address": "QfLVgy8wQwHsE1FNqihfbVRhUFAeNwt2EB", "blocksMintedPenalty": 0}, - {"address": "QfLaQR7uxGPGE8ZxtN9s192xuAq2ijBmrN", "blocksMintedPenalty": 0}, - {"address": "QfLbuoRK83aFRDHf9e7ZKGEDUkcT3bfXEB", "blocksMintedPenalty": 0}, - {"address": "QfLobnwhFy4sfxwSfUjBQ9Hk4BrPShzXuu", "blocksMintedPenalty": 0}, - {"address": "QfLtk82TfUV89NywLmLjBK5ULm5LUy1nz1", "blocksMintedPenalty": 0}, - {"address": "QfLvzoTA9HPM4W75sApZs9attJWAuY9GwS", "blocksMintedPenalty": 0}, - {"address": "QfMATriw6ZrwM43Q7JeDz27TX4ERBhNsCv", "blocksMintedPenalty": 0}, - {"address": "QfN73SMyL4RLWzHwkJLRRMmYwMwAnLQuf3", "blocksMintedPenalty": 0}, - {"address": "QfNEZEtH3epXBuri1zUmyCXot4K4JbM4Hx", "blocksMintedPenalty": 0}, - {"address": "QfNP1fToCKcbNnTy6uEFN7CDvVuqZgWJQP", "blocksMintedPenalty": 0}, - {"address": "QfNqgFeVjirUWHnk1Tq6oK5gty3o1Mbjzz", "blocksMintedPenalty": 0}, - {"address": "QfNwuuYR9sH2XQcAGeEsNzi25aZ4WRoH6J", "blocksMintedPenalty": 0}, - {"address": "QfPQM9BSsiV4UVqQAeEAyknkHZX4WUiPzs", "blocksMintedPenalty": 0}, - {"address": "QfPQNq7QXQQfkuZKtz3Pk1GhSFTL8FQSGM", "blocksMintedPenalty": 0}, - {"address": "QfPdVcLyj2tZ1ERpaVK9zyYDe9fTWEDn6o", "blocksMintedPenalty": 0}, - {"address": "QfQHF8idPFEuZjqo1xPnQJNXRtPQzHQZ4j", "blocksMintedPenalty": 0}, - {"address": "QfQSDJmK6LqZaJhTD9EyB5DiinKQRU93K9", "blocksMintedPenalty": 0}, - {"address": "QfQrBpCFsH1MdtRMwiKi14C3rbzhpn4hEM", "blocksMintedPenalty": 0}, - {"address": "QfRvXRtaT4JcaBKrYYFPrTyrdvXdEAzatB", "blocksMintedPenalty": 0}, - {"address": "QfSgaq3bHTGPAzKsXSjkkDuvKLpn2a7vLP", "blocksMintedPenalty": 0}, - {"address": "QfSuWRfrztoNaLsqHHFwwc1Q1cfsEZ2kcM", "blocksMintedPenalty": 0}, - {"address": "QfT2dQjWJwSUxDsLMMMxmS3HMd8nGc1Xak", "blocksMintedPenalty": 0}, - {"address": "QfT69ePmJfH1AJE4i4BRjkASRY8t7dHkL8", "blocksMintedPenalty": 0}, - {"address": "QfTKctrVRdw96qpVZ1fNG5AbZkg234xC5L", "blocksMintedPenalty": 0}, - {"address": "QfTVEKx3Gb5yERVrUraN1VWZgkZ6piAMLE", "blocksMintedPenalty": 0}, - {"address": "QfU446XhA7L7PEkZxAu5xZLW5e1MtmM9r1", "blocksMintedPenalty": 0}, - {"address": "QfU53sTNBVSY6s3mk7XPLzWZWyhiSDamzq", "blocksMintedPenalty": 0}, - {"address": "QfUGtZC8CPdmijbxJdWzkPLi5GPPCzCMdg", "blocksMintedPenalty": 0}, - {"address": "QfUKWk6pm7q18ZiFGSpPR6uuqFCEZfX6aS", "blocksMintedPenalty": 0}, - {"address": "QfUKbdbrPdxpokeZfwRAbk1GpRWRMh7sxB", "blocksMintedPenalty": 0}, - {"address": "QfUNhuQpTLXiWpt1PEJXwv5FHdP72rjhFy", "blocksMintedPenalty": 0}, - {"address": "QfUkWcAQV97Nx6vcus7jVBBRpwds3VHKYk", "blocksMintedPenalty": 0}, - {"address": "QfUmp5fQCYfGJv6nG9ttgYGuJDMbRuFouk", "blocksMintedPenalty": 0}, - {"address": "QfUvMcRJnK2rxe9LteEx1ZdrHG4vxUYmNV", "blocksMintedPenalty": 0}, - {"address": "QfV2zxsYBXFpW3SED6fA21x5ji41XMJzeD", "blocksMintedPenalty": 0}, - {"address": "QfVirUp7AfudrKiYCtQTt4KfBkH1oxyxDc", "blocksMintedPenalty": 0}, - {"address": "QfVmipWvpEGuWMtajZ3WPUfJLUr91EqSbb", "blocksMintedPenalty": 0}, - {"address": "QfVyJ87Lari96jJ9BxUkYZwBn99xArH8jU", "blocksMintedPenalty": 0}, - {"address": "QfWCT4asXj31ayfhe3HZopTLB12oeVnyp5", "blocksMintedPenalty": 0}, - {"address": "QfWX29ZsxmzazmTFGnT6ccR8yHiwfXFZc8", "blocksMintedPenalty": 0}, - {"address": "QfWseKGfT63iCsXUrHyQNaDUn37hJsKk6r", "blocksMintedPenalty": 0}, - {"address": "QfXN2WVBosXGXgYHSmaq2sgnT9vv3DYBHR", "blocksMintedPenalty": 0}, - {"address": "QfYNde9kJ2A5bxR6UbkerKJSe6bNtyULcF", "blocksMintedPenalty": 0}, - {"address": "QfYSQAbKrEhs4ePGYCJ9yFGunVb1izm7UA", "blocksMintedPenalty": 0}, - {"address": "QfYY6sfCTXugsiRFnfq4CYeuBPzmW4R5C7", "blocksMintedPenalty": 0}, - {"address": "QfZCyj8kobpw2nCM8exRCLzAgSssRsXCQd", "blocksMintedPenalty": 0}, - {"address": "QfZKLdYNjVXyL5Yn8V5q9xxqq47FJ8knhM", "blocksMintedPenalty": 0}, - {"address": "QfZKc2rbtDYSYkU6SaVVoCzz7K7e2fpacb", "blocksMintedPenalty": 0}, - {"address": "QfZaDcaGjrrQbPfABr7ekdjpNS8jEKvvzL", "blocksMintedPenalty": 0}, - {"address": "QfaGAi4pu1dRpZUyR8huVYLaobbsA8eE6X", "blocksMintedPenalty": 0}, - {"address": "QfaTPxvdrsPh9VTZYwqeB5AgsENuvjB4vj", "blocksMintedPenalty": 0}, - {"address": "Qfbof9kmk3wCkXhadT3J4nTzLGx4GSEoau", "blocksMintedPenalty": 0}, - {"address": "QfbrdSZv5YBJus26gaH9DbWMAHDzqyYpp5", "blocksMintedPenalty": 0}, - {"address": "QfbtxRpQxmmsHPPMf3iuUuYxZmNQCN5cwq", "blocksMintedPenalty": 0}, - {"address": "Qfc77E1J1MBKQpVEPuBbjs9rHa8GnTphXP", "blocksMintedPenalty": 0}, - {"address": "QfdEXpL6TFWURU9gbdezdHwhSqnW2KR67S", "blocksMintedPenalty": 0}, - {"address": "QfdFnn6z3U9cxbBZpJgtiSX9j9TUmBNviw", "blocksMintedPenalty": 0}, - {"address": "QfdUqcWmdTEwRNiqKFk2qF3QooSSUuu6pZ", "blocksMintedPenalty": 0}, - {"address": "QfdWDz53zZFLigY6dHZE4XwKs8eud9Yc7w", "blocksMintedPenalty": 0}, - {"address": "Qfe59nnJfd9tR6L1svddLHm3nbFw5jqH1J", "blocksMintedPenalty": 0}, - {"address": "QfeUum9QLGVdVoVkgDCrEuDXuV4iDSJC2e", "blocksMintedPenalty": 0}, - {"address": "QfedxzGKA515LCt94xXgbof6b1Ax9T4D1D", "blocksMintedPenalty": 0}, - {"address": "Qfen3cjc34WaZxPQUQPEm82ne2iuUzCewj", "blocksMintedPenalty": 0}, - {"address": "QffDSXW7tTUUdwEX6d7q7gsF1h98yN7jgo", "blocksMintedPenalty": 0}, - {"address": "Qfg23uQEuMyCf8zAZbXewKyVdpXneuVPjh", "blocksMintedPenalty": 0}, - {"address": "QfgLCh1hdQvk8WpmuGY1YDeLJ882Lg56B9", "blocksMintedPenalty": 0}, - {"address": "QfgWJRndpUU8HPGCRmfbRczq9vvDu9iekD", "blocksMintedPenalty": 0}, - {"address": "QfgjtFWyHCrB6x5TpJR2GFYCvqPtGWtJQX", "blocksMintedPenalty": 0}, - {"address": "QfhEqC8U8Km3yynaNxruWTvdnpCjh3hcop", "blocksMintedPenalty": 0}, - {"address": "QficuSoiD47jePyKnL14RBRkasRjkWgU9i", "blocksMintedPenalty": 0}, - {"address": "Qfim9S5xpwii9gRujrugTgZpcXaCNiTB2h", "blocksMintedPenalty": 0}, - {"address": "QfinbaHadxEaHHcfsTxhFsYVEKDbWYnHJ2", "blocksMintedPenalty": 0}, - {"address": "QfiuB7NP4zGsrwKZijN8ZLN46znoJ6NZEf", "blocksMintedPenalty": 0}, - {"address": "QfiuLyt6og92HpPJ62jQoSP1D88gUzoRNE", "blocksMintedPenalty": 0}, - {"address": "Qfjy6jgH3SXoVkzVwx5VwNKjR8JWQioLKa", "blocksMintedPenalty": 0}, - {"address": "Qfk9cTF6z3ZBQJ2wMjKE2zdessQWf5nBYK", "blocksMintedPenalty": 0}, - {"address": "QfkhqpC9BiNrhvP2WrXZnrj4ZSBCENcqgX", "blocksMintedPenalty": 0}, - {"address": "QfmCLHgWgsYnqxudmsQ9qwNGvB6XXy5zLM", "blocksMintedPenalty": 0}, - {"address": "QfmCm5sKUK6xMXApy5pN3asVFAgZUbXjGi", "blocksMintedPenalty": 0}, - {"address": "QfmEPPbZtu1BZhMpToTmUDNwg6Mikdpxf7", "blocksMintedPenalty": 0}, - {"address": "QfmTJgEGQZ7WHUMEHiyJmbaCn9pcTr1uFt", "blocksMintedPenalty": 0}, - {"address": "QfmrJZBnkkWo3iZgNBDHRWyJHxf9WxvDEa", "blocksMintedPenalty": 0}, - {"address": "QfnRGcNw2JxSS5eNJ6DQ2Z9zjRFAxwJJ9A", "blocksMintedPenalty": 0}, - {"address": "QfnX1oN3rCSaQH9jaEy5jTQ4KkC19zqAc6", "blocksMintedPenalty": 0}, - {"address": "QfnbnWrRQ4HNDQvtg3wG2B1eC4ycUsFqZz", "blocksMintedPenalty": 0}, - {"address": "QfnnCdpjfWfM97BVYZLKiS822GkeD1argN", "blocksMintedPenalty": 0}, - {"address": "Qfnyo7MLdJh5TdkrXiYN7rHdCktfeTz8GC", "blocksMintedPenalty": 0}, - {"address": "QfoPTVEkX2tKQoMLEWoB2a3Uj131jNCoUW", "blocksMintedPenalty": 0}, - {"address": "Qfoc6yAviV811atfsjF7S2ZQH7wuQQAn7T", "blocksMintedPenalty": 0}, - {"address": "Qfojzu2u3kKaW4W4fuE9YSVzBpvS45nHZG", "blocksMintedPenalty": 0}, - {"address": "QforR1zMVsJDUiG9mjj5sz3LSpZMP8E2QR", "blocksMintedPenalty": 0}, - {"address": "Qfp2QZLUvrU8obR1GNGPZMqccuC8eiy9Hb", "blocksMintedPenalty": 0}, - {"address": "Qfp83jQGj7Q3igpfhpNkFwZXfrShCwJWHj", "blocksMintedPenalty": 0}, - {"address": "QfpDJsxUhn5k418YNfjjbphuy7nhtTLaDY", "blocksMintedPenalty": 0}, - {"address": "QfpestrLjpJw77udrRCo4Y4sEKCjrs8R4W", "blocksMintedPenalty": 0}, - {"address": "Qfq8HH5H2k9NtAyDA44Gb7Yh9csHg8X5eP", "blocksMintedPenalty": 0}, - {"address": "QfqFwQZffd8TbJvSXdNxGjy68Ak7aWEQa5", "blocksMintedPenalty": 0}, - {"address": "QfqGYRtGphxkvU3awJx62qDLvUFFRWexco", "blocksMintedPenalty": 0}, - {"address": "Qfr2fFmuXZ5GdDCDNpfwXZg9aVSfFEHGkk", "blocksMintedPenalty": 0}, - {"address": "QfrAnHffEcsYnQrMgr3x3G8vxAnWygLqgi", "blocksMintedPenalty": 0}, - {"address": "QfrAzZsAh174JkimA9bVS2iecwcFy4LtRq", "blocksMintedPenalty": 0}, - {"address": "QfrF7QPKA7wihJpe5nfvT8PHMRagM2Z5St", "blocksMintedPenalty": 0}, - {"address": "QfrKoUBwahanMjD2E7SNeDEgLAVwwMRmKW", "blocksMintedPenalty": 0}, - {"address": "QfrN9K7hDDKqzuhKNcBdzMKSmdeXzt3nZt", "blocksMintedPenalty": 0}, - {"address": "QfriA1UwzgYJjwNU2vuQqSWM6K76uAtLa1", "blocksMintedPenalty": 0}, - {"address": "Qfrio6ePkbSq7YDWp2JCPwJ1TTkm9Z6Xpw", "blocksMintedPenalty": 0}, - {"address": "Qfrx9mX1naXfxXFzcmMEmRFchMNnj41S89", "blocksMintedPenalty": 0}, - {"address": "QfsN4hGoBr91E1DQDYnnA9ZhMVuoDyuTLL", "blocksMintedPenalty": 0}, - {"address": "QfsR1YM9Si2RfPXVS3wmyp6KDL1zSerA1H", "blocksMintedPenalty": 0}, - {"address": "Qfsc3V6xqiVMEDbLwh6jbQJ95VZAwGv8w9", "blocksMintedPenalty": 0}, - {"address": "Qfsehk2BoEzyvsg7vvmbEaz9KFbbjtrUds", "blocksMintedPenalty": 0}, - {"address": "Qft5U9Aq3gNWrPqupCYM5vu482P1xNtMEW", "blocksMintedPenalty": 0}, - {"address": "QftGG8nh4cpSpaFc5peexos8G1Yk6VcVZn", "blocksMintedPenalty": 0}, - {"address": "QftTJrFyZGKeedj5WxHrDrZtjzAxUf9ALu", "blocksMintedPenalty": 0}, - {"address": "QftYvnnxE3SqQfyUhpEhLGdp792daN9e4E", "blocksMintedPenalty": 0}, - {"address": "QftsPE5nkDnTdUg8SQabJScvLPBsLWesXR", "blocksMintedPenalty": 0}, - {"address": "Qfu2u6hgWyTyQBF3BdUjuPktJbFTbG39K6", "blocksMintedPenalty": 0}, - {"address": "QfuAFJet2j6fhSCQWiSchc6JqyYuVfVrXs", "blocksMintedPenalty": 0}, - {"address": "QfuYZs8JPomm2xvNe8z1AaZKQBcvyKFvBk", "blocksMintedPenalty": 0}, - {"address": "QfuaWviGJzuEZZVBjAEizN19fQDoEEQnBM", "blocksMintedPenalty": 0}, - {"address": "QfuePXR5HDJRtApYe1NhxWvf2Tmatx3nNk", "blocksMintedPenalty": 0}, - {"address": "QfupYC51nivqGzFs8MJbK1v3yTwoQGA4Pf", "blocksMintedPenalty": 0}, - {"address": "Qfvhxwp2JpbAh6jCzFQ8cxs6vCGQfwiNLn", "blocksMintedPenalty": 0}, - {"address": "Qfw7EmMuMbtGEBwdf21r8jABvZnygz8cgK", "blocksMintedPenalty": 0}, - {"address": "Qfw7MDC2vFzABAJ7RwZFcY9Djed7AsQGjK", "blocksMintedPenalty": 0}, - {"address": "QfwuG11SNuvP7tiL1LYiqX67AqKEeVnYvh", "blocksMintedPenalty": 0}, - {"address": "Qfx1odbGUdU5nezsbmq9jczUbmfRLASAEp", "blocksMintedPenalty": 0}, - {"address": "QfxKqFWXbpVaFPEFz2ktr8tmJ2zPaLw1XW", "blocksMintedPenalty": 0}, - {"address": "Qfxi1R4drUPNK1giKyKecBTGCS3PNAB6Mo", "blocksMintedPenalty": 0}, - {"address": "QfxjgNexWJy8mDRXoqXfuXZqaEtfUv7sG2", "blocksMintedPenalty": 0}, - {"address": "Qfxp6ddzQqSvpBsvAfKW5hW9Vz9kTbwGds", "blocksMintedPenalty": 0}, - {"address": "Qfy2bQfgAs835oBgHLMcnoHT2KSuNhQq2Q", "blocksMintedPenalty": 0}, - {"address": "QfyD9cdf52NehWpTb561U9Mf4tNivNa98f", "blocksMintedPenalty": 0}, - {"address": "QfyESsppKgCqCe456SXxiQqShjQPhFsSpP", "blocksMintedPenalty": 0}, - {"address": "QfyKt5Td92FstEfqH6SJoh4x3YxTZ6DH2m", "blocksMintedPenalty": 0}, - {"address": "QfyVdsAmfGiz9dD2VBHDw1g8GDEmAMq5gP", "blocksMintedPenalty": 0}, - {"address": "Qfyc2n5wAzUttpjZiKMGzV7vTaC8w8tEfY", "blocksMintedPenalty": 0}, - {"address": "QfynLyjHbyuLiQrB6KVZjxymEkmhKF8hx8", "blocksMintedPenalty": 0}, - {"address": "Qfyq1TLZKYjC1nSYQ3cZDqko9hQRr11Lrx", "blocksMintedPenalty": 0}, - {"address": "Qfyq7MyArzt2GuaxcaiCfZ8t5myQpm2kQg", "blocksMintedPenalty": 0}, - {"address": "Qfyr3KkRA4i3pqC5b7TNNC2dNcuh6yRTvs", "blocksMintedPenalty": 0}, - {"address": "QfytkQPp3SdPqPNdAepSiqTqMy1vYVzVXe", "blocksMintedPenalty": 0}, - {"address": "QfzmLLLPTFPns8xGfpYvRwikz65q7bGtPb", "blocksMintedPenalty": 0}, - {"address": "Qg18anmHsqoDXDcnhazcb12TPWA5qCDUbT", "blocksMintedPenalty": 0}, - {"address": "Qg1jjdHu6MzPDaeBGD5eYEVvq7qmq5bPd5", "blocksMintedPenalty": 0}, - {"address": "Qg1yoX7f585AyJSp2Cqo8CE1FfGMku6r52", "blocksMintedPenalty": 0}, - {"address": "Qg2CKeMC1F4G77hA1qcsC1VRJdxJn8ae9h", "blocksMintedPenalty": 0}, - {"address": "Qg2E7XSY8eNuZJGhFAsD5vNxgm34x2QZtd", "blocksMintedPenalty": 0}, - {"address": "Qg2hDz4H6crfvAi22666buzWPkPqRVRCtq", "blocksMintedPenalty": 0}, - {"address": "Qg2spRxZ5dhAMKXABHRgWdeH6Q4UbV7tSL", "blocksMintedPenalty": 0}, - {"address": "Qg3TNto7hGd3kHb1extNHpaKLRrihtkd4K", "blocksMintedPenalty": 0}, - {"address": "Qg3VH9WUMLcV4TVncqicdeJSAqETHTH3oc", "blocksMintedPenalty": 0}, - {"address": "Qg3a6A8PJ9zwMCr5eXxzNoxcELWY8fbm9N", "blocksMintedPenalty": 0}, - {"address": "Qg3zxrT4EgJC52Piqrat6SCWV2DstVfqi6", "blocksMintedPenalty": 0}, - {"address": "Qg4JpdDTJ3bDdisFURajiZudQ2bDpFHGBR", "blocksMintedPenalty": 0}, - {"address": "Qg4Xt9cTyMFA24qyZ2krwg67RrKqFhxkB2", "blocksMintedPenalty": 0}, - {"address": "Qg4diCUN1NqkJht6YdirqwZegZ4URbwimi", "blocksMintedPenalty": 0}, - {"address": "Qg4kUWoGLCdXUoLosh1eZ95Jh62Famg1U5", "blocksMintedPenalty": 0}, - {"address": "Qg51cpVz2HxAw5u6dWMtCqyzd3XK62wktF", "blocksMintedPenalty": 0}, - {"address": "Qg5JjDaQDavfdkVLxg6T4UPrXk3aZT7dSi", "blocksMintedPenalty": 0}, - {"address": "Qg6Z7HaQWko2JeP3f9uuqmn1qaQY71Ky1k", "blocksMintedPenalty": 0}, - {"address": "Qg6kA4JDvo23t1WGFTQ3MtZTNTwKiiAzaJ", "blocksMintedPenalty": 0}, - {"address": "Qg6zAit44isxgBxY9rGk3koiGVg7Gvnzjw", "blocksMintedPenalty": 0}, - {"address": "Qg7SNqi3B8YQpy5ZvjugNHtuffg5KdtttA", "blocksMintedPenalty": 0}, - {"address": "Qg7w7sjvAt2uGk9kch8mqfR6EZZTUoPJyD", "blocksMintedPenalty": 0}, - {"address": "Qg85rSbazHEBBpat5AxsRcgjDuXTWDQyfu", "blocksMintedPenalty": 0}, - {"address": "Qg9EYzEZZpHHfhNb8S6Rn2bPBjrzgCyctF", "blocksMintedPenalty": 0}, - {"address": "Qg9VMfShRpGcHFjUQ2f8Ye6uGqXm36oHGx", "blocksMintedPenalty": 0}, - {"address": "Qg9VMygic4vUNJi7nLJ1x7qiGB8bQcS6dv", "blocksMintedPenalty": 0}, - {"address": "Qg9dXQ8GDwCZcnz6oLhnBwM7MixqR9KnJe", "blocksMintedPenalty": 0}, - {"address": "Qg9uK69KqPk5PTwv5o1kTZFuBBrjWVbFZc", "blocksMintedPenalty": 0}, - {"address": "QgAkZjsm62YoaYVA5MfTECaw1qrYjYAu6e", "blocksMintedPenalty": 0}, - {"address": "QgAv2Z2LRS3w7tmaSrV86aBUgj91C4RxzY", "blocksMintedPenalty": 0}, - {"address": "QgAysfQdHVErXDQsBfCLuDeV4x5ZcLH33K", "blocksMintedPenalty": 0}, - {"address": "QgBE1FjoW6xT8TKEW53Q66xAfhhEpkWw3W", "blocksMintedPenalty": 0}, - {"address": "QgBJBzCiwqFFZRTvVdxUtbGS2Jdh2yhgBs", "blocksMintedPenalty": 0}, - {"address": "QgBUecYn7V1f1fGRVQuZvkWKm9GTCbQWc9", "blocksMintedPenalty": 0}, - {"address": "QgBZWQFjYehBk8x93rutAy9LJoksWXyCJs", "blocksMintedPenalty": 0}, - {"address": "QgCHCGnsQFzaUA2iGzx7G9DioxWLKSisCV", "blocksMintedPenalty": 0}, - {"address": "QgCNVYNFU3e191a5Cd8MbKHHwzYvQrnUfa", "blocksMintedPenalty": 0}, - {"address": "QgCYSjBfQSk1iuMLS2FDpWrvVKHt6sNuS2", "blocksMintedPenalty": 0}, - {"address": "QgCwgoSaUdPar2VQVsomkTPRZZkELTWEaq", "blocksMintedPenalty": 0}, - {"address": "QgDQUo28QYcr5Uz6TZpP8oWJuvZYrxyk8c", "blocksMintedPenalty": 0}, - {"address": "QgDcyuRBGVV7vRiVMsujp5swARusoSVWM7", "blocksMintedPenalty": 0}, - {"address": "QgDdh77ywTgDkdEt11QuftZzSN2CNw7zRY", "blocksMintedPenalty": 0}, - {"address": "QgE2FsFQ7Nj2Sjm4aM5smVz81qGfzorJmu", "blocksMintedPenalty": 0}, - {"address": "QgE8z8ShetQix2q1ZTEKBsCKkUzupGftJx", "blocksMintedPenalty": 0}, - {"address": "QgEJSq7od7iuTGki71ReTKFvYQ9FKE7nDq", "blocksMintedPenalty": 0}, - {"address": "QgEZMhSnzoeDQeCsmQzNioS5xwPYWupkih", "blocksMintedPenalty": 0}, - {"address": "QgEeXH8xSyjZqoLejfnkLsWqeo4QV1GAwZ", "blocksMintedPenalty": 0}, - {"address": "QgEfrLHGzkXW77mGYW61ECrunDbyL8na6s", "blocksMintedPenalty": 0}, - {"address": "QgEsKiMHodR3LZjQpjwXgLrfRDdpzocCEX", "blocksMintedPenalty": 0}, - {"address": "QgFJoXENg9quztjKrgcxFcSHKnyuq4tqHr", "blocksMintedPenalty": 0}, - {"address": "QgFVyjEKSpSUXKemfNgBy6TKF2YE8WN8KF", "blocksMintedPenalty": 0}, - {"address": "QgFzybay4WdSyhQesegPRbGqN6AyCB7nWT", "blocksMintedPenalty": 0}, - {"address": "QgGGMaUbn7u5mUwwbU93CRmgYqXMGD1ARB", "blocksMintedPenalty": 0}, - {"address": "QgGr1sgmrR27A63Ajhq3JMgNMo8YDAwQwW", "blocksMintedPenalty": 0}, - {"address": "QgGzwSNPq1gLg1y9ErkQUW5cyUih2egL2A", "blocksMintedPenalty": 0}, - {"address": "QgH7noGVK32dYJ1x5yqxWSbhTvG6Gmn7aq", "blocksMintedPenalty": 0}, - {"address": "QgH9K8khFEHgCC9CoyWANaXaaYHjTPkc8m", "blocksMintedPenalty": 0}, - {"address": "QgHUMnLxLobTXyn2R8GRathSQT9s7N9wdM", "blocksMintedPenalty": 0}, - {"address": "QgHc5a1Sn8VTg1rL2KpwFp3WZVKafrJuLy", "blocksMintedPenalty": 0}, - {"address": "QgHmXefxoftARiTyGUxENH16W1Wi6dHdrq", "blocksMintedPenalty": 0}, - {"address": "QgJaTcXK3qhf2y81J6ewPVYRw26zCT64yH", "blocksMintedPenalty": 0}, - {"address": "QgJf9VyYUmDduCNG9KisuYBVmAuydbhR1A", "blocksMintedPenalty": 0}, - {"address": "QgJirvM6EFdcP85tSrhNJDZt2bLGpyBRfP", "blocksMintedPenalty": 0}, - {"address": "QgJyHzkign9H58AGddfXUPAbbFJnMiwMn5", "blocksMintedPenalty": 0}, - {"address": "QgK62Zn8YgmjD3vvLa3FBS237jhLGdZCPP", "blocksMintedPenalty": 0}, - {"address": "QgKie4xueGbwHu6cUp3o131T3UJcHDMfSc", "blocksMintedPenalty": 0}, - {"address": "QgLJv2bYCN7VC45mPTwn3Wny5YuvEKxNYV", "blocksMintedPenalty": 0}, - {"address": "QgLig9XYmd4kb21awUXc6qUptziHvjgvvb", "blocksMintedPenalty": 0}, - {"address": "QgM3UCUzXKGsrkgL1vYDewnxeDdj9SzRC7", "blocksMintedPenalty": 0}, - {"address": "QgMDSqogX8AytfTuGJL9mjmePndoJxwLk9", "blocksMintedPenalty": 0}, - {"address": "QgMDfabPCtwWY19ZaU61H8MLV8bwS1r314", "blocksMintedPenalty": 0}, - {"address": "QgMSvNKQMbYgeJnjtLoM66hZPyaS8F32wR", "blocksMintedPenalty": 0}, - {"address": "QgMYvSji9s3mjBpyyFZLYKcjQXGan1FHZL", "blocksMintedPenalty": 0}, - {"address": "QgN35hvLx1MB5sFHNzmSp4aZdGqLaWLMbd", "blocksMintedPenalty": 0}, - {"address": "QgN4kX3MuaGvyhbeaoRus3pqze36pVnKja", "blocksMintedPenalty": 0}, - {"address": "QgNUF1szonZUphjyHLSDPoycqrDNY7J4Fr", "blocksMintedPenalty": 0}, - {"address": "QgNWya9KrWXXBycBrDmZCFJnpqmhHh7whX", "blocksMintedPenalty": 0}, - {"address": "QgNX39pm2LPLqooQZ7UZom4bzv52BQceMj", "blocksMintedPenalty": 0}, - {"address": "QgNbHy6jrFXVMjDwdn5LuRE55MgkZJRN7Q", "blocksMintedPenalty": 0}, - {"address": "QgQ2QdMoJARQMY7AfqAnWdPNdvNmYCjis8", "blocksMintedPenalty": 0}, - {"address": "QgQ8PQebh99jGtVGAsccynBZRLsGxG8Ygg", "blocksMintedPenalty": 0}, - {"address": "QgQCyYUCwNgYnwqJU9VDAq4KtKUiXUWppZ", "blocksMintedPenalty": 0}, - {"address": "QgQJK2UuqRJU5fZ8ntUPsHVmzMp4XqDcB2", "blocksMintedPenalty": 0}, - {"address": "QgQJTBHQDrGcbyYi3rYEBhRC4EiMzLNYQu", "blocksMintedPenalty": 0}, - {"address": "QgQUHvEiGnjSuxNiwXjULjQiD5EYgPJmth", "blocksMintedPenalty": 0}, - {"address": "QgQegkDpr23G2SnfeaHLjs1zTHomt5Pukt", "blocksMintedPenalty": 0}, - {"address": "QgQssh3Y9T5Qbq9pPkfV9D4T1ER8LDYcT5", "blocksMintedPenalty": 0}, - {"address": "QgR3R68cLeJuLJ6TgdWxeXDBAdG7tANrba", "blocksMintedPenalty": 0}, - {"address": "QgR3kuGFsaxBHPkpRagFaw4NQnVAACZ5EA", "blocksMintedPenalty": 0}, - {"address": "QgR4i5cTRsUVGrtQuNjNLxebmGcQV4Dt3W", "blocksMintedPenalty": 0}, - {"address": "QgRFx45F6aQrkUcZN6FKCs3mVgtqRhQC6U", "blocksMintedPenalty": 0}, - {"address": "QgRPTSazDHhEWLG9UZxNjt9SgPUA3Qct3A", "blocksMintedPenalty": 0}, - {"address": "QgRVNKU4oYkvLtAdSwer85ai2vasD7eibA", "blocksMintedPenalty": 0}, - {"address": "QgRWdmnjyzhZ6XCZhEYHLDQSLwp4FR38vZ", "blocksMintedPenalty": 0}, - {"address": "QgRf2JmaXETxFfTKJ3aqZmV3sqKLN79rij", "blocksMintedPenalty": 0}, - {"address": "QgRjFqZVzt39fnGfaZMAFSp9TRLUEst7ef", "blocksMintedPenalty": 0}, - {"address": "QgRptPHs7x9NRWMt9cC89umq2zKpt5u5Sc", "blocksMintedPenalty": 0}, - {"address": "QgRxrG6btrcSXmEQUWdqxU1yGnQMXLLRpx", "blocksMintedPenalty": 0}, - {"address": "QgS8eASUXnfKLXzJmXphMPRdqo3X9YRydt", "blocksMintedPenalty": 0}, - {"address": "QgSBxp4YxaQ4bMd3GrfVw69R5zKgBWgGq5", "blocksMintedPenalty": 0}, - {"address": "QgSX2PnAvwA1ddLxwCZncQoTK4CXtvGb59", "blocksMintedPenalty": 0}, - {"address": "QgSZ83nGmPtFtN5mySLdZL4gBvWnRpxvsr", "blocksMintedPenalty": 0}, - {"address": "QgT2BYdw2HAt3TgPcWiNJYDpAqPjH1zWJv", "blocksMintedPenalty": 0}, - {"address": "QgT8iGKXsMJ8u9Q5vY26sjayWt4Hcf6fPC", "blocksMintedPenalty": 0}, - {"address": "QgTJW5VestYkbUDkWJAVUFG4z7hwufLHHw", "blocksMintedPenalty": 0}, - {"address": "QgTR1eQ122qXVnyRsv854nbqkCjwLrMCmu", "blocksMintedPenalty": 0}, - {"address": "QgTSQaxxFqquJJyuU7U6y7bc9uKAjtKjBA", "blocksMintedPenalty": 0}, - {"address": "QgUBs29dSUXjwmjWNRYsrdnY5jzKx5f3Pf", "blocksMintedPenalty": 0}, - {"address": "QgUF8WAKkfWqc4ro4YRPJoyehohwci3Bg6", "blocksMintedPenalty": 0}, - {"address": "QgUQ6kn52ZEDSrFWLkQGwtT8UzoGCa7TNq", "blocksMintedPenalty": 0}, - {"address": "QgUefbndq1zZfTFTrxzCiyMUWMYyxT5MJ2", "blocksMintedPenalty": 0}, - {"address": "QgUoYLdDX7QBPXENvYWJu7vwpGffXaekTX", "blocksMintedPenalty": 0}, - {"address": "QgVFtCKPSpy5ovJvFYgfwNrfAopFuQjJ3v", "blocksMintedPenalty": 0}, - {"address": "QgWJcdiHfLGRXQcZ3fDB86q4jHCxH8N4Lr", "blocksMintedPenalty": 0}, - {"address": "QgWM6BXAgo2XmJ5R3Nfpv5Sgc9VPbsDFkQ", "blocksMintedPenalty": 0}, - {"address": "QgWZUaynF3cUsNrheUoewt3v6xz1o3gYhy", "blocksMintedPenalty": 0}, - {"address": "QgX6h1fTbVXLhvMoACYW5fRsd2jVbvjtVM", "blocksMintedPenalty": 0}, - {"address": "QgXXAGBCuThb8SCrheF3PvTqidPiQZXMdf", "blocksMintedPenalty": 0}, - {"address": "QgY1wjt8S28varMaWeEQM1htDvG3i4Rs23", "blocksMintedPenalty": 0}, - {"address": "QgYDTmMhJV6aEjihSwnj6DP8A5Vfjs4bgC", "blocksMintedPenalty": 0}, - {"address": "QgYH6XLHESMLcmiEXwZx6ygh9GHBgaWegG", "blocksMintedPenalty": 0}, - {"address": "QgYKYSktUGfnYKkMHGx6frDWVxGB1GeoEG", "blocksMintedPenalty": 0}, - {"address": "QgYiYCch4j7HSPpWaUxJ7BKRqDb6gApiwM", "blocksMintedPenalty": 0}, - {"address": "QgYijAkC8kb1S1JuPnouyN1RZnaaPNTqcX", "blocksMintedPenalty": 0}, - {"address": "QgYnEDH6ZruDcdqgiFZzv55tQ5fUCFiUfa", "blocksMintedPenalty": 0}, - {"address": "QgZ9AAyzZFagf7iGWpc8MNGjEynzd97aGW", "blocksMintedPenalty": 0}, - {"address": "QgZFEsaPe1NK3ZFExYwDkMq17MnYHFU271", "blocksMintedPenalty": 0}, - {"address": "QgZo6Cd7mRzxq65Ga4W5PyAuE3SSYTQPFY", "blocksMintedPenalty": 0}, - {"address": "QgaNvs5P2HJ9qWxbt7xp9qtWsXR6cuFXSS", "blocksMintedPenalty": 0}, - {"address": "QgaU2uiJtbEoz2eKys2Qbb9NNsRQbAjJzM", "blocksMintedPenalty": 0}, - {"address": "QgagEga4y7UQ8vMiZ16bDa2VDEiK9T5gbL", "blocksMintedPenalty": 0}, - {"address": "Qgb4X1UyTzcdARW8tJDnxLi5cndB9J1W3o", "blocksMintedPenalty": 0}, - {"address": "Qgbg6hcwZ9XzkQ2CUhQAQ92h2MDD9Dypcc", "blocksMintedPenalty": 0}, - {"address": "Qgbn16wmyS7zq91m3nwbViHdeth43yCwY1", "blocksMintedPenalty": 0}, - {"address": "Qgcc7xKqNeVEBdY89iYCGUprg6NB5ACYAS", "blocksMintedPenalty": 0}, - {"address": "Qgcpu26dQyjcDU4W6m6LYYY2ujEKGeiDa9", "blocksMintedPenalty": 0}, - {"address": "Qgctx13nCLeDo6nHUJoFHGGdCDU3bbW6kb", "blocksMintedPenalty": 0}, - {"address": "Qgd182EoUAAJRzcsSymm1g74yLvUy3y3Rk", "blocksMintedPenalty": 0}, - {"address": "QgdXupMvswAWSTGcTe4Rki6ngsXFCtwQSv", "blocksMintedPenalty": 0}, - {"address": "QgdYVfwCi7cVh7Loej2ELC6ff2txfBHASu", "blocksMintedPenalty": 0}, - {"address": "QgdfakaZH6VCheJFnUGtWewV3ag2ZKcFjz", "blocksMintedPenalty": 0}, - {"address": "Qge9AHfa9Fn6j4QFpP9JJrFn8RXs4frj4b", "blocksMintedPenalty": 0}, - {"address": "QgeXZg3gerFfFRoAeaFQJeTr275vjmzDAL", "blocksMintedPenalty": 0}, - {"address": "Qgf1akL6HPSh5jKLpxzGwrQbNAdBpFbdkZ", "blocksMintedPenalty": 0}, - {"address": "QgfFWoQp3dJkcRMFiqJT33YhRpA8ekpw9H", "blocksMintedPenalty": 0}, - {"address": "QgfGmQ8KGuhvUDGqe93ZCvS7hxs6Z7gPrz", "blocksMintedPenalty": 0}, - {"address": "Qgfh143pRJyxpS92JoazjXNMH1uZueQBZ2", "blocksMintedPenalty": 0}, - {"address": "Qgg6ENrJUF3bMB9r7Rbg7cJBw5AfxERoWJ", "blocksMintedPenalty": 0}, - {"address": "QghB68LMRcuuUHDz5kA2Enr2h2mZCRLi7q", "blocksMintedPenalty": 0}, - {"address": "QghNMgGxjQNUtgoYuCFFbvtoKj9Z8h6jCr", "blocksMintedPenalty": 0}, - {"address": "QghPP8rBgMwNzazCUny6TzaaLRLt3h9XBW", "blocksMintedPenalty": 0}, - {"address": "QghUmZyqaaaqBD4RJHLn7ib3yRuEaJoF39", "blocksMintedPenalty": 0}, - {"address": "QghVs5Ks9u6tGrtYqFizEoTGGyREo6zJY8", "blocksMintedPenalty": 0}, - {"address": "QghegJYEjY67qds9nnuxkj1kbEduKnmHhV", "blocksMintedPenalty": 0}, - {"address": "QghgWe9B2CPKrdu3bxDccTtVYrq63T9oAS", "blocksMintedPenalty": 0}, - {"address": "QghpmeuHgBTLykF8Q2mJbWoMvj3zKoJFnT", "blocksMintedPenalty": 0}, - {"address": "Qgi2Ma7EzqGWEmZEc3YD6S8uDBCWThiJmT", "blocksMintedPenalty": 0}, - {"address": "Qgi8u4HeFabYMtotGysYyXEJ4ngpeuufP5", "blocksMintedPenalty": 0}, - {"address": "QgkC4KfDk4F2bjcPN1WJgdB1V84ZLehGmS", "blocksMintedPenalty": 0}, - {"address": "QgmEQCUQr21rrw3EbCsEBitUcR86KkS8Qt", "blocksMintedPenalty": 0}, - {"address": "Qgmibxh6yxdm39W6SpRS5z7sXZcshJDyt1", "blocksMintedPenalty": 0}, - {"address": "QgnCNdhJpB4bvqmZ5hMrCxSfNcXq6QCnns", "blocksMintedPenalty": 0}, - {"address": "Qgo4AQcjWdWXifdjuJtr9swGCv5LE8VzAR", "blocksMintedPenalty": 0}, - {"address": "QgoRtrXNbLVNQT5rvqt7qhVbQQU8ZUw8Gd", "blocksMintedPenalty": 0}, - {"address": "QgorN5DKx4dGnY4gvra8EbtGFhoi6KHtGJ", "blocksMintedPenalty": 0}, - {"address": "QgpDGYc9KTyr8VU1MwoaeuCsQLJ5s5Ejak", "blocksMintedPenalty": 0}, - {"address": "Qgpk6PU1CgHH716XJLNadVTpVFb9fhaCTu", "blocksMintedPenalty": 0}, - {"address": "QgpvRcGz8UTZkQSR7YYTN3ZpgD4vyhPHDW", "blocksMintedPenalty": 0}, - {"address": "Qgq1b7Tyjr3RV85cPGfJtXWdcBpuCeEGkK", "blocksMintedPenalty": 0}, - {"address": "Qgqc2ikmqnDUkLJKpUsKxH8cmphC6bBBmj", "blocksMintedPenalty": 0}, - {"address": "QgrmJ1YbZyZ7npjDVpZB2XEEUPGycBoQRf", "blocksMintedPenalty": 0}, - {"address": "QgroHt8PTMWDnjHAyZFbSVsDr55UeALmVr", "blocksMintedPenalty": 0}, - {"address": "QgrxJicPKzXsgMfDrMEyTxWs99RWcfVtcT", "blocksMintedPenalty": 0}, - {"address": "QgsifXqfJtdsNbxqGYh3hExEpWWZDg9rKK", "blocksMintedPenalty": 0}, - {"address": "QgskouP5MuArnCMbqeNmqL9s1nWN6SVrWL", "blocksMintedPenalty": 0}, - {"address": "QgsozXr7iF9N91qXaAhg1CGsD94Ghsfkxa", "blocksMintedPenalty": 0}, - {"address": "QgsqJvDJuW5UfVhNSurN5aQvxmsxCGSBNj", "blocksMintedPenalty": 0}, - {"address": "QgtKhcYhU6EkJ5bNW63veR4L8icjDbuH36", "blocksMintedPenalty": 0}, - {"address": "Qgtdr2BvZhbu4AeSm3WB69yoAkGa6sZ3tu", "blocksMintedPenalty": 0}, - {"address": "Qgu3943joAqJSnwdCf63qfDtjFs1PZYhzU", "blocksMintedPenalty": 0}, - {"address": "Qgu4f4QMcTvSkVYPWNNvkipvrSTSedXQeN", "blocksMintedPenalty": 0}, - {"address": "Qgu8fo4Bgj3z4kP6rHjp7rPm1FJM73e9b9", "blocksMintedPenalty": 0}, - {"address": "QguVbCfB34HsDShuXyTFmT8Kexj1Cw1s9f", "blocksMintedPenalty": 0}, - {"address": "QgubgyuEdaGL4wyL5GJ6aLes2BNxksh7Vg", "blocksMintedPenalty": 0}, - {"address": "QgvorBFedtJMVLLryy1RbPBUyBuKSoGdyM", "blocksMintedPenalty": 0}, - {"address": "Qgw4xKhLTdF2EhJjreWCmDqmNDoHnFQuNU", "blocksMintedPenalty": 0}, - {"address": "Qgwsx17qH45DyMyoPC24Raf7WUKHHbUrpN", "blocksMintedPenalty": 0}, - {"address": "QgwuqdNQA8KmJgdgMCJ5rdxiekfukBKWH6", "blocksMintedPenalty": 0}, - {"address": "Qgx59bxu3agBsBADzqqUWb4fLuRG925NFF", "blocksMintedPenalty": 0}, - {"address": "QgxF8e6RfneeFw31YCpDpD7pLNR9GqpzTj", "blocksMintedPenalty": 0}, - {"address": "QgxXtg6pCwY45HyMfwBFmWaDriHZXEMsUa", "blocksMintedPenalty": 0}, - {"address": "Qgy19XvBz5V73WB1wrgMQJvrhW1uJL5mcx", "blocksMintedPenalty": 0}, - {"address": "QgyU3uvzv6kcJnpFySAeT6uhDgGCrx615Z", "blocksMintedPenalty": 0}, - {"address": "QgyjJhKdrm4AhNb4UAG7gG7DWqe6r2ZF8i", "blocksMintedPenalty": 0}, - {"address": "QgywVHenDV3oSbbNY25NpNnv6CjtVRsffa", "blocksMintedPenalty": 0}, - {"address": "Qgz8zNd5ybVNAMiYLMs98KQSJwuFih7UMN", "blocksMintedPenalty": 0}, - {"address": "Qgz9yRz7vUrJmjHZMfP7RvpwjXM4yH42jh", "blocksMintedPenalty": 0}, - {"address": "QgzFhCYVMygYdEwjBYpb8NVMXuuXEa78GC", "blocksMintedPenalty": 0}, - {"address": "QgzHUK4ji8sBbZE7MzZRtqFGnz8QDYi2gT", "blocksMintedPenalty": 0}, - {"address": "QgzLTwhRn1bgmpDBq1WCeZjrLGNZRdZMse", "blocksMintedPenalty": 0}, - {"address": "QgzmLQYKi9zWf389Q2RjcxkGgwxSp7ME4T", "blocksMintedPenalty": 0}, - {"address": "Qh1A1KT4y67w8Ka8Q3xebvt58t9CdiWDXq", "blocksMintedPenalty": 0}, - {"address": "Qh1SmM3TKtsJNZcWjjass6xzbTXqRjLher", "blocksMintedPenalty": 0}, - {"address": "Qh1mT4cWjynimWzoqbX2iu5qSs8YHb8bCk", "blocksMintedPenalty": 0}, - {"address": "Qh2DoQfvzdQCX4g6KYVB3tQKH1JEcp3MZ8", "blocksMintedPenalty": 0}, - {"address": "Qh39ue8yfRajkVfR6d5kamctv622sri349", "blocksMintedPenalty": 0}, - {"address": "Qh3Api7ZMkq6hE51F61Bkr9PSSUSDzEPCh", "blocksMintedPenalty": 0}, - {"address": "Qh3QKXfePVC2w5PpGuRnrJwdtdXLxYhVB9", "blocksMintedPenalty": 0}, - {"address": "Qh3crSPwk2TdSBMYiWPqDsQTLCWrnLwJk1", "blocksMintedPenalty": 0}, - {"address": "Qh3krjGWcBrJRMvoCF55nGyuBJxJYA9si1", "blocksMintedPenalty": 0}, - {"address": "Qh4XawiUvmr5qPu587K3vXQoJ6YPQYqLdX", "blocksMintedPenalty": 0}, - {"address": "Qh4XtfJrV2aorkussLgEyPR5Eh7nCqjsXZ", "blocksMintedPenalty": 0}, - {"address": "Qh4YyNwHsZX4dC6uhus8G4sdJRc78zBe67", "blocksMintedPenalty": 0}, - {"address": "Qh4vAumuZT11Q35QZzKyYgnKFyqByK6FHB", "blocksMintedPenalty": 0}, - {"address": "Qh4xsAM48W8BfEFAVNdyfnPYJugsutSPog", "blocksMintedPenalty": 0}, - {"address": "Qh62JcVJRV2ZLjGzxpRMqHjfm43pRjB8K7", "blocksMintedPenalty": 0}, - {"address": "Qh6325Fyw965jwBNmjDwYNq614T6vStkVF", "blocksMintedPenalty": 0}, - {"address": "Qh6CPZL5E88mRUFzk2rB3PSk5tTbZhUPNg", "blocksMintedPenalty": 0}, - {"address": "Qh728BZWZUn5v3pT1zfqz81VQFyTXuoYgs", "blocksMintedPenalty": 0}, - {"address": "Qh7FyaV4kjowv1n83FUUKkVtnpM8ogxVmW", "blocksMintedPenalty": 0}, - {"address": "Qh91QY48YeYUjpZH6mtADwE8CYA8rJ13vr", "blocksMintedPenalty": 0}, - {"address": "Qh9DHiBiYRPd9j6enwMYupc1tneynaTz8f", "blocksMintedPenalty": 0}, - {"address": "Qh9dQHsWJWyyziBVVArYFW9y5GGZUu8Sjx", "blocksMintedPenalty": 0}, - {"address": "Qh9gHDDqFWN7AVh3skpWsDU7pz8iXL7DMH", "blocksMintedPenalty": 0}, - {"address": "QhAPBdVTM2NjrKWcDMkrEy5FreAqVV84qb", "blocksMintedPenalty": 0}, - {"address": "QhBXkhDXGu2GZj3wtSeeaznq1onwjsQMkU", "blocksMintedPenalty": 0}, - {"address": "QhC6zJaBKCbisH5tHe5XW1ojkr1k53Ug9r", "blocksMintedPenalty": 0}, - {"address": "QhCEtAafi25mApM986b5Kjb9eJrSS3D2NF", "blocksMintedPenalty": 0}, - {"address": "QhCUhE1BgsztDv5pQZ6ZPVXpBpM4dWZF7y", "blocksMintedPenalty": 0}, - {"address": "QhCgxfyNn3587tEw8iZjocEJ1YK3uatrhx", "blocksMintedPenalty": 0}, - {"address": "QhDVFhFa2C5SbpqvzywVDd3z1Fi4pMe5cE", "blocksMintedPenalty": 0}, - {"address": "QhDifCxtzsXDSgPHVboKdDpNZYSy1gxe1U", "blocksMintedPenalty": 0}, - {"address": "QhErHKBCPYacEGh1ecTVGgwSDr13r7fJm7", "blocksMintedPenalty": 0}, - {"address": "QhEv2XWgEdoE1zM2sU4fkQzy6R9xfbNW1s", "blocksMintedPenalty": 0}, - {"address": "QhFXAXGaZmtbhXTVvch1jHEym7N8hUkVcy", "blocksMintedPenalty": 0}, - {"address": "QhFyPJvHTuqcQezKzKb15UbKVUPtg8Nezb", "blocksMintedPenalty": 0}, - {"address": "QhFysRpq9594hctQXs4HYckKVm4cnp97hG", "blocksMintedPenalty": 0}, - {"address": "QhGDpt1Q2RWLViHPDTRECmJwyM48stuCTs", "blocksMintedPenalty": 0}, - {"address": "QhGjhH6g9FmGZkJ2WqhSakGoX8kdDdD76G", "blocksMintedPenalty": 0}, - {"address": "QhGmpKdZ2mSYLiPkzDVpyN3hF3YpCzX6Zm", "blocksMintedPenalty": 0}, - {"address": "QhJNGWjBdsfzRP4YyhcWYN5L7FbK9v9GoQ", "blocksMintedPenalty": 0}, - {"address": "QhJhZsUfaSwyPLNpCy6iwHkeD9JdcLXMdJ", "blocksMintedPenalty": 0}, - {"address": "QhJvVqd1UysfbjnVs7WTFS3Ytzefy9oCtd", "blocksMintedPenalty": 0}, - {"address": "QhJwXCHYrgH1pNm9dMqysQBvHNYtLm5DFW", "blocksMintedPenalty": 0}, - {"address": "QhJzEpGk8XcRqAV2CYedGVebWFvvRXLt2R", "blocksMintedPenalty": 0}, - {"address": "QhK5bbud63tfeQb5oGcJDk1KC9PZWdS88S", "blocksMintedPenalty": 0}, - {"address": "QhKDDgpfyqSzBs85n6UKN7HdoAvq2e8rnH", "blocksMintedPenalty": 0}, - {"address": "QhKJQfaxccCHdJxU2jtdJZTgN7z9gcMwyu", "blocksMintedPenalty": 0}, - {"address": "QhKXDBBPJPAntbz7b1XGWwuGN3jQtjVpxW", "blocksMintedPenalty": 0}, - {"address": "QhKfmyjhLjehLKdLN13cZ89NiPe9UPCrb5", "blocksMintedPenalty": 0}, - {"address": "QhLZez8dAyPp2uYU2jLrEqmYDac3BSopEG", "blocksMintedPenalty": 0}, - {"address": "QhLaxxAyM38s4KMb7BDwWsqMom1jiFZ3cU", "blocksMintedPenalty": 0}, - {"address": "QhLq6uX4GRVSQDdeT5hP9B4XxhMUiyxESN", "blocksMintedPenalty": 0}, - {"address": "QhNJs7GkckWo2vmupYrFvcHGZkk4fYSBVj", "blocksMintedPenalty": 0}, - {"address": "QhNXU47g1PXcuRhofEZLqxjrWmfAE4MzNj", "blocksMintedPenalty": 0}, - {"address": "QhNboRsW8ZnQzDcSHAnJaiJWSqTXTZiqCy", "blocksMintedPenalty": 0}, - {"address": "QhNpZj9pCUFEDEQyD7ciewcSPYRJy7NCfX", "blocksMintedPenalty": 0}, - {"address": "QhNtVUc9ddn2z4FU3DiiaLY9ni8DKamKte", "blocksMintedPenalty": 0}, - {"address": "QhP2vouACGafQ92fWiRP6TiDwjXvdnY4Qc", "blocksMintedPenalty": 0}, - {"address": "QhP9ZiZKjtzoVukJMu7gpuUJC9dU1kkyp2", "blocksMintedPenalty": 0}, - {"address": "QhQTWoTL5Drypwf7jwA3cMayBgiREjALNc", "blocksMintedPenalty": 0}, - {"address": "QhQoJEJGwPLxizgrhTNhcmg594zGjHQ2va", "blocksMintedPenalty": 0}, - {"address": "QhR6YSN2W1FH6mkGteTk7nVWChSyekDiUP", "blocksMintedPenalty": 0}, - {"address": "QhRDuu4FeQd1tqHVUMg5G3xSem273b22p5", "blocksMintedPenalty": 0}, - {"address": "QhRH9dPV5V7yVe9hj3zurFEXHBRsikvvo3", "blocksMintedPenalty": 0}, - {"address": "QhRJUkeiBm8yR1P9i3TmQ6sMTiHHmi5Jkw", "blocksMintedPenalty": 0}, - {"address": "QhRPDUwDJBu7UvhH4iMFXxUxgDj9E3ptKu", "blocksMintedPenalty": 0}, - {"address": "QhRYVfs6nTz8S43t3xaLso5o3xutCUf5Vd", "blocksMintedPenalty": 0}, - {"address": "QhS6N3PhpRBb2iHXwXYKxpQfhNr6ux2UUN", "blocksMintedPenalty": 0}, - {"address": "QhSNKUqLSDVS35bNaSiDKst5JgAf3Vr8wp", "blocksMintedPenalty": 0}, - {"address": "QhSks4mm288R3mKQkgs3V2yYN5VTZhciGA", "blocksMintedPenalty": 0}, - {"address": "QhSqPLdqTS7xzAqTSB4tsMorjc3arKCmNK", "blocksMintedPenalty": 0}, - {"address": "QhSvJ4Wo5qfaknKRvuAr9eRU4dejSaKhCU", "blocksMintedPenalty": 0}, - {"address": "QhSvrRsSfGCva5gAZ2cL7ccRVq396mMw1Q", "blocksMintedPenalty": 0}, - {"address": "QhT1HCUMoHRw1w5wcjPG6ETZcPxthnVehm", "blocksMintedPenalty": 0}, - {"address": "QhTCFPL714Y8vQjbw7VZYjbFsBEBtfVxS5", "blocksMintedPenalty": 0}, - {"address": "QhUaNessbpAfKrFHw3GEYHNTPmuyJpjsPT", "blocksMintedPenalty": 0}, - {"address": "QhUstuypjvztHY3SAq4nd3Zpkf4FW5PTcN", "blocksMintedPenalty": 0}, - {"address": "QhUtmd9WdwKduAoLKyBPvLd4L6Mbp9stDw", "blocksMintedPenalty": 0}, - {"address": "QhVGgdaugmGUrqdm5Pdc5JME9nfo5cjw6H", "blocksMintedPenalty": 0}, - {"address": "QhXCHKapnVihs26RPdA3ZGpVsDEnpvhhb2", "blocksMintedPenalty": 0}, - {"address": "QhXPj4hfcRtq5HmSz2FnCrKb7EBQwc7q8a", "blocksMintedPenalty": 0}, - {"address": "QhXVg6TejmJqraB3mGG9RxSXD1xQohhGbF", "blocksMintedPenalty": 0}, - {"address": "QhXr33LKj3orgdx36rKgmdyxNQXgxYwjqM", "blocksMintedPenalty": 0}, - {"address": "QhYFybchfEESQrsY6YkpMn9mSfDe23epfC", "blocksMintedPenalty": 0}, - {"address": "QhYG6p1cHCWLwktArnpUjfB84Qfa3rAdDE", "blocksMintedPenalty": 0}, - {"address": "QhYWhdeXnJ8MU33WLXTy7ZhjYBe6RSGJgm", "blocksMintedPenalty": 0}, - {"address": "QhYbh9pYPq5JGUK4R9qbWUXav1GvxEkkA2", "blocksMintedPenalty": 0}, - {"address": "QhYjMwF5ADVj1dn1p3dsjSYJ2eUCrrLwZQ", "blocksMintedPenalty": 0}, - {"address": "QhZ2m2sZUjkFh5YKAqQmKwchHvqmZ1jQma", "blocksMintedPenalty": 0}, - {"address": "QhZ8AkbW9v6GeFdpTPSbewLbrw8aeQ4s9j", "blocksMintedPenalty": 0}, - {"address": "QhZWGvoo9z6XkmkacjMT33ZqkQerYGCJxY", "blocksMintedPenalty": 0}, - {"address": "QhZZDgpjVJimriahsbqtxeHs7y5yYSZAtA", "blocksMintedPenalty": 0}, - {"address": "QhZj3CwbTemVYMWVd3nj6Gd6CDNja8uk25", "blocksMintedPenalty": 0}, - {"address": "QhZq6fStDxvhgpUf218Qys81AAYCVCJ9RR", "blocksMintedPenalty": 0}, - {"address": "Qha2yCiwhtrxEbv2BpA5ro9VzuCgEZqRNW", "blocksMintedPenalty": 0}, - {"address": "Qha3XAqwK4fJf8Xz8W6vLRb1EvpiAS8HDv", "blocksMintedPenalty": 0}, - {"address": "QhapVhV7pNTHaZDHK2QPZyhkPwmHAL22Ht", "blocksMintedPenalty": 0}, - {"address": "Qhb9jfNCVycnVjSF6f6tWUmadCjzqiTKwc", "blocksMintedPenalty": 0}, - {"address": "QhbVZxYUuMR6L7hqKw1wSMJZcTMgKYZR5B", "blocksMintedPenalty": 0}, - {"address": "QhbuARAQThJTja8iCae8FzdJHbgy3TkAea", "blocksMintedPenalty": 0}, - {"address": "QhbuMgDYsoq8pyRSsnFL85gAvNZK5AyLpF", "blocksMintedPenalty": 0}, - {"address": "Qhc9Ep9yZXRHT3Ew8rMSrozwgdqptJL7Vk", "blocksMintedPenalty": 0}, - {"address": "QhcBBZrfDHFjnXNjVarQunMbKfLDzjmcTf", "blocksMintedPenalty": 0}, - {"address": "QhcoEYPeU78yxntNSn2X5nBXHo8SnStSJU", "blocksMintedPenalty": 0}, - {"address": "QhdT7CBFYsq8tr7mBAkTmNgJhFGbL71Fq9", "blocksMintedPenalty": 0}, - {"address": "QhdTQtVQrvA1RYfH6NAAyiBFWFSt5bji5H", "blocksMintedPenalty": 0}, - {"address": "QhdXVUE6nAVW5C4ZRnTa9221wr4DZM43Bp", "blocksMintedPenalty": 0}, - {"address": "QhddKWKaLTpFwhPzdNE1PXBEfvD3t2KTw9", "blocksMintedPenalty": 0}, - {"address": "QhdfARooQuw5dsvwUvYmjDfrNWXxVYuzZf", "blocksMintedPenalty": 0}, - {"address": "QhdoQaznQQKEoPTF9EC3N64T94ChqLcJnE", "blocksMintedPenalty": 0}, - {"address": "Qhdqxb5HhzJhgxM6ZmRHbngazNia1KwLJ7", "blocksMintedPenalty": 0}, - {"address": "QheGzUE7K8R8xi6gm92s1MUDwrrhydHEqp", "blocksMintedPenalty": 0}, - {"address": "Qhehg1xhyAHUz1dsLyVcRtggKuNGEQCyjY", "blocksMintedPenalty": 0}, - {"address": "QhfADjeXs9yRuTiRg6KDp8fyRfZsKRj4tD", "blocksMintedPenalty": 0}, - {"address": "QhfVP8ufyQDasMYjVohmpxatMnvK8YZGsD", "blocksMintedPenalty": 0}, - {"address": "QhfcQViRadoJnUvwdYNKhxPFoJxw7XR4Jk", "blocksMintedPenalty": 0}, - {"address": "QhgTtXLRTKr1iBUW3FJaEYDmTPygNSyyxo", "blocksMintedPenalty": 0}, - {"address": "Qhgw7sNkwqZb9dYXk44GHbvNSeeAmp5rEr", "blocksMintedPenalty": 0}, - {"address": "Qhh5FZfxV9KzdHJjrm9m6Ri5A7FPYSDdy4", "blocksMintedPenalty": 0}, - {"address": "QhhN9wRj99VFyJFLQkpdhcyneggaaQHpn9", "blocksMintedPenalty": 0}, - {"address": "QhhPBPQC5eGmgbRLhefDcnhLdYjfiiCoYw", "blocksMintedPenalty": 0}, - {"address": "QhhwEM9A9ctRYsHM4Z5cRpA77FAjUPty5J", "blocksMintedPenalty": 0}, - {"address": "Qhi1ZvYQRcEb8sX5TFDakQF51V4T8ocwCE", "blocksMintedPenalty": 0}, - {"address": "QhiCMcss1fB7MpKHMwPawU4R66gf3DKVNX", "blocksMintedPenalty": 0}, - {"address": "QhiDUYzZHMpzA4bqrDv9fspNyf9UHgcxQQ", "blocksMintedPenalty": 0}, - {"address": "Qhj7SiFnsFhpFSdPD63eYW5ePQnT8sViZ1", "blocksMintedPenalty": 0}, - {"address": "QhjYVHcryAopQRzbYvCVuJJYezZ4ZpWY2a", "blocksMintedPenalty": 0}, - {"address": "Qhje9C5g7JMB9mG9iybzgmVmEQzZGMxesY", "blocksMintedPenalty": 0}, - {"address": "QhjeowmVcBzdAyMWjfk6GoVvx4Cv2oFoFY", "blocksMintedPenalty": 0}, - {"address": "QhjmKnXHGSgdQScEev8MdkyyDaVmkncBQT", "blocksMintedPenalty": 0}, - {"address": "Qhm72D7gKRdCWw9k3GWwC4rA5byJLagfR8", "blocksMintedPenalty": 0}, - {"address": "Qhm93ShmKFRhuGN97G3PbiMfW1xQwrB7oV", "blocksMintedPenalty": 0}, - {"address": "QhmQdtesXqz8PcjXvw3hgDiAxwkQKiGU7M", "blocksMintedPenalty": 0}, - {"address": "QhmufUv7ErjBRDcCBh4QU1dNfp1Hbx1Aup", "blocksMintedPenalty": 0}, - {"address": "QhnBp5qVPqDXQNcLMVDtUZ5jmoaEfiUbsU", "blocksMintedPenalty": 0}, - {"address": "QhnH9VhzVaFSHu41RLejzaGk9NGPA1dRZh", "blocksMintedPenalty": 0}, - {"address": "QhnQzMsQQ9UoQsH6N7KTSpWr9JQyMCQ5Cs", "blocksMintedPenalty": 0}, - {"address": "QhnTiHhK38wZfnNQbMwpYbzNQCfZUySjG5", "blocksMintedPenalty": 0}, - {"address": "QhnUxRyWgYe3DHUPKvHJA9zh4DTfLb4Pis", "blocksMintedPenalty": 0}, - {"address": "QhnYrfuS1V8BwyV5nMmbPjqeCGEJ4euJdM", "blocksMintedPenalty": 0}, - {"address": "QhoMM9y7ZN3YvSJ5fkZdpTXhdV9kFfCFVj", "blocksMintedPenalty": 0}, - {"address": "QhoYs9fXiw5Ew64FfjGPiii66h1as4dNb8", "blocksMintedPenalty": 0}, - {"address": "Qhoc2gwVtGGZH21pAn1bRiNEFvsSD366cy", "blocksMintedPenalty": 0}, - {"address": "QhotJevb8JSeYEYSMzREQ3oc9DYLWxWuNx", "blocksMintedPenalty": 0}, - {"address": "QhqGi5P735WsVVYokM5djNM5RwUA8Sw9Bx", "blocksMintedPenalty": 0}, - {"address": "QhqHyJLhtSLB6jwdz1Ro6nTaLs5yABk5nM", "blocksMintedPenalty": 0}, - {"address": "QhqYLLdiHMdZNAr6V1cUU6wE1nEua296FV", "blocksMintedPenalty": 0}, - {"address": "Qhqu9T9XxUdf1JERpaeExApkqEcaEwPpaw", "blocksMintedPenalty": 0}, - {"address": "Qhr1PPGmbVmvHL7Xor1RKoU6wdjqZqFm9A", "blocksMintedPenalty": 0}, - {"address": "Qhr7Yub6uguMzVW1DFF7AtKiTeeEvaYqTw", "blocksMintedPenalty": 0}, - {"address": "QhrDuXfU5Q4AnhB6heejkdMMmuKdNfy31u", "blocksMintedPenalty": 0}, - {"address": "QhrVUgLftNdEMJzLD7H6U1UjiWpc8zMGVf", "blocksMintedPenalty": 0}, - {"address": "Qhreji3ui9FDExJd5iRn3PjuGx9sU1LbY8", "blocksMintedPenalty": 0}, - {"address": "QhsR5EmbTgnaD5EnkCDYEkK8iAPpQcxbF1", "blocksMintedPenalty": 0}, - {"address": "QhsVheHSyLQN4DTzyrE3RjKpLHkUuqzNaS", "blocksMintedPenalty": 0}, - {"address": "QhspjaTessFhiUBnthDqAyREf2nU8TDCUr", "blocksMintedPenalty": 0}, - {"address": "QhsvzicS9EQJ5VJitYsi51STeZs2QfqVeF", "blocksMintedPenalty": 0}, - {"address": "Qht6vdT7q7d7KZ8FDTSAj7SFKhJX9mfRz5", "blocksMintedPenalty": 0}, - {"address": "QhtfkeZHcj8dt9bPYhXgBFzAp3gzj3cur8", "blocksMintedPenalty": 0}, - {"address": "Qhue7o3mB5nfxFoteWzgGdrGsoqkByTVAC", "blocksMintedPenalty": 0}, - {"address": "QhugLYq2PmF6ReS4p1oPbR9PmZt7nJiVhN", "blocksMintedPenalty": 0}, - {"address": "Qhus3RLQKpgwfiz6enujiatjUFjndffmdt", "blocksMintedPenalty": 0}, - {"address": "QhvmEWp4XF2UpqG12CBzxa7cJi57BCRabS", "blocksMintedPenalty": 0}, - {"address": "Qhvmg9veFG5eGvsC42S9ytpED9VT2927hQ", "blocksMintedPenalty": 0}, - {"address": "QhvrtLZNnv7pAmhNFk2H2sWRVj2gtB3yDy", "blocksMintedPenalty": 0}, - {"address": "Qhvtu9V7VYr5BoSVGthSCsFvnQ85BFUyEb", "blocksMintedPenalty": 0}, - {"address": "QhvxSRBZvvXySpcgEouoWpRcsKoLheX1sj", "blocksMintedPenalty": 0}, - {"address": "Qhw8K4ztoAsRhYvU8dBFSarcszQhNLTdmB", "blocksMintedPenalty": 0}, - {"address": "QhwjyqMLKv2xsmy4sH7bN4F2scEkh9Dm9n", "blocksMintedPenalty": 0}, - {"address": "Qhx3EroZCGVJo1CLRD2WXsio64iysSQqBm", "blocksMintedPenalty": 0}, - {"address": "QhxHCaTSBfhj5ahPauiPz7eBxv6zNJFgDh", "blocksMintedPenalty": 0}, - {"address": "QhxSj9dGGuLSv1LUbe3SXnZCLAU2Nopzsd", "blocksMintedPenalty": 0}, - {"address": "QhxVUgmMSgZi3yneJUiPAVGfytfa4KsWPy", "blocksMintedPenalty": 0}, - {"address": "QhxuAWnQMNc26BBLGruoAgwcfunwj9Sh97", "blocksMintedPenalty": 0}, - {"address": "Qhxury1neFcNbDGcXFUZenCzHQrmRTgfSp", "blocksMintedPenalty": 0}, - {"address": "QhxySpV5BEvS25CJ5gKZgi5vHadXDpmfUT", "blocksMintedPenalty": 0}, - {"address": "Qhyc1Ax5worhLanwpR1Yj3CErDdN5Z1d8u", "blocksMintedPenalty": 0}, - {"address": "Qhyn1REHRLRZZv3Hh42s84Qu56474SVZob", "blocksMintedPenalty": 0}, - {"address": "Qhz1ZUcwgUoYGMLhkLAM6Qpef9QYPYyMhZ", "blocksMintedPenalty": 0}, - {"address": "Qhz7obyitxKvjYqUPsPyZq7cDdGfJ2Ejpa", "blocksMintedPenalty": 0}, - {"address": "QhzRkxY4Y3qGjSUXZVv3HEKMAqzPw3r2K5", "blocksMintedPenalty": 0}, - {"address": "QhzgNpA3veYTZXpdvGBaRBiFbApFRyGHZH", "blocksMintedPenalty": 0}, - {"address": "Qi1DnGf2eRTVmAD1uN7E5yafhASS3bLzFQ", "blocksMintedPenalty": 0}, - {"address": "Qi1zhKzqtTXujsSSpjkECv5VwRMWTLZBRJ", "blocksMintedPenalty": 0}, - {"address": "Qi28A5Shsb3v3rhsTUzXaEhFV2Ls2J5MhW", "blocksMintedPenalty": 0}, - {"address": "Qi2n8zve8YoAcAnuc5bfRvoBpMJKp2QQpX", "blocksMintedPenalty": 0}, - {"address": "Qi35PZZJG34tywzGDvsRV64GoWVaSNqXpe", "blocksMintedPenalty": 0}, - {"address": "Qi3A9bgPjD65dPrutojgNHsXcAb53B5so5", "blocksMintedPenalty": 0}, - {"address": "Qi3GcwM9TEnbB7r13KPFaF3FzbdHHjhCn3", "blocksMintedPenalty": 0}, - {"address": "Qi3LjtdYdyxNrmDYnJNWD96tBdFeLFKDMQ", "blocksMintedPenalty": 0}, - {"address": "Qi3QVgHQ3Dz9DZqPSUXxVuEPCi9oJwGJ7G", "blocksMintedPenalty": 0}, - {"address": "Qi3SHHzeUutLrEky2WhVdmn9rH6ihNViAR", "blocksMintedPenalty": 0}, - {"address": "Qi3YYFLrUxJB36RzU5F6yCzkmzzArLk9GT", "blocksMintedPenalty": 0}, - {"address": "Qi3rj7oKSVz7RuZWKWEDCuaAqC6RAL8vpH", "blocksMintedPenalty": 0}, - {"address": "Qi415aBz7TSw2nmddVBMmbNVWEyKSN79aB", "blocksMintedPenalty": 0}, - {"address": "Qi41GZ1KG68Wx7AghgHHSLvXa5vSCYSqXr", "blocksMintedPenalty": 0}, - {"address": "Qi4318BPc5Ef11N3Q8wHEyDbtoqJQnuii8", "blocksMintedPenalty": 0}, - {"address": "Qi43G12pjrtUXmCigXK4cX338sioKGvxqR", "blocksMintedPenalty": 0}, - {"address": "Qi4RCSuhRD3i1JkVEeXViMLRk4WFXL3DWG", "blocksMintedPenalty": 0}, - {"address": "Qi4dtAuBvmikP6xUAL6ZB1NWAx7Grzay4S", "blocksMintedPenalty": 0}, - {"address": "Qi5bsUnZCGWfG9BXTPjtGfx4WitjQMuWGZ", "blocksMintedPenalty": 0}, - {"address": "Qi69aGyM7U4PcaSBGNXmT6JeZcdFQGRpXa", "blocksMintedPenalty": 0}, - {"address": "Qi6FyJCxNs6KKKmJ588q21MVTyRkGLW5Pq", "blocksMintedPenalty": 0}, - {"address": "Qi6Gakfv6EA28BSRz3goizHPDLjxjPhzby", "blocksMintedPenalty": 0}, - {"address": "Qi6NKwijLVuFBVGZETfxANCAHagFcp7jzJ", "blocksMintedPenalty": 0}, - {"address": "Qi6c1yws9aR96VmS7wPBHs9FVBN7DV2mvY", "blocksMintedPenalty": 0}, - {"address": "Qi75qMPsL1MV6aMjUm78w6LYAXH1cLL22v", "blocksMintedPenalty": 0}, - {"address": "Qi7K7gt8sDTR4GgpShf14DVxK1bwwCZqJm", "blocksMintedPenalty": 0}, - {"address": "Qi7XhWEqhdM8EAYtsGGh13fVmyRZqiYmB7", "blocksMintedPenalty": 0}, - {"address": "Qi7ZNEBgSSBabHSYM8S9EFp4HRcEt1PwDg", "blocksMintedPenalty": 0}, - {"address": "Qi7hNxgTt5oA9676Xzs62s3umYPRToym5S", "blocksMintedPenalty": 0}, - {"address": "Qi8S3cP7juJYBjy62LEhtergnjgGQ6MrV7", "blocksMintedPenalty": 0}, - {"address": "Qi8VtJUpm5uyyo6bKrnU4BZJMvcsVtvmWU", "blocksMintedPenalty": 0}, - {"address": "Qi8fPB5qvXUmJh6wgvvec5zKwAqYSnRj49", "blocksMintedPenalty": 0}, - {"address": "Qi8hFD947KXctRHEUt48L8HRKnzrE7p6U7", "blocksMintedPenalty": 0}, - {"address": "Qi9AX1QjvwkgWH34jRuwF859Hfnkcfj5PW", "blocksMintedPenalty": 0}, - {"address": "Qi9ePbCaKEPDjegiiYuxEs6i24FnoU5vs1", "blocksMintedPenalty": 0}, - {"address": "Qi9iHfdWQjWqAJ3toQ67bJCnoHXE4Xqsps", "blocksMintedPenalty": 0}, - {"address": "Qi9qcox1udzfU7KTSGQpvPVVGwMjW4Y8Kq", "blocksMintedPenalty": 0}, - {"address": "Qi9yYKgo5wWEQsPr72jycLrJ2MB3VV61DS", "blocksMintedPenalty": 0}, - {"address": "QiA68A9eCJjmNumPgyw6q8kDZtDRyyTWtA", "blocksMintedPenalty": 0}, - {"address": "QiAKsfkwYxEk5inD97RqZJpq9FNY96RCUG", "blocksMintedPenalty": 0}, - {"address": "QiALFPJ41xtRCVHF5iEcsgQChZHfq3HUVd", "blocksMintedPenalty": 0}, - {"address": "QiAYQCTSZ93PXiJKJsnVE8E8hSMeFPiKWu", "blocksMintedPenalty": 0}, - {"address": "QiB4f7jqsG5YnHrq2nUguoJSJ8o37HkY3U", "blocksMintedPenalty": 0}, - {"address": "QiB96hPfv4tCjsyMHCzbguP79HdBJeZWK6", "blocksMintedPenalty": 0}, - {"address": "QiBQweK8Cp1NZfTHQBJHceGivco7tF5fVL", "blocksMintedPenalty": 0}, - {"address": "QiCdMG4Am2wnpP6Bb3vMpgtNqLtaLbsAN1", "blocksMintedPenalty": 0}, - {"address": "QiCxqvnJvp7wv4SsqvTBHnCET9T7bidjGk", "blocksMintedPenalty": 0}, - {"address": "QiD8boifB6p6Cu72GRsCastmq4MjagKiFs", "blocksMintedPenalty": 0}, - {"address": "QiD9aDtHTAfCBvvuEAuABo1fwuWdEAw9S4", "blocksMintedPenalty": 0}, - {"address": "QiDqczqu9nu15yehQj2w8GcMZpBu3hDVFi", "blocksMintedPenalty": 0}, - {"address": "QiECgv8y1vz37r3CmBZW68CMqGY8KDk6H6", "blocksMintedPenalty": 0}, - {"address": "QiERL4zeySk6VWp4oecTkZLAagpYi9UFWt", "blocksMintedPenalty": 0}, - {"address": "QiEepRg4ZYWeLNr1xhngedYbWtz3nsNvAs", "blocksMintedPenalty": 0}, - {"address": "QiF2dS1ABiDHhJR6qgm4XQjbkfm7USZ9Ar", "blocksMintedPenalty": 0}, - {"address": "QiFVjNdmWuLHd7vJwBVKCzZU15zEkyTATT", "blocksMintedPenalty": 0}, - {"address": "QiFuqZ78kCNHThUFpixib5e6ZmmxSzS9Vv", "blocksMintedPenalty": 0}, - {"address": "QiFvFMhYRHWXeMu2Pi41BJqPWWSHRTSvKu", "blocksMintedPenalty": 0}, - {"address": "QiGBmXdS3JthXKJzXYTHKQzXhUGb7q1H4m", "blocksMintedPenalty": 0}, - {"address": "QiGmjuh3gxCXV93rGcESDizd2hAdtxM3m3", "blocksMintedPenalty": 0}, - {"address": "QiH39rHGMfgX6RGgvaASgaToWTVDmzUB9w", "blocksMintedPenalty": 0}, - {"address": "QiH7BhDjckQ1YBYW7Srb9oAgAYD1XJH9vi", "blocksMintedPenalty": 0}, - {"address": "QiHKa8zJHuSPrHzwTNWEykpLC7VZaTtgNg", "blocksMintedPenalty": 0}, - {"address": "QiHYiYu6nNmpcCNTdzahRWeY4XA8bPdpig", "blocksMintedPenalty": 0}, - {"address": "QiHas58k7bCNz5Yfnr7FoBsgSMRwBuGeUt", "blocksMintedPenalty": 0}, - {"address": "QiHibtBZH3Zt8dDHTVth9vtkTu4hySpcxk", "blocksMintedPenalty": 0}, - {"address": "QiHpEhcxCgtXQgFtfj9vDHbmR7JjoirgaU", "blocksMintedPenalty": 0}, - {"address": "QiHteoXgRHWVhVpLm5yBsqUzNHMNAFnDAr", "blocksMintedPenalty": 0}, - {"address": "QiJdCGzpieUYnHVXoFgxecJT6xgWJdUM2T", "blocksMintedPenalty": 0}, - {"address": "QiK9iB5CDheiRfDF4SYDyXT1aKv1DT6ixT", "blocksMintedPenalty": 0}, - {"address": "QiK9kv6eJxkzmFscKeEgqeAFmdxzBHkQ7Y", "blocksMintedPenalty": 0}, - {"address": "QiKAbEuEzqB2NhTKVA6DGPCUeCNuguLVmw", "blocksMintedPenalty": 0}, - {"address": "QiLHDj66pqHYrRattE1phyJZXq6AjwFsZB", "blocksMintedPenalty": 0}, - {"address": "QiLSrsKauRt3NAm34xkbLUW6oEZTG3EycT", "blocksMintedPenalty": 0}, - {"address": "QiLbLy3ZCqHLnxqT8h6j3exRTbsduWo9eB", "blocksMintedPenalty": 0}, - {"address": "QiMDE3k31BvQAxfpzetdYBxMt4aNnsRf5p", "blocksMintedPenalty": 0}, - {"address": "QiMpgbaJKuFnQGRuBsjnvarusLKVsxV5Wb", "blocksMintedPenalty": 0}, - {"address": "QiN5pcggfP7RKPtq34c7XY5HggBLnqzjsT", "blocksMintedPenalty": 0}, - {"address": "QiNKXRfnX9mTodSed1yRQexhL1HA42RHHo", "blocksMintedPenalty": 0}, - {"address": "QiNebqTbLLs65pqu9wD8jxK7mmt1RSYmuo", "blocksMintedPenalty": 0}, - {"address": "QiNnzh6f6AZYTUgePtWA92vKFbMALchReW", "blocksMintedPenalty": 0}, - {"address": "QiP2SKRHqmC2A9zsGqmCQcjamASBGKRNcb", "blocksMintedPenalty": 0}, - {"address": "QiPtAyLqtFvCBeBtPxqcF1KVurHWjBXtwx", "blocksMintedPenalty": 0}, - {"address": "QiQ7e5ZuJN2GsvzRbmXek8Vq8HGPPfP4nL", "blocksMintedPenalty": 0}, - {"address": "QiQAmZTksiGaTrKX7NGCUYxkqb5chp7Yy3", "blocksMintedPenalty": 0}, - {"address": "QiQCHAcDe6fbWLrcek53oYUTzbHM9xSp2j", "blocksMintedPenalty": 0}, - {"address": "QiQEHvsYvTRMCKc5ABtwM2hdxaMNuiRuZt", "blocksMintedPenalty": 0}, - {"address": "QiQVqSeaB5gUiB2UebtcSL2AW2Kqhofb2s", "blocksMintedPenalty": 0}, - {"address": "QiQtMuuUpv1WTKbFNVhRKi1upuoPaqCN3E", "blocksMintedPenalty": 0}, - {"address": "QiRNRnKgeDmsXyce83GkfAEGnK5cQ83JBW", "blocksMintedPenalty": 0}, - {"address": "QiRgmUVftGFKKwWC3fCanFJ8srdWdQUzPZ", "blocksMintedPenalty": 0}, - {"address": "QiSE26D7GZrFs6v76FuGqHz19VGdUEJWLR", "blocksMintedPenalty": 0}, - {"address": "QiSEchqiTSuZT1mgoxtf6ftofao7jw87zq", "blocksMintedPenalty": 0}, - {"address": "QiSKFLjErHUdL7k4wChgqqifG95AL9C8Dt", "blocksMintedPenalty": 0}, - {"address": "QiSjZ73Pyd2dG8XgoFKxLw1hajLVP3tGhb", "blocksMintedPenalty": 0}, - {"address": "QiSqjucECR1HC3GxtYvvAPncYA6q83Zda9", "blocksMintedPenalty": 0}, - {"address": "QiSx3pw2a8BkT5MpV9oBsuviba6aUiPuHf", "blocksMintedPenalty": 0}, - {"address": "QiTHAzC3sQHdbQAZZURn69Lx1vMyztdmDY", "blocksMintedPenalty": 0}, - {"address": "QiTMqsMpGQmcCHJB3TuSQ1XcKq26tqDJ6j", "blocksMintedPenalty": 0}, - {"address": "QiTR2EQVSLQxUohKUmEKCRzhE6rP5d5Fv6", "blocksMintedPenalty": 0}, - {"address": "QiTvrWxvGXoKfv2WPVQuXQuEZSksBdVjUt", "blocksMintedPenalty": 0}, - {"address": "QiUDFGq1gRfvv1vQmHLEXBmtUGvUSwpUKW", "blocksMintedPenalty": 0}, - {"address": "QiUEUisz73QgL52o8K6d9A8U8dvH4uNNaZ", "blocksMintedPenalty": 0}, - {"address": "QiUpmFtzvPdvHNJmmF9ohckV2CCFxFfRnq", "blocksMintedPenalty": 0}, - {"address": "QiVVBe8NzYr6jVHCh9fkvtBfXgmcm7zYSG", "blocksMintedPenalty": 0}, - {"address": "QiVcmyMQko1i4yyjFLGwfAkNLXR44jPQHH", "blocksMintedPenalty": 0}, - {"address": "QiVxexxLsAktBmHFS8d86uBfMAtJPzjRar", "blocksMintedPenalty": 0}, - {"address": "QiW9gzkfWKeD28z1iLvjVghPz2imCANmJV", "blocksMintedPenalty": 0}, - {"address": "QiWzQiyBmxbKLRoDn2Y1HxL9wEKEHVB9Cd", "blocksMintedPenalty": 0}, - {"address": "QiXpBEQwGiHjsBJEuesjzD3j5bB8FDjRgJ", "blocksMintedPenalty": 0}, - {"address": "QiXqwxp4Hc5CFJCZjQSXLoH9TDYh9Ld7FL", "blocksMintedPenalty": 0}, - {"address": "QiXyVzeXFCG7TEeCz9TSfrpcnx91F8JFp8", "blocksMintedPenalty": 0}, - {"address": "QiYf41oLJSJH99sYGk2EZR6sAAZbDtt7ej", "blocksMintedPenalty": 0}, - {"address": "QiYwnwLK5L1TmKRLs7eCgHez48VGds6G6c", "blocksMintedPenalty": 0}, - {"address": "QiZteJ4sXVpCjDu1EBhLAanCaPB17a99YR", "blocksMintedPenalty": 0}, - {"address": "QiaHaBkVjDzyaYy1sy7cYZqbhrQpWUKTVg", "blocksMintedPenalty": 0}, - {"address": "QiagDurFdqMjMmXt3WAcenw5ebm5Lw14YP", "blocksMintedPenalty": 0}, - {"address": "QibDH5wNWqnXQcMiDsB5m4HyVFDekXg8hs", "blocksMintedPenalty": 0}, - {"address": "QibJxGWj29y7kdNm7Ut5YH83tR69w7aNuF", "blocksMintedPenalty": 0}, - {"address": "QibWLSNGwNeqP6APVVLRaCQdDB39k1JUGC", "blocksMintedPenalty": 0}, - {"address": "QicA4vz9aiWPQjBq8uCjCCTe2LpsoGB5p6", "blocksMintedPenalty": 0}, - {"address": "QicSMUkBYFdmYQzTENjUia9qc6tqWkZHzr", "blocksMintedPenalty": 0}, - {"address": "QicTnk1EiAhVQyK2fjgZ2BCB7ngoQKckqN", "blocksMintedPenalty": 0}, - {"address": "QickSqkXkVf7onNGSPUPFT6cF73hrSn8TK", "blocksMintedPenalty": 0}, - {"address": "QidCdXBzZdkEuzmBhB4wdsaJscF46Sg9x3", "blocksMintedPenalty": 0}, - {"address": "QideKRbaUvRpNSU2Mkf6mAto9XggArsgt5", "blocksMintedPenalty": 0}, - {"address": "QidjHNw1nHsG6f9R1FWPdVU4mmr1VPMDGv", "blocksMintedPenalty": 0}, - {"address": "Qidotvu59nuMmCcTGr7HGxXeDFzco4LW7P", "blocksMintedPenalty": 0}, - {"address": "Qie38ED9zT3o2vZHLakEfFvJfY1m4SjMC2", "blocksMintedPenalty": 0}, - {"address": "Qie5sjwjJw8beoxHvsBrv74uNK6hsKQfM3", "blocksMintedPenalty": 0}, - {"address": "QieKqEiVrWm4hvT6GkLoBQqqmdBKJpQxPi", "blocksMintedPenalty": 0}, - {"address": "Qif19g7LHeAAbSfEWexFAcbKevEerAdN8P", "blocksMintedPenalty": 0}, - {"address": "QifWMvNWHR9pHrm8JUdrRBCdhKcSGRLhw2", "blocksMintedPenalty": 0}, - {"address": "QifZCHiuEozhUKekgsvv6Qy4qMP2uYDzaS", "blocksMintedPenalty": 0}, - {"address": "QifgBRq5DE5sh11rX8eLP1pyEvpHkAHopu", "blocksMintedPenalty": 0}, - {"address": "QifzfVseCvXzfeNN6eQDWkn5GgrQeuEt5F", "blocksMintedPenalty": 0}, - {"address": "QigLB7XhcnfSgD5YXhLNBkkoQVhECxwLeW", "blocksMintedPenalty": 0}, - {"address": "QigRWhiSRckg2RRPsTZdJWNntJmFpoGDBj", "blocksMintedPenalty": 0}, - {"address": "Qigsnd3GojB9tNM7P7EmKRbCy9mBkvVkRQ", "blocksMintedPenalty": 0}, - {"address": "Qigw5NUVp9xTitEUQxMV9n4DTAQb25RWVa", "blocksMintedPenalty": 0}, - {"address": "QihycTKrqRhYFox59WTdWHuLZuEQ7DYwR9", "blocksMintedPenalty": 0}, - {"address": "QijHAGvq6CKjgVXyWT6bM7d754dyjYyHtL", "blocksMintedPenalty": 0}, - {"address": "QijJHU6tDCDPzumqJVxw9dHR9dRGBouGko", "blocksMintedPenalty": 0}, - {"address": "QijTmhnL8HBuYZiadow4tJUjT6GcTWDkN2", "blocksMintedPenalty": 0}, - {"address": "QijcTThW4QQCaSpbViGB2ogsKVTsekyGTF", "blocksMintedPenalty": 0}, - {"address": "QikLT9HksYBFm74Dgefes6RKuLDb417hRS", "blocksMintedPenalty": 0}, - {"address": "Qikv6EXyFAF8YDZ21MkUojKi1e6NiZxmQ6", "blocksMintedPenalty": 0}, - {"address": "QimeifdEa2bBJbnN5jZzGi2sotAiUjwWQk", "blocksMintedPenalty": 0}, - {"address": "QimzFzDYUUmkDnUNJuDCmR7LVJ8XC17D1V", "blocksMintedPenalty": 0}, - {"address": "Qin3nHDknhdHr5YbBbNHny5VM9EQBsox2g", "blocksMintedPenalty": 0}, - {"address": "QinRhT1ZeFYGft5uEHU2Rk3caAYshatW4e", "blocksMintedPenalty": 0}, - {"address": "Qini2BxRvZEyKfkiXaneTPczwPe7iCbgep", "blocksMintedPenalty": 0}, - {"address": "QinymAGzooazefdykPawLKLBt22ehcj7sG", "blocksMintedPenalty": 0}, - {"address": "QinzBkiTgXR9hWqSbJh1yaxjxCBuSEhNp6", "blocksMintedPenalty": 0}, - {"address": "Qio42VNwKdwqBTn6yTUGnSLZfhepyc1KPi", "blocksMintedPenalty": 0}, - {"address": "QioBbosmSQZ3cwjuVqNBFPRMarGZNGUNcq", "blocksMintedPenalty": 0}, - {"address": "Qiodx8pWAcB5MA1nKAdfKmrXgHqu6QYSsR", "blocksMintedPenalty": 0}, - {"address": "QioiMUDomNramMQdPWVAY9LNqg8Rmtxk22", "blocksMintedPenalty": 0}, - {"address": "QipLYcLZFaH5qzgUyW5L2pf22y62FErg8F", "blocksMintedPenalty": 0}, - {"address": "QipShPjuTeqVHXC6RX9ShzoVzxQ9HUbFmG", "blocksMintedPenalty": 0}, - {"address": "QipzFsWczmadRUcSSXqPbKpnXt4zJBv3cd", "blocksMintedPenalty": 0}, - {"address": "Qiq9eV7zFo26oSBm77jHLT3jZqpKxgf4Vm", "blocksMintedPenalty": 0}, - {"address": "QiqFFYnNW2dHXHBsrnskM6HcjKAKXzByUh", "blocksMintedPenalty": 0}, - {"address": "QiqKmxzQzesURuV5wZBKfCxJgaDQe3M4kg", "blocksMintedPenalty": 0}, - {"address": "QiqNsfhJNZf7ScsWswcUukdMDngiSXLjn8", "blocksMintedPenalty": 0}, - {"address": "QiqQJhP9zi2ydP7EzJzBREUPsKojZDjtme", "blocksMintedPenalty": 0}, - {"address": "QirkSErDSzczrRAd9fCz2xbeuHEfrvAqx7", "blocksMintedPenalty": 0}, - {"address": "QirqVu4Yk75SUe7ogRkn5VC9cWTmsugDGd", "blocksMintedPenalty": 0}, - {"address": "Qiseu6fGxHcmAwjuFxzvgNZXiUzE6oigx5", "blocksMintedPenalty": 0}, - {"address": "QiskeHug546KSpqiiRebE6LvsUoe41xdZa", "blocksMintedPenalty": 0}, - {"address": "Qit6d2N1YayuuXpu5Litv9GYhcnqTpz7xL", "blocksMintedPenalty": 0}, - {"address": "QitPXtRSR7xcRYVAknXZ4xKhezAd9N2w3e", "blocksMintedPenalty": 0}, - {"address": "Qiuk4CKTf4Faowpw39wErMN466MiDxAVTU", "blocksMintedPenalty": 0}, - {"address": "Qiukd7iKaWYTZdeJeeSWDqajuu8uiV1uL7", "blocksMintedPenalty": 0}, - {"address": "QiuwwcjAoyxqNvJXFaXNF6FxBN7t4DF9NX", "blocksMintedPenalty": 0}, - {"address": "Qivijbafm1qLHjDEpRJcP18u6Z7iuBcrPn", "blocksMintedPenalty": 0}, - {"address": "Qiw4vsu8CVaAemGmeZohkSJRRDnQwk7Ey8", "blocksMintedPenalty": 0}, - {"address": "QiwMkmTpn9WuzMtNK4kDJLa3qmCJXY18WW", "blocksMintedPenalty": 0}, - {"address": "Qix4NmtJa5c2wJF3jdkjnyPd3d4UU2ZepT", "blocksMintedPenalty": 0}, - {"address": "QixXmh6g8FceSC7AhrvFwqC6gFoCNRMnvV", "blocksMintedPenalty": 0}, - {"address": "QixqRjrv8TESD3x4ELUksVhGwbcHdxqNsa", "blocksMintedPenalty": 0}, - {"address": "Qiy48nBmiuk5PLKqmHeV936jHeMpMtqsXw", "blocksMintedPenalty": 0}, - {"address": "QiyQGa6FbLm3Fef39Ryr3oLynUuhxA5YS2", "blocksMintedPenalty": 0}, - {"address": "QiyVKMvFHSwt9obwRtWNP2MQPu8SjwqEMm", "blocksMintedPenalty": 0}, - {"address": "QiyaH8he3n65EKefJmbmaWpKAhSA3okfdY", "blocksMintedPenalty": 0}, - {"address": "Qiyg5FtvZeTYf3oSUbchu5PzAKWqQaz5sf", "blocksMintedPenalty": 0}, - {"address": "Qiyvf43DDLmD7zUDvugC4cbtaswBQSDPKG", "blocksMintedPenalty": 0}, - {"address": "Qiz4yjVmE8ZpPCUxghJrtMLqAHcYKVuWBz", "blocksMintedPenalty": 0}, - {"address": "QizGvpsmoSmK8CP5evtZkwxqCArF5DdXgj", "blocksMintedPenalty": 0}, - {"address": "QizjzY6GEnKXWuGWq69suxnGJR7szXBx5j", "blocksMintedPenalty": 0}, - {"address": "QizwxsJifgGEfeQdYNEX99pHeWrKroM8T1", "blocksMintedPenalty": 0}, - {"address": "QizxeHQe3u9xFh2LqSb24cmWUDNEed9vzB", "blocksMintedPenalty": 0}, - {"address": "Qj1NEfvLfXr19CqTVCdE1hDSXMS4evjLQc", "blocksMintedPenalty": 0}, - {"address": "Qj1it843s3J2Hs5NJWyf4iBdVKFw9xFUrw", "blocksMintedPenalty": 0}, - {"address": "Qj2KMKdhsPoA6UWMTGrQVv589dwiSc3tTS", "blocksMintedPenalty": 0}, - {"address": "Qj2Tk1KDeX9wXbJpQTYHaBELdgUyJXFHQ4", "blocksMintedPenalty": 0}, - {"address": "Qj2qGCJe81P7JrhtJKQYnZEbdi4HUZSPy8", "blocksMintedPenalty": 0}, - {"address": "Qj3BJi7bV34A9zMFrzCAgJ4rKaFMabY93X", "blocksMintedPenalty": 0}, - {"address": "Qj3HzGcGC77eJFWx1xQHwS6QArtffLDfRo", "blocksMintedPenalty": 0}, - {"address": "Qj3RLZKF9qtu5kmTqJthbAJ3cWGH1g7q9U", "blocksMintedPenalty": 0}, - {"address": "Qj4LNxY3gALHJwbY1WvgMsogJqZVY9yBvx", "blocksMintedPenalty": 0}, - {"address": "Qj4eXFS7rerY8cfuzMjrqvBturSgkGUkuY", "blocksMintedPenalty": 0}, - {"address": "Qj4kadRYmzWz7PAC4mJXVQegq1B7ZN6ATx", "blocksMintedPenalty": 0}, - {"address": "Qj4pn4RiiukUmyK2e5oLz2yD8V9NoYNxpQ", "blocksMintedPenalty": 0}, - {"address": "Qj4zGs4Vjy4dtW5MMmQGnbiSHwQqKm1JyN", "blocksMintedPenalty": 0}, - {"address": "Qj52piEzAryyH36Ahqoo9kTL8Qwku6AD9g", "blocksMintedPenalty": 0}, - {"address": "Qj5K4yW2LtE8LUxPspSMExScXJqyrcS2vh", "blocksMintedPenalty": 0}, - {"address": "Qj5ojSVte2DC9SwcN3vjGrWLUY4ZsUbiuW", "blocksMintedPenalty": 0}, - {"address": "Qj6FUF6wBtVsPEyMyTA3iWHZRyXVoK79zH", "blocksMintedPenalty": 0}, - {"address": "Qj6YeDBmp7peV4Uo3gotZ6iQZ3NjQh1eLd", "blocksMintedPenalty": 0}, - {"address": "Qj6nk7RCJcB6gB5SZYGnKrqk6umyVD2XWT", "blocksMintedPenalty": 0}, - {"address": "Qj7Bz5ZroUBELRoz9Z4p4RievfEUAEuGH3", "blocksMintedPenalty": 0}, - {"address": "Qj8Cgn3FGdEt9mXWNQ7Vtj3BeFqDxWJhtF", "blocksMintedPenalty": 0}, - {"address": "Qj8MELPaRq8aFsNXPc3omJrUbWo5JaZQ2n", "blocksMintedPenalty": 0}, - {"address": "Qj8cst6mwGaDjDJDmQiubAQ4mr8wxcodur", "blocksMintedPenalty": 0}, - {"address": "Qj8ib3Yv3n9a8xJKCVgxJWFmG32VjPG29p", "blocksMintedPenalty": 0}, - {"address": "Qj8qZe2Q3MMeaksjtNrhxCybxYzsR3eDEx", "blocksMintedPenalty": 0}, - {"address": "Qj9CTpJpbSmc2Zck5ry1XHEYZkdq7nwxJe", "blocksMintedPenalty": 0}, - {"address": "Qj9LMX3g28xghGB6u1yYk3xztkLTzeWqq3", "blocksMintedPenalty": 0}, - {"address": "Qj9XrYTGvLjV5V5UzWDHZyTFgDmxEYyQZZ", "blocksMintedPenalty": 0}, - {"address": "Qj9ZevqHnhhghYGQzi8XFn6LtZhWKedCxT", "blocksMintedPenalty": 0}, - {"address": "Qj9kzpYGyxR1rNQfGVS2sD6ZK9BdPTuXqP", "blocksMintedPenalty": 0}, - {"address": "QjAYoXUodDnMqCYwC2N2F2ip1etPUarrLi", "blocksMintedPenalty": 0}, - {"address": "QjAaGCkrcZMbevPxQx6dxQFgcSShdwLsf1", "blocksMintedPenalty": 0}, - {"address": "QjB1cxvVx2hhgAHRrvS4wAYSigGZ6AAQ8B", "blocksMintedPenalty": 0}, - {"address": "QjB6gxZyQMGmjdvFM48TB2zQ8zbPkhmy9z", "blocksMintedPenalty": 0}, - {"address": "QjBUYj9SzWKAkwESSBBPPNfKpK6SfTt8LH", "blocksMintedPenalty": 0}, - {"address": "QjBniir8DeeDng4UHu43PLVtiiahSosaLc", "blocksMintedPenalty": 0}, - {"address": "QjCBgcNoJKTm44JjU8TR65KviFPeRGLbxa", "blocksMintedPenalty": 0}, - {"address": "QjCRcdH76U2mra8sUy3aWPCYpiZhtwCeHN", "blocksMintedPenalty": 0}, - {"address": "QjChYJCJUMByj2uiK8ay76uqMiyYiW9DQ4", "blocksMintedPenalty": 0}, - {"address": "QjDMZNQs9B9r32u6FvNKpwhFb7zXjFsyz2", "blocksMintedPenalty": 0}, - {"address": "QjDVYHqwB4jeHHmZtEFshgAT4Vm3eKf3Pn", "blocksMintedPenalty": 0}, - {"address": "QjEDBYiwe5p8peQX2cJiNE1pimZFdZBH6b", "blocksMintedPenalty": 0}, - {"address": "QjEDMh1qmHe24HjcPaTAWD9uD6EkncGNMa", "blocksMintedPenalty": 0}, - {"address": "QjEWcns9hX2jKqYAhKpm8ptCN3xBEHK6eM", "blocksMintedPenalty": 0}, - {"address": "QjEa6sUZQRhApBbz1teem9ab8vYBSSTiBN", "blocksMintedPenalty": 0}, - {"address": "QjFfCcafy2sTbDPka5DpCSqvsi9Hs4FsyG", "blocksMintedPenalty": 0}, - {"address": "QjFqeANtKkQBQsmRubssEEwwJ8CbMCxhTd", "blocksMintedPenalty": 0}, - {"address": "QjFsNcPT2L5RqVuPHG5V3NVUZn4gm2FH7T", "blocksMintedPenalty": 0}, - {"address": "QjG31BBWwWN6XNQpWyWa5QstRSqUpGg8Hw", "blocksMintedPenalty": 0}, - {"address": "QjG7Qb3QuounutYL6ipk57rsAr3YZe51QQ", "blocksMintedPenalty": 0}, - {"address": "QjG7xzoc7tZomVN66vVmgxxBZZbgNe1QAg", "blocksMintedPenalty": 0}, - {"address": "QjGmXoy2havevrFjnYUptKaYhJXqwfMDw8", "blocksMintedPenalty": 0}, - {"address": "QjHZSKaJTwmL7VQxzQXPnWth8RoN6oCA9X", "blocksMintedPenalty": 0}, - {"address": "QjHbaAzkp9ocZJU9gJcS4pLoFxYYq2iKq9", "blocksMintedPenalty": 0}, - {"address": "QjHqSVKL7LH6CZkMimf3Jgr3jU1CfiR76z", "blocksMintedPenalty": 0}, - {"address": "QjHxKaCGSLMEmz2fwdyKvw1FFcSmiJhGXN", "blocksMintedPenalty": 0}, - {"address": "QjJ5MNvUQoAgsHdUQanJNaBKij4uddj2S3", "blocksMintedPenalty": 0}, - {"address": "QjJgfXUhBWZeHUNtwTV4qVcafuYuosPkPU", "blocksMintedPenalty": 0}, - {"address": "QjJtWN8b444ugFdGD8FnWqhTDX3GceZnwp", "blocksMintedPenalty": 0}, - {"address": "QjKiC8ZRWs9pansQmpq4pu3pEj6oi4ZgLm", "blocksMintedPenalty": 0}, - {"address": "QjKqBXSk9LcejdEZMnzsX8fXrZxft6dBkj", "blocksMintedPenalty": 0}, - {"address": "QjKrcrLLorrvgtHAg7ycahjghbWaMDrbcs", "blocksMintedPenalty": 0}, - {"address": "QjL2gAjTWi6vYQxgNDtSFyqJ1Nv1qFy6RP", "blocksMintedPenalty": 0}, - {"address": "QjL8RcRnQXxuVT7uHkqv5bfdtrchhEFz8v", "blocksMintedPenalty": 0}, - {"address": "QjLjkRsZNq6dQvZqdQCgqXGZhHQRPChdLd", "blocksMintedPenalty": 0}, - {"address": "QjM6VfAq9pvJtbLcL349uFMG74FrmEkioq", "blocksMintedPenalty": 0}, - {"address": "QjMrVFLSapjbipM5CNTJRjr5QNYQJdyzkE", "blocksMintedPenalty": 0}, - {"address": "QjNHon3EyXNCmELzZA3DwvGQnXEskNvazN", "blocksMintedPenalty": 0}, - {"address": "QjNJncWBbuEz1huGWS7ifeAYQqZ2sWDHoH", "blocksMintedPenalty": 0}, - {"address": "QjNbJV2644GuoSv5EmS248DdZKsgM8ukh4", "blocksMintedPenalty": 0}, - {"address": "QjNeFqzSdhEugrG6J1LaBofQB5pQeMipHo", "blocksMintedPenalty": 0}, - {"address": "QjNxPZuvN5AiH3cfgMXcNid33hNpLnGAfT", "blocksMintedPenalty": 0}, - {"address": "QjP2pf2KVyzhTyb1VfCucuzLNdYHMZRyvP", "blocksMintedPenalty": 0}, - {"address": "QjPJy45QGPng8R5gda4fWdxbhwWxxgm3mT", "blocksMintedPenalty": 0}, - {"address": "QjPM7SngNKgQL5XG71EUVrn7MNmJjikE1E", "blocksMintedPenalty": 0}, - {"address": "QjPhJZwsGk6CstHiC9iZvEUkaG2ZuwENT7", "blocksMintedPenalty": 0}, - {"address": "QjPxpog8hzWhp3xDsUBq4Ywy9EHAHtmZSo", "blocksMintedPenalty": 0}, - {"address": "QjPy15sacACwjqDALHAHTxTyv8VE4KnZSG", "blocksMintedPenalty": 0}, - {"address": "QjRkAcdJgFUTWE94DFiSxphBP4VeqKgWay", "blocksMintedPenalty": 0}, - {"address": "QjSKSfJ4iGCGXwkz9eJjWTpTs2TR8HsHCh", "blocksMintedPenalty": 0}, - {"address": "QjSgNyGR9wYp1TcwctJkweeU66H9au7Smi", "blocksMintedPenalty": 0}, - {"address": "QjT7ciDuS1WE4WKoyRchUnd9f31PQPbynv", "blocksMintedPenalty": 0}, - {"address": "QjTQDynC1TTrsNX1YKVZpashfBFwvUkLyu", "blocksMintedPenalty": 0}, - {"address": "QjTZFHyHh7MdpNyUHShW5pE5YFqBUq7bVJ", "blocksMintedPenalty": 0}, - {"address": "QjU6UJQ7UvBFh1ow8HbmuM7QehFibSJp5q", "blocksMintedPenalty": 0}, - {"address": "QjUPHuVpWFhaNaTjywkipPKQ6rGYzBqPTp", "blocksMintedPenalty": 0}, - {"address": "QjUaqMQgwJwyJUBveZrVb3kD2kZJufFuFt", "blocksMintedPenalty": 0}, - {"address": "QjVHwcSG7N68y2SerZSPJiKUsg7UkqX9yV", "blocksMintedPenalty": 0}, - {"address": "QjVeG2bomJJqBVRJC2PKe4cTmxsYEUrcZ9", "blocksMintedPenalty": 0}, - {"address": "QjVqaXEDttCN2UXJH9gHhNZKReudBjWtBZ", "blocksMintedPenalty": 0}, - {"address": "QjW77GD3QMaQXFiwg4d4iNH5h11nZLSNay", "blocksMintedPenalty": 0}, - {"address": "QjWJrssfukWLSDazd8sQbURPj9sFmWVCuL", "blocksMintedPenalty": 0}, - {"address": "QjWQ7kePE5Yj1pwcJa8Cyz4fSwJirzQcjw", "blocksMintedPenalty": 0}, - {"address": "QjWwyvcotD1Zf4kCSENUYvKnAM6hUeBEEp", "blocksMintedPenalty": 0}, - {"address": "QjX7341A9JmQPNFcT3qQXb3uzYKpNpLtbk", "blocksMintedPenalty": 0}, - {"address": "QjXAvoXs3aW33kLcUbdcVAHpKBXGBwuKGg", "blocksMintedPenalty": 0}, - {"address": "QjXE274jrMSpBwV3AnBsS2MQqMmmHfStmf", "blocksMintedPenalty": 0}, - {"address": "QjXJYdrZm1voWQ7xdEGS1DQrzZhj45u753", "blocksMintedPenalty": 0}, - {"address": "QjXPDRyTTfPLZrsawbsidJu6PnSuJFbTmV", "blocksMintedPenalty": 0}, - {"address": "QjXawfW8SbdXscKSbX5qUjfk9PFWyNWmQS", "blocksMintedPenalty": 0}, - {"address": "QjXi1GrK9JirpaHk8oKW4MqJa3eqdXQErk", "blocksMintedPenalty": 0}, - {"address": "QjYyiWSSLBnA1tFZ4rs6jXEM66itcTBmZD", "blocksMintedPenalty": 0}, - {"address": "QjZPhkqUdXXCJZBFdZN9YfUFHr8m2rLBUP", "blocksMintedPenalty": 0}, - {"address": "QjZtkBb1j8GxsUnFh4GJH1BS6peRFJ5jwT", "blocksMintedPenalty": 0}, - {"address": "Qja6JNVKLyFwU9dWYcorWxQJ75Bm6LETQu", "blocksMintedPenalty": 0}, - {"address": "QjaD8KkpgdLncNdxMCmemWULmpoRQ15Azz", "blocksMintedPenalty": 0}, - {"address": "QjawhFQthMZDKe6dRpZXprnrVJenEseyMi", "blocksMintedPenalty": 0}, - {"address": "QjazPZMJXYGB4gFZQH7QukRaAp9Lct1Q9k", "blocksMintedPenalty": 0}, - {"address": "QjbiotzKxNtFqCnF2PFFMJNR1x2By5qEr9", "blocksMintedPenalty": 0}, - {"address": "QjbjLkvgJCRzMwVAgQe7j9Y7F79mtMZA5H", "blocksMintedPenalty": 0}, - {"address": "QjcEGR4bRK2TZVKr2gAexibedTgtJbSTr4", "blocksMintedPenalty": 0}, - {"address": "QjcJro7aDd3nUoXw2ZCN9XQyCde5dcTH9o", "blocksMintedPenalty": 0}, - {"address": "QjcSakKUQDRpUrbqXfzYTebNxj91WBRYkA", "blocksMintedPenalty": 0}, - {"address": "QjcUFSCrAJHQzDdMz2KDXGorfYW4Afsv2K", "blocksMintedPenalty": 0}, - {"address": "QjcefQRxYxe4rMwjPyo1P4kBis37Y1RAhv", "blocksMintedPenalty": 0}, - {"address": "QjdHvqudnLjudnE6ec9ZQeDiTxb5ytNdhc", "blocksMintedPenalty": 0}, - {"address": "QjdRfWnJvTZ72nmqc5q1g2iAJF93MEiZu5", "blocksMintedPenalty": 0}, - {"address": "QjeWJYNo8k3Yos5VJoA3ke1s557AdZaty1", "blocksMintedPenalty": 0}, - {"address": "QjecR8ZA6F6NeXX8trteKXQgJ5qqYZGSuM", "blocksMintedPenalty": 0}, - {"address": "QjeqWcLPYHCT5jdx6WUzLsMojacmFoQye9", "blocksMintedPenalty": 0}, - {"address": "Qjf4BwYQcesSuRuRgGF7T1zN4rfH5z5DXj", "blocksMintedPenalty": 0}, - {"address": "QjfQCUHN3AdftAvo1h2TUffusiakhiWavQ", "blocksMintedPenalty": 0}, - {"address": "QjgBcdmYUD4WMKRspeZmadynr1tS87WBDk", "blocksMintedPenalty": 0}, - {"address": "QjgC8ZZ7jBVAwx2WP1b6dY44BN3gQ174Sz", "blocksMintedPenalty": 0}, - {"address": "QjgLUkCWbLBf4JDQw7iuq1P42XHHr5Kz74", "blocksMintedPenalty": 0}, - {"address": "Qjgic64cuVfyDnLp2LErVc5dmsBQzTPVhX", "blocksMintedPenalty": 0}, - {"address": "QjhuHJEF4k2HVUfv2Q3RjZYBgc6L5nw8bC", "blocksMintedPenalty": 0}, - {"address": "Qji5KonZTRGgrt3MS2RBX2KtvXYiiAQCZr", "blocksMintedPenalty": 0}, - {"address": "Qji9cKwGcb9PKcNJ9TaQzwi5SjzAXcP3gU", "blocksMintedPenalty": 0}, - {"address": "QjiQ9YfNZccUZaWXcnsgoLEnzbg4z7X1cR", "blocksMintedPenalty": 0}, - {"address": "QjiU2twLEEjdTBAmA5fqtNbav1BzFdmDGd", "blocksMintedPenalty": 0}, - {"address": "Qjib1FMTSNaA1DbLRQapJeKJ7AYCRnHzat", "blocksMintedPenalty": 0}, - {"address": "Qjit3Hs53joLQPUZJZDq2M7gfHubReqZAk", "blocksMintedPenalty": 0}, - {"address": "QjjRz2eRtzuJ33xhyXFYawLhJtDhLxpp9a", "blocksMintedPenalty": 0}, - {"address": "QjjtR9KiUaFqiJKqit5WrkfPoCY5omWftP", "blocksMintedPenalty": 0}, - {"address": "QjjxGrae4x4Ntw34HkqZU1R5p1NxSwER51", "blocksMintedPenalty": 0}, - {"address": "QjjxwNQ4b8NBE3W6fPp2NE51HLxWHoMTHg", "blocksMintedPenalty": 0}, - {"address": "QjkEiC1QFjHxWQ8zfcqpoyYwGmijKUkp1E", "blocksMintedPenalty": 0}, - {"address": "QjkHCLU81KoYPyW3aF9ezyuJE7NM64RwHp", "blocksMintedPenalty": 0}, - {"address": "QjkJvcEodk5JV1EomxMERGAnjtdSYTSmMN", "blocksMintedPenalty": 0}, - {"address": "QjkNAvvnPE4Poy1WHkZX9ibRPpUud9CmfZ", "blocksMintedPenalty": 0}, - {"address": "QjkThvXs6DmWE4cGGfr1coXhT2cq84Ab8C", "blocksMintedPenalty": 0}, - {"address": "QjkbkBxkKfCBA8BryVnEzqaCXUJsmfhRgA", "blocksMintedPenalty": 0}, - {"address": "Qjko16TA6jpNXeN9ruRpWbJofPt5gFbf6n", "blocksMintedPenalty": 0}, - {"address": "Qjm9fQkBXBhdVDgbcUzkin87gLVTUUkPTG", "blocksMintedPenalty": 0}, - {"address": "QjmFbTEb3onkog3WN2ysXwDcBDXNxaPCCd", "blocksMintedPenalty": 0}, - {"address": "QjmLPuPvb6ok1jL1AH6JuKo3UViNoPT437", "blocksMintedPenalty": 0}, - {"address": "QjmResDkootY2ThvjAzwMn62S95bYSBVtB", "blocksMintedPenalty": 0}, - {"address": "QjmgFuFEazCfPANMxwjyGDp3bhV3RRfmJS", "blocksMintedPenalty": 0}, - {"address": "QjmxpDHKN9SRcCrWxse8JimFTXNXuCErb1", "blocksMintedPenalty": 0}, - {"address": "Qjn2Au4ESL5rzvAZ2M6Jwc78hzHj6Hr6au", "blocksMintedPenalty": 0}, - {"address": "Qjn8eF5Nq1nT4TA98zeNjXkXRNvxQGb5n6", "blocksMintedPenalty": 0}, - {"address": "QjnBvwTkqMyCEyDq7dyth2YsXsnSTf4GH6", "blocksMintedPenalty": 0}, - {"address": "QjnwdvofEo1FKYjcMkSF1C6usKot7MtQvr", "blocksMintedPenalty": 0}, - {"address": "Qjny4Vp3D76bYdyhCYCMWtouBPoP7JuoaT", "blocksMintedPenalty": 0}, - {"address": "QjoLALkgfTXgjJe8vgHBup4AmL7hzADxkb", "blocksMintedPenalty": 0}, - {"address": "QjoMvcLc7er7vZadpk2q98u6pKH3kdmkVa", "blocksMintedPenalty": 0}, - {"address": "QjoWGyKN1eytRvd8KaAwx1tBF7Xo5jTQRW", "blocksMintedPenalty": 0}, - {"address": "QjomB7jXd8FZ8zjTkki1zdN5hCE31pvy3D", "blocksMintedPenalty": 0}, - {"address": "Qjp2xJjaRFS4MinztcHVvHH5HUxgScuEiT", "blocksMintedPenalty": 0}, - {"address": "Qjp7wNp6ttCgyebqBNX2WS4z2Xbzv3bESJ", "blocksMintedPenalty": 0}, - {"address": "QjpCVMm7J3C8sXjxo6TkTnQ6PXpujcPbZ6", "blocksMintedPenalty": 0}, - {"address": "QjpRkGNJq1LYoU2PMVoXAgCfuWLqVjuzyN", "blocksMintedPenalty": 0}, - {"address": "QjqGpuZrPYbSxRXuxBCmEKR4USECjGBkrG", "blocksMintedPenalty": 0}, - {"address": "QjqSGHvWxM8XxPAeWAPh44w1aJ9jt4sULf", "blocksMintedPenalty": 0}, - {"address": "QjrEMcvwnEmjAW87nGpVQgVGVqxrB2zPVx", "blocksMintedPenalty": 0}, - {"address": "QjsWj55f5yd2p4M1dgbxQkw7mNZyMwWVh4", "blocksMintedPenalty": 0}, - {"address": "QjskwdMw4guZWKsvPwVSRw83rR3LJpwSr8", "blocksMintedPenalty": 0}, - {"address": "QjsybkmBnTJLmRXuZLuqoRzJfQCn9HP9Dh", "blocksMintedPenalty": 0}, - {"address": "QjtSn7X8gbYHuDSvMjLGTKGJ3G55WFEPRh", "blocksMintedPenalty": 0}, - {"address": "QjthKgGbivdBjpVyjwvwvGxcd5dZt9bTi7", "blocksMintedPenalty": 0}, - {"address": "Qjtnw3un3rYxdS2SQRMA9ZMx6E4oJMKwmW", "blocksMintedPenalty": 0}, - {"address": "Qjto6EtHvFiqrckS5B3V7yAQTwZYauTYGR", "blocksMintedPenalty": 0}, - {"address": "QjtyaMpCAQHSAj3STqpYswy17CwxJyPPQG", "blocksMintedPenalty": 0}, - {"address": "QjuAJmD9wLYvSux5ZGouuW6pBJhbuKnKAp", "blocksMintedPenalty": 0}, - {"address": "QjuFKUBw2sGxesaKVxAeR1YZAXvfPtC9u1", "blocksMintedPenalty": 0}, - {"address": "QjuWf8Usbui4bLCtgcq4XpvsGWXzQL43CL", "blocksMintedPenalty": 0}, - {"address": "QjupVV34yGFGw7XmmnTSyj95MkdyS7hhbn", "blocksMintedPenalty": 0}, - {"address": "Qjur1iSZPdTorZYhWBvV4ePKiqGcEwHo5L", "blocksMintedPenalty": 0}, - {"address": "QjvJE3cjGQFA5vbXdqJfQpttuvWaVtVsZe", "blocksMintedPenalty": 0}, - {"address": "QjvQ7EZ5be51oo4kiDKpK4LhGnJQsAhh7i", "blocksMintedPenalty": 0}, - {"address": "QjvfMFMMazfq4XYAS6j4SkPNdgCGTqof8t", "blocksMintedPenalty": 0}, - {"address": "QjvzTkEbhSbSwxGqHBTXXULnJdcXVxZNEw", "blocksMintedPenalty": 0} -] \ No newline at end of file From 9e001dfc168379ecebe676bcb215adadf770e737 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sat, 3 Feb 2024 19:51:51 +0100 Subject: [PATCH 41/47] Remove penalty fix --- .../java/org/qortal/transaction/RewardShareTransaction.java | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/main/java/org/qortal/transaction/RewardShareTransaction.java b/src/main/java/org/qortal/transaction/RewardShareTransaction.java index 45d48206..1b608a0c 100644 --- a/src/main/java/org/qortal/transaction/RewardShareTransaction.java +++ b/src/main/java/org/qortal/transaction/RewardShareTransaction.java @@ -183,18 +183,12 @@ public class RewardShareTransaction extends Transaction { @Override public boolean isConfirmableAtHeight(int height) { - final int min = BlockChain.getInstance().getPenaltyFixHeight() - 50; - final int max = BlockChain.getInstance().getPenaltyFixHeight() + 50; if (height >= BlockChain.getInstance().getUnconfirmableRewardSharesHeight()) { // Not confirmable in online accounts or distribution blocks if (Block.isOnlineAccountsBlock(height) || Block.isBatchRewardDistributionBlock(height)) { return false; } } - // Not confirmable on penalty fix - if (height > min && height < max) { - return false; - } return true; } From d05359dfa9d38f51038d8f48bdd8fe3261241557 Mon Sep 17 00:00:00 2001 From: Lance Edgar Date: Wed, 7 Feb 2024 16:52:12 -0600 Subject: [PATCH 42/47] Add debug logging when invalid timestamp is encountered --- src/main/java/org/qortal/block/Block.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/qortal/block/Block.java b/src/main/java/org/qortal/block/Block.java index 22e6e9f1..baa56179 100644 --- a/src/main/java/org/qortal/block/Block.java +++ b/src/main/java/org/qortal/block/Block.java @@ -1061,8 +1061,10 @@ public class Block { return ValidationResult.MINTER_NOT_ACCEPTED; long expectedTimestamp = calcTimestamp(parentBlockData, this.blockData.getMinterPublicKey(), minterLevel); - if (this.blockData.getTimestamp() != expectedTimestamp) - return ValidationResult.TIMESTAMP_INCORRECT; + if (this.blockData.getTimestamp() != expectedTimestamp) { + LOGGER.debug(String.format("timestamp mismatch! block had %s but we expected %s", this.blockData.getTimestamp(), expectedTimestamp)); + return ValidationResult.TIMESTAMP_INCORRECT; + } return ValidationResult.OK; } From 3f29116b47b51516315de997957288dfb83462d1 Mon Sep 17 00:00:00 2001 From: kennycud Date: Mon, 12 Feb 2024 06:31:17 -0800 Subject: [PATCH 43/47] Foreign coin trade transaction summaries --- .../api/resource/CrossChainResource.java | 109 ++++++ .../qortal/api/resource/CrossChainUtils.java | 332 ++++++++++++++++++ .../crosschain/AtomicTransactionData.java | 32 ++ .../data/crosschain/TransactionSummary.java | 106 ++++++ 4 files changed, 579 insertions(+) create mode 100644 src/main/java/org/qortal/data/crosschain/AtomicTransactionData.java create mode 100644 src/main/java/org/qortal/data/crosschain/TransactionSummary.java diff --git a/src/main/java/org/qortal/api/resource/CrossChainResource.java b/src/main/java/org/qortal/api/resource/CrossChainResource.java index 1161dc63..d3919d9b 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainResource.java +++ b/src/main/java/org/qortal/api/resource/CrossChainResource.java @@ -19,11 +19,14 @@ import org.qortal.api.model.CrossChainTradeSummary; import org.qortal.controller.tradebot.TradeBot; import org.qortal.crosschain.ACCT; import org.qortal.crosschain.AcctMode; +import org.qortal.crosschain.Bitcoiny; +import org.qortal.crosschain.ForeignBlockchainException; import org.qortal.crosschain.SupportedBlockchain; import org.qortal.crypto.Crypto; import org.qortal.data.at.ATData; import org.qortal.data.at.ATStateData; import org.qortal.data.crosschain.CrossChainTradeData; +import org.qortal.data.crosschain.TransactionSummary; import org.qortal.data.transaction.BaseTransactionData; import org.qortal.data.transaction.MessageTransactionData; import org.qortal.data.transaction.TransactionData; @@ -47,6 +50,7 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; import java.util.*; import java.util.function.Supplier; +import java.util.stream.Collectors; @Path("/crosschain") @Tag(name = "Cross-Chain") @@ -497,6 +501,111 @@ public class CrossChainResource { } } + @POST + @Path("/p2sh") + @Operation( + summary = "Returns P2SH Address", + description = "Get the P2SH address to lock foreign coin in a cross chain trade for QORT", + requestBody = @RequestBody( + required = true, + content = @Content( + mediaType = MediaType.TEXT_PLAIN, + schema = @Schema( + type = "string", + description = "the AT address", + example = "AKFnu9yBp7tUAc5HAphhfCxRZTYoeKXgUy" + ) + ) + ), + responses = { + @ApiResponse( + content = @Content(mediaType = MediaType.TEXT_PLAIN, schema = @Schema(type = "string", description = "address")) + ) + } + ) + @ApiErrors({ApiError.ADDRESS_UNKNOWN, ApiError.INVALID_CRITERIA}) + @SecurityRequirement(name = "apiKey") + public String getForeignP2SH(@HeaderParam(Security.API_KEY_HEADER) String apiKey, String atAddress) { + Security.checkApiCallAllowed(request); + + try (final Repository repository = RepositoryManager.getRepository()) { + ATData atData = repository.getATRepository().fromATAddress(atAddress); + if (atData == null) + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.ADDRESS_UNKNOWN); + + ACCT acct = SupportedBlockchain.getAcctByCodeHash(atData.getCodeHash()); + + if( acct == null || !(acct.getBlockchain() instanceof Bitcoiny) ) + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); + + Bitcoiny bitcoiny = (Bitcoiny) acct.getBlockchain(); + + CrossChainTradeData crossChainTradeData = acct.populateTradeData(repository, atData); + + Optional p2sh + = CrossChainUtils.getP2ShAddressForAT(atAddress, repository, bitcoiny, crossChainTradeData); + + if(p2sh.isPresent()){ + return p2sh.get(); + } + else{ + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.ADDRESS_UNKNOWN); + } + } + catch (DataException e) { + throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.REPOSITORY_ISSUE, e.getMessage()); + } + } + + @POST + @Path("/txactivity") + @Operation( + summary = "Returns Foreign Transaction Activity", + description = "Get the activity related to foreign coin trading", + responses = { + @ApiResponse( + content = @Content( + array = @ArraySchema( + schema = @Schema( + implementation = TransactionSummary.class + ) + ) + ) + ) + } + ) + @ApiErrors({ApiError.INVALID_CRITERIA, ApiError.REPOSITORY_ISSUE, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE}) + @SecurityRequirement(name = "apiKey") + public List getForeignTransactionActivity(@HeaderParam(Security.API_KEY_HEADER) String apiKey, @Parameter( + description = "Limit to specific blockchain", + example = "LITECOIN", + schema = @Schema(implementation = SupportedBlockchain.class) + ) @QueryParam("foreignBlockchain") SupportedBlockchain foreignBlockchain) { + Security.checkApiCallAllowed(request); + + if (!(foreignBlockchain.getInstance() instanceof Bitcoiny)) + throw ApiExceptionFactory.INSTANCE.createException(request, ApiError.INVALID_CRITERIA); + + Bitcoiny bitcoiny = (Bitcoiny) foreignBlockchain.getInstance() ; + + org.bitcoinj.core.Context.propagate( bitcoiny.getBitcoinjContext() ); + + try (final Repository repository = RepositoryManager.getRepository()) { + + // sort from last lock to first lock + return CrossChainUtils + .getForeignTradeSummaries(foreignBlockchain, repository, bitcoiny).stream() + .sorted(Comparator.comparing(TransactionSummary::getLockingTimestamp).reversed()) + .collect(Collectors.toList()); + } + catch (DataException e) { + throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.REPOSITORY_ISSUE, e.getMessage()); + } + catch (ForeignBlockchainException e) { + throw ApiExceptionFactory.INSTANCE.createCustomException(request, ApiError.FOREIGN_BLOCKCHAIN_NETWORK_ISSUE, e.getMessage()); + } + } + private ATData fetchAtDataWithChecking(Repository repository, String atAddress) throws DataException { ATData atData = repository.getATRepository().fromATAddress(atAddress); if (atData == null) diff --git a/src/main/java/org/qortal/api/resource/CrossChainUtils.java b/src/main/java/org/qortal/api/resource/CrossChainUtils.java index 6e631b7a..b07a9d6c 100644 --- a/src/main/java/org/qortal/api/resource/CrossChainUtils.java +++ b/src/main/java/org/qortal/api/resource/CrossChainUtils.java @@ -2,12 +2,28 @@ package org.qortal.api.resource; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.bitcoinj.core.Address; import org.bitcoinj.core.Coin; +import org.bitcoinj.script.Script; +import org.bitcoinj.script.ScriptBuilder; + import org.qortal.crosschain.*; +import org.qortal.data.at.ATData; +import org.qortal.data.crosschain.AtomicTransactionData; +import org.qortal.data.crosschain.CrossChainTradeData; +import org.qortal.data.crosschain.TradeBotData; +import org.qortal.data.crosschain.TransactionSummary; +import org.qortal.repository.DataException; +import org.qortal.repository.Repository; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Optional; +import java.util.HashMap; +import java.util.Map; +import java.util.stream.Collectors; + public class CrossChainUtils { private static final Logger LOGGER = LogManager.getLogger(CrossChainUtils.class); @@ -85,4 +101,320 @@ public class CrossChainUtils { return String.valueOf(bitcoiny.getFeeCeiling()); } + + /** + * Get P2Sh Address For AT + * + * @param atAddress the AT address + * @param repository the repository + * @param bitcoiny the blockchain data + * @param crossChainTradeData the trade data + * + * @return the p2sh address for the trade, if there is one + * + * @throws DataException + */ + public static Optional getP2ShAddressForAT( + String atAddress, + Repository repository, + Bitcoiny bitcoiny, + CrossChainTradeData crossChainTradeData) throws DataException { + + // get the trade bot data for the AT address + Optional tradeBotDataOptional + = repository.getCrossChainRepository() + .getAllTradeBotData().stream() + .filter(data -> data.getAtAddress().equals(atAddress)) + .findFirst(); + + if( tradeBotDataOptional.isEmpty() ) + return Optional.empty(); + + TradeBotData tradeBotData = tradeBotDataOptional.get(); + + // return the p2sh address from the trade bot + return getP2ShFromTradeBot(bitcoiny, crossChainTradeData, tradeBotData); + } + + /** + * Get Foreign Trade Summaries + * + * @param foreignBlockchain the blockchain traded on + * @param repository the repository + * @param bitcoiny data for the blockchain trade on + * @return + * @throws DataException + * @throws ForeignBlockchainException + */ + public static List getForeignTradeSummaries( + SupportedBlockchain foreignBlockchain, + Repository repository, + Bitcoiny bitcoiny) throws DataException, ForeignBlockchainException { + + // get all the AT address for the given blockchain + List atAddresses + = repository.getCrossChainRepository().getAllTradeBotData().stream() + .filter(data -> foreignBlockchain.name().toLowerCase().equals(data.getForeignBlockchain().toLowerCase())) + //.filter( data -> data.getForeignKey().equals( xpriv )) // TODO + .map(data -> data.getAtAddress()) + .collect(Collectors.toList()); + + List summaries = new ArrayList<>( atAddresses.size() * 2 ); + + // for each AT address, gather the data and get foreign trade summary + for( String atAddress: atAddresses) { + + ATData atData = repository.getATRepository().fromATAddress(atAddress); + + CrossChainTradeData crossChainTradeData = foreignBlockchain.getLatestAcct().populateTradeData(repository, atData); + + Optional address = getP2ShAddressForAT(atAddress,repository, bitcoiny, crossChainTradeData); + + if( address.isPresent()){ + summaries.add( getForeignTradeSummary( bitcoiny, address.get(), atAddress ) ); + } + } + + return summaries; + } + + /** + * Get P2Sh From Trade Bot + * + * Get P2Sh address from the trade bot + * + * @param bitcoiny the blockchain for the trade + * @param crossChainTradeData the cross cahin data for the trade + * @param tradeBotData the data from the trade bot + * + * @return the address, original format + */ + private static Optional getP2ShFromTradeBot( + Bitcoiny bitcoiny, + CrossChainTradeData crossChainTradeData, + TradeBotData tradeBotData) { + + // Pirate Chain does not support this + if( SupportedBlockchain.PIRATECHAIN.name().equals(tradeBotData.getForeignBlockchain())) return Optional.empty(); + + // need to get the trade PKH from the trade bot + if( tradeBotData.getTradeForeignPublicKeyHash() == null ) return Optional.empty(); + + // need to get the lock time from the trade bot + if( tradeBotData.getLockTimeA() == null ) return Optional.empty(); + + // need to get the creator PKH from the trade bot + if( crossChainTradeData.creatorForeignPKH == null ) return Optional.empty(); + + // need to get the secret from the trade bot + if( tradeBotData.getHashOfSecret() == null ) return Optional.empty(); + + // if we have the necessary data from the trade bot, + // then build the redeem script necessary to facilitate the trade + byte[] redeemScriptBytes + = BitcoinyHTLC.buildScript( + tradeBotData.getTradeForeignPublicKeyHash(), + tradeBotData.getLockTimeA(), + crossChainTradeData.creatorForeignPKH, + tradeBotData.getHashOfSecret() + ); + + + String p2shAddress = bitcoiny.deriveP2shAddress(redeemScriptBytes); + + return Optional.of(p2shAddress); + } + + /** + * Get Foreign Trade Summary + * + * @param bitcoiny the blockchain the trade occurred on + * @param p2shAddress the p2sh address + * @param atAddress the AT address the p2sh address is derived from + * + * @return the summary + * + * @throws ForeignBlockchainException + */ + public static TransactionSummary getForeignTradeSummary(Bitcoiny bitcoiny, String p2shAddress, String atAddress) + throws ForeignBlockchainException { + Script outputScript = ScriptBuilder.createOutputScript( + Address.fromString(bitcoiny.getNetworkParameters(), p2shAddress)); + + List hashes + = bitcoiny.getAddressTransactions( outputScript.getProgram(), true); + + TransactionSummary summary; + + if(hashes.isEmpty()){ + summary + = new TransactionSummary( + atAddress, + p2shAddress, + "N/A", + "N/A", + 0, + 0, + 0, + 0, + "N/A", + 0, + 0, + 0, + 0); + } + else if( hashes.size() == 1) { + AtomicTransactionData data = buildTransactionData(bitcoiny, hashes.get(0)); + summary = new TransactionSummary( + atAddress, + p2shAddress, + "N/A", + data.hash.txHash, + data.timestamp, + data.totalAmount, + getTotalInput(bitcoiny, data.inputs) - data.totalAmount, + data.size, + "N/A", + 0, + 0, + 0, + 0); + } + // otherwise assuming there is 2 and only 2 hashes + else { + List atomicTransactionDataList = new ArrayList<>(2); + + // hashes -> data + for( TransactionHash hash : hashes){ + atomicTransactionDataList.add(buildTransactionData(bitcoiny,hash)); + } + + // sort the transaction data by time + List sorted + = atomicTransactionDataList.stream() + .sorted((data1, data2) -> data1.timestamp.compareTo(data2.timestamp)) + .collect(Collectors.toList()); + + // build the summary using the first 2 transactions + summary = buildForeignTradeSummary(atAddress, p2shAddress, sorted.get(0), sorted.get(1), bitcoiny); + } + return summary; + } + + /** + * Build Foreign Trade Summary + * + * @param p2shValue the p2sh address, original format + * @param lockingTransaction the transaction lock the foreighn coin + * @param unlockingTransaction the transaction to unlock the foreign coin + * @param bitcoiny the blockchain the trade occurred on + * + * @return + * + * @throws ForeignBlockchainException + */ + private static TransactionSummary buildForeignTradeSummary( + String atAddress, + String p2shValue, + AtomicTransactionData lockingTransaction, + AtomicTransactionData unlockingTransaction, + Bitcoiny bitcoiny) throws ForeignBlockchainException { + + // get sum of the relevant inputs for each transaction + long lockingTotalInput = getTotalInput(bitcoiny, lockingTransaction.inputs); + long unlockingTotalInput = getTotalInput(bitcoiny, unlockingTransaction.inputs); + + // find the address that has output that matches the total input + Optional, Long>> addressValue + = lockingTransaction.valueByAddress.entrySet().stream() + .filter(entry -> entry.getValue() == unlockingTotalInput).findFirst(); + + // set that matching address, if found + String p2shAddress; + if( addressValue.isPresent() && addressValue.get().getKey().size() == 1 ){ + p2shAddress = addressValue.get().getKey().get(0); + } + else { + p2shAddress = "N/A"; + } + + // build summaries with prepared values + // the fees are the total amount subtracted by the total transaction input + return new TransactionSummary( + atAddress, + p2shValue, + p2shAddress, + lockingTransaction.hash.txHash, + lockingTransaction.timestamp, + lockingTransaction.totalAmount, + lockingTotalInput - lockingTransaction.totalAmount, + lockingTransaction.size, + unlockingTransaction.hash.txHash, + unlockingTransaction.timestamp, + unlockingTransaction.totalAmount, + unlockingTotalInput - unlockingTransaction.totalAmount, + unlockingTransaction.size + ); + + } + + /** + * Build Transaction Data + * + * @param bitcoiny the coin for the transaction + * @param hash the hash for the transaction + * + * @return the data for the transaction + * + * @throws ForeignBlockchainException + */ + private static AtomicTransactionData buildTransactionData( Bitcoiny bitcoiny, TransactionHash hash) + throws ForeignBlockchainException { + + BitcoinyTransaction transaction = bitcoiny.getTransaction(hash.txHash); + + // destination address list -> value + Map, Long> valueByAddress = new HashMap<>(); + + // for each output in the transaction, index by address list + for( BitcoinyTransaction.Output output : transaction.outputs) { + valueByAddress.put(output.addresses, output.value); + } + + return new AtomicTransactionData( + hash, + transaction.timestamp, + transaction.inputs, + valueByAddress, + transaction.totalAmount, + transaction.size); + } + + /** + * Get Total Input + * + * Get the sum of all the inputs used in a list of inputs. + * + * @param bitcoiny the coin the inputs belong to + * @param inputs the inputs + * + * @return the sum + * + * @throws ForeignBlockchainException + */ + private static long getTotalInput(Bitcoiny bitcoiny, List inputs) + throws ForeignBlockchainException { + + long totalInputOut = 0; + + // for each input, add to total input, + // get the indexed transaction output value and add to total value + for( BitcoinyTransaction.Input input : inputs){ + + BitcoinyTransaction inputOut = bitcoiny.getTransaction(input.outputTxHash); + BitcoinyTransaction.Output output = inputOut.outputs.get(input.outputVout); + totalInputOut += output.value; + } + return totalInputOut; + } } \ No newline at end of file diff --git a/src/main/java/org/qortal/data/crosschain/AtomicTransactionData.java b/src/main/java/org/qortal/data/crosschain/AtomicTransactionData.java new file mode 100644 index 00000000..04c7a2a9 --- /dev/null +++ b/src/main/java/org/qortal/data/crosschain/AtomicTransactionData.java @@ -0,0 +1,32 @@ +package org.qortal.data.crosschain; + +import org.qortal.crosschain.BitcoinyTransaction; +import org.qortal.crosschain.TransactionHash; + +import java.util.List; +import java.util.Map; + +public class AtomicTransactionData { + public final TransactionHash hash; + public final Integer timestamp; + public final List inputs; + public final Map, Long> valueByAddress; + public final long totalAmount; + public final int size; + + public AtomicTransactionData( + TransactionHash hash, + Integer timestamp, + List inputs, + Map, Long> valueByAddress, + long totalAmount, + int size) { + + this.hash = hash; + this.timestamp = timestamp; + this.inputs = inputs; + this.valueByAddress = valueByAddress; + this.totalAmount = totalAmount; + this.size = size; + } +} diff --git a/src/main/java/org/qortal/data/crosschain/TransactionSummary.java b/src/main/java/org/qortal/data/crosschain/TransactionSummary.java new file mode 100644 index 00000000..ac67a2f6 --- /dev/null +++ b/src/main/java/org/qortal/data/crosschain/TransactionSummary.java @@ -0,0 +1,106 @@ +package org.qortal.data.crosschain; + +import javax.xml.bind.annotation.XmlAccessType; +import javax.xml.bind.annotation.XmlAccessorType; + +@XmlAccessorType(XmlAccessType.FIELD) +public class TransactionSummary { + + private String atAddress; + private String p2shValue; + private String p2shAddress; + private String lockingHash; + private Integer lockingTimestamp; + private long lockingTotalAmount; + private long lockingFee; + private int lockingSize; + private String unlockingHash; + private Integer unlockingTimestamp; + private long unlockingTotalAmount; + private long unlockingFee; + private int unlockingSize; + + public TransactionSummary(){} + + public TransactionSummary( + String atAddress, + String p2shValue, + String p2shAddress, + String lockingHash, + Integer lockingTimestamp, + long lockingTotalAmount, + long lockingFee, + int lockingSize, + String unlockingHash, + Integer unlockingTimestamp, + long unlockingTotalAmount, + long unlockingFee, + int unlockingSize) { + + this.atAddress = atAddress; + this.p2shValue = p2shValue; + this.p2shAddress = p2shAddress; + this.lockingHash = lockingHash; + this.lockingTimestamp = lockingTimestamp; + this.lockingTotalAmount = lockingTotalAmount; + this.lockingFee = lockingFee; + this.lockingSize = lockingSize; + this.unlockingHash = unlockingHash; + this.unlockingTimestamp = unlockingTimestamp; + this.unlockingTotalAmount = unlockingTotalAmount; + this.unlockingFee = unlockingFee; + this.unlockingSize = unlockingSize; + } + + public String getAtAddress() { + return atAddress; + } + + public String getP2shValue() { + return p2shValue; + } + + public String getP2shAddress() { + return p2shAddress; + } + + public String getLockingHash() { + return lockingHash; + } + + public Integer getLockingTimestamp() { + return lockingTimestamp; + } + + public long getLockingTotalAmount() { + return lockingTotalAmount; + } + + public long getLockingFee() { + return lockingFee; + } + + public int getLockingSize() { + return lockingSize; + } + + public String getUnlockingHash() { + return unlockingHash; + } + + public Integer getUnlockingTimestamp() { + return unlockingTimestamp; + } + + public long getUnlockingTotalAmount() { + return unlockingTotalAmount; + } + + public long getUnlockingFee() { + return unlockingFee; + } + + public int getUnlockingSize() { + return unlockingSize; + } +} From 2d27901f9f3f842c999da3ce4d393106a1cc673c Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sun, 18 Feb 2024 18:12:43 +0100 Subject: [PATCH 44/47] Adding new algos --- .../qortal/account/SelfSponsorshipAlgoV2.java | 249 +++ .../qortal/account/SelfSponsorshipAlgoV3.java | 370 ++++ src/main/java/org/qortal/block/Block.java | 22 +- .../java/org/qortal/block/BlockChain.java | 20 + .../block/SelfSponsorshipAlgoV2Block.java | 143 ++ .../block/SelfSponsorshipAlgoV3Block.java | 136 ++ .../org/qortal/crosschain/PirateChain.java | 7 +- .../repository/TransactionRepository.java | 9 + .../HSQLDBTransactionRepository.java | 27 + .../java/org/qortal/settings/Settings.java | 2 +- .../transaction/RegisterNameTransaction.java | 8 + .../transaction/RewardShareTransaction.java | 16 + .../org/qortal/transaction/Transaction.java | 2 + .../transaction/TransferAssetTransaction.java | 9 + src/main/resources/blockchain.json | 7 +- .../i18n/TransactionValidity_de.properties | 2 + .../i18n/TransactionValidity_en.properties | 2 + .../i18n/TransactionValidity_es.properties | 2 + .../i18n/TransactionValidity_fi.properties | 2 + .../i18n/TransactionValidity_fr.properties | 2 + .../i18n/TransactionValidity_he.properties | 2 + .../i18n/TransactionValidity_hu.properties | 2 + .../i18n/TransactionValidity_it.properties | 2 + .../i18n/TransactionValidity_jp.properties | 2 + .../i18n/TransactionValidity_ko.properties | 2 + .../i18n/TransactionValidity_nl.properties | 2 + .../i18n/TransactionValidity_pl.properties | 2 + .../i18n/TransactionValidity_ro.properties | 2 + .../i18n/TransactionValidity_ru.properties | 2 + .../i18n/TransactionValidity_sv.properties | 2 + .../i18n/TransactionValidity_zh_CN.properties | 2 + .../i18n/TransactionValidity_zh_TW.properties | 2 + .../test/SelfSponsorshipAlgoV2Tests.java | 342 ++++ .../test/SelfSponsorshipAlgoV3Tests.java | 1578 +++++++++++++++++ .../test-chain-v2-block-timestamps.json | 8 +- .../test-chain-v2-disable-reference.json | 8 +- .../test-chain-v2-founder-rewards.json | 8 +- .../test-chain-v2-leftover-reward.json | 8 +- src/test/resources/test-chain-v2-minting.json | 8 +- .../test-chain-v2-qora-holder-extremes.json | 8 +- .../test-chain-v2-qora-holder-reduction.json | 8 +- .../resources/test-chain-v2-qora-holder.json | 8 +- .../test-chain-v2-reward-levels.json | 8 +- .../test-chain-v2-reward-scaling.json | 8 +- .../test-chain-v2-reward-shares.json | 8 +- ...est-chain-v2-self-sponsorship-algo-v1.json | 8 +- ...est-chain-v2-self-sponsorship-algo-v2.json | 132 ++ ...est-chain-v2-self-sponsorship-algo-v3.json | 132 ++ src/test/resources/test-chain-v2.json | 8 +- ...-settings-v2-self-sponsorship-algo-v2.json | 20 + ...-settings-v2-self-sponsorship-algo-v3.json | 20 + 51 files changed, 3343 insertions(+), 46 deletions(-) create mode 100644 src/main/java/org/qortal/account/SelfSponsorshipAlgoV2.java create mode 100644 src/main/java/org/qortal/account/SelfSponsorshipAlgoV3.java create mode 100644 src/main/java/org/qortal/block/SelfSponsorshipAlgoV2Block.java create mode 100644 src/main/java/org/qortal/block/SelfSponsorshipAlgoV3Block.java create mode 100644 src/test/java/org/qortal/test/SelfSponsorshipAlgoV2Tests.java create mode 100644 src/test/java/org/qortal/test/SelfSponsorshipAlgoV3Tests.java create mode 100644 src/test/resources/test-chain-v2-self-sponsorship-algo-v2.json create mode 100644 src/test/resources/test-chain-v2-self-sponsorship-algo-v3.json create mode 100644 src/test/resources/test-settings-v2-self-sponsorship-algo-v2.json create mode 100644 src/test/resources/test-settings-v2-self-sponsorship-algo-v3.json diff --git a/src/main/java/org/qortal/account/SelfSponsorshipAlgoV2.java b/src/main/java/org/qortal/account/SelfSponsorshipAlgoV2.java new file mode 100644 index 00000000..9052257c --- /dev/null +++ b/src/main/java/org/qortal/account/SelfSponsorshipAlgoV2.java @@ -0,0 +1,249 @@ +package org.qortal.account; + +import org.qortal.api.resource.TransactionsResource; +import org.qortal.asset.Asset; +import org.qortal.block.BlockChain; +import org.qortal.data.account.AccountData; +import org.qortal.data.transaction.*; +import org.qortal.repository.DataException; +import org.qortal.repository.Repository; +import org.qortal.transaction.Transaction.TransactionType; + +import java.util.*; + +public class SelfSponsorshipAlgoV2 { + + private final long snapshotTimestampV1 = BlockChain.getInstance().getSelfSponsorshipAlgoV1SnapshotTimestamp(); + private final long snapshotTimestampV2 = BlockChain.getInstance().getSelfSponsorshipAlgoV2SnapshotTimestamp(); + private final long referenceTimestamp = BlockChain.getInstance().getReferenceTimestampBlock(); + + private final boolean override; + private final Repository repository; + private final String address; + + private int recentAssetSendCount = 0; + private int recentSponsorshipCount = 0; + + private final Set assetAddresses = new LinkedHashSet<>(); + private final Set penaltyAddresses = new LinkedHashSet<>(); + private final Set sponsorAddresses = new LinkedHashSet<>(); + + private List sponsorshipRewardShares = new ArrayList<>(); + private List transferAssetForAddress = new ArrayList<>(); + + public SelfSponsorshipAlgoV2(Repository repository, String address, boolean override) { + this.repository = repository; + this.address = address; + this.override = override; + } + + public String getAddress() { + return this.address; + } + + public Set getPenaltyAddresses() { + return this.penaltyAddresses; + } + + public void run() throws DataException { + if (!override) { + this.getAccountPrivs(this.address); + } + + if (override) { + this.fetchTransferAssetForAddress(this.address); + this.findRecentAssetSendCount(); + + if (this.recentAssetSendCount >= 6) { + this.penaltyAddresses.add(this.address); + this.penaltyAddresses.addAll(this.assetAddresses); + } + } + } + + private void getAccountPrivs(String address) throws DataException { + AccountData accountData = this.repository.getAccountRepository().getAccount(address); + List transferPrivsTransactions = fetchTransferPrivsForAddress(address); + transferPrivsTransactions.removeIf(t -> t.getTimestamp() > this.referenceTimestamp || accountData.getAddress().equals(t.getRecipient())); + + if (transferPrivsTransactions.isEmpty()) { + // Nothing to do + return; + } + + for (TransactionData transactionData : transferPrivsTransactions) { + TransferPrivsTransactionData transferPrivsTransactionData = (TransferPrivsTransactionData) transactionData; + this.penaltyAddresses.add(transferPrivsTransactionData.getRecipient()); + this.fetchSponsorshipRewardShares(transferPrivsTransactionData.getRecipient()); + this.findRecentSponsorshipCount(); + + if (this.recentSponsorshipCount >= 1) { + this.penaltyAddresses.addAll(this.sponsorAddresses); + } + + String newAddress = this.getDestinationAccount(transferPrivsTransactionData.getRecipient()); + + while (newAddress != null) { + // Found destination account + this.penaltyAddresses.add(newAddress); + this.fetchSponsorshipRewardShares(newAddress); + this.findRecentSponsorshipCount(); + + if (this.recentSponsorshipCount >= 1) { + this.penaltyAddresses.addAll(this.sponsorAddresses); + } + + newAddress = this.getDestinationAccount(newAddress); + } + } + } + + private String getDestinationAccount(String address) throws DataException { + AccountData accountData = this.repository.getAccountRepository().getAccount(address); + List transferPrivsTransactions = fetchTransferPrivsForAddress(address); + transferPrivsTransactions.removeIf(t -> t.getTimestamp() > this.referenceTimestamp || accountData.getAddress().equals(t.getRecipient())); + + if (transferPrivsTransactions.isEmpty()) { + return null; + } + + if (accountData == null) { + return null; + } + + for (TransactionData transactionData : transferPrivsTransactions) { + TransferPrivsTransactionData transferPrivsTransactionData = (TransferPrivsTransactionData) transactionData; + if (Arrays.equals(transferPrivsTransactionData.getSenderPublicKey(), accountData.getPublicKey())) { + return transferPrivsTransactionData.getRecipient(); + } + } + + return null; + } + + private void fetchSponsorshipRewardShares(String address) throws DataException { + AccountData accountDataRs = this.repository.getAccountRepository().getAccount(address); + List sponsorshipRewardShares = new ArrayList<>(); + + // Define relevant transactions + List txTypes = List.of(TransactionType.REWARD_SHARE); + List transactionDataList = fetchTransactions(repository, txTypes, address, false); + + for (TransactionData transactionData : transactionDataList) { + if (transactionData.getType() != TransactionType.REWARD_SHARE) { + continue; + } + + RewardShareTransactionData rewardShareTransactionData = (RewardShareTransactionData) transactionData; + + // Skip removals + if (rewardShareTransactionData.getSharePercent() < 0) { + continue; + } + + // Skip if not sponsored by this account + if (!Arrays.equals(rewardShareTransactionData.getCreatorPublicKey(), accountDataRs.getPublicKey())) { + continue; + } + + // Skip self shares + if (Objects.equals(rewardShareTransactionData.getRecipient(), address)) { + continue; + } + + boolean duplicateFound = false; + for (RewardShareTransactionData existingRewardShare : sponsorshipRewardShares) { + if (Objects.equals(existingRewardShare.getRecipient(), rewardShareTransactionData.getRecipient())) { + // Duplicate + duplicateFound = true; + break; + } + } + + if (!duplicateFound) { + sponsorshipRewardShares.add(rewardShareTransactionData); + this.sponsorAddresses.add(rewardShareTransactionData.getRecipient()); + } + } + + this.sponsorshipRewardShares = sponsorshipRewardShares; + } + + private void fetchTransferAssetForAddress(String address) throws DataException { + List transferAssetForAddress = new ArrayList<>(); + + // Define relevant transactions + List txTypes = List.of(TransactionType.TRANSFER_ASSET); + List transactionDataList = fetchTransactions(repository, txTypes, address, false); + transactionDataList.removeIf(t -> t.getTimestamp() <= this.snapshotTimestampV1 || t.getTimestamp() >= this.snapshotTimestampV2); + + for (TransactionData transactionData : transactionDataList) { + if (transactionData.getType() != TransactionType.TRANSFER_ASSET) { + continue; + } + + TransferAssetTransactionData transferAssetTransactionData = (TransferAssetTransactionData) transactionData; + + if (transferAssetTransactionData.getAssetId() == Asset.QORT) { + if (!Objects.equals(transferAssetTransactionData.getRecipient(), address)) { + // Outgoing transfer asset for this account + transferAssetForAddress.add(transferAssetTransactionData); + this.assetAddresses.add(transferAssetTransactionData.getRecipient()); + } + } + } + + this.transferAssetForAddress = transferAssetForAddress; + } + + private void findRecentSponsorshipCount() { + int recentSponsorshipCount = 0; + + for (RewardShareTransactionData rewardShare : sponsorshipRewardShares) { + if (rewardShare.getTimestamp() >= this.snapshotTimestampV1) { + recentSponsorshipCount++; + } + } + + this.recentSponsorshipCount = recentSponsorshipCount; + } + + private void findRecentAssetSendCount() { + int recentAssetSendCount = 0; + + for (TransferAssetTransactionData assetSend : transferAssetForAddress) { + if (assetSend.getTimestamp() >= this.snapshotTimestampV1) { + recentAssetSendCount++; + } + } + + this.recentAssetSendCount = recentAssetSendCount; + } + + private List fetchTransferPrivsForAddress(String address) throws DataException { + return fetchTransactions(repository, + List.of(TransactionType.TRANSFER_PRIVS), + address, true); + } + + private static List fetchTransactions(Repository repository, List txTypes, String address, boolean reverse) throws DataException { + // Fetch all relevant transactions for this account + List signatures = repository.getTransactionRepository() + .getSignaturesMatchingCriteria(null, null, null, txTypes, + null, null, address, TransactionsResource.ConfirmationStatus.CONFIRMED, + null, null, reverse); + + List transactionDataList = new ArrayList<>(); + + for (byte[] signature : signatures) { + // Fetch transaction data + TransactionData transactionData = repository.getTransactionRepository().fromSignature(signature); + if (transactionData == null) { + continue; + } + transactionDataList.add(transactionData); + } + + return transactionDataList; + } +} \ No newline at end of file diff --git a/src/main/java/org/qortal/account/SelfSponsorshipAlgoV3.java b/src/main/java/org/qortal/account/SelfSponsorshipAlgoV3.java new file mode 100644 index 00000000..80c1ba2f --- /dev/null +++ b/src/main/java/org/qortal/account/SelfSponsorshipAlgoV3.java @@ -0,0 +1,370 @@ +package org.qortal.account; + +import org.qortal.api.resource.TransactionsResource; +import org.qortal.asset.Asset; +import org.qortal.data.account.AccountData; +import org.qortal.data.naming.NameData; +import org.qortal.data.transaction.*; +import org.qortal.repository.DataException; +import org.qortal.repository.Repository; +import org.qortal.transaction.Transaction.TransactionType; + +import java.util.*; +import java.util.stream.Collectors; + +public class SelfSponsorshipAlgoV3 { + + private final Repository repository; + private final String address; + private final AccountData accountData; + private final long snapshotTimestampV1; + private final long snapshotTimestampV3; + private final boolean override; + + private int registeredNameCount = 0; + private int suspiciousCount = 0; + private int suspiciousPercent = 0; + private int consolidationCount = 0; + private int bulkIssuanceCount = 0; + private int recentSponsorshipCount = 0; + + private List sponsorshipRewardShares = new ArrayList<>(); + private final Map> paymentsByAddress = new HashMap<>(); + private final Set sponsees = new LinkedHashSet<>(); + private Set consolidatedAddresses = new LinkedHashSet<>(); + private final Set zeroTransactionAddreses = new LinkedHashSet<>(); + private final Set penaltyAddresses = new LinkedHashSet<>(); + + public SelfSponsorshipAlgoV3(Repository repository, String address, long snapshotTimestampV1, long snapshotTimestampV3, boolean override) throws DataException { + this.repository = repository; + this.address = address; + this.accountData = this.repository.getAccountRepository().getAccount(this.address); + this.snapshotTimestampV1 = snapshotTimestampV1; + this.snapshotTimestampV3 = snapshotTimestampV3; + this.override = override; + } + + public String getAddress() { + return this.address; + } + + public Set getPenaltyAddresses() { + return this.penaltyAddresses; + } + + + public void run() throws DataException { + if (this.accountData == null) { + // Nothing to do + return; + } + + this.fetchSponsorshipRewardShares(); + if (this.sponsorshipRewardShares.isEmpty()) { + // Nothing to do + return; + } + + this.findConsolidatedRewards(); + this.findBulkIssuance(); + this.findRegisteredNameCount(); + this.findRecentSponsorshipCount(); + + int score = this.calculateScore(); + if (score <= 0 && !override) { + return; + } + + String newAddress = this.getDestinationAccount(this.address); + while (newAddress != null) { + // Found destination account + this.penaltyAddresses.add(newAddress); + + // Run algo for this address, but in "override" mode because it has already been flagged + SelfSponsorshipAlgoV3 algoV3 = new SelfSponsorshipAlgoV3(this.repository, newAddress, this.snapshotTimestampV1, this.snapshotTimestampV3, true); + algoV3.run(); + this.penaltyAddresses.addAll(algoV3.getPenaltyAddresses()); + + newAddress = this.getDestinationAccount(newAddress); + } + + this.penaltyAddresses.add(this.address); + + if (this.override || this.recentSponsorshipCount < 20) { + this.penaltyAddresses.addAll(this.consolidatedAddresses); + this.penaltyAddresses.addAll(this.zeroTransactionAddreses); + } + else { + this.penaltyAddresses.addAll(this.sponsees); + } + } + + private String getDestinationAccount(String address) throws DataException { + List transferPrivsTransactions = fetchTransferPrivsForAddress(address); + if (transferPrivsTransactions.isEmpty()) { + // No TRANSFER_PRIVS transactions for this address + return null; + } + + AccountData accountData = this.repository.getAccountRepository().getAccount(address); + if (accountData == null) { + return null; + } + + for (TransactionData transactionData : transferPrivsTransactions) { + TransferPrivsTransactionData transferPrivsTransactionData = (TransferPrivsTransactionData) transactionData; + if (Arrays.equals(transferPrivsTransactionData.getSenderPublicKey(), accountData.getPublicKey())) { + return transferPrivsTransactionData.getRecipient(); + } + } + + return null; + } + + private void findConsolidatedRewards() throws DataException { + List sponseesThatSentRewards = new ArrayList<>(); + Map paymentRecipients = new HashMap<>(); + + // Collect outgoing payments of each sponsee + for (String sponseeAddress : this.sponsees) { + + // Firstly fetch all payments for address, since the functions below depend on this data + this.fetchPaymentsForAddress(sponseeAddress); + + // Check if the address has zero relevant transactions + if (this.hasZeroTransactions(sponseeAddress)) { + this.zeroTransactionAddreses.add(sponseeAddress); + } + + // Get payment recipients + List allPaymentRecipients = this.fetchOutgoingPaymentRecipientsForAddress(sponseeAddress); + if (allPaymentRecipients.isEmpty()) { + continue; + } + sponseesThatSentRewards.add(sponseeAddress); + + List addressesPaidByThisSponsee = new ArrayList<>(); + for (String paymentRecipient : allPaymentRecipients) { + if (addressesPaidByThisSponsee.contains(paymentRecipient)) { + // We already tracked this association - don't allow multiple to stack up + continue; + } + addressesPaidByThisSponsee.add(paymentRecipient); + + // Increment count for this recipient, or initialize to 1 if not present + if (paymentRecipients.computeIfPresent(paymentRecipient, (k, v) -> v + 1) == null) { + paymentRecipients.put(paymentRecipient, 1); + } + } + + } + + // Exclude addresses with a low number of payments + Map filteredPaymentRecipients = paymentRecipients.entrySet().stream() + .filter(p -> p.getValue() != null && p.getValue() >= 10) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + // Now check how many sponsees have sent to this subset of addresses + Map sponseesThatConsolidatedRewards = new HashMap<>(); + for (String sponseeAddress : sponseesThatSentRewards) { + List allPaymentRecipients = this.fetchOutgoingPaymentRecipientsForAddress(sponseeAddress); + // Remove any that aren't to one of the flagged recipients (i.e. consolidation) + allPaymentRecipients.removeIf(r -> !filteredPaymentRecipients.containsKey(r)); + + int count = allPaymentRecipients.size(); + if (count == 0) { + continue; + } + if (sponseesThatConsolidatedRewards.computeIfPresent(sponseeAddress, (k, v) -> v + count) == null) { + sponseesThatConsolidatedRewards.put(sponseeAddress, count); + } + } + + // Remove sponsees that have only sent a low number of payments to the filtered addresses + Map filteredSponseesThatConsolidatedRewards = sponseesThatConsolidatedRewards.entrySet().stream() + .filter(p -> p.getValue() != null && p.getValue() >= 2) + .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + + this.consolidationCount = sponseesThatConsolidatedRewards.size(); + this.consolidatedAddresses = new LinkedHashSet<>(filteredSponseesThatConsolidatedRewards.keySet()); + this.suspiciousCount = this.consolidationCount + this.zeroTransactionAddreses.size(); + this.suspiciousPercent = (int)(this.suspiciousCount / (float) this.sponsees.size() * 100); + } + + private void findBulkIssuance() { + Long lastTimestamp = null; + for (RewardShareTransactionData rewardShareTransactionData : sponsorshipRewardShares) { + long timestamp = rewardShareTransactionData.getTimestamp(); + if (timestamp >= this.snapshotTimestampV3) { + continue; + } + + if (lastTimestamp != null) { + if (timestamp - lastTimestamp < 3*60*1000L) { + this.bulkIssuanceCount++; + } + } + lastTimestamp = timestamp; + } + } + + private void findRegisteredNameCount() throws DataException { + int registeredNameCount = 0; + for (String sponseeAddress : sponsees) { + List names = repository.getNameRepository().getNamesByOwner(sponseeAddress); + for (NameData name : names) { + if (name.getRegistered() < this.snapshotTimestampV3) { + registeredNameCount++; + break; + } + } + } + this.registeredNameCount = registeredNameCount; + } + + private void findRecentSponsorshipCount() { + int recentSponsorshipCount = 0; + for (RewardShareTransactionData rewardShare : sponsorshipRewardShares) { + if (rewardShare.getTimestamp() >= this.snapshotTimestampV1) { + recentSponsorshipCount++; + } + } + this.recentSponsorshipCount = recentSponsorshipCount; + } + + private int calculateScore() { + final int suspiciousMultiplier = (this.suspiciousCount >= 100) ? this.suspiciousPercent : 1; + final int nameMultiplier = (this.sponsees.size() >= 25 && this.registeredNameCount <= 1) ? 21 : + (this.sponsees.size() >= 15 && this.registeredNameCount <= 1) ? 11 : + (this.sponsees.size() >= 5 && this.registeredNameCount <= 1) ? 5 : 1; + final int consolidationMultiplier = Math.max(this.consolidationCount, 1); + final int bulkIssuanceMultiplier = Math.max(this.bulkIssuanceCount / 2, 1); + final int offset = 20; + return suspiciousMultiplier * nameMultiplier * consolidationMultiplier * bulkIssuanceMultiplier - offset; + } + + private void fetchSponsorshipRewardShares() throws DataException { + List sponsorshipRewardShares = new ArrayList<>(); + + // Define relevant transactions + List txTypes = List.of(TransactionType.REWARD_SHARE); + List transactionDataList = fetchTransactions(repository, txTypes, this.address, false); + transactionDataList.removeIf(t -> t.getTimestamp() <= this.snapshotTimestampV1 || t.getTimestamp() >= this.snapshotTimestampV3); + + for (TransactionData transactionData : transactionDataList) { + if (transactionData.getType() != TransactionType.REWARD_SHARE) { + continue; + } + + RewardShareTransactionData rewardShareTransactionData = (RewardShareTransactionData) transactionData; + + // Skip removals + if (rewardShareTransactionData.getSharePercent() < 0) { + continue; + } + + // Skip if not sponsored by this account + if (!Arrays.equals(rewardShareTransactionData.getCreatorPublicKey(), accountData.getPublicKey())) { + continue; + } + + // Skip self shares + if (Objects.equals(rewardShareTransactionData.getRecipient(), this.address)) { + continue; + } + + boolean duplicateFound = false; + for (RewardShareTransactionData existingRewardShare : sponsorshipRewardShares) { + if (Objects.equals(existingRewardShare.getRecipient(), rewardShareTransactionData.getRecipient())) { + // Duplicate + duplicateFound = true; + break; + } + } + if (!duplicateFound) { + sponsorshipRewardShares.add(rewardShareTransactionData); + this.sponsees.add(rewardShareTransactionData.getRecipient()); + } + } + + this.sponsorshipRewardShares = sponsorshipRewardShares; + } + + private List fetchTransferPrivsForAddress(String address) throws DataException { + return fetchTransactions(repository, + List.of(TransactionType.TRANSFER_PRIVS), + address, true); + } + + private void fetchPaymentsForAddress(String address) throws DataException { + List payments = fetchTransactions(repository, + Arrays.asList(TransactionType.PAYMENT, TransactionType.TRANSFER_ASSET), + address, false); + this.paymentsByAddress.put(address, payments); + } + + private List fetchOutgoingPaymentRecipientsForAddress(String address) { + List outgoingPaymentRecipients = new ArrayList<>(); + + List transactionDataList = this.paymentsByAddress.get(address); + if (transactionDataList == null) transactionDataList = new ArrayList<>(); + transactionDataList.removeIf(t -> t.getTimestamp() <= this.snapshotTimestampV1 || t.getTimestamp() >= this.snapshotTimestampV3); + for (TransactionData transactionData : transactionDataList) { + switch (transactionData.getType()) { + + case PAYMENT: + PaymentTransactionData paymentTransactionData = (PaymentTransactionData) transactionData; + if (!Objects.equals(paymentTransactionData.getRecipient(), address)) { + // Outgoing payment from this account + outgoingPaymentRecipients.add(paymentTransactionData.getRecipient()); + } + break; + + case TRANSFER_ASSET: + TransferAssetTransactionData transferAssetTransactionData = (TransferAssetTransactionData) transactionData; + if (transferAssetTransactionData.getAssetId() == Asset.QORT) { + if (!Objects.equals(transferAssetTransactionData.getRecipient(), address)) { + // Outgoing payment from this account + outgoingPaymentRecipients.add(transferAssetTransactionData.getRecipient()); + } + } + break; + + default: + break; + } + } + + return outgoingPaymentRecipients; + } + + private boolean hasZeroTransactions(String address) { + List transactionDataList = this.paymentsByAddress.get(address); + if (transactionDataList == null) { + return true; + } + transactionDataList.removeIf(t -> t.getTimestamp() <= this.snapshotTimestampV1 || t.getTimestamp() >= this.snapshotTimestampV3); + return transactionDataList.size() == 0; + } + + private static List fetchTransactions(Repository repository, List txTypes, String address, boolean reverse) throws DataException { + // Fetch all relevant transactions for this account + List signatures = repository.getTransactionRepository() + .getSignaturesMatchingCriteria(null, null, null, txTypes, + null, null, address, TransactionsResource.ConfirmationStatus.CONFIRMED, + null, null, reverse); + + List transactionDataList = new ArrayList<>(); + + for (byte[] signature : signatures) { + // Fetch transaction data + TransactionData transactionData = repository.getTransactionRepository().fromSignature(signature); + if (transactionData == null) { + continue; + } + transactionDataList.add(transactionData); + } + + return transactionDataList; + } +} \ No newline at end of file diff --git a/src/main/java/org/qortal/block/Block.java b/src/main/java/org/qortal/block/Block.java index baa56179..caaa0c76 100644 --- a/src/main/java/org/qortal/block/Block.java +++ b/src/main/java/org/qortal/block/Block.java @@ -1062,9 +1062,9 @@ public class Block { long expectedTimestamp = calcTimestamp(parentBlockData, this.blockData.getMinterPublicKey(), minterLevel); if (this.blockData.getTimestamp() != expectedTimestamp) { - LOGGER.debug(String.format("timestamp mismatch! block had %s but we expected %s", this.blockData.getTimestamp(), expectedTimestamp)); - return ValidationResult.TIMESTAMP_INCORRECT; - } + LOGGER.debug(String.format("timestamp mismatch! block had %s but we expected %s", this.blockData.getTimestamp(), expectedTimestamp)); + return ValidationResult.TIMESTAMP_INCORRECT; + } return ValidationResult.OK; } @@ -1558,6 +1558,14 @@ public class Block { if (this.blockData.getHeight() == BlockChain.getInstance().getSelfSponsorshipAlgoV1Height()) { SelfSponsorshipAlgoV1Block.processAccountPenalties(this); } + + if (this.blockData.getHeight() == BlockChain.getInstance().getSelfSponsorshipAlgoV2Height()) { + SelfSponsorshipAlgoV2Block.processAccountPenalties(this); + } + + if (this.blockData.getHeight() == BlockChain.getInstance().getSelfSponsorshipAlgoV3Height()) { + SelfSponsorshipAlgoV3Block.processAccountPenalties(this); + } } // We're about to (test-)process a batch of transactions, @@ -1851,6 +1859,14 @@ public class Block { SelfSponsorshipAlgoV1Block.orphanAccountPenalties(this); } + if (this.blockData.getHeight() == BlockChain.getInstance().getSelfSponsorshipAlgoV2Height()) { + SelfSponsorshipAlgoV2Block.orphanAccountPenalties(this); + } + + if (this.blockData.getHeight() == BlockChain.getInstance().getSelfSponsorshipAlgoV3Height()) { + SelfSponsorshipAlgoV3Block.orphanAccountPenalties(this); + } + // Account levels and block rewards are only processed/orphaned on block reward distribution blocks if (this.isRewardDistributionBlock()) { // Block rewards, including transaction fees, removed after transactions undone diff --git a/src/main/java/org/qortal/block/BlockChain.java b/src/main/java/org/qortal/block/BlockChain.java index eb98000e..dc9dfe4c 100644 --- a/src/main/java/org/qortal/block/BlockChain.java +++ b/src/main/java/org/qortal/block/BlockChain.java @@ -74,6 +74,7 @@ public class BlockChain { onlineAccountMinterLevelValidationHeight, selfSponsorshipAlgoV1Height, selfSponsorshipAlgoV2Height, + selfSponsorshipAlgoV3Height, feeValidationFixTimestamp, chatReferenceTimestamp, arbitraryOptionalFeeTimestamp, @@ -216,6 +217,12 @@ public class BlockChain { /** Snapshot timestamp for self sponsorship algo V2 */ private long selfSponsorshipAlgoV2SnapshotTimestamp; + /** Snapshot timestamp for self sponsorship algo V3 */ + private long selfSponsorshipAlgoV3SnapshotTimestamp; + + /** Reference timestamp for self sponsorship algo V1 block height */ + private long referenceTimestampBlock; + /** Feature-trigger timestamp to modify behaviour of various transactions that support mempow */ private long mempowTransactionUpdatesTimestamp; @@ -418,6 +425,15 @@ public class BlockChain { return this.selfSponsorshipAlgoV2SnapshotTimestamp; } + // Self sponsorship algo V3 + public long getSelfSponsorshipAlgoV3SnapshotTimestamp() { + return this.selfSponsorshipAlgoV3SnapshotTimestamp; + } + + // Self sponsorship algo V3 + public long getReferenceTimestampBlock() { + return this.referenceTimestampBlock; + } // Feature-trigger timestamp to modify behaviour of various transactions that support mempow public long getMemPoWTransactionUpdatesTimestamp() { return this.mempowTransactionUpdatesTimestamp; @@ -562,6 +578,10 @@ public class BlockChain { return this.featureTriggers.get(FeatureTrigger.selfSponsorshipAlgoV2Height.name()).intValue(); } + public int getSelfSponsorshipAlgoV3Height() { + return this.featureTriggers.get(FeatureTrigger.selfSponsorshipAlgoV3Height.name()).intValue(); + } + public long getOnlineAccountMinterLevelValidationHeight() { return this.featureTriggers.get(FeatureTrigger.onlineAccountMinterLevelValidationHeight.name()).intValue(); } diff --git a/src/main/java/org/qortal/block/SelfSponsorshipAlgoV2Block.java b/src/main/java/org/qortal/block/SelfSponsorshipAlgoV2Block.java new file mode 100644 index 00000000..7957de6a --- /dev/null +++ b/src/main/java/org/qortal/block/SelfSponsorshipAlgoV2Block.java @@ -0,0 +1,143 @@ +package org.qortal.block; + +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.qortal.account.SelfSponsorshipAlgoV2; +import org.qortal.api.model.AccountPenaltyStats; +import org.qortal.crypto.Crypto; +import org.qortal.data.account.AccountData; +import org.qortal.data.account.AccountPenaltyData; +import org.qortal.repository.DataException; +import org.qortal.repository.Repository; +import org.qortal.utils.Base58; + +import java.nio.charset.StandardCharsets; +import java.util.*; +import java.util.stream.Collectors; + +/** + * Self Sponsorship AlgoV2 Block + *

+ * Selected block for the initial run on the "self sponsorship detection algorithm" + */ +public final class SelfSponsorshipAlgoV2Block { + + private static final Logger LOGGER = LogManager.getLogger(SelfSponsorshipAlgoV2Block.class); + + private SelfSponsorshipAlgoV2Block() { + /* Do not instantiate */ + } + + public static void processAccountPenalties(Block block) throws DataException { + LOGGER.info("Process Self Sponsorship Algo V2 - this will take a while..."); + logPenaltyStats(block.repository); + long startTime = System.currentTimeMillis(); + Set penalties = getAccountPenalties(block.repository, -5000000); + block.repository.getAccountRepository().updateBlocksMintedPenalties(penalties); + long totalTime = System.currentTimeMillis() - startTime; + String hash = getHash(penalties.stream().map(p -> p.getAddress()).collect(Collectors.toList())); + LOGGER.info("{} penalty addresses processed (hash: {}). Total time taken: {} seconds", penalties.size(), hash, (int)(totalTime / 1000.0f)); + logPenaltyStats(block.repository); + + int updatedCount = updateAccountLevels(block.repository, penalties); + LOGGER.info("Account levels updated for {} penalty addresses", updatedCount); + } + + public static void orphanAccountPenalties(Block block) throws DataException { + LOGGER.info("Orphan Self Sponsorship Algo V2 - this will take a while..."); + logPenaltyStats(block.repository); + long startTime = System.currentTimeMillis(); + Set penalties = getAccountPenalties(block.repository, 5000000); + block.repository.getAccountRepository().updateBlocksMintedPenalties(penalties); + long totalTime = System.currentTimeMillis() - startTime; + String hash = getHash(penalties.stream().map(p -> p.getAddress()).collect(Collectors.toList())); + LOGGER.info("{} penalty addresses orphaned (hash: {}). Total time taken: {} seconds", penalties.size(), hash, (int)(totalTime / 1000.0f)); + logPenaltyStats(block.repository); + + int updatedCount = updateAccountLevels(block.repository, penalties); + LOGGER.info("Account levels updated for {} penalty addresses", updatedCount); + } + + private static Set getAccountPenalties(Repository repository, int penalty) throws DataException { + Set penalties = new LinkedHashSet<>(); + List penalizedAddresses = repository.getAccountRepository().getPenaltyAccounts(); + List assetAddresses = repository.getTransactionRepository().getConfirmedTransferAssetCreators(); + + for (AccountData penalizedAddress : penalizedAddresses) { + //System.out.println(String.format("address: %s", address)); + SelfSponsorshipAlgoV2 selfSponsorshipAlgoV2 = new SelfSponsorshipAlgoV2(repository, penalizedAddress.getAddress(), false); + selfSponsorshipAlgoV2.run(); + //System.out.println(String.format("Penalty addresses: %d", selfSponsorshipAlgoV2.getPenaltyAddresses().size())); + for (String penaltyAddress : selfSponsorshipAlgoV2.getPenaltyAddresses()) { + penalties.add(new AccountPenaltyData(penaltyAddress, penalty)); + } + } + + for (String assetAddress : assetAddresses) { + //System.out.println(String.format("address: %s", address)); + SelfSponsorshipAlgoV2 selfSponsorshipAlgoV2 = new SelfSponsorshipAlgoV2(repository, assetAddress, true); + selfSponsorshipAlgoV2.run(); + //System.out.println(String.format("Penalty addresses: %d", selfSponsorshipAlgoV2.getPenaltyAddresses().size())); + for (String penaltyAddress : selfSponsorshipAlgoV2.getPenaltyAddresses()) { + penalties.add(new AccountPenaltyData(penaltyAddress, penalty)); + } + } + + return penalties; + } + + private static int updateAccountLevels(Repository repository, Set accountPenalties) throws DataException { + final List cumulativeBlocksByLevel = BlockChain.getInstance().getCumulativeBlocksByLevel(); + final int maximumLevel = cumulativeBlocksByLevel.size() - 1; + + int updatedCount = 0; + + for (AccountPenaltyData penaltyData : accountPenalties) { + AccountData accountData = repository.getAccountRepository().getAccount(penaltyData.getAddress()); + final int effectiveBlocksMinted = accountData.getBlocksMinted() + accountData.getBlocksMintedAdjustment() + accountData.getBlocksMintedPenalty(); + + // Shortcut for penalties + if (effectiveBlocksMinted < 0) { + accountData.setLevel(0); + repository.getAccountRepository().setLevel(accountData); + updatedCount++; + LOGGER.trace(() -> String.format("Block minter %s dropped to level %d", accountData.getAddress(), accountData.getLevel())); + continue; + } + + for (int newLevel = maximumLevel; newLevel >= 0; --newLevel) { + if (effectiveBlocksMinted >= cumulativeBlocksByLevel.get(newLevel)) { + accountData.setLevel(newLevel); + repository.getAccountRepository().setLevel(accountData); + updatedCount++; + LOGGER.trace(() -> String.format("Block minter %s increased to level %d", accountData.getAddress(), accountData.getLevel())); + break; + } + } + } + + return updatedCount; + } + + private static void logPenaltyStats(Repository repository) { + try { + LOGGER.info(getPenaltyStats(repository)); + + } catch (DataException e) {} + } + + private static AccountPenaltyStats getPenaltyStats(Repository repository) throws DataException { + List accounts = repository.getAccountRepository().getPenaltyAccounts(); + return AccountPenaltyStats.fromAccounts(accounts); + } + + public static String getHash(List penaltyAddresses) { + if (penaltyAddresses == null || penaltyAddresses.isEmpty()) { + return null; + } + Collections.sort(penaltyAddresses); + return Base58.encode(Crypto.digest(StringUtils.join(penaltyAddresses).getBytes(StandardCharsets.UTF_8))); + } + +} \ No newline at end of file diff --git a/src/main/java/org/qortal/block/SelfSponsorshipAlgoV3Block.java b/src/main/java/org/qortal/block/SelfSponsorshipAlgoV3Block.java new file mode 100644 index 00000000..dec8957d --- /dev/null +++ b/src/main/java/org/qortal/block/SelfSponsorshipAlgoV3Block.java @@ -0,0 +1,136 @@ +package org.qortal.block; + +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.qortal.account.SelfSponsorshipAlgoV3; +import org.qortal.api.model.AccountPenaltyStats; +import org.qortal.crypto.Crypto; +import org.qortal.data.account.AccountData; +import org.qortal.data.account.AccountPenaltyData; +import org.qortal.repository.DataException; +import org.qortal.repository.Repository; +import org.qortal.utils.Base58; + +import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; +import java.util.stream.Collectors; + +/** + * Self Sponsorship AlgoV3 Block + *

+ * Selected block for the initial run on the "self sponsorship detection algorithm" + */ +public final class SelfSponsorshipAlgoV3Block { + + private static final Logger LOGGER = LogManager.getLogger(SelfSponsorshipAlgoV3Block.class); + + private SelfSponsorshipAlgoV3Block() { + /* Do not instantiate */ + } + + public static void processAccountPenalties(Block block) throws DataException { + LOGGER.info("Process Self Sponsorship Algo V3 - this will take a while..."); + logPenaltyStats(block.repository); + long startTime = System.currentTimeMillis(); + Set penalties = getAccountPenalties(block.repository, -5000000); + block.repository.getAccountRepository().updateBlocksMintedPenalties(penalties); + long totalTime = System.currentTimeMillis() - startTime; + String hash = getHash(penalties.stream().map(p -> p.getAddress()).collect(Collectors.toList())); + LOGGER.info("{} penalty addresses processed (hash: {}). Total time taken: {} seconds", penalties.size(), hash, (int)(totalTime / 1000.0f)); + logPenaltyStats(block.repository); + + int updatedCount = updateAccountLevels(block.repository, penalties); + LOGGER.info("Account levels updated for {} penalty addresses", updatedCount); + } + + public static void orphanAccountPenalties(Block block) throws DataException { + LOGGER.info("Orphan Self Sponsorship Algo V3 - this will take a while..."); + logPenaltyStats(block.repository); + long startTime = System.currentTimeMillis(); + Set penalties = getAccountPenalties(block.repository, 5000000); + block.repository.getAccountRepository().updateBlocksMintedPenalties(penalties); + long totalTime = System.currentTimeMillis() - startTime; + String hash = getHash(penalties.stream().map(p -> p.getAddress()).collect(Collectors.toList())); + LOGGER.info("{} penalty addresses orphaned (hash: {}). Total time taken: {} seconds", penalties.size(), hash, (int)(totalTime / 1000.0f)); + logPenaltyStats(block.repository); + + int updatedCount = updateAccountLevels(block.repository, penalties); + LOGGER.info("Account levels updated for {} penalty addresses", updatedCount); + } + + public static Set getAccountPenalties(Repository repository, int penalty) throws DataException { + final long snapshotTimestampV1 = BlockChain.getInstance().getSelfSponsorshipAlgoV1SnapshotTimestamp(); + final long snapshotTimestampV3 = BlockChain.getInstance().getSelfSponsorshipAlgoV3SnapshotTimestamp(); + Set penalties = new LinkedHashSet<>(); + List addresses = repository.getTransactionRepository().getConfirmedRewardShareCreatorsExcludingSelfShares(); + for (String address : addresses) { + //System.out.println(String.format("address: %s", address)); + SelfSponsorshipAlgoV3 selfSponsorshipAlgoV3 = new SelfSponsorshipAlgoV3(repository, address, snapshotTimestampV1, snapshotTimestampV3, false); + selfSponsorshipAlgoV3.run(); + //System.out.println(String.format("Penalty addresses: %d", selfSponsorshipAlgoV3.getPenaltyAddresses().size())); + + for (String penaltyAddress : selfSponsorshipAlgoV3.getPenaltyAddresses()) { + penalties.add(new AccountPenaltyData(penaltyAddress, penalty)); + } + } + return penalties; + } + + private static int updateAccountLevels(Repository repository, Set accountPenalties) throws DataException { + final List cumulativeBlocksByLevel = BlockChain.getInstance().getCumulativeBlocksByLevel(); + final int maximumLevel = cumulativeBlocksByLevel.size() - 1; + + int updatedCount = 0; + + for (AccountPenaltyData penaltyData : accountPenalties) { + AccountData accountData = repository.getAccountRepository().getAccount(penaltyData.getAddress()); + final int effectiveBlocksMinted = accountData.getBlocksMinted() + accountData.getBlocksMintedAdjustment() + accountData.getBlocksMintedPenalty(); + + // Shortcut for penalties + if (effectiveBlocksMinted < 0) { + accountData.setLevel(0); + repository.getAccountRepository().setLevel(accountData); + updatedCount++; + LOGGER.trace(() -> String.format("Block minter %s dropped to level %d", accountData.getAddress(), accountData.getLevel())); + continue; + } + + for (int newLevel = maximumLevel; newLevel >= 0; --newLevel) { + if (effectiveBlocksMinted >= cumulativeBlocksByLevel.get(newLevel)) { + accountData.setLevel(newLevel); + repository.getAccountRepository().setLevel(accountData); + updatedCount++; + LOGGER.trace(() -> String.format("Block minter %s increased to level %d", accountData.getAddress(), accountData.getLevel())); + break; + } + } + } + + return updatedCount; + } + + private static void logPenaltyStats(Repository repository) { + try { + LOGGER.info(getPenaltyStats(repository)); + + } catch (DataException e) {} + } + + private static AccountPenaltyStats getPenaltyStats(Repository repository) throws DataException { + List accounts = repository.getAccountRepository().getPenaltyAccounts(); + return AccountPenaltyStats.fromAccounts(accounts); + } + + public static String getHash(List penaltyAddresses) { + if (penaltyAddresses == null || penaltyAddresses.isEmpty()) { + return null; + } + Collections.sort(penaltyAddresses); + return Base58.encode(Crypto.digest(StringUtils.join(penaltyAddresses).getBytes(StandardCharsets.UTF_8))); + } + +} \ No newline at end of file diff --git a/src/main/java/org/qortal/crosschain/PirateChain.java b/src/main/java/org/qortal/crosschain/PirateChain.java index 434932d1..64eda0be 100644 --- a/src/main/java/org/qortal/crosschain/PirateChain.java +++ b/src/main/java/org/qortal/crosschain/PirateChain.java @@ -51,7 +51,12 @@ public class PirateChain extends Bitcoiny { public Collection getServers() { return Arrays.asList( // Servers chosen on NO BASIS WHATSOEVER from various sources! - new Server("lightd.pirate.black", Server.ConnectionType.SSL, 443) + new Server("lightd.pirate.black", Server.ConnectionType.SSL, 443), + new Server("wallet-arrr1.qortal.online", Server.ConnectionType.SSL, 443), + new Server("wallet-arrr2.qortal.online", Server.ConnectionType.SSL, 443), + new Server("wallet-arrr3.qortal.online", Server.ConnectionType.SSL, 443), + new Server("wallet-arrr4.qortal.online", Server.ConnectionType.SSL, 443), + new Server("wallet-arrr5.qortal.online", Server.ConnectionType.SSL, 443) ); } diff --git a/src/main/java/org/qortal/repository/TransactionRepository.java b/src/main/java/org/qortal/repository/TransactionRepository.java index e007586e..d4517485 100644 --- a/src/main/java/org/qortal/repository/TransactionRepository.java +++ b/src/main/java/org/qortal/repository/TransactionRepository.java @@ -205,6 +205,15 @@ public interface TransactionRepository { */ public List getConfirmedRewardShareCreatorsExcludingSelfShares() throws DataException; + /** + * Returns list of transfer asset transaction creators. + * This uses confirmed transactions only. + * + * @return + * @throws DataException + */ + public List getConfirmedTransferAssetCreators() throws DataException; + /** * Returns list of transactions pending approval, with optional txGgroupId filtering. *

diff --git a/src/main/java/org/qortal/repository/hsqldb/transaction/HSQLDBTransactionRepository.java b/src/main/java/org/qortal/repository/hsqldb/transaction/HSQLDBTransactionRepository.java index 5b41a85d..fe0b4d0b 100644 --- a/src/main/java/org/qortal/repository/hsqldb/transaction/HSQLDBTransactionRepository.java +++ b/src/main/java/org/qortal/repository/hsqldb/transaction/HSQLDBTransactionRepository.java @@ -1043,6 +1043,33 @@ public class HSQLDBTransactionRepository implements TransactionRepository { } } + public List getConfirmedTransferAssetCreators() throws DataException { + List transferAssetCreators = new ArrayList<>(); + + String sql = "SELECT account " + + "FROM TransferAssetTransactions " + + "JOIN Accounts ON Accounts.public_key = TransferAssetTransactions.sender " + + "JOIN Transactions ON Transactions.signature = TransferAssetTransactions.signature " + + "WHERE block_height IS NOT NULL AND TransferAssetTransactions.recipient != Accounts.account " + + "GROUP BY account " + + "ORDER BY account"; + + try (ResultSet resultSet = this.repository.checkedExecute(sql)) { + if (resultSet == null) + return transferAssetCreators; + + do { + String address = resultSet.getString(1); + + transferAssetCreators.add(address); + } while (resultSet.next()); + + return transferAssetCreators; + } catch (SQLException e) { + throw new DataException("Unable to fetch transfer asset from repository", e); + } + } + @Override public List getApprovalPendingTransactions(Integer txGroupId, Integer limit, Integer offset, Boolean reverse) throws DataException { StringBuilder sql = new StringBuilder(512); diff --git a/src/main/java/org/qortal/settings/Settings.java b/src/main/java/org/qortal/settings/Settings.java index 3ca86cc0..df59c037 100644 --- a/src/main/java/org/qortal/settings/Settings.java +++ b/src/main/java/org/qortal/settings/Settings.java @@ -211,7 +211,7 @@ public class Settings { public long recoveryModeTimeout = 9999999999999L; /** Minimum peer version number required in order to sync with them */ - private String minPeerVersion = "4.4.2"; + private String minPeerVersion = "4.5.0"; /** Whether to allow connections with peers below minPeerVersion * If true, we won't sync with them but they can still sync with us, and will show in the peers list * If false, sync will be blocked both ways, and they will not appear in the peers list */ diff --git a/src/main/java/org/qortal/transaction/RegisterNameTransaction.java b/src/main/java/org/qortal/transaction/RegisterNameTransaction.java index 79976199..a89e60c0 100644 --- a/src/main/java/org/qortal/transaction/RegisterNameTransaction.java +++ b/src/main/java/org/qortal/transaction/RegisterNameTransaction.java @@ -54,6 +54,10 @@ public class RegisterNameTransaction extends Transaction { Account registrant = getRegistrant(); String name = this.registerNameTransactionData.getName(); + int blockchainHeight = this.repository.getBlockRepository().getBlockchainHeight(); + final int start = BlockChain.getInstance().getSelfSponsorshipAlgoV2Height() - 1180; + final int end = BlockChain.getInstance().getSelfSponsorshipAlgoV3Height(); + // Check name size bounds int nameLength = Utf8.encodedLength(name); if (nameLength < Name.MIN_NAME_SIZE || nameLength > Name.MAX_NAME_SIZE) @@ -76,6 +80,10 @@ public class RegisterNameTransaction extends Transaction { if (registrant.getConfirmedBalance(Asset.QORT) < this.registerNameTransactionData.getFee()) return ValidationResult.NO_BALANCE; + // Check if we are on algo runs + if (blockchainHeight >= start && blockchainHeight <= end) + return ValidationResult.TEMPORARY_DISABLED; + return ValidationResult.OK; } diff --git a/src/main/java/org/qortal/transaction/RewardShareTransaction.java b/src/main/java/org/qortal/transaction/RewardShareTransaction.java index 1b608a0c..635c8c8a 100644 --- a/src/main/java/org/qortal/transaction/RewardShareTransaction.java +++ b/src/main/java/org/qortal/transaction/RewardShareTransaction.java @@ -183,12 +183,28 @@ public class RewardShareTransaction extends Transaction { @Override public boolean isConfirmableAtHeight(int height) { + final int startV2 = BlockChain.getInstance().getSelfSponsorshipAlgoV2Height() - 15; + final int startV3 = BlockChain.getInstance().getSelfSponsorshipAlgoV3Height() - 15; + final int endV2 = BlockChain.getInstance().getSelfSponsorshipAlgoV2Height() + 10; + final int endV3 = BlockChain.getInstance().getSelfSponsorshipAlgoV3Height() + 10; + if (height >= BlockChain.getInstance().getUnconfirmableRewardSharesHeight()) { // Not confirmable in online accounts or distribution blocks if (Block.isOnlineAccountsBlock(height) || Block.isBatchRewardDistributionBlock(height)) { return false; } } + + if (height >= startV2 && height <= endV2) { + // Not confirmable on algo V2 run + return false; + } + + if (height >= startV3 && height <= endV3) { + // Not confirmable on algo V3 run + return false; + } + return true; } diff --git a/src/main/java/org/qortal/transaction/Transaction.java b/src/main/java/org/qortal/transaction/Transaction.java index c142fff8..5e5b9fba 100644 --- a/src/main/java/org/qortal/transaction/Transaction.java +++ b/src/main/java/org/qortal/transaction/Transaction.java @@ -173,6 +173,7 @@ public abstract class Transaction { INVALID_OPTION_LENGTH(20), DUPLICATE_OPTION(21), POLL_ALREADY_EXISTS(22), + POLL_ALREADY_HAS_VOTES(23), POLL_DOES_NOT_EXIST(24), POLL_OPTION_DOES_NOT_EXIST(25), ALREADY_VOTED_FOR_THAT_OPTION(26), @@ -247,6 +248,7 @@ public abstract class Transaction { GROUP_APPROVAL_REQUIRED(98), ACCOUNT_NOT_TRANSFERABLE(99), TRANSFER_PRIVS_DISABLED(100), + TEMPORARY_DISABLED(101), INVALID_BUT_OK(999), NOT_YET_RELEASED(1000), NOT_SUPPORTED(1001); diff --git a/src/main/java/org/qortal/transaction/TransferAssetTransaction.java b/src/main/java/org/qortal/transaction/TransferAssetTransaction.java index 50c6f24a..2144e4b9 100644 --- a/src/main/java/org/qortal/transaction/TransferAssetTransaction.java +++ b/src/main/java/org/qortal/transaction/TransferAssetTransaction.java @@ -1,6 +1,7 @@ package org.qortal.transaction; import org.qortal.account.Account; +import org.qortal.block.BlockChain; import org.qortal.data.PaymentData; import org.qortal.data.transaction.TransactionData; import org.qortal.data.transaction.TransferAssetTransactionData; @@ -51,6 +52,14 @@ public class TransferAssetTransaction extends Transaction { @Override public ValidationResult isValid() throws DataException { + int blockchainHeight = this.repository.getBlockRepository().getBlockchainHeight(); + final int start = BlockChain.getInstance().getSelfSponsorshipAlgoV2Height(); + final int end = BlockChain.getInstance().getSelfSponsorshipAlgoV3Height(); + + // Check if we are on algo runs + if (blockchainHeight >= start && blockchainHeight <= end) + return ValidationResult.ASSET_NOT_SPENDABLE; + // Wrap asset transfer as a payment and delegate final payment checks to Payment class return new Payment(this.repository).isValid(this.transferAssetTransactionData.getSenderPublicKey(), getPaymentData(), this.transferAssetTransactionData.getFee()); } diff --git a/src/main/resources/blockchain.json b/src/main/resources/blockchain.json index ff3d1c37..8b8373a8 100644 --- a/src/main/resources/blockchain.json +++ b/src/main/resources/blockchain.json @@ -30,7 +30,9 @@ "onlineAccountSignaturesMaxLifetime": 86400000, "onlineAccountsModulusV2Timestamp": 1659801600000, "selfSponsorshipAlgoV1SnapshotTimestamp": 1670230000000, - "selfSponsorshipAlgoV2SnapshotTimestamp": 1706745600000, + "selfSponsorshipAlgoV2SnapshotTimestamp": 1708360200000, + "selfSponsorshipAlgoV3SnapshotTimestamp": 1708432200000, + "referenceTimestampBlock": 1670684455220, "mempowTransactionUpdatesTimestamp": 1693558800000, "blockRewardBatchStartHeight": 1508000, "blockRewardBatchSize": 1000, @@ -94,7 +96,8 @@ "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, "onlineAccountMinterLevelValidationHeight": 1092000, "selfSponsorshipAlgoV1Height": 1092400, - "selfSponsorshipAlgoV2Height": 9999999, + "selfSponsorshipAlgoV2Height": 1611200, + "selfSponsorshipAlgoV3Height": 1612200, "feeValidationFixTimestamp": 1671918000000, "chatReferenceTimestamp": 1674316800000, "arbitraryOptionalFeeTimestamp": 1680278400000, diff --git a/src/main/resources/i18n/TransactionValidity_de.properties b/src/main/resources/i18n/TransactionValidity_de.properties index bdb88a29..a2019670 100644 --- a/src/main/resources/i18n/TransactionValidity_de.properties +++ b/src/main/resources/i18n/TransactionValidity_de.properties @@ -195,3 +195,5 @@ TRANSACTION_UNKNOWN = Transaktion unbekannt TX_GROUP_ID_MISMATCH = die Gruppen-ID der Transaktion stimmt nicht überein TRANSFER_PRIVS_DISABLED = Übertragungsberechtigungen deaktiviert + +TEMPORARY_DISABLED = Namensregistrierung vorübergehend deaktiviert diff --git a/src/main/resources/i18n/TransactionValidity_en.properties b/src/main/resources/i18n/TransactionValidity_en.properties index 0bfeeef2..a93db3da 100644 --- a/src/main/resources/i18n/TransactionValidity_en.properties +++ b/src/main/resources/i18n/TransactionValidity_en.properties @@ -195,3 +195,5 @@ TRANSACTION_UNKNOWN = transaction unknown TX_GROUP_ID_MISMATCH = transaction's group ID does not match TRANSFER_PRIVS_DISABLED = transfer privileges disabled + +TEMPORARY_DISABLED = Name registration temporary disabled diff --git a/src/main/resources/i18n/TransactionValidity_es.properties b/src/main/resources/i18n/TransactionValidity_es.properties index b3e981ae..8ac7ccf4 100644 --- a/src/main/resources/i18n/TransactionValidity_es.properties +++ b/src/main/resources/i18n/TransactionValidity_es.properties @@ -195,3 +195,5 @@ TRANSACTION_UNKNOWN = transacción desconocida TX_GROUP_ID_MISMATCH = el ID de grupo de la transacción no coincide TRANSFER_PRIVS_DISABLED = privilegios de transferencia deshabilitados + +TEMPORARY_DISABLED = Registro de nombre temporalmente deshabilitado diff --git a/src/main/resources/i18n/TransactionValidity_fi.properties b/src/main/resources/i18n/TransactionValidity_fi.properties index 1a9b9f31..a7bc9c0a 100644 --- a/src/main/resources/i18n/TransactionValidity_fi.properties +++ b/src/main/resources/i18n/TransactionValidity_fi.properties @@ -195,3 +195,5 @@ TRANSACTION_UNKNOWN = tuntematon transaktio TX_GROUP_ID_MISMATCH = transaktion ryhmä-ID:n vastaavuusvirhe TRANSFER_PRIVS_DISABLED = siirtooikeudet poistettu käytöstä + +TEMPORARY_DISABLED = Nimen rekisteröinti tilapäisesti poistettu käytöstä diff --git a/src/main/resources/i18n/TransactionValidity_fr.properties b/src/main/resources/i18n/TransactionValidity_fr.properties index 75fcf369..55ae9082 100644 --- a/src/main/resources/i18n/TransactionValidity_fr.properties +++ b/src/main/resources/i18n/TransactionValidity_fr.properties @@ -195,3 +195,5 @@ TRANSACTION_UNKNOWN = transaction inconnue TX_GROUP_ID_MISMATCH = l'identifiant du groupe de transaction ne correspond pas TRANSFER_PRIVS_DISABLED = privilèges de transfert désactivés + +TEMPORARY_DISABLED = Enregistrement du nom temporairement désactivé diff --git a/src/main/resources/i18n/TransactionValidity_he.properties b/src/main/resources/i18n/TransactionValidity_he.properties index 427f01e3..2f9338f0 100644 --- a/src/main/resources/i18n/TransactionValidity_he.properties +++ b/src/main/resources/i18n/TransactionValidity_he.properties @@ -195,3 +195,5 @@ TRANSACTION_UNKNOWN = עסקה לא ידועה TX_GROUP_ID_MISMATCH = מזהה הקבוצה של העסקה אינו תואם TRANSFER_PRIVS_DISABLED = הרשאות העברה מושבתות + +TEMPORARY_DISABLED = רישום שמות מושבת זמנית diff --git a/src/main/resources/i18n/TransactionValidity_hu.properties b/src/main/resources/i18n/TransactionValidity_hu.properties index 77e7dcff..2dbd9fd0 100644 --- a/src/main/resources/i18n/TransactionValidity_hu.properties +++ b/src/main/resources/i18n/TransactionValidity_hu.properties @@ -195,3 +195,5 @@ TRANSACTION_UNKNOWN = ismeretlen tranzakció TX_GROUP_ID_MISMATCH = a tranzakció csoportazonosítója nem egyezik TRANSFER_PRIVS_DISABLED = átviteli jogosultságok letiltva + +TEMPORARY_DISABLED = A névregisztráció ideiglenesen le van tiltva diff --git a/src/main/resources/i18n/TransactionValidity_it.properties b/src/main/resources/i18n/TransactionValidity_it.properties index 02a13667..a520d5ae 100644 --- a/src/main/resources/i18n/TransactionValidity_it.properties +++ b/src/main/resources/i18n/TransactionValidity_it.properties @@ -195,3 +195,5 @@ TRANSACTION_UNKNOWN = transazione sconosciuta TX_GROUP_ID_MISMATCH = identificazione di gruppo della transazione non corrisponde TRANSFER_PRIVS_DISABLED = privilegi di trasferimento disabilitati + +TEMPORARY_DISABLED = Registrazione del nome temporaneamente disabilitata diff --git a/src/main/resources/i18n/TransactionValidity_jp.properties b/src/main/resources/i18n/TransactionValidity_jp.properties index 10fa273c..3827635c 100644 --- a/src/main/resources/i18n/TransactionValidity_jp.properties +++ b/src/main/resources/i18n/TransactionValidity_jp.properties @@ -195,3 +195,5 @@ TRANSACTION_UNKNOWN = 不明なトランザクション TX_GROUP_ID_MISMATCH = トランザクションのグループIDが一致しません TRANSFER_PRIVS_DISABLED = 転送権限が無効になっています + +TEMPORARY_DISABLED = 名前の登録が一時的に無効になっています diff --git a/src/main/resources/i18n/TransactionValidity_ko.properties b/src/main/resources/i18n/TransactionValidity_ko.properties index cbab9190..2667471c 100644 --- a/src/main/resources/i18n/TransactionValidity_ko.properties +++ b/src/main/resources/i18n/TransactionValidity_ko.properties @@ -195,3 +195,5 @@ TRANSACTION_UNKNOWN = 알 수 없는 거래 TX_GROUP_ID_MISMATCH = 트랜잭션의 그룹 ID가 일치하지 않습니다 TRANSFER_PRIVS_DISABLED = 권한 이전이 비활성화되었습니다. + +TEMPORARY_DISABLED = 이름 등록이 일시적으로 비활성화되었습니다. diff --git a/src/main/resources/i18n/TransactionValidity_nl.properties b/src/main/resources/i18n/TransactionValidity_nl.properties index 933d6166..4f0dd8b7 100644 --- a/src/main/resources/i18n/TransactionValidity_nl.properties +++ b/src/main/resources/i18n/TransactionValidity_nl.properties @@ -195,3 +195,5 @@ TRANSACTION_UNKNOWN = transactie onbekend TX_GROUP_ID_MISMATCH = groep-ID komt niet overeen TRANSFER_PRIVS_DISABLED = overdrachtsrechten uitgeschakeld + +TEMPORARY_DISABLED = Naamregistratie tijdelijk uitgeschakeld diff --git a/src/main/resources/i18n/TransactionValidity_pl.properties b/src/main/resources/i18n/TransactionValidity_pl.properties index 80cb4b12..50944674 100644 --- a/src/main/resources/i18n/TransactionValidity_pl.properties +++ b/src/main/resources/i18n/TransactionValidity_pl.properties @@ -195,3 +195,5 @@ TRANSACTION_UNKNOWN = transakcja nieznana TX_GROUP_ID_MISMATCH = niezgodność ID grupy transakcji TRANSFER_PRIVS_DISABLED = uprawnienia do przenoszenia wyłączone + +TEMPORARY_DISABLED = Rejestracja nazwy tymczasowo wyłączona diff --git a/src/main/resources/i18n/TransactionValidity_ro.properties b/src/main/resources/i18n/TransactionValidity_ro.properties index be0d8596..4c149a62 100644 --- a/src/main/resources/i18n/TransactionValidity_ro.properties +++ b/src/main/resources/i18n/TransactionValidity_ro.properties @@ -195,3 +195,5 @@ TRANSACTION_UNKNOWN = tranzactie necunoscuta TX_GROUP_ID_MISMATCH = ID-ul de grup al tranzactiei nu se potriveste TRANSFER_PRIVS_DISABLED = privilegii de transfer dezactivate + +TEMPORARY_DISABLED = Înregistrarea numelui a fost temporar dezactivată diff --git a/src/main/resources/i18n/TransactionValidity_ru.properties b/src/main/resources/i18n/TransactionValidity_ru.properties index 55b19487..79307d7d 100644 --- a/src/main/resources/i18n/TransactionValidity_ru.properties +++ b/src/main/resources/i18n/TransactionValidity_ru.properties @@ -195,3 +195,5 @@ TRANSACTION_UNKNOWN = неизвестная транзакция TX_GROUP_ID_MISMATCH = не соответствие идентификатора группы в хэш транзации TRANSFER_PRIVS_DISABLED = права на передачу отключены + +TEMPORARY_DISABLED = Регистрация имени временно отключена diff --git a/src/main/resources/i18n/TransactionValidity_sv.properties b/src/main/resources/i18n/TransactionValidity_sv.properties index 2f6f85d9..d4688310 100644 --- a/src/main/resources/i18n/TransactionValidity_sv.properties +++ b/src/main/resources/i18n/TransactionValidity_sv.properties @@ -195,3 +195,5 @@ TRANSACTION_UNKNOWN = okänd transaktion TX_GROUP_ID_MISMATCH = transaktionens grupp-ID matchar inte TRANSFER_PRIVS_DISABLED = överföringsprivilegier inaktiverade + +TEMPORARY_DISABLED = Namnregistrering tillfälligt inaktiverad diff --git a/src/main/resources/i18n/TransactionValidity_zh_CN.properties b/src/main/resources/i18n/TransactionValidity_zh_CN.properties index ce35b7b3..cd16bf64 100644 --- a/src/main/resources/i18n/TransactionValidity_zh_CN.properties +++ b/src/main/resources/i18n/TransactionValidity_zh_CN.properties @@ -195,3 +195,5 @@ TRANSACTION_UNKNOWN = 未知的交易 TX_GROUP_ID_MISMATCH = 群组ID交易不吻合 TRANSFER_PRIVS_DISABLED = 传输权限已禁用 + +TEMPORARY_DISABLED = 名称注册暂时禁用 diff --git a/src/main/resources/i18n/TransactionValidity_zh_TW.properties b/src/main/resources/i18n/TransactionValidity_zh_TW.properties index 13c1210e..d039a8e7 100644 --- a/src/main/resources/i18n/TransactionValidity_zh_TW.properties +++ b/src/main/resources/i18n/TransactionValidity_zh_TW.properties @@ -195,3 +195,5 @@ TRANSACTION_UNKNOWN = 未知的交易 TX_GROUP_ID_MISMATCH = 群組ID交易不吻合 TRANSFER_PRIVS_DISABLED = 傳輸權限已停用 + +TEMPORARY_DISABLED = 名稱註冊暫時停用 diff --git a/src/test/java/org/qortal/test/SelfSponsorshipAlgoV2Tests.java b/src/test/java/org/qortal/test/SelfSponsorshipAlgoV2Tests.java new file mode 100644 index 00000000..495df511 --- /dev/null +++ b/src/test/java/org/qortal/test/SelfSponsorshipAlgoV2Tests.java @@ -0,0 +1,342 @@ +package org.qortal.test; + +import org.junit.Before; +import org.junit.Test; +import org.qortal.account.Account; +import org.qortal.account.PrivateKeyAccount; +import org.qortal.asset.Asset; +import org.qortal.block.Block; +import org.qortal.controller.BlockMinter; +import org.qortal.data.account.AccountPenaltyData; +import org.qortal.data.transaction.*; +import org.qortal.repository.DataException; +import org.qortal.repository.Repository; +import org.qortal.repository.RepositoryManager; +import org.qortal.settings.Settings; +import org.qortal.test.common.BlockUtils; +import org.qortal.test.common.Common; +import org.qortal.test.common.TransactionUtils; +import org.qortal.utils.NTP; + +import java.util.*; + +import static org.junit.Assert.*; +import static org.qortal.test.common.AccountUtils.fee; + +public class SelfSponsorshipAlgoV2Tests extends Common { + + @Before + public void beforeTest() throws DataException { + Common.useSettings("test-settings-v2-self-sponsorship-algo-v2.json"); + NTP.setFixedOffset(Settings.getInstance().getTestNtpOffset()); + } + + @Test + public void tesTransferAssetsQort() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + + // Alice self share online, and will be used to mint the blocks + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + List onlineAccounts = new ArrayList<>(); + onlineAccounts.add(aliceSelfShare); + + PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob"); + PrivateKeyAccount chloeAccount = Common.getTestAccount(repository, "chloe"); + PrivateKeyAccount dilbertAccount = Common.getTestAccount(repository, "dilbert"); + + // Mint blocks + Block block = null; + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Ensure that Bob, Chloe and Dilbert are greater than level 0 + assertTrue(new Account(repository, bobAccount.getAddress()).getLevel() > 0); + assertTrue(new Account(repository, chloeAccount.getAddress()).getLevel() > 0); + assertTrue(new Account(repository, dilbertAccount.getAddress()).getLevel() > 0); + + // Mint some blocks, until accounts have leveled up + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Ensure that Chloe and Dilbert have more than 20 qort + assertTrue(new Account(repository, chloeAccount.getAddress()).getConfirmedBalance(Asset.QORT) > 20); // 10 for transfer asset, 10 for fee + assertTrue(new Account(repository, dilbertAccount.getAddress()).getConfirmedBalance(Asset.QORT) > 20); // 10 for transfer asset, 10 for fee + + // Mint until block 10 + while (block.getBlockData().getHeight() < 10) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(10, (int) block.getBlockData().getHeight()); + + // Chloe transfer assets to Bob and Dilbert + transferAssets(repository, chloeAccount, bobAccount); + transferAssets(repository, chloeAccount, dilbertAccount); + + // Dilbert transfer assets to Bob and Chloe + transferAssets(repository, dilbertAccount, bobAccount); + transferAssets(repository, dilbertAccount, chloeAccount); + + // Mint until block 29 (the algo runs at block 30) + while (block.getBlockData().getHeight() < 29) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(29, (int) block.getBlockData().getHeight()); + + // Ensure that Bob have no penalties and level 5 + assertEquals(0, (int) new Account(repository, bobAccount.getAddress()).getBlocksMintedPenalty()); + assertEquals(5, (int)bobAccount.getLevel()); + + // Ensure that Chloe have no penalties and level 5 + assertEquals(0, (int) new Account(repository, chloeAccount.getAddress()).getBlocksMintedPenalty()); + assertEquals(5, (int)chloeAccount.getLevel()); + + // Ensure that Dilbert have no penalties and level6 + assertEquals(0, (int) new Account(repository, dilbertAccount.getAddress()).getBlocksMintedPenalty()); + assertEquals(6, (int)dilbertAccount.getLevel()); + + // Mint a block, so the algo runs + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Ensure that Bob, Chloe and Dilbert are now have penalties + assertEquals(-5000000, (int) new Account(repository, bobAccount.getAddress()).getBlocksMintedPenalty()); + assertEquals(-5000000, (int) new Account(repository, chloeAccount.getAddress()).getBlocksMintedPenalty()); + assertEquals(-5000000, (int) new Account(repository, dilbertAccount.getAddress()).getBlocksMintedPenalty()); + + // Ensure that Bob, Chloe and Dilbert are now level 0 + assertEquals(0, (int) new Account(repository, bobAccount.getAddress()).getLevel()); + assertEquals(0, (int) new Account(repository, chloeAccount.getAddress()).getLevel()); + assertEquals(0, (int) new Account(repository, dilbertAccount.getAddress()).getLevel()); + + // Orphan last block + BlockUtils.orphanLastBlock(repository); + + // Ensure that Bob, Chloe and Dilbert are now greater than level 0 + assertTrue(new Account(repository, bobAccount.getAddress()).getLevel() > 0); + assertTrue(new Account(repository, chloeAccount.getAddress()).getLevel() > 0); + assertTrue(new Account(repository, dilbertAccount.getAddress()).getLevel() > 0); + + // Ensure that Bob, Chloe and Dilbert have no penalties again + assertEquals(0, (int) new Account(repository, bobAccount.getAddress()).getBlocksMintedPenalty()); + assertEquals(0, (int) new Account(repository, chloeAccount.getAddress()).getBlocksMintedPenalty()); + assertEquals(0, (int) new Account(repository, dilbertAccount.getAddress()).getBlocksMintedPenalty()); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + @Test + public void testSingleTransferPrivsBeforeAlgoBlock() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + + // Alice self share online, and will be used to mint the blocks + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + List onlineAccounts = new ArrayList<>(); + onlineAccounts.add(aliceSelfShare); + + PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob"); + + // Mint blocks + Block block = null; + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Ensure that Bob have more than 20 qort + assertTrue(new Account(repository, bobAccount.getAddress()).getConfirmedBalance(Asset.QORT) > 20); + + // Mint until block 17 (the algo runs at block 20) + while (block.getBlockData().getHeight() < 26) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(26, (int) block.getBlockData().getHeight()); + + // Bob then issues a TRANSFER_PRIVS + PrivateKeyAccount recipientAccount = randomTransferPrivs(repository, bobAccount); + + // Ensure recipient has no level (actually, no account record) at this point (pre-confirmation) + assertNull(recipientAccount.getLevel()); + + // Mint a block, so that the TRANSFER_PRIVS confirms + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Now ensure that the TRANSFER_PRIVS recipient has inherited Bob's level, and Bob is at level 0 + assertTrue(recipientAccount.getLevel() > 0); + assertEquals(0, (int)bobAccount.getLevel()); + assertEquals(0, (int) new Account(repository, recipientAccount.getAddress()).getBlocksMintedPenalty()); + + // Mint a block, so that we can penalize Bob after transfer privs + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Update blocks minted penalty for Bob + Set penalties = new LinkedHashSet<>(); + penalties.add(new AccountPenaltyData(bobAccount.getAddress(), -5000000)); + repository.getAccountRepository().updateBlocksMintedPenalties(penalties); + + // Mint a block, so that we check if Bob got penalized before algo runs + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Ensure Bob got penalized + assertEquals(-5000000, (int) new Account(repository, bobAccount.getAddress()).getBlocksMintedPenalty()); + + // Mint a block, so the algo runs + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Ensure recipient account has penalty too + assertEquals(-5000000, (int) new Account(repository, recipientAccount.getAddress()).getBlocksMintedPenalty()); + assertEquals(0, (int) new Account(repository, recipientAccount.getAddress()).getLevel()); + + // Orphan last block + BlockUtils.orphanLastBlock(repository); + + // Ensure recipient account has no penalty again and has a level greater than 0 + assertEquals(0, (int) new Account(repository, recipientAccount.getAddress()).getBlocksMintedPenalty()); + assertTrue(new Account(repository, recipientAccount.getAddress()).getLevel() > 0); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + @Test + public void testMultipleTransferPrivsBeforeAlgoBlock() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + + // Alice self share online, and will be used to mint the blocks + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + List onlineAccounts = new ArrayList<>(); + onlineAccounts.add(aliceSelfShare); + + PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob"); + PrivateKeyAccount chloeAccount = Common.getTestAccount(repository, "chloe"); + PrivateKeyAccount dilbertAccount = Common.getTestAccount(repository, "dilbert"); + + // Mint blocks + Block block = null; + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Ensure that Bob, Chloe and Dilbert have more than 20 qort + assertTrue(new Account(repository, bobAccount.getAddress()).getConfirmedBalance(Asset.QORT) > 20); + assertTrue(new Account(repository, chloeAccount.getAddress()).getConfirmedBalance(Asset.QORT) > 20); + assertTrue(new Account(repository, dilbertAccount.getAddress()).getConfirmedBalance(Asset.QORT) > 20); + + // Mint until block 12 (the algo runs at block 20) + while (block.getBlockData().getHeight() < 22) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(22, (int) block.getBlockData().getHeight()); + + // Bob then issues a TRANSFER_PRIVS + PrivateKeyAccount recipientAccount1 = randomTransferPrivs(repository, bobAccount); + + // Ensure Bob's recipient has no level (actually, no account record) at this point (pre-confirmation) + assertNull(recipientAccount1.getLevel()); + + // Mint a block, so that Bob's TRANSFER_PRIVS confirms + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Now ensure that the Bob's TRANSFER_PRIVS recipient has inherited Bob's level, and Bob is at level 0 + assertTrue(recipientAccount1.getLevel() > 0); + assertEquals(0, (int)bobAccount.getLevel()); + assertEquals(0, (int) new Account(repository, recipientAccount1.getAddress()).getBlocksMintedPenalty()); + + // Mint a block, so that Chloe can issue a TRANSFER_PRIVS + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Chloe then issues a TRANSFER_PRIVS + PrivateKeyAccount recipientAccount2 = randomTransferPrivs(repository, chloeAccount); + + // Ensure Chloe's recipient has no level (actually, no account record) at this point (pre-confirmation) + assertNull(recipientAccount2.getLevel()); + + // Mint a block, so that Chloe's TRANSFER_PRIVS confirms + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Now ensure that the Chloe's TRANSFER_PRIVS recipient has inherited Chloe's level, and Chloe is at level 0 + assertTrue(recipientAccount2.getLevel() > 0); + assertEquals(0, (int)chloeAccount.getLevel()); + assertEquals(0, (int) new Account(repository, recipientAccount2.getAddress()).getBlocksMintedPenalty()); + + // Mint a block, so that Dilbert can issue a TRANSFER_PRIVS + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Dilbert then issues a TRANSFER_PRIVS + PrivateKeyAccount recipientAccount3 = randomTransferPrivs(repository, dilbertAccount); + + // Ensure Dilbert's recipient has no level (actually, no account record) at this point (pre-confirmation) + assertNull(recipientAccount3.getLevel()); + + // Mint a block, so that Dilbert's TRANSFER_PRIVS confirms + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Now ensure that the Dilbert's TRANSFER_PRIVS recipient has inherited Dilbert's level, and Dilbert is at level 0 + assertTrue(recipientAccount3.getLevel() > 0); + assertEquals(0, (int)dilbertAccount.getLevel()); + assertEquals(0, (int) new Account(repository, recipientAccount3.getAddress()).getBlocksMintedPenalty()); + + // Mint a block, so that we can penalize Bob, Chloe and Dilbert after transfer privs + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Update blocks minted penalty for Bob, Chloe and Dilbert + Set penalties = new LinkedHashSet<>(); + penalties.add(new AccountPenaltyData(bobAccount.getAddress(), -5000000)); + penalties.add(new AccountPenaltyData(chloeAccount.getAddress(), -5000000)); + penalties.add(new AccountPenaltyData(dilbertAccount.getAddress(), -5000000)); + repository.getAccountRepository().updateBlocksMintedPenalties(penalties); + + // Mint a block, so that we check if Bob, Chloe and Dilbert got penalized before algo runs + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Ensure Bob, Chloe and Dilbert got penalized + assertEquals(-5000000, (int) new Account(repository, bobAccount.getAddress()).getBlocksMintedPenalty()); + assertEquals(-5000000, (int) new Account(repository, chloeAccount.getAddress()).getBlocksMintedPenalty()); + assertEquals(-5000000, (int) new Account(repository, dilbertAccount.getAddress()).getBlocksMintedPenalty()); + + // Mint a block, so the algo runs + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Ensure recipients accounts has penalty too + assertEquals(-5000000, (int) new Account(repository, recipientAccount1.getAddress()).getBlocksMintedPenalty()); + assertEquals(-5000000, (int) new Account(repository, recipientAccount2.getAddress()).getBlocksMintedPenalty()); + assertEquals(-5000000, (int) new Account(repository, recipientAccount3.getAddress()).getBlocksMintedPenalty()); + assertEquals(0, (int) new Account(repository, recipientAccount1.getAddress()).getLevel()); + assertEquals(0, (int) new Account(repository, recipientAccount2.getAddress()).getLevel()); + assertEquals(0, (int) new Account(repository, recipientAccount3.getAddress()).getLevel()); + + // Orphan last block + BlockUtils.orphanLastBlock(repository); + + // Ensure recipients accounts has no penalty again and has a level greater than 0 + assertEquals(0, (int) new Account(repository, recipientAccount1.getAddress()).getBlocksMintedPenalty()); + assertEquals(0, (int) new Account(repository, recipientAccount2.getAddress()).getBlocksMintedPenalty()); + assertEquals(0, (int) new Account(repository, recipientAccount3.getAddress()).getBlocksMintedPenalty()); + assertTrue(new Account(repository, recipientAccount1.getAddress()).getLevel() > 0); + assertTrue(new Account(repository, recipientAccount2.getAddress()).getLevel() > 0); + assertTrue(new Account(repository, recipientAccount3.getAddress()).getLevel() > 0); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + private static void transferAssets(Repository repository, PrivateKeyAccount senderAccount, PrivateKeyAccount recipientAccount) throws DataException { + for (int i = 0; i < 5; i++) { + // Generate new asset transfers from sender to recipient + BaseTransactionData baseTransactionData = new BaseTransactionData(NTP.getTime(), 0, senderAccount.getLastReference(), senderAccount.getPublicKey(), fee, null); + TransactionData transactionData; + transactionData = new TransferAssetTransactionData(baseTransactionData, recipientAccount.getAddress(), 1, 0); + TransactionUtils.signAndImportValid(repository, transactionData, senderAccount); // updates paymentData's signature + } + } + + private static PrivateKeyAccount randomTransferPrivs(Repository repository, PrivateKeyAccount senderAccount) throws DataException { + // Generate random recipient account + byte[] randomPrivateKey = new byte[32]; + new Random().nextBytes(randomPrivateKey); + PrivateKeyAccount recipientAccount = new PrivateKeyAccount(repository, randomPrivateKey); + + BaseTransactionData baseTransactionData = new BaseTransactionData(NTP.getTime(), 0, senderAccount.getLastReference(), senderAccount.getPublicKey(), fee, null); + TransactionData transactionData = new TransferPrivsTransactionData(baseTransactionData, recipientAccount.getAddress()); + + TransactionUtils.signAndImportValid(repository, transactionData, senderAccount); + + return recipientAccount; + } + +} \ No newline at end of file diff --git a/src/test/java/org/qortal/test/SelfSponsorshipAlgoV3Tests.java b/src/test/java/org/qortal/test/SelfSponsorshipAlgoV3Tests.java new file mode 100644 index 00000000..bb9de4e3 --- /dev/null +++ b/src/test/java/org/qortal/test/SelfSponsorshipAlgoV3Tests.java @@ -0,0 +1,1578 @@ +package org.qortal.test; + +import org.junit.Before; +import org.junit.Test; +import org.qortal.account.Account; +import org.qortal.account.PrivateKeyAccount; +import org.qortal.asset.Asset; +import org.qortal.block.Block; +import org.qortal.controller.BlockMinter; +import org.qortal.data.transaction.BaseTransactionData; +import org.qortal.data.transaction.PaymentTransactionData; +import org.qortal.data.transaction.TransactionData; +import org.qortal.data.transaction.TransferPrivsTransactionData; +import org.qortal.repository.DataException; +import org.qortal.repository.Repository; +import org.qortal.repository.RepositoryManager; +import org.qortal.settings.Settings; +import org.qortal.test.common.AccountUtils; +import org.qortal.test.common.BlockUtils; +import org.qortal.test.common.Common; +import org.qortal.test.common.TransactionUtils; +import org.qortal.test.common.transaction.TestTransaction; +import org.qortal.transaction.Transaction; +import org.qortal.transaction.TransferPrivsTransaction; +import org.qortal.utils.NTP; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +import static org.junit.Assert.*; +import static org.qortal.test.common.AccountUtils.fee; +import static org.qortal.transaction.Transaction.ValidationResult.ACCOUNT_NOT_TRANSFERABLE; +import static org.qortal.transaction.Transaction.ValidationResult.OK; + +public class SelfSponsorshipAlgoV3Tests extends Common { + + + @Before + public void beforeTest() throws DataException { + Common.useSettings("test-settings-v2-self-sponsorship-algo-v3.json"); + NTP.setFixedOffset(Settings.getInstance().getTestNtpOffset()); + } + + + @Test + public void testSingleSponsor() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + final int initialRewardShareCount = repository.getAccountRepository().getRewardShares().size(); + + // Alice self share online, and will be used to mint the blocks + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + List onlineAccounts = new ArrayList<>(); + onlineAccounts.add(aliceSelfShare); + + PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob"); + + // Bob self sponsors 10 accounts + List bobSponsees = AccountUtils.generateSponsorshipRewardShares(repository, bobAccount, 10); + List bobSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, bobAccount, bobSponsees); + onlineAccounts.addAll(bobSponseesOnlineAccounts); + + // Mint blocks + Block block = null; + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + assertEquals(11, block.getBlockData().getOnlineAccountsCount()); + assertEquals(10, repository.getAccountRepository().getRewardShares().size() - initialRewardShareCount); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() == 0); + + // Mint some blocks, until accounts have leveled up + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() > 0); + + // Generate self shares so the sponsees can start minting + List bobSponseeSelfShares = AccountUtils.generateSelfShares(repository, bobSponsees); + onlineAccounts.addAll(bobSponseeSelfShares); + + // Mint blocks + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getConfirmedBalance(Asset.QORT) > 10); // 5 for transaction, 5 for fee + + // Bob then consolidates funds + consolidateFunds(repository, bobSponsees, bobAccount); + + // Mint until block 29 (the algo runs at block 30) + while (block.getBlockData().getHeight() < 29) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(29, (int) block.getBlockData().getHeight()); + + // Ensure that bob and his sponsees have no penalties + List bobAndSponsees = new ArrayList<>(bobSponsees); + bobAndSponsees.add(bobAccount); + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Mint a block, so the algo runs + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Ensure that bob and his sponsees now have penalties + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(-5000000, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that bob and his sponsees are now level 0 + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getLevel()); + + // Orphan last block + BlockUtils.orphanLastBlock(repository); + + // Ensure that bob and his sponsees are now greater than level 0 + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() > 0); + + // Ensure that bob and his sponsees have no penalties again + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + @Test + public void testMultipleSponsors() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + final int initialRewardShareCount = repository.getAccountRepository().getRewardShares().size(); + + // Alice self share online, and will be used to mint the blocks + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + List onlineAccounts = new ArrayList<>(); + onlineAccounts.add(aliceSelfShare); + + PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob"); + PrivateKeyAccount chloeAccount = Common.getTestAccount(repository, "chloe"); + PrivateKeyAccount dilbertAccount = Common.getTestAccount(repository, "dilbert"); + + // Bob sponsors 10 accounts + List bobSponsees = AccountUtils.generateSponsorshipRewardShares(repository, bobAccount, 10); + List bobSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, bobAccount, bobSponsees); + onlineAccounts.addAll(bobSponseesOnlineAccounts); + + // Chloe sponsors 10 accounts + List chloeSponsees = AccountUtils.generateSponsorshipRewardShares(repository, chloeAccount, 10); + List chloeSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, chloeAccount, chloeSponsees); + onlineAccounts.addAll(chloeSponseesOnlineAccounts); + + // Dilbert sponsors 5 accounts + List dilbertSponsees = AccountUtils.generateSponsorshipRewardShares(repository, dilbertAccount, 5); + List dilbertSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, dilbertAccount, dilbertSponsees); + onlineAccounts.addAll(dilbertSponseesOnlineAccounts); + + // Mint blocks + Block block = null; + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + assertEquals(26, block.getBlockData().getOnlineAccountsCount()); + assertEquals(25, repository.getAccountRepository().getRewardShares().size() - initialRewardShareCount); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() == 0); + + // Mint some blocks, until accounts have leveled up + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() > 0); + + // Generate self shares so the sponsees can start minting + List bobSponseeSelfShares = AccountUtils.generateSelfShares(repository, bobSponsees); + onlineAccounts.addAll(bobSponseeSelfShares); + + // Mint blocks + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getConfirmedBalance(Asset.QORT) > 10); // 5 for transaction, 5 for fee + + // Bob then consolidates funds + consolidateFunds(repository, bobSponsees, bobAccount); + + // Mint until block 29 (the algo runs at block 30) + while (block.getBlockData().getHeight() < 29) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(29, (int) block.getBlockData().getHeight()); + + // Ensure that bob and his sponsees have no penalties + List bobAndSponsees = new ArrayList<>(bobSponsees); + bobAndSponsees.add(bobAccount); + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + assertEquals(6, (int)dilbertAccount.getLevel()); + + // Mint a block, so the algo runs + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Ensure that bob and his sponsees now have penalties + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(-5000000, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that chloe and her sponsees have no penalties + List chloeAndSponsees = new ArrayList<>(chloeSponsees); + chloeAndSponsees.add(chloeAccount); + for (PrivateKeyAccount chloeSponsee : chloeAndSponsees) + assertEquals(0, (int) new Account(repository, chloeSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that dilbert and his sponsees have no penalties + List dilbertAndSponsees = new ArrayList<>(dilbertSponsees); + dilbertAndSponsees.add(dilbertAccount); + for (PrivateKeyAccount dilbertSponsee : dilbertAndSponsees) + assertEquals(0, (int) new Account(repository, dilbertSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that bob and his sponsees are now level 0 + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getLevel()); + + // Orphan last block + BlockUtils.orphanLastBlock(repository); + + // Ensure that bob and his sponsees are now greater than level 0 + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() > 0); + + // Ensure that bob and his sponsees have no penalties again + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that chloe and her sponsees still have no penalties + for (PrivateKeyAccount chloeSponsee : chloeAndSponsees) + assertEquals(0, (int) new Account(repository, chloeSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that dilbert and his sponsees still have no penalties + for (PrivateKeyAccount dilbertSponsee : dilbertAndSponsees) + assertEquals(0, (int) new Account(repository, dilbertSponsee.getAddress()).getBlocksMintedPenalty()); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + @Test + public void testMintBlockWithSignerPenalty() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + final int initialRewardShareCount = repository.getAccountRepository().getRewardShares().size(); + + List onlineAccountsAliceSigner = new ArrayList<>(); + List onlineAccountsBobSigner = new ArrayList<>(); + + // Alice self share online, and will be used to mint (some of) the blocks + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + onlineAccountsAliceSigner.add(aliceSelfShare); + + // Bob self share online, and will be used to mint (some of) the blocks + PrivateKeyAccount bobSelfShare = Common.getTestAccount(repository, "bob-reward-share"); + onlineAccountsBobSigner.add(bobSelfShare); + + // Include Alice and Bob's online accounts in each other's arrays + onlineAccountsAliceSigner.add(bobSelfShare); + onlineAccountsBobSigner.add(aliceSelfShare); + + PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob"); + PrivateKeyAccount chloeAccount = Common.getTestAccount(repository, "chloe"); + PrivateKeyAccount dilbertAccount = Common.getTestAccount(repository, "dilbert"); + + // Bob sponsors 10 accounts + List bobSponsees = AccountUtils.generateSponsorshipRewardShares(repository, bobAccount, 10); + List bobSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, bobAccount, bobSponsees); + onlineAccountsAliceSigner.addAll(bobSponseesOnlineAccounts); + onlineAccountsBobSigner.addAll(bobSponseesOnlineAccounts); + + // Chloe sponsors 10 accounts + List chloeSponsees = AccountUtils.generateSponsorshipRewardShares(repository, chloeAccount, 10); + List chloeSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, chloeAccount, chloeSponsees); + onlineAccountsAliceSigner.addAll(chloeSponseesOnlineAccounts); + onlineAccountsBobSigner.addAll(chloeSponseesOnlineAccounts); + + // Dilbert sponsors 5 accounts + List dilbertSponsees = AccountUtils.generateSponsorshipRewardShares(repository, dilbertAccount, 5); + List dilbertSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, dilbertAccount, dilbertSponsees); + onlineAccountsAliceSigner.addAll(dilbertSponseesOnlineAccounts); + onlineAccountsBobSigner.addAll(dilbertSponseesOnlineAccounts); + + // Mint blocks (Bob is the signer) + Block block = null; + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccountsBobSigner.toArray(new PrivateKeyAccount[0])); + + // Get reward share transaction count + assertEquals(25, repository.getAccountRepository().getRewardShares().size() - initialRewardShareCount); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() == 0); + + // Mint some blocks, until accounts have leveled up (Bob is the signer) + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccountsBobSigner.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() > 0); + + // Generate self shares so the sponsees can start minting + List bobSponseeSelfShares = AccountUtils.generateSelfShares(repository, bobSponsees); + onlineAccountsAliceSigner.addAll(bobSponseeSelfShares); + onlineAccountsBobSigner.addAll(bobSponseeSelfShares); + + // Mint blocks (Bob is the signer) + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccountsBobSigner.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getConfirmedBalance(Asset.QORT) > 10); // 5 for transaction, 5 for fee + + // Bob then consolidates funds + consolidateFunds(repository, bobSponsees, bobAccount); + + // Mint until block 29 (the algo runs at block 30) (Bob is the signer) + while (block.getBlockData().getHeight() < 29) + block = BlockMinter.mintTestingBlock(repository, onlineAccountsBobSigner.toArray(new PrivateKeyAccount[0])); + assertEquals(29, (int) block.getBlockData().getHeight()); + + // Ensure that bob and his sponsees have no penalties + List bobAndSponsees = new ArrayList<>(bobSponsees); + bobAndSponsees.add(bobAccount); + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Mint a block, so the algo runs (Bob is the signer) + // Block should be valid, because new account levels don't take effect until next block's validation + block = BlockMinter.mintTestingBlock(repository, onlineAccountsBobSigner.toArray(new PrivateKeyAccount[0])); + + // Ensure that bob and his sponsees now have penalties + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(-5000000, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that bob and his sponsees are now level 0 + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getLevel()); + + // Mint a block, but Bob is now an invalid signer because he is level 0 + block = BlockMinter.mintTestingBlockUnvalidated(repository, onlineAccountsBobSigner.toArray(new PrivateKeyAccount[0])); + // Block should be null as it's unable to be minted + assertNull(block); + + // Mint the same block with Alice as the signer, and this time it should be valid + block = BlockMinter.mintTestingBlock(repository, onlineAccountsAliceSigner.toArray(new PrivateKeyAccount[0])); + // Block should NOT be null + assertNotNull(block); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + @Test + public void testMintBlockWithFounderSignerPenalty() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + final int initialRewardShareCount = repository.getAccountRepository().getRewardShares().size(); + + List onlineAccountsAliceSigner = new ArrayList<>(); + List onlineAccountsBobSigner = new ArrayList<>(); + + // Alice self share online, and will be used to mint (some of) the blocks + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + onlineAccountsAliceSigner.add(aliceSelfShare); + + // Bob self share online, and will be used to mint (some of) the blocks + PrivateKeyAccount bobSelfShare = Common.getTestAccount(repository, "bob-reward-share"); + onlineAccountsBobSigner.add(bobSelfShare); + + // Include Alice and Bob's online accounts in each other's arrays + onlineAccountsAliceSigner.add(bobSelfShare); + onlineAccountsBobSigner.add(aliceSelfShare); + + PrivateKeyAccount aliceAccount = Common.getTestAccount(repository, "alice"); + PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob"); + + // Alice sponsors 10 accounts + List aliceSponsees = AccountUtils.generateSponsorshipRewardShares(repository, aliceAccount, 10); + List aliceSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, aliceAccount, aliceSponsees); + onlineAccountsAliceSigner.addAll(aliceSponseesOnlineAccounts); + onlineAccountsBobSigner.addAll(aliceSponseesOnlineAccounts); + + // Bob sponsors 9 accounts + List bobSponsees = AccountUtils.generateSponsorshipRewardShares(repository, bobAccount, 9); + List bobSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, bobAccount, bobSponsees); + onlineAccountsAliceSigner.addAll(bobSponseesOnlineAccounts); + onlineAccountsBobSigner.addAll(bobSponseesOnlineAccounts); + + // Mint blocks (Bob is the signer) + Block block = null; + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccountsAliceSigner.toArray(new PrivateKeyAccount[0])); + + // Get reward share transaction count + assertEquals(19, repository.getAccountRepository().getRewardShares().size() - initialRewardShareCount); + + for (PrivateKeyAccount aliceSponsee : aliceSponsees) + assertTrue(new Account(repository, aliceSponsee.getAddress()).getLevel() == 0); + + // Mint some blocks, until accounts have leveled up (Alice is the signer) + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccountsAliceSigner.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount aliceSponsee : aliceSponsees) + assertTrue(new Account(repository, aliceSponsee.getAddress()).getLevel() > 0); + + // Generate self shares so the sponsees can start minting + List aliceSponseeSelfShares = AccountUtils.generateSelfShares(repository, aliceSponsees); + onlineAccountsAliceSigner.addAll(aliceSponseeSelfShares); + onlineAccountsBobSigner.addAll(aliceSponseeSelfShares); + + // Mint blocks (Bob is the signer) + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccountsAliceSigner.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount aliceSponsee : aliceSponsees) + assertTrue(new Account(repository, aliceSponsee.getAddress()).getConfirmedBalance(Asset.QORT) > 10); // 5 for transaction, 5 for fee + + // Alice then consolidates funds + consolidateFunds(repository, aliceSponsees, aliceAccount); + + // Mint until block 29 (the algo runs at block 30) (Bob is the signer) + while (block.getBlockData().getHeight() < 29) + block = BlockMinter.mintTestingBlock(repository, onlineAccountsAliceSigner.toArray(new PrivateKeyAccount[0])); + assertEquals(29, (int) block.getBlockData().getHeight()); + + // Ensure that alice and her sponsees have no penalties + List aliceAndSponsees = new ArrayList<>(aliceSponsees); + aliceAndSponsees.add(aliceAccount); + for (PrivateKeyAccount aliceSponsee : aliceAndSponsees) + assertEquals(0, (int) new Account(repository, aliceSponsee.getAddress()).getBlocksMintedPenalty()); + + // Mint a block, so the algo runs (Alice is the signer) + // Block should be valid, because new account levels don't take effect until next block's validation + block = BlockMinter.mintTestingBlock(repository, onlineAccountsAliceSigner.toArray(new PrivateKeyAccount[0])); + + // Ensure that alice and her sponsees now have penalties + for (PrivateKeyAccount aliceSponsee : aliceAndSponsees) + assertEquals(-5000000, (int) new Account(repository, aliceSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that alice and her sponsees are now level 0 + for (PrivateKeyAccount aliceSponsee : aliceAndSponsees) + assertEquals(0, (int) new Account(repository, aliceSponsee.getAddress()).getLevel()); + + // Mint a block, but Alice is now an invalid signer because she has lost founder minting abilities + block = BlockMinter.mintTestingBlockUnvalidated(repository, onlineAccountsAliceSigner.toArray(new PrivateKeyAccount[0])); + // Block should be null as it's unable to be minted + assertNull(block); + + // Mint the same block with Bob as the signer, and this time it should be valid + block = BlockMinter.mintTestingBlock(repository, onlineAccountsBobSigner.toArray(new PrivateKeyAccount[0])); + // Block should NOT be null + assertNotNull(block); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + @Test + public void testOnlineAccountsWithPenalties() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + final int initialRewardShareCount = repository.getAccountRepository().getRewardShares().size(); + + // Alice self share online, and will be used to mint the blocks + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + List onlineAccounts = new ArrayList<>(); + onlineAccounts.add(aliceSelfShare); + + // Bob self share online + PrivateKeyAccount bobSelfShare = Common.getTestAccount(repository, "bob-reward-share"); + onlineAccounts.add(bobSelfShare); + + PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob"); + PrivateKeyAccount chloeAccount = Common.getTestAccount(repository, "chloe"); + PrivateKeyAccount dilbertAccount = Common.getTestAccount(repository, "dilbert"); + + // Bob sponsors 10 accounts + List bobSponsees = AccountUtils.generateSponsorshipRewardShares(repository, bobAccount, 10); + List bobSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, bobAccount, bobSponsees); + onlineAccounts.addAll(bobSponseesOnlineAccounts); + + // Chloe sponsors 10 accounts + List chloeSponsees = AccountUtils.generateSponsorshipRewardShares(repository, chloeAccount, 10); + List chloeSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, chloeAccount, chloeSponsees); + onlineAccounts.addAll(chloeSponseesOnlineAccounts); + + // Dilbert sponsors 5 accounts + List dilbertSponsees = AccountUtils.generateSponsorshipRewardShares(repository, dilbertAccount, 5); + List dilbertSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, dilbertAccount, dilbertSponsees); + onlineAccounts.addAll(dilbertSponseesOnlineAccounts); + + // Mint blocks + Block block = null; + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + assertEquals(27, block.getBlockData().getOnlineAccountsCount()); + assertEquals(25, repository.getAccountRepository().getRewardShares().size() - initialRewardShareCount); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() == 0); + + // Mint some blocks, until accounts have leveled up + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() > 0); + + // Generate self shares so the sponsees can start minting + List bobSponseeSelfShares = AccountUtils.generateSelfShares(repository, bobSponsees); + onlineAccounts.addAll(bobSponseeSelfShares); + + // Mint blocks + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getConfirmedBalance(Asset.QORT) > 10); // 5 for transaction, 5 for fee + + // Bob then consolidates funds + consolidateFunds(repository, bobSponsees, bobAccount); + + // Mint until block 29 (the algo runs at block 30) + while (block.getBlockData().getHeight() < 29) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(29, (int) block.getBlockData().getHeight()); + + // Ensure that bob and his sponsees have no penalties + List bobAndSponsees = new ArrayList<>(bobSponsees); + bobAndSponsees.add(bobAccount); + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that bob and his sponsees are present in block's online accounts + assertTrue(areAllAccountsPresentInBlock(bobAndSponsees, block)); + + // Ensure that chloe's sponsees are present in block's online accounts + assertTrue(areAllAccountsPresentInBlock(chloeSponsees, block)); + + // Ensure that dilbert's sponsees are present in block's online accounts + assertTrue(areAllAccountsPresentInBlock(dilbertSponsees, block)); + + // Mint a block, so the algo runs + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Ensure that bob and his sponsees now have penalties + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(-5000000, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that bob and his sponsees are still present in block's online accounts + assertTrue(areAllAccountsPresentInBlock(bobAndSponsees, block)); + + // Mint another few blocks + while (block.getBlockData().getHeight() < 34) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + assertEquals(34, (int)block.getBlockData().getHeight()); + + // Ensure that bob and his sponsees are NOT present in block's online accounts (due to penalties) + assertFalse(areAllAccountsPresentInBlock(bobAndSponsees, block)); + + // Ensure that chloe's sponsees are still present in block's online accounts + assertTrue(areAllAccountsPresentInBlock(chloeSponsees, block)); + + // Ensure that dilbert's sponsees are still present in block's online accounts + assertTrue(areAllAccountsPresentInBlock(dilbertSponsees, block)); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + @Test + public void testFounderOnlineAccountsWithPenalties() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + final int initialRewardShareCount = repository.getAccountRepository().getRewardShares().size(); + + // Bob self share online, and will be used to mint the blocks + PrivateKeyAccount bobSelfShare = Common.getTestAccount(repository, "bob-reward-share"); + List onlineAccounts = new ArrayList<>(); + onlineAccounts.add(bobSelfShare); + + // Alice self share online + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + onlineAccounts.add(aliceSelfShare); + + PrivateKeyAccount aliceAccount = Common.getTestAccount(repository, "alice"); + PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob"); + + // Alice sponsors 10 accounts + List aliceSponsees = AccountUtils.generateSponsorshipRewardShares(repository, aliceAccount, 10); + List aliceSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, aliceAccount, aliceSponsees); + onlineAccounts.addAll(aliceSponseesOnlineAccounts); + onlineAccounts.addAll(aliceSponseesOnlineAccounts); + + // Bob sponsors 9 accounts + List bobSponsees = AccountUtils.generateSponsorshipRewardShares(repository, bobAccount, 9); + List bobSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, bobAccount, bobSponsees); + onlineAccounts.addAll(bobSponseesOnlineAccounts); + onlineAccounts.addAll(bobSponseesOnlineAccounts); + + // Mint blocks (Bob is the signer) + Block block = null; + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Get reward share transaction count + assertEquals(19, repository.getAccountRepository().getRewardShares().size() - initialRewardShareCount); + + for (PrivateKeyAccount aliceSponsee : aliceSponsees) + assertTrue(new Account(repository, aliceSponsee.getAddress()).getLevel() == 0); + + // Mint some blocks, until accounts have leveled up (Alice is the signer) + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount aliceSponsee : aliceSponsees) + assertTrue(new Account(repository, aliceSponsee.getAddress()).getLevel() > 0); + + // Generate self shares so the sponsees can start minting + List aliceSponseeSelfShares = AccountUtils.generateSelfShares(repository, aliceSponsees); + onlineAccounts.addAll(aliceSponseeSelfShares); + + // Mint blocks (Bob is the signer) + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount aliceSponsee : aliceSponsees) + assertTrue(new Account(repository, aliceSponsee.getAddress()).getConfirmedBalance(Asset.QORT) > 10); // 5 for transaction, 5 for fee + + // Alice then consolidates funds + consolidateFunds(repository, aliceSponsees, aliceAccount); + + // Mint until block 29 (the algo runs at block 30) (Bob is the signer) + while (block.getBlockData().getHeight() < 29) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(29, (int) block.getBlockData().getHeight()); + + // Ensure that alice and her sponsees have no penalties + List aliceAndSponsees = new ArrayList<>(aliceSponsees); + aliceAndSponsees.add(aliceAccount); + for (PrivateKeyAccount aliceSponsee : aliceAndSponsees) + assertEquals(0, (int) new Account(repository, aliceSponsee.getAddress()).getBlocksMintedPenalty()); + + // Mint a block, so the algo runs (Alice is the signer) + // Block should be valid, because new account levels don't take effect until next block's validation + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Ensure that alice and her sponsees now have penalties + for (PrivateKeyAccount aliceSponsee : aliceAndSponsees) + assertEquals(-5000000, (int) new Account(repository, aliceSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that alice and her sponsees are now level 0 + for (PrivateKeyAccount aliceSponsee : aliceAndSponsees) + assertEquals(0, (int) new Account(repository, aliceSponsee.getAddress()).getLevel()); + + // Ensure that alice and her sponsees don't have penalties + List bobAndSponsees = new ArrayList<>(bobSponsees); + bobAndSponsees.add(bobAccount); + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that bob and his sponsees are still present in block's online accounts + assertTrue(areAllAccountsPresentInBlock(bobAndSponsees, block)); + + // Ensure that alice and her sponsees are still present in block's online accounts + assertTrue(areAllAccountsPresentInBlock(aliceAndSponsees, block)); + + // Mint another few blocks + while (block.getBlockData().getHeight() < 34) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + assertEquals(34, (int)block.getBlockData().getHeight()); + + // Ensure that alice and her sponsees are NOT present in block's online accounts (due to penalties) + assertFalse(areAllAccountsPresentInBlock(aliceAndSponsees, block)); + + // Ensure that bob and his sponsees are still present in block's online accounts + assertTrue(areAllAccountsPresentInBlock(bobAndSponsees, block)); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + @Test + public void testPenaltyAccountCreateRewardShare() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + final int initialRewardShareCount = repository.getAccountRepository().getRewardShares().size(); + + // Alice self share online, and will be used to mint the blocks + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + List onlineAccounts = new ArrayList<>(); + onlineAccounts.add(aliceSelfShare); + + PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob"); + PrivateKeyAccount chloeAccount = Common.getTestAccount(repository, "chloe"); + + // Bob sponsors 10 accounts + List bobSponsees = AccountUtils.generateSponsorshipRewardShares(repository, bobAccount, 10); + List bobSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, bobAccount, bobSponsees); + onlineAccounts.addAll(bobSponseesOnlineAccounts); + + // Chloe sponsors 10 accounts + List chloeSponsees = AccountUtils.generateSponsorshipRewardShares(repository, chloeAccount, 10); + List chloeSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, chloeAccount, chloeSponsees); + onlineAccounts.addAll(chloeSponseesOnlineAccounts); + + // Mint blocks + Block block = null; + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + assertEquals(21, block.getBlockData().getOnlineAccountsCount()); + assertEquals(20, repository.getAccountRepository().getRewardShares().size() - initialRewardShareCount); + + // Mint some blocks, until accounts have leveled up + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Generate self shares so the sponsees can start minting + List bobSponseeSelfShares = AccountUtils.generateSelfShares(repository, bobSponsees); + onlineAccounts.addAll(bobSponseeSelfShares); + + // Mint some blocks, until accounts have leveled up + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Bob then consolidates funds + consolidateFunds(repository, bobSponsees, bobAccount); + + // Mint until block 12 (rewardshare get disabled at block 15) + while (block.getBlockData().getHeight() < 12) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(12, (int) block.getBlockData().getHeight()); + + // Bob creates a valid reward share transaction + assertEquals(Transaction.ValidationResult.OK, AccountUtils.createRandomRewardShare(repository, bobAccount)); + + // Mint until block 30 (the algo runs at block 30) + while (block.getBlockData().getHeight() < 30) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(30, (int) block.getBlockData().getHeight()); + + // Bob can no longer create a reward share transaction + assertEquals(Transaction.ValidationResult.ACCOUNT_CANNOT_REWARD_SHARE, AccountUtils.createRandomRewardShare(repository, bobAccount)); + + // ... but Chloe still can + assertEquals(Transaction.ValidationResult.OK, AccountUtils.createRandomRewardShare(repository, chloeAccount)); + + // Orphan last block + BlockUtils.orphanLastBlock(repository); + + // Bob creates another valid reward share transaction + assertEquals(Transaction.ValidationResult.OK, AccountUtils.createRandomRewardShare(repository, bobAccount)); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + @Test + public void testPenaltyFounderCreateRewardShare() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + final int initialRewardShareCount = repository.getAccountRepository().getRewardShares().size(); + + // Bob self share online, and will be used to mint the blocks + PrivateKeyAccount bobSelfShare = Common.getTestAccount(repository, "bob-reward-share"); + List onlineAccounts = new ArrayList<>(); + onlineAccounts.add(bobSelfShare); + + PrivateKeyAccount aliceAccount = Common.getTestAccount(repository, "alice"); + PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob"); + + // Alice sponsors 10 accounts + List aliceSponsees = AccountUtils.generateSponsorshipRewardShares(repository, aliceAccount, 10); + List aliceSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, aliceAccount, aliceSponsees); + onlineAccounts.addAll(aliceSponseesOnlineAccounts); + + // Bob sponsors 10 accounts + List bobSponsees = AccountUtils.generateSponsorshipRewardShares(repository, bobAccount, 10); + List bobSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, bobAccount, bobSponsees); + onlineAccounts.addAll(bobSponseesOnlineAccounts); + + // Mint blocks + Block block = null; + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + assertEquals(21, block.getBlockData().getOnlineAccountsCount()); + assertEquals(20, repository.getAccountRepository().getRewardShares().size() - initialRewardShareCount); + + // Mint some blocks, until accounts have leveled up + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Generate self shares so the sponsees can start minting + List aliceSponseeSelfShares = AccountUtils.generateSelfShares(repository, aliceSponsees); + onlineAccounts.addAll(aliceSponseeSelfShares); + + // Mint some blocks + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Alice then consolidates funds + consolidateFunds(repository, aliceSponsees, aliceAccount); + + // Mint until block 12 (rewardshare get disabled at block 15) + while (block.getBlockData().getHeight() < 12) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(12, (int) block.getBlockData().getHeight()); + + // Alice creates a valid reward share transaction + assertEquals(Transaction.ValidationResult.OK, AccountUtils.createRandomRewardShare(repository, aliceAccount)); + + // Mint until block 30 (the algo runs at block 30) + while (block.getBlockData().getHeight() < 30) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(30, (int) block.getBlockData().getHeight()); + + // Ensure that alice now has a penalty + assertEquals(-5000000, (int) new Account(repository, aliceAccount.getAddress()).getBlocksMintedPenalty()); + + // Ensure that alice and her sponsees are now level 0 + assertEquals(0, (int) new Account(repository, aliceAccount.getAddress()).getLevel()); + + // Alice can no longer create a reward share transaction + assertEquals(Transaction.ValidationResult.ACCOUNT_CANNOT_REWARD_SHARE, AccountUtils.createRandomRewardShare(repository, aliceAccount)); + + // Bob can no longer create a reward share transaction (disabled at Block 15) + assertEquals(Transaction.ValidationResult.OK, AccountUtils.createRandomRewardShare(repository, bobAccount)); + + // Orphan last block + BlockUtils.orphanLastBlock(repository); + + // Alice creates another valid reward share transaction + assertEquals(Transaction.ValidationResult.OK, AccountUtils.createRandomRewardShare(repository, aliceAccount)); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + /** + * This is a test to prove that Dilbert levels up from 6 to 7 in the same block that the self + * sponsorship algo runs. It is here to give some confidence in the following testPenaltyAccountLevelUp() + * test, in which we will test what happens if a penalty is applied or removed in the same block + * that an account would otherwise have leveled up. It also gives some confidence that the algo + * doesn't affect the levels of unflagged accounts. + * + * @throws DataException + */ + @Test + public void testNonPenaltyAccountLevelUp() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + + // Alice self share online, and will be used to mint the blocks + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + List onlineAccounts = new ArrayList<>(); + onlineAccounts.add(aliceSelfShare); + + PrivateKeyAccount dilbertAccount = Common.getTestAccount(repository, "dilbert"); + + // Dilbert sponsors 10 accounts + List dilbertSponsees = AccountUtils.generateSponsorshipRewardShares(repository, dilbertAccount, 10); + List dilbertSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, dilbertAccount, dilbertSponsees); + onlineAccounts.addAll(dilbertSponseesOnlineAccounts); + + // Mint blocks + Block block = null; + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Mint some blocks, until accounts have leveled up + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Mint blocks + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Mint until block 29 (the algo runs at block 30) + while (block.getBlockData().getHeight() < 29) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(29, (int) block.getBlockData().getHeight()); + + // Make sure Dilbert hasn't leveled up yet + assertEquals(6, (int)dilbertAccount.getLevel()); + + // Mint a block, so the algo runs + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Make sure Dilbert has leveled up + assertEquals(7, (int)dilbertAccount.getLevel()); + + // Orphan last block + BlockUtils.orphanLastBlock(repository); + + // Make sure Dilbert has returned to level 6 + assertEquals(6, (int)dilbertAccount.getLevel()); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + @Test + public void testPenaltyAccountLevelUp() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + + // Alice self share online, and will be used to mint the blocks + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + List onlineAccounts = new ArrayList<>(); + onlineAccounts.add(aliceSelfShare); + + PrivateKeyAccount dilbertAccount = Common.getTestAccount(repository, "dilbert"); + + // Dilbert sponsors 10 accounts + List dilbertSponsees = AccountUtils.generateSponsorshipRewardShares(repository, dilbertAccount, 10); + List dilbertSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, dilbertAccount, dilbertSponsees); + onlineAccounts.addAll(dilbertSponseesOnlineAccounts); + + // Mint blocks + Block block = null; + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Mint some blocks, until accounts have leveled up + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Generate self shares so the sponsees can start minting + List dilbertSponseeSelfShares = AccountUtils.generateSelfShares(repository, dilbertSponsees); + onlineAccounts.addAll(dilbertSponseeSelfShares); + + // Mint blocks + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Dilbert then consolidates funds + consolidateFunds(repository, dilbertSponsees, dilbertAccount); + + // Mint until block 29 (the algo runs at block 30) + while (block.getBlockData().getHeight() < 29) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(29, (int) block.getBlockData().getHeight()); + + // Make sure Dilbert hasn't leveled up yet + assertEquals(6, (int)dilbertAccount.getLevel()); + + // Mint a block, so the algo runs + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Make sure Dilbert is now level 0 instead of 7 (due to penalty) + assertEquals(0, (int)dilbertAccount.getLevel()); + + // Orphan last block + BlockUtils.orphanLastBlock(repository); + + // Make sure Dilbert has returned to level 6 + assertEquals(6, (int)dilbertAccount.getLevel()); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + @Test + public void testDuplicateSponsors() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + final int initialRewardShareCount = repository.getAccountRepository().getRewardShares().size(); + + // Alice self share online, and will be used to mint the blocks + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + List onlineAccounts = new ArrayList<>(); + onlineAccounts.add(aliceSelfShare); + + PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob"); + PrivateKeyAccount chloeAccount = Common.getTestAccount(repository, "chloe"); + PrivateKeyAccount dilbertAccount = Common.getTestAccount(repository, "dilbert"); + + // Bob sponsors 10 accounts + List bobSponsees = AccountUtils.generateSponsorshipRewardShares(repository, bobAccount, 10); + List bobSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, bobAccount, bobSponsees); + onlineAccounts.addAll(bobSponseesOnlineAccounts); + + // Chloe sponsors THE SAME 10 accounts + for (PrivateKeyAccount bobSponsee : bobSponsees) { + // Create reward-share + TransactionData transactionData = AccountUtils.createRewardShare(repository, chloeAccount, bobSponsee, 0, fee); + TransactionUtils.signAndImportValid(repository, transactionData, chloeAccount); + } + List chloeSponsees = new ArrayList<>(bobSponsees); + List chloeSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, chloeAccount, chloeSponsees); + onlineAccounts.addAll(chloeSponseesOnlineAccounts); + + // Dilbert sponsors 5 accounts + List dilbertSponsees = AccountUtils.generateSponsorshipRewardShares(repository, dilbertAccount, 5); + List dilbertSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, dilbertAccount, dilbertSponsees); + onlineAccounts.addAll(dilbertSponseesOnlineAccounts); + + // Mint blocks + Block block = null; + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + assertEquals(26, block.getBlockData().getOnlineAccountsCount()); + assertEquals(25, repository.getAccountRepository().getRewardShares().size() - initialRewardShareCount); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() == 0); + + // Mint some blocks, until accounts have leveled up + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() > 0); + + // Generate self shares so the sponsees can start minting + List bobSponseeSelfShares = AccountUtils.generateSelfShares(repository, bobSponsees); + onlineAccounts.addAll(bobSponseeSelfShares); + + // Mint blocks + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getConfirmedBalance(Asset.QORT) > 10); // 5 for transaction, 5 for fee + + // Bob then consolidates funds + consolidateFunds(repository, bobSponsees, bobAccount); + + // Mint until block 29 (the algo runs at block 30) + while (block.getBlockData().getHeight() < 29) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(29, (int) block.getBlockData().getHeight()); + + // Ensure that bob and his sponsees have no penalties + List bobAndSponsees = new ArrayList<>(bobSponsees); + bobAndSponsees.add(bobAccount); + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + assertEquals(6, (int)dilbertAccount.getLevel()); + + // Mint a block, so the algo runs + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Ensure that bob and his sponsees now have penalties + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(-5000000, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that chloe and her sponsees also have penalties, as they relate to the same network of accounts + List chloeAndSponsees = new ArrayList<>(chloeSponsees); + chloeAndSponsees.add(chloeAccount); + for (PrivateKeyAccount chloeSponsee : chloeAndSponsees) + assertEquals(-5000000, (int) new Account(repository, chloeSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that dilbert and his sponsees have no penalties + List dilbertAndSponsees = new ArrayList<>(dilbertSponsees); + dilbertAndSponsees.add(dilbertAccount); + for (PrivateKeyAccount dilbertSponsee : dilbertAndSponsees) + assertEquals(0, (int) new Account(repository, dilbertSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that bob and his sponsees are now level 0 + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getLevel()); + + // Orphan last block + BlockUtils.orphanLastBlock(repository); + + // Ensure that bob and his sponsees are now greater than level 0 + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() > 0); + + // Ensure that bob and his sponsees have no penalties again + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that chloe and her sponsees still have no penalties again + for (PrivateKeyAccount chloeSponsee : chloeAndSponsees) + assertEquals(0, (int) new Account(repository, chloeSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that dilbert and his sponsees still have no penalties + for (PrivateKeyAccount dilbertSponsee : dilbertAndSponsees) + assertEquals(0, (int) new Account(repository, dilbertSponsee.getAddress()).getBlocksMintedPenalty()); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + @Test + public void testTransferPrivsBeforeAlgoBlock() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + + // Alice self share online, and will be used to mint the blocks + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + List onlineAccounts = new ArrayList<>(); + onlineAccounts.add(aliceSelfShare); + + PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob"); + + // Bob sponsors 10 accounts + List bobSponsees = AccountUtils.generateSponsorshipRewardShares(repository, bobAccount, 10); + List bobSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, bobAccount, bobSponsees); + onlineAccounts.addAll(bobSponseesOnlineAccounts); + + // Mint blocks + Block block = null; + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() == 0); + + // Mint some blocks, until accounts have leveled up + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() > 0); + + // Generate self shares so the sponsees can start minting + List bobSponseeSelfShares = AccountUtils.generateSelfShares(repository, bobSponsees); + onlineAccounts.addAll(bobSponseeSelfShares); + + // Mint blocks + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getConfirmedBalance(Asset.QORT) > 10); // 5 for transaction, 5 for fee + + // Bob then consolidates funds + consolidateFunds(repository, bobSponsees, bobAccount); + + // Mint until block 28 (the algo runs at block 30) + while (block.getBlockData().getHeight() < 28) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(28, (int) block.getBlockData().getHeight()); + + // Bob then issues a TRANSFER_PRIVS + PrivateKeyAccount recipientAccount = randomTransferPrivs(repository, bobAccount); + + // Ensure recipient has no level (actually, no account record) at this point (pre-confirmation) + assertNull(recipientAccount.getLevel()); + + // Mint another block, so that the TRANSFER_PRIVS confirms + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Now ensure that the TRANSFER_PRIVS recipient has inherited Bob's level, and Bob is at level 0 + assertTrue(recipientAccount.getLevel() > 0); + assertEquals(0, (int)bobAccount.getLevel()); + assertEquals(0, (int) new Account(repository, recipientAccount.getAddress()).getBlocksMintedPenalty()); + + // Ensure that bob and his sponsees have no penalties + List bobAndSponsees = new ArrayList<>(bobSponsees); + bobAndSponsees.add(bobAccount); + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that bob's sponsees are greater than level 0 + // Bob's account won't be, as he has transferred privs + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() > 0); + + // Mint a block, so the algo runs + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Ensure that bob and his sponsees now have penalties + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(-5000000, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that bob and his sponsees are now level 0 + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getLevel()); + + // Ensure recipient account has penalty too + assertEquals(-5000000, (int) new Account(repository, recipientAccount.getAddress()).getBlocksMintedPenalty()); + assertEquals(0, (int) new Account(repository, recipientAccount.getAddress()).getLevel()); + + // Orphan last block + BlockUtils.orphanLastBlock(repository); + + // Ensure that Bob's sponsees are now greater than level 0 + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() > 0); + + // Ensure that bob and his sponsees have no penalties again + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure recipient account has no penalty again and has a level greater than 0 + assertEquals(0, (int) new Account(repository, recipientAccount.getAddress()).getBlocksMintedPenalty()); + assertTrue(new Account(repository, recipientAccount.getAddress()).getLevel() > 0); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + @Test + public void testTransferPrivsInAlgoBlock() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + + // Alice self share online, and will be used to mint the blocks + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + List onlineAccounts = new ArrayList<>(); + onlineAccounts.add(aliceSelfShare); + + PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob"); + + // Bob sponsors 10 accounts + List bobSponsees = AccountUtils.generateSponsorshipRewardShares(repository, bobAccount, 10); + List bobSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, bobAccount, bobSponsees); + onlineAccounts.addAll(bobSponseesOnlineAccounts); + + // Mint blocks + Block block = null; + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() == 0); + + // Mint some blocks, until accounts have leveled up + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() > 0); + + // Generate self shares so the sponsees can start minting + List bobSponseeSelfShares = AccountUtils.generateSelfShares(repository, bobSponsees); + onlineAccounts.addAll(bobSponseeSelfShares); + + // Mint blocks + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getConfirmedBalance(Asset.QORT) > 10); // 5 for transaction, 5 for fee + + // Bob then consolidates funds + consolidateFunds(repository, bobSponsees, bobAccount); + + // Mint until block 29 (the algo runs at block 30) + while (block.getBlockData().getHeight() < 29) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(29, (int) block.getBlockData().getHeight()); + + // Ensure that bob and his sponsees have no penalties + List bobAndSponsees = new ArrayList<>(bobSponsees); + bobAndSponsees.add(bobAccount); + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Bob then issues a TRANSFER_PRIVS + PrivateKeyAccount recipientAccount = randomTransferPrivs(repository, bobAccount); + + // Ensure recipient has no level (actually, no account record) at this point (pre-confirmation) + assertNull(recipientAccount.getLevel()); + + // Mint a block, so the algo runs + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Now ensure that the TRANSFER_PRIVS recipient has inherited Bob's level, and Bob is at level 0 + assertTrue(recipientAccount.getLevel() > 0); + assertEquals(0, (int)bobAccount.getLevel()); + + // Ensure that bob and his sponsees now have penalties + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(-5000000, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that bob and his sponsees are now level 0 + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getLevel()); + + // Orphan last block + BlockUtils.orphanLastBlock(repository); + + // Ensure recipient has no level again + assertNull(recipientAccount.getLevel()); + + // Ensure that bob and his sponsees are now greater than level 0 + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() > 0); + + // Ensure that bob and his sponsees have no penalties again + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + @Test + public void testTransferPrivsAfterAlgoBlock() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + + // Alice self share online, and will be used to mint the blocks + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + List onlineAccounts = new ArrayList<>(); + onlineAccounts.add(aliceSelfShare); + + PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob"); + + // Bob sponsors 10 accounts + List bobSponsees = AccountUtils.generateSponsorshipRewardShares(repository, bobAccount, 10); + List bobSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, bobAccount, bobSponsees); + onlineAccounts.addAll(bobSponseesOnlineAccounts); + + // Mint blocks + Block block = null; + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() == 0); + + // Mint some blocks, until accounts have leveled up + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() > 0); + + // Generate self shares so the sponsees can start minting + List bobSponseeSelfShares = AccountUtils.generateSelfShares(repository, bobSponsees); + onlineAccounts.addAll(bobSponseeSelfShares); + + // Mint blocks + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getConfirmedBalance(Asset.QORT) > 10); // 5 for transaction, 5 for fee + + // Bob then consolidates funds + consolidateFunds(repository, bobSponsees, bobAccount); + + // Mint until block 29 (the algo runs at block 30) + while (block.getBlockData().getHeight() < 29) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(29, (int) block.getBlockData().getHeight()); + + // Ensure that bob and his sponsees have no penalties + List bobAndSponsees = new ArrayList<>(bobSponsees); + bobAndSponsees.add(bobAccount); + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Mint a block, so the algo runs + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Bob then issues a TRANSFER_PRIVS, which should be invalid + Transaction transferPrivsTransaction = randomTransferPrivsTransaction(repository, bobAccount); + assertEquals(ACCOUNT_NOT_TRANSFERABLE, transferPrivsTransaction.isValid()); + + // Orphan last 2 blocks + BlockUtils.orphanLastBlock(repository); + BlockUtils.orphanLastBlock(repository); + + // TRANSFER_PRIVS should now be valid + transferPrivsTransaction = randomTransferPrivsTransaction(repository, bobAccount); + assertEquals(OK, transferPrivsTransaction.isValid()); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + @Test + public void testDoubleTransferPrivs() throws DataException { + try (final Repository repository = RepositoryManager.getRepository()) { + + // Alice self share online, and will be used to mint the blocks + PrivateKeyAccount aliceSelfShare = Common.getTestAccount(repository, "alice-reward-share"); + List onlineAccounts = new ArrayList<>(); + onlineAccounts.add(aliceSelfShare); + + PrivateKeyAccount bobAccount = Common.getTestAccount(repository, "bob"); + + // Bob sponsors 10 accounts + List bobSponsees = AccountUtils.generateSponsorshipRewardShares(repository, bobAccount, 10); + List bobSponseesOnlineAccounts = AccountUtils.toRewardShares(repository, bobAccount, bobSponsees); + onlineAccounts.addAll(bobSponseesOnlineAccounts); + + // Mint blocks + Block block = null; + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() == 0); + + // Mint some blocks, until accounts have leveled up + for (int i = 0; i <= 5; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() > 0); + + // Generate self shares so the sponsees can start minting + List bobSponseeSelfShares = AccountUtils.generateSelfShares(repository, bobSponsees); + onlineAccounts.addAll(bobSponseeSelfShares); + + // Mint blocks + for (int i = 0; i <= 1; i++) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getConfirmedBalance(Asset.QORT) > 10); // 5 for transaction, 5 for fee + + // Bob then consolidates funds + consolidateFunds(repository, bobSponsees, bobAccount); + + // Mint until block 27 (the algo runs at block 30) + while (block.getBlockData().getHeight() < 27) + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + assertEquals(27, (int) block.getBlockData().getHeight()); + + // Bob then issues a TRANSFER_PRIVS + PrivateKeyAccount recipientAccount1 = randomTransferPrivs(repository, bobAccount); + + // Ensure recipient has no level (actually, no account record) at this point (pre-confirmation) + assertNull(recipientAccount1.getLevel()); + + // Bob and also sends some QORT to cover future transaction fees + // This mints another block, and the TRANSFER_PRIVS confirms + AccountUtils.pay(repository, bobAccount, recipientAccount1.getAddress(), 123456789L); + + // Now ensure that the TRANSFER_PRIVS recipient has inherited Bob's level, and Bob is at level 0 + assertTrue(recipientAccount1.getLevel() > 0); + assertEquals(0, (int)bobAccount.getLevel()); + assertEquals(0, (int) new Account(repository, recipientAccount1.getAddress()).getBlocksMintedPenalty()); + + // The recipient account then issues a TRANSFER_PRIVS of their own + PrivateKeyAccount recipientAccount2 = randomTransferPrivs(repository, recipientAccount1); + + // Ensure recipientAccount2 has no level at this point (pre-confirmation) + assertNull(recipientAccount2.getLevel()); + + // Mint another block, so that the TRANSFER_PRIVS confirms + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Now ensure that the TRANSFER_PRIVS recipient2 has inherited Bob's level, and recipient1 is at level 0 + assertTrue(recipientAccount2.getLevel() > 0); + assertEquals(0, (int)recipientAccount1.getLevel()); + assertEquals(0, (int) new Account(repository, recipientAccount2.getAddress()).getBlocksMintedPenalty()); + + // Ensure that bob and his sponsees have no penalties + List bobAndSponsees = new ArrayList<>(bobSponsees); + bobAndSponsees.add(bobAccount); + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that bob's sponsees are greater than level 0 + // Bob's account won't be, as he has transferred privs + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() > 0); + + // Mint a block, so the algo runs + block = BlockMinter.mintTestingBlock(repository, onlineAccounts.toArray(new PrivateKeyAccount[0])); + + // Ensure that bob and his sponsees now have penalties + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(-5000000, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure that bob and his sponsees are now level 0 + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getLevel()); + + // Ensure recipientAccount2 has penalty too + assertEquals(-5000000, (int) new Account(repository, recipientAccount2.getAddress()).getBlocksMintedPenalty()); + assertEquals(0, (int) new Account(repository, recipientAccount2.getAddress()).getLevel()); + + // Ensure recipientAccount1 has penalty too + assertEquals(-5000000, (int) new Account(repository, recipientAccount1.getAddress()).getBlocksMintedPenalty()); + assertEquals(0, (int) new Account(repository, recipientAccount1.getAddress()).getLevel()); + + // Orphan last block + BlockUtils.orphanLastBlock(repository); + + // Ensure that Bob's sponsees are now greater than level 0 + for (PrivateKeyAccount bobSponsee : bobSponsees) + assertTrue(new Account(repository, bobSponsee.getAddress()).getLevel() > 0); + + // Ensure that bob and his sponsees have no penalties again + for (PrivateKeyAccount bobSponsee : bobAndSponsees) + assertEquals(0, (int) new Account(repository, bobSponsee.getAddress()).getBlocksMintedPenalty()); + + // Ensure recipientAccount1 has no penalty again and is level 0 + assertEquals(0, (int) new Account(repository, recipientAccount1.getAddress()).getBlocksMintedPenalty()); + assertEquals(0, (int) new Account(repository, recipientAccount1.getAddress()).getLevel()); + + // Ensure recipientAccount2 has no penalty again and has a level greater than 0 + assertEquals(0, (int) new Account(repository, recipientAccount2.getAddress()).getBlocksMintedPenalty()); + assertTrue(new Account(repository, recipientAccount2.getAddress()).getLevel() > 0); + + // Run orphan check - this can't be in afterTest() because some tests access the live db + Common.orphanCheck(); + } + } + + + + private static PrivateKeyAccount randomTransferPrivs(Repository repository, PrivateKeyAccount senderAccount) throws DataException { + // Generate random recipient account + byte[] randomPrivateKey = new byte[32]; + new Random().nextBytes(randomPrivateKey); + PrivateKeyAccount recipientAccount = new PrivateKeyAccount(repository, randomPrivateKey); + + BaseTransactionData baseTransactionData = new BaseTransactionData(NTP.getTime(), 0, senderAccount.getLastReference(), senderAccount.getPublicKey(), fee, null); + TransactionData transactionData = new TransferPrivsTransactionData(baseTransactionData, recipientAccount.getAddress()); + + TransactionUtils.signAndImportValid(repository, transactionData, senderAccount); + + return recipientAccount; + } + + private static TransferPrivsTransaction randomTransferPrivsTransaction(Repository repository, PrivateKeyAccount senderAccount) throws DataException { + // Generate random recipient account + byte[] randomPrivateKey = new byte[32]; + new Random().nextBytes(randomPrivateKey); + PrivateKeyAccount recipientAccount = new PrivateKeyAccount(repository, randomPrivateKey); + + BaseTransactionData baseTransactionData = new BaseTransactionData(NTP.getTime(), 0, senderAccount.getLastReference(), senderAccount.getPublicKey(), fee, null); + TransactionData transactionData = new TransferPrivsTransactionData(baseTransactionData, recipientAccount.getAddress()); + + return new TransferPrivsTransaction(repository, transactionData); + } + + private boolean areAllAccountsPresentInBlock(List accounts, Block block) throws DataException { + for (PrivateKeyAccount bobSponsee : accounts) { + boolean foundOnlineAccountInBlock = false; + for (Block.ExpandedAccount expandedAccount : block.getExpandedAccounts()) { + if (expandedAccount.getRecipientAccount().getAddress().equals(bobSponsee.getAddress())) { + foundOnlineAccountInBlock = true; + break; + } + } + if (!foundOnlineAccountInBlock) { + return false; + } + } + return true; + } + + private static void consolidateFunds(Repository repository, List sponsees, PrivateKeyAccount sponsor) throws DataException { + for (PrivateKeyAccount sponsee : sponsees) { + for (int i = 0; i < 5; i++) { + // Generate new payments from sponsee to sponsor + TransactionData paymentData = new PaymentTransactionData(TestTransaction.generateBase(sponsee), sponsor.getAddress(), 1); + TransactionUtils.signAndImportValid(repository, paymentData, sponsee); // updates paymentData's signature + } + } + } + +} \ No newline at end of file diff --git a/src/test/resources/test-chain-v2-block-timestamps.json b/src/test/resources/test-chain-v2-block-timestamps.json index 8f863ada..17fc80c4 100644 --- a/src/test/resources/test-chain-v2-block-timestamps.json +++ b/src/test/resources/test-chain-v2-block-timestamps.json @@ -19,6 +19,8 @@ "onlineAccountSignaturesMaxLifetime": 86400000, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV3SnapshotTimestamp": 9999999999999, + "referenceTimestampBlock": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -82,14 +84,14 @@ "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, + "selfSponsorshipAlgoV2Height": 999999999, + "selfSponsorshipAlgoV3Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, "unconfirmableRewardSharesHeight": 99999999, - "selfSponsorshipAlgoV2Height": 9999999, "disableTransferPrivsTimestamp": 9999999999500, - "enableTransferPrivsTimestamp": 9999999999950, - "penaltyFixHeight": 9999999 + "enableTransferPrivsTimestamp": 9999999999950 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-disable-reference.json b/src/test/resources/test-chain-v2-disable-reference.json index f5938c01..33054732 100644 --- a/src/test/resources/test-chain-v2-disable-reference.json +++ b/src/test/resources/test-chain-v2-disable-reference.json @@ -23,6 +23,8 @@ "onlineAccountSignaturesMaxLifetime": 86400000, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV3SnapshotTimestamp": 9999999999999, + "referenceTimestampBlock": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -85,14 +87,14 @@ "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, + "selfSponsorshipAlgoV2Height": 999999999, + "selfSponsorshipAlgoV3Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, "unconfirmableRewardSharesHeight": 99999999, - "selfSponsorshipAlgoV2Height": 9999999, "disableTransferPrivsTimestamp": 9999999999500, - "enableTransferPrivsTimestamp": 9999999999950, - "penaltyFixHeight": 9999999 + "enableTransferPrivsTimestamp": 9999999999950 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-founder-rewards.json b/src/test/resources/test-chain-v2-founder-rewards.json index 9fda74f5..577a07f1 100644 --- a/src/test/resources/test-chain-v2-founder-rewards.json +++ b/src/test/resources/test-chain-v2-founder-rewards.json @@ -24,6 +24,8 @@ "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV3SnapshotTimestamp": 9999999999999, + "referenceTimestampBlock": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -86,14 +88,14 @@ "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, + "selfSponsorshipAlgoV2Height": 999999999, + "selfSponsorshipAlgoV3Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, "unconfirmableRewardSharesHeight": 99999999, - "selfSponsorshipAlgoV2Height": 9999999, "disableTransferPrivsTimestamp": 9999999999500, - "enableTransferPrivsTimestamp": 9999999999950, - "penaltyFixHeight": 9999999 + "enableTransferPrivsTimestamp": 9999999999950 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-leftover-reward.json b/src/test/resources/test-chain-v2-leftover-reward.json index 20a85b8a..82e4ace7 100644 --- a/src/test/resources/test-chain-v2-leftover-reward.json +++ b/src/test/resources/test-chain-v2-leftover-reward.json @@ -24,6 +24,8 @@ "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV3SnapshotTimestamp": 9999999999999, + "referenceTimestampBlock": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -86,14 +88,14 @@ "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, + "selfSponsorshipAlgoV2Height": 999999999, + "selfSponsorshipAlgoV3Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, "unconfirmableRewardSharesHeight": 99999999, - "selfSponsorshipAlgoV2Height": 9999999, "disableTransferPrivsTimestamp": 9999999999500, - "enableTransferPrivsTimestamp": 9999999999950, - "penaltyFixHeight": 9999999 + "enableTransferPrivsTimestamp": 9999999999950 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-minting.json b/src/test/resources/test-chain-v2-minting.json index 7c28435a..16032a9c 100644 --- a/src/test/resources/test-chain-v2-minting.json +++ b/src/test/resources/test-chain-v2-minting.json @@ -24,6 +24,8 @@ "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV3SnapshotTimestamp": 9999999999999, + "referenceTimestampBlock": 9999999999999, "mempowTransactionUpdatesTimestamp": 9999999999999, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -86,14 +88,14 @@ "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, + "selfSponsorshipAlgoV2Height": 999999999, + "selfSponsorshipAlgoV3Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 9999999999999, "unconfirmableRewardSharesHeight": 99999999, - "selfSponsorshipAlgoV2Height": 9999999, "disableTransferPrivsTimestamp": 9999999999500, - "enableTransferPrivsTimestamp": 9999999999950, - "penaltyFixHeight": 9999999 + "enableTransferPrivsTimestamp": 9999999999950 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-qora-holder-extremes.json b/src/test/resources/test-chain-v2-qora-holder-extremes.json index 0372ba4f..3ec11942 100644 --- a/src/test/resources/test-chain-v2-qora-holder-extremes.json +++ b/src/test/resources/test-chain-v2-qora-holder-extremes.json @@ -24,6 +24,8 @@ "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV3SnapshotTimestamp": 9999999999999, + "referenceTimestampBlock": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -86,14 +88,14 @@ "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, + "selfSponsorshipAlgoV2Height": 999999999, + "selfSponsorshipAlgoV3Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, "unconfirmableRewardSharesHeight": 99999999, - "selfSponsorshipAlgoV2Height": 9999999, "disableTransferPrivsTimestamp": 9999999999500, - "enableTransferPrivsTimestamp": 9999999999950, - "penaltyFixHeight": 9999999 + "enableTransferPrivsTimestamp": 9999999999950 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-qora-holder-reduction.json b/src/test/resources/test-chain-v2-qora-holder-reduction.json index 9fbeb317..2b8834ce 100644 --- a/src/test/resources/test-chain-v2-qora-holder-reduction.json +++ b/src/test/resources/test-chain-v2-qora-holder-reduction.json @@ -24,6 +24,8 @@ "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV3SnapshotTimestamp": 9999999999999, + "referenceTimestampBlock": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -87,14 +89,14 @@ "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, + "selfSponsorshipAlgoV2Height": 999999999, + "selfSponsorshipAlgoV3Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, "unconfirmableRewardSharesHeight": 99999999, - "selfSponsorshipAlgoV2Height": 9999999, "disableTransferPrivsTimestamp": 9999999999500, - "enableTransferPrivsTimestamp": 9999999999950, - "penaltyFixHeight": 9999999 + "enableTransferPrivsTimestamp": 9999999999950 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-qora-holder.json b/src/test/resources/test-chain-v2-qora-holder.json index e9a2b485..ab96a243 100644 --- a/src/test/resources/test-chain-v2-qora-holder.json +++ b/src/test/resources/test-chain-v2-qora-holder.json @@ -24,6 +24,8 @@ "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV3SnapshotTimestamp": 9999999999999, + "referenceTimestampBlock": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -86,14 +88,14 @@ "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, + "selfSponsorshipAlgoV2Height": 999999999, + "selfSponsorshipAlgoV3Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, "unconfirmableRewardSharesHeight": 99999999, - "selfSponsorshipAlgoV2Height": 9999999, "disableTransferPrivsTimestamp": 9999999999500, - "enableTransferPrivsTimestamp": 9999999999950, - "penaltyFixHeight": 9999999 + "enableTransferPrivsTimestamp": 9999999999950 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-reward-levels.json b/src/test/resources/test-chain-v2-reward-levels.json index b4993aee..35535c75 100644 --- a/src/test/resources/test-chain-v2-reward-levels.json +++ b/src/test/resources/test-chain-v2-reward-levels.json @@ -24,6 +24,8 @@ "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV3SnapshotTimestamp": 9999999999999, + "referenceTimestampBlock": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -86,14 +88,14 @@ "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, + "selfSponsorshipAlgoV2Height": 999999999, + "selfSponsorshipAlgoV3Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, "unconfirmableRewardSharesHeight": 99999999, - "selfSponsorshipAlgoV2Height": 9999999, "disableTransferPrivsTimestamp": 9999999999500, - "enableTransferPrivsTimestamp": 9999999999950, - "penaltyFixHeight": 9999999 + "enableTransferPrivsTimestamp": 9999999999950 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-reward-scaling.json b/src/test/resources/test-chain-v2-reward-scaling.json index 4c3595bf..616d0925 100644 --- a/src/test/resources/test-chain-v2-reward-scaling.json +++ b/src/test/resources/test-chain-v2-reward-scaling.json @@ -24,6 +24,8 @@ "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV3SnapshotTimestamp": 9999999999999, + "referenceTimestampBlock": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -86,14 +88,14 @@ "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, + "selfSponsorshipAlgoV2Height": 999999999, + "selfSponsorshipAlgoV3Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, "unconfirmableRewardSharesHeight": 500, - "selfSponsorshipAlgoV2Height": 9999999, "disableTransferPrivsTimestamp": 9999999999500, - "enableTransferPrivsTimestamp": 9999999999950, - "penaltyFixHeight": 9999999 + "enableTransferPrivsTimestamp": 9999999999950 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-reward-shares.json b/src/test/resources/test-chain-v2-reward-shares.json index 243a3ead..ec6ffd2e 100644 --- a/src/test/resources/test-chain-v2-reward-shares.json +++ b/src/test/resources/test-chain-v2-reward-shares.json @@ -23,6 +23,8 @@ "onlineAccountSignaturesMaxLifetime": 86400000, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV3SnapshotTimestamp": 9999999999999, + "referenceTimestampBlock": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -86,14 +88,14 @@ "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, + "selfSponsorshipAlgoV2Height": 999999999, + "selfSponsorshipAlgoV3Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, "unconfirmableRewardSharesHeight": 99999999, - "selfSponsorshipAlgoV2Height": 9999999, "disableTransferPrivsTimestamp": 9999999999500, - "enableTransferPrivsTimestamp": 9999999999950, - "penaltyFixHeight": 9999999 + "enableTransferPrivsTimestamp": 9999999999950 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-self-sponsorship-algo-v1.json b/src/test/resources/test-chain-v2-self-sponsorship-algo-v1.json index caf8ffe7..d0d989cf 100644 --- a/src/test/resources/test-chain-v2-self-sponsorship-algo-v1.json +++ b/src/test/resources/test-chain-v2-self-sponsorship-algo-v1.json @@ -24,6 +24,8 @@ "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV3SnapshotTimestamp": 9999999999999, + "referenceTimestampBlock": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -86,14 +88,14 @@ "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 20, + "selfSponsorshipAlgoV2Height": 999999999, + "selfSponsorshipAlgoV3Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, "unconfirmableRewardSharesHeight": 99999999, - "selfSponsorshipAlgoV2Height": 9999999, "disableTransferPrivsTimestamp": 9999999999500, - "enableTransferPrivsTimestamp": 9999999999950, - "penaltyFixHeight": 9999999 + "enableTransferPrivsTimestamp": 9999999999950 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-chain-v2-self-sponsorship-algo-v2.json b/src/test/resources/test-chain-v2-self-sponsorship-algo-v2.json new file mode 100644 index 00000000..5f09cb47 --- /dev/null +++ b/src/test/resources/test-chain-v2-self-sponsorship-algo-v2.json @@ -0,0 +1,132 @@ +{ + "isTestChain": true, + "blockTimestampMargin": 500, + "transactionExpiryPeriod": 86400000, + "maxBlockSize": 2097152, + "maxBytesPerUnitFee": 0, + "unitFees": [ + { "timestamp": 0, "fee": "0.00000001" } + ], + "nameRegistrationUnitFees": [ + { "timestamp": 0, "fee": "0.00000001" }, + { "timestamp": 1645372800000, "fee": "5" } + ], + "requireGroupForApproval": false, + "minAccountLevelToRewardShare": 5, + "maxRewardSharesPerFounderMintingAccount": 20, + "maxRewardSharesByTimestamp": [ + { "timestamp": 0, "maxShares": 20 }, + { "timestamp": 9999999999999, "maxShares": 3 } + ], + "founderEffectiveMintingLevel": 10, + "onlineAccountSignaturesMinLifetime": 3600000, + "onlineAccountSignaturesMaxLifetime": 86400000, + "onlineAccountsModulusV2Timestamp": 9999999999999, + "selfSponsorshipAlgoV1SnapshotTimestamp": 0, + "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV3SnapshotTimestamp": 9999999999999, + "referenceTimestampBlock": 9999999999999, + "mempowTransactionUpdatesTimestamp": 0, + "blockRewardBatchStartHeight": 999999000, + "blockRewardBatchSize": 10, + "blockRewardBatchAccountsBlockCount": 3, + "rewardsByHeight": [ + { "height": 1, "reward": 100 }, + { "height": 11, "reward": 10 }, + { "height": 21, "reward": 1 } + ], + "sharesByLevelV1": [ + { "id": 1, "levels": [ 1, 2 ], "share": 0.05 }, + { "id": 2, "levels": [ 3, 4 ], "share": 0.10 }, + { "id": 3, "levels": [ 5, 6 ], "share": 0.15 }, + { "id": 4, "levels": [ 7, 8 ], "share": 0.20 }, + { "id": 5, "levels": [ 9, 10 ], "share": 0.25 } + ], + "sharesByLevelV2": [ + { "id": 1, "levels": [ 1, 2 ], "share": 0.06 }, + { "id": 2, "levels": [ 3, 4 ], "share": 0.13 }, + { "id": 3, "levels": [ 5, 6 ], "share": 0.19 }, + { "id": 4, "levels": [ 7, 8 ], "share": 0.26 }, + { "id": 5, "levels": [ 9, 10 ], "share": 0.32 } + ], + "qoraHoldersShareByHeight": [ + { "height": 1, "share": 0.20 }, + { "height": 1000000, "share": 0.01 } + ], + "qoraPerQortReward": 250, + "minAccountsToActivateShareBin": 0, + "shareBinActivationMinLevel": 7, + "blocksNeededByLevel": [ 5, 20, 30, 40, 50, 60, 18, 80, 90, 100 ], + "blockTimingsByHeight": [ + { "height": 1, "target": 60000, "deviation": 30000, "power": 0.2 } + ], + "ciyamAtSettings": { + "feePerStep": "0.0001", + "maxStepsPerRound": 500, + "stepsPerFunctionCall": 10, + "minutesPerBlock": 1 + }, + "featureTriggers": { + "messageHeight": 0, + "atHeight": 0, + "assetsTimestamp": 0, + "votingTimestamp": 0, + "arbitraryTimestamp": 0, + "powfixTimestamp": 0, + "qortalTimestamp": 0, + "newAssetPricingTimestamp": 0, + "groupApprovalTimestamp": 0, + "atFindNextTransactionFix": 0, + "newBlockSigHeight": 999999, + "shareBinFix": 999999, + "sharesByLevelV2Height": 999999, + "rewardShareLimitTimestamp": 9999999999999, + "calcChainWeightTimestamp": 0, + "transactionV5Timestamp": 0, + "transactionV6Timestamp": 0, + "disableReferenceTimestamp": 9999999999999, + "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, + "onlineAccountMinterLevelValidationHeight": 0, + "selfSponsorshipAlgoV1Height": 999999999, + "selfSponsorshipAlgoV2Height": 30, + "selfSponsorshipAlgoV3Height": 999999999, + "feeValidationFixTimestamp": 0, + "chatReferenceTimestamp": 0, + "arbitraryOptionalFeeTimestamp": 0, + "unconfirmableRewardSharesHeight": 99999999, + "disableTransferPrivsTimestamp": 9999999999500, + "enableTransferPrivsTimestamp": 9999999999950 + }, + "genesisInfo": { + "version": 4, + "timestamp": 0, + "transactions": [ + { "type": "ISSUE_ASSET", "assetName": "QORT", "description": "QORT native coin", "data": "", "quantity": 0, "isDivisible": true, "fee": 0 }, + { "type": "ISSUE_ASSET", "assetName": "Legacy-QORA", "description": "Representative legacy QORA", "quantity": 0, "isDivisible": true, "data": "{}", "isUnspendable": true }, + { "type": "ISSUE_ASSET", "assetName": "QORT-from-QORA", "description": "QORT gained from holding legacy QORA", "quantity": 0, "isDivisible": true, "data": "{}", "isUnspendable": true }, + + { "type": "GENESIS", "recipient": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "amount": "1000000000" }, + { "type": "GENESIS", "recipient": "QixPbJUwsaHsVEofJdozU9zgVqkK6aYhrK", "amount": "1000000" }, + { "type": "GENESIS", "recipient": "QaUpHNhT3Ygx6avRiKobuLdusppR5biXjL", "amount": "1000000" }, + { "type": "GENESIS", "recipient": "Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er", "amount": "1000000" }, + + { "type": "CREATE_GROUP", "creatorPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "groupName": "dev-group", "description": "developer group", "isOpen": false, "approvalThreshold": "PCT100", "minimumBlockDelay": 0, "maximumBlockDelay": 1440 }, + + { "type": "UPDATE_GROUP", "ownerPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "groupId": 1, "newOwner": "QdSnUy6sUiEnaN87dWmE92g1uQjrvPgrWG", "newDescription": "developer group", "newIsOpen": false, "newApprovalThreshold": "PCT40", "minimumBlockDelay": 10, "maximumBlockDelay": 1440 }, + + { "type": "ISSUE_ASSET", "issuerPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "assetName": "TEST", "description": "test asset", "data": "", "quantity": "1000000", "isDivisible": true, "fee": 0 }, + { "type": "ISSUE_ASSET", "issuerPublicKey": "C6wuddsBV3HzRrXUtezE7P5MoRXp5m3mEDokRDGZB6ry", "assetName": "OTHER", "description": "other test asset", "data": "", "quantity": "1000000", "isDivisible": true, "fee": 0 }, + { "type": "ISSUE_ASSET", "issuerPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "assetName": "GOLD", "description": "gold test asset", "data": "", "quantity": "1000000", "isDivisible": true, "fee": 0 }, + + { "type": "ACCOUNT_FLAGS", "target": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "REWARD_SHARE", "minterPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "recipient": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "rewardSharePublicKey": "7PpfnvLSG7y4HPh8hE7KoqAjLCkv7Ui6xw4mKAkbZtox", "sharePercent": "100" }, + + { "type": "ACCOUNT_LEVEL", "target": "QixPbJUwsaHsVEofJdozU9zgVqkK6aYhrK", "level": 5 }, + { "type": "REWARD_SHARE", "minterPublicKey": "C6wuddsBV3HzRrXUtezE7P5MoRXp5m3mEDokRDGZB6ry", "recipient": "QixPbJUwsaHsVEofJdozU9zgVqkK6aYhrK", "rewardSharePublicKey": "CcABzvk26TFEHG7Yok84jxyd4oBtLkx8RJdGFVz2csvp", "sharePercent": 100 }, + + { "type": "ACCOUNT_LEVEL", "target": "Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QaUpHNhT3Ygx6avRiKobuLdusppR5biXjL", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er", "level": 6 } + ] + } +} diff --git a/src/test/resources/test-chain-v2-self-sponsorship-algo-v3.json b/src/test/resources/test-chain-v2-self-sponsorship-algo-v3.json new file mode 100644 index 00000000..f7d1faa2 --- /dev/null +++ b/src/test/resources/test-chain-v2-self-sponsorship-algo-v3.json @@ -0,0 +1,132 @@ +{ + "isTestChain": true, + "blockTimestampMargin": 500, + "transactionExpiryPeriod": 86400000, + "maxBlockSize": 2097152, + "maxBytesPerUnitFee": 0, + "unitFees": [ + { "timestamp": 0, "fee": "0.00000001" } + ], + "nameRegistrationUnitFees": [ + { "timestamp": 0, "fee": "0.00000001" }, + { "timestamp": 1645372800000, "fee": "5" } + ], + "requireGroupForApproval": false, + "minAccountLevelToRewardShare": 5, + "maxRewardSharesPerFounderMintingAccount": 20, + "maxRewardSharesByTimestamp": [ + { "timestamp": 0, "maxShares": 20 }, + { "timestamp": 9999999999999, "maxShares": 3 } + ], + "founderEffectiveMintingLevel": 10, + "onlineAccountSignaturesMinLifetime": 3600000, + "onlineAccountSignaturesMaxLifetime": 86400000, + "onlineAccountsModulusV2Timestamp": 9999999999999, + "selfSponsorshipAlgoV1SnapshotTimestamp": 0, + "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV3SnapshotTimestamp": 9999999999999, + "referenceTimestampBlock": 9999999999999, + "mempowTransactionUpdatesTimestamp": 0, + "blockRewardBatchStartHeight": 999999000, + "blockRewardBatchSize": 10, + "blockRewardBatchAccountsBlockCount": 3, + "rewardsByHeight": [ + { "height": 1, "reward": 100 }, + { "height": 11, "reward": 10 }, + { "height": 21, "reward": 1 } + ], + "sharesByLevelV1": [ + { "id": 1, "levels": [ 1, 2 ], "share": 0.05 }, + { "id": 2, "levels": [ 3, 4 ], "share": 0.10 }, + { "id": 3, "levels": [ 5, 6 ], "share": 0.15 }, + { "id": 4, "levels": [ 7, 8 ], "share": 0.20 }, + { "id": 5, "levels": [ 9, 10 ], "share": 0.25 } + ], + "sharesByLevelV2": [ + { "id": 1, "levels": [ 1, 2 ], "share": 0.06 }, + { "id": 2, "levels": [ 3, 4 ], "share": 0.13 }, + { "id": 3, "levels": [ 5, 6 ], "share": 0.19 }, + { "id": 4, "levels": [ 7, 8 ], "share": 0.26 }, + { "id": 5, "levels": [ 9, 10 ], "share": 0.32 } + ], + "qoraHoldersShareByHeight": [ + { "height": 1, "share": 0.20 }, + { "height": 1000000, "share": 0.01 } + ], + "qoraPerQortReward": 250, + "minAccountsToActivateShareBin": 0, + "shareBinActivationMinLevel": 7, + "blocksNeededByLevel": [ 5, 20, 30, 40, 50, 60, 28, 80, 90, 100 ], + "blockTimingsByHeight": [ + { "height": 1, "target": 60000, "deviation": 30000, "power": 0.2 } + ], + "ciyamAtSettings": { + "feePerStep": "0.0001", + "maxStepsPerRound": 500, + "stepsPerFunctionCall": 10, + "minutesPerBlock": 1 + }, + "featureTriggers": { + "messageHeight": 0, + "atHeight": 0, + "assetsTimestamp": 0, + "votingTimestamp": 0, + "arbitraryTimestamp": 0, + "powfixTimestamp": 0, + "qortalTimestamp": 0, + "newAssetPricingTimestamp": 0, + "groupApprovalTimestamp": 0, + "atFindNextTransactionFix": 0, + "newBlockSigHeight": 999999, + "shareBinFix": 999999, + "sharesByLevelV2Height": 999999, + "rewardShareLimitTimestamp": 9999999999999, + "calcChainWeightTimestamp": 0, + "transactionV5Timestamp": 0, + "transactionV6Timestamp": 0, + "disableReferenceTimestamp": 9999999999999, + "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, + "onlineAccountMinterLevelValidationHeight": 0, + "selfSponsorshipAlgoV1Height": 999999999, + "selfSponsorshipAlgoV2Height": 999999999, + "selfSponsorshipAlgoV3Height": 30, + "feeValidationFixTimestamp": 0, + "chatReferenceTimestamp": 0, + "arbitraryOptionalFeeTimestamp": 0, + "unconfirmableRewardSharesHeight": 99999999, + "disableTransferPrivsTimestamp": 9999999999500, + "enableTransferPrivsTimestamp": 9999999999950 + }, + "genesisInfo": { + "version": 4, + "timestamp": 0, + "transactions": [ + { "type": "ISSUE_ASSET", "assetName": "QORT", "description": "QORT native coin", "data": "", "quantity": 0, "isDivisible": true, "fee": 0 }, + { "type": "ISSUE_ASSET", "assetName": "Legacy-QORA", "description": "Representative legacy QORA", "quantity": 0, "isDivisible": true, "data": "{}", "isUnspendable": true }, + { "type": "ISSUE_ASSET", "assetName": "QORT-from-QORA", "description": "QORT gained from holding legacy QORA", "quantity": 0, "isDivisible": true, "data": "{}", "isUnspendable": true }, + + { "type": "GENESIS", "recipient": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "amount": "1000000000" }, + { "type": "GENESIS", "recipient": "QixPbJUwsaHsVEofJdozU9zgVqkK6aYhrK", "amount": "1000000" }, + { "type": "GENESIS", "recipient": "QaUpHNhT3Ygx6avRiKobuLdusppR5biXjL", "amount": "1000000" }, + { "type": "GENESIS", "recipient": "Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er", "amount": "1000000" }, + + { "type": "CREATE_GROUP", "creatorPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "groupName": "dev-group", "description": "developer group", "isOpen": false, "approvalThreshold": "PCT100", "minimumBlockDelay": 0, "maximumBlockDelay": 1440 }, + + { "type": "UPDATE_GROUP", "ownerPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "groupId": 1, "newOwner": "QdSnUy6sUiEnaN87dWmE92g1uQjrvPgrWG", "newDescription": "developer group", "newIsOpen": false, "newApprovalThreshold": "PCT40", "minimumBlockDelay": 10, "maximumBlockDelay": 1440 }, + + { "type": "ISSUE_ASSET", "issuerPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "assetName": "TEST", "description": "test asset", "data": "", "quantity": "1000000", "isDivisible": true, "fee": 0 }, + { "type": "ISSUE_ASSET", "issuerPublicKey": "C6wuddsBV3HzRrXUtezE7P5MoRXp5m3mEDokRDGZB6ry", "assetName": "OTHER", "description": "other test asset", "data": "", "quantity": "1000000", "isDivisible": true, "fee": 0 }, + { "type": "ISSUE_ASSET", "issuerPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "assetName": "GOLD", "description": "gold test asset", "data": "", "quantity": "1000000", "isDivisible": true, "fee": 0 }, + + { "type": "ACCOUNT_FLAGS", "target": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "andMask": -1, "orMask": 1, "xorMask": 0 }, + { "type": "REWARD_SHARE", "minterPublicKey": "2tiMr5LTpaWCgbRvkPK8TFd7k63DyHJMMFFsz9uBf1ZP", "recipient": "QgV4s3xnzLhVBEJxcYui4u4q11yhUHsd9v", "rewardSharePublicKey": "7PpfnvLSG7y4HPh8hE7KoqAjLCkv7Ui6xw4mKAkbZtox", "sharePercent": "100" }, + + { "type": "ACCOUNT_LEVEL", "target": "QixPbJUwsaHsVEofJdozU9zgVqkK6aYhrK", "level": 5 }, + { "type": "REWARD_SHARE", "minterPublicKey": "C6wuddsBV3HzRrXUtezE7P5MoRXp5m3mEDokRDGZB6ry", "recipient": "QixPbJUwsaHsVEofJdozU9zgVqkK6aYhrK", "rewardSharePublicKey": "CcABzvk26TFEHG7Yok84jxyd4oBtLkx8RJdGFVz2csvp", "sharePercent": 100 }, + + { "type": "ACCOUNT_LEVEL", "target": "Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "QaUpHNhT3Ygx6avRiKobuLdusppR5biXjL", "level": 5 }, + { "type": "ACCOUNT_LEVEL", "target": "Qci5m9k4rcwe4ruKrZZQKka4FzUUMut3er", "level": 6 } + ] + } +} diff --git a/src/test/resources/test-chain-v2.json b/src/test/resources/test-chain-v2.json index f867aa46..542c0cf8 100644 --- a/src/test/resources/test-chain-v2.json +++ b/src/test/resources/test-chain-v2.json @@ -25,6 +25,8 @@ "onlineAccountsModulusV2Timestamp": 9999999999999, "selfSponsorshipAlgoV1SnapshotTimestamp": 9999999999999, "selfSponsorshipAlgoV2SnapshotTimestamp": 9999999999999, + "selfSponsorshipAlgoV3SnapshotTimestamp": 9999999999999, + "referenceTimestampBlock": 9999999999999, "mempowTransactionUpdatesTimestamp": 0, "blockRewardBatchStartHeight": 999999000, "blockRewardBatchSize": 10, @@ -87,14 +89,14 @@ "increaseOnlineAccountsDifficultyTimestamp": 9999999999999, "onlineAccountMinterLevelValidationHeight": 0, "selfSponsorshipAlgoV1Height": 999999999, + "selfSponsorshipAlgoV2Height": 999999999, + "selfSponsorshipAlgoV3Height": 999999999, "feeValidationFixTimestamp": 0, "chatReferenceTimestamp": 0, "arbitraryOptionalFeeTimestamp": 0, "unconfirmableRewardSharesHeight": 99999999, - "selfSponsorshipAlgoV2Height": 9999999, "disableTransferPrivsTimestamp": 9999999999500, - "enableTransferPrivsTimestamp": 9999999999950, - "penaltyFixHeight": 9999999 + "enableTransferPrivsTimestamp": 9999999999950 }, "genesisInfo": { "version": 4, diff --git a/src/test/resources/test-settings-v2-self-sponsorship-algo-v2.json b/src/test/resources/test-settings-v2-self-sponsorship-algo-v2.json new file mode 100644 index 00000000..430586fa --- /dev/null +++ b/src/test/resources/test-settings-v2-self-sponsorship-algo-v2.json @@ -0,0 +1,20 @@ +{ + "repositoryPath": "testdb", + "bitcoinNet": "TEST3", + "litecoinNet": "TEST3", + "restrictedApi": false, + "blockchainConfig": "src/test/resources/test-chain-v2-self-sponsorship-algo-v2.json", + "exportPath": "qortal-backup-test", + "bootstrap": false, + "wipeUnconfirmedOnStart": false, + "testNtpOffset": 0, + "minPeers": 0, + "pruneBlockLimit": 100, + "bootstrapFilenamePrefix": "test-", + "dataPath": "data-test", + "tempDataPath": "data-test/_temp", + "listsPath": "lists-test", + "storagePolicy": "FOLLOWED_OR_VIEWED", + "maxStorageCapacity": 104857600, + "arrrDefaultBirthday": 1900000 +} diff --git a/src/test/resources/test-settings-v2-self-sponsorship-algo-v3.json b/src/test/resources/test-settings-v2-self-sponsorship-algo-v3.json new file mode 100644 index 00000000..0579b1e1 --- /dev/null +++ b/src/test/resources/test-settings-v2-self-sponsorship-algo-v3.json @@ -0,0 +1,20 @@ +{ + "repositoryPath": "testdb", + "bitcoinNet": "TEST3", + "litecoinNet": "TEST3", + "restrictedApi": false, + "blockchainConfig": "src/test/resources/test-chain-v2-self-sponsorship-algo-v3.json", + "exportPath": "qortal-backup-test", + "bootstrap": false, + "wipeUnconfirmedOnStart": false, + "testNtpOffset": 0, + "minPeers": 0, + "pruneBlockLimit": 100, + "bootstrapFilenamePrefix": "test-", + "dataPath": "data-test", + "tempDataPath": "data-test/_temp", + "listsPath": "lists-test", + "storagePolicy": "FOLLOWED_OR_VIEWED", + "maxStorageCapacity": 104857600, + "arrrDefaultBirthday": 1900000 +} From c4a7fb3b926196ebff10c5e23532c7bde8e1bca8 Mon Sep 17 00:00:00 2001 From: AlphaX-Projects <77661270+AlphaX-Projects@users.noreply.github.com> Date: Sun, 18 Feb 2024 18:14:33 +0100 Subject: [PATCH 45/47] Bump version to 4.5.1 --- pom.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index eb797523..bbc044a2 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.qortal qortal - 4.5.0 + 4.5.1 jar true @@ -21,7 +21,7 @@ 1.2.2 0.12.3 4.9.10 - 1.61.0 + 1.61.1 33.0.0-jre 2.2 1.2.1 @@ -31,9 +31,9 @@ 4.0.1 2.3.9 2.41 - 9.4.53.v20231009 + 9.4.54.v20240208 1.1.1 - 20231013 + 20240205 1.17.2 5.10.0 1.0.0 @@ -46,7 +46,7 @@ 3.2.5 1.1.0 UTF-8 - 3.25.1 + 3.25.2 1.5.3 0.16 1.17 From 0c8c72209789b1be89bb897a39df55fd08f36df5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrg=20Schulthess?= Date: Sun, 24 Mar 2024 18:24:13 +0100 Subject: [PATCH 46/47] initial (almost) phase-1 reticulum implementation --- .../1.0-SNAPSHOT/maven-metadata-local.xml | 24 + .../reticulum-network-stack-1.0-SNAPSHOT.jar | Bin 0 -> 295557 bytes .../reticulum-network-stack-1.0-SNAPSHOT.pom | 9 + .../maven-metadata-local.xml | 11 + pom.xml | 113 +++++ .../org/qortal/controller/Controller.java | 28 ++ .../java/org/qortal/network/RNSNetwork.java | 425 ++++++++++++++++++ src/main/java/org/qortal/network/RNSPeer.java | 110 +++++ .../resources/reticulum_default_config.yml | 93 ++++ .../qortal/test/network/RNSNetworTest.java | 70 +++ 10 files changed, 883 insertions(+) create mode 100644 lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/maven-metadata-local.xml create mode 100644 lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/reticulum-network-stack-1.0-SNAPSHOT.jar create mode 100644 lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/reticulum-network-stack-1.0-SNAPSHOT.pom create mode 100644 lib/io/reticulum/reticulum-network-stack/maven-metadata-local.xml create mode 100644 src/main/java/org/qortal/network/RNSNetwork.java create mode 100644 src/main/java/org/qortal/network/RNSPeer.java create mode 100644 src/main/resources/reticulum_default_config.yml create mode 100644 src/test/java/org/qortal/test/network/RNSNetworTest.java diff --git a/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/maven-metadata-local.xml b/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/maven-metadata-local.xml new file mode 100644 index 00000000..111dbbcc --- /dev/null +++ b/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/maven-metadata-local.xml @@ -0,0 +1,24 @@ + + + io.reticulum + reticulum-network-stack + 1.0-SNAPSHOT + + + true + + 20240324170649 + + + jar + 1.0-SNAPSHOT + 20240324170649 + + + pom + 1.0-SNAPSHOT + 20240324170649 + + + + diff --git a/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/reticulum-network-stack-1.0-SNAPSHOT.jar b/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/reticulum-network-stack-1.0-SNAPSHOT.jar new file mode 100644 index 0000000000000000000000000000000000000000..7612e6ad1a054191b0813c30f9cacbd7f11d56a1 GIT binary patch literal 295557 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 z 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 literal 0 HcmV?d00001 diff --git a/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/reticulum-network-stack-1.0-SNAPSHOT.pom b/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/reticulum-network-stack-1.0-SNAPSHOT.pom new file mode 100644 index 00000000..1b1cc206 --- /dev/null +++ b/lib/io/reticulum/reticulum-network-stack/1.0-SNAPSHOT/reticulum-network-stack-1.0-SNAPSHOT.pom @@ -0,0 +1,9 @@ + + + 4.0.0 + io.reticulum + reticulum-network-stack + 1.0-SNAPSHOT + POM was created from install:install-file + diff --git a/lib/io/reticulum/reticulum-network-stack/maven-metadata-local.xml b/lib/io/reticulum/reticulum-network-stack/maven-metadata-local.xml new file mode 100644 index 00000000..6ff327fb --- /dev/null +++ b/lib/io/reticulum/reticulum-network-stack/maven-metadata-local.xml @@ -0,0 +1,11 @@ + + + io.reticulum + reticulum-network-stack + + + 1.0-SNAPSHOT + + 20240324170649 + + diff --git a/pom.xml b/pom.xml index bbc044a2..28061bbb 100644 --- a/pom.xml +++ b/pom.xml @@ -6,6 +6,10 @@ 4.5.1 jar + true 7dc8c6f 0.15.10 @@ -56,6 +60,8 @@ 1.2 2.16.2 1.9 + 1.18.30 + 2.14.3 src/main/java @@ -103,6 +109,14 @@ ${project.build.directory}/swagger-ui.unpacked + @@ -373,6 +387,11 @@ ${maven-surefire-plugin.version} ${skipTests} + + + --add-opens=java.base/java.lang=ALL-UNNAMED + --add-opens=java.base/java.util=ALL-UNNAMED + @@ -441,6 +460,10 @@ jitpack.io https://jitpack.io + + true + always + @@ -780,5 +803,95 @@ jaxb-runtime ${jaxb-runtime.version} + + io.reticulum + reticulum-network-stack + 1.0-SNAPSHOT + + + + + com.fasterxml.jackson.dataformat + jackson-dataformat-yaml + ${jackson.version} + + + com.fasterxml.jackson.core + jackson-databind + ${jackson.version} + + + org.projectlombok + lombok + ${lombok.version} + provided + + + commons-codec + commons-codec + 1.15 + + + org.apache.commons + commons-collections4 + 4.4 + + + org.msgpack + jackson-dataformat-msgpack + 0.9.3 + + + + + + io.netty + netty-all + 4.1.92.Final + + + org.bouncycastle + bcpkix-jdk15on + 1.69 + + + com.macasaet.fernet + fernet-java8 + 1.4.2 + + + org.apache.commons + commons-compress + 1.25.0 + + + com.igormaznitsa + jbbp + 2.0.4 + + + com.github.seancfoley + ipaddress + 5.4.0 + + + org.msgpack + msgpack-core + 0.9.6 + + diff --git a/src/main/java/org/qortal/controller/Controller.java b/src/main/java/org/qortal/controller/Controller.java index 6d2562ab..c1e0e279 100644 --- a/src/main/java/org/qortal/controller/Controller.java +++ b/src/main/java/org/qortal/controller/Controller.java @@ -31,6 +31,7 @@ import org.qortal.globalization.Translator; import org.qortal.gui.Gui; import org.qortal.gui.SysTray; import org.qortal.network.Network; +import org.qortal.network.RNSNetwork; import org.qortal.network.Peer; import org.qortal.network.message.*; import org.qortal.repository.*; @@ -115,6 +116,7 @@ public class Controller extends Thread { private long repositoryCheckpointTimestamp = startTime; // ms private long prunePeersTimestamp = startTime; // ms private long ntpCheckTimestamp = startTime; // ms + private long pruneRNSPeersTimestamp = startTime; // ms private long deleteExpiredTimestamp = startTime + DELETE_EXPIRED_INTERVAL; // ms /** Whether we can mint new blocks, as reported by BlockMinter. */ @@ -481,6 +483,15 @@ public class Controller extends Thread { return; // Not System.exit() so that GUI can display error } + LOGGER.info("Starting Reticulum"); + try { + RNSNetwork rns = RNSNetwork.getInstance(); + rns.start(); + LOGGER.debug("Reticulum instance: {}", rns.toString()); + } catch (IOException | DataException e) { + LOGGER.error("Unable to start Reticulum", e); + } + Runtime.getRuntime().addShutdownHook(new Thread() { @Override public void run() { @@ -582,6 +593,8 @@ public class Controller extends Thread { final long repositoryCheckpointInterval = Settings.getInstance().getRepositoryCheckpointInterval(); long repositoryMaintenanceInterval = getRandomRepositoryMaintenanceInterval(); final long prunePeersInterval = 5 * 60 * 1000L; // Every 5 minutes + //final long pruneRNSPeersInterval = 5 * 60 * 1000L; // Every 5 minutes + final long pruneRNSPeersInterval = 1 * 60 * 1000L; // Every 1 minute (during development) // Start executor service for trimming or pruning PruneManager.getInstance().start(); @@ -690,6 +703,18 @@ public class Controller extends Thread { } } + // Q: Do we need global pruning? + if (now >= pruneRNSPeersTimestamp + pruneRNSPeersInterval) { + pruneRNSPeersTimestamp = now + pruneRNSPeersInterval; + + try { + LOGGER.debug("Pruning Reticulum peers..."); + RNSNetwork.getInstance().prunePeers(); + } catch (DataException e) { + LOGGER.warn(String.format("Repository issue when trying to prune Reticulum peers: %s", e.getMessage())); + } + } + // Delete expired transactions if (now >= deleteExpiredTimestamp) { deleteExpiredTimestamp = now + DELETE_EXPIRED_INTERVAL; @@ -988,6 +1013,9 @@ public class Controller extends Thread { LOGGER.info("Shutting down networking"); Network.getInstance().shutdown(); + LOGGER.info("Shutting down Reticulum"); + RNSNetwork.getInstance().shutdown(); + LOGGER.info("Shutting down controller"); this.interrupt(); try { diff --git a/src/main/java/org/qortal/network/RNSNetwork.java b/src/main/java/org/qortal/network/RNSNetwork.java new file mode 100644 index 00000000..2472c891 --- /dev/null +++ b/src/main/java/org/qortal/network/RNSNetwork.java @@ -0,0 +1,425 @@ +package org.qortal.network; + +import java.io.IOException; +//import java.nio.channels.SelectionKey; +//import java.io.Paths; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.io.File; +import java.util.*; +//import java.util.function.BiConsumer; +//import java.util.function.Consumer; +//import java.util.function.Function; +//import java.util.concurrent.*; +//import java.util.concurrent.atomic.AtomicLong; + +//import org.qortal.data.network.PeerData; +import org.qortal.repository.DataException; +//import org.qortal.settings.Settings; +import org.qortal.settings.Settings; +//import org.qortal.utils.NTP; + +//import com.fasterxml.jackson.annotation.JsonGetter; + +import org.apache.commons.codec.binary.Hex; +//import org.slf4j.Logger; +//import org.slf4j.LoggerFactory; +import io.reticulum.Reticulum; +import io.reticulum.Transport; +import io.reticulum.destination.Destination; +import io.reticulum.destination.DestinationType; +import io.reticulum.destination.Direction; +import io.reticulum.identity.Identity; +import io.reticulum.interfaces.ConnectionInterface; +import io.reticulum.destination.ProofStrategy; +import io.reticulum.transport.AnnounceHandler; +import static io.reticulum.constant.ReticulumConstant.CONFIG_FILE_NAME; +//import static io.reticulum.identity.IdentityKnownDestination.recall; +//import static io.reticulum.identity.IdentityKnownDestination.recallAppData; +//import static io.reticulum.destination.Direction.OUT; + +import lombok.extern.slf4j.Slf4j; +import lombok.Synchronized; +import io.reticulum.link.Link; +import io.reticulum.link.LinkStatus; +//import io.reticulum.packet.PacketReceipt; +import io.reticulum.packet.Packet; + +//import static io.reticulum.link.LinkStatus.ACTIVE; +import static io.reticulum.link.LinkStatus.CLOSED; +import static io.reticulum.link.LinkStatus.PENDING; +import static io.reticulum.link.LinkStatus.STALE; + +import static java.nio.charset.StandardCharsets.UTF_8; +//import static java.util.Objects.isNull; +import static java.util.Objects.nonNull; + +//import org.qortal.network.Network.NetworkProcessor; +//import org.qortal.utils.ExecuteProduceConsume; +//import org.qortal.utils.NamedThreadFactory; + +//import java.time.Instant; + +//import org.qortal.network.RNSPeer; + +@Slf4j +public class RNSNetwork { + + static final String APP_NAME = "qortal"; + private Reticulum reticulum; + private Identity server_identity; + private Destination baseDestination; // service base (initially: anything node2node) + //private Destination dataDestination; // qdn services (eg. files like music, videos etc) + //private Destination liveDestination; // live/dynamic peer list (eg. video conferencing) + // the following should be retrieved from settings + private static Integer MAX_PEERS = 3; + private static Integer MIN_DESIRED_PEERS = 3; + //private final Integer MAX_PEERS = Settings.getInstance().getMaxReticulumPeers(); + //private final Integer MIN_DESIRED_PEERS = Settings.getInstance().getMinDesiredReticulumPeers(); + static final String defaultConfigPath = new String(".reticulum"); // if empty will look in Reticulums default paths + //private final String defaultConfigPath = Settings.getInstance().getDefaultConfigPathForReticulum(); + + //private static final Logger logger = LoggerFactory.getLogger(RNSNetwork.class); + + //private final List linkedPeers = Collections.synchronizedList(new ArrayList<>()); + //private List immutableLinkedPeers = Collections.emptyList(); + private final List linkedPeers = Collections.synchronizedList(new ArrayList<>()); + + //private final ExecuteProduceConsume rnsNetworkEPC; + private static final long NETWORK_EPC_KEEPALIVE = 1000L; // 1 second + private volatile boolean isShuttingDown = false; + private int totalThreadCount = 0; + + // TODO: settings - MaxReticulumPeers, MaxRNSNetworkThreadPoolSize (if needed) + + // Constructor + private RNSNetwork () { + try { + initConfig(defaultConfigPath); + reticulum = new Reticulum(defaultConfigPath); + log.info("reticulum instance created: {}", reticulum.toString()); + } catch (IOException e) { + log.error("unable to create Reticulum network", e); + } + + // Settings.getInstance().getMaxRNSNetworkThreadPoolSize(), // statically set to 5 below + //ExecutorService RNSNetworkExecutor = new ThreadPoolExecutor(1, + // 5, + // NETWORK_EPC_KEEPALIVE, TimeUnit.SECONDS, + // new SynchronousQueue(), + // new NamedThreadFactory("RNSNetwork-EPC")); + //rnsNetworkEPC = new RNSNetworkProcessor(RNSNetworkExecutor); + } + + // Note: potentially create persistent server_identity (utility rnid) and load it from file + public void start() throws IOException, DataException { + + // create identity either from file or new (creating new keys) + var serverIdentityPath = reticulum.getStoragePath().resolve(APP_NAME); + if (Files.isReadable(serverIdentityPath)) { + server_identity = Identity.fromFile(serverIdentityPath); + log.info("server identity loaded from file {}", serverIdentityPath.toString()); + } else { + server_identity = new Identity(); + log.info("new server identity created dynamically."); + } + log.debug("Server Identity: {}", server_identity.toString()); + + // show the ifac_size of the configured interfaces (debug code) + for (ConnectionInterface i: Transport.getInstance().getInterfaces() ) { + log.info("interface {}, length: {}", i.getInterfaceName(), i.getIfacSize()); + } + + baseDestination = new Destination( + server_identity, + Direction.IN, + DestinationType.SINGLE, + APP_NAME, + "core" + ); + //// ideas for other entry points + //dataDestination = new Destination( + // server_identity, + // Direction.IN, + // DestinationType.SINGLE, + // APP_NAME, + // "core", + // "qdn" + //); + //liveDestination = new Destination( + // server_identity, + // Direction.IN, + // DestinationType.SINGLE, + // APP_NAME, + // "core", + // "live" + //); + log.info("Destination "+Hex.encodeHexString(baseDestination.getHash())+" "+baseDestination.getName()+" running."); + //log.info("Destination "+Hex.encodeHexString(dataDestination.getHash())+" "+dataDestination.getName()+" running."); + + baseDestination.setProofStrategy(ProofStrategy.PROVE_ALL); + //dataDestination.setProofStrategy(ProofStrategy.PROVE_ALL); + + baseDestination.setAcceptLinkRequests(true); + //dataDestination.setAcceptLinkRequests(true); + //baseDestination.setLinkEstablishedCallback(this::linkExtabishedCallback); + baseDestination.setPacketCallback(this::packetCallback); + //baseDestination.setPacketCallback((message, packet) -> { + // log.info("xyz - Message raw {}", message); + // log.info("xyz - Packet {}", packet.toString()); + //}); + + Transport.getInstance().registerAnnounceHandler(new QAnnounceHandler()); + log.info("announceHandlers: {}", Transport.getInstance().getAnnounceHandlers()); + + baseDestination.announce(); + //dataDestination.announce(); + log.info("Sent initial announce from {} ({})", Hex.encodeHexString(baseDestination.getHash()), baseDestination.getName()); + + // Start up first networking thread (the "server loop") + //rnsNetworkEPC.start(); + } + + public void shutdown() { + isShuttingDown = true; + log.info("shutting down Reticulum"); + + // Stop processing threads (the "server loop") + //try { + // if (!this.rnsNetworkEPC.shutdown(5000)) { + // logger.warn("Network threads failed to terminate"); + // } + //} catch (InterruptedException e) { + // logger.warn("Interrupted while waiting for networking threads to terminate"); + //} + + // Disconnect peers and terminate Reticulum + for (RNSPeer p : linkedPeers) { + if (nonNull(p.getLink())) { + p.getLink().teardown(); + } + } + reticulum.exitHandler(); + } + + private void initConfig(String configDir) throws IOException { + File configDir1 = new File(defaultConfigPath); + if (!configDir1.exists()) { + configDir1.mkdir(); + } + var configPath = Path.of(configDir1.getAbsolutePath()); + Path configFile = configPath.resolve(CONFIG_FILE_NAME); + + if (Files.notExists(configFile)) { + var defaultConfig = this.getClass().getClassLoader().getResourceAsStream("reticulum_default_config.yml"); + Files.copy(defaultConfig, configFile, StandardCopyOption.REPLACE_EXISTING); + } + } + + private void packetCallback(byte[] message, Packet packet) { + log.info("xyz - Message raw {}", message); + log.info("xyz - Packet {}", packet.toString()); + } + + //public void announceBaseDestination () { + // getBaseDestination().announce(); + //} + + //public Consumer clientConnected(Link link) { + // log.info("Client connected"); + // link.setLinkClosedCallback(clientDisconnected(link)); + // link.setPacketCallback(null); + //} + + //public void clientDisconnected(Link link) { + // log.info("Client disconnected"); + // linkedPeers.remove(link); + //} + + // client part + //@Slf4j + private static class QAnnounceHandler implements AnnounceHandler { + @Override + public String getAspectFilter() { + // handle all announces + return null; + } + + @Override + @Synchronized + public void receivedAnnounce(byte[] destinationHash, Identity announcedIdentity, byte[] appData) { + var peerExists = false; + + log.info("Received an announce from {}", Hex.encodeHexString(destinationHash)); + //log.info("aspect: {}", getAspectFilter()); + //log.info("destinationhash: {}, announcedIdentity: {}, appData: {}", destinationHash, announcedIdentity, appData); + + if (nonNull(appData)) { + log.debug("The announce contained the following app data: {}", new String(appData, UTF_8)); + } + + // add to peer list if we can use more peers + //synchronized (this) { + List lps = RNSNetwork.getInstance().getLinkedPeers(); + if (lps.size() < MAX_PEERS) { + for (RNSPeer p : lps) { + //log.info("peer exists: hash: {}, destinationHash: {}", p.getDestinationLink().getDestination().getHash(), destinationHash); + if (Arrays.equals(p.getDestinationLink().getDestination().getHash(), destinationHash)) { + peerExists = true; + log.debug("peer exists: hash: {}, destinationHash: {}", p.getDestinationLink().getDestination().getHash(), destinationHash); + break; + } + } + if (!peerExists) { + //log.info("announce handler - cerate new peer: **announcedIdentity**: {}, **recall**: {}", announcedIdentity, recall(destinationHash)); + RNSPeer newPeer = new RNSPeer(destinationHash); + lps.add(newPeer); + log.info("added new RNSPeer, Destination - {}, Link: {}", newPeer.getDestinationHash(), newPeer.getDestinationLink()); + } + } + //} + } + } + + // Main thread + + //class RNSNetworkProcessor extends ExecuteProduceConsume { + // + // //private final Logger logger = LoggerFactory.getLogger(RNSNetworkProcessor.class); + // + // private final AtomicLong nextConnectTaskTimestamp = new AtomicLong(0L); // ms - try first connect once NTP syncs + // private final AtomicLong nextBroadcastTimestamp = new AtomicLong(0L); // ms - try first broadcast once NTP syncs + // + // private Iterator channelIterator = null; + // + // RNSNetworkProcessor(ExecutorService executor) { + // super(executor); + // } + // + // @Override + // protected void onSpawnFailure() { + // // For debugging: + // // ExecutorDumper.dump(this.executor, 3, ExecuteProduceConsume.class); + // } + // + // @Override + // protected Task produceTask(boolean canBlock) throws InterruptedException { + // Task task; + // + // //task = maybeProducePeerMessageTask(); + // //if (task != null) { + // // return task; + // //} + // // + // //final Long now = NTP.getTime(); + // // + // //task = maybeProducePeerPingTask(now); + // //if (task != null) { + // // return task; + // //} + // // + // //task = maybeProduceConnectPeerTask(now); + // //if (task != null) { + // // return task; + // //} + // // + // //task = maybeProduceBroadcastTask(now); + // //if (task != null) { + // // return task; + // //} + // // + // // Only this method can block to reduce CPU spin + // //return maybeProduceChannelTask(canBlock); + // + // // TODO: flesh out the tasks handled by Reticulum + // return null; + // } + // //...TODO: implement abstract methods... + //} + + + // getter / setter + private static class SingletonContainer { + private static final RNSNetwork INSTANCE = new RNSNetwork(); + } + + public static RNSNetwork getInstance() { + return SingletonContainer.INSTANCE; + } + + public List getLinkedPeers() { + synchronized(this.linkedPeers) { + //return new ArrayList<>(this.linkedPeers); + return this.linkedPeers; + } + } + + public Integer getTotalPeers() { + synchronized (this) { + return linkedPeers.size(); + } + } + + public Destination getBaseDestination() { + return baseDestination; + } + + // maintenance + + //private static class AnnounceTimer { + // //public void main(String[] args) throws InterruptedException + // public void main(String[] args) throws InterruptedException + // { + // Timer timer = new Timer(); + // // run timer every 10s (10000ms) + // timer.schedule(new TimerTask() { + // @Override + // public void run() { + // System.out.println("AnnounceTimer: " + new java.util.Date()); + // } + // }, 0, 10000); + // } + //} + + @Synchronized + public void prunePeers() throws DataException { + // run periodically (by the Controller) + //log.info("Peer list (linkedPeers): {}",this.linkedPeers.toString()); + //synchronized(this) { + //List linkList = getLinkedPeers(); + List peerList = this.linkedPeers; + log.info("List of RNSPeers: {}", this.linkedPeers); + //log.info("number of links (linkedPeers) before prunig: {}", this.linkedPeers.size()); + Link pLink; + LinkStatus lStatus; + for (RNSPeer p: peerList) { + pLink = p.getLink(); + lStatus = pLink.getStatus(); + //log.debug("link status: "+lStatus.toString()); + // lStatus in: PENDING, HANDSHAKE, ACTIVE, STALE, CLOSED + if (lStatus == CLOSED) { + p.resetPeer(); + peerList.remove(p); + } else if (lStatus == STALE) { + pLink.teardown(); + p.resetPeer(); + peerList.remove(p); + } else if (lStatus == PENDING) { + log.info("prunePeers - link state still {}", lStatus); + // TODO: can we help the Link along somehow? + } + } + log.info("number of links (linkedPeers) after prunig: {}", this.linkedPeers.size()); + //} + maybeAnnounce(getBaseDestination()); + } + + public void maybeAnnounce(Destination d) { + if (getLinkedPeers().size() < MIN_DESIRED_PEERS) { + d.announce(); + } + } + +} + diff --git a/src/main/java/org/qortal/network/RNSPeer.java b/src/main/java/org/qortal/network/RNSPeer.java new file mode 100644 index 00000000..871bb347 --- /dev/null +++ b/src/main/java/org/qortal/network/RNSPeer.java @@ -0,0 +1,110 @@ +package org.qortal.network; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import static java.util.Objects.isNull; + +import org.qortal.network.RNSNetwork; +import io.reticulum.link.Link; +import io.reticulum.packet.Packet; +import io.reticulum.identity.Identity; +import io.reticulum.channel.Channel; +import io.reticulum.destination.Destination; +import io.reticulum.destination.DestinationType; +import io.reticulum.destination.Direction; + +import static io.reticulum.identity.IdentityKnownDestination.recall; +//import static io.reticulum.identity.IdentityKnownDestination.recallAppData; +import lombok.extern.slf4j.Slf4j; +import lombok.Setter; +import lombok.Data; +import lombok.AccessLevel; + +@Data +@Slf4j +public class RNSPeer { + + private byte[] destinationHash; + private Link destinationLink; + private Identity destinationIdentity; + @Setter(AccessLevel.PACKAGE) private long creationTimestamp; + private Long lastAccessTimestamp; + + // constructors + public RNSPeer (byte[] dhash) { + this.destinationHash = dhash; + this.destinationIdentity = recall(dhash); + Link newLink = new Link( + new Destination( + this.destinationIdentity, + Direction.OUT, + DestinationType.SINGLE, + RNSNetwork.APP_NAME, + "core" + ) + ); + this.destinationLink = newLink; + destinationLink.setPacketCallback(this::packetCallback); + } + + public RNSPeer (Link newLink) { + this.destinationHash = newLink.getDestination().getHash(); + this.destinationLink = newLink; + this.destinationIdentity = newLink.getRemoteIdentity(); + setCreationTimestamp(System.currentTimeMillis()); + this.lastAccessTimestamp = null; + destinationLink.setPacketCallback(this::packetCallback); + } + + public RNSPeer () { + this.destinationHash = null; + this.destinationLink = null; + this.destinationIdentity = null; + setCreationTimestamp(System.currentTimeMillis()); + this.lastAccessTimestamp = null; + } + + // utilities (change Link type, call tasks, ...) + //... + + private void packetCallback(byte[] message, Packet packet) { + log.debug("Message raw {}", message); + log.debug("Packet {}", packet.toString()); + // ... + } + + public Link getLink() { + if (isNull(getDestinationLink())) { + Link newLink = new Link( + new Destination( + this.destinationIdentity, + Direction.OUT, + DestinationType.SINGLE, + RNSNetwork.APP_NAME, + "core" + ) + ); + this.destinationLink = newLink; + return newLink; + } + return getDestinationLink(); + } + + public Channel getChannel() { + if (isNull(getDestinationLink())) { + log.warn("link is null."); + return null; + } + setLastAccessTimestamp(System.currentTimeMillis()); + return getDestinationLink().getChannel(); + } + + public void resetPeer () { + this.destinationHash = null; + this.destinationLink = null; + this.destinationIdentity = null; + this.lastAccessTimestamp = null; + } + +} diff --git a/src/main/resources/reticulum_default_config.yml b/src/main/resources/reticulum_default_config.yml new file mode 100644 index 00000000..18e8b729 --- /dev/null +++ b/src/main/resources/reticulum_default_config.yml @@ -0,0 +1,93 @@ +--- +# You should probably edit it to include any additional, +# interfaces and settings you might need. + +# Only the most basic options are included in this default +# configuration. To see a more verbose, and much longer, +# configuration example, you can run the command: +# rnsd --exampleconfig + +reticulum: + + # If you enable Transport, your system will route traffic + # for other peers, pass announces and serve path requests. + # This should only be done for systems that are suited to + # act as transport nodes, ie. if they are stationary and + # always-on. This directive is optional and can be removed + # for brevity. + + enable_transport: false + + # By default, the first program to launch the Reticulum + # Network Stack will create a shared instance, that other + # programs can communicate with. Only the shared instance + # opens all the configured interfaces directly, and other + # local programs communicate with the shared instance over + # a local socket. This is completely transparent to the + # user, and should generally be turned on. This directive + # is optional and can be removed for brevity. + + share_instance: false + + # If you want to run multiple *different* shared instances + # on the same system, you will need to specify different + # shared instance ports for each. The defaults are given + # below, and again, these options can be left out if you + # don't need them. + + #shared_instance_port: 37428 + #instance_control_port: 37429 + shared_instance_port: 37438 + instance_control_port: 37439 + + # You can configure Reticulum to panic and forcibly close + # if an unrecoverable interface error occurs, such as the + # hardware device for an interface disappearing. This is + # an optional directive, and can be left out for brevity. + # This behaviour is disabled by default. + + panic_on_interface_error: false + + +# The interfaces section defines the physical and virtual +# interfaces Reticulum will use to communicate on. This +# section will contain examples for a variety of interface +# types. You can modify these or use them as a basis for +# your own config, or simply remove the unused ones. + +interfaces: + + # This interface enables communication with other + # link-local Reticulum nodes over UDP. It does not + # need any functional IP infrastructure like routers + # or DHCP servers, but will require that at least link- + # local IPv6 is enabled in your operating system, which + # should be enabled by default in almost any OS. See + # the Reticulum Manual for more configuration options. + #"Default Interface": + # type: AutoInterface + # enabled: true + + # This interface enables communication with a "backbone" + # server over TCP. + # Note: others may be added for redundancy + "TCP Client Interface mobilefabrik": + type: TCPClientInterface + enabled: true + target_host: phantom.mobilefabrik.com + target_port: 4242 + #network_name: qortal + + # This interface turns this Reticulum instance into a + # server other clients can connect to over TCP. + # To enable this instance to route traffic the above + # setting "enable_transport" needs to be set (to true). + # Note: this interface type is not yet supported by + # reticulum-network-stack. + #"TCP Server Interface": + # type: TCPServerInterface + # enabled: true + # listen_ip: 0.0.0.0 + # listen_port: 3434 + # #network_name: qortal + diff --git a/src/test/java/org/qortal/test/network/RNSNetworTest.java b/src/test/java/org/qortal/test/network/RNSNetworTest.java new file mode 100644 index 00000000..d81b745d --- /dev/null +++ b/src/test/java/org/qortal/test/network/RNSNetworTest.java @@ -0,0 +1,70 @@ +package org.qortal.test.network; + +import org.apache.commons.lang3.StringUtils; +//import org.junit.Before; +//import org.junit.Ignore; +import org.junit.Test; + +//import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +//import java.util.Arrays; + +import static io.reticulum.constant.ReticulumConstant.ETC_DIR; +import static org.apache.commons.lang3.SystemUtils.USER_HOME; +//import static org.junit.Assert.assertNotNull; + +class ReticulumTest { + + //@Test + //void t() throws DecoderException { + // System.out.println(Arrays.toString(Hex.decodeHex("adf54d882c9a9b80771eb4995d702d4a3e733391b2a0f53f416d9f907e55cff8"))); + // System.out.println(2 + 1 + (128 / 8) * 2); + //} + + @Test + void path() { + System.out.println(initConfig(null)); + } + + //@Test + //void testConfigYamlParse() throws IOException { + // var config = ConfigObj.initConfig(Path.of(getSystemClassLoader().getResource("reticulum.default.yml").getPath())); + // assertNotNull(config); + //} + + //@Test + //void testHKDF() { + // var ifac_netname = "name"; + // var ifac_netkey = "password"; + // var ifacOrigin = new byte[]{}; + // ifacOrigin = ArrayUtils.addAll(ifacOrigin, getSha256Digest().digest(ifac_netname.getBytes(UTF_8))); + // ifacOrigin = ArrayUtils.addAll(ifacOrigin, getSha256Digest().digest(ifac_netkey.getBytes(UTF_8))); + // + // var ifacOriginHash = getSha256Digest().digest(ifacOrigin); + // + // var HKDF = new HKDFBytesGenerator(new SHA256Digest()); + // HKDF.init(new HKDFParameters(ifacOriginHash, IFAC_SALT, new byte[0])); + // var result = new byte[64]; + // var len = HKDF.generateBytes(result, 0, result.length); + // + // assertNotNull(Hex.encodeHexString(result)); + //} + + private String initConfig(String configDir) { + if (StringUtils.isNotBlank(configDir)) { + return configDir; + } else { + if (Files.isDirectory(Path.of(ETC_DIR)) && Files.exists(Path.of(ETC_DIR, "config"))) { + return ETC_DIR; + } else if ( + Files.isDirectory(Path.of(USER_HOME, ".config", "reticulum")) + && Files.exists(Path.of(USER_HOME, ".config", "reticulum", "config")) + ) { + return Path.of(USER_HOME, ".config", "reticulum").toString(); + } else { + return Path.of(USER_HOME, ".reticulum").toString(); + } + } + } +} From 9f3c1f1cf17f338be97c3ba67379bbd47a94c72c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=BCrg=20Schulthess?= Date: Mon, 25 Mar 2024 07:22:01 +0100 Subject: [PATCH 47/47] fix typo in file name --- .../test/network/{RNSNetworTest.java => RNSNetworkTest.java} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/test/java/org/qortal/test/network/{RNSNetworTest.java => RNSNetworkTest.java} (100%) diff --git a/src/test/java/org/qortal/test/network/RNSNetworTest.java b/src/test/java/org/qortal/test/network/RNSNetworkTest.java similarity index 100% rename from src/test/java/org/qortal/test/network/RNSNetworTest.java rename to src/test/java/org/qortal/test/network/RNSNetworkTest.java