common.ts 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  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 MetadataClass<T> = {
  25. deserializeBinary: (bytes: Uint8Array) => T
  26. name: string
  27. }
  28. export function deserializeMetadata<T>(metadataType: MetadataClass<T>, metadataBytes: Bytes): T | null {
  29. try {
  30. return metadataType.deserializeBinary(metadataBytes.toU8a(true))
  31. } catch (e) {
  32. console.error(`Cannot deserialize ${metadataType.name}! Provided bytes: (${metadataBytes.toHex()})`)
  33. return null
  34. }
  35. }
  36. export async function getOrCreateBlock(
  37. db: DatabaseManager,
  38. { blockNumber, blockTimestamp }: SubstrateEvent
  39. ): Promise<Block> {
  40. const block = await db.get(Block, { where: { number: blockNumber } })
  41. if (!block) {
  42. const newBlock = new Block({
  43. id: `${CURRENT_NETWORK}-${blockNumber}`,
  44. number: blockNumber,
  45. timestamp: blockTimestamp,
  46. network: CURRENT_NETWORK,
  47. })
  48. await db.save<Block>(newBlock)
  49. return newBlock
  50. }
  51. return block
  52. }
  53. export function bytesToString(b: Bytes): string {
  54. return Buffer.from(b.toU8a(true)).toString()
  55. }