From c67e201fb608eda5480da550600bb992681d8612 Mon Sep 17 00:00:00 2001 From: Antoine Estienne Date: Tue, 8 Jun 2021 08:16:24 +0200 Subject: [PATCH] Moonbeam: display account id from author id (#5363) * draft get account id from author id * draft block mapping * add authorFrom mapping type and cleanup * remove console.log * Update packages/react-query/src/BlockAuthors.tsx Co-authored-by: Jaco * add more safeguards checks * Update packages/react-query/src/BlockAuthors.tsx Co-authored-by: Jaco * revert change on lock * add missing import Co-authored-by: Jaco --- packages/page-explorer/src/BlockHeader.tsx | 14 ++++++++--- packages/react-query/src/BlockAuthors.tsx | 29 ++++++++++++++++------ 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/packages/page-explorer/src/BlockHeader.tsx b/packages/page-explorer/src/BlockHeader.tsx index 05993d1f12..2913ff130d 100644 --- a/packages/page-explorer/src/BlockHeader.tsx +++ b/packages/page-explorer/src/BlockHeader.tsx @@ -9,8 +9,12 @@ import { Link } from 'react-router-dom'; import { AddressMini, Digits } from '@polkadot/react-components'; import { formatNumber } from '@polkadot/util'; +// TODO update HeaderExtended in api-derive +export interface HeaderExtendedWithMapping extends HeaderExtended { + authorFromMapping?: string; +} interface Props { - value: HeaderExtended; + value: HeaderExtendedWithMapping; } function BlockHeader ({ value }: Props): React.ReactElement | null { @@ -27,9 +31,11 @@ function BlockHeader ({ value }: Props): React.ReactElement | null { {hashHex} - {value.author && ( - - )} + {value.authorFromMapping + ? + : value.author && ( + + )} ); diff --git a/packages/react-query/src/BlockAuthors.tsx b/packages/react-query/src/BlockAuthors.tsx index 9ca80d46ca..c05581d84f 100644 --- a/packages/react-query/src/BlockAuthors.tsx +++ b/packages/react-query/src/BlockAuthors.tsx @@ -7,15 +7,20 @@ import type { EraRewardPoints } from '@polkadot/types/interfaces'; import React, { useEffect, useState } from 'react'; import { useApi, useCall } from '@polkadot/react-hooks'; -import { formatNumber } from '@polkadot/util'; +import { formatNumber, isFunction } from '@polkadot/util'; + +// TODO update HeaderExtended in api-derive +export interface HeaderExtendedWithMapping extends HeaderExtended { + authorFromMapping?: string; +} export interface Authors { byAuthor: Record; eraPoints: Record; lastBlockAuthors: string[]; lastBlockNumber?: string; - lastHeader?: HeaderExtended; - lastHeaders: HeaderExtended[]; + lastHeader?: HeaderExtendedWithMapping; + lastHeaders: HeaderExtendedWithMapping[]; } interface Props { @@ -38,9 +43,10 @@ function BlockAuthorsBase ({ children }: Props): React.ReactElement { useEffect((): void => { // No unsub, global context - destroyed on app close api.isReady.then((): void => { - let lastHeaders: HeaderExtended[] = []; + let lastHeaders: HeaderExtendedWithMapping[] = []; let lastBlockAuthors: string[] = []; let lastBlockNumber = ''; + const isAuthorMapping = isFunction(api.query.authorMapping?.mapping); // subscribe to all validators api.query.session && api.query.session.validators((validatorIds): void => { @@ -48,10 +54,19 @@ function BlockAuthorsBase ({ children }: Props): React.ReactElement { }).catch(console.error); // subscribe to new headers - api.derive.chain.subscribeNewHeads((lastHeader): void => { + api.derive.chain.subscribeNewHeads(async (lastHeader: HeaderExtendedWithMapping): Promise => { if (lastHeader?.number) { const blockNumber = lastHeader.number.unwrap(); - const thisBlockAuthor = lastHeader.author?.toString(); + let thisBlockAuthor = ''; + + if (lastHeader.author) { + thisBlockAuthor = lastHeader.author.toString(); + } else if (isAuthorMapping && lastHeader.digest.logs && lastHeader.digest.logs[0] && lastHeader.digest.logs[0].isConsensus && lastHeader.digest.logs[0].asConsensus[1]) { + // Some blockchains such as Moonbeam need to fetch the author accountId from a mapping + thisBlockAuthor = (await api.query.authorMapping.mapping(lastHeader.digest.logs[0].asConsensus[1])).toString(); + lastHeader.authorFromMapping = thisBlockAuthor; + } + const thisBlockNumber = formatNumber(blockNumber); if (thisBlockAuthor) { @@ -67,7 +82,7 @@ function BlockAuthorsBase ({ children }: Props): React.ReactElement { lastHeaders = lastHeaders .filter((old, index) => index < MAX_HEADERS && old.number.unwrap().lt(blockNumber)) - .reduce((next, header): HeaderExtended[] => { + .reduce((next, header): HeaderExtendedWithMapping[] => { next.push(header); return next;