-

{
+ alt="Not Found"
+ onError={({ currentTarget }) => {
currentTarget.onerror = null; // prevents looping
- currentTarget.src="https://i0.wp.com/zeevector.com/wp-content/uploads/2021/02/black-grey-gradient-background.jpg?resize=768%2C576&ssl=1";
+ currentTarget.src =
+ "https://i0.wp.com/zeevector.com/wp-content/uploads/2021/02/black-grey-gradient-background.jpg?resize=768%2C576&ssl=1";
}}
-
- >
-
+ >
diff --git a/src/components/proposal/AddUserPermissions.tsx b/src/components/proposal/AddUserPermissions.tsx
new file mode 100644
index 0000000..05c3740
--- /dev/null
+++ b/src/components/proposal/AddUserPermissions.tsx
@@ -0,0 +1,479 @@
+import React, { useContext, useState, useEffect, useCallback } from "react";
+import { MdNavigateNext, MdOutlineNavigateBefore } from "react-icons/md";
+import { SingleSelect, Input } from "../../components";
+import { CreateProposalContext } from "../../context/CreateProposalContext";
+// import { daoCategoryItems } from "../../constants/daoCategoryItems";
+import Switch from "@material-ui/core/Switch";
+import { toast } from "react-toastify";
+import { VALIDATORS } from "../../constants/globals";
+import { getDaoByCID } from "../../services/keezBackend";
+import { getParsedJsonObj } from "../../utils/getParsedJsonObj";
+// import { StyledPopover } from "../../styles";
+import InfoPopOver from "../InfoPopOver";
+import {
+ permissionContract,
+ universalProfileContract,
+} from "../../services/web3";
+import Select from "../Select";
+import { useLocation } from "react-router-dom";
+
+const AddUserPermission = () => {
+ // const classes = StyledPopover();
+
+ // const { handleComponent } = props;
+ const {
+ proposalName,
+ setProposalName,
+ categories,
+ // setCategories,
+ description,
+ setDescription,
+ setKeyPermissions,
+ // setVaultPermissions,
+ keyPermissions,
+ // vaultPermissions,
+ membersOrVault,
+ // setMembersOrVault,
+ // daoCid,
+ } = useContext(CreateProposalContext);
+
+ const location = useLocation() as any;
+ const daoCid = location.state.CID;
+ const [executePermission, setExecutePermission] = useState(false);
+ const [registerVotesPermission, setRegisterVotesPermission] =
+ useState(false);
+ const [addPermission, setAddPermission] = useState(false);
+ const [removePermission, setRemovePermission] = useState(false);
+ const [votePermission, setVotePermission] = useState(false);
+ const [proposePermission, setProposePermission] = useState(false);
+ const [sendDelegatePermission, setSendDelegatePermission] =
+ useState(false);
+ const [receiveDelegatePermission, setReceiveDelegatePermission] =
+ useState(false);
+ const [memberAddress, setMemberAddress] = useState("");
+ // const [addOrRevoke, setAddOrRevoke] = useState("Add"); // true -> Add / false -> revoke
+ const daoSelected = location.state.dao;
+ const [memberExist, setMemberExists] = useState(false);
+
+ toast.configure();
+
+ const formSubmitValidations = () => {
+ if (!memberAddress || memberAddress.length === 0) {
+ return "Please enter an address";
+ }
+ if (memberExist) {
+ return "Member already exists";
+ }
+
+ // if (!categories || categories.length === 0) {
+ // return "Please select atleast one category for your proposal";
+ // }
+
+ // if (!description || description.length === 0) {
+ // return "Please add description for your proposal";
+ // }
+
+ return "success";
+ };
+ const universalProfile = getParsedJsonObj(
+ daoSelected?.daoUpAddress
+ )?.universalProfile;
+ const getPermissions = useCallback(async () => {
+ if (memberAddress) {
+ try {
+ let contract1 = await universalProfileContract(universalProfile)
+ ["getData(bytes32[])"]([
+ "0x4b80742de2bfb3cc0e490000" + memberAddress.substring(2),
+ ])
+ .call();
+ const permissionBin = parseInt(contract1[0], 16).toString(2);
+ setRegisterVotesPermission(permissionBin[0] === "1");
+ setRemovePermission(permissionBin[1] === "1");
+ setAddPermission(permissionBin[2] === "1");
+ setReceiveDelegatePermission(permissionBin[3] === "1");
+ setSendDelegatePermission(permissionBin[4] === "1");
+ setExecutePermission(permissionBin[5] === "1");
+ setProposePermission(permissionBin[6] === "1");
+ setVotePermission(permissionBin[7] === "1");
+ } catch {
+ toast.error("An error ocurred, check your connection", {
+ position: toast.POSITION.BOTTOM_RIGHT,
+ });
+ }
+ }
+ }, [universalProfile, memberAddress]);
+ const verifyExistence = useCallback(async () => {
+ try {
+ const contract1 = await universalProfileContract(universalProfile)[
+ "getData(bytes32[])"
+ ](["0x4b80742de2bfb3cc0e490000" + memberAddress.substring(2)]);
+ if (contract1) {
+ setMemberExists(true);
+ } else {
+ setMemberExists(false);
+ }
+ } catch {
+ setMemberExists(false);
+ }
+ }, [memberAddress]);
+
+ const handleSubmit = async (event: React.FormEvent) => {
+ event.preventDefault();
+
+ if (VALIDATORS) {
+ const validationResult = formSubmitValidations();
+
+ if (validationResult !== "success") {
+ return toast.error(validationResult, {
+ position: toast.POSITION.BOTTOM_RIGHT,
+ });
+ }
+ }
+ // if (membersOrVault === "Members"){
+ const permissionbyte =
+ (registerVotesPermission << 7) +
+ (removePermission << 6) +
+ (addPermission << 5) +
+ (receiveDelegatePermission << 4) +
+ (sendDelegatePermission << 3) +
+ (executePermission << 2) +
+ (proposePermission << 1) +
+ votePermission;
+ await permissionContract(universalProfile, memberAddress, permissionbyte);
+ setKeyPermissions({
+ upAddress: memberAddress,
+ keyPermissions: {
+ vote: votePermission,
+ propose: proposePermission,
+ execute: executePermission,
+ registerVotes: registerVotesPermission,
+ addPermission: addPermission,
+ removePermission: removePermission,
+ sendDelegate: sendDelegatePermission,
+ receiveDelegate: receiveDelegatePermission,
+ },
+ });
+ // } else if (membersOrVault === "Vault"){
+ // setVaultPermissions({vaultAddress:"", action:addOrRevoke});
+ // }
+ // console.log(membersOrVault);
+ // console.log(addOrRevoke);
+ console.log("kp= ", keyPermissions);
+ // console.log(vaultPermissions);
+ };
+
+ const handleBack = async (event: React.FormEvent) => {
+ event.preventDefault();
+ };
+
+ // const handleCategoriesChange = (selectedOption: any) => {
+ // setCategories(selectedOption);
+ // };
+
+ // const handleMemberChange = (selectedOption: any) => {
+ // const selection = membersList.find(
+ // (element: any) => element.label === selectedOption.label
+ // );
+ // if (selection) setMemberAddress(selection.label);
+ // };
+
+ // const handleMasterKeyChange = () => {
+ // console.log(masterKeyPermission);
+ // setMasterKeyPermission(!masterKeyPermission);
+ // }
+
+ // const onChangeAddOrRevoke = (event: any) => {
+ // console.log(event.target.value);
+ // setAddOrRevoke(event.target.value)
+ // }
+
+ // const onChangeMembersOrVault = (event: any) => {
+ // console.log(event.target.value);
+ // setMembersOrVault(event.target.value)
+ // }
+
+ useEffect(() => {
+ window.scrollTo(0, 0);
+ }, []);
+ useEffect(() => {
+ if (memberAddress) {
+ verifyExistence();
+ }
+ }, [memberAddress, verifyExistence]);
+
+ useEffect(() => {
+ if (daoCid) {
+ const fetchData = async () => {
+ const result = await getDaoByCID(daoCid);
+ console.log("doa selected set", result);
+ };
+ fetchData();
+ }
+ }, [daoCid]);
+
+ useEffect(() => {
+ if (memberAddress) {
+ getPermissions();
+ }
+ // for (var i = 0; i < permissionsObject.length; i++) {
+ // if (permissionsObject[i].upAddress == memberAddress) {
+ // setVotePermission(permissionsObject[i].keyPermissions.vote === "True");
+ // setProposePermission(
+ // permissionsObject[i].keyPermissions.propose === "True"
+ // );
+ // setSendDelegatePermission(
+ // permissionsObject[i].keyPermissions.sendDelegate === "True"
+ // );
+ // setReceiveDelegatePermission(
+ // permissionsObject[i].keyPermissions.receiveDelegate === "True"
+ // );
+ // setRegisterVotesPermission(
+ // permissionsObject[i].keyPermissions?.registerVotes === "True"
+ // );
+ // setAddPermission(
+ // permissionsObject[i].keyPermissions?.addPermission === "True"
+ // );
+ // setRemovePermission(
+ // permissionsObject[i].keyPermissions?.removePermission === "True"
+ // );
+ // setExecutePermission(
+ // permissionsObject[i].keyPermissions?.execute === "True"
+ // );
+ // }
+ // }
+ // console.log("member changes");
+ // console.log(permissionsObject);
+ // console.log(daoSelected);
+ }, [memberAddress, getPermissions]);
+
+ const permissionsObject =
+ daoSelected.length !== ""
+ ? getParsedJsonObj(daoSelected?.keyPermissions)
+ : "";
+ // console.log(JSON.stringify(permissionsObject));
+ const membersList: any = [];
+
+ Object.keys(permissionsObject).forEach(function (key, index) {
+ membersList[key] = {
+ value: permissionsObject[key].upAddress,
+ label: permissionsObject[key].upAddress,
+ };
+ });
+
+ toast.configure();
+ return (
+
+ );
+};
+
+export default AddUserPermission;
diff --git a/src/components/proposal/ChooseDao.tsx b/src/components/proposal/ChooseDao.tsx
index 898e582..eafa212 100644
--- a/src/components/proposal/ChooseDao.tsx
+++ b/src/components/proposal/ChooseDao.tsx
@@ -14,7 +14,7 @@ const ChooseDao = (props: { handleComponent: any }) => {
const [daoSelected, setDaoSelected] = useState(0);
const [zeroMember, setZeroMember] = useState(false);
const [memberDaos, setMemberDaos] = useState([]);
- const { setDaoCid } = useContext(CreateProposalContext);
+ const { setDaoCid, setDaoUpAddress } = useContext(CreateProposalContext);
const { accountAddress } = useContext(ProfileContext);
const handleSubmit = async (event: React.FormEvent) => {
@@ -26,12 +26,14 @@ const ChooseDao = (props: { handleComponent: any }) => {
const handleDaoSelection = async (
event: React.FormEvent,
id: number,
- CID: string
+ CID: string,
+ upAddress: string
) => {
event.preventDefault();
setDaoSelected(id);
// console.log("set dao cid", CID);
setDaoCid(CID);
+ setDaoUpAddress(upAddress);
};
useEffect(() => {
@@ -42,10 +44,15 @@ const ChooseDao = (props: { handleComponent: any }) => {
if (accountAddress) {
const fetchData = async () => {
const result = await getDaoByMember(accountAddress);
+ console.log(result);
// console.log("x ->",result);
setMemberDaos(result);
- if (result.length >0) {
+ if (result.length > 0) {
setZeroMember(false);
+ setDaoUpAddress(
+ getParsedJsonObj(result[result.length - 1].daoUpAddress)
+ .universalProfile
+ );
setDaoCid(result[result.length - 1].CID);
// console.log("CID",result[result.length - 1].CID)
} else {
@@ -58,69 +65,71 @@ const ChooseDao = (props: { handleComponent: any }) => {
return (
- {zeroMember &&
- //
-
-
- //
+ {
+ zeroMember && (
+ //
+
+ )
+
+ //
}
-
Step 1
-
- Choose a DAO to create a proposal for
-
-
);
};
@@ -149,11 +158,17 @@ const DaoCard = (props: {
const navigate = useNavigate();
const profileImageObj = getParsedJsonObj(daoDetail.profileImage);
const profileImageUrl = profileImageObj.url.concat(profileImageObj.hash);
-
return (
handleDaoSelection(event, id, daoDetail.CID)}
+ onClick={(event) =>
+ handleDaoSelection(
+ event,
+ id,
+ daoDetail.CID,
+ getParsedJsonObj(daoDetail.daoUpAddress).universalProfile
+ )
+ }
onMouseLeave={handleMouseOut}
onMouseEnter={handleMouseOver}
>
@@ -167,21 +182,18 @@ const DaoCard = (props: {
>
{" "}
-

-
+
-
{" "}
{categoriesObject[0].label}
{" "}
{" "}
-
{" "}
diff --git a/src/components/proposal/PermissionTemplate.tsx b/src/components/proposal/PermissionTemplate.tsx
index 01ff66b..43b484c 100644
--- a/src/components/proposal/PermissionTemplate.tsx
+++ b/src/components/proposal/PermissionTemplate.tsx
@@ -1,4 +1,4 @@
-import React, { useContext, useState, useEffect } from "react";
+import React, { useContext, useState, useEffect, useCallback } from "react";
import { MdNavigateNext, MdOutlineNavigateBefore } from "react-icons/md";
import { SingleSelect, Input } from "../../components";
import { CreateProposalContext } from "../../context/CreateProposalContext";
@@ -8,26 +8,29 @@ import { toast } from "react-toastify";
import { VALIDATORS } from "../../constants/globals";
import { getDaoByCID } from "../../services/keezBackend";
import { getParsedJsonObj } from "../../utils/getParsedJsonObj";
-import { StyledPopover } from "../../styles";
+// import { StyledPopover } from "../../styles";
import InfoPopOver from "../InfoPopOver";
+import { universalProfileContract } from "../../services/web3";
+import Select from "../Select";
+import { ethers } from "ethers";
const PermissionsTemplate = (props: { handleComponent: any }) => {
- const classes = StyledPopover();
+ // const classes = StyledPopover();
const { handleComponent } = props;
const {
proposalName,
setProposalName,
categories,
- setCategories,
+ // setCategories,
description,
setDescription,
setKeyPermissions,
- setVaultPermissions,
+ // setVaultPermissions,
keyPermissions,
- vaultPermissions,
+ // vaultPermissions,
membersOrVault,
- setMembersOrVault,
+ // setMembersOrVault,
daoCid,
} = useContext(CreateProposalContext);
@@ -43,8 +46,10 @@ const PermissionsTemplate = (props: { handleComponent: any }) => {
const [receiveDelegatePermission, setReceiveDelegatePermission] =
useState(false);
const [memberAddress, setMemberAddress] = useState("");
- const [addOrRevoke, setAddOrRevoke] = useState("Add"); // true -> Add / false -> revoke
+ // const [addOrRevoke, setAddOrRevoke] = useState("Add"); // true -> Add / false -> revoke
const [daoSelected, setDaoSelected] = useState([]);
+ const [addNewUser, setAddNewUser] = useState(false);
+ const [membersList, setMembers] = useState([]);
toast.configure();
@@ -63,6 +68,33 @@ const PermissionsTemplate = (props: { handleComponent: any }) => {
return "success";
};
+ const universalProfile = getParsedJsonObj(
+ daoSelected?.daoUpAddress
+ )?.universalProfile;
+ const getPermissions = useCallback(async () => {
+ if (memberAddress) {
+ try {
+ let contract1 = await universalProfileContract(universalProfile)
+ ["getData(bytes32[])"]([
+ "0x4b80742de2bfb3cc0e490000" + memberAddress.substring(2),
+ ])
+ .call();
+ const permissionBin = parseInt(contract1[0], 16).toString(2);
+ setRegisterVotesPermission(permissionBin[0] === "1");
+ setRemovePermission(permissionBin[1] === "1");
+ setAddPermission(permissionBin[2] === "1");
+ setReceiveDelegatePermission(permissionBin[3] === "1");
+ setSendDelegatePermission(permissionBin[4] === "1");
+ setExecutePermission(permissionBin[5] === "1");
+ setProposePermission(permissionBin[6] === "1");
+ setVotePermission(permissionBin[7] === "1");
+ } catch {
+ toast.error("An error ocurred, check your connection", {
+ position: toast.POSITION.BOTTOM_RIGHT,
+ });
+ }
+ }
+ }, [universalProfile, memberAddress]);
const handleSubmit = async (event: React.FormEvent) => {
event.preventDefault();
@@ -106,9 +138,9 @@ const PermissionsTemplate = (props: { handleComponent: any }) => {
handleComponent("ChooseTemplate");
};
- const handleCategoriesChange = (selectedOption: any) => {
- setCategories(selectedOption);
- };
+ // const handleCategoriesChange = (selectedOption: any) => {
+ // setCategories(selectedOption);
+ // };
const handleMemberChange = (selectedOption: any) => {
const selection = membersList.find(
@@ -145,53 +177,77 @@ const PermissionsTemplate = (props: { handleComponent: any }) => {
};
fetchData();
}
- }, []);
+ }, [daoCid]);
useEffect(() => {
- for (var i = 0; i < permissionsObject.length; i++) {
- if (permissionsObject[i].upAddress == memberAddress) {
- setVotePermission(permissionsObject[i].keyPermissions.vote === "True");
- setProposePermission(
- permissionsObject[i].keyPermissions.propose === "True"
- );
- setSendDelegatePermission(
- permissionsObject[i].keyPermissions.sendDelegate === "True"
- );
- setReceiveDelegatePermission(
- permissionsObject[i].keyPermissions.receiveDelegate === "True"
- );
- setRegisterVotesPermission(
- permissionsObject[i].keyPermissions?.registerVotes === "True"
- );
- setAddPermission(
- permissionsObject[i].keyPermissions?.addPermission === "True"
- );
- setRemovePermission(
- permissionsObject[i].keyPermissions?.removePermission === "True"
- );
- setExecutePermission(
- permissionsObject[i].keyPermissions?.execute === "True"
- );
- }
+ if (memberAddress) {
+ getPermissions();
}
- console.log("member changes");
- console.log(permissionsObject);
- console.log(daoSelected);
- }, [memberAddress]);
+ // for (var i = 0; i < permissionsObject.length; i++) {
+ // if (permissionsObject[i].upAddress == memberAddress) {
+ // setVotePermission(permissionsObject[i].keyPermissions.vote === "True");
+ // setProposePermission(
+ // permissionsObject[i].keyPermissions.propose === "True"
+ // );
+ // setSendDelegatePermission(
+ // permissionsObject[i].keyPermissions.sendDelegate === "True"
+ // );
+ // setReceiveDelegatePermission(
+ // permissionsObject[i].keyPermissions.receiveDelegate === "True"
+ // );
+ // setRegisterVotesPermission(
+ // permissionsObject[i].keyPermissions?.registerVotes === "True"
+ // );
+ // setAddPermission(
+ // permissionsObject[i].keyPermissions?.addPermission === "True"
+ // );
+ // setRemovePermission(
+ // permissionsObject[i].keyPermissions?.removePermission === "True"
+ // );
+ // setExecutePermission(
+ // permissionsObject[i].keyPermissions?.execute === "True"
+ // );
+ // }
+ // }
+ // console.log("member changes");
+ // console.log(permissionsObject);
+ // console.log(daoSelected);
+ }, [memberAddress, getPermissions]);
const permissionsObject =
- daoSelected.length != ""
+ daoSelected.length !== ""
? getParsedJsonObj(daoSelected.keyPermissions)
: "";
// console.log(JSON.stringify(permissionsObject));
- const membersList: any = [];
-
- Object.keys(permissionsObject).forEach(function (key, index) {
- membersList[key] = {
- value: permissionsObject[key].upAddress,
- label: permissionsObject[key].upAddress,
- };
- });
+ const getProfile = useCallback(async () => {
+ let contract = await universalProfileContract(universalProfile)
+ ["getData(bytes32[])"]([
+ // DAO Settings
+ "0xf7f9c7410dd493d79ebdaee15bbc77fd163bd488f54107d1be6ed34b1e099004",
+ ])
+ .call();
+ let totalMembers: number = parseInt(contract[0]);
+ let members = [];
+ if (totalMembers >= 0) {
+ console.log(totalMembers);
+ for (let i = 0; i < totalMembers; i++) {
+ console.log(i);
+ let contract = await universalProfileContract(universalProfile)
+ ["getData(bytes32[])"]([
+ "0xf7f9c7410dd493d79ebdaee15bbc77fd" +
+ ethers.utils
+ .hexZeroPad(ethers.utils.hexValue(i), 16)
+ .substring(2),
+ ])
+ .call();
+ members.push({ label: contract[0], value: contract[0] });
+ }
+ setMembers(members);
+ }
+ }, [universalProfile]);
+ useEffect(() => {
+ getProfile();
+ }, [getProfile]);
toast.configure();
return (
@@ -296,15 +352,67 @@ const PermissionsTemplate = (props: { handleComponent: any }) => {
htmlFor="minVotingPeriod"
>
Choose {membersOrVault === "Members" ? "Address" : "Vault"} from
- List
+ List or Add new member
-
{
+ setAddNewUser((value) => !value);
+ setMemberAddress("");
+ }}
+ options={[
+ {
+ value: true,
+ label: "Add new member",
+ },
+ {
+ value: false,
+ label: "Choose from list",
+ },
+ ]}
/>
+ {!addNewUser ? (
+ <>
+
+
+
+
+
+ >
+ ) : (
+ <>
+
+
+
+
+
+ {
+ setMemberAddress(e.target.value);
+ }}
+ />
+ >
+ )}
{membersOrVault === "Members" && (
<>
diff --git a/src/components/proposal/VotingTemplate.tsx b/src/components/proposal/VotingTemplate.tsx
index 1103016..f5ddb2a 100644
--- a/src/components/proposal/VotingTemplate.tsx
+++ b/src/components/proposal/VotingTemplate.tsx
@@ -1,15 +1,18 @@
-import React, { useContext, useEffect } from "react";
+import React, { useCallback, useContext, useEffect, useState } from "react";
import { MdNavigateNext, MdOutlineNavigateBefore } from "react-icons/md";
-import { SingleSelect, Input } from "../../components";
+import { Input } from "../../components";
import { CreateProposalContext } from "../../context/CreateProposalContext";
// import { daoCategoryItems } from "../../constants/daoCategoryItems";
import {
votingPeriodItems,
votingDelayItems,
+ votingParams,
} from "../../constants/votingPeriodItems";
import { toast } from "react-toastify";
import { VALIDATORS } from "../../constants/globals";
import InfoPopOver from "../InfoPopOver";
+import { universalProfileContract } from "../../services/web3";
+import Select from "../Select";
const VotingTemplate = (props: { handleComponent: any }) => {
const { handleComponent } = props;
@@ -24,15 +27,18 @@ const VotingTemplate = (props: { handleComponent: any }) => {
setParticipationRate,
votingMajority,
setVotingMajority,
- // minVotingDelay,
setMinVotingDelay,
- // minVotingPeriod,
+ minVotingDelay,
+ minExecutionDelay,
+ minVotingPeriod,
setMinVotingPeriod,
setMinExecutionDelay,
+ daoUpAddress,
} = useContext(CreateProposalContext);
toast.configure();
-
+ const [votingParameters, setVotingParams] = useState({});
+ const [paramState, setParamState] = useState(true);
const formSubmitValidations = () => {
if (!proposalName || proposalName.length === 0) {
return "Please enter a proposal title";
@@ -69,29 +75,53 @@ const VotingTemplate = (props: { handleComponent: any }) => {
handleComponent("PreviewProposal");
};
- const handleMinVotingDelay = (selectedOption: any) => {
- const selection = votingDelayItems.find(
- (element) => element.label === selectedOption.label
- ) || { value: 0, label: "instant" };
- setMinVotingDelay(selection.value);
- console.log(selectedOption);
- console.log(selection);
+ // const handleMinVotingDelay = (selectedOption: any) => {
+ // const selection = votingDelayItems.find(
+ // (element) => element.label === selectedOption.label
+ // ) || { value: 0, label: "instant" };
+ // setMinVotingDelay(selection.value);
+ // console.log(selectedOption);
+ // console.log(selection);
+ // };
+ const handleMinVotingDelay1 = (e: any) => {
+ setMinVotingDelay(parseInt(e.target.value));
+ console.log(typeof e.target.value);
+ console.log(e.target.value);
};
- const handleMinVotingPeriod = (selectedOption: any) => {
- const selection = votingPeriodItems.find(
- (element) => element.label === selectedOption.label
- ) || { value: 1, label: "24 hrs" };
- setMinVotingPeriod(selection.value);
- console.log(selection);
+ // const handleMinVotingPeriod = (selectedOption: any) => {
+ // const selection = votingPeriodItems.find(
+ // (element) => element.label === selectedOption.label
+ // ) || { value: 1, label: "24 hrs" };
+ // setMinVotingPeriod(selection.value);
+ // console.log(selection);
+ // };
+ const handleMinVotingPeriod1 = (e: any) => {
+ setMinVotingPeriod(parseInt(e.target.value));
+ console.log(typeof e.target.value);
+ console.log(e.target.value);
+ };
+ // const handleParamChange = (selectedOption: any) => {
+ // console.log(selectedOption);
+ // setParamState(selectedOption.value);
+ // };
+ const handleParamChange1 = (e: any) => {
+ setParamState((prev) => !prev);
+ console.log(typeof Boolean(e.target.value));
+ console.log(e.target.value);
};
- const handleMinExecutionDelay = (selectedOption: any) => {
- const selection = votingDelayItems.find(
- (element) => element.label === selectedOption.label
- ) || { value: 0, label: "instant" };
- setMinExecutionDelay(selection.value);
- console.log(selection);
+ // const handleMinExecutionDelay = (selectedOption: any) => {
+ // const selection = votingDelayItems.find(
+ // (element) => element.label === selectedOption.label
+ // ) || { value: 0, label: "instant" };
+ // setMinExecutionDelay(selection.value);
+ // console.log(selection);
+ // };
+ const handleMinExecutionDelay1 = (e: any) => {
+ setMinExecutionDelay(parseInt(e.target.value));
+ console.log(typeof e.target.value);
+ console.log(e.target.value);
};
const handleBack = async (event: React.FormEvent) => {
@@ -102,10 +132,57 @@ const VotingTemplate = (props: { handleComponent: any }) => {
// const handleCategoriesChange = (selectedOption: any) => {
// setCategories(selectedOption);
// };
+ const getProfile = useCallback(async () => {
+ let contract = await universalProfileContract(daoUpAddress)
+ ["getData(bytes32[])"]([
+ // DAO Settings
+ "0xbc776f168e7b9c60bb2a7180950facd372cd90c841732d963c31a93ff9f8c127",
+ "0xf89f507ecd9cb7646ce1514ec6ab90d695dac9314c3771f451fd90148a3335a9",
+ "0x799787138cc40d7a47af8e69bdea98db14e1ead8227cef96814fa51751e25c76",
+ "0xd3cf4cd71858ea36c3f5ce43955db04cbe9e1f42a2c7795c25c1d430c9bb280a",
+ "0xb207580c05383177027a90d6c298046d3d60dfa05a32b0bb48ea9015e11a3424",
+ ])
+ .call();
+ const Params = {
+ votingMajority: parseInt(contract[0]),
+ participationRate: parseInt(contract[1]),
+ minVotingDelay: parseInt(contract[2]),
+ minVotingPeriod: parseInt(contract[3]) / (24 * 3600),
+ minExecutionDelay: parseInt(contract[4]) / (24 * 3600),
+ };
+ setVotingParams(Params);
+ }, [daoUpAddress]);
useEffect(() => {
window.scrollTo(0, 0);
- }, []);
+ console.log(daoUpAddress);
+ getProfile();
+ }, [daoUpAddress, getProfile]);
+ useEffect(() => {
+ if (!paramState) {
+ setParticipationRate(votingParameters?.participationRate);
+ setVotingMajority(votingParameters?.votingMajority);
+ setMinVotingDelay(votingParameters?.minVotingDelay);
+ setMinExecutionDelay(votingParameters?.minExecutionDelay);
+ setMinVotingPeriod(votingParameters?.minVotingPeriod);
+ }
+ // else {
+ // setParticipationRate(0);
+ // setVotingMajority(0);
+ // setMinVotingDelay(0);
+ // setMinExecutionDelay(0);
+ // setMinVotingPeriod(0);
+ // }
+ }, [
+ paramState,
+ votingParameters,
+ setParticipationRate,
+ setVotingMajority,
+ setMinVotingDelay,
+ setMinExecutionDelay,
+ setMinVotingPeriod,
+ ]);
+ console.log(votingParameters);
toast.configure();
@@ -211,6 +288,32 @@ const VotingTemplate = (props: { handleComponent: any }) => {
name="description"
onChange={(e: any) => setDescription(e.target.value)}
/>
+
+
+
+
+
+ {/* */}
+
- */}
+
@@ -299,10 +408,16 @@ const VotingTemplate = (props: { handleComponent: any }) => {
/>
- */}
+
@@ -319,10 +434,16 @@ const VotingTemplate = (props: { handleComponent: any }) => {
/>
- */}
+
diff --git a/src/constants/votingPeriodItems.ts b/src/constants/votingPeriodItems.ts
index 4e5d9cd..12f2535 100644
--- a/src/constants/votingPeriodItems.ts
+++ b/src/constants/votingPeriodItems.ts
@@ -1,49 +1,58 @@
export const votingPeriodItems = [
- {
- value: "1",
- label: "24 hrs",
- },
- {
- value: "2",
- label: "48 hrs",
- },
- {
- value: "3",
- label: "72 hrs",
- },
- {
- value: "7",
- label: "One Week",
- },
- {
- value: "14",
- label: "Two Weeks",
- },
- ];
-
- export const votingDelayItems = [
- {
- value: "0",
- label: "Instant",
- },
- {
- value: "1",
- label: "24 hrs",
- },
- {
- value: "2",
- label: "48 hrs",
- },
- {
- value: "3",
- label: "72 hrs",
- },
- {
- value: "7",
- label: "One Week",
- },
- {
- value: "14",
- label: "Two Weeks",
- },
- ];
\ No newline at end of file
+ {
+ value: "1",
+ label: "24 hrs",
+ },
+ {
+ value: "2",
+ label: "48 hrs",
+ },
+ {
+ value: "3",
+ label: "72 hrs",
+ },
+ {
+ value: "7",
+ label: "One Week",
+ },
+ {
+ value: "14",
+ label: "Two Weeks",
+ },
+];
+export const votingParams = [
+ {
+ value: true,
+ label: "Custom Voting Parameters",
+ },
+ {
+ value: false,
+ label: "Default Voting Parameters",
+ },
+];
+export const votingDelayItems = [
+ {
+ value: "0",
+ label: "Instant",
+ },
+ {
+ value: "1",
+ label: "24 hrs",
+ },
+ {
+ value: "2",
+ label: "48 hrs",
+ },
+ {
+ value: "3",
+ label: "72 hrs",
+ },
+ {
+ value: "7",
+ label: "One Week",
+ },
+ {
+ value: "14",
+ label: "Two Weeks",
+ },
+];
diff --git a/src/context/CreateProposalContext.tsx b/src/context/CreateProposalContext.tsx
index 9a0c2ef..5c5327b 100644
--- a/src/context/CreateProposalContext.tsx
+++ b/src/context/CreateProposalContext.tsx
@@ -1,181 +1,260 @@
-import React, {useState} from 'react';
+import React, { useState } from "react";
interface CreateProposalContextInterface {
- proposalName: string;
- setProposalName: any;
- categories: {value:string, label:string}[];
- setCategories: any;
- description: string;
- setDescription: any;
- participationRate: number;
- setParticipationRate: any;
- votingMajority: number;
- setVotingMajority: any;
- minVotingDelay: number;
- setMinVotingDelay: any;
- minVotingPeriod: number;
- setMinVotingPeriod: any;
- minExecutionDelay: number;
- setMinExecutionDelay: any;
-
- selectedVault: string;
- setSelectedVault: any;
- selectedToken: string;
- setSelectedToken: any;
- tokenAmount: number;
- setTokenAmount: any;
- receivingAddress: string;
- setReceivingAddress: any;
-
- coverImageFile: File|undefined;
- setCoverImageFile: any;
- votingOptions: string[];
- setVotingOptions: any;
-
- keyPermissions: {upAddress:string, action: string, keyPermissions:{vote:boolean, propose:boolean, execute:boolean, addPermission:boolean, removePermission:boolean, registerVotes:boolean, sendDelegate:boolean, receiveDelegate:boolean}};
- setKeyPermissions: any;
-
- vaultPermissions: {vaultAddress:string, action: string};
- setVaultPermissions: any;
-
- membersOrVault: string;
- setMembersOrVault: any;
-
- proposer: string;
- setProposer: any;
- proposalType: string;
- setProposalType: any;
- daoCid: string;
- setDaoCid: any;
+ proposalName: string;
+ setProposalName: any;
+ categories: { value: string; label: string }[];
+ setCategories: any;
+ description: string;
+ setDescription: any;
+ participationRate: number;
+ setParticipationRate: any;
+ votingMajority: number;
+ setVotingMajority: any;
+ minVotingDelay: number;
+ setMinVotingDelay: any;
+ minVotingPeriod: number;
+ setMinVotingPeriod: any;
+ minExecutionDelay: number;
+ setMinExecutionDelay: any;
+
+ selectedVault: string;
+ setSelectedVault: any;
+ selectedToken: string;
+ setSelectedToken: any;
+ tokenAmount: number;
+ setTokenAmount: any;
+ receivingAddress: string;
+ setReceivingAddress: any;
+
+ coverImageFile: File | undefined;
+ setCoverImageFile: any;
+ votingOptions: string[];
+ setVotingOptions: any;
+
+ keyPermissions: {
+ upAddress: string;
+ action: string;
+ keyPermissions: {
+ vote: boolean;
+ propose: boolean;
+ execute: boolean;
+ addPermission: boolean;
+ removePermission: boolean;
+ registerVotes: boolean;
+ sendDelegate: boolean;
+ receiveDelegate: boolean;
+ };
+ };
+ setKeyPermissions: any;
+
+ vaultPermissions: { vaultAddress: string; action: string };
+ setVaultPermissions: any;
+
+ membersOrVault: string;
+ setMembersOrVault: any;
+
+ proposer: string;
+ setProposer: any;
+ proposalType: string;
+ setProposalType: any;
+ daoCid: string;
+ setDaoCid: any;
+ daoUpAddress: string;
+ setDaoUpAddress: any;
+ formComponent: string;
+ setFormComponent?: any;
}
-export const CreateProposalContext = React.createContext
(
- {
- proposalName: '',
- setProposalName: () => {},
- categories: [{value: "DAO", label: "DAO"},{value: "Social", label: "Social"}],
- setCategories: () => {},
- description: '',
- setDescription: () => {},
- participationRate: 0,
- setParticipationRate: () => {},
- votingMajority: 0,
- setVotingMajority: () => {},
- minVotingDelay: 0,
- setMinVotingDelay: () => {},
- minVotingPeriod: 1,
- setMinVotingPeriod: () => {},
- minExecutionDelay: 0,
- setMinExecutionDelay: () => {},
-
- selectedVault: '',
- setSelectedVault: () => {},
- selectedToken: '',
- setSelectedToken: () => {},
- tokenAmount: 0,
- setTokenAmount: () => {},
- receivingAddress: '',
- setReceivingAddress: () => {},
-
-
- coverImageFile: null as any,
- setCoverImageFile: () => {},
- votingOptions: [],
- setVotingOptions: () => {},
-
- keyPermissions: {upAddress:"", action: "", keyPermissions:{vote:false, propose:false, execute:false, addPermission:false, removePermission:false, registerVotes:false, sendDelegate:false, receiveDelegate:false}},
- setKeyPermissions: () => {},
- vaultPermissions: {vaultAddress:"", action:""},
- setVaultPermissions: () => {},
- membersOrVault: "",
- setMembersOrVault: () => {},
-
- proposer: '',
- setProposer: () => {},
- proposalType: '',
- setProposalType: () => {},
- daoCid: '',
- setDaoCid: () => {},
- }
-);
-
-export const CreateProposalContextProvider = ({children}:any) => {
- const [proposalName, setProposalName] = useState('');
- const [categories, setCategories] = useState<{value:string, label:string}[]>([{value: "DAO", label: "DAO"},{value: "Social", label: "Social"}]);
- const [description, setDescription] = useState('');
- const [participationRate, setParticipationRate] = useState(0);
- const [votingMajority, setVotingMajority] = useState(0);
- const [minVotingDelay, setMinVotingDelay] = useState(0);
- const [minVotingPeriod, setMinVotingPeriod] = useState(1);
- const [minExecutionDelay, setMinExecutionDelay] = useState(0);
-
- const [selectedVault, setSelectedVault] = useState('');
- const [selectedToken, setSelectedToken] = useState('');
- const [tokenAmount, setTokenAmount] = useState(0);
- const [receivingAddress, setReceivingAddress] = useState('');
-
- const [coverImageFile, setCoverImageFile] = useState();
- const [votingOptions, setVotingOptions] = useState(['For','Against', 'Abstain']);
-
- const [keyPermissions, setKeyPermissions] = useState<{upAddress:string, action:string, keyPermissions:{vote:boolean, propose:boolean, execute:boolean, addPermission:boolean, removePermission:boolean, registerVotes:boolean, sendDelegate:boolean, receiveDelegate:boolean}}>
- ( {upAddress:"", action: "", keyPermissions:{vote:false, propose:false, execute:false, addPermission:false, removePermission:false, registerVotes:false, sendDelegate:false, receiveDelegate:false}});
- const [vaultPermissions, setVaultPermissions] = useState<{vaultAddress:string, action:string}>({vaultAddress:"", action:""});
- const [membersOrVault, setMembersOrVault] = useState("Members");
-
- const [proposer, setProposer] = useState('');
- const [proposalType, setProposalType] = useState('');
- const [daoCid, setDaoCid] = useState('');
-
- return (
-
- {children}
-
- );
-}
\ No newline at end of file
+export const CreateProposalContext =
+ React.createContext({
+ proposalName: "",
+ setProposalName: () => {},
+ categories: [
+ { value: "DAO", label: "DAO" },
+ { value: "Social", label: "Social" },
+ ],
+ setCategories: () => {},
+ description: "",
+ setDescription: () => {},
+ participationRate: 0,
+ setParticipationRate: () => {},
+ votingMajority: 0,
+ setVotingMajority: () => {},
+ minVotingDelay: 0,
+ setMinVotingDelay: () => {},
+ minVotingPeriod: 1,
+ setMinVotingPeriod: () => {},
+ minExecutionDelay: 0,
+ setMinExecutionDelay: () => {},
+
+ selectedVault: "",
+ setSelectedVault: () => {},
+ selectedToken: "",
+ setSelectedToken: () => {},
+ tokenAmount: 0,
+ setTokenAmount: () => {},
+ receivingAddress: "",
+ setReceivingAddress: () => {},
+
+ coverImageFile: null as any,
+ setCoverImageFile: () => {},
+ votingOptions: [],
+ daoUpAddress: "",
+ setDaoUpAddress: () => {},
+ setVotingOptions: () => {},
+
+ keyPermissions: {
+ upAddress: "",
+ action: "",
+ keyPermissions: {
+ vote: false,
+ propose: false,
+ execute: false,
+ addPermission: false,
+ removePermission: false,
+ registerVotes: false,
+ sendDelegate: false,
+ receiveDelegate: false,
+ },
+ },
+ setKeyPermissions: () => {},
+ vaultPermissions: { vaultAddress: "", action: "" },
+ setVaultPermissions: () => {},
+ membersOrVault: "",
+ setMembersOrVault: () => {},
+
+ proposer: "",
+ setProposer: () => {},
+ proposalType: "",
+ setProposalType: () => {},
+ daoCid: "",
+ setDaoCid: () => {},
+ formComponent: "",
+ setFormComponent: () => {},
+ });
+
+export const CreateProposalContextProvider = ({ children }: any) => {
+ const [proposalName, setProposalName] = useState("");
+ const [categories, setCategories] = useState<
+ { value: string; label: string }[]
+ >([
+ { value: "DAO", label: "DAO" },
+ { value: "Social", label: "Social" },
+ ]);
+ const [description, setDescription] = useState("");
+ const [participationRate, setParticipationRate] = useState(0);
+ const [votingMajority, setVotingMajority] = useState(0);
+ const [minVotingDelay, setMinVotingDelay] = useState(0);
+ const [minVotingPeriod, setMinVotingPeriod] = useState(1);
+ const [minExecutionDelay, setMinExecutionDelay] = useState(0);
+
+ const [selectedVault, setSelectedVault] = useState("");
+ const [selectedToken, setSelectedToken] = useState("");
+ const [tokenAmount, setTokenAmount] = useState(0);
+ const [receivingAddress, setReceivingAddress] = useState("");
+
+ const [coverImageFile, setCoverImageFile] = useState();
+ const [formComponent, setFormComponent] = useState("ChooseDao");
+ const [votingOptions, setVotingOptions] = useState([
+ "For",
+ "Against",
+ "Abstain",
+ ]);
+
+ const [keyPermissions, setKeyPermissions] = useState<{
+ upAddress: string;
+ action: string;
+ keyPermissions: {
+ vote: boolean;
+ propose: boolean;
+ execute: boolean;
+ addPermission: boolean;
+ removePermission: boolean;
+ registerVotes: boolean;
+ sendDelegate: boolean;
+ receiveDelegate: boolean;
+ };
+ }>({
+ upAddress: "",
+ action: "",
+ keyPermissions: {
+ vote: false,
+ propose: false,
+ execute: false,
+ addPermission: false,
+ removePermission: false,
+ registerVotes: false,
+ sendDelegate: false,
+ receiveDelegate: false,
+ },
+ });
+ const [vaultPermissions, setVaultPermissions] = useState<{
+ vaultAddress: string;
+ action: string;
+ }>({ vaultAddress: "", action: "" });
+ const [membersOrVault, setMembersOrVault] = useState("Members");
+
+ const [proposer, setProposer] = useState("");
+ const [proposalType, setProposalType] = useState("");
+ const [daoCid, setDaoCid] = useState("");
+ const [daoUpAddress, setDaoUpAddress] = useState("");
+
+ return (
+
+ {children}
+
+ );
+};
diff --git a/src/context/DeployDaoContext.tsx b/src/context/DeployDaoContext.tsx
index 479ee91..6516351 100644
--- a/src/context/DeployDaoContext.tsx
+++ b/src/context/DeployDaoContext.tsx
@@ -1,152 +1,192 @@
-import React, { useEffect, useState } from 'react';
-import useWeb3 from '../hooks/useWeb3';
-import UniversalReceiverDelegateUPJSON from '../keezContracts/deps/UniversalReceiverDelegateUP.sol/UniversalReceiverDelegateUP.json';
-import UniversalProfileJSON from '../keezContracts/deps/UniversalProfile.sol/UniversalProfile.json';
-import DaoDeployerJSON from '../keezContracts/Deployer/Deployer.sol/Deployer.json';
+import React, { useEffect, useState } from "react";
+import useWeb3 from "../hooks/useWeb3";
+import UniversalReceiverDelegateUPJSON from "../keezContracts/deps/UniversalReceiverDelegateUP.sol/UniversalReceiverDelegateUP.json";
+import UniversalProfileJSON from "../keezContracts/deps/UniversalProfile.sol/UniversalProfile.json";
+import DaoDeployerJSON from "../keezContracts/Deployer/Deployer.sol/Deployer.json";
import { ethers } from "ethers";
interface DeployDaoContextInterface {
- // deployUniversalReceiverDelegateUP: any,
- executeDeployer: any
+ // deployUniversalReceiverDelegateUP: any,
+ executeDeployer: any;
}
-export const DeployDaoContext = React.createContext(
- {
- // deployUniversalReceiverDelegateUP: () => {},
- executeDeployer: () => {},
- }
-);
+export const DeployDaoContext = React.createContext({
+ // deployUniversalReceiverDelegateUP: () => {},
+ executeDeployer: () => {},
+});
-export const DeployDaoProvider = ({children}:any) => {
- const web3 = useWeb3();
- const [owner, setOwner] = useState('');
- const [signer, setSigner] = useState([]);
- const [provider, setProvider] = useState([]);
- // const [universalReceiverDelegateUPState, setUniversalReceiverDelegateUPState] = useState([]);
+export const DeployDaoProvider = ({ children }: any) => {
+ const web3 = useWeb3();
+ const [owner, setOwner] = useState("");
+ const [signer, setSigner] = useState([]);
+ const [provider, setProvider] = useState([]);
+ // const [universalReceiverDelegateUPState, setUniversalReceiverDelegateUPState] = useState([]);
- useEffect(() => {
- const fetchProvider = async () => {
- const provider = new ethers.providers.Web3Provider(window.ethereum)
- setProvider(provider);
- console.log("provider ",provider);
-
- const signer = provider.getSigner();
- setSigner(signer);
- console.log("provider ",signer);
-
- const owner = await signer.getAddress();
- setOwner(owner);
- console.log("owner ",owner);
-
- }
- fetchProvider();
- }, []);
+ useEffect(() => {
+ const fetchProvider = async () => {
+ const provider = new ethers.providers.Web3Provider(window.ethereum);
+ setProvider(provider);
+ console.log("provider ", provider);
-
- const executeDeployer = async (DaoUpMetadata: any, metalink:string) => {
- try {
- console.log("DaoUpMetadata",JSON.stringify(DaoUpMetadata))
- console.log("metalink",JSON.stringify(metalink))
- const votingParameters = DaoUpMetadata.votingParameters;
- const voting_majority = Number(votingParameters.votingMajority);
- const participation_rate = Number(votingParameters.participationRate);
- const min_voting_delay = Number(votingParameters.minVotingDelay)*24*3600;
- const min_voting_period = Number(votingParameters.minVotingPeriod)*24*3600;
- const min_execution_delay = Number(votingParameters.minExecutionDelay)*24*3600;
- console.log(typeof voting_majority,"voting_majority",voting_majority);
- console.log(typeof participation_rate,"participation_rate",participation_rate);
- console.log(typeof min_voting_delay,"min_voting_delay",min_voting_delay);
- console.log(typeof min_voting_period,"min_voting_period",min_voting_period);
- console.log(typeof min_execution_delay,"min_execution_delay",min_execution_delay);
-
- let addressArray = []
- let permissionArray = []
- for (let i=0; i {
+ try {
+ console.log("DaoUpMetadata", JSON.stringify(DaoUpMetadata));
+ console.log("metalink", JSON.stringify(metalink));
+ const votingParameters = DaoUpMetadata.votingParameters;
+ const voting_majority = Number(votingParameters.votingMajority);
+ const participation_rate = Number(votingParameters.participationRate);
+ const min_voting_delay =
+ Number(votingParameters.minVotingDelay) * 24 * 3600;
+ const min_voting_period =
+ Number(votingParameters.minVotingPeriod) * 24 * 3600;
+ const min_execution_delay =
+ Number(votingParameters.minExecutionDelay) * 24 * 3600;
+ console.log(typeof voting_majority, "voting_majority", voting_majority);
+ console.log(
+ typeof participation_rate,
+ "participation_rate",
+ participation_rate
+ );
+ console.log(
+ typeof min_voting_delay,
+ "min_voting_delay",
+ min_voting_delay
+ );
+ console.log(
+ typeof min_voting_period,
+ "min_voting_period",
+ min_voting_period
+ );
+ console.log(
+ typeof min_execution_delay,
+ "min_execution_delay",
+ min_execution_delay
+ );
+
+ let addressArray = [];
+ let permissionArray = [];
+ for (let i = 0; i < DaoUpMetadata.keyPermissions.length; i++) {
+ const upAddress = DaoUpMetadata.keyPermissions[i].upAddress;
+ const permissions = DaoUpMetadata.keyPermissions[i].keyPermissions;
+
+ addressArray.push(upAddress);
+ const permissionbyte =
+ (permissions.registerVotes << 7) +
+ (permissions.removePermission << 6) +
+ (permissions.addPermission << 5) +
+ (permissions.receiveDelegate << 4) +
+ (permissions.sendDelegate << 3) +
+ (permissions.execute << 2) +
+ (permissions.propose << 1) +
+ permissions.vote;
+ permissionArray.push(
+ ethers.utils.hexZeroPad(ethers.utils.hexValue(permissionbyte), 32)
+ );
+ }
+
+ console.log(addressArray);
+ console.log(permissionArray);
+ const universalReceiverDelegateUPAddress =
+ "0x718D6ceD390FAeC92Aff2d8581BD41255a7fE1Cb";
+ const deployerAddress = "0xD8443C594CFC573406ca80a86e879D3aa1750d7E";
+ const deployer = new ethers.Contract(
+ deployerAddress,
+ DaoDeployerJSON.abi,
+ signer
+ );
+ const deployment = await deployer
+ .connect(signer)
+ [
+ "deploy(address,bytes,bytes32,bytes32,bytes32,bytes32,bytes32,address[],bytes32[])"
+ ](
+ universalReceiverDelegateUPAddress,
+ ethers.utils.hexlify(ethers.utils.toUtf8Bytes(metalink)),
+ ethers.utils.hexZeroPad(ethers.utils.hexValue(voting_majority), 32),
+ ethers.utils.hexZeroPad(
+ ethers.utils.hexValue(participation_rate),
+ 32
+ ),
+ ethers.utils.hexZeroPad(ethers.utils.hexValue(min_voting_delay), 32),
+ ethers.utils.hexZeroPad(ethers.utils.hexValue(min_voting_period), 32),
+ ethers.utils.hexZeroPad(
+ ethers.utils.hexValue(min_execution_delay),
+ 32
+ ),
+ addressArray,
+ permissionArray
+ );
+ console.log("deployment done", deployment);
+
+ const addresses = await deployer.connect(signer).getAddresses();
+ const contractAddresses = {
+ UNIVERSAL_PROFILE: addresses[0],
+ KEY_MANAGER: addresses[1],
+ DAO_PERMISSIONS: addresses[2],
+ DAO_DELEGATES: addresses[3],
+ DAO_PROPOSALS: addresses[4],
+ MULTISIG: addresses[5],
+ UNIVERSALRECEIVER: universalReceiverDelegateUPAddress,
+ };
+ const UniversalProfile = new ethers.ContractFactory(
+ UniversalProfileJSON.abi,
+ UniversalProfileJSON.bytecode,
+ signer
+ );
+ const universalProfile = UniversalProfile.attach(addresses[0]);
+ console.log(await universalProfile.owner());
+ console.log(contractAddresses);
+ return { hash: deployment.hash, contractAddresses: contractAddresses };
+ } catch (error) {
+ console.log(error);
+ return "Stopped";
}
+ };
+
+ // const deployUniversalReceiverDelegateUP = async () => {
+ // try {
+ // let txHash:string = "";
+ // //@ts-ignore
+ // const UniversalReceiverDelegateUP = new web3.eth.Contract(UniversalReceiverDelegateUPJSON.abi)
+ // const universalReceiverDelegateUP = UniversalReceiverDelegateUP.deploy({
+ // data: UniversalReceiverDelegateUPJSON.bytecode,
+ // arguments: []
+ // })
+ // console.log("this")
+ // const newContractInstance = await universalReceiverDelegateUP.send({
+ // from: owner,
+ // gas: 1500000
+ // }).on('transactionHash', function(hash:string){
+ // txHash = hash;
+ // })
- // const deployUniversalReceiverDelegateUP = async () => {
- // try {
- // let txHash:string = "";
- // //@ts-ignore
- // const UniversalReceiverDelegateUP = new web3.eth.Contract(UniversalReceiverDelegateUPJSON.abi)
- // const universalReceiverDelegateUP = UniversalReceiverDelegateUP.deploy({
- // data: UniversalReceiverDelegateUPJSON.bytecode,
- // arguments: []
- // })
- // console.log("this")
- // const newContractInstance = await universalReceiverDelegateUP.send({
- // from: owner,
- // gas: 1500000
- // }).on('transactionHash', function(hash:string){
- // txHash = hash;
- // })
-
- // console.log("universalReceiverDelegateUP is deployed",newContractInstance.options.address);
- // setUniversalReceiverDelegateUPState(newContractInstance.options);
- // return {hash0: txHash , contractAddress0:newContractInstance.options.address}
- // } catch (error) {
- // console.log(error);
- // return "Stopped"
- // }
- // }
+ // console.log("universalReceiverDelegateUP is deployed",newContractInstance.options.address);
+ // setUniversalReceiverDelegateUPState(newContractInstance.options);
+ // return {hash0: txHash , contractAddress0:newContractInstance.options.address}
+ // } catch (error) {
+ // console.log(error);
+ // return "Stopped"
+ // }
+ // }
-
- return (
-
- {children}
-
- );
+ return (
+
+ {children}
+
+ );
};
diff --git a/src/context/ProfileContext.tsx b/src/context/ProfileContext.tsx
index 292f457..78ef53d 100644
--- a/src/context/ProfileContext.tsx
+++ b/src/context/ProfileContext.tsx
@@ -1,115 +1,116 @@
-import React, { useEffect, useState } from 'react';
-import useWeb3 from '../hooks/useWeb3';
-import { requestAccount, getAccountBalance } from '../services/web3';
-import { fetchErc725Data } from '../services/erc725';
+import React, { useEffect, useState } from "react";
+import useWeb3 from "../hooks/useWeb3";
+import { requestAccount, getAccountBalance } from "../services/web3";
+import { fetchErc725Data } from "../services/erc725";
interface ProfileContextInterface {
- accountAddress: string;
- accountBalance: number;
- connectWallet: any;
- disconnectWallet: any;
- profileData: any;
- getProfileInfo: any;
+ accountAddress: string;
+ accountBalance: number;
+ connectWallet: any;
+ disconnectWallet: any;
+ profileData: any;
+ getProfileInfo: any;
}
-export const ProfileContext = React.createContext(
- {
- accountAddress: "",
- accountBalance: 0,
- connectWallet: () => {},
- disconnectWallet: () => {},
- profileData:{},
- getProfileInfo: () => {},
- }
-);
+export const ProfileContext = React.createContext({
+ accountAddress: "",
+ accountBalance: 0,
+ connectWallet: () => {},
+ disconnectWallet: () => {},
+ profileData: {},
+ getProfileInfo: () => {},
+});
+export const ProfileProvider = ({ children }: any) => {
+ const web3 = useWeb3();
+ const [accountAddress, setAccountAddress] = useState("");
+ const [accountBalance, setAccountBalance] = useState(0);
+ const [profileData, setProfileData] = useState({});
-export const ProfileProvider = ({children}:any) => {
- const web3 = useWeb3();
- const [accountAddress, setAccountAddress] = useState('');
- const [accountBalance, setAccountBalance] = useState(0);
- const [profileData, setProfileData] = useState({});
-
- // const provider = new Web3.providers.HttpProvider(RPC_URL);
- // const config = { ipfsGateway: IPFS_GATEWAY };
+ // const provider = new Web3.providers.HttpProvider(RPC_URL);
+ // const config = { ipfsGateway: IPFS_GATEWAY };
- useEffect(() => {
- if (!accountAddress || !web3) return;
+ useEffect(() => {
+ if (!accountAddress || !web3) return;
- getAccountBalance(web3, accountAddress).then((balance:any) => {
- setAccountBalance(balance);
- // if (balance > 0) {
- // setStep(STEP.DEPLOY_UP);
- // }
- });
- }, [accountAddress, web3]);
+ getAccountBalance(web3, accountAddress).then((balance: any) => {
+ setAccountBalance(balance);
+ // if (balance > 0) {
+ // setStep(STEP.DEPLOY_UP);
+ // }
+ });
+ }, [accountAddress, web3]);
-
- const connectWallet = async () => {
- // console.log("connect");
- try {
- if (web3){
- const account = await requestAccount(web3);
- console.log("this",account);
- setAccountAddress(account);
- fetchProfile(account);
- }
- } catch (error) {
- window.open('https://docs.lukso.tech/guides/browser-extension/install-browser-extension','_blank')?.focus();
- console.log(error);
- throw new Error("No object found")
- }
+ const connectWallet = async () => {
+ // console.log("connect");
+ try {
+ if (web3) {
+ const account = await requestAccount(web3);
+ console.log("this", account);
+ setAccountAddress(account);
+ fetchProfile(account);
+ }
+ } catch (error) {
+ window
+ .open(
+ "https://docs.lukso.tech/guides/browser-extension/install-browser-extension",
+ "_blank"
+ )
+ ?.focus();
+ console.log(error);
+ throw new Error("No object found");
}
+ };
- const disconnectWallet = async () => {
- try {
- if (!web3) return alert("Please install metamask")
- setAccountAddress("");
- } catch (error) {
- console.log(error);
- throw new Error("No object found")
- }
+ const disconnectWallet = async () => {
+ try {
+ if (!web3) return alert("Please install metamask");
+ setAccountAddress("");
+ } catch (error) {
+ console.log(error);
+ throw new Error("No object found");
}
+ };
- const fetchProfile = async (account: string) => {
- try {
- const data = await fetchErc725Data(account);
- setProfileData(data);
- console.log("erc725profile = ", data)
- } catch (error) {
- console.log('This is not an ERC725 Contract');
- }
- }
+ const fetchProfile = async (account: string) => {
+ try {
+ const data = await fetchErc725Data(account);
+ setProfileData(data);
+ console.log("erc725profile = ", data);
+ } catch (error) {
+ console.log("This is not an ERC725 Contract");
+ }
+ };
- const getProfileInfo = async (account: string) => {
- try {
- const data = await fetchErc725Data(account);
- // setProfileData(data);
- // console.log("erc725profile = ", data)
- return data;
- } catch (error) {
- console.log('This is not an ERC725 Contract');
- return [];
- }
+ const getProfileInfo = async (account: string) => {
+ try {
+ const data = await fetchErc725Data(account);
+ // setProfileData(data);
+ // console.log("erc725profile = ", data)
+ return data;
+ } catch (error) {
+ console.log("This is not an ERC725 Contract");
+ return [];
}
-
- // Debug
- // fetchProfile(accountAddress).then((profileData) =>
- // console.log(JSON.stringify(profileData, undefined, 2)),
- // );
+ };
- return (
-
- {children}
-
- );
-};
+ // Debug
+ // fetchProfile(accountAddress).then((profileData) =>
+ // console.log(JSON.stringify(profileData, undefined, 2)),
+ // );
+ return (
+
+ {children}
+
+ );
+};
diff --git a/src/modals/ProposalVotingModal.tsx b/src/modals/ProposalVotingModal.tsx
index 5008f09..fa1a1a0 100644
--- a/src/modals/ProposalVotingModal.tsx
+++ b/src/modals/ProposalVotingModal.tsx
@@ -4,6 +4,7 @@ import React, {
useState,
useContext,
useEffect,
+ useCallback,
} from "react";
import { AiOutlineClose } from "react-icons/ai";
import { Dialog, Transition } from "@headlessui/react";
@@ -17,24 +18,28 @@ import { DaoProposalContext } from "../context/DaoProposalContext";
import dayjs from "dayjs";
import { toast } from "react-toastify";
import { ethers } from "ethers";
+import { universalProfileContract } from "../services/web3";
export default function ProposalVotingModal(props: {
setShowModal: any;
showModal: boolean;
proposal: any;
daoSelected: any;
+ votingParameters: any;
}) {
- const { setShowModal, showModal, proposal, daoSelected } = props;
+ const { setShowModal, showModal, proposal, daoSelected, votingParameters } =
+ props;
const { getProposalHash, registerVotes, executeProposal } =
useContext(DaoProposalContext);
const { accountAddress } = useContext(ProfileContext);
+ const [permisions, setPermisions] = useState({});
+ const universalProfile = getParsedJsonObj(
+ daoSelected.daoUpAddress
+ ).universalProfile;
const [open, setOpen] = useState(true);
const [isLoading, setIsLoading] = useState(false);
const [votes, setVotes] = useState([]);
- const [userCanVote, setUserCanVote] = useState(false);
- const [userCanRegister, setUserCanRegister] = useState(false);
- const [userCanExecute, setUserCanExecute] = useState(false);
const [hasVoted, setHasVoted] = useState(false);
const [voterChoice, setVoterChoice] = useState(10);
const [voters, setVoters] = useState([]);
@@ -209,6 +214,33 @@ export default function ProposalVotingModal(props: {
});
}
};
+ const getPermissions = useCallback(async () => {
+ if (accountAddress) {
+ try {
+ let contract1 = await universalProfileContract(universalProfile)
+ ["getData(bytes32[])"]([
+ "0x4b80742de2bfb3cc0e490000" + accountAddress.substring(2),
+ ])
+ .call();
+ const permissionBin = parseInt(contract1[0], 16).toString(2);
+ const permision = {
+ registerVotes: permissionBin[0] === "1",
+ removePermission: permissionBin[1] === "1",
+ addPermission: permissionBin[2] === "1",
+ receiveDelegate: permissionBin[3] === "1",
+ sendDelegate: permissionBin[4] === "1",
+ execute: permissionBin[5] === "1",
+ propose: permissionBin[6] === "1",
+ vote: permissionBin[7] === "1",
+ };
+ setPermisions(permision);
+ } catch {
+ toast.error("An error ocurred, check your connection", {
+ position: toast.POSITION.BOTTOM_RIGHT,
+ });
+ }
+ }
+ }, [universalProfile, accountAddress]);
const handleRegister = async () => {
setIsLoading(true);
@@ -294,18 +326,11 @@ export default function ProposalVotingModal(props: {
setVotes(result);
console.log("votes", result);
};
+
+ getPermissions();
const getVoterDetails = () => {
const _voters: string[] = [];
for (var i = 0; i < permissionsObject.length; i++) {
- if (permissionsObject[i].upAddress === accountAddress) {
- setUserCanVote(permissionsObject[i].keyPermissions.vote === "True");
- setUserCanRegister(
- permissionsObject[i].keyPermissions.registerVotes === "True"
- );
- setUserCanExecute(
- permissionsObject[i].keyPermissions.execute === "True"
- );
- }
if (permissionsObject[i].keyPermissions.vote === "True") {
_voters.push(permissionsObject[i].upAddress);
}
@@ -316,7 +341,13 @@ export default function ProposalVotingModal(props: {
fetchData();
getVoterDetails();
// checkIfVoted();
- }, [isLoading, accountAddress]);
+ }, [
+ isLoading,
+ accountAddress,
+ getPermissions,
+ permissionsObject,
+ proposal.identifier,
+ ]);
useEffect(() => {
const checkIfVoted = () => {
@@ -326,7 +357,7 @@ export default function ProposalVotingModal(props: {
const signature_array: string[] = [];
const address_array: string[] = [];
const choice_array: string[] = [];
- for (var i = 0; i < votes.length; i++) {
+ for (var i = 0; i < votes.length; i++) {
if (Number(votes[i].VoterChoice) !== 0) {
signature_array.push(votes[i].VoterSignature);
choice_array.push(votes[i].VoterChoice);
@@ -358,9 +389,7 @@ export default function ProposalVotingModal(props: {
const proposalDetailsObject = getParsedJsonObj(proposal.proposalDetails);
const votingParametersObject =
- daoSelected.length !== ""
- ? getParsedJsonObj(daoSelected.votingParameters)
- : "";
+ daoSelected.length !== "" ? votingParameters : "";
const createdAt = dayjs(Number(proposal.createdAt));
const min_voting_delay = votingParametersObject.minVotingDelay;
const min_voting_period = votingParametersObject.minVotingPeriod;
@@ -640,7 +669,7 @@ export default function ProposalVotingModal(props: {
{(proposalStatus === "Pending" ||
isLoading ||
- !userCanVote) &&
+ !permisions?.vote) &&
proposalStatus !== "Closed" &&
!hasVoted && (
<>
@@ -665,7 +694,7 @@ export default function ProposalVotingModal(props: {
{proposalStatus === "Active" &&
!isLoading &&
- userCanVote &&
+ permisions?.vote &&
!hasVoted && (
<>
VOTE
@@ -699,7 +728,7 @@ export default function ProposalVotingModal(props: {
{proposalStatus === "Closed" && !isLoading && (
<>
Actions
- {userCanRegister ? (
+ {permisions?.registerVotes ? (
)}
- {userCanExecute ? (
+ {permisions?.execute ? (
)}
- {!userCanRegister && (
+ {!permisions?.registerVotes && (
You don't have Register Votes permission
)}
- {!userCanExecute && (
+ {!permisions.execute && (
You don't have Execute Votes permission
@@ -752,7 +781,7 @@ export default function ProposalVotingModal(props: {
secondaryColor="rgba(172, 5, 55, 1)"
/>
)}
- {!userCanVote && proposalStatus !== "Closed" && (
+ {!permisions?.vote && proposalStatus !== "Closed" && (
You don't have Vote permission
@@ -790,6 +819,7 @@ export default function ProposalVotingModal(props: {
const VotingDetails = (props: { proposalDetailsObject: any }) => {
const { proposalDetailsObject } = props;
+ console.log("obj", proposalDetailsObject);
const votingDelay = votingDelayItems.find(
(element: any) => element.value === proposalDetailsObject.minVotingDelay
) || { value: 0, label: "instant" };
diff --git a/src/pages/DaoProfile.tsx b/src/pages/DaoProfile.tsx
index ecb352e..ecec065 100644
--- a/src/pages/DaoProfile.tsx
+++ b/src/pages/DaoProfile.tsx
@@ -1,4 +1,4 @@
-import React, { useContext, useState, useEffect } from "react";
+import React, { useContext, useState, useEffect, useCallback } from "react";
import { useNavigate, useLocation } from "react-router-dom";
import { ProfileContext } from "../context/ProfileContext";
import {
@@ -9,8 +9,10 @@ import {
} from "../components/daoProfile";
import Skeleton from "@material-ui/lab/Skeleton";
import { getParsedJsonObj } from "../utils/getParsedJsonObj";
-import { MdCreate } from "react-icons/md";
+import { MdCreate, MdOutlineAdd } from "react-icons/md";
import MobileSideNav from "../components/MobileSideNav";
+import { permissionContract, universalProfileContract } from "../services/web3";
+import { toast } from "react-toastify";
//@ts-ignore
type LocationProps = {
state: {
@@ -19,10 +21,18 @@ type LocationProps = {
};
const DaoProfile = () => {
+ const [votingParameters, setVotingParams] = useState({});
const location = useLocation() as unknown as LocationProps;
const { accountAddress } = useContext(ProfileContext);
const [profileComponent, setProfileComponent] = useState("Proposals");
const daoDetail = location.state?.daoDetail;
+ const [permisions, setPermisions] = useState({});
+ const universalProfile = getParsedJsonObj(
+ daoDetail.daoUpAddress
+ ).universalProfile;
+ const permissionProfile = getParsedJsonObj(
+ daoDetail.daoUpAddress
+ ).daoPermissions;
const navigate = useNavigate();
@@ -32,24 +42,77 @@ const DaoProfile = () => {
};
const profileImageObj = getParsedJsonObj(daoDetail.profileImage);
const profileImageUrl = profileImageObj.url.concat(profileImageObj.hash);
- const keyPermissionObj = getParsedJsonObj(daoDetail.keyPermissions);
- const user = keyPermissionObj.filter(function (e: any) {
- return (
- e.upAddress === accountAddress && e.keyPermissions.propose === "True"
- );
- });
// console.log(user.length);
- const isMember: boolean = user.length > 0 ? true : false;
+ const isMember: boolean = permisions.vote ? true : false;
+ const changePermission: boolean =
+ permisions?.addPermission === true && permisions?.removePermission == true
+ ? true
+ : false;
+ const getProfile = useCallback(async () => {
+ let contract = await universalProfileContract(universalProfile)
+ ["getData(bytes32[])"]([
+ // DAO Settings
+ "0xbc776f168e7b9c60bb2a7180950facd372cd90c841732d963c31a93ff9f8c127",
+ "0xf89f507ecd9cb7646ce1514ec6ab90d695dac9314c3771f451fd90148a3335a9",
+ "0x799787138cc40d7a47af8e69bdea98db14e1ead8227cef96814fa51751e25c76",
+ "0xd3cf4cd71858ea36c3f5ce43955db04cbe9e1f42a2c7795c25c1d430c9bb280a",
+ "0xb207580c05383177027a90d6c298046d3d60dfa05a32b0bb48ea9015e11a3424",
+ ])
+ .call();
+ // let Permision = await permissionContract(permissionProfile);
+ // console.log("perm", Permision);
+ if (accountAddress) {
+ let contract1 = await universalProfileContract(universalProfile)
+ ["getData(bytes32[])"]([
+ "0x4b80742de2bfb3cc0e490000" + accountAddress.substring(2),
+ ])
+ .call();
+ const permissionBin = parseInt(contract1[0], 16).toString(2);
+ const permision = {
+ registerVotes: permissionBin[0] === "1",
+ removePermission: permissionBin[1] === "1",
+ addPermission: permissionBin[2] === "1",
+ receiveDelegate: permissionBin[3] === "1",
+ sendDelegate: permissionBin[4] === "1",
+ execute: permissionBin[5] === "1",
+ propose: permissionBin[6] === "1",
+ vote: permissionBin[7] === "1",
+ };
+ setPermisions(permision);
+ }
+
+ const Params = {
+ votingMajority: parseInt(contract[0]),
+ participationRate: parseInt(contract[1]),
+ minVotingDelay: parseInt(contract[2]),
+ minVotingPeriod: parseInt(contract[3]) / (24 * 3600),
+ minExecutionDelay: parseInt(contract[4]) / (24 * 3600),
+ };
+ setVotingParams(Params);
+ }, [universalProfile, accountAddress]);
+ // console.log(votingParameters);
const handleCreateProposal = (event: any) => {
navigate("/Governance", {
state: { component: "ChooseTemplate", CID: daoDetail.CID },
});
};
-
+ const handleAddPermisson = (event: any) => {
+ navigate("/addmember", {
+ state: { CID: daoDetail.CID, dao: daoDetail },
+ });
+ };
+ toast.configure();
useEffect(() => {
window.scrollTo(0, 0);
- }, []);
+ try {
+ getProfile();
+ } catch {
+ toast.error("An error ocurred, check your connection", {
+ position: toast.POSITION.BOTTOM_RIGHT,
+ });
+ }
+ }, [getProfile]);
return (
@@ -63,7 +126,7 @@ const DaoProfile = () => {
profileComponent={profileComponent}
/>
-
+
{profileImageObj ? (
![]()
{
/>
)}
-
+
{daoDetail.daoName}
-
{daoDetail.description}
+
{daoDetail.description}
+
+
+ {isMember && (
+
+ )}
+ {changePermission && (
+
+ )}
- {isMember && (
-
- )}
<>
{profileComponent === "Proposals" && (
-
+
+ )}
+ {profileComponent === "About" && (
+
)}
- {profileComponent === "About" &&
}
{profileComponent === "Members" && (
)}
diff --git a/src/pages/Discover.tsx b/src/pages/Discover.tsx
index 0c0973d..f08ae39 100644
--- a/src/pages/Discover.tsx
+++ b/src/pages/Discover.tsx
@@ -172,7 +172,9 @@ const DaoCard = (props: { id: number; daoDetail: any }) => {