Forráskód Böngészése

Merge pull request #1712 from pyth-network/mc/keys-schema

[xc-admin-frontend] Unify publisher keys file schema with observer and balance tracker
Mario Camou 1 éve
szülő
commit
6c7ead7d39

+ 4 - 0
.tool-versions

@@ -0,0 +1,4 @@
+nodejs 18.19.1
+pnpm 9.3.0
+rust 1.78.0
+python 3.12.4

+ 3 - 1
governance/xc_admin/packages/xc_admin_frontend/package.json

@@ -35,7 +35,9 @@
     "react-hot-toast": "^2.4.0",
     "sharp": "^0.33.4",
     "use-debounce": "^9.0.2",
-    "web3": "^4.8.0"
+    "web3": "^4.8.0",
+    "yaml": "^2.1.1",
+    "zod": "^3.23.8"
   },
   "devDependencies": {
     "@svgr/webpack": "^6.3.1",

+ 30 - 19
governance/xc_admin/packages/xc_admin_frontend/pages/index.tsx

@@ -1,3 +1,5 @@
+import YAML from 'yaml'
+import { z } from 'zod'
 import { Tab } from '@headlessui/react'
 import * as fs from 'fs'
 import type { GetServerSideProps, NextPage } from 'next'
@@ -13,27 +15,36 @@ import { StatusFilterProvider } from '../contexts/StatusFilterContext'
 import { classNames } from '../utils/classNames'
 import '../mappings/signers.json'
 
+const keyToNameMappingSchema = z.array(
+  z.object({ key: z.string(), name: z.string() })
+)
+
+const readPublisherKeyToNameMapping = async (filename: string) => {
+  let data = ''
+  try {
+    data = await fs.promises.readFile(filename, 'utf8')
+  } catch {
+    return {}
+  }
+
+  const yaml = YAML.parse(data)
+
+  const arr = await keyToNameMappingSchema.parseAsync(yaml)
+  return Object.fromEntries(arr.map((key, name) => [key, name]))
+}
+
 export const getServerSideProps: GetServerSideProps = async () => {
   const MAPPINGS_BASE_PATH = process.env.MAPPINGS_BASE_PATH || 'mappings'
-  const PUBLISHER_PYTHNET_MAPPING_PATH = `${MAPPINGS_BASE_PATH}/publishers-pythnet.json`
-  const PUBLISHER_PYTHTEST_MAPPING_PATH = `${MAPPINGS_BASE_PATH}/publishers-pythtest.json`
-
-  const publisherKeyToNameMapping = {
-    pythnet: fs.existsSync(PUBLISHER_PYTHNET_MAPPING_PATH)
-      ? JSON.parse(
-          (
-            await fs.promises.readFile(PUBLISHER_PYTHNET_MAPPING_PATH)
-          ).toString()
-        )
-      : {},
-    pythtest: fs.existsSync(PUBLISHER_PYTHTEST_MAPPING_PATH)
-      ? JSON.parse(
-          (
-            await fs.promises.readFile(PUBLISHER_PYTHTEST_MAPPING_PATH)
-          ).toString()
-        )
-      : {},
-  }
+  const PUBLISHER_PYTHNET_MAPPING_PATH = `${MAPPINGS_BASE_PATH}/pythnet/publishers.yaml`
+  const PUBLISHER_PYTHTEST_MAPPING_PATH = `${MAPPINGS_BASE_PATH}/pythtest/publishers.yaml`
+
+  const [pythnet, pythtest] = await Promise.all(
+    [PUBLISHER_PYTHNET_MAPPING_PATH, PUBLISHER_PYTHTEST_MAPPING_PATH].map(
+      (path) => readPublisherKeyToNameMapping(path)
+    )
+  )
+  const publisherKeyToNameMapping = { pythnet, pythtest }
+
   const MULTISIG_SIGNER_MAPPING_PATH = `${MAPPINGS_BASE_PATH}/signers.json`
   const multisigSignerKeyToNameMapping = fs.existsSync(
     MULTISIG_SIGNER_MAPPING_PATH

+ 8 - 2
pnpm-lock.yaml

@@ -813,6 +813,12 @@ importers:
       web3:
         specifier: ^4.8.0
         version: 4.8.0(bufferutil@4.0.8)(encoding@0.1.13)(typescript@5.4.5)(utf-8-validate@5.0.10)(zod@3.23.8)
+      yaml:
+        specifier: ^2.1.1
+        version: 2.4.5
+      zod:
+        specifier: ^3.23.8
+        version: 3.23.8
     devDependencies:
       '@svgr/webpack':
         specifier: ^6.3.1
@@ -37170,7 +37176,7 @@ snapshots:
 
   openapi3-ts@3.1.0:
     dependencies:
-      yaml: 2.4.3
+      yaml: 2.4.5
 
   optimism@0.16.2:
     dependencies:
@@ -38122,7 +38128,7 @@ snapshots:
       unicode-properties: 1.4.1
       urijs: 1.19.11
       wordwrap: 1.0.0
-      yaml: 2.4.3
+      yaml: 2.4.5
     transitivePeerDependencies:
       - encoding