common.ts 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. import { SubstrateEvent } from '@dzlzv/hydra-common'
  2. import { EventType, Network } from 'query-node/dist/src/modules/enums/enums'
  3. import { Event } from 'query-node/dist/src/modules/event/event.model'
  4. import { Bytes } from '@polkadot/types'
  5. import { Block } from 'query-node/dist/model'
  6. import { DatabaseManager } from '@dzlzv/hydra-db-utils'
  7. export const CURRENT_NETWORK = Network.OLYMPIA
  8. export async function createEvent(
  9. db: DatabaseManager,
  10. substrateEvent: SubstrateEvent,
  11. type: EventType
  12. ): Promise<Event> {
  13. const { blockNumber, index, extrinsic } = substrateEvent
  14. const event = new Event({
  15. id: `${blockNumber}-${index}`,
  16. inBlock: await getOrCreateBlock(db, substrateEvent),
  17. inExtrinsic: extrinsic?.hash,
  18. indexInBlock: index,
  19. type,
  20. })
  21. await db.save<Event>(event)
  22. return event
  23. }
  24. type AnyMessage<T> = T & {
  25. toJSON(): Record<string, unknown>
  26. }
  27. type AnyMetadataClass<T> = {
  28. name: string
  29. decode(binary: Uint8Array): AnyMessage<T>
  30. encode(obj: T): { finish(): Uint8Array }
  31. toObject(obj: AnyMessage<T>): Record<string, unknown>
  32. }
  33. export function deserializeMetadata<T>(metadataType: AnyMetadataClass<T>, metadataBytes: Bytes): T | null {
  34. try {
  35. // We use `toObject()` to get rid of .prototype defaults for optional fields
  36. return metadataType.toObject(metadataType.decode(metadataBytes.toU8a(true))) as T
  37. } catch (e) {
  38. console.error(`Cannot deserialize ${metadataType.name}! Provided bytes: (${metadataBytes.toHex()})`)
  39. return null
  40. }
  41. }
  42. export async function getOrCreateBlock(
  43. db: DatabaseManager,
  44. { blockNumber, blockTimestamp }: SubstrateEvent
  45. ): Promise<Block> {
  46. const block = await db.get(Block, { where: { number: blockNumber } })
  47. if (!block) {
  48. const newBlock = new Block({
  49. id: `${CURRENT_NETWORK}-${blockNumber}`,
  50. number: blockNumber,
  51. timestamp: blockTimestamp,
  52. network: CURRENT_NETWORK,
  53. })
  54. await db.save<Block>(newBlock)
  55. return newBlock
  56. }
  57. return block
  58. }
  59. export function bytesToString(b: Bytes): string {
  60. return Buffer.from(b.toU8a(true)).toString()
  61. }