Skip to content

Commit c99ea3a

Browse files
authored
Merge branch 'dev' into feat/case-dev-buttons
2 parents 037bc7f + 4c82235 commit c99ea3a

File tree

9 files changed

+73
-28
lines changed

9 files changed

+73
-28
lines changed

web/netlify/functions/authUser.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
11
import middy from "@middy/core";
22
import jsonBodyParser from "@middy/http-json-body-parser";
33
import { createClient } from "@supabase/supabase-js";
4+
import { ethers } from "ethers";
45
import * as jwt from "jose";
56
import { SiweMessage } from "siwe";
67

7-
import { ETH_SIGNATURE_REGEX, DEFAULT_CHAIN } from "consts/processEnvConsts";
8+
import { ETH_SIGNATURE_REGEX, DEFAULT_CHAIN, isProductionDeployment } from "consts/processEnvConsts";
89

910
import { netlifyUri, netlifyDeployUri, netlifyDeployPrimeUri } from "src/generatedNetlifyInfo.json";
1011
import { Database } from "src/types/supabase-notification";
@@ -73,9 +74,14 @@ const authUser = async (event) => {
7374
}
7475

7576
try {
76-
await siweMessage.verify({ signature, nonce: nonceData.nonce, time: new Date().toISOString() });
77+
// If the main Alchemy API key is permissioned, it won't work in a Netlify Function so we use a dedicated API key
78+
const alchemyApiKey = process.env.ALCHEMY_FUNCTIONS_API_KEY ?? process.env.ALCHEMY_API_KEY;
79+
const alchemyChain = isProductionDeployment() ? "arb-mainnet" : "arb-sepolia";
80+
const alchemyRpcURL = `https://${alchemyChain}.g.alchemy.com/v2/${alchemyApiKey}`;
81+
const provider = new ethers.providers.JsonRpcProvider(alchemyRpcURL);
82+
await siweMessage.verify({ signature, nonce: nonceData.nonce, time: new Date().toISOString() }, { provider });
7783
} catch (err) {
78-
throw new Error("Invalid signer");
84+
throw new Error("Invalid signer: " + JSON.stringify(err));
7985
}
8086

8187
const { error } = await supabase.from("user-nonce").delete().match({ address: lowerCaseAddress });

web/src/consts/chains.ts

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
import { extractChain } from "viem";
2-
import { Chain, arbitrum, mainnet, arbitrumSepolia, gnosisChiado } from "viem/chains";
2+
import { Chain, arbitrum, mainnet, arbitrumSepolia, gnosis, gnosisChiado } from "viem/chains";
33

44
import { isProductionDeployment } from "./index";
55

66
export const DEFAULT_CHAIN = isProductionDeployment() ? arbitrum.id : arbitrumSepolia.id;
77

8+
// Read/Write
89
export const SUPPORTED_CHAINS: Record<number, Chain> = {
910
[isProductionDeployment() ? arbitrum.id : arbitrumSepolia.id]: isProductionDeployment() ? arbitrum : arbitrumSepolia,
1011
};
1112

13+
// Read Only
1214
export const QUERY_CHAINS: Record<number, Chain> = {
13-
[gnosisChiado.id]: gnosisChiado,
15+
[isProductionDeployment() ? gnosis.id : gnosisChiado.id]: isProductionDeployment() ? gnosis : gnosisChiado,
1416
[mainnet.id]: mainnet,
1517
};
1618

web/src/context/Web3Provider.tsx

Lines changed: 42 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,59 @@ import React from "react";
33
import { createWeb3Modal } from "@web3modal/wagmi/react";
44
import { type Chain } from "viem";
55
import { createConfig, fallback, http, WagmiProvider, webSocket } from "wagmi";
6-
import { mainnet, arbitrumSepolia, arbitrum, gnosisChiado } from "wagmi/chains";
6+
import { mainnet, arbitrumSepolia, arbitrum, gnosisChiado, gnosis, sepolia } from "wagmi/chains";
77
import { walletConnect } from "wagmi/connectors";
88

9-
import { ALL_CHAINS } from "consts/chains";
9+
import { ALL_CHAINS, DEFAULT_CHAIN } from "consts/chains";
1010
import { isProductionDeployment } from "consts/index";
1111

1212
import { lightTheme } from "styles/themes";
1313

14-
const projectId = import.meta.env.WALLETCONNECT_PROJECT_ID ?? "";
15-
export const alchemyApiKey = import.meta.env.ALCHEMY_API_KEY ?? "";
14+
const alchemyApiKey = import.meta.env.ALCHEMY_API_KEY ?? "";
15+
const isProduction = isProductionDeployment();
1616

