|
|
@@ -11,54 +11,43 @@ export async function getPublishersForFeedRequest(
|
|
|
cluster: Cluster,
|
|
|
symbol: string,
|
|
|
) {
|
|
|
- const url = new URL(
|
|
|
- `/api/pyth/get-publishers/${encodeURIComponent(symbol)}`,
|
|
|
- await getHost(),
|
|
|
+ const data = await fetchPythData(
|
|
|
+ cluster,
|
|
|
+ `get-publishers/${encodeURIComponent(symbol)}`,
|
|
|
);
|
|
|
- url.searchParams.set("cluster", ClusterToName[cluster]);
|
|
|
-
|
|
|
- const data = await fetch(url, {
|
|
|
- next: {
|
|
|
- revalidate: DEFAULT_NEXT_FETCH_TTL,
|
|
|
- },
|
|
|
- headers: VERCEL_REQUEST_HEADERS,
|
|
|
- });
|
|
|
- const parsedData: unknown = await data.json();
|
|
|
- return z.array(z.string()).parse(parsedData);
|
|
|
+ return z.array(z.string()).parse(await data.json());
|
|
|
}
|
|
|
|
|
|
+export const getPublishers = async (cluster: Cluster) => {
|
|
|
+ const data = await fetchPythData(cluster, `get-publishers`);
|
|
|
+ return publishersSchema.parse(await data.json());
|
|
|
+};
|
|
|
+
|
|
|
+const publishersSchema = z.array(
|
|
|
+ z.strictObject({
|
|
|
+ key: z.string(),
|
|
|
+ permissionedFeeds: z.number(),
|
|
|
+ }),
|
|
|
+);
|
|
|
+
|
|
|
export async function getFeedsForPublisherRequest(
|
|
|
cluster: Cluster,
|
|
|
publisher: string,
|
|
|
) {
|
|
|
- const url = new URL(
|
|
|
- `/api/pyth/get-feeds-for-publisher/${encodeURIComponent(publisher)}`,
|
|
|
- await getHost(),
|
|
|
+ const data = await fetchPythData(
|
|
|
+ cluster,
|
|
|
+ `get-feeds-for-publisher/${encodeURIComponent(publisher)}`,
|
|
|
);
|
|
|
- url.searchParams.set("cluster", ClusterToName[cluster]);
|
|
|
-
|
|
|
- const data = await fetch(url, {
|
|
|
- next: {
|
|
|
- revalidate: DEFAULT_NEXT_FETCH_TTL,
|
|
|
- },
|
|
|
- headers: VERCEL_REQUEST_HEADERS,
|
|
|
- });
|
|
|
const rawData = await data.text();
|
|
|
const parsedData = parse(rawData);
|
|
|
return priceFeedsSchema.parse(parsedData);
|
|
|
}
|
|
|
|
|
|
export const getFeedsRequest = async (cluster: Cluster) => {
|
|
|
- const url = new URL(`/api/pyth/get-feeds`, await getHost());
|
|
|
- url.searchParams.set("cluster", ClusterToName[cluster]);
|
|
|
- url.searchParams.set("excludePriceComponents", "true");
|
|
|
-
|
|
|
- const data = await fetch(url, {
|
|
|
- next: {
|
|
|
- revalidate: DEFAULT_NEXT_FETCH_TTL,
|
|
|
- },
|
|
|
- headers: VERCEL_REQUEST_HEADERS,
|
|
|
+ const data = await fetchPythData(cluster, "get-feeds", {
|
|
|
+ excludePriceComponents: "true",
|
|
|
});
|
|
|
+
|
|
|
const rawData = await data.text();
|
|
|
const parsedData = parse(rawData);
|
|
|
|
|
|
@@ -75,18 +64,10 @@ export const getFeedForSymbolRequest = async ({
|
|
|
symbol: string;
|
|
|
cluster?: Cluster;
|
|
|
}): Promise<z.infer<typeof priceFeedsSchema.element> | undefined> => {
|
|
|
- const url = new URL(
|
|
|
- `/api/pyth/get-feeds/${encodeURIComponent(symbol)}`,
|
|
|
- await getHost(),
|
|
|
+ const data = await fetchPythData(
|
|
|
+ cluster,
|
|
|
+ `get-feeds/${encodeURIComponent(symbol)}`,
|
|
|
);
|
|
|
- url.searchParams.set("cluster", ClusterToName[cluster]);
|
|
|
-
|
|
|
- const data = await fetch(url, {
|
|
|
- next: {
|
|
|
- revalidate: DEFAULT_NEXT_FETCH_TTL,
|
|
|
- },
|
|
|
- headers: VERCEL_REQUEST_HEADERS,
|
|
|
- });
|
|
|
|
|
|
if (!data.ok) {
|
|
|
return undefined;
|
|
|
@@ -98,3 +79,22 @@ export const getFeedForSymbolRequest = async ({
|
|
|
? undefined
|
|
|
: priceFeedsSchema.element.parse(parsedData);
|
|
|
};
|
|
|
+
|
|
|
+const fetchPythData = async (
|
|
|
+ cluster: Cluster,
|
|
|
+ path: string,
|
|
|
+ params?: Record<string, string>,
|
|
|
+) => {
|
|
|
+ const url = new URL(`/api/pyth/${path}`, await getHost());
|
|
|
+ url.searchParams.set("cluster", ClusterToName[cluster]);
|
|
|
+ if (params !== undefined) {
|
|
|
+ for (const [key, value] of Object.entries(params)) {
|
|
|
+ url.searchParams.set(key, value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ return await fetch(url, {
|
|
|
+ next: { revalidate: DEFAULT_NEXT_FETCH_TTL },
|
|
|
+ headers: VERCEL_REQUEST_HEADERS,
|
|
|
+ });
|
|
|
+};
|