Skip to content

Commit bfac925

Browse files
committed
fix: add provider URL to SIWE signature verification
1 parent 8db03dd commit bfac925

File tree

3 files changed

+46
-20
lines changed

3 files changed

+46
-20
lines changed

web/netlify/functions/authUser.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
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

78
import { ETH_SIGNATURE_REGEX, DEFAULT_CHAIN } from "consts/processEnvConsts";
89

10+
import { getDefaultChainRpcUrl } from "src/context/Web3Provider";
911
import { netlifyUri, netlifyDeployUri, netlifyDeployPrimeUri } from "src/generatedNetlifyInfo.json";
1012
import { Database } from "src/types/supabase-notification";
1113

@@ -73,7 +75,9 @@ const authUser = async (event) => {
7375
}
7476

7577
try {
76-
await siweMessage.verify({ signature, nonce: nonceData.nonce, time: new Date().toISOString() });
78+
const rpcUrl = getDefaultChainRpcUrl("https");
79+
const provider = new ethers.providers.JsonRpcProvider(rpcUrl);
80+
await siweMessage.verify({ signature, nonce: nonceData.nonce, time: new Date().toISOString() }, { provider });
7781
} catch (err) {
7882
throw new Error("Invalid signer: " + JSON.stringify(err));
7983
}

web/src/consts/chains.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
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> = {
1315
[gnosisChiado.id]: gnosisChiado,
16+
[gnosis.id]: gnosis,
1417
[mainnet.id]: mainnet,
1518
};
1619

web/src/context/Web3Provider.tsx

+37-18
Original file line numberDiff line numberDiff line change
@@ -3,34 +3,53 @@ 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

19-
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")]),
25+
// https://github.com/alchemyplatform/alchemy-sdk-js/blob/96b3f62/src/util/const.ts#L16-L18
26+
const alchemyURL = (protocol: "https" | "wss", chainId: number) =>
27+
`${protocol}://${alchemyToViemChain[chainId]}.g.alchemy.com/v2/${alchemyApiKey}`;
28+
29+
export const getDefaultChainRpcUrl = (protocol: "https" | "wss") => {
30+
return alchemyURL(protocol, DEFAULT_CHAIN);
3231
};
3332

33+
export const getTransports = () => {
34+
const alchemyTransport = (chain: Chain) =>
35+
fallback([http(alchemyURL("https", chain.id)), webSocket(alchemyURL("wss", chain.id))]);
36+
const defaultTransport = (chain: Chain) =>
37+
fallback([http(chain.rpcUrls.default?.http?.[0]), webSocket(chain.rpcUrls.default?.webSocket?.[0])]);
38+
39+
return {
40+
[isProduction ? arbitrum.id : arbitrumSepolia.id]: isProduction
41+
? alchemyTransport(arbitrum)
42+
: alchemyTransport(arbitrumSepolia),
43+
[isProduction ? gnosis.id : gnosisChiado.id]: isProduction
44+
? defaultTransport(gnosis)
45+
: defaultTransport(gnosisChiado),
46+
[mainnet.id]: alchemyTransport(mainnet), // Always enabled for ENS resolution
47+
};
48+
};
49+
50+
const chains = ALL_CHAINS as [Chain, ...Chain[]];
51+
const transports = getTransports();
52+
const projectId = import.meta.env.WALLETCONNECT_PROJECT_ID ?? "";
3453
const wagmiConfig = createConfig({
3554
chains,
3655
transports,

0 commit comments

Comments
 (0)