From d9b97cdc6c2a3fd40084e0ba84346ca0b7d9f9d1 Mon Sep 17 00:00:00 2001 From: 1devNdogs Date: Fri, 22 Oct 2021 18:08:00 +0200 Subject: [PATCH] Update Subspace testnet. (#6373) * add basic config, logos, endpoints, config. * update spec name, test color with gradient * Fix conflict - alphabetical order * updated custom types * fix local rpc node to wss://dev-rpc.subspace.network * Fix typo * Fix PoCEquivocationOffence tytpe Fix PoCEquivocationOffence offender as FarmerId * fix: sorted Spartan Testnet app-config locales, testing endpoints, chainLogo * update subspace spec definitions * Update configs to subspace, extend api.derive.chain with custom headers * Rename POC to SUB, remove spartan * Fix defs in alphabetical order, updated definitions to subspace * Chain logo named to subspace * Fix, SUB prefix to Sub * Add testnet wss, Update FarmerPublicKey type Co-authored-by: Nazar Mokrynskyi --- packages/apps-config/src/api/spec/index.ts | 2 +- packages/apps-config/src/api/spec/subspace.ts | 205 ++++++++++-------- packages/apps-config/src/endpoints/testing.ts | 14 +- packages/apps-config/src/ui/colors.ts | 6 +- packages/apps-config/src/ui/logos/index.ts | 9 +- .../src/ui/logos/nodes/subspace.png | Bin 1518 -> 10302 bytes .../apps/public/locales/en/apps-config.json | 4 +- 7 files changed, 131 insertions(+), 109 deletions(-) diff --git a/packages/apps-config/src/api/spec/index.ts b/packages/apps-config/src/api/spec/index.ts index e7d024a10b..83a721ecb8 100644 --- a/packages/apps-config/src/api/spec/index.ts +++ b/packages/apps-config/src/api/spec/index.ts @@ -198,7 +198,6 @@ const spec: Record = { nftmart, 'node-moonbeam': moonbeam, 'node-polkadex': polkadex, - 'node-template-spartan': subspace, 'nodle-chain': nodle, 'oak-testnet': oakTestnet, opal: uniqueWestend, @@ -226,6 +225,7 @@ const spec: Record = { subdao, subgame, subsocial, + subspace: subspace, 'substrate-contracts-node': substrateContractsNode, subzero: zero, ternoa, diff --git a/packages/apps-config/src/api/spec/subspace.ts b/packages/apps-config/src/api/spec/subspace.ts index d7cb89001b..3ef32401f4 100644 --- a/packages/apps-config/src/api/spec/subspace.ts +++ b/packages/apps-config/src/api/spec/subspace.ts @@ -1,111 +1,136 @@ // Copyright 2017-2021 @polkadot/apps-config authors & contributors // SPDX-License-Identifier: Apache-2.0 -import type { OverrideBundleDefinition } from '@polkadot/types/types'; - // structs need to be in order /* eslint-disable sort-keys */ +import type { Observable } from 'rxjs'; +import type { ApiInterfaceRx } from '@polkadot/api/types'; +import type { Bytes, Struct, U8aFixed, u64 } from '@polkadot/types'; +import type { OverrideBundleDefinition, Registry } from '@polkadot/types/types'; + +import { combineLatest, map } from 'rxjs'; + +import { bestNumber, bestNumberFinalized, bestNumberLag, getBlock, subscribeNewBlocks } from '@polkadot/api-derive/chain'; +import { memo } from '@polkadot/api-derive/util'; +import { Digest, Header } from '@polkadot/types/interfaces'; + +type FarmerPublicKey = U8aFixed + +interface HeaderExtended extends Header { + readonly author: FarmerPublicKey | undefined; +} + +interface Solution extends Struct { + readonly publicKey: FarmerPublicKey; + readonly nonce: u64; + readonly encoding: Bytes; + readonly signature: Bytes; + readonly tag: U8aFixed; +} + +interface SubPreDigest extends Struct { + readonly slot: u64; + readonly solution: Solution; +} + +function extractAuthor ( + digest: Digest, + api: ApiInterfaceRx +): FarmerPublicKey | undefined { + const preRuntimes = digest.logs.filter( + ({ isPreRuntime, type }) => isPreRuntime && type.toString() === 'SUB_' + ); + const { solution }: SubPreDigest = api.registry.createType( + 'SubPreDigest', + preRuntimes[0] + ); + + return solution.publicKey; +} + +function createHeaderExtended ( + registry: Registry, + header: Header, + api: ApiInterfaceRx +): HeaderExtended { + const HeaderBase = registry.createClass('Header'); + + class SubHeaderExtended extends HeaderBase implements HeaderExtended { + readonly #author?: FarmerPublicKey; + + constructor (registry: Registry, header: Header, api: ApiInterfaceRx) { + super(registry, header); + this.#author = extractAuthor(this.digest, api); + this.createdAtHash = header?.createdAtHash; + } + + public get author (): FarmerPublicKey | undefined { + return this.#author; + } + } + + return new SubHeaderExtended(registry, header, api); +} + +function subscribeNewHeads ( + instanceId: string, + api: ApiInterfaceRx +): () => Observable { + return memo( + instanceId, + (): Observable => + combineLatest([api.rpc.chain.subscribeNewHeads()]).pipe( + map(([header]): HeaderExtended => { + return createHeaderExtended(header.registry, header, api); + }) + ) + ); +} + +function getHeader ( + instanceId: string, + api: ApiInterfaceRx +): () => Observable { + return memo( + instanceId, + (): Observable => + combineLatest([api.rpc.chain.getHeader()]).pipe( + map(([header]): HeaderExtended => { + return createHeaderExtended(header.registry, header, api); + }) + ) + ); +} + const definitions: OverrideBundleDefinition = { + derives: { + chain: { + bestNumber, + bestNumberFinalized, + bestNumberLag, + getBlock, + getHeader, + subscribeNewBlocks, + subscribeNewHeads + } + }, types: [ { - // on all versions minmax: [0, undefined], types: { - PoCKind: '[u8; 16]', - RpcSolution: { - public_key: '[u8; 32]', - nonce: 'u64', - encoding: 'Vec', - signature: 'Vec', - tag: '[u8; 8]' - }, - ProposedProofOfSpaceResult: { - slot_number: 'Slot', - solution: 'Option', - secret_key: 'Vec' - }, - RpcNewSlotInfo: { - slot_number: 'Slot', - challenge: '[u8; 8]', - salt: '[u8; 8]', - next_salt: 'Option<[u8; 8]>', - solution_range: 'u64' - }, - PoCRandomness: '[u8; 32]', - FarmerSignature: 'Signature', - FarmerId: 'AccountId', - PoCBlockWeight: 'u32', - PoCNextEpochDescriptor: { - randomness: 'PoCRandomness' - }, - PoCNextConfigDescriptorV1: { - c: '(u64, u64)' - }, - PoCNextConfigDescriptor: { - _enum: { - V0: 'Null', - V1: 'PoCNextConfigDescriptorV1' - } - }, - SolutionRangeDescriptor: { - solution_range: 'u64' - }, - SaltDescriptor: { - salt: 'u64' - }, - NextSolutionRangeDescriptor: { - solution_range: 'u64' - }, - NextSaltDescriptor: { - salt: 'u64' - }, - PoCEpochConfiguration: { - c: '(u64, u64)' - }, - ConsensusLog: { - _enum: { - Phantom: 'Null', - NextEpochData: 'PoCNextEpochDescriptor', - NextConfigData: 'PoCNextConfigDescriptor', - SolutionRangeData: 'SolutionRangeDescriptor', - SaltData: 'SaltDescriptor', - NextSolutionRangeData: 'NextSolutionRangeDescriptor', - NextSaltData: 'NextSaltDescriptor' - } - }, + FarmerPublicKey: '[u8; 32]', Solution: { - public_key: 'FarmerId', + publicKey: 'FarmerPublicKey', nonce: 'u64', encoding: 'Vec', signature: 'Vec', tag: '[u8; 8]' }, - PreDigest: { - slot: 'Slot', + SubPreDigest: { + slot: 'u64', solution: 'Solution' - }, - EquivocationProof: { - offender: 'FarmerId', - slot: 'Slot', - first_header: 'Header', - second_header: 'Header' - }, - PoCEquivocationOffence: { - slot: 'Slot', - offender: 'FarmerId' - }, - PoCGenesisConfiguration: { - slot_duration: 'u64', - epoch_length: 'u64', - c: '(u64, u64)', - randomness: 'PoCRandomness' - }, - Kind: 'PoCKind', - Randomness: 'PoCRandomness', - NextEpochDescriptor: 'PoCNextEpochDescriptor', - NextConfigDescriptorV1: 'PoCNextConfigDescriptorV1', - NextConfigDescriptor: 'PoCNextConfigDescriptor' + } } } ] diff --git a/packages/apps-config/src/endpoints/testing.ts b/packages/apps-config/src/endpoints/testing.ts index 3414c55c48..96bbf56d40 100644 --- a/packages/apps-config/src/endpoints/testing.ts +++ b/packages/apps-config/src/endpoints/testing.ts @@ -409,13 +409,6 @@ export function createTesting (t: TFunction, firstOnly: boolean, withSort: boole Soramitsu: 'wss://ws.stage.sora2.soramitsu.co.jp' } }, - { - info: 'spartan-testnet', - text: t('rpc.test.subspace', 'Spartan testnet', { ns: 'apps-config' }), - providers: { - 'Subspace Network': 'wss://dev-rpc.subspace.network' - } - }, { info: 'subgame', text: t('rpc.test.subgame', 'SubGame Staging', { ns: 'apps-config' }), @@ -423,6 +416,13 @@ export function createTesting (t: TFunction, firstOnly: boolean, withSort: boole SubGame: 'wss://staging.subgame.org' } }, + { + info: 'subspace', + text: t('rpc.test.subspace', 'Subspace Testnet', { ns: 'apps-config' }), + providers: { + 'Subspace Network': 'wss://test-rpc.subspace.network' + } + }, { info: 'ternoa-testnet', text: t('rpc.test.ternoa-testnet', 'Ternoa Testnet', { ns: 'apps-config' }), diff --git a/packages/apps-config/src/ui/colors.ts b/packages/apps-config/src/ui/colors.ts index a2bd2e30d7..0f7edab459 100644 --- a/packages/apps-config/src/ui/colors.ts +++ b/packages/apps-config/src/ui/colors.ts @@ -152,7 +152,7 @@ const nodeSora = '#2D2926'; const nodeStafi = '#00F3AB'; const nodeSubDAO = 'linear-gradient(50deg, #F20092 0%, #FF4D5D 100%)'; const nodeSubsocial = '#b9018c'; -const nodeSubspace = 'linear-gradient(to left, rgba(32,90,172,1) 0%, rgba(26,72,138,1) 50%, rgba(13,36,69,1) 100%)'; +const nodeSubspace = '#562b8e'; const nodeTernoa = '#d622ff'; const nodeUniarts = chainUniarts; const nodeUnique = chainUnique; @@ -288,7 +288,6 @@ export const chainColors: Record = Object.entries({ sherpax: chainChainx, Shiden: chainShiden, Spanner: chainSpanner, - 'Spartan testnet': nodeSubspace, Standard: chainStandard, 'Standard Kusama Parachain': chainUnorthodox, Statemine: specStatemine, @@ -301,6 +300,7 @@ export const chainColors: Record = Object.entries({ 'SubGame Gamma': nodeSubGame, 'SubGame Staging': nodeSubGame, 'Subsocial PC1': chainSubsocial, + 'Subspace Testnet': nodeSubspace, Tick: chainRoccoTick, Track: chainRoccoTrack, Trick: chainRoccoTrick, @@ -379,7 +379,6 @@ export const nodeColors = Object.entries({ 'Riochain Staging': nodeRiochain, 'Shiden Collator': chainShiden, SORA: nodeSora, - 'Spartan testnet': nodeSubspace, 'Stafi node': nodeStafi, 'Statemine Collator': specStatemint, 'Statemint Collator': specStatemint, @@ -388,6 +387,7 @@ export const nodeColors = Object.entries({ 'SubGame Gamma': nodeSubGame, 'SubGame Staging': nodeSubGame, 'subsocial node': nodeSubsocial, + 'Subspace Testnet': nodeSubspace, 'subzero node': nodeZero, 'Ternoa Node': nodeTernoa, 'uni arts node': nodeUniarts, diff --git a/packages/apps-config/src/ui/logos/index.ts b/packages/apps-config/src/ui/logos/index.ts index c1ead4f5b2..694a9a4135 100644 --- a/packages/apps-config/src/ui/logos/index.ts +++ b/packages/apps-config/src/ui/logos/index.ts @@ -251,12 +251,8 @@ export const chainLogos = Object.entries({ Shiden: chainShiden, SingLavender: nodeSingLavender, Spanner: chainSpanner, - 'Spartan Testnet': nodeSubspace, - Standard: chainStandard, - 'Standard Kusama Parachain': chainUnorthodox, Statemine: nodeStatemine, 'Statemine Test': nodeStatemine, - Statemint: nodeStatemine, 'Statemint Test': nodeStatemine, 'Steam PC': nodeEave, 'SubDAO PC1': nodeSubDAO, @@ -265,6 +261,7 @@ export const chainLogos = Object.entries({ 'SubGame Staging': nodeSubGame, Subsocial: nodeSubsocial, 'Subsocial PC': nodeSubsocial, + subspace: nodeSubspace, Tick: chainRococoTick, Track: chainRococoTrack, Trick: chainRococoTrick, @@ -401,7 +398,6 @@ export const nodeLogos = Object.entries({ 'Shiden Collator': chainShiden, 'SingLavender Parachain Collator': nodeSingLavender, SORA: nodeSora, - 'Spartan Testnet': nodeSubspace, Stafi: nodeStafi, 'Stafi Node': nodeStafi, 'Statemine Collator': nodeStatemine, @@ -413,6 +409,7 @@ export const nodeLogos = Object.entries({ 'Subsocial Node': nodeSubsocial, 'Subsocial PC': nodeSubsocial, 'subsocial-node': nodeSubsocial, + subspace: nodeSubspace, 'substrate-contracts-node': nodeSubstrateContractsNode, 'substrate-node': nodeSubstrate, 'subzero node': nodeZero, @@ -609,7 +606,6 @@ export const namedLogos: Record = { snakenet: chainSnakenet, 'sora-substrate': nodeSora, spanner: chainSpanner, - 'spartan-testnet': nodeSubspace, stafi: nodeStafi, statemine: nodeStatemine, statemint: nodeStatemine, @@ -617,6 +613,7 @@ export const namedLogos: Record = { 'SubGame Gamma': nodeSubGame, 'SubGame Staging': nodeSubGame, subsocial: nodeSubsocial, + subspace: nodeSubspace, substrate: nodeSubstrate, substrateContractsNode: nodeSubstrateContractsNode, 'ternoa-testnet': nodeTernoa, diff --git a/packages/apps-config/src/ui/logos/nodes/subspace.png b/packages/apps-config/src/ui/logos/nodes/subspace.png index 3d1be15bd6875e2b6ca5ad15d1936a8eeec733ac..5d16fe18d87795befb4924daf6df837acaceb36b 100644 GIT binary patch literal 10302 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 Uthpch$N&HU07*qoM6N<$f-G(DdH?_b diff --git a/packages/apps/public/locales/en/apps-config.json b/packages/apps/public/locales/en/apps-config.json index 5e8cab4350..5471917bbd 100644 --- a/packages/apps/public/locales/en/apps-config.json +++ b/packages/apps/public/locales/en/apps-config.json @@ -178,7 +178,7 @@ "rpc.test.snowbridge": "Snowbridge", "rpc.test.sora-substrate-staging": "SORA-staging", "rpc.test.subgame": "SubGame Staging", - "rpc.test.subspace": "Spartan testnet", + "rpc.test.subspace": "Subspace Testnet", "rpc.test.ternoa-testnet": "Ternoa Testnet", "rpc.test.turbulence": "Turbulence", "rpc.test.uniarts": "UniArts", @@ -203,4 +203,4 @@ "ss58.default": "Default for the connected node", "testnet.kylin-node.co.uk": "Kylin Testnet", "westend-opal.unique.network": "OPAL by UNIQUE" -} \ No newline at end of file +}