17-
const chains = ALL_CHAINS as [Chain, ...Chain[]];
17+
// https://github.com/alchemyplatform/alchemy-sdk-js/blob/96b3f62/src/types/types.ts#L98-L119
18+
const alchemyToViemChain = {
19+
[arbitrum.id]: "arb-mainnet",
20+
[arbitrumSepolia.id]: "arb-sepolia",
21+
[mainnet.id]: "eth-mainnet",
22+
[sepolia.id]: "eth-sepolia",
23+
};
1824

1925
type AlchemyProtocol = "https" | "wss";
20-
type AlchemyChain = "arb-sepolia" | "eth-mainnet" | "arb";
21-
const alchemyURL = (protocol: AlchemyProtocol, chain: AlchemyChain) =>
22-
`${protocol}://${chain}.g.alchemy.com/v2/${alchemyApiKey}`;
23-
const alchemyTransport = (chain: AlchemyChain) =>
24-
fallback([webSocket(alchemyURL("wss", chain)), http(alchemyURL("https", chain))]);
25-
26-
const transports = {
27-
[isProductionDeployment() ? arbitrum.id : arbitrumSepolia.id]: isProductionDeployment()
28-
? alchemyTransport("arb")
29-
: alchemyTransport("arb-sepolia"),
30-
[mainnet.id]: alchemyTransport("eth-mainnet"),
31-
[gnosisChiado.id]: fallback([webSocket("wss://rpc.chiadochain.net/wss"), http("https://rpc.chiadochain.net")]),
26+
27+
// https://github.com/alchemyplatform/alchemy-sdk-js/blob/96b3f62/src/util/const.ts#L16-L18
28+
const alchemyURL = (protocol: AlchemyProtocol, chainId: number) =>
29+
`${protocol}://${alchemyToViemChain[chainId]}.g.alchemy.com/v2/${alchemyApiKey}`;
30+
31+
export const getChainRpcUrl = (protocol: AlchemyProtocol, chainId: number) => {
32+
return alchemyURL(protocol, chainId);
33+
};
34+
35+
export const getDefaultChainRpcUrl = (protocol: AlchemyProtocol) => {
36+
return getChainRpcUrl(protocol, DEFAULT_CHAIN);
37+
};
38+
39+
export const getTransports = () => {
40+
const alchemyTransport = (chain: Chain) =>
41+
fallback([http(alchemyURL("https", chain.id)), webSocket(alchemyURL("wss", chain.id))]);
42+
const defaultTransport = (chain: Chain) =>
43+
fallback([http(chain.rpcUrls.default?.http?.[0]), webSocket(chain.rpcUrls.default?.webSocket?.[0])]);
44+
45+
return {
46+
[isProduction ? arbitrum.id : arbitrumSepolia.id]: isProduction
47+
? alchemyTransport(arbitrum)
48+
: alchemyTransport(arbitrumSepolia),
49+
[isProduction ? gnosis.id : gnosisChiado.id]: isProduction
50+
? defaultTransport(gnosis)
51+
: defaultTransport(gnosisChiado),
52+
[mainnet.id]: alchemyTransport(mainnet), // Always enabled for ENS resolution
53+
};
3254
};
3355

56+
const chains = ALL_CHAINS as [Chain, ...Chain[]];
57+
const transports = getTransports();
58+
const projectId = import.meta.env.WALLETCONNECT_PROJECT_ID ?? "";
3459
const wagmiConfig = createConfig({
3560
chains,
3661
transports,

web/src/hooks/queries/useClassicAppealQuery.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useQuery } from "@tanstack/react-query";
22

3+
import { REFETCH_INTERVAL } from "consts/index";
34
import { useGraphqlBatcher } from "context/GraphqlBatcher";
45

56
import { graphql } from "src/graphql";
@@ -38,8 +39,9 @@ export const useClassicAppealQuery = (id?: string | number) => {
3839
const { graphqlBatcher } = useGraphqlBatcher();
3940

4041
return useQuery<ClassicAppealQuery>({
41-
queryKey: ["refetchOnBlock", `classicAppealQuery${id}`],
42+
queryKey: [`classicAppealQuery${id}`],
4243
enabled: isEnabled,
44+
refetchInterval: REFETCH_INTERVAL,
4345
queryFn: async () =>
4446
isEnabled
4547
? await graphqlBatcher.fetch({

web/src/hooks/queries/useCourtDetails.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useQuery } from "@tanstack/react-query";
22

3+
import { REFETCH_INTERVAL } from "consts/index";
34
import { useGraphqlBatcher } from "context/GraphqlBatcher";
45

56
import { graphql } from "src/graphql";
@@ -29,8 +30,9 @@ export const useCourtDetails = (id?: string) => {
2930
const { graphqlBatcher } = useGraphqlBatcher();
3031

3132
return useQuery<CourtDetailsQuery>({
32-
queryKey: ["refetchOnBlock", `courtDetails${id}`],
33+
queryKey: [`courtDetails${id}`],
3334
enabled: isEnabled,
35+
refetchInterval: REFETCH_INTERVAL,
3436
queryFn: async () =>
3537
await graphqlBatcher.fetch({ id: crypto.randomUUID(), document: courtDetailsQuery, variables: { id } }),
3638
});

web/src/hooks/queries/useDisputeDetailsQuery.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useQuery } from "@tanstack/react-query";
22

3+
import { REFETCH_INTERVAL } from "consts/index";
34
import { useGraphqlBatcher } from "context/GraphqlBatcher";
45

56
import { graphql } from "src/graphql";
@@ -38,8 +39,9 @@ export const useDisputeDetailsQuery = (id?: string | number) => {
3839
const { graphqlBatcher } = useGraphqlBatcher();
3940

4041
return useQuery<DisputeDetailsQuery>({
41-
queryKey: ["refetchOnBlock", `disputeDetailsQuery${id}`],
42+
queryKey: [`disputeDetailsQuery${id}`],
4243
enabled: isEnabled,
44+
refetchInterval: REFETCH_INTERVAL,
4345
queryFn: async () =>
4446
await graphqlBatcher.fetch({
4547
id: crypto.randomUUID(),

web/src/hooks/queries/useEvidences.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useQuery } from "@tanstack/react-query";
22

3+
import { REFETCH_INTERVAL } from "consts/index";
34
import { useGraphqlBatcher } from "context/GraphqlBatcher";
45

56
import { graphql } from "src/graphql";
@@ -24,8 +25,9 @@ export const useEvidences = (evidenceGroup?: string) => {
2425
const { graphqlBatcher } = useGraphqlBatcher();
2526

2627
return useQuery({
27-
queryKey: ["refetchOnBlock", `evidencesQuery${evidenceGroup}`],
28+
queryKey: [`evidencesQuery${evidenceGroup}`],
2829
enabled: isEnabled,
30+
refetchInterval: REFETCH_INTERVAL,
2931
queryFn: async () =>
3032
await graphqlBatcher.fetch({
3133
id: crypto.randomUUID(),

web/src/hooks/queries/useJurorStakeDetailsQuery.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useQuery } from "@tanstack/react-query";
22

3+
import { REFETCH_INTERVAL } from "consts/index";
34
import { useGraphqlBatcher } from "context/GraphqlBatcher";
45

56
import { graphql } from "src/graphql";
@@ -24,8 +25,9 @@ export const useJurorStakeDetailsQuery = (userId?: string) => {
2425
const { graphqlBatcher } = useGraphqlBatcher();
2526

2627
return useQuery<JurorStakeDetailsQuery>({
27-
queryKey: ["refetchOnBlock", `jurorStakeDetails${userId}`],
28+
queryKey: [`jurorStakeDetails${userId}`],
2829
enabled: isEnabled,
30+
refetchInterval: REFETCH_INTERVAL,
2931
queryFn: async () =>
3032
await graphqlBatcher.fetch({ id: crypto.randomUUID(), document: jurorStakeDetailsQuery, variables: { userId } }),
3133
});

web/src/hooks/queries/useVotingHistory.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { useQuery } from "@tanstack/react-query";
22

3+
import { REFETCH_INTERVAL } from "consts/index";
34
import { useGraphqlBatcher } from "context/GraphqlBatcher";
45

56
import { graphql } from "src/graphql";
@@ -49,8 +50,9 @@ export const useVotingHistory = (disputeID?: string) => {
4950
const { graphqlBatcher } = useGraphqlBatcher();
5051

5152
return useQuery<VotingHistoryQuery>({
52-
queryKey: ["refetchOnBlock", `VotingHistory${disputeID}`],
53+
queryKey: [`VotingHistory${disputeID}`],
5354
enabled: isEnabled,
55+
refetchInterval: REFETCH_INTERVAL,
5456
queryFn: async () =>
5557
await graphqlBatcher.fetch({ id: crypto.randomUUID(), document: votingHistoryQuery, variables: { disputeID } }),
5658
});

0 commit comments

Comments
 (0)