Skip to content

Commit

Permalink
add block timestamp to events and tx
Browse files Browse the repository at this point in the history
  • Loading branch information
XY-Wang committed Jul 31, 2024
1 parent ea70dc0 commit ef8e895
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 9 deletions.
2 changes: 1 addition & 1 deletion examples/filter-extrinsics/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import {
function watcher({ urls, verbose }) {
process.stdin.setEncoding('utf-8');
process.stdin.on('readable', () => {
var text = process.stdin.read();
const text = process.stdin.read();
if (text !== null) {
const parsed = parse(text);

Expand Down
7 changes: 6 additions & 1 deletion packages/core/src/operators/extract.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,11 @@ describe('extractors over extended signed blocks', () => {
const testPipe = extractTxWithEvents()(from(testBlocks))
let index = 0
testPipe.subscribe({
next: (result: TxWithEvent) => {
next: (result: TxWithIdAndEvent) => {
expect(result).toBeDefined()
expect(result.extrinsic.method.toString()).toEqual(testExtrinsics[index].extrinsic.method.toString())
expect(result.extrinsic.data).toEqual(testExtrinsics[index].extrinsic.data)
expect(result.extrinsic.timestamp).toBeDefined()
index++
},
complete: done,
Expand All @@ -35,6 +36,7 @@ describe('extractors over extended signed blocks', () => {
expect(result.extrinsic.data).toEqual(testExtrinsics[index].extrinsic.data)
expect(result.extrinsic.blockHash).toBeDefined()
expect(result.extrinsic.extrinsicId).toBeDefined()
expect(result.extrinsic.timestamp).toBeDefined()
index++
},
complete: done,
Expand Down Expand Up @@ -75,6 +77,7 @@ describe('extractors over extended signed blocks', () => {
expect(event.data.toString()).toEqual(testEventRecords[index].event.data.toString())
expect(event.blockHash).toBeDefined()
expect(event.eventId).toBeDefined()
expect(event.timestamp).toBeDefined()
index++
},
complete: done,
Expand All @@ -95,6 +98,8 @@ describe('extractors over extended signed blocks', () => {
expect(record.extrinsic.extrinsicId).toBeDefined()
expect(record.blockHash.toString()).toEqual(record.extrinsic.blockHash.toString())
expect(record.blockNumber.toString()).toEqual(record.extrinsic.blockNumber.toString())
expect(record.extrinsic.timestamp).toBeDefined()
expect(record.timestamp).toBeDefined()
},
complete: done,
})
Expand Down
21 changes: 18 additions & 3 deletions packages/core/src/operators/extract.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
// Copyright 2023-2024 SO/DA zone
// SPDX-License-Identifier: Apache-2.0

import type { SignedBlockExtended } from '@polkadot/api-derive/types'
import type { SignedBlockExtended, TxWithEvent } from '@polkadot/api-derive/types'
import type { u64 } from '@polkadot/types-codec'
import type { SignedBlock } from '@polkadot/types/interfaces'

import { Observable, from, map, mergeMap, share } from 'rxjs'
Expand All @@ -16,6 +17,15 @@ import {
TxWithIdAndEvent,
} from '../types/interfaces.js'

function getTimestampFromBlock(extrinsics: TxWithEvent[]) {
const setTimestamp = extrinsics.find(
({ extrinsic: { method } }) => method.section === 'timestamp' && method.method === 'set'
)
if (setTimestamp) {
return setTimestamp.extrinsic.args[0] as u64
}
}

/**
* Operator to extract extrinsics with paired events from blocks.
*
Expand All @@ -41,12 +51,14 @@ export function extractTxWithEvents() {
mergeMap(({ block, extrinsics, events }) => {
const blockNumber = block.header.number
const blockHash = block.hash
const timestamp = getTimestampFromBlock(extrinsics)
return extrinsics.map((xt, blockPosition) => {
return enhanceTxWithIdAndEvents(
{
blockNumber,
blockHash,
blockPosition,
timestamp,
},
xt,
events
Expand Down Expand Up @@ -121,15 +133,16 @@ export function extractExtrinsics() {
export function extractEvents() {
return (source: Observable<SignedBlockExtended>): Observable<BlockEvent> => {
return source.pipe(
map(({ block, events }) => {
map(({ block, events, extrinsics }) => {
return {
extrinsics: block.extrinsics,
events,
blockNumber: block.header.number,
blockHash: block.hash,
timestamp: getTimestampFromBlock(extrinsics),
}
}),
mergeMap(({ extrinsics, events, blockHash, blockNumber }) => {
mergeMap(({ extrinsics, events, blockHash, blockNumber, timestamp }) => {
let prevXtIndex = -1
let xtEventIndex = 0
let extrinsicWithId: ExtrinsicWithId | undefined
Expand All @@ -142,6 +155,7 @@ export function extractEvents() {
blockNumber,
blockHash,
blockPosition: index,
timestamp,
}
const extrinsicIndex = phase.isApplyExtrinsic ? phase.asApplyExtrinsic.toNumber() : undefined
if (extrinsicIndex) {
Expand All @@ -150,6 +164,7 @@ export function extractEvents() {
blockNumber,
blockHash,
blockPosition: extrinsicIndex,
timestamp,
})
}

Expand Down
7 changes: 5 additions & 2 deletions packages/core/src/types/event.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
// Copyright 2023-2024 SO/DA zone
// SPDX-License-Identifier: Apache-2.0

import { Compact, GenericEvent } from '@polkadot/types'
import { Compact, GenericEvent, u64 } from '@polkadot/types'
import type { AnyJson, IU8a } from '@polkadot/types-codec/types'
import type { BlockNumber } from '@polkadot/types/interfaces'

Expand All @@ -22,14 +22,16 @@ export class GenericEventWithId extends GenericEvent implements EventWithId {
readonly blockNumber: Compact<BlockNumber>
readonly blockHash: IU8a
readonly blockPosition: number
readonly timestamp?: u64

constructor(value: GenericEvent, { blockNumber, blockHash, blockPosition }: EventBlockContext) {
constructor(value: GenericEvent, { blockNumber, blockHash, blockPosition, timestamp }: EventBlockContext) {
super(value.registry)

this._event = value
this.blockNumber = blockNumber
this.blockHash = blockHash
this.blockPosition = blockPosition
this.timestamp = timestamp

return new Proxy(this, {
get<T>(target: GenericEventWithId, p: keyof GenericEvent): T {
Expand Down Expand Up @@ -67,6 +69,7 @@ export class GenericEventWithId extends GenericEvent implements EventWithId {
blockPosition: this.blockPosition,
blockNumber: this.blockNumber.toHuman(),
blockHash: this.blockHash.toHuman(),
timestamp: this.timestamp?.toHuman(),
...(this._event.toHuman(isExpanded) as any),
}
}
Expand Down
9 changes: 7 additions & 2 deletions packages/core/src/types/extrinsic.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import type { TxWithEvent } from '@polkadot/api-derive/types'
import { Compact, GenericExtrinsic } from '@polkadot/types'
import type { u64 } from '@polkadot/types-codec'
import type { AnyJson, IU8a } from '@polkadot/types-codec/types'
import { Address, BlockNumber, EventRecord } from '@polkadot/types/interfaces'

Expand Down Expand Up @@ -32,10 +33,11 @@ export class GenericExtrinsicWithId extends GenericExtrinsic implements Extrinsi
readonly blockHash: IU8a
readonly blockPosition: number
readonly extraSigners: ExtraSigner[]
readonly timestamp?: u64

constructor(
value: GenericExtrinsic,
{ blockNumber, blockPosition, blockHash }: ExtrinsicBlockContext,
{ blockNumber, blockPosition, blockHash, timestamp }: ExtrinsicBlockContext,
extraSigners: ExtraSigner[] = []
) {
super(value.registry)
Expand All @@ -45,6 +47,7 @@ export class GenericExtrinsicWithId extends GenericExtrinsic implements Extrinsi
this.blockPosition = blockPosition
this.blockHash = blockHash
this.extraSigners = extraSigners
this.timestamp = timestamp

return new Proxy(this, {
get<T>(target: GenericExtrinsicWithId, p: keyof GenericExtrinsic): T {
Expand Down Expand Up @@ -89,6 +92,7 @@ export class GenericExtrinsicWithId extends GenericExtrinsic implements Extrinsi
type: o.type,
address: o.address.toHuman(),
})),
timestamp: this.timestamp?.toHuman(),
...(this._extrinsic.toHuman(isExpanded) as any),
}
}
Expand All @@ -105,7 +109,7 @@ export function enhanceTxWithIdAndEvents(
tx: TxWithEvent,
events: EventRecord[]
): TxWithIdAndEvent {
const { blockHash, blockNumber, blockPosition: xtIndex } = xtContext
const { blockHash, blockNumber, blockPosition: xtIndex, timestamp } = xtContext
const eventsWithId: EventWithId[] = []

for (let index = 0; index < events.length; index++) {
Expand All @@ -116,6 +120,7 @@ export function enhanceTxWithIdAndEvents(
blockHash,
blockNumber,
blockPosition: index,
timestamp,
})
)
}
Expand Down
6 changes: 6 additions & 0 deletions packages/core/src/types/interfaces.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@

import type { TxWithEvent } from '@polkadot/api-derive/types'
import { Compact } from '@polkadot/types'
import type { u64 } from '@polkadot/types-codec'
import type { IU8a } from '@polkadot/types-codec/types'
import type { BlockNumber } from '@polkadot/types/interfaces'
import { GenericEventWithId } from './event.js'
Expand All @@ -17,6 +18,7 @@ export interface ExtrinsicWithId extends GenericExtrinsicWithId {
blockPosition: number
extrinsicId: string
extraSigners: ExtraSigner[]
timestamp?: u64
}

/**
Expand All @@ -27,6 +29,7 @@ export interface EventWithId extends GenericEventWithId {
blockHash: IU8a
blockPosition: number
eventId: string
timestamp?: u64
}

/**
Expand Down Expand Up @@ -55,6 +58,7 @@ export interface ExtrinsicBlockContext {
blockNumber: Compact<BlockNumber>
blockHash: IU8a
blockPosition: number
timestamp?: u64
}

/**
Expand All @@ -65,6 +69,7 @@ export interface EventBlockContext {
blockNumber: Compact<BlockNumber>
blockHash: IU8a
blockPosition: number
timestamp?: u64
}

/**
Expand All @@ -75,6 +80,7 @@ export interface EventExtrinsicContext extends EventBlockContext {
extrinsicPosition: number
extrinsicId: string
extrinsic: ExtrinsicWithId
timestamp?: u64
}

/**
Expand Down

0 comments on commit ef8e895

Please sign in to comment.