Skip to content

Commit

Permalink
built out hat demo
Browse files Browse the repository at this point in the history
  • Loading branch information
JacobHomanics committed Apr 18, 2024
1 parent 3f10a64 commit 5546552
Show file tree
Hide file tree
Showing 6 changed files with 190 additions and 50 deletions.
5 changes: 5 additions & 0 deletions hat-jsons/stewardship-hat.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"name": "The Stewardship Cap",
"description": "Steward is a volunteer position, created with the intent to separate control of the treasury (through being a signer on the Safe) from those receiving direct payouts without community oversight (Wardens). Stewards can still receive Giving Circle payouts and have a paid position on a project, because these rewards have community oversight.",
"image": "ipfs://bafkreib7b5ofejprn4xv4grp7itypej7ybxus7idkymhqkyweqlgxkigcm"
}
5 changes: 5 additions & 0 deletions hat-jsons/warden-hat.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"name": "The Warden Hat",
"description": "Having this role indicates that the wearer has made substantial contributions to the DAO, to the point that they should get paid a stipend for their efforts.",
"image": "ipfs://bafkreie3wgy2himeujzxzfjankxd2xwac3ep5dneozyfkpjxszkqyla3q4"
}
12 changes: 6 additions & 6 deletions packages/foundry/contracts/ERC1155EligibiltiyModule.sol
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ import {ERC1155} from "./Hats/utils/ERC1155.sol";
contract ERC1155EligibiltiyModule {
ERC1155 s_erc1155;

constructor(address erc1155Address) {
uint256 s_amount;

constructor(address erc1155Address, uint256 amount) {
s_erc1155 = ERC1155(erc1155Address);
s_amount = amount;
}

function getWearerStatus(
address _wearer,
uint256
) external view returns (bool eligible, bool standing) {
if (s_erc1155.balanceOf(_wearer, 0) > 100) {
function getWearerStatus(address _wearer, uint256) external view returns (bool eligible, bool standing) {
if (s_erc1155.balanceOf(_wearer, 0) > s_amount) {
eligible = true;
} else {
eligible = false;
Expand Down
32 changes: 28 additions & 4 deletions packages/foundry/script/DeployDemo.s.sol
Original file line number Diff line number Diff line change
Expand Up @@ -67,19 +67,43 @@ contract DeployDemoScript is ScaffoldETHDeploy {
hatsInstance.mintHat(hatterHatId, address(hatter));

ActiveModule activeModule = new ActiveModule();
ERC1155EligibiltiyModule eligibilityModule = new ERC1155EligibiltiyModule(address(instance));
ERC1155EligibiltiyModule eligibilityModule = new ERC1155EligibiltiyModule(address(instance), 100);
ERC1155EligibiltiyModule eligibilityModule2 = new ERC1155EligibiltiyModule(address(instance), 500);
ERC1155EligibiltiyModule eligibilityModule3 = new ERC1155EligibiltiyModule(address(instance), 1500);

uint256 claimableHatId = hatsInstance.createHat(
uint256 claimableHatId1 = hatsInstance.createHat(
hatterHatId,
"Hat of Engineering",
100,
30,
address(eligibilityModule),
address(activeModule),
true,
"ipfs://bafkreicff2j67tg5g3klktkk4wavcctorj65y5upkolznwgbhmrakv4dba"
);

console.log(claimableHatId);
uint256 claimableHatId2 = hatsInstance.createHat(
hatterHatId,
"Hat of Steardship",
30,
address(eligibilityModule2),
address(activeModule),
true,
"ipfs://bafkreibfian6fybuifdvchrjspqpedvrkakhwdnyhpwrroustpa7mjtto4"
);

uint256 claimableHatId3 = hatsInstance.createHat(
hatterHatId,
"Hat of Warden",
30,
address(eligibilityModule3),
address(activeModule),
true,
"ipfs://bafkreigvzey77niarqslm6wjd3e77ihwc5rcdrrahp3o6og2dszzzw2fpi"
);

console.log(claimableHatId1);
console.log(claimableHatId2);
console.log(claimableHatId3);
}

vm.stopBroadcast();
Expand Down
174 changes: 140 additions & 34 deletions packages/nextjs/app/hats/_components/Hats.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,39 +2,56 @@

import { useFetch } from "usehooks-ts";
import { useAccount, useChainId } from "wagmi";
import { useRepTokens } from "~~/components/rep-tokens/hooks/Hooks";
import { useScaffoldContractRead, useScaffoldContractWrite } from "~~/hooks/scaffold-eth";

// const claimableHatId = "26960358049567071831564234593151059434471056522609336320533481914368";

function getHatConfig(chainId: number) {
let claimableHatId = "";
let claimableHatId1 = "";
let claimableHatId2 = "";
let claimableHatId3 = "";

if (chainId === 31337) {
claimableHatId = "26960358049567071831564234593151059434471056522609336320533481914368";
claimableHatId1 = "26960358049567071831564234593151059434471056522609336320533481914368";
claimableHatId2 = "26960358055844173566950915356986848857678722938711691764997516427264";
claimableHatId3 = "26960358062121275302337596120822638280886389354814047209461550940160";
} else if (chainId === 11155111) {
claimableHatId = "";
claimableHatId1 = "";
// claimHatterName = "MultiClaimsHatter";
}

return { claimableHatId };
return { claimableHatId1, claimableHatId2, claimableHatId3 };
}

export function Hats() {
const { address } = useAccount();
const chainId = useChainId();

const { claimableHatId } = getHatConfig(chainId);
const { claimableHatId1, claimableHatId2, claimableHatId3 } = getHatConfig(chainId);

// const { data: isAdminOfHat } = useScaffoldContractRead({
// contractName: "Hats",
// functionName: "isAdminOfHat",
// args: [address, BigInt(claimableHatId)],
// });

const { data: viewHat } = useScaffoldContractRead({
const { data: viewHat1 } = useScaffoldContractRead({
contractName: "Hats",
functionName: "viewHat",
args: [BigInt(claimableHatId)],
args: [BigInt(claimableHatId1)],
});

const { data: viewHat2 } = useScaffoldContractRead({
contractName: "Hats",
functionName: "viewHat",
args: [BigInt(claimableHatId2)],
});

const { data: viewHat3 } = useScaffoldContractRead({
contractName: "Hats",
functionName: "viewHat",
args: [BigInt(claimableHatId3)],
});

// const { data: isEligible } = useScaffoldContractRead({
Expand All @@ -49,46 +66,135 @@ export function Hats() {
// args: [BigInt(claimableHatId)],
// });

const { data: balanceOfClaimableHat, refetch } = useScaffoldContractRead({
const { data: balanceOfClaimableHat1, refetch: refetchBalance1 } = useScaffoldContractRead({
contractName: "Hats",
functionName: "balanceOf",
args: [address, BigInt(claimableHatId)],
args: [address, BigInt(claimableHatId1)],
});

console.log(balanceOfClaimableHat);
const { data: balanceOfClaimableHat2, refetch: refetchBalance2 } = useScaffoldContractRead({
contractName: "Hats",
functionName: "balanceOf",
args: [address, BigInt(claimableHatId2)],
});

const { writeAsync: claimHat } = useScaffoldContractWrite({
const { data: balanceOfClaimableHat3, refetch: refetchBalance3 } = useScaffoldContractRead({
contractName: "Hats",
functionName: "balanceOf",
args: [address, BigInt(claimableHatId3)],
});

const { tokens: userTokens } = useRepTokens(address, "nftstorage");

const { writeAsync: claimHat1 } = useScaffoldContractWrite({
contractName: "MultiClaimsHatter",
functionName: "claimHat",
args: [BigInt(claimableHatId)],
args: [BigInt(claimableHatId1)],
});

const result: any = useFetch(viewHat ? viewHat[5].replace("ipfs://", "https://nftstorage.link/ipfs/") : "");
const { writeAsync: claimHat2 } = useScaffoldContractWrite({
contractName: "MultiClaimsHatter",
functionName: "claimHat",
args: [BigInt(claimableHatId2)],
});

const { writeAsync: claimHat3 } = useScaffoldContractWrite({
contractName: "MultiClaimsHatter",
functionName: "claimHat",
args: [BigInt(claimableHatId3)],
});

const result1: any = useFetch(viewHat1 ? viewHat1[5].replace("ipfs://", "https://nftstorage.link/ipfs/") : "");
const result2: any = useFetch(viewHat2 ? viewHat2[5].replace("ipfs://", "https://nftstorage.link/ipfs/") : "");
const result3: any = useFetch(viewHat3 ? viewHat3[5].replace("ipfs://", "https://nftstorage.link/ipfs/") : "");

const doesUserMeetRepRequirements1 = userTokens[0]?.balance >= 100;
const doesUserMeetRepRequirements2 = userTokens[0]?.balance >= 500;
const doesUserMeetRepRequirements3 = userTokens[0]?.balance >= 1500;

const doesUserOwnHat1 = balanceOfClaimableHat1 || 0 > 0;
const doesUserOwnHat2 = balanceOfClaimableHat2 || 0 > 0;
const doesUserOwnHat3 = balanceOfClaimableHat3 || 0 > 0;

const canClaimHat1 = doesUserMeetRepRequirements1 && !doesUserOwnHat1;
const canClaimHat2 = doesUserMeetRepRequirements2 && !doesUserOwnHat2;
const canClaimHat3 = doesUserMeetRepRequirements3 && !doesUserOwnHat3;

return (
<>
<div className="py-5 space-y-5 flex flex-col justify-center items-center bg-primary bg-[length:100%_100%] py-1 px-5 sm:px-0 lg:py-auto max-w-[100vw] ">
<p>{result?.data?.name}</p>
{balanceOfClaimableHat || 0 > 0 ? <p className="text-green-700">Equipped</p> : <></>}

{/* eslint-disable-next-line @next/next/no-img-element */}
<img
src={result?.data?.image.replace("ipfs://", "https://nftstorage.link/ipfs/")}
width={156}
height={156}
alt={"Hat 1"}
></img>
<p className="w-96 text-center">{result?.data?.description}</p>
<button
disabled={(balanceOfClaimableHat || 0) > 0}
className="btn btn-secondary btn-sm font-normal gap-1"
onClick={async () => {
await claimHat();
await refetch();
}}
>
{"Claim (100 Lifetime Tokens)"}
</button>
<div className="flex flex-row justify-center items-center">
<div className="flex flex-col justify-center items-center">
<p>{result1?.data?.name}</p>
{balanceOfClaimableHat1 || 0 > 0 ? <p className="text-green-700">Equipped</p> : <></>}

{/* eslint-disable-next-line @next/next/no-img-element */}
<img
src={result1?.data?.image.replace("ipfs://", "https://nftstorage.link/ipfs/")}
width={156}
height={156}
alt={"Hat 1"}
></img>
<p className="w-96 text-center">{result1?.data?.description}</p>
<button
disabled={!canClaimHat1}
className="btn btn-secondary btn-sm font-normal gap-1"
onClick={async () => {
await claimHat1();
await refetchBalance1();
}}
>
{"Claim (100 Lifetime Tokens)"}
</button>
</div>
<div className="flex flex-col justify-center items-center">
<p>{result2?.data?.name}</p>
{balanceOfClaimableHat2 || 0 > 0 ? <p className="text-green-700">Equipped</p> : <></>}

{/* eslint-disable-next-line @next/next/no-img-element */}
<img
src={result2?.data?.image.replace("ipfs://", "https://nftstorage.link/ipfs/")}
width={156}
height={156}
alt={"Hat 1"}
></img>
<p className="w-96 text-center">{result2?.data?.description}</p>
<button
disabled={!canClaimHat2}
className="btn btn-secondary btn-sm font-normal gap-1"
onClick={async () => {
await claimHat2();
await refetchBalance2();
}}
>
{"Claim (500 Lifetime Tokens)"}
</button>
</div>

<div className="flex flex-col justify-center items-center">
<p>{result3?.data?.name}</p>
{balanceOfClaimableHat3 || 0 > 0 ? <p className="text-green-700">Equipped</p> : <></>}

{/* eslint-disable-next-line @next/next/no-img-element */}
<img
src={result3?.data?.image.replace("ipfs://", "https://nftstorage.link/ipfs/")}
width={156}
height={156}
alt={"Hat 1"}
></img>
<p className="w-96 text-center">{result3?.data?.description}</p>
<button
disabled={!canClaimHat3}
className="btn btn-secondary btn-sm font-normal gap-1"
onClick={async () => {
await claimHat3();
await refetchBalance3();
}}
>
{"Claim (1500 Lifetime Tokens)"}
</button>
</div>
</div>
</div>
</>
);
Expand Down
12 changes: 6 additions & 6 deletions packages/nextjs/contracts/deployedContracts.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ import { GenericContractsDeclaration } from "~~/utils/scaffold-eth/contract";
const deployedContracts = {
31337: {
ReputationTokens: {
address: "0x5FbDB2315678afecb367f032d93F642f64180aa3",
address: "0x1613beB3B2C4f22Ee086B2b38C1476A3cE7f78E8",
abi: [
{
type: "constructor",
Expand Down Expand Up @@ -1512,7 +1512,7 @@ const deployedContracts = {
},
},
ReputationFaucet: {
address: "0x0DCd1Bf9A1b36cE34237eEaFef220932846BCD82",
address: "0x809d550fca64d94Bd9F66E60752A544199cfAC3D",
abi: [
{
type: "constructor",
Expand Down Expand Up @@ -1637,7 +1637,7 @@ const deployedContracts = {
},
},
Hats: {
address: "0x7a2088a1bFc9d81c55368AE168C2C02570cB814F",
address: "0xcbEAF3BDe82155F56486Fb5a1072cb8baAf547cc",
abi: [
{
type: "constructor",
Expand Down Expand Up @@ -3598,7 +3598,7 @@ const deployedContracts = {
},
},
MultiClaimsHatter: {
address: "0x67d269191c92Caf3cD7723F116c85e6E9bf55933",
address: "0x162A433068F51e18b7d13932F27e66a3f99E6890",
abi: [
{
type: "constructor",
Expand Down Expand Up @@ -3924,7 +3924,7 @@ const deployedContracts = {
},
},
ActiveModule: {
address: "0xc3e53F4d16Ae77Db1c982e75a937B9f60FE63690",
address: "0x5081a39b8A5f0E35a8D959395a630b68B74Dd30f",
abi: [
{
type: "function",
Expand Down Expand Up @@ -3954,7 +3954,7 @@ const deployedContracts = {
inheritedFunctions: {},
},
ERC1155EligibiltiyModule: {
address: "0x84eA74d481Ee0A5332c457a4d796187F6Ba67fEB",
address: "0x1fA02b2d6A771842690194Cf62D91bdd92BfE28d",
abi: [
{
type: "constructor",
Expand Down

0 comments on commit 5546552

Please sign in to comment.