Skip to content

Commit b3669b8

Browse files
authored
Merge pull request #56 from kleros/chore/migrate-wagmi-v1-to-v2
Chore/migrate wagmi v1 to v2
2 parents d8f9d60 + 73236a5 commit b3669b8

File tree

31 files changed

+1925
-643
lines changed

31 files changed

+1925
-643
lines changed

web/netlify/functions/authUser.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@ import { createClient } from "@supabase/supabase-js";
44
import * as jwt from "jose";
55
import { SiweMessage } from "siwe";
66

7-
import { DEFAULT_CHAIN } from "consts/chains";
8-
import { ETH_SIGNATURE_REGEX } from "consts/index";
9-
107
import { netlifyUri, netlifyDeployUri, netlifyDeployPrimeUri } from "src/generatedNetlifyInfo.json";
118
import { Database } from "src/types/supabase-notification";
9+
import { ethers } from "ethers";
10+
import { ETH_SIGNATURE_REGEX, isProductionDeployment, DEFAULT_CHAIN } from "consts/processEnvConst";
1211

1312
const authUser = async (event) => {
1413
try {
@@ -74,9 +73,14 @@ const authUser = async (event) => {
7473
}
7574

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

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

web/netlify/functions/getNonce.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import middy from "@middy/core";
22
import { createClient } from "@supabase/supabase-js";
33
import { generateNonce } from "siwe";
44

5-
import { ETH_ADDRESS_REGEX } from "src/consts";
5+
import { ETH_ADDRESS_REGEX } from "consts/processEnvConst";
66

77
import { Database } from "../../src/types/supabase-notification";
88

web/netlify/functions/update-settings.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import middy from "@middy/core";
22
import jsonBodyParser from "@middy/http-json-body-parser";
33
import { createClient } from "@supabase/supabase-js";
44

5-
import { EMAIL_REGEX, TELEGRAM_REGEX, ETH_ADDRESS_REGEX } from "../../src/consts/index";
5+
import { EMAIL_REGEX, TELEGRAM_REGEX, ETH_ADDRESS_REGEX } from "consts/processEnvConst";
66
import { Database } from "../../src/types/supabase-notification";
77
import { authMiddleware } from "../middleware/authMiddleware";
88

web/package.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@
5858
"@typescript-eslint/eslint-plugin": "^5.62.0",
5959
"@typescript-eslint/parser": "^5.62.0",
6060
"@typescript-eslint/utils": "^5.62.0",
61-
"@wagmi/cli": "^1.5.2",
61+
"@wagmi/cli": "^2.1.15",
6262
"eslint": "^8.56.0",
6363
"eslint-config-prettier": "^8.10.0",
6464
"eslint-plugin-react": "^7.33.2",
@@ -83,6 +83,7 @@
8383
"@tanstack/react-query": "^4.28.0",
8484
"@web3modal/ethereum": "^2.7.1",
8585
"@web3modal/react": "^2.2.2",
86+
"@web3modal/wagmi": "^5.1.6",
8687
"@yornaath/batshit": "^0.9.0",
8788
"amqplib": "^0.10.3",
8889
"chart.js": "^3.9.1",
@@ -112,7 +113,7 @@
112113
"siwe": "^2.3.2",
113114
"styled-components": "^5.3.11",
114115
"subgraph-status": "^1.2.3",
115-
"viem": "^1.21.4",
116-
"wagmi": "^1.4.13"
116+
"viem": "^2.21.2",
117+
"wagmi": "^2.12.8"
117118
}
118119
}

