From 2414fc0dca4ef262e998d7b1576a23003a33395d Mon Sep 17 00:00:00 2001 From: Imod7 Date: Tue, 11 Mar 2025 14:23:47 +0100 Subject: [PATCH] fix: unappliedSlashes call in staking/progress endpoint --- .../PalletsStakingProgressService.spec.ts | 85 ++++++- .../pallets/PalletsStakingProgressService.ts | 7 +- .../stakingProgressUnappliedSlashes.json | 231 ++++++++++++++++++ 3 files changed, 317 insertions(+), 6 deletions(-) create mode 100644 src/services/test-helpers/responses/pallets/stakingProgressUnappliedSlashes.json diff --git a/src/services/pallets/PalletsStakingProgressService.spec.ts b/src/services/pallets/PalletsStakingProgressService.spec.ts index 1c397c2a0..f3035741a 100644 --- a/src/services/pallets/PalletsStakingProgressService.spec.ts +++ b/src/services/pallets/PalletsStakingProgressService.spec.ts @@ -18,7 +18,7 @@ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ import { ApiPromise } from '@polkadot/api'; import { ApiDecoration } from '@polkadot/api/types'; -import { EraIndex, Hash } from '@polkadot/types/interfaces'; +import { Hash } from '@polkadot/types/interfaces'; import { InternalServerError } from 'http-errors'; import { sanitizeNumbers } from '../../sanitize/sanitizeNumbers'; @@ -26,6 +26,7 @@ import { polkadotRegistry } from '../../test-helpers/registries'; import { activeEraAt, blockHash789629, defaultMockApi, erasStartSessionIndexAt } from '../test-helpers/mock'; import { validators789629Hex } from '../test-helpers/mock/data/validators789629Hex'; import palletsStakingProgress789629SResponse from '../test-helpers/responses/pallets/stakingProgress789629.json'; +import UnappliedSlashesResponse from '../test-helpers/responses/pallets/stakingProgressUnappliedSlashes.json'; import { PalletsStakingProgressService } from './PalletsStakingProgressService'; const epochIndexAt = () => Promise.resolve().then(() => polkadotRegistry.createType('u64', 330)); @@ -44,8 +45,9 @@ const validatorsAt = () => const forceEraAt = () => Promise.resolve().then(() => polkadotRegistry.createType('Forcing', 'NotForcing')); -const unappliedSlashesAt = (_activeEra: EraIndex) => - Promise.resolve().then(() => polkadotRegistry.createType('Vec', [])); +const unappliedSlashesEntries = () => { + return Promise.resolve([['5640', []]]); +}; const validatorCountAt = () => Promise.resolve().then(() => polkadotRegistry.createType('u32', 197)); @@ -74,7 +76,9 @@ const mockHistoricApi = { eraElectionStatus: eraElectionStatusAt, erasStartSessionIndex: erasStartSessionIndexAt, forceEra: forceEraAt, - unappliedSlashes: unappliedSlashesAt, + unappliedSlashes: { + entries: unappliedSlashesEntries, + }, validatorCount: validatorCountAt, }, }, @@ -90,6 +94,71 @@ const mockApi = { */ const palletStakingProgressService = new PalletsStakingProgressService(mockApi); +const unappliedSlashes = [ + { + validator: '5CD2Q2EnKaKvjWza3ufMxaXizBTTDgm9kPB3DCZ4VA9j7Ud6', + own: '0', + others: [['5GxDBrTuFgCAN49xrpRFWJiA969R2Ny5NnTa8cSPBh8hWHY9', '6902377436592']], + reporters: [], + payout: '345118871829', + toJSON: function () { + return { + validator: this.validator, + own: this.own, + others: this.others.map(([account, amount]) => ({ account, amount })), + reporters: this.reporters, + payout: this.payout, + }; + }, + }, +]; +const unappliedSlashesEntriesUnappliedSlashes = () => { + return Promise.resolve([['5640', unappliedSlashes]]); +}; + +const mockHistoricApiUnappliedSlashes = { + consts: { + babe: { + epochDuration: polkadotRegistry.createType('u64', 2400), + }, + staking: { + electionLookAhead: polkadotRegistry.createType('BlockNumber'), + sessionsPerEra: polkadotRegistry.createType('SessionIndex', 6), + }, + }, + query: { + babe: { + currentSlot: currentSlotAt, + epochIndex: epochIndexAt, + genesisSlot: genesisSlotAt, + }, + session: { + currentIndex: currentIndexAt, + validators: validatorsAt, + }, + staking: { + activeEra: activeEraAt, + eraElectionStatus: eraElectionStatusAt, + erasStartSessionIndex: erasStartSessionIndexAt, + forceEra: forceEraAt, + unappliedSlashes: { + entries: unappliedSlashesEntriesUnappliedSlashes, + }, + validatorCount: validatorCountAt, + }, + }, +} as unknown as ApiDecoration<'promise'>; + +const mockApiUnappliedSlashes = { + ...defaultMockApi, + at: (_hash: Hash) => mockHistoricApiUnappliedSlashes, +} as unknown as ApiPromise; + +/** + * Mock PalletStakingProgressService instance. + */ +const palletStakingProgressServiceUnappliedSlashes = new PalletsStakingProgressService(mockApiUnappliedSlashes); + describe('PalletStakingProgressService', () => { describe('derivePalletStakingProgress', () => { (mockHistoricApi.query.session.validators as unknown) = validatorsAt; @@ -122,5 +191,13 @@ describe('PalletStakingProgressService', () => { (mockHistoricApi.query.staking.activeEra as any) = activeEraAt; (mockHistoricApi.query.session.validators as unknown) = validatorsAt; }); + + it('works with entries in unappliedSlashes', async () => { + expect( + sanitizeNumbers( + await palletStakingProgressServiceUnappliedSlashes.derivePalletStakingProgress(blockHash789629), + ), + ).toStrictEqual(UnappliedSlashesResponse); + }); }); }); diff --git a/src/services/pallets/PalletsStakingProgressService.ts b/src/services/pallets/PalletsStakingProgressService.ts index d293b5474..98ff405e5 100644 --- a/src/services/pallets/PalletsStakingProgressService.ts +++ b/src/services/pallets/PalletsStakingProgressService.ts @@ -17,6 +17,7 @@ import { ApiPromise } from '@polkadot/api'; import { ApiDecoration } from '@polkadot/api/types'; import { BlockHash, EraIndex } from '@polkadot/types/interfaces'; +import { AnyJson } from '@polkadot/types/types'; import BN from 'bn.js'; import { InternalServerError } from 'http-errors'; import { IPalletStakingProgress } from 'src/types/responses'; @@ -53,7 +54,7 @@ export class PalletsStakingProgressService extends AbstractService { const [eraElectionStatus, { eraLength, eraProgress, sessionLength, sessionProgress, activeEra }] = await Promise.all([eraElectionPromise, this.deriveSessionAndEraProgress(historicApi)]); - const unappliedSlashesAtActiveEra = await historicApi.query.staking.unappliedSlashes(activeEra); + const unappliedSlashesAtActiveEra = await historicApi.query.staking.unappliedSlashes.entries(); const currentBlockNumber = number.toBn(); @@ -67,7 +68,9 @@ export class PalletsStakingProgressService extends AbstractService { activeEra: activeEra.toString(10), forceEra: forceEra.toJSON(), nextSessionEstimate: nextSession.toString(10), - unappliedSlashes: unappliedSlashesAtActiveEra.map((slash) => slash.toJSON()), + unappliedSlashes: unappliedSlashesAtActiveEra.toString() + ? unappliedSlashesAtActiveEra[0][1].map((slash) => slash.toJSON()) + : ([] as AnyJson[]), }; if (forceEra.isForceNone) { diff --git a/src/services/test-helpers/responses/pallets/stakingProgressUnappliedSlashes.json b/src/services/test-helpers/responses/pallets/stakingProgressUnappliedSlashes.json new file mode 100644 index 000000000..a3b08f214 --- /dev/null +++ b/src/services/test-helpers/responses/pallets/stakingProgressUnappliedSlashes.json @@ -0,0 +1,231 @@ +{ + "at": { + "hash": "0x7b713de604a99857f6c25eacc115a4f28d2611a23d9ddff99ab0e4f1c17a8578", + "height": "789629" + }, + "activeEra": "49", + "forceEra": "NotForcing", + "nextSessionEstimate": "791868", + "unappliedSlashes": [ + { + "validator": "5CD2Q2EnKaKvjWza3ufMxaXizBTTDgm9kPB3DCZ4VA9j7Ud6", + "own": "0", + "others": [ + { + + "account": "5GxDBrTuFgCAN49xrpRFWJiA969R2Ny5NnTa8cSPBh8hWHY9", + "amount": "6902377436592" + } + ], + "reporters": [], + "payout": "345118871829" + } + ], + "nextActiveEraEstimate": "803868", + "electionStatus": { + "status": { + "close": null + }, + "toggleEstimate": "801318" + }, + "idealValidatorCount": "197", + "validatorSet": [ + "14TFQiKmAXBqozphG4Njjhbic5Ggqt3eekFN7CAojyCALKEx", + "1REAJ1k691g5Eqqg9gL7vvZCBG7FCCZ8zgQkZWd4va5ESih", + "1zugcaaaDTLhG77kp7PBPpWiaUWTND9oKNcNM94StNStnuw", + "14xKzzU1ZYDnzFj7FgdtDAYSMJNARjDc2gNw4XAFDgr4uXgp", + "16Asi8JS7rqSGwB4qSfT2Q1wAJwoa1czzrnRz8vqYn1yv6r4", + "1Y6WgLRtW6JxmZjSNYsJ9b6JzuF8Kdd7t9kUNiYk9SJXraW", + "13NYekugyqfjAhMTsoZdimKHvBZKfqptDEA5qNKHzZoc1R4W", + "1zugcaj4mBMu7EULN4rafT5UTfBjbvqaoypZyxWa3io6qJS", + "15MUBwP6dyVw5CXF9PjSSv7SdXQuDSwjX86v1kBodCSWVR7c", + "16SpacegeUTft9v3ts27CEC3tJaxgvE4uZeCctThFH3Vb24p", + "12LKeuFyyjC94iXpHftt3UVu567ji5WyKE6MvDBDWVJUuuJJ", + "1nTfEEWASm1x6D16FPLLjPFC42Fb7Q5zLovrxQpPQe6j86s", + "1zugcajKZ8XwjWvC5QZWcrpjfnjZZ9FfxRB9f5Hy6GdXBpZ", + "16VW8qAsdpQkGj3VeennjAYfRfL9kSQed2bLyiFWT7JHwkMh", + "1oAzPf1r4hzF5qZV6gn8mmgNW9oCi9SWok4AABKQGUF5GQ9", + "12rzRcApPzZ3CFrbPWCXzaSuJYtoyiWADvLrRHK4TuCSQi1p", + "1462Rm6ZhAeK3HVhNU4n7t2jACnm2GDgUS4BYmWMGB7Y95VY", + "16DKyH4fggEXeGwCytqM19e9NFGkgR2neZPDJ5ta8BKpPbPK", + "14qurJxuGnRA4RrNPjZ3hHhCuoFcda6CkhV9wLAYhbedPQkH", + "12HTVpN7smNqUwbM5ART7dpoEV1rcY8itrKKMCzGikrJJo6A", + "133oKX5ZFB89mfwd7T6qUsoLGYfoh63UBced6p6byBp64Kke", + "12JuquJFPqUjRPubieEiXZqRjVn16LCMcHnnC7AywGX49ddt", + "14GQkqk2rGYp1cfAPJY9EQWnXk6EHHYjDx44Rx3NAvDpiNau", + "1ufRSF5gx9Q8hrYoj7KwpzQzDNqLJdbKrFwC6okxa5gtBRd", + "12jiWV8yksQuvzEyh98z2BegL7sd8W2NzUcE1Noni9bjKtsg", + "14ShUZUYUR35RBZW6uVVt1zXDxmSQddkeDdXf1JkMA6P721N", + "1124RsfEgJEZvEq4HbtGFcpqoxnqSy79EjNZY9tzPct3AB6o", + "1zugcaebzKgKLebGSQvtxpmPGCZLFoEVu6AfqwD7W5ZKQZt", + "1w7UoHMRC6zg99knXxCAANXuJDQcQTYiPqaR6xENcWjmboH", + "14bARWgpfEiURUS7sGGb54V6mvteRhYWDovcjnFMsLfxRxVV", + "15uBfpvbPWSUaiLjrgT3H389axNwLkduKA3GB88C1fqbWLpz", + "1264tb9azwmsVruJFTQ3PKb8yCPjniBVyUV8ppsmbXz8D2Bw", + "16QFrtU6kDdBjxY8qEKz5EEfuDkHxqG8pix3wSGKQzRcuWHo", + "15thjfpZX1xVcsnfya1oXmbXzau2on5abAc4XXYP62SNwwQQ", + "14dv1F9is1AFxwWVNg4biriUMn8MGeAkNUyeNiyYLJ1sfD3a", + "14LoxdARuKPDR6kW2TqT7WWKJyjk2vDghmtLSanyggSSbv3g", + "121gZtuuG6sq3BZp1UKg8oRLRZvp89SAYSxXypwDJjaSRJR5", + "1Dy7FYbwhvCY2VPDk5DDduxC5zpYHbUz1DvuZ4avZSp7sgD", + "12CNc91f5jHYGTjroUQ97ZhEjXv8MKmuLGGAZjqLY6FhKeex", + "1zugcag7cJVBtVRnFxv5Qftn7xKAnR6YJ9x4x3XLgGgmNnS", + "121kyZuzZxpZf5nFkNKwBVtxz7hEiDtofesZuE3EsRheKpXu", + "1CnnkaqNJWLeny9GMB2D66xQBbZGJBuPYsqdFzj3eGrMQRu", + "16WU9RRW2XjnfzrdMJa2JHmXfeCyWGRayWHNQCT8r16KnrQd", + "13AtGSHJaDZrLHELmK6iKAuaAKHcetrH73N2KEb5M5SX1yDR", + "1zugcabYjgfQdMLC3cAzQ8tJZMo45tMnGpivpAzpxB4CZyK", + "1RG5T6zGY4XovW75mTgpH6Bx7Y6uwwMmPToMCJSdMwdm4EW", + "148YtoGH1R5N1TrXucBw1Pic3TkZgimENXtbjRPFofTH8dBR", + "12C9U6zSSoZ6pgwR2ksFyBLgQH6v7dkqqPCRyHceoP8MJRo2", + "16ALLQukR3zfhAC9Uzb6HPYHvQWH6hcricDnskc4XL8kvePF", + "14gRuVzZSsFLWHCsere3DXbTwon4BK381LFbjWdG3HGvELKv", + "15KRBVtLZM7QRceX61nfwXJgWSHR5YEqDFPLR4susRM7rz2U", + "14UnU9iNpaunKPyPPQc2ckDQP84UPsndbhHURK77iKPrdbKj", + "128xoAmYDMLixg9Dv4sQz3vJnG94Jt1s2hp37PR8CQZMMMfp", + "15oKi7HoBQbwwdQc47k71q4sJJWnu5opn1pqoGx4NAEYZSHs", + "1zugcakrhr3ZR7q7B8WKuaZY5BjZAU43m79xEyhNQwLTFjb", + "12woCF72ik4rYzm8gUagTkEBw4S1zE4rRnAk7SaiHbbV9tDy", + "1LDcQr7LaqTHwfiZMk6iiR4yGTc1fsRsrrLKMuuT8joHMZZ", + "12imvKbAU8s48GesMbA9FMsUm7hSj3hypP393M6BjhVXYTcC", + "14VUZtu4u1xXPnYw2RomYhEKyZD73x1zuN33mAf9imCvuxtA", + "12n8LvW7up8CPckXRFYdLTa1mUGEWviTJNVppznaQ2Uosywt", + "13Awx8ztFrFyf7TbKGPoCW8HqGcgCrn5Fe5qsiwDjyt3ZcJ1", + "12BJ7EMWbr7fGVu2DspPtGbxCCdJUfAMVbJtCm6xPEf4WGiS", + "14TQq9qpindSq25rqa9sbEGtmLWDLvjPWnvEuDrnRYeWUk7i", + "16LqQSto6QrpmKgqXWqc8HvpGvcY5tzo6wqQy97q7qQkKF3E", + "1zugcawsx74AgoC4wz2dMEVFVDNo7rVuTRjZMnfNp9T49po", + "15BQUqtqhmqJPyvvEH5GYyWffXWKuAgoSUHuG1UeNdb8oDNT", + "15cxZZjXGTW9Pubd11yeUjuHoqnVrY9hr5guGmDBEJzAcQUD", + "1dGsgLgFez7gt5WjX2FYzNCJtaCjGG6W9dA42d9cHngDYGg", + "14Q1ZF3JnjMQkxgepZz6cw2ShLuhXqVqpPM3xoyXEeY7WzsC", + "14QBQABMSFBsT3pDTaEQdshq7ZLmhzKiae2weZH45pw5ErYu", + "13wDksmrR71VFGeCHH7xWYvi5dzqtTpneypW3TNxkzqno1ur", + "126psKUiNKidXPNJRkD9TYcZdruX4dymU3vsQ6g9GM4YtEis", + "1ZEN9ctoGTGhPxBZUCZE29W6TyzW2amxmrSdKRwhyobG6pS", + "1zugcabTuN7rs1bFYb33gRemtg67i4Mvp1twW85nQKiwhwQ", + "14oLVPbdykTPoez6r8MJDj4fTb93ZZ2KgoLhsv5dJ7gLXB2y", + "15aPXmYSpCxdVEMAdyoED2ZGLXKMr7naU7DzfB2ayBxn6Ncn", + "13xZwV54UbBm6tZfJMBxkPH9LZLqDbq387w4R2qrii69Dgjg", + "12jm44LqjMrxupiBYVfENUA4TY6Krf49EpbFU5swc2hKNbFh", + "14q4f6CVXWbn2x6si2VayXoZ85augv3nAuHZc1Kc2jeFNnPe", + "12n6PpScSThLK3WLj7wv64ancFWfg6PxGoAsh8scKS5eqsap", + "1HZMocNpdw6VYS1aKyrdu1V7kHpbdCvhL8VKayvzVzqTf6H", + "1KPfsQbEQzetjYbQFPAmJ5XXN8G4Jh3toBQW41H4x7wTczu", + "1WG3jyNqniQMRZGQUc7QD2kVLT8hkRPGMSqAb5XYQM1UDxN", + "13AdjhixkXvnwywK12VzYHzhM78jdFiKXTof1ppAaoysyWQB", + "14rQ1hLYKueojsjvYdsQDjLjqq3nFrniHgpD9a28t9eHofxU", + "1zugca8p9rquswKkHtVKmzR6Z8R9PAmj8MGL1x3HArdAp1J", + "156G1ZiWHeSvLYwgbfNCknU8NfTkGZvEVvcrFs2Dn5Zm6Lus", + "16NCSbjNt8PnpccX3UDAzJTAEuDLScZTLvJFZ5U68hrowQx6", + "12ud6X3HTfWmV6rYZxiFo6f6QEDc1FF74k91vF76AmCDMT4j", + "126CY11joFMpakVSRra9LtNFYWuUzbtA9BcGPpaEvn7R8RkN", + "15GKe1eRMAco1go8NNEvAy2CompMTBdJR3Fpmyk55FoajY7W", + "1FCu68ZwBHNzZLcGa92eHwvR61hk3MpjrhiqN96xF9vWS1Q", + "16fL6kGX64fQ8cCvRu15idGS1VZnLiCZkkDWQer981ux5FRA", + "15KDFYfFjdqhp3MDFEtHuyu9kLpXbT7k1zjx78MphViFdCaU", + "1zugcaaABVRXtyepKmwNR4g5iH2NtTNVBz1McZ81p91uAm8", + "1qFBkRovtyKwWznGdQrA2qvmpndhM513TPoWf6f4oTVReLs", + "16aKQCnTTG4Tym85E1kVmWQd7ypRDxztk6Tx4HAL8AUdwPok", + "13pozTrjJ2KgPVu1spMsbGmqb6wnqf8wkchm64TU5GwZErta", + "12RVY2KvBCyBuKXNEpjqWVFaePhURwubBXqcyXKsEKdhhujG", + "15V6NjwmKkZihe644Tyr8GVLxjEzBAHktf6ZcJCTx7RPCoYS", + "15yyudqwLHT6VcKdEug98wt1rCbyg5TBvr6ikakL4rNVAYXf", + "11uMPbeaEDJhUxzU4ZfWW9VQEsryP9XqFcNRfPdYda6aFWJ", + "12eiHNkmLaaDMGx6z3P4tbiojWK6g1hKku1N6pxmrxbhGuau", + "14FYEWpz2JtBBNp2a2KHLr4d6NB3AJX16Zhr4KjAuoL2kxdR", + "1UXHrSXuGyjZeq1ZaJqXnwxySUk3depQANWBTaZHX833DQc", + "16Sud9b5uUfUi1HXdfwb3drbYBZBLPVvdKuZhwxz2n7HR12M", + "14bUYpiF2oxVpmXDnFxBipSi4m9zYBThMZoLpY8bRQrPQNG1", + "125xj1nYWcVcCM9CnLUydqEmuFwSNTmRybmyK65XWu8RFWK3", + "1cFV5Z8xgsRGE3JwfvK54F9mMTWvunoyRA7YADk2by33xtp", + "1zugcajGg5yDD9TEqKKzGx7iKuGWZMkRbYcyaFnaUaEkwMK", + "14jSaRfswZxfYtFGCmjYLh3wFDEa47HmgaAyc7tU7KadZ8Pg", + "165JpxmCRi28GwbFAjjrD74FTfGdLfHi1LUGMaYLjziDvi4r", + "14ianQU2g46wntbuJxx6u9cM6s8uvLngW1y9xKCcnejBHdTy", + "1zugcagDxgkJtPQ4cMReSwXUbhQPGgtDEmFdHaaoHAhkKhU", + "155VVGqaxRKRruVD9J8urHDsd7XiaToCxiTwQ9QxsxMGtJ9j", + "13ond4N8gejhNeYFxAiCtDymHvgsyQMW3L2kvKMEPtmvi3Cu", + "12GsUt6XbVMHvKt9NZNXBcXFvNCyTUiNhKpVnAjnLBYkZSj1", + "12eDfoz2ufNGpPzDE8KTKbFMZpfPC8w4T11xqC8GrXBpFmsr", + "14xH1XegfvaqXkmPe2mRQQGzPX6HUQ5V11UXcMf3wWKxfLyX", + "16X3K5R15mvc4SmCUKBw9WfW718fRqXdDAKim1S7TxEXCDzQ", + "15qomv8YFTpHrbiJKicP4oXfxRDyG4XEHZH7jdfJScnw2xnV", + "12eA9gosVR5Qa2hnibGZFNYSbxG3pafNeVGGi5eJQueautfX", + "14UieaEqDLiybuL5zHYribzkJGgEN8jJr77j9QdsJeaEUT1F", + "14tcxHSTAiZf7M4vcLfFdGkGJFjfx6zDqds5QVyz2H24hKgG", + "15Xi8RgZwRHhLbLabUx7jYXXHeLkwnijjyD3oaRHYUy6nwWa", + "16GDRhRYxk42paoK6TfHAqWej8PdDDUwdDazjv4bAn4KGNeb", + "16jfCiPqr2ior6TZGnjeTvw573AUTWu6t62wEUuSVvWkeMCb", + "14cxMDpBNLsNEXWyCzked3zghzaYWXwoqGT4h12GqQXdVhmn", + "15UtQRzd9oM2UznsAsfi6rRAh2oo5vjoXgeaqf8rJBKhnTrr", + "13WL2qoxU8JLMGvqbJj74gAzUfdvd2zTJdu7icSvTM4orznB", + "12BnjhUwTsSx7h54dr9qFxWfrT2ZAdetSPozAbUGsztbooR9", + "1hYyu9C3dupTiKGMNcrCRK6HVPS7LYznuofDXsia3N1W6AK", + "1588rgxKKhmVUDrfMHJFrW1yYcABdpQMYYComcemNfn6XVnK", + "12YP2b7L7gcHabZqE7vJMyF9eSZA9W68gnvb8BzTYx4MUxRo", + "1zugcapKRuHy2C1PceJxTvXWiq6FHEDm2xa5XSU7KYP3rJE", + "15ictvkBL2D3aWxyoqh8roJkRC1tdFw3SCLqjyssjuf6yiC9", + "13nxBM9AFRKUmmUkUo8D9eGoZeJJ5XPiJ3eCtMixcHdyXGbk", + "13udQHLoe9iGuAbxhTz8HSTYPqBeTSDfx3cvowik9kJessPG", + "1KmtAWkiVGRdMB9mBV6JVAcRw7ce8tZKY3L5ZH7uTNK4yMx", + "1iWxBav4YCEtYCVNL5dSJcYSTVoyPnzdoVrHFXbSAm3xyye", + "1hJdgnAPSjfuHZFHzcorPnFvekSHihK9jdNPWHXgeuL7zaJ", + "1k3BnDokEUazQLdMrnJyhJtBUHqNLwB7WjhaDBv9QL7sp2Q", + "13YK1sHixcvVPc6v7q1F1p7e66dgoVjcSHnfv4cFJcuKbNke", + "1737bipUqNUHYjUB5HCezyYqto5ZjFiMSXNAX8fWktnD5AS", + "15tchmYRA5e1RQZs6PE2Xfq9oxfv86JQBi2yz372sXjovrd7", + "14Y4s6V1PWrwBLvxW47gcYgZCGTYekmmzvFsK1kiqNH2d84t", + "1653t723BHhC2krGCFKUUNDQb5sUafy5pZvKVwnwo1oMAMi7", + "16KuUsyfxgQovzp8QXgtJH1K5Tmok6M8hgSoHaGbyyTQtQg", + "1zugcacan4nrJ3HPBmiBgEn2XvRMbehqvmzSQXT3uLBDkh3", + "13giQQe5CS4AAjkz1roun8NYUmZAQ2KYp32qTnJHLTcw4VxW", + "13YGdzrdVRD3UxuohNMJhEVaxfQNSjtG5wnRfb9Km1m3UjMZ", + "15oTVrSsB9VU7EwvJ4WJ2QSb7ehfyWirbtVcTFcYd7PhpD1V", + "153uHgQYh3DxFKNKVqRuoftD4pmmAiUvw41p1UgUstLnKLwh", + "157xxgJ9kvYHmySkxAHD9k6jhBoaj8wmwuGaN3pRKStwBNC7", + "12bDHgG8swcakJhz4ADa4uJZThbQKx3rC4cQ6fH7h7EntCVA", + "14yVcx8AtnmaZMCZWVp8AKDgnAYdjeQjAbPL1HbvPxr74Fsf", + "1Wo6qcrh7wxc1kQY5nfixFuCAFuzkgiwau64SmrPXBE7vVf", + "14Y6TZaNAS43At4ovGMULSuGkdE7svmn6zqicWBkSiVd7A4T", + "12p34NhXUkgULSMKJxQAoAyR68tURsVLi7t8uKy4Y8NUiEUh", + "15dPFENfyioL2UGjZbhzsQJ65rrxD6EXFmL4oqGnAuR7prwT", + "1CKUGhSt9nkJ7EcitGvrKN67937XssYvYfdd58KiLKC219S", + "15DuZrrdihPLjMxX3eEYrN3DRc25nEJUFtYk7oHHs6xeh4bZ", + "134Bw4gHcAaHBYx6JVK91b1CeC9yWseVdZqyttpaN5zBHn43", + "129TM37DNpyJqtRYYimSMp8aQZ8QW7Jg3b4qtSrRqjgAChQf", + "14j3azi9gKGx2de7ADL3dkzZXFzTTUy1t3RND21PymHRXRp6", + "13W8fgmJvTZ578FpeQZqVtnPt7YJYV8oF1yXA49LijG7kNaW", + "155Dmh4ySiMA5vWd8vqaEGAkK8RyWBihSMmHrDpj3DjHvX8m", + "1zugcaiwmKdWsfuubmCMBgKKMLSef2TEC3Gfvv5GxLGTKMN", + "16UxGGWGkhRqNWK7jk4XWc3d8HsxZ35pK5ds8SffkZJVN3CA", + "162DmeD1MHpWQhv8NPz7zbUEfCyTfG4Tuqz7P7852KiY2wXz", + "1ymFTWD7p8UbkTP85WKXjvBktYG51utKTUw88CiVHTqo4Hw", + "1341kcAXqyA5ZJHBdPoLeHsDtmqLBZ2qm5Hu7e9tDR9Jv5RM", + "15wPMo7QyDzZJ2kJtXnnjH5swgLnkykQue4quDGMm54Kdpun", + "139FVSnE8hkd1vVJmECkAsKeLyAJrS6kKq5TxTJbDEq1YvRc", + "1342iFZNrBfCP9VWxqt5p39LiHp2ynyq85Ww9K7R8w6BURps", + "13Ei9Xuqwu971JiBAkZx92XgBzX1wpuRnwi5qx76ZueAnGko", + "14zybcYPYQEEmmZUnvCpTnAE6Tm2uRKWG4xPmDfHZn9Yjvrq", + "15zDWoFYi5m2VMb9yXeBa8CozgRDGEXoW14WLXPXPXGj9kvi", + "1Xkz6vJ3PYL67cW2FnVMPWr9unnKCdcwkZ5MKB5AJ9XDawV", + "1A2ATy1FEu5yQ9ZzghPLsRckPQ7XLmq5MJQYcTvGnxGvCho", + "12713bbq45c66CN9AD7yusSXWE1kY91DcMpjVcB2rXqZKy2w", + "143eus3Ki72VUJ9AWYsFEGvkUAjeFw8yMfTaSiuAEq3n8yZc", + "13arSPsihdfLnYzKhwXTJQAjejxTdbXwpMKUeTUq45mvR5K9", + "1F13pZ5nZZsK96UBS8Rjj97wYVtpZvE7SGADiwVrfbkrAWK", + "13QsfwpQGVuyu4uh7JcfbuBACLMZ3cMr7pF4vE1imuBgXcKN", + "11BgR7fH8Sq6CcGcXxZrhyrBM2PUpDmhnGZpxPGvVGXEiPT", + "12GyddkN9Mo7MeEvqcyPSFSX2CNmCECB5ezzdRBvbeujSbqm", + "14AkAFBzukRhAFh1wyko1ZoNWnUyq7bY1XbjeTeCHimCzPU1", + "14VWEJDSWfHyuTSwErEXxFaiCW3i2gf2NPRkZ5igx6rnmqFd", + "135q2jwLPAtsKW6vPLfBqh3Cxmi5Sj7mNL93Cx7AsYD2XRUh", + "14dTZLAwhcBennygERRS5tXnWVAHq3e12LoCoHrQsmDd4X4H", + "154t7yBsmbQQ2zWLqcKEAv1bEC27RyFniys1uhjUVqvoE74M", + "112Ji3ASaU21FGa4ymrjvyZrDv8LbW9tF5NLUksdLdJkjY7E", + "16FUnnZX7h11sxio9wu6DGGqD66z5vXxNLcXuSJFWFAjkaZ5", + "12CN2fCWC43fPXMLia1PCTsvE491KZ1KKzG2ExvACPY6puV9", + "135wKSGZpQcTrhmFju9VeKC68gMBMsCYpSNtDyoqj3BVSZ1R", + "121GBc2ZK53Uoc6JovJjU7zARH8fys5efyUfHKT9vABpqajx" + ] +}