common.ts 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. import { SubstrateEvent } from '@dzlzv/hydra-common'
  2. import { 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 { WorkingGroup } from '@joystream/types/augment/all'
  6. export const CURRENT_NETWORK = Network.OLYMPIA
  7. export function genericEventFields(substrateEvent: SubstrateEvent): Partial<Event> {
  8. const { blockNumber, indexInBlock, extrinsic, blockTimestamp } = substrateEvent
  9. const eventTime = new Date(blockTimestamp)
  10. return {
  11. createdAt: eventTime,
  12. updatedAt: eventTime,
  13. id: `${CURRENT_NETWORK}-${blockNumber}-${indexInBlock}`,
  14. inBlock: blockNumber,
  15. network: CURRENT_NETWORK,
  16. inExtrinsic: extrinsic?.hash,
  17. indexInBlock,
  18. }
  19. }
  20. type AnyMessage<T> = T & {
  21. toJSON(): Record<string, unknown>
  22. }
  23. type AnyMetadataClass<T> = {
  24. name: string
  25. decode(binary: Uint8Array): AnyMessage<T>
  26. encode(obj: T): { finish(): Uint8Array }
  27. toObject(obj: AnyMessage<T>): Record<string, unknown>
  28. }
  29. export function deserializeMetadata<T>(metadataType: AnyMetadataClass<T>, metadataBytes: Bytes): T | null {
  30. try {
  31. // We use `toObject()` to get rid of .prototype defaults for optional fields
  32. return metadataType.toObject(metadataType.decode(metadataBytes.toU8a(true))) as T
  33. } catch (e) {
  34. console.error(`Cannot deserialize ${metadataType.name}! Provided bytes: (${metadataBytes.toHex()})`)
  35. return null
  36. }
  37. }
  38. export function bytesToString(b: Bytes): string {
  39. return Buffer.from(b.toU8a(true)).toString()
  40. }
  41. export function perpareString(s: string): string {
  42. // eslint-disable-next-line no-control-regex
  43. return s.replace(/\u0000/g, '')
  44. }
  45. export function hasValuesForProperties<
  46. T extends Record<string, unknown>,
  47. P extends keyof T & string,
  48. PA extends readonly P[]
  49. >(obj: T, props: PA): obj is T & { [K in PA[number]]: NonNullable<K> } {
  50. props.forEach((p) => {
  51. if (obj[p] === null || obj[p] === undefined) {
  52. return false
  53. }
  54. })
  55. return true
  56. }
  57. export type WorkingGroupModuleName =
  58. | 'storageWorkingGroup'
  59. | 'contentDirectoryWorkingGroup'
  60. | 'forumWorkingGroup'
  61. | 'membershipWorkingGroup'
  62. export function getWorkingGroupModuleName(group: WorkingGroup): WorkingGroupModuleName {
  63. if (group.isContent) {
  64. return 'contentDirectoryWorkingGroup'
  65. } else if (group.isMembership) {
  66. return 'membershipWorkingGroup'
  67. } else if (group.isForum) {
  68. return 'forumWorkingGroup'
  69. } else if (group.isStorage) {
  70. return 'storageWorkingGroup'
  71. }
  72. throw new Error(`Unsupported working group: ${group.type}`)
  73. }