{"version":3,"sources":["App.jsx","index.js"],"names":["sdk","ThirdwebSDK","bundleDropModule","getBundleDropModule","tokenModule","getTokenModule","voteModule","getVoteModule","App","useWeb3","connectWallet","address","error","provider","console","log","signer","getSigner","undefined","useState","hasClaimedNFT","setHasClaimedNFT","isClaiming","setIsClaiming","memberTokenAmounts","setMemberTokenAmounts","memberAddresses","setMemberAddresses","proposals","setProposals","isVoting","setIsVoting","hasVoted","setHasVoted","useEffect","getAll","then","catch","err","length","proposalId","getAllClaimerAddresses","addresses","getAllHolderBalances","amounts","memberList","useMemo","map","tokenAmount","ethers","utils","formatUnits","setProviderOrSigner","balanceOf","balance","gt","UnsupportedChainIdError","className","onClick","member","str","substring","onSubmit","e","a","preventDefault","stopPropagation","votes","proposal","voteResult","vote","forEach","document","getElementById","type","checked","getDelegationOf","constants","AddressZero","delegateTo","Promise","all","get","state","execute","index","description","id","name","value","defaultChecked","htmlFor","label","disabled","claim","finally","ReactDOM","render","StrictMode","connectors","injected","supportedChainIds"],"mappings":"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","file":"static/js/main.9b4f54a5.chunk.js","sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\n\n// import thirdweb\nimport { useWeb3 } from \"@3rdweb/hooks\";\n\nimport { ethers } from \"ethers\";\n\nimport { UnsupportedChainIdError } from \"@web3-react/core\";\n\n// import SDK\nimport { ThirdwebSDK } from \"@3rdweb/sdk\";\n// We instantiate the sdk on Rinkeby.\nconst sdk = new ThirdwebSDK(\"rinkeby\");\n\n// We can grab a reference to our ERC-1155 contract.\nconst bundleDropModule = sdk.getBundleDropModule(\n \"0x5B6F611017301Cf56E1A32A05c19B4c703592D68\",\n);\n\nconst tokenModule = sdk.getTokenModule(\n \"0x2f62C99C4ae403F0A389f714a727cCcB98ab43b8\"\n);\n\nconst voteModule = sdk.getVoteModule(\n \"0x888A470e2927d557c91eb2F9Df075Fa1cf21e80C\",\n);\n\nconst App = () => {\n // Use the connectWallet hook thirdweb gives us.\n const { connectWallet, address, error, provider } = useWeb3();\n console.log(\"👋 Address:\", address)\n\n // The signer is required to sign transactions on the blockchain.\n // Without it we can only read data, not write.\n const signer = provider ? provider.getSigner() : undefined;\n \n // State variable for us to know if user has our NFT.\n const [hasClaimedNFT, setHasClaimedNFT] = useState(false);\n\n // isClaiming lets us easily keep a loading state while the NFT is minting.\n const [isClaiming, setIsClaiming] = useState(false);\n\n // Holds the amount of token each member has in state.\n const [memberTokenAmounts, setMemberTokenAmounts] = useState({});\n // The array holding all of our members addresses.\n const [memberAddresses, setMemberAddresses] = useState([]);\n\n\n const [proposals, setProposals] = useState([]);\n const [isVoting, setIsVoting] = useState(false);\n const [hasVoted, setHasVoted] = useState(false);\n\n\n // Retrieve all our existing proposals from the contract.\n useEffect(() => {\n if (!hasClaimedNFT) {\n return;\n }\n // A simple call to voteModule.getAll() to grab the proposals.\n voteModule\n .getAll()\n .then((proposals) => {\n // Set state!\n setProposals(proposals);\n console.log(\"🌈 Proposals:\", proposals)\n })\n .catch((err) => {\n console.error(\"failed to get proposals\", err);\n });\n }, [hasClaimedNFT]);\n\n // We also need to check if the user already voted.\n useEffect(() => {\n if (!hasClaimedNFT) {\n return;\n }\n\n // If we haven't finished retrieving the proposals from the useEffect above\n // then we can't check if the user voted yet!\n if (!proposals.length) {\n return;\n }\n\n // Check if the user has already voted on the first proposal.\n voteModule\n .hasVoted(proposals[0].proposalId, address)\n .then((hasVoted) => {\n setHasVoted(hasVoted);\n if (hasVoted) {\n console.log(\"🥵 User has already voted\");\n } else {\n console.log(\"🙂 User has not voted yet\");\n }\n })\n .catch((err) => {\n console.error(\"failed to check if wallet has voted\", err);\n });\n }, [hasClaimedNFT, proposals, address]);\n\n // A fancy function to shorten someones wallet address, no need to show the whole thing. \n const shortenAddress = (str) => {\n return str.substring(0, 6) + \"...\" + str.substring(str.length - 4);\n };\n\n // This useEffect grabs all the addresses of our members holding our NFT.\n useEffect(() => {\n if (!hasClaimedNFT) {\n return;\n }\n \n // Just like we did in the 7-airdrop-token.js file! Grab the users who hold our NFT\n // with tokenId 0.\n bundleDropModule\n .getAllClaimerAddresses(\"0\")\n .then((addresses) => {\n console.log(\"🚀 Members addresses\", addresses)\n setMemberAddresses(addresses);\n })\n .catch((err) => {\n console.error(\"failed to get member list\", err);\n });\n }, [hasClaimedNFT]);\n\n // This useEffect grabs the # of token each member holds.\n useEffect(() => {\n if (!hasClaimedNFT) {\n return;\n }\n\n // Grab all the balances.\n tokenModule\n .getAllHolderBalances()\n .then((amounts) => {\n console.log(\"👜 Amounts\", amounts)\n setMemberTokenAmounts(amounts);\n })\n .catch((err) => {\n console.error(\"failed to get token amounts\", err);\n });\n }, [hasClaimedNFT]);\n\n // Now, we combine the memberAddresses and memberTokenAmounts into a single array\n const memberList = useMemo(() => {\n return memberAddresses.map((address) => {\n return {\n address,\n tokenAmount: ethers.utils.formatUnits(\n // If the address isn't in memberTokenAmounts, it means they don't\n // hold any of our token.\n memberTokenAmounts[address] || 0,\n 18,\n ),\n };\n });\n }, [memberAddresses, memberTokenAmounts]);\n // Another useEffect!\n useEffect(() => {\n // We pass the signer to the sdk, which enables us to interact with\n // our deployed contract!\n sdk.setProviderOrSigner(signer);\n }, [signer]);\n\n useEffect(() => {\n // If they don't have an connected wallet, exit!\n if (!address) {\n return;\n }\n \n // Check if the user has the NFT by using bundleDropModule.balanceOf\n return bundleDropModule\n .balanceOf(address, \"0\")\n .then((balance) => {\n // If balance is greater than 0, they have our NFT!\n if (balance.gt(0)) {\n setHasClaimedNFT(true);\n console.log(\"🌟 this user has a membership NFT!\")\n } else {\n setHasClaimedNFT(false);\n console.log(\"😠this user doesn't have a membership NFT.\")\n }\n })\n .catch((error) => {\n setHasClaimedNFT(false);\n console.error(\"failed to nft balance\", error);\n });\n }, [address]);\n\n\n if (error instanceof UnsupportedChainIdError ) {\n return (\n
\n This dapp only works on the Rinkeby network, please switch networks\n in your connected wallet.\n
\nCongratulations on being a member
\nAddress | \nToken Amount | \n
---|---|
{shortenAddress(member.address)} | \n{member.tokenAmount} | \n