diff --git a/contracts/src/fund.cairo b/contracts/src/fund.cairo index f282ff6..de1965c 100644 --- a/contracts/src/fund.cairo +++ b/contracts/src/fund.cairo @@ -16,7 +16,7 @@ pub trait IFund { fn get_current_goal_state(self: @TContractState) -> u256; fn set_state(ref self: TContractState, state: u8); fn get_state(self: @TContractState) -> u8; - fn get_voter(self: @TContractState) -> u32; + fn get_voter(self: @TContractState, user: ContractAddress) -> u32; fn withdraw(ref self: TContractState); fn set_evidence_link(ref self: TContractState, evidence: ByteArray); fn get_evidence_link(self: @TContractState) -> ByteArray; @@ -226,8 +226,9 @@ pub mod Fund { fn get_state(self: @ContractState) -> u8 { return self.state.read(); } - fn get_voter(self: @ContractState) -> u32 { - return self.voters.read(get_caller_address()); + fn get_voter(self: @ContractState, user: ContractAddress) -> u32 { + let voter = self.voters.read(user); + return voter; } fn withdraw(ref self: ContractState) { let caller = get_caller_address(); diff --git a/frontend/gostarkme-web/app/app/page.tsx b/frontend/gostarkme-web/app/app/page.tsx index 1bb2deb..992391f 100644 --- a/frontend/gostarkme-web/app/app/page.tsx +++ b/frontend/gostarkme-web/app/app/page.tsx @@ -19,28 +19,28 @@ const Dashboard = () => { async function getFunds() { const fundManagerContract = new Contract(fundManager, FUND_MANAGER_ADDR); - const id = await fundManagerContract.getCurrentId(); + const id = await fundManagerContract.get_current_id(); let fundings = []; for (let i = 1; i < id; i++) { // GET FUND ADDRESS - let fundaddr = await fundManagerContract.getFund(i); + let fundaddr = await fundManagerContract.get_fund(i); fundaddr = "0x" + fundaddr.toString(16); const fundContract = new Contract(fundAbi, fundaddr); // GET FUND STATE - let state = await fundContract.getState(); + let state = await fundContract.get_state(); if (state == 4 || state == 0) { continue; } // GET FUND NAME - let name = await fundContract.getName(); + let name = await fundContract.get_name(); // GET FUND DESCRIPTION - let desc = await fundContract.getReason(); + let desc = await fundContract.get_reason(); let desclen = desc.length; if (desclen > 50) { desc = desc.substring(0, 50) + "..."; } // GET FUND ID - let fund_id = await fundContract.getId(); + let fund_id = await fundContract.get_id(); fundings.push({ type: "Project", title: name, diff --git a/frontend/gostarkme-web/components/dashboard/fundCard.tsx b/frontend/gostarkme-web/components/dashboard/fundCard.tsx index 5b4ad4d..a61690d 100644 --- a/frontend/gostarkme-web/components/dashboard/fundCard.tsx +++ b/frontend/gostarkme-web/components/dashboard/fundCard.tsx @@ -11,7 +11,7 @@ interface FundCardProps { type: string; title: string; description: string; - fund_id: string + fund_id: string; }; index: number; } diff --git a/frontend/gostarkme-web/components/modules/Fund/Fund.tsx b/frontend/gostarkme-web/components/modules/Fund/Fund.tsx index 6e3c3e4..cb78ac0 100644 --- a/frontend/gostarkme-web/components/modules/Fund/Fund.tsx +++ b/frontend/gostarkme-web/components/modules/Fund/Fund.tsx @@ -29,29 +29,29 @@ const Fund = () => { const clickedFund = useAtomValue(clickedFundState); async function getDetails() { - let addr = await fundManagerContract.getFund(clickedFund?.id); + let addr = await fundManagerContract.get_fund(clickedFund?.id); addr = "0x" + addr.toString(16); const fundContract = new Contract(fundAbi, addr, wallet?.account); try { // Fetch fund details - let name = await fundContract.getName(); - let desc = await fundContract.getReason(); + let name = await fundContract.get_name(); + let desc = await fundContract.get_reason(); if (desc == " ") { desc = "No description provided"; } - let state = await fundContract.getState(); + let state = await fundContract.get_state(); let currentBalance = await fundContract.get_current_goal_state(); currentBalance = BigInt(currentBalance) / BigInt(10 ** 18); - let goal = await fundContract.getGoal(); + let goal = await fundContract.get_goal(); goal = BigInt(goal) / BigInt(10 ** 18); - let upVotes = await fundContract.getUpVotes(); + let upVotes = await fundContract.get_up_votes(); let evidenceLink = await fundContract.get_evidence_link(); let contactHandle = await fundContract.get_contact_handle(); - - console.log(wallet?.account?.address.toLowerCase()); // Fetch owner - const owner = (await fundContract.getOwner()).toString(); + const owner = (await fundContract.get_owner()).toString(); setIsOwner(owner.toLowerCase() === wallet?.account?.address.toLowerCase()); + // USER VOTED? + let voted = await fundContract.get_voter(wallet?.account.address); setFund({ name: name, @@ -63,6 +63,7 @@ const Fund = () => { addr: addr, evidenceLink: evidenceLink, contactHandle: contactHandle, + voted: voted }); } catch (error) { console.error("Error fetching fund details:", error); @@ -102,11 +103,12 @@ const Fund = () => { {Number(fund.state) === 0 &&

Fund is currently inactive.

} {Number(fund.state) === 1 && ( )} {Number(fund.state) === 2 && ( diff --git a/frontend/gostarkme-web/components/modules/Fund/FundVote.tsx b/frontend/gostarkme-web/components/modules/Fund/FundVote.tsx index e89a441..e0599ba 100644 --- a/frontend/gostarkme-web/components/modules/Fund/FundVote.tsx +++ b/frontend/gostarkme-web/components/modules/Fund/FundVote.tsx @@ -1,92 +1,87 @@ import { calculatePorcentage } from "@/app/utils"; import { Button } from "@/components/ui/Button"; import ProgressBar from "@/components/ui/ProgressBar"; -import { fundAbi } from "@/contracts/abis/fund"; import { walletStarknetkitLatestAtom, } from "@/state/connectedWallet"; import { latestTxAtom } from "@/state/latestTx"; -import { useAtomValue, useSetAtom } from "jotai"; -import { Contract } from "starknet"; -import { useRouter } from "next/navigation"; -import { useState, useEffect } from "react"; +import { useAtom, useAtomValue } from "jotai"; +import { useState } from "react"; +import ShareXButton from "@/components/ui/ShareOnX"; +import { provider } from "@/constants"; +import { CallData } from "starknet"; interface FundVoteProps { + name: String, upVotes: number, upVotesNeeded: number, addr: string, + voted: any, setLoading: (load: boolean) => void, - getDetails: () => void, } -export const FundVote = ({ upVotes, upVotesNeeded, addr, setLoading }: FundVoteProps) => { - +export const FundVote = ({ name, upVotes, upVotesNeeded, addr, voted, setLoading }: FundVoteProps) => { const wallet = useAtomValue(walletStarknetkitLatestAtom); const [network, setNetwork] = useState(wallet?.chainId); const networkEnvironment = process.env.NEXT_PUBLIC_CHAIN_ID; - const progress = calculatePorcentage(upVotes, upVotesNeeded); - - const setLatestTx = useSetAtom(latestTxAtom); - - const router = useRouter(); + const [progress, setProgress] = useState(calculatePorcentage(upVotes, upVotesNeeded)); + const [currentUpvotes, setCurrentUpvotes] = useState(upVotes); + const voteMessage = ` ๐Ÿ—ณ๏ธ Just cast my vote for an amazing cause called ${name} on Go Stark Me! This fund needs more votes to start raising fundsโ€”every vote counts! Letโ€™s support projects that make a difference at https://web3wagers.github.io/gostarkme/ @undefined_org_ ๐Ÿ™Œ๐Ÿ’ซ #GoStarkMe #Starknet #CommunityPower`; - const [isChecking, setIsChecking] = useState(true); - const [voteStatus, setVoteStatus] = useState(false); const [isVoting, setIsVoting] = useState(false); + const [showSuccessPopup, setShowSuccessPopup] = useState(false); + const [latestTx, setLatestTx] = useAtom(latestTxAtom); + const [canVote, setCanVote] = useState((voted != BigInt(0) ? false : true)); const handleNetwork = (chainId?: string, accounts?: string[]) => { setNetwork(wallet?.chainId); }; wallet?.on('networkChanged', handleNetwork); - useEffect(() => { - const checkVoteStatus = async () => { - if (!wallet?.account) { - setIsChecking(false); - return; - } - - setIsChecking(true); - try { - const fundContract = new Contract(fundAbi, addr, wallet.account); - - try { - await fundContract.estimate('receiveVote'); - setVoteStatus(false); - } catch (error: any) { - if (error?.toString().includes('User already voted')) { - setVoteStatus(true); - } - } - } catch (error) { - console.error("Contract interaction error:", error); - } finally { - setIsChecking(false); - } - }; + const waitForTransaction = async (hash: string) => { + try { + await provider.waitForTransaction(hash); + return true; + } catch (error) { + console.error("Error waiting for transaction:", error); + return false; + } + }; - checkVoteStatus(); - }, [wallet?.account, addr]); + const handleVoteClick = async (e: React.MouseEvent) => { + e.preventDefault(); - const handleVote = async () => { - if (!wallet?.account) return; - setLoading(true); setIsVoting(true); + try { - const fundContract = new Contract(fundAbi, addr, wallet.account); - const resp = await fundContract.invoke('receiveVote'); - setLatestTx({ txHash: resp.transaction_hash, type: "vote" }); - setVoteStatus(true); - router.push("/app/confirmation"); - } catch (error: any) { - console.error("Vote failed:", error); - if (error?.toString().includes('User already voted')) { - console.log("User has already voted"); - setVoteStatus(true); + const tx = await wallet?.account.execute([ + { + contractAddress: addr, + entrypoint: 'receive_vote', + calldata: CallData.compile({ + }), + }, + ]); + + if (tx) { + const isConfirmed = await waitForTransaction(tx.transaction_hash); + + if (isConfirmed) { + setLatestTx(tx.transaction_hash); + setCanVote(false); + setShowSuccessPopup(true); + setCurrentUpvotes(prev => Number(BigInt(prev) + BigInt(1))); + setProgress(calculatePorcentage(Number(BigInt(upVotes) + BigInt(1)), Number(upVotesNeeded))) + setTimeout(() => { + }, 3000); + } else { + console.log('tx not successfull') + } } + } catch (error: any) { + console.log(error.message || "Transaction failed. Please try again."); } finally { - setLoading(false); setIsVoting(false); } }; @@ -95,20 +90,20 @@ export const FundVote = ({ upVotes, upVotesNeeded, addr, setLoading }: FundVoteP
-

{upVotes.toString()} / {upVotesNeeded.toString()}

+

{currentUpvotes.toString()} / {upVotesNeeded.toString()}

🌟

- {isChecking ? ( //if isChecking is true render a button that checks the vote status + {isVoting ? (
- ) : wallet ? ( // Check if a wallet is connected by evaluating 'wallet' condition - voteStatus ? ( //if voteStatus is true button is disabled + ) : wallet ? ( + !canVote ? (
{network !== networkEnvironment && (

Your wallet is currently connected to the wrong network. Please @@ -137,7 +130,7 @@ export const FundVote = ({ upVotes, upVotesNeeded, addr, setLoading }: FundVoteP )}

) - ) : ( // If the wallet is not connected, render a disabled vote button with instructions + ) : (
)} + {showSuccessPopup && ( +
+
+ +

Success

+

Your vote was submitted, take a look at the transaction here.

+

Share your contribution via X to tell everyone how cool you are

+ +
+
+ )}
); }; \ No newline at end of file diff --git a/frontend/gostarkme-web/components/modules/confirmation/Confirmation.tsx b/frontend/gostarkme-web/components/modules/confirmation/Confirmation.tsx index 563c5f5..214ef1d 100644 --- a/frontend/gostarkme-web/components/modules/confirmation/Confirmation.tsx +++ b/frontend/gostarkme-web/components/modules/confirmation/Confirmation.tsx @@ -1,20 +1,17 @@ 'use client'; -import React, { useEffect } from "react"; +import React from "react"; import CreationConfirmation from "./CreationConfirmation"; -import VoteConfirmation from "./VoteConfirmation"; import DonationConfirmation from "./DonationConfirmation"; -import { useAtom, useAtomValue } from "jotai"; +import { useAtomValue } from "jotai"; import { latestTxAtom } from "@/state/latestTx"; import Navbar from "@/components/ui/Navbar"; import { navItems } from "@/constants"; import { clickedFundState } from "@/state/nFunds"; -import { walletStarknetkitLatestAtom } from "@/state/connectedWallet"; import WithdrawConfirmation from "./WithdrawConfirmation"; const Confirmation = () => { const tx = useAtomValue(latestTxAtom); const actualFund = useAtomValue(clickedFundState); - const voteMessage = ` ๐Ÿ—ณ๏ธ Just cast my vote for an amazing cause called ${actualFund?.name} on Go Stark Me! This fund needs more votes to start raising fundsโ€”every vote counts! Letโ€™s support projects that make a difference at https://web3wagers.github.io/gostarkme/ @undefined_org_ ๐Ÿ™Œ๐Ÿ’ซ #GoStarkMe #Starknet #CommunityPower`; const donationMessage = `๐Ÿ™Œ Proud to support ${actualFund?.name} on Go Stark Me! Donations make a difference. ๐Ÿ’ช Go ahead and donate at https://web3wagers.github.io/gostarkme/ @undefined_org_ #Starknet #GoStarkMe #Web3Wagers`; const newFundMessage = `๐Ÿš€ Just launched a new fund on Go Stark Me called ${actualFund?.name}! Iโ€™m raising support for an important cause, and every contribution makes a difference. Join me in making an impact at https://web3wagers.github.io/gostarkme/! ๐Ÿ’ช๐ŸŒ Check it out on @undefined_org_ #GoStarkMe #Starknet #BlockchainForGood`; const withdrawnMessage = `๐ŸŽ‰ We did it! The goal for ${actualFund?.name} on Go Stark Me has been reached, and funds have been successfully withdrawn! ๐Ÿ™Œ Huge thanks to everyone who contributed and made this possible. Letโ€™s keep making an impact! ๐ŸŒ๐Ÿ’ช Check it out at https://web3wagers.github.io/gostarkme/ #GoStarkMe #Starknet #CommunitySuccess`; @@ -44,10 +41,6 @@ const Confirmation = () => { } - {tx?.type === "vote" && - - } - {tx?.type === "donation" && } diff --git a/frontend/gostarkme-web/components/modules/newfunding/Stages.tsx b/frontend/gostarkme-web/components/modules/newfunding/Stages.tsx index 76da91d..417753d 100644 --- a/frontend/gostarkme-web/components/modules/newfunding/Stages.tsx +++ b/frontend/gostarkme-web/components/modules/newfunding/Stages.tsx @@ -66,7 +66,7 @@ const Stages = () => { async function newFund() { const fundManagerContract = new Contract(fundManager, FUND_MANAGER_ADDR, wallet?.account); - fundManagerContract.newFund(fundingName, cairo.uint256(Number(goal) * Number(10) ** Number(18) ) , evidenceLink, contactHandle, fundingDescription) + fundManagerContract.new_fund(fundingName, cairo.uint256(Number(goal) * Number(10) ** Number(18) ) , evidenceLink, contactHandle, fundingDescription) .then(async (resp: InvokeFunctionResponse) => { setLatesTx({ txHash: resp.transaction_hash, type: "newfund" }); setActualFund({id: 0, name: fundingName}); diff --git a/frontend/gostarkme-web/constants/index.ts b/frontend/gostarkme-web/constants/index.ts index 7bf84a9..bd7868f 100644 --- a/frontend/gostarkme-web/constants/index.ts +++ b/frontend/gostarkme-web/constants/index.ts @@ -28,7 +28,7 @@ export const ARGENT_WEBWALLET_URL = process.env.NEXT_PUBLIC_ARGENT_WEBWALLET_URL || "https://web.argent.xyz" export const FUND_MANAGER_ADDR = - "0x05c1701879e0322024c174f074cd4a279ed5b536ecaa2447240cec1958f8f8e2" + "0x051da2e0a541f35cf09d7978278495cb6940b53d7c9fbdb0ad4d5d678991be9e" export const navItems = [ // { label: 'My Profile', href: '/app/myprofile' }, diff --git a/frontend/gostarkme-web/contracts/abis/fund.ts b/frontend/gostarkme-web/contracts/abis/fund.ts index a57df12..0a7c9b6 100644 --- a/frontend/gostarkme-web/contracts/abis/fund.ts +++ b/frontend/gostarkme-web/contracts/abis/fund.ts @@ -42,7 +42,7 @@ export const fundAbi = [ "items": [ { "type": "function", - "name": "getId", + "name": "get_id", "inputs": [], "outputs": [ { @@ -53,7 +53,7 @@ export const fundAbi = [ }, { "type": "function", - "name": "getOwner", + "name": "get_owner", "inputs": [], "outputs": [ { @@ -64,7 +64,7 @@ export const fundAbi = [ }, { "type": "function", - "name": "setName", + "name": "set_name", "inputs": [ { "name": "name", @@ -76,7 +76,7 @@ export const fundAbi = [ }, { "type": "function", - "name": "getName", + "name": "get_name", "inputs": [], "outputs": [ { @@ -87,7 +87,7 @@ export const fundAbi = [ }, { "type": "function", - "name": "setReason", + "name": "set_reason", "inputs": [ { "name": "reason", @@ -99,7 +99,7 @@ export const fundAbi = [ }, { "type": "function", - "name": "getReason", + "name": "get_reason", "inputs": [], "outputs": [ { @@ -110,14 +110,14 @@ export const fundAbi = [ }, { "type": "function", - "name": "receiveVote", + "name": "receive_vote", "inputs": [], "outputs": [], "state_mutability": "external" }, { "type": "function", - "name": "getUpVotes", + "name": "get_up_votes", "inputs": [], "outputs": [ { @@ -128,7 +128,7 @@ export const fundAbi = [ }, { "type": "function", - "name": "setGoal", + "name": "set_goal", "inputs": [ { "name": "goal", @@ -140,7 +140,7 @@ export const fundAbi = [ }, { "type": "function", - "name": "getGoal", + "name": "get_goal", "inputs": [], "outputs": [ { @@ -174,7 +174,7 @@ export const fundAbi = [ }, { "type": "function", - "name": "setState", + "name": "set_state", "inputs": [ { "name": "state", @@ -186,7 +186,7 @@ export const fundAbi = [ }, { "type": "function", - "name": "getState", + "name": "get_state", "inputs": [], "outputs": [ { @@ -197,8 +197,13 @@ export const fundAbi = [ }, { "type": "function", - "name": "getVoter", - "inputs": [], + "name": "get_voter", + "inputs": [ + { + "name": "user", + "type": "core::starknet::contract_address::ContractAddress" + } + ], "outputs": [ { "type": "core::integer::u32" @@ -388,4 +393,4 @@ export const fundAbi = [ } ] } -] \ No newline at end of file +] diff --git a/frontend/gostarkme-web/contracts/abis/fundManager.ts b/frontend/gostarkme-web/contracts/abis/fundManager.ts index 37f60f9..d5b291f 100644 --- a/frontend/gostarkme-web/contracts/abis/fundManager.ts +++ b/frontend/gostarkme-web/contracts/abis/fundManager.ts @@ -42,7 +42,7 @@ export const fundManager = [ "items": [ { "type": "function", - "name": "newFund", + "name": "new_fund", "inputs": [ { "name": "name", @@ -70,7 +70,7 @@ export const fundManager = [ }, { "type": "function", - "name": "getCurrentId", + "name": "get_current_id", "inputs": [], "outputs": [ { @@ -81,7 +81,7 @@ export const fundManager = [ }, { "type": "function", - "name": "getFund", + "name": "get_fund", "inputs": [ { "name": "id", @@ -97,7 +97,7 @@ export const fundManager = [ }, { "type": "function", - "name": "getOwner", + "name": "get_owner", "inputs": [], "outputs": [ { @@ -108,7 +108,7 @@ export const fundManager = [ }, { "type": "function", - "name": "getFundClassHash", + "name": "get_fund_class_hash", "inputs": [], "outputs": [ { diff --git a/frontend/gostarkme-web/package-lock.json b/frontend/gostarkme-web/package-lock.json index 2348186..b2daf9b 100644 --- a/frontend/gostarkme-web/package-lock.json +++ b/frontend/gostarkme-web/package-lock.json @@ -17,6 +17,7 @@ "next": "14.2.10", "react": "^18", "react-dom": "^18", + "react-modal": "^3.16.1", "react-router-dom": "^6.28.0", "starknet": "^6.11.0", "starknetkit": "^1.1.5", @@ -26,6 +27,7 @@ "@types/node": "^20", "@types/react": "^18.3.4", "@types/react-dom": "^18", + "@types/react-modal": "^3.16.3", "eslint": "^8", "eslint-config-next": "14.2.5", "postcss": "^8", @@ -1822,6 +1824,15 @@ "@types/react": "*" } }, + "node_modules/@types/react-modal": { + "version": "3.16.3", + "resolved": "https://registry.npmjs.org/@types/react-modal/-/react-modal-3.16.3.tgz", + "integrity": "sha512-xXuGavyEGaFQDgBv4UVm8/ZsG+qxeQ7f77yNrW3n+1J6XAstUy5rYHeIHPh1KzsGc6IkCIdu6lQ2xWzu1jBTLg==", + "dev": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@typescript-eslint/parser": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.2.0.tgz", @@ -3902,6 +3913,11 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/exenv": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/exenv/-/exenv-1.2.2.tgz", + "integrity": "sha512-Z+ktTxTwv9ILfgKCk32OX3n/doe+OcLTRtqK9pcL+JsP3J1/VW8Uvl4ZjLlKqeW4rzK4oesDOGMEMRIZqtP4Iw==" + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", @@ -6415,6 +6431,29 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" }, + "node_modules/react-lifecycles-compat": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", + "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" + }, + "node_modules/react-modal": { + "version": "3.16.1", + "resolved": "https://registry.npmjs.org/react-modal/-/react-modal-3.16.1.tgz", + "integrity": "sha512-VStHgI3BVcGo7OXczvnJN7yT2TWHJPDXZWyI/a0ssFNhGZWsPmB8cF0z33ewDXq4VfYMO1vXgiv/g8Nj9NDyWg==", + "dependencies": { + "exenv": "^1.2.0", + "prop-types": "^15.7.2", + "react-lifecycles-compat": "^3.0.0", + "warning": "^4.0.3" + }, + "engines": { + "node": ">=8" + }, + "peerDependencies": { + "react": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18", + "react-dom": "^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18" + } + }, "node_modules/react-remove-scroll": { "version": "2.6.0", "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz", @@ -7866,6 +7905,14 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", diff --git a/frontend/gostarkme-web/package.json b/frontend/gostarkme-web/package.json index bc853de..ba25b4b 100644 --- a/frontend/gostarkme-web/package.json +++ b/frontend/gostarkme-web/package.json @@ -18,6 +18,7 @@ "next": "14.2.10", "react": "^18", "react-dom": "^18", + "react-modal": "^3.16.1", "react-router-dom": "^6.28.0", "starknet": "^6.11.0", "starknetkit": "^1.1.5", @@ -27,6 +28,7 @@ "@types/node": "^20", "@types/react": "^18.3.4", "@types/react-dom": "^18", + "@types/react-modal": "^3.16.3", "eslint": "^8", "eslint-config-next": "14.2.5", "postcss": "^8",