From 2a702a72a6fc89c32b8c1d789f4ea0ee0114c344 Mon Sep 17 00:00:00 2001 From: will pankiewicz Date: Wed, 6 Mar 2024 15:31:13 +0100 Subject: [PATCH 1/5] adjust nominator status updates --- .../templates/kusama-otv-backend.yaml | 2 +- .../templates/polkadot-otv-backend.yaml | 2 +- charts/otv-backend/Chart.yaml | 4 +-- packages/common/package.json | 2 +- packages/common/src/nominator/NominatorTx.ts | 17 +++++++---- packages/common/src/nominator/nominator.ts | 5 +++- packages/common/src/scorekeeper/Round.ts | 28 +++++++++++-------- packages/core/package.json | 2 +- packages/gateway/package.json | 2 +- packages/scorekeeper-status-ui/package.json | 2 +- packages/telemetry/package.json | 2 +- packages/worker/package.json | 2 +- 12 files changed, 43 insertions(+), 27 deletions(-) diff --git a/apps/1kv-backend/templates/kusama-otv-backend.yaml b/apps/1kv-backend/templates/kusama-otv-backend.yaml index 0f7cb4b67..9f9b12367 100644 --- a/apps/1kv-backend/templates/kusama-otv-backend.yaml +++ b/apps/1kv-backend/templates/kusama-otv-backend.yaml @@ -17,7 +17,7 @@ spec: source: repoURL: https://w3f.github.io/helm-charts/ chart: otv-backend - targetRevision: v3.1.3 + targetRevision: v3.1.4 plugin: env: - name: HELM_VALUES diff --git a/apps/1kv-backend/templates/polkadot-otv-backend.yaml b/apps/1kv-backend/templates/polkadot-otv-backend.yaml index d05ecf3e5..98a9a4513 100644 --- a/apps/1kv-backend/templates/polkadot-otv-backend.yaml +++ b/apps/1kv-backend/templates/polkadot-otv-backend.yaml @@ -17,7 +17,7 @@ spec: source: repoURL: https://w3f.github.io/helm-charts/ chart: otv-backend - targetRevision: v3.1.3 + targetRevision: v3.1.4 plugin: env: - name: HELM_VALUES diff --git a/charts/otv-backend/Chart.yaml b/charts/otv-backend/Chart.yaml index 1e78958d7..57caf56b1 100644 --- a/charts/otv-backend/Chart.yaml +++ b/charts/otv-backend/Chart.yaml @@ -1,5 +1,5 @@ description: 1K Validators Backend name: otv-backend -version: v3.1.3 -appVersion: v3.1.3 +version: v3.1.4 +appVersion: v3.1.4 apiVersion: v2 diff --git a/packages/common/package.json b/packages/common/package.json index 5e20af2f2..b6110c393 100644 --- a/packages/common/package.json +++ b/packages/common/package.json @@ -1,6 +1,6 @@ { "name": "@1kv/common", - "version": "3.1.3", + "version": "3.1.4", "description": "Services for running the Thousand Validator Program.", "main": "build/index.js", "types": "build/index.d.ts", diff --git a/packages/common/src/nominator/NominatorTx.ts b/packages/common/src/nominator/NominatorTx.ts index 7a1273c5a..2311f0900 100644 --- a/packages/common/src/nominator/NominatorTx.ts +++ b/packages/common/src/nominator/NominatorTx.ts @@ -145,13 +145,20 @@ export const sendProxyTx = async ( } const namedTargets = await Promise.all( - targets.map(async (val) => { - const name = await queries.getIdentityName(val); - const kyc = await queries.isKYC(val); - const scoreResult = await queries.getLatestValidatorScore(val); + targets.map(async (target) => { + const kyc = await queries.isKYC(target); + let name = await queries.getIdentityName(target); + if (!name) { + name = + (await nominator.chaindata.getFormattedIdentity(target))?.name || + ""; + } + + const scoreResult = await queries.getLatestValidatorScore(target); const score = scoreResult && scoreResult.total ? scoreResult.total : 0; + return { - address: val, + stash: target, name: name || "", kyc: kyc || false, score: score, diff --git a/packages/common/src/nominator/nominator.ts b/packages/common/src/nominator/nominator.ts index 9197440ac..31fd4d7a8 100644 --- a/packages/common/src/nominator/nominator.ts +++ b/packages/common/src/nominator/nominator.ts @@ -90,7 +90,7 @@ export default class Nominator extends EventEmitter { return this._status; }; - public async updateNominatorStatus(newStatus: NominatorStatus) { + public async updateNominatorStatus(newStatus?: NominatorStatus) { // Always update on-chain data for status const nominatorInfo = await getNominatorChainInfo(this); const { @@ -113,6 +113,9 @@ export default class Nominator extends EventEmitter { } public async shouldNominate(): Promise { + // refresh the nominator status with the latest on-chain data + await this.updateNominatorStatus(); + const stash = await this.stash(); const isBonded = await this.chaindata.isBonded(stash); const [bonded, err] = await this.chaindata.getDenomBondedAmount(stash); diff --git a/packages/common/src/scorekeeper/Round.ts b/packages/common/src/scorekeeper/Round.ts index 8507c87e5..676118139 100644 --- a/packages/common/src/scorekeeper/Round.ts +++ b/packages/common/src/scorekeeper/Round.ts @@ -90,9 +90,25 @@ export const startRound = async ( scorekeeperLabel, ); for (const nom of nominatorGroups) { + const shouldNominate = await nom.shouldNominate(); + if (!shouldNominate) { + const nominatorStatus: NominatorStatus = { + state: NominatorState.Nominating, + status: `[${index}/${allCandidates.length}] ${candidate.name} ${isValid ? "✅ " : "❌"}`, + updated: Date.now(), + stale: false, + }; + await nom.updateNominatorStatus(nominatorStatus); + } + } + } + + for (const nom of nominatorGroups) { + const shouldNominate = await nom.shouldNominate(); + if (shouldNominate) { const nominatorStatus: NominatorStatus = { state: NominatorState.Nominating, - status: `[${index}/${allCandidates.length}] ${candidate.name} ${isValid ? "✅ " : "❌"}`, + status: `Scoring Candidates...`, updated: Date.now(), stale: false, }; @@ -100,16 +116,6 @@ export const startRound = async ( } } - for (const nom of nominatorGroups) { - const nominatorStatus: NominatorStatus = { - state: NominatorState.Nominating, - status: `Scoring Candidates...`, - updated: Date.now(), - stale: false, - }; - await nom.updateNominatorStatus(nominatorStatus); - } - // Score all candidates await constraints.scoreAllCandidates(); diff --git a/packages/core/package.json b/packages/core/package.json index ed17917ff..b57e61842 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,6 +1,6 @@ { "name": "@1kv/core", - "version": "3.1.3", + "version": "3.1.4", "description": "Services for running the Thousand Validator Program.", "main": "index.js", "scripts": { diff --git a/packages/gateway/package.json b/packages/gateway/package.json index ebb5e15e2..c411d5e79 100644 --- a/packages/gateway/package.json +++ b/packages/gateway/package.json @@ -1,6 +1,6 @@ { "name": "@1kv/gateway", - "version": "3.1.3", + "version": "3.1.4", "description": "Services for running the Thousand Validator Program.", "main": "build/index.js", "types": "build/index.d.ts", diff --git a/packages/scorekeeper-status-ui/package.json b/packages/scorekeeper-status-ui/package.json index 4d364377d..1edd9450b 100644 --- a/packages/scorekeeper-status-ui/package.json +++ b/packages/scorekeeper-status-ui/package.json @@ -1,7 +1,7 @@ { "name": "@1kv/scorekeeper-status-ui", "private": true, - "version": "3.1.3", + "version": "3.1.4", "type": "module", "scripts": { "dev": "vite", diff --git a/packages/telemetry/package.json b/packages/telemetry/package.json index 1bb939fd1..a7a44d448 100644 --- a/packages/telemetry/package.json +++ b/packages/telemetry/package.json @@ -1,6 +1,6 @@ { "name": "@1kv/telemetry", - "version": "3.1.3", + "version": "3.1.4", "description": "Services for running the Thousand Validator Program.", "main": "build/index.js", "types": "build/index.d.ts", diff --git a/packages/worker/package.json b/packages/worker/package.json index d3ee1b416..060f1bd19 100644 --- a/packages/worker/package.json +++ b/packages/worker/package.json @@ -1,6 +1,6 @@ { "name": "@1kv/worker", - "version": "3.1.3", + "version": "3.1.4", "description": "Services for running the Thousand Validator Program.", "main": "build/index.js", "types": "build/index.d.ts", From c0db0e0a3e63e620d0387bcbdaa68e039b3f4727 Mon Sep 17 00:00:00 2001 From: will pankiewicz Date: Wed, 6 Mar 2024 15:35:53 +0100 Subject: [PATCH 2/5] add score to proxy txs ui --- packages/scorekeeper-status-ui/src/App.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/scorekeeper-status-ui/src/App.tsx b/packages/scorekeeper-status-ui/src/App.tsx index 8f2e1c56a..51366e574 100644 --- a/packages/scorekeeper-status-ui/src/App.tsx +++ b/packages/scorekeeper-status-ui/src/App.tsx @@ -687,7 +687,7 @@ const App = () => { theme="polkadot" /> {target.name - ? `${target.name}` + ? `[${target.score?.toFixed(0)}] ${target.name}` : `${truncateAddress(target.stash)}`}{" "} {target.kyc && ( Date: Wed, 6 Mar 2024 17:18:05 +0100 Subject: [PATCH 3/5] add identity setting --- packages/common/src/scorekeeper/Round.ts | 18 +++++++++++------- .../jobs/specificJobs/EraStatsJob.ts | 2 +- packages/common/src/scorekeeper/scorekeeper.ts | 3 ++- packages/common/src/utils/Validators.ts | 5 ++++- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/packages/common/src/scorekeeper/Round.ts b/packages/common/src/scorekeeper/Round.ts index 676118139..634f4c756 100644 --- a/packages/common/src/scorekeeper/Round.ts +++ b/packages/common/src/scorekeeper/Round.ts @@ -50,13 +50,17 @@ export const startRound = async ( ); for (const nom of nominatorGroups) { - const nominatorStatus: NominatorStatus = { - state: NominatorState.Nominating, - status: `Round Started`, - updated: Date.now(), - stale: false, - }; - await nom.updateNominatorStatus(nominatorStatus); + const shouldNominate = await nom.shouldNominate(); + if (shouldNominate) { + const nominatorStatus: NominatorStatus = { + state: NominatorState.Nominating, + status: `Round Started`, + updated: Date.now(), + stale: false, + }; + + await nom.updateNominatorStatus(nominatorStatus); + } } const proxyTxs = await queries.getAllDelayedTxs(); diff --git a/packages/common/src/scorekeeper/jobs/specificJobs/EraStatsJob.ts b/packages/common/src/scorekeeper/jobs/specificJobs/EraStatsJob.ts index d26aac695..feaf2bd94 100644 --- a/packages/common/src/scorekeeper/jobs/specificJobs/EraStatsJob.ts +++ b/packages/common/src/scorekeeper/jobs/specificJobs/EraStatsJob.ts @@ -18,7 +18,7 @@ export const eraStatsJob = async ( try { const { chaindata } = metadata; - await setValidatorRanks(); + await setValidatorRanks(chaindata); const currentSession = await chaindata.getSession(); const currentEra = await chaindata.getCurrentEra(); diff --git a/packages/common/src/scorekeeper/scorekeeper.ts b/packages/common/src/scorekeeper/scorekeeper.ts index 05ca7a017..d0986de95 100644 --- a/packages/common/src/scorekeeper/scorekeeper.ts +++ b/packages/common/src/scorekeeper/scorekeeper.ts @@ -18,6 +18,7 @@ import { Job, JobRunnerMetadata, JobStatus } from "./jobs/JobsClass"; import { JobsRunnerFactory } from "./jobs/JobsRunnerFactory"; import { startRound } from "./Round"; import { NominatorStatus } from "../types"; +import { setAllIdentities } from "../utils"; // import { monitorJob } from "./jobs"; export type NominatorGroup = Config.NominatorConfig[]; @@ -244,7 +245,7 @@ export default class ScoreKeeper { const currentEra = (await this.chaindata.getCurrentEra()) || 0; this.currentEra = currentEra; - // await setAllIdentities(this.chaindata, scorekeeperLabel); + await setAllIdentities(this.chaindata, scorekeeperLabel); const nominationPromises = this.nominatorGroups.map((nom) => nom.shouldNominate(), diff --git a/packages/common/src/utils/Validators.ts b/packages/common/src/utils/Validators.ts index b296e6b59..f19fc6e72 100644 --- a/packages/common/src/utils/Validators.ts +++ b/packages/common/src/utils/Validators.ts @@ -1,8 +1,11 @@ import { allCandidates, setRank } from "../db/queries"; import { queries } from "../index"; +import { setAllIdentities } from "./Identity"; +import Chaindata from "../chaindata/chaindata"; // Sets all validators ranks -export const setValidatorRanks = async () => { +export const setValidatorRanks = async (chaindata?: Chaindata) => { + await setAllIdentities(chaindata); const candidates = await allCandidates(); for (const candidate of candidates) { const identityRank = await queries.getIdentityValidatorActiveEras( From ee769db03959a53e773b42d482fb345bf8986a14 Mon Sep 17 00:00:00 2001 From: will pankiewicz Date: Wed, 6 Mar 2024 17:48:39 +0100 Subject: [PATCH 4/5] adjust autonomination number --- packages/common/src/scorekeeper/NumNominations.ts | 2 +- .../src/scorekeeper/jobs/specificJobs/EraStatsJob.ts | 9 +++++++-- packages/common/src/utils/Validators.ts | 5 +---- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/packages/common/src/scorekeeper/NumNominations.ts b/packages/common/src/scorekeeper/NumNominations.ts index 53eaa3d2c..461037d41 100644 --- a/packages/common/src/scorekeeper/NumNominations.ts +++ b/packages/common/src/scorekeeper/NumNominations.ts @@ -108,7 +108,7 @@ export const autoNumNominations = async ( } // How many additional validator to nominate above the amount to get in the set - const additional = 1; + const additional = 1.05; const maxNominations = 24; // The total amount of validators to nominate diff --git a/packages/common/src/scorekeeper/jobs/specificJobs/EraStatsJob.ts b/packages/common/src/scorekeeper/jobs/specificJobs/EraStatsJob.ts index feaf2bd94..c26172775 100644 --- a/packages/common/src/scorekeeper/jobs/specificJobs/EraStatsJob.ts +++ b/packages/common/src/scorekeeper/jobs/specificJobs/EraStatsJob.ts @@ -1,7 +1,11 @@ import { logger, queries } from "../../../index"; import { Job, JobConfig, JobRunnerMetadata, JobStatus } from "../JobsClass"; import { jobStatusEmitter } from "../../../Events"; -import { setValidatorRanks, withExecutionTimeLogging } from "../../../utils"; +import { + setAllIdentities, + setValidatorRanks, + withExecutionTimeLogging, +} from "../../../utils"; import { JobNames } from "../JobConfigs"; export const erastatsLabel = { label: "EraStatsJob" }; @@ -18,7 +22,8 @@ export const eraStatsJob = async ( try { const { chaindata } = metadata; - await setValidatorRanks(chaindata); + await setAllIdentities(chaindata, erastatsLabel); + await setValidatorRanks(); const currentSession = await chaindata.getSession(); const currentEra = await chaindata.getCurrentEra(); diff --git a/packages/common/src/utils/Validators.ts b/packages/common/src/utils/Validators.ts index f19fc6e72..b296e6b59 100644 --- a/packages/common/src/utils/Validators.ts +++ b/packages/common/src/utils/Validators.ts @@ -1,11 +1,8 @@ import { allCandidates, setRank } from "../db/queries"; import { queries } from "../index"; -import { setAllIdentities } from "./Identity"; -import Chaindata from "../chaindata/chaindata"; // Sets all validators ranks -export const setValidatorRanks = async (chaindata?: Chaindata) => { - await setAllIdentities(chaindata); +export const setValidatorRanks = async () => { const candidates = await allCandidates(); for (const candidate of candidates) { const identityRank = await queries.getIdentityValidatorActiveEras( From df4ba7dbb86726054ed0c8dc0483dd41400a6772 Mon Sep 17 00:00:00 2001 From: will pankiewicz Date: Wed, 6 Mar 2024 18:38:50 +0100 Subject: [PATCH 5/5] fix identity query --- .../common/src/chaindata/queries/Identity.ts | 17 +++++++++++++++++ .../common/test/chaindata/chaindata.int.test.ts | 4 ++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/common/src/chaindata/queries/Identity.ts b/packages/common/src/chaindata/queries/Identity.ts index 72fd12f78..f3ae63136 100644 --- a/packages/common/src/chaindata/queries/Identity.ts +++ b/packages/common/src/chaindata/queries/Identity.ts @@ -88,6 +88,23 @@ export const getFormattedIdentity = async ( const identityInfo = await chaindata.api?.derive.accounts.identity(addr); if (!identityInfo) return null; + const hasSubs = await chaindata.api?.query.identity.subsOf(addr); + if (hasSubs && hasSubs[1].length > 0) { + for (const subaccountAddress of hasSubs[1]) { + const subAccountIdentity = + await chaindata.api?.derive.accounts.identity( + subaccountAddress.toString(), + ); + if (subAccountIdentity) { + const subAccount: { name: string; address: string } = { + name: subAccountIdentity.display || "", + address: subaccountAddress.toString(), + }; + subAccounts.push(subAccount); + } + } + } + const { display, email, diff --git a/packages/common/test/chaindata/chaindata.int.test.ts b/packages/common/test/chaindata/chaindata.int.test.ts index a66768a62..eaed686e4 100644 --- a/packages/common/test/chaindata/chaindata.int.test.ts +++ b/packages/common/test/chaindata/chaindata.int.test.ts @@ -340,7 +340,7 @@ describe("ChainData Integration Tests", () => { "should fetch identity", async () => { const getIdentity = await chainData.getIdentity( - "J4hAvZoHCviZSoPHoSwLida8cEkZR1NXJcGrcfx9saHTk7D", + "DBfT2GUqHX89afMhTzGCCbAc44zX33d4XySWX2qAPxZ35KE", ); expect(getIdentity).toBeDefined(); }, @@ -351,7 +351,7 @@ describe("ChainData Integration Tests", () => { "should fetch formatted identity", async () => { const identity = await chainData.getFormattedIdentity( - "J4hAvZoHCviZSoPHoSwLida8cEkZR1NXJcGrcfx9saHTk7D", + "CbaNLeJQ8e8aCJMTLa9euDKuTDmnT5oPmGFt4AmuvXmYFGN", ); expect(identity).toBeDefined(); },