diff --git a/packages/api-derive/src/type/util.ts b/packages/api-derive/src/type/util.ts index d19ae61f14..702785503f 100644 --- a/packages/api-derive/src/type/util.ts +++ b/packages/api-derive/src/type/util.ts @@ -5,20 +5,43 @@ import type { AccountId, Digest } from '@polkadot/types/interfaces'; export function extractAuthor (digest: Digest, sessionValidators: AccountId[] = []): AccountId | undefined { const [citem] = digest.logs.filter(({ type }) => type === 'Consensus'); + const [pitem] = digest.logs.filter(({ type }) => type === 'PreRuntime'); + const [sitem] = digest.logs.filter(({ type }) => type === 'Seal'); - if (citem) { - const [engine, data] = citem.asConsensus; + let accountId: AccountId | undefined; - return engine.extractAuthor(data, sessionValidators); - } else { - const [pitem] = digest.logs.filter(({ type }) => type === 'PreRuntime'); - - if (pitem) { + // This is critical to be first for BABE (before Consensus) + // If not first, we end up dropping the author at session-end + if (pitem) { + try { const [engine, data] = pitem.asPreRuntime; - return engine.extractAuthor(data, sessionValidators); + accountId = engine.extractAuthor(data, sessionValidators); + } catch { + // ignore } } - return undefined; + if (!accountId && citem) { + try { + const [engine, data] = citem.asConsensus; + + accountId = engine.extractAuthor(data, sessionValidators); + } catch { + // ignore + } + } + + // SEAL, still used in e.g. Kulupu for pow + if (!accountId && sitem) { + try { + const [engine, data] = sitem.asSeal; + + accountId = engine.extractAuthor(data, sessionValidators); + } catch { + // ignore + } + } + + return accountId; }