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/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/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/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/Round.ts b/packages/common/src/scorekeeper/Round.ts index 8507c87e5..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(); @@ -90,9 +94,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 +120,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/common/src/scorekeeper/jobs/specificJobs/EraStatsJob.ts b/packages/common/src/scorekeeper/jobs/specificJobs/EraStatsJob.ts index d26aac695..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,6 +22,7 @@ export const eraStatsJob = async ( try { const { chaindata } = metadata; + await setAllIdentities(chaindata, erastatsLabel); await setValidatorRanks(); const currentSession = await chaindata.getSession(); 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/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(); }, 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/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 && (