From 6e12f5d6959016a80f33e303f0f932fbba3b8736 Mon Sep 17 00:00:00 2001 From: Nikola Cehic Date: Tue, 21 Feb 2023 16:14:49 +0100 Subject: [PATCH] temp fix: resync with contracts (#37) --- .../src/dao/hooks/useAmICouncilMember.tsx | 14 - apps/enterprise/src/dao/shared/proposal.ts | 35 +- .../src/pages/create-dao/DaoWizard.tsx | 2 - .../create-dao/DaoWizardFormProvider.tsx | 32 +- .../create-dao/helpers/toCreateDaoMsg.ts | 13 +- .../pages/create-dao/shared/CouncilStep.tsx | 50 -- .../shared/helpers/validateCouncil.ts | 18 - .../create-proposal/CreateProposalPage.tsx | 4 +- .../create-proposal/SelectProposalType.tsx | 47 +- .../create-proposal/council/CouncilForm.tsx | 106 ---- .../council/toUpdateCouncilMsg.ts | 26 - .../metadata/toUpdateMetadataMsg.ts | 4 +- .../metadata/useMetadataForm.tsx | 5 +- .../src/pages/dao/DaoCouncilOverview.tsx | 27 - apps/enterprise/src/pages/dao/Header.tsx | 2 +- .../src/pages/dao/MobileDaoHeader.tsx | 2 +- apps/enterprise/src/pages/dao/Overview.tsx | 2 - .../src/pages/dao/proposals/ProposalsPage.tsx | 11 +- .../src/pages/proposal/CastVote.tsx | 9 +- .../src/pages/proposal/ProposalActions.tsx | 4 +- .../src/pages/proposal/ProposalVotes.tsx | 2 +- .../src/pages/proposal/ProposalVotingBar.tsx | 2 +- .../pages/proposal/UpdateCouncilAction.tsx | 46 -- .../pages/proposal/helpers/metadataView.ts | 8 +- .../src/pages/shared/ProposalTags.tsx | 2 +- apps/enterprise/src/queries/useDAOQuery.ts | 2 - apps/enterprise/src/queries/useDAOsQuery.ts | 4 +- .../src/queries/useDaoProposalsQuery.ts | 22 +- .../src/queries/useProposalQuery.ts | 12 +- apps/enterprise/src/tx/useCastVoteTx.ts | 4 +- apps/enterprise/src/tx/useCreateProposalTx.ts | 16 +- .../enterprise/src/tx/useExecuteProposalTx.ts | 23 +- apps/enterprise/src/types/DAO.ts | 6 +- apps/enterprise/src/types/Vote.ts | 5 +- .../src/types/contracts/enterprise.ts | 474 ++++++++---------- .../src/types/contracts/enterprise_factory.ts | 33 -- package.json | 8 +- yarn.lock | 1 + 38 files changed, 327 insertions(+), 756 deletions(-) delete mode 100644 apps/enterprise/src/dao/hooks/useAmICouncilMember.tsx delete mode 100644 apps/enterprise/src/pages/create-dao/shared/CouncilStep.tsx delete mode 100644 apps/enterprise/src/pages/create-dao/shared/helpers/validateCouncil.ts delete mode 100644 apps/enterprise/src/pages/create-proposal/council/CouncilForm.tsx delete mode 100644 apps/enterprise/src/pages/create-proposal/council/toUpdateCouncilMsg.ts delete mode 100644 apps/enterprise/src/pages/dao/DaoCouncilOverview.tsx delete mode 100644 apps/enterprise/src/pages/proposal/UpdateCouncilAction.tsx diff --git a/apps/enterprise/src/dao/hooks/useAmICouncilMember.tsx b/apps/enterprise/src/dao/hooks/useAmICouncilMember.tsx deleted file mode 100644 index dd1e531a..00000000 --- a/apps/enterprise/src/dao/hooks/useAmICouncilMember.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import { useConnectedWallet } from '@terra-money/wallet-provider'; -import { useCurrentDao } from 'dao/components/CurrentDaoProvider'; - -export const useAmICouncilMember = () => { - const { council } = useCurrentDao(); - - const connectedWallet = useConnectedWallet(); - - if (!council || !connectedWallet) { - return false; - } - - return council.members.includes(connectedWallet.walletAddress); -}; diff --git a/apps/enterprise/src/dao/shared/proposal.ts b/apps/enterprise/src/dao/shared/proposal.ts index 3dd1b91a..719c88a0 100644 --- a/apps/enterprise/src/dao/shared/proposal.ts +++ b/apps/enterprise/src/dao/shared/proposal.ts @@ -3,10 +3,23 @@ import { capitalizeFirstLetter } from 'lib/shared/utils/capitalizeFirstLetter'; import { DAO } from 'types'; import { enterprise } from 'types/contracts'; -export const proposalVotingTypes = ['regular', 'council'] as const; +export const proposalVotingTypes = ['regular'] as const; export type ProposalVotingType = typeof proposalVotingTypes[number]; + +// TODO: Remove this when contracts version is updated after audit +export type ProposalActionType = + | 'update_metadata' + | 'update_gov_config' + | 'update_asset_whitelist' + | 'update_nft_whitelist' + | 'request_funding_from_dao' + | 'upgrade_dao' + | 'execute_msgs' + | 'modify_multisig_membership'; + + export interface Proposal { dao: DAO; id: number; @@ -36,7 +49,6 @@ export const sharedProposalTypes = [ 'delegate', 'undelegate', 'redelegate', - 'council', ] as const; export const daoProposalsRecord = { @@ -66,13 +78,11 @@ export const proposalTitle: Record = { delegate: 'Delegate LUNA proposal', undelegate: 'Undelegate LUNA proposal', redelegate: 'Redelegate LUNA proposal', - council: 'Update council', }; -export const proposalActionShortName: Record = { +export const proposalActionShortName: Record = { update_metadata: 'metadata', update_gov_config: 'gov', - update_council: 'council', update_asset_whitelist: 'assets', update_nft_whitelist: 'nfts', request_funding_from_dao: 'funding', @@ -81,14 +91,13 @@ export const proposalActionShortName: Record { - return Object.keys(action)[0] as enterprise.ProposalActionType; +export const getProposalActionType = (action: enterprise.ProposalAction): ProposalActionType => { + return Object.keys(action)[0] as ProposalActionType; }; export type ProposalActionMsg = | enterprise.UpdateMetadataMsg | enterprise.UpdateGovConfigMsg - | enterprise.UpdateCouncilMsg | enterprise.UpdateAssetWhitelistMsg | enterprise.UpdateNftWhitelistMsg | enterprise.RequestFundingFromDaoMsg @@ -97,7 +106,7 @@ export type ProposalActionMsg = | enterprise.ModifyMultisigMembershipMsg; export interface ProposalAction { - type: enterprise.ProposalActionType; + type: ProposalActionType; msg: ProposalActionMsg; } @@ -148,8 +157,8 @@ export const getProposalStatusName = (proposal: Proposal, blockHeight: number): return proposal.status === 'in_progress' ? 'Active' : proposal.status === 'passed' - ? 'Passed' - : proposal.status === 'rejected' - ? 'Rejected' - : 'Executed'; + ? 'Passed' + : proposal.status === 'rejected' + ? 'Rejected' + : 'Executed'; }; diff --git a/apps/enterprise/src/pages/create-dao/DaoWizard.tsx b/apps/enterprise/src/pages/create-dao/DaoWizard.tsx index d4868748..e5bef32a 100644 --- a/apps/enterprise/src/pages/create-dao/DaoWizard.tsx +++ b/apps/enterprise/src/pages/create-dao/DaoWizard.tsx @@ -18,7 +18,6 @@ import { TokenInfoStep } from './token/TokenInfoStep'; import { TokenMarketingStep } from './token/TokenMarketingStep'; import { WizardButtons, WizardButtonsProps } from './WizardButtons'; import { WizardLayout } from './WizardLayout'; -import { CouncilStep } from './shared/CouncilStep'; import { useRefCallback } from '@terra-money/apps/hooks'; import { CompletedTransaction, useTransactionSubscribers } from '@terra-money/apps/libs/transactions'; import { reportError } from 'errors/errorMonitoring'; @@ -86,7 +85,6 @@ export const DaoWizard = () => { info={() => } members={() => } govConfig={() => } - council={() => } socials={() => } confirm={() => } membership={() => } diff --git a/apps/enterprise/src/pages/create-dao/DaoWizardFormProvider.tsx b/apps/enterprise/src/pages/create-dao/DaoWizardFormProvider.tsx index fcba7860..9d648059 100644 --- a/apps/enterprise/src/pages/create-dao/DaoWizardFormProvider.tsx +++ b/apps/enterprise/src/pages/create-dao/DaoWizardFormProvider.tsx @@ -4,7 +4,7 @@ import { createContextHook } from '@terra-money/apps/utils/createContextHook'; import { useConnectedWallet, useWallet } from '@terra-money/wallet-provider'; import { CW20TokenInfoResponse, MultisigVoter, CW721ContractInfoResponse } from 'queries'; import { createContext, ReactNode, useCallback } from 'react'; -import { enterprise, enterprise_factory } from 'types/contracts'; +import { enterprise } from 'types/contracts'; import { MultisigMember } from 'types/MultisigMember'; import { fetchExistingToken } from './fetchExistingToken'; import { fetchExistingNFT } from './fetchExistingNFT'; @@ -20,7 +20,6 @@ import { validateTokenInfo } from './token/helpers/validateTokenInfo'; import { validateTokenMarketing } from './token/helpers/validateTokenMarketing'; import { fetchExistingMultisigVoters } from './fetchExistingMultisigVoters'; import { useEnv } from 'hooks'; -import { validateCouncil } from './shared/helpers/validateCouncil'; export interface DaoSocialDataInput { githubUsername?: string; @@ -35,19 +34,11 @@ export interface DaoInfoInput { logo?: string; } -export interface CouncilMember { - address: string; -} - export interface DaoImportInput { shouldImport: boolean; daoAddress?: string; } -export interface CouncilInput { - members: FormState[]; - allowedProposalTypes: enterprise_factory.ProposalActionType[]; -} export interface DaoWizardInput { type: enterprise.DaoType; @@ -66,8 +57,6 @@ export interface DaoWizardInput { initialDaoBalance: number | undefined; tokenMarketing: FormState; - council?: FormState; - existingTokenAddr: string; existingToken: CW20TokenInfoResponse | undefined; existingTokenLoading: boolean; @@ -112,7 +101,6 @@ export type DaoWizardStep = | 'type' | 'daoImport' | 'info' - | 'council' | 'socials' | 'govConfig' | 'confirm' @@ -136,7 +124,6 @@ export interface DaoWizardState extends DaoWizardInput { const sharedInitialSteps: DaoWizardStep[] = ['type', 'info', 'daoImport']; const sharedLastSteps: DaoWizardStep[] = [ 'govConfig', - // 'council', 'socials', 'confirm', ]; @@ -190,11 +177,6 @@ const getInitialState = (timeConversionFactor: number, walletAddr: string | unde daoAddress: undefined, }, - council: { - members: [], - allowedProposalTypes: ['upgrade_dao'], - }, - members: walletAddr ? [{ ...EMPTY_MEMBER, addr: walletAddr }, EMPTY_MEMBER] : [EMPTY_MEMBER], nftMembership: { @@ -300,18 +282,6 @@ const validateCurrentStep = (state: DaoWizardState): Partial => }; }, - council: () => { - // TODO: remove TEMP changes - if (!state.council) return {}; - - const council = validateCouncil(state.council); - - return { - council, - isValid: council.members.every(isFormStateValid) && isFormStateValid(council), - }; - }, - membership: () => { const nftMembership = validateNftMembership(state.nftMembership); return { diff --git a/apps/enterprise/src/pages/create-dao/helpers/toCreateDaoMsg.ts b/apps/enterprise/src/pages/create-dao/helpers/toCreateDaoMsg.ts index f1efa69f..eaf6ab98 100644 --- a/apps/enterprise/src/pages/create-dao/helpers/toCreateDaoMsg.ts +++ b/apps/enterprise/src/pages/create-dao/helpers/toCreateDaoMsg.ts @@ -3,7 +3,7 @@ import { microfy } from '@terra-money/apps/libs/formatting'; import { DaoWizardInput, DaoWizardState } from '../DaoWizardFormProvider'; import { enterprise_factory } from 'types/contracts'; import { assertDefined } from '@terra-money/apps/utils'; - +// TODO: Revert this when audit si done const getDaoMembership = (input: DaoWizardInput) => { const { type, @@ -99,26 +99,17 @@ const getDaoGovConfig = ({ govConfig, type, timeConversionFactor }: DaoWizardSta export const toCreateDaoMsg = (input: DaoWizardState): CreateDaoMsgType => { const { - info: { name, logo, description }, + info: { name, logo }, socials, - council, } = input; return { create_dao: { - dao_council: - council && council.members.length > 0 - ? { - members: council.members.map((member) => member.address), - allowed_proposal_action_types: council.allowedProposalTypes, - } - : null, asset_whitelist: null, dao_membership: getDaoMembership(input), dao_metadata: { logo: logo ? { url: logo } : 'none', name, - description, socials: { github_username: socials.githubUsername, twitter_username: socials.twitterUsername, diff --git a/apps/enterprise/src/pages/create-dao/shared/CouncilStep.tsx b/apps/enterprise/src/pages/create-dao/shared/CouncilStep.tsx deleted file mode 100644 index 252dcc97..00000000 --- a/apps/enterprise/src/pages/create-dao/shared/CouncilStep.tsx +++ /dev/null @@ -1,50 +0,0 @@ -import { assertDefined, removeByIndex, updateAtIndex } from '@terra-money/apps/utils'; -import { AddButton } from 'components/add-button'; -import { DeleteIconButton } from 'components/delete-icon-button'; -import { TextInput } from 'lib/ui/inputs/TextInput'; -import { Line } from 'lib/ui/Line'; -import { HStack, VStack } from 'lib/ui/Stack'; -import { CouncilMember, useDaoWizardForm } from '../DaoWizardFormProvider'; -import { WizardStep } from '../WizardStep'; -import { CouncilProposalActionType, ProposalTypesInput } from './ProposalTypesInput'; - -export function CouncilStep() { - const { - formInput, - formState: { council: optionalCouncil, isValid }, - } = useDaoWizardForm(); - - // TODO: temporary change - const council = assertDefined(optionalCouncil); - const { members, allowedProposalTypes } = council; - - const updateMembers = (members: CouncilMember[]) => formInput({ council: { ...council, members } }); - - return ( - - - formInput({ council: { ...council, allowedProposalTypes } })} - error={council.allowedProposalTypesError} - /> - - - {members.map((member, index) => ( - - updateMembers(updateAtIndex(council.members, index, { address }))} - /> - updateMembers(removeByIndex(council.members, index))} /> - - ))} - {isValid && updateMembers([...council.members, { address: '' }])} />} - - - - ); -} diff --git a/apps/enterprise/src/pages/create-dao/shared/helpers/validateCouncil.ts b/apps/enterprise/src/pages/create-dao/shared/helpers/validateCouncil.ts deleted file mode 100644 index baad09c7..00000000 --- a/apps/enterprise/src/pages/create-dao/shared/helpers/validateCouncil.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { FormState } from '@terra-money/apps/hooks'; -import { validateAddress } from '@terra-money/apps/utils'; -import { CouncilInput } from 'pages/create-dao/DaoWizardFormProvider'; - -export const validateCouncil = ({ members, allowedProposalTypes }: CouncilInput): FormState => { - const formState: FormState = { members, allowedProposalTypes }; - - formState.members.map(({ address }) => ({ - address, - addressError: validateAddress(address), - })); - - if (allowedProposalTypes.length < 1) { - formState.allowedProposalTypesError = 'At least one proposal type must be selected'; - } - - return formState; -}; diff --git a/apps/enterprise/src/pages/create-proposal/CreateProposalPage.tsx b/apps/enterprise/src/pages/create-proposal/CreateProposalPage.tsx index 0ff03899..a7b717a1 100644 --- a/apps/enterprise/src/pages/create-proposal/CreateProposalPage.tsx +++ b/apps/enterprise/src/pages/create-proposal/CreateProposalPage.tsx @@ -20,7 +20,7 @@ import { TextProposalForm } from './text/TextProposalForm'; import { UpgradeProposalForm } from './upgrade/UpgradeProposalForm'; import { ExecuteMessageProposalForm } from './execute/ExecuteMessageProposalForm'; import { MintTokensProposalForm } from './mint/MintTokensProposalForm'; -import { CouncilForm } from './council/CouncilForm'; +// import { CouncilForm } from './council/CouncilForm'; import { useSearchParams } from 'react-router-dom'; import { AnimatedPage } from '@terra-money/apps/components'; import styled from 'styled-components'; @@ -75,7 +75,7 @@ export const CreateProposalPage = () => { } - council={() => } + // council={() => } text={() => } config={() => } upgrade={() => } diff --git a/apps/enterprise/src/pages/create-proposal/SelectProposalType.tsx b/apps/enterprise/src/pages/create-proposal/SelectProposalType.tsx index ed6fe4b1..ea1950bd 100644 --- a/apps/enterprise/src/pages/create-proposal/SelectProposalType.tsx +++ b/apps/enterprise/src/pages/create-proposal/SelectProposalType.tsx @@ -10,23 +10,21 @@ import { VStack } from 'lib/ui/Stack'; import { MobileCreateProposalHeader } from './MobileCreateProposalHeader'; import { PrimarySelect } from 'lib/ui/inputs/PrimarySelect'; import styled from '@emotion/styled'; -import { without } from 'lodash'; import { DAO } from 'types'; import { Text } from 'lib/ui/Text'; import { useMyVotingPower } from 'dao/components/MyVotingPowerProvider'; -import { useAmICouncilMember } from 'dao/hooks/useAmICouncilMember'; import { daoProposalsRecord, proposalTitle, ProposalType } from 'dao/shared/proposal'; -import { CouncilProposalActionType } from 'pages/create-dao/shared/ProposalTypesInput'; +// import { CouncilProposalActionType } from 'pages/create-dao/shared/ProposalTypesInput'; import { capitalizeFirstLetter } from 'lib/shared/utils/capitalizeFirstLetter'; import styles from './SelectProposalType.module.sass'; const title = 'Create a proposal'; -const contractsProposalTypeRecord: Record = { - update_asset_whitelist: 'assets', - update_nft_whitelist: 'nfts', - upgrade_dao: 'upgrade', - update_metadata: 'metadata', -}; +// const contractsProposalTypeRecord: Record = { +// update_asset_whitelist: 'assets', +// update_nft_whitelist: 'nfts', +// upgrade_dao: 'upgrade', +// update_metadata: 'metadata', +// }; export const proposalDescription: Record = { text: 'Create general-purpose petitions, such as asking the DAO to partner with another protocol or for the DAO to implement a new feature', @@ -44,7 +42,6 @@ export const proposalDescription: Record = { metadata: 'Update metadata of your DAO', undelegate: 'Undelegate LUNA from a validator that you have delegated to', redelegate: 'Redelegate LUNA from your current validator to a new validator', - council: '', mintNft: 'Mint a new DAO governance NFT to an account. This only works if the minter of the NFT is the DAO treasury address.', }; @@ -84,26 +81,9 @@ const proposalVotingTypeName: Record = { council: 'Emergency', }; -const getProposalOptions = ({ type, council }: DAO, proposalVotingType: ProposalVotingType) => { +const getProposalOptions = ({ type }: DAO, proposalVotingType: ProposalVotingType) => { const options = daoProposalsRecord[type]; - if (council) { - if (proposalVotingType === 'regular') { - return options; - } - const { allowed_proposal_action_types } = council; - if (allowed_proposal_action_types) { - return allowed_proposal_action_types.reduce((acc, type) => { - const proposalType = contractsProposalTypeRecord[type as CouncilProposalActionType]; - if (proposalType) { - acc.push(proposalType); - } - - return acc; - }, [] as ProposalType[]); - } - } - - return without(options, 'council'); + return options; }; export const SelectProposalType = () => { @@ -115,14 +95,13 @@ export const SelectProposalType = () => { const [proposalType, setProposalType] = useState('text'); const proposalDescriptionText = proposalDescription[proposalType]; const navigate = useNavigate(); - const amICouncilMember = useAmICouncilMember(); const [proposalVotingType, setProposalVotingType] = useState(() => - amICouncilMember ? 'council' : 'regular' + 'regular' ); const renderVotingTypePicker = () => { - if (!dao?.council) return null; + if (!dao) return null; return ( { }; const renderOptions = () => { - const options = getProposalOptions(dao, proposalVotingType); + const options = getProposalOptions(dao, 'regular'); - if (proposalVotingType === 'council' && !amICouncilMember) { + if (proposalVotingType === 'council') { return Only council members can create emergency proposals.; } diff --git a/apps/enterprise/src/pages/create-proposal/council/CouncilForm.tsx b/apps/enterprise/src/pages/create-proposal/council/CouncilForm.tsx deleted file mode 100644 index 8133a615..00000000 --- a/apps/enterprise/src/pages/create-proposal/council/CouncilForm.tsx +++ /dev/null @@ -1,106 +0,0 @@ -import { zodResolver } from '@hookform/resolvers/zod'; -import { terraAddressRegex } from '@terra-money/apps/utils'; -import { AddButton } from 'components/add-button'; -import { DeleteIconButton } from 'components/delete-icon-button'; -import { TextInput } from 'lib/ui/inputs/TextInput'; -import { Line } from 'lib/ui/Line'; -import { HStack, VStack } from 'lib/ui/Stack'; -import { CouncilMember } from 'pages/create-dao/DaoWizardFormProvider'; -import { CouncilProposalActionType, ProposalTypesInput } from 'pages/create-dao/shared/ProposalTypesInput'; -import { useCurrentDao } from 'dao/components/CurrentDaoProvider'; -import { Controller, useFieldArray, useForm } from 'react-hook-form'; -import { enterprise } from 'types/contracts'; -import * as z from 'zod'; -import { ProposalForm } from '../shared/ProposalForm'; -import { toUpdateCouncilMsg } from './toUpdateCouncilMsg'; - -interface CouncilFormSchema { - members: CouncilMember[]; - allowedProposalTypes: string[]; -} - -const councilFormSchema: z.ZodType = z.object({ - members: z - .array( - z.object({ - address: z.string().regex(terraAddressRegex, { message: 'Invalid Terra address' }), - }) - ) - .refine( - (members) => { - const uniqueAddresses = new Set(members.map(({ address }) => address)); - return uniqueAddresses.size === members.length; - }, - { message: 'Duplicate addresses' } - ), - allowedProposalTypes: z.array(z.string()).nonempty(), -}); - -export const CouncilForm = () => { - const { council } = useCurrentDao(); - - const { - register, - formState: { isValid, errors }, - getValues, - control, - } = useForm({ - mode: 'all', - resolver: zodResolver(councilFormSchema), - defaultValues: { - members: council.members.map((address) => ({ address })), - allowedProposalTypes: council.allowed_proposal_action_types || [], - }, - }); - - const { fields, append, remove } = useFieldArray({ - control, - name: 'members', - }); - - return ( - { - const { members, allowedProposalTypes } = getValues(); - return [ - { - update_council: toUpdateCouncilMsg({ - members: members.map((member) => member.address), - allowedProposalTypes: allowedProposalTypes as enterprise.ProposalActionType[], - }), - }, - ]; - }} - > - - ( - - )} - /> - - - {fields.map((member, index) => ( - - - remove(index)} /> - - ))} - {isValid && append({ address: '' })} />} - - - - ); -}; diff --git a/apps/enterprise/src/pages/create-proposal/council/toUpdateCouncilMsg.ts b/apps/enterprise/src/pages/create-proposal/council/toUpdateCouncilMsg.ts deleted file mode 100644 index 9db5e183..00000000 --- a/apps/enterprise/src/pages/create-proposal/council/toUpdateCouncilMsg.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { enterprise } from 'types/contracts'; - -export type AssetType = 'native' | 'cw20'; - -interface ToUpdateCouncilMsgParams { - members: string[]; - allowedProposalTypes: enterprise.ProposalActionType[]; -} - -export const toUpdateCouncilMsg = ({ - members, - allowedProposalTypes, -}: ToUpdateCouncilMsgParams): enterprise.UpdateCouncilMsg => { - if (members.length === 0) { - return { - dao_council: null, - }; - } - - return { - dao_council: { - members, - allowed_proposal_action_types: allowedProposalTypes, - }, - }; -}; diff --git a/apps/enterprise/src/pages/create-proposal/metadata/toUpdateMetadataMsg.ts b/apps/enterprise/src/pages/create-proposal/metadata/toUpdateMetadataMsg.ts index 2b358d6d..4518b614 100644 --- a/apps/enterprise/src/pages/create-proposal/metadata/toUpdateMetadataMsg.ts +++ b/apps/enterprise/src/pages/create-proposal/metadata/toUpdateMetadataMsg.ts @@ -22,7 +22,7 @@ export const toUpdateMetadataMsg = ( logo, name, }: // description, - MetadataProposalFormInput + MetadataProposalFormInput ): enterprise.UpdateMetadataMsg => { const msg: enterprise.UpdateMetadataMsg = { discord_username: 'no_change', @@ -31,7 +31,7 @@ export const toUpdateMetadataMsg = ( twitter_username: 'no_change', logo: 'no_change', name: 'no_change', - description: 'no_change', + // description: 'no_change', }; if (hasSocialChanged(dao.socials.discord_username, discordUsername)) { diff --git a/apps/enterprise/src/pages/create-proposal/metadata/useMetadataForm.tsx b/apps/enterprise/src/pages/create-proposal/metadata/useMetadataForm.tsx index 1440bb2f..38b12b23 100644 --- a/apps/enterprise/src/pages/create-proposal/metadata/useMetadataForm.tsx +++ b/apps/enterprise/src/pages/create-proposal/metadata/useMetadataForm.tsx @@ -65,7 +65,7 @@ export const useMetadataForm = () => { ); const initialState: MetadataProposalFormState = useMemo(() => { - const { name, logo, description, socials } = dao; + const { name, logo, socials } = dao; const initialInput: MetadataProposalFormInput = { discordUsername: socials.discord_username || undefined, @@ -74,8 +74,7 @@ export const useMetadataForm = () => { twitterUsername: socials.twitter_username || undefined, logo: logo || '', - name: name || '', - description: description || '', + name: name || '' }; const state = { diff --git a/apps/enterprise/src/pages/dao/DaoCouncilOverview.tsx b/apps/enterprise/src/pages/dao/DaoCouncilOverview.tsx deleted file mode 100644 index 00fd9781..00000000 --- a/apps/enterprise/src/pages/dao/DaoCouncilOverview.tsx +++ /dev/null @@ -1,27 +0,0 @@ -import { Address } from 'components/address'; -import { Panel } from 'components/panel'; -import { SameWidthChildrenRow } from 'lib/ui/Layout/SameWidthChildrenRow'; -import { VStack } from 'lib/ui/Stack'; -import { Text } from 'lib/ui/Text'; -import { useCurrentDao } from 'dao/components/CurrentDaoProvider'; - -export const DaoCouncilOverview = () => { - const { council } = useCurrentDao(); - - if (!council || council.members.length < 1) return null; - - return ( - - - DAO Council - - - {council.members.map((member) => ( - -
- - ))} - - - ); -}; diff --git a/apps/enterprise/src/pages/dao/Header.tsx b/apps/enterprise/src/pages/dao/Header.tsx index d1e6afad..d7714f73 100644 --- a/apps/enterprise/src/pages/dao/Header.tsx +++ b/apps/enterprise/src/pages/dao/Header.tsx @@ -51,7 +51,7 @@ export const Header = forwardRef((props: HeaderProps, ref: Ref) {dao.name} - {dao.description && {dao.description}} + {/* {dao.description && {dao.description}} */} diff --git a/apps/enterprise/src/pages/dao/MobileDaoHeader.tsx b/apps/enterprise/src/pages/dao/MobileDaoHeader.tsx index a9c9558b..8f029f29 100644 --- a/apps/enterprise/src/pages/dao/MobileDaoHeader.tsx +++ b/apps/enterprise/src/pages/dao/MobileDaoHeader.tsx @@ -18,7 +18,7 @@ export const MobileDaoHeader = () => { {dao.name} - {dao.description && {dao.description}} + {/* {dao.description && {dao.description}} */} diff --git a/apps/enterprise/src/pages/dao/Overview.tsx b/apps/enterprise/src/pages/dao/Overview.tsx index c3463ed4..9ce85c34 100644 --- a/apps/enterprise/src/pages/dao/Overview.tsx +++ b/apps/enterprise/src/pages/dao/Overview.tsx @@ -9,7 +9,6 @@ import { TokenDaoTotalStakedPanel } from './TokenDaoTotalStakedPanel'; import { TokenDaoPricePanel } from './TokenDaoPricePanel'; import { VStack } from 'lib/ui/Stack'; import { MultisigDaoMembersPanel } from './MultisigDaoMembersPanel'; -import { DaoCouncilOverview } from './DaoCouncilOverview'; import { AddressesOverview } from './AddressesOverview'; import { GovernanceOverview } from './GovernanceOverview'; import { SameWidthChildrenRow } from 'lib/ui/Layout/SameWidthChildrenRow'; @@ -43,7 +42,6 @@ export const Overview = () => { - ); diff --git a/apps/enterprise/src/pages/dao/proposals/ProposalsPage.tsx b/apps/enterprise/src/pages/dao/proposals/ProposalsPage.tsx index 444e592d..68525f44 100644 --- a/apps/enterprise/src/pages/dao/proposals/ProposalsPage.tsx +++ b/apps/enterprise/src/pages/dao/proposals/ProposalsPage.tsx @@ -9,7 +9,7 @@ import { useMemo, useState } from 'react'; import { useCurrentDao } from 'dao/components/CurrentDaoProvider'; import { HStack } from 'lib/ui/Stack'; import { ResponsiveView } from 'lib/ui/ResponsiveView'; -import { useAmICouncilMember } from 'dao/hooks/useAmICouncilMember'; +// import { useAmICouncilMember } from 'dao/hooks/useAmICouncilMember'; import { useDaoProposalsQuery } from 'queries/useDaoProposalsQuery'; import { PrimaryButton } from 'lib/ui/buttons/rect/PrimaryButton'; import { EmptyStatePlaceholder } from 'lib/ui/EmptyStatePlaceholder'; @@ -71,9 +71,9 @@ export const ProposalsPage = () => { const navigate = useNavigate(); - const amICouncilMember = useAmICouncilMember(); + // const amICouncilMember = useAmICouncilMember(); - const newProposalsDisabled = votingPower.lte(0) && !amICouncilMember; + const newProposalsDisabled = votingPower.lte(0); console.log(proposals, isLoading); @@ -157,9 +157,8 @@ export const ProposalsPage = () => { [...Array(LIMIT)].map((_, index) => ) ) : ( diff --git a/apps/enterprise/src/pages/proposal/CastVote.tsx b/apps/enterprise/src/pages/proposal/CastVote.tsx index d9ae792b..8c5ada37 100644 --- a/apps/enterprise/src/pages/proposal/CastVote.tsx +++ b/apps/enterprise/src/pages/proposal/CastVote.tsx @@ -14,10 +14,9 @@ import { ReactComponent as VoteAbstain } from 'components/assets/VoteAbstain.svg import { ReactComponent as VoteVeto } from 'components/assets/VoteVeto.svg'; import styles from './CastVote.module.sass'; import classNames from 'classnames'; -import { useAmICouncilMember } from 'dao/hooks/useAmICouncilMember'; interface VoteOption { - outcome: enterprise.VoteOutcome; + outcome: enterprise.DefaultVoteOption; icon: ReactNode; tooltip: string; } @@ -38,9 +37,8 @@ export const CastVote = () => { const [txResult, tx] = useCastVoteTx(proposal.votingType); - const amICouncilMember = useAmICouncilMember(); - const [vote, setVote] = useState(); + const [vote, setVote] = useState(); const { data: votingPower, isLoading: isVotingPowerLoading } = useVotingPowerQuery( proposal.dao.address as CW20Addr, @@ -66,9 +64,6 @@ export const CastVote = () => { return Loading voting power ...; } - if (proposal.votingType === 'council' && !amICouncilMember) { - return Council members only; - } if (proposal.votingType === 'regular' && votingPower && votingPower.eq(0)) { if (proposal.dao.type === 'multisig') { diff --git a/apps/enterprise/src/pages/proposal/ProposalActions.tsx b/apps/enterprise/src/pages/proposal/ProposalActions.tsx index 0e2a0017..d1cc83b1 100644 --- a/apps/enterprise/src/pages/proposal/ProposalActions.tsx +++ b/apps/enterprise/src/pages/proposal/ProposalActions.tsx @@ -8,7 +8,7 @@ import { ExecuteMessagesProposalAction } from './ExecuteMessagesProposalAction'; import { GovConfigProposalAction } from './GovConfigProposalAction'; import { MetadataProposalAction } from './MetadataProposalAction'; import { UpdateAssetsWhitelistAction } from './UpdateAssetsWhitelistAction'; -import { UpdateCouncilAction } from './UpdateCouncilAction'; +// import { UpdateCouncilAction } from './UpdateCouncilAction'; import { UpdateMultisigMembersAction } from './UpdateMultisigMembersAction'; import { UpdateNFTsWhitelistAction } from './UpdateNFTWhitelistAction'; import { UpgradeProposalAction } from './UpgradeProposalAction'; @@ -31,7 +31,7 @@ export const ProposalActions = () => { update_nft_whitelist={() => } request_funding_from_dao={() => null} execute_msgs={() => } - update_council={() => } + // update_council={() => } upgrade_dao={() => } modify_multisig_membership={() => ( diff --git a/apps/enterprise/src/pages/proposal/ProposalVotes.tsx b/apps/enterprise/src/pages/proposal/ProposalVotes.tsx index 3d34c679..822933a3 100644 --- a/apps/enterprise/src/pages/proposal/ProposalVotes.tsx +++ b/apps/enterprise/src/pages/proposal/ProposalVotes.tsx @@ -50,7 +50,7 @@ export const ProposalVotes = () => { {totalAvailableVotes.gt(0) && ( {toPercents(amount.div(totalAvailableVotes).toNumber())} )} - {proposal.votingType !== 'council' && token && ( + {token && ( {`${demicrofy(amount, token.decimals ?? 6)} ${token.symbol}`} )} diff --git a/apps/enterprise/src/pages/proposal/ProposalVotingBar.tsx b/apps/enterprise/src/pages/proposal/ProposalVotingBar.tsx index 808f39db..b37f0f3b 100644 --- a/apps/enterprise/src/pages/proposal/ProposalVotingBar.tsx +++ b/apps/enterprise/src/pages/proposal/ProposalVotingBar.tsx @@ -15,7 +15,7 @@ export const ProposalVotingBar = () => { const { data: totalStaked = Big(0) as u } = useTokenStakingAmountQuery(dao.address); const totalAvailableVotes = useMemo(() => { - if (votingType === 'council') return totalVotes; + if (votingType === 'regular') return totalVotes; return dao.type === 'multisig' ? totalVotes : status === 'in_progress' ? totalStaked : totalVotes; }, [dao.type, status, totalStaked, totalVotes, votingType]); diff --git a/apps/enterprise/src/pages/proposal/UpdateCouncilAction.tsx b/apps/enterprise/src/pages/proposal/UpdateCouncilAction.tsx deleted file mode 100644 index 270346b0..00000000 --- a/apps/enterprise/src/pages/proposal/UpdateCouncilAction.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import { Address } from 'components/address'; -import { Panel } from 'components/panel'; -import { useCurrentProposalAction } from 'dao/components/CurrentProposalActionProvider'; -import { SameWidthChildrenRow } from 'lib/ui/Layout/SameWidthChildrenRow'; -import { VStack } from 'lib/ui/Stack'; -import { Text } from 'lib/ui/Text'; -import { enterprise } from 'types/contracts'; - -export const UpdateCouncilAction = () => { - const { msg } = useCurrentProposalAction() as { msg: enterprise.UpdateCouncilMsg }; - - const { dao_council } = msg; - - if (!dao_council) { - return Proposal to remove council; - } - - const { members, allowed_proposal_action_types } = dao_council; - - return ( - - - New council members - - {members.map((member) => ( - -
- - ))} - - - {allowed_proposal_action_types && ( - - New council allowed proposal types - - {allowed_proposal_action_types.map((type) => ( - - {type} - - ))} - - - )} - - ); -}; diff --git a/apps/enterprise/src/pages/proposal/helpers/metadataView.ts b/apps/enterprise/src/pages/proposal/helpers/metadataView.ts index a0c1b1eb..d511bc6b 100644 --- a/apps/enterprise/src/pages/proposal/helpers/metadataView.ts +++ b/apps/enterprise/src/pages/proposal/helpers/metadataView.ts @@ -52,9 +52,9 @@ export const getUpdatedFields = (msg: enterprise.UpdateMetadataMsg): Partial { const { name, logo = noValue, - description = noValue, socials: { discord_username = noValue, github_username = noValue, @@ -79,6 +78,5 @@ export const fromDao = (dao: DAO): MetadataView => { twitter: twitter_username, logo, name, - description, }; }; diff --git a/apps/enterprise/src/pages/shared/ProposalTags.tsx b/apps/enterprise/src/pages/shared/ProposalTags.tsx index 644c50b9..6af5409a 100644 --- a/apps/enterprise/src/pages/shared/ProposalTags.tsx +++ b/apps/enterprise/src/pages/shared/ProposalTags.tsx @@ -24,7 +24,7 @@ export const ProposalTags = (props: ProposalStatusProps) => { {status} {proposalTypeName} - {proposal.votingType === 'council' && Emergency} + {proposal.votingType === 'regular' && Emergency} ); }; diff --git a/apps/enterprise/src/queries/useDAOQuery.ts b/apps/enterprise/src/queries/useDAOQuery.ts index bb2f1e23..79a92710 100644 --- a/apps/enterprise/src/queries/useDAOQuery.ts +++ b/apps/enterprise/src/queries/useDAOQuery.ts @@ -24,13 +24,11 @@ export const useDAOQuery = (address: CW20Addr): UseQueryResult entity.address, entity.type, entity.name, - entity.description, entity.logo, entity.membershipContractAddress, entity.enterpriseFactoryContract, entity.socials, entity.config, - entity.council ); } diff --git a/apps/enterprise/src/queries/useDAOsQuery.ts b/apps/enterprise/src/queries/useDAOsQuery.ts index eedb8229..d77b7172 100644 --- a/apps/enterprise/src/queries/useDAOsQuery.ts +++ b/apps/enterprise/src/queries/useDAOsQuery.ts @@ -21,7 +21,7 @@ export type DAOsQueryResponse = Array<{ enterpriseFactoryContract: string; socials: DAOSocials; config: DAOGovernanceConfig; - council: enterprise.DaoCouncil; + // council: enterprise.DaoCouncil; }>; export const fetchDAOsQuery = async (endpoint: string) => { @@ -34,13 +34,11 @@ export const fetchDAOsQuery = async (endpoint: string) => { entity.address, entity.type, entity.name, - entity.description, entity.logo, entity.membershipContractAddress, entity.enterpriseFactoryContract, entity.socials, entity.config, - entity.council ); }); }; diff --git a/apps/enterprise/src/queries/useDaoProposalsQuery.ts b/apps/enterprise/src/queries/useDaoProposalsQuery.ts index 2811e593..7a439f75 100644 --- a/apps/enterprise/src/queries/useDaoProposalsQuery.ts +++ b/apps/enterprise/src/queries/useDaoProposalsQuery.ts @@ -16,7 +16,7 @@ interface UseProposalsQueryOptions { } type ProposalsQueryArguments = Extract; -type CouncilProposalsQueryArguments = Extract; +// type CouncilProposalsQueryArguments = Extract; export const useDaoProposalsQuery = ({ address, @@ -37,16 +37,16 @@ export const useDaoProposalsQuery = ({ } catch (err) { reportError(err); } - - try { - const { proposals } = await query(address, { - council_proposals: {}, - }); - result.push(...proposals.map((resp) => toProposal(resp, assertDefined(dao), 'council'))); - } catch (err) { - console.log('Council', err); - reportError(err); - } + // TODO: Add back when new version of contracts is added + // try { + // const { proposals } = await query(address, { + // council_proposals: {}, + // }); + // result.push(...proposals.map((resp) => toProposal(resp, assertDefined(dao), 'council'))); + // } catch (err) { + // console.log('Council', err); + // reportError(err); + // } return result.sort((a, b) => b.created - a.created); }, diff --git a/apps/enterprise/src/queries/useProposalQuery.ts b/apps/enterprise/src/queries/useProposalQuery.ts index 46b2e97c..f6cc46f1 100644 --- a/apps/enterprise/src/queries/useProposalQuery.ts +++ b/apps/enterprise/src/queries/useProposalQuery.ts @@ -15,7 +15,7 @@ interface UseProposalQueryOptions { } type ProposalsQueryArguments = Extract; -type CouncilProposalsQueryArguments = Extract; +// type CouncilProposalsQueryArguments = Extract; export const useProposalQuery = (options: UseProposalQueryOptions): UseQueryResult => { const { query } = useContract(); @@ -33,10 +33,12 @@ export const useProposalQuery = (options: UseProposalQueryOptions): UseQueryResu }); return toProposal(resp, assertDefined(dao), 'regular'); } catch (err) { - const councilProposal = await query(daoAddress, { - council_proposal: { proposal_id: id }, - }); - return toProposal(councilProposal, assertDefined(dao), 'council'); + // TODO: Add back when new version of contracts is added + // const councilProposal = await query(daoAddress, { + // council_proposal: { proposal_id: id }, + // }); + // return toProposal(councilProposal, assertDefined(dao), 'council'); + reportError(err); } }, { diff --git a/apps/enterprise/src/tx/useCastVoteTx.ts b/apps/enterprise/src/tx/useCastVoteTx.ts index 952ce04e..110f666f 100644 --- a/apps/enterprise/src/tx/useCastVoteTx.ts +++ b/apps/enterprise/src/tx/useCastVoteTx.ts @@ -5,7 +5,7 @@ import { TX_KEY } from './txKey'; interface VoteOnProposalTxOptions { id: number; - outcome: enterprise.VoteOutcome; + outcome: enterprise.DefaultVoteOption; contract: string; } @@ -30,7 +30,7 @@ export const useCastVoteTx = (proposalVotingType: ProposalVotingType) => { .execute( wallet.walletAddress, contract, - proposalVotingType === 'council' ? { cast_council_vote: cast_vote } : { cast_vote } + { cast_vote } ) .build(); }, diff --git a/apps/enterprise/src/tx/useCreateProposalTx.ts b/apps/enterprise/src/tx/useCreateProposalTx.ts index 36b2668c..5917316c 100644 --- a/apps/enterprise/src/tx/useCreateProposalTx.ts +++ b/apps/enterprise/src/tx/useCreateProposalTx.ts @@ -31,13 +31,15 @@ export const useCreateProposalTx = (dao: DAO, proposalVotingType: ProposalVoting .execute( wallet.walletAddress, daoAddress, - proposalVotingType === 'regular' - ? { - create_proposal, - } - : { - create_council_proposal: create_proposal, - } + // TODO: Remove this after auidit is done + { create_proposal }, + // proposalVotingType === 'regular' + // ? { + // create_proposal, + // } + // : { + // create_council_proposal: create_proposal, + // } ) .build(); }, diff --git a/apps/enterprise/src/tx/useExecuteProposalTx.ts b/apps/enterprise/src/tx/useExecuteProposalTx.ts index d3bc4690..21893549 100644 --- a/apps/enterprise/src/tx/useExecuteProposalTx.ts +++ b/apps/enterprise/src/tx/useExecuteProposalTx.ts @@ -10,18 +10,19 @@ interface ExecuteProposalTxOptions { votingType: ProposalVotingType; } -export const getExecuteProposalMsg = ({ id, votingType }: Pick) => { +export const getExecuteProposalMsg = ({ id }: Pick) => { const msg = { proposal_id: id, }; - - return votingType === 'regular' - ? { - execute_proposal: msg, - } - : { - execute_council_proposal: msg, - }; + return { execute_proposal: msg } + // TODO: Add back when audit is done + // return votingType === 'regular' + // ? { + // execute_proposal: msg, + // } + // : { + // execute_council_proposal: msg, + // }; }; export const useExecuteProposalTx = () => { @@ -29,12 +30,12 @@ export const useExecuteProposalTx = () => { return useTx( (options) => { - const { daoAddress, proposalId, wallet, votingType } = options; + const { daoAddress, proposalId, wallet } = options; const tx = TxBuilder.new() .execute( wallet.walletAddress, daoAddress, - getExecuteProposalMsg({ id: proposalId, votingType }) + getExecuteProposalMsg({ id: proposalId }) ) .build(); diff --git a/apps/enterprise/src/types/DAO.ts b/apps/enterprise/src/types/DAO.ts index 97b13ffb..aa4a1b99 100644 --- a/apps/enterprise/src/types/DAO.ts +++ b/apps/enterprise/src/types/DAO.ts @@ -15,18 +15,16 @@ export type DAOGovernanceConfig = { voteDuration: number; minimumDeposit?: string; }; - +// TODO: Revert this when audit is done export class DAO { constructor( public readonly address: string, public readonly type: enterprise.DaoType, public readonly name: string, - public readonly description: string | undefined = undefined, public readonly logo: string | undefined = undefined, public readonly membershipContractAddress: string, public readonly enterpriseFactoryContract: string, public readonly socials: DAOSocials, public readonly governanceConfig: DAOGovernanceConfig, - public readonly council: enterprise.DaoCouncil - ) {} + ) { } } diff --git a/apps/enterprise/src/types/Vote.ts b/apps/enterprise/src/types/Vote.ts index 9fd8f56b..5d120d6e 100644 --- a/apps/enterprise/src/types/Vote.ts +++ b/apps/enterprise/src/types/Vote.ts @@ -2,12 +2,13 @@ import { u } from '@terra-money/apps/types'; import Big from 'big.js'; import { enterprise } from './contracts'; -const voteOptions: readonly enterprise.VoteOutcome[] = ['yes', 'no', 'abstain', 'veto'] as const; + +const voteOptions: enterprise.DefaultVoteOption[] = ['yes', 'no', 'abstain', 'veto']; export class Vote { public readonly proposalId: number; public readonly voter: string; - public readonly outcome: enterprise.VoteOutcome; + public readonly outcome: enterprise.DefaultVoteOption; public readonly amount: u; constructor(public readonly vote: enterprise.Vote) { this.proposalId = vote.poll_id; diff --git a/apps/enterprise/src/types/contracts/enterprise.ts b/apps/enterprise/src/types/contracts/enterprise.ts index e2c10ef0..88f0c635 100644 --- a/apps/enterprise/src/types/contracts/enterprise.ts +++ b/apps/enterprise/src/types/contracts/enterprise.ts @@ -2,18 +2,18 @@ export module enterprise { export type Uint128 = string; export type AssetInfoBaseFor_Addr = | { - native: string; - } - | { - cw20: Addr; - } - | { - /** - * @minItems 2 - * @maxItems 2 - */ - cw1155: [Addr, string]; - }; + native: string; + } + | { + cw20: Addr; + } + | { + /** + * @minItems 2 + * @maxItems 2 + */ + cw1155: [Addr, string]; + }; export type Addr = string; export interface AssetTreasuryResponse { assets: AssetBaseFor_Addr[]; @@ -33,18 +33,18 @@ export module enterprise { } export type ClaimAsset = | { - cw20: Cw20ClaimAsset; - } + cw20: Cw20ClaimAsset; + } | { - cw721: Cw721ClaimAsset; - }; + cw721: Cw721ClaimAsset; + }; export type ReleaseAt = | { - timestamp: Timestamp; - } + timestamp: Timestamp; + } | { - height: Uint64; - }; + height: Uint64; + }; export type Timestamp = Uint64; export type Uint64 = string; export interface ClaimsResponse { @@ -62,102 +62,84 @@ export module enterprise { } export type Cw20HookMsg = | { - stake: {}; - } + stake: {}; + } | { - create_proposal: CreateProposalMsg; - }; + create_proposal: CreateProposalMsg; + }; export type ProposalAction = | { - update_metadata: UpdateMetadataMsg; - } - | { - update_gov_config: UpdateGovConfigMsg; - } + update_metadata: UpdateMetadataMsg; + } | { - update_council: UpdateCouncilMsg; - } + update_gov_config: UpdateGovConfigMsg; + } | { - update_asset_whitelist: UpdateAssetWhitelistMsg; - } + update_asset_whitelist: UpdateAssetWhitelistMsg; + } | { - update_nft_whitelist: UpdateNftWhitelistMsg; - } + update_nft_whitelist: UpdateNftWhitelistMsg; + } | { - request_funding_from_dao: RequestFundingFromDaoMsg; - } + request_funding_from_dao: RequestFundingFromDaoMsg; + } | { - upgrade_dao: UpgradeDaoMsg; - } + upgrade_dao: UpgradeDaoMsg; + } | { - execute_msgs: ExecuteMsgsMsg; - } + execute_msgs: ExecuteMsgsMsg; + } | { - modify_multisig_membership: ModifyMultisigMembershipMsg; - }; + modify_multisig_membership: ModifyMultisigMembershipMsg; + }; export type ModifyValueFor_Nullable_String = | 'no_change' | { - change: string | null; - }; + change: string | null; + }; export type ModifyValueFor_Logo = | 'no_change' | { - change: Logo; - }; + change: Logo; + }; export type Logo = | 'none' | { - url: string; - }; + url: string; + }; export type ModifyValueFor_String = | 'no_change' | { - change: string; - }; + change: string; + }; export type ModifyValueFor_Nullable_Uint128 = | 'no_change' | { - change: Uint128 | null; - }; + change: Uint128 | null; + }; export type ModifyValueFor_Decimal = | 'no_change' | { - change: Decimal; - }; + change: Decimal; + }; export type Decimal = string; export type ModifyValueFor_Duration = | 'no_change' | { - change: Duration; - }; + change: Duration; + }; export type Duration = | { - height: number; - } - | { - time: number; - }; - export type ModifyValueFor_Nullable_Decimal = - | 'no_change' + height: number; + } | { - change: Decimal | null; - }; + time: number; + }; export type ModifyValueFor_Uint64 = | 'no_change' | { - change: Uint64; - }; - export type ProposalActionType = - | 'update_metadata' - | 'update_gov_config' - | 'update_council' - | 'update_asset_whitelist' - | 'update_nft_whitelist' - | 'request_funding_from_dao' - | 'upgrade_dao' - | 'execute_msgs' - | 'modify_multisig_membership'; + change: Uint64; + }; export type Binary = string; export interface CreateProposalMsg { /** @@ -174,7 +156,6 @@ export module enterprise { title: string; } export interface UpdateMetadataMsg { - description: ModifyValueFor_Nullable_String; discord_username: ModifyValueFor_Nullable_String; github_username: ModifyValueFor_Nullable_String; logo: ModifyValueFor_Logo; @@ -187,22 +168,8 @@ export module enterprise { quorum: ModifyValueFor_Decimal; threshold: ModifyValueFor_Decimal; unlocking_period: ModifyValueFor_Duration; - // veto_threshold: ModifyValueFor_Nullable_Decimal; voting_duration: ModifyValueFor_Uint64; } - export interface UpdateCouncilMsg { - dao_council?: DaoCouncil | null; - } - export interface DaoCouncil { - /** - * Proposal action types allowed in proposals that are voted on by the council. Effectively defines what types of actions council can propose and vote on. If None, will default to a predefined set of actions. - */ - allowed_proposal_action_types?: ProposalActionType[] | null; - /** - * Addresses of council members. Each member has equal voting power. - */ - members: string[]; - } export interface UpdateAssetWhitelistMsg { /** * New assets to add to the whitelist. Will ignore assets that are already whitelisted. @@ -232,8 +199,6 @@ export module enterprise { new_dao_code_id: number; } export interface ExecuteMsgsMsg { - // temporarily disable action_type until contract migrations - // action_type: string; msgs: string[]; } export interface ModifyMultisigMembershipMsg { @@ -253,7 +218,6 @@ export module enterprise { export interface DaoInfoResponse { creation_date: Timestamp; dao_code_version: Uint64; - dao_council?: DaoCouncil | null; dao_membership_contract: Addr; dao_type: DaoType; enterprise_factory_contract: Addr; @@ -277,17 +241,12 @@ export module enterprise { * Duration that has to pass for unstaked membership tokens to be claimable */ unlocking_period: Duration; - /** - * Portion of votes assigned to veto option from all the votes cast in the given proposal required to veto the proposal. If None, will default to the threshold set for all proposal options. - */ - veto_threshold?: Decimal | null; /** * Duration of proposals before they end, expressed in seconds */ vote_duration: number; } export interface DaoMetadata { - description?: string | null; logo: Logo; name: string; socials: DaoSocialData; @@ -300,45 +259,36 @@ export module enterprise { } export type ExecuteMsg = | { - create_proposal: CreateProposalMsg; - } + create_proposal: CreateProposalMsg; + } | { - create_council_proposal: CreateProposalMsg; - } + cast_vote: CastVoteMsg; + } | { - cast_vote: CastVoteMsg; - } + execute_proposal: ExecuteProposalMsg; + } | { - cast_council_vote: CastVoteMsg; - } + unstake: UnstakeMsg; + } | { - execute_proposal: ExecuteProposalMsg; - } + claim: {}; + } | { - execute_council_proposal: ExecuteProposalMsg; - } + receive: Cw20ReceiveMsg; + } | { - unstake: UnstakeMsg; - } - | { - claim: {}; - } - | { - receive: Cw20ReceiveMsg; - } - | { - receive_nft: Cw721ReceiveMsg; - }; - export type VoteOutcome = 'yes' | 'no' | 'abstain' | 'veto'; + receive_nft: Cw721ReceiveMsg; + }; + export type DefaultVoteOption = 'yes' | 'no' | 'abstain' | 'veto'; export type UnstakeMsg = | { - cw20: UnstakeCw20Msg; - } + cw20: UnstakeCw20Msg; + } | { - cw721: UnstakeCw721Msg; - }; + cw721: UnstakeCw721Msg; + }; export interface CastVoteMsg { - outcome: VoteOutcome; + outcome: DefaultVoteOption; proposal_id: number; } export interface ExecuteProposalMsg { @@ -362,30 +312,26 @@ export module enterprise { } export type DaoMembershipInfo = | { - new: NewDaoMembershipMsg; - } + new: NewDaoMembershipMsg; + } | { - existing: ExistingDaoMembershipMsg; - }; + existing: ExistingDaoMembershipMsg; + }; export type NewMembershipInfo = | { - new_token: NewTokenMembershipInfo; - } + new_token: NewTokenMembershipInfo; + } | { - new_nft: NewNftMembershipInfo; - } + new_nft: NewNftMembershipInfo; + } | { - new_multisig: NewMultisigMembershipInfo; - }; + new_multisig: NewMultisigMembershipInfo; + }; export interface InstantiateMsg { /** * Assets that are allowed to show in DAO's treasury */ asset_whitelist?: AssetInfoBaseFor_Addr[] | null; - /** - * Optional council structure that can manage certain aspects of the DAO - */ - dao_council?: DaoCouncil | null; dao_gov_config: DaoGovConfig; dao_membership_info: DaoMembershipInfo; dao_metadata: DaoMetadata; @@ -403,10 +349,6 @@ export module enterprise { membership_info: NewMembershipInfo; } export interface NewTokenMembershipInfo { - /** - * Optional amount of tokens to be minted to the DAO's address - */ - initial_dao_balance?: Uint128 | null; initial_token_balances: Cw20Coin[]; token_decimals: number; token_marketing?: TokenMarketingInfo | null; @@ -467,7 +409,7 @@ export module enterprise { */ voter: Addr; } - export interface MigrateMsg { } + export interface MigrateMsg {} export interface MultisigMembersResponse { members: MultisigMember[]; } @@ -481,65 +423,53 @@ export module enterprise { export interface NftWhitelistResponse { nfts: Addr[]; } - export type PollStatus = - | { - in_progress: { - ends_at: Timestamp; + export type PollType = + | 'default' + | { + multichoice: { + /** + * Number of outcomes, 0-indexed. + */ + n_outcomes: number; + /** + * List of possible winning outcomes that will cause a poll's status to become "Rejected". Can for example be used to create a Yes/No poll. + */ + rejecting_outcomes: number[]; + /** + * Threshold ratio, i.e. sum(most_voted) / total_votes. + */ + threshold: Decimal; + }; }; - } + export type VotingScheme = 'coin_voting'; + export type PollStatus = | { - passed: { - count: Uint128; - outcome: number; + in_progress: { + ends_at: Timestamp; + }; + } + | { + passed: { + count: Uint128; + outcome: number; + }; + } + | { + rejected: { + count?: Uint128 | null; + outcome?: number | null; + reason: PollRejectionReason; + }; }; - } + export type PollRejectionReason = + | ('quorum_not_reached' | 'threshold_not_reached' | 'quorum_and_threshold_not_reached' | 'is_rejecting_outcome') | { - rejected: { - reason: PollRejectionReason; + /** + * @minItems 3 + * @maxItems 3 + */ + outcome_draw: [number, number, Uint128]; }; - }; - export type PollRejectionReason = - | ( - | 'quorum_not_reached' - | 'threshold_not_reached' - | 'quorum_and_threshold_not_reached' - | 'is_rejecting_outcome' - | 'is_veto_outcome' - ) - | { - /** - * @minItems 3 - * @maxItems 3 - */ - outcome_draw: [number, number, Uint128]; - }; - export interface PollStatusResponse { - /** - * Poll end time. - */ - ends_at: Timestamp; - /** - * Total vote-count (value) for each outcome (key). - */ - results: [number, Uint128][]; - /** - * Status of the poll. - */ - status: PollStatus; - } - export interface PollVoterResponse { - /** - * The voter's vote on the specific poll. - */ - vote?: Vote | null; - } - export interface PollVotersResponse { - /** - * All votes on the specific poll. - */ - votes: Vote[]; - } - export type VotingScheme = 'coin_voting'; export interface PollsResponse { /** * The polls. @@ -567,12 +497,16 @@ export module enterprise { * User-defined label for the poll. */ label: string; + /** + * Type of the poll + */ + poll_type: PollType; /** * Proposer address. */ proposer: Addr; /** - * Quorum to be reached for the poll to be valid. Calculated as (total votes) / (total available votes). + * Quorum to be reached for the poll to be valid */ quorum: Decimal; /** @@ -591,26 +525,47 @@ export module enterprise { * Status of the poll. */ status: PollStatus; + } + export interface PollStatusResponse { + /** + * Poll end time. + */ + ends_at: Timestamp; /** - * Threshold ratio for a vote option to be the winning one. Calculated as (votes for certain option) / (total available votes - abstaining votes). + * Total vote-count (value) for each outcome (key). */ - threshold: Decimal; + results: [number, Uint128][]; + /** + * Status of the poll. + */ + status: PollStatus; + } + export interface PollVotersResponse { + /** + * All votes on the specific poll. + */ + votes: Vote[]; + } + export interface PollVoterResponse { /** - * Optional separate threshold ratio for a veto option to be the winning one. Calculated as (veto votes) / (total available votes - abstaining votes). If None, regular threshold will be used for veto option. + * The voter's vote on the specific poll. */ - veto_threshold?: Decimal | null; + vote?: Vote | null; } export type Expiration = | { - at_height: number; - } + at_height: number; + } | { - at_time: Timestamp; - } + at_time: Timestamp; + } | { - never: {}; - }; + never: {}; + }; export type ProposalStatus = 'in_progress' | 'passed' | 'rejected' | 'executed'; + export interface ProposalsResponse { + proposals: ProposalResponse[]; + } export interface ProposalResponse { proposal: Proposal; /** @@ -639,67 +594,55 @@ export module enterprise { export interface ProposalVotesResponse { votes: Vote[]; } - export interface ProposalsResponse { - proposals: ProposalResponse[]; - } export type QueryMsg = | { - dao_info: {}; - } - | { - member_info: QueryMemberInfoMsg; - } + dao_info: {}; + } | { - list_multisig_members: ListMultisigMembersMsg; - } + member_info: QueryMemberInfoMsg; + } | { - asset_whitelist: {}; - } + list_multisig_members: ListMultisigMembersMsg; + } | { - nft_whitelist: {}; - } + asset_whitelist: {}; + } | { - proposal: ProposalParams; - } + nft_whitelist: {}; + } | { - proposals: ProposalsParams; - } + proposal: ProposalParams; + } | { - proposal_status: ProposalStatusParams; - } + proposals: ProposalsParams; + } | { - council_proposal: ProposalParams; - } + proposal_status: ProposalStatusParams; + } | { - council_proposals: ProposalsParams; - } + member_vote: MemberVoteParams; + } | { - council_proposal_status: ProposalStatusParams; - } + proposal_votes: ProposalVotesParams; + } | { - member_vote: MemberVoteParams; - } + user_stake: UserStakeParams; + } | { - proposal_votes: ProposalVotesParams; - } + total_staked_amount: {}; + } | { - user_stake: UserStakeParams; - } + claims: ClaimsParams; + } | { - total_staked_amount: {}; - } + releasable_claims: ClaimsParams; + } | { - claims: ClaimsParams; - } + cw20_treasury: {}; + } | { - releasable_claims: ClaimsParams; - } - | { - cw20_treasury: {}; - } - | { - nft_treasury: {}; - }; + nft_treasury: {}; + }; export type ProposalStatusFilter = 'in_progress' | 'passed' | 'rejected'; export interface QueryMemberInfoMsg { member_address: string; @@ -746,11 +689,11 @@ export module enterprise { export type UserStake = | 'none' | { - token: TokenUserStake; - } + token: TokenUserStake; + } | { - nft: NftUserStake; - }; + nft: NftUserStake; + }; export interface UserStakeResponse { user_stake: UserStake; } @@ -761,4 +704,11 @@ export module enterprise { amount: Uint128; tokens: string[]; } + export type VoteOutcome = + | { + default: DefaultVoteOption; + } + | { + multichoice: number; + }; } diff --git a/apps/enterprise/src/types/contracts/enterprise_factory.ts b/apps/enterprise/src/types/contracts/enterprise_factory.ts index 0bb37cd7..d17a21a3 100644 --- a/apps/enterprise/src/types/contracts/enterprise_factory.ts +++ b/apps/enterprise/src/types/contracts/enterprise_factory.ts @@ -36,16 +36,6 @@ export module enterprise_factory { export type ExecuteMsg = { create_dao: CreateDaoMsg; }; - export type ProposalActionType = - | 'update_metadata' - | 'update_gov_config' - | 'update_council' - | 'update_asset_whitelist' - | 'update_nft_whitelist' - | 'request_funding_from_dao' - | 'upgrade_dao' - | 'execute_msgs' - | 'modify_multisig_membership'; export type Uint128 = string; export type Decimal = string; export type Duration = @@ -83,10 +73,6 @@ export module enterprise_factory { * assets that are allowed to show in DAO's treasury */ asset_whitelist?: AssetInfoBaseFor_Addr[] | null; - /** - * Optional council structure that can manage certain aspects of the DAO - */ - dao_council?: DaoCouncil | null; dao_gov_config: DaoGovConfig; dao_membership: CreateDaoMembershipMsg; dao_metadata: DaoMetadata; @@ -95,16 +81,6 @@ export module enterprise_factory { */ nft_whitelist?: Addr[] | null; } - export interface DaoCouncil { - /** - * Proposal action types allowed in proposals that are voted on by the council. Effectively defines what types of actions council can propose and vote on. If None, will default to a predefined set of actions. - */ - allowed_proposal_action_types?: ProposalActionType[] | null; - /** - * Addresses of council members. Each member has equal voting power. - */ - members: string[]; - } export interface DaoGovConfig { /** * Optional minimum amount of DAO's governance unit to be required to create a deposit. @@ -122,20 +98,12 @@ export module enterprise_factory { * Duration that has to pass for unstaked membership tokens to be claimable */ unlocking_period: Duration; - /** - * Portion of votes assigned to veto option from all the votes cast in the given proposal required to veto the proposal. If None, will default to the threshold set for all proposal options. - */ - veto_threshold?: Decimal | null; /** * Duration of proposals before they end, expressed in seconds */ vote_duration: number; } export interface NewTokenMembershipInfo { - /** - * Optional amount of tokens to be minted to the DAO's address - */ - initial_dao_balance?: Uint128 | null; initial_token_balances: Cw20Coin[]; token_decimals: number; token_marketing?: TokenMarketingInfo | null; @@ -177,7 +145,6 @@ export module enterprise_factory { membership_contract_addr: string; } export interface DaoMetadata { - description?: string | null; logo: Logo; name: string; socials: DaoSocialData; diff --git a/package.json b/package.json index 97e73c94..63fc7780 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,10 @@ ], "scripts": { "docker:enterprise-api": "docker build . -f apps/enterprise-api/Dockerfile -t payments/api", - "docker:enterprise-indexers": "docker build . -f indexers/enterprise/Dockerfile -t payments/indexers" + "docker:enterprise-indexers": "docker build . -f indexers/enterprise/Dockerfile -t payments/indexers", + "start": "react-app-rewired start", + "build": "react-app-rewired build", + "test": "react-app-rewired test" }, "dependencies": { "@types/node": "^16.11.56", @@ -24,7 +27,8 @@ "husky": "^8.0.1", "jest-watch-typeahead": "2.1.1", "json-schema-to-typescript": "^11.0.2", - "lorem-ipsum": "^2.0.8" + "lorem-ipsum": "^2.0.8", + "react-app-rewired": "^2.2.1" }, "packageManager": "yarn@3.2.3" } diff --git a/yarn.lock b/yarn.lock index c3199d19..4a96e057 100644 --- a/yarn.lock +++ b/yarn.lock @@ -9498,6 +9498,7 @@ __metadata: jest-watch-typeahead: 2.1.1 json-schema-to-typescript: ^11.0.2 lorem-ipsum: ^2.0.8 + react-app-rewired: ^2.2.1 terrariums: ^1.1.9 ts-node: ^10.9.1 typescript: ^4.8.2