From 7511265d5caaf7b9d4fd7d95e508c1137a667532 Mon Sep 17 00:00:00 2001 From: Owen Voke Date: Thu, 6 Oct 2022 11:57:02 +0100 Subject: [PATCH 01/13] chore: require HTTPlug dependencies --- composer.json | 19 ++++++++++++++----- phpstan.neon.dist | 7 +++++++ phpunit.xml.dist | 11 ++++++++--- 3 files changed, 29 insertions(+), 8 deletions(-) diff --git a/composer.json b/composer.json index 71c5201..de9b6a6 100644 --- a/composer.json +++ b/composer.json @@ -7,15 +7,24 @@ "php": "^8.0", "ext-json": "*", "ext-openssl": "*", - "guzzlehttp/guzzle": "^7.3", + "php-http/client-common": "^2.4", + "php-http/discovery": "^1.14", + "php-http/httplug": "^2.2", + "php-http/multipart-stream-builder": "^1.1", + "psr/http-client-implementation": "^1.0", + "psr/http-factory-implementation": "^1.0", + "psr/http-message": "^1.0", "stephenhill/base58": "^1.1" }, "require-dev": { + "guzzlehttp/guzzle": "^7.5", + "guzzlehttp/psr7": "^2.1", + "http-interop/http-factory-guzzle": "^1.2", "laravel/pint": "^1.2", - "mockery/mockery": "^1.3.1", - "pestphp/pest": "^1.1", + "pestphp/pest": "^1.20", + "php-http/mock-client": "^1.5", "phpstan/phpstan": "^1.8.7", - "symfony/var-dumper": "^5.2" + "symfony/var-dumper": "^5.3.8" }, "autoload": { "psr-4": { @@ -28,7 +37,7 @@ } }, "scripts": { - "test:types": "phpstan analyse --ansi --memory-limit=0", + "test:types": "phpstan analyse --ansi --memory-limit=-1", "test:unit": "pest --colors=always", "test": [ "@test:types", diff --git a/phpstan.neon.dist b/phpstan.neon.dist index d6be978..7c3be31 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -3,4 +3,11 @@ parameters: paths: - src/ + checkMissingIterableValueType: false + checkGenericClassInNonGenericObjectType: false reportUnmatchedIgnoredErrors: true + + ignoreErrors: + # Ignore typehint errors on api classes + - message: '#Method (.*) has no return typehint specified\.#' + path: src/Api diff --git a/phpunit.xml.dist b/phpunit.xml.dist index e97bc31..b0440a1 100644 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -1,9 +1,14 @@ - + verbose="true" + convertErrorsToExceptions="true" + convertNoticesToExceptions="true" + convertWarningsToExceptions="true" + processIsolation="false" + stopOnFailure="false"> tests From 9dd410aa4dcb2dfd1d4731c2b2eeb1a584464bc3 Mon Sep 17 00:00:00 2001 From: Owen Voke Date: Thu, 6 Oct 2022 12:48:26 +0100 Subject: [PATCH 02/13] feat: rewrite as HTTPlug implementation --- composer.json | 2 +- docs/.gitignore | 3 - docs/.vuepress/config.js | 17 - docs/assets.md | 22 - docs/general.md | 145 ----- docs/get-started.md | 35 -- docs/package.json | 10 - docs/readme.md | 16 - docs/sending-transactions.md | 57 -- src/Api/AbstractApi.php | 167 ++++++ src/Api/Account.php | 80 +++ src/Api/Asset.php | 40 ++ src/Api/Block.php | 31 + src/Api/Node.php | 36 ++ src/Api/Other.php | 37 ++ src/Api/Transaction.php | 48 ++ src/Arionum.php | 547 ------------------ src/Client.php | 100 ++++ src/Enums/Node.php | 28 + .../TransactionVersion.php} | 78 +-- src/Exception/BadMethodCallException.php | 7 + src/Exception/ExceptionInterface.php | 9 + src/Exception/InvalidArgumentException.php | 7 + src/Exception/MissingArgumentException.php | 26 + src/Exception/RuntimeException.php | 7 + src/Exceptions/ArionumException.php | 11 - src/Exceptions/GenericApiException.php | 9 - src/Exceptions/GenericLocalException.php | 13 - src/Exceptions/SignatureException.php | 11 - src/Helpers/EllipticCurve.php | 42 -- src/Helpers/Key.php | 71 --- src/HttpClient/Builder.php | 114 ++++ src/HttpClient/Message/ResponseMediator.php | 29 + src/Models/Account.php | 84 --- src/Models/Asset.php | 88 --- src/Models/Transaction.php | 216 ------- src/Transaction/TransactionFactory.php | 176 ------ tests/.gitkeep | 0 tests/Concerns/InteractsWithArionum.php | 19 - tests/Feature/AccountTest.php | 55 -- tests/Feature/AssetTest.php | 69 --- tests/Feature/Base58Test.php | 13 - tests/Feature/BlockTest.php | 24 - tests/Feature/EllipticCurveTest.php | 56 -- tests/Feature/KeyTest.php | 49 -- tests/Feature/LocalAccountTest.php | 19 - tests/Feature/NodeTest.php | 65 --- tests/Feature/OtherTest.php | 41 -- tests/Feature/TransactionTest.php | 124 ---- tests/Pest.php | 5 - tests/TestCase.php | 24 - 51 files changed, 798 insertions(+), 2184 deletions(-) delete mode 100644 docs/.gitignore delete mode 100644 docs/.vuepress/config.js delete mode 100644 docs/assets.md delete mode 100644 docs/general.md delete mode 100644 docs/get-started.md delete mode 100644 docs/package.json delete mode 100644 docs/readme.md delete mode 100644 docs/sending-transactions.md create mode 100644 src/Api/AbstractApi.php create mode 100644 src/Api/Account.php create mode 100644 src/Api/Asset.php create mode 100644 src/Api/Block.php create mode 100644 src/Api/Node.php create mode 100644 src/Api/Other.php create mode 100644 src/Api/Transaction.php delete mode 100644 src/Arionum.php create mode 100644 src/Client.php create mode 100644 src/Enums/Node.php rename src/{Transaction/Version.php => Enums/TransactionVersion.php} (61%) create mode 100644 src/Exception/BadMethodCallException.php create mode 100644 src/Exception/ExceptionInterface.php create mode 100644 src/Exception/InvalidArgumentException.php create mode 100644 src/Exception/MissingArgumentException.php create mode 100644 src/Exception/RuntimeException.php delete mode 100644 src/Exceptions/ArionumException.php delete mode 100644 src/Exceptions/GenericApiException.php delete mode 100644 src/Exceptions/GenericLocalException.php delete mode 100644 src/Exceptions/SignatureException.php delete mode 100644 src/Helpers/EllipticCurve.php delete mode 100644 src/Helpers/Key.php create mode 100644 src/HttpClient/Builder.php create mode 100644 src/HttpClient/Message/ResponseMediator.php delete mode 100644 src/Models/Account.php delete mode 100644 src/Models/Asset.php delete mode 100644 src/Models/Transaction.php delete mode 100644 src/Transaction/TransactionFactory.php create mode 100644 tests/.gitkeep delete mode 100644 tests/Concerns/InteractsWithArionum.php delete mode 100644 tests/Feature/AccountTest.php delete mode 100644 tests/Feature/AssetTest.php delete mode 100644 tests/Feature/Base58Test.php delete mode 100644 tests/Feature/BlockTest.php delete mode 100644 tests/Feature/EllipticCurveTest.php delete mode 100644 tests/Feature/KeyTest.php delete mode 100644 tests/Feature/LocalAccountTest.php delete mode 100644 tests/Feature/NodeTest.php delete mode 100644 tests/Feature/OtherTest.php delete mode 100644 tests/Feature/TransactionTest.php delete mode 100644 tests/Pest.php delete mode 100644 tests/TestCase.php diff --git a/composer.json b/composer.json index de9b6a6..8e785c4 100644 --- a/composer.json +++ b/composer.json @@ -4,7 +4,7 @@ "description": "An API wrapper for the Arionum cryptocurrency node.", "license": "MIT", "require": { - "php": "^8.0", + "php": "^8.1", "ext-json": "*", "ext-openssl": "*", "php-http/client-common": "^2.4", diff --git a/docs/.gitignore b/docs/.gitignore deleted file mode 100644 index 1989eeb..0000000 --- a/docs/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -node_modules -.vuepress/dist -package-lock.json diff --git a/docs/.vuepress/config.js b/docs/.vuepress/config.js deleted file mode 100644 index 473ee2a..0000000 --- a/docs/.vuepress/config.js +++ /dev/null @@ -1,17 +0,0 @@ -module.exports = { - title: 'Arionum PHP', - description: 'An API wrapper for the Arionum cryptocurrency node.', - serviceWorker: true, - sidebar: true, - themeConfig: { - repo: 'owenvoke/arionum-php', - docsDir: 'docs', - editLinks: true, - sidebar: [ - '/get-started', - '/general', - '/sending-transactions', - '/assets' - ] - } -} diff --git a/docs/assets.md b/docs/assets.md deleted file mode 100644 index 1c451ee..0000000 --- a/docs/assets.md +++ /dev/null @@ -1,22 +0,0 @@ -# Assets - -#### Check the asset balances for an address - -```php -// Returns an array of asset balances -$arionum->getAssetBalance($address); -``` - -#### Retrieve a list of registered assets - -```php -// Returns an array of assets -$arionum->getAssets(); -``` - -#### Retrieve an asset by its id - -```php -// Returns an array of assets -$arionum->getAsset($assetId); -``` diff --git a/docs/general.md b/docs/general.md deleted file mode 100644 index 6c1bd98..0000000 --- a/docs/general.md +++ /dev/null @@ -1,145 +0,0 @@ -# General Usage - -## Accounts - -#### Generate a new account - -```php -$arionum->generateAccount(); -``` - -#### Generate a new account locally - -```php -$arionum->generateLocalAccount(); -``` - -#### Get an address from a public key - -```php -$arionum->getAddress('public-key'); -``` - -#### Get the alias for a specific address - -```php -$arionum->getAlias('address'); -``` - -#### Get the public key for an address - -```php -$arionum->getPublicKey('address'); -``` - -#### Get the balance for an address - -```php -$arionum->getBalance('address'); -``` - -#### Get the pending balance for an address - -```php -$arionum->getPendingBalance('address'); -``` - -## Transactions - -#### Get a list of transactions for an address - -```php -$arionum->getTransactions('address'); -``` - -#### Get a list of transactions for a public key - -```php -$arionum->getTransactionsByPublicKey('address'); -``` - -#### Get a specific transaction by its id - -```php -$arionum->getTransaction('transaction-id'); -``` - -## Blocks - -#### Get the current block - -```php -$arionum->getCurrentBlock(); -``` - -#### Get a specific block by its height - -```php -$arionum->getBlock(1); -``` - -#### Get transactions for a specific block - -```php -$arionum->getBlockTransactions('block-id'); -``` - -## Masternodes - -#### Get a list of available masternodes on the network - -```php -$arionum->getMasternodes(); -``` - -## Node Details - -#### Get details about the node - -```php -$arionum->getNodeInfo(); -``` - -#### Get the version of the current node - -```php -$arionum->getNodeVersion(); -``` - -#### Get details about the nodes sanity process - -```php -$arionum->getSanityDetails(); -``` - -#### Get the number of transactions in the mempool - -```php -$arionum->getMempoolSize(); -``` - -## Other - -#### Get a Base58-encoded version of a string - -```php -$arionum->getBase58('string-data'); -``` - -#### Check the validity of an address - -```php -$arionum->checkAddress('address'); -``` - -#### Check the validity of a signature - -```php -$arionum->checkSignature('signature', 'data', 'public_key'); -``` - -#### Get a random number based on a specified block - -```php -$arionum->getRandomNumber(1, 1, 1000); -``` diff --git a/docs/get-started.md b/docs/get-started.md deleted file mode 100644 index 0492af4..0000000 --- a/docs/get-started.md +++ /dev/null @@ -1,35 +0,0 @@ -# Getting Started - -> **Requires:** [PHP 7.4 or later](https://php.net/releases) - -First, install Arionum PHP via the `Composer` package manager: - -```bash -composer require owenvoke/arionum-php -``` - -### Set up the Arionum instance - -```php -$nodeUri = 'https://node-uri-here'; -$arionum = new OwenVoke\Arionum\Arionum($nodeUri); -``` - -### Within Laravel - -For use within Laravel, there is a [Laravel Arionum][link-laravel-arionum] adapter: - -```bash -# Require the Laravel adapter package -composer require owenvoke/laravel-arionum - -# Publish the configuration file -php artisan vendor:publish --provider="OwenVoke\LaravelArionum\ArionumServiceProvider" -``` - -To configure the Arionum node that is used, set the `ARIONUM_NODE_URI` environment variable in `.env` file. - -All existing methods can be called statically via the [`Arionum` facade][link-facade]. - -[link-laravel-arionum]: https://github.com/owenvoke/laravel-arionum -[link-facade]: https://github.com/owenvoke/laravel-arionum/blob/main/src/Facades/Arionum.php diff --git a/docs/package.json b/docs/package.json deleted file mode 100644 index 49af60e..0000000 --- a/docs/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "private": true, - "scripts": { - "serve": "vuepress dev .", - "build": "vuepress build ." - }, - "devDependencies": { - "vuepress": "^1.0" - } -} diff --git a/docs/readme.md b/docs/readme.md deleted file mode 100644 index d3a437f..0000000 --- a/docs/readme.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -home: true -title: Arionum PHP -description: An API wrapper for the Arionum cryptocurrency -actionText: Get Started → -actionLink: /get-started -sidebar: true -footer: MIT Licensed | Copyright © 2018 Owen Voke ---- - -# Quick start - -```bash -# Install with Composer -composer require owenvoke/arionum-php -``` diff --git a/docs/sending-transactions.md b/docs/sending-transactions.md deleted file mode 100644 index a436c88..0000000 --- a/docs/sending-transactions.md +++ /dev/null @@ -1,57 +0,0 @@ -# Sending Transactions - -### Creating a transaction instance - -There are many transaction helpers for creating pre-filled `Transaction` instances. - -```php -use OwenVoke\Arionum\Transaction\TransactionFactory; - -// Retrieve a pre-populated Transaction instance for sending to an alias -TransactionFactory::makeAliasSendInstance($alias, $value, $message); - -// Retrieve a pre-populated Transaction instance for setting an alias -TransactionFactory::makeAliasSetInstance($address, $alias); - -// Retrieve a pre-populated Transaction instance for creating a masternode -TransactionFactory::makeMasternodeCreateInstance($ipAddress, $address); - -// Retrieve a pre-populated Transaction instance for pausing a masternode -TransactionFactory::makeMasternodePauseInstance($address); - -// Retrieve a pre-populated Transaction instance for resuming a masternode -TransactionFactory::makeMasternodeResumeInstance($address); - -// Retrieve a pre-populated Transaction instance for releasing a masternode -TransactionFactory::makeMasternodeReleaseInstance($address); -``` - -**Manually creating a transaction** - -```php -$transaction = new Transaction(); - -$transaction->changeDestinationAddress($address); // The address to send to -$transaction->changeValue($value); // The value as a float -$transaction->changeFee($fee); // The fee as a float -$transaction->changePublicKey($publicKey); // The public key the transaction is sent from -$transaction->changeSignature($signature); // The signature created from local signing -$transaction->changeDate($date); // The date as a unix timestamp -$transaction->changeMessage($message); // The message for the transaction -$transaction->changeVersion($version); // The version of the transaction - -// This is the non-recommended way, the private key will be sent to the node -// Using local signing with `changeSignature()` is preferred -$transaction->changePrivateKey($privateKey); -``` - -### Send a transaction - -```php -// This will send the transaction instance to the node -$arionum->sendTransaction($transaction); -``` - -### Transaction versions - -The `Transaction\Version` class contains constants for all available transaction versions. diff --git a/src/Api/AbstractApi.php b/src/Api/AbstractApi.php new file mode 100644 index 0000000..08547ae --- /dev/null +++ b/src/Api/AbstractApi.php @@ -0,0 +1,167 @@ +client; + } + + public function configure(): self + { + return $this; + } + + /** + * Send a GET request with query parameters. + * + * @param string $path Request path. + * @param array $parameters GET parameters. + * @param array $requestHeaders Request Headers. + * @return array|string + */ + protected function get(string $path, array $parameters = [], array $requestHeaders = []): array|string + { + if (count($parameters) > 0) { + $path .= '?'.http_build_query($parameters, '', '&', PHP_QUERY_RFC3986); + } + + $response = $this->client->getHttpClient()->get($path, $requestHeaders); + + return ResponseMediator::getContent($response); + } + + /** + * Send a HEAD request with query parameters. + * + * @param string $path Request path. + * @param array $parameters HEAD parameters. + * @param array $requestHeaders Request headers. + * @return ResponseInterface + */ + protected function head(string $path, array $parameters = [], array $requestHeaders = []): ResponseInterface + { + return $this->client->getHttpClient()->head( + $path.'?'.http_build_query($parameters, '', '&', PHP_QUERY_RFC3986), + $requestHeaders + ); + } + + /** + * Send a POST request with JSON-encoded parameters. + * + * @param string $path Request path. + * @param array $parameters POST parameters to be JSON encoded. + * @param array $requestHeaders Request headers. + * @return array|string + */ + protected function post(string $path, array $parameters = [], array $requestHeaders = []): array|string + { + return $this->postRaw( + $path, + $this->createJsonBody($parameters), + $requestHeaders + ); + } + + /** + * Send a POST request with raw data. + * + * @param string $path Request path. + * @param string|null $body Request body. + * @param array $requestHeaders Request headers. + * @return array|string + */ + protected function postRaw(string $path, string|null $body, array $requestHeaders = []): array|string + { + $response = $this->client->getHttpClient()->post( + $path, + $requestHeaders, + $body + ); + + return ResponseMediator::getContent($response); + } + + /** + * Send a PATCH request with JSON-encoded parameters. + * + * @param string $path Request path. + * @param array $parameters POST parameters to be JSON encoded. + * @param array $requestHeaders Request headers. + * @return array|string + */ + protected function patch(string $path, array $parameters = [], array $requestHeaders = []): array|string + { + $response = $this->client->getHttpClient()->patch( + $path, + $requestHeaders, + $this->createJsonBody($parameters) + ); + + return ResponseMediator::getContent($response); + } + + /** + * Send a PUT request with JSON-encoded parameters. + * + * @param string $path Request path. + * @param array $parameters POST parameters to be JSON encoded. + * @param array $requestHeaders Request headers. + * @return array|string + */ + protected function put(string $path, array $parameters = [], array $requestHeaders = []): array|string + { + $response = $this->client->getHttpClient()->put( + $path, + $requestHeaders, + $this->createJsonBody($parameters) + ); + + return ResponseMediator::getContent($response); + } + + /** + * Send a DELETE request with JSON-encoded parameters. + * + * @param string $path Request path. + * @param array $parameters POST parameters to be JSON encoded. + * @param array $requestHeaders Request headers. + * @return array|string + */ + protected function delete(string $path, array $parameters = [], array $requestHeaders = []): array|string + { + $response = $this->client->getHttpClient()->delete( + $path, + $requestHeaders, + $this->createJsonBody($parameters) + ); + + return ResponseMediator::getContent($response); + } + + /** + * Create a JSON encoded version of an array of parameters. + * + * @param array $parameters Request parameters + * @return string|null + */ + protected function createJsonBody(array $parameters): string|null + { + return (count($parameters) === 0) ? null : (json_encode($parameters) ?: null); + } +} diff --git a/src/Api/Account.php b/src/Api/Account.php new file mode 100644 index 0000000..5f6e969 --- /dev/null +++ b/src/Api/Account.php @@ -0,0 +1,80 @@ +get(self::API_PATH, [ + 'q' => 'getAddress', + 'public_key' => $publicKey, + ]); + } + + public function alias(string $address): array + { + return $this->get(self::API_PATH, [ + 'q' => 'getAlias', + 'account' => $address, + ]); + } + + public function publicKey(string $address): array + { + return $this->get(self::API_PATH, [ + 'q' => 'getPublicKey', + 'account' => $address, + ]); + } + + public function generate(): array + { + return $this->get(self::API_PATH, [ + 'q' => 'generateAccount', + ]); + } + + public function balance(string $address): array + { + return $this->get(self::API_PATH, [ + 'q' => 'getBalance', + 'account' => $address, + ]); + } + + public function balanceByAlias(string $alias): array + { + return $this->get(self::API_PATH, [ + 'q' => 'getBalance', + 'alias' => $alias, + ]); + } + + public function balanceByPublicKey(string $publicKey): array + { + return $this->get(self::API_PATH, [ + 'q' => 'getBalance', + 'public_key' => $publicKey, + ]); + } + + public function pendingBalance(string $address): array + { + return $this->get(self::API_PATH, [ + 'q' => 'getPendingBalance', + 'account' => $address, + ]); + } + + public function checkAddress(string $address, ?string $publicKey = null): array + { + return $this->get(self::API_PATH, [ + 'q' => 'checkAddress', + 'account' => $address, + 'public_key' => $publicKey, + ]); + } +} diff --git a/src/Api/Asset.php b/src/Api/Asset.php new file mode 100644 index 0000000..5b5b8a1 --- /dev/null +++ b/src/Api/Asset.php @@ -0,0 +1,40 @@ +get(self::API_PATH, [ + 'q' => 'assets', + ]); + } + + public function show(string $id): array + { + return $this->get(self::API_PATH, [ + 'q' => 'assets', + 'asset' => $id, + ]); + } + + public function balance(string $address): array + { + return $this->get(self::API_PATH, [ + 'q' => 'assetBalance', + 'account' => $address, + ]); + } + + public function orders(string $address, string|null $id = null): array + { + return $this->get(self::API_PATH, [ + 'q' => 'asset-orders', + 'account' => $address, + 'asset' => $id, + ]); + } +} diff --git a/src/Api/Block.php b/src/Api/Block.php new file mode 100644 index 0000000..ac6cee6 --- /dev/null +++ b/src/Api/Block.php @@ -0,0 +1,31 @@ +get(self::API_PATH, [ + 'q' => 'currentBlock', + ]); + } + + public function block(int $height): array + { + return $this->get(self::API_PATH, [ + 'q' => 'getBlock', + 'height' => $height, + ]); + } + + public function transactions(string $id): array + { + return $this->get(self::API_PATH, [ + 'q' => 'getBlockTransactions', + 'block' => $id, + ]); + } +} diff --git a/src/Api/Node.php b/src/Api/Node.php new file mode 100644 index 0000000..5d1510f --- /dev/null +++ b/src/Api/Node.php @@ -0,0 +1,36 @@ +get(self::API_PATH, [ + 'q' => 'node-info', + ]); + } + + public function version(): string + { + return $this->get(self::API_PATH, [ + 'q' => 'version', + ]); + } + + public function sanity(): string + { + return $this->get(self::API_PATH, [ + 'q' => 'sanity', + ]); + } + + public function masternodes(): string + { + return $this->get(self::API_PATH, [ + 'q' => 'masternodes', + ]); + } +} diff --git a/src/Api/Other.php b/src/Api/Other.php new file mode 100644 index 0000000..42bc734 --- /dev/null +++ b/src/Api/Other.php @@ -0,0 +1,37 @@ +get(self::API_PATH, [ + 'q' => 'base58', + 'data' => $data, + ]); + } + + public function randomNumber(int $height, int $minimum, int $maximum, ?string $seed = null): array + { + return $this->get(self::API_PATH, [ + 'q' => 'randomNumber', + 'height' => $height, + 'min' => $minimum, + 'max' => $maximum, + 'seed' => $seed, + ]); + } + + public function checkSignature(string $signature, string $data, string $publicKey): array + { + return $this->get(self::API_PATH, [ + 'q' => 'checkSignature', + 'signature' => $signature, + 'data' => $data, + 'public_key' => $publicKey, + ]); + } +} diff --git a/src/Api/Transaction.php b/src/Api/Transaction.php new file mode 100644 index 0000000..432984d --- /dev/null +++ b/src/Api/Transaction.php @@ -0,0 +1,48 @@ +get(self::API_PATH, [ + 'q' => 'getTransactions', + 'account' => $address, + 'limit' => $limit, + ]); + } + + public function transactionsByPublicKey(string $publicKey, int $limit = 100): array + { + return $this->get(self::API_PATH, [ + 'q' => 'getTransactions', + 'public_key' => $publicKey, + 'limit' => $limit, + ]); + } + + public function transaction(string $id): array + { + return $this->get(self::API_PATH, [ + 'q' => 'getTransaction', + 'transaction' => $id, + ]); + } + + public function send(array $transaction): array + { + return $this->get(self::API_PATH, array_merge($transaction, [ + 'q' => 'send', + ])); + } + + public function mempoolSize(): array + { + return $this->get(self::API_PATH, [ + 'q' => 'mempoolSize', + ]); + } +} diff --git a/src/Arionum.php b/src/Arionum.php deleted file mode 100644 index 642b89f..0000000 --- a/src/Arionum.php +++ /dev/null @@ -1,547 +0,0 @@ -nodeAddress = $nodeAddress; - $this->client = $client ?? new Client(); - } - - /** - * Retrieve the address for a specified public key. - * - * @param string $publicKey - * @return string - * - * @throws GenericApiException - */ - public function getAddress(string $publicKey): string - { - return $this->getJson([ - 'q' => 'getAddress', - 'public_key' => $publicKey, - ]); - } - - /** - * Convert a string to Base58. - * - * @param string $data - * @return string - * - * @throws GenericApiException - */ - public function getBase58(string $data): string - { - return $this->getJson([ - 'q' => 'base58', - 'data' => $data, - ]); - } - - /** - * Retrieve the balance of a specified address. - * - * @param string $address - * @return string - * - * @throws GenericApiException - */ - public function getBalance(string $address): string - { - return $this->getJson([ - 'q' => 'getBalance', - 'account' => $address, - ]); - } - - /** - * Retrieve the balance of a specified alias. - * - * @param string $alias - * @return string - * - * @throws GenericApiException - */ - public function getBalanceByAlias(string $alias): string - { - return $this->getJson([ - 'q' => 'getBalance', - 'alias' => $alias, - ]); - } - - /** - * Retrieve the balance of a specified public key. - * - * @param string $publicKey - * @return string - * - * @throws GenericApiException - */ - public function getBalanceByPublicKey(string $publicKey): string - { - return $this->getJson([ - 'q' => 'getBalance', - 'public_key' => $publicKey, - ]); - } - - /** - * Retrieve the pending balance of a specified address (includes pending transactions). - * - * @param string $address - * @return string - * - * @throws GenericApiException - */ - public function getPendingBalance(string $address): string - { - return $this->getJson([ - 'q' => 'getPendingBalance', - 'account' => $address, - ]); - } - - /** - * Retrieve the transactions of a specified address. - * - * @param string $address - * @param int $limit - * @return array - * - * @throws GenericApiException - */ - public function getTransactions(string $address, int $limit = 100): array - { - return $this->getJson([ - 'q' => 'getTransactions', - 'account' => $address, - 'limit' => $limit, - ]); - } - - /** - * Retrieve the transactions of a specified public key. - * - * @param string $publicKey - * @param int $limit - * @return array - * - * @throws GenericApiException - */ - public function getTransactionsByPublicKey(string $publicKey, int $limit = 100): array - { - return $this->getJson([ - 'q' => 'getTransactions', - 'public_key' => $publicKey, - 'limit' => $limit, - ]); - } - - /** - * Retrieve a specified transaction by its id. - * - * @param string $transactionId - * @return stdClass - * - * @throws GenericApiException - */ - public function getTransaction(string $transactionId): stdClass - { - return $this->getJson([ - 'q' => 'getTransaction', - 'transaction' => $transactionId, - ]); - } - - /** - * Retrieve the public key of a specified address. - * - * @param string $address - * @return string - * - * @throws GenericApiException - */ - public function getPublicKey(string $address): string - { - return $this->getJson([ - 'q' => 'getPublicKey', - 'account' => $address, - ]); - } - - /** - * Generate a new public/private key pair and return these with the address. - * - * @return Account - * - * @throws GenericApiException - */ - public function generateAccount(): Account - { - $generatedAccount = $this->getJson([ - 'q' => 'generateAccount', - ]); - - return new Account($generatedAccount->public_key, $generatedAccount->private_key); - } - - /** - * Retrieve the current block as an object. - * - * @return stdClass - * - * @throws GenericApiException - */ - public function getCurrentBlock(): stdClass - { - return $this->getJson([ - 'q' => 'currentBlock', - ]); - } - - /** - * Retrieve a block by its height. - * - * @param int $height - * @return stdClass - * - * @throws GenericApiException - */ - public function getBlock(int $height): stdClass - { - return $this->getJson([ - 'q' => 'getBlock', - 'height' => $height, - ]); - } - - /** - * Retrieve the transactions of a specified block. - * - * @param string $blockId - * @return array - * - * @throws GenericApiException - */ - public function getBlockTransactions(string $blockId): array - { - return $this->getJson([ - 'q' => 'getBlockTransactions', - 'block' => $blockId, - ]); - } - - /** - * Retrieve the version of the node. - * - * @return string - * - * @throws GenericApiException - */ - public function getNodeVersion(): string - { - return $this->getJson([ - 'q' => 'version', - ]); - } - - /** - * Send a transaction. - * - * @param Transaction $transaction - * @return string - * - * @throws GenericApiException - */ - public function sendTransaction(Transaction $transaction): string - { - $data = array_merge($transaction->toArray(), [ - 'q' => 'send', - ]); - - return $this->getJson($data); - } - - /** - * Retrieve the number of transactions in the mempool. - * - * @return int - * - * @throws GenericApiException - */ - public function getMempoolSize(): int - { - return $this->getJson([ - 'q' => 'mempoolSize', - ]); - } - - /** - * Retrieve a random number based on a specified block. - * - * @param int $height - * @param int $minimum - * @param int $maximum - * @param string|null $seed - * @return int - * - * @throws GenericApiException - */ - public function getRandomNumber(int $height, int $minimum, int $maximum, ?string $seed = null): int - { - return $this->getJson([ - 'q' => 'randomNumber', - 'height' => $height, - 'min' => $minimum, - 'max' => $maximum, - 'seed' => $seed, - ]); - } - - /** - * Check that a signature is valid against a public key. - * - * @param string $signature - * @param string $data - * @param string $publicKey - * @return bool - * - * @throws GenericApiException - */ - public function checkSignature(string $signature, string $data, string $publicKey): bool - { - return $this->getJson([ - 'q' => 'checkSignature', - 'signature' => $signature, - 'data' => $data, - 'public_key' => $publicKey, - ]); - } - - /** - * Retrieve a list of registered masternodes on the network. - * - * @return array - * - * @throws GenericApiException - */ - public function getMasternodes(): array - { - return $this->getJson([ - 'q' => 'masternodes', - ])->masternodes; - } - - /** - * Retrieve the alias for an account by it's address. - * - * @param string $address - * @return string - * - * @throws GenericApiException - */ - public function getAlias(string $address): string - { - return $this->getJson([ - 'q' => 'getAlias', - 'account' => $address, - ]); - } - - /** - * Retrieve details about the nodes sanity process. - * - * @return stdClass - * - * @throws GenericApiException - */ - public function getSanityDetails(): stdClass - { - return $this->getJson([ - 'q' => 'sanity', - ]); - } - - /** - * Retrieve details about the node. - * - * @return stdClass - * - * @throws GenericApiException - */ - public function getNodeInfo(): stdClass - { - return $this->getJson([ - 'q' => 'node-info', - ]); - } - - /** - * Check that an address is valid. - * Optionally validate it against the corresponding public key. - * - * @param string $address - * @param string|null $publicKey An optional corresponding public key. - * @return bool - * - * @throws GenericApiException - */ - public function checkAddress(string $address, ?string $publicKey = null): bool - { - return $this->getJson([ - 'q' => 'checkAddress', - 'account' => $address, - 'public_key' => $publicKey, - ]); - } - - /** - * Retrieve the asset balance for a specific address. - * - * @param string $address - * @return array - * - * @throws GenericApiException - */ - public function getAssetBalance(string $address): array - { - return $this->getJson([ - 'q' => 'assetBalance', - 'account' => $address, - ]); - } - - /** - * Retrieve the asset orders for a specific address. - * - * @param string $address - * @param string|null $assetId - * @return array - * - * @throws GenericApiException - */ - public function getAssetOrders(string $address, ?string $assetId = null): array - { - return $this->getJson([ - 'q' => 'asset-orders', - 'account' => $address, - 'asset' => $assetId, - ]); - } - - /** - * Retrieve a list of assets. - * - * @return array - * - * @throws GenericApiException - */ - public function getAssets(): array - { - return $this->getJson([ - 'q' => 'assets', - ]); - } - - /** - * Retrieve a specific asset. - * - * @param string $assetId - * @return array - * - * @throws GenericApiException - */ - public function getAsset(string $assetId): array - { - return $this->getJson([ - 'q' => 'assets', - 'asset' => $assetId, - ]); - } - - /** - * Generate a new public/private key pair and return these with the address. - * - * @return Account - * - * @throws GenericLocalException - */ - public function generateLocalAccount(): Account - { - return Account::make(); - } - - public function getNodeAddress(): string - { - return $this->nodeAddress; - } - - /** - * @param array $query - * @return mixed - * - * @throws GenericApiException - */ - private function getJson(array $query) - { - return $this->decodeResponse( - $this->client - ->get($this->getNodeAddress().self::API_ENDPOINT, ['query' => $query]) - ->getBody() - ->getContents() - ); - } - - /** - * @param string $json - * @return mixed - * - * @throws GenericApiException - */ - private function decodeResponse(string $json) - { - /** @var \stdClass */ - $data = Utils::jsonDecode($json, false); - - if (! isset($data->status) || ! isset($data->data)) { - throw new GenericApiException('No status or data could be found in the response'); - } - - if ($data->status === self::API_STATUS_OK) { - return $data->data; - } - - throw new GenericApiException($data->data ?? 'An unknown API error occurred'); - } -} diff --git a/src/Client.php b/src/Client.php new file mode 100644 index 0000000..ef9f7ec --- /dev/null +++ b/src/Client.php @@ -0,0 +1,100 @@ +httpClientBuilder = $builder = $httpClientBuilder ?? new Builder(); + + $builder->addPlugin(new RedirectPlugin()); + $builder->addPlugin(new AddHostPlugin(Psr17FactoryDiscovery::findUriFactory()->createUri( + Node::providedOrRandom($this->nodeUri) + ))); + $builder->addPlugin(new HeaderDefaultsPlugin([ + 'User-Agent' => 'arionum-php (https://github.com/owenvoke/arionum-php)', + ])); + + $builder->addHeaderValue('Accept', 'application/json'); + } + + public static function createWithHttpClient(ClientInterface $httpClient): self + { + $builder = new Builder($httpClient); + + return new self(httpClientBuilder: $builder); + } + + /** @throws InvalidArgumentException */ + public function api(string $name): AbstractApi + { + return match ($name) { + 'account', 'accounts', 'address', 'addresses' => new Api\Account($this), + 'asset', 'assets' => new Api\Asset($this), + 'node', 'nodes' => new Api\Node($this), + 'other', 'misc', 'miscellaneous' => new Api\Other($this), + 'transaction', 'transactions' => new Api\Transaction($this), + default => throw new InvalidArgumentException(sprintf('Undefined api instance called: "%s"', $name)), + }; + } + + private function setNodeUri(string $uri): void + { + $this->nodeUri = $uri; + + $builder = $this->getHttpClientBuilder(); + $builder->removePlugin(AddHostPlugin::class); + + $builder->addPlugin(new AddHostPlugin(Psr17FactoryDiscovery::findUriFactory()->createUri($this->getNodeUri()))); + } + + public function getNodeUri(): ?string + { + return $this->nodeUri; + } + + public function __call(string $name, array $args): AbstractApi + { + try { + return $this->api($name); + } catch (InvalidArgumentException $e) { + throw new BadMethodCallException(sprintf('Undefined method called: "%s"', $name), $e->getCode(), $e); + } + } + + public function getHttpClient(): HttpMethodsClientInterface + { + return $this->getHttpClientBuilder()->getHttpClient(); + } + + protected function getHttpClientBuilder(): Builder + { + return $this->httpClientBuilder; + } +} diff --git a/src/Enums/Node.php b/src/Enums/Node.php new file mode 100644 index 0000000..18c9a2b --- /dev/null +++ b/src/Enums/Node.php @@ -0,0 +1,28 @@ +value; + } +} diff --git a/src/Transaction/Version.php b/src/Enums/TransactionVersion.php similarity index 61% rename from src/Transaction/Version.php rename to src/Enums/TransactionVersion.php index daf1fc0..44e01ee 100644 --- a/src/Transaction/Version.php +++ b/src/Enums/TransactionVersion.php @@ -2,58 +2,42 @@ declare(strict_types=1); -namespace OwenVoke\Arionum\Transaction; +namespace OwenVoke\Arionum\Enums; -final class Version +enum TransactionVersion: int { - /** The transaction version for sending to an address. */ - public const STANDARD = 1; - - /** The transaction version for sending to an alias. */ - public const ALIAS_SEND = 2; - - /** The transaction version for setting an alias. */ - public const ALIAS_SET = 3; - + /** The transaction version for resuming a masternode. */ + case MASTERNODE_RESUME = 102; + /** The transaction version for releasing a masternode. */ + case MASTERNODE_RELEASE = 103; + /** The transaction version for pausing a masternode. */ + case MASTERNODE_PAUSE = 101; /** The transaction version for creating an asset. */ - public const ASSET_CREATE = 50; - - /** The transaction version for sending units of an asset. */ - public const ASSET_SEND = 51; - - /** The transaction version for creating a market ask/bid order for an asset. */ - public const ASSET_MARKET = 52; - - /** The transaction version for cancelling a market order for an asset. */ - public const ASSET_CANCEL_ORDER = 53; - + case ASSET_CREATE = 50; /** The transaction version for distributing dividends for an asset. */ - public const ASSET_DIVIDENDS = 54; - + case ASSET_DIVIDENDS = 54; + /** The transaction version for cancelling a market order for an asset. */ + case ASSET_CANCEL_ORDER = 53; /** The transaction version for increasing the max supply of an asset. */ - public const ASSET_INFLATE = 55; - - /** The transaction version for creating a masternode. */ - public const MASTERNODE_CREATE = 100; - - /** The transaction version for pausing a masternode. */ - public const MASTERNODE_PAUSE = 101; - - /** The transaction version for resuming a masternode. */ - public const MASTERNODE_RESUME = 102; - - /** The transaction version for releasing a masternode. */ - public const MASTERNODE_RELEASE = 103; - - /** The transaction version for updating a masternodes IP address. */ - public const MASTERNODE_UPDATE_IP = 104; - - /** The transaction version for adding a masternode voting key. */ - public const MASTERNODE_ADD_VOTING_KEY = 105; - + case ASSET_INFLATE = 55; /** The transaction version for a masternode blacklist vote. */ - public const MASTERNODE_VOTE_BLACKLIST = 106; - + case MASTERNODE_VOTE_BLACKLIST = 106; + /** The transaction version for sending units of an asset. */ + case ASSET_SEND = 51; + /** The transaction version for adding a masternode voting key. */ + case MASTERNODE_ADD_VOTING_KEY = 105; + /** The transaction version for updating a masternodes IP address. */ + case MASTERNODE_UPDATE_IP = 104; + /** The transaction version for sending to an alias. */ + case ALIAS_SEND = 2; + /** The transaction version for creating a masternode. */ + case MASTERNODE_CREATE = 100; + /** The transaction version for setting an alias. */ + case ALIAS_SET = 3; + /** The transaction version for sending to an address. */ + case STANDARD = 1; + /** The transaction version for creating a market ask/bid order for an asset. */ + case ASSET_MARKET = 52; /** The transaction version for a masternode blockchain vote. */ - public const MASTERNODE_VOTE_BLOCKCHAIN = 107; + case MASTERNODE_VOTE_BLOCKCHAIN = 107; } diff --git a/src/Exception/BadMethodCallException.php b/src/Exception/BadMethodCallException.php new file mode 100644 index 0000000..8641a11 --- /dev/null +++ b/src/Exception/BadMethodCallException.php @@ -0,0 +1,7 @@ + $required */ + public function __construct($required, int $code = 0, ?Throwable $previous = null) + { + if (is_string($required)) { + $required = [$required]; + } + + parent::__construct( + sprintf('One or more of required ("%s") parameters is missing!', implode('", "', $required)), + $code, + 1, + __FILE__, + __LINE__, + $previous + ); + } +} diff --git a/src/Exception/RuntimeException.php b/src/Exception/RuntimeException.php new file mode 100644 index 0000000..a97f96e --- /dev/null +++ b/src/Exception/RuntimeException.php @@ -0,0 +1,7 @@ +encode($signature); - } - - /** - * @param string $data - * @param string $signature - * @param string $key - * @return bool - * - * @throws Exception - */ - public static function verify(string $data, string $signature, string $key): bool - { - $publicKey = Key::aroBase58ToPem($key); - $signature = (new Base58())->encode($signature); - $publicKeyId = openssl_pkey_get_public($publicKey); - - return (bool) openssl_verify($data, $signature, $publicKeyId, OPENSSL_ALGO_SHA256); - } -} diff --git a/src/Helpers/Key.php b/src/Helpers/Key.php deleted file mode 100644 index 449b39b..0000000 --- a/src/Helpers/Key.php +++ /dev/null @@ -1,71 +0,0 @@ -decode($data)); - $keyData = str_split($keyData, 64); - $keyData = implode(PHP_EOL, $keyData); - - return $isPrivateKey ? - sprintf("%s\n%s\n%s", self::EC_PRIVATE_START, $keyData, self::EC_PRIVATE_END) : - sprintf("%s\n%s\n%s", self::EC_PUBLIC_START, $keyData, self::EC_PUBLIC_END); - } - - /** - * @param string $data - * @return string - * - * @throws Exception - * - * @internal - */ - public static function pemToBase58(string $data): string - { - return (new Base58())->encode(self::decodePemData($data)); - } - - /** - * @param string $data - * @return string - * - * @throws Exception - * - * @internal - */ - private static function decodePemData(string $data): string - { - return base64_decode( - str_replace([ - '-----BEGIN PUBLIC KEY-----', - '-----END PUBLIC KEY-----', - '-----BEGIN EC PRIVATE KEY-----', - '-----END EC PRIVATE KEY-----', - "\n", - ], '', $data) - ); - } -} diff --git a/src/HttpClient/Builder.php b/src/HttpClient/Builder.php new file mode 100644 index 0000000..269d240 --- /dev/null +++ b/src/HttpClient/Builder.php @@ -0,0 +1,114 @@ + */ + private array $plugins = []; + + /** @var array|int|string> */ + private array $headers = []; + + public function __construct( + ClientInterface $httpClient = null, + RequestFactoryInterface $requestFactory = null, + StreamFactoryInterface $streamFactory = null, + ) { + $this->httpClient = $httpClient ?? Psr18ClientDiscovery::find(); + $this->requestFactory = $requestFactory ?? Psr17FactoryDiscovery::findRequestFactory(); + $this->streamFactory = $streamFactory ?? Psr17FactoryDiscovery::findStreamFactory(); + } + + public function getHttpClient(): HttpMethodsClientInterface + { + if ($this->httpClientModified) { + $this->httpClientModified = false; + + $plugins = $this->plugins; + + $this->pluginClient = new HttpMethodsClient( + (new PluginClientFactory())->createClient($this->httpClient, $plugins), + $this->requestFactory, + $this->streamFactory + ); + } + + return $this->pluginClient; + } + + public function addPlugin(Plugin $plugin): void + { + $this->plugins[] = $plugin; + $this->httpClientModified = true; + } + + /** @param class-string $className */ + public function removePlugin(string $className): void + { + foreach ($this->plugins as $idx => $plugin) { + if ($plugin instanceof $className) { + unset($this->plugins[$idx]); + $this->httpClientModified = true; + } + } + } + + /** + * Clears used headers. + */ + public function clearHeaders(): void + { + $this->headers = []; + + $this->removePlugin(HeaderAppendPlugin::class); + $this->addPlugin(new HeaderAppendPlugin($this->headers)); + } + + /** + * @param array $headers + */ + public function addHeaders(array $headers): void + { + $this->headers = array_merge($this->headers, $headers); + + $this->removePlugin(HeaderAppendPlugin::class); + $this->addPlugin(new HeaderAppendPlugin($this->headers)); + } + + public function addHeaderValue(string $header, string $headerValue): void + { + if (! isset($this->headers[$header])) { + $this->headers[$header] = $headerValue; + } else { + $this->headers[$header] = array_merge((array) $this->headers[$header], [$headerValue]); + } + + $this->removePlugin(HeaderAppendPlugin::class); + $this->addPlugin(new HeaderAppendPlugin($this->headers)); + } +} diff --git a/src/HttpClient/Message/ResponseMediator.php b/src/HttpClient/Message/ResponseMediator.php new file mode 100644 index 0000000..1f370c7 --- /dev/null +++ b/src/HttpClient/Message/ResponseMediator.php @@ -0,0 +1,29 @@ +|string */ + public static function getContent(ResponseInterface $response): array|string + { + $body = $response->getBody()->__toString(); + if (str_starts_with($response->getHeaderLine('Content-Type'), 'application/json')) { + $content = json_decode($body, true, 512, JSON_THROW_ON_ERROR); + if (JSON_ERROR_NONE === json_last_error()) { + return $content; + } + } + + return $body; + } + + public static function getHeader(ResponseInterface $response, string $name): string|null + { + $headers = $response->getHeader($name); + + return array_shift($headers); + } +} diff --git a/src/Models/Account.php b/src/Models/Account.php deleted file mode 100644 index 5a65cf5..0000000 --- a/src/Models/Account.php +++ /dev/null @@ -1,84 +0,0 @@ -publicKey = $publicKey; - $this->privateKey = $privateKey; - } - - /** - * @return self - * - * @throws GenericLocalException - */ - public static function make(): self - { - try { - // Using secp256k1 curve for ECDSA - $args = [ - 'curve_name' => self::CURVE_NAME, - 'private_key_type' => self::PRIVATE_KEY_TYPE, - ]; - - // Generates a new key pair - $keyPair = openssl_pkey_new($args); - - // Exports the private key encoded as PEM - openssl_pkey_export($keyPair, $privateKeyPem); - - // Converts the PEM to a base58 format - $privateKey = Key::pemToBase58($privateKeyPem); - - // Exports the private key encoded as PEM - $pub = openssl_pkey_get_details($keyPair); - - // Converts the PEM to a base58 format - $publicKey = Key::pemToBase58($pub['key']); - } catch (Exception $exception) { - throw GenericLocalException::failedToGenerateLocalAccountKeyPair(); - } - - return new self($publicKey, $privateKey); - } - - public function getAddress(): string - { - $hash = $this->publicKey; - - // Hashes 9 times in sha512 (binary) and encodes in base58 - for ($i = 0; $i < 9; $i++) { - $hash = hash('sha512', $hash, true); - } - - return (new Base58())->encode($hash); - } - - public function getPublicKey(): string - { - return $this->publicKey; - } - - public function getPrivateKey(): string - { - return $this->privateKey; - } -} diff --git a/src/Models/Asset.php b/src/Models/Asset.php deleted file mode 100644 index df2c2a8..0000000 --- a/src/Models/Asset.php +++ /dev/null @@ -1,88 +0,0 @@ -maxSupply = $maxSupply; - $this->price = $price; - $this->tradable = $isTradable; - $this->dividendOnly = $dividendOnly; - $this->autoDivident = $autoDivident; - $this->allowBid = $allowBid; - } - - public function getMaxSupply(): int - { - return $this->maxSupply; - } - - public function getPrice(): float - { - return $this->price; - } - - public function isAutoDivident(): bool - { - return $this->autoDivident; - } - - public function isAllowingBids(): bool - { - return $this->allowBid; - } - - public function isDividendOnly(): bool - { - return $this->dividendOnly; - } - - public function isTradable(): bool - { - return $this->tradable; - } - - /** @return array{int,0|1,string,0|1,0|1,0|1} */ - public function toArray(): array - { - return [ - $this->getMaxSupply(), - (int) $this->isTradable(), - number_format($this->getPrice(), 8, '.', ''), - (int) $this->isDividendOnly(), - (int) $this->isAutoDivident(), - (int) $this->isAllowingBids(), - ]; - } - - public function __toString(): string - { - return (string) json_encode($this->toArray()); - } -} diff --git a/src/Models/Transaction.php b/src/Models/Transaction.php deleted file mode 100644 index 80d858e..0000000 --- a/src/Models/Transaction.php +++ /dev/null @@ -1,216 +0,0 @@ -value = $value; - - return $this; - } - - public function changeFee(float $fee): self - { - $this->fee = $fee; - - return $this; - } - - public function changeDestinationAddress(string $destinationAddress): self - { - $this->destinationAddress = $destinationAddress; - - return $this; - } - - public function changePublicKey(string $publicKey): self - { - $this->publicKey = $publicKey; - - return $this; - } - - public function changeSignature(string $signature): self - { - $this->signature = $signature; - - return $this; - } - - public function changePrivateKey(string $privateKey): self - { - $this->privateKey = $privateKey; - - return $this; - } - - public function changeDate(int $date): self - { - $this->date = $date; - - return $this; - } - - public function changeMessage(string $message): self - { - $this->message = $message; - - return $this; - } - - public function changeVersion(int $version): self - { - $this->version = $version; - - return $this; - } - - public function getValue(): float - { - return $this->value; - } - - public function getFee(): float - { - return $this->fee; - } - - public function getDestinationAddress(): string - { - return $this->destinationAddress; - } - - public function getPublicKey(): string - { - return $this->publicKey; - } - - public function getSignature(): ?string - { - return $this->signature; - } - - public function getPrivateKey(): ?string - { - return $this->privateKey; - } - - public function getDate(): int - { - return $this->date; - } - - public function getMessage(): string - { - return $this->message; - } - - public function getVersion(): int - { - return $this->version; - } - - public function sign(string $privateKey): self - { - $signatureData = sprintf( - '%s-%s-%s-%s-%s-%s-%s', - $this->getValue(), - $this->getFee(), - $this->getDestinationAddress(), - $this->getMessage(), - $this->getVersion(), - $this->getPublicKey(), - $this->getDate() - ); - - try { - $this->signature = EllipticCurve::sign($signatureData, $privateKey); - } catch (Exception $e) { - throw SignatureException::unableToGenerateSignature(); - } - - return $this; - } - - /** @return array */ - public function toArray(): array - { - return [ - 'date' => $this->getDate(), - 'dst' => $this->getDestinationAddress(), - 'fee' => $this->getFee(), - 'message' => $this->getMessage(), - 'private_key' => $this->getPrivateKey(), - 'public_key' => $this->getPublicKey(), - 'signature' => $this->getSignature(), - 'val' => $this->getValue(), - 'version' => $this->getVersion(), - ]; - } -} diff --git a/src/Transaction/TransactionFactory.php b/src/Transaction/TransactionFactory.php deleted file mode 100644 index 5ecbcaa..0000000 --- a/src/Transaction/TransactionFactory.php +++ /dev/null @@ -1,176 +0,0 @@ -changeVersion(Version::ALIAS_SEND); - $transaction->changeDestinationAddress($alias); - $transaction->changeValue($value); - $transaction->changeMessage($message); - - return $transaction; - } - - /* Retrieve a pre-populated Transaction instance for setting an alias */ - public static function makeAliasSetInstance(string $address, string $alias): Transaction - { - $transaction = new Transaction(); - - $transaction->changeVersion(Version::ALIAS_SET); - $transaction->changeDestinationAddress($address); - $transaction->changeValue(Transaction::VALUE_ALIAS_SET); - $transaction->changeFee(Transaction::FEE_ALIAS_SET); - $transaction->changeMessage($alias); - - return $transaction; - } - - /* Retrieve a pre-populated Transaction instance for creating a masternode */ - public static function makeMasternodeCreateInstance(string $ipAddress, string $address): Transaction - { - $transaction = new Transaction(); - - $transaction->changeVersion(Version::MASTERNODE_CREATE); - $transaction->changeDestinationAddress($address); - $transaction->changeValue(Transaction::VALUE_MASTERNODE_CREATE); - $transaction->changeFee(Transaction::FEE_MASTERNODE_CREATE); - $transaction->changeMessage($ipAddress); - - return $transaction; - } - - /* Retrieve a pre-populated Transaction instance for pausing a masternode */ - public static function makeMasternodePauseInstance(string $address): Transaction - { - $transaction = new Transaction(); - - $transaction->changeVersion(Version::MASTERNODE_PAUSE); - - return self::configureMasternodeCommandDefaults($address, $transaction); - } - - /* Retrieve a pre-populated Transaction instance for resuming a masternode */ - public static function makeMasternodeResumeInstance(string $address): Transaction - { - $transaction = new Transaction(); - - $transaction->changeVersion(Version::MASTERNODE_RESUME); - - return self::configureMasternodeCommandDefaults($address, $transaction); - } - - /* Retrieve a pre-populated Transaction instance for releasing a masternode */ - public static function makeMasternodeReleaseInstance(string $address): Transaction - { - $transaction = new Transaction(); - - $transaction->changeVersion(Version::MASTERNODE_RELEASE); - - return self::configureMasternodeCommandDefaults($address, $transaction); - } - - /* Retrieve a pre-populated Transaction instance for creating an asset */ - public static function makeAssetCreateInstance( - Asset $asset - ): Transaction { - $transaction = new Transaction(); - - $transaction->changeVersion(Version::ASSET_CREATE); - $transaction->changeMessage((string) $asset); - $transaction->changeValue(100); - - return $transaction; - } - - /* Retrieve a pre-populated Transaction instance for sending an asset */ - public static function makeAssetSendInstance( - string $assetId, - string $destination, - float $value - ): Transaction { - $transaction = new Transaction(); - - $transaction->changeDestinationAddress($destination); - $transaction->changeVersion(Version::ASSET_SEND); - $transaction->changeMessage(json_encode([$assetId, $value])); - $transaction->changeValue(0.00000001); - - return $transaction; - } - - /* Retrieve a pre-populated Transaction instance for creating a market order for an asset */ - public static function makeAssetMarketInstance( - string $assetId, - float $price, - float $assetAmount, - string $orderType, - bool $isCancelable - ): Transaction { - $transaction = new Transaction(); - - $transaction->changeVersion(Version::ASSET_MARKET); - $transaction->changeMessage(json_encode([$assetId, $price, $assetAmount, $isCancelable, $orderType])); - $transaction->changeValue(0.00000001); - - return $transaction; - } - - /* Retrieve a pre-populated Transaction instance for cancelling a market order for an asset */ - public static function makeAssetCancelOrderInstance(string $orderId): Transaction - { - $transaction = new Transaction(); - - $transaction->changeVersion(Version::ASSET_CANCEL_ORDER); - $transaction->changeMessage($orderId); - $transaction->changeValue(0.00000001); - - return $transaction; - } - - /* Retrieve a pre-populated Transaction instance for sending dividends for an asset */ - public static function makeAssetDividendsInstance(float $value): Transaction - { - $transaction = new Transaction(); - - $transaction->changeVersion(Version::ASSET_DIVIDENDS); - $transaction->changeMessage(''); - $transaction->changeValue($value); - - return $transaction; - } - - /* Retrieve a pre-populated Transaction instance for sending dividends for an asset */ - public static function makeAssetInflateInstance(float $assetAmount): Transaction - { - $transaction = new Transaction(); - - $transaction->changeVersion(Version::ASSET_INFLATE); - $transaction->changeMessage((string) $assetAmount); - $transaction->changeValue(0.00000001); - - return $transaction; - } - - /* Set the default fee and value for masternode commands */ - private static function configureMasternodeCommandDefaults(string $address, Transaction $transaction): Transaction - { - $transaction->changeDestinationAddress($address); - $transaction->changeValue(Transaction::VALUE_MASTERNODE_COMMAND); - $transaction->changeFee(Transaction::FEE_MASTERNODE_COMMAND); - - return $transaction; - } -} diff --git a/tests/.gitkeep b/tests/.gitkeep new file mode 100644 index 0000000..e69de29 diff --git a/tests/Concerns/InteractsWithArionum.php b/tests/Concerns/InteractsWithArionum.php deleted file mode 100644 index 4951b62..0000000 --- a/tests/Concerns/InteractsWithArionum.php +++ /dev/null @@ -1,19 +0,0 @@ -arionum = new Arionum($testNode, $client); - } -} diff --git a/tests/Feature/AccountTest.php b/tests/Feature/AccountTest.php deleted file mode 100644 index 860b78a..0000000 --- a/tests/Feature/AccountTest.php +++ /dev/null @@ -1,55 +0,0 @@ -withArionum(); - -$testAddress = '51sJ4LbdKzhyGy4zJGqodNLse9n9JsVT2rdeH92w7cf3qQuSDJupvjbUT1UBr7r1SCUAXG97saxn7jt2edKb4v4J'; -$testPublicKey = 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyk7aKeBJ6LL44w5JGSFp82Wb1Drqicuznv1qmRVQMvbmF64AeczjMtV72acGLR9RsiQ2JccemNrSPkKi8KDk72t4'; - -it('generates a new account', function (): void { - $data = $this->arionum->generateAccount(); - - expect($data->getPublicKey())->toStartWith('PZ'); - expect($data->getPrivateKey())->toStartWith('Lz'); -}); - -it('gets the balance for a test address', function () use ($testAddress): void { - $data = $this->arionum->getBalance($testAddress); - expect($data)->toBeNumeric(); -}); - -it('gets the balance for a test alias', function (): void { - $data = $this->arionum->getBalanceByAlias('PXGAMER'); - expect($data)->toBeNumeric(); -}); - -it('gets the balance for a public key', function () use ($testPublicKey): void { - $data = $this->arionum->getBalanceByPublicKey($testPublicKey); - expect($data)->toBeNumeric(); -}); - -it('gets the pending balance for a public key', function () use ($testPublicKey): void { - $data = $this->arionum->getPendingBalance($testPublicKey); - expect($data)->toBeNumeric(); -}); - -it('gets the transactions for an address', function () use ($testAddress): void { - $data = $this->arionum->getTransactions($testAddress); - expect($data)->toBeArray()->not->toBeEmpty(); -}); - -it('gets the transactions for a public key', function () use ($testPublicKey): void { - $data = $this->arionum->getTransactionsByPublicKey($testPublicKey); - expect($data)->toBeArray()->not->toBeEmpty(); -}); - -it('gets the alias for an address', function () use ($testAddress): void { - $data = $this->arionum->getAlias($testAddress); - expect($data)->toEqual('PXGAMER'); -}); - -it('checks that an address is valid', function () use ($testAddress): void { - $data = $this->arionum->checkAddress($testAddress); - expect($data)->toBeTrue(); -}); diff --git a/tests/Feature/AssetTest.php b/tests/Feature/AssetTest.php deleted file mode 100644 index 77a0fa1..0000000 --- a/tests/Feature/AssetTest.php +++ /dev/null @@ -1,69 +0,0 @@ - $handler]); - - $this->withArionum(null, $client); - - $data = $this->arionum->getAssetBalance($testAddress); - - expect($data)->toBeArray()->toBeEmpty(); -}); - -it('can retrieve orders for an asset', function () use ($testAddress): void { - $mock = new MockHandler([ - new Response(200, [], '{"data": [], "status": "ok"}'), - ]); - - $handler = HandlerStack::create($mock); - $client = new Client(['handler' => $handler]); - - $this->withArionum(null, $client); - - $data = $this->arionum->getAssetOrders($testAddress); - - expect($data)->toBeArray()->toBeEmpty(); -}); - -it('can retrieve available assets', function (): void { - $mock = new MockHandler([ - new Response(200, [], '{"data": [], "status": "ok"}'), - ]); - - $handler = HandlerStack::create($mock); - $client = new Client(['handler' => $handler]); - - $this->withArionum(null, $client); - - $data = $this->arionum->getAssets(); - - expect($data)->toBeArray()->toBeEmpty(); -}); - -it('can retrieve an asset', function () use ($testAsset): void { - $mock = new MockHandler([ - new Response(200, [], '{"data": [], "status": "ok"}'), - ]); - - $handler = HandlerStack::create($mock); - $client = new Client(['handler' => $handler]); - - $this->withArionum(null, $client); - - $data = $this->arionum->getAsset($testAsset); - - expect($data)->toBeArray()->toBeEmpty(); -}); diff --git a/tests/Feature/Base58Test.php b/tests/Feature/Base58Test.php deleted file mode 100644 index 1df32fc..0000000 --- a/tests/Feature/Base58Test.php +++ /dev/null @@ -1,13 +0,0 @@ -withArionum(); - -it('gets a base58 value for input data', function (): void { - $inputData = 'dataIsHere'; - $outputData = '6e6WaupsT6FzH2'; - - $data = $this->arionum->getBase58($inputData); - expect($data)->toEqual($outputData); -}); diff --git a/tests/Feature/BlockTest.php b/tests/Feature/BlockTest.php deleted file mode 100644 index 6628fcd..0000000 --- a/tests/Feature/BlockTest.php +++ /dev/null @@ -1,24 +0,0 @@ -withArionum(); - -it('gets the current block', function (): void { - $data = $this->arionum->getCurrentBlock(); - - expect($data)->toHaveProperty('id')->toHaveProperty('signature'); -}); - -it('gets a block by its height', function (): void { - $data = $this->arionum->getBlock(1); - - expect($data)->toHaveProperty('id')->toHaveProperty('signature'); -}); - -it('gets the transactions for a specific block', function (): void { - $testBlockId = 'ceiirEsfXyQh3Tnyp6RuSnRANAxNW7BvVGxDUzKFcBH9yHfPa1Jq2oPGH7P41X6Puwn2ajtydn1aHSPhV8X8Sg2'; - $data = $this->arionum->getBlockTransactions($testBlockId); - - expect($data)->toBeArray()->not->toBeEmpty(); -}); diff --git a/tests/Feature/EllipticCurveTest.php b/tests/Feature/EllipticCurveTest.php deleted file mode 100644 index fe5697a..0000000 --- a/tests/Feature/EllipticCurveTest.php +++ /dev/null @@ -1,56 +0,0 @@ -testPublicKey = 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1A2mEcXXCtruh98hrXyaeDZjb1bVQkKUYoEhW3TAJdAVvdCya99DqyeyBa8kBLoJQRriAguY4voHfWrQak8gnySA'; - $this->testPrivateKey = 'Lzhp9LopCNY4o9DV7Gwobbrb9j1nf9npfYLQN82UcB216dR24wJuytEvNg2obfJJJrjM4ystTnXiF2uU6TDrxA6PgRyRDsUaAgZrp6b5XAfeCLSqhzqmZN9tmNMWPHC6yvLbTd3od42avYZYjAV3r2zg8uWhHhQgS'; -}); - -it('can sign data using a private key', function (): void { - $signature = EllipticCurve::sign('test-data', $this->testPrivateKey); - $verified = EllipticCurve::verify('test-data', $signature, $this->testPublicKey); - - expect($verified)->toBeTrue(); -}); - -it('can generate a signature for a transaction', function (): void { - $data = new Transaction(); - - $data->changePublicKey($this->testPublicKey); - $data->changeValue(1); - $data->changeFee(1); - $data->changeDestinationAddress('pxgamer'); - $data->changeMessage(''); - $data->changeDate(time()); - - $signatureData = sprintf( - '%s-%s-%s-%s-%s-%s-%s', - $data->getValue(), - $data->getFee(), - $data->getDestinationAddress(), - $data->getMessage(), - $data->getVersion(), - $data->getPublicKey(), - $data->getDate() - ); - - $data->sign($this->testPrivateKey); - - expect(EllipticCurve::verify($signatureData, $data->getSignature(), $this->testPublicKey))->toBeTrue(); -}); - -it('throws an exception on an invalid private key', function (): void { - $data = new Transaction(); - - $data->changePublicKey($this->testPublicKey); - $data->changeValue(1); - $data->changeFee(1); - $data->changeDestinationAddress('pxgamer'); - $data->changeMessage(''); - $data->changeDate(time()); - - $data->sign(''); -})->throws(SignatureException::class); diff --git a/tests/Feature/KeyTest.php b/tests/Feature/KeyTest.php deleted file mode 100644 index dbbdbd4..0000000 --- a/tests/Feature/KeyTest.php +++ /dev/null @@ -1,49 +0,0 @@ -withArionum(); - -$testAddress = '51sJ4LbdKzhyGy4zJGqodNLse9n9JsVT2rdeH92w7cf3qQuSDJupvjbUT1UBr7r1SCUAXG97saxn7jt2edKb4v4J'; -$testPublicKey = 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyk7aKeBJ6LL44w5JGSFp82Wb1Drqicuznv1qmRVQMvbmF64AeczjMtV72acGLR9RsiQ2JccemNrSPkKi8KDk72t4'; -$testSignature = 'AN1rKroKawax5azYrLbasV7VycYAvQXFKrJ69TFYEfmanXwVRrUQTCx5gQ1eVNMgEVzrEz3VzLsfrVVpUYqgB5eT2qsFtaSsw'; -$testSignatureComponents = "1.00000000-0.00250000-PXGAMER--2-{$testPublicKey}-1533911370"; - -it('throws an exception when invalid public key is provided', function (): void { - $this->arionum->getAddress('INVALID-PUBLIC-KEY'); -})->throws(GenericApiException::class); - -it('gets an address from a public key', function () use ($testAddress, $testPublicKey): void { - $data = $this->arionum->getAddress($testPublicKey); - expect($data)->toEqual($testAddress); -}); - -it('gets a public key from an address', function () use ($testAddress, $testPublicKey): void { - $data = $this->arionum->getPublicKey($testAddress); - expect($data === $testPublicKey || $data === '')->toBeTrue(); -}); - -it( - 'checks that the public key signature is valid', - function () use ($testPublicKey, $testSignature, $testSignatureComponents): void { - $data = $this->arionum->checkSignature( - $testSignature, - $testSignatureComponents, - $testPublicKey - ); - - expect($data)->toBeTrue(); - } -); - -it('checks that the public key signature is invalid', function () use ($testPublicKey, $testSignature): void { - $data = $this->arionum->checkSignature( - $testSignature, - 'invalid-string', - $testPublicKey - ); - - expect($data)->toBeFalse(); -}); diff --git a/tests/Feature/LocalAccountTest.php b/tests/Feature/LocalAccountTest.php deleted file mode 100644 index de8b136..0000000 --- a/tests/Feature/LocalAccountTest.php +++ /dev/null @@ -1,19 +0,0 @@ -getPublicKey())->toStartWith('PZ'); - expect($account->getPrivateKey())->toStartWith('Lz'); -}); - -it('can generate a local account via the helper', function (): void { - $this->withArionum(); - - $account = $this->arionum->generateLocalAccount(); - - expect($account->getPublicKey())->toStartWith('PZ'); - expect($account->getPrivateKey())->toStartWith('Lz'); -}); diff --git a/tests/Feature/NodeTest.php b/tests/Feature/NodeTest.php deleted file mode 100644 index b7d2e8f..0000000 --- a/tests/Feature/NodeTest.php +++ /dev/null @@ -1,65 +0,0 @@ -withArionum(); - -it('gets the node address', function (): void { - $data = $this->arionum->getNodeAddress(); - expect($data)->toEqual(TestCase::TEST_NODE); -}); - -it('gets the version for the current node', function (): void { - $data = $this->arionum->getNodeVersion(); - expect($data)->not->toBeEmpty(); -}); - -it('gets the sanity details for the current node', function (): void { - $data = $this->arionum->getSanityDetails(); - - expect($data->sanity_running)->toBeBool(); - expect($data->last_sanity)->toBeNumeric(); - expect($data->sanity_sync)->toBeBool(); -}); - -it('gets the information for the current node', function (): void { - $mock = new MockHandler([ - new Response(200, [], json_encode([ - 'status' => 'ok', - 'data' => [ - 'hostname' => 'https://aro.example.com', - 'version' => '0.4.5', - 'dbversion' => '9', - 'accounts' => 14817, - 'transactions' => 2779519, - 'mempool' => 8, - 'masternodes' => 484, - 'peers' => 108, - ], - 'coin' => 'arionum', - ], JSON_THROW_ON_ERROR)), - ]); - - $handler = HandlerStack::create($mock); - $client = new Client(['handler' => $handler]); - - $this->withArionum(null, $client); - - $data = $this->arionum->getNodeInfo(); - - expect($data->hostname)->toBeString(); - expect($data->version)->toBeString(); - expect($data->dbversion)->toBeString(); - expect($data->accounts)->toBeInt(); - expect($data->transactions)->toBeInt(); - expect($data->mempool)->toBeInt(); - expect($data->masternodes)->toBeInt(); - - expect($data->hostname)->toEqual('https://aro.example.com'); -}); diff --git a/tests/Feature/OtherTest.php b/tests/Feature/OtherTest.php deleted file mode 100644 index fdc6804..0000000 --- a/tests/Feature/OtherTest.php +++ /dev/null @@ -1,41 +0,0 @@ -withArionum(); - -/** This should never have enough funds. */ -it('throws an exception when sending a transaction from an empty account', function (): void { - $testSendPublicKey = 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1Hm7fGpQAgh1goGj8G47RmU68i3mP4erGGrJ1LNBzEy4di4jZKA2Z6ee96VxaDMUnzSthyzMSyhqF1DbLwNKPim2'; - $testSendPrivateKey = 'Lzhp9LopCDbzk3eSdzuL5f9cR9ng12s6gNonQET3kSLtZU4MbQVreDRFjoWcEdUyeUN3tKwpR4AuakWfT6LeCg4trqQ2YSy2q1pUCJppyPBFW89m3xZKhFgMhJgApkevYxYyn1GPDEpmuSUkYhDfEf68xrGNYAhEc'; - - $transaction = new Transaction(); - $transaction->changeValue(1.0); - $transaction->changeFee(1.0); - $transaction->changeDestinationAddress(TestCase::TEST_ADDRESS); - $transaction->changePublicKey($testSendPublicKey); - $transaction->changeSignature(''); - $transaction->changePrivateKey($testSendPrivateKey); - $transaction->changeMessage('This should fail.'); - $transaction->changeDate(time()); - $transaction->changeVersion(Version::STANDARD); - - $this->arionum->sendTransaction($transaction); -})->throws(GenericApiException::class, 'Not enough funds'); - -it('gets a randomly generated number', function (): void { - $testRandomNumber = 75; - - $data = $this->arionum->getRandomNumber(1, 1, 100, TestCase::TEST_NODE); - expect($data)->toEqual($testRandomNumber); -}); - -it('gets a list of masternodes', function (): void { - $data = $this->arionum->getMasternodes(); - expect($data)->not->toBeEmpty(); -}); diff --git a/tests/Feature/TransactionTest.php b/tests/Feature/TransactionTest.php deleted file mode 100644 index 7fee0a8..0000000 --- a/tests/Feature/TransactionTest.php +++ /dev/null @@ -1,124 +0,0 @@ -testTransactionId = '2bAhimfbpzbKuH2E3uFZjK2cBQ9KrUtSvHPXdnGYSqYRE6tYVkLYa9hqTZpyjp6s2ZVoxpWaz5JvgyL8sYjM8Zsq'; - $this->testAlias = 'pxgamer'; - $this->testIp = '127.0.0.1'; -})->withArionum(); - -it('gets a transaction by its id', function (): void { - $data = $this->arionum->getTransaction($this->testTransactionId); - $this->assertObjectHasAttribute('version', $data); -}); - -it('gets the number of transactions in the mempool', function (): void { - $data = $this->arionum->getMempoolSize(); - $this->assertIsInt($data); -}); - -it('can generate an alias send transaction', function (): void { - $data = TransactionFactory::makeAliasSendInstance($this->testAlias, 1.0); - $this->assertEquals($this->testAlias, $data->getDestinationAddress()); - $this->assertEquals(1.0, $data->getValue()); - $this->assertEquals(Version::ALIAS_SEND, $data->getVersion()); -}); - -it('can generate an alias set transaction', function (): void { - $data = TransactionFactory::makeAliasSetInstance(TestCase::TEST_ADDRESS, $this->testAlias); - $this->assertEquals(TestCase::TEST_ADDRESS, $data->getDestinationAddress()); - $this->assertEquals($this->testAlias, $data->getMessage()); - $this->assertEquals(Version::ALIAS_SET, $data->getVersion()); - $this->assertEquals(Transaction::VALUE_ALIAS_SET, $data->getValue()); -}); - -it('can generate a masternode create transaction', function (): void { - $data = TransactionFactory::makeMasternodeCreateInstance($this->testIp, TestCase::TEST_ADDRESS); - $this->assertEquals(TestCase::TEST_ADDRESS, $data->getDestinationAddress()); - $this->assertEquals($this->testIp, $data->getMessage()); - $this->assertEquals(Version::MASTERNODE_CREATE, $data->getVersion()); - $this->assertEquals(Transaction::VALUE_MASTERNODE_CREATE, $data->getValue()); - $this->assertEquals(Transaction::FEE_MASTERNODE_CREATE, $data->getFee()); -}); - -it('can generate a masternode pause transaction', function (): void { - $data = TransactionFactory::makeMasternodePauseInstance(TestCase::TEST_ADDRESS); - $this->assertEquals(TestCase::TEST_ADDRESS, $data->getDestinationAddress()); - $this->assertEquals(Version::MASTERNODE_PAUSE, $data->getVersion()); - $this->assertEquals(Transaction::VALUE_MASTERNODE_COMMAND, $data->getValue()); - $this->assertEquals(Transaction::FEE_MASTERNODE_COMMAND, $data->getFee()); -}); - -it('can generate a masternode resume transaction', function (): void { - $data = TransactionFactory::makeMasternodeResumeInstance(TestCase::TEST_ADDRESS); - $this->assertEquals(TestCase::TEST_ADDRESS, $data->getDestinationAddress()); - $this->assertEquals(Version::MASTERNODE_RESUME, $data->getVersion()); - $this->assertEquals(Transaction::VALUE_MASTERNODE_COMMAND, $data->getValue()); - $this->assertEquals(Transaction::FEE_MASTERNODE_COMMAND, $data->getFee()); -}); - -it('can generate a masternode release transaction', function (): void { - $data = TransactionFactory::makeMasternodeReleaseInstance(TestCase::TEST_ADDRESS); - $this->assertEquals(TestCase::TEST_ADDRESS, $data->getDestinationAddress()); - $this->assertEquals(Version::MASTERNODE_RELEASE, $data->getVersion()); - $this->assertEquals(Transaction::VALUE_MASTERNODE_COMMAND, $data->getValue()); - $this->assertEquals(Transaction::FEE_MASTERNODE_COMMAND, $data->getFee()); -}); - -it('can generate an asset create transaction', function (): void { - $asset = new Asset(100, 1, false, false, false, false); - - $data = TransactionFactory::makeAssetCreateInstance($asset); - - $this->assertEquals(Version::ASSET_CREATE, $data->getVersion()); - $this->assertEquals(100, $data->getValue()); - $this->assertEquals(json_encode([100, 0, '1.00000000', 0, 0, 0]), $data->getMessage()); -}); - -it('can generate an asset send transaction', function (): void { - $data = TransactionFactory::makeAssetSendInstance('ARO', 'ARO', 1.0); - - $this->assertEquals(Version::ASSET_SEND, $data->getVersion()); - $this->assertEquals(0.00000001, $data->getValue()); - $this->assertEquals(json_encode(['ARO', 1.0]), $data->getMessage()); - $this->assertEquals('ARO', $data->getDestinationAddress()); -}); - -it('can generate an asset market transaction', function (): void { - $data = TransactionFactory::makeAssetMarketInstance('ARO', 1.0, 1.0, 'ask', false); - - $this->assertEquals(Version::ASSET_MARKET, $data->getVersion()); - $this->assertEquals(0.00000001, $data->getValue()); - $this->assertEquals(json_encode(['ARO', 1.0, 1.0, false, 'ask']), $data->getMessage()); -}); - -it('can generate an asset cancel order transaction', function (): void { - $data = TransactionFactory::makeAssetCancelOrderInstance('order-id'); - - $this->assertEquals(Version::ASSET_CANCEL_ORDER, $data->getVersion()); - $this->assertEquals(0.00000001, $data->getValue()); - $this->assertEquals('order-id', $data->getMessage()); -}); - -it('can generate an asset dividends transaction', function (): void { - $data = TransactionFactory::makeAssetDividendsInstance(100); - - $this->assertEquals(Version::ASSET_DIVIDENDS, $data->getVersion()); - $this->assertEquals(100, $data->getValue()); - $this->assertEquals('', $data->getMessage()); -}); - -it('can generate an asset inflate transaction', function (): void { - $data = TransactionFactory::makeAssetInflateInstance(1); - - $this->assertEquals(Version::ASSET_INFLATE, $data->getVersion()); - $this->assertEquals(0.00000001, $data->getValue()); - $this->assertEquals('1', $data->getMessage()); -}); diff --git a/tests/Pest.php b/tests/Pest.php deleted file mode 100644 index 2989d6d..0000000 --- a/tests/Pest.php +++ /dev/null @@ -1,5 +0,0 @@ -in('Feature'); diff --git a/tests/TestCase.php b/tests/TestCase.php deleted file mode 100644 index da23be9..0000000 --- a/tests/TestCase.php +++ /dev/null @@ -1,24 +0,0 @@ -withArionum(); - } -} From 78e2106cfe257ebf1c51e2d44c6dace378f91fe8 Mon Sep 17 00:00:00 2001 From: Owen Voke Date: Thu, 6 Oct 2022 12:50:31 +0100 Subject: [PATCH 03/13] docs: update usage --- README.md | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 8c6fa7a..1160282 100644 --- a/README.md +++ b/README.md @@ -7,19 +7,37 @@ [![Total Downloads][ico-downloads]][link-downloads] [![Buy us a tree][ico-treeware-gifting]][link-treeware-gifting] -An API wrapper for the Arionum cryptocurrency node. +An API wrapper for the Arionum cryptocurrency node + +## Requirements + +- PHP >= 8.1 +- A [PSR-17 implementation](https://packagist.org/providers/psr/http-factory-implementation) +- A [PSR-18 implementation](https://packagist.org/providers/psr/http-client-implementation) ## Install Via Composer ```shell -composer require owenvoke/arionum-php +composer require owenvoke/arionum-php guzzlehttp/guzzle:^7.5 http-interop/http-factory-guzzle:^1.2 ``` +We are decoupled from any HTTP messaging client with help by [HTTPlug](https://httplug.io). + ## Usage -Please see the [live usage docs](https://arionum-php.netlify.app), or the [docs](docs) directory, for information on using this library. +**Basic usage** + +```php +// Include the Composer autoloader +require_once __DIR__ . '/vendor/autoload.php'; + +$client = new \OwenVoke\Arionum\Client(); +$client->node()->version(); +``` + +Please see the [live usage docs](https://arionum-php.netlify.app), or the [docs](./docs) directory, for information on using this library. ## Change log From 118e4afdaff10ec18d1327fcabf2dd6231020cab Mon Sep 17 00:00:00 2001 From: Owen Voke Date: Thu, 6 Oct 2022 13:15:54 +0100 Subject: [PATCH 04/13] tests: begin work on tests --- src/Api/Account.php | 14 +++++------ src/Client.php | 7 ++++++ src/Enums/Node.php | 2 +- tests/.gitkeep | 0 tests/Api/AccountTest.php | 43 ++++++++++++++++++++++++++++++++++ tests/Api/AssetTest.php | 15 ++++++++++++ tests/Api/BlockTest.php | 13 +++++++++++ tests/Api/NodeTest.php | 15 ++++++++++++ tests/Api/OtherTest.php | 13 +++++++++++ tests/Api/TransactionTest.php | 18 ++++++++++++++ tests/ClientTest.php | 44 +++++++++++++++++++++++++++++++++++ tests/Pest.php | 7 ++++++ tests/TestCase.php | 34 +++++++++++++++++++++++++++ 13 files changed, 217 insertions(+), 8 deletions(-) delete mode 100644 tests/.gitkeep create mode 100644 tests/Api/AccountTest.php create mode 100644 tests/Api/AssetTest.php create mode 100644 tests/Api/BlockTest.php create mode 100644 tests/Api/NodeTest.php create mode 100644 tests/Api/OtherTest.php create mode 100644 tests/Api/TransactionTest.php create mode 100644 tests/ClientTest.php create mode 100644 tests/Pest.php create mode 100644 tests/TestCase.php diff --git a/src/Api/Account.php b/src/Api/Account.php index 5f6e969..48cbe96 100644 --- a/src/Api/Account.php +++ b/src/Api/Account.php @@ -6,6 +6,13 @@ class Account extends AbstractApi { + public function generate(): array + { + return $this->get(self::API_PATH, [ + 'q' => 'generateAccount', + ]); + } + public function address(string $publicKey): array { return $this->get(self::API_PATH, [ @@ -30,13 +37,6 @@ public function publicKey(string $address): array ]); } - public function generate(): array - { - return $this->get(self::API_PATH, [ - 'q' => 'generateAccount', - ]); - } - public function balance(string $address): array { return $this->get(self::API_PATH, [ diff --git a/src/Client.php b/src/Client.php index ef9f7ec..3fcaf5a 100644 --- a/src/Client.php +++ b/src/Client.php @@ -21,11 +21,17 @@ * @method Api\Account accounts() * @method Api\Account address() * @method Api\Account addresses() + * @method Api\Asset asset() + * @method Api\Asset assets() + * @method Api\Block block() + * @method Api\Block blocks() * @method Api\Node node() * @method Api\Node nodes() * @method Api\Other other() * @method Api\Other misc() * @method Api\Other miscellaneous() + * @method Api\Transaction transaction() + * @method Api\Transaction transactions() */ final class Client { @@ -57,6 +63,7 @@ public function api(string $name): AbstractApi return match ($name) { 'account', 'accounts', 'address', 'addresses' => new Api\Account($this), 'asset', 'assets' => new Api\Asset($this), + 'block', 'blocks' => new Api\Block($this), 'node', 'nodes' => new Api\Node($this), 'other', 'misc', 'miscellaneous' => new Api\Other($this), 'transaction', 'transactions' => new Api\Transaction($this), diff --git a/src/Enums/Node.php b/src/Enums/Node.php index 18c9a2b..5e7b33f 100644 --- a/src/Enums/Node.php +++ b/src/Enums/Node.php @@ -19,7 +19,7 @@ enum Node: string public static function providedOrRandom(string|null $uri = null): string { - if (str_starts_with($uri, 'http')) { + if (str_starts_with($uri ?? '', 'http')) { return $uri; } diff --git a/tests/.gitkeep b/tests/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/tests/Api/AccountTest.php b/tests/Api/AccountTest.php new file mode 100644 index 0000000..70d3aaa --- /dev/null +++ b/tests/Api/AccountTest.php @@ -0,0 +1,43 @@ + $this->apiClass = Account::class); + +it('can generate an account', function () { + $response = [ + 'data' => [ + 'address' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', + 'public_key' => 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPP8v9FpH75La76KNgkUpZ2KiMHxHQsUKFytyEMXFPkh3yC25p5JoiR1dEsTgJJkNSrrkTM96BcMae5h6NeSdrH1', + 'private_key' => 'Lzhp9LopCF2mJMHtXj13vuZorf5qMDmYYpjBMLcUshSyyycjFt7YqSjFrzK4AUFpRWw3XPBYcA2maavRp1kbDe7iHwcLaTVwQ6sH2n5vRqZSoAzvcx4JHACDSF4K6TzA3WdspLXZYKbq612psVmtqBuYwvUkDhd2j', + ], + ]; + + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'generateAccount', + ]) + ->willReturn($response); + + /** @var Account $api */ + expect($api->generate())->toBe($response); +}); + +it('can get an address by public key'); + +it('can get the balance for an address'); + +it('can get the balance for an alias'); + +it('can get the balance for a public key'); + +it('can get the pending balance for a public key'); + +it('can get the alias for an address'); + +it('can get check that an address is valid'); diff --git a/tests/Api/AssetTest.php b/tests/Api/AssetTest.php new file mode 100644 index 0000000..13e1745 --- /dev/null +++ b/tests/Api/AssetTest.php @@ -0,0 +1,15 @@ + $this->apiClass = Asset::class); + +it('can get all assets'); + +it('can get a specific asset'); + +it('can get the asset balance for an account'); + +it('can get the asset orders for an address'); diff --git a/tests/Api/BlockTest.php b/tests/Api/BlockTest.php new file mode 100644 index 0000000..71deb4b --- /dev/null +++ b/tests/Api/BlockTest.php @@ -0,0 +1,13 @@ + $this->apiClass = Asset::class); + +it('can get the current block'); + +it('can get a specific block by its height'); + +it('can get the transactions for a block'); diff --git a/tests/Api/NodeTest.php b/tests/Api/NodeTest.php new file mode 100644 index 0000000..c2db615 --- /dev/null +++ b/tests/Api/NodeTest.php @@ -0,0 +1,15 @@ + $this->apiClass = Asset::class); + +it('can get the version of the current node'); + +it('can get information about the current node'); + +it('can get the sanity details for the current node'); + +it('can get a list of masternodes'); diff --git a/tests/Api/OtherTest.php b/tests/Api/OtherTest.php new file mode 100644 index 0000000..21599fa --- /dev/null +++ b/tests/Api/OtherTest.php @@ -0,0 +1,13 @@ + $this->apiClass = Asset::class); + +it('can get a random number'); + +it('can get the Base58 encoded version of a string'); + +it('can check a signature is valid'); diff --git a/tests/Api/TransactionTest.php b/tests/Api/TransactionTest.php new file mode 100644 index 0000000..a246599 --- /dev/null +++ b/tests/Api/TransactionTest.php @@ -0,0 +1,18 @@ + $this->apiClass = Asset::class); + +it('can get the transactions for an address'); + +it('can get the transactions for a public key'); + +it('can get a specific transaction'); + +it('can create a transaction')->with(TransactionVersion::cases()); + +it('can get the number of transactions in the mempool'); diff --git a/tests/ClientTest.php b/tests/ClientTest.php new file mode 100644 index 0000000..9f4d62b --- /dev/null +++ b/tests/ClientTest.php @@ -0,0 +1,44 @@ +toBeInstanceOf(Client::class) + + // Retrieves Account instance + ->and($client->account())->toBeInstanceOf(Account::class) + ->and($client->accounts())->toBeInstanceOf(Account::class) + ->and($client->address())->toBeInstanceOf(Account::class) + ->and($client->addresses())->toBeInstanceOf(Account::class) + + // Retrieves Asset instance + ->and($client->asset())->toBeInstanceOf(Asset::class) + ->and($client->assets())->toBeInstanceOf(Asset::class) + + // Retrieves Block instance + ->and($client->block())->toBeInstanceOf(Block::class) + ->and($client->blocks())->toBeInstanceOf(Block::class) + + // Retrieves Node instance + ->and($client->node())->toBeInstanceOf(Node::class) + ->and($client->nodes())->toBeInstanceOf(Node::class) + + // Retrieves Other instance + ->and($client->other())->toBeInstanceOf(Other::class) + ->and($client->misc())->toBeInstanceOf(Other::class) + ->and($client->miscellaneous())->toBeInstanceOf(Other::class) + + // Retrieves Other instance + ->and($client->transaction())->toBeInstanceOf(Transaction::class) + ->and($client->transactions())->toBeInstanceOf(Transaction::class); +}); diff --git a/tests/Pest.php b/tests/Pest.php new file mode 100644 index 0000000..05150fa --- /dev/null +++ b/tests/Pest.php @@ -0,0 +1,7 @@ +in('Api'); diff --git a/tests/TestCase.php b/tests/TestCase.php new file mode 100644 index 0000000..137aaba --- /dev/null +++ b/tests/TestCase.php @@ -0,0 +1,34 @@ + */ + protected string $apiClass; + + protected function getApiMock(): MockObject + { + $httpClient = $this->getMockBuilder(ClientInterface::class) + ->onlyMethods(['sendRequest']) + ->getMock(); + + $httpClient + ->expects($this->any()) + ->method('sendRequest'); + + $client = Client::createWithHttpClient($httpClient); + + return $this->getMockBuilder($this->apiClass) + ->onlyMethods(['get', 'post', 'postRaw', 'patch', 'delete', 'put', 'head']) + ->setConstructorArgs([$client]) + ->getMock(); + } +} From 6a87ae76f94ff39b5cfa2efbf649bc89887089ea Mon Sep 17 00:00:00 2001 From: Owen Voke Date: Thu, 6 Oct 2022 17:04:45 +0100 Subject: [PATCH 05/13] tests: add Account tests --- src/Api/Account.php | 34 +++-- src/HttpClient/Message/ResponseMediator.php | 3 +- tests/Api/AccountTest.php | 137 +++++++++++++++++++- 3 files changed, 153 insertions(+), 21 deletions(-) diff --git a/src/Api/Account.php b/src/Api/Account.php index 48cbe96..eb87a68 100644 --- a/src/Api/Account.php +++ b/src/Api/Account.php @@ -13,7 +13,7 @@ public function generate(): array ]); } - public function address(string $publicKey): array + public function address(string $publicKey): string { return $this->get(self::API_PATH, [ 'q' => 'getAddress', @@ -21,7 +21,7 @@ public function address(string $publicKey): array ]); } - public function alias(string $address): array + public function alias(string $address): string { return $this->get(self::API_PATH, [ 'q' => 'getAlias', @@ -29,7 +29,7 @@ public function alias(string $address): array ]); } - public function publicKey(string $address): array + public function publicKey(string $address): string { return $this->get(self::API_PATH, [ 'q' => 'getPublicKey', @@ -37,41 +37,49 @@ public function publicKey(string $address): array ]); } - public function balance(string $address): array + public function balance(string $address): float { - return $this->get(self::API_PATH, [ + return (float) $this->get(self::API_PATH, [ 'q' => 'getBalance', 'account' => $address, ]); } - public function balanceByAlias(string $alias): array + public function balanceByAlias(string $alias): float { - return $this->get(self::API_PATH, [ + return (float) $this->get(self::API_PATH, [ 'q' => 'getBalance', 'alias' => $alias, ]); } - public function balanceByPublicKey(string $publicKey): array + public function balanceForPublicKey(string $publicKey): float { - return $this->get(self::API_PATH, [ + return (float) $this->get(self::API_PATH, [ 'q' => 'getBalance', 'public_key' => $publicKey, ]); } - public function pendingBalance(string $address): array + public function pendingBalance(string $address): float { - return $this->get(self::API_PATH, [ + return (float) $this->get(self::API_PATH, [ 'q' => 'getPendingBalance', 'account' => $address, ]); } - public function checkAddress(string $address, ?string $publicKey = null): array + public function pendingBalanceForPublicKey(string $publicKey): float { - return $this->get(self::API_PATH, [ + return (float) $this->get(self::API_PATH, [ + 'q' => 'getPendingBalance', + 'public_key' => $publicKey, + ]); + } + + public function checkAddress(string $address, ?string $publicKey = null): bool + { + return (bool) $this->get(self::API_PATH, [ 'q' => 'checkAddress', 'account' => $address, 'public_key' => $publicKey, diff --git a/src/HttpClient/Message/ResponseMediator.php b/src/HttpClient/Message/ResponseMediator.php index 1f370c7..14d06d2 100644 --- a/src/HttpClient/Message/ResponseMediator.php +++ b/src/HttpClient/Message/ResponseMediator.php @@ -2,6 +2,7 @@ namespace OwenVoke\Arionum\HttpClient\Message; +use OwenVoke\Arionum\Exception\RuntimeException; use Psr\Http\Message\ResponseInterface; final class ResponseMediator @@ -13,7 +14,7 @@ public static function getContent(ResponseInterface $response): array|string if (str_starts_with($response->getHeaderLine('Content-Type'), 'application/json')) { $content = json_decode($body, true, 512, JSON_THROW_ON_ERROR); if (JSON_ERROR_NONE === json_last_error()) { - return $content; + return $content['data'] ?? throw new RuntimeException('Error: Field "data" was not set', $content); } } diff --git a/tests/Api/AccountTest.php b/tests/Api/AccountTest.php index 70d3aaa..15c0ce6 100644 --- a/tests/Api/AccountTest.php +++ b/tests/Api/AccountTest.php @@ -28,16 +28,139 @@ expect($api->generate())->toBe($response); }); -it('can get an address by public key'); +it('can get an address by public key', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'getAddress', + 'public_key' => 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPP8v9FpH75La76KNgkUpZ2KiMHxHQsUKFytyEMXFPkh3yC25p5JoiR1dEsTgJJkNSrrkTM96BcMae5h6NeSdrH1', + ]) + ->willReturn('2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL'); + + /** @var Account $api */ + expect( + $api->address('PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPP8v9FpH75La76KNgkUpZ2KiMHxHQsUKFytyEMXFPkh3yC25p5JoiR1dEsTgJJkNSrrkTM96BcMae5h6NeSdrH1') + )->toBe('2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL'); +}); + +it('can get the balance for an address', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'getBalance', + 'account' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', + ]) + ->willReturn('0'); + + /** @var Account $api */ + expect( + $api->balance('2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL') + )->toBe(0.0); +}); + +it('can get the balance for an alias', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'getBalance', + 'alias' => 'dev', + ]) + ->willReturn('0'); + + /** @var Account $api */ + expect( + $api->balanceByAlias('dev') + )->toBe(0.0); +}); + +it('can get the balance for a public key', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'getBalance', + 'public_key' => 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPP8v9FpH75La76KNgkUpZ2KiMHxHQsUKFytyEMXFPkh3yC25p5JoiR1dEsTgJJkNSrrkTM96BcMae5h6NeSdrH1', + ]) + ->willReturn('0'); -it('can get the balance for an address'); + /** @var Account $api */ + expect( + $api->balanceForPublicKey('PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPP8v9FpH75La76KNgkUpZ2KiMHxHQsUKFytyEMXFPkh3yC25p5JoiR1dEsTgJJkNSrrkTM96BcMae5h6NeSdrH1') + )->toBe(0.0); +}); + +it('can get the pending balance for an address', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'getPendingBalance', + 'account' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', + ]) + ->willReturn('0'); + + /** @var Account $api */ + expect( + $api->pendingBalance('2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL') + )->toBe(0.0); +}); + +it('can get the pending balance for a public key', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'getPendingBalance', + 'public_key' => 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPP8v9FpH75La76KNgkUpZ2KiMHxHQsUKFytyEMXFPkh3yC25p5JoiR1dEsTgJJkNSrrkTM96BcMae5h6NeSdrH1', + ]) + ->willReturn('0'); -it('can get the balance for an alias'); + /** @var Account $api */ + expect( + $api->pendingBalanceForPublicKey('PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPP8v9FpH75La76KNgkUpZ2KiMHxHQsUKFytyEMXFPkh3yC25p5JoiR1dEsTgJJkNSrrkTM96BcMae5h6NeSdrH1') + )->toBe(0.0); +}); -it('can get the balance for a public key'); +it('can get the alias for an address', function () { + $api = $this->getApiMock(); -it('can get the pending balance for a public key'); + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'getAlias', + 'account' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', + ]) + ->willReturn('dev'); -it('can get the alias for an address'); + /** @var Account $api */ + expect( + $api->alias('2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL') + )->toBe('dev'); +}); -it('can get check that an address is valid'); +it('can get check that an address is valid', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'checkAddress', + 'public_key' => null, + 'account' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', + ]) + ->willReturn('true'); + + /** @var Account $api */ + expect( + $api->checkAddress('2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL') + )->toBe(true); +}); From 4ca29eabad8249c94f325686f342bc0c7fb45fb7 Mon Sep 17 00:00:00 2001 From: Owen Voke Date: Thu, 6 Oct 2022 17:17:45 +0100 Subject: [PATCH 06/13] tests: add Asset tests --- src/Api/Asset.php | 4 +- tests/Api/AssetTest.php | 149 +++++++++++++++++++++++++++++++++- tests/Api/BlockTest.php | 4 +- tests/Api/NodeTest.php | 4 +- tests/Api/OtherTest.php | 4 +- tests/Api/TransactionTest.php | 4 +- 6 files changed, 155 insertions(+), 14 deletions(-) diff --git a/src/Api/Asset.php b/src/Api/Asset.php index 5b5b8a1..7995ec6 100644 --- a/src/Api/Asset.php +++ b/src/Api/Asset.php @@ -21,9 +21,9 @@ public function show(string $id): array ]); } - public function balance(string $address): array + public function balance(string $address): float { - return $this->get(self::API_PATH, [ + return (float) $this->get(self::API_PATH, [ 'q' => 'assetBalance', 'account' => $address, ]); diff --git a/tests/Api/AssetTest.php b/tests/Api/AssetTest.php index 13e1745..a374bb3 100644 --- a/tests/Api/AssetTest.php +++ b/tests/Api/AssetTest.php @@ -6,10 +6,151 @@ beforeEach(fn () => $this->apiClass = Asset::class); -it('can get all assets'); +it('can get all assets', function () { + $api = $this->getApiMock(); -it('can get a specific asset'); + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'assets', + ]) + ->willReturn([ + [ + 'id' => '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT', + 'max_supply' => 0, + 'tradable' => 1, + 'price' => '0.00000000', + 'dividend_only' => 0, + 'auto_dividend' => 0, + 'allow_bid' => 1, + 'height' => 952581, + 'alias' => 'AUSDTHOUSAND', + 'balance' => '39.62500000', + ] + ]); -it('can get the asset balance for an account'); + /** @var Asset $api */ + expect( + $api->all() + )->toBe([ + [ + 'id' => '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT', + 'max_supply' => 0, + 'tradable' => 1, + 'price' => '0.00000000', + 'dividend_only' => 0, + 'auto_dividend' => 0, + 'allow_bid' => 1, + 'height' => 952581, + 'alias' => 'AUSDTHOUSAND', + 'balance' => '39.62500000', + ] + ]); +}); -it('can get the asset orders for an address'); +it('can get a specific asset', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'assets', + 'asset' => '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT', + ]) + ->willReturn([ + [ + 'id' => '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT', + 'max_supply' => 0, + 'tradable' => 1, + 'price' => '0.00000000', + 'dividend_only' => 0, + 'auto_dividend' => 0, + 'allow_bid' => 1, + 'height' => 952581, + 'alias' => 'AUSDTHOUSAND', + 'balance' => '39.62500000', + ] + ]); + + /** @var Asset $api */ + expect( + $api->show('26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT') + )->toBe([ + [ + 'id' => '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT', + 'max_supply' => 0, + 'tradable' => 1, + 'price' => '0.00000000', + 'dividend_only' => 0, + 'auto_dividend' => 0, + 'allow_bid' => 1, + 'height' => 952581, + 'alias' => 'AUSDTHOUSAND', + 'balance' => '39.62500000', + ] + ]); +}); + +it('can get the asset balance for an account', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'assetBalance', + 'account' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', + ]) + ->willReturn('0'); + + /** @var Asset $api */ + expect( + $api->balance('2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL') + )->toBe(0.0); +}); + +it('can get the asset orders for an address', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'asset-orders', + 'account' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', + 'asset' => '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT', + ]) + ->willReturn([ + [ + 'id' => '39VSD1tTjSED41254241UJLutnF7Y9fJLFsWUqdtQzAwteGgEyropo8Z8Y1HDdKpAsx8TrpNJWDgFxeeZQZ96x', + 'account' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', + 'asset' => '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT', + 'price' => '1.00000000', + 'date' => 1615802171, + 'status' => 0, + 'type' => 'bid', + 'val' => 1000, + 'val_done' => 0, + 'cancelable' => 1, + ] + ]); + + /** @var Asset $api */ + expect( + $api->orders( + '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', + '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT' + ) + )->toBe([ + [ + 'id' => '39VSD1tTjSED41254241UJLutnF7Y9fJLFsWUqdtQzAwteGgEyropo8Z8Y1HDdKpAsx8TrpNJWDgFxeeZQZ96x', + 'account' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', + 'asset' => '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT', + 'price' => '1.00000000', + 'date' => 1615802171, + 'status' => 0, + 'type' => 'bid', + 'val' => 1000, + 'val_done' => 0, + 'cancelable' => 1, + ] + ]); +}); diff --git a/tests/Api/BlockTest.php b/tests/Api/BlockTest.php index 71deb4b..a793589 100644 --- a/tests/Api/BlockTest.php +++ b/tests/Api/BlockTest.php @@ -2,9 +2,9 @@ declare(strict_types=1); -use OwenVoke\Arionum\Api\Asset; +use OwenVoke\Arionum\Api\Block; -beforeEach(fn () => $this->apiClass = Asset::class); +beforeEach(fn () => $this->apiClass = Block::class); it('can get the current block'); diff --git a/tests/Api/NodeTest.php b/tests/Api/NodeTest.php index c2db615..459de5d 100644 --- a/tests/Api/NodeTest.php +++ b/tests/Api/NodeTest.php @@ -2,9 +2,9 @@ declare(strict_types=1); -use OwenVoke\Arionum\Api\Asset; +use OwenVoke\Arionum\Api\Node; -beforeEach(fn () => $this->apiClass = Asset::class); +beforeEach(fn () => $this->apiClass = Node::class); it('can get the version of the current node'); diff --git a/tests/Api/OtherTest.php b/tests/Api/OtherTest.php index 21599fa..cd39eae 100644 --- a/tests/Api/OtherTest.php +++ b/tests/Api/OtherTest.php @@ -2,9 +2,9 @@ declare(strict_types=1); -use OwenVoke\Arionum\Api\Asset; +use OwenVoke\Arionum\Api\Other; -beforeEach(fn () => $this->apiClass = Asset::class); +beforeEach(fn () => $this->apiClass = Other::class); it('can get a random number'); diff --git a/tests/Api/TransactionTest.php b/tests/Api/TransactionTest.php index a246599..f794ae7 100644 --- a/tests/Api/TransactionTest.php +++ b/tests/Api/TransactionTest.php @@ -2,10 +2,10 @@ declare(strict_types=1); -use OwenVoke\Arionum\Api\Asset; +use OwenVoke\Arionum\Api\Transaction; use OwenVoke\Arionum\Enums\TransactionVersion; -beforeEach(fn () => $this->apiClass = Asset::class); +beforeEach(fn () => $this->apiClass = Transaction::class); it('can get the transactions for an address'); From 16872b160bf4de70edeecb2d32a06a075cd7feee Mon Sep 17 00:00:00 2001 From: Owen Voke Date: Thu, 6 Oct 2022 17:19:41 +0100 Subject: [PATCH 07/13] fix: resolve PHPStan issues --- phpstan.neon.dist | 5 ----- src/Client.php | 17 +---------------- 2 files changed, 1 insertion(+), 21 deletions(-) diff --git a/phpstan.neon.dist b/phpstan.neon.dist index 7c3be31..5ce96e0 100644 --- a/phpstan.neon.dist +++ b/phpstan.neon.dist @@ -6,8 +6,3 @@ parameters: checkMissingIterableValueType: false checkGenericClassInNonGenericObjectType: false reportUnmatchedIgnoredErrors: true - - ignoreErrors: - # Ignore typehint errors on api classes - - message: '#Method (.*) has no return typehint specified\.#' - path: src/Api diff --git a/src/Client.php b/src/Client.php index 3fcaf5a..5f2d373 100644 --- a/src/Client.php +++ b/src/Client.php @@ -35,7 +35,7 @@ */ final class Client { - public function __construct(private ?string $nodeUri = null, private Builder|null $httpClientBuilder = null) + public function __construct(public readonly ?string $nodeUri = null, private Builder|null $httpClientBuilder = null) { $this->httpClientBuilder = $builder = $httpClientBuilder ?? new Builder(); @@ -71,21 +71,6 @@ public function api(string $name): AbstractApi }; } - private function setNodeUri(string $uri): void - { - $this->nodeUri = $uri; - - $builder = $this->getHttpClientBuilder(); - $builder->removePlugin(AddHostPlugin::class); - - $builder->addPlugin(new AddHostPlugin(Psr17FactoryDiscovery::findUriFactory()->createUri($this->getNodeUri()))); - } - - public function getNodeUri(): ?string - { - return $this->nodeUri; - } - public function __call(string $name, array $args): AbstractApi { try { From 81ca7a3ffc1fac5b58322351c66209c1bc296d32 Mon Sep 17 00:00:00 2001 From: Owen Voke Date: Mon, 10 Oct 2022 14:51:57 +0100 Subject: [PATCH 08/13] tests: add Block tests --- src/Api/Block.php | 10 +++- tests/Api/AssetTest.php | 12 ++--- tests/Api/BlockTest.php | 107 ++++++++++++++++++++++++++++++++++++++-- 3 files changed, 119 insertions(+), 10 deletions(-) diff --git a/src/Api/Block.php b/src/Api/Block.php index ac6cee6..08de5db 100644 --- a/src/Api/Block.php +++ b/src/Api/Block.php @@ -21,7 +21,15 @@ public function block(int $height): array ]); } - public function transactions(string $id): array + public function transactions(int $height): array + { + return $this->get(self::API_PATH, [ + 'q' => 'getBlockTransactions', + 'height' => $height, + ]); + } + + public function transactionsById(string $id): array { return $this->get(self::API_PATH, [ 'q' => 'getBlockTransactions', diff --git a/tests/Api/AssetTest.php b/tests/Api/AssetTest.php index a374bb3..e231c22 100644 --- a/tests/Api/AssetTest.php +++ b/tests/Api/AssetTest.php @@ -26,7 +26,7 @@ 'height' => 952581, 'alias' => 'AUSDTHOUSAND', 'balance' => '39.62500000', - ] + ], ]); /** @var Asset $api */ @@ -44,7 +44,7 @@ 'height' => 952581, 'alias' => 'AUSDTHOUSAND', 'balance' => '39.62500000', - ] + ], ]); }); @@ -69,7 +69,7 @@ 'height' => 952581, 'alias' => 'AUSDTHOUSAND', 'balance' => '39.62500000', - ] + ], ]); /** @var Asset $api */ @@ -87,7 +87,7 @@ 'height' => 952581, 'alias' => 'AUSDTHOUSAND', 'balance' => '39.62500000', - ] + ], ]); }); @@ -130,7 +130,7 @@ 'val' => 1000, 'val_done' => 0, 'cancelable' => 1, - ] + ], ]); /** @var Asset $api */ @@ -151,6 +151,6 @@ 'val' => 1000, 'val_done' => 0, 'cancelable' => 1, - ] + ], ]); }); diff --git a/tests/Api/BlockTest.php b/tests/Api/BlockTest.php index a793589..35b6feb 100644 --- a/tests/Api/BlockTest.php +++ b/tests/Api/BlockTest.php @@ -6,8 +6,109 @@ beforeEach(fn () => $this->apiClass = Block::class); -it('can get the current block'); +it('can get the current block', function () { + $api = $this->getApiMock(); -it('can get a specific block by its height'); + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'currentBlock', + ]) + ->willReturn([ + 'id' => 'dkhnqpyPW2JLD574yCiS6a39FeWyWZT1w61JLbdntBC1anT9rn1S76sFQX1eqSnEe2AA5PrG6RW8hSF7aKGR9US', + 'generator' => '5ADfrJUnLefPsaYjMTR4KmvQ79eHo2rYWnKBRCXConYKYJVAw2adtzb38oUG5EnsXEbTct3p7GagT2VVZ9hfVTVn', + 'height' => 1720339, + 'date' => 1665409519, + 'nonce' => '01yIM9KRxIUYuS7348pmVy0ToOq1KVEUoCr4tvzZ5rIn', + 'signature' => 'AN1rKvsxEc94WQvPAtKh7U38QvXTkeksjSg5uQqKd7gFpCjRYaw1cEfQNswNMuCzt6xnZ8x3bmisvDou2R1txd9CsPPPoA3Kk', + 'difficulty' => '10083709908', + 'argon' => '$b0RNZjRjT0tVaFNvb3ZzTw$OxKPTgidQHHJhapYov925s5hljQNYukg38XFh9gsypI', + 'transactions' => 0, + ]); -it('can get the transactions for a block'); + /** @var Block $api */ + expect( + $api->currentBlock() + )->toBe([ + 'id' => 'dkhnqpyPW2JLD574yCiS6a39FeWyWZT1w61JLbdntBC1anT9rn1S76sFQX1eqSnEe2AA5PrG6RW8hSF7aKGR9US', + 'generator' => '5ADfrJUnLefPsaYjMTR4KmvQ79eHo2rYWnKBRCXConYKYJVAw2adtzb38oUG5EnsXEbTct3p7GagT2VVZ9hfVTVn', + 'height' => 1720339, + 'date' => 1665409519, + 'nonce' => '01yIM9KRxIUYuS7348pmVy0ToOq1KVEUoCr4tvzZ5rIn', + 'signature' => 'AN1rKvsxEc94WQvPAtKh7U38QvXTkeksjSg5uQqKd7gFpCjRYaw1cEfQNswNMuCzt6xnZ8x3bmisvDou2R1txd9CsPPPoA3Kk', + 'difficulty' => '10083709908', + 'argon' => '$b0RNZjRjT0tVaFNvb3ZzTw$OxKPTgidQHHJhapYov925s5hljQNYukg38XFh9gsypI', + 'transactions' => 0, + ]); +}); + +it('can get a specific block by its height', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'getBlock', + 'height' => 1720339, + ]) + ->willReturn([ + 'id' => 'dkhnqpyPW2JLD574yCiS6a39FeWyWZT1w61JLbdntBC1anT9rn1S76sFQX1eqSnEe2AA5PrG6RW8hSF7aKGR9US', + 'generator' => '5ADfrJUnLefPsaYjMTR4KmvQ79eHo2rYWnKBRCXConYKYJVAw2adtzb38oUG5EnsXEbTct3p7GagT2VVZ9hfVTVn', + 'height' => 1720339, + 'date' => 1665409519, + 'nonce' => '01yIM9KRxIUYuS7348pmVy0ToOq1KVEUoCr4tvzZ5rIn', + 'signature' => 'AN1rKvsxEc94WQvPAtKh7U38QvXTkeksjSg5uQqKd7gFpCjRYaw1cEfQNswNMuCzt6xnZ8x3bmisvDou2R1txd9CsPPPoA3Kk', + 'difficulty' => '10083709908', + 'argon' => '$b0RNZjRjT0tVaFNvb3ZzTw$OxKPTgidQHHJhapYov925s5hljQNYukg38XFh9gsypI', + 'transactions' => 0, + ]); + + /** @var Block $api */ + expect( + $api->block(1720339) + )->toBe([ + 'id' => 'dkhnqpyPW2JLD574yCiS6a39FeWyWZT1w61JLbdntBC1anT9rn1S76sFQX1eqSnEe2AA5PrG6RW8hSF7aKGR9US', + 'generator' => '5ADfrJUnLefPsaYjMTR4KmvQ79eHo2rYWnKBRCXConYKYJVAw2adtzb38oUG5EnsXEbTct3p7GagT2VVZ9hfVTVn', + 'height' => 1720339, + 'date' => 1665409519, + 'nonce' => '01yIM9KRxIUYuS7348pmVy0ToOq1KVEUoCr4tvzZ5rIn', + 'signature' => 'AN1rKvsxEc94WQvPAtKh7U38QvXTkeksjSg5uQqKd7gFpCjRYaw1cEfQNswNMuCzt6xnZ8x3bmisvDou2R1txd9CsPPPoA3Kk', + 'difficulty' => '10083709908', + 'argon' => '$b0RNZjRjT0tVaFNvb3ZzTw$OxKPTgidQHHJhapYov925s5hljQNYukg38XFh9gsypI', + 'transactions' => 0, + ]); +}); + +it('can get the transactions for a block', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'getBlockTransactions', + 'height' => 1720339, + ]) + ->willReturn([]); + + /** @var Block $api */ + expect( + $api->transactions(1720339) + )->toBe([]); +}); + +it('can get the transactions for a block by its id', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'getBlockTransactions', + 'block' => '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT', + ]) + ->willReturn([]); + + /** @var Block $api */ + expect( + $api->transactionsById('26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT') + )->toBe([]); +}); From 0c870182f53f414b6c24a48a0b6f98dfe0e537bc Mon Sep 17 00:00:00 2001 From: Owen Voke Date: Mon, 10 Oct 2022 14:59:36 +0100 Subject: [PATCH 09/13] tests: add Node tests --- src/Api/Node.php | 4 +- tests/Api/NodeTest.php | 122 +++++++++++++++++++++++++++++++++++++++-- 2 files changed, 120 insertions(+), 6 deletions(-) diff --git a/src/Api/Node.php b/src/Api/Node.php index 5d1510f..85bd8da 100644 --- a/src/Api/Node.php +++ b/src/Api/Node.php @@ -20,14 +20,14 @@ public function version(): string ]); } - public function sanity(): string + public function sanity(): array { return $this->get(self::API_PATH, [ 'q' => 'sanity', ]); } - public function masternodes(): string + public function masternodes(): array { return $this->get(self::API_PATH, [ 'q' => 'masternodes', diff --git a/tests/Api/NodeTest.php b/tests/Api/NodeTest.php index 459de5d..0cff326 100644 --- a/tests/Api/NodeTest.php +++ b/tests/Api/NodeTest.php @@ -6,10 +6,124 @@ beforeEach(fn () => $this->apiClass = Node::class); -it('can get the version of the current node'); +it('can get the version of the current node', function () { + $api = $this->getApiMock(); -it('can get information about the current node'); + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'version', + ]) + ->willReturn('1.0.0-alpha.7'); -it('can get the sanity details for the current node'); + /** @var Node $api */ + expect( + $api->version() + )->toBe('1.0.0-alpha.7'); +}); -it('can get a list of masternodes'); +it('can get information about the current node', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'node-info', + ]) + ->willReturn([ + 'hostname' => 'http://peer1.arionum.com', + 'version' => '1.0.0-alpha.7', + 'dbversion' => '12', + 'accounts' => 16201, + 'transactions' => 10300617, + 'mempool' => 2, + 'masternodes' => 600, + 'peers' => 23, + ]); + + /** @var Node $api */ + expect( + $api->info() + )->toBe([ + 'hostname' => 'http://peer1.arionum.com', + 'version' => '1.0.0-alpha.7', + 'dbversion' => '12', + 'accounts' => 16201, + 'transactions' => 10300617, + 'mempool' => 2, + 'masternodes' => 600, + 'peers' => 23, + ]); +}); + +it('can get the sanity details for the current node', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'sanity', + ]) + ->willReturn([ + 'sanity_running' => false, + 'last_sanity' => 1665409622, + 'sanity_sync' => false, + ]); + + /** @var Node $api */ + expect( + $api->sanity() + )->toBe([ + 'sanity_running' => false, + 'last_sanity' => 1665409622, + 'sanity_sync' => false, + ]); +}); + +it('can get a list of masternodes', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'masternodes', + ]) + ->willReturn([ + 'hash' => 'c7d66b357c05d0908623a09afd387dd3', + 'masternodes' => [ + [ + 'public_key' => "PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvNFCyZbpNpLVwg4Sk8Pe46dyKrqR4GacBGtaeJ9CAXQTc41jYrW2gy91XUkBgMkkAjqsojSVMJ1iasdbcmFdx7wy", + 'height' => 104148, + 'ip' => "35.237.72.244", + 'last_won' => 137074, + 'blacklist' => 0, + 'fails' => 0, + 'status' => 0, + 'vote_key' => null, + 'cold_last_won' => 1719924, + 'voted' => 0, + ], + ], + ]); + + /** @var Node $api */ + expect( + $api->masternodes() + )->toBe([ + 'hash' => 'c7d66b357c05d0908623a09afd387dd3', + 'masternodes' => [ + [ + 'public_key' => "PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvNFCyZbpNpLVwg4Sk8Pe46dyKrqR4GacBGtaeJ9CAXQTc41jYrW2gy91XUkBgMkkAjqsojSVMJ1iasdbcmFdx7wy", + 'height' => 104148, + 'ip' => "35.237.72.244", + 'last_won' => 137074, + 'blacklist' => 0, + 'fails' => 0, + 'status' => 0, + 'vote_key' => null, + 'cold_last_won' => 1719924, + 'voted' => 0, + ], + ], + ]); +}); From 3bfcec38f2d0d21157c8a3f9bfd3d9614d42abb5 Mon Sep 17 00:00:00 2001 From: Owen Voke Date: Mon, 10 Oct 2022 15:09:33 +0100 Subject: [PATCH 10/13] tests: add Other tests --- src/Api/Other.php | 12 ++++---- tests/Api/NodeTest.php | 8 +++--- tests/Api/OtherTest.php | 64 +++++++++++++++++++++++++++++++++++++++-- 3 files changed, 71 insertions(+), 13 deletions(-) diff --git a/src/Api/Other.php b/src/Api/Other.php index 42bc734..db0b8aa 100644 --- a/src/Api/Other.php +++ b/src/Api/Other.php @@ -6,7 +6,7 @@ class Other extends AbstractApi { - public function base58(string $data): array + public function base58(string $data): string { return $this->get(self::API_PATH, [ 'q' => 'base58', @@ -14,9 +14,9 @@ public function base58(string $data): array ]); } - public function randomNumber(int $height, int $minimum, int $maximum, ?string $seed = null): array + public function randomNumber(int $height, int $minimum, int $maximum, ?string $seed = null): int { - return $this->get(self::API_PATH, [ + return (int) $this->get(self::API_PATH, [ 'q' => 'randomNumber', 'height' => $height, 'min' => $minimum, @@ -25,13 +25,13 @@ public function randomNumber(int $height, int $minimum, int $maximum, ?string $s ]); } - public function checkSignature(string $signature, string $data, string $publicKey): array + public function checkSignature(string $signature, string $data, string $publicKey): bool { - return $this->get(self::API_PATH, [ + return ((string) $this->get(self::API_PATH, [ 'q' => 'checkSignature', 'signature' => $signature, 'data' => $data, 'public_key' => $publicKey, - ]); + ])) === 'true'; } } diff --git a/tests/Api/NodeTest.php b/tests/Api/NodeTest.php index 0cff326..096dd31 100644 --- a/tests/Api/NodeTest.php +++ b/tests/Api/NodeTest.php @@ -92,9 +92,9 @@ 'hash' => 'c7d66b357c05d0908623a09afd387dd3', 'masternodes' => [ [ - 'public_key' => "PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvNFCyZbpNpLVwg4Sk8Pe46dyKrqR4GacBGtaeJ9CAXQTc41jYrW2gy91XUkBgMkkAjqsojSVMJ1iasdbcmFdx7wy", + 'public_key' => 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvNFCyZbpNpLVwg4Sk8Pe46dyKrqR4GacBGtaeJ9CAXQTc41jYrW2gy91XUkBgMkkAjqsojSVMJ1iasdbcmFdx7wy', 'height' => 104148, - 'ip' => "35.237.72.244", + 'ip' => '35.237.72.244', 'last_won' => 137074, 'blacklist' => 0, 'fails' => 0, @@ -113,9 +113,9 @@ 'hash' => 'c7d66b357c05d0908623a09afd387dd3', 'masternodes' => [ [ - 'public_key' => "PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvNFCyZbpNpLVwg4Sk8Pe46dyKrqR4GacBGtaeJ9CAXQTc41jYrW2gy91XUkBgMkkAjqsojSVMJ1iasdbcmFdx7wy", + 'public_key' => 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvNFCyZbpNpLVwg4Sk8Pe46dyKrqR4GacBGtaeJ9CAXQTc41jYrW2gy91XUkBgMkkAjqsojSVMJ1iasdbcmFdx7wy', 'height' => 104148, - 'ip' => "35.237.72.244", + 'ip' => '35.237.72.244', 'last_won' => 137074, 'blacklist' => 0, 'fails' => 0, diff --git a/tests/Api/OtherTest.php b/tests/Api/OtherTest.php index cd39eae..59415cd 100644 --- a/tests/Api/OtherTest.php +++ b/tests/Api/OtherTest.php @@ -6,8 +6,66 @@ beforeEach(fn () => $this->apiClass = Other::class); -it('can get a random number'); +it('can get a random number', function () { + $api = $this->getApiMock(); -it('can get the Base58 encoded version of a string'); + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'randomNumber', + 'height' => 100000, + 'min' => 10, + 'max' => 20, + 'seed' => null, + ]) + ->willReturn('20'); -it('can check a signature is valid'); + /** @var Other $api */ + expect( + $api->randomNumber( + height: 100000, + minimum: 10, + maximum: 20 + ) + )->toBe(20); +}); + +it('can get the Base58 encoded version of a string', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'base58', + 'data' => 'Test', + ]) + ->willReturn('3A836b'); + + /** @var Other $api */ + expect( + $api->base58('Test') + )->toBe('3A836b'); +}); + +it('can check a signature is valid', function () { + $api = $this->getApiMock(); + + $api->expects($this->once()) + ->method('get') + ->with('/api.php', [ + 'q' => 'checkSignature', + 'signature' => 'AN1rKroKawax5azYrLbasV7VycYAvQXFKrJ69TFYEfmanXwVRrUQTCx5gQ1eVNMgEVzrEz3VzLsfrVVpUYqgB5eT2qsFtaSsw', + 'data' => '1.00000000-0.00250000-PXGAMER--2-PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyk7aKeBJ6LL44w5JGSFp82Wb1Drqicuznv1qmRVQMvbmF64AeczjMtV72acGLR9RsiQ2JccemNrSPkKi8KDk72t4-1533911370', + 'public_key' => 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyk7aKeBJ6LL44w5JGSFp82Wb1Drqicuznv1qmRVQMvbmF64AeczjMtV72acGLR9RsiQ2JccemNrSPkKi8KDk72t4', + ]) + ->willReturn('true'); + + /** @var Other $api */ + expect( + $api->checkSignature( + signature: 'AN1rKroKawax5azYrLbasV7VycYAvQXFKrJ69TFYEfmanXwVRrUQTCx5gQ1eVNMgEVzrEz3VzLsfrVVpUYqgB5eT2qsFtaSsw', + data: '1.00000000-0.00250000-PXGAMER--2-PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyk7aKeBJ6LL44w5JGSFp82Wb1Drqicuznv1qmRVQMvbmF64AeczjMtV72acGLR9RsiQ2JccemNrSPkKi8KDk72t4-1533911370', + publicKey: 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyk7aKeBJ6LL44w5JGSFp82Wb1Drqicuznv1qmRVQMvbmF64AeczjMtV72acGLR9RsiQ2JccemNrSPkKi8KDk72t4', + ) + )->toBe(true); +}); From c0ba353cdfd7466938e02a649756ab5e8fbb3056 Mon Sep 17 00:00:00 2001 From: Owen Voke Date: Fri, 14 Oct 2022 11:55:46 +0100 Subject: [PATCH 11/13] tests: use VCR Plugin for responses --- composer.json | 4 +- tests/Api/AccountTest.php | 104 +++---------------- tests/Api/AssetTest.php | 93 +---------------- tests/Api/BlockTest.php | 71 ++----------- tests/Api/NodeTest.php | 117 ++++++---------------- tests/Api/OtherTest.php | 33 +----- tests/TestCase.php | 31 +++--- tests/__SNAPSHOTS__/GET_api.php_004f8.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_051f8.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_1d75b.txt | 8 ++ tests/__SNAPSHOTS__/GET_api.php_29d93.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_30655.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_3582d.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_3a105.txt | 8 ++ tests/__SNAPSHOTS__/GET_api.php_4670d.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_4a186.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_501bd.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_5c8f5.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_7a9ed.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_7e500.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_92efa.txt | 8 ++ tests/__SNAPSHOTS__/GET_api.php_a2104.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_aeaf9.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_af86a.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_b236a.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_b5998.txt | 8 ++ tests/__SNAPSHOTS__/GET_api.php_bca18.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_cd83e.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_d3a40.txt | 8 ++ tests/__SNAPSHOTS__/GET_api.php_d8f9a.txt | 7 ++ tests/__SNAPSHOTS__/GET_api.php_e0c72.txt | 8 ++ 31 files changed, 256 insertions(+), 371 deletions(-) create mode 100644 tests/__SNAPSHOTS__/GET_api.php_004f8.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_051f8.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_1d75b.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_29d93.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_30655.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_3582d.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_3a105.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_4670d.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_4a186.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_501bd.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_5c8f5.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_7a9ed.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_7e500.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_92efa.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_a2104.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_aeaf9.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_af86a.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_b236a.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_b5998.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_bca18.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_cd83e.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_d3a40.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_d8f9a.txt create mode 100644 tests/__SNAPSHOTS__/GET_api.php_e0c72.txt diff --git a/composer.json b/composer.json index 8e785c4..6ec3679 100644 --- a/composer.json +++ b/composer.json @@ -23,6 +23,7 @@ "laravel/pint": "^1.2", "pestphp/pest": "^1.20", "php-http/mock-client": "^1.5", + "php-http/vcr-plugin": "^1.2", "phpstan/phpstan": "^1.8.7", "symfony/var-dumper": "^5.3.8" }, @@ -42,7 +43,8 @@ "test": [ "@test:types", "@test:unit" - ] + ], + "update:snapshots": "pest -d --update-snapshots" }, "config": { "sort-packages": true, diff --git a/tests/Api/AccountTest.php b/tests/Api/AccountTest.php index 15c0ce6..44b192e 100644 --- a/tests/Api/AccountTest.php +++ b/tests/Api/AccountTest.php @@ -7,89 +7,48 @@ beforeEach(fn () => $this->apiClass = Account::class); it('can generate an account', function () { - $response = [ - 'data' => [ - 'address' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', - 'public_key' => 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPP8v9FpH75La76KNgkUpZ2KiMHxHQsUKFytyEMXFPkh3yC25p5JoiR1dEsTgJJkNSrrkTM96BcMae5h6NeSdrH1', - 'private_key' => 'Lzhp9LopCF2mJMHtXj13vuZorf5qMDmYYpjBMLcUshSyyycjFt7YqSjFrzK4AUFpRWw3XPBYcA2maavRp1kbDe7iHwcLaTVwQ6sH2n5vRqZSoAzvcx4JHACDSF4K6TzA3WdspLXZYKbq612psVmtqBuYwvUkDhd2j', - ], - ]; - $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'generateAccount', - ]) - ->willReturn($response); - /** @var Account $api */ - expect($api->generate())->toBe($response); + expect($api->generate())->toHaveKeys([ + 'address', + 'public_key', + 'private_key', + ]) + ->public_key->toStartWith('PZ8') + ->private_key->toStartWith('Lzh'); }); it('can get an address by public key', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'getAddress', - 'public_key' => 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPP8v9FpH75La76KNgkUpZ2KiMHxHQsUKFytyEMXFPkh3yC25p5JoiR1dEsTgJJkNSrrkTM96BcMae5h6NeSdrH1', - ]) - ->willReturn('2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL'); - /** @var Account $api */ expect( - $api->address('PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPP8v9FpH75La76KNgkUpZ2KiMHxHQsUKFytyEMXFPkh3yC25p5JoiR1dEsTgJJkNSrrkTM96BcMae5h6NeSdrH1') - )->toBe('2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL'); + $api->address('PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyk7aKeBJ6LL44w5JGSFp82Wb1Drqicuznv1qmRVQMvbmF64AeczjMtV72acGLR9RsiQ2JccemNrSPkKi8KDk72t4') + )->toBe('51sJ4LbdKzhyGy4zJGqodNLse9n9JsVT2rdeH92w7cf3qQuSDJupvjbUT1UBr7r1SCUAXG97saxn7jt2edKb4v4J'); }); it('can get the balance for an address', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'getBalance', - 'account' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', - ]) - ->willReturn('0'); - /** @var Account $api */ expect( - $api->balance('2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL') - )->toBe(0.0); + $api->balance('51sJ4LbdKzhyGy4zJGqodNLse9n9JsVT2rdeH92w7cf3qQuSDJupvjbUT1UBr7r1SCUAXG97saxn7jt2edKb4v4J') + )->toBe(0.00044441); }); it('can get the balance for an alias', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'getBalance', - 'alias' => 'dev', - ]) - ->willReturn('0'); - /** @var Account $api */ expect( - $api->balanceByAlias('dev') - )->toBe(0.0); + $api->balanceByAlias('PXGAMER') + )->toBe(0.00044441); }); it('can get the balance for a public key', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'getBalance', - 'public_key' => 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPP8v9FpH75La76KNgkUpZ2KiMHxHQsUKFytyEMXFPkh3yC25p5JoiR1dEsTgJJkNSrrkTM96BcMae5h6NeSdrH1', - ]) - ->willReturn('0'); - /** @var Account $api */ expect( $api->balanceForPublicKey('PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPP8v9FpH75La76KNgkUpZ2KiMHxHQsUKFytyEMXFPkh3yC25p5JoiR1dEsTgJJkNSrrkTM96BcMae5h6NeSdrH1') @@ -99,14 +58,6 @@ it('can get the pending balance for an address', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'getPendingBalance', - 'account' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', - ]) - ->willReturn('0'); - /** @var Account $api */ expect( $api->pendingBalance('2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL') @@ -116,14 +67,6 @@ it('can get the pending balance for a public key', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'getPendingBalance', - 'public_key' => 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPP8v9FpH75La76KNgkUpZ2KiMHxHQsUKFytyEMXFPkh3yC25p5JoiR1dEsTgJJkNSrrkTM96BcMae5h6NeSdrH1', - ]) - ->willReturn('0'); - /** @var Account $api */ expect( $api->pendingBalanceForPublicKey('PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPP8v9FpH75La76KNgkUpZ2KiMHxHQsUKFytyEMXFPkh3yC25p5JoiR1dEsTgJJkNSrrkTM96BcMae5h6NeSdrH1') @@ -133,32 +76,15 @@ it('can get the alias for an address', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'getAlias', - 'account' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', - ]) - ->willReturn('dev'); - /** @var Account $api */ expect( - $api->alias('2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL') - )->toBe('dev'); + $api->alias('51sJ4LbdKzhyGy4zJGqodNLse9n9JsVT2rdeH92w7cf3qQuSDJupvjbUT1UBr7r1SCUAXG97saxn7jt2edKb4v4J') + )->toBe('PXGAMER'); }); it('can get check that an address is valid', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'checkAddress', - 'public_key' => null, - 'account' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', - ]) - ->willReturn('true'); - /** @var Account $api */ expect( $api->checkAddress('2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL') diff --git a/tests/Api/AssetTest.php b/tests/Api/AssetTest.php index e231c22..b4cdbdf 100644 --- a/tests/Api/AssetTest.php +++ b/tests/Api/AssetTest.php @@ -9,31 +9,11 @@ it('can get all assets', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'assets', - ]) - ->willReturn([ - [ - 'id' => '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT', - 'max_supply' => 0, - 'tradable' => 1, - 'price' => '0.00000000', - 'dividend_only' => 0, - 'auto_dividend' => 0, - 'allow_bid' => 1, - 'height' => 952581, - 'alias' => 'AUSDTHOUSAND', - 'balance' => '39.62500000', - ], - ]); - /** @var Asset $api */ expect( $api->all() - )->toBe([ - [ + )->toBeArray()->not->toBeEmpty() + ->{0}->toBe([ 'id' => '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT', 'max_supply' => 0, 'tradable' => 1, @@ -44,34 +24,12 @@ 'height' => 952581, 'alias' => 'AUSDTHOUSAND', 'balance' => '39.62500000', - ], - ]); + ]); }); it('can get a specific asset', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'assets', - 'asset' => '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT', - ]) - ->willReturn([ - [ - 'id' => '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT', - 'max_supply' => 0, - 'tradable' => 1, - 'price' => '0.00000000', - 'dividend_only' => 0, - 'auto_dividend' => 0, - 'allow_bid' => 1, - 'height' => 952581, - 'alias' => 'AUSDTHOUSAND', - 'balance' => '39.62500000', - ], - ]); - /** @var Asset $api */ expect( $api->show('26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT') @@ -94,14 +52,6 @@ it('can get the asset balance for an account', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'assetBalance', - 'account' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', - ]) - ->willReturn('0'); - /** @var Asset $api */ expect( $api->balance('2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL') @@ -111,46 +61,11 @@ it('can get the asset orders for an address', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'asset-orders', - 'account' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', - 'asset' => '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT', - ]) - ->willReturn([ - [ - 'id' => '39VSD1tTjSED41254241UJLutnF7Y9fJLFsWUqdtQzAwteGgEyropo8Z8Y1HDdKpAsx8TrpNJWDgFxeeZQZ96x', - 'account' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', - 'asset' => '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT', - 'price' => '1.00000000', - 'date' => 1615802171, - 'status' => 0, - 'type' => 'bid', - 'val' => 1000, - 'val_done' => 0, - 'cancelable' => 1, - ], - ]); - /** @var Asset $api */ expect( $api->orders( '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT' ) - )->toBe([ - [ - 'id' => '39VSD1tTjSED41254241UJLutnF7Y9fJLFsWUqdtQzAwteGgEyropo8Z8Y1HDdKpAsx8TrpNJWDgFxeeZQZ96x', - 'account' => '2tR6BWvwpwrQLUWN8GpVP4b6srCxgR2PnrsXs7jYfdeBj3FimJ5Tjd4xzWcWe8y59ZtEBXgQJxe6Uibux1cCDfxL', - 'asset' => '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT', - 'price' => '1.00000000', - 'date' => 1615802171, - 'status' => 0, - 'type' => 'bid', - 'val' => 1000, - 'val_done' => 0, - 'cancelable' => 1, - ], - ]); + )->toBe([]); }); diff --git a/tests/Api/BlockTest.php b/tests/Api/BlockTest.php index 35b6feb..9e2db89 100644 --- a/tests/Api/BlockTest.php +++ b/tests/Api/BlockTest.php @@ -9,60 +9,25 @@ it('can get the current block', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'currentBlock', - ]) - ->willReturn([ - 'id' => 'dkhnqpyPW2JLD574yCiS6a39FeWyWZT1w61JLbdntBC1anT9rn1S76sFQX1eqSnEe2AA5PrG6RW8hSF7aKGR9US', - 'generator' => '5ADfrJUnLefPsaYjMTR4KmvQ79eHo2rYWnKBRCXConYKYJVAw2adtzb38oUG5EnsXEbTct3p7GagT2VVZ9hfVTVn', - 'height' => 1720339, - 'date' => 1665409519, - 'nonce' => '01yIM9KRxIUYuS7348pmVy0ToOq1KVEUoCr4tvzZ5rIn', - 'signature' => 'AN1rKvsxEc94WQvPAtKh7U38QvXTkeksjSg5uQqKd7gFpCjRYaw1cEfQNswNMuCzt6xnZ8x3bmisvDou2R1txd9CsPPPoA3Kk', - 'difficulty' => '10083709908', - 'argon' => '$b0RNZjRjT0tVaFNvb3ZzTw$OxKPTgidQHHJhapYov925s5hljQNYukg38XFh9gsypI', - 'transactions' => 0, - ]); - /** @var Block $api */ expect( $api->currentBlock() - )->toBe([ - 'id' => 'dkhnqpyPW2JLD574yCiS6a39FeWyWZT1w61JLbdntBC1anT9rn1S76sFQX1eqSnEe2AA5PrG6RW8hSF7aKGR9US', - 'generator' => '5ADfrJUnLefPsaYjMTR4KmvQ79eHo2rYWnKBRCXConYKYJVAw2adtzb38oUG5EnsXEbTct3p7GagT2VVZ9hfVTVn', - 'height' => 1720339, - 'date' => 1665409519, - 'nonce' => '01yIM9KRxIUYuS7348pmVy0ToOq1KVEUoCr4tvzZ5rIn', - 'signature' => 'AN1rKvsxEc94WQvPAtKh7U38QvXTkeksjSg5uQqKd7gFpCjRYaw1cEfQNswNMuCzt6xnZ8x3bmisvDou2R1txd9CsPPPoA3Kk', - 'difficulty' => '10083709908', - 'argon' => '$b0RNZjRjT0tVaFNvb3ZzTw$OxKPTgidQHHJhapYov925s5hljQNYukg38XFh9gsypI', - 'transactions' => 0, + )->toHaveKeys([ + 'id', + 'generator', + 'height', + 'date', + 'nonce', + 'signature', + 'difficulty', + 'argon', + 'transactions', ]); }); it('can get a specific block by its height', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'getBlock', - 'height' => 1720339, - ]) - ->willReturn([ - 'id' => 'dkhnqpyPW2JLD574yCiS6a39FeWyWZT1w61JLbdntBC1anT9rn1S76sFQX1eqSnEe2AA5PrG6RW8hSF7aKGR9US', - 'generator' => '5ADfrJUnLefPsaYjMTR4KmvQ79eHo2rYWnKBRCXConYKYJVAw2adtzb38oUG5EnsXEbTct3p7GagT2VVZ9hfVTVn', - 'height' => 1720339, - 'date' => 1665409519, - 'nonce' => '01yIM9KRxIUYuS7348pmVy0ToOq1KVEUoCr4tvzZ5rIn', - 'signature' => 'AN1rKvsxEc94WQvPAtKh7U38QvXTkeksjSg5uQqKd7gFpCjRYaw1cEfQNswNMuCzt6xnZ8x3bmisvDou2R1txd9CsPPPoA3Kk', - 'difficulty' => '10083709908', - 'argon' => '$b0RNZjRjT0tVaFNvb3ZzTw$OxKPTgidQHHJhapYov925s5hljQNYukg38XFh9gsypI', - 'transactions' => 0, - ]); - /** @var Block $api */ expect( $api->block(1720339) @@ -82,14 +47,6 @@ it('can get the transactions for a block', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'getBlockTransactions', - 'height' => 1720339, - ]) - ->willReturn([]); - /** @var Block $api */ expect( $api->transactions(1720339) @@ -99,14 +56,6 @@ it('can get the transactions for a block by its id', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'getBlockTransactions', - 'block' => '26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT', - ]) - ->willReturn([]); - /** @var Block $api */ expect( $api->transactionsById('26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT') diff --git a/tests/Api/NodeTest.php b/tests/Api/NodeTest.php index 096dd31..8debfb8 100644 --- a/tests/Api/NodeTest.php +++ b/tests/Api/NodeTest.php @@ -9,13 +9,6 @@ it('can get the version of the current node', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'version', - ]) - ->willReturn('1.0.0-alpha.7'); - /** @var Node $api */ expect( $api->version() @@ -25,105 +18,55 @@ it('can get information about the current node', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'node-info', - ]) - ->willReturn([ - 'hostname' => 'http://peer1.arionum.com', - 'version' => '1.0.0-alpha.7', - 'dbversion' => '12', - 'accounts' => 16201, - 'transactions' => 10300617, - 'mempool' => 2, - 'masternodes' => 600, - 'peers' => 23, - ]); - /** @var Node $api */ expect( $api->info() - )->toBe([ - 'hostname' => 'http://peer1.arionum.com', - 'version' => '1.0.0-alpha.7', - 'dbversion' => '12', - 'accounts' => 16201, - 'transactions' => 10300617, - 'mempool' => 2, - 'masternodes' => 600, - 'peers' => 23, + )->toHaveKeys([ + 'hostname', + 'version', + 'dbversion', + 'accounts', + 'transactions', + 'mempool', + 'masternodes', + 'peers', ]); }); it('can get the sanity details for the current node', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'sanity', - ]) - ->willReturn([ - 'sanity_running' => false, - 'last_sanity' => 1665409622, - 'sanity_sync' => false, - ]); - /** @var Node $api */ expect( $api->sanity() - )->toBe([ - 'sanity_running' => false, - 'last_sanity' => 1665409622, - 'sanity_sync' => false, + )->toHaveKeys([ + 'sanity_running', + 'last_sanity', + 'sanity_sync', ]); }); it('can get a list of masternodes', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'masternodes', - ]) - ->willReturn([ - 'hash' => 'c7d66b357c05d0908623a09afd387dd3', - 'masternodes' => [ - [ - 'public_key' => 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvNFCyZbpNpLVwg4Sk8Pe46dyKrqR4GacBGtaeJ9CAXQTc41jYrW2gy91XUkBgMkkAjqsojSVMJ1iasdbcmFdx7wy', - 'height' => 104148, - 'ip' => '35.237.72.244', - 'last_won' => 137074, - 'blacklist' => 0, - 'fails' => 0, - 'status' => 0, - 'vote_key' => null, - 'cold_last_won' => 1719924, - 'voted' => 0, - ], - ], - ]); - /** @var Node $api */ expect( $api->masternodes() - )->toBe([ - 'hash' => 'c7d66b357c05d0908623a09afd387dd3', - 'masternodes' => [ - [ - 'public_key' => 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvNFCyZbpNpLVwg4Sk8Pe46dyKrqR4GacBGtaeJ9CAXQTc41jYrW2gy91XUkBgMkkAjqsojSVMJ1iasdbcmFdx7wy', - 'height' => 104148, - 'ip' => '35.237.72.244', - 'last_won' => 137074, - 'blacklist' => 0, - 'fails' => 0, - 'status' => 0, - 'vote_key' => null, - 'cold_last_won' => 1719924, - 'voted' => 0, - ], - ], - ]); + ) + ->toBeArray()->toHaveKeys([ + 'hash', + 'masternodes', + ]) + ->masternodes->{0}->toHaveKeys([ + 'public_key', + 'height', + 'ip', + 'last_won', + 'blacklist', + 'fails', + 'status', + 'vote_key', + 'cold_last_won', + 'voted', + ]); }); diff --git a/tests/Api/OtherTest.php b/tests/Api/OtherTest.php index 59415cd..b4518ef 100644 --- a/tests/Api/OtherTest.php +++ b/tests/Api/OtherTest.php @@ -9,17 +9,6 @@ it('can get a random number', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'randomNumber', - 'height' => 100000, - 'min' => 10, - 'max' => 20, - 'seed' => null, - ]) - ->willReturn('20'); - /** @var Other $api */ expect( $api->randomNumber( @@ -27,20 +16,12 @@ minimum: 10, maximum: 20 ) - )->toBe(20); + )->toBe(13); }); it('can get the Base58 encoded version of a string', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'base58', - 'data' => 'Test', - ]) - ->willReturn('3A836b'); - /** @var Other $api */ expect( $api->base58('Test') @@ -50,16 +31,6 @@ it('can check a signature is valid', function () { $api = $this->getApiMock(); - $api->expects($this->once()) - ->method('get') - ->with('/api.php', [ - 'q' => 'checkSignature', - 'signature' => 'AN1rKroKawax5azYrLbasV7VycYAvQXFKrJ69TFYEfmanXwVRrUQTCx5gQ1eVNMgEVzrEz3VzLsfrVVpUYqgB5eT2qsFtaSsw', - 'data' => '1.00000000-0.00250000-PXGAMER--2-PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyk7aKeBJ6LL44w5JGSFp82Wb1Drqicuznv1qmRVQMvbmF64AeczjMtV72acGLR9RsiQ2JccemNrSPkKi8KDk72t4-1533911370', - 'public_key' => 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyk7aKeBJ6LL44w5JGSFp82Wb1Drqicuznv1qmRVQMvbmF64AeczjMtV72acGLR9RsiQ2JccemNrSPkKi8KDk72t4', - ]) - ->willReturn('true'); - /** @var Other $api */ expect( $api->checkSignature( @@ -67,5 +38,5 @@ data: '1.00000000-0.00250000-PXGAMER--2-PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyk7aKeBJ6LL44w5JGSFp82Wb1Drqicuznv1qmRVQMvbmF64AeczjMtV72acGLR9RsiQ2JccemNrSPkKi8KDk72t4-1533911370', publicKey: 'PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyk7aKeBJ6LL44w5JGSFp82Wb1Drqicuznv1qmRVQMvbmF64AeczjMtV72acGLR9RsiQ2JccemNrSPkKi8KDk72t4', ) - )->toBe(true); + )->toBe(false); }); diff --git a/tests/TestCase.php b/tests/TestCase.php index 137aaba..af19ba0 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -4,31 +4,36 @@ namespace OwenVoke\Arionum\Tests; +use Http\Client\Common\Plugin\AddHostPlugin; +use Http\Client\Plugin\Vcr\NamingStrategy\PathNamingStrategy; +use Http\Client\Plugin\Vcr\Recorder\FilesystemRecorder; +use Http\Client\Plugin\Vcr\RecordPlugin; +use Http\Client\Plugin\Vcr\ReplayPlugin; +use Http\Discovery\Psr17FactoryDiscovery; use OwenVoke\Arionum\Api\AbstractApi; use OwenVoke\Arionum\Client; use PHPUnit\Framework\MockObject\MockObject; -use Psr\Http\Client\ClientInterface; +use OwenVoke\Arionum\HttpClient\Builder; abstract class TestCase extends \PHPUnit\Framework\TestCase { /** @var class-string */ protected string $apiClass; - protected function getApiMock(): MockObject + protected function getApiMock(): AbstractApi { - $httpClient = $this->getMockBuilder(ClientInterface::class) - ->onlyMethods(['sendRequest']) - ->getMock(); + $namingStrategy = new PathNamingStrategy(); + $recorder = new FilesystemRecorder(__DIR__.'/__SNAPSHOTS__'); - $httpClient - ->expects($this->any()) - ->method('sendRequest'); + $httpBuilder = new Builder(); + $httpBuilder->addPlugin( + in_array('--update-snapshots', $_SERVER['argv']) || getenv('UPDATE_SNAPSHOTS') === 'true' ? + new RecordPlugin($namingStrategy, $recorder) : + new ReplayPlugin($namingStrategy, $recorder) + ); - $client = Client::createWithHttpClient($httpClient); + $client = new Client(null, $httpBuilder); - return $this->getMockBuilder($this->apiClass) - ->onlyMethods(['get', 'post', 'postRaw', 'patch', 'delete', 'put', 'head']) - ->setConstructorArgs([$client]) - ->getMock(); + return new ($this->apiClass)($client); } } diff --git a/tests/__SNAPSHOTS__/GET_api.php_004f8.txt b/tests/__SNAPSHOTS__/GET_api.php_004f8.txt new file mode 100644 index 0000000..aebbe93 --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_004f8.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:36 GMT +Server: Apache/2.4.6 (CentOS) +Content-Length: 560 +Content-Type: application/json + +{"status":"ok","data":{"id":"3JUTwNrsburDnYCBkeGK1zathWpLVbFmkd7oeKJKeKD3cfuzYjJ1NK7dyqkHP3Cg1wanJKnzKw6W4ftXAaij14Hc","generator":"5ADfrJUnLefPsaYjMTR4KmvQ79eHo2rYWnKBRCXConYKYJVAw2adtzb38oUG5EnsXEbTct3p7GagT2VVZ9hfVTVn","height":1725563,"date":1665744719,"nonce":"G3U0VFs53ydb3l1EDUKKSdsnaFgu0OoDRsmk3kyr0","signature":"381yXYvAfgasnX4YFKWNA35yazUk4oB7kffAAV4giKHsN2hXvzEVdNDtZG4UHjkZKPF7vu64usH6vkH55meqMwQHRq9tsetH","difficulty":"10444861862","argon":"$N1RTRElqQXBROTdNZXJuTg$DfKzCXka9P5DLxobMBZM4aK2R+PNTR+2dKRMDQExO9w","transactions":0},"coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_051f8.txt b/tests/__SNAPSHOTS__/GET_api.php_051f8.txt new file mode 100644 index 0000000..50c8b63 --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_051f8.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:36 GMT +Server: Apache/2.4.6 (CentOS) +Content-Length: 563 +Content-Type: application/json + +{"status":"ok","data":{"id":"dkhnqpyPW2JLD574yCiS6a39FeWyWZT1w61JLbdntBC1anT9rn1S76sFQX1eqSnEe2AA5PrG6RW8hSF7aKGR9US","generator":"5ADfrJUnLefPsaYjMTR4KmvQ79eHo2rYWnKBRCXConYKYJVAw2adtzb38oUG5EnsXEbTct3p7GagT2VVZ9hfVTVn","height":1720339,"date":1665409519,"nonce":"01yIM9KRxIUYuS7348pmVy0ToOq1KVEUoCr4tvzZ5rIn","signature":"AN1rKvsxEc94WQvPAtKh7U38QvXTkeksjSg5uQqKd7gFpCjRYaw1cEfQNswNMuCzt6xnZ8x3bmisvDou2R1txd9CsPPPoA3Kk","difficulty":"10083709908","argon":"$b0RNZjRjT0tVaFNvb3ZzTw$OxKPTgidQHHJhapYov925s5hljQNYukg38XFh9gsypI","transactions":0},"coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_1d75b.txt b/tests/__SNAPSHOTS__/GET_api.php_1d75b.txt new file mode 100644 index 0000000..ce21705 --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_1d75b.txt @@ -0,0 +1,8 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:35 GMT +Server: Apache +Strict-Transport-Security: max-age=31536000; includeSubDomains +Content-Length: 52 +Content-Type: application/json + +{"status":"ok","data":"0.00000000","coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_29d93.txt b/tests/__SNAPSHOTS__/GET_api.php_29d93.txt new file mode 100644 index 0000000..e52e19d --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_29d93.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:34 GMT +Server: Apache/2.4.6 (CentOS) +Content-Length: 130 +Content-Type: application/json + +{"status":"ok","data":"51sJ4LbdKzhyGy4zJGqodNLse9n9JsVT2rdeH92w7cf3qQuSDJupvjbUT1UBr7r1SCUAXG97saxn7jt2edKb4v4J","coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_30655.txt b/tests/__SNAPSHOTS__/GET_api.php_30655.txt new file mode 100644 index 0000000..bdca659 --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_30655.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:36 GMT +Server: Apache/2.4.6 (CentOS) +Content-Length: 42 +Content-Type: application/json + +{"status":"ok","data":[],"coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_3582d.txt b/tests/__SNAPSHOTS__/GET_api.php_3582d.txt new file mode 100644 index 0000000..e62e9d4 --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_3582d.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:49 GMT +Server: Apache/2.4.6 (CentOS) +Transfer-Encoding: chunked +Content-Type: application/json + +{"status":"ok","data":{"masternodes":[{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvNFCyZbpNpLVwg4Sk8Pe46dyKrqR4GacBGtaeJ9CAXQTc41jYrW2gy91XUkBgMkkAjqsojSVMJ1iasdbcmFdx7wy","height":104148,"ip":"35.237.72.244","last_won":137074,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725324,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvP7dfEoetLkpk35i9ePKbzN9FJTCkecWnQD5Hss6DWajKck49W7C8EL6Z1opwCPq2ma8SjwPdSDxckJN3nW3kG93","height":419573,"ip":"94.156.128.26","last_won":1725353,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725394,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvPdtwR3hcosEo52aYKhVWyzPTffFTq4ou6ngCH6criLRaaWHTfsqSfFkNjxZvNmy5hPH5npSV2T3aYzjGUehbDQE","height":311356,"ip":"185.148.145.166","last_won":1725524,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725359,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvQHURAcvYtdkbX7N55xVZRyo5w94saYmpNBELKmaujSoVUGWPygu9K7ieaCxcpDdYJacPpQ2ZeRowtQyEScKaXpr","height":80388,"ip":"185.244.131.56","last_won":1725550,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725325,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvQgUKAtGZXXfyNXD5NHFaNkSRSasqniUQeWWC9KgyFDXykdoLsoTco7KuaYavG7hXFJtQaPLrHNcEgnLowmyCHfi","height":174832,"ip":"78.141.201.207","last_won":319721,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725326,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvQq98ZcmeB34id7DyEJcj2X8teoKJ3M1iijcKDP32hfpytZpmdzwGwTsbAgEaT9Z7VVdf6KNqujmFpPqJ4Q7oztd","height":907373,"ip":"185.205.209.85","last_won":1725545,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725509,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvSEaYNZchDT4j29AbcZkB4RPomNwsW3XpWBeh1HrpJNm9ttWYrbayTmu3b49BZQ6s6P3Nr7PnkAs7Z3tKDRMHDaz","height":135616,"ip":"51.158.165.200","last_won":777401,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725327,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvSt3BgFF8t4tAbzdaUA8DZZkn5jeYcwNkTvXxVa7n6UFZtDXR2HSXoeohGQftzwJ7FJBS5DHF8xS3bW53EjatHtJ","height":174598,"ip":"80.211.57.236","last_won":388786,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725339,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvT3Z4m3khRbQMB8iWo2jk4BWz6URB81xHnCg6VFhpkBcLywGoSd9Qq6wAvfynEkQ26jbqCsp7K9fqkD369vG15FV","height":80032,"ip":"94.237.67.75","last_won":319905,"blacklist":80477,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725340,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvT4BoAv2Cv7pkfgvKdLjHgnkRmRofTcxw31EFkHmw9Rce36M8S3hKmDYWZF7RbAMxkXjx59VPhNqSbfEVqN9iDZu","height":132855,"ip":"45.32.210.43","last_won":319654,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725341,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvTPJ6SSAPVM1fpyywsaQhLWcP1dAiKj7RgKDq7BBfvubvj9qM4cSemcThSoGXyqWLoHtPMXzZ8zu9jNB8z9HvhGH","height":101095,"ip":"207.154.247.112","last_won":431933,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725342,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvTfPgxZyshCWuKCmhqPSDYDgrVdEZA2rSZ9Rt6uHnP5CT1X9kZGKffoQ6e5A8n5keqKB3N7mFbry9Y1FzZc8tCrY","height":477583,"ip":"78.128.92.146","last_won":777466,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725495,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvTyJRYfq7AdT33d1xb5xParQmtL5Gp3cuG7ZMpz4SJ2FgbfeJSFgBW2SHhNfLrsgiirFGDdUnuogDFaCEAD91Mee","height":163442,"ip":"150.136.122.91","last_won":1511976,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725343,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvU1uoqGRo7j2KmrJcPtcBQny2sD79SMa3w1H4fQojacUmpQnBsYVMJjVoXmbrvtRKuU49mgQnuYpUCovfbmXixMC","height":355930,"ip":"185.148.145.14","last_won":1725539,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725368,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvUMUGEQfpHg9MepxXZi5jyyS7prREJrJe4BeuLWKRrKv6vkfYwse5CJqgTwe3fM11Bb4rUofzgEea7maRMcVSQkL","height":101109,"ip":"165.227.138.236","last_won":431954,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725344,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvUP5hT8Qf6teF4quBPrtYSYf3ZypCR7FMbauMungE13ZNNiG88Ro3a9J2oVQB8vrXS6ttmEQjJ5cAAoqv9VeVWUT","height":105085,"ip":"207.180.203.132","last_won":319865,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725345,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvVMk342A6UTHBvktCrxGgbrAYo4B2Nf89SM9M9shQNY56c63HvE7ZUxufAw8JDrcKbSfgWyJxf52ANyyV6JCBcLM","height":132640,"ip":"193.37.214.82","last_won":1725516,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725346,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvWev3C6mfUW4C7Z41xyjM3xzxd6REtuGwuwD5id6xNg52BMJqJ5w7wSY3p8t4WL6RyUjbgG5tLEwyyzZjkryyP1Q","height":136663,"ip":"68.183.239.236","last_won":319788,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725347,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvWgeCFmofyKUgWdzPjUoDTAekKknPXDRrQyM6FyJj8HpqVJibPbwCrZi2ZMATtJ1mkx3W1UhdmFSkthuHHBePgNi","height":136916,"ip":"95.179.136.62","last_won":319554,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725348,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvWxkjeDTfaiVGSaJykoGta6gQarejkT7pFELbGHzUuVy25dRQxaUiF2FxfZ7KT14zw4ZiMjfKRX58BjyNU6rHgHG","height":176766,"ip":"152.44.44.237","last_won":319635,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725349,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvXkr1dNJVeEQDBRBcVzmVvTv5bnKPFWWTHbx112JZEwuCnYT8KxPr5L9NEuVKg9khUjJNHeVuurVdrAhVvXJs84k","height":883071,"ip":"1.1.1.13","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725332,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvXvZpaSajAmu9GkjHEJk6XC9xJnKztTHyfJBJCLrw9UUXTgSoneyJLVKAbGHuzQ5spwsXNiMkMDnegbcN9pfZxvS","height":450343,"ip":"94.156.128.80","last_won":1725386,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725453,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvY3t7UntKtzkAvguQobRSsw6BALt3aYdyuW4V62hSCSJRnBhFYsYuuVDmDPXMtjKx2TfSYFeh7hKKeGe6rLu9XbS","height":133286,"ip":"109.94.110.33","last_won":1725531,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725351,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvY8y3NnoU6n9Lqxic2Dine9GUjsSJmvtXFY4NH8bL2Nzh6WviwW7M4DW7RhMYrd8Ktwb169EfLeFhgXXN9MsRsYc","height":81221,"ip":"194.32.77.46","last_won":1725536,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725352,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvYMzgQzZdMnAwhhR9Mmbq2sfsV5BBHqMcW6dsACd46KhGTYCDDHxo42mm3VPKbnEsK1YS3cVxNzsmM4Ky3rHSCJT","height":954852,"ip":"185.206.146.105","last_won":1725551,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725430,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvYf45y95eMd3Pkr11HHSRf5cEcWCkBt5hBdhtpVLgtZc7DSs8ezkaVNBzprszNZkJRVu8H66Dpteys2NgVBNTz9o","height":199189,"ip":"94.237.47.105","last_won":319619,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725353,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvZFXvrezWKATqky9mpcNhhN6axqnw2SHmgqxWqhDc493ntmFNzrTAwz37tw3kCDXoXH8EyHgrVJ2qjAdc9P4NhZ4","height":477583,"ip":"78.128.92.177","last_won":777467,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725496,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvZaz6Z4azJ7CmJQrZJLkAJB861xBEjAtHF8Yn9LTV9WG3QriQzjogrXHRgePtfmUhqVFMEpV8xdKu5wBTvNSpqRk","height":100629,"ip":"95.179.168.47","last_won":647907,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725355,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvZgPTAkAfVXKEk2SrWixjRnP1rTTN4qWKYEj71WoSPqrTefZm6jFT5mkNp23aXdBJLtkGyJyVtbzatiyzKxYLnyo","height":156102,"ip":"34.73.77.33","last_won":319754,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725356,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvZn3y3dxZ5gVDdG9qTkxs5rVnvj12U5zynuRA8Jr8ouN8fmKSQnxJGxspXrSFFbhDNGjhFFQwaR8qk1ZeskjNM9L","height":311357,"ip":"185.148.145.168","last_won":1725525,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725360,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvZsDuHQpKa1ZvFMYjPupruLc3rcqQ1ffCBKVfyzzPNoXSqytEFNd3zzvB17ew8xzHKTMcNa3bq8WLhsafZB6sVBz","height":907374,"ip":"185.206.145.104","last_won":1725546,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725510,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvZwpHYNDxpbKJQh1CjAxmh9YUXv1nAqn7MRYo7g1ipwm8UciZBp82V6iqp2sSewDLLsAJWtLR3pWEee4gj8vTM29","height":137641,"ip":"88.80.144.3","last_won":1725549,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725357,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvbYHznUTyyyqid5VkeKtmXVQuBm8WGb41WDfsMhUz91XhgENjXs8AnL6hpB1RAwGYD112TTTfGKiHM1jqRmMgwF9","height":103890,"ip":"35.185.122.123","last_won":137131,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725380,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvcEvvHxCBMycn2HxC9zGYsQSmPFcagHDbY25z3qSN92k9SHbGhc2Mj2JXLpUWhCApTj4ZagMY61A2eykkd7LhCuq","height":907391,"ip":"94.156.189.254","last_won":1725548,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725518,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvcUb8x4p38GFbZWaJKcncEWqUbe7YJtrDXomwn7DtDYuyYnN2j6s4nQxP1u9BiwCA8U4TjtC9Z21j3R3STLJSFyL","height":221132,"ip":"91.92.108.149","last_won":1209449,"blacklist":0,"fails":0,"status":1,"vote_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvcUb8x4p38GFbZWaJKcncEWqUbe7YJtrDXomwn7DtDYuyYnN2j6s4nQxP1u9BiwCA8U4TjtC9Z21j3R3STLJSFyL","cold_last_won":1725354,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvdU7pc4iTys9EeuHcHHQo8fKbgEtCPyF97moG622QqnW5m9THGzSeQCkmdF7aqg8tRiqKfLPDXTyu7AjZUcPKz6o","height":419573,"ip":"94.156.128.39","last_won":1725354,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725395,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCveKENvSQVy6NryZ4fqq5rfpJrJ6GYyYmej1DDWV35SJ9pF6izdhUnbzDynjGUGgCK86RzXctnWWyvzR8X17FGV3z","height":178508,"ip":"209.50.53.50","last_won":319850,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725381,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCveXqNfUjdEneWLm8XTHXXfXzHKjf3ti7Htk8dsWqKfSnTvycnVqSSFZv91FwTjn3WW5NbXhhCJPiB8Mavyf5Zcby","height":102096,"ip":"5.79.113.180","last_won":647725,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725382,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvfZu2QkH5Nq92JDzASXxZynW7CuHqdQeNhnRwvYw6QGYGMaMVUNbuJ5hRtbtPF47wk5GfCbiTBncxjUqHXn6aC67","height":167490,"ip":"168.235.98.132","last_won":319934,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725383,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvfc9BP14CKWtmoWqzEZBef9kgwigPjC758WX2mHziGAUEzunnUjH4WJXhtKKTn5VyCkEAVgrDvf2WY89hFi66Whp","height":119213,"ip":"142.93.248.199","last_won":319856,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725384,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvfcaJ7EGBrCbmVMijk5xXEQ36JtsSH3drkAB4Yz8c3phxqVJjSCjQiD9pL896bLNQEciS7hywDmj4bEi7bEmxvxi","height":133286,"ip":"109.94.110.37","last_won":1725532,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725385,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvgAD8oB5EvdsgELSTJXTjMo6wDfV8xic2QJ3kKkE34WTHv2un6gxYRBN2TNwJnuoJobF68rBcEscJWARngkVtno3","height":311359,"ip":"185.148.145.170","last_won":1725527,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725362,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvgAe7DaJVG3xtC5oJG5KUu2t7QY87YRpgdc47maMPwXsYq6Syop4U9LYGEEGpgqNLgJM8Av6zP6TAGfqm8HMqEKu","height":333757,"ip":"185.148.145.178","last_won":1725543,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725267,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvgESdLJFmsXZRis1nYiHNtepipdMEyDvqRP48jq74MwbdVjR12MgZib9sjeqdc1kLujyjQUg4YByQwcsEUtWNNV8","height":507285,"ip":"158.69.102.22","last_won":1252713,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725069,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvgRMvbG9hwtemUVnHREgwzoT7kFXkRHZvg1o2ZvYdxEHnDPpoXUTXXQdr3gzWwSgxfhNPfAGmG5WU2sduk7YLHJ5","height":425768,"ip":"94.156.128.56","last_won":1725400,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725097,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvgSKkvwJ2vkQ7tYoZwk5734RbD7eipYMzQhPqYnwrohAXv7axFBzQtZP7onqYv1GJ9HTCsoxxXK4ikzbe3Khuabk","height":165745,"ip":"94.237.72.24","last_won":319679,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725386,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvhkKx9ccNfKM5PrfkcQdtjhjBP5KM4SvYvKrHW21QuyK6dEkngJAtqnpNpHUYBZK5c8HhMwgfZsAdd555o8Z9qeW","height":883069,"ip":"1.1.1.7","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725330,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCviCBzPTaA6F1m7svjMrPgngRGGTezSw3ZD5xWUGKp9UK3mngCsxoTZ6SwmWZHQJK3kdoBfX47QTNiEu56eV8WZsM","height":311360,"ip":"185.148.145.171","last_won":1725528,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725363,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvidMMr9nJBdp9D6hhQYKUre54UyrSssDeCZjdDMZZeAjeYp2y39BYPGebGiaN6WQ8RzsKDiu2s5wLzaj3ZHXuDxA","height":476085,"ip":"94.156.128.87","last_won":1725559,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725079,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvjzd5kB75eEXB7MKMLrZq6fG7RApA6Wu5AEak3QRFoKft74Vd1jVcPiRNowWzQjtmaGSdpo4gpNMF9N7PCcXtVzE","height":179995,"ip":"88.99.86.179","last_won":319799,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725387,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvk67rgZYzFdfFMxdV6J8fr1gCSQwNU3JE7fkT2hEpW1X8Wdnx8eTg27RqAYGmynvdy2mXR5ZLHfAGgqJ7qsg9GrX","height":81876,"ip":"45.137.149.127","last_won":1725520,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725388,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvkC1M2Y46mWVXQYpb5G3cf6C5FDn3tQpku5ym19C13WjjcFtq2ib9tpfR4PhU7e9RDafyKYQsXCwRdJbfpt311z1","height":1455004,"ip":"1.1.2.10","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725515,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvkZxLgqZy5kUD1235y8rJd4pCuorJyqWXLgumddNAyifDMF2mdLwJEn2xXt7Dua5p3bQLVHjFJYkHomZAoL8Bqab","height":136916,"ip":"108.61.176.129","last_won":319555,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725389,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvkumkW5Xc9jdjZRhMa5Miy2oMGcSGp8iSNHTxsJGq6Cc2Eb9n97eCAztYcVC8J14mdVVg2HYY5tpYVUukSvkFc5t","height":81886,"ip":"2.56.215.118","last_won":1725522,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725390,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvmUon1AH9nVebwsJLi77RP5cWYGmyjaLU8LsJdVhErhMTvRdQ7QTb2PNW3jXKXyQT7uQPXZ7mXye6Df6px2LHR8M","height":90448,"ip":"94.237.85.58","last_won":319678,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725391,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvn6iJby7mVor2bU4VDBpw8QLwHEPN7x7fCKe5pKTPueitKXtuynL6M9s7cqsEYFvUNxQCR5EgCn2ug4G4kS4u2vb","height":133286,"ip":"109.94.110.36","last_won":1725533,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725392,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvpKDGv25tKE5H4TKqRjDePU2BmYNrXHgfYjg11R6kHg4hfvBCSUD1VNgyYJa3t8mu6FC6cnQEDoEXwzoByjfrFCJ","height":88170,"ip":"18.196.198.179","last_won":319963,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725393,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvqT6f5j9MErRxE5ToGYoZV8QMFeV8RSBdCkrJqKx13DwaYtCazzzqGqLuBsFJV1tT5HhbThA7v8gF1sXcAbpr6oo","height":133286,"ip":"109.94.110.34","last_won":1725417,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725427,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvqVZA9bf845X9nM3WskMpmpHFtNXUvZ9raD617BWnUMaRxyj47Kv36ecWjUCUMY5Q6iJbZsbzX1mjs2QRgCPaBDE","height":134948,"ip":"212.73.150.105","last_won":1725518,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725428,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvqjzvoWLnciEdo4t9YmMojXRmcdDjMC8andejLTDBTMN7bZK1NDNyZK1whF2cnF6dDpbWLSc7oPzLkVmuamqm4vD","height":450342,"ip":"94.156.128.71","last_won":1725385,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725452,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvr4RgUAhszrJzUjCHJf4769qdZuKFByDKLYiwfrnpPgMkDzmmfn38rKeQQHCSqC5wdJAAkKimckjfok4i5NkL8PA","height":311173,"ip":"185.148.145.160","last_won":1725514,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725184,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvrF5Ls4LuY2GnorVEPEZ433HtUHVCiymEEdnvRKwaxRw6iHvcCHLMtEArxcETyqfRijyQtiaiJoJpJRQpk1s8xER","height":333756,"ip":"185.148.145.176","last_won":1725542,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725266,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvrSvTP1xgLPoq5gG1BajPQUch1ifPJut8YxfLMC3kYdMDsPVMEVZC5MGiR5ba6KrYLqvJsDn6nvwmeu8hiT1FuPs","height":450342,"ip":"94.156.128.76","last_won":1725387,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725454,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvraoLtEhChqkX8wBihUpnfx4aLeR6wUiwZgJXj8UYhxmHHbSJYPMmdAtP1rTaqMUPV8C1ERH3dFsRzfn8h5JBmua","height":907379,"ip":"194.32.77.47","last_won":1725547,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725512,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvs1QgAxQMNw57wYh5MpySLPLwHAcyouzhx1kWtg8ErJQ9cy8ETkyDFhhUzkUkhGBBoH3Kp6axm7Ps68Y2Tofoi3c","height":477583,"ip":"78.128.92.147","last_won":777468,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725497,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvs2coaB8BMjNrv66fmf4EYLFFxPVJ4kXaiCzZdbcQyLh9CLeZGLSjxWok69iVWLCWkZz2KtV5ju5xNYLCV1PAV2G","height":907368,"ip":"185.205.209.244","last_won":1725544,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725508,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvsDcU2BgsgmntRJRSScsnt9Uv7Pg2SSQp5entY5zTZ5PEcK3SvcBA6YYyVVETzFMZ8uhdDEBeTryssscALu33Pnd","height":909556,"ip":"80.211.4.11","last_won":950278,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725217,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvtHEzxRJiJiY3aSZaF5KWF9X8fzVrAbRSn3JJvADAQ73nJT1jcYLKen9BkkgtiBEZRWSTX4jQH7ysxmqjvx7iFce","height":311050,"ip":"185.148.145.54","last_won":1725537,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725035,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvtHqLrYcczkCKagpSeFYatYmep5SCT6Px4N5VyEQnuPuPCWTsykLiPi9Y9QxKdtQZ19sswAHtCtGxiprae5WgLpo","height":1515646,"ip":"8.8.9.8","last_won":1598357,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725116,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvtZR2spJVd2SUCFmA1gX2CLy1FbLhTo7h6Kueeu52PzwFGgRhBBT65VUFTt3DumcoN5ieQCTd954ttQuPiw3B9W1","height":116058,"ip":"206.81.1.232","last_won":319961,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725429,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvtoqUrmKPjZXS9SMjFt3LLYJAAGGrcDaw68zpMfosjzw7Ai3jM2T3eUG3pdUGP4Dp2ejrUEDEhoUGHp5XcfwuqHr","height":80925,"ip":"209.250.247.233","last_won":319676,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725431,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvtsRWn6ZxQjnbnZMnmMRc3stAj2jWkxLKvNx1Kz2WoYftmMvoXPYxdJTbyfhACRQhba8B5pGEnSvxhFaHdYtTCwD","height":119213,"ip":"142.93.202.236","last_won":319859,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725432,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvuRSShwrKAD3wsV4NS2C6zj2WgmUhZXFJbWCMpbZHqNQ34DhKYeJh99qsscUhb4VVXyHsSxAPrEffn7DR73RHur3","height":112750,"ip":"68.183.138.75","last_won":319794,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725433,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvuX9WGm8GdnACCA1nT54UCEzSo5zez1bYNJ7DJNLpWdZ7VDSbBibu6dj4gr8xNCPsUMYTxWjXKndgAWDs7ztsDVo","height":88171,"ip":"35.159.49.216","last_won":319969,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725434,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvusCfZB2vvkfZ3RMJPWDu5yceDU8TFxjfp7MVmxp3fzZnyWw49wPXRtL7LFpisS44q1vRXc3atHDE7QmNAAs15TJ","height":104849,"ip":"5.189.152.114","last_won":319954,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725435,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvvw3F5sXWcYv7bTXvnELP9Y6wcbEsytngUWN4ec9TB9voVU1sEZwvwHh2kHiNXXJ4y2TgKJcc3rawJYAbMnN2wce","height":311361,"ip":"185.148.145.174","last_won":1725529,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725364,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvwNjsJLHNcAJFNsa11eWufvNjxLFPr9G8X9uX6hStujMgbwB4MBaLzgv5UqMea6sw3jfAt4sDfpQBNHQuDKcMv99","height":133286,"ip":"109.94.110.35","last_won":1725534,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725436,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvwX41qWsqxgJb1hkjvxtbp6jYLA6TEKpnKWhjMyhzUf1CT4R8SSHn27m2SG7nqgeHeZxPRXwf4BzydQjSUVBuEk6","height":909556,"ip":"80.211.4.12","last_won":950279,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725218,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvwxqWQ6oErHktRzjicuxDPE7xi5m19c1mtvTarwtuWtnDuiXoAajYgFXQEsbbW9C8fjufkAps9MuhCCddzcceU4L","height":1455020,"ip":"1.1.2.11","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725528,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvxwTDzqXzJBS9DLmmd9ga6nUqUjUXJbAyBzMjgbggtJtG6zMcp9MLAA8opvBWjq8emPTU4DwQ6PucQNp7XqZBuqd","height":1154151,"ip":"1.1.2.7","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725073,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvy4fL8879orGvgefmbCbtNrv9Nvx2u7CYBWkLB5pBibbVM5jAu3qcd9LnrgjgvXVcs6FpCMtxH5d4SnUBjJJ83Qn","height":112741,"ip":"68.183.136.168","last_won":319768,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725437,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvyQ1JjZKQLVJCg6Kr6J9LXRxvkmLFSeMNCuwExrJLibxr3XhnSMn6ZbGqSmQK2boUSGgsX5hCfh8wkQ8gfU6myAb","height":425768,"ip":"94.156.128.66","last_won":1725401,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725098,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvz21UGRtR5yNLzge35Nya3ZCgVtGbed9auBjQGFep7RPXNMVgq28Yeat6eACGgNYV5Qcb5WEQiDjt9KU3Rx16Zi1","height":104148,"ip":"35.196.208.157","last_won":137075,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725438,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCw1dt9sA8cCeKt3k1HTdXNYAW5AXD6gNNGDb41Wmth42yz1xQLktoQe8GsxVam89d69rcJZfx3vEc2cSjy2G6PZFG","height":137044,"ip":"185.244.130.216","last_won":1725535,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725439,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCw1q3KmQBTsRrmpiUGUcNqwTPM1QKUwQEBg5Bubg1m7hd9wuYVMVCrBeECL8jbmAk3FRuaVKArp6BDaVyA2riWEri","height":311050,"ip":"185.148.145.80","last_won":1725538,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725036,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCw2EJsNJHfQ8dUgtEh2LgVqgZZ3YhSyKFn1gb8RazN5RVYqGPBXG4ZZTEeJ6SxQW8cGMuVGsdmKqJ4L9DTDUthkKZ","height":176821,"ip":"152.44.44.37","last_won":319668,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725440,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCw2Jr2R29d4HtyhQ917qtpXV7cgqwXEwUrqMfm9QFzSHNU1v1ecUfe5VeqjNU2daubYUmmR9MhvV2J55KHSBwDY5n","height":80982,"ip":"185.141.62.218","last_won":1725530,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725441,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCw2m17PXdnhcJxkHJQ3bgn81geGk1LsssmzrnGv7vV5DLjXDXw78uw1GGG3VaMd2qaXMFhTuTfTXUjW3oGW4DLT1t","height":101112,"ip":"165.227.142.228","last_won":431956,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725442,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCw2yG2BMf72ZAdFrwr878BoYGLMmYGj6vduc1FsbB3FcheFbw1rqn9uEmgnLjAHk3Q69vsFNFpRvwhhagyTFGK982","height":81876,"ip":"45.137.149.234","last_won":1725521,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725443,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCw33B69v58CGuvp9shRbKKbaEXb8TZhmy2yAvE5odRHqPuVSbZTE3tpeCpg5eA55fF2GWVoN6UzbecdBToMXKSvAC","height":152597,"ip":"94.237.56.159","last_won":319921,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725444,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCw3merUiiXh6zMFMTUatC4eVLu5gKoTNADWCdNzgJnvN2gCR4Muhft85FDSFfHwfD1P4CzhbJjGP3w6chuxTQp3Q9","height":134602,"ip":"94.237.24.117","last_won":319600,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725445,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCw3rrvXRu4p9MbjXczmK7rgwnuQjsyqC3Xy5G187EpvB4JgQM7zHi9iWQAhkpVR36EHeQk4DpGz2WPGCYt4oY7vSj","height":134948,"ip":"185.141.61.35","last_won":1725519,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725446,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCw4H7WuQVT8xa7jMAzNfEzxwUoMtB6Xwz9Bu6UFpHG3ocfTU6YL7qjQYd5W9ofzm856jDSY85sBTusvwu9gpoevYu","height":138920,"ip":"149.248.62.240","last_won":319623,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725447,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCw4j8WJv62oiebgH7LGMw5GLx4Avcrs25QcuRoJWTDjaeky71KBtp5gpgo161dRwZpWLMpT9C3uWMNcaJx84fHg4t","height":355931,"ip":"185.148.145.15","last_won":1725540,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725369,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCw4vRVTjYbAroStCidrVWgYpJ1GfYB94GxzBPg7rfKt4Dg3MH82mLPqJ5EEYMUCKb95Ct1Fz3w5AejpQ1CquHTdFH","height":311172,"ip":"185.148.145.155","last_won":1725552,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725183,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCw5atyBLg8kF6382TLaTditJDVfrD3pXsemDTUCzkp5oWLqZh5hDoedkgAVZdkvFftzeg1xv5pfWQDym7uFp5SzcV","height":116624,"ip":"94.237.85.173","last_won":319655,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725448,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCw61GhJZkeMC9ijfq8DZuHNeW7X7LJUfzDs8tNNHhPyg1SzzeNPKxwe7Ke6frQgio5AhUxgBHWuxjftD3KV81HgTo","height":1515646,"ip":"8.8.9.11","last_won":1598358,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725117,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCw6cjEtfYp54nt3uwXJsSm5zt3Qy5gg2SqH6XAU6ZuWWFzEjRm197Hz7ZHeV8vMK8xMngBckNyYDs8hFGk5nGr6vW","height":119220,"ip":"167.99.0.166","last_won":319863,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725449,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCw7xuwQXX8FES8wKyjALerYchxjv4R5tJxRz19GMwfTjFTnTPjiC72RMkDXmnztubWyHedGc6gJEGSnmq19y5SWiU","height":419573,"ip":"94.156.128.34","last_won":1725355,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725396,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCw8jGLCRr5Cj94j7spK3t7cGfSMoYos6aSQvPyaPvWYDT2yxLu8RiuTSMbh67T45msXeR8KEdyJLk9okaS5qvZVF2","height":419573,"ip":"94.156.128.37","last_won":1725356,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725397,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwBEJFby4UdVkvoy7HvBac2AGKTVymJ8rvqfGoJiyF1M1vuGSQ76mBGTWhxeTzTDJ1QFhWqbQ3nmmUpF7fxTZWzTx","height":101104,"ip":"165.227.132.90","last_won":431947,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725468,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwBH1fuuPmwtZej8KiGyW1Yyaf4jmth5FfbWY1H7LDEqzHGfsG4zigH6oQciTDskV8uPHyjXyVLBLoVmVbDFj1ZPd","height":83102,"ip":"94.237.84.27","last_won":319683,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725469,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwBNu9qHPvsAJrBHdJx8Z6G7eHPfdTrfjcskpSkVR2X1JJdFo4CYWHLFbv48SBrh8LCbPJZQ81MEckZDK8HtjQzE6","height":311356,"ip":"185.148.145.167","last_won":1725526,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725361,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwBPGoGr4sviNKPaWXjbzvmGzSRndsNo8MewTxE2Zg5JbkeHwgBFEaJ5Huwqmskg4xU9XfBRFYUWQST1KthkWyi2j","height":477583,"ip":"78.128.92.165","last_won":777469,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725498,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwC3WFS3RC7VLviFojJFsyDa9Pyvi1rbauwGLsX64yNoH1QGteNThAND3viDcKFXHGC4yuV4Xw2CKYWjhHdBvGZSk","height":112750,"ip":"68.183.130.172","last_won":319796,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725470,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwCS1L824XjCzuSbsd4GmnZGaLLDy5rFdNkY5twqXJqz6aTGa8fZRmAFvNkdT6XHGP3PPwhB7zxZMfpJM3XVpfEbS","height":138920,"ip":"149.248.37.219","last_won":319624,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725471,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwCzErNoZAPhiADiLfY97vTSFyJuWUCk1Wf68DLaDkLP3atUyZNReGcEYp4MYfhk24ao1wUUQCRJN55vTdPaZ95sU","height":425768,"ip":"94.156.128.65","last_won":1725402,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725099,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwDBJfQu24a5YYWi2kNqKhsJwFCMuMNekdSBpMoWsrZLJ3WXXSVt1b1Lk2n6NJXpBm3cnBdBJtgZZjhnYtbgrgXoH","height":132640,"ip":"193.37.214.83","last_won":1725411,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725472,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwDf9yD7Pf8xDERFnody2g4UvaYS2uSuBkv9WSwhiDiHJ3c15DkV9dtk7ms8dH8a8cvNE2hcNH6jqND4pZTA7dcgw","height":419573,"ip":"94.156.128.27","last_won":1725357,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725398,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwDj5pzBWJrPPncxNurkGSJHBnGCYfHtbyM6gTbHuR8zhwhCUyDFvH5P8swhZB9kbFsQs5rAPc57UWLkCQV9qVfjk","height":90435,"ip":"52.47.138.106","last_won":319659,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725473,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwE2PCSPJgBUoP5UfuCNgfz18BoCANE52XhQvYduFt9zS9KJ1zS273JFQt8qiaSF2bUPEGw2QLUaUrF3yKw4m3SxJ","height":80032,"ip":"94.237.44.198","last_won":161016,"blacklist":80463,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725474,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwEaGaTGvbezi9H1PLq5xVVTnYM3HvXkas1XqeNb7MnCXsHrTWTqfPDtnVVEUr49gg6rxr2eGiXKXbWC8vUGnFh8W","height":132639,"ip":"185.141.61.226","last_won":1725515,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725475,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwEsVG6C842b7j5Vw7Aj2gtR1S8xXT9hjapbVme5kZvmr9DUcadQBLVm2s9WcEUPdmWnt5A919EetR3pnJs1BmKk6","height":80385,"ip":"185.244.131.60","last_won":1725414,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725476,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwFXWV9NMXfDmgkAZWErRFhjYT9URM4PhhzMBhRrToNRR1rRZCSwnNvTxrsRRsnBXYGbL6J8FhzCf64wVDQnRdRGy","height":81886,"ip":"2.56.215.152","last_won":1725523,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725477,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwFdubPxjVK6DfUKeQArPsrVUvQxZnAoeuKQPvXoBFB4SYttR3cEeZXBVGD8qLDefrVyUydavyyZcGpw5fVeZNdQx","height":199021,"ip":"164.68.111.49","last_won":554677,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725478,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwFxSLyiZSttAGcwWbBXWMZLtyWd8xEhEDQPNbk9AbWe5qdwuv2sExsAGvKeXLFdz5VNAxuAPtxBSJdVEePBQttGe","height":882161,"ip":"1.1.1.3","last_won":882892,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1724988,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwGgFTyyeeTjq1SMqPqS8GDcTw1yxrvPF3Xj2dGbNfm6Bg16tESvTn5TCHMTspB8REBk3bshunfwAaWzsPe3BPQKf","height":419573,"ip":"94.156.128.41","last_won":1725358,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725399,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwHVRPmH9YdjYcR2uGNVSF9srMu66gxAdTCF2CHKQ7sdhMLfUKm8Mei9o93Xik7tXThzvDBY2PoyPwfFrs2TAaecM","height":477583,"ip":"78.128.92.150","last_won":777470,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725499,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwHty4DAkgTfHraUY5vMQrq2LGDVg93cFjfaue3Qq8YkXPswf7n365FayMEk3YX9FXjnFKPo6g9qkyM9VeHNLyKYe","height":132640,"ip":"193.37.214.85","last_won":1725517,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725479,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwHx6TgTx9uVpGSf45uGu1bizit5oQQirhDpTjkzXzuakcypHduQRnrYtFqiSifgg9nBaC1Eb9PyQ8rNTqGJAdiBF","height":80364,"ip":"95.179.163.63","last_won":319598,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725480,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwJbmJUr16Zxd61kXcYpXUG3RCLSjh4GDKGReosKNEKDB2myGnbN4aEvnVRmYFZbezkpoTrmqs6dSFUbrqQJox2Yn","height":132640,"ip":"193.37.214.84","last_won":1468762,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725481,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwKHhwG9CtFhiXB6NSigMyhg1UNjLqBaMpVDFXztn6z3EsJ1QCz84VmNEG7nNtDhc1Ao2idVBnrE9N1FLCs8UHFnk","height":311171,"ip":"185.148.145.141","last_won":1725471,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725182,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwKKWMgrdnLzLfzdfymBzxLhkCqKrKCSfEVGaxtQK5C9NP1kcNLKyUx2uoJfU2FYhAgw8SfMP3nLoDjzT32PVrkto","height":81882,"ip":"91.92.111.130","last_won":1382272,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725482,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwKYxAtB3YNHhot6iPSJj39xX9CbiCGPoh6vuG7MnwHrczWamUgGxZrZm62iTm497YfW8Bg3BYZ7rBum5fpUqAXLW","height":966167,"ip":"1.1.2.4","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725423,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwLEdeBmpUeKVAejUp9krwj6R3XKsrSRZAscLtw63pctGBaNsSaDUs9BQ6gZyPmTCYTCxyRMn2JfLi3HEXgRng39j","height":450342,"ip":"94.156.128.72","last_won":1725388,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725455,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwLugQJn62BfiDX2iXsZL2vi2iTqH8v58jErP3bk3eDRyh8SkJTgVz4iaju6rLQaSmNpYdNFUkuYSi8xu8UWWYUZz","height":88170,"ip":"18.184.169.177","last_won":319971,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725483,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwMoEy4TD6QauizZYMYoWfRZN9Qayw8fhgns7ecoKcTfTu6DVywKpK3PuMkwydVfwCgycGC8tHmqem2H6BDxEjUw9","height":117470,"ip":"66.42.95.99","last_won":158998,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725485,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwMr6YEbn4xwxP2NkoQ5U8n9AU9ohd79WncHZRDJ2LJntgMhv8hbgZpWD9MVWv5HDnstLVzyZaT2q2YRuKaqfQ1z9","height":184902,"ip":"209.50.61.51","last_won":319646,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725486,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwNKEY8W7ScnNbcToeX6UYa7irE2j1CPeDkyPptnD5qAa2fzdJP95kkW99tn3ycai5BAuMJMEzyWrvWtBLrLCnB95","height":419573,"ip":"94.156.128.12","last_won":1725359,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725400,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwNSArmMP1M1Ye7st5zMrbYdV5AsFXUUwuy3bM6Cqc9iycSP3Zff8c5eqTjPUV3LJFFzVRNJwXL7t88JnE5PNbPTn","height":311050,"ip":"185.148.145.51","last_won":1725436,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725037,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwNjp8EFmW62WdeTXhWhFw3N2yxit7H5zdzrFkG3P7Efvc25kQDeFSMpRt9fbQ9HQMvtpz5FpkBz4kdHobcngDyFB","height":80389,"ip":"185.244.131.59","last_won":1725553,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725487,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwPLgtghRP39dnDEq8r9maigoWERWA6Ze1vuJ4Nb5WVucqabnRcjGZMjTKN1Qr9xKyDdoY8Fuj2YoruoXt2ha2yxJ","height":419573,"ip":"94.156.128.42","last_won":1725360,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725401,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwPgWHuRvrkinRo5YHRYaqYhHnNogcbgAYhq6tijNDhDHo9UYRSyGs2kQ4mbEGgSADYtNY2nWcNZavMCNEeJPKVK9","height":177260,"ip":"94.237.88.136","last_won":319609,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725488,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwQW5PbXaWBd3eVeoTR1MkZShVpQg15siJrt8mRinvjQNpuHWg3sB36xt3zngcLCHxSu7kQXkuQWnmzZJisL3twUa","height":100715,"ip":"45.32.145.175","last_won":647772,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725489,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwQpVTh7QDkWSzsGmjxCMwnuYpwMBpzYFJxQk4fnWuW6kSe5UKfYbRbJWt9bUND7NdHoPbrUj6QdGarwMtZeVMLNM","height":152132,"ip":"94.237.77.28","last_won":319951,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725490,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwR6yuv7rXEkw7NGZNPq157cqBhu6QfmMYsYeXVXbSdKndh8NSjBLavUk55go1TepZ2Rx3WvQiHJ18vhCp1BdGpr8","height":356618,"ip":"47.254.131.123","last_won":1382281,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724981,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwTLQ8Ed2Ezt9bSA9RBH6c46myZeapdYHGvrGWSx7nVqMezJP76wBZicc1L6VR3ve2mdXzWSoGHhBXRq65YZgBxXR","height":161935,"ip":"94.237.92.239","last_won":319988,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725491,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwTbQnp7yWJQyjbgDRAUZRcV2m3Lw57v2krStvF6uJgudZ8zVca74VEqWHKsURdauAdVZTgQH1V8a13mosRDTupZR","height":476085,"ip":"94.156.128.88","last_won":1725560,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725080,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwTwZLrvtyySvKjxMy85Yu7yW3T8duibj1Y22Sh2uxoteTmJGpkQXXZQ3YEc6sHmLztkjs1aw6NpLiiiS2t9mC1RX","height":81986,"ip":"94.237.87.55","last_won":319940,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725492,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwUqXw6vHmzDRPBkTdyba8zfvJht7Bn3BuYPTjUPhsTW4FNBagKKUAZFcNaGsb7pHbF5MQ6VBvEJmQ3h1wG3rVJdT","height":477583,"ip":"78.128.92.169","last_won":777471,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725500,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwV5sKPsAzBBkEEzhqMxKKrKzxAz7cDUTjHXZ6LhGUq7pTfJhLB3FBa7VUKiWZ7wpRE6GzS7cLCdJArcMfpSmzBEz","height":311050,"ip":"185.148.145.100","last_won":1725437,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725038,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwVQ73yQpcZMaZPLVCPpPDwyryr2KfesTe13FecKLEQRAr18GNfqo9XtFeACsUXBWpr95YqAgFeXTKX7GCBxdLN6h","height":176772,"ip":"152.44.45.163","last_won":319639,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725493,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwVbr1SX45LgDv95VJhSwLBLpM2d5KDNmeoB6uNQLWyCvFdSjFamLDyjmJ6aau67Z8pmGUKgn9Rqx6NBSEhkTPQkL","height":909556,"ip":"80.211.4.14","last_won":950280,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725219,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwVcUjNHc588zDpiPcjzemZw7esHEFGPRb8hWgf711i6RiDQqpM15LijBAhW7dsEuvq1M67hV5aab3H5PoEwLZomU","height":136663,"ip":"209.97.176.177","last_won":319789,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725531,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwVpkFnKeHQK2BoxJLtR18qWXboFhW7vBcfphP5mSUvBwHXBJNDzkPJ93oPtksdW1TvxKy5FbmDSfeLMY9jyMiKdV","height":104149,"ip":"35.185.95.250","last_won":137083,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725532,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwWETxUvxS4px1ePkVzzPov53dqPRzWpBfjEjKNt2AHPGtknECWDfia3bHRRVKBirHouDG36qfFMDGuHG2iNEdBfT","height":195464,"ip":"94.237.44.86","last_won":319552,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725533,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwXCxBhR8Bj8vhRQ4SB84ZPoZoRVkCckqSo2nzbBrVoVcLTJQ6KkbAqiAZXbxPfJTMXcZUZMi1WjtVHQtQ1NdfNM6","height":81857,"ip":"194.32.78.110","last_won":1725492,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725534,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwXHFsHxKHbDA4C8BFsiBN1gdpLWvT9BeGvyDtNPP6zKwnz6CrAootGX4kHFxuAwWCSkCZyNLvqWLPssUDmEGaTht","height":80383,"ip":"185.244.131.57","last_won":1725413,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725535,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwXLSZZ8PiAhwqhzcGuHQJYcLZuJSyTiMU5qZ3LTVkBnZqp6FGgzbdAYM6CmNQnr1WCcuyv2agBMMtY9h9i8janhf","height":113568,"ip":"94.237.85.227","last_won":319851,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725536,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwYb1ipbjLqYcixzizqo278KzJguLaJmjkZZnc32x5cCGeTeEJxhirChH6o7PfqHwrMRfFR7i3sP3has4zX6rvKb6","height":80032,"ip":"94.237.84.238","last_won":319922,"blacklist":80477,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725537,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwZEPyMTZJYvuyPmhkHKnve94537sRtNSadRgYTDbtgTpA8ZKQNg1mtty9t6EmZFc2DX94MBkRdFUxWDWRDQy8fPB","height":90435,"ip":"35.180.74.14","last_won":319661,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725538,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwZwKW2UvH95V2nCoXJfKFu33Y6BAKyoRSVZvrbh99TTjReFnQYtPCDG1RkYiyKn4niuACaaW1vujM2eyBu4oVUKS","height":311355,"ip":"185.148.145.163","last_won":1725504,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725358,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwa4znewBcgyE8hwc8oJ6LpenBvEau5cJAxk8SZj3zVZPJsvqm1mC1UasNN5i4JYCQSEA8K9hEtWGV8tNUWjMuMr4","height":88167,"ip":"18.197.100.92","last_won":319959,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725539,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwakebrUgeMPfsm6UYZfCg5CXKReNReuRfCsfVobEzZT7fDB8ixHBqT6ZvKSFEVGULiKmR3S6KzzVz6KdHTjuHCMX","height":81985,"ip":"94.237.49.179","last_won":319937,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725540,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwar9nMkJ7UA7N57vJ3uoht64gBzPDSdmx6XqB4g77nw7cA3yPd8BV7Zwbt4pCYrB5y1p7b3cSnYAnMadaZrt4hoJ","height":1515645,"ip":"8.8.9.5","last_won":1598356,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725115,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwbffxiqQfkaBg9rV5smRXQMAb2dXxf2LLY5Bpr2BVB2BPVSSg3hphnAEzj5ns3anKYpqdVzKwx7jMDG9TEjSoQ9r","height":153558,"ip":"140.82.58.220","last_won":319845,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725541,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwbm9dnAwrLjX9oEiBjjfkGDw5CiU8rMadPtix4jPHbr76rNmxp8GwCgGhiCTgxBTKtbNrDTMCDmhkQy1katMnovc","height":81985,"ip":"94.237.49.170","last_won":319941,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725542,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwbs8HL45k7DecgEDUHFF58ADdkz7BKZD7X1gbw2Y4oEKHZ7tSSQgWQ9Pb4p5GKebEb7Z4vxP48apNF64ywpTw82X","height":311170,"ip":"185.148.145.108","last_won":1725470,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725181,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwcd4gWns8BiP5acu9P3UpTGxS9ZRFBrRRB3ibDiEe1mEsKDezChW87GwCr4BwkyGrXnEsbmEPEn793hkhs8su2DM","height":900618,"ip":"1.1.2.3","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725253,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwdZVr3EowaHGZGbsTi5tTsuiPSChbx127MBFsmkNraKDp7A1Wbribh1gJMdZzE5eJMZcJyYpCHKAUyuvbVSdjzd4","height":419573,"ip":"94.156.128.25","last_won":1725361,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725402,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCweDHSy7j5LNzRx9bgP414Adi33VCG3rAAQT8tcMdd5UPoChSo87DDePogGehHVqrGh5CspqQ2Ld9Rzh7J19osfq5","height":81883,"ip":"91.92.111.128","last_won":1382273,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725543,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCweWHgfTHYgEHYCNAeSX8FD5MyYDwD8Z1uCvMT6TGjcoBCmvko5j7mZek43kYQXVG8M1Uxfz5dtSGAxowg8wMv41i","height":419573,"ip":"94.156.128.8","last_won":1725362,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725403,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCweggwRvRzdmYXRTjh3YCfqDeF23J9rX9Yp1hQr1ymjSTkRXgR3wt7LHuFZfNPBftm6KpJmd4AkSysESrRrGv2bcD","height":180857,"ip":"209.50.57.244","last_won":319642,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725544,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwfsouZ9edPMeE5J14CETnKwqSTnHefUTs3KsUyzFSCvFcJWTPFmLb3n51Aj93Bw1VsbtEqp9RJuu7HoyqnBo2U23","height":419573,"ip":"94.156.128.36","last_won":1725363,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725404,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwg1u36RhUpb2o9GHdY4RLiQko6piFno51F6YekfJeGtoesv7oDsCZykD1Uoaip4a8zqBUUeJqUZzRwMXXvAAv9EX","height":132967,"ip":"193.37.214.87","last_won":1725451,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725545,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwhc4cJtQLc8wmvfRrRQ9bLiG2baS56SScRVByutjYDEX4NXwPNW8M44QDhCTn1iysod86q3hCjvpbu1T2GEjaJZx","height":81221,"ip":"185.141.62.219","last_won":1725430,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725546,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwi4JxwvoxqZavogJ7UZWYWiaJ5vrxVZ5NDRzWpume4mitLJv2ThWogPChpEf9Lqop45pqpS4bDy6qmWbxKDhUMm2","height":333755,"ip":"185.148.145.175","last_won":1725453,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725265,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwiM1BwHst7E4aa6pnHTvFzu1bZ62YNWU8i27zwYumgsC7jR7Gy7LEhxJWHsQGySZ6B17Z1bZFRwkf4pwia6VXcCq","height":126429,"ip":"94.237.28.88","last_won":319907,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725547,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwkAW8f39DynHgQ5hWgnpmopUzjJesTD9W4JvYwDBxd1nyeREwty28skDDfbnP8EdG3GHHB2HUXe3rSZaKt3h4iU8","height":100637,"ip":"140.82.36.13","last_won":647909,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725548,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwkNz3CmHhzv2NfraSyWqpxu8pTYy9MT2NWC5GbrGZBKY6K1jKmeBX697pgYa4sC16LJAeyCi3LnhwUUCzNVqi8K9","height":136944,"ip":"142.93.217.189","last_won":319572,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725549,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwkoQLpC92XQnFZjddNK2FKFNdtBWq7HYKv139kPqQTpUWhXPr5NJknyuEkKvKhSkKEThCNwDWPo5BRTEw6cXPJXR","height":81984,"ip":"94.237.49.196","last_won":319928,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725550,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwmB2fptTmtERbT1ossyUQSoZrT758UzaShCw27B8Qd2S9LnAaNRLFuuQZeLd97ECEHXDfGJ7Sm24jcDi2mHn35F9","height":883070,"ip":"1.1.1.9","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725331,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwmM3M96X4CXxormBgs71R5MVLXrPR1iEkRSdqSXQTAffEyfh1Hnb48yDfU9a3FLaYqEbRkHaf3xdBA8qFqSVs7kT","height":81894,"ip":"47.74.159.22","last_won":319596,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725551,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwmTaFDw7VTGPGnS9dnFisgxtRRqGfK2oe4jshgjVQWddfoksTGqPpwbDfmLLrL4YdBWmUqKemyovyNrb2QnBqAjb","height":150049,"ip":"198.46.179.198","last_won":326309,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725552,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwniYvqchEm81A6zpncATpTu7ERz7SvV9HXFtd97KkkYu2a4p1uRtETpD6HssJ3kFAGLAP9QUdaKJW4Xkb4bFdPRQ","height":138920,"ip":"45.76.58.101","last_won":319625,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725553,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwnn5fmgxPEzcBs3TdWr5EgomsFpi5oQYdUkVdHXatJmwfarsNH3DcHUHUCoYJGJXep45WhMLZ4oq1qtWass5mVMd","height":81858,"ip":"94.32.78.206","last_won":319513,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725554,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwo7b2Q1BfgMQijQfcyomqmvAtgi89Q9QHvYf384aCfK8kj2gvaH4s6thrsVVbXPuuJgjkweUR6XjTYw4xbAHFjL1","height":425768,"ip":"94.156.128.57","last_won":1725403,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725100,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwoHPM5SuVP48AcQUtChGUv6sDomNzwN5zizXHjUQ7cuad4sGE8HfLsefvfLJE6fpt6CQq3PJEUFESkdLSUcQffao","height":132202,"ip":"116.203.56.96","last_won":863849,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725555,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwoMpY1anPqxDp7Qy5sxMApkqPMiDEV7B9cvntKUqu6KzcniC3zU6p5DtzLaNHuF5gpWVZG6de2wMgHKDT1nhm1Kh","height":311361,"ip":"185.148.145.172","last_won":1725505,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725365,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwqoRg3RTjsL1i9S2rPEpGZj3mcj7YR3BrhbMGgccd6nbM4B3Zo7kXk6SddWXVfhFQUzVmSxeEURH3DLjMMGYe5Ed","height":96609,"ip":"35.180.61.134","last_won":319682,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725556,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwrCrLkWPX2qyRpsESMa7XfLJcRntZLP59PXHZV94FWLHoosvq2y2NKEcCwHExruD16VmzXdoV4efqMBxvLpbLp6P","height":954844,"ip":"212.73.150.66","last_won":1725460,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725422,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwrZ3EE4N4LQZvbgmatEBoh19Vp5nAJgGF9E4mm7QqiJiQMQ42eJq5b4jn3DVRX8SSASGvRh81BT87gEHUWWfvV6U","height":112741,"ip":"68.183.136.149","last_won":319779,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725557,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwshC9nqy1LZWpoStm9xRa8Tjt7tnWVZLLWtzYntnGA5go34EA5B8dnaBQCJDvs2Y5Sr3HcnEYxgVKXFj6YciCCey","height":883071,"ip":"1.1.1.11","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725333,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwtYLuVM9dn1nvmbeAwPjZHDr8tMd2VtihhPWzbTkhsq7NiEEUJSr8Jqy5W8DHm3DGACA4dHVdJvSGfYkoABzJeFv","height":909556,"ip":"80.211.4.16","last_won":950281,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725220,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwtZLbpbSHttqovqdKSHtG72jaz9utqA2V93ci2s7gPm6RNcZsxSGf8K6p98JwkKHu939bC2qJq1m8AS6SxxfVM9V","height":81858,"ip":"194.32.78.251","last_won":1725495,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725558,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwuB5NS2AFQFbdBmrZBHk7PuqoDVFGkGijWGW7igXeFvnxZ4kwF8eS4nxTUPWVJSdGxajEtQ6ZSjFhDVYHbA8XRg5","height":88724,"ip":"94.237.86.33","last_won":319915,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725559,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwuT3SwYAVQJ5d4RmJSzLRNeQnKouLjV1edtY6t9whytAX4vbEFmW4FxZEnyhRVVmBiz9egmcLNxkCLQVbAQbKacr","height":909581,"ip":"80.211.4.17","last_won":950304,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725242,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwvJ3oeMkiyb5XpKeZDFgYb9xRNV4R7wuZ8WJ87Phxs6Sgi3ukaEus64uwG2sNfoqtbnvZjjsyC1PAUJc9S8189Ym","height":476085,"ip":"94.156.128.85","last_won":1725561,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725081,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwvSa7a1uURSCsmMdF12F79zEAuejXLyf4srZR1SCuME1rMnQQF9W9b4sHdVymXNZ3ZYVTBqezCfLMBgJ9ajVL5oB","height":135366,"ip":"94.237.28.54","last_won":319935,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725560,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwvT2szLXciZgyndLKmG7865sc6hZJ3CGyS66TL53W6PttgwXKTnjhZjNwgUAb5ggPgkM5Bs3iqLPorYUtEr4ZHT5","height":169313,"ip":"94.237.44.95","last_won":319666,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725561,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwvh4YJeTgT3uTjLo2o9eHfYxu4X6afXz2VoELMfH1x1UEaAnCVBtbLuGASqBQLRUoAvoUxJS8szWSr6pRYakQUCy","height":477582,"ip":"78.128.92.143","last_won":777465,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725494,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwwcy3taszR4sTwaziygA6jKty5rpzvmHpgYsV6S7ok8p99ifyGiJQmVF1nPaZiVRLfwcE75vWvEHjreC8xG4PESe","height":178479,"ip":"209.50.53.46","last_won":319818,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725563,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwx5NFgKCZtpbhWfv1WC9YRrqZZ8ZZ7goxR3rnVCStW6q6jvjCszkVFfPYsudvAaCcAPgnpo2x3WLi2Uk6o7TLbaM","height":477583,"ip":"78.128.92.153","last_won":777472,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725501,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwy5VrtLG9zbBqsLrt4wrysga87HEe5okcyugG5QHhjQ3uaHoniCzkpjXeL98154ZxjYBk61sjNFyTJ748HodbJhq","height":154215,"ip":"152.44.44.135","last_won":319982,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725564,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwyDafrPJhRAM1sjmCTmb3gF9agxDSpicVxJpkhUejHupPJdCW6HCZNvoewCn6LwFiUdJa79biyZTtGwGhjtkeSy7","height":162701,"ip":"45.77.63.129","last_won":319689,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724965,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwyFyfasNopz71EHhWCbxx9D1xv4ckYLPMhDGYT8wcwcxpkXqvTRfCKQyuRDfepMEHpovBvwseMLd5gKJ7uNaLNTx","height":86008,"ip":"185.157.82.212","last_won":474920,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724966,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx1SEFWmncMuCPQzXqKZjicfSRnKkjKHkTExopp1y7gCauSFvc76rkH2XJuamgtAQYzqbkrAJFyWJ33wXo1Na6cWD","height":425768,"ip":"94.156.128.68","last_won":1725404,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725101,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx1eqAiHmpdEzpXZjfvcgEKhzDR1AnX8EiJAciRfHJpUABp4ihGqNWPwpV9psUheH1Tg3Ae8cEUwi465X9k6AMp6R","height":96662,"ip":"45.63.10.133","last_won":319787,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724967,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx2nnr8PdaCeqEJMESHECJikjDcevNZcoQfeWrbpicHgZuHFhKvUmiNCDMRonadnbrsr557TZkvUhNH4wPxi1hCgL","height":81985,"ip":"94.237.46.18","last_won":319944,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724968,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx3v5p7wz7ugur5u8DhpYxBtmSLtc3BWYCbU7ZgVfxMdXKkMM4teCQdRPrHpFyGvnkR68inD56Y8ojWQ2DSDCwZj3","height":156861,"ip":"94.237.57.64","last_won":319514,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724969,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx3yEzmb2qHJvSLmL1eBPt3MjC9pn8HVV9aqswSjd4EwE39Mqfr9DR9nGaVg1pd5YLzbidM2wrXVkdbjDfBthxbof","height":477583,"ip":"78.128.92.149","last_won":777473,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725502,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx4FY7kpnMAwuSHd7ELkzA7uwihKr3HmHLzBrf4Syj9fua2LaB6ypBicPSG8z5HhQNN44ZqUdJQN7Wx5Q2xJEMXzZ","height":104138,"ip":"35.227.100.204","last_won":137060,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1724970,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx4TUQczPNdGTYWWzg4RErbeMz3VSJuc9wHrT4zXLT1kAFVCsScKmvCfq9QaPi6gqC7zcxz7dfGoQLZjhvgfF7kFS","height":81653,"ip":"178.62.57.225","last_won":319530,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724971,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx4pHPzovZPh9TveJweGSAD7RECbfhSGzjPzqGVmRYUaorqK67vz2KZXDrDyUXEGdviGqvjQkFjMXAicSEaVBdwZm","height":477583,"ip":"78.128.92.175","last_won":777474,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725503,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx5aPXJ1yLCjzKgFSdGLPH9P166WmB8zh33QUVvkszSTpQhBjysNXyrL1x8k4Y1CXUt25ZWucmdo5MRZesZrq8pDc","height":311361,"ip":"185.148.145.173","last_won":1725419,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725366,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx5x9gEabJijSY2JaJXCSXCYZWXENTEbb7TrKMU2oj5iJCom45F7zSqkVu4i5GeFH5dvZ2v4DQGaX6YPYFYY9Etsm","height":333758,"ip":"185.148.145.181","last_won":1725455,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725269,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx6A3ZAjvQZFEE7X5s5iKxoPH1XEXr34dMtXcvGMfcNr26yjfiV5VMjQfKmjX73wqXbA1jymFHtkhzpJDZZJT1piX","height":91580,"ip":"91.92.111.218","last_won":1382330,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724972,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx7Wai9U4BbVjpr6XUWgvY7GinRZcVAKeBAVrv5g1bSbdWT18E2mVwZ7bbRwkjDdNVBquGJLML9FZzrW6GReXa9fS","height":137641,"ip":"88.80.144.2","last_won":1725416,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724973,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx7ofjaEStycoKoEWjWdsaN5Zs1chXt5hMWm7BZGN471b83c8Utkn86b6Bg9WxSe7fH52c8HzX7RV1phTsU5irgDB","height":100213,"ip":"94.237.84.189","last_won":319512,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724975,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx82jJKqjWT7dpXAmmZ4dVFJLPHnrcU3QiQyjhWDbkEha5XWRoV1UyGR2dkXMMQhVuUkyrjsoKSpYznMiRvECKsVs","height":90435,"ip":"35.180.152.45","last_won":319662,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724976,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx8F2gRXMnd7ARSbyFJBVoNfCAAtoRhoHBFUFp4VuX5zuPU3HH56hZYtzhSJosaFLPqJ1hCTdfv1k24ryc7CwEywL","height":209614,"ip":"94.237.56.224","last_won":319675,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724977,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx8qhyghHv6BSySckfiAZrKa2PeVwiznFbdj8UsbY59h6QpSqUu1FVMH6YFnzHD4L1XfvU3thC5Tbv8eqEFHtqmSc","height":104149,"ip":"35.227.92.101","last_won":137084,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1724978,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx8rSRfFJukNBVXuu8JHqJWdbdGsxPjEVbqrFnojGMM8Lm1eFXMSnEfppBP4FMfxmGHPa9HzbZCDg45m72KTomdiR","height":419573,"ip":"94.156.128.28","last_won":1725364,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725405,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx8vdYudYyANJ8ztHtPExC51etSNop4f22qSBUSqyHn3GM2eBPutngBHPtszgP7tUVyZJCJivXCCm4pwB2GGpZEir","height":144837,"ip":"94.237.88.100","last_won":319616,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724979,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx8y7Q21qLs4oU8vBtBD6Ckf31n8xx2H4bnRLdQUWxFtbKPQBM1Fwbf7jJiD298Gnw9gPtrxZiJqGa1hXGGg7u3NC","height":1515645,"ip":"8.8.9.7","last_won":1598359,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725118,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx95VLoRPUbWUXnpMfmtKmZcKcvn6PKMo8oz7d4jwr2ddrwWWXYTzqVtPHqgAjCnMbw53m7pAfznTaZybkUAmHf2Z","height":311170,"ip":"185.148.145.107","last_won":1725472,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725185,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCx9LR8hX9N3KNqqsS1oFzHkrq814A7dKYUuDJnV32EU1bzmJmgqNGbd3ZdLxFQkth1hwL9FgDznWwRv96gRqchpP7","height":311170,"ip":"185.148.145.140","last_won":1725511,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725186,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxAmBC3yp7ohmYT5xCT8KTQLGJVk5PTfRWGrabucwuXeGE2Xx6bducpXqcPpfN65XJSgwCnYZ77NQ39KsUc96rEW3","height":136664,"ip":"138.68.9.161","last_won":319790,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724980,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxB4uuBDFattqhc4eenwY1QgDpCMxEMS2gDyMZmtJLmAs23fWQd2zk3rCNx7LeuNXtsQrfpum1gHNECasHsgC61GT","height":419573,"ip":"94.156.128.23","last_won":1725365,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725406,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxBB159KReWygSZYNMhtzj92tp1npTUWCyvks2ucLRvdTUzCsU9JCNvejrCAQ4nL2U2G5FWZkUnijZ98YKiv8yeVc","height":425768,"ip":"94.156.128.58","last_won":1725405,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725102,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxBPTpLdhYKZeMEpQniNk23kNwyoEUtQ42veNjYa4nucV6eq8LjraJ29hssncwq2PqBippvPQ9VWt8r5azVF633pv","height":80707,"ip":"93.184.70.75","last_won":1725510,"blacklist":0,"fails":0,"status":1,"vote_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPw7v13bTj8UUyGwv9k43LNRbaUsG5UBvPNVXUrpjy5sQbTwE23db7mHinn1XXfbSYqTBoF3uiaMcsX6ZinjZYQh","cold_last_won":1724982,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxBmAeZj72DjX5bnjH3eomxKcSs61FSkntvGTf9M57szCnpFxErpRKPyky9hWJbzcXp4Ag7DFT6cH4bb75bfdKrif","height":954846,"ip":"212.73.150.85","last_won":1725461,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725425,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxC3Y87dxndcpXtxUeid5ZE2ZS1okxiy1y6mwfgjxdn57hoDtSa2d3pELBgJJaJF55TaS85qovGn3RCjJjW66J4pz","height":136967,"ip":"95.179.229.234","last_won":319583,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724983,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxCdtPFBY5bmrU8KZ2PaHNvzNxerYZb8K2xsdgKtLkHCGsnHrfKE2V5qf9jtUKMZ16dYg7D8k3maJfVvpN33Keusv","height":81876,"ip":"45.137.149.126","last_won":1725497,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724986,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxCiFBCxQM7RCS1xsrAhQfXoWj5TYzLCzzaD2Yis7uFu77UAbAEpghVtD6JW3pNJoy1G4g1CYC9EMARfZnsamp2FK","height":1515658,"ip":"8.8.10.5","last_won":1598369,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725128,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxCu4MbnyuwTVpdQUWVhaUSwrh82CSXzA7SpREhpkKSvnra7cUadB4KtWmUJ1rGPpfWfv5nXneFCHkwVP35dPLfiq","height":88144,"ip":"52.57.93.153","last_won":319918,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724987,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxD26vhQhtbQC94BF66XsoQbEjhi1TvAvhXAiUfatjsYqt7uyMUNKgUUzQCxmuHo8CyTT32zzUuzbXygdd85hsnRc","height":425768,"ip":"94.156.128.64","last_won":1725406,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725103,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxFKxzW18jM7SPhToA1C3Riu1yrYFzxXQ46mAvZX45UZRxoYpi7KQ44ENTacj7jffyscXLuEEB4Ca3nx5ZDyHuvLH","height":81985,"ip":"94.237.45.215","last_won":319945,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724990,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxFWrFkmHSCxPQT5YYJZ17xLKK5oh2uk7zmtCeKiF4p9d2y3mwTJxS4GqrffGJnh7W6EX6n5NkXXtTbyryKE3gmcE","height":81985,"ip":"94.237.87.54","last_won":319946,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724991,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxG5vJC7T8nKShe5PbLpmhLYeb6dWfy7ZB7Btb8YPBLfNQ87TEK565vWDgTWMVACahwMmaB7wpa7zA9GZVExKVnG7","height":355930,"ip":"185.148.145.185","last_won":1725444,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725370,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxGCUWvuuTNTCLP4r6FWZpdNUgBRwthxmgSARDQkfHctDNgpBpAyP2o9w9dM8mTKrrYuMc4cVqpX2gin77NLW27yF","height":883051,"ip":"1.1.1.4","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725316,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxGiumWEpkU2San8u3SVnKxnUafEVsFSqzCEBsp3zPpNS9zZY5ZBRKR7v3rXYqvcQVHaYfJGVMxoPKqa7xfYeGUVe","height":104148,"ip":"35.231.244.244","last_won":137086,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1724992,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxHcWMpC9pd5k38grRK1q4MpedRh1V3S5fB9m5TcrojMLxhXUT23wovJq1GnsXSSm58CNQf68N3DEhqv68AxbzxLM","height":1515646,"ip":"8.8.9.9","last_won":1598360,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725119,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxJQJUMoqmqpm3xPVpshj64HBXPjjLrJvsU5vkXRNyJF5EoUKKdQPnNwXHdQ2B8r7byZxjAgPdvuWrRgp9unsfTyy","height":81921,"ip":"47.88.224.146","last_won":319693,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724993,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxJUqvDvStUqGkFLBqEReBx3sDVmerwDpNDtK1N8UF2fpBK9ywmv6euPQG38bp6NJySquaRcjVsFoNjEdt1rTNdM9","height":419573,"ip":"94.156.128.24","last_won":1725366,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725407,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxJeoCDFcn4T9VBN3otqg2SHAXBPVkP5dEsBdm43AaEgY2PPAHVXTy8V3hhvpMRnGNebrF5tRkrx8bXhsHVCsaiTx","height":90115,"ip":"94.237.84.228","last_won":319906,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724994,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxKWnKgJBQqvBC4UdyYV95AkCuAFrrp5tYcZxtFy9mS2y5M9XGxX3qKWV63erosN6yAnU3GV4MU3w9Xh8mM9dU8zw","height":80032,"ip":"94.237.51.24","last_won":319521,"blacklist":80477,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724995,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxLLkyXVgfStzbiWrix5drdXK3o4mCuW4RdYp6ZtnYC6qgQvZZfAuvn18iRd9tMjBAjf6iRbGY2QChqNCoLrjmLew","height":1515658,"ip":"8.8.10.6","last_won":1598370,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725129,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxLzhupnQyk14Mj5PX9S4B3y6g89G5WAytVhekoRhQTEjogXys6QMhegosfPj1xEHCB9FaqaMQ2MQgNTKPaySH276","height":176766,"ip":"152.44.45.97","last_won":319637,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724996,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxLzowwGULBSPJGPHSto3Xw6utNoS28oncLiZZbpNHwEwjMDzxeWTNRg3drye1mAaYENDfgwvcTdibBX9xht61Hag","height":81226,"ip":"185.206.147.83","last_won":388619,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724997,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxMBJGEK7n99FizLpuvya44V2of6hZZU7KYBfRzRdLHnuX9GY2CaGEDST88kxgP9tvKyygeAcNKsQ9Nw3xqfQaYLv","height":450343,"ip":"94.156.128.82","last_won":1725389,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725456,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxMzrNm8UhKWZE1uMLQ1uHuvb7xg7iszTe4kdH7PzAhwAjnLFijdHr6BJfHnL8erBnJFZnPXAvh15DJZM4swSJVwf","height":450342,"ip":"94.156.128.73","last_won":1725390,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725457,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxNhQDiMC5p9bGz4UsjiKcT1cyQUC6mJ5f3SNGsAtC4t5x5Bd5PGMD4777Yr38ty2TMMSrHC6tCTC7dUnz91u7gT1","height":175579,"ip":"94.237.46.226","last_won":319998,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724998,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxPMfFfooLwkDRFsao2bPgxiwWZtf6PkjQN732PnBXvfAEWRE3JUgnDtXn5chXwvEfSbJdFY9Zxr8aHMJKFm9C7Mf","height":81221,"ip":"185.206.145.202","last_won":1725431,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724999,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxPebaFW7p5DaUi77SThmALQ4vupHxxrkqeG2VjeHiFJKFaJNXLMcQiDYLzERAbij8C24fM54TRgQdPoTfqVLqKuT","height":311172,"ip":"185.148.145.142","last_won":1725473,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725187,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxPsFvNgttWYLFk9BYbFgo91oLGSEL3jJi64UVsx2RfhCihujEnG2FKsw2BPfF5BYfw3B2EQQNwTQLzYVj5SGmVzi","height":135624,"ip":"51.15.83.39","last_won":734355,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725000,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxQmdsxHajaQHPQx3KuMitCHxVhWkkCixYGjmW27ViHCkoe2xB7X6V3BRD29brV72vJgkJbi9XkWeSF9Dp8DmDU48","height":162747,"ip":"178.128.187.76","last_won":319734,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725001,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxRaH5RBWb1bCMUMrno1msueV1KgPvGgAByF3bz2qTKkQYPJ5NsbbevPXwv3puJ5TfVCRUpYStQiDsABR9LeZKizK","height":91580,"ip":"91.92.111.250","last_won":1382390,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725002,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxS8MkuPgQ2WEjA5RyLj67Jh2M4YJf9n8ctNisHk6atvHmL5iBTmSRX6c7zbMjBMiUhNdj11ZNjS18ebQhsWJgDGC","height":106418,"ip":"47.74.155.95","last_won":319843,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725003,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxSkAaLLtbEYUjRRa5sXcsQUrzduftvn2hGVsxm6WkhdSVJGbiDrme9g7RuzcskgMJZDphM5nxsqbfHjt6yvRQpUX","height":81850,"ip":"194.32.76.117","last_won":1725481,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725004,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxSzXGR7C6GErUVM9QmPeW5vocwX9UQpQMV1UAbicWV2EQc5p8RmU75yC3CNnK5MeE8DkDBcFGYSvpKzV7ANbs2i2","height":333757,"ip":"185.148.145.179","last_won":1725456,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725270,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxTKpLyCY6ELm7NRbCmDWtKaMjPuDF6GYbNG4BVQuyMEngQWpfysSG1YzNQSGkcSrBMo8fSMgkvhUKonsZLCgWjYJ","height":1455001,"ip":"1.1.2.9","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725514,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxThJshEWjnDGTRmFPnUW8LucDdatvFHh2eRCqoXg46XMjGMp981KHhqfwrKkmrL2sPE4YGVRdABtZDUduZXLaLMD","height":133516,"ip":"94.237.31.143","last_won":319917,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725005,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxV73sgEs4iedVdE48Px6MUeFH4VwWUFBCSQrJc3oVHzVZDu8Y11SFmfRwKPHssnPr4P6xQq2iwVy79U1kzh1ut3m","height":199191,"ip":"152.44.33.32","last_won":319622,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725006,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxVHRgQGPbXThqCZHh9f4gqQMSsR33gXq4HYxdkohVGYDeYdiq7YpVBg1jFRJMYp9dWsDXYMB9oSyaCAN4DAUJhqb","height":88170,"ip":"18.196.152.212","last_won":319977,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725008,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxVkhQtx9PnGRwzGNWMqZWRZw5h1GgHEs7WheZuN88xTbzoBDfKEB358AjMnLocdqLNjEDqyHdnfXP9YnqvfYMVGS","height":477583,"ip":"78.128.92.178","last_won":777475,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725504,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxW84aBovctbQ3q61JVh66yRLmkC774TWZ96LfWXGJLyenx2Vuxvy2GMangjx7YhpreZmuduvbZEWXqwiEQaWvmCR","height":112741,"ip":"68.183.132.99","last_won":319780,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725009,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxWCjS3EyX8X2WbLuWUuAGSoR9tVWiMG8SBaqm8AWzoKHdyD87iBkUAtxhniYHEJUiRcdaPVNTXsZ8Lqxn9hhdtmV","height":419573,"ip":"94.156.128.22","last_won":1725367,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725408,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxWV9mMRbN3NeV9MwRJRBwG8Biv7k7RrMNee4cBLi58juwm7bEC3hRZAvEibkpegq774dpzT4mwuYax3vqhmiD9A4","height":355930,"ip":"185.148.145.183","last_won":1725445,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725371,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxWd3isQcchRingcejY2ph2CoaMpemD5AMNd7TaSBKCbnV8KRXA719bY5aM4NJzvU3wmDb1utKdeLFJDvhuvRWGrp","height":81221,"ip":"194.32.77.48","last_won":1725432,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725010,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxYP94iny1cyqbhd5ixJteCAac5hLL2vfpSkSef9yU5MkgwSjiSTqGuUT8BRQv1quMCACK8Zy5y2HGQXgEeT5SLCq","height":81165,"ip":"47.88.169.108","last_won":319840,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725011,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxZFmqMK4p4qQDdGCot9WLs9EqnBSVxkx9Wu9h5hWKKQ345m2HToBdjVFuzpqanpTqEkodBKNQqHyhB3rjVK7cCXx","height":419573,"ip":"94.156.128.49","last_won":1725368,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725409,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxZTZvvG9dZrFWy7uihSnzt2MxLngsrXWSoCqU3uB1hP3mgVK38geDtdKUj6c1VMZJw1rruWW5xqaHDfAJh8EwNHx","height":138920,"ip":"149.28.201.32","last_won":319626,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725012,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxazAnTioeoCM5VGYaJUwd2AwyzqY2YzyzSkDwBHCqc2w2C3mNejpAuVbz3NY2ZhQJYwSsbWetaZhLrE5FfBUTzfP","height":419527,"ip":"94.156.128.6","last_won":1725558,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725350,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxb5pqDkj9tfK1JFf2R1CJXzjsWp7oVXbgrZ79UMPkAMr6CqqzxezWqypWtVDwQ1JaZnsGeYoEk5sLNVy8JwcpKxZ","height":91580,"ip":"91.92.111.185","last_won":1382391,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725013,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxbhZGS61N1ZxtKfW9K1PAjvq6WTvUgvHE9o2gCxfdfvCsFWXE1hT5eNVL5zz5UCgz4aqu4EwNAhpYEskAHvBQfcx","height":136915,"ip":"202.182.119.19","last_won":319551,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725014,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxbmK2qVFkyaeDLoACQ5WrSZxiXxmC4GAKApokXhF4daszJ2EinM4pjjuy9oEherFvnPoxA2rbWSuAXY1meEBv1y9","height":80013,"ip":"85.25.203.76","last_won":1036719,"blacklist":80485,"fails":0,"status":1,"vote_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxJHTjsjrbL8uhA3pWavEqPZsUNLeJk3XbWfK9hJ797ywhsrk8ptRo51rDZky3nN4yhC23VY9Kj7gZtEJGbyvPepJ","cold_last_won":1725015,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxciKQ5fsZZhbex2Pr2d6mFxThQdNBE8om7T2byKyv1a3X1KZaHAttSywf4UpuAfz3DaqiwQbSqyNUyeEmRGJPq2f","height":81653,"ip":"188.166.79.152","last_won":319532,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725016,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxd2kNRXKZh37hT9fCfYVzysBCrJnrQhszewR8koQXghgZBfTjERG5e9dYLqyc5JZk1qVsnjVK5buGcJrZEpaPky2","height":81985,"ip":"94.237.45.198","last_won":319947,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725017,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxdWN6qqojK34xMTyuJBE6d47WXTHs5w71qZ76GgfEpFsfXw7SD6nTEYNP8vmEdNk8DN3SmVmMKWNjW2wfGHayqgU","height":202568,"ip":"209.50.61.245","last_won":319835,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725018,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxg7QeDFbhaLjpe7i1mejVDC7tZvScva5Jc8LPUf5fDj65TpFwJBGtLuQvxcNbZvLcGwcVo2KhTtWDVTCQ7XKT5cq","height":425768,"ip":"94.156.128.60","last_won":1725407,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725104,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxgW9Qqqrk4ojE3FXmNCB3QBZvPf8kBESfU2C8XnxDY8NjavRr63agS15n94dAsJpaPF4v3bBviAr1MzXQ5zK1po9","height":1515645,"ip":"8.8.9.4","last_won":1598361,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725120,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxivg3jzdbN1BnAo8swYY2b38PcZnXfsiLpvQHsHuGZJrx7Wu9UtvXtbZBq2JshkFwJ8Sh66GXubpYUn56qT6j9aL","height":90391,"ip":"185.157.82.217","last_won":363611,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725019,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxj5f2EkJpwvtWcraYWwBZqR91t63heTQ1G18yJPooeKa9WZAuHK41FDsCwVeQJbE2p2kwWL4iyjdyWLGUARe63H1","height":136664,"ip":"178.62.252.56","last_won":319791,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725020,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxjMg3CQkotEyCX1Rt3mPWVESDC7etrPxvyZ1afxye8gXz6za9thcrJ6kHB9akWXE3ciouqgSMrAcWj4SiXAJ3hDB","height":881583,"ip":"1.1.1.2","last_won":881944,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1724984,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxkVMCLReg8BdBxNK1qaMTJMCRkg97xRgxzMYdxeTgP7jupncGbEhq2qe6VUeHB9tDxg53RGfTxZPFEVdgy1vwioy","height":1515656,"ip":"8.8.10.2","last_won":1598367,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725126,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxkX156sJb813VT6mETTD51jKyTVUCBEr1LWf47QsgQhcaPpyAxDvX1oBGN2pZPfyVCyYAFK17WQKuDuUfsn38eNF","height":1515656,"ip":"8.8.10.1","last_won":1598368,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725127,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxkfA9p5MKgeSKXh55cUR2x2nLzRL7F7Euojkn58JynDWZ7ZkQJhMM45Ku6ccaZZsoytTQ8RGpHpXLfvMdJP3dN4Y","height":81855,"ip":"194.32.76.218","last_won":1725483,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725021,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxm3h6rQFJtPgcWbJax5jjcbXPuz3aLYsXreAwX7TQEHWpFiDBo2dHGFtn5oKd2v9aq8mM4Ka2iwb1HPCrK8ygYq8","height":134948,"ip":"85.217.171.205","last_won":1725490,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725022,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxmPznisUpseAu1v7SzUVmBqEP1Y9X6QavYwPyEpcjFSdy6tw4uwxt4GtPw2hi9y4kDoa9emS1nwoST3ibWEuVSyh","height":425768,"ip":"94.156.128.61","last_won":1725408,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725105,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxmUCRnXFdRZiDuoHLaEUGP3nopSu3Qqs1Y7mKCLXGUdyKP3h673vYXzN8mJb4hfLiXqqdKygqCwKfMEvuGtynaCR","height":355930,"ip":"185.148.145.13","last_won":1725446,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725372,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxmniinURnDNXvZ7xcwgrta9rpJ93mxGYah9btDgXKdiKnkRhbrcLsA8CXUy1B1orL5LEj3f4FqsKn3CH4FcXfFKK","height":118411,"ip":"104.248.34.111","last_won":431827,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725023,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxouxMr1ZtHSzvgVCSes84n65pduNWWyNVBCKyzbwag8F47A79FktVzbg7usSeem2vR81oSGGXEw5HMUEoKQB24rs","height":134936,"ip":"94.156.35.86","last_won":1725487,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725024,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxp5r6mNjgzAiAEZxF5gndMEvDYqDwYb6D8yFr3JTAMSDUUD9d7Nn6ATbt3TwrpqtmJXZJAqa4TRFxDbwp3gLc26K","height":162442,"ip":"47.254.145.189","last_won":1382249,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725025,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxpSufbaWTgPwipUrejw5gXrZcJABUXMzLpD4LKDkf2xZRSCrtMqLxCLvKvBnZC9fNS55CEBESpqv5KJ2xciNwm9W","height":80033,"ip":"217.37.63.250","last_won":1725418,"blacklist":80466,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725026,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxprEmCucb3WrN41xvwtPQg1zy3KJYHjfG4p8FtEDLRr4HHGpAxQUiNLLq73n7hReEppBvc8bWQHixb8PiT57CQa2","height":450343,"ip":"94.156.128.79","last_won":1725391,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725458,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxrGjXqgqYwStK9VzuqVk215S9A63kchVcptbBSvgm8YG9MdFQcnsNENGMiScGyjBpqKGX17qzsjdwdE5v1rXdwvK","height":129947,"ip":"193.37.214.56","last_won":319718,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725027,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxrrWcT1yZmm6HJvgEcDyrcnVxhvnuEE9DhS6im4nSisv7cnokbrtjqJAHAmqt7T8L5VZrXzzyahYspHUQ47CQhXj","height":80982,"ip":"185.205.210.237","last_won":1725554,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725028,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxrvaWhxUVs4CaKVCrLyG4UmbPDWcBS7YNJmERMdjHnqPZcq48PVvo1ad2vGSPDn4H6gWzxQv4sPV79gnn7jZoE9f","height":121491,"ip":"45.55.36.97","last_won":319527,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725029,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxsg3CkzrT55q2FzHrJwyEdD33E2sGcX7SN5Tr6AcDPa1FLDAz1VvkCnwn54UjKj8369qoZQ8CX9QMgw3kyLtKc7s","height":81578,"ip":"139.59.133.166","last_won":319669,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725030,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxtreYFs4x8ZCo7dU71SLDTR2bx8xFLLB6rEGCkv3TQejRQmmWfaGH9w9562TYBgTFzrbFjHARgZScwsvomdRVCef","height":333758,"ip":"185.148.145.180","last_won":1725457,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725271,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxu6UhuQ3dnTNXsNdzBPyvGq8Yu7sWqR6P2XrQgkEs7wmNi9BeZpJJJv3rKUVox9XdPHJy7KDTF66T7rK5KPmAA6M","height":450343,"ip":"94.156.128.81","last_won":1725392,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725459,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxuQVB7nhB6rpS7VbWRjbqtUHhUP8bK7ZtUW7wMzCfkBoKFvmxq87NKf4ZsB6JQyTTJYkdAv9YtnFcZevmda2uUZA","height":80380,"ip":"185.244.131.58","last_won":1725412,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725031,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxumAHriYh6sqnZN9UhTxUmdXBQoQcgdVxAvJWkwR6KPcrhXHaPRGbbbr8xopmqsLa6cia7xvJb4kSukwzRf9dN91","height":81849,"ip":"194.32.76.134","last_won":1725480,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725032,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxupeCDtxpTS8dyqaXfZnXLDsJjwrJCgKswyqnffh7sJtjG2HqcYuU6W9qd2a86PEKRxpMxcbu8q4iMENegNYcxye","height":161937,"ip":"94.237.56.194","last_won":319990,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725033,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxvMXvuAeXpqGf9nMRHp2jvyXuRHqSpwaJqTaA3Qojj9RyqbkRcMVbAkYCbnNxaGQsWxT6n93cBbBkp6NgYuHLpgs","height":477583,"ip":"78.128.92.170","last_won":777476,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725505,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxviXq9xKYz5qqouKRGKKUfXXv8dWPDA6aF3w8VCjAHBjdonGdtgBcr19o4A5k758J7vVdzhHUZzyZZz3Fvk2AMqJ","height":106402,"ip":"47.74.218.31","last_won":319824,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725044,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxvmTq1wZvnUh6AA2hhemZFX8ZBCR64MZabnhVF8kH69K2oWrXWgVf5V4AdkuEjvScycCQS6b4WS8pK88ooJxJAVa","height":91581,"ip":"91.92.111.88","last_won":1382392,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725045,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxvt6CX1ceMpHWwaV22yCR2Ax4suW9MW3aWUzFgKwPKNBmTy3dXvTyuVYsTnh5nKxGqWZeaDtsjXEBG5rB6AUiP9G","height":83985,"ip":"47.74.137.73","last_won":319540,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725046,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxw56bWZsKdjPJS1CjZSQcJhLm7HHuKvRHi6wbkLdbHTyYUxVruBW9E4Vc4JfjXymWe4y269y15EH7su4zNN1VmuN","height":80507,"ip":"194.32.77.51","last_won":1725556,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725047,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxwELuK9VH32KaYs619SCLV8mED5QtBVsXam6NEnJXmgWF1wRXcKMxBixP4Lpqax1mvQhukt3oecu2oTXwguPdN3y","height":132966,"ip":"85.217.170.73","last_won":1725450,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725048,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxwVTqDhwFXKSANGSkocsEFU2gcWxpj5rH1cBszUipAwewS6jyhub1rnhu957zZaPuEBaHzprucQtvwdXaktsTxmh","height":477582,"ip":"78.128.92.144","last_won":777477,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725506,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxx64AhNbNtVNyKsd5H11pMVtJ7YNDAW1NNpRKf7nwatgchNpzXLG25jiRidqxjGqnKdzPFrLjxHK9zTYhWTtYYjK","height":119213,"ip":"142.93.250.162","last_won":319860,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725049,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxx9U6jGmLUCaU4H3b41zY2ivBhXELcVpHoK6hzu3heq1ms53PBUn8v7FQ7M4irP6SdRSfuqe8j7DwHHwAwLC1BrB","height":311050,"ip":"185.148.145.99","last_won":1725438,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725039,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxxYN1iysr2bwR5QdNDSzqf3GUZqDywQpD2q7kgDKwQeTJm5ypq31hgAPTH82qaaWfog8h3WM4iNKJkWYvqC43eE1","height":97911,"ip":"209.250.238.24","last_won":319685,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725050,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxxaG6QQqzLRQhT1mrGnbajyCmtLnoRAzn52txsiZdpUoJwJZQXmMrHdNRjXB4DG6PENVgtA1DotW4V6iKJd1qQhr","height":311169,"ip":"185.148.145.103","last_won":1725469,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725180,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxxiKNhNieAxcKydMPB7UJMF9e3JVecPQJFzpvYwnh34cZHiUdPeG81wJbCzVGzE18TykPwJmNnpL2P7hps8SEAM4","height":88170,"ip":"52.59.232.123","last_won":319978,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725051,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxxvwHRvn8uTFX5dQNSFkZ85ieVQWzfsTxhN9Tzd3kQZyei3w6F9mr4hgDLVJcb9j9NBgyYGujtJKq1bDtwpJM7hH","height":355930,"ip":"185.148.145.12","last_won":1725447,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725373,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxxx5ZSQmhBiy8DytGfLQ8uitDeTuDK2PsfwngvmPgyZnxsraAySr2spqMRRzgEyFCDLEq9XqcGehQWriVMpnrbPV","height":81886,"ip":"2.56.215.88","last_won":1725502,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725052,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxyWBiFURSyAE7iVqk6ctridNisgpxCn7JHJQmJr6tN71Lra7kZndkB3eLCZaydUaknuFccoytqnkgPnHWQdYDMUP","height":883068,"ip":"1.1.1.6","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725329,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxywXCrdbzCMaJeY6m5bNAF7PoHr952sgY2FR9Tz9vG58jagF8pFn8jVMBL3jH8pSRkBHvzFriroqFDgtiiFUQ2Px","height":100637,"ip":"80.240.28.177","last_won":647916,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725053,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxz6L3vt74vaqu5SQHLNB6fMxFmiRAfkDmEowf26DQ7YZygD6ztuMiqhSf9YRDShu3WY7PYd1Kw4E8LZD2BiDdmDi","height":419573,"ip":"94.156.128.50","last_won":1725370,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725410,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxzB7L79kQXSrCEXRpbAsJKwYakBM8zPZ7z1QYdSEs31GkssXQPbBvJGyCCRwePzh9GHhQSKrwySJXCyA3VTtMUpy","height":132888,"ip":"193.37.213.249","last_won":1725429,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725054,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCxzHz8NbDLNhyq4LFESKjqP2dqnirv9GpS2HcexkuuKs817birw5GSTBmRQQrcbAB3yRSAufoZ7TUjXG4BBWJ4XN8","height":881103,"ip":"1.1.1.1","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725074,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy1fYUwWWPfwAqZf8sLZPaTswaEwpcm4xfDGdrveawaRqAbcQReKkqcLWj2eMXjLRPo6KcuvngwJ4G95sYG2Cq7b8","height":174832,"ip":"207.246.89.97","last_won":319722,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725055,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy2jVmQWgKF3qcNpsrBsHmfDGxF4fj3mD7xmSk3Q8sTor1TEvh6k5JAXQ6zvDpfwPKqwjvM3xNMhnU4K8kyteyj4U","height":80982,"ip":"185.206.144.211","last_won":1725424,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725056,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy2rrxRz8dsotY6tzkw6oubJzNp5h4dJj9W4oXyUzNfmWq6JiuLD97MwKawW8VQLJoHWo9M6DuoPmT4MEfgSCuFd9","height":149183,"ip":"209.50.56.188","last_won":319511,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725057,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy2tcNop9oA3bDyzk4zZTqxfxe8Xudxd7U4QL5gGCWjtj5cs3JvVQN9e4JxpgMPJYRKqxZrDqXZiwHijUwjsnvWTS","height":153558,"ip":"45.76.177.162","last_won":319846,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725058,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy3CK5Zdkpbkz4VB3YqD68Hq1j194meChvuiBBTZvf9Fy8nb3e5gG12WA1oZ6cSY9K2sQ4vZjmS5A1qAoWWDnCyid","height":209612,"ip":"94.237.41.31","last_won":319673,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725059,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy3Y7aCA9JgB9EhuCPZECdYKC7FqREYoDWta2fb46KGaK6sep7pwFYojpBvAe25yLCXTFrjx6anpsotGHJb4juEjF","height":99536,"ip":"94.237.28.141","last_won":319725,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725060,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy4yaVsvbV4UYrgFSSirwDoez22yWYNv1Y2KT61cRKMxp8dDgocG1rpJLJ3NiEjecLspTR4qMVoHiyNXiDaHS4EvR","height":137510,"ip":"144.202.127.109","last_won":388592,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725061,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy6DYU9VdZTXy4Gh8hoKoQqys6GtxKhTkndafSkck2t9Mm33WuKv54fENoNkeLcTXuZKoq18nXZAtb13ympki3mQT","height":195465,"ip":"94.237.121.103","last_won":319553,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725062,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy6DdsdKcQoMP2U1nHVAKu1sCUV9Dgay1Ezcf7jZU2rceKPKQJMvbu8tM7f5Zv4xphM9ScY7FXP3f3oPvSGpyJ8X2","height":883071,"ip":"1.1.1.12","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725334,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy6Pitta88tgmqvYqxU4zj1H97PtYeq1ZAMdW5gsX6PoV4aPWDaq2LCUsi4sNLxZ8KLMudKyzPpisSq5VSKZK6VqL","height":667020,"ip":"74.56.133.162","last_won":691173,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725484,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy6XqkmuUtRLteqkcBeZaL5UiRr7KnGmsVPYeJE9DD7rB9h4XGNtSmMdQknNL8vHFW5f8PGZCV7LkiYPX7uoaX1rj","height":476085,"ip":"94.156.128.90","last_won":1725562,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725082,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy6j4SZPJ1jrW25C2ed3J5oFwLfkAv1hcNQJrNpBTiBmdsPeRY5WcRTCgj6EANXMmFkgQDSzr5nFbYgYMJwqeUkNg","height":137612,"ip":"149.28.123.10","last_won":319759,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725063,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy7S5iZefKnoahufUtjumquZ1nn4npCWnYKGPu6UJfVq5rwGrbeB27m3EtQRr1bjaEitsbj63HihuBpC1R5eP7G5B","height":106418,"ip":"47.74.210.39","last_won":319844,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725064,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy7nPkYosheD4YfLovBEAsayaky3RxkEPVmHAMm7e3xTxMMGYoYTBGqGLW1GrY6Vnx9pBnR2w2rasMNQTgBJbhy5E","height":81984,"ip":"94.237.49.119","last_won":319948,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725065,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy85CeDtxFjxPkXJquP8qFyE7dYUCh3xA8iwacNXQcueLpcaBwwj46Ybb2hpeXzD1bHZn7gR2WMVWmT6PC9bRYbLR","height":104148,"ip":"35.229.22.4","last_won":137087,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725066,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy8KC5Q1qLTYSSv4kbEc3XpYonv6LsUtsxpyW6qCj4xPsqy5M8RHxKgq46AY47ks7Z9DUGUZZtxgfT4F1RBe8P8fb","height":419573,"ip":"94.156.128.35","last_won":1725371,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725411,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy8MQtfWCEEnkL9CSYNiZHVqfhA97hPC9UQSHqY9GGvfaXBturKdXTbPxYZKLZXymNDbQhy4xv81iZEYB6m7njw4g","height":881784,"ip":"1.1.2.1","last_won":882145,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725201,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy9Ka8kUCRG7nmQYQmqpCZxgkbLpNXspdsT1ufV9EQeycJ2LmCrcc74EzVjTioAJG2WyL89AdQQgvzZESjmGkAF3q","height":81886,"ip":"2.56.215.184","last_won":1725503,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725067,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCy9pFfW6RpbXMWEszUEXxQv1jw8v7BdLTXC1s6sVpHNSzDnVZmkPGgogHBmYBSEhZxxxBSyKk1gCbNstT34rtC3WV","height":106430,"ip":"47.74.229.99","last_won":319854,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725068,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyBBBDLQEUnSiN5zVax1meUinpN4nLWz9Cp75J4HSfizEchbAgsb2wVj8PT8WjAYJJ4fTfDiDcNv2RtvziRnhoEf7","height":137641,"ip":"88.80.144.4","last_won":1725459,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725070,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyBDRkSm8YmJy9J4rscGA5bX8bYhaBToH6BrvzRbzhQMii5C5cncN1SnarA7r6MtnGpyx3eA2NGM9BdE8fKFoz6KL","height":105219,"ip":"206.189.66.61","last_won":272692,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725071,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyBLcGWuRRdvkQJtyuXs7eAHiPng89qNyzVdYg9o2VnoEyb6hfbr5MnzoD5zHo7PWrYMdZhh52LRWJjHJvaGGb8oh","height":177250,"ip":"94.237.92.234","last_won":319603,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725072,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyBVSGSJPXkgETSwr9oJvcq51M8caxDx5BdSYcWv2pWc7Au2HxMeqZKktXHzHXVZkgigP7CZiVNUoFTJH5zMxRPMv","height":91602,"ip":"45.137.149.30","last_won":1725463,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725075,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyBxL4HoNEaacyz7zVqrdAyeU4GZ9aZXdFTaZMUT2ZrSvt63SmnqJYExcNwnuRJsjyBWwieiRE3d5fxCZX5VP6MnK","height":127098,"ip":"95.179.150.222","last_won":734381,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725076,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyC3AGsMN37UepE2fXJSepgj6u6HRPuHRuBn5ohyMQS11ZYCHjTP3kfeBqbSVnGxnpzsn8HR1JQWrk9kvsSVM6tXR","height":713349,"ip":"142.169.78.242","last_won":734295,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725305,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyCPMgkkWnDDfBAfrReYs39mZJpEqkxBNpGrzchZvsmtA1pB6GsKJ9FT1dJhBtJr2f6xg8dkatsYQ9aJfdJbbte9j","height":209613,"ip":"94.237.42.106","last_won":319674,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725077,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyCZUEsSDzZRKYZHrkmrKMfjjEJqrxwgBgmKG8yngPuNxHxKHrbwfmcLsHacLERiwLJnY77b3tMDdkpL6Hjjw6qpz","height":206737,"ip":"51.15.85.82","last_won":820667,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725078,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyCfStFYB5qrxsYkszL4GYzfFF6ot5YSsDuP9RR9oiVoax4qnuvJrcdSRfYcAdsBPL2fMPSjDbpWLGqJEwoAE645a","height":192676,"ip":"94.237.92.66","last_won":319910,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725085,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyE6AYJz1GTRyb3jpUucKaSG3tmw6vSZfgqF8dBwaascxVF94CapTptQajJvJnqEqWKC7kCtnAHmTyi7gnEdJNw9c","height":174809,"ip":"94.237.40.34","last_won":319698,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725086,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyEG8fkSLoNNtfqpfedHFUpHRCZfTLB3DCxe9tiJkZonWRagxzaW71YEq7deU2u7Qd5bt6j6HvhpQcyxFn5tmRQ9t","height":134935,"ip":"193.37.212.242","last_won":1382252,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725087,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyFBrq9Xo4Kq6VniZF7RKYJSoEyMhSXLPH5fQpjJcWt1Xuu2ke3WauoVM7tAviuHQMihed6bxs5Cxw9r9tLY9q11P","height":137344,"ip":"185.244.131.7","last_won":1725493,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725088,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyG6VhZoi7MhtrJgboo1kyUTQgJJ3prYUZd9q7LWfqQ9i8pXwdwC3eR2d7Fn9fkhQv1non5G7MbG4iSaEYPkGj7LS","height":81170,"ip":"185.206.146.215","last_won":1725468,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725089,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyHSezvo5byVoajWkPdV1sXmWrdDfoSaG83THH8hUvDsHu2RUkfAVCmFq9oab4jHtC7WSBnEWyDYPLgULJGCPHZXN","height":136577,"ip":"157.230.90.171","last_won":319677,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725090,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyHe8j4cKi1S25Tse3R2H9aLrAVdQUzsAgsvSHinHU2cssufjjpUevRQWsQz3AAe2CaASZsjWxaX2aqMCjBdrY1kP","height":573919,"ip":"158.69.102.48","last_won":1252731,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725262,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyHr9utywweVGmq5QHQtTBhoyV9oYXFqfYyudYfSYTVGGgYE1EVBk5Kj1r1XTwHENsbPAJVAEuVTkkywxjiqCG7zn","height":81992,"ip":"47.88.224.147","last_won":319949,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725091,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyJe3JmwAZpxPn3JbBvyD2XvfHQtBXZpFLMxVbESLwFNrEvA14YiEiqXzXtUMBuUt7ubtERZdNrfu6e4aMDbq4q62","height":311170,"ip":"185.148.145.138","last_won":1725512,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725188,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyKRVTXemLN1pkHwM7YpxTAEMmrHKu5Kd9LCGWxg21XZLyqrDag8UorRRumGDG3LzL8NUpPX31xRfQPNEmZfu5jnk","height":137344,"ip":"185.244.131.5","last_won":1725494,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725092,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyLTorehDaF2vtdF6zLTwVJ1f6cHe9Mp21wE5ph5RnyL9EwLwjXAzafhhkjN9dRh5XuQGBetWCjRZJSjSirjJPvSd","height":134935,"ip":"94.156.189.60","last_won":1725488,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725093,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyLrKba6npGp4o3RQf6KxDWis6PKVhG5M9AaeiJaLtTQ4Szh47hVR8CNfmpCmpCBtbaLqkmnzxJ7tPXYEebxntJ3o","height":136663,"ip":"178.128.231.233","last_won":319792,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725094,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyMNw5R45E8wX536r3NAoq8pS7rj1UXZ3Y9fWzokhSb2koGLw4nBn8YEU3NXm4csP69ZwAb9Ypn8pmDpMZ8Kz4YKu","height":81852,"ip":"194.32.76.85","last_won":1725482,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725095,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyMUsszRkvysDJZGfYPAWPSEien4zX1yBAzo42zDQFokqB8dbgKPDuDpJmdFgyaiJ6ACHCerUjs17x9inDDMS9LaN","height":88138,"ip":"18.184.77.82","last_won":319888,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725096,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyMtJXLjBYGcwdaKU9qZEjdq2NaNffnX54foK9bwGgDWLo8KrjaNysCAvLEzer6kSbAeNeUE363eGZWv9fdbR185R","height":148165,"ip":"163.172.147.196","last_won":319992,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725109,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyNBDQG7CCzkSqQiHezMwQ36zzTagfdDhQCaQaZBmptnJKTLDFfybDFUHbRQgTKsPCcVmvQsviqtnExmEtvZ6y6wV","height":80040,"ip":"94.237.84.55","last_won":319874,"blacklist":80472,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725110,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyNLQWttxNRdRzEaSF2kiKrjnja7R9twz1zk6RnLtaccyk55cw4TbqRV9Z1t38yDnMRJ1Vnh6RNMSn1EmosfkRkrs","height":450342,"ip":"94.156.128.75","last_won":1725393,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725460,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyP4Po2QJde329RzXLbH3bffW8VUC7SqZj21Hn2u9Gtw7ndUYgdxmigV1BPq5Xn74H3oMVZpH8Z8P1WLXGy2btmpj","height":81221,"ip":"194.32.77.52","last_won":1725433,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725111,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPHtPKhMDzcgmKFPAVg9xNUxkzUvqY6czzPxq5eHPAeWyhphpagE4r4RtVXXHWNX9pBrBUJkQSmoD7fbe5SEqF2W","height":88170,"ip":"54.93.52.74","last_won":319981,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725112,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPdAhj29ceZEmUJyWDauX84bws7Mern4jVuHzLGRZ63GikQ9gUbRJzTvV1ArwgPdMD243GkBhdiw4XD3LGZeQ25H","height":84561,"ip":"47.74.231.19","last_won":319884,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725113,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyPpT9Ls2c57KRKx1M5NkQSrL9Xs6VsNsoeytYVTcHLxcRxMnmqRHHk2tt6sNsp1zG5tMcukDjyZAkdaWw1FTebAk","height":477583,"ip":"78.128.92.155","last_won":777478,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725507,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyQ9GLsYFuHwLpQNzT4eZnxCr7LYoyxbJVvnG8EsWnn1gnihXKNew7bRjcNwAayvad2hmHQjpziFUfnqMi3bQGTrq","height":153447,"ip":"152.44.44.147","last_won":319692,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725114,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyQgdzrBab6AfemWf3pA2kccRzhyQEWSd96TgMs6GobnSdQPNst5p4FYZEdTTMoousaMABhuBPGUn7K25WhzueuVH","height":86415,"ip":"18.196.103.148","last_won":319703,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725137,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyQnBMjo4FcupUbdPwJYwUDyiDQwBztfdH7kfVXDXxJj3Mxn39EeL7Cxov32W1e2Ea5WzM78qD4LvqJHhZWkeUvcj","height":81653,"ip":"209.97.156.103","last_won":319534,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725138,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyQpAMroH4LX9gh8rasVGgNPTprVvyvnmiCRWtkQ9YbdjviVh5TVH5VGKGcjpp68W46px6xK1GxrNzviSkqenDuZJ","height":173740,"ip":"94.237.41.27","last_won":319643,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725139,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyQpfrzuFbonYJk4h3i5GumrLgDMJ786oGX7zYS5ZLsDTXbzgp3zDTqRUwG1v4VdPfggQ8dGGHe1gLWWxHrxrRcbG","height":88166,"ip":"18.184.164.81","last_won":319956,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725140,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyR1VUbxh8BVQytZECtzPG4GVhDyjU2mEFJpf1BqH3KWeNczchtfiJp1YjxWZ8k1CVUvW3D7cjVbtN5VVVYnq8ogk","height":91602,"ip":"45.137.149.243","last_won":1725464,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725141,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyS4rEEujMBsTXXu3zJ28Ct7bBpN6DvuUTB7CsauYcvhrzCjdLmT84rDsJicXqnmpxfzKTANmxkhngp82geNkYziT","height":134928,"ip":"212.73.150.88","last_won":1725485,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725142,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCySTgyyc8XSwtsiQhCJ1SgeMp4J1NoekB8vfJijqrSqCTSSP7nrQpR4ZRRCVfu42EiHYostxJKFU1ctmM4oK8ifaT","height":90436,"ip":"35.180.109.31","last_won":319663,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725143,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyShWqkqWsMf3koYa3qcfvQn2vtGEaRMGgFmdwjrLXhPhNVzYcssXgi7ULDFZkEU72PNeifYhBB61R94LBaWiGFSs","height":311176,"ip":"185.148.145.162","last_won":1725474,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725189,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCySt8KwvsAy3XeRHZVzY2e8fyM3fxmXFYWX49jhnktRZDAHt7MDG6jgVRQzvCVPrrJYV7QoFgsbEEeGmYbPrzYe8g","height":355930,"ip":"185.148.145.11","last_won":1725509,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725374,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCySwNH3bWYAaFrm9eQJBr3MN3ir7he2wqdegP6Hi7KHMv8dxZuHzYLz2YAGRsVHJiMgLz32GTK5iABmsPwnEi42Yy","height":119213,"ip":"104.248.60.32","last_won":319861,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725144,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyTfRSwVpz261vkQQcm3VLVW2sH619MtAQ3y8sgBM6NBkBXsP4wV8Z3XY2jKDJeUdB4N49wKhaN5DynMSgTawuinv","height":152986,"ip":"198.245.53.122","last_won":319766,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725145,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyUSCoRquboqk33waGvCokBxyz8ffgXoDmEy2RWnoBeLSBtevShS2a7i5HfnK1utqEtxjVL9yXzMYcHBBpneHr4Co","height":267512,"ip":"35.225.8.247","last_won":907035,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724974,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyV6yMHk3prWcaTVQ7AcdMymPbSRniUGLnjaJDN6sHDK8TmRN3SGeHhzHvpVE3RiJNy5NA6XLpmEyTVeuNoDSGngp","height":88165,"ip":"54.93.97.32","last_won":319955,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725146,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyVHsHycYtEmzbc9wt3Gv8eM3tzmNCRyVtHovHHiLhuwuTrxNFrxkdoZF6b72UMdSNVXfFEkHy1sTDjLqrdc3oW3M","height":202568,"ip":"209.50.53.63","last_won":319836,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725147,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyWKei88qmRiVWHPhip3yNMKDbfMTseHtox1gUAGPEb7cnVCLKubADCXxcGiuDtbbg1zmJdjctNG3bhDSRiduCgSi","height":1344386,"ip":"1.1.2.8","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725268,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyWunjcMSp68WKRqgSgVTfGGZhVqZi1pzLBccRvKfxLwUTe5igEvobnE3VDhtua86kJBbn7o9xjqJJFCDnLyYuBNw","height":81858,"ip":"194.32.78.190","last_won":1725496,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725148,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyXPKL7NgbjDrEN3pEo8uyiyrH2vpX5hriTX6a6btAtsaPw4rfvcg4WmWYv6bGbB7JdxT838JaNLjEUACnac2rBxp","height":88170,"ip":"18.185.102.232","last_won":319983,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725149,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyXRi4cQUm64aYxbdX1ZAg7Ha3muQNqTx3isdX93gNwgkmbNnGc7q1GyFm34TSDyCxDWvELF8fvMU2DJBKwArKMop","height":112750,"ip":"68.183.138.97","last_won":319820,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725150,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyXp7KMZcUyoy7AG2M6dczT1YSeHjKKRRpXe5uaVkiL6mSHjTENFrqRQphEtjhK2DjQaNXuwNniMP6Dd4iaubekoS","height":112750,"ip":"68.183.138.100","last_won":319821,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725151,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyYBKuvJFEvxpazBjUK6bRAadgHFQLzmmoCqQfog3o4XqZy3gtCu4hyYEK542wKwEuaTqi3eUVcbPEZf7Bc2spBvQ","height":81096,"ip":"192.227.155.15","last_won":431828,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725152,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyZVSDhxvqzxmgsE98HojzBZ2MqkSyjsgrnMF7WHuGmXP89g9A1hyhofTvq1SdX15JRyMvgEAAL193ThyRW86Kocb","height":120494,"ip":"94.237.81.204","last_won":319864,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725153,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyZa8howjCQ9kfXpB7TvjzdRF7vCiCVBSe85mDmM54MevHPfvbQkxRWfg92Tnp6GgU3BmKpAS5rX1DZY5rrM7jV2K","height":450343,"ip":"94.156.128.83","last_won":1725394,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725461,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyaCBK2iWWQEqCr1pb1JNh2hsYPpagaZtrGuovxT4Rgzj73Z2cZd9FydQGEX5bTf6nZtaafXJQ8vQSRokfubGTzUu","height":192634,"ip":"94.237.88.179","last_won":319857,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725154,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyaRgLiZuUBTLpPgKdrTQvzjWvzrscGugBdYnRYQjFKZJAsB52dNyU9y46Ft8Q1YJ5psquV5efkqPWZXNoQpow8ze","height":425768,"ip":"94.156.128.55","last_won":1725409,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725106,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyauur2AWn2sk6taEFTRiuCo2hTHsMq2QjbVSpS5q1V1n6VDmSfw6AhJutZNsTcYyLyeMD98BRZnXQyJLcHtEz1Dx","height":137273,"ip":"209.97.176.238","last_won":319943,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725155,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyc8eYhH8cxrMTVsRQUeFB47m7ZfGXBxeP9xW5b3y7ZnBUsw6qJ21UtDNj7qDpC7NzZpFXAsvpQ1QbHDGFkUutKgc","height":101093,"ip":"207.154.251.114","last_won":431931,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725156,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCydGF7YX3qRnAvT1MD7HrGFvwok2QPLzSxtYY4WmpYZfGtaknQeRQecWZDujZu56hQSRLtjYPm5SjWB8Rdei7wUWa","height":134401,"ip":"157.230.154.99","last_won":319882,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725157,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCydRod5G1UfAX678gUUQikj5fha6TSkDm9ycrnfHB31NPCYdJ3g1vdxrg3Y1i1fU3FTBJdXDxF37wa6kxAtiHSAiS","height":134948,"ip":"185.205.210.88","last_won":1725491,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725158,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCydSr9QEa9dMxF99eWTkXj7weecgJPbYAiLj4eFWc6YyiVRG1Ucp5LqtB4VssiJgH9JVecHrVmYUbfkG6fisW6aDA","height":191772,"ip":"164.68.100.209","last_won":431901,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725159,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCydpbbZdxnGwDhtKjom1xzzqS7n9rgecic7AirajC2iLfQersNPJLY3CzdQ4QKYXRkscUX7K9LYVkJiJQJBv5ZHm1","height":112741,"ip":"68.183.136.232","last_won":319782,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725160,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyeQDB565Y83NEYgRmek9McJ925V5J5Ukta5ndGz6rkVV8LaAbZC8KJY93QvGmr5wGbjQ6HvEfUAHbfUybwFgoTEJ","height":477583,"ip":"78.128.92.172","last_won":777479,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725513,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyehefUy9VFDXLGJ91ZT6p711F4zKxSiiJodbQBTHJrpdGCFjyvmCHeBb1x4EcRpJMYARbgmMm9DThPDzgB8tm5F2","height":132261,"ip":"140.82.56.127","last_won":431895,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725161,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyerTxvev9zorywHWWGUisP59mna4qgQd93SL1fGwZTVuDPcRroJUtSeqmJMhW4H2VA1m3efzjaZGpEWCNRQ9cpNn","height":80013,"ip":"85.25.105.96","last_won":1725499,"blacklist":80485,"fails":0,"status":1,"vote_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCviDN9cf53YwFFYpsBX35mXoqNsVWk8QZqKxFAoubYmLHFAEBcRvQNBXDLB8k1Wvny9GVqM28M74EKoqoVJQR49iC","cold_last_won":1725162,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyewaQatd8JwefzLrSeud3KV8ygRt8bXvBpD66oLZw79HhvHbgNvzxvPhPpCqcbWYDFoj74wEXF4E6xLZkjqaSsyi","height":134928,"ip":"185.141.61.34","last_won":1725486,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725163,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyfHdctWMrNwXzfkKWJeDreZtUKrYj5D6EHhvkNp4yTP816hkeZiv9qkAKD4zzuQFXYGnZ6zzMcvfTsaRJ39bSvaj","height":419573,"ip":"94.156.128.9","last_won":1725372,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725412,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyfaYGUKSKie4ovt9iim3gjJG4djQ3kmP1Ng1XviVmJNJ9ef2mo6KcwCdkRRnj3oJifLchJ8KgdiNHqpU1LH1zWWX","height":311050,"ip":"185.148.145.56","last_won":1725439,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725040,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyg4n2DNhQ24LCWr5KJHjiStXm53qA4WCyyzH17dBWjuDiFp3XELNyC7xZFDxE6F5jKmFaUQAN1vXHVxryHqLhKeS","height":81985,"ip":"94.237.84.17","last_won":319950,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725164,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCygdCosFSXr3oNYEEyVT2whY6NG2ahgKA6UZFV87JiHFY7Q6nWF7qcXym9Kft5uebpvYq2n5XyiAFmU4GyqTU3ed7","height":88142,"ip":"52.28.75.22","last_won":319913,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725165,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCygyGzACqmBvnWtix4BohKytf7R33FimsAKdRJZobeQE7cL6SxShzj3wuYJQY7Sw8VBATTDGYUC3vtTR3yqMRWctn","height":355929,"ip":"185.148.145.182","last_won":1725443,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725367,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCygz1XSZR8Jrkm9VArX17FWJErkD1aWo6xVVp3pAn6jVzGezqoUmmfwUvZTqk9uEqsW6odierLiwGxVWA3nyA2pRW","height":126926,"ip":"104.211.11.229","last_won":388789,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725166,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyhWpoXqgMs8VUbS7Q5mm6kisAgjQZQLEWbqrJ35pQarKNNsZmTKoFWdsfyHQj8rTV69Cv1rxkJkZxb4CQmSv2VjH","height":84014,"ip":"182.61.10.173","last_won":319632,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725167,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyhzHkHwBzgrZvVf9JaVBQma8dxq6exg7EDH2yz2ycef2mWJJGbN8aaf93oNHZsyz3a1UCwC1rT3uWrRXCQtDUmeh","height":311050,"ip":"185.148.145.53","last_won":1725440,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725041,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyiCFtUm7uB4whpUirgbF4jYL8Y8wKCXBpFweE8yXvMMo1y6zpsju4o19T7Scb4n8CKNPiGF4TnqJAFkJkUitMn7G","height":112750,"ip":"68.183.138.78","last_won":319822,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725168,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyjENpNiYwNieYYDyQCBEYUkRpM62RihWKpM5LgWXV45an2yHQ7ThabTdUXmbLvvgBBHckuPU6F4NqEb1sDjZgToo","height":173054,"ip":"94.237.45.234","last_won":319986,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725169,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyjyuSJHP4hs6yveZXtRmkT74ofYK8jTPFv18GxG3Nq42umst3ht65d1Y8yuXfZt5pq9wWR7kudGhfpqXcYsYiHnc","height":101080,"ip":"165.227.142.233","last_won":431919,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725170,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCykVpDUdmR76Ukqc3NZqLmo9zz2QVxpjwL7JNBa1LHkAri5d2Bp4Hcjm5ezMSHq9BqsjSzdN3V5yCEJeVDuTydEtE","height":137612,"ip":"207.148.12.86","last_won":319760,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725171,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCymQnvBHMFHXi4TdP6PwyJfrxDcP3wYg5ZznaKYmTmFghuJjQ1f7drMaEdarEeqcCXjBouuPhXsjrCucp6EBunfPC","height":206881,"ip":"51.158.164.26","last_won":797764,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725172,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCymhCXcgNd5RnDGubua97g4n7oW81xuC54ahsUFg2dHE6NDdvDzApjGsaRBJqKg7hdNgjswjXvh1utToojEAKKPip","height":140720,"ip":"139.196.96.212","last_won":319966,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725173,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCympaNc64vjSdsq1wHh5jRcSLEANKDg4GNPW4rtC3Tdtn7sLsr984yiBNL2hzPL5VStknAj8wgivJcUs3Q5qJ7UWp","height":476085,"ip":"94.156.128.86","last_won":1725563,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725083,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCymykREzNd2XnRdeoDeNQGjx68JqsV4qPwjd6PC1FSRxfa8EWtRq37GgeM4yNx5FJe5Di4X5UB6bbW7z36aKjPV1e","height":91580,"ip":"91.92.111.134","last_won":1382393,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725174,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyp3NNqbzqNi9GbURevVqpzN2zo3ymyd7nr8BX1anrZ7BtYawq2xcMhvdNJ86AQ2TSCUVM55CVKL4Mevz3JikL5Mw","height":81827,"ip":"138.197.213.191","last_won":1295922,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725175,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCypMzxZXPT4gXKP1EQd3tJo4iF5dYMCMNxkCbEUBXqpZS6XFrge6DPJoSDRmXeztzXehAJDMAKW1XuLFKyVDyZQCp","height":883070,"ip":"1.1.1.8","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725335,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCypPX2wsUm5PYz3CqGdgDbXcg4SDfvnSzvAj952gucJrikfJkEYTJgUtn5a3K8uKtX94949NyY77H6CZ1TiWctv2t","height":88167,"ip":"35.158.125.136","last_won":319960,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725176,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCypSQGT2a8FfKTDjdEiqCDH84Gmo36ZAM8SLZsxnP6tHDmDu6MubdhHvsZFssV5XukivfURHczfHU4v59BzsumSPb","height":140015,"ip":"94.237.24.190","last_won":319705,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725177,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyqG4UwrBQqTQzXKpKK9T5ZFPBt9Jz3SgvHWzgE5A5GegaZPTbF9vgjf7qLMsqjGduMHSc73M54hhzkAWB4uAdC9z","height":81152,"ip":"185.206.147.213","last_won":1725434,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725178,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyqZUpwf8aLT4arMy27U5sF834y4atkh4APfToZqXnNAqeUKZiE7SxR3a77gFrZTmW18HKmHw75Fvoati73FMFUF8","height":477583,"ip":"78.128.92.151","last_won":777480,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725516,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyraXxQqXUGbau1vpyEPL3cS4bpFiKZ3ysZgNvroxT2eAfcUKYDS5Ve1VvXdUECEphNN9mEMgR3sJiyEvmoQwXjVS","height":477583,"ip":"78.128.92.173","last_won":777481,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725517,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCythidJpe5mDefd1s4UTYQd73Dm3xL3LoiYyMYhccWyzcvch1SJs9Fsn6FdxEbRzWL4XBUk9kaQCvnybscD9B8WnY","height":135018,"ip":"167.86.69.159","last_won":863890,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725179,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCytjswSw2J6h4FAVqjag9jeaD939tXhvk5wiHo8rY8XPEPw7aP4JfQnDRWQhxE4ghckG9PxdwVKkwH2saY3gzSgqt","height":909554,"ip":"80.211.4.1","last_won":950276,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725215,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCytr9vax9AdaNzk3dB98Rz4FeCHu9R5qChmk1KxmmB2GanDBogPhyCwAHXWZ9RpaaBfNRehJ7ukBN99L7G2T9tHcJ","height":450341,"ip":"94.156.128.69","last_won":1725384,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725451,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCytuh5ZMwPmhjeDEK8XiXC9e3zwH3Acsd77N3inBypybfE59YCW83RJs43ESZkcb8XT9Dkajuzi9EV54DtBpqn83E","height":311172,"ip":"185.148.145.156","last_won":1725475,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725190,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyu2XvvSEwvECHybjY8KCQxypoEHahLhdoqcdhRMioxefbErWQ3X98AQtorr9dGVgYftn2C9uTZZ2iN5YyVotoGNb","height":333756,"ip":"185.148.145.177","last_won":1725458,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725272,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyuWvqEZ7JFEWmtChrDL6MY5TsUkW2Aks8ZCUUNeUbetog2VLEbD4PKKDh8id82kaT3DwrDSP4V4GyYSCayDEYjYE","height":80595,"ip":"142.93.97.109","last_won":319829,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725196,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCywibaozk7MhBEnYGSQXupqM2jM4WqW7NsQQuRQZbtTXKkvFnBR3nHECgCmKP1Ppr2rwGwEispWoDUvRYX8s8c8d7","height":137044,"ip":"185.244.130.221","last_won":1725428,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725197,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyz3T7tHSi9XswAjq14BJhokYChkNvXXZM2nyj3BqMjLX1FZyxzPBMUPXuKvDoAw1RA5NUrcxaGMxjgHKco5gxZpT","height":883067,"ip":"1.1.1.5","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725328,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyz9hvFvkyYH7uVe4hkbHZn1A6Bt9xsxXfSS9GSksv2BnGTQjDapRTKGkrmicAAiFTx1bmNBXwdAqs1UDok9sriAy","height":88170,"ip":"18.185.42.196","last_won":319985,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725198,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyzA2feQvxbKWJsE9rUZJQwvKTtg3mZG6KbK7mybjutAMJT9E5Ww9qd7UMqLaVKZ55hK8NaHsAwqHGyGW7m4fgtAG","height":476085,"ip":"94.156.128.89","last_won":1725564,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725084,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyzCsbLY78BkxtWYQinkJhvAFe9Vx4SbVb97sDPPxzbAKJ6Sr7GhvQGEawYM6eRzDmYQRB1jXFaa3VrwQBEB2hKk8","height":80388,"ip":"194.32.77.50","last_won":1725466,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725199,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyzG3s7D3hPTacY4xNNJWDvx5YHhAsTumL2AVLV2avZU98iyaxSzKCx35rv4pViiDtCHLxjaFLWhSxj9L3c66EMbt","height":81551,"ip":"139.59.133.23","last_won":319525,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725200,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCyzLY5q21vWoFzt51j6GboCtTka3eDfGPNJ94C3rkPXciS4y1NZKMzpoR4eieYdSX5UezhDQt6AkxzFZHYu7Lhgh7","height":150049,"ip":"198.46.179.199","last_won":326310,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725202,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz1HCZqriB2BHuuqn3wbTU613WyiUWwcmGtT2P2jckqmwmM2bhBDdXf4dPLKVyZcH7Fym84s19zNJuwWsbeYZh3jE","height":81990,"ip":"47.74.190.253","last_won":319952,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725203,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz1bksWwf1TXyfaksD4PQonwwKBCAGJGRNQASvCXJRCTLYAjy6u7QtAiFP6cJp6VGVog1M41hwvfDrRBC2BxDmVU7","height":80013,"ip":"85.25.203.37","last_won":1036739,"blacklist":80485,"fails":0,"status":1,"vote_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCwA5JHunx2misJjwT5sM3bzhJ4JFdxjCQv1oDSfvduFTp5sUG7FF7KGwKUKuPifApbyWGYCCNdQXk4A9Hsoa4JDJB","cold_last_won":1725204,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz3DsdZhFQsCAoDd6hfQUgBfNYGMyVzog1U7CsATHYJ3XTQVPD6XpkccRRZWDh2CJM3WfaPLp69gNE9rhCVPhULQX","height":92754,"ip":"89.70.222.57","last_won":647814,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725205,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz3K7LXUxFt5Q3f45nuTXXnXeJoZqLQgomKvUq2QzfBY4XBvEADAuZcM44LLb6wK9trL14w4n2ndbwnRefevcMmYw","height":425768,"ip":"94.156.128.54","last_won":1725410,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725107,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz3cQkKYURDfF9tmwZufD1WpNEAJRexLSiauB5r6cVxWgFVyrD9CTHWTLcYaWAFqQqjJDyKydv4Ma76UmpszrMGLB","height":81336,"ip":"85.217.170.163","last_won":1725465,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725206,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz3ndyYGSQB5R1DmkgWVH7h65eNz4aoqwknEnBcGkDWrc2hDt2a9jJ4BWYrbo9gBm4eH8cWt6pdxzHaiMvPiL7m7Q","height":192691,"ip":"94.237.90.62","last_won":319925,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725207,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz4JsEJn5ULZZKrJSJ6XCfbqnUG9Ro1YigwPfYRwwxttyJasDRpfoDnSSM5MDqFkc5L5Su1w6p5Ccmaz1nxHoHJmP","height":1515646,"ip":"8.8.9.10","last_won":1598362,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725121,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz4Q9jndUgHJyNLd1GQsMZckpN2U3bEZ699A9CM2vNJ3AjA1nneygB2GgcJNyy9429PPTusxLuUeeKE3oqsSz9ftU","height":419573,"ip":"94.156.128.32","last_won":1725373,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725413,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz5hPHJHbZNdpBa5KKoN8QFbWPjNzTxg8KDpf9kD71F6h7smgnYyxNS48ae4SE4d48WCP8cPTHC2Uk4TkVRfGbZx5","height":91579,"ip":"91.92.111.243","last_won":1382329,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725208,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz5kEe71dk6P8GNShRq9qs1XeKPWnudiGnMpbLTxvW6Aj8Ns7ZYV2J65eybuXY1krLFmaBShPRAHvas8D1fUg7JjU","height":477583,"ip":"78.128.92.145","last_won":777482,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725519,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz5qWecLQ9UZAc6eD79WwVx7D8j8Efuqt4uEUiUpUKuBPxDMFWnLCUpC1ErpeeekNuKxc6DY3RnZJZ9Gk2UMpoS6r","height":80032,"ip":"94.237.86.59","last_won":319887,"blacklist":80474,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725209,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz5u5qquLWPVGz7RiPjweD7ykeUP9KFLqptXxT9WVxraWcu95eZXbBnADL61AmSLyJWPV2gXJPcGECjgWC6XTpZL5","height":477583,"ip":"78.128.92.162","last_won":777483,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725520,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz5uZT24Br5s4E1iFA389H9rxwdf5LpuASJzyhxvuhHbLhDkQZiA8Ab35Umi4Q6LGmH8r6ZECYv3g6zKwLvsLG14t","height":80384,"ip":"185.244.131.62","last_won":1725555,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725210,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz5y5cSLJHRSQBKmXQXhgzxeahn5n8MWZoeNzAY5k5VxTTp5WNjwrQ2KHtA9Nkfmr2shNrHqr3cTX3FSHs4JVj76A","height":177269,"ip":"94.237.93.80","last_won":319617,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725211,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz6pwHRF3prqiJ1Gc7FRDfqLBaiKjUjsj9yNnnwc4rmdqH94yMo6Jsey1u5cLPs1LyqS66Ua1thC3fU1d664N9a8g","height":148161,"ip":"167.179.73.49","last_won":184062,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725212,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz712FiZyGGq1qK69nnPFqt566EargHdTDGckYA394pqV5nYsg1RamvxVa2i2PwC9ywawiJ4SqQqx7n6ZfK7JFzu2","height":450342,"ip":"94.156.128.78","last_won":1725395,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725462,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz75pDWS8Cz3qAtHQChhkk4Nmoiz57ThK4g3G6Hwoj1UxoeryBX17bubd331qrMM97ASshDbEaKcXmNrThMze1KMk","height":477582,"ip":"78.128.92.142","last_won":1725369,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725521,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz7TsWozCr2yDsZyWkmBCiHpCAX7inCWej5WShLSEt2d1LtUNfZ4CcG3CZXAE45FtoATkWWkHSbPkEPTW7XpUww7c","height":450342,"ip":"94.156.128.74","last_won":1725396,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725463,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz7wPk3b1uzsAjrEJMspEw4LpfYJHwcU3fWofUnEmrUX7bTo5sHAnEsHrdcwuaCF9j88cGr5tYMzccQoL7M9p9YHF","height":80013,"ip":"85.25.203.51","last_won":1036752,"blacklist":80488,"fails":0,"status":1,"vote_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCypFksNcJuSe6v9xHHsxFrn6P4vvb7A3Bk6796YoaKLNfaj5NYfUcuzqT1FMP9cboyxP8Q7ATXZFGT33rcUri7Z2q","cold_last_won":1725213,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCz83XHrgKkCs7TX1txcvf2R7utucqJmc3C1yxmMww6jGkxLNBzVWSqmuKwyvHjFYPx3sM1AUYVMT9hmVjMCTTPVPU","height":165745,"ip":"47.254.197.60","last_won":319680,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725214,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzB4DrQovZDeZjYsnU6py1vtUk58djXnGz8eDGkics2v81uGoJ4WZPrfmqwwCUrvMqJ7KVoP3jU4zFPuMJyecs7He","height":104148,"ip":"35.196.253.14","last_won":137088,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725216,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzBFvJB4eMAUiM1Pop9D1iVfK6oL3DEykM3GC8m35CXu66vegS4iKBqXsbMX2Nznx1QVsjKPKSgByEM7bhKYcf8rj","height":88165,"ip":"3.120.139.252","last_won":319962,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725227,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzBPw11SSJTHsCZj74acrMh5PLriNGx51vfr69yQrjq5XasYQuiGVGFspYx4m5vvEuP31vbRi1hHhWpnHMKs4YNjK","height":104148,"ip":"35.231.207.253","last_won":137089,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725228,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzBpwbpDMDE9B5DAFMM1EAAFxBaa9CdedAQP9zjD8nfBtMJh9vEbqABTQhBcVSMP8zmZ23uHtAqW3fgvQUovVm97C","height":419573,"ip":"94.156.128.33","last_won":1725374,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725414,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzC3fxv2fijqA1kFj2i1ya4CNiAfuWBu8hVuYEWK3uLK2MeED23E8Yi8RE7TTjjbGKmziusnNh2wUkbr2dUJmR4TL","height":80384,"ip":"185.244.131.61","last_won":1725462,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725229,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzCH8MW5qedE4iKb5Hmvq52sQHgPnn5QRRi8R3NvbqEEqFN5SohWHKSWv3vEyvFwzQ5gvRQfPtiUGZjhsFEQr8n3m","height":1041516,"ip":"1.1.2.5","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725225,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzCHyJVxemb6SZ3DXbu2gzk3fH3AvvzyNrSnf3ywb1qqiCpWJ6ux8aPuWTx1wc62Faptp9UcdjZ1xRRUGv45Q5gwF","height":180027,"ip":"116.203.185.25","last_won":319847,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725230,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzCVbJZ8ZUarrYd3qXLFQ2UcZaDWcDJtXVY1icEqi3odzRYowoyjMwvP2FX4K9p9BvhDgYWsDy5uGSWHZDqbFHGHW","height":94401,"ip":"94.237.86.196","last_won":319695,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725231,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzCvuKkq8RM7ePfXPYQjLjSiGqYSthdCz4ET6Umb982hb1Y2LirVGjQKMzvn1SKmVu1o5C7Ht7cUyjyhQKzVewwtG","height":119212,"ip":"104.248.49.184","last_won":319855,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725232,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzD9wkZ8kWSMZ1Af9tMax6bRSGsY31LZSVsFbYueGjzzkb6puoFyFH8in5DanvCZraMSUGBovxhgiJknZNJJKtFWX","height":82837,"ip":"178.128.7.115","last_won":907029,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725233,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzDd1cKjTR16Zr63KmFJUVo5MK5tPhgAovF6u2YsdSgKfb1jyK11bDYoFGFStUcf742o4ozXfW2fxxR3vcriKmM7p","height":174813,"ip":"94.237.42.30","last_won":319701,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725234,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzDmkAkcoQGHtRiCCk37GrPmhRmAbRjNQM2ZruaWKqe8v9bZt2nXQpzgHJNR9TLBbXm9k5ZhhLEdJa9DKecpmm33R","height":81195,"ip":"185.206.144.212","last_won":1725498,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725235,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzE7ZkSXYNv9kFHVg3oUHmk22f7Y7ZsN32gB44j3m4AxE4YhKaAXn347ofaLRpDfVkAwNtHB3zTK8cp21c1bsGkiF","height":136916,"ip":"80.240.16.137","last_won":319556,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725236,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzEa9XbefmdBCqrt3XWisnLRdr54dFwetqN3dXvN9T5C6dGAvvC8m5sPwuycBVhdYGenYDhLkqrkyxBnekXDEwYLn","height":166326,"ip":"94.237.45.238","last_won":319761,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725237,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzEdyDcdYnwUSeT1Wyr3DeN5FcdxGfeKj1GG1JYN499tKr6JtbHNToNYecqmPikZSHHS4xaWQDrBzZdL7pvayMMFR","height":1515645,"ip":"8.8.9.6","last_won":1598363,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725122,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzErwqcTe8Z5jBZD5TPhaUBrHaQ2qZ5FkPSqQ2vEpz5ZTSMjBo1XLFZaxsyCeh2LCFPNGoxQikbyD49RrFEvKJpmR","height":355930,"ip":"185.148.145.184","last_won":1725448,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725375,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzFQC1hajzRXoWQu2ivoARkQbdZ9fip7wzWPVT875JZUFFcNuGahirQkX44bdxFWqenTQUneDx1UsHGNAA5Y8oCVH","height":174834,"ip":"94.237.42.62","last_won":319723,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725238,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzGG1aLF4KdywtnRvkZcBoXYLd3qSKfw3vEKkZhANgXjoVbo9Fm2J5PqNVNb11zemEMvZw8gm1ArQZsv9WzDoTxfy","height":81992,"ip":"47.74.240.236","last_won":319953,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725239,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzGmJ5AGaNfEtpqqFzdhBoPw9Yo7MqgTVFRJzVxuxkLkabcbswcN9WcQTFuyiSsaJK24sZ8k4sQ7oKfux6j7C5qwv","height":1515658,"ip":"8.8.10.4","last_won":1598371,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725130,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzHHHiQFnrfnRscFb46qSofESwzPLzomn8zWkUuXwiy7QhJUiZtpvUDLisVRPwJhnpdEYymYrrxR5YCxUFJMHqoei","height":119212,"ip":"142.93.60.83","last_won":319862,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725240,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzHava99cS8chgK6g1LM6VAX2swaFfKBhxtBcUebPxcXYFuwcXEzP2ArK1zziUKSXpgEw7hiRBFFZg5kxEiBruNG3","height":419573,"ip":"94.156.128.51","last_won":1725375,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725415,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzJyA6hzXTwqjAQqeY6onFwCekDbZTu62eM8L4ZajxezBMPYENWC49pfNzwnnnh4M5FB9qEMePmrM2gGqvdQ5fjci","height":167331,"ip":"94.237.77.70","last_won":319732,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725241,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzKKXJpfmNpM8cFEFWT9ebHRJmKkKbhFp11EE7TpMottDhEUkUPFmxqHY8Mv3o9r4CfVNV8dh95yJjHQZCgJgaNFk","height":1515645,"ip":"8.8.9.7","last_won":1598364,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725123,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzKsEtQZ8RNRifEaWDF6T8BdzqJiFhVKQGYBHvFtXoJngwrQ8cdn475mKgAyffC6ncbU8ZcireRQ5AtsdSgeGrx8c","height":137983,"ip":"167.99.192.77","last_won":319651,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725244,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzLNBizSdisvWMCCmeDTfGRNGLD6Zqi66BGesiLh4Hts3PFaomfyQKJSCH3EoeiuN7XCopMkVT5wFZ2QgeEnyC1op","height":81992,"ip":"47.74.210.221","last_won":319997,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725245,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzNRuJwVgrA7dTPBCNNg4GmAeNV9F3vppHsxp2Cw29sjxe7x2TTKv5rEbDoj4vrUbkDuM5HzHANhpuatXzrXi4gAm","height":126751,"ip":"94.237.81.216","last_won":319841,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725246,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzNZ9et6PV5XimQHhCRUjg7QvRqA94g16SxiVknJ6EBtk1doeSWLTh1TqCPqDZLiMSCEZKVqHrLMHM54CPBSKbn7w","height":133299,"ip":"185.203.118.176","last_won":1725427,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725247,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzNwRhH6iBKGHjmkTAXr1ufEZE39HLkHLPFFvu5qfK17oTdDYXhoMWRiu7wVBSCKCpDxdKJuD69iztwbd2zNKteaR","height":419573,"ip":"94.156.128.14","last_won":1725376,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725416,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzPbXk8UMPqEmSN24k2QrKQChPZsaDh5c7oTKEZRb6bL5nm7PbzvnBvMD15GkwZ7Cmt8iQcNgy2nMUzZ51FAt4PTC","height":311170,"ip":"185.148.145.105","last_won":1725476,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725191,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzQJ7mH7bMWJ28kRht1sQTordbCbAd1ibkBzn1MJCcKhc3GCDpb9ZvpNZktJH1gmCFtCpwrrjjvpen7cqXSyeJCkm","height":81882,"ip":"91.92.111.86","last_won":1382274,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725248,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzRfiDdJ3HTF8L5UduS6ZFwZdETpmYKRkjgf8J5Z2XwaWSPQ1EAuHq7MEGvSbZVM9vmSZSJ4RCmEZsJgv4iKGVibE","height":138920,"ip":"45.32.60.172","last_won":319627,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725249,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzS8RgsCksXKhvcMNxkgshmNQLBiV9dFma9MVTBJ3SrUs4W3sWFKbuTTDLPThPui33QpNJCyWxoPhU8PwXhNXSvNj","height":80003,"ip":"54.210.242.17","last_won":319926,"blacklist":80479,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725250,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzSC4DPnqi9ysJQeVBgf9WDJqv4FmfzCjBmUg9DySa6GGJNj2wN71Ti4qhQ53KZB4dAL3Hm56SeGb8EHRQCF4LNFa","height":136663,"ip":"46.101.192.142","last_won":319793,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725251,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzSmWfYzcWJtSK5R3NrqdUuQo1Fsty9oLsRdKg7eXSySPdiW3hYpFzDvmi3wKtPVdXQGNdt82BUAL2eRpYwe2xtPv","height":909581,"ip":"80.211.4.2","last_won":950305,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725243,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzTQA8irS8k3dtAXJn5Gw4xQjbHdojejehgbWhmxvTXnqbXTa2EAD8r4GsC2ut14M5ffMvPk2VBriKtmkVF3MqiHU","height":106383,"ip":"94.237.25.134","last_won":319757,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725252,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzTyLgX1DNx3E5wdojrxkp1QC12KUbHSVoYWaxjv6UNddgddDdQGjqPrrE1Zf2WbMjioGKP4KCAaPTJvjCcuAKW8a","height":185321,"ip":"80.240.25.99","last_won":863900,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725254,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzUftokzH2awvmkgWURRz3C5dDbDN6L6tetjFq6C6znpjMXpLhcn2xdTrTriVJyXNvFUv8FmKnU21sNMD9Ej3Pkkj","height":311355,"ip":"185.148.145.165","last_won":1725420,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725377,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzVdx2wnJ3sahyaCYMqdHVMzZ4f4fjU15t8Wba184xoptfvd1HBwE5QobXpF4EFfcN1qux387SxEgfMtU476Mzp5H","height":909557,"ip":"80.211.4.20","last_won":950282,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725221,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzYBwhjZ5LfWLwScfdDN1qRBngLytvHLtFxXJZL5pJt1cWrTNefLPoLfd1t4pTfKKKHzDivMD94NAhWirZiXHPKg4","height":719385,"ip":"24.114.104.150","last_won":734290,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725007,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzZxdLUwSZD7fXJevSHeDxx1r2zAawsxmvRtiftprLDNpTZb2rzkjK3w1VH8pNkWNbKCjqyh2FhxJamSVnGF9Bd9b","height":477583,"ip":"78.128.92.159","last_won":777485,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725522,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzaQSToFfWho5gC9Uobzv5T2fisapZCekxtnGWHcQSGQEy4UrEgnqEJAFzqybGhRx1SU2q4DKHdKcEr5N1fTHkt6e","height":975807,"ip":"185.141.62.163","last_won":1725454,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1724985,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzaRAHdp8N98A3aK1HU4g1KkBR4rGNFUUAzVUTVXsAZtZ3cn5m7jHjLioWTpuXbqCyqyeYV1PLVzU4xrJAaZNRFTR","height":477583,"ip":"78.128.92.171","last_won":777486,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725523,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzbUBvjyXEuUVpgoss9Fyw3L4GPKbigvEUJQZCsorHDTvNhX9zkjoWAggx9iH8vHw6yaW2h4SsZ4SsPvVN4P4Pv2y","height":202568,"ip":"94.237.42.14","last_won":319837,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725255,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzc6RHcWbDJFoPgJGEzxqNhW1i3VqnFTHffYF5B3BXY5eeE4YcnGMzATcbU3JeCT96ud5Zej9Y4UVpCf2ESWwsv15","height":139339,"ip":"51.89.1.68","last_won":1725507,"blacklist":0,"fails":0,"status":1,"vote_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCvgSjaaXamEm7YXvut74Jexq7tVCNN5u1QUNDSvLVHQBTUbc4E52TwuVufNmy8DR2iodtEPrZy7u3r74tuJJy7peS","cold_last_won":1725256,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzc6m8WwQkUeKms22Zo9E7Ptq9W6BC6WM3BAFkhKUksCEv8qFyYdTwPvPqiFRe9VYtgzcL5evWahZkFjyG5gbx3hw","height":80012,"ip":"94.237.45.210","last_won":319522,"blacklist":80477,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725257,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzchxGk8CKmbd4V7KqQTQrUFVnJErbgvieJs4KEV5YkP1DqGwL3LQB6TKh5mH3y2X7KdmPynkWBLUBq64pX9K6qTQ","height":136916,"ip":"45.76.155.127","last_won":319557,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725258,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzdZyYukUgsrjxdyft5zHQ2MtDfbRW52YhwTV5xTfZEWDcLZE5P2V7k6zaHXaXmMUxSCTkHeqWqxrKFATVGiKoFmr","height":311355,"ip":"185.148.145.164","last_won":1725421,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725378,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzdd5nFuQR92jcjYiLJhPCrEQM14UeMhLyknV9qtyPymgAoy7CErm7z42qwQDLFZaQt6r9LLr3F67U3MEG8TTM8uh","height":167337,"ip":"94.237.41.148","last_won":319735,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725259,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzdhEsZVc9aEfaCK1jc8ksWSyKyYkKSma9jNV73JcV5aTHUt1JwaWry4CdJZMSVbq1GkgXhREn32svYUAJ5bdpsKQ","height":182872,"ip":"152.44.36.98","last_won":319636,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725260,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCze8cFrbXBEPsULRAVAmnZxFVuPvAnGqpLpXvAGsvG793oS6RDYMzGGZ1SzmXJU4WDiHdWHmodRs1x9GNHrMZDpEw","height":80032,"ip":"94.237.45.191","last_won":319727,"blacklist":80469,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725261,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzfuQt8YLCZNWRYDaWi1VDvRWJrX2sRMheSybjzXs7WirwcNP4GfDFXPGZt8MPvqA1pfpRGbggSoGUWt9gWj62cei","height":909556,"ip":"80.211.4.15","last_won":950284,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725222,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzg3ompkCVRmS2efWemsQb1GTinSZPtohndzgS8qgffYWEjy9bkB37dGzP4AQDoqWLECCWosKdiMHnfN7nqh4WpZZ","height":1515656,"ip":"8.8.10.3","last_won":1598372,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725131,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzgnpcrV18QWVDMaF3i2a3Gy9rYJedSqWwp25WiCjFYUru44VkV1WBpcq4Y7zKKF5eKbAZtuMuLxeZTT3NhLMQCbC","height":909556,"ip":"80.211.4.13","last_won":950285,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725223,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzgxm9Ch9L1P9VhEhVdoMsVBe1ngG4Km4pj5xadzjfUq7S9ZH9K3fFFcvbCsFVwtn7BmnnxYh82HKjw4bRmHHXHZR","height":883071,"ip":"1.1.1.15","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725336,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzh9nLUS5vuMPFgFEbeKP3hbd7LWs8E3UZemy8M4UCDRspGAKbNME8D8pwbuhJMKZNLsC8o5hv73yw2oqLUnGE8XB","height":248245,"ip":"51.158.171.228","last_won":797755,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725450,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzhTCjYx3rYK5aHdS7SqGV8pq1ahe4snr1pSfYut6AoEgLh1A5bM6qptfQM9ubFRUZ1t8MosFh4fggMAHz8Ng5LgH","height":112741,"ip":"68.183.132.122","last_won":319783,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725264,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzhcaoM4jkPof9u7obKHzELmnSh26yFCT1ZvBikwMFgU9Q3uC2213ZP8dLX18fKvF4aEcbbS6SxgXKX4Xt2WjcKRd","height":1515660,"ip":"8.8.10.9","last_won":1598373,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725132,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzhseMxVcsbnDZk3K665X875PDTjE1fGSGFXfDkDFhR9vTFUzttrtDwpNdqE4tLmiBi6owc6Pp3TMyTn4X5eu9812","height":106795,"ip":"94.237.85.131","last_won":319868,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725273,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzhz5SCDZGk58KVNbu16XrLjuNrYDQMphqdv8Ju393yuaEUdVzeqVoYE2ZhQevn12dnNaCRDQDXquwuVQ2sCdLmxE","height":90435,"ip":"35.180.131.132","last_won":319664,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725274,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzieBpcNHcb5CqcaKptJrSfx1Phq5vV6VuRAgUy2UsXeGLSKfPmvp8kG88zkjbopKUVRpBAranNam3H118BY5RoUU","height":477583,"ip":"78.128.92.176","last_won":777487,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725524,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzinH1gQX1ap9xQ6aqfs4cnXhgVZKy6JNgNj86okKdSVaBNAhonKPuCyE5DjGyk7UXrwtoKafp7NM9d7BZXR8DbwT","height":311049,"ip":"185.148.145.39","last_won":1725435,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725034,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzjU18obcJWRhmZHbAs1rh6Zy3TCLJYeSNV4MTq1gsSgRqYz3zw34anpRttdhPnzmU7S7XWttPauK2Kyo5x6jtFdW","height":311170,"ip":"185.148.145.104","last_won":1725513,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725192,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzjW1AY9k8grzGYhPSMvYtvKairBVb1yu8fo2hAWfjcqp7o66zam1xJ7ca3nYDp5UYG1JW4f8znwq8hBc5Ec7g6a5","height":450347,"ip":"94.156.128.84","last_won":1725397,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725464,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzjZTuNrz6WZ122E8oBzFBRtvVQ4f8bHTRFWYepuYXXsBCEZ9TkWXsZmqsENSMoWe2aR9VzGxe381AQeKryxgHpix","height":355932,"ip":"185.148.145.16","last_won":1725449,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725376,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzk41fGfKXQckG7eGe9CZkpyK4LsWnm8borvgJPxNDKsq7jAfbAFVQJpms7KBS2j1HJSzBpYjMmsWzMtroVSy3Qqm","height":248245,"ip":"51.15.121.102","last_won":797756,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725467,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzkFtNk46p9SuQfvAJ3VbEjsJCYAGQmcXLmQy7k5ug35R17hW7d8N6dkFJ4G5R7veDdmyLwXocrimkE38MPCX7hqv","height":477583,"ip":"78.128.92.161","last_won":777488,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725525,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzkyjpYwt89y9xyNvqg5fjqCyTL3cK15KPdXGcNjWVaNoeoAvhbWEZSTGC64CqPSC3f2xTcYhU9HXJu3pJ8jMUbvs","height":419578,"ip":"94.156.128.53","last_won":1725377,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725417,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzm743A6ZWbE8WrYD5JgAqmC8zxFYDHU9iabhYwXQuxGTx7u9K5ARa6AtvfWTXKuZDzdJiTKBPvtooiVVcFtQDPR6","height":81567,"ip":"139.59.133.76","last_won":319611,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725275,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzmdRNRfY1U6v6Awd6VHx6rdX38Tq2jt5aTe1D4eWK728W1yep4nzifNNUTfwc6eJitF11nqwJMWyFzvz5K5VxDzg","height":80507,"ip":"194.32.77.53","last_won":1725506,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725276,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzp5kT23fawyrsAKJgof6Vmtp65AjeMTdkkUHCDqKQ3YJfiYQAWZeZN6TPRrHkptduV23TnEmSd1Lm5UJaxoyyyP4","height":133654,"ip":"185.203.118.207","last_won":1725508,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725277,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzp8wYYPzSBtrf3v4Liy3FX9haPJs3kpU1fr5BPv8L2fXj5Wx8nCU9gvGF4kvHNhZzqjSMSJZp7pgzisTLbAV2xdv","height":80042,"ip":"62.210.169.171","last_won":475126,"blacklist":80472,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725278,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzpJyczfEKGYETcYFjzMbdGnN9tCicRH6jCZnEfZzaDogA4PQqoDP7vP1KkLZBMR3h9HdNSH335NK4GCWWb654Ycj","height":1381241,"ip":"3.120.48.67","last_won":1725541,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725562,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzpwcqpEGsG7d5JqxNGgxNFuAnBNEJk37x1qmSkKaeCCMKjWMUqhmFqUtxmXsYwyjuZqFZxr7GsWdjQKbhZV8WDkR","height":259413,"ip":"150.136.251.252","last_won":1725423,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725263,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzqZbeYnypkx73gBFi2Y4oarPScgYoPEiit1g3cdSv3ptCEJiswLJ2B1bc4hpMYymP7pQPNYrXnWQRnhwFpp1MQi3","height":477583,"ip":"78.128.92.160","last_won":777489,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725526,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzr6DdCAeQpceoxuHSK7JkhgsNJ22gFWgqXEqgU6YSDybj1da1JdcR4RPS6PBhXqYkb4YA6GHLykDYfvpWQwoFXfN","height":100714,"ip":"95.179.158.218","last_won":647771,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725279,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzrfTNkksVUDCUi99Jmp85QfgWmsZDFAB3ELPWBxjbStcATnvXLmQCd39rzYGKPaEBJDH8GQDJUnBbnMTGkcQ4G91","height":88167,"ip":"54.93.93.63","last_won":319987,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725280,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzroyLaTaWaRw5PLvbyGCfdSPCa8ACQE9C2jDhP6GeBdU6oRTRVpBK94vxTbFQifftCxLhSxvM4ZEacmDFCbYqxi3","height":124264,"ip":"209.97.147.43","last_won":319781,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725281,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzrqyaEJZAZmBu5qsrQx1wCLmFBDjdS45vnDWS5PhQWUNnuhrNm3TLvSRvDKrJvjwQGv1tPVixKyf7bRuTshT2otx","height":134858,"ip":"94.237.31.43","last_won":319883,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725282,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzrsW1SLnxodaMfhxKzk2rjjoTa7XKtJ7gYeao3BaKKcur5piGDd3KErhFxEWZAWsPjwVqGtngq2pb1T3MtLuqWN7","height":192634,"ip":"94.237.89.58","last_won":319858,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725283,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzryK4B2udqP37U2huSJtChBkwSyDzF4ud8N6FkzLUpXBqN3EayRGc28DLL4TqhWP6HyhdGExxSwCfZuUMteoquW8","height":138920,"ip":"8.6.193.201","last_won":319628,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725284,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzs4qcLnVwr8ZstyPo79Y5fwRQbgENfZQ1zu6e6XFqkEUwtDCu71zgqhm7EajSRwhsio3VpYhfDinQYYQvqBFnV7F","height":90121,"ip":"94.237.84.31","last_won":319914,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725285,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzs6eCLkBXbPBr99tMmV1bpa7UakidimZnXipXfhxtUZhBwaqjtcp3RMGL4SZ5X4spetzNmN1An7FpDrTwusXhQKU","height":907375,"ip":"185.206.146.108","last_won":1511989,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725511,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzsWRuUxZQ2VLDuQ5pUrAqmRpAfo6Ah5czSiJePNn9LwBj94GZ6cAeWkbWKqZA8yRUBhSRjo25cuBeyJ8ZshxqQcW","height":883071,"ip":"1.1.1.14","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725337,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzt3jPA8qsmgip3CXhZNzn2j5sS1TYeMvHJVg7xsFjCFvEg7wtQ98n8VX6kHcwJxgHEG4SDm3Trd4usYWH3nzX7M9","height":311050,"ip":"185.148.145.57","last_won":1725441,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725042,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzts9iiMFegVXxFVB4hf3oJGeJuJmFULEJ7GF7eE3PzhWnpjN6FJ785hg6BsT6R8RsJFuLdLeykBZtsA2v8LSitCd","height":139976,"ip":"94.237.87.117","last_won":319672,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725286,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzu1fdyEzuUF2aCr8SoLq1NwRJL9Z1HDuFWZJdKk37YVdxiHG23qeqRcmSdnZjm2WY6JN3CPFx8VKeUf7QmFUXQ7S","height":175548,"ip":"94.237.42.133","last_won":319970,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725287,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzvgihUTk77SgnDwKbK96vvUJTJoSM6dKeciFcbr4v7Zvia31Nik29cdVjYxFv3wmJR2YGq1YU7U6E6QtiNYKKA4a","height":134928,"ip":"85.217.170.250","last_won":1725415,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725288,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzy3xEbgxt1m7KvBijBKoKwR234kneqdbJZaxabGbzhDv9ZukmQzT1eqEKAGKMhjAA7D81zHARTpCAukM7nawmUYm","height":174832,"ip":"155.138.231.128","last_won":319724,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725289,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzzqd3HDQCTj6mVCna4cQWwNmFzwTJnMaTcY2LQWNoRcDUqvFd9aR82CELEXp2TXpd7jmEHSii22eGqxGrLHySgAk","height":166317,"ip":"95.179.162.35","last_won":319755,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725290,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD11471huRcG7iQS6EAnpxPwNPsL1ayr5mHJyPfML7hM7vuZTimp1xvaTnowSh7fm1svLBpHxngheVRViFfYsDg3EX","height":1515659,"ip":"8.8.10.8","last_won":1598374,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725133,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD11PyUKbaj1uwYBDsBL32qaehfNdEeKrtEAoMBmqvBZ7njPHSwLog2sBswr9RhMRkBAeaAQjnEZHFJEWAGJ8rh8Ea","height":91580,"ip":"91.92.111.103","last_won":1382395,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725291,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD11eLw2PophCPzqAAqAcN7nBbee2t88KNBY7WDhU3psmc5Ntw2fp1tYSxtasbGxGnbixFPasj2bp2dT6Hi9eeR7kv","height":450342,"ip":"94.156.128.70","last_won":1725398,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725465,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD11zy2sZ2vyGoL8Nof4gc61RXmFZSnEKDnifmG3LokZjZFLWQCjTTcHYi4KGG9dsab4arJEGWQ7ZoZt592n5pnqoz","height":97159,"ip":"77.55.223.161","last_won":578807,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725292,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD12QGtucbNxR4e5TkuCqePdRfQJYepLHzpffwffMbUq6yzTjHMqFJuyMWXCc2NALcGxFTc7YnK6MgHYVMTg4CWgsr","height":867034,"ip":"142.205.241.249","last_won":907143,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725304,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD12pA6SCtNLgjcnysMxEVvGgXWbfwoaCjxwRTUASHxUHSorprLqKDevjAXqCXbmjwie1qkQxHAiCnHcJVjZCXAkV9","height":477583,"ip":"78.128.92.174","last_won":777490,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725527,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD12r6qFiCwwgxGwhqYTorJW8tMNWV8nf9SzQsNyduL6jMPcnCQjNw2evD5beM3eQpuYttt15LbmTkr11hPgw9YKV1","height":81882,"ip":"91.92.111.111","last_won":1382276,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725293,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD13VNPgfWRpavjT1jtbe8hrgKuhNrZr3XtE2TqxWQmu9s9EFM6BYsQybieC3KJygEknm65g8g7NTLBW1wcDwhLLwE","height":132837,"ip":"94.237.83.137","last_won":319640,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725294,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD14M2cKv2pY7YyQJYYtvWmcLUz1iLU8tDXB7pKqfyDKzv5wN38tExrAyzMjNUEexgqZKVZhyagSBa2BRDTswjVupa","height":132641,"ip":"193.37.214.86","last_won":1725484,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725295,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD14YpVtKhcn7knRDraQkCckF1fhmbPHFuzFkRFm5F4j7Tz5FQkMk1wtHuC1XkRtfi4J1t4Gv8mRe73m8x9kDgAeak","height":88170,"ip":"18.196.101.129","last_won":319996,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725297,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD14e4Nu4EEjctGnznczPECwARVaUwuFqW4tPqgP2cLCQnw5tSSwNJB5LHHMkSB6TN1kui34tozxN3JsTTnAjQnmFM","height":138920,"ip":"149.248.5.216","last_won":319629,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725298,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD14xxBXFjsB31ZoU1DtgL9ByJw9t7oo5axBzkzB8aVH4AsTpqb7MzkZJUtMiHtThzAPtb9zYshmzwJYcRgqBxoWxS","height":175542,"ip":"176.223.134.27","last_won":1079818,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725299,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD15JHchcgbA8zasrvrhsrqyogMb4hHaq3e2ygTnR8iUEkhkqLKjfWH3CySG41Vt4eGnVp2jPNjaFwpN3RLs1qYz6w","height":311050,"ip":"185.148.145.101","last_won":1725442,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725043,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1639MBwsYxYQMaiXjSNmzqPg79v7JatiPEpBTPVRMJmcUPDvQNyzPDGBb5cHN26oof15Gj1nJL99BCV8iwHaGLyy","height":311172,"ip":"185.148.145.154","last_won":1725477,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725193,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD166m9yLEMqwobNB5zTA2y1PiaZv4W5yNgxx3dQyNeNnmc9itMQm3qKdaHuHtLH7zzESHszSg9zS8qvGT91EUcbzE","height":1515645,"ip":"8.8.9.3","last_won":1598365,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725124,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD17AZdLGrB1qGkDP7gJ6ANULy7BsanowVSGnMQYU8u3eANpCFt4BRFZw8EnW2QsB9B6PPM5QsdRHo1sYjuURC7p1Z","height":80982,"ip":"185.206.146.213","last_won":1725425,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725300,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD17XXRkfi8mQhXuhDVCtCSNktREz9Jgdv2YUzJkiW1kYTGWtfAJutaiNgatbCNwyeaQbSDq7bpyKfMZiktCLNrzkz","height":909557,"ip":"80.211.4.19","last_won":950286,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725224,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD17Xq3txtcnfZQsX1nntBG12L8uoUBL6a4KJUFoUrmjddKTDxeyESTsb9kNzEExxWEiU6R9A4HjHHw9vcE5aVZenV","height":133071,"ip":"138.197.9.149","last_won":319920,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725301,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD181tCPGqY95gsaE4BmuTpqx2bfZRrb8yzPvqwpD8whMXgPPrmRUK11NfAjTuhvNvNMc945ZT3mBGrjmLQt75d9pS","height":120433,"ip":"94.237.29.38","last_won":319784,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725302,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD18J8yeF9JvFTfVMnHiSUuTQbiEnzXEiBdKGymSKLLkpVSv4QWszF6uDJXTdViMQHszaBFrWq3236PP5AQwag1a7n","height":311358,"ip":"185.148.145.169","last_won":1725422,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725379,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD18vbSYRfFv27sBgvmPxyDdJXYrESKXzXJNYS1vix3CU6yPv26VyQ4RmvmzgRuymiUBhc13LkAv4ekLjA8F3WWqD2","height":97948,"ip":"198.13.61.232","last_won":319733,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725303,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD18viWbmEC29Dq6czqTszm32DJpxeDhoTFFSe7yDcd4AwDupNcwG84FXCvBncRkwS5EoQahesMqq68bnT9ubRfKqu","height":177246,"ip":"152.44.42.41","last_won":319599,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725306,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD19EhikdDZPPhziT9XzTREkCCqgX44rc7NE5DwUNAUH51TkYTbRCifTakDMiKa4bNCYYDfB5hNG6BYFj5KMRk5azr","height":1515645,"ip":"8.8.9.2","last_won":1598366,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725125,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD19S9gQW5bkJY42jUZaMt5NVMBGzLLFq3qHgHF4MRtzRNavLYe4NXAiHmg9gHWAab2dTxUMj1fKLawNywavCp9ygu","height":419573,"ip":"94.156.128.47","last_won":1725378,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725418,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD19saQJNEsvzmT2jFNUzFEY3xUjp1Ua6yLi2Ed2Lpdry2s6ZqJXq3HHX3McEruTna67yuW2xLJNmu9Hkn6tVaCRrD","height":80389,"ip":"194.32.77.49","last_won":1725467,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725307,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1B8dfTxD1mQ1ZKkrY3MS1SXkhZXrYWkidgyKiyt4Jq4Qp7ocETJDiHjYjCEaRScgPxufkZQygwiUBxhgEfrj5fVL","height":175843,"ip":"209.50.61.226","last_won":319713,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725308,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1BDLtyGixdsoG38WqeF2a8bm2aaEkNxW15znCqJLE7Kp4sY6RXSEBxU5JzvuVUGesw1wsVcobmNdnYsUUycEkbPD","height":1515645,"ip":"8.8.9.1","last_won":1598375,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725134,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1CXKRy5GcQY999JZRnRTf51jPtR4RVk4guw2t2wUzawdtku8rrYTDcXqR4wmsp96DadqigzAvUrEe4dxZvcpvJ7Z","height":450342,"ip":"94.156.128.77","last_won":1725399,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725466,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1CgvvLMruH4YKdCYFwosHqf9bDqkBX1w7wT66TgHEzok8BrcoLKsdL8mZFNySbMTLdUpxsGCUcpQ1u6FzQCAnvM7","height":419573,"ip":"94.156.128.15","last_won":1725379,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725419,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1EMAV2mXLVGt3chathJ92ZbkL7WJTSRbhnGJNRoruK7Pt55jmpuAXGEqsh4VA389gtZ5RBE11exsTEAkkRhCqB6D","height":137604,"ip":"45.77.96.158","last_won":319752,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725309,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1EpDL2mx9fBpyAkVz3uXKDLvMdLd8akGWqjwGHk6Y8iRpjCu4TCrpnuhAjVz9Q6wzq44GtJaNSLmcASxFMHzixGS","height":90738,"ip":"178.128.87.251","last_won":1036672,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725310,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1FzcFjaUCGmCBaV1ykBmbzUkag6aKrYbRRNbQtQmiLdm9F6MGBLPTSWJjzGqYQUiwzs3mvL1Cavp8RjTJGqMouXi","height":80982,"ip":"185.206.145.200","last_won":1725426,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725311,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1G4awi6995qUDNVMstQwG2L8TJymbKajSqncpmZMNs8rt3xTsGnP3hr27d82p3AijHotjMpCp5pMsU6LMEuza39j","height":425768,"ip":"94.156.128.67","last_won":1725557,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725108,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1G9CjpMJoAaRmYP4jRMA8r9o7DksMhXUn3quxERYVHM6gGqSQJgjgqtXYnNBkZDdbiwTh1yhz4qRc1s3eAfvuSwZ","height":419573,"ip":"94.156.128.40","last_won":1725380,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725420,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1G9rdoUh5hhPR2qMWhwrgsacM9FRqZpfNgnjN9WurL2YqvMjdWrDhk4rofb2Mn6ZLWmLoCfSiKhqAWpJVQUpzrSg","height":1515659,"ip":"8.8.10.7","last_won":1598376,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725135,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1GktiYiiB3ddPxVq9Za1QBnzTQ2Tma4tFxxMmsupL2k2XNfMT3frAARwyAq3qrPLWHQPQcNH9DgsQjkfEudb63dv","height":132966,"ip":"185.203.119.228","last_won":1725452,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725312,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1HWW7bvV6ee9VRqK92JBqbXbKvM7apMyE6HscX3RtXng2c2xLecrcrgpvbDJbrHE4B9u7YUoc1Kot1dVmtwgXBrA","height":311175,"ip":"185.148.145.161","last_won":1725478,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725194,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1Hjr7w29MpwxzPyyYWM48DbLRwP4NQ66HayG7BYfSEPFQtcMgRSkeb9nRwAJsnEyfVHJoF4eUGw7dT61b45uaGdw","height":100300,"ip":"188.166.52.197","last_won":319671,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725313,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1JGVYDMUhVCKqPpQ75rDVEdThgkjor3yn4J7kGytjS38YkSfUTRyjp1hhrHLMV1FKMSStaFzEBXZB448SMBkL6eL","height":137604,"ip":"66.42.92.67","last_won":319753,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725314,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1K2ywTmvvCmAuGBrEcFpRyBrewYbxi7xzs61Dg4zDPjkCjhA2y8nKVauM1aC9wThA2M3YjscinSSK7JWYgiTrHZr","height":88821,"ip":"35.180.42.159","last_won":319618,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725315,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1KcoTyAF15nsueC2bTKt88Hs7ZWW8RiNVFJmXxWc37rJmWXWirZjHyDG1xrayD38dRyixPNpixpe8ccVzxkrFuLY","height":88820,"ip":"35.180.113.138","last_won":319615,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725317,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1Kg4iRGotkN4NR1sGFWKJJ6A3ZmrQTkXFsBGQRHAZaUFj56dx27RD8nWp7k88Txv7LQ2DVnnfYKuoic3zGM2MURP","height":93386,"ip":"178.128.71.107","last_won":319575,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725318,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1KoZyqWaWEqTfWxRxPXaPUu95XzKPu2fHtKDPq4wmv6xpxsCcB6QqResGHZxJiP5qeQhk3Rb43iNEBgSNQ6txRFB","height":477583,"ip":"78.128.92.148","last_won":777491,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725529,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1MvTm7UP2Nd9MMAR5d88MvtrqWKCfvMx3MLTmMMZnGD6WzwRo63aNJwM5GourZW4D7dUyjxCHodUKSqhxpdfkwkB","height":419573,"ip":"94.156.128.7","last_won":1725381,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725421,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1NZChyHJogb5TekagzcM8CqArZoTMNqEK35LK4ft7Reir7xWFKwXzdTfTTJt67dDwAoGD7z9ErNVQFDjhU4V6zWB","height":101108,"ip":"165.227.130.54","last_won":431953,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725319,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1NmoK1UeANmJe2MA5GteURyk1XfuaTSXziqAEeVkh43C9ZFHg3fo61hRu7R12y1H6VDGXVNryyaWTUSVk3zk3BmV","height":882161,"ip":"1.1.2.2","last_won":883077,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1724989,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1PoeMAatjubGJLoRwgo8GmrmkJ1nD7Qai1CaS8dG9nc4Hvn4UypzxyJZ4uceNyhRfunSaxFPzdPa3HcWpGZtoHMK","height":149832,"ip":"94.237.57.22","last_won":319638,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725320,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1Q4y7u27JTJXqzTse45CcfVHJ3rif5kFKzUGFNF6vFPoRSbfViPcHC7hL5CEzuHPMjKFiYFjTP7wfP8TnNrwyTTm","height":310779,"ip":"185.148.145.38","last_won":1725489,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725296,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1Q7BD9soEN9Mb5JJgQQqSrt7Rr1PRyfNnRXfShSwp3oTASFY4my2Bzt5wQyX9RCqA8yC9E6dMToPs3aCt1ThhhXX","height":133654,"ip":"185.203.118.178","last_won":1725500,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725321,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1RjeVEqs4LmsAfSCHbzx7yTob89sxDYfKZuJrxoBF4TqEAjEJLV1MGwPKN77BoLrGyvJoE25x55zqLWpy5SYS7Dk","height":1515646,"ip":"8.8.9.8","last_won":1598377,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725136,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1SAzhTj7Xgr1tpdcJzEcELySoDKtxmTkPtuxwDaGCNdjGAX4HXF6jtPzbSDtew9gJChtAPdt3x4ahB13AtTfDtHr","height":133654,"ip":"185.203.118.190","last_won":1725501,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725322,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1SQ2KuHkjM9RK9miM2PAaHrA1eweK6oqR2SDNX3yXXLt1arnHCh1qHY3Urow7thuBnXvV9tLbW2tZFr4BCi9mNLN","height":477583,"ip":"78.128.92.154","last_won":777492,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725530,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1SU12xV9rmbqAGtcwZGACSvMJds3zrHB5ee9pNCUi6aUegMLidijaGC7gMknQxjCqEoV5FsCC85gtgkqDFt7SJP5","height":419573,"ip":"94.156.128.31","last_won":1725382,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725424,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1T1iBLHkp4zWa2r2JpjkmFPJzuq7DnbaRDkgXpEHQgX89ZiQ2PjF9imnh31dugHMoAPebQYPoAwxNNS8nBkLGsvK","height":909557,"ip":"80.211.4.18","last_won":950287,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725226,"voted":1},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1TzVbM1tb24FXArjcLhHZfReVTSrYsHzBWrTqCJDuD6dqn8Fz4PsoUfostbgJuqfgeDQR1fUdBjTP8cSQPGY6jhS","height":883071,"ip":"1.1.1.10","last_won":0,"blacklist":0,"fails":0,"status":0,"vote_key":null,"cold_last_won":1725338,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1Tzp6gBBDC6venhNEakFwRxbu3egginAzZzfu51azFF2jJZk1L3eWJYiW1kkscznmSRiNFDf2H8JbNnfiHXi7SxN","height":311170,"ip":"185.148.145.106","last_won":1725479,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725195,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1URHyni5edmUkP3ApQnHxdUuqfHobMLMttsKvZy9kh8fptKzQxMN3A3YrefRUH2Z8JTP3deL4kFxrjeEXvfxNYiK","height":419573,"ip":"94.156.128.48","last_won":1725383,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725426,"voted":0},{"public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSD1UWWJKEH7ERthj9k8SFBQyGzaDcPRpEuJDWYBbwJyQNkazRJQPPRFwDG4oEnQnnncSEnpDdK6YfmY7WFGv66nDnW","height":81968,"ip":"47.74.211.35","last_won":319879,"blacklist":0,"fails":0,"status":1,"vote_key":null,"cold_last_won":1725323,"voted":1}],"hash":"e3743f8af83a373a75762077b8d4f4e1"},"coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_3a105.txt b/tests/__SNAPSHOTS__/GET_api.php_3a105.txt new file mode 100644 index 0000000..290b47f --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_3a105.txt @@ -0,0 +1,8 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:34 GMT +Server: Apache +Strict-Transport-Security: max-age=31536000; includeSubDomains +Content-Length: 52 +Content-Type: application/json + +{"status":"ok","data":"0.00000000","coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_4670d.txt b/tests/__SNAPSHOTS__/GET_api.php_4670d.txt new file mode 100644 index 0000000..4e38c9a --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_4670d.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:37 GMT +Server: Apache/2.4.6 (CentOS) +Content-Length: 55 +Content-Type: application/json + +{"status":"ok","data":"1.0.0-alpha.7","coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_4a186.txt b/tests/__SNAPSHOTS__/GET_api.php_4a186.txt new file mode 100644 index 0000000..8cffdff --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_4a186.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:37 GMT +Server: Apache/2.4.6 (CentOS) +Content-Length: 206 +Content-Type: application/json + +{"status":"ok","data":{"hostname":"http:\/\/peer8.arionum.com","version":"1.0.0-alpha.7","dbversion":"12","accounts":16202,"transactions":10321843,"mempool":1,"masternodes":600,"peers":22},"coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_501bd.txt b/tests/__SNAPSHOTS__/GET_api.php_501bd.txt new file mode 100644 index 0000000..2485a44 --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_501bd.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:34 GMT +Server: Apache/2.4.6 (CentOS) +Content-Length: 52 +Content-Type: application/json + +{"status":"ok","data":"0.00044441","coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_5c8f5.txt b/tests/__SNAPSHOTS__/GET_api.php_5c8f5.txt new file mode 100644 index 0000000..e58181e --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_5c8f5.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:49 GMT +Server: Apache/2.4.6 (CentOS) +Content-Length: 42 +Content-Type: application/json + +{"status":"ok","data":13,"coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_7a9ed.txt b/tests/__SNAPSHOTS__/GET_api.php_7a9ed.txt new file mode 100644 index 0000000..b9a3bfa --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_7a9ed.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:35 GMT +Server: Apache/2.4.6 (CentOS) +Content-Length: 4396 +Content-Type: application/json + +{"status":"ok","data":[{"id":"26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT","max_supply":0,"tradable":1,"price":"0.00000000","dividend_only":0,"auto_dividend":0,"allow_bid":1,"height":952581,"alias":"AUSDTHOUSAND","balance":"39.62500000"},{"id":"2UXwmvwjuFkJomaW7XdxJeEzGbCiDbWnP3EtEdHUtBaaqT8CPGptbY3RDyWotAnWcNUWgCLRmCWzLezN9gzR89h7","max_supply":1000000,"tradable":1,"price":"0.00000000","dividend_only":0,"auto_dividend":0,"allow_bid":1,"height":915071,"alias":"ACOS","balance":"189.74999930"},{"id":"2Vj7n7ZrfpqSjxUoi6TGyUfxJty7T38pCCc5TejpB8gFHvSUKBEyYVuwfTuMeuqaQn2tWeqNEXDCziWwdWpPZfNv","max_supply":0,"tradable":1,"price":"0.00000000","dividend_only":0,"auto_dividend":0,"allow_bid":1,"height":952602,"alias":"AUSDC","balance":"788.99999990"},{"id":"2WGtvoV1LxvBpYHXpYHFoDb9XGR3Cig1LE8bUK2d6hMB7mpaVPKgFhCqsFsZTGbTZvHTKydJ7QThZwHYAjPSMthk","max_supply":0,"tradable":1,"price":"0.00000000","dividend_only":0,"auto_dividend":0,"allow_bid":1,"height":913759,"alias":"IAKC","balance":"109.75000000"},{"id":"2ekfzGgZkrtLo7PgxVjQhNHUDMbZNrzyntWBVYF3kkSQuSEganKANcUCL9LtC3wTf3HXCD8HEUEFUBq8vxiL6mPM","max_supply":0,"tradable":1,"price":"0.00000000","dividend_only":0,"auto_dividend":0,"allow_bid":1,"height":952579,"alias":"AUSD","balance":"89.75000000"},{"id":"2hQcSJz2rLkCm9YP6UGocsfekmoHwmdHvxBL1BVxvSygjUGjAsfWszPyihbRV7VpUz1YHoTxnbpo9XMra6ys7xPV","max_supply":1000000,"tradable":1,"price":"0.00000000","dividend_only":0,"auto_dividend":0,"allow_bid":1,"height":952569,"alias":"AUSDCENT","balance":"89.75000000"},{"id":"2wp13Yco11K2pV7QHB6nWZ9jeLYmm9Kar1YjJ39beXShKYdyf8Mh5hz1EAgtC1dzZQVL7X5dDJrPuNm9GefBBTKy","max_supply":1000000,"tradable":1,"price":"0.00000000","dividend_only":0,"auto_dividend":0,"allow_bid":1,"height":913714,"alias":"IAOS","balance":"285.74999930"},{"id":"3otamzMJg3MRpzxMhHZH73PsDXJFmTUgYzG5wuap6sKmiUkTnVxsjksXTbeJQbrkGVYh1muRkhkwwJCYjgqNrFdp","max_supply":0,"tradable":1,"price":"1000.00000000","dividend_only":0,"auto_dividend":0,"allow_bid":1,"height":295894,"alias":"SHAREDMN","balance":"1.16901850"},{"id":"4jEbJQiwUnvhsnJgfQ9jsVah8Eb42qaD11omd7xBgvKAfq7dEwPGSydCxAKfg6amD2DXwit9euhd7tzMHawz1tVQ","max_supply":100,"tradable":1,"price":"1000.00000000","dividend_only":0,"auto_dividend":1,"allow_bid":1,"height":954852,"alias":null,"balance":"0.00000000"},{"id":"4p8B1WLYRu645rfZ9Lc9m5hDFU5jD35EZATo3y14CP5zCbT81WhCKhSBFSeneuFxAfxFoCjYmSrFarcCsnG2EHLH","max_supply":100,"tradable":1,"price":"1000.00000000","dividend_only":0,"auto_dividend":1,"allow_bid":1,"height":954847,"alias":null,"balance":"0.00000000"},{"id":"559e82ts7v95icwqSxkdTp7rQAhS3VpHubT2vE3kJhMuWbFPbteRXJqwcpiEX65iJ9gaFutKNe7YSHbmnjnmNcng","max_supply":100000000,"tradable":0,"price":"1.00000000","dividend_only":1,"auto_dividend":1,"allow_bid":1,"height":471399,"alias":"CORE","balance":"0.00000000"},{"id":"5BFwDXDz2oWLCanxSttweTadEikk9NpsxPLvwn7Gev8u5sQDRozy9PjiKWoLdveZwDWKsXyJc8DvJDUjpStEqodV","max_supply":1000000,"tradable":1,"price":"0.00000000","dividend_only":0,"auto_dividend":0,"allow_bid":1,"height":913669,"alias":null,"balance":"0.15675000"},{"id":"5RfV4S9QnvQGKEM1hzrECJWqTdRgYQb6nnzdKMseH7EujtFD1nSTbEPd5Ng5icqdDfgPoq7fK4wrJeLTBRZCioWw","max_supply":100,"tradable":1,"price":"1000.00000000","dividend_only":0,"auto_dividend":1,"allow_bid":1,"height":954840,"alias":null,"balance":"0.00000000"},{"id":"63XhfCKHGCDUhwzWgb61nhNY7SD5HTTAV1XZ9fVqPAAe9oGyRtQruojT13A3pmWFEugd99qMDgGbgbQzPCE5ciHE","max_supply":1000000,"tradable":1,"price":"0.00000000","dividend_only":0,"auto_dividend":0,"allow_bid":1,"height":952555,"alias":"AUOS","balance":"37.12499930"},{"id":"HLdx7EbLfkcHebX5kgMDdhynEYvYqxK6LZ2qExJdg3iJqNLvkE8LDAbSy5PJB8Vb5cuFJgVqLNGs72eQBSH2p29","max_supply":0,"tradable":1,"price":"0.00000000","dividend_only":0,"auto_dividend":0,"allow_bid":1,"height":941760,"alias":null,"balance":"6860.18827526"},{"id":"MnCGTWjWooKBE8PwEbPCr8Fk1oqmB4wF3fbM11eBJWTVzFkRm3GWPLQbDssEoX9VdATdXtJervte4geb6PoDxDL","max_supply":0,"tradable":1,"price":"0.00000000","dividend_only":0,"auto_dividend":0,"allow_bid":1,"height":243676,"alias":"ASDF","balance":"766219.59048601"},{"id":"kcwdodBiQvB8Q2q5JLjkXLxrCt8aesHDQN76ahomYkEK2m55uo9rSwb22swNTZoKwPzUrMQsD7jQERmENGUKatb","max_supply":101,"tradable":1,"price":"1000.00000000","dividend_only":0,"auto_dividend":1,"allow_bid":1,"height":975779,"alias":null,"balance":"143680.75000000"}],"coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_7e500.txt b/tests/__SNAPSHOTS__/GET_api.php_7e500.txt new file mode 100644 index 0000000..d6a34b8 --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_7e500.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:37 GMT +Server: Apache/2.4.6 (CentOS) +Content-Length: 42 +Content-Type: application/json + +{"status":"ok","data":[],"coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_92efa.txt b/tests/__SNAPSHOTS__/GET_api.php_92efa.txt new file mode 100644 index 0000000..6fe5762 --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_92efa.txt @@ -0,0 +1,8 @@ +HTTP/1.1 200 OK +Server: nginx/1.20.1 +Date: Fri, 14 Oct 2022 10:54:34 GMT +Content-Type: application/json +Transfer-Encoding: chunked +Connection: keep-alive + +{"status":"ok","data":{"address":"vAWhKndLBb36GyLMffNoHnXJaNypHRUcw9ay4Q5yM3DfVwGB85yH6AV1ZtBMXzpRQNqPJG1KTNTABomLyq6WV2P","public_key":"PZ8Tyr4Nx8MHsRAGMpZmZ6TWY63dXWSCzSQ69mPPyAreMUwMYVGxez6om3iPgURWCvofWMPQJSPsZjaaYu4TW56BZVGNbAKGhYKSsqXtgYtgY3gBfvggyZ6x","private_key":"Lzhp9LopCEJksXCMiCKBSzLvg4uTP9xKUhDL1hT5rYHEerMKpANvPqaB72bPRGLnDYnwT7AxskCvRi1kk5f1iHRMFdBwE7RVHk6GtCgTbdyUkYv4qjdBizUFJkS9gv41S5B7HThdKHZ6rNpB3TqxZPgXQ9fGC5tUp"},"coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_a2104.txt b/tests/__SNAPSHOTS__/GET_api.php_a2104.txt new file mode 100644 index 0000000..29bb19e --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_a2104.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:50 GMT +Server: Apache/2.4.6 (CentOS) +Content-Length: 44 +Content-Type: application/json + +{"status":"ok","data":true,"coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_aeaf9.txt b/tests/__SNAPSHOTS__/GET_api.php_aeaf9.txt new file mode 100644 index 0000000..7b64caf --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_aeaf9.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:35 GMT +Server: Apache/2.4.6 (CentOS) +Content-Length: 52 +Content-Type: application/json + +{"status":"ok","data":"0.00000000","coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_af86a.txt b/tests/__SNAPSHOTS__/GET_api.php_af86a.txt new file mode 100644 index 0000000..629c367 --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_af86a.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:50 GMT +Server: Apache/2.4.6 (CentOS) +Content-Length: 48 +Content-Type: application/json + +{"status":"ok","data":"3A836b","coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_b236a.txt b/tests/__SNAPSHOTS__/GET_api.php_b236a.txt new file mode 100644 index 0000000..bdca659 --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_b236a.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:36 GMT +Server: Apache/2.4.6 (CentOS) +Content-Length: 42 +Content-Type: application/json + +{"status":"ok","data":[],"coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_b5998.txt b/tests/__SNAPSHOTS__/GET_api.php_b5998.txt new file mode 100644 index 0000000..c3ae195 --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_b5998.txt @@ -0,0 +1,8 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:36 GMT +Server: Apache +Strict-Transport-Security: max-age=31536000; includeSubDomains +Content-Length: 77 +Content-Type: application/json + +{"status":"error","data":"An asset or an account not found","coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_bca18.txt b/tests/__SNAPSHOTS__/GET_api.php_bca18.txt new file mode 100644 index 0000000..d4347f7 --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_bca18.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:35 GMT +Server: Apache/2.4.6 (CentOS) +Content-Length: 49 +Content-Type: application/json + +{"status":"ok","data":"PXGAMER","coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_cd83e.txt b/tests/__SNAPSHOTS__/GET_api.php_cd83e.txt new file mode 100644 index 0000000..a05943f --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_cd83e.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:35 GMT +Server: Apache/2.4.6 (CentOS) +Content-Length: 44 +Content-Type: application/json + +{"status":"ok","data":true,"coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_d3a40.txt b/tests/__SNAPSHOTS__/GET_api.php_d3a40.txt new file mode 100644 index 0000000..f06de14 --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_d3a40.txt @@ -0,0 +1,8 @@ +HTTP/1.1 200 OK +Server: nginx/1.20.1 +Date: Fri, 14 Oct 2022 10:54:36 GMT +Content-Type: application/json +Transfer-Encoding: chunked +Connection: keep-alive + +{"status":"ok","data":[{"id":"26PZgwak3LscM3Mz8bfDBmbETSq9GvXhdom5HwoDMuaMvg9cekKX21hoNtJXixdrvvAwq2BoxKiUdQQnGWym1ZxT","max_supply":0,"tradable":1,"price":"0.00000000","dividend_only":0,"auto_dividend":0,"allow_bid":1,"height":952581,"alias":"AUSDTHOUSAND","balance":"39.62500000"}],"coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_d8f9a.txt b/tests/__SNAPSHOTS__/GET_api.php_d8f9a.txt new file mode 100644 index 0000000..2485a44 --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_d8f9a.txt @@ -0,0 +1,7 @@ +HTTP/1.1 200 OK +Date: Fri, 14 Oct 2022 10:54:34 GMT +Server: Apache/2.4.6 (CentOS) +Content-Length: 52 +Content-Type: application/json + +{"status":"ok","data":"0.00044441","coin":"arionum"} \ No newline at end of file diff --git a/tests/__SNAPSHOTS__/GET_api.php_e0c72.txt b/tests/__SNAPSHOTS__/GET_api.php_e0c72.txt new file mode 100644 index 0000000..5b1c36c --- /dev/null +++ b/tests/__SNAPSHOTS__/GET_api.php_e0c72.txt @@ -0,0 +1,8 @@ +HTTP/1.1 200 OK +Server: nginx/1.20.1 +Date: Fri, 14 Oct 2022 10:54:49 GMT +Content-Type: application/json +Transfer-Encoding: chunked +Connection: keep-alive + +{"status":"ok","data":{"sanity_running":true,"last_sanity":1665744639,"sanity_sync":false},"coin":"arionum"} \ No newline at end of file From b28deb1e27509ffcef9944120e47c1fc6427cf24 Mon Sep 17 00:00:00 2001 From: Owen Voke Date: Fri, 14 Oct 2022 11:57:21 +0100 Subject: [PATCH 12/13] ci: use PHP 8.1 only --- .github/workflows/tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index f164c85..64db9b7 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -8,7 +8,7 @@ jobs: strategy: matrix: os: [ubuntu-latest] - php: ['8.0', '8.1'] + php: ['8.1'] dependency-version: [prefer-lowest, prefer-stable] name: PHP ${{ matrix.php }} - ${{ matrix.os }} - ${{ matrix.dependency-version }} From b517e9080a03762ec99fc8407c7598c9ad50683d Mon Sep 17 00:00:00 2001 From: Owen Voke Date: Fri, 14 Oct 2022 12:16:13 +0100 Subject: [PATCH 13/13] style: apply fixes from Pint --- tests/TestCase.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/tests/TestCase.php b/tests/TestCase.php index af19ba0..bc3170d 100644 --- a/tests/TestCase.php +++ b/tests/TestCase.php @@ -4,15 +4,12 @@ namespace OwenVoke\Arionum\Tests; -use Http\Client\Common\Plugin\AddHostPlugin; use Http\Client\Plugin\Vcr\NamingStrategy\PathNamingStrategy; use Http\Client\Plugin\Vcr\Recorder\FilesystemRecorder; use Http\Client\Plugin\Vcr\RecordPlugin; use Http\Client\Plugin\Vcr\ReplayPlugin; -use Http\Discovery\Psr17FactoryDiscovery; use OwenVoke\Arionum\Api\AbstractApi; use OwenVoke\Arionum\Client; -use PHPUnit\Framework\MockObject\MockObject; use OwenVoke\Arionum\HttpClient\Builder; abstract class TestCase extends \PHPUnit\Framework\TestCase