From 40c0bed02ebcde82936d66505387a2b2f2ad7921 Mon Sep 17 00:00:00 2001 From: Julian Ospald Date: Thu, 15 Oct 2020 17:41:58 +0200 Subject: [PATCH 1/8] Add `delistPools` to Pool DBLayer This is the first step for garbage collecting stake pools based on SMASH delisting. X-JIRA-Ticket: ADP-478 --- .../Scenario/API/Shelley/StakePools.hs | 4 ++ lib/core/cardano-wallet-core.cabal | 1 + lib/core/src/Cardano/Pool/DB.hs | 5 ++ lib/core/src/Cardano/Pool/DB/MVar.hs | 4 ++ lib/core/src/Cardano/Pool/DB/Model.hs | 12 ++++- lib/core/src/Cardano/Pool/DB/Sqlite.hs | 50 +++++++++++++++++-- lib/core/src/Cardano/Pool/DB/Sqlite/TH.hs | 1 + .../src/Cardano/Wallet/Primitive/Types.hs | 5 +- .../test/unit/Cardano/Pool/DB/Arbitrary.hs | 1 + .../test/unit/Cardano/Pool/DB/Properties.hs | 1 + .../test/unit/Cardano/Wallet/Api/TypesSpec.hs | 1 + nix/.stack.nix/cardano-wallet-core.nix | 1 + 12 files changed, 80 insertions(+), 6 deletions(-) diff --git a/lib/core-integration/src/Test/Integration/Scenario/API/Shelley/StakePools.hs b/lib/core-integration/src/Test/Integration/Scenario/API/Shelley/StakePools.hs index 7bd2c35f8b0..ef084ef1d79 100644 --- a/lib/core-integration/src/Test/Integration/Scenario/API/Shelley/StakePools.hs +++ b/lib/core-integration/src/Test/Integration/Scenario/API/Shelley/StakePools.hs @@ -881,24 +881,28 @@ spec = describe "SHELLEY_STAKE_POOLS" $ do , name = "Genesis Pool A" , description = Nothing , homepage = "https://iohk.io" + , delisted = False } , StakePoolMetadata { ticker = (StakePoolTicker "GPB") , name = "Genesis Pool B" , description = Nothing , homepage = "https://iohk.io" + , delisted = False } , StakePoolMetadata { ticker = (StakePoolTicker "GPC") , name = "Genesis Pool C" , description = Just "Lorem Ipsum Dolor Sit Amet." , homepage = "https://iohk.io" + , delisted = False } , StakePoolMetadata { ticker = (StakePoolTicker "GPD") , name = "Genesis Pool D" , description = Just "Lorem Ipsum Dolor Sit Amet." , homepage = "https://iohk.io" + , delisted = False } ] diff --git a/lib/core/cardano-wallet-core.cabal b/lib/core/cardano-wallet-core.cabal index 59526f4d5a6..6a217c6e805 100644 --- a/lib/core/cardano-wallet-core.cabal +++ b/lib/core/cardano-wallet-core.cabal @@ -90,6 +90,7 @@ library , statistics , stm , streaming-commons + , string-interpolate , string-qq , template-haskell , text diff --git a/lib/core/src/Cardano/Pool/DB.hs b/lib/core/src/Cardano/Pool/DB.hs index d6c965aa6bf..5d9d3d300f6 100644 --- a/lib/core/src/Cardano/Pool/DB.hs +++ b/lib/core/src/Cardano/Pool/DB.hs @@ -211,6 +211,11 @@ data DBLayer m = forall stm. (MonadFail stm, MonadIO stm) => DBLayer -> stm () -- ^ Remove all entries of slot ids newer than the argument + , delistPools + :: [PoolId] + -> stm () + -- ^ Mark pools as delisted + -- , removePools :: [PoolId] -> stm () diff --git a/lib/core/src/Cardano/Pool/DB/MVar.hs b/lib/core/src/Cardano/Pool/DB/MVar.hs index a5784911a56..f40e7267bce 100644 --- a/lib/core/src/Cardano/Pool/DB/MVar.hs +++ b/lib/core/src/Cardano/Pool/DB/MVar.hs @@ -26,6 +26,7 @@ import Cardano.Pool.DB.Model , emptyPoolDatabase , mCleanDatabase , mCleanPoolMetadata + , mDelistPools , mListHeaders , mListPoolLifeCycleData , mListRegisteredPools @@ -146,6 +147,9 @@ newDBLayer timeInterpreter = do rollbackTo = void . alterPoolDB (const Nothing) db . mRollbackTo timeInterpreter + delistPools = + void . alterPoolDB (const Nothing) db . mDelistPools + removePools = void . alterPoolDB (const Nothing) db . mRemovePools diff --git a/lib/core/src/Cardano/Pool/DB/Model.hs b/lib/core/src/Cardano/Pool/DB/Model.hs index 032699a5e88..da5e9bb29b8 100644 --- a/lib/core/src/Cardano/Pool/DB/Model.hs +++ b/lib/core/src/Cardano/Pool/DB/Model.hs @@ -60,6 +60,7 @@ module Cardano.Pool.DB.Model , mRollbackTo , mReadCursor , mRemovePools + , mDelistPools , mRemoveRetiredPools , mReadSettings , mPutSettings @@ -82,11 +83,13 @@ import Cardano.Wallet.Primitive.Types , PoolRetirementCertificate (..) , Settings , SlotNo (..) - , StakePoolMetadata + , StakePoolMetadata (..) , StakePoolMetadataHash , StakePoolMetadataUrl , defaultSettings ) +import Control.Monad + ( forM_ ) import Control.Monad.Trans.Class ( lift ) import Control.Monad.Trans.State.Strict @@ -414,6 +417,13 @@ mRollbackTo ti point = do | point' <= getPoint point = Just v | otherwise = Nothing +mDelistPools :: [PoolId] -> ModelOp () +mDelistPools poolsToDelist = + forM_ poolsToDelist $ \pool -> do + mhash <- (>>= (fmap snd . poolMetadata . snd)) <$> mReadPoolRegistration pool + forM_ mhash $ \hash -> modify #metadata + $ Map.adjust (\m -> m { delisted = True }) hash + mRemovePools :: [PoolId] -> ModelOp () mRemovePools poolsToRemove = do modify #distributions diff --git a/lib/core/src/Cardano/Pool/DB/Sqlite.hs b/lib/core/src/Cardano/Pool/DB/Sqlite.hs index b1245150a9b..2503c208057 100644 --- a/lib/core/src/Cardano/Pool/DB/Sqlite.hs +++ b/lib/core/src/Cardano/Pool/DB/Sqlite.hs @@ -60,7 +60,7 @@ import Cardano.Wallet.Primitive.Types ( BlockHeader (..) , CertificatePublicationTime (..) , EpochNo (..) - , PoolId + , PoolId (..) , PoolLifeCycleStatus (..) , PoolRegistrationCertificate (..) , PoolRetirementCertificate (..) @@ -89,13 +89,15 @@ import Data.Functor import Data.Generics.Internal.VL.Lens ( view ) import Data.List - ( foldl' ) + ( foldl', intercalate ) import Data.Map.Strict ( Map ) import Data.Quantity ( Percentage (..), Quantity (..) ) import Data.Ratio ( denominator, numerator, (%) ) +import Data.String.Interpolate + ( i ) import Data.String.QQ ( s ) import Data.Text @@ -115,6 +117,7 @@ import Database.Persist.Sql , fromPersistValue , insertMany_ , insert_ + , rawExecute , rawSql , repsert , selectFirst @@ -139,6 +142,7 @@ import Cardano.Pool.DB.Sqlite.TH hiding import qualified Cardano.Pool.DB.Sqlite.TH as TH import qualified Cardano.Wallet.Primitive.Types as W +import qualified Data.ByteString.Char8 as B8 import qualified Data.Map.Strict as Map import qualified Data.Text as T import qualified Database.Sqlite as Sqlite @@ -393,10 +397,10 @@ newDBLayer trace fp timeInterpreter = do (PoolMetadataFetchAttempts hash url retryAfter $ retryCount + 1) putPoolMetadata hash metadata = do - let StakePoolMetadata{ticker,name,description,homepage} = metadata + let StakePoolMetadata{ticker,name,description,homepage,delisted} = metadata repsert (PoolMetadataKey hash) - (PoolMetadata hash name ticker description homepage) + (PoolMetadata hash name ticker description homepage delisted) deleteWhere [ PoolFetchAttemptsMetadataHash ==. hash ] removePoolMetadata = @@ -488,6 +492,43 @@ newDBLayer trace fp timeInterpreter = do deleteWhere [ BlockSlot >. point ] -- TODO: remove dangling metadata no longer attached to a pool + delistPools pools = + -- sqlite has a max of 2k variables or so, so we don't want + -- 'IN #{poolList my_pools}' to blow up. + forM_ (listOfK 1000 pools) + $ \kPools -> do + rawExecute + (deleteQueryString kPools) + [] + + where + deleteQueryString my_pools = [i| + UPDATE pool_metadata + SET delisted = 1 + WHERE metadata_hash + IN ( + SELECT metadata_hash + FROM active_pool_registrations + WHERE pool_id + IN #{poolList my_pools} + ); + |] + + poolList :: [PoolId] -> String + poolList pids = + let inner = intercalate ", " + -- pool IDs are strictly ascii, Char8 is safe + . fmap (\x -> "\"" ++ B8.unpack (getPoolId x) ++ "\"") + $ pids + in "( " ++ inner ++ " )" + + listOfK :: Int -> [a] -> [[a]] + listOfK k = go + where + go [] = [] + go xs = let (l, r) = splitAt k xs + in l : go r + removePools = mapM_ $ \pool -> do liftIO $ traceWith trace $ MsgRemovingPool pool deleteWhere [ PoolProductionPoolId ==. pool ] @@ -960,6 +1001,7 @@ fromPoolMeta meta = (poolMetadataHash meta,) $ , name = poolMetadataName meta , description = poolMetadataDescription meta , homepage = poolMetadataHomepage meta + , delisted = poolMetadataDelisted meta } fromSettings diff --git a/lib/core/src/Cardano/Pool/DB/Sqlite/TH.hs b/lib/core/src/Cardano/Pool/DB/Sqlite/TH.hs index a1e4a97a9b9..3f00c457629 100644 --- a/lib/core/src/Cardano/Pool/DB/Sqlite/TH.hs +++ b/lib/core/src/Cardano/Pool/DB/Sqlite/TH.hs @@ -134,6 +134,7 @@ PoolMetadata sql=pool_metadata poolMetadataTicker W.StakePoolTicker sql=ticker poolMetadataDescription Text Maybe sql=description poolMetadataHomepage Text sql=homepage + poolMetadataDelisted Bool sql=delisted Primary poolMetadataHash deriving Show Generic diff --git a/lib/core/src/Cardano/Wallet/Primitive/Types.hs b/lib/core/src/Cardano/Wallet/Primitive/Types.hs index 1325ff90518..9c4b12d8ceb 100644 --- a/lib/core/src/Cardano/Wallet/Primitive/Types.hs +++ b/lib/core/src/Cardano/Wallet/Primitive/Types.hs @@ -640,6 +640,9 @@ data StakePoolMetadata = StakePoolMetadata -- ^ Short description of the stake pool. , homepage :: Text -- ^ Absolute URL for the stake pool's homepage link. + , delisted :: Bool + -- ^ The pool has been delisted from the current SMASH server + -- (e.g. due to non-compliance). This isn't part of the JSON. } deriving (Eq, Ord, Show, Generic) instance FromJSON StakePoolMetadata where @@ -655,7 +658,7 @@ instance FromJSON StakePoolMetadata where homepage <- obj .: "homepage" guard (T.length homepage <= 100) - pure $ StakePoolMetadata{ticker,name,description,homepage} + pure $ StakePoolMetadata{ticker,name,description,homepage,delisted=False} -- | Very short name for a stake pool. newtype StakePoolTicker = StakePoolTicker { unStakePoolTicker :: Text } diff --git a/lib/core/test/unit/Cardano/Pool/DB/Arbitrary.hs b/lib/core/test/unit/Cardano/Pool/DB/Arbitrary.hs index 0fc2a75e8d3..c501053d12e 100644 --- a/lib/core/test/unit/Cardano/Pool/DB/Arbitrary.hs +++ b/lib/core/test/unit/Cardano/Pool/DB/Arbitrary.hs @@ -324,6 +324,7 @@ genStakePoolMetadata (StakePoolMetadataUrl url) = StakePoolMetadata <*> genPrintableText <*> oneof [ pure Nothing, Just <$> genPrintableText ] <*> pure url + <*> pure False genStakePoolTicker :: Gen StakePoolTicker genStakePoolTicker = (StakePoolTicker . T.pack) <$> diff --git a/lib/core/test/unit/Cardano/Pool/DB/Properties.hs b/lib/core/test/unit/Cardano/Pool/DB/Properties.hs index a7a3cfa0da1..afb1312f380 100644 --- a/lib/core/test/unit/Cardano/Pool/DB/Properties.hs +++ b/lib/core/test/unit/Cardano/Pool/DB/Properties.hs @@ -964,6 +964,7 @@ prop_removePools , name = "MOCK" , description = Nothing , homepage = "http://mock.pool/" + , delisted = False } prop_listRegisteredPools diff --git a/lib/core/test/unit/Cardano/Wallet/Api/TypesSpec.hs b/lib/core/test/unit/Cardano/Wallet/Api/TypesSpec.hs index 2e54453d04e..b5edaf6884e 100644 --- a/lib/core/test/unit/Cardano/Wallet/Api/TypesSpec.hs +++ b/lib/core/test/unit/Cardano/Wallet/Api/TypesSpec.hs @@ -1171,6 +1171,7 @@ instance Arbitrary StakePoolMetadata where <*> arbitraryText 50 <*> arbitraryMaybeText 255 <*> arbitraryText 100 + <*> pure False where arbitraryText maxLen = do len <- choose (1, maxLen) diff --git a/nix/.stack.nix/cardano-wallet-core.nix b/nix/.stack.nix/cardano-wallet-core.nix index 73a7a4a37e4..8775f982a5d 100644 --- a/nix/.stack.nix/cardano-wallet-core.nix +++ b/nix/.stack.nix/cardano-wallet-core.nix @@ -86,6 +86,7 @@ (hsPkgs."statistics" or (errorHandler.buildDepError "statistics")) (hsPkgs."stm" or (errorHandler.buildDepError "stm")) (hsPkgs."streaming-commons" or (errorHandler.buildDepError "streaming-commons")) + (hsPkgs."string-interpolate" or (errorHandler.buildDepError "string-interpolate")) (hsPkgs."string-qq" or (errorHandler.buildDepError "string-qq")) (hsPkgs."template-haskell" or (errorHandler.buildDepError "template-haskell")) (hsPkgs."text" or (errorHandler.buildDepError "text")) From 29002f8c41ce5852ea93ba5ca0be63ed8b10b2c6 Mon Sep 17 00:00:00 2001 From: Julian Ospald Date: Fri, 16 Oct 2020 11:10:39 +0200 Subject: [PATCH 2/8] Add delisted to swagger.yaml --- specifications/api/swagger.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/specifications/api/swagger.yaml b/specifications/api/swagger.yaml index ae55c6c1abb..13125861782 100644 --- a/specifications/api/swagger.yaml +++ b/specifications/api/swagger.yaml @@ -775,6 +775,8 @@ x-stakePoolMetadata: &stakePoolMetadata type: string format: uri example: https://iohk.io + delisted: + type: boolean x-stakePoolRetirement: &stakePoolRetirement <<: *epochInfo From bbcb31c94563205c39a5d57abfcbd0f9109b586b Mon Sep 17 00:00:00 2001 From: Julian Ospald Date: Fri, 16 Oct 2020 13:13:24 +0200 Subject: [PATCH 3/8] Add internal_state table --- lib/core/src/Cardano/Pool/DB.hs | 11 +++++++ lib/core/src/Cardano/Pool/DB/MVar.hs | 7 +++++ lib/core/src/Cardano/Pool/DB/Model.hs | 31 ++++++++++++++++--- lib/core/src/Cardano/Pool/DB/Sqlite.hs | 31 +++++++++++++++++-- lib/core/src/Cardano/Pool/DB/Sqlite/TH.hs | 7 +++++ .../src/Cardano/Wallet/DB/Sqlite/Types.hs | 16 +++++++++- .../src/Cardano/Wallet/Primitive/Types.hs | 19 ++++++++++++ 7 files changed, 113 insertions(+), 9 deletions(-) diff --git a/lib/core/src/Cardano/Pool/DB.hs b/lib/core/src/Cardano/Pool/DB.hs index 5d9d3d300f6..eb51834f085 100644 --- a/lib/core/src/Cardano/Pool/DB.hs +++ b/lib/core/src/Cardano/Pool/DB.hs @@ -49,6 +49,8 @@ import Data.Map.Strict ( Map ) import Data.Quantity ( Quantity (..) ) +import Data.Time.Clock.POSIX + ( POSIXTime ) import Data.Word ( Word64 ) import System.Random @@ -254,6 +256,15 @@ data DBLayer m = forall stm. (MonadFail stm, MonadIO stm) => DBLayer -> stm () -- ^ Modify the settings. + , readLastMetadataGC + :: stm POSIXTime + -- ^ Get the last metadata GC time. + + , putLastMetadataGC + :: POSIXTime + -> stm () + -- ^ Set the last metadata GC time. + -- , cleanDB :: stm () -- ^ Clean a database diff --git a/lib/core/src/Cardano/Pool/DB/MVar.hs b/lib/core/src/Cardano/Pool/DB/MVar.hs index f40e7267bce..82772560fb8 100644 --- a/lib/core/src/Cardano/Pool/DB/MVar.hs +++ b/lib/core/src/Cardano/Pool/DB/MVar.hs @@ -33,6 +33,7 @@ import Cardano.Pool.DB.Model , mListRetiredPools , mPutFetchAttempt , mPutHeader + , mPutLastMetadataGC , mPutPoolMetadata , mPutPoolProduction , mPutPoolRegistration @@ -40,6 +41,7 @@ import Cardano.Pool.DB.Model , mPutSettings , mPutStakeDistribution , mReadCursor + , mReadLastMetadataGC , mReadPoolLifeCycleStatus , mReadPoolMetadata , mReadPoolProduction @@ -169,6 +171,11 @@ newDBLayer timeInterpreter = do putSettings = void . alterPoolDB (const Nothing) db . mPutSettings + readLastMetadataGC = readPoolDB db mReadLastMetadataGC + + putLastMetadataGC = + void . alterPoolDB (const Nothing) db . mPutLastMetadataGC + cleanDB = void $ alterPoolDB (const Nothing) db mCleanDatabase diff --git a/lib/core/src/Cardano/Pool/DB/Model.hs b/lib/core/src/Cardano/Pool/DB/Model.hs index da5e9bb29b8..58c0104a35c 100644 --- a/lib/core/src/Cardano/Pool/DB/Model.hs +++ b/lib/core/src/Cardano/Pool/DB/Model.hs @@ -14,8 +14,14 @@ {-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} +{-# LANGUAGE TypeApplications #-} {-# LANGUAGE UndecidableInstances #-} +-- `const` isn't more readable than lambdas. Our language is based on +-- lambda calculus and we shouldn't feel ashamed to use them. They also +-- have different strictness properties. +{-# HLINT ignore "Use const" #-} + -- | -- Copyright: © 2018-2020 IOHK -- License: Apache-2.0 @@ -64,6 +70,8 @@ module Cardano.Pool.DB.Model , mRemoveRetiredPools , mReadSettings , mPutSettings + , mPutLastMetadataGC + , mReadLastMetadataGC ) where import Prelude @@ -82,10 +90,12 @@ import Cardano.Wallet.Primitive.Types , PoolRegistrationCertificate (..) , PoolRetirementCertificate (..) , Settings + , InternalState (..) , SlotNo (..) , StakePoolMetadata (..) , StakePoolMetadataHash , StakePoolMetadataUrl + , defaultInternalState , defaultSettings ) import Control.Monad @@ -112,6 +122,8 @@ import Data.Ord ( Down (..) ) import Data.Quantity ( Quantity (..) ) +import Data.Time.Clock.POSIX + ( POSIXTime ) import Data.Word ( Word64 ) import GHC.Generics @@ -159,6 +171,10 @@ data PoolDatabase = PoolDatabase -- ^ Store headers during syncing , settings :: Settings + + , internalState :: InternalState + -- ^ Various internal states that need to persist across + -- wallet restarts. } deriving (Generic, Show, Eq) data SystemSeed @@ -176,7 +192,7 @@ instance Eq SystemSeed where emptyPoolDatabase :: PoolDatabase emptyPoolDatabase = PoolDatabase mempty mempty mempty mempty mempty mempty mempty NotSeededYet - mempty defaultSettings + mempty defaultSettings defaultInternalState {------------------------------------------------------------------------------- Model Operation Types @@ -458,15 +474,20 @@ mReadSettings :: ModelOp Settings mReadSettings = get #settings --- `const` isn't more readable than lambdas. Our language is based on --- lambda calculus and we shouldn't feel ashamed to use them. They also --- have different strictness properties. -{- HLINT ignore mPutSettings "Use const" -} mPutSettings :: Settings -> ModelOp () mPutSettings s = modify #settings (\_ -> s) +mReadLastMetadataGC + :: ModelOp POSIXTime +mReadLastMetadataGC = get (#internalState . #lastMetadataGC) + +mPutLastMetadataGC + :: POSIXTime + -> ModelOp () +mPutLastMetadataGC t = modify (#internalState . #lastMetadataGC) (\_ -> t) + -------------------------------------------------------------------------------- -- Utilities -------------------------------------------------------------------------------- diff --git a/lib/core/src/Cardano/Pool/DB/Sqlite.hs b/lib/core/src/Cardano/Pool/DB/Sqlite.hs index 2503c208057..9317df8801f 100644 --- a/lib/core/src/Cardano/Pool/DB/Sqlite.hs +++ b/lib/core/src/Cardano/Pool/DB/Sqlite.hs @@ -50,6 +50,8 @@ import Cardano.Pool.DB ( DBLayer (..), ErrPointAlreadyExists (..), determinePoolLifeCycleStatus ) import Cardano.Pool.DB.Log ( ParseFailure (..), PoolDbLog (..) ) +import Cardano.Pool.DB.Sqlite.TH hiding + ( BlockHeader, blockHeight ) import Cardano.Wallet.DB.Sqlite.Types ( BlockId (..) ) import Cardano.Wallet.Logging @@ -66,6 +68,7 @@ import Cardano.Wallet.Primitive.Types , PoolRetirementCertificate (..) , StakePoolMetadata (..) , StakePoolMetadataHash + , defaultInternalState , defaultSettings ) import Cardano.Wallet.Unsafe @@ -123,7 +126,9 @@ import Database.Persist.Sql , selectFirst , selectList , toPersistValue + , update , (<.) + , (=.) , (==.) , (>.) , (>=.) @@ -137,9 +142,6 @@ import System.FilePath import System.Random ( newStdGen ) -import Cardano.Pool.DB.Sqlite.TH hiding - ( BlockHeader, blockHeight ) - import qualified Cardano.Pool.DB.Sqlite.TH as TH import qualified Cardano.Wallet.Primitive.Types as W import qualified Data.ByteString.Char8 as B8 @@ -581,6 +583,23 @@ newDBLayer trace fp timeInterpreter = do (SettingsKey 1) . toSettings + readLastMetadataGC = do + -- only ever read the first row + result <- selectFirst + [] + [Asc InternalStateId, LimitTo 1] + case result of + Nothing -> pure . W.lastMetadataGC $ defaultInternalState + Just x -> pure . W.lastMetadataGC . fromInternalState . entityVal $ x + + putLastMetadataGC utc = do + result <- selectFirst + [ InternalStateId ==. (InternalStateKey 1) ] + [ ] + case result of + Just _ -> update (InternalStateKey 1) [ LastGCMetadata =. utc ] + Nothing -> insert_ (InternalState utc) + cleanDB = do deleteWhere ([] :: [Filter PoolProduction]) deleteWhere ([] :: [Filter PoolOwner]) @@ -591,6 +610,7 @@ newDBLayer trace fp timeInterpreter = do deleteWhere ([] :: [Filter PoolMetadataFetchAttempts]) deleteWhere ([] :: [Filter TH.BlockHeader]) deleteWhere ([] :: [Filter Settings]) + deleteWhere ([] :: [Filter InternalState]) atomically :: forall a. (SqlPersistT IO a -> IO a) atomically = runQuery @@ -1014,3 +1034,8 @@ toSettings -> Settings toSettings (W.Settings pms) = Settings pms +fromInternalState + :: InternalState + -> W.InternalState +fromInternalState (InternalState utc) = W.InternalState utc + diff --git a/lib/core/src/Cardano/Pool/DB/Sqlite/TH.hs b/lib/core/src/Cardano/Pool/DB/Sqlite/TH.hs index 3f00c457629..a2eab6ea723 100644 --- a/lib/core/src/Cardano/Pool/DB/Sqlite/TH.hs +++ b/lib/core/src/Cardano/Pool/DB/Sqlite/TH.hs @@ -28,6 +28,8 @@ import Data.Text ( Text ) import Data.Time.Clock ( UTCTime ) +import Data.Time.Clock.POSIX + ( POSIXTime ) import Data.Word ( Word32, Word64, Word8 ) import Database.Persist.Class @@ -49,6 +51,11 @@ share ] [persistLowerCase| +InternalState sql=internal_state + lastGCMetadata POSIXTime sql=last_gc_metadata + + deriving Show Generic + Settings sql=settings settingsPoolMetadataSource W.PoolMetadataSource sql=metadata_source diff --git a/lib/core/src/Cardano/Wallet/DB/Sqlite/Types.hs b/lib/core/src/Cardano/Wallet/DB/Sqlite/Types.hs index f2426a33198..6ea0a5117ac 100644 --- a/lib/core/src/Cardano/Wallet/DB/Sqlite/Types.hs +++ b/lib/core/src/Cardano/Wallet/DB/Sqlite/Types.hs @@ -86,12 +86,14 @@ import Data.Text.Class ) import Data.Text.Encoding ( decodeUtf8, encodeUtf8 ) +import Data.Time.Clock.POSIX + (utcTimeToPOSIXSeconds, POSIXTime, posixSecondsToUTCTime ) import Data.Word ( Word32, Word64 ) import Data.Word.Odd ( Word31 ) import Database.Persist.Sqlite - ( PersistField (..), PersistFieldSql (..), PersistValue ) + ( PersistField (..), PersistFieldSql (..), PersistValue (..) ) import Database.Persist.TH ( MkPersistSettings (..), sqlSettings ) import GHC.Generics @@ -657,3 +659,15 @@ instance PersistField DerivationPrefix where instance PersistFieldSql DerivationPrefix where sqlType _ = sqlType (Proxy @Text) + + +---------------------------------------------------------------------------- +-- Other + +instance PersistField POSIXTime where + toPersistValue = PersistUTCTime . posixSecondsToUTCTime + fromPersistValue (PersistUTCTime utc) = Right . utcTimeToPOSIXSeconds $ utc + fromPersistValue _ = Left "Could not convert to unknown construtctor POSIX seconds" + +instance PersistFieldSql POSIXTime where + sqlType _ = sqlType (Proxy @Word64) diff --git a/lib/core/src/Cardano/Wallet/Primitive/Types.hs b/lib/core/src/Cardano/Wallet/Primitive/Types.hs index 9c4b12d8ceb..b679cfc071c 100644 --- a/lib/core/src/Cardano/Wallet/Primitive/Types.hs +++ b/lib/core/src/Cardano/Wallet/Primitive/Types.hs @@ -185,6 +185,10 @@ module Cardano.Wallet.Primitive.Types , PoolMetadataSource( .. ) , defaultSettings , unsafeToPMS + + -- * InternalState + , InternalState (..) + , defaultInternalState ) where import Prelude @@ -247,6 +251,8 @@ import Data.Text.Class ) import Data.Time.Clock ( NominalDiffTime, UTCTime ) +import Data.Time.Clock.POSIX + ( POSIXTime ) import Data.Time.Format ( defaultTimeLocale, formatTime ) import Data.Word @@ -1972,6 +1978,19 @@ defaultSettings = Settings { poolMetadataSource = FetchNone } +-- | Various internal states of he pool DB +-- that need to survive wallet restarts. These aren't +-- exposed settings. +{-# HLINT ignore InternalState "Use newtype instead of data" #-} +data InternalState = InternalState + { lastMetadataGC :: POSIXTime + } deriving (Generic, Show, Eq) + +defaultInternalState :: InternalState +defaultInternalState = InternalState { + lastMetadataGC = (fromIntegral @Int 0) +} + instance FromJSON PoolMetadataSource where parseJSON = parseJSON >=> either (fail . show . ShowFmt) pure . fromText From 8b3df49652c06bcf26356efee27b1425c614d6e8 Mon Sep 17 00:00:00 2001 From: Julian Ospald Date: Fri, 16 Oct 2020 16:01:12 +0200 Subject: [PATCH 4/8] Add GC worker thread for delisting Pools --- lib/core/src/Cardano/Pool/DB/Model.hs | 3 +- lib/core/src/Cardano/Pool/DB/Sqlite.hs | 1 + lib/core/src/Cardano/Pool/Metadata.hs | 67 ++++++++++++- .../src/Cardano/Wallet/DB/Sqlite/Types.hs | 2 +- lib/shelley/cardano-wallet.cabal | 1 + lib/shelley/src/Cardano/Wallet/Shelley.hs | 3 +- .../src/Cardano/Wallet/Shelley/Pools.hs | 93 ++++++++++++++++--- nix/.stack.nix/cardano-wallet.nix | 1 + 8 files changed, 150 insertions(+), 21 deletions(-) diff --git a/lib/core/src/Cardano/Pool/DB/Model.hs b/lib/core/src/Cardano/Pool/DB/Model.hs index 58c0104a35c..f03d13947b4 100644 --- a/lib/core/src/Cardano/Pool/DB/Model.hs +++ b/lib/core/src/Cardano/Pool/DB/Model.hs @@ -14,7 +14,6 @@ {-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE ScopedTypeVariables #-} -{-# LANGUAGE TypeApplications #-} {-# LANGUAGE UndecidableInstances #-} -- `const` isn't more readable than lambdas. Our language is based on @@ -84,13 +83,13 @@ import Cardano.Wallet.Primitive.Types ( BlockHeader (..) , CertificatePublicationTime , EpochNo (..) + , InternalState (..) , PoolId , PoolLifeCycleStatus (..) , PoolOwner (..) , PoolRegistrationCertificate (..) , PoolRetirementCertificate (..) , Settings - , InternalState (..) , SlotNo (..) , StakePoolMetadata (..) , StakePoolMetadataHash diff --git a/lib/core/src/Cardano/Pool/DB/Sqlite.hs b/lib/core/src/Cardano/Pool/DB/Sqlite.hs index 9317df8801f..fd96b343605 100644 --- a/lib/core/src/Cardano/Pool/DB/Sqlite.hs +++ b/lib/core/src/Cardano/Pool/DB/Sqlite.hs @@ -494,6 +494,7 @@ newDBLayer trace fp timeInterpreter = do deleteWhere [ BlockSlot >. point ] -- TODO: remove dangling metadata no longer attached to a pool + delistPools [] = pure () delistPools pools = -- sqlite has a max of 2k variables or so, so we don't want -- 'IN #{poolList my_pools}' to blow up. diff --git a/lib/core/src/Cardano/Pool/Metadata.hs b/lib/core/src/Cardano/Pool/Metadata.hs index 45054ce9c96..50edf597dee 100644 --- a/lib/core/src/Cardano/Pool/Metadata.hs +++ b/lib/core/src/Cardano/Pool/Metadata.hs @@ -16,6 +16,7 @@ module Cardano.Pool.Metadata -- * Fetch fetchFromRemote , StakePoolMetadataFetchLog (..) + , fetchDelistedPools -- * Construct URLs , identityUrlBuilder @@ -32,6 +33,8 @@ import Cardano.BM.Data.Severity ( Severity (..) ) import Cardano.BM.Data.Tracer ( HasPrivacyAnnotation (..), HasSeverityAnnotation (..) ) +import Cardano.Wallet.Api.Types + ( ApiT (..) ) import Cardano.Wallet.Primitive.AddressDerivation ( hex ) import Cardano.Wallet.Primitive.Types @@ -70,6 +73,7 @@ import Network.HTTP.Client ( HttpException (..) , Manager , ManagerSettings + , brConsume , brReadSome , managerResponseTimeout , requestFromURI @@ -83,6 +87,7 @@ import Network.HTTP.Types.Status import Network.URI ( URI (..), parseURI, pathSegments ) +import qualified Data.ByteString as BS import qualified Data.ByteString.Char8 as B8 import qualified Data.ByteString.Lazy as BL import qualified Data.Text as T @@ -130,6 +135,45 @@ registryUrlBuilder baseUrl pid _ (StakePoolMetadataHash bytes) = hashStr = T.unpack $ T.decodeUtf8 $ convertToBase Base16 bytes pidStr = T.unpack $ toText pid +fetchDelistedPools + :: Tracer IO StakePoolMetadataFetchLog + -> URI + -> Manager + -> IO (Maybe [PoolId]) +fetchDelistedPools tr uri manager = runExceptTLog $ do + pl <- getPoolsPayload + except . (fmap . fmap) getApiT . eitherDecodeStrict @[ApiT PoolId] $ pl + where + getPoolsPayload :: ExceptT String IO ByteString + getPoolsPayload = do + req <- withExceptT show $ except $ requestFromURI uri + liftIO $ traceWith tr $ MsgFetchDelistedPools uri + ExceptT + $ handle fromIOException + $ handle fromHttpException + $ withResponse req manager $ \res -> do + case responseStatus res of + s | s == status200 -> do + let body = responseBody res + Right . BS.concat <$> brConsume body + + s -> do + pure $ Left $ "The server replied something unexpected: " <> show s + + runExceptTLog + :: ExceptT String IO [PoolId] + -> IO (Maybe [PoolId]) + runExceptTLog action = runExceptT action >>= \case + Left msg -> + Nothing <$ traceWith tr (MsgFetchDelistedPoolsFailure msg) + + Right meta -> + Just meta <$ traceWith tr (MsgFetchDelistedPoolsSuccess meta) + + fromHttpException :: Monad m => HttpException -> m (Either String a) + fromHttpException = return . Left . ("HTTp Exception exception: " <>) . show + +-- TODO: refactor/simplify this fetchFromRemote :: Tracer IO StakePoolMetadataFetchLog -> [ PoolId @@ -207,17 +251,21 @@ fetchFromRemote tr builders manager pid url hash = runExceptTLog $ do s -> do pure $ Left $ "The server replied something unexpected: " <> show s - fromIOException :: Monad m => IOException -> m (Either String a) - fromIOException = return . Left . ("IO exception: " <>) . show - fromHttpException :: Monad m => HttpException -> m (Either String (Maybe a)) fromHttpException = const (return $ Right Nothing) +fromIOException :: Monad m => IOException -> m (Either String a) +fromIOException = return . Left . ("IO exception: " <>) . show + + data StakePoolMetadataFetchLog = MsgFetchPoolMetadata StakePoolMetadataHash URI | MsgFetchPoolMetadataSuccess StakePoolMetadataHash StakePoolMetadata | MsgFetchPoolMetadataFailure StakePoolMetadataHash String | MsgFetchPoolMetadataFallback URI Bool + | MsgFetchDelistedPools URI + | MsgFetchDelistedPoolsFailure String + | MsgFetchDelistedPoolsSuccess [PoolId] deriving (Show, Eq) instance HasPrivacyAnnotation StakePoolMetadataFetchLog @@ -227,6 +275,9 @@ instance HasSeverityAnnotation StakePoolMetadataFetchLog where MsgFetchPoolMetadataSuccess{} -> Info MsgFetchPoolMetadataFailure{} -> Warning MsgFetchPoolMetadataFallback{} -> Warning + MsgFetchDelistedPools{} -> Info + MsgFetchDelistedPoolsFailure{} -> Warning + MsgFetchDelistedPoolsSuccess{} -> Info instance ToText StakePoolMetadataFetchLog where toText = \case @@ -247,3 +298,13 @@ instance ToText StakePoolMetadataFetchLog where then "" else " Falling back using a different strategy." ] + MsgFetchDelistedPools uri -> mconcat + [ "Fetching delisted pools from ", T.pack (show uri) + ] + MsgFetchDelistedPoolsSuccess poolIds -> mconcat + [ "Successfully fetched delisted pools: " + , T.pack (show poolIds) + ] + MsgFetchDelistedPoolsFailure err -> mconcat + [ "Failed to fetch delisted pools: ", T.pack err + ] diff --git a/lib/core/src/Cardano/Wallet/DB/Sqlite/Types.hs b/lib/core/src/Cardano/Wallet/DB/Sqlite/Types.hs index 6ea0a5117ac..28b9a570e54 100644 --- a/lib/core/src/Cardano/Wallet/DB/Sqlite/Types.hs +++ b/lib/core/src/Cardano/Wallet/DB/Sqlite/Types.hs @@ -87,7 +87,7 @@ import Data.Text.Class import Data.Text.Encoding ( decodeUtf8, encodeUtf8 ) import Data.Time.Clock.POSIX - (utcTimeToPOSIXSeconds, POSIXTime, posixSecondsToUTCTime ) + ( POSIXTime, posixSecondsToUTCTime, utcTimeToPOSIXSeconds ) import Data.Word ( Word32, Word64 ) import Data.Word.Odd diff --git a/lib/shelley/cardano-wallet.cabal b/lib/shelley/cardano-wallet.cabal index 9859983cefc..93b2328bfeb 100644 --- a/lib/shelley/cardano-wallet.cabal +++ b/lib/shelley/cardano-wallet.cabal @@ -63,6 +63,7 @@ library , memory , network , network-mux + , network-uri , optparse-applicative , ouroboros-consensus , ouroboros-consensus-byron diff --git a/lib/shelley/src/Cardano/Wallet/Shelley.hs b/lib/shelley/src/Cardano/Wallet/Shelley.hs index b6620e4c79b..68f3126bf22 100644 --- a/lib/shelley/src/Cardano/Wallet/Shelley.hs +++ b/lib/shelley/src/Cardano/Wallet/Shelley.hs @@ -352,7 +352,8 @@ serveWallet forM_ settings $ atomically . putSettings void $ forkFinally (monitorStakePools tr gp nl db) onExit - spl <- newStakePoolLayer nl db $ forkFinally (monitorMetadata tr gp db) onExit + spl <- newStakePoolLayer nl db + $ forkFinally (monitorMetadata poolsEngineTracer tr gp db) onExit action spl where tr = contramap (MsgFromWorker mempty) poolsEngineTracer diff --git a/lib/shelley/src/Cardano/Wallet/Shelley/Pools.hs b/lib/shelley/src/Cardano/Wallet/Shelley/Pools.hs index e060005988d..be888663656 100644 --- a/lib/shelley/src/Cardano/Wallet/Shelley/Pools.hs +++ b/lib/shelley/src/Cardano/Wallet/Shelley/Pools.hs @@ -42,6 +42,7 @@ import Cardano.Pool.DB import Cardano.Pool.Metadata ( StakePoolMetadataFetchLog , defaultManagerSettings + , fetchDelistedPools , fetchFromRemote , identityUrlBuilder , newManager @@ -93,6 +94,8 @@ import Cardano.Wallet.Primitive.Types , getPoolRetirementCertificate , unSmashServer ) +import Cardano.Wallet.Registry + ( WorkerLog, defaultWorkerAfter ) import Cardano.Wallet.Shelley.Compatibility ( Shelley , StandardCrypto @@ -106,9 +109,9 @@ import Cardano.Wallet.Shelley.Network import Cardano.Wallet.Unsafe ( unsafeMkPercentage ) import Control.Concurrent - ( threadDelay ) + ( forkFinally, threadDelay ) import Control.Exception - ( SomeException (..), bracket, mask_, try ) + ( SomeException (..), bracket, finally, mask_, try ) import Control.Monad ( forM, forM_, forever, void, when, (<=<) ) import Control.Monad.IO.Class @@ -134,13 +137,15 @@ import Data.Map import Data.Map.Merge.Strict ( dropMissing, traverseMissing, zipWithAMatched, zipWithMatched ) import Data.Maybe - ( catMaybes ) + ( catMaybes, fromMaybe ) import Data.Ord ( Down (..) ) import Data.Quantity ( Percentage (..), Quantity (..) ) import Data.Set ( Set ) +import Data.Text + ( Text ) import Data.Text.Class ( ToText (..) ) import Data.Tuple.Extra @@ -153,6 +158,8 @@ import GHC.Conc ( TVar, ThreadId, killThread, newTVarIO, readTVarIO, writeTVar ) import GHC.Generics ( Generic ) +import Network.URI + ( URI (..) ) import Ouroboros.Consensus.Cardano.Block ( CardanoBlock, HardForkBlock (..) ) import System.Random @@ -164,6 +171,8 @@ import qualified Data.List.NonEmpty as NE import qualified Data.Map.Merge.Strict as Map import qualified Data.Map.Strict as Map import qualified Data.Set as Set +import Data.Time.Clock.POSIX + ( getPOSIXTime, posixDayLength ) import qualified GHC.Conc as STM -- @@ -682,24 +691,45 @@ monitorStakePools tr gp nl DBLayer{..} = -- | Worker thread that monitors pool metadata and syncs it to the database. monitorMetadata - :: Tracer IO StakePoolLog + :: Tracer IO (WorkerLog Text StakePoolLog) + -> Tracer IO StakePoolLog -> GenesisParameters -> DBLayer IO -> IO () -monitorMetadata tr gp DBLayer{..} = do +monitorMetadata tr' tr gp db@(DBLayer{..}) = do settings <- atomically readSettings manager <- newManager defaultManagerSettings + let fetcher fetchStrategies = fetchFromRemote trFetch fetchStrategies manager - forever $ do - (refs, successes) <- case poolMetadataSource settings of - FetchNone -> pure ([], []) - FetchDirect -> fetchThem $ fetcher [identityUrlBuilder] - FetchSMASH (unSmashServer -> uri) -> fetchThem $ fetcher [registryUrlBuilder uri] - - when (null refs || null successes) $ do - traceWith tr $ MsgFetchTakeBreak blockFrequency - threadDelay blockFrequency + loop getPoolMetadata = forever $ do + (refs, successes) <- getPoolMetadata + when (null refs || null successes) $ do + traceWith tr $ MsgFetchTakeBreak blockFrequency + threadDelay blockFrequency + + case poolMetadataSource settings of + FetchNone -> loop (pure ([], [])) -- TODO: exit loop? + FetchDirect -> loop (fetchThem $ fetcher [identityUrlBuilder]) + FetchSMASH (unSmashServer -> uri) -> do + tid <- + forkFinally + (gcDelistedPools tr db + (fetchDelistedPools trFetch (toDelistedPoolsURI uri) manager) + ) + onExit + flip finally (killThread tid) $ + loop (fetchThem $ fetcher [registryUrlBuilder uri]) + where + -- Currently the SMASH url points to the full API path, e.g. + -- https://smash.cardano-testnet.iohkdev.io/api/v1/monitorMetadata + -- so we need to recover/infer the delisted pools url. + -- TODO: + -- - require the smash url to only specify sheme and host + -- - use smash servant types to call the endpoints + toDelistedPoolsURI uri = + uri { uriPath = "/api/v1/delisted" , uriQuery = "", uriFragment = "" } + trFetch = contramap MsgFetchPoolMetadata tr -- We mask this entire section just in case, although the database -- operations runs masked anyway. Unfortunately we cannot run @@ -723,6 +753,34 @@ monitorMetadata tr gp DBLayer{..} = do toMicroSecond = (`div` 1000000) . fromEnum slotLength = unSlotLength $ getSlotLength gp f = unActiveSlotCoefficient (getActiveSlotCoefficient gp) + onExit = defaultWorkerAfter tr' + +gcDelistedPools + :: Tracer IO StakePoolLog + -> DBLayer IO + -> IO (Maybe [PoolId]) -- ^ delisted pools fetcher + -> IO () +gcDelistedPools tr DBLayer{..} fetchDelisted = forever $ do + lastGC <- atomically readLastMetadataGC + currentTime <- getPOSIXTime + + let timeSinceLastGC = currentTime - lastGC + sixHours = posixDayLength / 4 + if timeSinceLastGC > sixHours + then do + delistedPools <- fmap (fromMaybe []) fetchDelisted + atomically $ do + putLastMetadataGC currentTime + delistPools delistedPools + else do + -- Sleep for 60 seconds. This is useful in case + -- something else is modifying the last sync time + -- in the database. + let sec_to_milisec = (* 1000000) + sleep_time = sec_to_milisec 60 + traceWith tr $ MsgGCTakeBreak sleep_time + threadDelay sleep_time + pure () data StakePoolLog = MsgFollow FollowLog @@ -736,6 +794,7 @@ data StakePoolLog | MsgErrProduction ErrPointAlreadyExists | MsgFetchPoolMetadata StakePoolMetadataFetchLog | MsgFetchTakeBreak Int + | MsgGCTakeBreak Int deriving (Show, Eq) data PoolGarbageCollectionInfo = PoolGarbageCollectionInfo @@ -763,6 +822,7 @@ instance HasSeverityAnnotation StakePoolLog where MsgErrProduction{} -> Error MsgFetchPoolMetadata e -> getSeverityAnnotation e MsgFetchTakeBreak{} -> Debug + MsgGCTakeBreak{} -> Debug instance ToText StakePoolLog where toText = \case @@ -805,3 +865,8 @@ instance ToText StakePoolLog where , "back to it in about " , pretty (fixedF 1 (toRational delay / 1000000)), "s" ] + MsgGCTakeBreak delay -> mconcat + [ "Taking a little break from GCing delisted metadata pools, " + , "back to it in about " + , pretty (fixedF 1 (toRational delay / 1000000)), "s" + ] diff --git a/nix/.stack.nix/cardano-wallet.nix b/nix/.stack.nix/cardano-wallet.nix index 483d54af02f..f1091953b36 100644 --- a/nix/.stack.nix/cardano-wallet.nix +++ b/nix/.stack.nix/cardano-wallet.nix @@ -60,6 +60,7 @@ (hsPkgs."memory" or (errorHandler.buildDepError "memory")) (hsPkgs."network" or (errorHandler.buildDepError "network")) (hsPkgs."network-mux" or (errorHandler.buildDepError "network-mux")) + (hsPkgs."network-uri" or (errorHandler.buildDepError "network-uri")) (hsPkgs."optparse-applicative" or (errorHandler.buildDepError "optparse-applicative")) (hsPkgs."ouroboros-consensus" or (errorHandler.buildDepError "ouroboros-consensus")) (hsPkgs."ouroboros-consensus-byron" or (errorHandler.buildDepError "ouroboros-consensus-byron")) From 2ea4ace92e2a4e661a8f27a4e1dc9305fba54541 Mon Sep 17 00:00:00 2001 From: Julian Ospald Date: Sat, 17 Oct 2020 13:16:15 +0200 Subject: [PATCH 5/8] Return GC sync time as well from ListStakePools --- lib/core/src/Cardano/Wallet/Api.hs | 3 +- lib/core/src/Cardano/Wallet/Api/Client.hs | 3 +- lib/core/src/Cardano/Wallet/Api/Types.hs | 18 +++++++++++- .../test/unit/Cardano/Wallet/Api/TypesSpec.hs | 11 +++++++ .../Cardano/Wallet/Jormungandr/Api/Server.hs | 8 +++-- .../Cardano/Wallet/Jormungandr/ApiSpec.hs | 11 +++++++ .../src/Cardano/Wallet/Shelley/Pools.hs | 14 +++++---- specifications/api/swagger.yaml | 29 ++++++++++++++++--- 8 files changed, 81 insertions(+), 16 deletions(-) diff --git a/lib/core/src/Cardano/Wallet/Api.hs b/lib/core/src/Cardano/Wallet/Api.hs index 7383a951e28..7a50bd1be5a 100644 --- a/lib/core/src/Cardano/Wallet/Api.hs +++ b/lib/core/src/Cardano/Wallet/Api.hs @@ -117,6 +117,7 @@ import Cardano.Wallet.Api.Types , ApiByronWallet , ApiCoinSelectionT , ApiFee + , ApiListStakePools , ApiNetworkClock , ApiNetworkInformation , ApiNetworkParameters @@ -403,7 +404,7 @@ type StakePools n apiPool = -- | https://input-output-hk.github.io/cardano-wallet/api/edge/#operation/listStakePools type ListStakePools apiPool = "stake-pools" :> QueryParam "stake" (ApiT Coin) - :> Get '[JSON] [apiPool] + :> Get '[JSON] (ApiListStakePools apiPool) -- | https://input-output-hk.github.io/cardano-wallet/api/#operation/joinStakePool type JoinStakePool n = "stake-pools" diff --git a/lib/core/src/Cardano/Wallet/Api/Client.hs b/lib/core/src/Cardano/Wallet/Api/Client.hs index c8c11b5c160..4526562c616 100644 --- a/lib/core/src/Cardano/Wallet/Api/Client.hs +++ b/lib/core/src/Cardano/Wallet/Api/Client.hs @@ -64,6 +64,7 @@ import Cardano.Wallet.Api.Types , ApiByronWallet , ApiCoinSelectionT , ApiFee + , ApiListStakePools , ApiNetworkClock , ApiNetworkInformation (..) , ApiNetworkParameters @@ -189,7 +190,7 @@ data AddressClient = AddressClient data StakePoolClient apiPool = StakePoolClient { listPools - :: Maybe (ApiT Coin) -> ClientM [apiPool] + :: Maybe (ApiT Coin) -> ClientM (ApiListStakePools apiPool) , joinStakePool :: ApiPoolId -> ApiT WalletId diff --git a/lib/core/src/Cardano/Wallet/Api/Types.hs b/lib/core/src/Cardano/Wallet/Api/Types.hs index bb6f82aa78f..fd6b727692b 100644 --- a/lib/core/src/Cardano/Wallet/Api/Types.hs +++ b/lib/core/src/Cardano/Wallet/Api/Types.hs @@ -42,6 +42,7 @@ module Cardano.Wallet.Api.Types -- * API Types , ApiAddress (..) + , ApiListStakePools (..) , ApiCertificate (..) , ApiEpochInfo (..) , ApiSelectCoinsData (..) @@ -372,6 +373,11 @@ fmtAllowedWords = API Types -------------------------------------------------------------------------------} +data ApiListStakePools apiPool = ApiListStakePools + { pools :: [apiPool] + , lastGC :: !(Maybe (ApiT Iso8601Time)) + } deriving (Eq, Generic, Show) + data ApiAddress (n :: NetworkDiscriminant) = ApiAddress { id :: !(ApiT Address, Proxy n) , state :: !(ApiT AddressState) @@ -721,7 +727,6 @@ data ApiPostRandomAddressData = ApiPostRandomAddressData , addressIndex :: !(Maybe (ApiT (Index 'AD.Hardened 'AddressK))) } deriving (Eq, Generic, Show) - data ApiWalletMigrationPostData (n :: NetworkDiscriminant) (s :: Symbol) = ApiWalletMigrationPostData { passphrase :: !(ApiT (Passphrase s)) @@ -811,6 +816,12 @@ instance FromText Iso8601Time where <> "'. Expecting ISO 8601 date-and-time format (basic or extended)" <> ", e.g. 2012-09-25T10:15:00Z." +instance FromJSON (ApiT Iso8601Time) where + parseJSON = + parseJSON >=> eitherToParser . bimap ShowFmt ApiT . fromText +instance ToJSON (ApiT Iso8601Time) where + toJSON = toJSON . toText . getApiT + instance FromHttpApiData Iso8601Time where parseUrlPiece = first (T.pack . getTextDecodingError) . fromText @@ -1242,6 +1253,11 @@ instance FromJSON WalletPutPassphraseData where instance ToJSON WalletPutPassphraseData where toJSON = genericToJSON defaultRecordTypeOptions +instance FromJSON a => FromJSON (ApiListStakePools a) where + parseJSON = genericParseJSON defaultRecordTypeOptions +instance ToJSON a => ToJSON (ApiListStakePools a) where + toJSON = genericToJSON defaultRecordTypeOptions + instance FromJSON ByronWalletPutPassphraseData where parseJSON = genericParseJSON defaultRecordTypeOptions instance ToJSON ByronWalletPutPassphraseData where diff --git a/lib/core/test/unit/Cardano/Wallet/Api/TypesSpec.hs b/lib/core/test/unit/Cardano/Wallet/Api/TypesSpec.hs index b5edaf6884e..1311feb62da 100644 --- a/lib/core/test/unit/Cardano/Wallet/Api/TypesSpec.hs +++ b/lib/core/test/unit/Cardano/Wallet/Api/TypesSpec.hs @@ -53,6 +53,7 @@ import Cardano.Wallet.Api.Types , ApiCoinSelectionInput (..) , ApiEpochInfo (..) , ApiFee (..) + , ApiListStakePools (..) , ApiMnemonicT (..) , ApiNetworkClock (..) , ApiNetworkInformation (..) @@ -319,6 +320,7 @@ spec = do \and match existing golden files" $ do jsonRoundtripAndGolden $ Proxy @(ApiAddress ('Testnet 0)) jsonRoundtripAndGolden $ Proxy @(ApiT DerivationIndex) + jsonRoundtripAndGolden $ Proxy @(ApiListStakePools Api.ApiStakePool) jsonRoundtripAndGolden $ Proxy @ApiEpochInfo jsonRoundtripAndGolden $ Proxy @(ApiSelectCoinsData ('Testnet 0)) jsonRoundtripAndGolden $ Proxy @(ApiCoinSelection ('Testnet 0)) @@ -1148,6 +1150,9 @@ instance Arbitrary PoolId where InfiniteList bytes _ <- arbitrary return $ PoolId $ BS.pack $ take 28 bytes +instance Arbitrary (ApiListStakePools ApiStakePool) where + arbitrary = ApiListStakePools <$> arbitrary <*> arbitrary + instance Arbitrary ApiStakePool where arbitrary = ApiStakePool <$> arbitrary @@ -1711,6 +1716,12 @@ instance ToSchema SettingsPutData where instance ToSchema (ApiT Settings) where declareNamedSchema _ = declareSchemaForDefinition "ApiGetSettings" +instance ToSchema (ApiT Iso8601Time) where + declareNamedSchema _ = declareSchemaForDefinition "ApiLastGC" + +instance ToSchema (Api.ApiListStakePools Api.ApiStakePool) where + declareNamedSchema _ = declareSchemaForDefinition "ApiListStakePools" + instance ToSchema WalletPutPassphraseData where declareNamedSchema _ = declareSchemaForDefinition "ApiWalletPutPassphraseData" diff --git a/lib/jormungandr/src/Cardano/Wallet/Jormungandr/Api/Server.hs b/lib/jormungandr/src/Cardano/Wallet/Jormungandr/Api/Server.hs index 5f1a9ae3b7b..b667a232e81 100644 --- a/lib/jormungandr/src/Cardano/Wallet/Jormungandr/Api/Server.hs +++ b/lib/jormungandr/src/Cardano/Wallet/Jormungandr/Api/Server.hs @@ -92,6 +92,7 @@ import Cardano.Wallet.Api.Server ) import Cardano.Wallet.Api.Types ( ApiErrorCode (..) + , ApiListStakePools (..) , ApiSelectCoinsData (..) , ApiT (..) , SomeByronWalletPostData (..) @@ -314,9 +315,10 @@ listPools => StakePoolLayer e IO -> Maybe (ApiT Coin) -- ^ Not needed, but there for consistency with haskell node. - -> Handler [ApiStakePool] -listPools spl _walletId = - liftHandler $ map (uncurry mkApiStakePool) <$> listStakePools spl + -> Handler (ApiListStakePools ApiStakePool) +listPools spl _walletId = do + ps <- liftHandler $ map (uncurry mkApiStakePool) <$> listStakePools spl + pure (ApiListStakePools ps Nothing) where mkApiStakePool :: StakePool diff --git a/lib/jormungandr/test/unit/Cardano/Wallet/Jormungandr/ApiSpec.hs b/lib/jormungandr/test/unit/Cardano/Wallet/Jormungandr/ApiSpec.hs index ecde489c2f6..0f84a1d1938 100644 --- a/lib/jormungandr/test/unit/Cardano/Wallet/Jormungandr/ApiSpec.hs +++ b/lib/jormungandr/test/unit/Cardano/Wallet/Jormungandr/ApiSpec.hs @@ -81,6 +81,8 @@ import Test.QuickCheck ( Arbitrary (..), Gen, applyArbitrary3, choose, frequency, vector ) import Test.Utils.Paths ( getTestData ) +import Test.Utils.Time + ( genUniformTime ) import qualified Cardano.Wallet.Api.Types as W import qualified Data.Aeson as Aeson @@ -280,6 +282,9 @@ instance Arbitrary ApiStakePoolMetrics where blocks <- Quantity . fromIntegral <$> choose (1::Integer, 22_600_000) pure $ ApiStakePoolMetrics stakes blocks +instance Arbitrary (W.ApiListStakePools ApiStakePool) where + arbitrary = W.ApiListStakePools <$> arbitrary <*> (pure Nothing) + instance Arbitrary ApiStakePool where arbitrary = ApiStakePool <$> arbitrary @@ -329,12 +334,18 @@ instance Arbitrary StakePoolTicker where len <- choose (3, 5) replicateM len arbitrary +instance Arbitrary W.Iso8601Time where + arbitrary = W.Iso8601Time <$> genUniformTime + instance ToSchema ApiStakePool where declareNamedSchema _ = declareSchemaForDefinition "ApiJormungandrStakePool" instance ToSchema ApiStakePoolMetrics where declareNamedSchema _ = declareSchemaForDefinition "ApiJormungandrStakePoolMetrics" +instance ToSchema (W.ApiListStakePools ApiStakePool) where + declareNamedSchema _ = declareSchemaForDefinition "ApiJormungandrListStakePools" + {------------------------------------------------------------------------------- Test data -------------------------------------------------------------------------------} diff --git a/lib/shelley/src/Cardano/Wallet/Shelley/Pools.hs b/lib/shelley/src/Cardano/Wallet/Shelley/Pools.hs index be888663656..abf8d436995 100644 --- a/lib/shelley/src/Cardano/Wallet/Shelley/Pools.hs +++ b/lib/shelley/src/Cardano/Wallet/Shelley/Pools.hs @@ -51,7 +51,7 @@ import Cardano.Pool.Metadata import Cardano.Wallet ( ErrListPools (..) ) import Cardano.Wallet.Api.Types - ( ApiT (..) ) + ( ApiListStakePools (..), ApiT (..), Iso8601Time (..) ) import Cardano.Wallet.Byron.Compatibility ( toByronBlockHeader ) import Cardano.Wallet.Network @@ -148,6 +148,8 @@ import Data.Text ( Text ) import Data.Text.Class ( ToText (..) ) +import Data.Time.Clock.POSIX + ( getPOSIXTime, posixDayLength, posixSecondsToUTCTime ) import Data.Tuple.Extra ( dupe ) import Data.Word @@ -171,8 +173,6 @@ import qualified Data.List.NonEmpty as NE import qualified Data.Map.Merge.Strict as Map import qualified Data.Map.Strict as Map import qualified Data.Set as Set -import Data.Time.Clock.POSIX - ( getPOSIXTime, posixDayLength ) import qualified GHC.Conc as STM -- @@ -198,7 +198,7 @@ data StakePoolLayer = StakePoolLayer :: EpochNo -- Exclude all pools that retired in or before this epoch. -> Coin - -> ExceptT ErrListPools IO [Api.ApiStakePool] + -> ExceptT ErrListPools IO (ApiListStakePools Api.ApiStakePool) , putSettings :: Settings -> IO () @@ -271,7 +271,7 @@ newStakePoolLayer nl db@DBLayer {..} worker = do :: EpochNo -- Exclude all pools that retired in or before this epoch. -> Coin - -> ExceptT ErrListPools IO [Api.ApiStakePool] + -> ExceptT ErrListPools IO (ApiListStakePools Api.ApiStakePool) _listPools currentEpoch userStake = do tip <- withExceptT fromErrCurrentNodeTip $ currentNodeTip nl rawLsqData <- mapExceptT (fmap (first ErrListPoolsNetworkError)) @@ -279,6 +279,7 @@ newStakePoolLayer nl db@DBLayer {..} worker = do let lsqData = combineLsqData rawLsqData dbData <- liftIO $ readPoolDbData db currentEpoch seed <- liftIO $ atomically readSystemSeed + lastGC <- liftIO $ atomically $ readLastMetadataGC r <- liftIO $ try $ sortByReward seed . map snd @@ -291,7 +292,8 @@ newStakePoolLayer nl db@DBLayer {..} worker = do case r of Left e@(PastHorizon{}) -> throwE (ErrListPoolsPastHorizonException e) - Right r' -> pure r' + Right r' -> pure (ApiListStakePools r' + (Just . ApiT . Iso8601Time . posixSecondsToUTCTime $ lastGC)) where fromErrCurrentNodeTip :: ErrCurrentNodeTip -> ErrListPools fromErrCurrentNodeTip = \case diff --git a/specifications/api/swagger.yaml b/specifications/api/swagger.yaml index 13125861782..5aa1262d64d 100644 --- a/specifications/api/swagger.yaml +++ b/specifications/api/swagger.yaml @@ -1162,6 +1162,9 @@ components: type: array items: *certificate + ApiLastGC: &ApiLastGC + <<: *date + ApiStakePool: &ApiStakePool type: object required: @@ -1179,6 +1182,17 @@ components: metadata: *stakePoolMetadata retirement: *stakePoolRetirement + ApiListStakePools: &ApiListStakePools + type: object + required: + - pools + properties: + lastGC: + <<: *ApiLastGC + pools: + type: array + items: *ApiStakePool + ApiJormungandrStakePool: &ApiJormungandrStakePool type: object required: @@ -1199,6 +1213,15 @@ components: saturation: *jormungandrStakePoolSaturation desirability: *stakePoolDesirability + ApiJormungandrListStakePools: &ApiJormungandrListStakePools + type: object + required: + - pools + properties: + pools: + type: array + items: *ApiJormungandrStakePool + ApiFee: &ApiFee type: object required: @@ -2162,11 +2185,9 @@ x-responsesListStakePools: &responsesListStakePools application/json: schema: oneOf: - - type: array - items: *ApiStakePool + - <<: *ApiListStakePools title: "cardano-node stake pools" - - type: array - items: *ApiJormungandrStakePool + - <<: *ApiJormungandrListStakePools title: "jormungandr stake pools" x-responsesJoinStakePool: &responsesJoinStakePool From aeba3ec3b8c3a97f23716f4cbbb0e4d42215e8fa Mon Sep 17 00:00:00 2001 From: Julian Ospald Date: Sat, 17 Oct 2020 15:34:47 +0200 Subject: [PATCH 6/8] Add stake pool maintenance endpoint --- lib/core/src/Cardano/Wallet/Api.hs | 7 + lib/core/src/Cardano/Wallet/Api/Types.hs | 19 + .../Api/ApiListStakePoolsApiStakePool.json | 7668 +++++++++++++++++ .../data/Cardano/Wallet/Api/ApiStakePool.json | 282 +- .../Wallet/Api/ApiTStakePoolMetadata.json | 88 +- .../test/unit/Cardano/Wallet/Api/Malformed.hs | 10 + .../test/unit/Cardano/Wallet/Api/TypesSpec.hs | 12 + .../Cardano/Wallet/Jormungandr/Api/Server.hs | 1 + .../src/Cardano/Wallet/Shelley/Api/Server.hs | 6 + .../src/Cardano/Wallet/Shelley/Pools.hs | 44 +- specifications/api/swagger.yaml | 36 +- 11 files changed, 7960 insertions(+), 213 deletions(-) create mode 100644 lib/core/test/data/Cardano/Wallet/Api/ApiListStakePoolsApiStakePool.json diff --git a/lib/core/src/Cardano/Wallet/Api.hs b/lib/core/src/Cardano/Wallet/Api.hs index 7a50bd1be5a..01f5bd62170 100644 --- a/lib/core/src/Cardano/Wallet/Api.hs +++ b/lib/core/src/Cardano/Wallet/Api.hs @@ -118,6 +118,7 @@ import Cardano.Wallet.Api.Types , ApiCoinSelectionT , ApiFee , ApiListStakePools + , ApiMaintenanceAction , ApiNetworkClock , ApiNetworkInformation , ApiNetworkParameters @@ -192,6 +193,7 @@ import Servant.API.Verbs , Post , PostAccepted , PostCreated + , PostNoContent , Put , PutAccepted , PutNoContent @@ -400,6 +402,7 @@ type StakePools n apiPool = :<|> JoinStakePool n :<|> QuitStakePool n :<|> DelegationFee + :<|> PoolMaintenance -- | https://input-output-hk.github.io/cardano-wallet/api/edge/#operation/listStakePools type ListStakePools apiPool = "stake-pools" @@ -428,6 +431,10 @@ type DelegationFee = "wallets" :> "delegation-fees" :> Get '[JSON] ApiFee +type PoolMaintenance = "stake-pools" + :> ReqBody '[JSON] ApiMaintenanceAction + :> PostNoContent + {------------------------------------------------------------------------------- Settings -------------------------------------------------------------------------------} diff --git a/lib/core/src/Cardano/Wallet/Api/Types.hs b/lib/core/src/Cardano/Wallet/Api/Types.hs index fd6b727692b..000f8f867e8 100644 --- a/lib/core/src/Cardano/Wallet/Api/Types.hs +++ b/lib/core/src/Cardano/Wallet/Api/Types.hs @@ -67,6 +67,8 @@ module Cardano.Wallet.Api.Types , PostExternalTransactionData (..) , ApiTransaction (..) , ApiWithdrawalPostData (..) + , ApiMaintenanceAction (..) + , MaintenanceAction (..) , ApiFee (..) , ApiTxId (..) , ApiTxInput (..) @@ -373,6 +375,13 @@ fmtAllowedWords = API Types -------------------------------------------------------------------------------} +data MaintenanceAction = GcStakePools + deriving (Eq, Generic, Show) + +newtype ApiMaintenanceAction = ApiMaintenanceAction + { maintenanceAction :: MaintenanceAction + } deriving (Eq, Generic, Show) + data ApiListStakePools apiPool = ApiListStakePools { pools :: [apiPool] , lastGC :: !(Maybe (ApiT Iso8601Time)) @@ -1263,6 +1272,16 @@ instance FromJSON ByronWalletPutPassphraseData where instance ToJSON ByronWalletPutPassphraseData where toJSON = genericToJSON defaultRecordTypeOptions +instance FromJSON ApiMaintenanceAction where + parseJSON = genericParseJSON defaultRecordTypeOptions +instance ToJSON ApiMaintenanceAction where + toJSON = genericToJSON defaultRecordTypeOptions + +instance FromJSON MaintenanceAction where + parseJSON = genericParseJSON defaultSumTypeOptions +instance ToJSON MaintenanceAction where + toJSON = genericToJSON defaultSumTypeOptions + instance FromJSON ApiTxId where parseJSON = genericParseJSON defaultRecordTypeOptions instance ToJSON ApiTxId where diff --git a/lib/core/test/data/Cardano/Wallet/Api/ApiListStakePoolsApiStakePool.json b/lib/core/test/data/Cardano/Wallet/Api/ApiListStakePoolsApiStakePool.json new file mode 100644 index 00000000000..e2eeb259c62 --- /dev/null +++ b/lib/core/test/data/Cardano/Wallet/Api/ApiListStakePoolsApiStakePool.json @@ -0,0 +1,7668 @@ +{ + "seed": 1173689658848997361, + "samples": [ + { + "pools": [ + { + "metrics": { + "saturation": 4.901540561655154, + "non_myopic_member_rewards": { + "quantity": 561094230526, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 404472, + "unit": "block" + }, + "relative_stake": { + "quantity": 76.7, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1881-04-06T13:00:00Z", + "epoch_number": 15833 + }, + "cost": { + "quantity": 192, + "unit": "lovelace" + }, + "margin": { + "quantity": 41.31, + "unit": "percent" + }, + "pledge": { + "quantity": 24, + "unit": "lovelace" + }, + "metadata": { + "homepage": ">r󳷣瑾wsNKX󻢢􄂜\u001au]\u001f󂫔񦲦񱌉\"I򑡩󰗔]や(.\u0016󫂪3\u0013>}h}>𔙣\u0005+\u0006\u0016o5g\u000eh󫘚E=𛰣񥰺񇛪\u0006'񻢉L8񝸼t\u001a򷎢'kzT𷛜I\u001e\t󫩻z", + "name": "\u001f㔸wJ𛋊JL\u0004򓅨\u000b", + "ticker": "\u0012񽗚񅈃", + "delisted": false, + "description": "\u0005u,󀱡|Rj\u000b󾒶wᧃ \"\u0011\u0002nu򄈃Pgb70k򫰺\u0005󂺌\u001as\u001b񇟿W\u00189򆄢\u0012򪑯U㘊򞁲\u0014/+񖅡𓇯H񺲐2\u0016*>\u001e󡿍L\u0001/I>􎪊[J\u0006\u000f3I/\u001c\u000f񄕍\u000c_pk$\u000b\u0007Ek\u001d󭻠wG\u001b򗨏!򂮟\u001a򴴎E\nf򠁥򾹺\u0011f􇢿_񥃹ኍh>\u000cE󘇬𗛢)y" + }, + "id": "pool1xm5md6mrte2s4zextf3upzjywgu84xcvvraw6s0mew0ky9dg308" + }, + { + "metrics": { + "saturation": 0.14006311676891758, + "non_myopic_member_rewards": { + "quantity": 856368765897, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 6225718, + "unit": "block" + }, + "relative_stake": { + "quantity": 2.37, + "unit": "percent" + } + }, + "cost": { + "quantity": 181, + "unit": "lovelace" + }, + "margin": { + "quantity": 28.57, + "unit": "percent" + }, + "pledge": { + "quantity": 109, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\u000c78FZW\u0011r񚔖!iA𩏑\u0016TT𙝠4z󥠰V\u0005򳉭\t<뚛@\u0015\u0004(#j\u0012l󡫗oZ𰩉SG\u0000n(򶾎\u0008Ep񼣓", + "name": "\u00180\u0000]_aQ󅠓sR:<򠆃#\u000e\u0019v7X_𪴄k8C񡝽汭K.w`\u0011}2c𳬵(E\u0016t\u000bo\u0001R\u0010|lx\u0017-", + "ticker": "񑂾K^", + "delisted": false, + "description": "\u0008󒛤򍪦򠡤(FJ*󽅯򹫇\u0005H\u000f\u001b{yR9󏾚k\u000bq\u0008B\u0000hUDO󫚘\u0000\r𑭓񶧧{Is|\u0015" + }, + "id": "pool17d66m0qyksx55jrhux9x3hf8a6thnyjxkqkpp6x07j0l76ppe0e" + }, + { + "metrics": { + "saturation": 2.9722685576770158e-2, + "non_myopic_member_rewards": { + "quantity": 339770923441, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 4360051, + "unit": "block" + }, + "relative_stake": { + "quantity": 14.25, + "unit": "percent" + } + }, + "cost": { + "quantity": 48, + "unit": "lovelace" + }, + "margin": { + "quantity": 30.06, + "unit": "percent" + }, + "pledge": { + "quantity": 32, + "unit": "lovelace" + }, + "id": "pool1r22tjt2hvhmg85h768s3egmssv2ylrtxy7vrwxzz4el4yz65k8z" + }, + { + "metrics": { + "saturation": 0.7533042969518716, + "non_myopic_member_rewards": { + "quantity": 476415617299, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 8501854, + "unit": "block" + }, + "relative_stake": { + "quantity": 15.34, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1865-10-23T20:00:00Z", + "epoch_number": 1199 + }, + "cost": { + "quantity": 114, + "unit": "lovelace" + }, + "margin": { + "quantity": 81.67, + "unit": "percent" + }, + "pledge": { + "quantity": 152, + "unit": "lovelace" + }, + "metadata": { + "homepage": "d\u001b`𔊪-\u0000󱌃󐝵򂵻gR@\u001d<#\u0002\u0017\u0005b򐝴𲬲򣕑󚆫Q~󐞸\u0008:󣓳\"mX@\u0015𚴮 I}\u00075Aq^󑦭򅔆dq6𥥶󢳶`\u001a\u001c򮎣񽔸\r\u0003u󙢸_\u0000V􌻸𵾋wY鑻񹌥𥳕񦜌\u0010񱔒$\\3cJ.zE󣄘@]l\u001b񕁊q\u0014\u0000󚕓-]1򑫱qj", + "name": "3sh3Dp\u001f񛻹\u0007𶣆􀨒R麂9챓\u0012|D񁶯񘮯yzS񂣃=[)\u0012\u001bX𸅤񵟋7lu󾙶𼐨yu\u001c\u0004󚊋򥓗B\u001c", + "ticker": "񗅚1\u0005", + "delisted": false, + "description": "l9\u0019\u000f󯊋Z\u000c(iV\u0012ap\u001e\u001f@" + }, + "id": "pool1dyanjfeugapfr83aqqrrfkul3ukd5dy542gcszwa0gxmzmn5e5t" + }, + { + "metrics": { + "saturation": 1.6819066447284063, + "non_myopic_member_rewards": { + "quantity": 142645550853, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 4260501, + "unit": "block" + }, + "relative_stake": { + "quantity": 91.93, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1898-08-11T08:00:00Z", + "epoch_number": 9954 + }, + "cost": { + "quantity": 65, + "unit": "lovelace" + }, + "margin": { + "quantity": 49.89, + "unit": "percent" + }, + "pledge": { + "quantity": 233, + "unit": "lovelace" + }, + "metadata": { + "homepage": "z\r\u001b.0-)2@񁠮", + "name": ".8`S򸗳\u0006p󳈉j;s򮐢\u0003'񣠦", + "ticker": "\\Y\u001d", + "delisted": false, + "description": "󫎯\u0014\u001d󟝾*_Y9򙷙󲚑%󲘂􉨲7򷻬\u001d򝺃I)􃶒U3 dO챕E񐵱d\u0004񭣦hw򱦶V`a.$B]\u0015\u001dh\u000e򦟶􃀫񭅇\u001a4FyO򽹗D𰡇1󞢪򵈣𗜇m/򦷆M󛱳gM7𗂉\u0014򿺄!\u0014<𩮱󔇢򋛻\u0005􁫃D\u0012󩔥⡣\\򑿼hk\u0002+UC\n6e`\u0006(c-񗖰\u001e𑙨P󒿹p򌁢_򁧿`\"\u0003񀬣$)\u0018q񫬷\u001aA\u0008C򼶔𥢵\u001b_i\r\\|󨻗Z\u001d󹭕RH\u001a򶱔1J𥲴[&M\rVy񹀤󉜦D2􀭋^wt18t0U󄮥\u0004y\u000e" + }, + "id": "pool17sj4fgct2n7j2h2x5txrlc73d8fmnjtl5tgvueum6mkqxgdzuaq" + }, + { + "metrics": { + "saturation": 1.1353949119140994, + "non_myopic_member_rewards": { + "quantity": 479265368862, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 18158913, + "unit": "block" + }, + "relative_stake": { + "quantity": 19.12, + "unit": "percent" + } + }, + "cost": { + "quantity": 96, + "unit": "lovelace" + }, + "margin": { + "quantity": 83.48, + "unit": "percent" + }, + "pledge": { + "quantity": 18, + "unit": "lovelace" + }, + "metadata": { + "homepage": "m󛊬i\u0017󼒙Xd*򵪖O񴽬T񵀻&YgG􆅏J#\"|~񉼵#6\u0018~򀺔X򄼑\u0019r|\u0011vE [yT񓍩HG󥎨󎨫d'򨱼1{VAZ\u0003t\u001exQ1󅬔􌦝򭲛\u0015:󥽛_\u0019$\u0003+Qf𫓏RSW3기L\u0002|Q\u000bao\u0001", + "name": "𧎻a#&|𦆁򓐦w񖡺񽁞󵚐񅓭\u0007~40", + "ticker": "ISd􍍹_", + "delisted": false, + "description": "񩔹lz􁳹V\u001aW󎫄-򧝳\u0012򶙚򷺳~\u0007\u0008\u0017󠌍~\u0016\"+id9C*`=\u0019sJ񔗲񦥻stpHw􄏷\t𥀲ah񜘺񢫍ef\u0016hK񬕧\u0012DA\n\u0006EB\u0001L󱞧/uL􏆄𝁂W􌋩BO=>\tI𕭑k񱊥&iAx􍴹'2hl򖃎Пaq󆤿),\np\u0017񤴳}\u0001\u0013\u000f\u0015!8򗘩]\u0000tL񠿅񐖊\t􎅈$A=\u0005\u000e񛓘\u0019򆊏󽛗𔑐\r>G\u0005BEE𼤲\u00118򀿊\u001bY𬖇%񫱓\u0004\u001c򄄟NA\"󠑱\u0006:\u0000/\u0000\u0004𴼣@E3󁻢8򅤎5/􁦈z\\" + }, + "id": "pool173ecg2ry8v5a7apkcn48wgxwx0hcj9vcuq8lu222pxz2clp893k" + }, + { + "metrics": { + "saturation": 1.4033362432061143, + "non_myopic_member_rewards": { + "quantity": 55391111478, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 17378514, + "unit": "block" + }, + "relative_stake": { + "quantity": 38.97, + "unit": "percent" + } + }, + "cost": { + "quantity": 203, + "unit": "lovelace" + }, + "margin": { + "quantity": 77, + "unit": "percent" + }, + "pledge": { + "quantity": 253, + "unit": "lovelace" + }, + "metadata": { + "homepage": "򘯱/񆨰\u0003񨒩𲸧[)Se󋖝H}Y򵫺\u000f\u0012Jo^W򪾀qX񸀧퉷򢧶8gC󪕣Y􏮊\u0002%v@󗞠!(y\u0013񜺛+rG򑈕󮖀S*񉖗򻋉򰆱\n`񜘇$hYPNTeL.'4#45`P\r󰺳\u0006Ig\u000b6􉛾񯎛^l񮤶Z", + "name": "񹌉󈂗34zH򿽜<\\=\u0018\t`\u0005e\u0018\u001c\n<󷆶9\u0010񇾻8A6\u0018Z`\u001c#.I>򎱛񗢒񓧔?quP\u0006񩧍\n?󤐘󆹆\u0006\u0019\u0019񬲑j񱔊\u0017uVR􌴛󬔭󺘨7󉕇8r9\u0000򗯊d񂽲/\u0019F󻎶\\\u000c\"xv:39lV񇣈􏚰h󓬼򊬏\\\u001c[\u0019򎖴񨯞\u001f󿵪FB*[x\u0013=" + }, + "id": "pool1esu28hg4z4gdwe49gsqsxl6a6gkesrznaw3yt4ew8shycxna6ah" + }, + { + "metrics": { + "saturation": 0.45128550169057535, + "non_myopic_member_rewards": { + "quantity": 666822337654, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 10517648, + "unit": "block" + }, + "relative_stake": { + "quantity": 18.03, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1883-05-29T06:00:00Z", + "epoch_number": 11073 + }, + "cost": { + "quantity": 133, + "unit": "lovelace" + }, + "margin": { + "quantity": 89.85, + "unit": "percent" + }, + "pledge": { + "quantity": 67, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\u001e[ZfOA񉯢H\u0003\u00166\u0015\u001c\u000f`G\\jG񨷹1򥬚1픞򖰬󺀒fBn\u001eMi􎗫𵜂Cs맞q\u001f򅍔Kx𚫾<[\u0000Sc3\u0011\u0005𒮷󾶼[_\u0003P𵄫򕱲\"\u0012'!𴲱Wⱝ\u0017򶻵jc\u0014\u0012\u0004\u0018o)!򮵍q[\u0000\u0015blk 񡩲G}[.z񵩿\"", + "name": "񛁋T*`H\u000f.I\u0017󎼇F9WsFRU𧴷뻗\r񐒡i|:", + "ticker": "\u000b󔚹𲮹𯂨򤆟", + "delisted": false + }, + "id": "pool1ksgr6r8sgxgka527kzprqnx37yx00wxu0twtlm25qqcr2hvz60r" + }, + { + "metrics": { + "saturation": 2.1386943238362583, + "non_myopic_member_rewards": { + "quantity": 228955296353, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 14694702, + "unit": "block" + }, + "relative_stake": { + "quantity": 29.61, + "unit": "percent" + } + }, + "cost": { + "quantity": 118, + "unit": "lovelace" + }, + "margin": { + "quantity": 37.29, + "unit": "percent" + }, + "pledge": { + "quantity": 123, + "unit": "lovelace" + }, + "metadata": { + "homepage": "8_6򵻝6\u0017'lE\u0015\u0002D5T\u0001Xt\"𕄅`󨦧\u001c", + "name": "\u0011\u0008񭃱[w􇪔\u001b,}򯻢󥪹$]6#%q󡏘T,\n󜞠\u0010󐂃CI\u0012", + "ticker": "\u000cG2N", + "delisted": false, + "description": "\u0002skH\u0016,󺷮Uf󺕛48󜕾9h\u0005*NQ񒄓m\u0001\u000e)!\u0000H򙩹w>T\u0011\u0017F\u001aJ񷔟򊙟d:d#𩓕󞌕i󁆴󶣣d񨟕E򁍷񘟎񉃀G=򁌧;l𨿵񪭸\u000b>뿛񗫿󤶍o]`񉖵{\"󆫗'z𶤠-v󕯷3𛙫?󀥭$#󡑙绣\u001c򳺃󄘵s\u0017򒰡I\tkG\u0017$" + }, + "id": "pool1qyj7q8msurfq69pww2jt9uzquz4d5s80cyhv3w5fqzedxgde0vc" + }, + { + "metrics": { + "saturation": 2.6210418133951645, + "non_myopic_member_rewards": { + "quantity": 535248124476, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 17040214, + "unit": "block" + }, + "relative_stake": { + "quantity": 48.44, + "unit": "percent" + } + }, + "cost": { + "quantity": 240, + "unit": "lovelace" + }, + "margin": { + "quantity": 47.78, + "unit": "percent" + }, + "pledge": { + "quantity": 254, + "unit": "lovelace" + }, + "metadata": { + "homepage": "j󣥹󜿳򂐛0S=\n򡇟𴶺>\u000b1}:\u001dw\u0005򭳍-𞗲I\u0016򛎳LDi{򭩳3Ew2hy~JDC\u0017\u0015MrKd4by@󃣥󃻤", + "name": "D%D3S𗿩\u0004\u0019\u0013걀i\u000b\n5\u000e\u0001&?𻺹6᨝2\u0004#𿛒\"\u00051+", + "ticker": "O~B\n󨟃", + "delisted": false, + "description": "𼒽\u0016\u001c;\u000fVE\u000cOI.!򷙟򭅼򠸇N𦽎f(\u000fG'S\u001e\u0005Hw񯁨\u0008\u0013?\u000er\u001e=-J񝩎goI\u0016󖿻\u0016k\u0010𫟥񈇑B(\u000b򾾨󅾲񶐳<-Up>I\u0000􋇼󿇪,󡟃􇸛-@wM|q𻩁&m7~񥝡\u000c$C򁋌v", + "name": "}MN]󱷧Y\u0001Bo !(\u0000\u0001󻬺DT󶛏\u001co1\u0006-\u0004^󒭅󺉭O/xsa\u001f", + "ticker": "\u0006򞧎?󄫙񿂫", + "delisted": false, + "description": "#q\u0004(񑵏򗏎=\u0005񴦾񺩒󡞯𿧗󹉘$I\u0002OKQ򈗡\u001f|󧁪mz򗚆\u0005$0vo \u0012򩵣\u0013g󼒞8+y򬁟#*󜋇\u0019\u0001#\u0015+⌤D񥛨Ss񪒋𐅂\u000b􆊩픈\u001e?,񇏡'i>a=\u001e󸂬dO9򶼸:\u0000Ii\u0001x\u00126[zp*X]󤋭`\u00061\u0010@7X򈦷\u0013La򖸱N%2\u0012a(fdp𥼂@%}X􃮎MA6񘊺񟑃\u001f\u000ew]󪑏𞹣oj\u0010󱪋g;tR򽾵񲐛𖳛u\u000e󪾁c#a򔚇" + }, + "id": "pool1pmmxxqz5pqdec7q4sjytthpq3frak7nl4y0du9qesr5ljdc78fv" + }, + { + "metrics": { + "saturation": 2.118250697172794, + "non_myopic_member_rewards": { + "quantity": 380079358882, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 8680252, + "unit": "block" + }, + "relative_stake": { + "quantity": 91.29, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1869-11-08T14:57:08Z", + "epoch_number": 15168 + }, + "cost": { + "quantity": 125, + "unit": "lovelace" + }, + "margin": { + "quantity": 83.44, + "unit": "percent" + }, + "pledge": { + "quantity": 125, + "unit": "lovelace" + }, + "metadata": { + "homepage": "35v\u000cq!F2/co\u00121{S񊧬6", + "name": "󗙬񍠎M𦝎5r", + "ticker": "賀\u0019󀪔", + "delisted": false + }, + "id": "pool1g6t060kz735dpkhwq9p3z50hfq8du6afjmjtxqxfr5ttyzdx9rk" + }, + { + "metrics": { + "saturation": 3.1638368037543336, + "non_myopic_member_rewards": { + "quantity": 996556215530, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 11628624, + "unit": "block" + }, + "relative_stake": { + "quantity": 49.83, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1879-01-14T17:06:14Z", + "epoch_number": 14842 + }, + "cost": { + "quantity": 149, + "unit": "lovelace" + }, + "margin": { + "quantity": 59.79, + "unit": "percent" + }, + "pledge": { + "quantity": 206, + "unit": "lovelace" + }, + "metadata": { + "homepage": ";!􁑤}򺩏􋖜w򫗥&Op3ZMV9鸕%\u0003𸐬wZ󁋒򷐈.T\u0007P򡓍󥳘e\u0010C|𺈢򬽨3'򇳁V\u001ab#Rh񖷤7d\u00180a򎨐򽦃T\u0013򞓷\u0005񭑰8򈲫r􃱃󍦪T􂫳/Nj@򝇞/?;R2\u001b𗡇\u001d2z\u0000\u0012\u001d\u0004a񞽮5񧡒T\u0008\u0010򣽑Vr\u0010", + "name": "񺴖O7c􆜱\"_\u0005(\u0016򪙍\\i󋜐sL(󰟥Hy_\u0003\r_\u0012\u0002?['𨤟\u001cr", + "ticker": "E򝌾M", + "delisted": false, + "description": "\u0012\u001f\u000e뒌K򇚠Y$\u001e󴦐Q@\u0014\u0000R𾆇\u000exW񵍜󨬋\u0004\u00198t\u0010O" + }, + "id": "pool1j0k6r8ry5vn5pc7c8a5h6f5k303r3w27tsnv4jnz9nv6z6lr3e8" + }, + { + "metrics": { + "saturation": 2.5835632946509914, + "non_myopic_member_rewards": { + "quantity": 257132150092, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 20072532, + "unit": "block" + }, + "relative_stake": { + "quantity": 33.82, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1903-05-05T15:00:00Z", + "epoch_number": 26325 + }, + "cost": { + "quantity": 172, + "unit": "lovelace" + }, + "margin": { + "quantity": 26.94, + "unit": "percent" + }, + "pledge": { + "quantity": 48, + "unit": "lovelace" + }, + "metadata": { + "homepage": "J6n6n򎗎ZC񔳴\u0018򈟭񌐓\u0013\u0012k:󱮏qKW!󓒖|[1\r=", + "name": "򔜴C:򎢄tK򚼕eBpu`򒉹2U2\u000e#uxtt\u0007;C\u0019󀼸𩼣C]\u0014󆘯Sm9m\u0004𫶄⊟", + "ticker": "\u0017𱌃\u0013_\u0002", + "delisted": false, + "description": "2;@򂟟4$󮬟I\u0005'B(:\t񘻐^\u0008\u001b\\u񭾕/X\t􂱨Q2\u001c𓭚Gc󜗬򡼑򦇲\u0014񞊀\r򋒁\u0004뙄F'T@e\u000c:>IIy􍙡O\u0010񦬝>!kp\u0007;^{" + }, + "id": "pool1t76dzzn26h9ndjt8vjtnszu4syahf4q9sxvkzwlecrjl769rnn4" + }, + { + "metrics": { + "saturation": 3.4822609745692104, + "non_myopic_member_rewards": { + "quantity": 503575010797, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 15976166, + "unit": "block" + }, + "relative_stake": { + "quantity": 85, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1860-08-22T14:21:54Z", + "epoch_number": 6423 + }, + "cost": { + "quantity": 148, + "unit": "lovelace" + }, + "margin": { + "quantity": 18.62, + "unit": "percent" + }, + "pledge": { + "quantity": 239, + "unit": "lovelace" + }, + "metadata": { + "homepage": "1񛀸\u0013\u000f򱌸c󩫃e󚕦󴲖󮤲\u0014d\u0018򯕦\u001e𻠜>J^nYbO򕎇\\h(n򌊱vR򔘊_񫀌񹓩$􂶵$|󗿚\u0008\u001aq\u0001𗗂%򻯄@򢉨", + "name": "v?񾯸Zqqg\u0008j󭍜\u001e", + "ticker": "\u001d泧\u0013", + "delisted": false, + "description": "\u0008󚆏󣽜\u0004\u00164Z)\u001f5𱑑O5\u001a Cf󊚈'\u00009\u0018\u0008񳞡󵪩L𚗍n󧎍\t%񃸜Pr\u0000\u001e\u000f\r򺥼](k򣳝򎃊a~򯙆|󈰢)\u00138\nN\u0001'񆾎l\u000f󮇾\u0004&/F\u0002.ZA rk񖜐\u0018\\\r\u000f./򘌃An]\u0016b󩻋vh󝚤􌟝򓚡󀴠𥢌󄏍񴿇\u0011s.񄟣Y\"q\\𪁫񒝽$\u00089D\n\u000c&􆯰e\u0004\u0003󫦶1𧸰W5=󃹩1𦶔!񎮬(\t\u001b\u0002􈋖Pfh\u001e)p$QP\u0005𵱷X\u0005򗆻𱅀x\u001cVIx𡦭o?3\u001e0%򁓠3󨋌Y\u0004򾰩 b\u0004'\u0006𛇡䝥\u000c󱉖3#l𭚎(򊽝>7E\u000c:󀙞>󌭾񰙕X\r\u000cs򚈎y𥱣q\nT" + }, + "id": "pool10v7esrrqsd2m6y9r0y6xyv4a0dcf2aznjp43mtxmtags7t4ee8w" + }, + { + "metrics": { + "saturation": 0.24095701546941628, + "non_myopic_member_rewards": { + "quantity": 159952934297, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 10485878, + "unit": "block" + }, + "relative_stake": { + "quantity": 51.68, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1865-04-18T15:31:59.108575748588Z", + "epoch_number": 23210 + }, + "cost": { + "quantity": 55, + "unit": "lovelace" + }, + "margin": { + "quantity": 84.61, + "unit": "percent" + }, + "pledge": { + "quantity": 71, + "unit": "lovelace" + }, + "metadata": { + "homepage": "0k'7gQ񆇥R󾘯\u0010\u001c󈱦󴈟\u001a\u001ahW%\rC,}Ys򔛖{\ta5򇵳񌭺\u0003~l󫲢e\u000b?p򫨥4򞗚r\u0014T𳑟𢽨󩑕^", + "name": "𐁇\u001e񉡰񊃕{+", + "ticker": "󵀌񪒊򣪶", + "delisted": false + }, + "id": "pool1dsdrq8k8jkc2zgap5lwxgg4umya0unhk3393xdwkswwpjwfqtq0" + }, + { + "metrics": { + "saturation": 1.829412867919706, + "non_myopic_member_rewards": { + "quantity": 176045624099, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 4136665, + "unit": "block" + }, + "relative_stake": { + "quantity": 20.53, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1876-09-25T20:30:46Z", + "epoch_number": 13238 + }, + "cost": { + "quantity": 142, + "unit": "lovelace" + }, + "margin": { + "quantity": 67.12, + "unit": "percent" + }, + "pledge": { + "quantity": 196, + "unit": "lovelace" + }, + "metadata": { + "homepage": "OA\u0015򳽛'򯌇񤗑&.󘸈k󼤤3B񁔈j0C%䣈옳Ms\u001dI", + "name": "񴌛", + "ticker": "󘲐\u0004a񿩫", + "delisted": false, + "description": "򚋧\"m|\u001a𞄼󔸲px\u0012~S$𚌧|򲴳:|S.o򎀇JE󗘌\\ku>檞:s>񹋺\u00062E)5􎻁/\u0018t򷕜򅌔DgM𷗗\u0011\u000e\u0011&z􈫞񍞬񾾜[\u001er\u0018\u0003\u0000N󪏲򕡜8]򰕼򲤘mQ򲩖\u0003=%򊆩>C򆭙񏈟D𲧟󭞬bj\u0004I5\\s\u001c􂠻\nxH򅦂@g򥝫5\u0005𓲒񙯕񌄫򮱍g;0LTP-a󑉧\u001e\u0012󔉉+\"󆦳-\u0004򋗂򍘪\u0002\u000bU\u001f\u001dM󢮘G\r𮞑\u0010,R,񧍔\u0012AHjIw.󗠝򫑸T>9󄁦X+𾿑񮼕ZexI;󨗬򜁒\u0017O󶘸v񚇒𛹘_b󯤽\u001f\u0016\u001e\u0010\u000b( !\u0006\u0008q񊕴LX\u0008\u001dBIWg򿏴,@\u0016G\u0013\u000biD󐤛򢶰\u0016񌀁氤P)S\u000b*\u0007*jJ򝲛\u0016\u001e&)\u000fzp\u001eD\t򓩺", + "name": "񙶺Y򷹁\u0005", + "ticker": "W,E94", + "delisted": false, + "description": "\u0013\u0016򺷶l7񠧋\n&󈅛q,򢹙%𰸠m4􆙵2c\u0008򘌸\u000c𗓞UTS󽩂s\u001e;𜷟/p]\u001daL󹱏m𜱐J񌭪򏳟򫟘H𰥇" + }, + "id": "pool1h5jrchvzhzux4hk0xe0wmhgjqgkzfzk390hj6vfgkgw6wu6p89t" + }, + { + "metrics": { + "saturation": 2.281765642221536, + "non_myopic_member_rewards": { + "quantity": 110410852594, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 22243838, + "unit": "block" + }, + "relative_stake": { + "quantity": 4.09, + "unit": "percent" + } + }, + "cost": { + "quantity": 146, + "unit": "lovelace" + }, + "margin": { + "quantity": 58.91, + "unit": "percent" + }, + "pledge": { + "quantity": 227, + "unit": "lovelace" + }, + "metadata": { + "homepage": "Ek󐽄Fih𽁿򁏾a\u001dp\u000b\u001c\\苨u'8󃒮z7\u000f+\u0018𻑏\u0015+휋_\u000bO-𠀎򵠋", + "name": "\u000f2󉙕󑊂{^]|\u000cv~𝿔fq3𫥟򯉀T򍈇񋙵qCW񆞓񐷸񹳢vFG񣗵o6aW򤟜\u0015\u0001", + "ticker": "VS񟰺", + "delisted": false, + "description": "\u0010𠡭񊑽\t\u0018񳺬\u001aM2񽁼񻋻󒲀\"F\u001c\u001b𭦼Zp\u0016*\u0003Hqd7\u0016E󅨿M?𶸁j򰧲񅜦Y.#D;\u001e!\u0002#󵘌A񀊅?\nA\u00116󊹹B%q\u001e\u0006\r6|Wo6\u000e$\n\u0007\u0014𗇒sY3\u0006\rw𐥓󵋓A|\u001b'􌛘Ls:𒯺" + }, + "id": "pool1gnytqrregcjzl5gqe9wdshfnccgjrwgcsddflru80vunz6uumje" + }, + { + "metrics": { + "saturation": 0.3596149168690749, + "non_myopic_member_rewards": { + "quantity": 904227683903, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 18865619, + "unit": "block" + }, + "relative_stake": { + "quantity": 37.63, + "unit": "percent" + } + }, + "cost": { + "quantity": 54, + "unit": "lovelace" + }, + "margin": { + "quantity": 10.98, + "unit": "percent" + }, + "pledge": { + "quantity": 195, + "unit": "lovelace" + }, + "metadata": { + "homepage": "vD󢒘}", + "name": "W2\tKJ\\򁇉'mE4X", + "ticker": "Y-C\n", + "delisted": false, + "description": "m󑣇mc$f\u0007E񰣼󊡸4\\H\u0005]y9^\u000cL!\u000eN],\t凓𧂷\u0015\u0003s򨘯)󥧮e*\u0018t!:򬍁E\u0005\u0018g:𵏻g􀈧+8󪤆M󣸽C\u0014\u001e'\u0012\u0012B򂃋3󱝇@7:8\u0007󤹜󿼙 ,󹼽gSwe𙢄1u\r󮑳yj\u00119\u0003񲲇\u00083𼮾F񎾮\u000c9\u0014\u000c\u0006\u0018" + }, + "id": "pool1keq7gtx3v05tu54p67e9ucv5w5cx7j5m7zyvtyrytmvjznldd0f" + }, + { + "metrics": { + "saturation": 3.203215820746813, + "non_myopic_member_rewards": { + "quantity": 443176803660, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 19886718, + "unit": "block" + }, + "relative_stake": { + "quantity": 6.01, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1871-04-10T20:21:44Z", + "epoch_number": 24342 + }, + "cost": { + "quantity": 95, + "unit": "lovelace" + }, + "margin": { + "quantity": 13.39, + "unit": "percent" + }, + "pledge": { + "quantity": 21, + "unit": "lovelace" + }, + "metadata": { + "homepage": "񁪫p{m񳵍G𗚙b@\u000c1)q󑷒\u001c𖓥6emo8B\u000bY&C𽞤𥁙y𐹽7\u001e\u0013m;\u0015򬴲MxFoZ의𖶪FD㷾];s\u001e䪚\u000fvZ􉬙9S\u001d𡤍&G\u0001b,\u0018\u00123\u0010󞣖\u0013kOaO񚒬\u0001񖌼z\u000c\u000e5>H\u0014dd􇓱򌈠x񵛜񯹣\t-񒞷\u0015", + "name": "򴠒B\u0000u!Ko\"4S󿤧'z𚼧!U<\u00134𚒕ea2YoD$\u0004\u0008EAK\u001b\"H񻭠\u0019\u0003Ng𯔠󱈰V\u0004򆾅<", + "ticker": "\\\u0005A`S", + "delisted": false, + "description": "*󩧜\u0019󉽍+\"\"mbj\u001c X\u0010𿺩2\u0002򬳩񟃊\u000eY󉯥󋱭\u000e\u0014\u001e񆳅\u0010Z𚌙:\rFR|hF\u0007l\u000er=8l $\u0011񌉫Z󔅆t\u0002񏱔򓠁fS\u0015,\u001e\u000e)\u000eBX\u001a\u00079D𨛾6򜇩\u001f&񦋔9戦󵞗p񧤐򀇼@쇬񆄊^\u00043\u0019\neu󉤍񗣹񴳛B#g\u001aB򧖲w򻧑@\u0006P}`B\t/\u0003\u0011󍯯2\u0004hX~􀿔\u000fsv񒓆񃃠\u000e!𽔊\u0018/jL" + }, + "id": "pool1le545c62mqd5nq9khqgs76jcdchg778f08md5ecfk3jw2wh3tqy" + } + ], + "last_gc": "1869-01-15T04:27:44Z" + }, + { + "pools": [ + { + "metrics": { + "saturation": 0.9551275633242984, + "non_myopic_member_rewards": { + "quantity": 804067208875, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 5401512, + "unit": "block" + }, + "relative_stake": { + "quantity": 35.79, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1870-08-02T23:27:48.982418696549Z", + "epoch_number": 3487 + }, + "cost": { + "quantity": 114, + "unit": "lovelace" + }, + "margin": { + "quantity": 47.78, + "unit": "percent" + }, + "pledge": { + "quantity": 135, + "unit": "lovelace" + }, + "id": "pool1kjgrutc6r68pdk64c8hy5hwp8vftrhmvsc0rltmx464gy024vnd" + }, + { + "metrics": { + "saturation": 3.021211793662692, + "non_myopic_member_rewards": { + "quantity": 848945961832, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 5159473, + "unit": "block" + }, + "relative_stake": { + "quantity": 62.94, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1870-06-27T02:02:37Z", + "epoch_number": 12029 + }, + "cost": { + "quantity": 55, + "unit": "lovelace" + }, + "margin": { + "quantity": 44.56, + "unit": "percent" + }, + "pledge": { + "quantity": 234, + "unit": "lovelace" + }, + "metadata": { + "homepage": "3񣝪򇡁n\t󯛼sfm8\u000b񠴶򀉡0񖎓n2kv󉏵:4--@\u0008D𧾦\u0013R󴧓*", + "name": "DA\r򫪏\u0017`Dwo\u0008𙊪5X򵒢[E\u001d󺬊[\u0011\u0010qk2񤧦g`񊚏V𺮹?\u000c􄶙󴴹\u0019󴚝G񱟎遻N\nR򰡾󻆢", + "ticker": "򛑭i񰄎򚰁", + "delisted": false, + "description": "g!\u0008)򞌩󑅑ea򄋜O􂊮F\n\u001a񐭢\u0005GcW򎜨]\\]B򭿒򂑁A!򩏠𧮆o\u0002\u0006;\u0012򍋰𰥎\rBwi򀍔'7\u001bK񙃽 򃝵V^tJ𥶼i\u0002\u0008k\u00184񃻳x񊝫\u001cF󀞍8\u0016oD\u0005񝊝0\u0005ſ񑳍{~]z\u0004N33\u001b􀐃%(8𣱶\u0002\u0010G8&R𡸠@$e\u001be򌁩\u001e5\u001fat m񩆵𛙯I(u\u0013\u0005􆏐𬧜\u0007\u000egM)𷏹bIp󔹾􃖯)\u0001\tb\u0005sp򛥲" + }, + "id": "pool1d53qp7x6tf82g28x50648zgpfh75xhfjwfz3mky2admwk84qq86" + }, + { + "metrics": { + "saturation": 1.8870377260389897, + "non_myopic_member_rewards": { + "quantity": 951057796463, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 21682094, + "unit": "block" + }, + "relative_stake": { + "quantity": 60.34, + "unit": "percent" + } + }, + "cost": { + "quantity": 63, + "unit": "lovelace" + }, + "margin": { + "quantity": 65.07, + "unit": "percent" + }, + "pledge": { + "quantity": 47, + "unit": "lovelace" + }, + "metadata": { + "homepage": "k򗊅򌺨󻌊AE\u0004򐙓򆑶񜽮\u0011\u001fe6\u0002tⰕ", + "name": "Y~y\u0004\u0014l^8\u0006;For񏯛\u0014H", + "ticker": "pQF񲤣򖫧", + "delisted": false, + "description": "o\rsGT|c`D\u0000𦘏Dvs(\"@$\u0017\u000bB𬓮U8T\u001b\u001bl0@{GP򥈠Ugb\u001c𔡫D󿴎\u001cN0!N񣭽$󧐔>0\u001f\"\u0002󾋹\n􏩺󍂐&a,W򆾒m\u0008򐆑q{M4Q􉶕%o񐫞\u0018򐌌\u0018j&T\u001f \u0008>\u0008" + }, + "id": "pool1jeusjzegadvvrhvj6qxwwejzlala7yp8qlszm3fuk3j0z5067p5" + }, + { + "metrics": { + "saturation": 4.434353119120328, + "non_myopic_member_rewards": { + "quantity": 75102759366, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 10937356, + "unit": "block" + }, + "relative_stake": { + "quantity": 72.1, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1863-09-16T16:56:54Z", + "epoch_number": 32095 + }, + "cost": { + "quantity": 80, + "unit": "lovelace" + }, + "margin": { + "quantity": 48.99, + "unit": "percent" + }, + "pledge": { + "quantity": 214, + "unit": "lovelace" + }, + "id": "pool1e2lns4eaj28ndlgg0wzxmwampur9lc7ahzqk4wyzxpz428ntrk0" + }, + { + "metrics": { + "saturation": 3.9171119288506033, + "non_myopic_member_rewards": { + "quantity": 276667319673, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 13617899, + "unit": "block" + }, + "relative_stake": { + "quantity": 23.53, + "unit": "percent" + } + }, + "cost": { + "quantity": 42, + "unit": "lovelace" + }, + "margin": { + "quantity": 42.9, + "unit": "percent" + }, + "pledge": { + "quantity": 163, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\u0019o", + "name": "vk𫲢PK򉺻nuu\"y򙋻󴟬>A𣖗񙎒U\u0010N\u00173}񳆡񝞭\u0004`m񏑗􁓲󛬵Aqt' ^,7󆕟N*俣𯭁:\u0006󿖦", + "ticker": ",D\u0005", + "delisted": false, + "description": "f񃕌%L7T?\u0012e\u000c.X𞢉[m򫃖Jlxg􍌋?B\t򧎑󮼺\u001ebN筍򶴲6g4\u001ap񜎍V򥆈󆡫\u0015\u001e󩐇j%򲴣m\u001c󽃸l2􅷊󜎜\u0008򲮅\u001b#NFq󱼰\u0017*>N􀣡\u001b𺦷ln\th\u0017A ?G\u0019r\u001d-*{,2\u0018\u0011?.򎯦j򂵭\u001b}n񲓌U sMKmD\u0007 5%v񾘃\u000b>񻪼🉊7\u0013\u0012\u00013\u0007Q-􃔄𣱂PWg,🱰l\u0000\u0015:򶔎\u0002W>񀇃N𪫓񃼒2$\u0006]s򂷩򶘀񆞯\u0000E3󯦍O𳇀F\u001cf:9񈈶t/$5#l񦧫\\\u0001\t\u001f\u001c}L񯼠򐕣\u000b=&󌥼򽄎󷹙\u0015󘔡c㸤QC\u001a7j2󀩰𡊸u\u0015OX􆶡񄮴)~򁉟\u000e򋰵U/\u0007񒺽S앁%t𮒦t.1V\u0000󈬡s= 4o!\u0012h򲳩;񜐏\u001d\u001e(|󱙉R񸍎As>2𖄈B\u0010" + }, + "id": "pool1shh9r2nwd78mhtr7hkx9u4vuugw6776n4m3rgdfw3md7wkmh9y8" + }, + { + "metrics": { + "saturation": 4.511399810476544, + "non_myopic_member_rewards": { + "quantity": 950152260089, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 11376347, + "unit": "block" + }, + "relative_stake": { + "quantity": 53.78, + "unit": "percent" + } + }, + "cost": { + "quantity": 94, + "unit": "lovelace" + }, + "margin": { + "quantity": 62.21, + "unit": "percent" + }, + "pledge": { + "quantity": 10, + "unit": "lovelace" + }, + "metadata": { + "homepage": "/󂎢􏂞󣌨n𜍫s𞧼qs󔞁\u0006xU񔗧A򅯜Z8폴\u0010G$K2\u0000󣛱`K{m\"񞄙;8]􄲽\u0011\u0007\u0014󍷯OTzII\u001b+6𬉥m𙗂򌍂s+T\u0018g\\󄿽", + "name": "\u0014cl蜸\u0012񆮑\u000bWf񄉠8s88\u0006㢯\u000cAQ\u0018*\u00128\t\u0003\u0012\u001c񀚓#xsXM+JbF\u001d򷺴\u0018{𞩑y,h", + "ticker": "\u001d􃂯l", + "delisted": false, + "description": "tn\u0017&P򻃑\u0017v\u00089I񪀎񖞐򰪷󣪡\"􎹢y\u0008񛛲e񠷽lS)dMS𴪋򑒹:\u00047\u0005򗨃M񨄜P\u000ce\u0019v󍅹@a}\u001a򽪢\u0002𷐟򴓱v1.7&v\u0016񋻠h򮄢}򀊒a-\u001fB_AjN3񤠶\u001bqB!\u0018󰱻\u001c\u0014\u0000𸦥󛺝􇆏4/WP~񊲼TP\u0003񇡃|\u0018X9~c$9}@t򢫅?1񉝖񭟻Lu\u0018򁳄񏛓\u0016\u0019𽓆򅍒SC9񺕇FVEC󕅳Dv񜜫2󯧼sf񣲲E򞵌=\u000c6򤙍K\u0016\t\u0013ᵤ\u0002\u001d1'򔞭]" + }, + "id": "pool1tzrcvl359nd9tmzvnd0nwweuweex5euw4uct5fyn5732qw96kpx" + }, + { + "metrics": { + "saturation": 2.148582250652506, + "non_myopic_member_rewards": { + "quantity": 258618035612, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 332811, + "unit": "block" + }, + "relative_stake": { + "quantity": 22.94, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1887-02-17T19:39:33.488010286708Z", + "epoch_number": 26016 + }, + "cost": { + "quantity": 113, + "unit": "lovelace" + }, + "margin": { + "quantity": 20.56, + "unit": "percent" + }, + "pledge": { + "quantity": 209, + "unit": "lovelace" + }, + "metadata": { + "homepage": "s񻞟}򦓝>􃯓􀙟󠛇\u0001󤆗\u0018/\u0016\u0010\u0000򓌽*=u򝫷\u001e\u001fE㿶\u0003A\n𦂽KDH;hU%\u000f;\u0015l~𦯰Q\u000e,\t\u0005l򕪊IF􆸊_\u0010:>򒫎^W", + "name": "򦻹󔸗\u0016@\u0001𜊢e[\\x򄤏\u000b%+\u001c*9", + "ticker": "eU񽒖", + "delisted": false, + "description": "_HH񘝔A󻹉<_y{^1򏺼񼕵r\"E\u0017y񮱀\u0005򐠺𯜱񞉾\u0004Dd񦒰󌵄f\u0007\u000b^󸞮j10󶓤FK]vGs\u001eZ򦚨1𳚉:󴼐3G򿽃:blxz.r񳈐񢽍W\u001a|ⷍ>񨫠I󗻔-𡀛6򖾁@R񧶯򜋯񞌫񅓛lC^t𷯒\u001ahh\"LtB\u000f/b󈃼WP`\u0002<\u00104#\u0012>񲠼򦭷򖂓&T󨔣\u001cu}򕀏\u000fSc\u000b\t􉿃񴥠\u0007\u001b𙰕\u001d\u0003\u0000}Yo𽕊\rY3N빂\u001b3\u000f\u0019򧥜즴j񽠂\u0004덆󇩂Xm񀂞J\u0013'\u0005%\u001d2Dk򆀉KA\u0019%򁅧򮡺xspil3\r[aL\u0014w\u0019jm\u001c\u0010ꧬH\u001d񜎍7\u001fo9\u001e|D;C\u0019񣼍󔧤tpp򟋠𧺽h" + }, + "id": "pool1w6de26x7kk2nek0j5zv2cdzk93vdpqgxm68n5azy0cpdkyscqxq" + }, + { + "metrics": { + "saturation": 1.4773620861076875, + "non_myopic_member_rewards": { + "quantity": 81972810653, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 6380693, + "unit": "block" + }, + "relative_stake": { + "quantity": 81.15, + "unit": "percent" + } + }, + "cost": { + "quantity": 33, + "unit": "lovelace" + }, + "margin": { + "quantity": 39.8, + "unit": "percent" + }, + "pledge": { + "quantity": 160, + "unit": "lovelace" + }, + "id": "pool1jq75dzj586e870pgeugclphennjx9eplna057gdqqvzv68wj3lz" + }, + { + "metrics": { + "saturation": 2.5794251526532386, + "non_myopic_member_rewards": { + "quantity": 161402676849, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 7887211, + "unit": "block" + }, + "relative_stake": { + "quantity": 6.96, + "unit": "percent" + } + }, + "cost": { + "quantity": 10, + "unit": "lovelace" + }, + "margin": { + "quantity": 15.06, + "unit": "percent" + }, + "pledge": { + "quantity": 248, + "unit": "lovelace" + }, + "metadata": { + "homepage": "񰒳񊧤񩯯*뽱_6񖋡\u001a8eM#TK\u0017a&\u000e\u000f򾨇\u000f\u0004񵜓AE衞t-~󘹕{7껦𓔙uY񝁋){$r\u0000.򖕨}󻻴i|zSC𤌺<񷬍8k", + "name": "p𰨹񩘐HhL\u0005?s\u0010R򝄧󘛊h󾛡\u0001M\u0015P󄥠\u0013U\u001e6楐\u001e񊾢\u001c勮", + "ticker": "%Zn", + "delisted": false, + "description": "];󠂗4q\u001fB򍆝>񪶔,􍿙𿯏𲔪\u0018>dm񢣳󬙂zI\u0007n\u0000苻6􀻽򒂥ai\u0019\u00174~p\u000cR\u0013򪾻(𗡕󝴼\u000c#𥤋?򼺗񾔒🳽\ny𣧅򒤽N\\Q\u0015uk\u001buih\u0005\u0006\u001c𨅒?𱦲B\u000fM\n񻘋\u001arM\u001d\u001c񈣍SaL[J*f:󗶌d:<;{q\nX󤈡k)Mf\u000c\u000c5\u0005\u0017𔩋򚍴􋈣5\t\u0011T3jWt " + }, + "id": "pool1qnxjpu49leuasfdyj2cm79ycepdtx89zyv6tmhlvhgaevpvyafc" + }, + { + "metrics": { + "saturation": 2.746959070012095, + "non_myopic_member_rewards": { + "quantity": 799782916925, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 14118636, + "unit": "block" + }, + "relative_stake": { + "quantity": 19.89, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1896-12-03T03:10:12.383174921143Z", + "epoch_number": 2936 + }, + "cost": { + "quantity": 45, + "unit": "lovelace" + }, + "margin": { + "quantity": 16.16, + "unit": "percent" + }, + "pledge": { + "quantity": 37, + "unit": "lovelace" + }, + "metadata": { + "homepage": "K\":\u000bc.", + "name": "n\u000e1+򴶇𧗅b)򆃈q0🞀񷂒WPF򠕻굱k򏿣FB2z\u0003l@\u0005󶏯T|󧟎\u0017򿼈􇍔K6R\u0004V'\u000f񢤗\u00060B\u0004\u0003󘟆\u0008Xz\u0000򥎙m\u001f\u0004􈝫򊲙Q(R\u0017Lo\u000f򞣳" + }, + "id": "pool16fq6xy97dvfc924d83xha2752cljh8l7y2hg423mygy5jzzndmn" + }, + { + "metrics": { + "saturation": 2.1594521200569092, + "non_myopic_member_rewards": { + "quantity": 866958819006, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 6882074, + "unit": "block" + }, + "relative_stake": { + "quantity": 37.38, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1894-07-15T13:18:12.627356324673Z", + "epoch_number": 2351 + }, + "cost": { + "quantity": 226, + "unit": "lovelace" + }, + "margin": { + "quantity": 18.47, + "unit": "percent" + }, + "pledge": { + "quantity": 55, + "unit": "lovelace" + }, + "metadata": { + "homepage": "7\u0001]󅂛\u0003/󸙔X+\u000f`EO\u0012񶊉(P\u0018^6DVf\u0014\u0005We񎌻󐙤jC\u0015zL\u0014\u001dᎡIdlC[\\󉼥􌩱񀋛\u0010", + "name": "Y|}\u0008?^\u000c𯯱q塶纓qe\"=BnW񮃅k\u0004aX򚏞\u0013=cP| ", + "ticker": "\u000bJ\u0018?", + "delisted": false, + "description": "vt=0U\r\u000e򮮩@򩠑 \u000b𜽁V-K򱔓?|P\u0002𵴩r^񺻬\u00127\"\u0015񲭀[\u0004򌯊Z\u0006|\u001aXz􁿺j\u00143񿠪ip𥫟󚵕O4m򯾷EtE\u0017󆐑/)(\"k.<򷒇񡡏𹠏\u001fZ񸳞dV󮗗:?|񀾮r򞾗$ZB𗷉\u000e\u001frh򡘝_𭦍񠽩pk\u0000\"񬰦6f+\t>%p᪺`?L7𼾎G\u001a~\u0004򩍎kJ\u001d9𭒱𝊚\u0008򶦿`@󆼞𫦃A\u0008l񕌳\u000f\nC󠶆0󻡽󣕀\u0002'G\u0001a^\u0002'!'Y𠃄,E񷓮\u0006|\u000e`pi(Wv_\u000b󬍶/bs;o򟲴􀋡󦛌:\u0006􏭝\u0003\u0011%5󀐨&5󬯲򫈭U\rh!\u0013񑭟" + }, + "id": "pool1wkhyh8x699370klnanh3scgz9pu2rmu58fv5aczmmvssgndae2w" + }, + { + "metrics": { + "saturation": 4.868965184484193, + "non_myopic_member_rewards": { + "quantity": 153612684766, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 9962514, + "unit": "block" + }, + "relative_stake": { + "quantity": 97.32, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1885-02-07T19:00:00Z", + "epoch_number": 23351 + }, + "cost": { + "quantity": 212, + "unit": "lovelace" + }, + "margin": { + "quantity": 50.18, + "unit": "percent" + }, + "pledge": { + "quantity": 100, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\nB,􍮷l2'u\u0018a󺊣󴎒/92\t\u00187򠜆妋󀎐zJ􅖸JwE󙸀󤊐\u0015C\u0002]|񟆱!𕱞8󻛔*y\"\u0016\u001d,򎕠\u0016dn-\u0014SH󶔗\u0004\u0005񼥢򗁻(r3(\u001d\u001d=\u001f𡊂`󬐨1󽮬Z\u0018|9!򳵗XN񡰴(b/Vc", + "name": "4\u000c\n", + "ticker": "K\"K", + "delisted": false, + "description": "{\tL\u000e𕑄W\u001b뉺򔄒Kg򗣓\u001f?X󚻩򕺀򣇱\u0004<0\u0007)15ᦾ/r^;l|!\t\u0006񿹵q!󯦰Y\u000e{psn𝁯񕷌EṶ򊦸[\u000b\u0003򗎀GR񳾕򋻫2:-󊹉$\u0019hr\u000fli%&L\u0008򍽷ofs:1n\u00138󿧫񀉗\u0006R\u000b\u000cCi񑕕P$󟛶I𞁩#\u0003Tr􀨊\u0013\u0018}8򷢊 𘥇Sl򫄎zi^1La򪁑{\n\u0013\u0019w7\u000bL񐅩\u0001*7󱖫􉔺񈨦\u000b\u001d=Z\u0016yGv6U$\u0011GUn\u0000\u000e񒮈\u000b񖧼񊭊SD}Z𽶒\u0010;񗓢񯘵A1\u001dH󜆈H򙺋\u0004`*\u0003\u0018񢢝򎸇;\"x񇵑\\\u000b󥂻\u001f񌨑bo#:懱󅸚\r\u0018󅬨\u0013􍝿F󿸪\n)" + }, + "id": "pool1ydty43phvuhfhjk26e338eejs2x9yunydkhud8vtg9u669358tx" + }, + { + "metrics": { + "saturation": 3.3783034833222967, + "non_myopic_member_rewards": { + "quantity": 923887651545, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 10737620, + "unit": "block" + }, + "relative_stake": { + "quantity": 88.88, + "unit": "percent" + } + }, + "cost": { + "quantity": 130, + "unit": "lovelace" + }, + "margin": { + "quantity": 87.12, + "unit": "percent" + }, + "pledge": { + "quantity": 56, + "unit": "lovelace" + }, + "id": "pool1mfuf4h9am7l45zdhp69wdc2xvdytu0xnhhpjp7ekcte26qzntj8" + }, + { + "metrics": { + "saturation": 1.1761401475933797, + "non_myopic_member_rewards": { + "quantity": 769809536643, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 13851378, + "unit": "block" + }, + "relative_stake": { + "quantity": 55.38, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1871-07-15T18:28:30.680927345452Z", + "epoch_number": 18893 + }, + "cost": { + "quantity": 120, + "unit": "lovelace" + }, + "margin": { + "quantity": 54.6, + "unit": "percent" + }, + "pledge": { + "quantity": 138, + "unit": "lovelace" + }, + "id": "pool1c0vxc47k2ce9kr9dt0k5dtd7st5mx9sjkh39t59mm6qdk872e9p" + }, + { + "metrics": { + "saturation": 4.101172490577947, + "non_myopic_member_rewards": { + "quantity": 965510986995, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 21365068, + "unit": "block" + }, + "relative_stake": { + "quantity": 61.08, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1892-04-25T22:26:14.839703018551Z", + "epoch_number": 17507 + }, + "cost": { + "quantity": 243, + "unit": "lovelace" + }, + "margin": { + "quantity": 99.18, + "unit": "percent" + }, + "pledge": { + "quantity": 177, + "unit": "lovelace" + }, + "metadata": { + "homepage": "󻗟uQ񓑝\u0015/oE󱴑H\\Z󹱋򹀒[KQ \u0006\u0007󨶎\u0007\u0008M􌁙9Q\u0016e\u0014򚎺sTii", + "name": "\u0010{󿄅^)񿰅\u0008\\", + "ticker": "Zu\u000b\t", + "delisted": false + }, + "id": "pool1pvee9wwr32evmlcpawg7ga0ma3dxjnghe2krrmw9azuhvtzej8t" + }, + { + "metrics": { + "saturation": 1.217589246077862, + "non_myopic_member_rewards": { + "quantity": 354676757078, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 13047403, + "unit": "block" + }, + "relative_stake": { + "quantity": 94.52, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1866-03-14T11:00:00Z", + "epoch_number": 20743 + }, + "cost": { + "quantity": 129, + "unit": "lovelace" + }, + "margin": { + "quantity": 83.73, + "unit": "percent" + }, + "pledge": { + "quantity": 89, + "unit": "lovelace" + }, + "metadata": { + "homepage": "5\u0000󦜕_󺟥B]x􆰓TdC򚌘\u001fqt1s_r򐟸\t񒤍򺊽H񦗛%󀆫񵟚n\u0018\u000cF\u001d𹰇N4F\\-\u001d򓶊񖚁򆩆^🫩ᢦ", + "name": "𦀞kJ󜟎w󥔳I@񚤪H񓪑𕣖򕏙󔠉j񿗧|F\u0011򃺙6p󱑽򜃶\u0011&\u001e𒊐k\n\n򨥪u󺺦\u0008𾤦𳵊lA\u001dHX󶻬\u0006S𷟐", + "ticker": "\u0015󲐃\u0011", + "delisted": false, + "description": "Z\u0007򷊍v󉳯d\u001bu~\u001fW󁴯󏮱#%B7񚃫f-󘎕'\u001bx󗦚󬻺9C򻺲􋬄󼇧M\u001a8>\u0016\tC􌏠\u0002󖋄R\u0014𗢺\"l񞸻򅯖^򎞴\u001a0_𱼟?x1ze\u0018\u0012[𑦤񾾖c*5\u0018^𮺘6\u0016𸏋\u00068񻛔󑀰p\\g!\u0011\u0016D`o𯗁񉾉M Pv\u0014T@𜧇雠𯀇`\u0008DGSu\u0018\u001f񛫾j>ZrG򯂔􇟠hKE(򃟤EL򏈞fZX8\u0015Kf󟓎\u0004T#l.\u0005\u000fh\u000c󗽃\u0001񧨾-{O\u000ew򳦋9𵑠\u0007󖕏\u000fYj:􍓵l񌜫|\u000bxV\u001a󴎐h4%ar񉷳a<\\񖨡fW򫛫\u001e%0k񚖢;\\V\u001as\u000f{M~|󁦝\u0002񌬋%\u001d" + }, + "id": "pool139g3ftrt5kugesyvtu5agzj4mvcccee7r84q3yu0zww85z6ahuu" + }, + { + "metrics": { + "saturation": 2.2609415354737035, + "non_myopic_member_rewards": { + "quantity": 159851053399, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 1705864, + "unit": "block" + }, + "relative_stake": { + "quantity": 60.03, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1881-05-11T23:51:18Z", + "epoch_number": 3254 + }, + "cost": { + "quantity": 69, + "unit": "lovelace" + }, + "margin": { + "quantity": 22.74, + "unit": "percent" + }, + "pledge": { + "quantity": 190, + "unit": "lovelace" + }, + "metadata": { + "homepage": "jn񪆀1o{,\\.PKLX񧤈!\t8gZ蒀\u0004\u0014\u001aW\u0000{X􏍫򦲠𕵉G\n𧬹񣋉Q\\Un\u0011qq!0싒\u000c|\u001dA񢟴U򉵖􂢸󈇌5", + "name": "򣕯-U񔶣zf򫟰󪢏{l𴱴4\u0003tdU$8𓈭C\t\u000b񴬼/\u0000\u000c5uwB񋞦\u0010󼫧!%􅄍\u0002\u000b\u0004Z", + "ticker": "\u0007\u0006񇎒", + "delisted": false, + "description": "\u001b\u0018\u001a\u0015\u0002n􈀌8gb\t]C\u001f𱢏ᵍ􀐓􁡮^lv𜉧OeX\u0019{k0OJ)cW񼾢U\u0012kp\u00164񑴅ba𵴏V򴨴𛖯Z\u0008{k.G" + }, + "id": "pool1zx42qqce0n6w9ucsjwjmp8krl6dhuzf6stlahn6pusrr5msfwax" + }, + { + "metrics": { + "saturation": 4.06785210642077, + "non_myopic_member_rewards": { + "quantity": 4603984702, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 8071829, + "unit": "block" + }, + "relative_stake": { + "quantity": 65.68, + "unit": "percent" + } + }, + "cost": { + "quantity": 41, + "unit": "lovelace" + }, + "margin": { + "quantity": 98.52, + "unit": "percent" + }, + "pledge": { + "quantity": 69, + "unit": "lovelace" + }, + "metadata": { + "homepage": "]B\u000b\u0002xa𿈪D9󧋉z󮨆eM󜒇m𗳣닭񨍯\u0001񐜍s]_v񱁯9𩦇\u0008򦎣\u000f#򜮏󖯵S\\,N1󌓟R\u001e!􎬢\u0007\u0017\u0011\u000b򎷚\u0002Qfq0@Wxh\u000f\u0005\u001f󽘄]𰿖򤦤𕓒", + "name": ")\u0003~1}{,󍠐5\u001f", + "ticker": "񥾰x<5𼲥", + "delisted": false, + "description": "\u0001\u0001'\u0004-yZs3~F杈L\u0019񶂥l>J.)6󘦚\n4\u0019\u0017񜘞L༻񴠛a􁼓N򋰡C\u001b.)􊼨\n" + }, + "id": "pool1nlnmwyqjrystm3d80n3njqhe07qy66wszggemzzhv0xvkvzdwrc" + } + ], + "last_gc": "1895-01-19T02:00:00Z" + }, + { + "pools": [ + { + "metrics": { + "saturation": 3.931875050349023, + "non_myopic_member_rewards": { + "quantity": 157944822122, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 3265033, + "unit": "block" + }, + "relative_stake": { + "quantity": 90.92, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1908-06-17T03:00:00Z", + "epoch_number": 12507 + }, + "cost": { + "quantity": 157, + "unit": "lovelace" + }, + "margin": { + "quantity": 87.55, + "unit": "percent" + }, + "pledge": { + "quantity": 201, + "unit": "lovelace" + }, + "id": "pool1mekw8nc6ycn4t3ul6rtuqyvyus70m0cqhjwhe6wur6e56sxvyus" + }, + { + "metrics": { + "saturation": 4.936531859653538, + "non_myopic_member_rewards": { + "quantity": 704301251314, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 15673737, + "unit": "block" + }, + "relative_stake": { + "quantity": 12.72, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1860-03-02T01:13:40.796456171996Z", + "epoch_number": 31725 + }, + "cost": { + "quantity": 107, + "unit": "lovelace" + }, + "margin": { + "quantity": 56.58, + "unit": "percent" + }, + "pledge": { + "quantity": 48, + "unit": "lovelace" + }, + "metadata": { + "homepage": "l\u00041tT󕶃\u000b𹨹.~U𪆕󤯋t򻘶𿪕񥾛", + "name": "e􀑃򩡌\nc\u000f\u000e}򰱠\u001d^󚉳D񺜰_򒼠4F~񘭗|򌻰\u0002d_\t򒀦񓼥u\u0018", + "ticker": "5p\u000b\u0016", + "delisted": false, + "description": "\u0004$zT䔒8\u001f6䫎󶽠򕘻𿉠𭚍𙏱.🙪]+󾮼\u000c1}\u0017>\u000f\u001eU\u0006\\\u001e7󡙮BH0񶐁Grvk􋹠󡰜?􈔤𕬞2j~|󂴻򨎊󥈒L\u0005z򤺎򫢵W🋱􊈲t^Y𳔜\u0010񍳄\u000b\u001f\u001c\u001ddR&'Mf\u0017񡑢k\u000bi\u001e\u0013󪦪𩙰d\u0014XK-\u0019\u0002\u001fsr\u000b\u0004󾉸i}񌧺\u0005x񦧰-q\u000c\t]󚐿\u0016U\u00137\u000eEPp*|eC1室l(񊒀𙔍\rGBnu󉤦񖦽>󰡊R󻐟s񃟣#𽹥24򡍖_k\\}_\u0000)슖$s BV7󥤝\u001b\u000c\u0018*񚏏򼇘[󙋜.䮘/LY񴊫Z\u001dFU\u0011>w{ptsH@o\\/񠎀,GJ*>񷄗V\u0000m\u0004}J\u0003󜟓+􋍘7NJ󄫚󞸌*𕔕N&򜖿\u000c񻺟󼿾󣣜:\\\u001fokg򯷹8󤫑R\u0002\u0007^\u000f𡛚󧵏󝯆S򀇉L\u001f\u0013H+󬰮0􈀼" + }, + "id": "pool1cdta9g6q5gvuxntlxjleq2uejjp2qynfsdt7mw4hy9gg6g8aufj" + }, + { + "metrics": { + "saturation": 3.073712015270428, + "non_myopic_member_rewards": { + "quantity": 595448695416, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 8196260, + "unit": "block" + }, + "relative_stake": { + "quantity": 80.87, + "unit": "percent" + } + }, + "cost": { + "quantity": 142, + "unit": "lovelace" + }, + "margin": { + "quantity": 24.5, + "unit": "percent" + }, + "pledge": { + "quantity": 25, + "unit": "lovelace" + }, + "metadata": { + "homepage": "kF𹘉x[4(;&QJ𶝹u􈠒a󤱧H!󞤱F\u0010\u001f{F񂪟\u0010\u001e\u0008t:\u001dU򍶢񣎍%񤈵󤠡nqf~\u001fiTuy6)󹫌\u0014񒝑|򻴗򁍊u򪇣+󋊄a󸪁򤶁𐕦AN󤏕4", + "name": "򸾟\u000b\\k\u0010np񁀗@򷮮󠥊\u0000`񞇒\u0007󖐐򤉶󽠽􆐐z񚘗􈔌^\u0012g\u0008/𢫼CLn\u001ec𭂌qp\u001dd񗈸/q", + "ticker": "bg\u0000`\u0010", + "delisted": false, + "description": "z򺊩\u0010\\As\u0001j\u000c\u0006\u0011XD{󨇧\u0007⤘i:񬻱6򜙃&F񗋱F\u0017凁tP32im򜉔e\u0008󭋰cWZN_򏻜𷵏mY󿉬]\u0005v𴀹\u001bj𶀲G,Z\u00035𻷽K󪭄𦩄Av2n𚑿j\u0000\u0005񆖏Boy%򿙆񊄘񢍧𳭎𐣩\u001dJxt0G@;y\t\u001eLe3򀏶NR󧊋򲿚\u000f1𦅗\u0019N󪉛\u001c@򅿑T񿍁􅁠򯖩;󬯑V򓝳񹀁𰺊UCd\u0002&\u001e\td~R\r󂖏)\u000c񢙴𸙯H}󩎫\rI\u001eW\u0016\u0007\u001d\u001fC\u0015r|􅏞\u001fV.򱋻\u0016;=󎺍\u0010\u00122EvH\u001a\u0017𹽏󌖯M\u0000\rA5\u0012O8D\u0000\\\u001e \\c\\\u0011uv\u0015\u00044򡼢򯿠GflW\u001b:$s\u0013N𻌃񒰊p򊀘򧍟\u0005bC󘬡󕙦>\u0001y5𨿁]'𖉙󭁱#d𵴟򉎙\"(\t>y𿡬\u001f\u000008񙾴" + }, + "id": "pool1t803g2gluc7euyxexw07fatwsjhsmvvt0wfunepw6pkss5uju92" + }, + { + "metrics": { + "saturation": 2.5033964020937516, + "non_myopic_member_rewards": { + "quantity": 556519519456, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 9155453, + "unit": "block" + }, + "relative_stake": { + "quantity": 66.19, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1861-11-06T17:07:59.450186822889Z", + "epoch_number": 32531 + }, + "cost": { + "quantity": 243, + "unit": "lovelace" + }, + "margin": { + "quantity": 38.02, + "unit": "percent" + }, + "pledge": { + "quantity": 54, + "unit": "lovelace" + }, + "metadata": { + "homepage": "m罪\u00117𳎯򗗘𪏳hdts{\u00166򄨓\u000bs&𐪇@Rc", + "name": "o\u0008\u0015zVa}𰋋󯦸FF󡚏m.bf|\u0011ljᜎ\u001f", + "ticker": "`򀉹r", + "delisted": false, + "description": "C4;𳟣_򛩔R򯐌򬞠󻿞Gk񩋾sUJh𭚡䙊\u0003&T𣦄򦋃^\u001f" + }, + "id": "pool14s884kf0wwyz0rdaejv8lrv9vwmuzrhge5mu8lz2p6x2vwpm62u" + }, + { + "metrics": { + "saturation": 4.572750773211776, + "non_myopic_member_rewards": { + "quantity": 2629943280, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 4429294, + "unit": "block" + }, + "relative_stake": { + "quantity": 24.93, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1869-01-31T03:00:00Z", + "epoch_number": 24862 + }, + "cost": { + "quantity": 193, + "unit": "lovelace" + }, + "margin": { + "quantity": 14.57, + "unit": "percent" + }, + "pledge": { + "quantity": 49, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\u0018PM𮌐/u񺶯QsPS\u0018󱜡h-jm0\n\u0011W\u0008{􍝑𸐞K[\u0006\u000ew𴀚(^\u0012\u000b\u0016gn񣜗uII񅩢󬋣$𫴇򄎇2\tgnt}\u00014e)j􇷵r\u000b񤱗\u001eI1Q򂲳Nl\u0004d񋨒9Za򙈋SRXAf󎋾\u0006l-]𜖬", + "name": "p'|\u0006񞰤P`O", + "ticker": "_󡤋i", + "delisted": false, + "description": "\u000c>R򏥳7B𛻠A󞬯B󭕠󛙡=\u0007rtC\u0003y^󓤲4򰷎_\u001c􆀨𕏋`YR\u001djP#򫖝򞂵\u0004\u0000󥋽񞄌bY򜦫e<\u0006Ꮮ\u0001J7R?Pz󠳭&\u001a\u0003@񹙯S/?򿭀4O󙴟:3󵡖􁀕\u001aw+2Q:e@򗰵!\u0006\u0014\\𿄌&8򀮫W\u001428x90񥎗", + "name": "@󝢚񋮒\u001b\u0003,񷨦#m\u0016 􂜄󅠞l)𨜧򹶴H􊺣o\u0007\u000e\u001f~", + "ticker": "\u0006F񸑑fA", + "delisted": false, + "description": "𠨏ev,+\u0015=FS󀕖2;4^󰖻rr󇃥3C\u0000M3Y󈟪)2u\u001d󶽁g6\u000eJ񽁦򈠱񥯐!󁝮`\u0006񨠕kutUHP 򰍆\u0004󨺏󴪬!\u000f\u001d𔺂qq\u0017M\u001d<򲴤0򀦓O#21򬷔񌅠󂘊tB\u0016󩮩\u000f򭹈󪇘\u0018=oFup(HqX\u001cy(󤙺𷱢􍠏\u00008􈿛vb󵳜\nR󗥛4񁍠W\u0005_\u000f 񴸵Kl&\u0007?" + }, + "id": "pool1x3dyhukrxwavqg20k29sw0pppye8qt5u0rr3rnqx2vn6gte9ydl" + }, + { + "metrics": { + "saturation": 4.431867142401731, + "non_myopic_member_rewards": { + "quantity": 47605879103, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 9841266, + "unit": "block" + }, + "relative_stake": { + "quantity": 37.37, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1884-02-15T12:00:00Z", + "epoch_number": 13477 + }, + "cost": { + "quantity": 84, + "unit": "lovelace" + }, + "margin": { + "quantity": 16.11, + "unit": "percent" + }, + "pledge": { + "quantity": 37, + "unit": "lovelace" + }, + "metadata": { + "homepage": "𻨫\u000bH\u0007󭦙슇K\u000bs񶠿!\u0013&=󼮎\u0018r񾞩hX,􊰙Dꭥ3\u001b{M\t\u0004\u0014L|r\u001e𴇖R!>:㦷쿴򗈼\t>w%f&", + "name": "H/w򲖕l9𔢹\\fy𞌇c>\u0004|Cb", + "ticker": "(\u000c+u𳌋", + "delisted": false, + "description": "|\u00112rt􍂹]-w\u0008񡣂\u000f\u001aaPMO\u0019\u0005󸡶𡥵􎼱B=􄓸" + }, + "id": "pool1mxk8f42kdtd7jvcn6ge2lryl5ah3fy62ffah6zq48mhauwvk9y9" + }, + { + "metrics": { + "saturation": 1.9943509437924078, + "non_myopic_member_rewards": { + "quantity": 571373258738, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 15595921, + "unit": "block" + }, + "relative_stake": { + "quantity": 8.55, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1891-11-17T04:12:08Z", + "epoch_number": 3484 + }, + "cost": { + "quantity": 20, + "unit": "lovelace" + }, + "margin": { + "quantity": 21.79, + "unit": "percent" + }, + "pledge": { + "quantity": 140, + "unit": "lovelace" + }, + "id": "pool1ertjmrx9x0dds88kp5tk062vguywfmrj9777q6aszmdmv2evf9s" + }, + { + "metrics": { + "saturation": 4.8399970202666625, + "non_myopic_member_rewards": { + "quantity": 3336032756, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 18777272, + "unit": "block" + }, + "relative_stake": { + "quantity": 25.71, + "unit": "percent" + } + }, + "cost": { + "quantity": 169, + "unit": "lovelace" + }, + "margin": { + "quantity": 15.84, + "unit": "percent" + }, + "pledge": { + "quantity": 189, + "unit": "lovelace" + }, + "id": "pool1q24a4jm26n8vep30g49sydhhns0gnwjm5w0nardpy3akypjk4um" + }, + { + "metrics": { + "saturation": 1.4301254486735748, + "non_myopic_member_rewards": { + "quantity": 442122595325, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 8702806, + "unit": "block" + }, + "relative_stake": { + "quantity": 42.16, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1883-08-26T17:56:15.383107187477Z", + "epoch_number": 5059 + }, + "cost": { + "quantity": 216, + "unit": "lovelace" + }, + "margin": { + "quantity": 8.43, + "unit": "percent" + }, + "pledge": { + "quantity": 47, + "unit": "lovelace" + }, + "id": "pool104u5aecxzp6k4u024eppkm0ghckder23plsvt30zctu6ucjyggk" + }, + { + "metrics": { + "saturation": 4.656242326213285, + "non_myopic_member_rewards": { + "quantity": 824570899995, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 14752165, + "unit": "block" + }, + "relative_stake": { + "quantity": 86.18, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1900-10-01T02:00:00Z", + "epoch_number": 16070 + }, + "cost": { + "quantity": 206, + "unit": "lovelace" + }, + "margin": { + "quantity": 44.94, + "unit": "percent" + }, + "pledge": { + "quantity": 213, + "unit": "lovelace" + }, + "id": "pool19n27pa6gfkv008gz9fpwx7lplpcp03tgry6jhm8kprawkt6ww6y" + }, + { + "metrics": { + "saturation": 1.4709251807785217, + "non_myopic_member_rewards": { + "quantity": 501608895712, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 15276190, + "unit": "block" + }, + "relative_stake": { + "quantity": 87.26, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1903-04-18T18:39:27Z", + "epoch_number": 26232 + }, + "cost": { + "quantity": 152, + "unit": "lovelace" + }, + "margin": { + "quantity": 9.96, + "unit": "percent" + }, + "pledge": { + "quantity": 78, + "unit": "lovelace" + }, + "id": "pool1dnw5m50lvete7nfpcqzq8qx9qltvgd64lxal50mey5w4glhkves" + }, + { + "metrics": { + "saturation": 2.6904653649897163, + "non_myopic_member_rewards": { + "quantity": 157414668611, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 15623124, + "unit": "block" + }, + "relative_stake": { + "quantity": 91.31, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1868-10-25T22:00:00Z", + "epoch_number": 28000 + }, + "cost": { + "quantity": 33, + "unit": "lovelace" + }, + "margin": { + "quantity": 54.61, + "unit": "percent" + }, + "pledge": { + "quantity": 0, + "unit": "lovelace" + }, + "metadata": { + "homepage": "󭓣? \u0003o>$G\u0005Fa򙧈]\u0017}5,E󊘎C\u0015󤸧?񫤦v򁱨𐜵s\u0013", + "name": "񮛊w-`v>]", + "ticker": "\u0015\u000c;", + "delisted": false, + "description": ".4cT񘪠򢱥\\KIn\u001d𻣚񈹯??񗨠", + "name": "\u000bU\u0014fh󌰕]l𘘇c񢙃!T;𬞭򾺁򍅏򺫌$dga(󠥦-b\u0001W𲊓", + "ticker": "񭀃x!n", + "delisted": false, + "description": "\u0002Z𖌸񫽇D󐝉>kM_s\u0010s4'\u0002\u0000F􂠤O\u0010L@d\u000ep&򹼹\u0008ZU\u000e9󛠰񬌺VY/\u00135c򐎊򚾑Q\u0007;KI9󺊒<+򢘝𘀴v\u0005񃉠u򉇽8R󵬄󎛥\u0019􁭜󸌞bAx2򐥗󑆉s<]\tmo򵞠:򢁏󈷀g\u0019U󑗵9I_򑏴MU򼮰jW\u0006\u001f񱫵򔃟>l5\u0004򖖟\u0002v\\\u0011󘂔\u0018񿿸𳞳#&򳍊󕆙\u0005RZcc;X\u0016}|<\u0003j񜒏G\\j\u0006\u0007񠌰d?\u0002[򮰤P\u001e񍜉5F!" + }, + "id": "pool1yg2u2mmqxf9qz5yjnzqenv4rqcdfy8lv25m8hds8py772yqz95f" + }, + { + "metrics": { + "saturation": 3.9576826387344397, + "non_myopic_member_rewards": { + "quantity": 814610532058, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 2135098, + "unit": "block" + }, + "relative_stake": { + "quantity": 42.65, + "unit": "percent" + } + }, + "cost": { + "quantity": 225, + "unit": "lovelace" + }, + "margin": { + "quantity": 70.73, + "unit": "percent" + }, + "pledge": { + "quantity": 141, + "unit": "lovelace" + }, + "id": "pool12ezgd4cjkymvzczx5hnnhjh7c8sj7cxdzghqlamtc59p2xkfq7d" + }, + { + "metrics": { + "saturation": 1.6535762062058463, + "non_myopic_member_rewards": { + "quantity": 293325613029, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 9867705, + "unit": "block" + }, + "relative_stake": { + "quantity": 43.79, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1886-05-25T01:00:00Z", + "epoch_number": 21242 + }, + "cost": { + "quantity": 12, + "unit": "lovelace" + }, + "margin": { + "quantity": 46.62, + "unit": "percent" + }, + "pledge": { + "quantity": 118, + "unit": "lovelace" + }, + "id": "pool1dq2p3uxf76dljhkg3wfzdkz9mqamy25fwcr7n5jdr6dpv02s99y" + }, + { + "metrics": { + "saturation": 2.4211963800182428, + "non_myopic_member_rewards": { + "quantity": 398496177606, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 19485588, + "unit": "block" + }, + "relative_stake": { + "quantity": 35.15, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1897-01-14T06:45:27Z", + "epoch_number": 596 + }, + "cost": { + "quantity": 34, + "unit": "lovelace" + }, + "margin": { + "quantity": 18.42, + "unit": "percent" + }, + "pledge": { + "quantity": 99, + "unit": "lovelace" + }, + "id": "pool1372x74y7j6nym325ymq8ury3gqcwfrkl9dxdvqvapqc9ux8y98e" + }, + { + "metrics": { + "saturation": 1.45068708455576, + "non_myopic_member_rewards": { + "quantity": 132646351126, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 4098915, + "unit": "block" + }, + "relative_stake": { + "quantity": 40.07, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1887-11-12T05:05:38.787273170424Z", + "epoch_number": 4785 + }, + "cost": { + "quantity": 199, + "unit": "lovelace" + }, + "margin": { + "quantity": 96.09, + "unit": "percent" + }, + "pledge": { + "quantity": 252, + "unit": "lovelace" + }, + "metadata": { + "homepage": "MxYmxP\t󲽆󤼁\u0008S\u0007", + "name": "񗀰4\"u>a\\q", + "ticker": "󖌶yuD", + "delisted": false, + "description": " 򊱺7i\u001aq:񨹋Z\u0019j\u001a𺶏~󞻚(\u001a-r򠦸`6`P\u000bY\u001e\u0011}񐾈|=\u0002_󔀳񭵪\u0003?F򾬕;6%􀲋%8򋩣6\u001f\u001d𭀣򳺀:7\u0005[n\u0004\u0019\u000f~0\u0011򑭺oGIH񧶓\u0002g񾳔~񻄈h\"𛶳𖛊\u000f@u[𶐿񤁡~2󘽐/x痾udYJ5\u000c\u001c⮴,\u0004򼋋E4򿭾M\u0007V^B<1?\u0016O1,\"򂼏02*򈭌򵏍񉪄\u0019f\u0011\u001e𓳎4M񰬷'" + }, + "id": "pool1h6dvc8z9yqlfl6m34pdjneyrlvyt74652lehv426ptm5csqpcdk" + }, + { + "metrics": { + "saturation": 1.687973081394808, + "non_myopic_member_rewards": { + "quantity": 36871842271, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 8162233, + "unit": "block" + }, + "relative_stake": { + "quantity": 93.32, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1877-06-04T03:03:17.647423017241Z", + "epoch_number": 9667 + }, + "cost": { + "quantity": 73, + "unit": "lovelace" + }, + "margin": { + "quantity": 36.39, + "unit": "percent" + }, + "pledge": { + "quantity": 191, + "unit": "lovelace" + }, + "metadata": { + "homepage": "𒋖L6񹊌𨀥_R ", + "name": "񚿺\u0018MK󟲇󮫔Kz񹬤\u0005򫩥@𲚁򧚀\u0018\u0012*񚢹dGj𮼣~H\t񂀳\u0008BHP\u0001񺜨L*", + "ticker": "轥'd", + "delisted": false, + "description": "}󏆇73񣼅L\u0002򊾌\u001dlmTM򳤟]R󛕨|󂌫(0\u001c\u0005@[Y[򇛡YZL\\jvS򯅓)\t𲫇GB(򣲧\u000f󭷮n\u000cU񰃵󬺟\"P񉚢9)󧾆f\u0013􁪜򸘭򻫓[%Ard󥅱!t񟈽77?h\u0006V\u0003j+\",咚6򑶃:𝋣\u0018:=l*9򍦜\u000c\u00138-姛󼬖󰿕Z󘔇`?QI\u000c$8\u0006_0\u0006𵝒;?􎂽\u001e㸩󒸣}\u001b𲍕񔤚[<:i󝧉\u0003m\".M=f󌉓8\\gI7Tqd\u0008?;>\u000e%N󥋣\u001b񤟳􂔖3:'󳲦򥋛\u0018\u0004C#𠽵숾vabp򬅽|R\nb󏧁&f󀷗1]򥏕\u000b󑱭w􄢤󦧸F󍐁\u0004򺒏0\u0019d\u000bh좩A\u0019򕽢iJ 0\u0005񦝌" + }, + "id": "pool1z20juu5ynxaucrkltwxjv9rgdyv3u22jpq2l2hhulaa0jplze3u" + }, + { + "metrics": { + "saturation": 4.816296053453936, + "non_myopic_member_rewards": { + "quantity": 870809709093, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 12983253, + "unit": "block" + }, + "relative_stake": { + "quantity": 92.11, + "unit": "percent" + } + }, + "cost": { + "quantity": 68, + "unit": "lovelace" + }, + "margin": { + "quantity": 26.9, + "unit": "percent" + }, + "pledge": { + "quantity": 97, + "unit": "lovelace" + }, + "metadata": { + "homepage": "P|[j0\u0019l_3\u000eMQv|DEpm򑪇񽭔S>08,\u0015078񌹌y\u0001\"V\u001d􇺄所\"󤰧򯮊𮱔\u0002*\u0003Mx򑲍$󊫱󔣝\u00123񵝔sp", + "name": "{\u0016\u0013i\u0017\u000bul򁑠7Jj󮸐􉾅\u0013&\u000el\rxo\u0004D\u0000X<뎯\u0014򤯈󌀢\u0004򋤌\u0014󮴉W𖱂", + "ticker": "^\u0010+𚷱󙚘", + "delisted": false, + "description": "񿔮򶀤򶔎R#\u001eIK𘋽]G8rO:)񨾱\u0019H\\񴃻\u0006񨵠𯹗\u0014𷷌UDJK~dLhP󔘳/`𤗨h\u001fzt\u00165\u001b\u000ey[񎻋|}A" + }, + "id": "pool1jdxqv9542c0wd99dddrdazf5t0ulfz5kdpj8w0ezlurcwhr2t9d" + }, + { + "metrics": { + "saturation": 4.814392801375711, + "non_myopic_member_rewards": { + "quantity": 565517938130, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 10468601, + "unit": "block" + }, + "relative_stake": { + "quantity": 7.11, + "unit": "percent" + } + }, + "cost": { + "quantity": 147, + "unit": "lovelace" + }, + "margin": { + "quantity": 95.59, + "unit": "percent" + }, + "pledge": { + "quantity": 253, + "unit": "lovelace" + }, + "id": "pool1wkwg5cfr8z529sz4w4srnc3e7xc3yl998j2lftwp9sl2ynuwxau" + } + ], + "last_gc": "1896-01-06T23:00:00Z" + }, + { + "pools": [ + { + "metrics": { + "saturation": 0.5735287513219206, + "non_myopic_member_rewards": { + "quantity": 691211791932, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 13966524, + "unit": "block" + }, + "relative_stake": { + "quantity": 2.02, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1889-07-14T09:00:00Z", + "epoch_number": 8248 + }, + "cost": { + "quantity": 69, + "unit": "lovelace" + }, + "margin": { + "quantity": 6.56, + "unit": "percent" + }, + "pledge": { + "quantity": 101, + "unit": "lovelace" + }, + "id": "pool184x60004d3mhqjdsp2h6lky826tdmuhpjzmvkwfj4j8hzyc0tl2" + }, + { + "metrics": { + "saturation": 3.755809195670386, + "non_myopic_member_rewards": { + "quantity": 828870232480, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 17068193, + "unit": "block" + }, + "relative_stake": { + "quantity": 29.7, + "unit": "percent" + } + }, + "cost": { + "quantity": 244, + "unit": "lovelace" + }, + "margin": { + "quantity": 62.64, + "unit": "percent" + }, + "pledge": { + "quantity": 198, + "unit": "lovelace" + }, + "metadata": { + "homepage": "'FQ󾝶Cm󳁃\u001b\u000f\u0002{󤐍򌩁%\u000bKx7\u0019\u0019~q􊯚n\t𧻸T񷄌D\u001fA\u0016V𒩯\u001cp𣑻\"񘲛dWD}Cl>𣊾MF,𢊆\u0017-󪄂*t\u0006򛐔y\u0016U\u0019񎑦bd\u00150}\u0005 \u0008m񾒨3\u0016F\u0013^\u001e", + "name": "\u000cḄ$\u001d𔣈zv񩛋3G𾓚y\u0008\u001bg\u00023򄥔\u0006􍆥l", + "ticker": "R\u001f𛁧", + "delisted": false, + "description": "𕵑j2򼲠}\u001c򱠭򨽆3􏓠\"𮙨&gm$GdB\u001f󖢛򦠎K򭥪{Zx\u001cq\u0012S򬱉RJ\u001f_\u00177s𣱀󞇜h@󀢎\u0016󐈹H\u000c\n񛹐<[򞴷򎇸B򡝓U9\u0013v򻔗񔮜1tRbSs􍈃𧠷P5C\u0012Gp񻂥򡯢XF'T\t𣑌I򄰉𦟑_\u000f󸺧絿|\u0014H\u0010'\u0001󱻬D7񪉱󗐁#Y򀜭\u0004$D%\"q򵌧&~vkb&\u001atWy<\u001c\u0014\u001f$:󎿡􄵉Q򩀄񳋡pFX\u0002n\u0000.*jP?50񊏐󖭑d4񢱵v𣬲qP\u0016𜘤񃭈𠛇8𺍫\u0011\u000e6W󍩘_\u0011\u0007Nq;)\u001f򾹁4s񸣇X󠰏򷎙R񩁁\u001b\u0010P" + }, + "id": "pool1szjc469g0fewrsy4jgt2x2nqrdculjjl7cdxsc66mjdfgwm2u7n" + }, + { + "metrics": { + "saturation": 4.159280427276072, + "non_myopic_member_rewards": { + "quantity": 872944767564, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 19617066, + "unit": "block" + }, + "relative_stake": { + "quantity": 2.34, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1886-06-22T14:00:00Z", + "epoch_number": 11135 + }, + "cost": { + "quantity": 190, + "unit": "lovelace" + }, + "margin": { + "quantity": 47.43, + "unit": "percent" + }, + "pledge": { + "quantity": 147, + "unit": "lovelace" + }, + "metadata": { + "homepage": "~񺘭\u001d9kd*v.\u001a񡜾g{vo/DPFDUP񞘃@_", + "name": "h7$򁖵9.\u000e>\u0016@񓨙󤅉𘤣Q\nvx􆹔7󉲆ONawf2\u000c%xN𨱗7\u0010$󕜌^\u0008]󤠚t`", + "ticker": "s'\u001a􅯟\u001a", + "delisted": false, + "description": "v\u0000񉗜󳴥\u0018@\u0007񇂞$NTP򌱭Eh񉄡𕫕J2oal`񈄂󅅱}<.!#_E_\u0003\"򕥝]" + }, + "id": "pool147mp92y468lh9seuqkz3v670z0eh67lzfa0j460f5zyzzzywwtt" + }, + { + "metrics": { + "saturation": 3.1763295392798216, + "non_myopic_member_rewards": { + "quantity": 353284548469, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 2476840, + "unit": "block" + }, + "relative_stake": { + "quantity": 33.44, + "unit": "percent" + } + }, + "cost": { + "quantity": 228, + "unit": "lovelace" + }, + "margin": { + "quantity": 37.49, + "unit": "percent" + }, + "pledge": { + "quantity": 102, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\ro𓬧c~rk񹢩򯯺򖕀\u000f\u0001򍅵l4\u000es\u0019uu򂘍\u001e)8", + "name": "򩋲se򯒺:\u0000}􉟶\u0015Y𮹀񧸑򭄎x𧲺q%\u0017󎍩8*x:\u0004󩜲󚝏tg􅾦", + "ticker": "BU򂪌y\u001e", + "delisted": false, + "description": "vG󲓾\u0000[򐿢񎭟Z\u0005%\u001a󳣤dCNXf󰟬;R:\u001d񖯽:8𼽥\u0013\u001a\u0018\u000b1󔬹H'󠃻;\u00191򬰍w>Ms=-FNF", + "name": "{t윿vEz\u000fvF񒼜i]k3:\u001a*j\u0008E=ᳱ|\u001e򦷠U@\u0013Nb\u0000g􍫚󨮻\u001c󌒉z\u0005l񰅏CBf\u001e𧓃|(", + "ticker": "𒖾󯪿󝵺", + "delisted": false, + "description": "\u0010$e򧘩Af" + }, + "id": "pool19h6zzrd4q4sgxgnjavyqmpu87hxtffzn2e4vjc238dpxwvqm0mq" + }, + { + "metrics": { + "saturation": 2.5008034822950536, + "non_myopic_member_rewards": { + "quantity": 451275295424, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 11796562, + "unit": "block" + }, + "relative_stake": { + "quantity": 61.79, + "unit": "percent" + } + }, + "cost": { + "quantity": 69, + "unit": "lovelace" + }, + "margin": { + "quantity": 53.13, + "unit": "percent" + }, + "pledge": { + "quantity": 204, + "unit": "lovelace" + }, + "metadata": { + "homepage": "j󐅼\"􅩝󝻟a+\u0000𫍵񊀣]󼿊\u0017󾱁𮋥$\u0001nYX\u001fG\u0016\u0011򀙺𬿲:v\u00121򜙏\u000b\r󺲒+󦮴", + "name": "%c񉗒𚻷󰅱\u0019q𮟶\u0005󻫸񳅭{=񣙱򋨪+\tD\u0000ONE\u0019񟬵򀆞J󳷵c𘴄𜃛񈛻\u000bQ𝋼\u0007|W񇵔񎱖Z\r(]*t", + "ticker": "-Ky", + "delisted": false, + "description": "󇶵fᬫ\u0016!25򠿸\u0012\u0000np?\\gN\u00185𞇍\u0013Vq!􃞮\u0018♡7񣘇Z\u0006(Qz\u0015.󋪰𦄝\n%s6Ph񞉮񘏷d\u001ae>Z𽹲󔶎GB򩞰\u0016J2p񺎬'6򄅺>휍*󸄖g\u0011z🳥MZd򽡌󶩙񰕄X\u001cx灗x?b򑿀^SX\u000f=𹺹m鸞󃙮>\u000b^0%\u000f+vb8\u0004\nL\u0011\u001d4񈡍p\u001eg𤁓\u001aN+$R򫆖8\u001fm򕁸𝟛胵\u0010+5'-^󝀧U\u0016,󶖹~\t*𷉵\"f{tI\u001b3򦶚󱺐\u000b", + "name": "񯏕򬶨=\u0006\u0013\u0004M󞙵\\\rk󋅸A\u0008y", + "ticker": "󣂯򣋉\u0018", + "delisted": false, + "description": "!Q U򍽑񤞈󛕾\u0005\u001atFt\u0012򴹙򘭯7\u000ejgRxh^cG\u0001x4\u0012<򅉮\u000eO!󶀻'fhd]#8\u0011󝈂iY\u0017\u0011򏱱M}h4z\u000cM%BJ򽒦Uu\u0013a񎐥\u000c𥄢3/`1Zgx󟴥\u000bb5Sc󝚌P\tE󟕶򤔼\u0011\r焛\u0006\u0016\u0006}fa-𾖴\r󕽴`@E\u0013\u0011\rKX\u0006\u001a𐓯CM\u0002{󹝬%" + }, + "id": "pool15msv8v7g47c47znhzjzeyqkvzvjamqm8u4djdtwhgs2fvddfjvn" + }, + { + "metrics": { + "saturation": 4.998526959807526, + "non_myopic_member_rewards": { + "quantity": 540962386930, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 6679804, + "unit": "block" + }, + "relative_stake": { + "quantity": 89.49, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1871-10-09T14:13:21Z", + "epoch_number": 22050 + }, + "cost": { + "quantity": 207, + "unit": "lovelace" + }, + "margin": { + "quantity": 9.48, + "unit": "percent" + }, + "pledge": { + "quantity": 4, + "unit": "lovelace" + }, + "metadata": { + "homepage": "򃋍8}\u0011l.:!A}򯘁\u0012󚕀\u001b5񶈩񞉴󽸚🱑:0c\u000b7@5w򶫿9󦞜𶥽򚏷jY,o񻂊}sYe2U\u0000򚇸AM􄄿􅸑󟮐", + "name": "\u001bq>᫲\u000e:<=u{\u0011[-\u0008RB󶯬r򬾲𕬼<\u0004o\u0018\u0013\u0012", + "ticker": "2{H#", + "delisted": false, + "description": "\u0018\u0011򜲊iqL(\u001f󉟗\u001a1񋠒Y{󻥵mXkPSpx\u0007 n򉮘W4\u001bj󈂙a\tQa󐵯󋮠Z𡳑k\u000e񈳉f\u0003V𐌶5o򀑼\u00183]}-𛱗\u001f>N󱍽D򢁦B󹽯\u000bSM%\u001e򊝲\u0003󥊞/7V\u000eh;붸񍰧\u001f񅖗\u0019;򼇆O𫔂\u0008\u0003k\"I\u0012B0\"o뱚𦹳\u0000񲷪k>񚴲= 1a[񧅲Y\u000enu\tz)$2𚾱C" + }, + "id": "pool1ql2um8rpaq9snr25vqhtkmsvtge0uuqk20p0gkxslhnsw5qyvg2" + } + ], + "last_gc": "1869-05-13T02:11:48.596084715934Z" + }, + { + "pools": [ + { + "metrics": { + "saturation": 3.4395280675630193, + "non_myopic_member_rewards": { + "quantity": 702045573599, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 15976862, + "unit": "block" + }, + "relative_stake": { + "quantity": 83.31, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1879-01-22T23:00:00Z", + "epoch_number": 19861 + }, + "cost": { + "quantity": 248, + "unit": "lovelace" + }, + "margin": { + "quantity": 30.95, + "unit": "percent" + }, + "pledge": { + "quantity": 70, + "unit": "lovelace" + }, + "id": "pool15xd7fdcenp0gpw7ml53rg0vtkkhkqax5nxrhnv7e6h75jagtal6" + }, + { + "metrics": { + "saturation": 1.7933164730191697, + "non_myopic_member_rewards": { + "quantity": 84162678754, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 19041757, + "unit": "block" + }, + "relative_stake": { + "quantity": 30.79, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1868-05-11T02:50:51Z", + "epoch_number": 2062 + }, + "cost": { + "quantity": 43, + "unit": "lovelace" + }, + "margin": { + "quantity": 12.19, + "unit": "percent" + }, + "pledge": { + "quantity": 181, + "unit": "lovelace" + }, + "metadata": { + "homepage": "c.\u0008󑷈\u0017`\u0012^q񨩴$u z򏷱\u0002򠶢t>;򮓔𒉌򍳨\u001aﭠj󨓪\u0002񪷄\u000f\u0006eJw,񜞑LO䀣񙈤2\u001f]M\u0015\u001cas", + "name": "\u0010=v", + "ticker": "\u001d\u0000@>.", + "delisted": false + }, + "id": "pool12enzvx42hgj60edt6wrcrzr83mxhwxx8aky6ft3pf4rdvzxp3kp" + }, + { + "metrics": { + "saturation": 3.1570436549177705, + "non_myopic_member_rewards": { + "quantity": 984844454796, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 11905792, + "unit": "block" + }, + "relative_stake": { + "quantity": 35.68, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1879-03-20T20:41:39Z", + "epoch_number": 32667 + }, + "cost": { + "quantity": 63, + "unit": "lovelace" + }, + "margin": { + "quantity": 33.92, + "unit": "percent" + }, + "pledge": { + "quantity": 198, + "unit": "lovelace" + }, + "metadata": { + "homepage": "T_3𔬗KU򍄆\u0007Y;򬼳򙞼d$I󓕈n􄳜󜷍򺝃\u001a󊐖𑭀0󧢇x󮋘\u001c>\u0003f@E\u0017񛇹&R$𪍛vD\u001dj\u0003\u000e\u000f-򆉤{\u0005p􌑣{MO\u001c񪧛1𔱼\u0003\u0000[X\u0004)𐌳v򤳢񘸃Z\\򗶸3dG\u001d\u001eK\u0019󅢮{T\u0012s򾵲bJ񇳦||󵽬󮒴zx&&", + "name": "\"*\u0003Ns-\u0004񖫴W𿝅Ow򹙰&O\u0001A8\u001b󿭋V", + "ticker": "P%'", + "delisted": false, + "description": "Y|󴟕kKQ𾠹~\u0000񼇒𴖵<󔣈t-񑝇ꭳ;𜑺l?F󁂱U󮬦𯈇$I\n\u0002\u000bnch6u" + }, + "id": "pool1y8dmlf6e7lua3285ghcmyzuh8sh2zrr46n0r22gasj8fg8h60hq" + }, + { + "metrics": { + "saturation": 4.816136206511193, + "non_myopic_member_rewards": { + "quantity": 253476352854, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 3246191, + "unit": "block" + }, + "relative_stake": { + "quantity": 48.47, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1860-03-20T05:00:00Z", + "epoch_number": 23342 + }, + "cost": { + "quantity": 254, + "unit": "lovelace" + }, + "margin": { + "quantity": 93.88, + "unit": "percent" + }, + "pledge": { + "quantity": 47, + "unit": "lovelace" + }, + "metadata": { + "homepage": "򝌏(d򜍃\u0013󯑀𪹌󩏻򈖓Rp򷊕\u001b)Z򠆰u:|.򬝕\\\u0001/&p񢄘T[Q!N\u000c1I\u00114}\u0001򅙠󊥺\u0008>k󄐙=5󚃧O󅻵\u0010𷭔\u0001񔯘9VD\u001e\u0001󺬔󡇫𒗋𮭏", + "name": "A\u0018򶿣`\u0019AM󈘼\u0000򧢄d/򓋵򮊉𝝠)\u001c:lV\u0010r󑙚'󀑝&\u0013􎦢", + "ticker": "<񧶻\u0019G", + "delisted": false + }, + "id": "pool1pmeq0cmx2hvd7a0vytd85fqkv94zxqrlat0a0r75admdynf2nug" + }, + { + "metrics": { + "saturation": 2.397681469551909, + "non_myopic_member_rewards": { + "quantity": 463793746867, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 2867080, + "unit": "block" + }, + "relative_stake": { + "quantity": 73.26, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1907-07-05T14:00:00Z", + "epoch_number": 5231 + }, + "cost": { + "quantity": 168, + "unit": "lovelace" + }, + "margin": { + "quantity": 1.82, + "unit": "percent" + }, + "pledge": { + "quantity": 42, + "unit": "lovelace" + }, + "metadata": { + "homepage": "+\u0011(~\u000b\u0013In񽳺q`Dx9𵠷򋤲u\u000c򦜄.r", + "name": "9tZ\u0017󃫗𔊠󯯛o{n󎿚񏭥|\u001d񕮦p\u0002;\u0003򦓻!1\u0017W5񃨇k*|+?\u001a򮠛򶵓𴙏[@]?h%𓛱𦻜B", + "ticker": "𽺘W\u0002Z", + "delisted": false, + "description": "%󓇲8vk\r\u001f]򃯐\u0007\u000c򒵡AP@?\u0010򾁊N󁾏?󇧺wQ\u000b\u001e󲫠.!B򛢩\u0014𭨡2񃖕񥮚o󉗚%[\"/\"tZv􈴛𰉭\u0002E\u001b񟽓A\u001dW\u0010u91􂀾\nO\u001f𩖫X񾯓\u0019vNL[򽯧 짯#^K񬛐F\\3%m󽼓n򻀩򣬖" + }, + "id": "pool1ympumx4eec4txd9kxp092zhn5zqgkv2shm739alv9fgvgzasyc2" + }, + { + "metrics": { + "saturation": 0.5506146153918046, + "non_myopic_member_rewards": { + "quantity": 460048288477, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 2018874, + "unit": "block" + }, + "relative_stake": { + "quantity": 25.08, + "unit": "percent" + } + }, + "cost": { + "quantity": 96, + "unit": "lovelace" + }, + "margin": { + "quantity": 13.09, + "unit": "percent" + }, + "pledge": { + "quantity": 246, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\u0018sF󃪜񔗨򜖕󝸪>m\u0000\u0008k󊰾-\u0002|򤌸xy+򢶫nd򋹏\u0008UGXXP\u000b𶒨E񽁇LusA\u000857\u0018&m\u0019\tI.\r\u0004􄰗@", + "name": "􂹣x@r􆚗󒧪􊙁񑥒*~𽍀򁭑0~񕥵L𑶛\u0012򀉶򚒢\u0015곭g\u0003&񃸿j`􃢬\u0008𡪤\"󅤏.\u0005򔃁&", + "ticker": "\u0019\\$\t", + "delisted": false, + "description": "椅U\u000cg6\u0006\u001c񷱌QpV9𹊂\rX񆐄YKp񠸁񁶇)󥕰\u0011𾡊.\u001d򧑄:Tbv3Q\u0006\u0011\\򠔉򀕁I򹮥\u0018棈\u0003󊇾\u0008\\񖣑󎮌.𿢍쪺H\"d\u0002=U}AtZ&,fw(\u0018$*Q\u0002z򟫀9L\u0008F*Yt}𒕾sD,s\u0010Vd񤹱\"/\u0001'\u0012o󋫏" + }, + "id": "pool1wmtsqcvkgueptz3ydwtutn6nxdn9clznp6py9y92t89nc56gj32" + }, + { + "metrics": { + "saturation": 3.0007964166365673, + "non_myopic_member_rewards": { + "quantity": 879659659898, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 15659473, + "unit": "block" + }, + "relative_stake": { + "quantity": 31.85, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1904-12-27T22:26:39Z", + "epoch_number": 6754 + }, + "cost": { + "quantity": 28, + "unit": "lovelace" + }, + "margin": { + "quantity": 19.08, + "unit": "percent" + }, + "pledge": { + "quantity": 33, + "unit": "lovelace" + }, + "id": "pool1epjcq8z3mpxd8urddqry66tx373p0u9tas8e4pp6pzv7xhh9ghz" + }, + { + "metrics": { + "saturation": 1.1239243575551316, + "non_myopic_member_rewards": { + "quantity": 258281429978, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 17450885, + "unit": "block" + }, + "relative_stake": { + "quantity": 47.13, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1905-03-29T20:27:46.194866719292Z", + "epoch_number": 29817 + }, + "cost": { + "quantity": 19, + "unit": "lovelace" + }, + "margin": { + "quantity": 42.58, + "unit": "percent" + }, + "pledge": { + "quantity": 19, + "unit": "lovelace" + }, + "id": "pool1rrgvmlc9p0w5je9gng8dwz2gej5zqu7vss98227dvjruz8v2ua6" + }, + { + "metrics": { + "saturation": 1.2394414808330179, + "non_myopic_member_rewards": { + "quantity": 582710098866, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 3087859, + "unit": "block" + }, + "relative_stake": { + "quantity": 46.34, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1903-04-05T16:00:00Z", + "epoch_number": 13372 + }, + "cost": { + "quantity": 78, + "unit": "lovelace" + }, + "margin": { + "quantity": 69.79, + "unit": "percent" + }, + "pledge": { + "quantity": 0, + "unit": "lovelace" + }, + "metadata": { + "homepage": "񥟱|倩<󧟦\u0000񯆜􅥆N􏴕\u001e.\u0018|?p\u0019z5񚱲?f󥭮\u0007\\@󯕫𶴝\u0005\u001a\u000cq𿳋Q󋐛\u0003NZ\u0000k򀄴󌊽𾦌≠\u0017\u0008ୋ򼤜򮉨", + "name": "\u0000󣃑\u001a", + "ticker": "镝\u0001:", + "delisted": false, + "description": "񁣞?Cz_=g\u001eG~􍈨𪁑򺮄_􆡴|\u000c\u00106\\W񵵠{7C񘋲^ᕵ򐧧D񔚠󤉛򏟱g\t\u000eG󬝽.\u000fA󮏔\nBm󤝊+򓄽pK󰲝3o\u0007\u001e1\u000eRS\u000c%8蒨;G񖇉_-&\u0016N1" + }, + "id": "pool1qh997pty04x0zdaq4yhf7z5j5j9e39qdzr04wallh6feqdq2fml" + }, + { + "metrics": { + "saturation": 0.5572380539690674, + "non_myopic_member_rewards": { + "quantity": 958873254729, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 6235071, + "unit": "block" + }, + "relative_stake": { + "quantity": 39.92, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1863-08-30T17:37:54Z", + "epoch_number": 20218 + }, + "cost": { + "quantity": 76, + "unit": "lovelace" + }, + "margin": { + "quantity": 4.34, + "unit": "percent" + }, + "pledge": { + "quantity": 237, + "unit": "lovelace" + }, + "metadata": { + "homepage": "𣹁񬄭?\nS\"񚩛l0Xo󁞕NG񗥊򓡯c\u0008>u|zGzX64񗍺r{\u0013\u0013", + "name": "HA", + "ticker": "_{i=\u0010", + "delisted": false, + "description": "i`\u0008\u0006FR򶖈\u0001\u0011lKr񨱏ᙰ2%\u001d\u001av\u000fw򰭮>\u001f󯱞\u001eS\u0018񫟂𧵍\r򹄆/'&`a5.v\u0014\u001b\rh]$10L\u0002-򭋵E9򺗘\u0013K*\u0006|,\u0004I`󂧳\u0000򦓥4(\"D*(j򏩪W\u0008\r\";\u001b򬹎\u001b{Snt\u001b򘝯񡸹󀈊s\ne0&L|*%,\u0005񞘸I󴮸\u000cH{bCQ񥊥;\u000cj𝍻󀨈lR򕧇Z\u000f*󎿍S􇶀n񡱿>NPs\u0015\tS\u000c򹉱񙝇@0𲐻\u0012L(O\u000c\nX򕚗aq񛞿\rUo~\u000bz?[򌰋a\u000cn?\u001cl󗠩\u0005+\u0010" + }, + "id": "pool10grk9v23zjr0duf8jxqr50m7sdfjqeppl5haf7drnemcz05yelp" + }, + { + "metrics": { + "saturation": 2.3240373245490002, + "non_myopic_member_rewards": { + "quantity": 37818699679, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 13661707, + "unit": "block" + }, + "relative_stake": { + "quantity": 98.34, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1862-04-18T13:48:37.24515902894Z", + "epoch_number": 7453 + }, + "cost": { + "quantity": 26, + "unit": "lovelace" + }, + "margin": { + "quantity": 91.05, + "unit": "percent" + }, + "pledge": { + "quantity": 199, + "unit": "lovelace" + }, + "metadata": { + "homepage": "󕚡󙘿(}\u0000󺑀@󓲙󰹹􍰈𳹧7Z9\rN\u0011\u001e\u0008򐎢vB\u001a\"m:񩚦󷰄󈯸G\u000b<􋝮\u0015\r@\u0012i𘤦񈨯D6pl\u0001Ag𖾔󨛝\u0018N[\u0004Ab5]|\u0001){𺮭_\u001f򉞃h)\u0015l\u0012򮣢󔝍𞊾񰰇\u0010X\u0003e񊧬񗃌}\u0003", + "name": "X𫮿󐓊", + "ticker": "{<,", + "delisted": false, + "description": "tf\u000c\u001dzJ6V{M,\u0012*<\u0005m򈠃n*72\"󿏁,𾝌Rw󯡩K\u0006񷧊\u000bd{\u0012\u000c󳈫a󏝁\u0017\u0019T@5n񩘢񹹈\u0000򍞋\u0000\u0008󁼢v/\u00147.\u000c򧉀 𝘂pW𹠁𘬡\u000e\u001c\u0005\rODrJ(I?\u0011񵫌,ꝶj\u0005\u0002򅈳𪩓񚭐jfx𷽤B𹙐jid+\u0010󝾛\"󫧊V,SV-0񸡊#\u0016󰡧m􁳧!)\u0002򯇺^󻼌/󸮄휌J󁤴j󉶀񕃮􂱟| KV򤈔y󫛿󐍃\u000bGde}񽊨󵒔\u000b\u0012!󅆇\u000f5\u0002u21􎤍\u0017\u0010D\u000e 󱢾5\u0013.\u00190G\u0013R\u0007ib\u0007P\u0008񁘏lV\u001a𓒖񚊅I𲐗i󥮼򈼉Q/MRp󒁛Y񢚚Rv\u0005򊅦V\u000f" + }, + "id": "pool10p6fsa094dz6604p8hjphsmqt3rzd3ff3jztp6dgy8anw58gxjl" + }, + { + "metrics": { + "saturation": 0.8831505260907069, + "non_myopic_member_rewards": { + "quantity": 419950398275, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 13378358, + "unit": "block" + }, + "relative_stake": { + "quantity": 69, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1904-01-24T05:33:06Z", + "epoch_number": 6877 + }, + "cost": { + "quantity": 217, + "unit": "lovelace" + }, + "margin": { + "quantity": 19.73, + "unit": "percent" + }, + "pledge": { + "quantity": 207, + "unit": "lovelace" + }, + "metadata": { + "homepage": "򑶫or\u001a𩶤񅀋򀽌hlbjf@0BY󀬍UMq\u001e9;S\u0018Z", + "name": "򫄮V󚌃Yd𠳈q򪹅Kf,3𼹜w@M𼒊$x#X4򱾗򄑇񫜕󫰀񱇥w󀵪L󳋴u\u0002G򾡲YA𘦝]ऒ\u0016`", + "ticker": "󚳄F򠶈\u001bZ", + "delisted": false, + "description": "FD*򭞯J,\"\u0010b𠰰\u0007C\u0007D)#\u00068\u0010!\u000fh%L𼽡{k\u0008󍌉Tucn\ngIie*󊯰󽴥lu\u0004\u001d򲍟񱕺HN\u0014D'\"\u00192,\t𪛤<#񘠭ayEJ\u0002񄹸d\u0010m/'\u001b\\\u0004x񜖛O\u001f藁D\u0005xvD󈚥:Z7\u0015E\u0018}>򼛾f񭥣uP'E󒌶Wfs񮽒󗞜\u0014Gla?j\u00181H񱿄\u001e𴴵񎓋m{𡟎YM񹣭_S󠗞橕OL;񤫋bWiL70󅱆𿵧I\u0018\"𛑛*iHR+󐍨򭷱򟉛]񷺄C( 񡵤C&\u001fEM\u0010`A^@󬹡'\u001f񚷙0_\u000f\u0014x󑨴*z}\r\u0008򆋟c:񨮅L\"*񞯁}sM\u0003H𗸞u\u0003\u0002\u0014u󯡍t👈<\u0010[C󲼿󄜵A" + }, + "id": "pool1zdfd36ln2qxdwl8lafp02jq5vhnh6j7enpfse3cgrdyq78jgp6x" + }, + { + "metrics": { + "saturation": 0.7286938354555883, + "non_myopic_member_rewards": { + "quantity": 28372537381, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 90234, + "unit": "block" + }, + "relative_stake": { + "quantity": 24.87, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1871-05-03T09:11:21Z", + "epoch_number": 26514 + }, + "cost": { + "quantity": 144, + "unit": "lovelace" + }, + "margin": { + "quantity": 97.18, + "unit": "percent" + }, + "pledge": { + "quantity": 246, + "unit": "lovelace" + }, + "metadata": { + "homepage": "񲁼N񉻚op\u0018\u001f􈷷&􈥩|&uM\u0012\u001f5󬨅>5𝹴:bAL򥺁󄧳󦏣WR=.򓤋d^ME\u0013򴅜򇘁[\u000c񆀯#񜾣\u0007yPY򅧪8􋿒󜻧󗗜lg?򖞄񾥨\u0007>:#GPNydKK0+\u0011D򐀆f\u0007", + "name": "*E", + "ticker": "o\u0014񻱄񞼰n", + "delisted": false, + "description": "栃񥾮񯑢\u0012\u0014\u0013\u0012\u001c<򯵎񢘧!dpZQ!󊛱\u000f@\u001f\u0000_\u001bIs􃻓I!\u00125\u0019-\u0005:􇂘1t1󶄽򩰔p\u000b(\u00167w󢹵,-S񃒰Jg\u001d\u0005U\u0019o񑚫9~d`8Ijy\u0006q\"7.񸡢V)񐷨\n\u0005\\\u0015dY񊲆\\񗱖㣤[𧞳9򭌞\u0014\u00182𧽠񳬕;󊁬*O\\*MW񶸨󿬑򑢥O𬷙e\u0016\u0008\u000bo>.\rJ񘞺-򸣡\u0018𦗯~Ccmr(\"=o򻺄\u0005\u0012r󮅲mO\u001b0Z󈖄Xynm\u001eQM򈖳\u0011A񶙗J1IF<\u0011I\n\u001a񭱣^񑈄{򸢞>P󚛻+n􄳀Q\u0004\u0000]󔦗񤾤񙬩?0񭄚", + "name": "~󙰂c", + "ticker": ",N򯶞", + "delisted": false, + "description": "V񃘬􇵀?y}~*e𨟼\u000c󋧘򍀖X`\u0019'\u000c[I\u001fr]춑񾧐{󑏏'󲩸\u0006񃊥r" + }, + "id": "pool1rxpux3g4q3y2yyn90rrkdgnhsm49fw6a5rcjgvqcqc2qq8v22xq" + }, + { + "metrics": { + "saturation": 4.532363188475593, + "non_myopic_member_rewards": { + "quantity": 85563482603, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 5317284, + "unit": "block" + }, + "relative_stake": { + "quantity": 35.88, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1862-08-13T19:16:02.036884636228Z", + "epoch_number": 30950 + }, + "cost": { + "quantity": 111, + "unit": "lovelace" + }, + "margin": { + "quantity": 47.34, + "unit": "percent" + }, + "pledge": { + "quantity": 138, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\u0013=H|*󮧰2񤩷8*ه4񮓪R\u0019Y(G.w{\u0002:񵂟n}󸙄m[򕧖5󴒵|h񓺣F\u0005𒟊񛎼(\u0001v;\u0019*򦐈h򵭰\u0017󔐡wR\u0017\u0015\u0019󜗣򋃂7Ln򧱂(C\u0005𽴈򐔦󲜮1WDsn$S򍚛2\u0004S򭢵5A򒉇@}\t\n\u00035򩩧*z󢁕򊗅`?𬒯n", + "name": "g񾾑o񾘅R+/_,?<󙹣𐃆򹥳`$\u0000Hi\u000cDo%8 \u0013򬑳E:1󼖧,5󥎎𙒠GX󂊞\u001e\u001fu\u0013%", + "ticker": "Kog", + "delisted": false, + "description": "F[N􌖰𐾺 2K\u0012AEm𥑥pD\r\u0003\u001e\u001b\u0005󚩢?􋤭\u001cc󒟧󛚉G\u00163,L\u0017򢀱񎚊uf\\5\u000c\u0016J\u0016W!:mk$\u0007\u000fcn񤎿F󦩰򧟈󮝂󦩸1$\u0011򏽺Ni\u001b雌;P򊳂\u0019񌱞򕋦R򊁙\u0016/\u0003$\u0019𻡝g\u0001\u001d򦓅\u0013$\u0011򺈐\u0018k󊨬..u>O񒀈[G6_Ey񿹘򗉣l\u0018\u0007󠥈񾛞⒄q\u001c񰈶-ai򚃣\r\u0000n&\u00149󇓗\u0019Q\u000cW\u0001\u0017\u001dJ񳽚Q񮶳X\u0013W\u001bi𮀬Dwa*\u0002\u0014𣺾$\u0004Yd񁭘}򳾼]z񳿇]3\u0013󔍟񋆰\u0012s򖽰J񖎊" + }, + "id": "pool1pk5fq5pvzn98pp96tp36fg3582gf8wjr9dzq6nq6nzly7zc99la" + }, + { + "metrics": { + "saturation": 4.590784855226829, + "non_myopic_member_rewards": { + "quantity": 501521663483, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 1861396, + "unit": "block" + }, + "relative_stake": { + "quantity": 52.93, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1904-11-17T22:44:39Z", + "epoch_number": 25877 + }, + "cost": { + "quantity": 91, + "unit": "lovelace" + }, + "margin": { + "quantity": 81.52, + "unit": "percent" + }, + "pledge": { + "quantity": 91, + "unit": "lovelace" + }, + "id": "pool1s9kvl3tdup2ds9r9xrdy08gxrq57rnspcqgplcq2nrg6kgqa74h" + }, + { + "metrics": { + "saturation": 4.056850542812943, + "non_myopic_member_rewards": { + "quantity": 914345763587, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 6669830, + "unit": "block" + }, + "relative_stake": { + "quantity": 76.63, + "unit": "percent" + } + }, + "cost": { + "quantity": 90, + "unit": "lovelace" + }, + "margin": { + "quantity": 35.81, + "unit": "percent" + }, + "pledge": { + "quantity": 88, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\u000f󂁞,G]𕣺_\u0002\u00036I󏧻\u0014\u001ddm\u0004uh)$񦧙\u0016\u0011'%N$󏞭\u000eOJx񀳽𠜲\u0008\u0016򕅊j񠤌Z\u0006V4𦴗e򴪋p;\u001bYa&󼊻y򃖳Bor2Zr\u001a\u0010y󻰳\u000c?@P𯏓p", + "name": "󊶄#$\r+R򺳂򳼒\"\\5󬐵j`1\u001b򾻫n\u0014\u0007𷆯􀬂tJq\u0018H衏\rO󞭨d󧹫򺠜򑉐G", + "ticker": "aK𮀃󄔳", + "delisted": false, + "description": "F\u0001y\u0012A\u001bN(W\u0010h󊍁_W\u00114񋒌Ei!c2\u0004nY򿡔񍽫~,\u000cN_𞤢𯱣@wO[}4\u000c#𯒟􂱝r\u0000 $#&E\u0006_󁲮\u0002p#􁙍qS$d{j.􉁒5~>\u0005򥐂NZ*񄙃rD󠄝bY􆆀'z-\"_󈬃^e\u0018lW\u0006?\u0010x󄸏\u0004󠽫$4𫬛򡺃b\u001f򞜥򂗺򝶵bW*INsv򍝗3X7񪽆YM*7󰗯6},򮁚\r\u0003𔔯\u001a񸄵2\u000b^\u0014񁏽\t\u001f\u0017F񆚃Y򧦠k>x+]x M0+%󼫘\u0018ib񴛆򂂕L󗓖K񔨦\u0010+񔐯𷔌𤔟*𱅫sH=\u0015頲D񜓥򳰑񃼸>󗯽9;\u001d)Z󥝜\u0001\u00021sI𘏈%6\u001b򕠟񩦸7~򹵚2񓽐\"J,3\u001b\t|򟋆𨦤8\u0012bR\"󂴹u\"><6S𲁎񕴈\u001f" + }, + "id": "pool10lg8p2rukytlmtxyc3r575wp82u3mvf328n7qdv5qtgt7cfa6pn" + }, + { + "metrics": { + "saturation": 1.8723879853090892, + "non_myopic_member_rewards": { + "quantity": 687302409603, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 6254639, + "unit": "block" + }, + "relative_stake": { + "quantity": 85.44, + "unit": "percent" + } + }, + "cost": { + "quantity": 96, + "unit": "lovelace" + }, + "margin": { + "quantity": 3.55, + "unit": "percent" + }, + "pledge": { + "quantity": 198, + "unit": "lovelace" + }, + "metadata": { + "homepage": "S򕚆C򠙭otF􆳃\u0015}2JC򜽻", + "name": "\u0017󯎢\u0010󟢧v\u0012G򳬚\u0017V󓨀*L\u001dwlT𺌥a\u00151", + "ticker": "𲦻\u0003𽏡b", + "delisted": false, + "description": "𴬗e򧷱\u001eM\u001a􏝌\u000e(M6{𧇷t򷵏b(0S󋉖󾍄\u0019l(񠌤6\u0014]񸀛2\u0001D4\u0013󔅥c=M\u001e|v𪿀;}3󐮂\u0000g&&􂂟H\u0001lj0򆔵򳲼gz/󑝒3󠑈._𿇞򧁽󣅯e󈌘0򩼦>r&𲺻*񹹊\u0010\t~5\"񆒑NHcOur1'#\u0012Y򟷙r򣠅&\r,𓇼}n򀬇𯭴tF񖗊񿺸#" + }, + "id": "pool1x6dde6eyeh7xrjrzapxnl7gs6s3ugx4hgtnahxz30zchkq04f8w" + }, + { + "metrics": { + "saturation": 0.3859725028018829, + "non_myopic_member_rewards": { + "quantity": 458178748395, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 5198583, + "unit": "block" + }, + "relative_stake": { + "quantity": 15.04, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1903-02-13T03:40:32.088582911708Z", + "epoch_number": 18274 + }, + "cost": { + "quantity": 214, + "unit": "lovelace" + }, + "margin": { + "quantity": 67.91, + "unit": "percent" + }, + "pledge": { + "quantity": 123, + "unit": "lovelace" + }, + "metadata": { + "homepage": "C򝯝 zTW\u0001-\u001aB\ny9~H𶌟\u0000.PN\u0018i\u0015I񷶊:q㄄\u001f\u001eꄪ]\u0003򢠄󲧲0:񅩙\u0019򚸹\u00136\u0019𠩣􀈥󁝍\u0019f򄻢󄖧7󛫚󯝦\u0019𞊵f;fX񋰼", + "name": "L=𣀾k\u000e\".\u0011Hr/Bg\u0013K󳭖\u001b~򺅤򆌵=\\nb@68򥽈i󗡥󑠜󅀜 񼶼", + "ticker": "v\"k񁎬", + "delisted": false, + "description": ":)󱚖Z񕚟򄽣\u0000\u000b0J\u000b󋅵>)n\u001f_\u0003򳅑\u0007\u0019򦟖`]\u0013򭸻\u0016(@𦟲@b򜤁k<\u001aR\u0001]Y\u0002f󁢐|󢃂q\\\u0015񚭖?\u0014fn񲤚]LQ}Ljc󁤢Y\u001cj-e,z𦫪\u0019B_[se\u0010𔌧󍂴򳖨I\u0014񓟗,Y򑍟񦾷B\u0002\u000e񽥚?񳘲w𼪤򨓋t?R񎐈np=D:'|Q(\u0018TK\u0011#𢴖s򃂬'\u0016􇽝򴛄g'!򽯜K撹'󔧰4񱤩E\u001a'\u0017P\u0018񁷠􄺰\u0004H,񋀋%{V_V󩢡#򉚧\u0006񒭕\u0019]\\`\u0005L'4J\u0017\u001c\u0003񖔱H*R\t\u001e\u000cn\u0006eh􁞪󮮻񛇦M񜵣^񵊾\u0010&\u0001񢏱W\u0000&aqtYE󻶑3\u00153 qxD\u0004𞨈TUG}񂵅\\dX\u0001b\u000ei󠊚abL\u0000􌧵ܶM򡒼\u0017l󎣊󠥰*񥷐)𺂙\u001f\u0012󜘙0\"\u001a𺴬\u0004򈴓񭑏q#\u0005𙼄k?󆁜^\\O;x'Gw𫎀\u0007\tZ&𛅔? }iY'\u000b]ey\u0007#.񂏥\u0004{D򢭁m󽼍KU\u0001𵲠" + }, + "id": "pool1x3a84q7kg8f9kn836eysyx7rlsjuge240llqdsq5sgxhzgmvepp" + }, + { + "metrics": { + "saturation": 3.8800097458733855, + "non_myopic_member_rewards": { + "quantity": 933277669248, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 16564408, + "unit": "block" + }, + "relative_stake": { + "quantity": 98.14, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1899-08-19T07:00:00Z", + "epoch_number": 22369 + }, + "cost": { + "quantity": 245, + "unit": "lovelace" + }, + "margin": { + "quantity": 95, + "unit": "percent" + }, + "pledge": { + "quantity": 87, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\u0017>+c\u0016d\u001em_M\u001e\rmJ󾉛\u0006\u0006Yj\u0014\u001aD򔾨e{p󐘠\u0019񯆬\u0016sW7GH[9\u000e{򩬰\u0017񨆛Q.\u001c\u00101󖣤Esuu`\u0002K\u0019b𼷜𗴾0𻏛UUR\t", + "name": "-\u0012󦴢񁏵\u001a󍳉\u0018e.󱎩򕑾bE󢝚zB0n\u0017yR񶅊Mq\u0005NGa𸃸 z", + "ticker": "=\u0015\u00126U", + "delisted": false, + "description": "򾔗6-\u0010􃷢\u001bV󊙔.򆬋󤂩\u001b򿁈P\u001e򃗙\u0017L)𜎪\u000c\u000f;J//\u0007\u000eN񎠵򱙏/񁼇\u001b*`y7󮫋򪛯c=\u0007󤧒,󅣯[D񫏸\u0005򰟳𾨻\u00036D򥽠󃒘[F񾃶{Is\rm󍬛\u0001\u00101󎐟@\u001b\u001c򝭴󔨍s\u0014$\u000e󌵵g7󃬐xsMDV񱡐7I]\u0007aHQGD񢖮𠅼 H|n#)-󛬒ul󨵁\u001f>\u001d7wt󊐌򋟼@\u0013e7y\u000e)𑞹p􀙙@=\u0001>/󋛐*\u0011󠋾\u001f󋉫󞟂N\u0018\n;7𪬹󂇯\nQ\u0000j]𷼝+񇗖!q9G_$v\u000c\t򌙝&/E󸝱-󬶄R\u0011~[n𜉶񕜜\u0008(R`z􌍐dp\u0007>򠉦\r;Hs񆢺zm\u0005\\8|3(N\u0006𥘼Z􈱗wq񭦘/%-򐊹l[?x/?\u0006^nC!#h)㑨\u0011L󹻮M[\u0008w󉣈_\u000c񋨹򭀛򸼋񤆗=}^\nH " + }, + "id": "pool1ysafz2zlmvrkqey0v4e8v9flwask5wzg3em8q483kw5n7sdmgks" + }, + { + "metrics": { + "saturation": 4.310109735888642, + "non_myopic_member_rewards": { + "quantity": 556653587872, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 11582207, + "unit": "block" + }, + "relative_stake": { + "quantity": 4.22, + "unit": "percent" + } + }, + "cost": { + "quantity": 244, + "unit": "lovelace" + }, + "margin": { + "quantity": 27.43, + "unit": "percent" + }, + "pledge": { + "quantity": 21, + "unit": "lovelace" + }, + "metadata": { + "homepage": "[󢿁\u0016\u001d\u0017T󩐑", + "name": "X?񯩊", + "ticker": "񦕖\u0007F\u001b\u0006", + "delisted": false, + "description": "򁅂TD򥰞YA{_ciL3tx\u0018;򾱝UT\u001dVLkwc\u0000McLT񆸮L7\u000f\u0003NT\u001e$<@ #l\u0008g񪿫b4𒔺j򹣠󛒩򂉘Q1󊜿*\u001f$" + }, + "id": "pool1pagsaqcspsqckgvvq96hr9gmnftasp880aq6zr7klr3vsu4zren" + }, + { + "metrics": { + "saturation": 2.8521740128458752, + "non_myopic_member_rewards": { + "quantity": 921642092631, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 591297, + "unit": "block" + }, + "relative_stake": { + "quantity": 72.88, + "unit": "percent" + } + }, + "cost": { + "quantity": 196, + "unit": "lovelace" + }, + "margin": { + "quantity": 46.36, + "unit": "percent" + }, + "pledge": { + "quantity": 76, + "unit": "lovelace" + }, + "metadata": { + "homepage": "0K񉓻N\u001fQ", + "name": ":`%", + "ticker": "񘅥􂿦󽱅=菓", + "delisted": false, + "description": "nv<񱕊{ x4>[󩞋\u0017m򄔝\\:\u0015D\u00026\u0008\u000c\"*{>𺌕i L񊜚4 *M[@|\u001c,^gV󸨚\u0008ha0\u001d\u00034󁺗󶩢?~9瀹FO𖽜_񨧞^_獹\"AL=􆪬\u001b\u0018vF񲐶BH\u0001\u0001𜷜2=i*\u000b𒸐򷅢󔊕𷁑!M񛄩V9L~{󂲽n\u0018Xt\u0000>\u0008n\u001fz񠶰􏼧𩾃󵂼:fo/\u0015񸟂C񜣉@L1\t|񱮇 񠺬74󢣕)X%M򻯾񃮡\u0000s_{5𕸧\u001a񘫸YJs(A'^񧝱^\u000b\u0014󍓖\u000fVo򴶕8G􉢺\u0004󶘒򗾫jI\njd-MqV􁵻𙮦2w\u0015\u0005]𴀴𷀵C\u000b\r\u0014G򧔻z񴐇񄅦;򴰯󛭱򊖵񔡭񃎍񢆌\u0013򳣗R\\\u0005BH􏲭" + }, + "id": "pool1wrjz4ws5760k593pl20tvgv57tgqdh2fwkmgkkm03argk3lu8w8" + } + ], + "last_gc": "1887-10-03T11:25:47Z" + }, + { + "pools": [ + { + "metrics": { + "saturation": 3.964412249290516, + "non_myopic_member_rewards": { + "quantity": 243079787666, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 7122774, + "unit": "block" + }, + "relative_stake": { + "quantity": 41.25, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1880-02-07T08:42:47Z", + "epoch_number": 12770 + }, + "cost": { + "quantity": 80, + "unit": "lovelace" + }, + "margin": { + "quantity": 39.34, + "unit": "percent" + }, + "pledge": { + "quantity": 169, + "unit": "lovelace" + }, + "id": "pool1za2pnv292eghhsdytwjyp86hemdxnewr8k30fnxur47gqhxkhuk" + }, + { + "metrics": { + "saturation": 3.2715243947306276, + "non_myopic_member_rewards": { + "quantity": 330381841997, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 21336045, + "unit": "block" + }, + "relative_stake": { + "quantity": 41.79, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1868-08-27T03:08:54.190946039232Z", + "epoch_number": 11064 + }, + "cost": { + "quantity": 133, + "unit": "lovelace" + }, + "margin": { + "quantity": 9.04, + "unit": "percent" + }, + "pledge": { + "quantity": 228, + "unit": "lovelace" + }, + "id": "pool1yn89prjajpgcd6g7dejddkf9xrsl5dycg3zsz89n9d32swl54le" + }, + { + "metrics": { + "saturation": 1.4952392303602935, + "non_myopic_member_rewards": { + "quantity": 387598260495, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 15464194, + "unit": "block" + }, + "relative_stake": { + "quantity": 93.47, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1892-10-18T17:53:36.620212041162Z", + "epoch_number": 21520 + }, + "cost": { + "quantity": 71, + "unit": "lovelace" + }, + "margin": { + "quantity": 55.18, + "unit": "percent" + }, + "pledge": { + "quantity": 0, + "unit": "lovelace" + }, + "metadata": { + "homepage": "K𢝓\u000bʈKc\u001e\u0014\\\u0006y7򦅆>󀐿򋌕}\u0012I򴎉en𢎱𠈖5\n\u0000򐑠򡁓\u0011󅖯}򸇝\u001a", + "name": "󧦟򃲏bq", + "ticker": "\nSC󥠗", + "delisted": false, + "description": "U.lPxi]\u000fs6ꩽ򫪠񕸒򡹶w\u0000𡐆𱊿񈉐,0󎐓F\u000b0S\u0002Z\u0000񷔫O}\u0014\u0013񣆠/G􃕦𘽃󿜫𳀢7񸔞\nE󼔋^𘠉\u0011kMQJ^sG`u.񫵥󵘐\u0008񠶸v򣵁q@@aC:򩭾\u0001𓳡&򰏆|hhtZ#?(h_󚢦\u0011񆫋#\u000f󋤑x񝧤K+&\u000f(\u001aQ𒥴'^\u0000󖍉򰏵񷐈sL\u0014\u000f󜛜񔿁~O\\񴝫Aq򓁳\t\u000eF+U񥬾𱫴z򞛈󡤳T\u000eA򎸥\u000b\u001c\u0002k󨠾gS󅡾>.\u001a\u0014 =" + }, + "id": "pool1h7pcrxm9zwhxrk55emfqw6llm6t05hnwtxk8l64f32eqsa5s3mf" + }, + { + "metrics": { + "saturation": 3.7687630104981524, + "non_myopic_member_rewards": { + "quantity": 430804471906, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 1276368, + "unit": "block" + }, + "relative_stake": { + "quantity": 0.53, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1878-12-03T17:33:57.823129061324Z", + "epoch_number": 30137 + }, + "cost": { + "quantity": 166, + "unit": "lovelace" + }, + "margin": { + "quantity": 24.16, + "unit": "percent" + }, + "pledge": { + "quantity": 7, + "unit": "lovelace" + }, + "id": "pool1rh9mwf4ka8d0tdyfz82set5cqvnvvmvwrunpdgm09xa9vthzjpc" + }, + { + "metrics": { + "saturation": 0.4770765763891738, + "non_myopic_member_rewards": { + "quantity": 722170631645, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 22309786, + "unit": "block" + }, + "relative_stake": { + "quantity": 68.26, + "unit": "percent" + } + }, + "cost": { + "quantity": 162, + "unit": "lovelace" + }, + "margin": { + "quantity": 23.56, + "unit": "percent" + }, + "pledge": { + "quantity": 218, + "unit": "lovelace" + }, + "id": "pool1dyddrjr5d0vcmp3ae5nr3yydjqt6af3ru32l69aaplvuysaag6p" + }, + { + "metrics": { + "saturation": 0.9782665658528389, + "non_myopic_member_rewards": { + "quantity": 413385220615, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 22453951, + "unit": "block" + }, + "relative_stake": { + "quantity": 26.33, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1863-09-16T03:05:56.432511110976Z", + "epoch_number": 28099 + }, + "cost": { + "quantity": 176, + "unit": "lovelace" + }, + "margin": { + "quantity": 85.29, + "unit": "percent" + }, + "pledge": { + "quantity": 252, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\u0018sH.񺛚\u0008Ztxxq􀫽$򣑖񅺗uDbF\u001b&j𼃷E񌾌򑤫󾄁9򪳍񣟸T򀝊AP!+D", + "name": "Yh򼷭N񒺲򯆣񬉚vKW\u001e􃍭\u000b", + "ticker": "󿸒\u0013n{", + "delisted": false + }, + "id": "pool19fc8xszcpr82c9lns5rnr2gjnzya3hwtqvtsuusrt2f4x22nut2" + }, + { + "metrics": { + "saturation": 3.68948288818008, + "non_myopic_member_rewards": { + "quantity": 534444640651, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 1121423, + "unit": "block" + }, + "relative_stake": { + "quantity": 33.25, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1903-01-16T03:46:02.168066034271Z", + "epoch_number": 23555 + }, + "cost": { + "quantity": 224, + "unit": "lovelace" + }, + "margin": { + "quantity": 7.76, + "unit": "percent" + }, + "pledge": { + "quantity": 24, + "unit": "lovelace" + }, + "metadata": { + "homepage": "U\u001d|", + "name": "򫏝B񸧝FH=񐬑񧆭B\u001e_򫅕睔\"򊄫l𝊡/ye:", + "ticker": "򔧜|N", + "delisted": false, + "description": ",񑁢$\u0016󍵽z\u0019\u0008󭌬񻅻8m\u0014򬆢Pet󻜃/4𩺲\u0016q\u0006UiBM;\u0006T񫥛\u001dL\u001e󅘡񦇅\u0012Xg 󓑬\u0014\u000f\u0016񄬀\"\u0006wᰋh\u001bi}T󐵕A󬞡&YC>\u000b\\񛾟􃫴t\u000e\u0008󅻌􀞒󦠁0A񕮹񖐫f=\u0016\u0008 OK,\r\u0003󰒉`8i\u000b򉿦򌷋[\u0018\u0001]ju[⹇\u001b,]@{򛔖*h󦟓cl𳇵\u0010\u0005\u00023^:\u001f\u0007󯦬󘬏!󐧇񨺉\\+YVT-s񣭝{u'󎫢𸟁𤽉􆸵񤯀u\u0003󈷗󂒼\u0019J\u000bMಇNy󥰤P= 񥞫\u0003t󕩙򄹽`'𜎐{񇴁/K^x\u0016-a⦬K\u0014񅊅򶵹𯷙\u001fX\nR񂃝LIl򥘅`𹶯4g1Cc򲌾Op>𛍛(" + }, + "id": "pool1edlsutx95fedpc6rf5q2aa058hrgp0wzgdnnjse5f9g57lp59hr" + }, + { + "metrics": { + "saturation": 3.5017608602222525, + "non_myopic_member_rewards": { + "quantity": 315800212180, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 3246137, + "unit": "block" + }, + "relative_stake": { + "quantity": 30.33, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1903-01-19T16:13:01Z", + "epoch_number": 19728 + }, + "cost": { + "quantity": 76, + "unit": "lovelace" + }, + "margin": { + "quantity": 82.96, + "unit": "percent" + }, + "pledge": { + "quantity": 120, + "unit": "lovelace" + }, + "metadata": { + "homepage": "[󡞎򱸜\u000c𿗯b\u0012f\u0000\t𢼬:񧨎;󞵏\u001a\u00160\u0014\u000f8+a>#_P𰭎/񬳔񍪄", + "name": "uY𗩄^Q/4k3U0\u000c2m,\tM鎒]GuZ\u0008Fi󔉄t\u0015O𾳜󧃌\u0006\u0008𪦌S񛹐񄇩A", + "ticker": "\\󗶏󶺕\\", + "delisted": false, + "description": "B'/ev\u0014􅅃e𠭄򎜼dF\"󮌢\u0000򣜀󉡲W(񠭨A;D", + "name": "\"kr򀄭\u0005򚫣;bU*P򵠀k\u0012Aп򮐺\u0014l\u0015b\u0007", + "ticker": "t\u0018g", + "delisted": false, + "description": "񥞥\u0002[󘋝B񼹩𼜘\u001fQ&𜤰hD=3񎔩F󮠵􅭗􋞯k\u0014q\u001d^\u0013𴷒td􁕇w\u0019\u001f" + }, + "id": "pool12j7rmneg7l2p6nr207n0798e8dutl2pcyzezyurc2r2c7myzmxa" + }, + { + "metrics": { + "saturation": 3.560986334736568, + "non_myopic_member_rewards": { + "quantity": 821007979583, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 11985549, + "unit": "block" + }, + "relative_stake": { + "quantity": 63.91, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1873-05-21T19:00:00Z", + "epoch_number": 7791 + }, + "cost": { + "quantity": 69, + "unit": "lovelace" + }, + "margin": { + "quantity": 98.32, + "unit": "percent" + }, + "pledge": { + "quantity": 35, + "unit": "lovelace" + }, + "metadata": { + "homepage": "򅀖󆋼 Nqu *(b\u0017Wm&򲓙+񦓂Y\u0002󻂡M(iVh\u0012軆G@\u001aoR\u00062󄘖G\u001e򱝔", + "name": "󰝸*bS^:1H\u001f𡣙", + "ticker": "󣁗\u001a\u0011", + "delisted": false, + "description": "\\|V|􅦷I\u0017􉇘򽇓\u0006𩫡~6\u001e񗨿XA\r\u001aỠ\nL\"\u0011V~\u001f9\u0018d\u0010\n\"򴙧1\u000em~o򆗩\u001bx\u0015$񵪑󑜤󿃾=T󓬍\u001b򐇢k)H(\u0000Y󗨠@\u0011\"7󚘢𪍉3󙽭d\u0013󋭑gN󜁠񅥋\u000c?4U񰁝q󃕹]\\daZl_\u0006\u0015URz󴵳sAE\u001dM򕚅\u001e6\u00152軹+R򪾼\u0011A\u000c\n\u0001L𗸩;ev\u0002YK_󩨜7b𡰂L\u0018)\u0002%-\u001bXq򜶬Tt񴞫nU\u0004@\u0013|\u0017󘶖򎭮9%󬡰𥕐\u00164󆖍u$􃑁񲬕#-I򩩎 񲧅\u001fg7\u001db򋲄Qju\u001c/oL\u0006G\u001f/\u0011𫈕{󻓷c𩟿Ty?q񏥼4Y[\u001by>P" + }, + "id": "pool15mqd3mk6rda330a4qfweag3d2xjg2wcjrhvq822gak9g2jr0xl2" + }, + { + "metrics": { + "saturation": 0.5527102577507603, + "non_myopic_member_rewards": { + "quantity": 389974335660, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 6484775, + "unit": "block" + }, + "relative_stake": { + "quantity": 2.18, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1907-05-20T01:26:01Z", + "epoch_number": 6649 + }, + "cost": { + "quantity": 181, + "unit": "lovelace" + }, + "margin": { + "quantity": 89.33, + "unit": "percent" + }, + "pledge": { + "quantity": 60, + "unit": "lovelace" + }, + "metadata": { + "homepage": "󭖅򯧠@\u0010j)\u0005_B]oX\u0002CDk\u001f󥜔󾒣𔋇\u0018)\u0014X\n񅆈\u000b?\u0010`2\u0010\u0005𲶽>~z񯓴\u000b,87i\u000eE򸁐n󒤅򚣠􏶜񫮯zH6vaH\u0005򞢍\u001f\u0007", + "name": "&d", + "ticker": "\r򢡙,<􆝔", + "delisted": false, + "description": "'?񪹗𘖥򺼳6R\u0005h*u񜙕wp򓎮|)\u0004󸼝\u000fuK\u0002]$𹍌󻶪O-\u0017\u0018k򈷢𕯔\u001f\u0004k󸸍!򘏱1k)a󻷨U\"&#+x\u001c\u000e\u000f򃒿󛪥C󖫔\u001d\u0000b!u\u000f\u001ciJ򘀭C\u001do𾽥􋊂'\u0013qH𠩔\u0017l񔙟󜼌$n\u001a\u0003TgfRs:M𫚧񷑯Ud2Bkk𒊼iD;\u0002\u0014HKY$𝊴u𧹇6o2u񓬱8\u0003󘰌_R^\u0018K\u0011U\u0005\u0014V򚉿zK#>Q\u0003`9񢌝𯽌t* OM򦉙񦏝QSBH񘪮Nu󌍥\u000cV\u0014􆰇󃞪Q\r򁔡\u0012򩶎\u0011Q8q\u001a񍆔:a\u0003:`\n*\u0002󨶂?2񃖰\u0005򛔒hO|𹶿ŧtK칋K" + }, + "id": "pool13jvwr3rjl0d0ldy6zzattyfy4sfhzdrdmf4tm6g86xqmknq289l" + }, + { + "metrics": { + "saturation": 2.880064717623278, + "non_myopic_member_rewards": { + "quantity": 686142045434, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 12566863, + "unit": "block" + }, + "relative_stake": { + "quantity": 17.82, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1891-04-09T17:12:33.704110397083Z", + "epoch_number": 16648 + }, + "cost": { + "quantity": 153, + "unit": "lovelace" + }, + "margin": { + "quantity": 39.63, + "unit": "percent" + }, + "pledge": { + "quantity": 71, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\u001b򥤵L\u0015_}S\u001cI%󊇨\u0013E/W\u0011D񼇱򜗩򧻒G''\u001a^\u0018`񦊺󨵌H򾫦C\u0003~q򙑣Q񍹛{{񬧫Lq󠉽)\u0018|@/h𵈅C\u000c\u0007z\u0003\u0004-'謵񈼔+ \u001edNl󑙦4\u0000x򋔝񚽭\u0006s𐖅pI񬤋`\u0002", + "name": "-\u001d4h\u0002f\u0008\u001d%󆛧r+񗞞W󴻏\u00179\u001c󹵇򢟂p\t\u001c\u001fip%7iafC<񉊊S\u001d", + "ticker": "Z.&", + "delisted": false, + "description": "񿫞H󎭺D8'󝽙򤆱)#\u0007_󱶌5g򚉦\u0016H3󾆈qB|\"𫠵\u000cE\t󫇋\u0016U\u0019򫃾򼓘񳻙-" + }, + "id": "pool1r4h02d4nqztrfws54swrmfd7ls65n4sgmyt42xnl3pv422rs8l9" + }, + { + "metrics": { + "saturation": 2.9514110131454445, + "non_myopic_member_rewards": { + "quantity": 909621963107, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 2401704, + "unit": "block" + }, + "relative_stake": { + "quantity": 63.85, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1884-08-20T19:20:43Z", + "epoch_number": 9515 + }, + "cost": { + "quantity": 150, + "unit": "lovelace" + }, + "margin": { + "quantity": 52.52, + "unit": "percent" + }, + "pledge": { + "quantity": 113, + "unit": "lovelace" + }, + "metadata": { + "homepage": "mO񊏢?장󊬰𽡂𻑷So\u00131򍨻f\u0018g\u0018򯅩6\nl闹 󫣅𰈓\u0008C^@񎪡)#n󮵼3r", + "name": "p0N󕺲\u0008񚨞u\u0011V\u0013\t\r񌬨󱖎", + "ticker": "􆾅#3", + "delisted": false, + "description": "_B" + }, + "id": "pool1r0s0snd73hmshe8g28xu39rzgqhjll8lnnncprgzez7wy8ewj48" + }, + { + "metrics": { + "saturation": 0.8612461697489432, + "non_myopic_member_rewards": { + "quantity": 692473482847, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 21268831, + "unit": "block" + }, + "relative_stake": { + "quantity": 37.65, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1869-05-28T22:37:12.910597403358Z", + "epoch_number": 26403 + }, + "cost": { + "quantity": 242, + "unit": "lovelace" + }, + "margin": { + "quantity": 93.33, + "unit": "percent" + }, + "pledge": { + "quantity": 39, + "unit": "lovelace" + }, + "metadata": { + "homepage": "󭮼9򏥮I|l6f3\u00125T񛗞񊣥t󩖴!𣟮Oz\u0017\r\u000fC\u0001aLsio\u001fhR\u001d򩖙So1󩽗񳗲򁹽\u0001\u00045\u0013𷣴nZ\"\u0019P\u000b\u0012󮋣L\u000c&񆄫\u001ej\u0001Q`O\u0016\u001bh|\u000fx򱁀񑹊j", + "name": "񑖦򖠴B𧔙]u󬿝\u0006{񎪤|\u0005񋏓hw\u0005\u000bW[w\u0017\u001e𫃬gS\u0008󋺥w\u0014=򥳮\u001b󝴿\u0007jd\u0017𤙪\u0017𞟫\r\u00068\u0019L𫍉#\n", + "ticker": "Z=\u001b,񙞏", + "delisted": false, + "description": "*XO𻅡򸑶idk\u0006c=𙽑󇋻\u0007 \u0013󘔼=(cu7eM􈫖\u0003Pt򠜉" + }, + "id": "pool1cslfspa62fc22ta68lgnd38ptk47yvg02e0s33ttnx4lv3l6sjw" + }, + { + "metrics": { + "saturation": 4.695581251544362, + "non_myopic_member_rewards": { + "quantity": 120877909636, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 9271523, + "unit": "block" + }, + "relative_stake": { + "quantity": 73.08, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1890-06-18T16:27:18.376636610832Z", + "epoch_number": 9815 + }, + "cost": { + "quantity": 156, + "unit": "lovelace" + }, + "margin": { + "quantity": 30.38, + "unit": "percent" + }, + "pledge": { + "quantity": 252, + "unit": "lovelace" + }, + "metadata": { + "homepage": "nh{򮟋w^\u0004<\u0005X=#򽓦L󟤅񒚕򂨊#󡾔\u0004𼟚񵤊!Q\u0015J\t𳩔\\G#(p/񽡉\u001eh1D򥠍󗥿&\u0019𫱃-_g\u0010\u0016Q\u0016\"\u0018#􁪷K@󀀀o\u001e/^\u0001\u001ej\u001e_\u0001\tSS𽮊򦌯1𗻥J* 󔮯$^!D\u0005y\\􂯜􂉑\u0012\t\u0012L5\u0002򩰢񷻳󏯛+|WO\u0017#F" + }, + "id": "pool1rwvvadpdl37njcqscw54x2ndxhxwlwf9shkwmhmtdqq55kvdew7" + }, + { + "metrics": { + "saturation": 0.37069902870963733, + "non_myopic_member_rewards": { + "quantity": 458106222312, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 4446831, + "unit": "block" + }, + "relative_stake": { + "quantity": 23.14, + "unit": "percent" + } + }, + "cost": { + "quantity": 152, + "unit": "lovelace" + }, + "margin": { + "quantity": 81.32, + "unit": "percent" + }, + "pledge": { + "quantity": 210, + "unit": "lovelace" + }, + "metadata": { + "homepage": "|VfTm\u0005𝩍678򅥵&o󮇪󏖊|=\u000e񁮏򂹱􇖘\t\u001d𕞬Vt\u0019򊱵|@_n񢄄󮑸a\u0011\u0017X6J򌫥ou\u0019\u0002}\u0018\u001d\u0005?t\u0016z\u0018\"?񕫫\u0017yW\u001b\u000b\u000e򶺴\u001c", + "name": "w\"$򫢠J𾜐𓾹e2QrT|󈴛񃞡\u0019Fm򯹝[d񇰂\u0015i󱤇􌮢\n\u0016𰛲X*𩏊1}\t", + "ticker": "(򩖭\u0004", + "delisted": false, + "description": "7򒐾z\"r\u001d򸉑LN򻆭?\u001dZT=Y=𾱚04G墎AW\u001a+r=y\u0010I\u0019h+:㮦F16j=r񡜴羄𞇓~%\u0019\"m\\lO򭏲\u0002񊦖\u001f򖥴,D)𪈰\u00056\u001e􋰁v򣟺^iq;/񾴑2e3\u0019󠲙>􄋳c__L\u0015\u0017񢖬򐍪\u0005g\u00027tz~\u000b򰉁" + }, + "id": "pool1xsttvr6qn6phu0wmeze56dyq5ud8ugkcqw46zscc8y82wlyrta3" + } + ] + }, + { + "pools": [ + { + "metrics": { + "saturation": 0.23503926081707427, + "non_myopic_member_rewards": { + "quantity": 532717581740, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 3516370, + "unit": "block" + }, + "relative_stake": { + "quantity": 25.47, + "unit": "percent" + } + }, + "cost": { + "quantity": 56, + "unit": "lovelace" + }, + "margin": { + "quantity": 26.95, + "unit": "percent" + }, + "pledge": { + "quantity": 24, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\u00053Ud\u0005󞢍C''U䂅\u0015", + "name": "\u000cg񜻲h񃠘SDkfRcx󜴱򸾍\u0003#*󭟊򙯜o󀇆󼻽򒲕🣭򗒇`s\"S@M\u001a(", + "ticker": "񪕊󺀹L`", + "delisted": false, + "description": ".DZ򘆑#e\u001anl\u000cJ%򐂍񈒠_Fu6\t_4,󋽓uQ󂑼\u0019e]򞫣\u001f򫷖eh*o\u0015\u0012AP\u000e7򳱮T?򌝁\\󂓋\u0016J𧜾v񶗽\n\u0003m+񆆾S𓨤=M2\u0019(󨹰񓼻\u001c񑰙\"/\u0004,\u000e\u0001~􍟇󫰳򍘰^\u0007𡏨RB9𳗱\\:[2P\"񴰣w\u0008N\u0004n4󋅫\u001a\u00020\u00009\u0008LO@򣊲򖸈r񍯪񀰒\u0005TD\u0017B\u0014'9񢗉'󊫥󵠇D_F~\u000bQ􂱨\u0002\\1Ps񪺕a񗾠:k\u0014񵖅\u0017\u0005O\u0003󌏯󂪋\u001e񊻍`2\\󨼇V\u001b?Q(뢓9BM&򯔤Z^(" + }, + "id": "pool18pkfu02j7hh9lgqac2pywlvv0kqglezjmlj0f8ff778nx9pkyma" + }, + { + "metrics": { + "saturation": 0.8317132132123595, + "non_myopic_member_rewards": { + "quantity": 119472001527, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 14511237, + "unit": "block" + }, + "relative_stake": { + "quantity": 15.32, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1898-08-09T12:47:43.081256289419Z", + "epoch_number": 4566 + }, + "cost": { + "quantity": 178, + "unit": "lovelace" + }, + "margin": { + "quantity": 92.65, + "unit": "percent" + }, + "pledge": { + "quantity": 143, + "unit": "lovelace" + }, + "metadata": { + "homepage": "f+𩧵򰊜\u0019fy\u0004𶬆s򜜶􋑼P~𳶤򑃤\u0008񩋌%br񤜸󯖓", + "name": "򑳙bR6C?\u000b\u0000T񵚊򱖨N𭘈?\u0008\u000fQ 񰒖񐖓r}󧼜\u0011𠉖", + "ticker": "U-򱲥\u000b", + "delisted": false, + "description": "3񝖷\u000ct\\Jt\u0016񡸙+󏨪񼈅\u0019\u0013s#Q&=g𶠵|o򞵠\u0018n_j𜏊\r\u000cQW\u0004p󶨫񑿆\u0019u󄬲홏s7,\u0007:򼸁w192\u0019P󁰉\u0007!𱏡\u001fXU󑬝\u0018-n񒌁\u000cI=|򚿾\u0004󆨷\u0008R#𷃥n661'!~3\u000bPdl`\u0001P\u0001𶈼⦽r\"W󍊐T\u001dV朧𶝢qlu\u0012_󶞻*\u001f[1n\u00055hz􈣤򾎺)_`\u0016򺐏s􏅲E\u0014" + }, + "id": "pool18z0w72wthjwnkpcsk245ulzh70ky3ca0r7gz05625sl2cyvpg3y" + }, + { + "metrics": { + "saturation": 3.1609452932526336, + "non_myopic_member_rewards": { + "quantity": 202330677477, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 18199047, + "unit": "block" + }, + "relative_stake": { + "quantity": 22.07, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1896-10-30T18:37:40Z", + "epoch_number": 13140 + }, + "cost": { + "quantity": 100, + "unit": "lovelace" + }, + "margin": { + "quantity": 22.67, + "unit": "percent" + }, + "pledge": { + "quantity": 87, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\u0004\u0004|z4T}\u0003񿺋I6Z􂲟𼐟򲲊㲖", + "name": "^\u000c\u0002Z`򻀰\nvGyV\u0013hRqc𴑼\u0015~uZE󚌃tY\u0001&rg", + "ticker": "h4\u001f򤳃", + "delisted": false, + "description": "O󜍥\u001f􇰶\u0015򐯬oL󾏥󜃊>;$𲗖󿜬{OP4^H𕕘򀗊\u0014\u0015󳒜嗿󶌨𮰆A죦\u0011`$I]\u0016~'9𯓩Ah𣬞𸦡񳿞󽔩$檑𝓫>\u0013򻰾\u001f𬡭$A|񶚾}󱌂\u0005񞫉񿖹y.\u0010f;\u00015𾯇\u001a񨇍\u001bX򎿺\u0018)񺽁%󀫩b\u0001|/򰨫fH\u001b>P\u0005KUh\u0008򽩟1\u000c\u0001A󱕦R򟛆𴡈\u0002[J񏭤\u000bA" + }, + "id": "pool1spnphg28yyjpurwm6vk7av0ckp0698qwyfy58e0v8qz36ftacz9" + }, + { + "metrics": { + "saturation": 4.56990651991215, + "non_myopic_member_rewards": { + "quantity": 413012378801, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 13653322, + "unit": "block" + }, + "relative_stake": { + "quantity": 32.46, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1900-02-08T13:46:40Z", + "epoch_number": 26654 + }, + "cost": { + "quantity": 227, + "unit": "lovelace" + }, + "margin": { + "quantity": 34.54, + "unit": "percent" + }, + "pledge": { + "quantity": 206, + "unit": "lovelace" + }, + "metadata": { + "homepage": "􌓝񕚀\u001e\u001f񒏧l3񢝐M\u001eD\u0019\u00129򃹠mc_񤔅-,'񰴲󉵁񠂰񀔑\u0019=km8𸟡T{5 \u0000i\\Z񓣈\u0006񟱷kM2n根𪐪񳹌fH𖵧cK0񘳲7|)󚹏񏻲", + "name": "󀕔c𦙿@", + "ticker": "#\u0017\u0005񿭹\u0016", + "delisted": false, + "description": "#񣸼_B}𜑺󪲶>\u0018/#plJ\u0008^󘸚\u0001񷃥l>{񭰚FWfv󺙙9MnmP)y@DVl\u001c\u0006S@J,\u0012\u000bb𠇧򣖀\u001a,񟁉󦍓\u0008\u001d6S:cPR񵎋\u0016񦯕񱤅Jlm𪟸" + }, + "id": "pool19dh4xdtn6zx6svyd74w0rqv8wj53ga3fef7fm36dw60jv8re460" + }, + { + "metrics": { + "saturation": 1.6464367006119662, + "non_myopic_member_rewards": { + "quantity": 597607016300, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 7715972, + "unit": "block" + }, + "relative_stake": { + "quantity": 66.66, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1860-02-05T07:10:35Z", + "epoch_number": 9350 + }, + "cost": { + "quantity": 209, + "unit": "lovelace" + }, + "margin": { + "quantity": 5.99, + "unit": "percent" + }, + "pledge": { + "quantity": 21, + "unit": "lovelace" + }, + "metadata": { + "homepage": "󾢮\u0006򬶢~𩷮$s𣪪(󩖈癄9\u00161񱣏L\u0019񧶫#𻈂\u0007\u0014iI󡥗\u001b𑴖\"񫎵\u0003𱮯\u00163ꈛv񜝾󂜺Oj񊡙\u000e\u0005Q\"E\n\u0013\u001cRn\u0011}{A\u001d\u0015Cdrfb;v", + "name": "d2\rdk=G4Au\u0012", + "ticker": "cb4", + "delisted": false, + "description": "󯊵g𵌡w)\u0015򎢂%y񡧹{nsT\u000e𯊴\u0011􇣖𖧚_P\u0010񫩰\u000bǬ\u0001n󕩻zj\u0008Y\u001dn\u001f)񖎇\u001e(]񵭵\u001f񝖞&j&c\u001aS𜥼!w򞣭e󾡅J򖉳6񮹋a(񏆢lBn\u001b\u000fup񾱠?<\u0015\u000bHf\u0006-M^󽡝\u0011󏘁\u0014Wt񥔃h\"󬠀L4}\u00189\u0019\u000f󪉜h೗" + }, + "id": "pool1cm4uvkt3qv7tngsc6e3yta22e2qcdg3409chd6yh92me5ew5dzj" + }, + { + "metrics": { + "saturation": 0.742384280289029, + "non_myopic_member_rewards": { + "quantity": 472099403957, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 12927222, + "unit": "block" + }, + "relative_stake": { + "quantity": 56.18, + "unit": "percent" + } + }, + "cost": { + "quantity": 86, + "unit": "lovelace" + }, + "margin": { + "quantity": 99.93, + "unit": "percent" + }, + "pledge": { + "quantity": 184, + "unit": "lovelace" + }, + "metadata": { + "homepage": "2-0%\u000cK=7(@𛿟$򧤫\u0014G(\r)mCA\u0013Rs񺰶\u0006񚚛\u001br𲚣:𥯘򼴩񗖳^", + "name": "\u00076,C􎣫𗻧V\"񄟽l`񐐃򮺗_:0A𡑍8=iiC򘙔.񞚂f.\u0007\r\\򐗴cl,'$\u000en", + "ticker": "2󓇳s9\u000f", + "delisted": false, + "description": "3\u0019C󥢢􀳩C𖬨󮅠}𕘥>,2gV󪒉?M|\u000ec󮂭l,\u001c6\u0001p:hK񚦿𮹤9\u0004\u000b񫒎^=\u0002󲡓nIGQ6*\u0018󫸍N󖋽\n񓂹sjx\u000f%zI\u0011G𘐴\u0010󕪙𻫛[\u0012Nw󩕖?V\u0016s򿃶(m\u001a\u0015򖲸]Ah\u001aT\u0008\u0018OW\u0013_|%ld󟫾󅅧\u000e񵲷 =󬳿~<򺞧X𗢟􈘖\u001f%\u0016𤃟\u001c'O񐣦,,\u001b\u001cT𩥋󺮄Ds\u0014𗘮󰱌k𦤯IfmwKk񙣞6\u0019Di^r󱝳Y󺣥Gw\u0007N~\u0000J񬑣\u0017󅇢g%Tf\u001d}W򠝖`򭅨" + }, + "id": "pool1gkkwej96ws9mhth4zgl5lqar5k2dh54ft5egfggqupswjs6ac3u" + }, + { + "metrics": { + "saturation": 2.548141356215254, + "non_myopic_member_rewards": { + "quantity": 867667807703, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 1881978, + "unit": "block" + }, + "relative_stake": { + "quantity": 42.8, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1891-03-01T11:52:09Z", + "epoch_number": 5695 + }, + "cost": { + "quantity": 135, + "unit": "lovelace" + }, + "margin": { + "quantity": 58.64, + "unit": "percent" + }, + "pledge": { + "quantity": 217, + "unit": "lovelace" + }, + "id": "pool1ngvvze3dzcp5fhvx0w4jlcjg594y29zs5ynxrcsn4w2jxqzsjnx" + }, + { + "metrics": { + "saturation": 4.399398331067638, + "non_myopic_member_rewards": { + "quantity": 713571065756, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 3611250, + "unit": "block" + }, + "relative_stake": { + "quantity": 9.41, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1861-03-10T20:20:46.301275769918Z", + "epoch_number": 19516 + }, + "cost": { + "quantity": 178, + "unit": "lovelace" + }, + "margin": { + "quantity": 48, + "unit": "percent" + }, + "pledge": { + "quantity": 26, + "unit": "lovelace" + }, + "metadata": { + "homepage": "{hs󯬮𲵐axS򱽞\u001fqCm\u0004󻶤0疀_\u0015Di\t\u001b1!򏗪󃚏[冋󸛤,󑼃ugV\nB/ugR7i\u0013\u001f\u0017\u00008$i\u000b_,\u0019󦺴\u001e򨌳Xl\u0010~񄓧,6I)𖚕2m/6\"򄪱u~񋅟R񞜖򜚪A\u001eP%\u0018OQ򁧝򮭘dF\u0007\u0019oD\rvS\u0002򀡩Gr\u001e^󠸓u#(𯱝>q󄢆&2񆽖z)~􇮼򹸳\u001a\u0010񤹍" + }, + "id": "pool127f7lcgmcf8fz8qwrufl64tfdfjdy98c43ntpr7amsl2kyj0wn2" + }, + { + "metrics": { + "saturation": 2.7173874690449775, + "non_myopic_member_rewards": { + "quantity": 312784436667, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 20522062, + "unit": "block" + }, + "relative_stake": { + "quantity": 43.39, + "unit": "percent" + } + }, + "cost": { + "quantity": 132, + "unit": "lovelace" + }, + "margin": { + "quantity": 71.23, + "unit": "percent" + }, + "pledge": { + "quantity": 139, + "unit": "lovelace" + }, + "metadata": { + "homepage": "񆆯\u001f$R񡱸", + "name": "\u001b\u0019\u0015w1Dgj񫼎\u0011𖖂􀁬v\u001aD𲤯\u001df􍓆񙇝􍲭Vb񝾟X񏩓\u0008\u0014򗄮\"󘧇󻧽󾂋A􃑖" + }, + "id": "pool19wt0c9zqnp6m4xsmerz4ysz2g4sndm92h2wmdhh7r3azkzqpmw7" + }, + { + "metrics": { + "saturation": 2.5800215780187994, + "non_myopic_member_rewards": { + "quantity": 781616943077, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 12355964, + "unit": "block" + }, + "relative_stake": { + "quantity": 95.53, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1904-07-30T00:54:58Z", + "epoch_number": 31076 + }, + "cost": { + "quantity": 10, + "unit": "lovelace" + }, + "margin": { + "quantity": 36.6, + "unit": "percent" + }, + "pledge": { + "quantity": 226, + "unit": "lovelace" + }, + "id": "pool1u4heut7xmqcz8gaz50tklcj4e8lt0lfdr5c74mfratz4u5a69wd" + }, + { + "metrics": { + "saturation": 2.369418247644717, + "non_myopic_member_rewards": { + "quantity": 55629129590, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 22036496, + "unit": "block" + }, + "relative_stake": { + "quantity": 83.17, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1901-07-23T10:28:05.558012104149Z", + "epoch_number": 18990 + }, + "cost": { + "quantity": 211, + "unit": "lovelace" + }, + "margin": { + "quantity": 47.79, + "unit": "percent" + }, + "pledge": { + "quantity": 142, + "unit": "lovelace" + }, + "metadata": { + "homepage": "bz𡱬򨣶򭄍\\3Ft\u001fYWJy򔳘\u0001.\u0006v\rtA򴇞v\u0012vk񌸏􎇼󥓬g\u0007:)Wm𥦈󔢰\u0014\u0017󷳔򒣁", + "name": "\u0005\\𑌆\u000fI19\u0019Alt\u00140򄩻񉾜wf\u000b󉾑qW񵑏\u0018\r>v\u0003𸻺Y{W𔴇Q?", + "ticker": "𧁮t\u0019򌬶:", + "delisted": false, + "description": ">`'?-q7\u0014Yn>\u0018򃿕v}z\u00105𐴮򋆢򰱏`U*%褷1\u001bi)M&Q\ni)c\u0008񻜪\u0014Zp\u001e\u0010򟓹󵧔}N.򜥷\u0014*\u0019𤖛t\u0018򽌬\u00021\u0008\u0006A[\u0019m%h=\u0016CM󢍈$&)\u001d\"\u0016\u000f\u001e[+t76X򸌱\rz𱼭\"\u0019H󈏧񩞞\n\\I8:^?󛤺I\u001aKv\t𣏁y!<2}\u0007\u000cOS\u0002𠤩\u0005ᔸ\u0014񽽂󯇾nTP^\u000c{𙑐9񻽴0vTgTk򕹠\"\u0013*\u0018-I򲂇\u0016+1𳎲H𚂗\u000e\u0002!921q|w\u000c򠽀{󅭏^8U\u0003<\u000cg𮳝M]\u001a򱿾)^\u0002𴾞!\u0015UZ\\O񣌂󎦛\u001e\u001f\u0016U{j􇄫\u0000\u0017De󾵱k4uumZd~`C/p+b@󇉳[/L3\u0003^򼥘򛯎f󸞯_`𯿚󹺖=WN򀨔𙭏:" + }, + "id": "pool1ld0a0aasheztu98yuucdvwjxhurw2cssaap37rz5p0fmu2u0yzn" + }, + { + "metrics": { + "saturation": 1.5241114929567934, + "non_myopic_member_rewards": { + "quantity": 248398847665, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 2810490, + "unit": "block" + }, + "relative_stake": { + "quantity": 33.08, + "unit": "percent" + } + }, + "cost": { + "quantity": 203, + "unit": "lovelace" + }, + "margin": { + "quantity": 53.4, + "unit": "percent" + }, + "pledge": { + "quantity": 159, + "unit": "lovelace" + }, + "metadata": { + "homepage": "3\u0013\u0004h\tkVfxj󓓗Q󲲷𾺻k薼K򋷨\u0016]*󂦜\u0010}L>Vc|\u0015\u001c[i\u0001", + "name": "}񆻁𞰉:[CYoCpaC\u0005q򷺿񾅥IM𩦱8\u0015k7{5", + "ticker": "\u0013g𚹫\u001f", + "delisted": false, + "description": "L\u001d[X}r󲷸P?/~\u001chf4\u0000\u000bL󩻷򂃪񯂘\u000b\u0003Jf\u0002`xiH!=<\nV$\u0004b\u0002򒊹\n!\u0000S纈𺙖]\u0005\"|\u0016F\u0010h򒲽~*#󊶏q4!D󙎷\u0010󛼠򐄼ee󅰕9k𚘨K\u001b[(s\u000e򖜪񏅚yj?\u0018\u001eK,󚂵&+#\u0011񼯜󎄮a򙎇y𩤸\u0004Aq򗄇\u0014\u0007\u0019#2󭆻P󯌾\u0014)Q񹴰\u0017򈼕zા𥽸G\u000b\u0013󈞅-\u0010n񢛾򍚗K􀡏\u0008󂏔)", + "name": "a3-\u000b:19񯬲#\u000f0J1", + "ticker": "Q\u0007o򰁄", + "delisted": false, + "description": "𸭩,,8*J~Z񴢥\u0000\u0002", + "ticker": "\u0015d\u0003", + "delisted": false, + "description": "\u001eZ痓q2l\t񉤑#`\u0004\u0016~y\u0017@5h󳁨\u0007p5\u000e񰹌󡐷\u0000򾶇,^#\u001e?򧇱|y򁑙]z*\u0002&\u0007󡳲\u001c&񎜿[^?󂀈n)j" + }, + "id": "pool16576y78748730ldpczpvupck5pr0wjksgpdk6vnrppulk2aagnc" + }, + { + "metrics": { + "saturation": 1.6391965183304373, + "non_myopic_member_rewards": { + "quantity": 339917780059, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 22566849, + "unit": "block" + }, + "relative_stake": { + "quantity": 84.45, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1869-01-20T17:11:53Z", + "epoch_number": 771 + }, + "cost": { + "quantity": 44, + "unit": "lovelace" + }, + "margin": { + "quantity": 59.47, + "unit": "percent" + }, + "pledge": { + "quantity": 119, + "unit": "lovelace" + }, + "metadata": { + "homepage": "$P򂂻𒻀|pG5\u0017|􈨯9񐿙=X򺼌I\u0006𢻄V\u0011W6\u0001󹛥8^HLGG𮉁d\nH%+\u0011", + "name": "LqDX웙dof񂣦򆅣\\M\u0011j\tR\u0014𠌝uC:\u0006񉴐>􃵂􃮽*Q,\u0018𧲦򲪻\u0016=l+􊽩񣬂", + "ticker": "{=m", + "delisted": false, + "description": "vD\u0005H?\u001a:XMuz󔷾\u001a𬗃o\u0012󲤡񘯞\t^򫎲\u0011M$\u0000F\u0016M.񖆌\u000b|\"h𚷤~_񧤎\u0008\u0016g/@򢂿𧈵]\u0002ViRp󌌰򕈩KN\u0005oA\u00022\u001a^󖚋󌜾/󊿲8\u0006 Gwm\u0012\u0004%򄄹vs\u001e𧉾>󄪿\u0004i.l󖃬D]򤖕w\u000bo񪿴(;\u0013񋗜鳮􇪚v\u0004,I󎇱\u0000k\u001aP&g\u0005%򂰋`\r\u0007񽫜D>\u000eSEO\u001b-`񴧽}\u000ciq\u0012y󧹼󅂓K._xL%򩲆$!e\u0004\u0018𛖥uoU󬌡򫞨'FTo\n~𤦻񆸭&󋮱𯽄8񘕱𛬅􏕣]K\u0018DoY_" + }, + "id": "pool1a3tkahy9v8c709tpvk6z3t6vcrl47kjn6j4g66rg7v3953u75rp" + }, + { + "metrics": { + "saturation": 4.015131494914703, + "non_myopic_member_rewards": { + "quantity": 753774003726, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 15872653, + "unit": "block" + }, + "relative_stake": { + "quantity": 27.9, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1874-03-04T08:00:00Z", + "epoch_number": 23539 + }, + "cost": { + "quantity": 251, + "unit": "lovelace" + }, + "margin": { + "quantity": 96.84, + "unit": "percent" + }, + "pledge": { + "quantity": 156, + "unit": "lovelace" + }, + "metadata": { + "homepage": "(S\u0008R5𐾚6H!򙐤e&R􂌂w%GI\u0005󐔬󨺾R\u001b.D򹷝\u0006E񔭮C*񣢑3,񑢌񱣧O񭒔?a򞃝~\n4𖊈𦽦𜻀o\u0019}X6mQ&gwZCj_\u0000<񊨠#󐎠NJ9􊋎Xm", + "name": ",UZ\u000bbV>򞝄&󿍎NRh𩩋󨾁=a\u0015\u0018\u001bV󃑷GRO\r󓣓󪗎񓧐\\Rp3񄡨bzr", + "ticker": "\u001e,\u0013G1", + "delisted": false, + "description": "\u001db󡯾g.E\u0011\u0013\u001f򶇒q񭶫\u000fm~񨦰򩥛F󧫥\\\u0015w\u001a򓷟ez<򤐽!LO!l\u0000\u0002󌍁Zq`\u0013<򋮊󈱀\u0005餘{R񚒚L򛵰\u0010{Z\tL󶩎D75!*5󼪿}󧑴󱈛򵧉𶃎.򆊳(D\u0005r𺟬񻛕s󧗘oQ`@5򔧇e\">#\u0004kk-\\󑖱\u0015\u0004'񗅏򪻵󠊍%񾫭5VY񵿧\u0014󙹵𗯑򨷭}񅊮a\u0011$򾤞\u0002.񫀤=3񆎀$\u0003}1p󳥳4?4𶈑86j1\\򉚶\u0019S򷅶_<􄭑I5\u0015\\\u0016Q\u0007񞙡i񜓚\no\u0012w򪓟\u001bs9'񸄤򬻫罪]t򴫒bq𕜜E>E󈟀;<-Ncp󣡕𵕋񿽻M\u00184𙝴󣚗G󡸼E񭾎y`R񯃒+\\\u000eJ\u001dx\u001dW􂝉kw'\u001c\u001bB\u0014\t󩟈,g", + "ticker": "t򙫭Wl", + "delisted": false, + "description": "/񻺖nj=\u0010\u001f𑟽󳲥0QX\u000f\n4@.𞒒񅦩>\u0008i\u001dY9mc򤂚sZ\u00156\\\u0003;\u0007(>񞀌1[u\u0015p򴗆#C🐥/\u001d񲹖H8_S\u0013?򪦧V6y}(ﶶ𞀞Idpd򱼍\u001d.0񢤪񯣌\u0012\u0015񚪻S\u0006mF򀈊?񏠢T񵦩(򨇫MqVnI𢊗\n𳌴\u001aG\\\t򳀚!\u0017GI}򭈀򌻛rHM\u0013W+\u001er\u0018񳇬\u0017f%b~=񒵤򎹇qPO򬷘:c}gG󘸻0DD9%n\u0002Gp\u0014q\u0008\u000c򤀾񊶕\u000f󦣓 `񪓣,$=\u0019[a󥊗򁉿$VEh\u000e3񐽹\u0010m\u000eT<$\n򋐊6ZC?k9-DIg1\n~y򱻅" + }, + "id": "pool1w4z563f3nrrxqg7aqcc6fmhzqcczvtyam99rudmcksqmg0fpjwz" + }, + { + "metrics": { + "saturation": 1.3080694365359324, + "non_myopic_member_rewards": { + "quantity": 319501729579, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 9354572, + "unit": "block" + }, + "relative_stake": { + "quantity": 97.5, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1875-11-12T15:21:13.213160168107Z", + "epoch_number": 15432 + }, + "cost": { + "quantity": 110, + "unit": "lovelace" + }, + "margin": { + "quantity": 81.2, + "unit": "percent" + }, + "pledge": { + "quantity": 196, + "unit": "lovelace" + }, + "metadata": { + "homepage": "𹿤\u001b󸟹1?:\u001a", + "name": "}Ev󳪣 𣐯\u000f򈢜\u000f\t'TU􃻦I𬓡_\u001b\u0004ዐ\u0011逍\u000c\u0003񶵸񢥷W4󿶓\u000c;\u000fA^𞶵\u0018m[ඹ\u000f绿򛝩,\u001b )\u001cZkc", + "ticker": "C\u001awU7", + "delisted": false, + "description": "\u0002H\u001c$|F𱀐\u0003\u0011v\u0017\rC,=EU򇔮c\u0005CgwD\n\u0012[=#󆖯'e򛪒lT􀸜c󧩄`\u0001,D񃦞Yꊙ5񳐴𻋡u\r+\u00072C\u0002\u0006EAO񁱒\u001dmHQ\u001f6~{Jr\no\u0016M\u0015?\u000c]\u001cRFP#𰹽'\t8򕘓J񪮢󈊝" + }, + "id": "pool103n97lg6tgfed4wyh4ypu5qg8nry44jtpy0cuqrp0wh25zc5rgt" + }, + { + "metrics": { + "saturation": 0.6802585468764488, + "non_myopic_member_rewards": { + "quantity": 728796505103, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 1591028, + "unit": "block" + }, + "relative_stake": { + "quantity": 82.68, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1904-03-26T21:54:42Z", + "epoch_number": 19513 + }, + "cost": { + "quantity": 125, + "unit": "lovelace" + }, + "margin": { + "quantity": 71.58, + "unit": "percent" + }, + "pledge": { + "quantity": 9, + "unit": "lovelace" + }, + "metadata": { + "homepage": "k'P_𑳨_󂕙5\u0018򆗇󽥠򵺕8/N\u0012:\t\u000c`}!8\u0003\">񓤓h󞍪5\u0001df\u0013\u001f񴅐z\u001f@\u0004\u001b=\u0013b񋐥hQ\"\u0018+򆌓D #?򧪇?\u00065-h𾐮򛒨 񠡼(㙱󙓚\u0018w􆭰RJ\u001c<\u0014񎌴Rt\"]򄧆U󂭰1?\u0007q_&f'=", + "name": "򨷘g򄌺󚏘𬸻GXm󞳖N󡋃񐲪𾡬񄥉~🽄򾫣\u0000[#}v񵼽%Ec\u0014򲉣|񭄆n\u000c򑲡\\Y𺲎򕦆1", + "ticker": "PF𓯇", + "delisted": false, + "description": "򵱾Jr4񸌥K򒽜\nIY8\u001bJ𰅚#I򴜀󙭅\u0018𬪊L\u000cNG򔨝#\u0003\u0015r\u0006㳥\u0004\t\u0000𢤓|&󀲷6\u000fA46a!C撒E󚣎7:.񰹭\t@\u001c<-d\\\u001a%𜙃񄀟\ta&=I0Tx񖍦w'\u00044򡀴z喏񻌣󪐙\u0015Y򂩌񑕺\u000c𡦎SHv󮞈򂄃^\u0000ZE\u0016𨘷k񮯼1Ql0^B{?񩨿r󬄉򮻠𜲛󇗔>|\u000e𔫵d{fN򍑠!񴥁\u001cRg𲂄X\u001b*򮖻R򢿴O\t`\u0015)Rb񇵎\\H!\u001c|\u000c\u000f\u001d" + }, + "id": "pool13ktjw94znuwg9ejd02kuh8jqvdc0sthrsxzynnlzl0v0vj6s6pc" + }, + { + "metrics": { + "saturation": 1.7338685998944854, + "non_myopic_member_rewards": { + "quantity": 924245086734, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 4437166, + "unit": "block" + }, + "relative_stake": { + "quantity": 36.64, + "unit": "percent" + } + }, + "cost": { + "quantity": 172, + "unit": "lovelace" + }, + "margin": { + "quantity": 43.96, + "unit": "percent" + }, + "pledge": { + "quantity": 15, + "unit": "lovelace" + }, + "metadata": { + "homepage": "BZ\u0019򷏠jX󠨭T\u0013kqS@򑉒r𿭎(BP \u0005?^M򈍛R<\u0016񬤋}'c@𩍥󣔭@[J\u0018\u0019,򩈓\u000fc򃴰&\u0004\u00073򬘧t\"򤠵Lt@%s󿷶𘴐v\u0016𨉺l`O[Z\r/\u001d􃘘$򻀉\nc\u000c򆵀J|\u0005f\u001d%a\\\u000b2󕖋0\t񠠰q2󕛲񮏶򐊧,5]", + "name": "\u0000 vek៻gd\nF]\u0010fl󑭺UJ󦨱򅪚bL!򕛺l+𸞦h𧜺j\u0019?󢾳𔙛*", + "ticker": "SI:\u0008A", + "delisted": false, + "description": ".q񅒙\u0008쳋T\u0018m𵮺Ƌm2\u000c\u000f\u000b󕒈9NJ\u0016󍌿\u0004\u0003s#@'\u001aS􋆏}󌷯g񁋺t\u0004\u0011S \u0010x<򕤌\r%Qhnn򻕆\u000bu񆚄\u0006!\u0000\u0001K𫎝)\u0010\u001a6{\u001b-uBO!;\u0013n`C򒙖>O!Zv𩏆򊃨\u000f-oy\u001e\u0017btt\u001d\u0004G󜊁\u001aEe{\\\u0015\u0016of\u0014򴵧𾧨W󹗉O񟷵J刭񖉭Ef\u001a>\u000c\u001ctqMC+" + }, + "id": "pool180d5ztwcuzaatnnrvvk3za98xg7zhhxasljuvnuyj44j72d8tyd" + }, + { + "metrics": { + "saturation": 0.5760567293728108, + "non_myopic_member_rewards": { + "quantity": 635458613658, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 18505166, + "unit": "block" + }, + "relative_stake": { + "quantity": 61.82, + "unit": "percent" + } + }, + "cost": { + "quantity": 124, + "unit": "lovelace" + }, + "margin": { + "quantity": 98.45, + "unit": "percent" + }, + "pledge": { + "quantity": 171, + "unit": "lovelace" + }, + "metadata": { + "homepage": "ku`\u0013󉢖aU򃹿񋁔vM\u001d%鎫ẋ\u0002\u0015󍺘dJ񀙏񮰌b:򞱒V{󹟱2$3\u000bf\u0005b𷤽\u000f?W􈧞񵟘R񕆸\u0006󈶁H􏸽+YF\u0019@B,gn#&!s'H\r􈋬1𖖜9𓜹}$n򍏹񦗉𤿓:\u000b\u0019󝭵n􋋁𓭘Cfb𑩒*Z񶷙\u0001d񼿬\u0000\u0008'򶦔", + "name": "\u0008􀔫\u0011n򋧌\u0013󪿢amnwG񧶌`.5\u0008\u0015􈩦1m", + "ticker": "RBD@y", + "delisted": false, + "description": "\u000e񋮟}7o򨧞\u0000 .`󏁏P\u0018\u0002\u0005󈽱+l\u0011U\u000bk\u001f𦗿򛔡;񸧨X4򮑀\u000e~\u001a\u0015m72md@U\u00086󉇊𗠃򄭤󛑪!񮲌D򰁒>N󅋙𻿂򑽛[򹶋<\">J񶣧\r\u0011IZ;\u001aA\u000bWfR;򮶶\u0013w-O𽩩򐅒h\u0001򓦀󅎆[u񅓅.Cx$\u000c򳩚9c򦑝ꇯ[5p\u0002\u000f\u0006#)򿞄B\u0014𱞡򓏆A򮜴\u0006^*\\󛬽M񇹁򘷦`C𠁆F(/x𵍆􆶺\u0005󋄠hq\u0018Z\rB(򊇖\u0000T󏹐uhx򺆣o\u001e3rO󯹅捆\t719fo񾤼\riEq󩛇\u00160𲝐s\u0000\u000eX\u0007;🫎󒉣;u\n|{B\r\u0013V􆭫򰡘\u001c\u0019󃸭񫶏\u001d𐔓򐔻smQ􃭛;t" + }, + "id": "pool16e5fs927cms54tpdmklqqcvg8cy7jqu5hvjcpp52tn6vyhup949" + }, + { + "metrics": { + "saturation": 4.06577063978342, + "non_myopic_member_rewards": { + "quantity": 630400707373, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 21171571, + "unit": "block" + }, + "relative_stake": { + "quantity": 19.58, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1879-07-04T23:56:27.811518674567Z", + "epoch_number": 1964 + }, + "cost": { + "quantity": 185, + "unit": "lovelace" + }, + "margin": { + "quantity": 17.91, + "unit": "percent" + }, + "pledge": { + "quantity": 152, + "unit": "lovelace" + }, + "metadata": { + "homepage": "2L]1򕡣󸙓P(|\u0018\u0003\u0000!🇒\u001b󭇄eP񿼔2\u0015\"j:", + "name": "\r+w\u0006", + "ticker": "懲+񏡤", + "delisted": false, + "description": "@󉝟\u0000񓢡󗎏< zk򝀎-f7󉴏++uj&\u0006\u0003-GAlx򊞛\u0001]S'y򉻈?rC\u000c)򤠵XT" + }, + "id": "pool1x5mp5jn29zdtsjhuq4wfcuf9glrx0ejg4rqfv3lwz4ntu6qyr9m" + }, + { + "metrics": { + "saturation": 5.176619043666619e-2, + "non_myopic_member_rewards": { + "quantity": 940330897384, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 18663329, + "unit": "block" + }, + "relative_stake": { + "quantity": 1.65, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1882-08-01T07:01:52Z", + "epoch_number": 26722 + }, + "cost": { + "quantity": 179, + "unit": "lovelace" + }, + "margin": { + "quantity": 35.59, + "unit": "percent" + }, + "pledge": { + "quantity": 70, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\u0001󕗚\u0000RZt%\u000ft\u0010Y񹺘l񛹽8,`6􀃛9\u0008E7o5𲑒64\u0013\u0016TMh|g󴰬\u001bfD򓧀񃙬EqC񊷩􆛴", + "name": "O9d\u0014Gm\"𞞲\r\u0000)0w\t>Jp򄿌2VH\tU𷂳-\u0014)򹕩\tG", + "ticker": "\u0018deV", + "delisted": false, + "description": "L*\u000c[\u00030񒿸?\u001f/m|1\u0001򔅏-򾁸\u001ba򆝄(`\u0011I{󡏋f8i?)𤺇]X񍞩{C\u0012􎕫񵘎\u0010%G𡛨q󥍻􁴇}\u0004>򱧄)6򧂈򎂬󏂌s\\!ꕫam􏌈P\u000fo{\u001fCr*ZL󽜻󿓍V񳍋=\u0000񬶤W\u001e\u001e󜱑LW򏝖򜄆񽄀򃤦>\u0008򐪽|\u001c)󢥘7QF􏾔#f󩖥w*Bz>𘗌񐌎I\"𝻈􍷊񤬄@\u0006\u0016\u0013𽞦\u0011h[j]?)\u0008\u000f${\r\u0001\u0016󸠗XM..\u0005S\u0019%\u0012\u001ar9\u0005\t𨹌񑩽.4N,󟁍񱸔7^" + }, + "id": "pool1cap526pl6dq4ljgh28c90k0a55myh4t6ygpufvrkr3zlxdj5946" + }, + { + "metrics": { + "saturation": 4.0252231481378224, + "non_myopic_member_rewards": { + "quantity": 714373213455, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 17554996, + "unit": "block" + }, + "relative_stake": { + "quantity": 25.69, + "unit": "percent" + } + }, + "cost": { + "quantity": 68, + "unit": "lovelace" + }, + "margin": { + "quantity": 6.17, + "unit": "percent" + }, + "pledge": { + "quantity": 238, + "unit": "lovelace" + }, + "id": "pool12tf3xfqaq06ny7rg4qh887cw9a5jynk30atvdu7mdx2dgc4mw8e" + } + ], + "last_gc": "1891-06-23T21:00:00Z" + }, + { + "pools": [ + { + "metrics": { + "saturation": 3.726728642672161, + "non_myopic_member_rewards": { + "quantity": 172861612247, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 22161224, + "unit": "block" + }, + "relative_stake": { + "quantity": 47.3, + "unit": "percent" + } + }, + "cost": { + "quantity": 240, + "unit": "lovelace" + }, + "margin": { + "quantity": 29.76, + "unit": "percent" + }, + "pledge": { + "quantity": 191, + "unit": "lovelace" + }, + "metadata": { + "homepage": "6󪓇.2ZN\u0017\n{񷻾\u0007\u0006󿴾\u0000|󁩀\r(󥰵󛉹n?bg\u001c6\u0010?V", + "name": "PEs𨵘%9\u0017𔺍 ", + "ticker": "^󭐐\u0004F", + "delisted": false, + "description": "򯞎'w󄚰\r𤹊|C\\\t\u0007?la(3)0󢪂R\"CkQ󿔝.񄇄b񻸽\\𙔠\u001d\u0014}dLU򰧴𕰜XE\u0001{\"{B𩛹󊲣i򋞇}񌜴\u001a9Brw򯄤򗀴\u0008𜫽!2f򆬴\"v2CEF1g-^b\u000f󢰚^5#H\u0004r\u001d#[jU\r񱵷pGld\u0000𸖷\u0014M*\u001aBB\u0005񴁺\u0000R{\u0019_\u0004\u0002\u0003/򰮥/\u0006IUp\u001cM\u000fsl]a󿎦苠&\u0007Z𹊺\u0004F򗴼\u001b$\u00145oz񹗝\u0001\u0016񣠶b~W󲈷\u0004Y\u0017@9f􁎉󈔼v&v𫡜񨛾}󠾂񘜽w/\u0006\u0019閮\u0000ogph𮟱\u001dQ󙲒x󪹑`𺖴8d" + }, + "id": "pool1wcgu7y8gsgfj3m9akq8gpw2pd4zlx9s2xnessscur4rkj6upaal" + }, + { + "metrics": { + "saturation": 3.273579584412874, + "non_myopic_member_rewards": { + "quantity": 238077192544, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 142014, + "unit": "block" + }, + "relative_stake": { + "quantity": 84.12, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1886-03-19T01:18:24Z", + "epoch_number": 13037 + }, + "cost": { + "quantity": 87, + "unit": "lovelace" + }, + "margin": { + "quantity": 31.23, + "unit": "percent" + }, + "pledge": { + "quantity": 40, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\"􍛏񖚲\u001ef+K\u0013򵰣\u000e\u0005𜮢\u0005?h70Q\u0017󧞪yHM\u000c6gBS񸄊~󺦚)O\rF󓮣\u0001杬\u0014=EK KJ\u0002\u0018\u0003:󤁐򂰢YR`j'岦2<)򃧽~gi󕥭\t5!THN񬓙eo\u0002喛1\u0019|UHN :򞅱/Y3/s)<𑶣\u001e򍂮W.<0v\\\\ᛎ򎌛\u0011󆩴*\u000b𡀯\u00134C󟣜\n񁿏WQ\u0010A\u0005N\u001d򨉜\"X񭑮p|y$I󭺗sOnE\u0017_⹦􍱲{ℕ(\u0006V󕉷D򗐶T" + }, + "id": "pool139uujdzy9y5wwawz5z5u743mzvxrtfn5trcvdzfdaugtuc5y5qs" + }, + { + "metrics": { + "saturation": 4.849699749747879, + "non_myopic_member_rewards": { + "quantity": 745234401190, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 17290969, + "unit": "block" + }, + "relative_stake": { + "quantity": 91.66, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1869-01-08T02:25:16.715886366549Z", + "epoch_number": 18784 + }, + "cost": { + "quantity": 173, + "unit": "lovelace" + }, + "margin": { + "quantity": 60.29, + "unit": "percent" + }, + "pledge": { + "quantity": 78, + "unit": "lovelace" + }, + "id": "pool1veq93y9h4549u9tuehfs6ur8zkmcxhe9cfpqdxxxvuek2lv9g0n" + }, + { + "metrics": { + "saturation": 2.138766389968155, + "non_myopic_member_rewards": { + "quantity": 251220798556, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 15855846, + "unit": "block" + }, + "relative_stake": { + "quantity": 24.28, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1870-06-24T08:03:39Z", + "epoch_number": 12633 + }, + "cost": { + "quantity": 39, + "unit": "lovelace" + }, + "margin": { + "quantity": 42.01, + "unit": "percent" + }, + "pledge": { + "quantity": 207, + "unit": "lovelace" + }, + "metadata": { + "homepage": "J򃞯4\u001f?\u0014\u000efᓠP7,𖹰񁑃N9񮉝\u000e\u0005%", + "name": "􀎿0q\u0019񨖃>񺈊^쑫%󦫓WNaW񸸳q\u0001󯄊p󘷀l>rI򜕪\u0018=x", + "ticker": "򁼷\u001dm", + "delisted": false, + "description": "#&^\u0000o󝨯.K%[(񇘄K􇞂l\u001b\u0010Q\u001e\u001fC< 24Q\u0004Wa&>(󕿪\u0006yl񧁠2" + }, + "id": "pool1gkgvf0ycea3sn8negtrysk4k2c9qysg8tzf4m5hyw4h4jwswha2" + }, + { + "metrics": { + "saturation": 1.168754160299379e-2, + "non_myopic_member_rewards": { + "quantity": 423162822243, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 8897049, + "unit": "block" + }, + "relative_stake": { + "quantity": 41.12, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1881-08-26T04:53:37.586294899477Z", + "epoch_number": 15967 + }, + "cost": { + "quantity": 180, + "unit": "lovelace" + }, + "margin": { + "quantity": 27.5, + "unit": "percent" + }, + "pledge": { + "quantity": 6, + "unit": "lovelace" + }, + "id": "pool13hdhwpx99v3seyu9y5knam22lag4at63ud2kmy0mnthxcd4ht3p" + }, + { + "metrics": { + "saturation": 1.0248916783221977, + "non_myopic_member_rewards": { + "quantity": 19028614470, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 20711155, + "unit": "block" + }, + "relative_stake": { + "quantity": 63.62, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1895-07-16T08:00:00Z", + "epoch_number": 8962 + }, + "cost": { + "quantity": 74, + "unit": "lovelace" + }, + "margin": { + "quantity": 92.49, + "unit": "percent" + }, + "pledge": { + "quantity": 98, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\u001eCp'-Z𓃮\n}񺓿񿟌\u0008\u0008G󝋄\u0004񜆬\u001e\u0013񅻏4𖮞&󒵄󯖔󑗪|_?\"򜨂_$\u0018󚃔)򢪔񏥡r\u0000𒿯𨜮'􃩣(F񌞊W1w\u000b{:񎣖󖤀2\u000c\u000f𘶾@", + "name": "\u0014M\u0010WZc\u0010c񨨛򲸾$􉼮XX񌏴*𰸛T|\u0014ⓒe򻹮\u0007chU\u0018𬪶\u001bjS\u0000YO^<3Q\u0004.FS\u000f񢆭󹾝,\u001bd\u0001B󡬵1z\u0012𼿐\n7" + }, + "id": "pool1u9jpf8t8sys0cmcltscpsvcyxluv3hv74wyg0uurmkhsuv0t6zl" + }, + { + "metrics": { + "saturation": 2.9298916942746485, + "non_myopic_member_rewards": { + "quantity": 171785894848, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 22275742, + "unit": "block" + }, + "relative_stake": { + "quantity": 81.32, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1903-05-16T06:07:45Z", + "epoch_number": 29298 + }, + "cost": { + "quantity": 3, + "unit": "lovelace" + }, + "margin": { + "quantity": 38.44, + "unit": "percent" + }, + "pledge": { + "quantity": 198, + "unit": "lovelace" + }, + "metadata": { + "homepage": ">鹫򇎐\u000c\u0010𖼖h񒅜\\bO\u000e\\*\u001a\u0012󔭫7\u0006\u001fd\u001ev5􈦷7A\u001d򿛘N~m)O񀎀\u0010\u001aL\u0018x󷠺񖣓R(Y󗴋\u000fT󋫧󂉀iA3A󲭏ZD񼄵󌼘", + "name": "4𒄭`", + "ticker": "􅈵J􃽞K.", + "delisted": false, + "description": "~0򧅩\np\u000c\u0017\u0013& \u0008\u0012}\u0017s\u0000[N\u001a-\u0006|\u0015\u001d񏱣\u001d󓏏\u001c8\u0015h>򧿊򥔗!P2\u0008P\u000c9\u0003 􍀦~񜥆f%y󳝡I򊦹 {񥳞\u0016r􀈟\\\u0006I꽢򪋤)1O񛜃񖛑\u0002򢡮򇱉=0𢨨/\u0010>𾛏𾫤n[l\u001f𶓗\u0006𧬜􅧈𸊑Dn{!󆒖\u0010\u0005`\u0005󾀒𲂃n𹨡[\u0011񾭢\u0006=x?󩄫\u001aQ;󌉕K񧟥j񢮩񈉑V$\u0012\u0007\u0018a\u0017AOVCF󡦫o񝯴𴼄\u0011􏄸\u0015]\u001eU=X=\t\u0011-󡪇\u001f𛥐󇈃A67\u0002\u001emp 5񬏥\u00048$􌐏Y|񯗑'񢈓?4\u0000 c𚱟y\u0011?L󶍼" + }, + "id": "pool1as7l9gdshmrq2pva7hfynd0f79ue5jzmjf6jzwqrjcf5xuuesgz" + }, + { + "metrics": { + "saturation": 4.960019812177834, + "non_myopic_member_rewards": { + "quantity": 923306256389, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 9880895, + "unit": "block" + }, + "relative_stake": { + "quantity": 0.21, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1904-06-28T18:15:38Z", + "epoch_number": 19218 + }, + "cost": { + "quantity": 237, + "unit": "lovelace" + }, + "margin": { + "quantity": 13.24, + "unit": "percent" + }, + "pledge": { + "quantity": 38, + "unit": "lovelace" + }, + "metadata": { + "homepage": "🼫򻨽𵞐'^\u001d6\u000f\u0019񖿎(󿭋0GUb󛏅镚\u0005l\u0000h\u0019,\t򵼣򏫠\u0016^󡃱򏧸1𼎰\u00120򌵷񟜗\u0019+gA$b\"\u0019x\u0004\u000eb񄀽r\u0005򩡷:O\u0017󷩫F(Y~󯘖\\W񹟎󮥹;z\u0004K岓(6>4$򻱳󥀋\u0011򾯩m#\u001aG򭅈􉥡F\u0013l񧏢,\u000e", + "name": "򤖋_\u0008򯓣񌷽6G󕄆]񪁏m𞸘󿉏q󌚡0Q򠑧/\u0001Ꮆfv\"{F;}\u0001", + "ticker": "-󢣥\u001ao", + "delisted": false, + "description": "=𩘊T󉶐\"󐛦򀷬\u001e𧈝񩅛x󍪺\u001b𡟡|񌔗Wk\u0017lDc[+;󐡝?񁰓򆯲󘢼򎮲\u0018lC𕹜pCFujC:R&󓴈)\u0017z񩩅8@}񩶥\u001a򣷘Tg1U񠻒@`񃪃\u0019S^\u000c\u0006P]\u001c{K=𘪓D<\u0019@\u0014\u00018\u0003\u0011%r\u0003񼠧T\nm\u0011#\\V>Z8k󳞓(񯟬򤻵(6𒿲\u0018%\u0007\u001fzT2򺫦\u0001\u0002M\u0018H򳣵XZ񹚡靾W5R\u0008H񶍫\"s^FgP󘧬򄣵򄀃\u000f񂈨󁯜\u0019󘙃8ඬ󷽚\u001b\u0014<6qX󃴡󪐎#򱙜𫅈Os\u0002󴝆𜁞a򈙳\u001c򧾖vDu\u0016h󌛭}u\u001dP*Y=򻄙󻘭󅔲NdJZ𩣗UEeij^񒺗u\u0004@\u0006􃦮8\u0016#.󥺧H`F򶮳򕪹k󰇗\u00070L򡷃5$PN\\0򠡧𥪔^" + }, + "id": "pool1ue4uhdg7sne3vjd6vxvjp4v09y993kcmfujyv3hdk56kzsav3ea" + } + ], + "last_gc": "1907-04-06T06:46:39.62955430318Z" + }, + { + "pools": [ + { + "metrics": { + "saturation": 0.21170493503846866, + "non_myopic_member_rewards": { + "quantity": 483009317390, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 5806, + "unit": "block" + }, + "relative_stake": { + "quantity": 0.12, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1859-03-21T01:00:00Z", + "epoch_number": 15606 + }, + "cost": { + "quantity": 243, + "unit": "lovelace" + }, + "margin": { + "quantity": 34.36, + "unit": "percent" + }, + "pledge": { + "quantity": 41, + "unit": "lovelace" + }, + "id": "pool1pcqtw5yctaqtwgeqlp6wj0pfn2znzy4mx0kayzuj0xjj7u22kt6" + }, + { + "metrics": { + "saturation": 4.053647938608113, + "non_myopic_member_rewards": { + "quantity": 38403517584, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 5949770, + "unit": "block" + }, + "relative_stake": { + "quantity": 93.8, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1899-04-14T11:44:36Z", + "epoch_number": 23573 + }, + "cost": { + "quantity": 250, + "unit": "lovelace" + }, + "margin": { + "quantity": 60.12, + "unit": "percent" + }, + "pledge": { + "quantity": 114, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\t\u0004Q!t򨧁񀃆\u0003W\u001e@.D`\u0008񱫯,񜋓6y\u0000+\u001a򈧋b񤶃@\u001a\u0004LCh񟂍=Nlr6fY𞞊󁗓#󁩬]𭤣𪅟%𽰭[~\u0019p\n\u001e\u0006&Y󌆗{𿨖Y𭫦H+nrk\u000b\u000ewi\u000c\u0015\u0004񜨆:򨱬\u001f", + "name": "Mm%𽷡𼣍\u001d\u0006kHH\u0006\u0002", + "ticker": "1R[\u0001b", + "delisted": false, + "description": "\u001a1\u001f#\u000e>\u001cG3i񻕬<\u001eD󺃯\n" + }, + "id": "pool1lm2dpnmkp4qt27t32xx9ep0cu6rwlc027f3elqm7jdwncqx4ukg" + }, + { + "metrics": { + "saturation": 3.5980255006786264, + "non_myopic_member_rewards": { + "quantity": 816342786332, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 3346703, + "unit": "block" + }, + "relative_stake": { + "quantity": 88.53, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1874-05-22T22:43:30Z", + "epoch_number": 9231 + }, + "cost": { + "quantity": 203, + "unit": "lovelace" + }, + "margin": { + "quantity": 26.7, + "unit": "percent" + }, + "pledge": { + "quantity": 48, + "unit": "lovelace" + }, + "id": "pool1a97awnqwqe855c8uuk4mqh3t8tckm7w2a9hpdz8y0qteys6k277" + }, + { + "metrics": { + "saturation": 3.807864815181308, + "non_myopic_member_rewards": { + "quantity": 797452431828, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 11958811, + "unit": "block" + }, + "relative_stake": { + "quantity": 16.32, + "unit": "percent" + } + }, + "cost": { + "quantity": 1, + "unit": "lovelace" + }, + "margin": { + "quantity": 88.98, + "unit": "percent" + }, + "pledge": { + "quantity": 148, + "unit": "lovelace" + }, + "id": "pool1tenzz0eapkpswj56qcn6m90xjh0m7lrx3kl4dxx69qeyzds2veh" + }, + { + "metrics": { + "saturation": 1.395980152312779, + "non_myopic_member_rewards": { + "quantity": 267691797963, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 6907308, + "unit": "block" + }, + "relative_stake": { + "quantity": 91.34, + "unit": "percent" + } + }, + "cost": { + "quantity": 194, + "unit": "lovelace" + }, + "margin": { + "quantity": 85.64, + "unit": "percent" + }, + "pledge": { + "quantity": 18, + "unit": "lovelace" + }, + "metadata": { + "homepage": "wXP𹀜\u00140PJ򂀏^.򷪜󃺒\u0011u\n~\\;{󶻫󉁼^𘵖&\u001dU𢙏Q췛/C񰮮/\u0005񓵕cQs\u0003\u001b\u0016t\u00196]-󽵼PV𾤉N \u000c򆒋򙓙n񵸓+\u0008WL񒡄^&𻭍9A\u000f\u000f", + "name": "􂋲$󊤱wM+U𛮖\u0002\u00080e󀛫uJ񗉕󈷢/\"\u000b@\u0007{", + "ticker": "\u0017g񟀸", + "delisted": false, + "description": "}􏄅d\"&OR*>A}񝦓Epk}V@5񌱸I蓑\u0012\u000f񎼬LP򄸵򃮬p\u000f,kM񿇮\u000c󳗜F\u001a񱅍W5󈞅\u0014H򠏇򩜁v𳹑$󴉶U𢼙񒡤 󤘛_I𲊰򺞂(󥫪@\n򷼴󑲋\u001b񙉙G򶛯]kGf'\u0014\u0019U@\u0007&򣳒򕿐C񶁡\u0001K\u0006\u0007򅉱\u001b'\u000f򃎬򎌚񯬹$󮟢񀘛\u000e~|&񐠈[򻇝<,󺄴\n?pC󵫿`$\u0013󮅽B򷙌򛬘)\u0016򐦢8M9\u0017\u001e򻻫OrH$򴈑\u0017%󺌠/d8D" + }, + "id": "pool1c4jl4c3xukljpg9sggwlvv3x094lccctuwjplw5vrkkmj7kup0d" + }, + { + "metrics": { + "saturation": 4.597911444564239, + "non_myopic_member_rewards": { + "quantity": 110921098795, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 12243490, + "unit": "block" + }, + "relative_stake": { + "quantity": 13.09, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1864-10-23T12:09:36.323580673465Z", + "epoch_number": 4717 + }, + "cost": { + "quantity": 78, + "unit": "lovelace" + }, + "margin": { + "quantity": 7.87, + "unit": "percent" + }, + "pledge": { + "quantity": 175, + "unit": "lovelace" + }, + "id": "pool10g2ljrhm0al0mmjfqxq8xx2xyjlcdplmawwgvwh2p7f0jwwmh8z" + }, + { + "metrics": { + "saturation": 4.737961294458347, + "non_myopic_member_rewards": { + "quantity": 263349192248, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 10216459, + "unit": "block" + }, + "relative_stake": { + "quantity": 74.2, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1903-06-07T23:20:35Z", + "epoch_number": 9039 + }, + "cost": { + "quantity": 35, + "unit": "lovelace" + }, + "margin": { + "quantity": 81.31, + "unit": "percent" + }, + "pledge": { + "quantity": 200, + "unit": "lovelace" + }, + "metadata": { + "homepage": "򌞕\u0017>DOPwgBK񂈎򚡮>Pg햷x\u0010񸹣\u0004(\u0014󜭝󅡉򗛹,+\u000f񪢣|hm\"󠥉񸔘󛐑3hd", + "name": "ARo󆱗\u0017\u0010&n B󳇘򮝱\t%\u0003", + "ticker": "\u0011wa", + "delisted": false, + "description": "X*𘐗\"gRfh\u0006C\u0011i𶀮t\t$w󒏬e\u0004,\u0005򂽧񵜋񼏵𮕭1|\u0000\u001f󺓛8F\u0014CvbL7g/\r򋨎E񜦿q\u0008눖R-a\u0005\u0007񈜿\u0006" + }, + "id": "pool1ecg35s7c36s0mhk3t52w3ke9mxqvtp3u59u9z5gesyn7wqq8d3s" + }, + { + "metrics": { + "saturation": 0.4255153739903095, + "non_myopic_member_rewards": { + "quantity": 241451149013, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 2007488, + "unit": "block" + }, + "relative_stake": { + "quantity": 28.06, + "unit": "percent" + } + }, + "cost": { + "quantity": 97, + "unit": "lovelace" + }, + "margin": { + "quantity": 49.07, + "unit": "percent" + }, + "pledge": { + "quantity": 121, + "unit": "lovelace" + }, + "id": "pool1m24k5wydjg2prfympd99n5mwmym3u7e3nnkzfe4ne3kwua860v6" + }, + { + "metrics": { + "saturation": 0.16557590572963576, + "non_myopic_member_rewards": { + "quantity": 6117928114, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 320530, + "unit": "block" + }, + "relative_stake": { + "quantity": 63.87, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1898-04-10T01:00:00Z", + "epoch_number": 6925 + }, + "cost": { + "quantity": 250, + "unit": "lovelace" + }, + "margin": { + "quantity": 4.54, + "unit": "percent" + }, + "pledge": { + "quantity": 104, + "unit": "lovelace" + }, + "metadata": { + "homepage": "&:\u001c", + "name": "&򀘣j\u0010,-", + "ticker": "񺸾GL", + "delisted": false + }, + "id": "pool1fgqaguxvcku3rx5lc2xzjjphu4zqye4v3n6pad8t5xtfxqt2ve6" + }, + { + "metrics": { + "saturation": 6.41856093865012e-2, + "non_myopic_member_rewards": { + "quantity": 948371021745, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 21465554, + "unit": "block" + }, + "relative_stake": { + "quantity": 8.46, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1880-07-17T21:52:49.409636090741Z", + "epoch_number": 8667 + }, + "cost": { + "quantity": 247, + "unit": "lovelace" + }, + "margin": { + "quantity": 20.79, + "unit": "percent" + }, + "pledge": { + "quantity": 136, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\u001a\u001a𚰎7PpT\u0007\u0011񸠞\u0008󕻨mR{󦑵*\u000e󇧦\u0000&=\u0010%\u000c:_qf r[f\u000e\u001aY\r8G4B񼦶񡍄\u0008E3@PT\u0008jE\u0004\tA\u000c󐸖򚻤]zhh ^)zY#\u0000񜿁i", + "name": "\u001f𸎤i\u0007WCJ񪩋\u001a\u0002\u00032􇇅pY$ t", + "ticker": "񪾨)?", + "delisted": false, + "description": "󘌐9񮟉\u0003C_CH򿒸񠣑|\r򪈆I\u0002\u0018*L򛼿*\u0001񫱸U\u000f?-\u0001򲻜\"I3\u0007a\u0017󐭈z鷆󏉈\u0006u򹴫$o^3TJ𭿈pTW[7T5񕕭X\u001e(􈅈􉓤q)G\u0007Y󟲕|mfEBzet񗯽r\t5򦒌u{\u0013򇅞𠱫\u0002V\u001cxZ@w\u0019\u000c򌍔\u0016:[󪳷\\Z񮊞.􉁁pM󿷕#򜢟g\r򊮷b򹠚𛤽󜹤Y򻫹+򕷬\u0017𺦓􋋉u򅈓\u0010N񡕟\u0005񏁨$\u001e\u0004񡦥󤔨𔌟Uz򆽻o?-񸁭򖯗\u000cA\u0011t\u0011򞹊\u0001򝗇g\n]d󬐪@򋒦8\u0019:\u0015xX\u0018#\u0008SpY-\u0018\u00110R񏣓l\u0017󪨣󌔛\u0013򥃘򑖲\u000b\u001c󘀾򞺺\u0000;󬽜.k\u0010\u001f󥬶]\u0000񮬀\u0002A󮤼1𨻓.\u001c3J􆕰f\u0000J\"\t񥍭񷡳9~񑾆dK􆟈10Hi=\u0013\u0018o\u0001\u001e񥚎𤙙\u0007~\u000fk{\u0006XBW󙞳\u0006\u001d?񟩆񈹁MSz\u0006󅏂A𦚈4򠜏Q򄚔F\u0001\u001fyx񻇊YS<+@䠖Q" + }, + "id": "pool1eazuxzungzveakegmavulqmdwxsy2g0dtzsmdhz692eexnzw2je" + }, + { + "metrics": { + "saturation": 1.3203251434933228, + "non_myopic_member_rewards": { + "quantity": 439731462941, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 9248324, + "unit": "block" + }, + "relative_stake": { + "quantity": 96.99, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1888-06-30T06:55:41Z", + "epoch_number": 17711 + }, + "cost": { + "quantity": 96, + "unit": "lovelace" + }, + "margin": { + "quantity": 62.91, + "unit": "percent" + }, + "pledge": { + "quantity": 149, + "unit": "lovelace" + }, + "id": "pool1mp6c9xaaed5pg3a7cc2c0sk3hqjzjp02dayespas6406chrqee5" + }, + { + "metrics": { + "saturation": 1.0873359781032348, + "non_myopic_member_rewards": { + "quantity": 820188729005, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 17778975, + "unit": "block" + }, + "relative_stake": { + "quantity": 80.85, + "unit": "percent" + } + }, + "cost": { + "quantity": 114, + "unit": "lovelace" + }, + "margin": { + "quantity": 63.2, + "unit": "percent" + }, + "pledge": { + "quantity": 42, + "unit": "lovelace" + }, + "metadata": { + "homepage": "\u001eZ𾶞)b'G8󏩍QL𽊠\u0004򩹦\u000ff򱁧󬱻J%\nl5\rG񩲾I", + "name": "\u0018*~\u001b\u0005\u0002񃬎eR\u0005oL[򄻜_\u001c\nmG>\u0000򾕵D\u00059X@Cqg", + "ticker": "񁼯c~", + "delisted": false, + "description": "g򯢐}W𕼂\u001b@𬡧Hdf\u0001Q\u0010p򞠃\u00189󳢋y񽧤𽬺>$󙃱񆇋\u0000}H%^󥶬𾮽W\n\u00141\u000f\u0003񋋻\u0012p\u00128򿥤E/􇿦5󾼾VAI󦊹󱎯 \u0002𯚎5\u001e1~򓘷-󄦱󂨋\\)\u0001\u000c􅰏N\u0001񎂸u󼔐􀻴9\u0006z\u001cF>N󁏦*9򯐑򄂾󚟛󼰳\u0001񽻴`d3\u0004\u000cym񽲣J󬐛\u000b(^\u000c|V[\u001c@Z􆴹h󀶽Q1E򖁌𴠈\u001f\u0008-\u0006򣎮󦫰O񛪂9KJ{\u0017uBej\u0012\u0019\u0018񫨟-opp񡄝*񶺴\u000e4򛑹\u001e\u0006M)򮾅L\u0005D\u000c4n-f􃈭󓗌񽈸r\u0006Kz󭨌0QNTlsY~f\u0001},]@湼L\u0014򼠶㶬N\u0016rT;SM\u0003\u001d񩚺𯞎\u001b\u000b\u0014)&󰗎\u0013𜕃/A󧸙l\u001c(,򫂳}򵣧򵻟O9򮌻J\u0013\u000buQ򝸕򲉔>(\u0012\u0005\u001d2P񈎖𼜓I#j\r𧺤3s5\u0008" + }, + "id": "pool1lmfmfegamad4hq9wcrke8fxhjuw5rrxy7krrusajdf8ykmfvtuc" + }, + { + "metrics": { + "saturation": 2.114577782491012, + "non_myopic_member_rewards": { + "quantity": 201305786414, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 19612315, + "unit": "block" + }, + "relative_stake": { + "quantity": 97.78, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1898-02-10T16:00:00Z", + "epoch_number": 7715 + }, + "cost": { + "quantity": 90, + "unit": "lovelace" + }, + "margin": { + "quantity": 41.05, + "unit": "percent" + }, + "pledge": { + "quantity": 234, + "unit": "lovelace" + }, + "metadata": { + "homepage": "𬓦D\t5🛑򵞮.vAf\u0018K\u0016x\u0012S򖇀.Z𼐃񚙵󆔎$񲲛L%7-I4w񸢋𨬸\u000f\u0010\u0001`򿡜\u0013򡅜G󱋬Qt%󡃠h S󂗓1[!W󸏠_^u󼃥\u000c񕋈\u001d^BO fwh\u0011\u001b\u0011\u001c$򘔻\u0000k$/N򆵽񈯤󋲸<&d)U\u0000-\u0013QO", + "name": "A%7\u0010V@\u0002Wq򾽷R񽒙𴙵N#RnH򉫸򺧔$񎩨&\u0013\u0019MSRueAh\u0017B", + "ticker": "\u0002!/", + "delisted": false, + "description": "􎍴o>\t,\u0004\u000f񉇽\u001b󹬍򢿜" + }, + "id": "pool145fv36cy4qaec256dthclc2sn0jxpcdn6r6h3l94z4ackp7x07d" + }, + { + "metrics": { + "saturation": 3.28151555243486, + "non_myopic_member_rewards": { + "quantity": 820454618566, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 12510793, + "unit": "block" + }, + "relative_stake": { + "quantity": 8.49, + "unit": "percent" + } + }, + "cost": { + "quantity": 176, + "unit": "lovelace" + }, + "margin": { + "quantity": 22.1, + "unit": "percent" + }, + "pledge": { + "quantity": 210, + "unit": "lovelace" + }, + "metadata": { + "homepage": "􍑾},c󙊂2\u001c\u000c\\\u0018Z)j𹪤w\u001a$򂜰󸭙򮈆\"Y󥩵X?񁸣!x򮤣l0*b>G\u000el[0L\u000e󛬇񞄣󓽔N\u0019v𩦜`8&\u001c=9򀖊>L󟎇薋h?򥌲\u0019G?񐎌e򎳬ueJ𹂇񑃃Q󈮍\u0019鵭\r򢢽\u0010z񧽮;r\"dpmC󔪩\u001b\u000e+HX񩻭A", + "name": "n;>\u0015򝩽g\u0004b󩻪񥍚n!𯃴R^ci𔊑󄎢P/\u001fa", + "ticker": "4/򡚵H:", + "delisted": false, + "description": "1rC󺪾Iy񰅒Q𖼟'y4f򀂵2w\u00049u5/e򊸠9W\u001cU󁽣\t񓾳wufr񯴊\u0004oy񑩦\u0014\u001d.򽌓W󜠏K]O_\u001f\rB񂦿\u0005e􇫴E\u0007D\u0016\u0011/\u000eN>W𢻠a󕄘Vw󵊖P\u0011%\u001d񠪳;#70󟡓󸄓$&𧈈\u0005򲒞r\u0015+\u0016󧂕.11\u0002V\\\u0018򾮬u􎲣mKSs\u0008𜃠P񋽿U6 (󁟘Sj7\tkA\u000e_:t𝕰񵜠\u001c󋋲𞲠\u0012;񗓿󛱡5\u001c?YL$\u0005񐭬\r\u0008dq^󚼢\r򆩬2B󊿾,p,\nᶯ\u0004}`⯕oWir򗑼󑞝n\u0016󶯠A򘎿i\u001dd}񗕢\u0005~;\u0016\u0017f\u001fN\u0002]=5,9+\u0015*򓲅񣲨񫅌򥶭f" + }, + "id": "pool10watuz44a36fgup73p3dm7us7cp9q7449pfmc0k7fjcdqem2acd" + }, + { + "metrics": { + "saturation": 0.6714721531990558, + "non_myopic_member_rewards": { + "quantity": 236101345869, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 7454644, + "unit": "block" + }, + "relative_stake": { + "quantity": 75.16, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1888-01-18T16:05:22Z", + "epoch_number": 2541 + }, + "cost": { + "quantity": 41, + "unit": "lovelace" + }, + "margin": { + "quantity": 45.59, + "unit": "percent" + }, + "pledge": { + "quantity": 169, + "unit": "lovelace" + }, + "metadata": { + "homepage": "򌍗e@󸆌ﵦ8U𓛛u\rF\u0005u򱼼􇍩󿂇𲋍aX󩺽\u0005p󢨅iy$}C3\u0019򮽉7'򣉐H􋆕s/򨉛񰮉V泰:򖙹$9\u0002\u0001򯪳\u001c񭀗8@.O񿖏g\u0016FA𗨋񘅽", + "name": "\u000e򜾺Y\u0001򋸪q\u0004p?3񏤽H󯐸T\u001fr񶷕򥣟\u0018񰆒k񤞉򝕋&i\u0019v񢑮䞰f_𹟬\"f", + "ticker": "Q\u001e𻏗G", + "delisted": false, + "description": "\u0001K𥼢t+\u0014񰉖ZLy\u0019I򖫴B\u0012\u00111񁼏\u000c\u0003Nvt\u0010$a򸵛*(<򒁻𰶶}\u001d񹤨@𪇓S1HSu,'\u001b[~\u0011h\u0000\u000e-^\u0019%p𳛚gy񈌝\u0008'󙉁cp𞖣𛄘B\u001fRP񞫽qpM(R 𧎾򺓎񌘛y󲚝文a\u0018}f6.bY󘩆#\u001e􃦧(+~f\u001c|l򞼩\u0018avt%R\u001aE񋈑樂\u001c򄚀PwG򶉁uP|@򘔉'X񉪧\u001a\u000c񢠵\\d𸶃\u0005Z)+\u0014񒦡\u000f\u0017\u0010pZ\u000f񳕑󭺺[uMw\ni\u0014`U񧝥%UP񰾧R]򆲎x\t=񎚹񼳥\u000fS\u0006\u0007򲰸z\u0017wl\u000e𩜡4򝴻4񣌹8^4[\u0018򡺤󁊡W[2\u0019" + }, + "id": "pool1a4jrydcajxkgzadrylvxxxeymk7tzxcf8hs0ykdc073lzgv26ud" + }, + { + "metrics": { + "saturation": 0.14368273388363662, + "non_myopic_member_rewards": { + "quantity": 684760344120, + "unit": "lovelace" + }, + "produced_blocks": { + "quantity": 2660262, + "unit": "block" + }, + "relative_stake": { + "quantity": 47.92, + "unit": "percent" + } + }, + "retirement": { + "epoch_start_time": "1903-11-03T06:01:10.041212200311Z", + "epoch_number": 27255 + }, + "cost": { + "quantity": 75, + "unit": "lovelace" + }, + "margin": { + "quantity": 24.54, + "unit": "percent" + }, + "pledge": { + "quantity": 207, + "unit": "lovelace" + }, + "metadata": { + "homepage": "􉛢}%\u0018\u0014\u000c:q", + "name": "+<\u001bb񖑑Ha󗤨\u000b\u0004񶞱", + "ticker": "\u0012\u001fvu", + "delisted": false, + "description": "\\S񉢍L", - "name": "\u0008𾦶\u0004&~-󫡲\u0014@󙖯i𯩁R,񾔶|#𸴟>C\u000f", - "ticker": "`\u0007\u001d", - "description": "^W'k񬈅F*k&P!C*\u0008=\u0016}𨿋Z 򛫻񲦚aY)\u0003D\u0000W𱐬󁎦񋟙t;\u000c" + "homepage": "h;𑝐񴧻x(\u0005I\u001awh\u000cAVAQr\u001eVLsYViHi\"?c\u0017\u0005񘇙E񟒃/\u001d\u0014򹘵𗟅򗁛C򒹇\u0005𢽸𺝖􀋟", + "name": "<\u001c􈽎𘘃p\u001d\u0012>{S~!ij򑣐aa\u0018\u000cQ4\u0010xz󑑯\u0004", + "ticker": "o'󥩪", + "delisted": false, + "description": "P񽣽P\u000fu_-XDj{􀵐]OQ+" }, - "id": "pool1j4p8d27crkjde00p4l9v5f95hftm23x2yylllp9lzg72w6p4ecm" + "id": "pool1qx33vm629939gqjppuda0au9ulcc338jfrsueqmqg39pwxjcksu" }, { "metrics": { - "saturation": 4.206923248389226, + "saturation": 4.580390433718588, "non_myopic_member_rewards": { - "quantity": 939832251301, + "quantity": 294702726868, "unit": "lovelace" }, "produced_blocks": { - "quantity": 22311798, + "quantity": 16493178, "unit": "block" }, "relative_stake": { - "quantity": 86.03, + "quantity": 38.01, "unit": "percent" } }, - "retirement": { - "epoch_start_time": "1885-01-28T19:23:12.506992765083Z", - "epoch_number": 19632 - }, "cost": { - "quantity": 195, + "quantity": 142, "unit": "lovelace" }, "margin": { - "quantity": 25.17, + "quantity": 83.39, "unit": "percent" }, "pledge": { - "quantity": 144, + "quantity": 92, "unit": "lovelace" }, - "metadata": { - "homepage": "𵍓\u0006\u001d򡗓񍹭", - "name": "\u0011&񐔒񕜳\u001a𻧩񣕣Q񙡺󞖋򝷙W񆫽:\u001c򥷪4#", - "ticker": "󵬘N;", - "description": "P&u~y򎛊\u0011qDg\u0003\u000e\u0006D^r򃚦\u000f򔇰h񷩙񍓧񓫢:>k񼝛򡜣!k\u000c\u0008x\rs3􃞧d\u0001xvA,W`󩰫󧀿\u001br򓚁񂥳g{\u001cW\u0005\u0002򄗭񄢩@\u001fLEX哠N0 #\u0011\u00082\r#D򘵻򪬏\u0008]򞳭z񞥃񰦑c󗎟򕗀'\u0013\u001b򔌏%8]򱐄6N\n\u0018n#j񜉅:kxX\u0010@yDq\u0011󂻎g򾾡c\u00004򗙧𾤢y󛷥K\\?Ik^Wf^𝽠_򝗆kpuaCz\u001a󖀃\u0016O񁕓9\u000c󮩹\u000bIQ\u0006P\r>f\u00179\u0015!/~u򁽟{)#\u001a\u0011W󧔾?\u00048d&f𚉐(򻙔l'Z\u0015򏼘i[R&𫟾" - }, - "id": "pool1y4zccfz0vrvmt8e96gfn5u5pd0zln5fn2uup25fk8grfw4frwqh" + "id": "pool1e7v7898ug299x6nm99y3g9vyl528m7q6l8xze27adr7ev84p3jq" }, { "metrics": { - "saturation": 2.0262672273589573, + "saturation": 3.700596560521758, "non_myopic_member_rewards": { - "quantity": 688229616774, + "quantity": 993358119124, "unit": "lovelace" }, "produced_blocks": { - "quantity": 11174627, + "quantity": 4400249, "unit": "block" }, "relative_stake": { - "quantity": 1.75, + "quantity": 69.26, "unit": "percent" } }, "retirement": { - "epoch_start_time": "1908-07-23T01:18:41.264047239015Z", - "epoch_number": 14875 + "epoch_start_time": "1870-08-22T20:47:27.928086740337Z", + "epoch_number": 31486 }, "cost": { - "quantity": 175, + "quantity": 117, "unit": "lovelace" }, "margin": { - "quantity": 6.67, + "quantity": 42.68, "unit": "percent" }, "pledge": { - "quantity": 230, + "quantity": 138, "unit": "lovelace" }, "metadata": { - "homepage": " 𹙢'Y𴛤-󉡙\u0000\u0016\u0002wm񅨚PG򣁢󡿡Z􇵂\u000e񙄟\u0010jB󞭖􁄽y'$\u001f5񲒖𮡧\u0007^򎴁\u00009sy􏂦W􉑤LNfiQ󉜴%\\Rb\u0001!+򿋳\u001d\u0015l񔺑񃨍D\"𼢴篸\u001b)s\u0012>?", - "name": "\u001bL𘜚H\r񳭨\"mC~?U\u0002dvh${rr&)\u0017򦤘񖙢\n򥺪i\u0008\u0006􄓄]1_𹍘\u000b񁾊IfK\"󖈷𳫴򾝢", - "ticker": "=us󬟶򷬣", - "description": "~`]\u0017򂃱^\u001bIr\u0000,\u0005\u0013m򂋲/󱞉P\u0005\u0005\u0018\u0007jL" + "homepage": "\u0004򖤻\u001d", + "name": "2bd􉍑􄅒?F>\u001e𖧌򸔭䃕\\-C8o󼰲l#𥪪򪮖\u0003🐃miO𚿏-򗌿", + "ticker": "󧷕\u0007.", + "delisted": false }, - "id": "pool1wv5uzfqqrdrns4aprvh4ta8egwqavru05z77024k7h0p6dudkvd" + "id": "pool1x3rlrx2wzv9ps9kpfc3s8ulsyqh4kda8l4vw0nlgmeyzqhx0w50" }, { "metrics": { - "saturation": 2.118516160766028, + "saturation": 4.826729474948514, "non_myopic_member_rewards": { - "quantity": 870783207562, + "quantity": 8598527498, "unit": "lovelace" }, "produced_blocks": { - "quantity": 4904922, + "quantity": 16774380, "unit": "block" }, "relative_stake": { - "quantity": 75.06, + "quantity": 63.72, "unit": "percent" } }, "retirement": { - "epoch_start_time": "1903-04-06T02:37:17.892934980153Z", - "epoch_number": 32025 + "epoch_start_time": "1888-03-20T05:00:00Z", + "epoch_number": 21398 }, "cost": { - "quantity": 101, + "quantity": 153, "unit": "lovelace" }, "margin": { - "quantity": 2.07, + "quantity": 26.29, "unit": "percent" }, "pledge": { - "quantity": 69, + "quantity": 180, "unit": "lovelace" }, "metadata": { - "homepage": "\u001c\u0004q񿧫i\u0007G8𒆢<󋟰\u000c5M_\u001a.G)􅷋v\u0001򑽖nN񃤚}0񇫀^\u00129", - "name": "|𢾍񅳷񥦌𮣻􀌐A򛃹򘁒0(\u0014񽂲𗕂q\u0004񅶠.񺘠h\u001b\u000eq_.󘯝I񥣁ra\u0014󰘕/􁫥T[∭Q5'󸸕􂕫\n\u001c󋇤ZᎱ\u0018򖛧", - "ticker": "(\"f", - "description": "j?򈨆Z\u000c𓋽\u0005:󷘭\u00010E\u0005񱁸񍸖\nL*A𴢮\u001dW\u0006󾄓𛵫%(򩥿􍞀1񩔚x񍑀󈊲𽆜񸎙(\u0017\u0018(Tz1𣢆򆺦𐕗x\u000b򼼾]\u0001痑򭐌􂍲{Xv\u001a\u0002񁲗\u0003@m򱶗B񦝥򉧺J\u0006𭱽d?\u0011\u0000&󟭯0\u000ep", + "ticker": "D@>\u0012a", + "delisted": false, + "description": "򮾳󮙲E*𥜄񈯽-\u0005󂿴ࠝ񒊆\u001d9򭖜)\u0019\u000fC󘙕Fm-P󌤏{\u0018B^𕲺" }, - "id": "pool1ve8ysena2jsdqyxz6jevrzk3q9d7hagw7ayfmg46ldqcgxgj3sh" + "id": "pool1mma33h2f254q2ycqavrvnutr48p5u7xrwr34xtwdvfcrq8v05kt" }, { "metrics": { - "saturation": 0.20777293359932947, + "saturation": 0.9242812755871216, "non_myopic_member_rewards": { - "quantity": 262774299112, + "quantity": 240765855378, "unit": "lovelace" }, "produced_blocks": { - "quantity": 11082948, + "quantity": 10240989, "unit": "block" }, "relative_stake": { - "quantity": 88.97, + "quantity": 14.39, "unit": "percent" } }, "retirement": { - "epoch_start_time": "1876-09-13T20:06:19Z", - "epoch_number": 5035 + "epoch_start_time": "1877-02-03T03:48:06Z", + "epoch_number": 8039 }, "cost": { - "quantity": 251, + "quantity": 11, "unit": "lovelace" }, "margin": { - "quantity": 2.84, + "quantity": 80.59, "unit": "percent" }, "pledge": { - "quantity": 212, + "quantity": 207, "unit": "lovelace" }, - "metadata": { - "homepage": "\u001e򢉉O4r󕵦򬃑Z+G=󝨌򂏞IFR?pN", - "name": "\u0015\\\u0001\u000f$DE󛡬񑠅_񍓎~c8)\u001a\u0010-F<", - "ticker": "(M񔏺", - "description": "`\u0007𜖆\u001a9`􁌴8.𸧏C\u0000򚕌\"I򛡧𴶉\u0008\u001fg\u0005!\u0001\u000fz>(🯨\u001385򱋖701\u0003jW򏹞r󙠎z" - }, - "id": "pool1wr3kzh64ruwv3h8zmegr6qyr3kxpz5urqfzja2mj90zucd03jgu" + "id": "pool14jfyapt08wen5r8yegm8y90gqzlamdywdq75ap6yx8m02vtlkaa" }, { "metrics": { - "saturation": 4.875352324926411, + "saturation": 3.2279229048531204, "non_myopic_member_rewards": { - "quantity": 960257825132, + "quantity": 389227363757, "unit": "lovelace" }, "produced_blocks": { - "quantity": 15032451, + "quantity": 7955869, "unit": "block" }, "relative_stake": { - "quantity": 79.66, + "quantity": 43.98, "unit": "percent" } }, - "retirement": { - "epoch_start_time": "1866-10-03T08:00:00Z", - "epoch_number": 6360 - }, "cost": { - "quantity": 242, + "quantity": 142, "unit": "lovelace" }, "margin": { - "quantity": 72.05, + "quantity": 57.06, "unit": "percent" }, "pledge": { - "quantity": 187, + "quantity": 88, "unit": "lovelace" }, "metadata": { - "homepage": "]9}}E򰨣#񊛈+@𺦵#%mR𝽹\u0014󫱝􅄧p򿨶𲑲\tCC\u0018[_4򾝽H󦿫k\u00037𖥿\t&\u0010&*F𛪀<${򉁡󢨌-\u0017󽯶󌜷򦫊񑺤򩅓򣯺򏑀|\u0005򚹶", - "name": "󸘗\u0019\u001f@&\u00018Q򟵄{񬙪񫻣)RIF!􃠛", - "ticker": "\u0011*yG", - "description": "fB[󳜲񀫴zE\r\u000fs\u0002\u001eW\"Ag>65񀒚ys\u001bY|Qj1\n/&/򢏿e\u0017𥩡񠩷:}L\u001bA\u0013򇌺󬖧\u0011񋘏T󻺽󭃊8򼑠m/S\u0012{|y&rS򟭠8#゗I{\u0001p񣘑򘏪hM6Z\u001dn\n\u00140\u001b𧲨\u000b-\u0008q􉟰 򞊮󑾤C䖛k_T=w򸛕񆠹\u001b󖏙B񖭀}I\u0019\u000b􂮔\u0003^[z\n񼕦e{􅧂󐈘\u001a񜏢vQ󧉯pf\u0000\u0005P󁛞4un1f\u0000񳠊񉼀u󇴔\u0004b\n;⑧", + "name": "򼀼TN򀮕伊񛷲\u001d򺰻v򙣆T@", + "ticker": "g}𧨕k\u0008", + "delisted": false, + "description": "Q󊱙򍝭\t򙥗W,\u000e\u000b6dVm3\tnZU2\u000c񿙃b\u0005*d󶧲񂞛\u001b\u0019:a\u001bJ򣧺󃬑?񏈽񟦲TZL^\u0016􅒓qkhl󜱢򚁀TK-\u0010X\u0015\u001a󸫭\u0010y񵨇\u000f+O񪿗U8,򋘯DN9W(ℐ*(!憳e\u0015󘮃\u0012,7\u001bb&{񞜤v,)\u001ag\u0010\u0014m=񡘽1;\u0015M򦽇~򸘲x𮱖\u0017󹁼)F󎕀9By+w򄱏AV$>\t\u001d\u0019Eh񼱉𫖔@e\u0019p)m.򨿬\u001cc\t򳅀K =\u0008\u0011>㙢򾖬\u001dSꆈ󻢪񇲈\u000bj񝋥𯞎\n𜍏\u0015\u001d0񊻜򔶏Vr8>y\u0003>󞢎E\u0003\u000fo/3@􁀆\u0019\u000b" }, - "id": "pool10pgzt8leq84y6ksmdzqg6v0gsn9rafj4ajq8vsfvpdv9cmcaedq" + "id": "pool1ddjrnstmh5rmaj7kscegyymus26xp0jw9nh7wvh4a3qdj0nts8p" }, { "metrics": { - "saturation": 4.950350959513691, + "saturation": 4.588159475695788, "non_myopic_member_rewards": { - "quantity": 966933924713, + "quantity": 992050800679, "unit": "lovelace" }, "produced_blocks": { - "quantity": 8738216, + "quantity": 18995134, "unit": "block" }, "relative_stake": { - "quantity": 81.92, + "quantity": 13.14, "unit": "percent" } }, - "retirement": { - "epoch_start_time": "1869-09-21T07:18:52.720088847923Z", - "epoch_number": 31526 - }, "cost": { - "quantity": 230, + "quantity": 193, "unit": "lovelace" }, "margin": { - "quantity": 57.93, + "quantity": 35.75, "unit": "percent" }, "pledge": { - "quantity": 65, + "quantity": 43, "unit": "lovelace" }, "metadata": { - "homepage": "4񑉪2t?c\u000c'\"\u001c\u0015񨎴\u0013U[&i\"&E𵬺򐱺-mV-񥰶jH+󶒗0󉧢R\u0015`򢘩>y򑰓\")h\u001b񶧻\u0007d􁗱T\u00104^$\u0010\u001b<", - "name": "󔖿𹡴02", - "ticker": "\u0016x񋎰", - "description": "*񾞜⮚4\u0012U򋽈\u0015哊\u0011􅇎\u0015R:g\u0006+scB򅽻򍫈-\u0000~\u000e$𼼌񝀜,R0?2VwDSvh\u001e󡂖qO8C+H!󟠪'\"󠔑0bc.U񛆣𙠇Jp򃞫/!򱼟UD0󋒵F]l\u001b+\u001aKQ\n\u0007%C 򆪭_%Jf\u0000\u0013F8)\u0019nhK!򖉫S𾿆J*ldA􍾼a󨘯'_\u0008𽠫f񋺧oE򬷨󀡢*6\u0015<)E\u000b\u001es]^y񤚺\u001cp\u0013𥸿-Iy/" + "homepage": "S򹹋\u000e𠄊+\u001dEV(^􁧭pB}N񏎆{򄀢󵁾$𗑰򡜏2\u0018k𒃓\u0003騛1N\t\\dp87񬞴\u0008V:񄿥󞿯񳊆\u0000񪭣\u0011sA󒷝0\u0014\u0014K#h\u0010񤐽z𲿌DigrC񖁛\u0011V\t򺳤t8X)B󇘭Pz|􄓇񘢚\rs򉕬PLUr\u0014󞢽񝤓h򭻦𷙄73S", + "name": "T\u0002@\u0011", + "ticker": "V=oU񢜴", + "delisted": false, + "description": "\u0001\u0014\u00134@󂓠󨃌򮾅/_\u0014󀰜[4&\u001dv򤮏#򘗏j\u001f􈛸@\"`uK-@\u0019Z𘁭򿼌O礳\u001d\u0015@$󊆫򷜼om񼘆\r\rB񙘄]F񖙌7a\u001a򦃯񩽗2򃬳ygR6Sx7C/\u000c-q\u001e\u001aw󔊻🆾0CW\rAJ򹇭s\u0000\u0005vV秠T󓑞󤺣>\u0017&􏀕\u001f\u000csCYV가#2\u0012>𻺘񆫚Bu}p\u0015{CRIu鰷$h󼾱7l򢾶3uZ" }, - "id": "pool1fekspzgvpqfs3u6kklujpa7mjm0f5h62f4dqrt87g6xqqn57u8f" + "id": "pool13wlmcctalzdxynxjwfcwz0yv40lw5h2mlujxcezzdpukydd6cy3" }, { "metrics": { - "saturation": 1.2142612304199552, + "saturation": 1.3607388156541385, "non_myopic_member_rewards": { - "quantity": 508608277141, + "quantity": 860889854897, "unit": "lovelace" }, "produced_blocks": { - "quantity": 4990020, + "quantity": 3219562, "unit": "block" }, "relative_stake": { - "quantity": 20.09, + "quantity": 68.67, "unit": "percent" } }, "retirement": { - "epoch_start_time": "1891-12-19T02:56:44.132395228958Z", - "epoch_number": 29024 + "epoch_start_time": "1906-08-25T04:25:40.982111437968Z", + "epoch_number": 27528 }, "cost": { - "quantity": 238, + "quantity": 123, "unit": "lovelace" }, "margin": { - "quantity": 39.16, + "quantity": 60.89, "unit": "percent" }, "pledge": { - "quantity": 141, + "quantity": 239, "unit": "lovelace" }, "metadata": { - "homepage": "KP󢘢q򬏠󞳇򆀓\u0013\u000b𦷣񡛴935> 'oZ\u001dLb򱾟N\u001b𼒔tN/r󔕗𛅯\u0004* ", - "name": "\u0011~茭v𥅸򴛻:Z,zfAY\u00157\u001dR1kd\u0007\u000brn󱕋򦤒󶫪lk", - "ticker": "}\u0019B𴅞", - "description": "/\u0015xm󕄖I𧧖hz\u000c\u0012U\u0004\u0015󕆾^&r0\u001a򈜰pC\u000ehP򒉯L\u0000𪺇\n𾚆𷺍\u0017񦉈K焇wp" + "homepage": "\\񍟣29񍉞󾏧\u0018񡛅\u000cQ[\u0008\"d\\\u000e񹸾(]\u0019n􉽬񣷙*i+:\u0014~|(Kh\u001c󓬟8P𾧴{~\u001e𹻥󶰴򧵙9M􁤴'\u0002P򁒴𑽅Uk\u0012𞤣\u0003l\u001d<\u0002釸\u000f󟌸\u001d󨁇2;\u0014&\u0012񀗫󩲅󦗈x", + "name": ".~󈆙", + "ticker": "𣹠5x\u001cg", + "delisted": false, + "description": "Q򟛗񹣎~\nW\u0005y8񝋝\u0014~񭤯񻒾q\u0014bF>򻡾𕡾=\u001d\u0014x\u000e\u0011T񳈴\u0019(󁙁4򘤠_󨅳3{bQ\u001b񭷺G򟩌\u001f" + "homepage": "/򨑵8򙼰I򋮾Y(񥅊\u0014\u0003l/\"t\"F", + "name": "Y𛐸H7nr\u0003\u0003𔸋\u000ba\u001aX;{4s𓮃\u001f񅮁9򛭤\u000foI񁱎\u001evFF\u001c󿇮L@", + "ticker": "^-K4G", + "delisted": false, + "description": "X\r:r|#\u001a|񿾍󑵣9~􌨞mT\u0004%LAAgJ駘𙺪znC\u001atk󮔠Ae\u0010s/񺉧@󙤁n򘐊\u0016lM񜖎󟘤 񪖲򽋍\u0015ရ?\u001e\"󾩢n𵺒`3\u001e&rJxll򰐰?B+g󥨒\u0013=!󒥤RHS-Yt\u0003td񁭚򨫮z\u0007򛡆" - }, - "id": "pool1xeknyngmmezr042e6g8xyy9w05r6ecstjxlt8j7ts3p77slrate" + "id": "pool14aledff8tq62nxezf5ez3lpnpz463wch7ze7z59yqjr9v06geg6" } ] } \ No newline at end of file diff --git a/lib/core/test/data/Cardano/Wallet/Api/ApiTStakePoolMetadata.json b/lib/core/test/data/Cardano/Wallet/Api/ApiTStakePoolMetadata.json index 054a0aee3f9..4ca3116eb03 100644 --- a/lib/core/test/data/Cardano/Wallet/Api/ApiTStakePoolMetadata.json +++ b/lib/core/test/data/Cardano/Wallet/Api/ApiTStakePoolMetadata.json @@ -1,64 +1,72 @@ { - "seed": 5786763469590622506, + "seed": 6312921918417622385, "samples": [ { - "homepage": "J!n.q4\u0004(񾶹g򯋥\n򏚐񞪌e\r3񙢠r34s򛴩\u000c򾋃\u001e򯧎񬌏\u0017\t𘙉vl\u001c𓺺󶾛N|\u0006򱝝\u0012\u0013񂙢v_}pXp򡻹)ᩑ\u001e󋐑v\u0000j\u0018e;W\"KYu򩺮'", - "name": ")IRX𱁑󔈷isE󕷍}*#\u001dAힱ`", - "ticker": "|󟁈,\u001a󝔌", - "description": "B񭯣\u001c𘚁񶲡𛍂񵓏!񚗟񬅇𝘃\u0013qN=W}8\t+0F\u0012􌗰𘳿侕򦬳񨠌c񱱁\u0015_󒢷𔩢vPM񒤢G򉳝󬹶\u001b𔼡Hi񦇬e9\u001cL񲋜'\u001b0i88}|QeF󱘣%򑒪𙖇fb\u0004򅬭_4\u000f>;𫣂2-|󋇡\u000c^\u0004@r6}\u001a􂎂L\u0008k\u0019@3auH󕟊OW񎇖[􍰅!񚳺\u0004Qy9󦋈񟔚򦫷H4!K򲰫򙯊u3\u0019X_l􎆠w0􂂩轐󾗈\n񛆛􇔔^\u0003򨢵%<>6\u000b\u001dh󫩨#\u001fI\"r1&󷚾$O񸿢u:\u0000掚\u0002񽊥/Q~𮙁񛛩򀤲~񌿅\u0008K[\u0015\u0016" + "homepage": "\u0010C쀑/\u0019𯭃䭄򺰨󢽸󝶺𿽇𓀗E𹽴\u001c񰐱\u0011򥬛F\u001b<\u000b\u0007p>󠯗\r\u001d򮸂󖓣\\r\u0008,[\u0015\u0000\r\u001fu&\u0005,']\u0001", + "name": ":񿊐񆌫񙘃􊭭K񃟘𶁶)", + "ticker": "o\u000c..𰯥", + "delisted": false }, { - "homepage": "\u0019\u001c󊠢/Mv􅽹\u000bmr\rE[􈲵\u0008ief99󃣹\u001c\t2\u0016!?:\u001f{xU>_Gf槓򒧢6&u8񽢺E\u00088h񐵚9Ck=QYMG鬠Z+񑛺󷨉oTUc󞁃?򇧐󭬓r12v'󫯖M􄀃K/H6z񟤿\\n\u0013ge򿏔", - "name": "k\u001cyT񡹭񚹰_򓢄2\u0017Ym񵸇5H`\\AuT", - "ticker": "󹚜񭐱\u0014\u0017\u0016", - "description": "l\u0018FJ\u000b񖌫\u001c򇸅)򰁭&e&\u0010\u0016iL퇌壱3+\",\u001a'񺈶#9𯔍NWsBe`\t\u0003󁄩r" + "homepage": "\u0010&󰶅񕩱lh\u0016=\n󻢂􆒍\u0000\u001f\u000fP_𴮐YZ[z;𝐚,L\u0011n?򡰲\u001f󌱭:Vcf򵵶\u0011\u0010\u000b0pI󫐹O\u0001-\u0013m\u000e\r#G􄁐", + "name": "b4󕊁lIZ񀣢E", + "ticker": "I(Z", + "delisted": false, + "description": "񚝚.2=𙮨򛙨W\u0017C􎝿O" }, { - "homepage": "y\r\\:񶶣N\u000cyog\"񈺛+07zOd\u0008eN\u000b*e}8\u000eS򪈜N򣥌򅁂󮯐\u0013$\u0010\u000eXO\u0001򦿵Br_F\r𲝮\u0007#`󁞜\u001d\u0006󉹦\u0016򬧏z򣭮\u001b Cw\u0013Oꪜ\u000b`+񴘢f9f", - "name": "<\u0019?MD\u000bE", - "ticker": "󈬅4d", - "description": "!z^a񧁆\u0001R񥖿\u0000𾴽\u0011G\u0005􏺎\u0005-𱟿񶈚󓰓򭭚\u0018f2&򮰞?򯲂𜣹\u0014𓆇4bV.6򩹦SP;\u0004s𵟲, ?4󪆪򃦥i󚻺\r]󻿔g𠘒𷊰\u0010n􎜙𪏏i񄘷󽭦 \u000c\u001dd\u0001󼛴\u000frjW\u0018>\u0004𙢻\u001c(rjYyPYE~񸉊m𘙉H𼤔\u0014['28\u001c񞽵𿊵񤉰Ik&_𣊝\u000c𣵸\r\u000c񟏸𞡦񅜛񧭑IJ$񲽇U򽹀V򴳸򨘄L+𝦬3\u001a炇\u0017\\gH\u001dky?c2}5`I\u0008W񂕊bA𦕞i񀤸\u001bW0\u0012'8\u001a𺴜󼢶\u001bD򻎢I򀷒X񖝧񐠻*^;R\u001f򠊖\u00133Z\u0004V*l\u0003IVL𚨬󁁪?񁂙Ge];୷\u0000\"hd\u0008[񓊤􋢌4X]𕍨4YLf󜃳<#&\t\u00075򌇷\u0016\u00164H\u0017\u0005AxjwdH_𹠴𺝋\u0015򦍌P1h󏁽+W\rQ" + "homepage": "h򋧲/!U@d+!\u00152𔤲[T>\u00119񅄟u৓\u000fRN\u0011mU\u0011򂵄YZO\u001f𵨣ᗡ󖗝\u000fW󙘵^", + "name": "򸫖\u0007@zR8W,n@t", + "ticker": "񟳷\td3r", + "delisted": false }, { - "homepage": "\u001aঃTd\u0005󺟛󱜷񐅭򘁖򗢶󊴽PZ[", - "name": "󠐷Mh@𸏝{4\u001a%\u001bi\u001c񓁙", - "ticker": "𳀟񶗣􂈃" + "homepage": "󃜝\u0008򕥘\u0010!𻡽m򱰮up󯦆0򔁩N򜣅p", + "name": "@P򄢶G&", + "ticker": "@xY\u0001}", + "delisted": false, + "description": "Z\u001f\r1\u001f\u000e\u0019d9CfL\u000c\u001b\u001b~\u0015f\u0005p~J\u000f\u001d󨥞}\u0019s򡳁|mj𿱒򲺸񰿦9󍗃\u0010񠛔_*|񬛾Cv,B\u0001ඌ𵌡PgjxDOR,U򍉅\u0017\u001c倻񷓂J\u001eh\u001a0wXJGMI\t\"Fg򗓈-\t%rKA򚑂񉲩7O <}Sq𸓇'5T󰲒F8a)\u0017D\u0008𨣘O񰨽E𐷨;\u001579󩈂m\u0002򆬳|2\u0005Dq𥩱U󋬢񢬝󡞿h񗯂󔻇T󲋻>N򳶍Tc\u0015C񇞂BG򱽌Q" }, { - "homepage": "6󁰀#b𞉂<\u000c򵠴\u000cd-𭙹󺆾󏳾m)Z𸪲Y󑌿2\u0000񝘏m򊼔򷾜󁺔\u0018c\u0007\u0018i􎝳\u001f򂵲.򣨕/4\u0004\u0005.M\u0007򍞯RgSm󾿷!\u0019\u000b𗖁\u0005\u001c񍀱R񁻫%𼦸񍧙n+򐸛mQ>񕹫\u001cq", - "name": "\u0012N*H+\u00166D󬭦o=\u0012_𠘏𫘼𝺋R򅳯󠐆V󤿝\u000b6k=^񲵠RO*<\r'񭵷3P5hkH򺌂c򆾓\u001b\u001d*l𫏜", - "ticker": "[oi", - "description": "9\r])a\t𠓏m\u0016 Z\u0002hY36jo*+\u001b\nY8I\u0015V\u0019𦔘V\u0014y>񕝤슚I|u\u001dU<󓕋\u001a񿙜񞨵~>$򓸃&\u0001\u001dke🡥E 񝄢񕸑xu𧱙`򤺞\u0013G\u000ey򽌞F\u0017_8>\u001e:x􇹤,\u000ch\tG󣆀򈪄yI󵡝񈙻\u000e^𑄩/򜌨\u000c%\u0019}\u000bN\u000b&\u0010_N򛙝\u00065C󢏬J&𨦓\u000bg{\"0k􇳒򈆛P{\u0000\u0017\u001b򙒧󭗿I\u0007@􁟅\u0018\r\u00028\u0008񘍜QiL>+/w𷜹𭩗n񋳡s􂂲OAo\u0018Q񱶒\u0017󱼷\u0002\\63|]񙨻w􂰗EDA,\u0008Ah;\u001f𪯲\u0007\u001c\u0015考&\u0000򇏞0+~𓂡򠔰E@\u0012_\r򡝺o.t:\n*􇯢kN#D\u0010򽬙闍\u0018򿢥򪴯𒓳0\tY\u001d\n\u000f?n𛿍\\t鋯񼐵6򍋤𥧥U󇜮\u0003v=" + "homepage": ";\u001bb񼶛U^^8-/3_񊕧󷉜N򋟒xjoMK\\F3\u0006\"\u0015rIwr󆅗\u000fH{#\u0015v\\q񍊱𺺈d`.]h6󽵙u5\u0006\"p%n󉄎+򙴃+U\u0004T", + "name": "2𲂈hd\u0000Z-􆌰~\u0016V{𖅨pᄣcH򴱺%a\u0014\u0004N\"P󮧦󵗚\u001f~+P򌸿", + "ticker": "(\u0018V\u001e򴩔", + "delisted": false, + "description": "\u0002SN𠧩𐝹\u0016\u001cZK𓴦\u0004-TE񹏹\u00123~\u0005&\nNBhA\u0012#󦞖X\u001b\u0007q󪶡5󯧝\u0011\u0018㑒vy\u0016􎝅\u001d\u0011\u0011񩖁􌢴񁜝񄢶z'Ae󁰱򆁒񿏺򤚢}5)𗚬򻧷(𐿦\u0010󖟆\u000f\\򮠮F*" }, { - "homepage": "v򅏒.)+񸵼7񻏞d:😹?0:", - "name": "TW(-\u0000G󗺂^\u000e.t8E𤨫-򆃳n&aF\u0011\u000b󫐎dT򟝩\u0016@󗊁񰼲f", - "ticker": "p\u0000T9V", - "description": "𨣹y𹣟󚾾񋇰񭴶tQJ񐝈񟫹%g'O򿭀򥰟3<\u0000R/񎕊8b@\\\rU򣹆T񙌂=m\u0019\u001aC{G񦫅\u0007󮮍󍗀򲎏U𕺩v󄸽C񚂉1)󫃞5&H򪙯}𿼙*w\"@q\u0017u\u0001¹\u001485\u0017-􆽫|d򫢪=C\n^eH𸷀", + "name": "󕏣󇽭l`P𖀅񱉳\\m󠟮>9rfB8𗕣lXe|4\u0000k`g񪧠򨚉oIrH{LF\u001d񿮧𕝂𻰂", + "ticker": "\u0010q/", + "delisted": false, + "description": "\u001d\u0006G\u0016bH񂨎𴤭PW\u0007񉐛WM\u0000Hm&_񝌑󀰑>$2\u00102AW\u000bKl񡭹𿈡jY\u001a|f.v󿳜M򹐎neq1ps\r\u0016󆻎񘭀a\u001c񢓙U}R񆆳󌜜\u0004Kuf;i\u00182\u00189^\u0000+E{.>gLu򍂛\"af\u001e\u001bꍙ󅨷V1=:󧿰.F𤆢D\u00185i􍔞y󬆁wG񒡀J>𚾐󈵝\t'4K!\u00051z\u0018C/I󡢂A\u0019jCQ'$𘊱2𜕦*T\u0006񩦆\n񛻹)+񽆱*f\u000e󶡫󡺕V󿆐\u001dfo󴺭\t򹐨񰂪" }, { - "homepage": "n\u0000\u0000𝶬\u0011򦚉\u0017g", - "name": "񠲓\u0011S\u0001񧜁򛸬S9w\u000eV\u0018u", - "ticker": "󛭨򨣎D", - "description": "񞴘\u000b\u0008^:𼈞򙊏Fn򠴥z񧛵jiz򠠅7KU󅃄\u000eh\u0011~,\u0010\u0006VWf]񝃸`񣭛yHvQt\u0003󚒮+j\u001e򳟗5\u0000?􎅇o\u0004=S嵔.󻕨󭕸uA>񱱳|󧄏\u0013󼱉.<񎣰\u0014\u0005|?O򶰉qu򰗮?󣹭88𳭜!ah\u000c\u0004m𾯙\"𾟏>󢸜󳣉\u0006𞼫\u0004zJu򹔏񴉆n\u0014\u0019􎬗򱂭>\u0006򁸗x]aSO\u001a򻙌\u0001U~O\u001e\u0018,7*shb\u001e\u00018\r%-3󝢭X\u001cA\u001d|\u0017o򇇥𢺴<\u0019&fPB 󝢋m\u0011\u0000t g+/\u0010*w󹗔\u0008(7R\u0018򀰤򨉽:\u0016󨰺􈢁󰦷e\u001dd&\u0003񁅰P\u001agWP1𶯦rv蜧|A𑲑\nE]\tM\u0006AM!" + "homepage": "Vk\nY𴋑E󾊙~E\u0015\u001f~oi\u0016>%+f񫩆Z.򆻙ZBT񗖢F;\u001fq}𙎿\u0000󆭩aX󮄯W𿕓$?\u001c\u000b񋡰B񋥕\u001dOX\u001c򕼪U򄃷$Y򂆓yIA;9]#4R+\u0018󳟾򭢞򶱣\u000b2X\u0002}\u0018%򑾋򠞅)S\u001e=󡆅K", + "name": "o2Uh\u0005DpD\u0018C\rW򊛬Po𻨦\u001eZ\u001c\u0000\u001d!I\u0013RX\u0008 KF", + "ticker": "d\rtfR", + "delisted": false, + "description": "\r\u0011b𜲿*񤆄\u000e\u0015zDP񆏡\u0001,csx񐯛\"'\u0013\u0016󈈃mC񞫞~\u000f\\򘗥󰱉L𥆳񳿌\"H]󃙊:J󩡶🳖-p\u0006(\u0017)H$;Ru񭈦󨼸)!򔦚e񹅗恐󼘔򽒈\u0004i\"m񗲘򩃒l_񃦲W9w󈺮c𷦨f+􁻷񨜊j󴻻/󑩻򯡏;󩮩!\u0005򄆣\"\u0013򼴝[gT\u0012]R1B\u0017Y\u0012J(\u0008A /\u000f󰦬𩛃󿓇A?wz򪻑1?h\u0014X" }, { - "homepage": "󒆕Q +v򳺮T\u0018 \u000f{=9UUE򉐃p20\\\u000c", - "name": "򾦘\u00125\nbIU\u0017>3󤝏", - "ticker": "+P񜷟", - "description": "x2\u0001󫿋𫥹򼑨0Z8cw 7^\n$Z;)u򂀶\u0004ohM򎽫󦶻Ȉ󾫸O);tf򪡅Fp󪧅`񍦯P󜪠񒪍岈􏏚w", + "name": "񠮓8\u0000'pcq|󵸥)Y,5\u0010񦝌\u0013pce\u0019𵸣򱝋\"\u000e\u0011%dt\tq􇮹)|", + "ticker": "b򞟀_5\u0004", + "delisted": false }, { - "homepage": "\u000c򎥡\u001b8F%\u0017󰕱%3l[\u0005TH\u001e^\u0011\n\u0000D2w\u0014>|j\u0002-\u000cf", - "name": "!\u0014=D󣯦JQ\u00176#8F\tSu$񤡉R\\^,s\u0007\n𯗝.`|򖴫{\u0000&򷚡@j2", - "ticker": "P\u0016g", - "description": "󿠗\u000f+򖱁HgJ𱜴򏸟)󫷺\u0017󰓔\u0016<𨓪i\\򹜑\u0013).󥻙t^t]\u001c+\u000e{A\u0003f]L𱨌\"{=\\&}vH\t\u001a\u0015-,򌴦\u0010򫪱7񐵾!-񃟶 n󋛖Xp\u001b򓛡\u0003#_B𗁟뼷򀆛񆫚\u0018V򱎗H]G\u0006HY\u0005\u001ar򣑫+a򳸌L󨞣\u0005\u0015\u001e\u0004􋼤1U 7u2󦟦n񴖝򚫕k\u0008s󞎌𫷟\\&K@\u001e\u00152Yt d򌿥=+a&%𐨪񕀑E؝󲎸򾢽E\n򸛭\u000e\u0019S\u001c}05j\u0001\u0019󇛉򒰖U󟲺\u0000sck\t󈾋v_򣕪af\u0019\u000e\u0001[p\u0011/\u0003󅡭|m|\u001e򍤦g$񡪼\rs􁘈󵨒XS򔩜:v\u0000j򸑹\u0007I,Zt\u0007G0h9\r\u0001\u001f,#󪱓0Oj\u0001󞉓s񇲼󣟏񿢓󏩷\"*񄆥^󈔠瀀򬂍򑮢kE}\u000b\u0016+1󓟼@\u000e񩺩ZGu\u000b3\u000b" + "homepage": "\u0018HXmh~hU)j\u0008𶕏𶁧񾠼X󶥝4G4jq񔫮XIC@$tj:+wu\u0004QL_k\u0006\u0012?s?\u0013Rr񲵎}<󂅄obt󜖡*f6\u001b(.e^w򴗿c\u0011t\u0004y\u0005\u0010򇲫񸼝䔈\u0014󱔤\u000c3\u000b\u001d\u0013@xք\u0004e\u001d=\u00000", + "name": "񎖋7d󃼧C􄲖K+F", + "ticker": "D󇩇9h", + "delisted": false, + "description": "t\u001d\u0018\u001e\u0005P]򇱒񚹞\u0003򦷼\u0018\u0002\u0007-\u0012\u000f񞚖|򚘫NeeK 􇨏#zh=K^\u0011/\"\u0015񹞕򶨶Ux-5_\u0003u\u001fl伦!򈛮󅲐i9T񧼤򨙆򡅝l񶬋R\u0019H󧓝R[󭒦\u0017\u001fQ⒏) \u00058o򰯓\u0003?!󾹌i\u0002fUr򍑞\u0016\u001e򓦰򐣠🜆󫢱`\u0014k/򺫠;g𰒢B2\t^*󽽑bIXHN𢺱\rjS\u0004𬾽񆥱󋔩;򷈖[󬞼6,񊃊x42\u0007𳫙􉸲i|񈬁2/󚐄>󻰔ig\u0011\u0014e񯧰𲱜񢔟c󛠑|2P#\u0001tZ\\9K \"IS{{PDMR\u001c`򬒥𹪚\u000bnEy\u0015\u0011\u001c8󔌈B󴫦\u0017U\u0010Fe\u001f򚁤Q: R6lO!g\"񠾙媅g􊘏\u0006\u000b\u001c" }, { - "homepage": "󪤀\n\u001aC\t򒕒!򀻗񺣧\u001f򃾺P򌦂񠷾X񴄭", - "name": "򗣀󂴴𩞌m", - "ticker": "𕩌rC㋄", - "description": "K}>\u001b\u000f򩉒#\u0015Xq񣁚󞒒kp\u0001~hM󔃗\u001b0\u0013\u00169\u000e󸓠󱯟Y4\u0015\u0016\u001a\u000f\u0017" + "homepage": "\u001f\u001c\u0011򆁔u\"he^\u000fP𳾵'%񼥶5\u0019*l3񐭧j򹅸򶟓<:I\u0006uf\u001aZ>𶦰󬮅O󒃵𳫊񖧌\u001b\n\u001e󋴿k򆑧l!\"]S򣾎wn\u001e@\"", + "name": "򷾈W^𪡳g砠􀊧O\u0012񥒖4V𾺯", + "ticker": "X5\u0014", + "delisted": false, + "description": "Q󚊳\\U^m\u000em#=QZ#%󗳝\u001bavV;𧗀𓞨5\t\n\u0005\u00024 1`򺘹;񂴏\u001d:򋯒WqA񤫶1#𡗳B)y򍞵󕜶E\u001azPO􄚨[\u0003񥡑b\u0018)񬴯\rF4~򏮂𖶧Ce𚙟@𘪣𖪓򖧳6o\u0004O{򵵄vP󪕗KXc񄫮K\u00103>񹛻a⟍񯒹1>񆬒E_m+b\u001d򲓔𤂅~d\u000e򃲈i􁡱\"\u000f\u0012󗋐TU}X$U╵-'񬛌𙘄)%𩨯E\u001f􏸳䒠􄙽DFs\\\u001e򝴣*|򛂎񔌕􌫪\u000c\u001f)\"|%V.8\u0001\u0015\u0013M񱑝\u001ej|򼯨rRe􊂣\u001c/tf[rvwE\u0005>\u0005\u00130W$\\K򊜥򵴷\u00012w\\񸦟\u0001\u0005EU]񑯤Oq\u0011&tTD\u001d#ba\u0014b;/%񉼫DZJ\u0014\u000f񦋚🪅@򿑨\u001d񮈢\u000f6 𱆰\u0015 x\u0013񆓼C/\u0013g" } ] } \ No newline at end of file diff --git a/lib/core/test/unit/Cardano/Wallet/Api/Malformed.hs b/lib/core/test/unit/Cardano/Wallet/Api/Malformed.hs index 7e179700035..82036f475b3 100644 --- a/lib/core/test/unit/Cardano/Wallet/Api/Malformed.hs +++ b/lib/core/test/unit/Cardano/Wallet/Api/Malformed.hs @@ -51,6 +51,7 @@ import Prelude import Cardano.Wallet.Api.Types ( ApiAddressInspectData + , ApiMaintenanceAction , ApiPoolId , ApiPostRandomAddressData , ApiPutAddressesData @@ -1032,6 +1033,15 @@ instance Malformed (BodyParam SettingsPutData) where ) ] +instance Malformed (BodyParam ApiMaintenanceAction) where + malformed = first (BodyParam . Aeson.encode) <$> + [ ( [aesonQQ| + { "maintenance_action": "unknown_action" + }|] + , "Error in $['maintenance_action']: parsing Cardano.Wallet.Api.Types.MaintenanceAction failed, expected one of the tags ['gc_stake_pools'], but found tag 'unknown_action'" + ) + ] + -- -- Class instances (Header) -- diff --git a/lib/core/test/unit/Cardano/Wallet/Api/TypesSpec.hs b/lib/core/test/unit/Cardano/Wallet/Api/TypesSpec.hs index 1311feb62da..029b1206f33 100644 --- a/lib/core/test/unit/Cardano/Wallet/Api/TypesSpec.hs +++ b/lib/core/test/unit/Cardano/Wallet/Api/TypesSpec.hs @@ -54,6 +54,7 @@ import Cardano.Wallet.Api.Types , ApiEpochInfo (..) , ApiFee (..) , ApiListStakePools (..) + , ApiMaintenanceAction (..) , ApiMnemonicT (..) , ApiNetworkClock (..) , ApiNetworkInformation (..) @@ -1209,6 +1210,10 @@ instance Arbitrary WalletName where instance Arbitrary ApiWalletPassphraseInfo where arbitrary = ApiWalletPassphraseInfo <$> genUniformTime +instance Arbitrary ApiMaintenanceAction where + arbitrary = genericArbitrary + shrink = genericShrink + instance Arbitrary SyncProgress where arbitrary = genericArbitrary shrink = genericShrink @@ -1343,6 +1348,10 @@ instance Arbitrary (Quantity "percent" Double) where shrink _ = [Quantity 0.0] arbitrary = Quantity <$> choose (0,100) +instance Arbitrary Api.MaintenanceAction where + arbitrary = genericArbitrary + shrink = genericShrink + instance Arbitrary ApiNetworkParameters where arbitrary = genericArbitrary shrink = genericShrink @@ -1586,6 +1595,9 @@ specification = either (error . (msg <>) . show) Prelude.id . Yaml.decodeEither' msg = "Whoops! Failed to parse or find the api specification document: " +instance ToSchema ApiMaintenanceAction where + declareNamedSchema _ = declareSchemaForDefinition "ApiMaintenanceAction" + instance ToSchema (ApiAddress t) where declareNamedSchema _ = declareSchemaForDefinition "ApiAddress" diff --git a/lib/jormungandr/src/Cardano/Wallet/Jormungandr/Api/Server.hs b/lib/jormungandr/src/Cardano/Wallet/Jormungandr/Api/Server.hs index b667a232e81..6e90b2b4f16 100644 --- a/lib/jormungandr/src/Cardano/Wallet/Jormungandr/Api/Server.hs +++ b/lib/jormungandr/src/Cardano/Wallet/Jormungandr/Api/Server.hs @@ -208,6 +208,7 @@ server byron icarus jormungandr spl ntp = (getPoolLifeCycleStatus spl) :<|> quitStakePool jormungandr :<|> delegationFee jormungandr + :<|> (\_ -> throwError err501) byronWallets :: Server ByronWallets byronWallets = diff --git a/lib/shelley/src/Cardano/Wallet/Shelley/Api/Server.hs b/lib/shelley/src/Cardano/Wallet/Shelley/Api/Server.hs index 5646d63c665..b580c89c71e 100644 --- a/lib/shelley/src/Cardano/Wallet/Shelley/Api/Server.hs +++ b/lib/shelley/src/Cardano/Wallet/Shelley/Api/Server.hs @@ -97,10 +97,12 @@ import Cardano.Wallet.Api.Types ( ApiAddressInspect (..) , ApiAddressInspectData (..) , ApiErrorCode (..) + , ApiMaintenanceAction (..) , ApiSelectCoinsAction (..) , ApiSelectCoinsData (..) , ApiStakePool , ApiT (..) + , MaintenanceAction (..) , SettingsPutData (..) , SomeByronWalletPostData (..) ) @@ -237,7 +239,11 @@ server byron icarus shelley spl ntp = :<|> joinStakePool shelley (knownPools spl) (getPoolLifeCycleStatus spl) :<|> quitStakePool shelley :<|> delegationFee shelley + :<|> _poolMaintenance where + _poolMaintenance = \case + (ApiMaintenanceAction GcStakePools) -> + liftIO $ forceMetadataGC spl >> pure NoContent listStakePools_ = \case Just (ApiT stake) -> do currentEpoch <- getCurrentEpoch shelley diff --git a/lib/shelley/src/Cardano/Wallet/Shelley/Pools.hs b/lib/shelley/src/Cardano/Wallet/Shelley/Pools.hs index abf8d436995..09f1e62ce85 100644 --- a/lib/shelley/src/Cardano/Wallet/Shelley/Pools.hs +++ b/lib/shelley/src/Cardano/Wallet/Shelley/Pools.hs @@ -200,6 +200,8 @@ data StakePoolLayer = StakePoolLayer -> Coin -> ExceptT ErrListPools IO (ApiListStakePools Api.ApiStakePool) + , forceMetadataGC :: IO () + , putSettings :: Settings -> IO () , getSettings :: IO Settings @@ -218,6 +220,7 @@ newStakePoolLayer nl db@DBLayer {..} worker = do { getPoolLifeCycleStatus = _getPoolLifeCycleStatus , knownPools = _knownPools , listStakePools = _listPools + , forceMetadataGC = _forceMetadataGC tvTid , putSettings = _putSettings tvTid , getSettings = _getSettings } @@ -236,17 +239,9 @@ newStakePoolLayer nl db@DBLayer {..} worker = do -- metadata sync thread as well to avoid race conditions. {- HLINT ignore "Use const" -} _putSettings :: TVar ThreadId -> Settings -> IO () - _putSettings tvTid settings = do - bracket - killSyncThread - (\_ -> restartSyncThread) - (\_ -> atomically (gcMetadata >> writeSettings)) + _putSettings tvTid settings = + bracketSyncThread tvTid (atomically (gcMetadata >> writeSettings)) where - -- kill syncing thread, so we can apply the settings cleanly - killSyncThread = do - tid <- readTVarIO tvTid - killThread tid - -- clean up metadata table if the new sync settings suggests so gcMetadata = do oldSettings <- readSettings @@ -261,10 +256,7 @@ newStakePoolLayer nl db@DBLayer {..} worker = do writeSettings = putSettings settings - restartSyncThread = do - tid <- worker - STM.atomically $ writeTVar tvTid tid - + _getSettings :: IO Settings _getSettings = liftIO $ atomically readSettings _listPools @@ -279,7 +271,7 @@ newStakePoolLayer nl db@DBLayer {..} worker = do let lsqData = combineLsqData rawLsqData dbData <- liftIO $ readPoolDbData db currentEpoch seed <- liftIO $ atomically readSystemSeed - lastGC <- liftIO $ atomically $ readLastMetadataGC + lastGC <- liftIO $ atomically readLastMetadataGC r <- liftIO $ try $ sortByReward seed . map snd @@ -332,6 +324,28 @@ newStakePoolLayer nl db@DBLayer {..} worker = do rewards = view (#metrics . #nonMyopicMemberRewards) . stakePool (randomWeight, stakePool) = (fst, snd) + _forceMetadataGC :: TVar ThreadId -> IO () + _forceMetadataGC tvTid = + -- We force a GC by resetting last sync time to 0 (start of POSIX + -- time) and have the metadata thread restart. + bracketSyncThread tvTid (atomically (putLastMetadataGC (fromIntegral @Int 0))) + + -- Stop the sync thread, carry out an action, and restart the sync thread. + bracketSyncThread :: TVar ThreadId -> IO a -> IO () + bracketSyncThread tvTid action = + void $ bracket + killSyncThread + (\_ -> restartSyncThread) + (\_ -> action) + where + killSyncThread = do + tid <- readTVarIO tvTid + killThread tid + + restartSyncThread = do + tid <- worker + STM.atomically $ writeTVar tvTid tid + -- -- Data Combination functions -- diff --git a/specifications/api/swagger.yaml b/specifications/api/swagger.yaml index 5aa1262d64d..bed3dab67fb 100644 --- a/specifications/api/swagger.yaml +++ b/specifications/api/swagger.yaml @@ -1162,6 +1162,18 @@ components: type: array items: *certificate + ApiMaintenanceAction: &ApiMaintenanceAction + type: object + required: + - maintenance_action + description: | + The maintenance action to carry out, current values are + - gc_stake_pools -> trigger looking up delisted pools from the remote SMASH server + properties: + maintenance_action: + type: string + enum: ['gc_stake_pools'] + ApiLastGC: &ApiLastGC <<: *date @@ -1187,7 +1199,7 @@ components: required: - pools properties: - lastGC: + last_gc: <<: *ApiLastGC pools: type: array @@ -2190,6 +2202,12 @@ x-responsesListStakePools: &responsesListStakePools - <<: *ApiJormungandrListStakePools title: "jormungandr stake pools" +x-responsesPoolMaintenance: &responsesPoolMaintenance + <<: *responsesErr405 + <<: *responsesErr404 + 204: + description: No Content + x-responsesJoinStakePool: &responsesJoinStakePool <<: *responsesErr400 <<: *responsesErr403 @@ -2556,6 +2574,22 @@ paths: - *parametersIntendedStakeAmount responses: *responsesListStakePools + post: + operationId: poolMaintenance + tags: ["Stake Pools"] + summary: Maintenance actions + description: | + Performs maintenance action on the stake pools, such + as triggering metadata garbage collection. + + Actions may not be instantaneous. + requestBody: + required: true + content: + application/json: + schema: *ApiMaintenanceAction + responses: *responsesPoolMaintenance + /wallets/{walletId}/delegation-fees: get: operationId: getDelegationFee From 1baaf17184a373549ecc81acb0b5448d1c1be977 Mon Sep 17 00:00:00 2001 From: Julian Ospald Date: Sat, 17 Oct 2020 16:27:18 +0200 Subject: [PATCH 7/8] Change DB representation of POSIXTime --- lib/core/src/Cardano/Wallet/DB/Sqlite/Types.hs | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/core/src/Cardano/Wallet/DB/Sqlite/Types.hs b/lib/core/src/Cardano/Wallet/DB/Sqlite/Types.hs index 28b9a570e54..6a0f4205fdb 100644 --- a/lib/core/src/Cardano/Wallet/DB/Sqlite/Types.hs +++ b/lib/core/src/Cardano/Wallet/DB/Sqlite/Types.hs @@ -88,6 +88,8 @@ import Data.Text.Encoding ( decodeUtf8, encodeUtf8 ) import Data.Time.Clock.POSIX ( POSIXTime, posixSecondsToUTCTime, utcTimeToPOSIXSeconds ) +import Data.Time.Format + ( defaultTimeLocale, formatTime, iso8601DateFormat, parseTimeM ) import Data.Word ( Word32, Word64 ) import Data.Word.Odd @@ -665,9 +667,16 @@ instance PersistFieldSql DerivationPrefix where -- Other instance PersistField POSIXTime where - toPersistValue = PersistUTCTime . posixSecondsToUTCTime - fromPersistValue (PersistUTCTime utc) = Right . utcTimeToPOSIXSeconds $ utc - fromPersistValue _ = Left "Could not convert to unknown construtctor POSIX seconds" + toPersistValue = + PersistText + . T.pack + . formatTime defaultTimeLocale (iso8601DateFormat (Just "%H:%M:%S")) + . posixSecondsToUTCTime + fromPersistValue (PersistText time) = + fmap utcTimeToPOSIXSeconds $ + parseTimeM True defaultTimeLocale + (iso8601DateFormat (Just "%H:%M:%S")) (T.unpack time) + fromPersistValue _ = Left "Could not convert to unknown constructor POSIX seconds" instance PersistFieldSql POSIXTime where - sqlType _ = sqlType (Proxy @Word64) + sqlType _ = sqlType (Proxy @Text) From 6327f88a14809a9b9e2f2368931589ab9f02fb9a Mon Sep 17 00:00:00 2001 From: Julian Ospald Date: Sat, 17 Oct 2020 16:27:58 +0200 Subject: [PATCH 8/8] Add DB test for last GC time --- .../src/Cardano/Wallet/DB/Sqlite/Types.hs | 2 +- .../test/unit/Cardano/Pool/DB/Properties.hs | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/core/src/Cardano/Wallet/DB/Sqlite/Types.hs b/lib/core/src/Cardano/Wallet/DB/Sqlite/Types.hs index 6a0f4205fdb..dee5228bd86 100644 --- a/lib/core/src/Cardano/Wallet/DB/Sqlite/Types.hs +++ b/lib/core/src/Cardano/Wallet/DB/Sqlite/Types.hs @@ -673,7 +673,7 @@ instance PersistField POSIXTime where . formatTime defaultTimeLocale (iso8601DateFormat (Just "%H:%M:%S")) . posixSecondsToUTCTime fromPersistValue (PersistText time) = - fmap utcTimeToPOSIXSeconds $ + utcTimeToPOSIXSeconds <$> parseTimeM True defaultTimeLocale (iso8601DateFormat (Just "%H:%M:%S")) (T.unpack time) fromPersistValue _ = Left "Could not convert to unknown constructor POSIX seconds" diff --git a/lib/core/test/unit/Cardano/Pool/DB/Properties.hs b/lib/core/test/unit/Cardano/Pool/DB/Properties.hs index afb1312f380..2d6b82d06cf 100644 --- a/lib/core/test/unit/Cardano/Pool/DB/Properties.hs +++ b/lib/core/test/unit/Cardano/Pool/DB/Properties.hs @@ -6,7 +6,9 @@ {-# LANGUAGE OverloadedLabels #-} {-# LANGUAGE RankNTypes #-} {-# LANGUAGE RecordWildCards #-} +{-# LANGUAGE TypeApplications #-} {-# LANGUAGE TypeFamilies #-} +{-# LANGUAGE TypeSynonymInstances #-} {-# OPTIONS_GHC -fno-warn-orphans #-} module Cardano.Pool.DB.Properties @@ -87,6 +89,8 @@ import Data.Quantity ( Quantity (..) ) import Data.Text.Class ( toText ) +import Data.Time.Clock.POSIX + ( POSIXTime ) import Data.Word ( Word64 ) import Fmt @@ -217,6 +221,8 @@ properties = do (property . prop_putHeaderListHeader) it "modSettings . readSettings == id" (property . prop_modSettingsReadSettings) + it "putLastMetadataGC . readLastMetadataGC == id" + (property . prop_putLastMetadataGCReadLastMetadataGC) {------------------------------------------------------------------------------- Properties @@ -1431,6 +1437,24 @@ prop_modSettingsReadSettings DBLayer{..} settings = do assertWith "Modifying settings and reading afterwards works" (modSettings' == settings) +-- | read . put == pure +prop_putLastMetadataGCReadLastMetadataGC + :: DBLayer IO + -> POSIXTime + -> Property +prop_putLastMetadataGCReadLastMetadataGC DBLayer{..} posixTime = do + monadicIO (setup >> prop) + where + setup = run $ atomically cleanDB + prop = do + defGCTime <- run $ atomically readLastMetadataGC + assertWith "Reading sync time from empty db returns start of unix epoch" + (defGCTime == fromIntegral @Int 0) + run $ atomically $ putLastMetadataGC posixTime + time <- run $ atomically readLastMetadataGC + assertWith "Setting sync time and reading afterwards works" + (time == posixTime) + descSlotsPerPool :: Map PoolId [BlockHeader] -> Expectation descSlotsPerPool pools = do let checkIfDesc slots = @@ -1484,3 +1508,8 @@ testCertificatePublicationTimes = instance Arbitrary BlockHeader where arbitrary = genSlotNo >>= genBlockHeader + +instance Arbitrary POSIXTime where + arbitrary = do + (Positive int) <- arbitrary @(Positive Int) + pure (fromIntegral int)