web/src/app.tsx

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import Web3Provider from "context/Web3Provider";
77
import IsListViewProvider from "context/IsListViewProvider";
88
import QueryClientProvider from "context/QueryClientProvider";
99
import StyledComponentsProvider from "context/StyledComponentsProvider";
10-
import RefetchOnBlock from "context/RefetchOnBlock";
1110
import Layout from "layout/index";
1211
import Home from "./pages/Home";
1312
import AllLists from "./pages/AllLists";
@@ -21,10 +20,9 @@ import { SubmitListProvider } from "./context/SubmitListContext";
2120
const App: React.FC = () => {
2221
return (
2322
<StyledComponentsProvider>
24-
<QueryClientProvider>
25-
<RefetchOnBlock />
23+
<Web3Provider>
2624
<GraphqlBatcherProvider>
27-
<Web3Provider>
25+
<QueryClientProvider>
2826
<IsListViewProvider>
2927
<SubmitListProvider>
3028
<SubmitItemProvider>
@@ -47,9 +45,9 @@ const App: React.FC = () => {
4745
</SubmitItemProvider>
4846
</SubmitListProvider>
4947
</IsListViewProvider>
50-
</Web3Provider>
48+
</QueryClientProvider>
5149
</GraphqlBatcherProvider>
52-
</QueryClientProvider>
50+
</Web3Provider>
5351
</StyledComponentsProvider>
5452
);
5553
};

web/src/components/ActionButton/ExecuteButton.tsx

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@ import { Button } from "@kleros/ui-components-library";
22
import React, { useState } from "react";
33
import { Address } from "viem";
44
import { usePublicClient } from "wagmi";
5-
import { useCurateV2ExecuteRequest, usePrepareCurateV2ExecuteRequest } from "hooks/contracts/generated";
65
import { wrapWithToast } from "utils/wrapWithToast";
76
import { EnsureChain } from "../EnsureChain";
7+
import { useSimulateCurateV2ExecuteRequest, useWriteCurateV2ExecuteRequest } from "hooks/useContract";
88

99
interface IExecuteButton {
1010
registryAddress: Address;
@@ -17,28 +17,21 @@ const ExecuteButton: React.FC<IExecuteButton> = ({ registryAddress, itemId, refe
1717
const [isExecuting, setIsExecuting] = useState(false);
1818

1919
const {
20-
config,
20+
data: config,
2121
isError,
2222
isLoading: isPreparingConfig,
23-
//@ts-ignore
24-
} = usePrepareCurateV2ExecuteRequest({ address: registryAddress, args: [itemId as `0x${string}`] });
25-
const { writeAsync: executeRequest, isLoading } = useCurateV2ExecuteRequest(config);
23+
} = useSimulateCurateV2ExecuteRequest({ address: registryAddress, args: [itemId as `0x${string}`] });
24+
const { writeContractAsync: executeRequest, isLoading } = useWriteCurateV2ExecuteRequest();
2625
return (
2726
<EnsureChain>
2827
<Button
2928
text="Execute"
3029
disabled={isLoading || isError || isExecuting || isPreparingConfig || disabled}
3130
isLoading={isLoading || isExecuting}
3231
onClick={() => {
33-
if (!executeRequest) return;
32+
if (!executeRequest || !config || !publicClient) return;
3433
setIsExecuting(true);
35-
wrapWithToast(
36-
async () =>
37-
await executeRequest().then((response) => {
38-
return response.hash;
39-
}),
40-
publicClient
41-
)
34+
wrapWithToast(async () => await executeRequest(config.request), publicClient)
4235
.then(() => refetch())
4336
.catch(() => {})
4437
.finally(() => setIsExecuting(false));

web/src/components/ActionButton/Modal/ChallengeItemModal.tsx

Lines changed: 15 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,20 @@ import Header from "./Header";
44
import Buttons from "./Buttons";
55
import DepositRequired from "./DepositRequired";
66
import Info from "./Info";
7-
import {
8-
useCurateV2ChallengeRequest,
9-
useCurateV2GetArbitratorExtraData,
10-
useCurateV2RemovalChallengeBaseDeposit,
11-
useCurateV2SubmissionChallengeBaseDeposit,
12-
usePrepareCurateV2ChallengeRequest,
13-
} from "hooks/contracts/generated";
147
import { useArbitrationCost } from "hooks/useArbitrationCostFromKlerosCore";
158
import { useAccount, useBalance, usePublicClient } from "wagmi";
169
import { wrapWithToast } from "utils/wrapWithToast";
1710
import { IBaseModal } from ".";
1811
import EvidenceUpload, { Evidence } from "./EvidenceUpload";
1912
import Modal from "components/Modal";
2013
import { isUndefined } from "src/utils";
14+
import {
15+
useReadCurateV2GetArbitratorExtraData,
16+
useReadCurateV2RemovalChallengeBaseDeposit,
17+
useReadCurateV2SubmissionChallengeBaseDeposit,
18+
useSimulateCurateV2ChallengeRequest,
19+
useWriteCurateV2ChallengeRequest,
20+
} from "hooks/useContract";
2121

2222
const ReStyledModal = styled(Modal)`
2323
gap: 32px;
@@ -54,18 +54,15 @@ const ChallengeItemModal: React.FC<IChallengeItemModal> = ({
5454

5555
const { data: userBalance, isLoading: isBalanceLoading } = useBalance({ address });
5656

57-
const { data: arbitratorExtraData, isLoading: isLoadingExtradata } = useCurateV2GetArbitratorExtraData({
58-
// @ts-ignore
57+
const { data: arbitratorExtraData, isLoading: isLoadingExtradata } = useReadCurateV2GetArbitratorExtraData({
5958
address: registryAddress,
6059
});
6160

6261
const { data: submissionChallengeDeposit, isLoading: isSubmissionChallengeDepositLoading } =
63-
//@ts-ignore
64-
useCurateV2SubmissionChallengeBaseDeposit({ address: registryAddress });
62+
useReadCurateV2SubmissionChallengeBaseDeposit({ address: registryAddress });
6563

6664
const { data: removalChallengeDeposit, isLoading: isRemovalChallengeDepositLoading } =
67-
useCurateV2RemovalChallengeBaseDeposit({
68-
//@ts-ignore
65+
useReadCurateV2RemovalChallengeBaseDeposit({
6966
address: registryAddress,
7067
});
7168

@@ -86,16 +83,14 @@ const ChallengeItemModal: React.FC<IChallengeItemModal> = ({
8683
return userBalance?.value < depositRequired;
8784
}, [depositRequired, userBalance, isEvidenceUploading, isEvidenceValid]);
8885

89-
const { config } = usePrepareCurateV2ChallengeRequest({
90-
enabled: !isUndefined(itemId) && !isUndefined(evidence) && !isDisabled,
91-
//@ts-ignore
86+
const { data: config } = useSimulateCurateV2ChallengeRequest({
87+
query: { enabled: !isUndefined(itemId) && !isUndefined(evidence) && !isDisabled },
9288
address: registryAddress,
93-
functionName: "challengeRequest",
9489
args: [itemId as `0x${string}`, JSON.stringify(evidence)],
9590
value: depositRequired,
9691
});
9792

98-
const { writeAsync: challengeRequest } = useCurateV2ChallengeRequest(config);
93+
const { writeContractAsync: challengeRequest } = useWriteCurateV2ChallengeRequest();
9994

10095
const isLoading = useMemo(
10196
() =>
@@ -129,9 +124,9 @@ const ChallengeItemModal: React.FC<IChallengeItemModal> = ({
129124
isDisabled={isDisabled || isChallengingItem}
130125
isLoading={isLoading}
131126
callback={() => {
132-
if (challengeRequest) {
127+
if (challengeRequest && publicClient && config) {
133128
setIsChallengingItem(true);
134-
wrapWithToast(async () => await challengeRequest().then((response) => response.hash), publicClient)
129+
wrapWithToast(async () => await challengeRequest(config.request), publicClient)
135130
.then(() => {
136131
refetch();
137132
toggleModal();

web/src/components/ActionButton/Modal/RemoveModal.tsx

Lines changed: 13 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,17 @@ import DepositRequired from "./DepositRequired";
66
import Info from "./Info";
77
import { IBaseModal } from ".";
88
import { useAccount, useBalance, usePublicClient } from "wagmi";
9-
import {
10-
useCurateV2GetArbitratorExtraData,
11-
useCurateV2RemovalBaseDeposit,
12-
useCurateV2RemoveItem,
13-
usePrepareCurateV2RemoveItem,
14-
} from "hooks/contracts/generated";
159
import { useArbitrationCost } from "hooks/useArbitrationCostFromKlerosCore";
1610
import { wrapWithToast } from "utils/wrapWithToast";
1711
import EvidenceUpload, { Evidence } from "./EvidenceUpload";
18-
import { uploadFileToIPFS } from "utils/uploadFileToIPFS";
1912
import Modal from "components/Modal";
2013
import { isUndefined } from "src/utils";
14+
import {
15+
useReadCurateV2GetArbitratorExtraData,
16+
useReadCurateV2RemovalBaseDeposit,
17+
useSimulateCurateV2RemoveItem,
18+
useWriteCurateV2RemoveItem,
19+
} from "hooks/useContract";
2120

2221
const ReStyledModal = styled(Modal)`
2322
gap: 32px;
@@ -41,13 +40,11 @@ const RemoveModal: React.FC<IRemoveModal> = ({ toggleModal, isItem, registryAddr
4140

4241
const { data: userBalance, isLoading: isBalanceLoading } = useBalance({ address });
4342

44-
const { data: arbitratorExtraData, isLoading: isLoadingExtradata } = useCurateV2GetArbitratorExtraData({
45-
//@ts-ignore
43+
const { data: arbitratorExtraData, isLoading: isLoadingExtradata } = useReadCurateV2GetArbitratorExtraData({
4644
address: registryAddress,
4745
});
4846

49-
const { data: removalDeposit, isLoading: isRemovalDepositLoading } = useCurateV2RemovalBaseDeposit({
50-
//@ts-ignore
47+
const { data: removalDeposit, isLoading: isRemovalDepositLoading } = useReadCurateV2RemovalBaseDeposit({
5148
address: registryAddress,
5249
});
5350

@@ -65,16 +62,14 @@ const RemoveModal: React.FC<IRemoveModal> = ({ toggleModal, isItem, registryAddr
6562
return userBalance?.value < depositRequired;
6663
}, [depositRequired, userBalance, isEvidenceUploading, isEvidenceValid]);
6764

68-
const { config } = usePrepareCurateV2RemoveItem({
69-
enabled: !isDisabled || !isUndefined(evidence),
70-
//@ts-ignore
65+
const { data: config } = useSimulateCurateV2RemoveItem({
66+
query: { enabled: !isDisabled && !isUndefined(evidence) },
7167
address: registryAddress,
72-
functionName: "removeItem",
7368
args: [itemId as `0x${string}`, JSON.stringify(evidence)],
7469
value: depositRequired,
7570
});
7671

77-
const { writeAsync: removeItem } = useCurateV2RemoveItem(config);
72+
const { writeContractAsync: removeItem } = useWriteCurateV2RemoveItem();
7873
const isLoading = useMemo(
7974
() =>
8075
isBalanceLoading ||
@@ -105,9 +100,9 @@ const RemoveModal: React.FC<IRemoveModal> = ({ toggleModal, isItem, registryAddr
105100
isDisabled={isDisabled || isRemovingItem}
106101
isLoading={isLoading}
107102
callback={() => {
108-
if (removeItem) {
103+
if (removeItem && publicClient && config) {
109104
setIsRemovingItem(true);
110-
wrapWithToast(async () => await removeItem().then((response) => response.hash), publicClient)
105+
wrapWithToast(async () => await removeItem(config.request), publicClient)
111106
.then((res) => {
112107
refetch();
113108
toggleModal();

web/src/components/ActionButton/Modal/ResubmitModal.tsx

Lines changed: 15 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@ import DepositRequired from "./DepositRequired";
66
import Info from "./Info";
77
import { IBaseModal } from ".";
88
import { useAccount, useBalance, usePublicClient } from "wagmi";
9-
import {
10-
useCurateV2AddItem,
11-
useCurateV2GetArbitratorExtraData,
12-
useCurateV2SubmissionBaseDeposit,
13-
usePrepareCurateV2AddItem,
14-
} from "hooks/contracts/generated";
159
import { useArbitrationCost } from "hooks/useArbitrationCostFromKlerosCore";
1610
import { wrapWithToast } from "utils/wrapWithToast";
1711
import { useItemDetailsQuery } from "hooks/queries/useItemDetailsQuery";
1812
import Modal from "components/Modal";
13+
import {
14+
useReadCurateV2GetArbitratorExtraData,
15+
useReadCurateV2SubmissionBaseDeposit,
16+
useSimulateCurateV2AddItem,
17+
useWriteCurateV2AddItem,
18+
} from "hooks/useContract";
1919

2020
const ReStyledModal = styled(Modal)`
2121
gap: 32px;
@@ -36,13 +36,11 @@ const ResubmitModal: React.FC<ISubmitModal> = ({ toggleModal, isItem, registryAd
3636
const { data: userBalance, isLoading: isBalanceLoading } = useBalance({ address });
3737
const { data: itemData, isLoading: isItemDataLoading } = useItemDetailsQuery(`${itemId}@${registryAddress}`);
3838

39-
const { data: arbitratorExtraData, isLoading: isLoadingExtradata } = useCurateV2GetArbitratorExtraData({
40-
// @ts-ignore
39+
const { data: arbitratorExtraData, isLoading: isLoadingExtradata } = useReadCurateV2GetArbitratorExtraData({
4140
address: registryAddress,
4241
});
4342

44-
const { data: removalDeposit, isLoading: isSubmissionDepositLoading } = useCurateV2SubmissionBaseDeposit({
45-
//@ts-ignore
43+
const { data: removalDeposit, isLoading: isSubmissionDepositLoading } = useReadCurateV2SubmissionBaseDeposit({
4644
address: registryAddress,
4745
});
4846

@@ -64,15 +62,16 @@ const ResubmitModal: React.FC<ISubmitModal> = ({ toggleModal, isItem, registryAd
6462
return userBalance?.value < depositRequired;
6563
}, [depositRequired, userBalance]);
6664

67-
const { config, isError } = usePrepareCurateV2AddItem({
68-
enabled: address && registryAddress && !isLoading && !isDisabled && !isItemDataLoading,
69-
//@ts-ignore
65+
const { data: config, isError } = useSimulateCurateV2AddItem({
66+
query: {
67+
enabled: address && registryAddress && !isLoading && !isDisabled && !isItemDataLoading,
68+
},
7069
address: registryAddress,
7170
args: [itemData?.item?.data ?? ""],
7271
value: depositRequired,
7372
});
7473

75-
const { writeAsync: resubmitItem } = useCurateV2AddItem(config);
74+
const { writeContractAsync: resubmitItem } = useWriteCurateV2AddItem();
7675

7776
return (
7877
<ReStyledModal {...{ toggleModal }}>
@@ -85,17 +84,10 @@ const ResubmitModal: React.FC<ISubmitModal> = ({ toggleModal, isItem, registryAd
8584
isDisabled={isDisabled || isError || isResubmittingItem}
8685
isLoading={isLoading}
8786
callback={() => {
88-
if (!resubmitItem) return;
87+
if (!resubmitItem || !config?.request || !publicClient) return;
8988
setIsResubmittingItem(true);
90-
wrapWithToast(
91-
async () =>
92-
await resubmitItem().then((response) => {
93-
return response.hash;
94-
}),
95-
publicClient
96-
)
89+
wrapWithToast(async () => await resubmitItem(config.request), publicClient)
9790
.then((res) => {
98-
console.log({ res });
9991
refetch();
10092
toggleModal();
10193
})

0 commit comments

Comments
 (0)