Skip to content

Commit

Permalink
Merge pull request #6 from elliotsayes/dev
Browse files Browse the repository at this point in the history
Fix testnet/devnet contracts, consolidate incentive fetching
  • Loading branch information
elliotsayes authored Feb 1, 2024
2 parents 4e6803e + 6aa8d97 commit fc9ec71
Show file tree
Hide file tree
Showing 12 changed files with 72 additions and 84 deletions.
38 changes: 30 additions & 8 deletions src/Root.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -29,37 +29,37 @@ export const Root = () => {
</span>
</a>
{
network == "devnet" &&
network == "mainnet" &&
<sup className='text-lg text-muted-foreground'>
&nbsp;dev
<TooltipProvider>
<Tooltip>
<TooltipTrigger>
<InfoIcon size={12} className="ml-0.5" />
<InfoIcon size={12} />
</TooltipTrigger>
<TooltipContent align="start" className="z-50 font-normal text-sm">
<span>On mainnet</span>
<a onClick={(e) => {
e.preventDefault()
setNetwork('mainnet')
setNetwork('testnet')
window.location.reload()
}} className="underline cursor-pointer flex flex-row items-baseline">
<span className="">Switch to mainnet</span><ArrowLeftRightIcon size={12} className='flex ml-0.5' />
<span className="">Switch to testnet</span><ArrowLeftRightIcon size={12} className='flex ml-0.5' />
</a>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</sup>
}
{
network == "mainnet" &&
network == "testnet" &&
<sup className='text-lg text-muted-foreground'>
&nbsp;test
<TooltipProvider>
<Tooltip>
<TooltipTrigger>
<InfoIcon size={12} />
<InfoIcon size={12} className="ml-0.5" />
</TooltipTrigger>
<TooltipContent align="start" className="z-50 font-normal text-sm">
<span>On mainnet</span>
<a onClick={(e) => {
e.preventDefault()
setNetwork('devnet')
Expand All @@ -72,6 +72,28 @@ export const Root = () => {
</TooltipProvider>
</sup>
}
{
network == "devnet" &&
<sup className='text-lg text-muted-foreground'>
&nbsp;dev
<TooltipProvider>
<Tooltip>
<TooltipTrigger>
<InfoIcon size={12} className="ml-0.5" />
</TooltipTrigger>
<TooltipContent align="start" className="z-50 font-normal text-sm">
<a onClick={(e) => {
e.preventDefault()
setNetwork('testnet')
window.location.reload()
}} className="underline cursor-pointer flex flex-row items-baseline">
<span className="">Switch to testnet</span><ArrowLeftRightIcon size={12} className='flex ml-0.5' />
</a>
</TooltipContent>
</Tooltip>
</TooltipProvider>
</sup>
}
</CardTitle>
{/* <CardDescription>List of all Gateways</CardDescription> */}
</CardHeader>
Expand Down
8 changes: 3 additions & 5 deletions src/components/GarTable.stories.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,12 +53,10 @@ export const MultipleItems: Story = {
},
};

import GatewayAddressRegistryCache from "../fixtures/GatewayAddressRegistryCache.json";
import IncentiveContract from "../fixtures/IncentiveContract.json";
import { extractGarItems } from "@/lib/convert";
import { zGatewayAddressRegistryCache } from "@/lib/gar/schema";
const garCache = zGatewayAddressRegistryCache.parse(
GatewayAddressRegistryCache
);
import { incentiveContractSchema } from "@/lib/incentive/schema";
const garCache = incentiveContractSchema.parse(IncentiveContract);
const items = extractGarItems(garCache);
export const ManyItems: Story = {
args: {
Expand Down
6 changes: 3 additions & 3 deletions src/components/GarTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -167,18 +167,18 @@ const columns: ColumnDef<z.infer<typeof zGatewayAddressRegistryItem>>[] = [
},
{
id: "Rewards",
accessorFn: (item) => item.incentiveInfo?.weights.normalizedCompositeWeight ?? 0,
accessorFn: (item) => item.weights.normalizedCompositeWeight ?? 0,
header: "Rewards",
cell: (cell) => {
const weight = cell.row.original.incentiveInfo?.weights.normalizedCompositeWeight;
const weight = cell.row.original.weights.normalizedCompositeWeight;
if (weight === undefined) return (
<div className="max-w-[16rem]"><span className="text-muted-foreground line-clamp-1">
---
</span></div>
)

return (
<IncentiveHoverCard incentiveInfo={cell.row.original.incentiveInfo!} />
<IncentiveHoverCard incentiveInfo={cell.row.original} />
)
}
},
Expand Down
12 changes: 5 additions & 7 deletions src/lib/convert.test.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,14 @@
import { expect, test } from "bun:test";
import GatewayAddressRegistryCache from "../fixtures/GatewayAddressRegistryCache.json";
import IncentiveContract from "../fixtures/IncentiveContract.json";
import { zGatewayAddressRegistryItem } from "../types";
import { extractGarItems } from "./convert";
import { z } from "zod";
import { zGatewayAddressRegistryCache } from "./gar/schema";
import { incentiveContractEndpointSchema } from "./incentive/schema";

test("convert GatewayAddressRegistryCache fixture", () => {
const garCache = zGatewayAddressRegistryCache.parse(
GatewayAddressRegistryCache
);
const garItems = extractGarItems(garCache);
expect(garItems.length).toEqual(Object.keys(garCache.gateways).length);
const garCache = incentiveContractEndpointSchema.parse(IncentiveContract);
const garItems = extractGarItems(garCache.result);
expect(garItems.length).toEqual(Object.keys(garCache.result).length);

const garItemsParsed = z
.array(zGatewayAddressRegistryItem)
Expand Down
22 changes: 3 additions & 19 deletions src/lib/convert.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,12 @@
import { zGatewayAddressRegistryItem } from "@/types";
import { z } from "zod";
import { linkFull, linkDisplay } from "./utils";
import {
incentiveContractSchema,
incentiveInfoSchema,
} from "./incentive/schema";
import { zGatewayAddressRegistryCache } from "./gar/schema";
import { incentiveContractSchema } from "./incentive/schema";

const extractGarItems = (
garCache: z.infer<typeof zGatewayAddressRegistryCache>,
incentiveContractData?: z.infer<typeof incentiveContractSchema>
garCacheWtihIncentiveContractData: z.infer<typeof incentiveContractSchema>
): Array<z.infer<typeof zGatewayAddressRegistryItem>> => {
const gatewayEntries = Object.entries(garCache.gateways);
const gatewayEntries = Object.entries(garCacheWtihIncentiveContractData);
return gatewayEntries.map(([txId, item]) => {
const fqdnIndex = gatewayEntries
.filter(([, matchItem]) => matchItem.settings.fqdn == item.settings.fqdn)
Expand All @@ -21,16 +16,6 @@ const extractGarItems = (
? item.settings.fqdn
: `${item.settings.fqdn}${`~${fqdnIndex}`}`;

let incentiveInfo: z.infer<typeof incentiveInfoSchema> | undefined;
// TODO: find a better way to match these up
const incentiveItem = incentiveContractData?.[txId];
if (incentiveItem) {
incentiveInfo = {
stats: incentiveItem.stats,
weights: incentiveItem.weights,
};
}

return {
id: txId,
fqdnKey: fqdnKey,
Expand All @@ -48,7 +33,6 @@ const extractGarItems = (
item.settings.port
),
...item,
incentiveInfo,
};
});
};
Expand Down
6 changes: 4 additions & 2 deletions src/lib/incentive/fetchIncentiveContractData.test.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { describe, it, expect } from "bun:test";
import { fetchIncentiveContractData } from "./fetchIncentiveContractData";
import { fetchGarCacheWithIncentiveContractData } from "./fetchIncentiveContractData";

describe("fetchIncentiveContractData", () => {
it("should fetch fetchIncentiveContractData from endpoint", async () => {
const observerInfo = await fetchIncentiveContractData();
const observerInfo = await fetchGarCacheWithIncentiveContractData(
"mainnet"
);

// console.log(observerInfo);

Expand Down
8 changes: 5 additions & 3 deletions src/lib/incentive/fetchIncentiveContractData.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
import { Network, networkConfigMap } from "../networks";
import { incentiveContractEndpointSchema } from "./schema";

export const fetchIncentiveContractData = async (network: Network) => {
const contractTxId = networkConfigMap[network].contractTxIds.incentive;
const endpoint = networkConfigMap[network].endpoints.incentive;
export const fetchGarCacheWithIncentiveContractData = async (
network: Network
) => {
const contractTxId = networkConfigMap[network].contractTxIds.garCache;
const endpoint = networkConfigMap[network].endpoints.garCache;
const contractEndpointData = await fetch(endpoint)
.then((res) => res.json())
.then((json) => incentiveContractEndpointSchema.parse(json));
Expand Down
2 changes: 1 addition & 1 deletion src/lib/incentive/schema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,6 @@ export const incentiveContractEndpointSchema = z.object({
contractTxId: zArweaveTxId,
result: incentiveContractSchema,
evaluationOptions: z.object({
sourceType: z.string(),
sourceType: z.string().optional(),
}),
});
20 changes: 10 additions & 10 deletions src/lib/networks.ts
Original file line number Diff line number Diff line change
@@ -1,31 +1,31 @@
export const networks = ["mainnet", "devnet"] as const;
export const defaultNetwork: Network = "mainnet";
export const networks = ["mainnet", "testnet", "devnet"] as const;
export const defaultNetwork: Network = "testnet";

export type Network = (typeof networks)[number];

type ContractTxIdConfig = {
garCache: string;
incentive: string;
};

export const contractTxIdMap: Record<Network, ContractTxIdConfig> = {
mainnet: {
garCache: "bLAgYxAdX2Ry-nt6aH2ixgvJXbpsEYm28NgJgyqfs-U",
incentive: "_NctcA2sRy1-J4OmIQZbYFPM17piNcbdBPH2ncX2RL8",
},
devnet: {
testnet: {
garCache: "bLAgYxAdX2Ry-nt6aH2ixgvJXbpsEYm28NgJgyqfs-U",
incentive: "_NctcA2sRy1-J4OmIQZbYFPM17piNcbdBPH2ncX2RL8",
},
devnet: {
garCache: "_NctcA2sRy1-J4OmIQZbYFPM17piNcbdBPH2ncX2RL8",
},
};

type EndpointConfig = {
garCache: string;
incentive: string;
};

const subdomainMap: Record<Network, string> = {
mainnet: "api",
testnet: "api",
devnet: "dev",
};

Expand All @@ -45,10 +45,9 @@ type NetworkConfig = {
const configBuilder = (network: Network): NetworkConfig => {
const contractTxIds = contractTxIdMap[network];
const endpoints = {
garCache: endpointBuilder(network, contractTxIds.garCache, "/gateways"),
incentive: endpointBuilder(
garCache: endpointBuilder(
network,
contractTxIds.incentive,
contractTxIds.garCache,
"/read/gateways"
),
};
Expand All @@ -57,5 +56,6 @@ const configBuilder = (network: Network): NetworkConfig => {

export const networkConfigMap: Record<Network, NetworkConfig> = {
mainnet: configBuilder("mainnet"),
testnet: configBuilder("testnet"),
devnet: configBuilder("devnet"),
};
13 changes: 5 additions & 8 deletions src/lib/query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,19 @@ import {
downloadReportInfoForTransaction,
querySingleTransaction,
} from "./observer/downloadObservation";
import { fetchIncentiveContractData } from "./incentive/fetchIncentiveContractData";
import { zGatewayAddressRegistryCache } from "./gar/schema";
import { Network, networkConfigMap } from "./networks";
import { fetchGarCacheWithIncentiveContractData } from "./incentive/fetchIncentiveContractData";
import { Network } from "./networks";

export const queryClient = new QueryClient();

export const garQueryBuilder = (network: Network) =>
queryOptions({
queryKey: ["gar", network],
queryFn: async () => {
const garCache = await fetch(networkConfigMap[network].endpoints.garCache)
.then((res) => res.json())
.then((json) => zGatewayAddressRegistryCache.parse(json));
const incentiveContractData = await fetchIncentiveContractData(network);
const garCacheWtihIncentiveContractData =
await fetchGarCacheWithIncentiveContractData(network);

const garItems = extractGarItems(garCache, incentiveContractData);
const garItems = extractGarItems(garCacheWtihIncentiveContractData);
garItems.sort((a, b) => a.fqdnKey.localeCompare(b.fqdnKey));
return garItems;
},
Expand Down
10 changes: 0 additions & 10 deletions src/types.test.ts

This file was deleted.

11 changes: 3 additions & 8 deletions src/types.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
import { z } from "zod";
import { incentiveInfoSchema } from "./lib/incentive/schema";
import {
zArioObservation,
zArweaveTxId,
zGatewayAddressRegistryItemData,
} from "./lib/gar/schema";
import { incentiveContractItemSchema } from "./lib/incentive/schema";
import { zArioObservation, zArweaveTxId } from "./lib/gar/schema";

export const zGatewayAddressRegistryItem = z.intersection(
z.object({
Expand Down Expand Up @@ -39,9 +35,8 @@ export const zGatewayAddressRegistryItem = z.intersection(
result: zArioObservation,
}),
]),
incentiveInfo: incentiveInfoSchema.optional(),
}),
zGatewayAddressRegistryItemData
incentiveContractItemSchema
);

export const zGatewayObserverInfo = z.object({
Expand Down

0 comments on commit fc9ec71

Please sign in to comment.