From 192cfb27bbe038b76eeed35697c6ea273c2e18ca Mon Sep 17 00:00:00 2001 From: rossneilson Date: Tue, 10 Jan 2023 15:01:38 +0000 Subject: [PATCH 01/20] fix: Orbis context test --- public/assets/thumb.png | Bin 93559 -> 57715 bytes .../pages/AllDiscussions/AllDiscussions.tsx | 14 +- src/Modules/Guilds/pages/CreateDiscussion.tsx | 4 +- src/Modules/Guilds/pages/CreateProposal.tsx | 4 +- .../pages/Discussion/Discussion.styled.tsx | 8 + .../Guilds/pages/Discussion/Discussion.tsx | 25 +- .../Guilds/pages/Governance/Governance.tsx | 14 +- src/Modules/Social/Discussions.tsx | 7 +- src/components/Discussion/Discussion.tsx | 8 +- .../Discussion/DiscussionMasterPost.tsx | 6 +- src/components/Discussion/Post/Post.tsx | 6 +- .../Discussion/Post/PostActions.tsx | 106 +- src/components/Discussion/Postbox/Postbox.tsx | 6 +- src/components/Discussion/Thread/Thread.tsx | 17 +- .../DiscussionCard/DiscussionCard.test.tsx | 12 + .../DiscussionCard/DiscussionCard.tsx | 37 +- .../DiscussionCard.test.tsx.snap | 137 +++ src/components/Footer/Footer.tsx | 2 +- .../StakeTokensButton/StakeTokenButton.tsx | 2 +- src/configs/arbitrum/config.json | 435 +------- src/configs/arbitrumTestnet/config.json | 435 +------- src/configs/goerli/config.json | 23 +- src/configs/index.ts | 14 +- src/configs/mainnet/config.json | 957 +----------------- src/configs/xdai/config.json | 667 +----------- src/contexts/Guilds/orbis.tsx | 4 +- src/hooks/Guilds/ipfs/usePinataIPFS.ts | 1 + src/hooks/Guilds/useProposalMetadata.ts | 6 +- src/locales/en/translation.json | 6 +- src/provider/chains.ts | 5 +- src/richContracts.json | 65 ++ yarn.lock | 7 +- 32 files changed, 419 insertions(+), 2621 deletions(-) diff --git a/public/assets/thumb.png b/public/assets/thumb.png index 3d12934326352fa207cf8eff44b8b0cd95871a2f..647fb702074dbdafe89ce49d3ead6eb0a8eaebfe 100644 GIT binary patch literal 57715 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 NI~ir^5=oPQ{{x|9T4ewL literal 93559 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 diff --git a/src/Modules/Guilds/pages/AllDiscussions/AllDiscussions.tsx b/src/Modules/Guilds/pages/AllDiscussions/AllDiscussions.tsx index f392b8dbc..fc03de2db 100644 --- a/src/Modules/Guilds/pages/AllDiscussions/AllDiscussions.tsx +++ b/src/Modules/Guilds/pages/AllDiscussions/AllDiscussions.tsx @@ -6,23 +6,19 @@ import { UnstyledLink } from 'components/primitives/Links'; import { Button } from 'components/primitives/Button'; import { ProposalsList } from './AllDiscussions.styled'; import Discussions from 'Modules/Social/Discussions'; -import useIsProposalCreationAllowed from 'Modules/Guilds/Hooks/useIsProposalCreationAllowed'; const AllDiscussions = ({ guildId }) => { const { t } = useTranslation(); const { chainName } = useTypedParams(); - const isProposalCreationAllowed = useIsProposalCreationAllowed(); return ( <> - {isProposalCreationAllowed && ( - - - - )} + + + diff --git a/src/Modules/Guilds/pages/CreateDiscussion.tsx b/src/Modules/Guilds/pages/CreateDiscussion.tsx index 06550be18..c24d1f62c 100644 --- a/src/Modules/Guilds/pages/CreateDiscussion.tsx +++ b/src/Modules/Guilds/pages/CreateDiscussion.tsx @@ -25,10 +25,10 @@ import { postTemplate, } from 'components/Forum'; import { DiscussionContent } from 'components/Forum/types'; -import { OrbisContext } from 'contexts/Guilds/orbis'; +import { useOrbisContext } from 'contexts/Guilds/orbis'; const CreateDiscussionPage: React.FC = () => { - const { orbis } = useContext(OrbisContext); + const { orbis } = useOrbisContext(); const { guildId, chainName: chain } = useTypedParams(); const { isLoading: isGuildAvailabilityLoading } = useContext( diff --git a/src/Modules/Guilds/pages/CreateProposal.tsx b/src/Modules/Guilds/pages/CreateProposal.tsx index c21559084..5d833d9e4 100644 --- a/src/Modules/Guilds/pages/CreateProposal.tsx +++ b/src/Modules/Guilds/pages/CreateProposal.tsx @@ -45,7 +45,7 @@ import { createPost, postTemplate, } from 'components/Forum'; -import { OrbisContext } from 'contexts/Guilds/orbis'; +import { useOrbisContext } from 'contexts/Guilds/orbis'; import { DiscussionContent } from 'components/Forum/types'; export const EMPTY_CALL: Call = { @@ -63,7 +63,7 @@ const CreateProposalPage: React.FC = () => { const { isLoading: isGuildAvailabilityLoading } = useContext( GuildAvailabilityContext ); - const { orbis } = useContext(OrbisContext); + const { orbis } = useOrbisContext(); const navigate = useNavigate(); const { t } = useTranslation(); diff --git a/src/Modules/Guilds/pages/Discussion/Discussion.styled.tsx b/src/Modules/Guilds/pages/Discussion/Discussion.styled.tsx index a22e130de..0d0d8fca3 100644 --- a/src/Modules/Guilds/pages/Discussion/Discussion.styled.tsx +++ b/src/Modules/Guilds/pages/Discussion/Discussion.styled.tsx @@ -49,3 +49,11 @@ export const HeaderTopRow = styled(Box)` align-items: center; margin-bottom: 1rem; `; + +export const ActionsGroup = styled(Box)` + margin-top: 1rem; + display: flex; + flex-direction: row; + gap: 1rem; + margin: 1rem; +`; diff --git a/src/Modules/Guilds/pages/Discussion/Discussion.tsx b/src/Modules/Guilds/pages/Discussion/Discussion.tsx index 87dec4c09..a3844cd5f 100644 --- a/src/Modules/Guilds/pages/Discussion/Discussion.tsx +++ b/src/Modules/Guilds/pages/Discussion/Discussion.tsx @@ -1,4 +1,4 @@ -import React, { useContext, useEffect, useState } from 'react'; +import React, { useEffect, useState } from 'react'; import AddressButton from 'components/AddressButton/AddressButton'; import { ProposalDescription } from 'components/ProposalDescription'; import { UnstyledLink } from 'components/primitives/Links'; @@ -8,6 +8,7 @@ import { FaChevronLeft } from 'react-icons/fa'; import { useGuildConfig } from 'Modules/Guilds/Hooks/useGuildConfig'; import { IOrbisPost } from 'types/types.orbis'; import { + ActionsGroup, HeaderTopRow, PageContainer, PageContent, @@ -20,8 +21,9 @@ import { SidebarCard, SidebarCardHeaderSpaced } from 'components/SidebarCard'; import { Header as CardHeader } from 'components/Card'; import { Discussion } from 'components/Discussion'; import useDiscussionContext from 'Modules/Guilds/Hooks/useDiscussionContext'; -import { OrbisContext } from 'contexts/Guilds/orbis'; +import { useOrbisContext } from 'contexts/Guilds/orbis'; import { StyledButton } from 'Modules/Guilds/styles'; +import PostActions from 'components/Discussion/Post/PostActions'; const DiscussionPage: React.FC = () => { const { t } = useTranslation(); @@ -30,7 +32,7 @@ const DiscussionPage: React.FC = () => { const [op, setOp] = useState(); const { data: guildConfig } = useGuildConfig(guildId); - const { orbis } = useContext(OrbisContext); + const { orbis } = useOrbisContext(); const { context } = useDiscussionContext( `${guildId}-${discussionId}-discussions` ); @@ -45,6 +47,15 @@ const DiscussionPage: React.FC = () => { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); + const handleDelete = () => { + const confirmed = window.confirm( + `${t('deletionMessage1')}'\r\n${t('deletionMessage2')}` + ); + if (confirmed) { + orbis.deletePost(discussionId); + } + }; + return ( @@ -82,6 +93,14 @@ const DiscussionPage: React.FC = () => { error={null} /> + + + + diff --git a/src/Modules/Guilds/pages/Governance/Governance.tsx b/src/Modules/Guilds/pages/Governance/Governance.tsx index 21182e11c..cf6be2694 100644 --- a/src/Modules/Guilds/pages/Governance/Governance.tsx +++ b/src/Modules/Guilds/pages/Governance/Governance.tsx @@ -16,7 +16,6 @@ import { Button } from 'components/primitives/Button'; import { ProposalsList, StyledHeading, StyledLink } from './Governance.styled'; import { ProposalState } from 'types/types.guilds.d'; import Discussions from 'Modules/Social/Discussions'; -import useIsProposalCreationAllowed from 'Modules/Guilds/Hooks/useIsProposalCreationAllowed'; const Governance = ({ guildId }) => { const { isLoading } = useContext(GuildAvailabilityContext); @@ -24,7 +23,6 @@ const Governance = ({ guildId }) => { const { t } = useTranslation(); const { data: activeProposals } = useActiveProposalsNow(guildId); const { chainName } = useTypedParams(); - const isProposalCreationAllowed = useIsProposalCreationAllowed(); /* Since filters are a global state, we need to reset all of them @@ -88,13 +86,11 @@ const Governance = ({ guildId }) => { icon={} placeholder={t('searchTitleEnsAddress')} /> - {isProposalCreationAllowed && ( - - - - )} + + + {t('proposals')} diff --git a/src/Modules/Social/Discussions.tsx b/src/Modules/Social/Discussions.tsx index aa8742112..4d42f867f 100644 --- a/src/Modules/Social/Discussions.tsx +++ b/src/Modules/Social/Discussions.tsx @@ -1,5 +1,4 @@ -import { useContext, useEffect, useMemo, useState } from 'react'; -// import { Orbis } from '@orbisclub/orbis-sdk'; +import { useEffect, useMemo, useState } from 'react'; import { useTranslation } from 'react-i18next'; import { Virtuoso } from 'react-virtuoso'; import { DiscussionCard } from 'components/DiscussionCard'; @@ -11,10 +10,10 @@ import { ErrorLabel } from 'components/primitives/Forms/ErrorLabel'; import { Button } from 'components/primitives/Button'; import { DISCUSSIONS_TO_SHOW, REFRESH_DISCUSSIONS_INTERVAL } from './constants'; import { Box } from 'components/primitives/Layout'; -import { OrbisContext } from 'contexts/Guilds/orbis'; +import { useOrbisContext } from 'contexts/Guilds/orbis'; const Discussions = () => { - const { orbis } = useContext(OrbisContext); + const { orbis } = useOrbisContext(); const [discussions, setDiscussions] = useState([]); const [error, setError] = useState(null); diff --git a/src/components/Discussion/Discussion.tsx b/src/components/Discussion/Discussion.tsx index fd829503c..1dcd8a06a 100644 --- a/src/components/Discussion/Discussion.tsx +++ b/src/components/Discussion/Discussion.tsx @@ -1,7 +1,7 @@ -import { useState, useEffect, useContext } from 'react'; +import { useState, useEffect } from 'react'; import { useTranslation } from 'react-i18next'; import { VscCommentDiscussion } from 'react-icons/vsc'; -import { OrbisContext } from 'contexts/Guilds/orbis'; +import { useOrbisContext } from 'contexts/Guilds/orbis'; import { useInterval } from 'utils'; import { Postbox } from './Postbox'; @@ -28,7 +28,7 @@ function Discussion({ algorithm?: keyof typeof IOrbisGetPostsAlgorithm; }) { const { t } = useTranslation(); - const { orbis } = useContext(OrbisContext); + const { orbis } = useOrbisContext(); const [posts, setPosts] = useState([]); const [page, setPage] = useState(0); const [isFetching, setIsFetching] = useState(false); @@ -81,7 +81,7 @@ function Discussion({ const handleDeletion = async (post: IOrbisPost) => { const confirmed = window.confirm( - 'Are you sure you want to delete this post?\r\nIf you ask for deletion your post might be removed from the Ceramic nodes hosting it.' + `${t('deletionMessage1')}'\r\n${t('deletionMessage2')}` ); if (confirmed) { const res = await orbis.deletePost(post.stream_id); diff --git a/src/components/Discussion/DiscussionMasterPost.tsx b/src/components/Discussion/DiscussionMasterPost.tsx index bb8e94890..950d10786 100644 --- a/src/components/Discussion/DiscussionMasterPost.tsx +++ b/src/components/Discussion/DiscussionMasterPost.tsx @@ -1,12 +1,12 @@ -import { useState, useRef, useEffect, useContext } from 'react'; -import { OrbisContext } from 'contexts/Guilds/orbis'; +import { useState, useRef, useEffect } from 'react'; +import { useOrbisContext } from 'contexts/Guilds/orbis'; import { DiscussionMasterPost } from './Discussion.styled'; import { Post } from './Post'; import { Thread } from './Thread'; import { IOrbisPost } from 'types/types.orbis'; const MasterPost = ({ post, onDeletion }) => { - const { orbis } = useContext(OrbisContext); + const { orbis } = useOrbisContext(); const threadPostbox = useRef(null); const discussionMasterPost = useRef(null); diff --git a/src/components/Discussion/Post/Post.tsx b/src/components/Discussion/Post/Post.tsx index 36e830996..05a928212 100644 --- a/src/components/Discussion/Post/Post.tsx +++ b/src/components/Discussion/Post/Post.tsx @@ -1,7 +1,7 @@ -import { useState, useContext, useEffect } from 'react'; +import { useState, useEffect } from 'react'; import moment from 'moment'; import { IOrbisPost } from 'types/types.orbis'; -import { OrbisContext } from 'contexts/Guilds/orbis'; +import { useOrbisContext } from 'contexts/Guilds/orbis'; import { getUsername, getBadgeContent, formatMessage } from 'utils/orbis'; import { Avatar } from 'components/Avatar'; import { @@ -37,7 +37,7 @@ const Post = ({ onDeletion: () => void; }) => { const { t } = useTranslation(); - const { orbis } = useContext(OrbisContext); + const { orbis } = useOrbisContext(); const [postClone, setPostClone] = useState(null); const [isEditing, setIsEditing] = useState(false); diff --git a/src/components/Discussion/Post/PostActions.tsx b/src/components/Discussion/Post/PostActions.tsx index 4a00cf241..cf5f53020 100644 --- a/src/components/Discussion/Post/PostActions.tsx +++ b/src/components/Discussion/Post/PostActions.tsx @@ -1,11 +1,6 @@ -import { useState, useContext, useRef, useEffect } from 'react'; -import { - BsEmojiLaughing, - BsEmojiLaughingFill, - BsHandThumbsDown, - BsHandThumbsDownFill, -} from 'react-icons/bs'; -import { OrbisContext } from 'contexts/Guilds/orbis'; +import { useState, useRef, useEffect } from 'react'; +import { BsHandThumbsDown, BsHandThumbsDownFill } from 'react-icons/bs'; +import { useOrbisContext } from 'contexts/Guilds/orbis'; import { IoArrowUndoOutline, IoChatboxOutline, @@ -25,6 +20,9 @@ import { useTranslation } from 'react-i18next'; import { useAccount } from 'wagmi'; import { isReadOnly } from 'provider/wallets'; import { IOrbisPost } from 'types/types.orbis'; +import { FaLaughSquint, FaRegLaughSquint } from 'react-icons/fa'; +import { moderators } from 'configs'; +import { ImHammer2 } from 'react-icons/im'; const PostActions = ({ post, @@ -36,14 +34,14 @@ const PostActions = ({ }: { post: IOrbisPost; showThreadButton?: boolean; - toggleThread: () => void; - toggleReply: () => void; - onClickEdit: () => void; - onClickDelete: () => void; + toggleThread?: () => void; + toggleReply?: () => void; + onClickEdit?: () => void; + onClickDelete?: () => void; }) => { const { t } = useTranslation(); - const { orbis, profile, checkOrbisConnection } = useContext(OrbisContext); - const { isConnected, connector } = useAccount(); + const { orbis, profile, checkOrbisConnection } = useOrbisContext(); + const { isConnected, connector, address } = useAccount(); const [reacted, setReacted] = useState(null); const [likes, setLikes] = useState(0); @@ -94,6 +92,15 @@ const PostActions = ({ } }; + const handleModeratorRemove = () => { + const confirmed = window.confirm( + `${t('removalMessage1')}'\r\n${t('removalMessage2')}` + ); + if (confirmed) { + react('downvote'); + } + }; + useEffect(() => { const getReaction = async () => { const { data } = await orbis.getReaction(post?.stream_id, profile?.did); @@ -111,13 +118,15 @@ const PostActions = ({ return ( <> {/* Reply to post button */} - - - + {toggleReply && ( + + + + )} {/* Toggle Thread */} {showThreadButton && ( @@ -153,9 +162,9 @@ const PostActions = ({ disabled={isConnected && isReadOnly(connector)} > {reacted === 'haha' ? ( - + ) : ( - + )} {haha} @@ -165,7 +174,9 @@ const PostActions = ({ title={t('postActions.downvote')} active={reacted === 'downvote'} onClick={() => react('downvote')} - disabled={isConnected && isReadOnly(connector)} + disabled={ + (isConnected && isReadOnly(connector)) || moderators.includes(address) + } > {reacted === 'downvote' ? ( @@ -174,6 +185,15 @@ const PostActions = ({ )} {downvotes} + {moderators.includes(address) && ( + handleModeratorRemove()} + > + + + )} {post?.creator_details?.did === profile?.did && ( @@ -182,23 +202,27 @@ const PostActions = ({ {showPopover && ( - { - onClickEdit(); - setShowPopover(false); - }} - > - {t('postOptions.edit')} - - { - onClickDelete(); - setShowPopover(false); - }} - > - {t('postOptions.delete')} - + {onClickEdit && ( + { + onClickEdit(); + setShowPopover(false); + }} + > + {t('postOptions.edit')} + + )} + {onClickDelete && ( + { + onClickDelete(); + setShowPopover(false); + }} + > + {t('postOptions.delete')} + + )} )} diff --git a/src/components/Discussion/Postbox/Postbox.tsx b/src/components/Discussion/Postbox/Postbox.tsx index bad858090..b9112171d 100644 --- a/src/components/Discussion/Postbox/Postbox.tsx +++ b/src/components/Discussion/Postbox/Postbox.tsx @@ -1,11 +1,11 @@ -import { useState, useRef, useContext, useEffect, KeyboardEvent } from 'react'; +import { useState, useRef, useEffect, KeyboardEvent } from 'react'; import { debounce } from 'lodash'; import { IOrbisPost, IOrbisProfile, IOrbisPostMention, } from 'types/types.orbis'; -import { OrbisContext } from 'contexts/Guilds/orbis'; +import { useOrbisContext } from 'contexts/Guilds/orbis'; import { PostboxWrapper, PostboxInput, @@ -52,7 +52,7 @@ const Postbox = ({ }) => { const { t } = useTranslation(); const { orbis, profile, connectOrbis, checkOrbisConnection } = - useContext(OrbisContext); + useOrbisContext(); const { isConnected, connector } = useAccount(); const postboxArea = useRef(null); diff --git a/src/components/Discussion/Thread/Thread.tsx b/src/components/Discussion/Thread/Thread.tsx index d85f79e04..af27f4d30 100644 --- a/src/components/Discussion/Thread/Thread.tsx +++ b/src/components/Discussion/Thread/Thread.tsx @@ -1,17 +1,11 @@ -import { - useState, - useMemo, - useRef, - useEffect, - useContext, - LegacyRef, -} from 'react'; -import { OrbisContext } from 'contexts/Guilds/orbis'; +import { useState, useMemo, useRef, useEffect, LegacyRef } from 'react'; +import { useOrbisContext } from 'contexts/Guilds/orbis'; import { useInterval } from 'utils'; import { MasterGroup, MasterGroupPostbox, ThreadGroup } from './Thread.styled'; import { Post } from '../Post'; import { Postbox } from '../Postbox'; import { IOrbisPost } from 'types/types.orbis'; +import { useTranslation } from 'react-i18next'; const Group = ({ items, @@ -69,7 +63,8 @@ const Thread = ({ onNewPost: (el: HTMLElement) => void; onThreadUpdated: (posts: IOrbisPost[]) => void; }) => { - const { orbis } = useContext(OrbisContext); + const { orbis } = useOrbisContext(); + const { t } = useTranslation(); const mainGroup = useRef(null); @@ -141,7 +136,7 @@ const Thread = ({ const handleDeletion = async (post: IOrbisPost) => { const confirmed = window.confirm( - 'Are you sure you want to delete this post?\r\nIf you ask for deletion your post might be removed from the Ceramic nodes hosting it.' + `${t('deletionMessage1')}'\r\n${t('deletionMessage2')}` ); if (confirmed) { const res = await orbis.deletePost(post.stream_id); diff --git a/src/components/DiscussionCard/DiscussionCard.test.tsx b/src/components/DiscussionCard/DiscussionCard.test.tsx index e938c047c..1dc7fc6da 100644 --- a/src/components/DiscussionCard/DiscussionCard.test.tsx +++ b/src/components/DiscussionCard/DiscussionCard.test.tsx @@ -10,6 +10,18 @@ jest.mock('hooks/Guilds/ens/useENSAvatar', () => ({ }), })); +jest.mock('contexts/Guilds/orbis', () => ({ + useOrbisContext: () => ({ + orbis: { + getPosts: () => ({ + data: [1, 2, 3], + }), + }, + }), +})); + +jest.mock('@orbisclub/orbis-sdk', () => {}); + jest.mock('wagmi', () => ({ useNetwork: () => ({ chain: { id: 1 } }), chain: { diff --git a/src/components/DiscussionCard/DiscussionCard.tsx b/src/components/DiscussionCard/DiscussionCard.tsx index 8ae436eb5..99fc4600e 100644 --- a/src/components/DiscussionCard/DiscussionCard.tsx +++ b/src/components/DiscussionCard/DiscussionCard.tsx @@ -5,14 +5,32 @@ import { CardTitle, MainWrapper, FooterElement } from './DiscussionCard.styled'; import useENSAvatar from 'hooks/Guilds/ens/useENSAvatar'; import { DiscussionCardProps } from './types'; import { useTypedParams } from 'Modules/Guilds/Hooks/useTypedParams'; +import { MdReply } from 'react-icons/md'; +import { useEffect, useState } from 'react'; +import { useOrbisContext } from 'contexts/Guilds/orbis'; +import { BsHandThumbsDown } from 'react-icons/bs'; +import { IoHeartOutline } from 'react-icons/io5'; +import { Avatar } from 'components/Avatar'; +import { FaRegLaughSquint } from 'react-icons/fa'; export const DiscussionCard: React.FC = ({ discussion, }) => { - console.log({ discussion }); const { guildId, chainName } = useTypedParams(); + const { orbis } = useOrbisContext(); const creatorAddress = discussion.creator_details.metadata?.address; const { ensName } = useENSAvatar(creatorAddress, 1); + const [replyCount, setReplyCount] = useState(0); + + useEffect(() => { + const fetchData = async () => { + let { data } = await orbis.getPosts({ + context: `DAVI-${guildId}-${discussion.stream_id}-discussions`, + }); + setReplyCount(data?.length); + }; + fetchData(); + }, [discussion, guildId, orbis]); return ( = ({ {discussion.content?.title} + {ensName || shortenAddress(creatorAddress)} + + {discussion?.count_likes} + + + {discussion?.count_haha} + + + {discussion?.count_downvotes} + + + {replyCount} + diff --git a/src/components/DiscussionCard/__snapshots__/DiscussionCard.test.tsx.snap b/src/components/DiscussionCard/__snapshots__/DiscussionCard.test.tsx.snap index f3edf4096..f293093c1 100644 --- a/src/components/DiscussionCard/__snapshots__/DiscussionCard.test.tsx.snap +++ b/src/components/DiscussionCard/__snapshots__/DiscussionCard.test.tsx.snap @@ -134,8 +134,145 @@ exports[`DiscussionCard should render with full parameters 1`] = `

+
+ + + + + + +
test.eth
+
+ + + + + 7 +
+
+ + + + + 0 +
+
+ + + + + 0 +
+
+ + + + + + 0 +
diff --git a/src/components/Footer/Footer.tsx b/src/components/Footer/Footer.tsx index 5172f899b..037e02f31 100644 --- a/src/components/Footer/Footer.tsx +++ b/src/components/Footer/Footer.tsx @@ -21,7 +21,7 @@ const Footer = () => { )} diff --git a/src/components/StakeTokensModal/components/StakeTokensButton/StakeTokenButton.tsx b/src/components/StakeTokensModal/components/StakeTokensButton/StakeTokenButton.tsx index 1cb45918d..ae87a31f2 100644 --- a/src/components/StakeTokensModal/components/StakeTokensButton/StakeTokenButton.tsx +++ b/src/components/StakeTokensModal/components/StakeTokensButton/StakeTokenButton.tsx @@ -74,7 +74,7 @@ const StakeTokensButton = ({ ) ) : ( - navigate('create-proposal')}> + navigate('create')}> {t('mintRep')} )} diff --git a/src/configs/arbitrum/config.json b/src/configs/arbitrum/config.json index 9598cbc5c..0fb077d0f 100644 --- a/src/configs/arbitrum/config.json +++ b/src/configs/arbitrum/config.json @@ -1,441 +1,8 @@ { - "cache": { - "fromBlock": 338923, - "ipfsHash": "QmRvp9A9FUVzoYdyDd7mbvz3x6oJSwRqPDcH7JFiNKFmRN", - "toBlock": "10026660" - }, "contracts": { - "avatar": "0x2B240b523f69b9aF3adb1C5924F6dB849683A394", - "controller": "0xdB0015Fd30309D0AcB7184DD7F9Db9C46ae85674", - "permissionRegistry": "0x4f42BA46fD4d194CA63C40496E78f939EdC99e8C", - "reputation": "0x7552Bdc956947E8caa340B4E76E6eFE40764Beeb", - "token": "0xC3Ae0333F0F34aa734D5493276223d95B8F9Cb37", "utils": { - "multicall": "0x9645D0CEC58F0D28Be9660b9a4D464AB193817B3" - }, - "votingMachines": { - "0x02F93D46C2B56777e9C82CF40917979375C2c711": { - "token": "0xC3Ae0333F0F34aa734D5493276223d95B8F9Cb37", - "type": "DXDVotingMachine" - } + "guildRegistry": "" } }, - "proposalTemplates": [ - { - "description": "# Background\n \n - If this is your first contributor proposal, state any context for making the proposal, including:\n - What position you will be filling – i.e. developer, marketing, governance, etc.\n - Who you have been in contact with regarding the position (add their DAOtalk usernames)\n - If you are a continuing contributor, state which products and areas you are working on / any other relevant background information\n # Timeframe\n \n - State the date range, typically 2 months (2.5 months for first-time workers)\n # Scope of Contribution\n \n - **Goals** :\n - State the products and /or strategy areas you will be working under. E.g. Omen and Governance. Include both short-term goals that you seek to accomplish during the working period and long-term goals.\n - **Responsibilities:**\n - List the specific deliverables you will be either completing and / or working on during the working period. Try to state which deliverables you intend to complete within the period and which are long-term or ongoing projects.\n \n # Reflection\n \n - If You Are A Returning Contributor, Write a Self-Reflection\n - State what you did well, what you did okay, and what you need to improve on\n # Compensation\n \n - Experience Level : 1-5\n - Time commitment : Percent (%) of time\n - [ETH/DAI AMT] : For 2 months of work at level [LEVEL], to be sent half on the first payment proposal and half on the second payment proposal\n - [DXD AMT] : Vested for 2 years with a 1 year cliff starting the [DATE WORK PERIOD STARTS]\n - [% AMT REP] : For 2 months of work , to be sent half on the first payment proposal and half on the second payment proposal\n # Work Experience\n \n - Prior DXdao work proposals (if applicable)\n - Past Work for DXdao\n - If a developer, Github links\n - If a non-tech worker, doc links or described deliverables\n - If new, past relevant work experience\n - Developers : Github profile link\n - Non-tech : suggested Linkedin / other references\n", - "name": "Contributor Proposal", - "title": "[NAME] Contributor Proposal [DATE - DATE]" - }, - { - "description": "# Timeframe\n \n - State the contributor proposal date range\n \n # Background\n \n - State the context for making the contributor payment proposal, including:\n - What position you will be filling – i.e. developer, marketing, governance, etc.\n - Proposed Scope of Contribution\n - Self-Reflection on Scope of Contribution\n - Include the URL to the original proposal forum post\n \n # Deliverables\n\n - Include information around deliverables that were completed during your worker period\n \n # Compensation\n\n - Experience Level : 1-5\n - Time commitment : Percent (%) of time\n - [ETH/DAI AMT] : For second half payment proposal\n - [DXD AMT] : Vested for 2 years with a 1 year cliff starting the [DATE WORK PERIOD STARTS]\n - [% AMT REP]: For 2 second half payment proposal\n \n # Work Experience\n \n - Prior DXdao work proposals (if applicable)\n - Past Work for DXdao\n - If a developer, Github links\n - If a non-tech worker, doc links or described\n - If new, past relevant work experience\n - Developers : Github profile link\n - Non-tech : suggested Linkedin / other references\n \n", - "name": "Payment Proposal", - "title": "[NAME] Payment Proposal [DATE - DATE]" - }, - { - "description": "## Description \n\n## Proposition \n\n## Action Plan", - "name": "Signal Proposal", - "title": "Signal Proposal for [DAO_ACTION]" - }, - { - "calls": [ - { - "functionName": "approve(address,uint256)", - "params": [ - "0xecA7F78d59D16812948849663b26FE10E320f80C", - "" - ], - "to": "0xdE903E2712288A1dA82942DDdF2c20529565aC30" - }, - { - "functionName": "createDistribution(address[],address,uint256[],uint64,uint64,bool,uint256)", - "params": [ - "[0xdE903E2712288A1dA82942DDdF2c20529565aC30]", - "", - "[]", - "", - "", - "false", - "0" - ], - "to": "0xecA7F78d59D16812948849663b26FE10E320f80C" - } - ], - "description": "Simple description", - "name": "SWPR Farming Campaign", - "title": "[PAIR X/Y] Farming Campaign [DATE - DATE]]" - } - ], - "proposalTypes": [ - { - "id": "custom", - "title": "Custom" - } - ], - "recommendedCalls": [ - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Set vote refund to [PARAM_0] gas and [PARAM_1] max gas price", - "from": "0x2B240b523f69b9aF3adb1C5924F6dB849683A394", - "functionName": "setOrganizationRefund(uint256,uint256)", - "params": [ - { - "defaultValue": "", - "name": "_voteGas", - "type": "uint256" - }, - { - "defaultValue": "", - "name": "_maxGasPrice", - "type": "uint256" - } - ], - "to": "0x02F93D46C2B56777e9C82CF40917979375C2c711", - "toName": "DXD Voting Machine" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Set boosted required percentage for scheme [PARAM_0] to ([PARAM_2]/100) %", - "from": "0x2B240b523f69b9aF3adb1C5924F6dB849683A394", - "functionName": "setBoostedVoteRequiredPercentage(address,bytes32,uint256)", - "params": [ - { - "defaultValue": "", - "name": "_scheme", - "type": "address" - }, - { - "defaultValue": "", - "name": "_paramsHash", - "type": "bytes32" - }, - { - "defaultValue": "", - "name": "_boostedVotePeriodLimit", - "type": "uint256" - } - ], - "to": "0x5786e7a0A1aB6a4040a77fcbcD144E649A6d4939", - "toName": "DXD Voting Machine" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Set max seconds for execution in Registrar Wallet Scheme to [PARAM_0] seconds", - "from": "0x2B240b523f69b9aF3adb1C5924F6dB849683A394", - "functionName": "setMaxSecondsForExecution(uint256)", - "params": [ - { - "defaultValue": "", - "name": "_maxSecondsForExecution", - "type": "uint256" - } - ], - "to": "0x628eC805A9FB5B79D21867f5fda9DEFA3967aA71", - "toName": "RegistrarWalletScheme" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Set max seconds for execution in Master Wallet Scheme to [PARAM_0] seconds", - "from": "0x2B240b523f69b9aF3adb1C5924F6dB849683A394", - "functionName": "setMaxSecondsForExecution(uint256)", - "params": [ - { - "defaultValue": "", - "name": "_maxSecondsForExecution", - "type": "uint256" - } - ], - "to": "0xc0071bd6CD9ce77A7F5270A90664A88A1A664A8c", - "toName": "MasterWalletScheme" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Set max seconds for execution in Quick Wallet Scheme to [PARAM_0] seconds", - "from": "0x2B240b523f69b9aF3adb1C5924F6dB849683A394", - "functionName": "setMaxSecondsForExecution(uint256)", - "params": [ - { - "defaultValue": "", - "name": "_maxSecondsForExecution", - "type": "uint256" - } - ], - "to": "0x6Bb0c340d6Fb4Fb5731Bf6EeE0D12bb60cFEDb47", - "toName": "QuickWalletScheme" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Set max seconds for execution in Quick Wallet Scheme to [PARAM_0] seconds", - "from": "0x2B240b523f69b9aF3adb1C5924F6dB849683A394", - "functionName": "setMaxSecondsForExecution(uint256)", - "params": [ - { - "defaultValue": "", - "name": "_maxSecondsForExecution", - "type": "uint256" - } - ], - "to": "0x3172eDDa6ff8B2b2Fa7FeD40EE1fD92F1F4dd424", - "toName": "SWPRWalletScheme" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Set max seconds for execution in Quick Wallet Scheme to [PARAM_0] seconds", - "from": "0x2B240b523f69b9aF3adb1C5924F6dB849683A394", - "functionName": "setMaxSecondsForExecution(uint256)", - "params": [ - { - "defaultValue": "", - "name": "_maxSecondsForExecution", - "type": "uint256" - } - ], - "to": "0xcab5367De13B5409Ee85689465B4553C375FB20d", - "toName": "TestWalletScheme" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Transfer swpr pair [PARAM_0] ownership to [PARAM_1]", - "from": "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa", - "functionName": "transferPairOwnership(address,address)", - "params": [ - { - "defaultValue": "", - "name": "pair", - "type": "address" - }, - { - "defaultValue": "", - "name": "newOwner", - "type": "address" - } - ], - "to": "0x56F53CB6c0a80947C9Be239A62bc65fA20d4b41d", - "toName": "Swpr Fee Setter" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Set swpr protocol fee denominator to [PARAM_0]", - "from": "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa", - "functionName": "setProtocolFee(uint8)", - "params": [ - { - "defaultValue": "", - "name": "protocolFeeDenominator", - "type": "uint8" - } - ], - "to": "0x56F53CB6c0a80947C9Be239A62bc65fA20d4b41d", - "toName": "Swpr Fee Setter" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Set swpr fee for pair [PARAM_0] to [PARAM_1]", - "from": "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa", - "functionName": "setSwapFee(address,uint32)", - "params": [ - { - "defaultValue": "", - "name": "pair", - "type": "address" - }, - { - "defaultValue": "", - "name": "swapFee", - "type": "uint32" - } - ], - "to": "0x56F53CB6c0a80947C9Be239A62bc65fA20d4b41d", - "toName": "Swpr Fee Setter" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Take protocol fee from swpr pairs [PARAM_0]", - "from": "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa", - "functionName": "takeProtocolFee(address[])", - "params": [ - { - "defaultValue": "", - "name": "pairs", - "type": "address[]" - } - ], - "to": "0x1D7C7cb66fB2d75123351FD0d6779E8d7724a1ae", - "toName": "Swpr Fee Receiver" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Add liquidity with [PARAM_2] value of token [PARAM_0] and [PARAM_4] value of token [PARAM_1] to address [PARAM_6]", - "from": "0x3172eDDa6ff8B2b2Fa7FeD40EE1fD92F1F4dd424", - "functionName": "addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256)", - "params": [ - { - "defaultValue": "", - "name": "tokenA", - "type": "address" - }, - { - "defaultValue": "", - "name": "tokenB", - "type": "address" - }, - { - "defaultValue": "", - "name": "amountADesired", - "type": "uint256" - }, - { - "defaultValue": "", - "name": "amountBDesired", - "type": "uint256" - }, - { - "defaultValue": "", - "name": "amountAMin", - "type": "uint256" - }, - { - "defaultValue": "", - "name": "amountBMin", - "type": "uint256" - }, - { - "defaultValue": "", - "name": "to", - "type": "address" - }, - { - "defaultValue": "", - "name": "deadline", - "type": "uint256" - } - ], - "to": "0x530476d5583724A89c8841eB6Da76E7Af4C0F17E", - "toName": "Swpr Router" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Remove and send [PARAM_2] liquidity tokens from pool with tokens [PARAM_0] - [PARAM_1] to address [PARAM_5]", - "from": "0x3172eDDa6ff8B2b2Fa7FeD40EE1fD92F1F4dd424", - "functionName": "removeLiquidity(address,address,uint256,uint256,uint256,address,uint256)", - "params": [ - { - "defaultValue": "", - "name": "tokenA", - "type": "address" - }, - { - "defaultValue": "", - "name": "tokenB", - "type": "address" - }, - { - "defaultValue": "", - "name": "liquidity", - "type": "uint256" - }, - { - "defaultValue": "", - "name": "amountAMin", - "type": "uint256" - }, - { - "defaultValue": "", - "name": "amountBMin", - "type": "uint256" - }, - { - "defaultValue": "", - "name": "to", - "type": "address" - }, - { - "defaultValue": "", - "name": "deadline", - "type": "uint256" - } - ], - "to": "0x530476d5583724A89c8841eB6Da76E7Af4C0F17E", - "toName": "Swpr Router" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Create liquidity mining campaign on pair [PARAM_1] starting at [PARAM_3] and ending at [PARAM_4], with reward tokens [PARAM_0], reward amounts [PARAM_2]. Cap put at [PARAM_6] and locked status [PARAM_5]", - "from": "0x3172eDDa6ff8B2b2Fa7FeD40EE1fD92F1F4dd424", - "functionName": "createDistribution(address[],address,uint256[],uint64,uint64,bool,uint256)", - "params": [ - { - "defaultValue": "", - "name": "rewardTokensAddresses", - "type": "address[]" - }, - { - "defaultValue": "", - "name": "stakableTokenAddress", - "type": "address" - }, - { - "defaultValue": "", - "name": "rewardAmounts", - "type": "uint256[]" - }, - { - "defaultValue": "", - "name": "startingTimestamp", - "type": "uint64" - }, - { - "defaultValue": "", - "name": "endingTimestamp", - "type": "uint64" - }, - { - "defaultValue": "", - "name": "locked", - "type": "bool" - }, - { - "defaultValue": "", - "name": "stakingCap", - "type": "uint256" - } - ], - "to": "0xecA7F78d59D16812948849663b26FE10E320f80C", - "toName": "Swapr liquidity mining campaigns factory" - } - ], - "tokens": [ - { - "address": "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1", - "decimals": 18, - "fetchPrice": true, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e/logo.png", - "name": "Wrapped Ether", - "symbol": "WETH" - }, - { - "address": "0xC3Ae0333F0F34aa734D5493276223d95B8F9Cb37", - "decimals": 18, - "fetchPrice": true, - "logoURI": "https://assets.coingecko.com/coins/images/11148/thumb/dxdao.png?1607999331", - "name": "DXdao", - "symbol": "DXD" - }, - { - "address": "0xdE903E2712288A1dA82942DDdF2c20529565aC30", - "decimals": 18, - "fetchPrice": true, - "logoURI": "https://ipfs.io/ipfs/QmWF6nPb4y2DehfGRzKGaekXQzShSQ11uzMNmxsLJQxBUQ", - "name": "SWPR Token", - "symbol": "SWPR" - }, - { - "address": "0x9f20de1fc9b161b34089cbEAE888168B44b03461", - "decimals": 18, - "fetchPrice": true, - "logoURI": "https://assets.coingecko.com/coins/images/18594/small/NcAIaWlc_400x400_%281%29.jpg", - "name": "ARBIS", - "symbol": "ARBIS" - } - ], "version": 1 } \ No newline at end of file diff --git a/src/configs/arbitrumTestnet/config.json b/src/configs/arbitrumTestnet/config.json index bc74ad513..0fb077d0f 100644 --- a/src/configs/arbitrumTestnet/config.json +++ b/src/configs/arbitrumTestnet/config.json @@ -1,441 +1,8 @@ { - "cache": { - "fromBlock": 3995726, - "ipfsHash": "QmXavj3tchxsqpXCPB4g18NikoyGd2c22syDF4Sijn3f8n", - "toBlock": "11296050" - }, "contracts": { - "avatar": "0x6370B3Ba7D9bAd94b35dC9073540E562bDe5Fdc3", - "controller": "0x91509d26D0218D15C19eB341a25B57f302792765", - "permissionRegistry": "0x13f3A639f4c83723675672B2C7084413eea01D48", - "reputation": "0x12cCaa029F525fB4262e40D1a6dDdf2817af3fE9", - "token": "0x5d47100B0854525685907D5D773b92c22c0c745e", "utils": { - "dxDaoNFT": "0xDC50FE5862D5541C6D0b9B07f15Fe016Cdacb431", - "dxdVestingFactory": "0xA5431A66874627948d4Ab68E033177f8982C3A2C", - "multicall": "0xac380E8434Db942B5902956E8Dc7cD9d6A66bc74" - }, - "votingMachines": { - "0x5786e7a0A1aB6a4040a77fcbcD144E649A6d4939": { - "token": "0x5d47100B0854525685907D5D773b92c22c0c745e", - "type": "DXDVotingMachine" - } + "guildRegistry": "" } }, - "proposalTemplates": [ - { - "description": "# Background\n \n - If this is your first contributor proposal, state any context for making the proposal, including:\n - What position you will be filling – i.e. developer, marketing, governance, etc.\n - Who you have been in contact with regarding the position (add their DAOtalk usernames)\n - If you are a continuing contributor, state which products and areas you are working on / any other relevant background information\n # Timeframe\n \n - State the date range, typically 2 months (2.5 months for first-time workers)\n # Scope of Contribution\n \n - **Goals** :\n - State the products and /or strategy areas you will be working under. E.g. Omen and Governance. Include both short-term goals that you seek to accomplish during the working period and long-term goals.\n - **Responsibilities:**\n - List the specific deliverables you will be either completing and / or working on during the working period. Try to state which deliverables you intend to complete within the period and which are long-term or ongoing projects.\n \n # Reflection\n \n - If You Are A Returning Contributor, Write a Self-Reflection\n - State what you did well, what you did okay, and what you need to improve on\n # Compensation\n \n - Experience Level : 1-5\n - Time commitment : Percent (%) of time\n - [ETH/DAI AMT] : For 2 months of work at level [LEVEL], to be sent half on the first payment proposal and half on the second payment proposal\n - [DXD AMT] : Vested for 2 years with a 1 year cliff starting the [DATE WORK PERIOD STARTS]\n - [% AMT REP] : For 2 months of work , to be sent half on the first payment proposal and half on the second payment proposal\n # Work Experience\n \n - Prior DXdao work proposals (if applicable)\n - Past Work for DXdao\n - If a developer, Github links\n - If a non-tech worker, doc links or described deliverables\n - If new, past relevant work experience\n - Developers : Github profile link\n - Non-tech : suggested Linkedin / other references\n", - "name": "Contributor Proposal", - "title": "[NAME] Contributor Proposal [DATE - DATE]" - }, - { - "description": "# Timeframe\n \n - State the contributor proposal date range\n \n # Background\n \n - State the context for making the contributor payment proposal, including:\n - What position you will be filling – i.e. developer, marketing, governance, etc.\n - Proposed Scope of Contribution\n - Self-Reflection on Scope of Contribution\n - Include the URL to the original proposal forum post\n \n # Deliverables\n\n - Include information around deliverables that were completed during your worker period\n \n # Compensation\n\n - Experience Level : 1-5\n - Time commitment : Percent (%) of time\n - [ETH/DAI AMT] : For second half payment proposal\n - [DXD AMT] : Vested for 2 years with a 1 year cliff starting the [DATE WORK PERIOD STARTS]\n - [% AMT REP]: For 2 second half payment proposal\n \n # Work Experience\n \n - Prior DXdao work proposals (if applicable)\n - Past Work for DXdao\n - If a developer, Github links\n - If a non-tech worker, doc links or described\n - If new, past relevant work experience\n - Developers : Github profile link\n - Non-tech : suggested Linkedin / other references\n \n", - "name": "Payment Proposal", - "title": "[NAME] Payment Proposal [DATE - DATE]" - }, - { - "description": "## Description \n\n## Proposition \n\n## Action Plan", - "name": "Signal Proposal", - "title": "Signal Proposal for [DAO_ACTION]" - }, - { - "calls": [ - { - "functionName": "approve(address,uint256)", - "params": [ - "0xecA7F78d59D16812948849663b26FE10E320f80C", - "" - ], - "to": "0xdE903E2712288A1dA82942DDdF2c20529565aC30" - }, - { - "functionName": "createDistribution(address[],address,uint256[],uint64,uint64,bool,uint256)", - "params": [ - "[0xdE903E2712288A1dA82942DDdF2c20529565aC30]", - "", - "[]", - "", - "", - "false", - "0" - ], - "to": "0xecA7F78d59D16812948849663b26FE10E320f80C" - } - ], - "description": "Simple description", - "name": "SWPR Farming Campaign", - "title": "[PAIR X/Y] Farming Campaign [DATE - DATE]]" - } - ], - "proposalTypes": [ - { - "id": "custom", - "title": "Custom" - } - ], - "recommendedCalls": [ - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Set vote refund to [PARAM_0] gas and [PARAM_1] max gas price", - "from": "0x6370B3Ba7D9bAd94b35dC9073540E562bDe5Fdc3", - "functionName": "setOrganizationRefund(uint256,uint256)", - "params": [ - { - "defaultValue": "", - "name": "_voteGas", - "type": "uint256" - }, - { - "defaultValue": "", - "name": "_maxGasPrice", - "type": "uint256" - } - ], - "to": "0x5786e7a0A1aB6a4040a77fcbcD144E649A6d4939", - "toName": "DXD Voting Machine" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Set boosted required percentage for scheme [PARAM_0] to ([PARAM_2]/100) %", - "from": "0x6370B3Ba7D9bAd94b35dC9073540E562bDe5Fdc3", - "functionName": "setBoostedVoteRequiredPercentage(address,bytes32,uint256)", - "params": [ - { - "defaultValue": "", - "name": "_scheme", - "type": "address" - }, - { - "defaultValue": "", - "name": "_paramsHash", - "type": "bytes32" - }, - { - "defaultValue": "", - "name": "_boostedVotePeriodLimit", - "type": "uint256" - } - ], - "to": "0x5786e7a0A1aB6a4040a77fcbcD144E649A6d4939", - "toName": "DXD Voting Machine" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Set max seconds for execution in Registrar Wallet Scheme to [PARAM_0] seconds", - "from": "0x6370B3Ba7D9bAd94b35dC9073540E562bDe5Fdc3", - "functionName": "setMaxSecondsForExecution(uint256)", - "params": [ - { - "defaultValue": "", - "name": "_maxSecondsForExecution", - "type": "uint256" - } - ], - "to": "0x3d432D43805AF80733CF492b6C42DB0ff3eB185e", - "toName": "RegistrarWalletScheme" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Set max seconds for execution in Master Wallet Scheme to [PARAM_0] seconds", - "from": "0x6370B3Ba7D9bAd94b35dC9073540E562bDe5Fdc3", - "functionName": "setMaxSecondsForExecution(uint256)", - "params": [ - { - "defaultValue": "", - "name": "_maxSecondsForExecution", - "type": "uint256" - } - ], - "to": "0x39405F3f7F2c3E72c1B21544F2539fAD83F7dD4c", - "toName": "MasterWalletScheme" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Set max seconds for execution in Quick Wallet Scheme to [PARAM_0] seconds", - "from": "0x6370B3Ba7D9bAd94b35dC9073540E562bDe5Fdc3", - "functionName": "setMaxSecondsForExecution(uint256)", - "params": [ - { - "defaultValue": "", - "name": "_maxSecondsForExecution", - "type": "uint256" - } - ], - "to": "0x8a6428Ccb48FFEb8619cbc18a479feCA22d784d3", - "toName": "QuickWalletScheme" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Set max seconds for execution in Quick Wallet Scheme to [PARAM_0] seconds", - "from": "0x6370B3Ba7D9bAd94b35dC9073540E562bDe5Fdc3", - "functionName": "setMaxSecondsForExecution(uint256)", - "params": [ - { - "defaultValue": "", - "name": "_maxSecondsForExecution", - "type": "uint256" - } - ], - "to": "0xA28A7e5D8E4BE7175aCB817D5b89ED88bD1e30B5", - "toName": "SWPRWalletScheme" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Transfer swpr pair [PARAM_0] ownership to [PARAM_1]", - "from": "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa", - "functionName": "transferPairOwnership(address,address)", - "params": [ - { - "defaultValue": "", - "name": "pair", - "type": "address" - }, - { - "defaultValue": "", - "name": "newOwner", - "type": "address" - } - ], - "to": "0x876BE4A79d154d4B2edE7c593B2E048756049B26", - "toName": "Swpr Fee Setter" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Set swpr protocol fee denominator to [PARAM_0]", - "from": "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa", - "functionName": "setProtocolFee(uint8)", - "params": [ - { - "defaultValue": "", - "name": "protocolFeeDenominator", - "type": "uint8" - } - ], - "to": "0x876BE4A79d154d4B2edE7c593B2E048756049B26", - "toName": "Swpr Fee Setter" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Set swpr fee for pair [PARAM_0] to [PARAM_1]", - "from": "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa", - "functionName": "setSwapFee(address,uint32)", - "params": [ - { - "defaultValue": "", - "name": "pair", - "type": "address" - }, - { - "defaultValue": "", - "name": "swapFee", - "type": "uint32" - } - ], - "to": "0x876BE4A79d154d4B2edE7c593B2E048756049B26", - "toName": "Swpr Fee Setter" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Take protocol fee from swpr pairs [PARAM_0]", - "from": "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa", - "functionName": "takeProtocolFee(address[])", - "params": [ - { - "defaultValue": "", - "name": "pairs", - "type": "address[]" - } - ], - "to": "0xB01988E0039230B52256BB4Db4496a6C79092B4f", - "toName": "Swpr Fee Receiver" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Add liquidity with [PARAM_2] value of token [PARAM_0] and [PARAM_4] value of token [PARAM_1] to address [PARAM_6]", - "from": "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa", - "functionName": "addLiquidity(address,address,uint256,uint256,uint256,uint256,address,uint256)", - "params": [ - { - "defaultValue": "", - "name": "tokenA", - "type": "address" - }, - { - "defaultValue": "", - "name": "tokenB", - "type": "address" - }, - { - "defaultValue": "", - "name": "amountADesired", - "type": "uint256" - }, - { - "defaultValue": "", - "name": "amountBDesired", - "type": "uint256" - }, - { - "defaultValue": "", - "name": "amountAMin", - "type": "uint256" - }, - { - "defaultValue": "", - "name": "amountBMin", - "type": "uint256" - }, - { - "defaultValue": "", - "name": "to", - "type": "address" - }, - { - "defaultValue": "", - "name": "deadline", - "type": "uint256" - } - ], - "to": "0xb5a35165047fed7440D3a75909c0949bf1943696", - "toName": "Swpr Router" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Remove and send [PARAM_2] liquidity tokens from pool with tokens [PARAM_0] - [PARAM_1] to address [PARAM_5]", - "from": "0xaAaAaAaaAaAaAaaAaAAAAAAAAaaaAaAaAaaAaaAa", - "functionName": "removeLiquidity(address,address,uint256,uint256,uint256,address,uint256)", - "params": [ - { - "defaultValue": "", - "name": "tokenA", - "type": "address" - }, - { - "defaultValue": "", - "name": "tokenB", - "type": "address" - }, - { - "defaultValue": "", - "name": "liquidity", - "type": "uint256" - }, - { - "defaultValue": "", - "name": "amountAMin", - "type": "uint256" - }, - { - "defaultValue": "", - "name": "amountBMin", - "type": "uint256" - }, - { - "defaultValue": "", - "name": "to", - "type": "address" - }, - { - "defaultValue": "", - "name": "deadline", - "type": "uint256" - } - ], - "to": "0xb5a35165047fed7440D3a75909c0949bf1943696", - "toName": "Swpr Router" - }, - { - "asset": "0x0000000000000000000000000000000000000000", - "decodeText": "Create liquidity mining campaign on pair [PARAM_1] starting at [PARAM_3] and ending at [PARAM_4], with reward tokens [PARAM_0], reward amounts [PARAM_2]. Cap put at [PARAM_6] and locked status [PARAM_5]", - "from": "0xA28A7e5D8E4BE7175aCB817D5b89ED88bD1e30B5", - "functionName": "createDistribution(address[],address,uint256[],uint64,uint64,bool,uint256)", - "params": [ - { - "defaultValue": "", - "name": "rewardTokensAddresses", - "type": "address[]" - }, - { - "defaultValue": "", - "name": "stakableTokenAddress", - "type": "address" - }, - { - "defaultValue": "", - "name": "rewardAmounts", - "type": "uint256[]" - }, - { - "defaultValue": "", - "name": "startingTimestamp", - "type": "uint64" - }, - { - "defaultValue": "", - "name": "endingTimestamp", - "type": "uint64" - }, - { - "defaultValue": "", - "name": "locked", - "type": "bool" - }, - { - "defaultValue": "", - "name": "stakingCap", - "type": "uint256" - } - ], - "to": "0x41e657cAdE74f45b7E2F0F4a5AeE0239f2fB4E1F", - "toName": "Swapr liquidity mining campaigns factory" - } - ], - "tokens": [ - { - "address": "0xB47e6A5f8b33b3F17603C83a0535A9dcD7E32681", - "decimals": 18, - "fetchPrice": true, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e/logo.png", - "name": "Wrapped Ether", - "symbol": "WETH" - }, - { - "address": "0x5d47100B0854525685907D5D773b92c22c0c745e", - "decimals": 18, - "fetchPrice": true, - "logoURI": "https://assets.coingecko.com/coins/images/11148/thumb/dxdao.png?1607999331", - "name": "DXdao", - "symbol": "DXD" - }, - { - "address": "0x8f2072c2142D9fFDc785955E0Ce71561753D44Fb", - "decimals": 18, - "fetchPrice": true, - "logoURI": "https://ipfs.io/ipfs/QmWF6nPb4y2DehfGRzKGaekXQzShSQ11uzMNmxsLJQxBUQ", - "name": "SWPR Token", - "symbol": "SWPR" - }, - { - "address": "0x5c6e8F8B4f657b1aC81BFA1aF9145ed048bB1E48", - "decimals": 18, - "fetchPrice": true, - "name": "Weenus", - "symbol": "WEENUS" - }, - { - "address": "0xE76c8D027f54882ab1B0Ae8C193ac4Cb791A456a", - "decimals": 18, - "fetchPrice": true, - "name": "Xeenus", - "symbol": "XEENUS" - }, - { - "address": "0x409318c1a5b3Abd1058fe4b91402268A26b9b159", - "decimals": 8, - "fetchPrice": true, - "name": "Yeenus", - "symbol": "YEENUS" - } - ], "version": 1 } \ No newline at end of file diff --git a/src/configs/goerli/config.json b/src/configs/goerli/config.json index 13d6986ab..1d7d05c3c 100644 --- a/src/configs/goerli/config.json +++ b/src/configs/goerli/config.json @@ -1,29 +1,8 @@ { "contracts": { "utils": { - "dxDaoNFT": "0xF7A2f72E8f6aeb884905a1fE515c1BB5752D342f", - "dxdVestingFactory": "0xB5D42c8cA3B04479200E3782C41D99b46Cf8A6E1", - "guildRegistry": "0x304de4fd740e73db7f8a4fC11f41680d51dB1aF2", - "multicall": "0x1FDD273e0B7E0d921Bda044Ebf64811428A79f15" + "guildRegistry": "0x304de4fd740e73db7f8a4fC11f41680d51dB1aF2" } }, - "tokens": [ - { - "address": "0x2f9343cf18baacf57ac4a4e20188b9b00cfce3f1", - "name": "SWAPR", - "decimals": 18, - "symbol": "SWPR", - "fetchPrice": true, - "logoURI": "https://s2.coinmarketcap.com/static/img/coins/200x200/12368.png" - }, - { - "address": "0xB4FBF271143F4FBf7B91A5ded31805e42b2208d6", - "name": "Wrapped ETH", - "decimals": 18, - "symbol": "WETH", - "fetchPrice": true, - "logoURI": "https://assets.coingecko.com/coins/images/2518/thumb/weth.png?1547036627" - } - ], "version": 1 } \ No newline at end of file diff --git a/src/configs/index.ts b/src/configs/index.ts index ab7c4f463..0c34b7332 100644 --- a/src/configs/index.ts +++ b/src/configs/index.ts @@ -1,2 +1,12 @@ -export const RICH_CONTRACT_DATA_REGISTRY = 'QmeacC3QZgWaYYrd6m4b7dbBQVEZcgei5XFhxrq5czn5u3'; -export const SITE_ID = 'NYKJUYYQ' +export const RICH_CONTRACT_DATA_REGISTRY = + 'QmeacC3QZgWaYYrd6m4b7dbBQVEZcgei5XFhxrq5czn5u3'; +export const SITE_ID = 'NYKJUYYQ'; +export const moderators = [ + '0x0b17cf48420400e1D71F8231d4a8e43B3566BB5B', + '0x91aef3c3b9bab2c306548269ff9b6771f2b107d8', + '0x95a223299319022a842d0dfe4851c145a2f615b9', + '0x29e1a61fccd40408f489336993e798d14d57d77f', + '0x08eec580ad41e9994599bad7d2a74a9874a2852c', + '0x1861974f32eaCDCceD0F81b0f8eCcFeD58153a9D', +]; + diff --git a/src/configs/mainnet/config.json b/src/configs/mainnet/config.json index b95c4090a..940109bdd 100644 --- a/src/configs/mainnet/config.json +++ b/src/configs/mainnet/config.json @@ -1,963 +1,8 @@ { - "cache": { - "fromBlock": 7219912, - "ipfsHash": "QmSiUzqh2W8EvBJWJ5BUQbzBZiYwN5JsotrZ6RjEueMeJD", - "toBlock": "14831037" - }, "contracts": { - "avatar": "0x519b70055af55a007110b4ff99b0ea33071c720a", - "controller": "0x9f828ac3baa9003e8a4e0b24bcae7b027b6740b0", - "daostack": { - "0x08cC7BBa91b849156e9c44DEd51896B38400f55B": { - "contractToCall": "0x9f828ac3baa9003e8a4e0b24bcae7b027b6740b0", - "creationLogEncoding": [ - [ - { - "name": "_descriptionHash", - "type": "string" - }, - { - "name": "_reputationChange", - "type": "int256" - }, - { - "name": "_rewards", - "type": "uint256[5]" - }, - { - "name": "_externalToken", - "type": "address" - }, - { - "name": "_beneficiary", - "type": "address" - } - ] - ], - "name": "ContributionReward", - "newProposalTopics": [ - [ - "0xcbdcbf9aaeb1e9eff0f75d74e1c1e044bc87110164baec7d18d825b0450d97df", - "0x000000000000000000000000519b70055af55a007110b4ff99b0ea33071c720a" - ] - ], - "redeemer": "0x406bfD9cDb247432fEEA52edD218F2a4Bd238C9b", - "supported": true, - "type": "ContributionReward", - "voteParams": "0x399141801e9e265d79f1f1759dd67932980664ea28c2ba7e0e4dba8719e47118", - "votingMachine": "0x332B8C9734b4097dE50f302F7D9F273FFdB45B84" - }, - "0x0f4775722a72FA85230c63598e661eC52563Fb4E": { - "contractToCall": "0x0000000000000000000000000000000000000000", - "creationLogEncoding": [ - [ - { - "name": "_callsData", - "type": "bytes[]" - }, - { - "name": "_values", - "type": "uint256[]" - }, - { - "name": "_descriptionHash", - "type": "string" - }, - { - "name": "_contractsToCall", - "type": "address[]" - } - ] - ], - "name": "Multicall_3", - "newProposalTopics": [ - [ - "0xf5a0655bd7247f3a6fa97e71b57c61314566afb5aa8be8eea2c48f4d1b9bf190", - "0x000000000000000000000000519b70055af55a007110b4ff99b0ea33071c720a" - ] - ], - "supported": true, - "type": "GenericMulticall", - "voteParams": "0xe5e87e294b422b2aa711bd25a7e8ac59a06bbf723786560c53c50edce980f2fd", - "votingMachine": "0x332B8C9734b4097dE50f302F7D9F273FFdB45B84" - }, - "0x199719EE4d5DCF174B80b80afa1FE4a8e5b0E3A0": { - "contractToCall": "0xb9812E2fA995EC53B5b6DF34d21f9304762C5497", - "creationLogEncoding": [ - [ - { - "name": "_data", - "type": "bytes" - }, - { - "name": "_value", - "type": "uint256" - }, - { - "name": "_descriptionHash", - "type": "string" - } - ] - ], - "name": "DutchXScheme", - "newProposalTopics": [ - [ - "0x36418f82d814fb021ca04ebdc2c4a3cd69f719851f597c489bca2ed245e8c8ad", - "0x000000000000000000000000519b70055af55a007110b4ff99b0ea33071c720a" - ] - ], - "supported": false, - "type": "GenericScheme", - "voteParams": "0xff6155010292b35fb8daae8b4450cdc41a586bc591e9a76484e88ffba36f94a8", - "votingMachine": "0x332B8C9734b4097dE50f302F7D9F273FFdB45B84" - }, - "0x1cb5B2BB4030220ad5417229A7A1E3c373cDD2F6": { - "contractToCall": "0x0000000000000000000000000000000000000000", - "creationLogEncoding": [], - "name": "DxLockWhitelisted4Rep", - "newProposalTopics": [], - "supported": false, - "type": "DxScheme", - "voteParams": "", - "votingMachine": "0x332B8C9734b4097dE50f302F7D9F273FFdB45B84" - }, - "0x2E6FaE82c77e1D6433CCaAaF90281523b99D0D0a": { - "contractToCall": "0x0000000000000000000000000000000000000000", - "creationLogEncoding": [], - "name": "DxLockMgnForRep", - "newProposalTopics": [], - "supported": false, - "type": "DxScheme", - "voteParams": "", - "votingMachine": "0x332B8C9734b4097dE50f302F7D9F273FFdB45B84" - }, - "0x34C42c3ee81A03FD9ea773987b4a6eF62f3fc151": { - "contractToCall": "0x0000000000000000000000000000000000000000", - "creationLogEncoding": [ - [ - { - "name": "_callsData", - "type": "bytes[]" - }, - { - "name": "_values", - "type": "uint256[]" - }, - { - "name": "_descriptionHash", - "type": "string" - }, - { - "name": "_contractsToCall", - "type": "address[]" - } - ] - ], - "name": "Multicall_2", - "newProposalTopics": [ - [ - "0xf5a0655bd7247f3a6fa97e71b57c61314566afb5aa8be8eea2c48f4d1b9bf190", - "0x000000000000000000000000519b70055af55a007110b4ff99b0ea33071c720a" - ] - ], - "supported": true, - "type": "GenericMulticall", - "voteParams": "0x8a8f5413c9b49a4ed4df33213f474a0ae29328a81b3c40c881e8a3fab0d12b44", - "votingMachine": "0x332B8C9734b4097dE50f302F7D9F273FFdB45B84" - }, - "0x4564BFe303900178578769b2D76B1a13533E5fd5": { - "contractToCall": "0x0000000000000000000000000000000000000000", - "creationLogEncoding": [], - "name": "DxLockEth4Rep", - "newProposalTopics": [], - "supported": false, - "type": "DxScheme", - "voteParams": "", - "votingMachine": "0x332B8C9734b4097dE50f302F7D9F273FFdB45B84" - }, - "0x46DF3EA38a680FBc84E744D92b0A8Ec717B2eA7E": { - "contractToCall": "0x314159265dd8dbb310642f98f50c066173c1259b", - "creationLogEncoding": [ - [ - { - "name": "_data", - "type": "bytes" - }, - { - "name": "_value", - "type": "uint256" - }, - { - "name": "_descriptionHash", - "type": "string" - } - ] - ], - "name": "GenericSchemeToENS", - "newProposalTopics": [ - [ - "0x36418f82d814fb021ca04ebdc2c4a3cd69f719851f597c489bca2ed245e8c8ad", - "0x000000000000000000000000519b70055af55a007110b4ff99b0ea33071c720a" - ] - ], - "supported": false, - "type": "GenericScheme", - "voteParams": "0x29ddbf85a0d14e08084cd9764c66ff2799d05355edf7f546c5af1c847a2d9734", - "votingMachine": "0x332B8C9734b4097dE50f302F7D9F273FFdB45B84" - }, - "0x4D8DB062dEFa0254d00a44aA1602C30594e47B12": { - "contractToCall": "0x0000000000000000000000000000000000000000", - "creationLogEncoding": [], - "name": "DxGenAuction4Rep", - "newProposalTopics": [], - "supported": false, - "type": "DxScheme", - "voteParams": "", - "votingMachine": "0x332B8C9734b4097dE50f302F7D9F273FFdB45B84" - }, - "0x973ce4e81BdC3bD39f46038f3AaA928B04558b08": { - "contractToCall": "0x57f1887a8bf19b14fc0df6fd9b2acc9af147ea85", - "creationLogEncoding": [ - [ - { - "name": "_data", - "type": "bytes" - }, - { - "name": "_value", - "type": "uint256" - }, - { - "name": "_descriptionHash", - "type": "string" - } - ] - ], - "name": "EnsRegistrarScheme", - "newProposalTopics": [ - [ - "0x36418f82d814fb021ca04ebdc2c4a3cd69f719851f597c489bca2ed245e8c8ad", - "0x000000000000000000000000519b70055af55a007110b4ff99b0ea33071c720a" - ] - ], - "supported": false, - "type": "GenericScheme", - "voteParams": "0x29ddbf85a0d14e08084cd9764c66ff2799d05355edf7f546c5af1c847a2d9734", - "votingMachine": "0x332B8C9734b4097dE50f302F7D9F273FFdB45B84" - }, - "0x9A543aeF934c21Da5814785E38f9A7892D3CDE6E": { - "contractToCall": "0x226159d592e2b063810a10ebf6dcbada94ed68b8", - "creationLogEncoding": [ - [ - { - "name": "_data", - "type": "bytes" - }, - { - "name": "_value", - "type": "uint256" - }, - { - "name": "_descriptionHash", - "type": "string" - } - ] - ], - "name": "EnsPublicProviderScheme", - "newProposalTopics": [ - [ - "0x36418f82d814fb021ca04ebdc2c4a3cd69f719851f597c489bca2ed245e8c8ad", - "0x000000000000000000000000519b70055af55a007110b4ff99b0ea33071c720a" - ] - ], - "supported": false, - "type": "GenericScheme", - "voteParams": "0x29ddbf85a0d14e08084cd9764c66ff2799d05355edf7f546c5af1c847a2d9734", - "votingMachine": "0x332B8C9734b4097dE50f302F7D9F273FFdB45B84" - }, - "0x9CEA0DD05C4344A769B2F4C2f8890EDa8a700d64": { - "contractToCall": "0x00000000000c2e074ec69a0dfb2997ba6c7d2e1e", - "creationLogEncoding": [ - [ - { - "name": "_data", - "type": "bytes" - }, - { - "name": "_value", - "type": "uint256" - }, - { - "name": "_descriptionHash", - "type": "string" - } - ] - ], - "name": "EnsRegistryScheme", - "newProposalTopics": [ - [ - "0x36418f82d814fb021ca04ebdc2c4a3cd69f719851f597c489bca2ed245e8c8ad", - "0x000000000000000000000000519b70055af55a007110b4ff99b0ea33071c720a" - ] - ], - "supported": false, - "type": "GenericScheme", - "voteParams": "0x0dc1fb4d230debe146613511601e0df83dd5ac323a7add833de82ead5a19db3a", - "votingMachine": "0x332B8C9734b4097dE50f302F7D9F273FFdB45B84" - }, - "0xB3ec6089556CcA49549Be01fF446cF40fA81c84D": { - "contractToCall": "0x4976fb03c32e5b8cfe2b6ccb31c09ba78ebaba41", - "creationLogEncoding": [ - [ - { - "name": "_data", - "type": "bytes" - }, - { - "name": "_value", - "type": "uint256" - }, - { - "name": "_descriptionHash", - "type": "string" - } - ] - ], - "name": "EnsPublicResolverScheme", - "newProposalTopics": [ - [ - "0x36418f82d814fb021ca04ebdc2c4a3cd69f719851f597c489bca2ed245e8c8ad", - "0x000000000000000000000000519b70055af55a007110b4ff99b0ea33071c720a" - ] - ], - "supported": false, - "type": "GenericScheme", - "voteParams": "0xa81f982cb1c27eb142e5f602e7eb50d125dd6a7e52dac1af5f9decb88278f2fa", - "votingMachine": "0x1C18bAd5a3ee4e96611275B13a8ed062B4a13055" - }, - "0xc072171dA83CCe311e37BC1d168f54E6A6536DF4": { - "contractToCall": "0x93db90445b76329e9ed96ecd74e76d8fbf2590d8", - "creationLogEncoding": [ - [ - { - "name": "_data", - "type": "bytes" - }, - { - "name": "_value", - "type": "uint256" - }, - { - "name": "_descriptionHash", - "type": "string" - } - ] - ], - "name": "TokenRegistry", - "newProposalTopics": [ - [ - "0x36418f82d814fb021ca04ebdc2c4a3cd69f719851f597c489bca2ed245e8c8ad", - "0x000000000000000000000000519b70055af55a007110b4ff99b0ea33071c720a" - ] - ], - "supported": false, - "type": "GenericScheme", - "voteParams": "0x8452e57c89dc78ec1b1ffc28786655279f9af4ac589dd5988c962e8cf6b4529b", - "votingMachine": "0x1C18bAd5a3ee4e96611275B13a8ed062B4a13055" - }, - "0xef9dC3c39CA40A2a3000ACc5ca0467CE1C250808": { - "contractToCall": "0x0000000000000000000000000000000000000000", - "creationLogEncoding": [ - [ - { - "name": "_callsData", - "type": "bytes[]" - }, - { - "name": "_values", - "type": "uint256[]" - }, - { - "name": "_descriptionHash", - "type": "string" - }, - { - "name": "_contractsToCall", - "type": "address[]" - } - ] - ], - "name": "Multicall_1", - "newProposalTopics": [ - [ - "0xf5a0655bd7247f3a6fa97e71b57c61314566afb5aa8be8eea2c48f4d1b9bf190", - "0x000000000000000000000000519b70055af55a007110b4ff99b0ea33071c720a" - ] - ], - "supported": true, - "type": "GenericMulticall", - "voteParams": "0xe5e87e294b422b2aa711bd25a7e8ac59a06bbf723786560c53c50edce980f2fd", - "votingMachine": "0x332B8C9734b4097dE50f302F7D9F273FFdB45B84" - }, - "0xf050F3C6772Ff35eB174A6900833243fcCD0261F": { - "contractToCall": "0x9f828ac3baa9003e8a4e0b24bcae7b027b6740b0", - "creationLogEncoding": [ - [ - { - "name": "_scheme ", - "type": "address" - }, - { - "name": "_parametersHash", - "type": "bytes32" - }, - { - "name": "_permissions", - "type": "bytes4" - }, - { - "name": "_descriptionHash", - "type": "string" - } - ], - [ - { - "name": "_scheme ", - "type": "address" - }, - { - "name": "_descriptionHash", - "type": "string" - } - ] - ], - "name": "SchemeRegistrar", - "newProposalTopics": [ - [ - "0xcc9180a05805acc3615b472c3ba00cdc9cd2c6e0e0b3648d60eb58f2c1001b84", - "0x000000000000000000000000519b70055af55a007110b4ff99b0ea33071c720a" - ], - [ - "0x504b6bd2558241a5f0532c970f3444e1fc24e1f7cf3d7c49a8d213bd612e9055", - "0x000000000000000000000000519b70055af55a007110b4ff99b0ea33071c720a" - ] - ], - "supported": true, - "type": "SchemeRegistrar", - "voteParams": "0x9799ec39e42562c5ac7fbb104f1edcaa495e00b45e0db80cce1c0cdc863d0d0f", - "votingMachine": "0x332B8C9734b4097dE50f302F7D9F273FFdB45B84" - } - }, - "permissionRegistry": "0x0000000000000000000000000000000000000000", - "reputation": "0x7a927a93f221976aae26d5d077477307170f0b7c", - "token": "0x643b14f6ea235668278da5974930105852f2b7c4", "utils": { - "multicall": "0x742121cD0BB9784c1f17f25B8da1bF3445b93ED4", "guildRegistry": "0x7E6EB84621c3bb8455046f380c3934fAf8076158" - }, - "votingMachines": { - "0x1C18bAd5a3ee4e96611275B13a8ed062B4a13055": { - "token": "0x543ff227f64aa17ea132bf9886cab5db55dcaddf", - "type": "GenesisProtocol" - }, - "0x332B8C9734b4097dE50f302F7D9F273FFdB45B84": { - "token": "0x543ff227f64aa17ea132bf9886cab5db55dcaddf", - "type": "GenesisProtocol" - } } }, - "proposalTemplates": [ - { - "description": "# Background\n \n - If this is your first contributor proposal, state any context for making the proposal, including:\n - What position you will be filling – i.e. developer, marketing, governance, etc.\n - Who you have been in contact with regarding the position (add their DAOtalk usernames)\n - If you are a continuing contributor, state which products and areas you are working on / any other relevant background information\n # Timeframe\n \n - State the date range, typically 2 months (2.5 months for first-time workers)\n # Scope of Contribution\n \n - **Goals** :\n - State the products and /or strategy areas you will be working under. E.g. Omen and Governance. Include both short-term goals that you seek to accomplish during the working period and long-term goals.\n - **Responsibilities:**\n - List the specific deliverables you will be either completing and / or working on during the working period. Try to state which deliverables you intend to complete within the period and which are long-term or ongoing projects.\n \n # Reflection\n \n - If You Are A Returning Contributor, Write a Self-Reflection\n - State what you did well, what you did okay, and what you need to improve on\n # Compensation\n \n - Experience Level : 1-5\n - Time commitment : Percent (%) of time\n - [ETH/DAI AMT] : For 2 months of work at level [LEVEL], to be sent half on the first payment proposal and half on the second payment proposal\n - [DXD AMT] : Vested for 2 years with a 1 year cliff starting the [DATE WORK PERIOD STARTS]\n - [% AMT REP] : For 2 months of work , to be sent half on the first payment proposal and half on the second payment proposal\n # Work Experience\n \n - Prior DXdao work proposals (if applicable)\n - Past Work for DXdao\n - If a developer, Github links\n - If a non-tech worker, doc links or described deliverables\n - If new, past relevant work experience\n - Developers : Github profile link\n - Non-tech : suggested Linkedin / other references\n", - "name": "Contributor Proposal", - "title": "[NAME] Contributor Proposal [DATE - DATE]" - }, - { - "description": "# Timeframe\n \n - State the contributor proposal date range\n \n # Background\n \n - State the context for making the contributor payment proposal, including:\n - What position you will be filling – i.e. developer, marketing, governance, etc.\n - Proposed Scope of Contribution\n - Self-Reflection on Scope of Contribution\n - Include the URL to the original proposal forum post\n \n # Deliverables\n\n - Include information around deliverables that were completed during your worker period\n \n # Compensation\n\n - Experience Level : 1-5\n - Time commitment : Percent (%) of time\n - [ETH/DAI AMT] : For second half payment proposal\n - [DXD AMT] : Vested for 2 years with a 1 year cliff starting the [DATE WORK PERIOD STARTS]\n - [% AMT REP]: For 2 second half payment proposal\n \n # Work Experience\n \n - Prior DXdao work proposals (if applicable)\n - Past Work for DXdao\n - If a developer, Github links\n - If a non-tech worker, doc links or described\n - If new, past relevant work experience\n - Developers : Github profile link\n - Non-tech : suggested Linkedin / other references\n \n", - "name": "Payment Proposal", - "title": "[NAME] Payment Proposal [DATE - DATE]" - }, - { - "description": "## Description \n\n## Proposition \n\n## Action Plan", - "name": "Signal Proposal", - "title": "Signal Proposal for [DAO_ACTION]" - }, - { - "calls": [ - { - "functionName": "approve(address,uint256)", - "params": [ - "0xecA7F78d59D16812948849663b26FE10E320f80C", - "" - ], - "to": "0xdE903E2712288A1dA82942DDdF2c20529565aC30" - }, - { - "functionName": "createDistribution(address[],address,uint256[],uint64,uint64,bool,uint256)", - "params": [ - "[0xdE903E2712288A1dA82942DDdF2c20529565aC30]", - "", - "[]", - "", - "", - "false", - "0" - ], - "to": "0xecA7F78d59D16812948849663b26FE10E320f80C" - } - ], - "description": "Simple description", - "name": "SWPR Farming Campaign", - "title": "[PAIR X/Y] Farming Campaign [DATE - DATE]]" - } - ], - "proposalTypes": [ - { - "id": "custom", - "title": "Custom" - } - ], - "recommendedCalls": [], - "tokens": [ - { - "address": "0x111111111117dc0aa78b770fa6a738034120c302", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/13469/thumb/1inch-token.png?1608803028", - "name": "1Inch", - "symbol": "1INCH" - }, - { - "address": "0x7Fc66500c84A76Ad7e9c93437bFc5Ac33E2DDaE9", - "decimals": 18, - "fetchPrice": false, - "logoURI": "ipfs://QmWzL3TSmkMhbqGBEwyeFyWVvLmEo3F44HBMFnmTUiTfp1", - "name": "Aave Token", - "symbol": "AAVE" - }, - { - "address": "0x8185Bc4757572Da2a610f887561c32298f1A5748", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/14379/thumb/ALN-token-logo-200px.png?1615778759", - "name": "Aluna", - "symbol": "ALN" - }, - { - "address": "0xa117000000f279D81A1D3cc75430fAA017FA5A2e", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/681/thumb/JelZ58cv_400x400.png?1601449653", - "name": "Aragon Network Token", - "symbol": "ANT" - }, - { - "address": "0x0b38210ea11411557c13457D4dA7dC6ea731B88a", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/13256/thumb/api3.jpg?1606751424", - "name": "API3", - "symbol": "API3" - }, - { - "address": "0x374CB8C27130E2c9E04F44303f3c8351B9De61C1", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/13547/thumb/BaoLogo.png?1615342483", - "name": "BaoToken", - "symbol": "BAO" - }, - { - "address": "0x1f573d6fb3f13d689ff844b4ce37794d79a7ff1c", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/736/thumb/bancor.png?1547034477", - "name": "Bancor Network Token", - "symbol": "BNT" - }, - { - "address": "0x5d3a536E4D6DbD6114cc1Ead35777bAB948E3643", - "decimals": 8, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/9281/thumb/cDAI.png?1576467585", - "name": "Compound Dai", - "symbol": "cDAI" - }, - { - "address": "0x06AF07097C9Eeb7fD685c692751D5C66dB49c215", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/10147/thumb/CHAI.png?1576467289", - "name": "Chai", - "symbol": "CHAI" - }, - { - "address": "0xc00e94Cb662C3520282E6f5717214004A7f26888", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/10775/thumb/COMP.png?1592625425", - "name": "Compound", - "symbol": "COMP" - }, - { - "address": "0xD533a949740bb3306d119CC777fa900bA034cd52", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/12124/thumb/Curve.png?1597369484", - "name": "Curve DAO Token", - "symbol": "CRV" - }, - { - "address": "0x6B175474E89094C44Da98b954EedeAC495271d0F", - "decimals": 18, - "fetchPrice": true, - "logoURI": "https://assets.coingecko.com/coins/images/9956/thumb/dai-multi-collateral-mcd.png?1574218774", - "name": "Dai Stablecoin", - "symbol": "DAI" - }, - { - "address": "0xEd91879919B71bB6905f23af0A68d231EcF87b14", - "decimals": 18, - "fetchPrice": true, - "logoURI": "https://assets.coingecko.com/coins/images/11677/thumb/dmm.png?1592674690", - "name": "DMM: Governance", - "symbol": "DMG" - }, - { - "address": "0xca1207647Ff814039530D7d35df0e1Dd2e91Fa84", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/12508/thumb/dht.png?1600752201", - "name": "dHedge DAO Token", - "symbol": "DHT" - }, - { - "address": "0x84cA8bc7997272c7CfB4D0Cd3D55cd942B3c9419", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/11955/thumb/DIA-icon-colour_%281%29.png?1596423488", - "name": "DIAToken", - "symbol": "DIA" - }, - { - "address": "0x1494CA1F11D487c2bBe4543E90080AeBa4BA3C2b", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/12465/thumb/defi_pulse_index_set.png?1600051053", - "name": "DefiPulse Index", - "symbol": "DPI" - }, - { - "address": "0xa1d65E8fB6e87b60FECCBc582F7f97804B725521", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/11148/thumb/dxdao.png?1607999331", - "name": "DXdao", - "symbol": "DXD" - }, - { - "address": "0x970B9bB2C0444F5E81e9d0eFb84C8ccdcdcAf84d", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/10347/thumb/vUXKHEe.png?1601523640", - "name": "Fuse Token", - "symbol": "FUSE" - }, - { - "address": "0x543ff227f64aa17ea132bf9886cab5db55dcaddf", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/3479/thumb/gen.png?1547038215", - "name": "DAOstack", - "symbol": "GEN" - }, - { - "address": "0xf6537FE0df7F0Cc0985Cf00792CC98249E73EFa0", - "decimals": 8, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/8996/thumb/giv.png?1596069222", - "name": "GIVToken", - "symbol": "GIV" - }, - { - "address": "0x6810e776880C02933D47DB1b9fc05908e5386b96", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/662/thumb/logo_square_simple_300px.png?1609402668", - "name": "Gnosis Token", - "symbol": "GNO" - }, - { - "address": "0x12B19D3e2ccc14Da04FAe33e63652ce469b3F2FD", - "decimals": 12, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/1106/thumb/grid.png?1547743150", - "name": "GRID Token", - "symbol": "GRID" - }, - { - "address": "0xc944e90c64b2c07662a292be6244bdf05cda44a7", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/13397/thumb/Graph_Token.png?1608145566", - "name": "The Graph", - "symbol": "GRT" - }, - { - "address": "0xde30da39c46104798bb5aa3fe8b9e0e1f348163f", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/15810/thumb/gitcoin.png?1621992929", - "name": "Gitcoin", - "symbol": "GTC" - }, - { - "address": "0x056Fd409E1d7A124BD7017459dFEa2F387b6d5Cd", - "decimals": 2, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/5992/thumb/gemini-dollar-gusd.png?1536745278", - "name": "Gemini dollar", - "symbol": "GUSD" - }, - { - "address": "0xc3589F56B6869824804A5EA29F2c9886Af1B0FcE", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/12895/thumb/hnys.png?1614100588", - "name": "Honey", - "symbol": "HNY" - }, - { - "address": "0x514910771af9ca656af840dff83e8264ecf986ca", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/877/thumb/chainlink-new-logo.png?1547034700", - "name": "Chainlink", - "symbol": "LINK" - }, - { - "address": "0x6dea81c8171d0ba574754ef6f8b412f2ed88c54d", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/14665/thumb/200-lqty-icon.png?1617631180", - "name": "Liquity", - "symbol": "LQTY" - }, - { - "address": "0xbbbbca6a901c926f240b89eacb641d8aec7aeafd", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/913/thumb/LRC.png?1572852344", - "name": "Loopring", - "symbol": "LRC" - }, - { - "address": "0x5f98805a4e8be255a32880fdec7f6728c6568ba0", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/14666/thumb/Group_3.png?1617631327", - "name": "Liquity USD", - "symbol": "LUSD" - }, - { - "address": "0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/1364/small/Mark_Maker.png?1585191826", - "name": "MakerDAO", - "symbol": "MKR" - }, - { - "address": "0xa3BeD4E1c75D00fa6f4E5E6922DB7261B5E9AcD2", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/11846/thumb/mStable.png?1594950533", - "name": "Meta", - "symbol": "MTA" - }, - { - "address": "0xe2f2a5C287993345a840Db3B0845fbC70f5935a5", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/11576/thumb/mStable_USD.png?1595591803", - "name": "mStable USD", - "symbol": "mUSD" - }, - { - "address": "0x1A5F9352Af8aF974bFC03399e3767DF6370d82e4", - "decimals": 18, - "fetchPrice": true, - "logoURI": "https://assets.coingecko.com/coins/images/11149/thumb/gnosis-owl_32.png?1589057849", - "name": "OWL Token", - "symbol": "OWL" - }, - { - "address": "0xD56daC73A4d6766464b38ec6D91eB45Ce7457c44", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/9543/thumb/pan-logo.png?1568674599", - "name": "Panvala pan", - "symbol": "PAN" - }, - { - "address": "0x8E870D67F660D95d5be530380D0eC0bd388289E1", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/6013/thumb/paxos_standard.png?1548386291", - "name": "Paxos Standard", - "symbol": "PAX" - }, - { - "address": "0x93ED3FBe21207Ec2E8f2d3c3de6e058Cb73Bc04d", - "decimals": 18, - "fetchPrice": true, - "logoURI": "https://assets.coingecko.com/coins/images/3833/thumb/kleros.png?1547975322", - "name": "Kleros", - "symbol": "PNK" - }, - { - "address": "0x31c8eacbffdd875c74b94b077895bd78cf1e64a3", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/14013/thumb/radicle.png?1614402918", - "name": "Radicle", - "symbol": "RAD" - }, - { - "address": "0xfE18be6b3Bd88A2D2A7f928d00292E7a9963CfC6", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/8838/thumb/sBTC.png?1616149734", - "name": "Synth sBTC", - "symbol": "sBTC" - }, - { - "address": "0x5e74C9036fb86BD7eCdcb084a0673EFc32eA31cb", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/8843/thumb/sETH.png?1616150207", - "name": "Synth sETH", - "symbol": "sETH" - }, - { - "address": "0xC011a73ee8576Fb46F5E1c5751cA3B9Fe0af2a6F", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/3406/thumb/SNX.png?1598631139", - "name": "Synthetix Network Token", - "symbol": "SNX" - }, - { - "address": "0x57Ab1ec28D129707052df4dF418D58a2D46d5f51", - "decimals": 18, - "fetchPrice": true, - "logoURI": "https://assets.coingecko.com/coins/images/5013/thumb/sUSD.png?1616150765", - "name": "Synth sUSD", - "symbol": "sUSD" - }, - { - "address": "0x6b3595068778dd592e39a122f4f5a5cf09c90fe2", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/12271/thumb/512x512_Logo_no_chop.png?1606986688", - "name": "Sushi", - "symbol": "SUSHI" - }, - { - "address": "0x679131F591B4f369acB8cd8c51E68596806c3916", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/11562/thumb/Trustlines.png?1591152088", - "name": "Trustlines Network Token", - "symbol": "TLN" - }, - { - "address": "0x77777feddddffc19ff86db637967013e6c6a116c", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/13496/thumb/ZINt8NSB_400x400.jpg?1609193407", - "name": "Tornado Cash", - "symbol": "TORN" - }, - { - "address": "0x0000000000085d4780B73119b644AE5ecd22b376", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/3449/thumb/tusd.png?1618395665", - "name": "TrueUSD", - "symbol": "TUSD" - }, - { - "address": "0x1Fc31488f28ac846588FFA201cDe0669168471bD", - "decimals": 2, - "fetchPrice": false, - "name": "UAX", - "symbol": "UAX" - }, - { - "address": "0x04Fa0d235C4abf4BcF4787aF4CF447DE572eF828", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/10951/thumb/UMA.png?1586307916", - "name": "UMA Voting Token v1", - "symbol": "UMA" - }, - { - "address": "0x1f9840a85d5aF5bf1D1762F925BDADdC4201F984", - "decimals": 18, - "fetchPrice": false, - "logoURI": "ipfs://QmXttGpZrECX5qCyXbBQiqgQNytVGeZW5Anewvh2jc4psg", - "name": "Uniswap", - "symbol": "UNI" - }, - { - "address": "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48", - "decimals": 6, - "fetchPrice": true, - "logoURI": "https://assets.coingecko.com/coins/images/6319/thumb/USD_Coin_icon.png?1547042389", - "name": "USD Coin", - "symbol": "USDC" - }, - { - "address": "0xdAC17F958D2ee523a2206206994597C13D831ec7", - "decimals": 6, - "fetchPrice": true, - "logoURI": "https://assets.coingecko.com/coins/images/325/thumb/Tether-logo.png?1598003707", - "name": "Tether USD", - "symbol": "USDT" - }, - { - "address": "0xa47c8bf37f92aBed4A126BDA807A7b7498661acD", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/12681/thumb/UST.png?1601612407", - "name": "Wrapped UST Token", - "symbol": "UST" - }, - { - "address": "0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599", - "decimals": 8, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/7598/thumb/wrapped_bitcoin_wbtc.png?1548822744", - "name": "Wrapped BTC", - "symbol": "WBTC" - }, - { - "address": "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2", - "decimals": 18, - "fetchPrice": true, - "logoURI": "https://assets.coingecko.com/coins/images/2518/thumb/weth.png?1547036627", - "name": "Wrapped Ether", - "symbol": "WETH" - }, - { - "address": "0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/11849/thumb/yfi-192x192.png?1598325330", - "name": "yearn.finance", - "symbol": "YFI" - } - ], "version": 1 -} \ No newline at end of file +} diff --git a/src/configs/xdai/config.json b/src/configs/xdai/config.json index 8a9cbb985..940109bdd 100644 --- a/src/configs/xdai/config.json +++ b/src/configs/xdai/config.json @@ -1,673 +1,8 @@ { - "cache": { - "fromBlock": 13060713, - "ipfsHash": "QmQgax9dCsQbWwovbLG6NA1A8Z1pfoh5kRq1asqYZ8ReTM", - "toBlock": "22297636" - }, "contracts": { - "avatar": "0xe716EC63C5673B3a4732D22909b38d779fa47c3F", - "controller": "0xfBEcdD3360E2A9040383980AB3863BE9d57256fd", - "daostack": { - "0x016Bf002D361bf5563c76230D19B4DaB4d66Bda4": { - "contractToCall": "0xfBEcdD3360E2A9040383980AB3863BE9d57256fd", - "creationLogEncoding": [ - [ - { - "name": "_descriptionHash", - "type": "string" - }, - { - "name": "_reputationChange", - "type": "int256" - }, - { - "name": "_rewards", - "type": "uint256[5]" - }, - { - "name": "_externalToken", - "type": "address" - }, - { - "name": "_beneficiary", - "type": "address" - } - ] - ], - "name": "ContributionReward", - "newProposalTopics": [ - [ - "0xcbdcbf9aaeb1e9eff0f75d74e1c1e044bc87110164baec7d18d825b0450d97df", - "0x000000000000000000000000e716ec63c5673b3a4732d22909b38d779fa47c3f" - ] - ], - "redeemer": "0xd2cc17817c0d4cfc6819510b2e5288512122d71c", - "supported": false, - "type": "ContributionReward", - "voteParams": "0x1e3e01f4ce01291e53f32570ab772ef6e7301d7223b00c162494e26cc16830df", - "votingMachine": "0xDA309aDF1c84242Bb446F7CDBa96B570E901D4CF" - }, - "0x22Ac81BE75cF76281D88A0F3A8Ae59b9abbE9da1": { - "contractToCall": "0xfBEcdD3360E2A9040383980AB3863BE9d57256fd", - "creationLogEncoding": [ - [ - { - "name": "_scheme ", - "type": "address" - }, - { - "name": "_parametersHash", - "type": "bytes32" - }, - { - "name": "_permissions", - "type": "bytes4" - }, - { - "name": "_descriptionHash", - "type": "string" - } - ], - [ - { - "name": "_scheme ", - "type": "address" - }, - { - "name": "_descriptionHash", - "type": "string" - } - ] - ], - "name": "SchemeRegistrar", - "newProposalTopics": [ - [ - "0xcc9180a05805acc3615b472c3ba00cdc9cd2c6e0e0b3648d60eb58f2c1001b84", - "0x000000000000000000000000e716ec63c5673b3a4732d22909b38d779fa47c3f" - ], - [ - "0x504b6bd2558241a5f0532c970f3444e1fc24e1f7cf3d7c49a8d213bd612e9055", - "0x000000000000000000000000e716ec63c5673b3a4732d22909b38d779fa47c3f" - ] - ], - "supported": true, - "type": "SchemeRegistrar", - "voteParams": "0x1e3e01f4ce01291e53f32570ab772ef6e7301d7223b00c162494e26cc16830df", - "votingMachine": "0xDA309aDF1c84242Bb446F7CDBa96B570E901D4CF" - }, - "0x2b644360a24366B1ebdBf4f69563eAfA4772bCA0": { - "contractToCall": "0x0000000000000000000000000000000000000000", - "creationLogEncoding": [], - "name": "InvalidScheme", - "newProposalTopics": [], - "supported": false, - "type": "DxScheme", - "voteParams": "", - "votingMachine": "0xDA309aDF1c84242Bb446F7CDBa96B570E901D4CF" - }, - "0x50d895Df2ea26b4C3aBbFa22906197458F56bAe9": { - "contractToCall": "0x0000000000000000000000000000000000000000", - "creationLogEncoding": [], - "name": "DaoDeployer", - "newProposalTopics": [], - "supported": false, - "type": "DxScheme", - "voteParams": "", - "votingMachine": "0xDA309aDF1c84242Bb446F7CDBa96B570E901D4CF" - }, - "0x63F411E7cA67CB296FE2c7B875E072E82A609436": { - "contractToCall": "0x0000000000000000000000000000000000000000", - "creationLogEncoding": [], - "name": "DaoDeployer2", - "newProposalTopics": [], - "supported": false, - "type": "DxScheme", - "voteParams": "", - "votingMachine": "0xDA309aDF1c84242Bb446F7CDBa96B570E901D4CF" - }, - "0x73753baC5B0fBECfd741436b64163f670E0aCB30": { - "contractToCall": "0x0000000000000000000000000000000000000000", - "creationLogEncoding": [ - [ - { - "name": "_descriptionHash", - "type": "string" - }, - { - "name": "_reputationChange", - "type": "int256" - }, - { - "name": "_rewards", - "type": "uint256[5]" - }, - { - "name": "_externalToken", - "type": "address" - }, - { - "name": "_beneficiary", - "type": "address" - } - ] - ], - "name": "CompetitionScheme", - "newProposalTopics": [ - [ - "0xfc38e03bef8d47e8c970c106660459b8a9db8eb045bd1281ef4cc50c16e03227", - "0x000000000000000000000000e716ec63c5673b3a4732d22909b38d779fa47c3f" - ] - ], - "supported": false, - "type": "CompetitionScheme", - "voteParams": "0xa8139cb6b8d1e5f7a84c3f981d0c747b1d227ce46140246a4a2bfa46151d84cd", - "votingMachine": "0xDA309aDF1c84242Bb446F7CDBa96B570E901D4CF" - }, - "0xaFE59DF878E23623A7a91d16001a66A4DD87e0c0": { - "contractToCall": "0x0000000000000000000000000000000000000000", - "creationLogEncoding": [ - [ - { - "name": "_callsData", - "type": "bytes[]" - }, - { - "name": "_values", - "type": "uint256[]" - }, - { - "name": "_descriptionHash", - "type": "string" - }, - { - "name": "_contractsToCall", - "type": "address[]" - } - ] - ], - "name": "Multicall_1", - "newProposalTopics": [ - [ - "0xf5a0655bd7247f3a6fa97e71b57c61314566afb5aa8be8eea2c48f4d1b9bf190", - "0x000000000000000000000000e716ec63c5673b3a4732d22909b38d779fa47c3f" - ] - ], - "supported": true, - "type": "GenericMulticall", - "voteParams": "0x1e3e01f4ce01291e53f32570ab772ef6e7301d7223b00c162494e26cc16830df", - "votingMachine": "0xDA309aDF1c84242Bb446F7CDBa96B570E901D4CF" - } - }, - "permissionRegistry": "0x757bbdC3dF870202f28e5cF92a0005158D5e0786", - "reputation": "0xED77eaA9590cfCE0a126Bab3D8A6ada9A393d4f6", - "token": "0xf255B9d83db924820ee23A7dCC30b7542e201Bb1", "utils": { - "dxdVestingFactory": "0x45734dB5C3342c66932db308Dbb23a5e2B159561", - "multicall": "0xDD032cd0dfCB54050E1FA30Be59056403e292700", "guildRegistry": "0x7E6EB84621c3bb8455046f380c3934fAf8076158" - }, - "votingMachines": { - "0x053f406aD40c9Eb8eB43aFf28DA0D0EC17dF8e44": { - "token": "0xb90D6bec20993Be5d72A5ab353343f7a0281f158", - "type": "DXDVotingMachine" - }, - "0xDA309aDF1c84242Bb446F7CDBa96B570E901D4CF": { - "token": "0x543ff227f64aa17ea132bf9886cab5db55dcaddf", - "type": "GenesisProtocol" - } } }, - "contributionLevels": [ - { - "dxd": 1500, - "id": "1", - "rep": 0.1667, - "stable": 3000 - }, - { - "dxd": 2000, - "id": "2", - "rep": 0.1667, - "stable": 4000 - }, - { - "dxd": 3000, - "id": "3", - "rep": 0.1667, - "stable": 5000 - }, - { - "dxd": 4000, - "id": "4", - "rep": 0.1667, - "stable": 6000 - }, - { - "dxd": 5000, - "id": "5", - "rep": 0.1667, - "stable": 7000 - }, - { - "dxd": 6000, - "id": "6", - "rep": 0.1667, - "stable": 8000 - }, - { - "dxd": 7500, - "id": "7", - "rep": 0.1667, - "stable": 9000 - }, - { - "dxd": 9500, - "id": "8", - "rep": 0.1667, - "stable": 9000 - } - ], - "proposalTemplates": [ - { - "description": "# Background\n \n - If this is your first contributor proposal, state any context for making the proposal, including:\n - What position you will be filling – i.e. developer, marketing, governance, etc.\n - Who you have been in contact with regarding the position (add their DAOtalk usernames)\n - If you are a continuing contributor, state which products and areas you are working on / any other relevant background information\n # Timeframe\n \n - State the date range, typically 2 months (2.5 months for first-time workers)\n # Scope of Contribution\n \n - **Goals** :\n - State the products and /or strategy areas you will be working under. E.g. Omen and Governance. Include both short-term goals that you seek to accomplish during the working period and long-term goals.\n - **Responsibilities:**\n - List the specific deliverables you will be either completing and / or working on during the working period. Try to state which deliverables you intend to complete within the period and which are long-term or ongoing projects.\n \n # Reflection\n \n - If You Are A Returning Contributor, Write a Self-Reflection\n - State what you did well, what you did okay, and what you need to improve on\n # Compensation\n \n - Experience Level : 1-5\n - Time commitment : Percent (%) of time\n - [ETH/DAI AMT] : For 2 months of work at level [LEVEL], to be sent half on the first payment proposal and half on the second payment proposal\n - [DXD AMT] : Vested for 2 years with a 1 year cliff starting the [DATE WORK PERIOD STARTS]\n - [% AMT REP] : For 2 months of work , to be sent half on the first payment proposal and half on the second payment proposal\n # Work Experience\n \n - Prior DXdao work proposals (if applicable)\n - Past Work for DXdao\n - If a developer, Github links\n - If a non-tech worker, doc links or described deliverables\n - If new, past relevant work experience\n - Developers : Github profile link\n - Non-tech : suggested Linkedin / other references\n", - "name": "Contributor Proposal", - "title": "[NAME] Contributor Proposal [DATE - DATE]" - }, - { - "description": "# Timeframe\n \n - State the contributor proposal date range\n \n # Background\n \n - State the context for making the contributor payment proposal, including:\n - What position you will be filling – i.e. developer, marketing, governance, etc.\n - Proposed Scope of Contribution\n - Self-Reflection on Scope of Contribution\n - Include the URL to the original proposal forum post\n \n # Deliverables\n\n - Include information around deliverables that were completed during your worker period\n \n # Compensation\n\n - Experience Level : 1-5\n - Time commitment : Percent (%) of time\n - [ETH/DAI AMT] : For second half payment proposal\n - [DXD AMT] : Vested for 2 years with a 1 year cliff starting the [DATE WORK PERIOD STARTS]\n - [% AMT REP]: For 2 second half payment proposal\n \n # Work Experience\n \n - Prior DXdao work proposals (if applicable)\n - Past Work for DXdao\n - If a developer, Github links\n - If a non-tech worker, doc links or described\n - If new, past relevant work experience\n - Developers : Github profile link\n - Non-tech : suggested Linkedin / other references\n \n", - "name": "Payment Proposal", - "title": "[NAME] Payment Proposal [DATE - DATE]" - }, - { - "description": "## Description \n\n## Proposition \n\n## Action Plan", - "name": "Signal Proposal", - "title": "Signal Proposal for [DAO_ACTION]" - }, - { - "calls": [ - { - "functionName": "approve(address,uint256)", - "params": [ - "0xecA7F78d59D16812948849663b26FE10E320f80C", - "" - ], - "to": "0xdE903E2712288A1dA82942DDdF2c20529565aC30" - }, - { - "functionName": "createDistribution(address[],address,uint256[],uint64,uint64,bool,uint256)", - "params": [ - "[0xdE903E2712288A1dA82942DDdF2c20529565aC30]", - "", - "[]", - "", - "", - "false", - "0" - ], - "to": "0xecA7F78d59D16812948849663b26FE10E320f80C" - } - ], - "description": "Simple description", - "name": "SWPR Farming Campaign", - "title": "[PAIR X/Y] Farming Campaign [DATE - DATE]]" - } - ], - "proposalTypes": [ - { - "id": "contributor", - "scheme": "0x08EEc580AD41e9994599BaD7d2a74A9874A2852c", - "title": "Contributor" - }, - { - "id": "custom", - "title": "Custom" - } - ], - "recommendedCalls": [], - "tokens": [ - { - "address": "0x7f7440C5098462f833E123B44B8A03E1d9785BAb", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://etherscan.io/token/images/1inch_32.png", - "name": "1INCH Token on xDai", - "symbol": "1INCH" - }, - { - "address": "0x7f7440C5098462f833E123B44B8A03E1d9785BAb", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://etherscan.io/token/images/1inch_32.png", - "name": "1INCH Token on xDai", - "symbol": "1INCH" - }, - { - "address": "0xDF613aF6B44a31299E48131e9347F034347E2F00", - "decimals": 18, - "fetchPrice": false, - "logoURI": "ipfs://QmWzL3TSmkMhbqGBEwyeFyWVvLmEo3F44HBMFnmTUiTfp1", - "name": "Aave Token on xDai", - "symbol": "AAVE" - }, - { - "address": "0x3a97704a1b25F08aa230ae53B352e2e72ef52843", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://raw.githubusercontent.com/1Hive/default-token-list/master/src/assets/xdai/0x3a97704a1b25f08aa230ae53b352e2e72ef52843/logo.png", - "name": "Agave Token", - "symbol": "AGVE" - }, - { - "address": "0x7eF541E2a22058048904fE5744f9c7E4C57AF717", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://etherscan.io/token/images/Balancer_32.png", - "name": "Balancer on xDai", - "symbol": "BAL" - }, - { - "address": "0x82dFe19164729949fD66Da1a37BC70dD6c4746ce", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://etherscan.io/token/images/bao_32.png", - "name": "BaoToken on xDai", - "symbol": "BAO" - }, - { - "address": "0x9a495a281D959192343B0e007284bf130bd05F86", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://etherscan.io/token/images/bancor_32.png", - "name": "Bancor Network Token on xDai", - "symbol": "BNT" - }, - { - "address": "0xdd96B45877d0E8361a4DDb732da741e97f3191Ff", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://bscscan.com/token/images/busd_32.png", - "name": "BUSD Token on xDai", - "symbol": "BUSD" - }, - { - "address": "0xDf6FF92bfDC1e8bE45177DC1f4845d391D3ad8fD", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xc00e94Cb662C3520282E6f5717214004A7f26888/logo.png", - "name": "Compound on xDai", - "symbol": "COMP" - }, - { - "address": "0x712b3d230F3C1c19db860d80619288b1F0BDd0Bd", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xD533a949740bb3306d119CC777fa900bA034cd52/logo.png", - "name": "Curve DAO Token on xDai", - "symbol": "CRV" - }, - { - "address": "0xD3D47d5578e55C880505dC40648F7F9307C3e7A8", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/12465/small/defi_pulse_index_set.png", - "name": "DefiPulse Index on xDai", - "symbol": "DPI" - }, - { - "address": "0xb90D6bec20993Be5d72A5ab353343f7a0281f158", - "decimals": 18, - "fetchPrice": true, - "logoURI": "https://s2.coinmarketcap.com/static/img/coins/200x200/5589.png", - "name": "DXdao on xDai", - "symbol": "DXD" - }, - { - "address": "0x75886F00c1a20Ec1511111Fb4Ec3C51de65B1fe7", - "decimals": 18, - "fetchPrice": false, - "name": "FTT on xDai", - "symbol": "FTX" - }, - { - "address": "0x543Ff227F64Aa17eA132Bf9886cAb5DB55DCAddf", - "decimals": 18, - "fetchPrice": true, - "logoURI": "https://assets.coingecko.com/coins/images/3479/thumb/gen.png?1547038215", - "name": "GEN on xDai", - "symbol": "xGEN" - }, - { - "address": "0x9C58BAcC331c9aa871AFD802DB6379a98e80CEdb", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x6810e776880C02933D47DB1b9fc05908e5386b96/logo.png", - "name": "Gnosis Token on xDai", - "symbol": "GNO" - }, - { - "address": "0xFAdc59D012Ba3c110B08A15B7755A5cb7Cbe77D7", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://etherscan.io/token/images/TheGraph_32.png", - "name": "Graph Token on xDai", - "symbol": "GRT" - }, - { - "address": "0xFAdc59D012Ba3c110B08A15B7755A5cb7Cbe77D7", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://etherscan.io/token/images/TheGraph_32.png", - "name": "Graph Token on xDai", - "symbol": "GRT" - }, - { - "address": "0xb0C5f3100A4d9d9532a4CfD68c55F1AE8da987Eb", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/14551/small/jN3kkqke_400x400.png", - "name": "DAOhaus Token on xDai", - "symbol": "HAUS" - }, - { - "address": "0x71850b7E9Ee3f13Ab46d67167341E4bDc905Eef9", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://raw.githubusercontent.com/1Hive/default-token-list/master/src/assets/xdai/0x71850b7E9Ee3f13Ab46d67167341E4bDc905Eef9/logo.png", - "name": "Honey", - "symbol": "HNY" - }, - { - "address": "0xD057604A14982FE8D88c5fC25Aac3267eA142a08", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://raw.githubusercontent.com/balancer-labs/assets/master/assets/0xf5581dfefd8fb0e4aec526be659cfab1f8c781da.png", - "name": "HOPR Token on xDai", - "symbol": "HOPR" - }, - { - "address": "0xE2e73A1c69ecF83F464EFCE6A5be353a37cA09b2", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x514910771AF9Ca656af840dff83E8264EcF986CA/logo.png", - "name": "ChainLink Token on xDai", - "symbol": "LINK" - }, - { - "address": "0xE2e73A1c69ecF83F464EFCE6A5be353a37cA09b2", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x514910771AF9Ca656af840dff83E8264EcF986CA/logo.png", - "name": "ChainLink Token on xDai", - "symbol": "LINK" - }, - { - "address": "0x2bE73bFeEC620aa9B67535A4D3827bB1e29436D1", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://etherscan.io/token/images/lrc_32.png", - "name": "LoopringCoin V2 on xDai", - "symbol": "LRC" - }, - { - "address": "0x5fd896D248fbfa54d26855C267859eb1b4DAEe72", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x9f8F72aA9304c8B593d555F12eF6589cC3A579A2/logo.png", - "name": "Maker on xDai", - "symbol": "MKR" - }, - { - "address": "0x7ecF26cd9A36990b8ea477853663092333f59979", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/12381/large/token_2000x2000.png?1615791204", - "name": "Perpetual on xDai", - "symbol": "PERP" - }, - { - "address": "0x37b60f4E9A31A64cCc0024dce7D0fD07eAA0F7B3", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://etherscan.io/token/images/kelros_28.png", - "name": "Pinakion on xDai", - "symbol": "PNK" - }, - { - "address": "0x0da1a02CDF84C44021671d183d616925164E08Aa", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x408e41876cCCDC0F92210600ef50372656052a38/logo.png", - "name": "Republic Token on xDai", - "symbol": "REN" - }, - { - "address": "0x4A88248BAa5b39bB4A9CAa697Fb7f8ae0C3f0ddB", - "decimals": 8, - "fetchPrice": false, - "logoURI": "https://etherscan.io/token/images/renbtc_32.png", - "name": "renBTC on xDai", - "symbol": "renBTC" - }, - { - "address": "0x3A00E08544d589E19a8e7D97D0294331341cdBF6", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/3406/small/SNX.png", - "name": "Synthetix Network Token on xDai", - "symbol": "SNX" - }, - { - "address": "0xb7D311E2Eb55F2f68a9440da38e7989210b9A05e", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x0Ae055097C6d159879521C384F1D2123D1f195e6/logo.png", - "name": "STAKE on xDai", - "symbol": "STAKE" - }, - { - "address": "0xB1950Fb2C9C0CbC8553578c67dB52Aa110A93393", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x57Ab1ec28D129707052df4dF418D58a2D46d5f51/logo.png", - "name": "Synth sUSD on xDai", - "symbol": "sUSD" - }, - { - "address": "0x2995D1317DcD4f0aB89f4AE60F3f020A4F17C7CE", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://etherscan.io/token/images/sushiswap_32.png", - "name": "SushiToken on xDai", - "symbol": "SUSHI" - }, - { - "address": "0x2995D1317DcD4f0aB89f4AE60F3f020A4F17C7CE", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://etherscan.io/token/images/sushiswap_32.png", - "name": "SushiToken on xDai", - "symbol": "SUSHI" - }, - { - "address": "0x0116e28B43A358162B96f70B4De14C98A4465f25", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://etherscan.io/token/images/UniCrypt_32.png", - "name": "UniCrypt on xDai", - "symbol": "UNCX" - }, - { - "address": "0x4537e328Bf7e4eFA29D05CAeA260D7fE26af9D74", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://cloudflare-ipfs.com/ipfs/QmXttGpZrECX5qCyXbBQiqgQNytVGeZW5Anewvh2jc4psg/", - "name": "Uniswap on xDai", - "symbol": "UNI" - }, - { - "address": "0xDDAfbb505ad214D7b80b1f830fcCc89B60fb7A83", - "decimals": 6, - "fetchPrice": true, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48/logo.png", - "name": "USDC on xDai", - "symbol": "USDC" - }, - { - "address": "0x4ECaBa5870353805a9F068101A40E0f32ed605C6", - "decimals": 6, - "fetchPrice": true, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xdAC17F958D2ee523a2206206994597C13D831ec7/logo.png", - "name": "Tether USD on xDai", - "symbol": "USDT" - }, - { - "address": "0x8e5bBbb09Ed1ebdE8674Cda39A0c169401db4252", - "decimals": 8, - "fetchPrice": true, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x2260FAC5E5542a773Aa44fBCfeDf7C193bc2C599/logo.png", - "name": "Wrapped BTC on xDai", - "symbol": "WBTC" - }, - { - "address": "0x6A023CCd1ff6F2045C3309768eAd9E68F978f6e1", - "decimals": 18, - "fetchPrice": true, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2/logo.png", - "name": "Wrapped Ether on xDai", - "symbol": "WETH" - }, - { - "address": "0xe91D153E0b41518A2Ce8Dd3D7944Fa863463a97d", - "decimals": 18, - "fetchPrice": true, - "logoURI": "https://raw.githubusercontent.com/1Hive/default-token-list/master/src/assets/xdai/0xe91d153e0b41518a2ce8dd3d7944fa863463a97d/logo.png", - "name": "Wrapped XDAI", - "symbol": "WXDAI" - }, - { - "address": "0xbf65bfcb5da067446CeE6A706ba3Fe2fB1a9fdFd", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e/logo.png", - "name": "Yearn Finance on xDai", - "symbol": "YFI" - }, - { - "address": "0xbf65bfcb5da067446CeE6A706ba3Fe2fB1a9fdFd", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://raw.githubusercontent.com/trustwallet/assets/master/blockchains/ethereum/assets/0x0bc529c00C6401aEF6D220BE8C6Ea1667F6Ad93e/logo.png", - "name": "yearn.finance on xDai", - "symbol": "YFI" - }, - { - "address": "0x543ff227f64aa17ea132bf9886cab5db55dcaddf", - "decimals": 18, - "fetchPrice": false, - "logoURI": "https://assets.coingecko.com/coins/images/3479/thumb/gen.png?1547038215", - "name": "DAOstack", - "symbol": "GEN" - } - ], "version": 1 -} \ No newline at end of file +} diff --git a/src/contexts/Guilds/orbis.tsx b/src/contexts/Guilds/orbis.tsx index 1db37293e..295520a4d 100644 --- a/src/contexts/Guilds/orbis.tsx +++ b/src/contexts/Guilds/orbis.tsx @@ -1,5 +1,5 @@ import { Orbis } from '@orbisclub/orbis-sdk'; -import { useState, createContext } from 'react'; +import { useState, createContext, useContext } from 'react'; import { useSigner } from 'wagmi'; import { sleep } from 'utils'; @@ -70,3 +70,5 @@ export const OrbisProvider = ({ children }) => { ); }; + +export const useOrbisContext = () => useContext(OrbisContext); diff --git a/src/hooks/Guilds/ipfs/usePinataIPFS.ts b/src/hooks/Guilds/ipfs/usePinataIPFS.ts index 5b189b2c7..7bd35d0e3 100644 --- a/src/hooks/Guilds/ipfs/usePinataIPFS.ts +++ b/src/hooks/Guilds/ipfs/usePinataIPFS.ts @@ -30,6 +30,7 @@ const usePinataIPFS = () => { let url: string; const headers = { 'Content-Type': 'application/json', + Accept: 'Accept: text/plain', Authorization: `Bearer ${DEFAULT_API_KEY}`, }; diff --git a/src/hooks/Guilds/useProposalMetadata.ts b/src/hooks/Guilds/useProposalMetadata.ts index 9c67d8832..cfe4b30d7 100644 --- a/src/hooks/Guilds/useProposalMetadata.ts +++ b/src/hooks/Guilds/useProposalMetadata.ts @@ -1,13 +1,13 @@ import useIPFSFile from 'hooks/Guilds/ipfs/useIPFSFile'; -import { useContext, useMemo, useEffect, useState } from 'react'; +import { useMemo, useEffect, useState } from 'react'; import { ProposalMetadata } from 'types/types.guilds'; import contentHash from '@ensdomains/content-hash'; import useProposal from 'Modules/Guilds/Hooks/useProposal'; -import { OrbisContext } from 'contexts/Guilds/orbis'; +import { useOrbisContext } from 'contexts/Guilds/orbis'; function useProposalMetadata(guildId: string, proposalId: `0x${string}`) { const { data: proposal, error } = useProposal(guildId, proposalId); - const { orbis } = useContext(OrbisContext); + const { orbis } = useOrbisContext(); const [orbisData, setOrbisData] = useState(); const { decodedContentHash, decodeError } = useMemo(() => { diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index 865412a0f..2ed0ac6fc 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -270,7 +270,7 @@ "errorWhileUploading": "Error while uploading to IPFS", "couldntUploadToPinata": "Couldn't upload and pin to Pinata" }, - "createAnyway": "Create anyways", + "createAnyway": "Create anyway", "retry": "Retry", "error": "Error", "displayRawData": "Display Raw Data", @@ -307,6 +307,10 @@ "postboxConnectCeramicButton": "Generate Ceramic Session", "postboxEditCancel": "Cancel", "postboxEditSave": "Save", + "removalMessage1": "Are you sure you want to remove this post?", + "removalMessage2": "This uses your moderator powers and should only be done for inappropriate content.", + "deletionMessage1": "Are you sure you want to delete this post?", + "deletionMessage2": "If you ask for deletion your post might be removed from the Ceramic nodes hosting it.", "postActions": { "reply": "Reply", "toggleThread": "Toggle thread", diff --git a/src/provider/chains.ts b/src/provider/chains.ts index 95b857da7..be9dd425d 100644 --- a/src/provider/chains.ts +++ b/src/provider/chains.ts @@ -27,9 +27,6 @@ export const chains: Chain[] = [ 'https://eth-mainnet.gateway.pokt.network/v1/lb/dda01e253305bbeac6507a80', }, }, - chain.goerli, - chain.arbitrum, - chain.arbitrumGoerli, gnosisChain, ]; @@ -51,8 +48,8 @@ if (process.env.NODE_ENV === 'development') { }, testnet: true, }; - chains.push(localhost); + chains.push(chain.goerli); } export const getBlockExplorerUrl = ( diff --git a/src/richContracts.json b/src/richContracts.json index 97774b83b..b7e0ab81c 100644 --- a/src/richContracts.json +++ b/src/richContracts.json @@ -373,5 +373,70 @@ "spendsTokens": true } ] + }, + { + "title": "Llama pay vesting stream", + "tags": ["llama", "payment", "stream"], + "networks": { + "100": "0xb93427b83573c8f27a08a909045c3e809610411a" + }, + "functions": [ + { + "title": "Deploy vesting contract", + "functionName": "deploy_vesting_contract", + "params": [ + { + "type": "address", + "component": "tokenPicker", + "name": "token", + "title": "Token", + "description": "Token to stream" + }, + { + "type": "address", + "component": "address", + "name": "recipient", + "title": "Recipient", + "defaultValue": "", + "description": "Receiving address of tokens" + }, + { + "type": "uint256", + "component": "tokenAmount", + "name": "amount", + "title": "Amount", + "description": "Number of tokens to stream" + }, + { + "type": "uint256", + "component": "time", + "name": "vesting_duration", + "title": "Duration", + "defaultValue": "", + "description": "How long before stream finishes fully" + }, + { + "type": "uint256", + "component": "date", + "name": "vesting_start", + "title": "Start time", + "defaultValue": "", + "description": "Starting time for stream" + }, + { + "type": "uint256", + "component": "time", + "name": "cliff_length", + "title": "Cliff length", + "defaultValue": "0", + "description": "How long before cliff (receiver can start withdrawing)" + } + ], + "shortDescription": "Creates streaming contract with optional cliff ", + "longDescription": "Factory contract that creates streaming contract with optional cliff for ERC20 tokens. Only receiver can withdraw, owner can rugpull.", + "spendsTokens": true, + "templateLiteral": "Vest ${amount} ${token} for ${vesting_duration} with ${cliff_length} cliff for ${recipient}" + } + ] } ] diff --git a/yarn.lock b/yarn.lock index 1adf52651..49e3fd372 100644 --- a/yarn.lock +++ b/yarn.lock @@ -23341,11 +23341,16 @@ prettier@2.6.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.3.0.tgz#b6a5bf1284026ae640f17f7ff5658a7567fc0d18" integrity sha512-kXtO4s0Lz/DW/IJ9QdWhAf7/NmPWQXkFr/r/WkR3vyI+0v8amTDxiaQSLzs8NBlytfLWX/7uQUMIW677yLKl4w== -prettier@^2.0.5, prettier@^2.1.2, prettier@^2.7.1: +prettier@^2.0.5, prettier@^2.1.2: version "2.7.1" resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== +prettier@^2.8.1: + version "2.8.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.8.2.tgz#c4ea1b5b454d7c4b59966db2e06ed7eec5dfd160" + integrity sha512-BtRV9BcncDyI2tsuS19zzhzoxD8Dh8LiCx7j7tHzrkz8GFXAexeWFdi22mjE1d16dftH2qNaytVxqiRTGlMfpw== + pretty-bytes@^5.3.0, pretty-bytes@^5.4.1, pretty-bytes@^5.6.0: version "5.6.0" resolved "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.6.0.tgz#356256f643804773c82f64723fe78c92c62beaeb" From 64aebf0ffe949e887f48ebff57876dbd7d226afc Mon Sep 17 00:00:00 2001 From: Madusha Prasanjith Date: Wed, 11 Jan 2023 19:25:36 +0100 Subject: [PATCH 02/20] fix: Add functionTitle to useDecodedCall results. --- src/hooks/Guilds/contracts/useDecodedCall.ts | 20 ++------------------ 1 file changed, 2 insertions(+), 18 deletions(-) diff --git a/src/hooks/Guilds/contracts/useDecodedCall.ts b/src/hooks/Guilds/contracts/useDecodedCall.ts index b7106bc01..c28529d8e 100644 --- a/src/hooks/Guilds/contracts/useDecodedCall.ts +++ b/src/hooks/Guilds/contracts/useDecodedCall.ts @@ -161,24 +161,7 @@ export const decodeCall = async ( }; } if (!matchedContract) { - decodedCall = { - callType: SupportedAction.RAW_TRANSACTION, - from: call.from, - to: call.to, - value: call.value, - function: null, - args: {}, - optionalProps: { - data: call.data, - }, - }; - - return { - id: `action-${Math.random()}`, - decodedCall, - contract: null, - approval: call.approval || null, - }; + return null; } const { callType, contractInterface } = matchedContract; @@ -196,6 +179,7 @@ export const decodeCall = async ( option.functionName === decodedCall.function.name && option.params.length === decodedCall.function.inputs.length ); + decodedCall.functionTitle = decodedCall.richFunctionData?.title; } return { From e74205216fc1afd19f0cf859d84f621fcce13f6e Mon Sep 17 00:00:00 2001 From: rossneilson Date: Wed, 11 Jan 2023 18:26:12 +0000 Subject: [PATCH 03/20] Fixing token picker input close --- .../TokenPickerInput/TokenPickerInput.tsx | 41 ++++++++++--------- 1 file changed, 22 insertions(+), 19 deletions(-) diff --git a/src/components/TokenPickerInput/TokenPickerInput.tsx b/src/components/TokenPickerInput/TokenPickerInput.tsx index dd6bed0a2..c58bbd599 100644 --- a/src/components/TokenPickerInput/TokenPickerInput.tsx +++ b/src/components/TokenPickerInput/TokenPickerInput.tsx @@ -27,25 +27,28 @@ const TokenPickerInput: React.FC = ({ return tokens.find(({ address }) => address === token); }, [tokens, token]); - + console.log({ isTokenPickerOpen }); return ( -
setIsTokenPickerOpen(true)}> - - {token && ( - - )} -
- } - iconRight={} - /> + <> +
setIsTokenPickerOpen(true)}> + + {token && ( + + )} +
+ } + iconRight={} + /> + + = ({ setIsTokenPickerOpen(false); }} /> - + ); }; From 5e2de9beb5f1892c894fc347796e7beda83fbe96 Mon Sep 17 00:00:00 2001 From: Madusha Prasanjith Date: Thu, 12 Jan 2023 00:29:12 +0100 Subject: [PATCH 04/20] fix: Remove unneeded code changes. --- src/hooks/Guilds/contracts/useDecodedCall.ts | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/src/hooks/Guilds/contracts/useDecodedCall.ts b/src/hooks/Guilds/contracts/useDecodedCall.ts index c28529d8e..b49fccc21 100644 --- a/src/hooks/Guilds/contracts/useDecodedCall.ts +++ b/src/hooks/Guilds/contracts/useDecodedCall.ts @@ -161,7 +161,24 @@ export const decodeCall = async ( }; } if (!matchedContract) { - return null; + decodedCall = { + callType: SupportedAction.RAW_TRANSACTION, + from: call.from, + to: call.to, + value: call.value, + function: null, + args: {}, + optionalProps: { + data: call.data, + }, + }; + + return { + id: `action-${Math.random()}`, + decodedCall, + contract: null, + approval: call.approval || null, + }; } const { callType, contractInterface } = matchedContract; From 8f2b0146372ae92a16842f52e962da296a8b5025 Mon Sep 17 00:00:00 2001 From: Madusha Prasanjith Date: Thu, 12 Jan 2023 14:10:32 +0100 Subject: [PATCH 05/20] fix: Handle edge case when the same contract is in both core actions and rich contract registry. --- src/hooks/Guilds/contracts/useDecodedCall.ts | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/hooks/Guilds/contracts/useDecodedCall.ts b/src/hooks/Guilds/contracts/useDecodedCall.ts index b49fccc21..2691cd0a5 100644 --- a/src/hooks/Guilds/contracts/useDecodedCall.ts +++ b/src/hooks/Guilds/contracts/useDecodedCall.ts @@ -143,11 +143,21 @@ export const decodeCall = async ( } // Detect using the rich contract data registry. - const matchedRichContractData = contracts?.find( + let matchedRichContractData = contracts?.find( contract => contract.networks[chainId].toLocaleLowerCase() === call.to.toLocaleLowerCase() ); + + // Edge case when the same contract is in both core actions and rich contract registry + try { + matchedRichContractData.contractInterface.getFunction( + call.data.substring(0, 10) + ); + } catch (e) { + matchedRichContractData = null; + } + let matchedContract = matchedRichContractData ? getContractInterfaceFromRichContractData(matchedRichContractData) : getContractFromKnownSighashes(call.data); From 459898435f0dabe185fd06c8b3eb6f86de516922 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Thu, 12 Jan 2023 13:11:11 +0000 Subject: [PATCH 06/20] Removing console log --- src/components/TokenPickerInput/TokenPickerInput.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/TokenPickerInput/TokenPickerInput.tsx b/src/components/TokenPickerInput/TokenPickerInput.tsx index c58bbd599..3076958e9 100644 --- a/src/components/TokenPickerInput/TokenPickerInput.tsx +++ b/src/components/TokenPickerInput/TokenPickerInput.tsx @@ -27,7 +27,7 @@ const TokenPickerInput: React.FC = ({ return tokens.find(({ address }) => address === token); }, [tokens, token]); - console.log({ isTokenPickerOpen }); + return ( <>
setIsTokenPickerOpen(true)}> From 55b99fe5a8afdabbc94b00c85df3134e3d856409 Mon Sep 17 00:00:00 2001 From: Madusha Prasanjith Date: Thu, 12 Jan 2023 15:20:42 +0100 Subject: [PATCH 07/20] fix: Race condition with call decoding in useProposalCalls. --- src/Modules/Guilds/Hooks/useProposalCalls.ts | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/Modules/Guilds/Hooks/useProposalCalls.ts b/src/Modules/Guilds/Hooks/useProposalCalls.ts index 8196ce0bd..a97e13751 100644 --- a/src/Modules/Guilds/Hooks/useProposalCalls.ts +++ b/src/Modules/Guilds/Hooks/useProposalCalls.ts @@ -88,9 +88,12 @@ const useProposalCalls = (guildId: string, proposalId: `0x${string}`) => { }, [calls, callsPerOption, totalOptionsNum]); useEffect(() => { + let cancelled = false; + if (!guildId || !proposalId || !splitCalls || !loaded) { setOptions([]); - return; + + return () => {}; } async function decodeOptions() { const encodedOptions: Option[] = await Promise.all( @@ -152,10 +155,16 @@ const useProposalCalls = (guildId: string, proposalId: `0x${string}`) => { return bulkDecodeCallsFromOptions(encodedOptions, contracts, chain?.id); } - decodeOptions().then(options => - // Return options putting default against-call last - setOptions([...options.slice(1), options[0]]) - ); + decodeOptions().then(options => { + if (!cancelled) { + // Return options putting default against-call last + setOptions([...options.slice(1), options[0]]); + } + }); + + return () => { + cancelled = true; + }; // eslint-disable-next-line react-hooks/exhaustive-deps }, [ guildId, From 7f4e54b3cd4d468d467b402668588b866e95c3e6 Mon Sep 17 00:00:00 2001 From: Madusha Prasanjith Date: Thu, 12 Jan 2023 16:44:12 +0100 Subject: [PATCH 08/20] fix: Decimal handling in ERC20TransferEditor. --- .../ERC20Transfer/ERC20TransferEditor.tsx | 4 ++-- src/components/primitives/Forms/TokenAmountInput.tsx | 11 +++++++++++ 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/components/ActionsBuilder/SupportedActions/ERC20Transfer/ERC20TransferEditor.tsx b/src/components/ActionsBuilder/SupportedActions/ERC20Transfer/ERC20TransferEditor.tsx index 99e64e8f5..25927c57d 100644 --- a/src/components/ActionsBuilder/SupportedActions/ERC20Transfer/ERC20TransferEditor.tsx +++ b/src/components/ActionsBuilder/SupportedActions/ERC20Transfer/ERC20TransferEditor.tsx @@ -79,7 +79,7 @@ const ERC20TransferEditor: React.FC = ({ } }, [decodedCall, tokens]); - const { control, handleSubmit } = useForm({ + const { control, handleSubmit, getValues } = useForm({ resolver: validateERC20Transfer, context: { t }, defaultValues: parsedData, @@ -158,7 +158,7 @@ const ERC20TransferEditor: React.FC = ({ diff --git a/src/components/primitives/Forms/TokenAmountInput.tsx b/src/components/primitives/Forms/TokenAmountInput.tsx index 44e0f8369..4a427c4a3 100644 --- a/src/components/primitives/Forms/TokenAmountInput.tsx +++ b/src/components/primitives/Forms/TokenAmountInput.tsx @@ -4,6 +4,7 @@ import useStringToBigNumber from 'hooks/Guilds/conversions/useStringToBigNumber' import { useEffect, useState } from 'react'; import { InputProps } from 'components/primitives/Forms/Input'; import { NumericalInput } from 'components/primitives/Forms/NumericalInput'; +import { usePrevious } from 'utils'; export interface TokenAmountInputProps extends InputProps { decimals?: number; @@ -22,6 +23,16 @@ export const TokenAmountInput: React.FC = ({ const valueAsString = useBigNumberToString(value, decimals); + const prevDecimals = usePrevious(decimals); + useEffect(() => { + if (prevDecimals && decimals && prevDecimals !== decimals && value) { + const valueNew = BigNumber.from(value) + .div(BigNumber.from(10).pow(prevDecimals)) + .mul(BigNumber.from(10).pow(decimals)); + onChange(valueNew); + } + }, [prevDecimals, decimals, value, onChange]); + useEffect(() => { if (localAmount === '' && localAmount !== valueAsString) { setLocalAmount(valueAsString); From ae997cc4e333e69d3c2df5e1e41fb6236fc127c7 Mon Sep 17 00:00:00 2001 From: Madusha Prasanjith Date: Thu, 12 Jan 2023 16:46:18 +0100 Subject: [PATCH 09/20] chore: Fix typo in call details. --- src/components/ActionsBuilder/CallDetails/CallDetails.tsx | 2 +- src/locales/en/translation.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/ActionsBuilder/CallDetails/CallDetails.tsx b/src/components/ActionsBuilder/CallDetails/CallDetails.tsx index 1d5584886..6096aaca4 100644 --- a/src/components/ActionsBuilder/CallDetails/CallDetails.tsx +++ b/src/components/ActionsBuilder/CallDetails/CallDetails.tsx @@ -155,7 +155,7 @@ export const CallDetails: React.FC = ({ variant={'secondary'} onClick={() => setDisplayRichData(v => !v)} > - {displayRichData ? t('displayRawData') : t('displayFormatedData')} + {displayRichData ? t('displayRawData') : t('displayFormattedData')} )} diff --git a/src/locales/en/translation.json b/src/locales/en/translation.json index 865412a0f..8426ac7dd 100644 --- a/src/locales/en/translation.json +++ b/src/locales/en/translation.json @@ -274,7 +274,7 @@ "retry": "Retry", "error": "Error", "displayRawData": "Display Raw Data", - "displayFormatedData": "Display Formated Data", + "displayFormattedData": "Display Formatted Data", "approveSpendingCall": "Approve spending call", "addressToWhichTheExpenseIsBeingAuthorized": "Address to which the expense is being authorized", "amountBeingApproved": "Amount being approved", From 726c2b6ea5c2a67a56142b951de63c1121d180b3 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Thu, 12 Jan 2023 17:48:46 +0000 Subject: [PATCH 10/20] Fixing tenderly to use roots and work for spending calls --- src/hooks/Guilds/useTenderlyApi/index.ts | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/src/hooks/Guilds/useTenderlyApi/index.ts b/src/hooks/Guilds/useTenderlyApi/index.ts index 9bb103932..47d0a45f5 100644 --- a/src/hooks/Guilds/useTenderlyApi/index.ts +++ b/src/hooks/Guilds/useTenderlyApi/index.ts @@ -26,16 +26,29 @@ export const useTransactionSimulation = () => { for (let i = 0; i < options.length; i++) { await forkProvider.send('evm_revert', [forkStartingPoint]); // Reset fork let currentOption = options[i]; - + let numberOfSpendingCalls = 0; for (let j = 0; j < currentOption.actions.length; j++) { let currentAction = currentOption.actions[j]; let simulationResult = await simulateAction( forkUrl, + currentOption.decodedActions[j - (numberOfSpendingCalls + 1)] + ?.simulationResult.simulation.id, currentAction, chain?.id ); - currentOption.decodedActions[j].simulationResult = - await simulationResult; + if ( + currentOption.decodedActions[j - (numberOfSpendingCalls + 1)] + ?.approval + ) { + currentOption.decodedActions[ + j - (numberOfSpendingCalls + 1) + ].simulationResult = await simulationResult; + numberOfSpendingCalls++; + } else { + currentOption.decodedActions[ + j - numberOfSpendingCalls + ].simulationResult = await simulationResult; + } if (simulationResult.transaction.status === false) failedTransactions++; @@ -84,6 +97,7 @@ const getForkData = async (chainId: number, provider) => { const simulateAction = async ( forkUrl: string, + rootSimualtionId: string, action: Call, chainId: number ) => { @@ -100,6 +114,8 @@ const simulateAction = async ( input, gas: 800000, gas_price: '0', + root: rootSimualtionId, + // Tenderly returns 400 when value > amount in account, handle this to test value properly value: 0, save_if_fails: true, save: true, From ce59df1a69e1a38f18a3ce6d604da0fb0ceae870 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Thu, 12 Jan 2023 18:43:59 +0000 Subject: [PATCH 11/20] feat: Adding timestamp to discussions --- src/Modules/Guilds/pages/Discussion/Discussion.styled.tsx | 6 ++++++ src/Modules/Guilds/pages/Discussion/Discussion.tsx | 8 ++++++-- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/Modules/Guilds/pages/Discussion/Discussion.styled.tsx b/src/Modules/Guilds/pages/Discussion/Discussion.styled.tsx index 0d0d8fca3..8d279d76d 100644 --- a/src/Modules/Guilds/pages/Discussion/Discussion.styled.tsx +++ b/src/Modules/Guilds/pages/Discussion/Discussion.styled.tsx @@ -57,3 +57,9 @@ export const ActionsGroup = styled(Box)` gap: 1rem; margin: 1rem; `; + +export const PostDetailsRow = styled(Box)` + display: flex; + align-items: center; + gap: 1rem; +`; diff --git a/src/Modules/Guilds/pages/Discussion/Discussion.tsx b/src/Modules/Guilds/pages/Discussion/Discussion.tsx index a3844cd5f..59d27ed80 100644 --- a/src/Modules/Guilds/pages/Discussion/Discussion.tsx +++ b/src/Modules/Guilds/pages/Discussion/Discussion.tsx @@ -14,6 +14,7 @@ import { PageContent, PageHeader, PageTitle, + PostDetailsRow, StyledIconButton, } from './Discussion.styled'; import { useTranslation } from 'react-i18next'; @@ -24,6 +25,7 @@ import useDiscussionContext from 'Modules/Guilds/Hooks/useDiscussionContext'; import { useOrbisContext } from 'contexts/Guilds/orbis'; import { StyledButton } from 'Modules/Guilds/styles'; import PostActions from 'components/Discussion/Post/PostActions'; +import moment from 'moment'; const DiscussionPage: React.FC = () => { const { t } = useTranslation(); @@ -85,8 +87,10 @@ const DiscussionPage: React.FC = () => { )} - - + + + {op?.timestamp && moment.unix(op.timestamp).fromNow()} + Date: Fri, 13 Jan 2023 17:53:33 +0000 Subject: [PATCH 12/20] feat: Adding sentry with scrubbing --- package.json | 4 +- src/configs/index.ts | 1 + src/index.tsx | 32 +++++++++++++++- yarn.lock | 89 +++++++++++++++++++++++++++++++++++++++++++- 4 files changed, 123 insertions(+), 3 deletions(-) diff --git a/package.json b/package.json index 27c524d83..813ddbc47 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,8 @@ "@nomiclabs/hardhat-truffle5": "^2.0.5", "@nomiclabs/hardhat-web3": "^2.0.0", "@orbisclub/orbis-sdk": "^0.3.80", + "@sentry/integrations": "^7.30.0", + "@sentry/react": "^7.30.0", "@tiptap/extension-focus": "^2.0.0-beta.39", "@tiptap/extension-highlight": "^2.0.0-beta.32", "@tiptap/extension-placeholder": "^2.0.0-beta.48", @@ -202,4 +204,4 @@ "text-summary" ] } -} \ No newline at end of file +} diff --git a/src/configs/index.ts b/src/configs/index.ts index 0c34b7332..1dc582cc7 100644 --- a/src/configs/index.ts +++ b/src/configs/index.ts @@ -1,6 +1,7 @@ export const RICH_CONTRACT_DATA_REGISTRY = 'QmeacC3QZgWaYYrd6m4b7dbBQVEZcgei5XFhxrq5czn5u3'; export const SITE_ID = 'NYKJUYYQ'; +export const SENTRY_ID = '4504496775561216' export const moderators = [ '0x0b17cf48420400e1D71F8231d4a8e43B3566BB5B', '0x91aef3c3b9bab2c306548269ff9b6771f2b107d8', diff --git a/src/index.tsx b/src/index.tsx index 72d6455ca..d74dd35fb 100644 --- a/src/index.tsx +++ b/src/index.tsx @@ -12,7 +12,9 @@ import EnsureReadOnlyConnection from 'components/Web3Modals/EnsureReadOnlyConnec import SyncRouterWithWagmi from 'components/Web3Modals/SyncRouterWithWagmi'; import { useEffect } from 'react'; import { loadFathom } from 'analytics/fathom'; -import { SITE_ID } from 'configs'; +import { SENTRY_ID, SITE_ID } from 'configs'; +import * as Sentry from '@sentry/react'; +import { CaptureConsole } from '@sentry/integrations'; const { provider, webSocketProvider } = configureChains(chains, providers); @@ -45,6 +47,34 @@ const Root = () => { }); }, []); + Sentry.init({ + dsn: `https://8df1b391b909437e9bb78de5d9128eba@o425302.ingest.sentry.io/${SENTRY_ID}`, + tunnel: 'https://sentry.project-davi.dev/api', + integrations: [ + new CaptureConsole({ + levels: ['error'], + }), + ], + beforeSend(event) { + const regex = /0x(([a-fA-F0-9]{64})|([a-fA-F0-9]{40}))/g; + const ensRegex = /((["' ])(\w+.eth)(["' ]))/g; + const jsonString = JSON.stringify(event); + const scrubbedString = jsonString.replace(regex, `0xScrubbed`); + const veryScrubbedString = scrubbedString.replace( + ensRegex, + `"ENS_SCRUBBED"` + ); + var scrubbedEvent: any = { request: {} }; + try { + scrubbedEvent = JSON.parse(veryScrubbedString); + } catch (e) { + console.error({ e }); + } + scrubbedEvent.request = event.request; + return scrubbedEvent; + }, + }); + return ( diff --git a/yarn.lock b/yarn.lock index 49e3fd372..5f8338044 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4049,6 +4049,17 @@ "@noble/hashes" "~1.1.1" "@scure/base" "~1.1.0" +"@sentry/browser@7.30.0": + version "7.30.0" + resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-7.30.0.tgz#9b4387da933290546b7a4ef521713c38723a0213" + integrity sha512-9hpaNAqIBDLdnrZ51iWkqenRotqqweE1f2AlHO56nyT/UE+u+GdmAiBrgRNqdFQQM13JtTG/gu4HGOyLWb9HEA== + dependencies: + "@sentry/core" "7.30.0" + "@sentry/replay" "7.30.0" + "@sentry/types" "7.30.0" + "@sentry/utils" "7.30.0" + tslib "^1.9.3" + "@sentry/core@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/core/-/core-5.30.0.tgz#6b203664f69e75106ee8b5a2fe1d717379b331f3" @@ -4060,6 +4071,15 @@ "@sentry/utils" "5.30.0" tslib "^1.9.3" +"@sentry/core@7.30.0": + version "7.30.0" + resolved "https://registry.yarnpkg.com/@sentry/core/-/core-7.30.0.tgz#02d2e8747484ba64b6d712e8afe6736250efdc26" + integrity sha512-NeLigkBlpcK63ymM63GoIHurml6V3BUe1Vi+trwm4/qqOTzT7PQhvdJCX+o3+atzRBH+zdb6kd4VWx44Oye3KA== + dependencies: + "@sentry/types" "7.30.0" + "@sentry/utils" "7.30.0" + tslib "^1.9.3" + "@sentry/hub@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/hub/-/hub-5.30.0.tgz#2453be9b9cb903404366e198bd30c7ca74cdc100" @@ -4069,6 +4089,16 @@ "@sentry/utils" "5.30.0" tslib "^1.9.3" +"@sentry/integrations@^7.30.0": + version "7.30.0" + resolved "https://registry.yarnpkg.com/@sentry/integrations/-/integrations-7.30.0.tgz#ebba2559b6f7a67912cd13153fcfa751dd415f02" + integrity sha512-KU8TnJm1Yldxnhdu/EZcIGXU9ptGQPk6ot4smcNx/mKsy575VrDdyVDx8uIYURWyfsg7eOayt6VdC7ISSODp8A== + dependencies: + "@sentry/types" "7.30.0" + "@sentry/utils" "7.30.0" + localforage "^1.8.1" + tslib "^1.9.3" + "@sentry/minimal@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/minimal/-/minimal-5.30.0.tgz#ce3d3a6a273428e0084adcb800bc12e72d34637b" @@ -4093,6 +4123,26 @@ lru_map "^0.3.3" tslib "^1.9.3" +"@sentry/react@^7.30.0": + version "7.30.0" + resolved "https://registry.yarnpkg.com/@sentry/react/-/react-7.30.0.tgz#01050ba6e11b8c51c1cb44c76799b2e189762482" + integrity sha512-yn0GiRewi/Gcig2Fkps95l96zOwiKxQacv3T83bBzlFIuO0vBWqV6imOcJKt4gxU9JoX6RGf9UqeACxzJlDqNg== + dependencies: + "@sentry/browser" "7.30.0" + "@sentry/types" "7.30.0" + "@sentry/utils" "7.30.0" + hoist-non-react-statics "^3.3.2" + tslib "^1.9.3" + +"@sentry/replay@7.30.0": + version "7.30.0" + resolved "https://registry.yarnpkg.com/@sentry/replay/-/replay-7.30.0.tgz#44db86956166fc8909459eef8ce94f750c072519" + integrity sha512-qJgz1tG0uStqMF5V7gN7KqxZuZY0MMQQY7siwPcSQVYj7X3AQswHjmvD4npEKbIa+jP6aQ6fFjoBjl3c0t3Mmg== + dependencies: + "@sentry/core" "7.30.0" + "@sentry/types" "7.30.0" + "@sentry/utils" "7.30.0" + "@sentry/tracing@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-5.30.0.tgz#501d21f00c3f3be7f7635d8710da70d9419d4e1f" @@ -4104,11 +4154,26 @@ "@sentry/utils" "5.30.0" tslib "^1.9.3" +"@sentry/tracing@^7.30.0": + version "7.30.0" + resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.30.0.tgz#b4576fbaf81ce418f1b7c37e7e5f4f6cf19a3c3b" + integrity sha512-bjGeDeKhpGAmLcWcrXFT/xOfHVwp/j0L1aRHzYHnqgTjVzD0NXcooPu/Nz8vF0paxz+hPD5bJwb8kz/ggJzGWQ== + dependencies: + "@sentry/core" "7.30.0" + "@sentry/types" "7.30.0" + "@sentry/utils" "7.30.0" + tslib "^1.9.3" + "@sentry/types@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" integrity sha512-R8xOqlSTZ+htqrfteCWU5Nk0CDN5ApUTvrlvBuiH1DyP6czDZ4ktbZB0hAgBlVcK0U+qpD3ag3Tqqpa5Q67rPw== +"@sentry/types@7.30.0": + version "7.30.0" + resolved "https://registry.yarnpkg.com/@sentry/types/-/types-7.30.0.tgz#fc2baeb5b0e1ecc4d52b07b056fcba54449cd9ce" + integrity sha512-l4A86typvt/SfWh5JffpdxNGkg5EEA8m35BzpIcKmCAQZUDmnb4b478r8jdD2uuOjLmPNmZr1tifdRW4NCLuxQ== + "@sentry/utils@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-5.30.0.tgz#9a5bd7ccff85ccfe7856d493bffa64cabc41e980" @@ -4117,6 +4182,14 @@ "@sentry/types" "5.30.0" tslib "^1.9.3" +"@sentry/utils@7.30.0": + version "7.30.0" + resolved "https://registry.yarnpkg.com/@sentry/utils/-/utils-7.30.0.tgz#1d83145399c65e31f725c1b6ae02f451a990f326" + integrity sha512-tSlBhr5u/LdE2emxIDTDmjmyRr99GnZGIAh5GwRxUgeDQ3VEfNUFlyFodBCbZ6yeYTYd6PWNih5xoHn1+Rf3Sw== + dependencies: + "@sentry/types" "7.30.0" + tslib "^1.9.3" + "@sideway/address@^4.1.3": version "4.1.4" resolved "https://registry.yarnpkg.com/@sideway/address/-/address-4.1.4.tgz#03dccebc6ea47fdc226f7d3d1ad512955d4783f0" @@ -16042,7 +16115,7 @@ hmac-drbg@^1.0.0, hmac-drbg@^1.0.1: minimalistic-assert "^1.0.0" minimalistic-crypto-utils "^1.0.1" -hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0: +hoist-non-react-statics@^3.0.0, hoist-non-react-statics@^3.3.0, hoist-non-react-statics@^3.3.2: version "3.3.2" resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== @@ -19821,6 +19894,13 @@ libp2p@^0.36.2: wherearewe "^1.0.0" xsalsa20 "^1.1.0" +lie@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/lie/-/lie-3.1.1.tgz#9a436b2cc7746ca59de7a41fa469b3efb76bd87e" + integrity sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw== + dependencies: + immediate "~3.0.5" + lie@~3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/lie/-/lie-3.3.0.tgz#dcf82dee545f46074daf200c7c1c5a08e0f40f6a" @@ -19978,6 +20058,13 @@ loader-utils@^3.2.0: resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-3.2.0.tgz#bcecc51a7898bee7473d4bc6b845b23af8304d4f" integrity sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ== +localforage@^1.8.1: + version "1.10.0" + resolved "https://registry.yarnpkg.com/localforage/-/localforage-1.10.0.tgz#5c465dc5f62b2807c3a84c0c6a1b1b3212781dd4" + integrity sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg== + dependencies: + lie "3.1.1" + locate-path@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" From f4f2836ff32f4f5660318a444278c35ec9091471 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Mon, 16 Jan 2023 11:12:50 +0000 Subject: [PATCH 13/20] docs: Upgrade version number --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 813ddbc47..02042fb64 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "davi", - "version": "2.3.0", + "version": "2.4.0", "description": "Decentralized Autonomous Voting Interface", "scripts": { "dev": "./scripts/dev.sh", From 88b8054c24d6e71ec40117cac8514c87e8346ad8 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Tue, 17 Jan 2023 21:01:58 +0000 Subject: [PATCH 14/20] feat: Adding link to text editor --- package.json | 1 + src/components/Editor/useTextEditor.tsx | 2 ++ yarn.lock | 22 ++++++++++++---------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/package.json b/package.json index 02042fb64..3f05a77e7 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "@sentry/react": "^7.30.0", "@tiptap/extension-focus": "^2.0.0-beta.39", "@tiptap/extension-highlight": "^2.0.0-beta.32", + "@tiptap/extension-link": "^2.0.0-beta.209", "@tiptap/extension-placeholder": "^2.0.0-beta.48", "@tiptap/react": "^2.0.0-beta.105", "@tiptap/starter-kit": "^2.0.0-beta.171", diff --git a/src/components/Editor/useTextEditor.tsx b/src/components/Editor/useTextEditor.tsx index d23da4105..dc94a89ba 100644 --- a/src/components/Editor/useTextEditor.tsx +++ b/src/components/Editor/useTextEditor.tsx @@ -3,6 +3,7 @@ import StarterKit from '@tiptap/starter-kit'; import Focus from '@tiptap/extension-focus'; import Highlight from '@tiptap/extension-highlight'; import Placeholder from '@tiptap/extension-placeholder'; +import Link from '@tiptap/extension-link'; import { Editor } from './components/Editor'; import TurndownService from 'turndown'; import useLocalStorageWithExpiry from 'hooks/Guilds/useLocalStorageWithExpiry'; @@ -44,6 +45,7 @@ export const useTextEditor = ( placeholder, }), Highlight, + Link, ], onUpdate: ({ editor }) => { const html = editor.getHTML(); diff --git a/yarn.lock b/yarn.lock index 5f8338044..8575de4af 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4154,16 +4154,6 @@ "@sentry/utils" "5.30.0" tslib "^1.9.3" -"@sentry/tracing@^7.30.0": - version "7.30.0" - resolved "https://registry.yarnpkg.com/@sentry/tracing/-/tracing-7.30.0.tgz#b4576fbaf81ce418f1b7c37e7e5f4f6cf19a3c3b" - integrity sha512-bjGeDeKhpGAmLcWcrXFT/xOfHVwp/j0L1aRHzYHnqgTjVzD0NXcooPu/Nz8vF0paxz+hPD5bJwb8kz/ggJzGWQ== - dependencies: - "@sentry/core" "7.30.0" - "@sentry/types" "7.30.0" - "@sentry/utils" "7.30.0" - tslib "^1.9.3" - "@sentry/types@5.30.0": version "5.30.0" resolved "https://registry.yarnpkg.com/@sentry/types/-/types-5.30.0.tgz#19709bbe12a1a0115bc790b8942917da5636f402" @@ -5795,6 +5785,13 @@ resolved "https://registry.yarnpkg.com/@tiptap/extension-italic/-/extension-italic-2.0.0-beta.199.tgz#db24dbdd0d47fdfaa22dde8ba35e2c08b7162e82" integrity sha512-jaYJr5ZMxU2swK6h1XJr6Wb1LlWOWbvsX/wo59iZ9KVv1AHiKZlCMcWGThy4aoAs/CUT11pB8qbzyOO163LHZg== +"@tiptap/extension-link@^2.0.0-beta.209": + version "2.0.0-beta.209" + resolved "https://registry.yarnpkg.com/@tiptap/extension-link/-/extension-link-2.0.0-beta.209.tgz#a441f5ead858ea54b88fa7e1a8b5e02e8f671678" + integrity sha512-X+iPnKWTb8nuZ7xieemPxZOiCQiaQw4z3RVJ7Hz4/T+ujxfxu7MJhBzjyw9htGPmUijyN4zt0NPjZ089yMzAxQ== + dependencies: + linkifyjs "^3.0.5" + "@tiptap/extension-list-item@^2.0.0-beta.199": version "2.0.0-beta.199" resolved "https://registry.yarnpkg.com/@tiptap/extension-list-item/-/extension-list-item-2.0.0-beta.199.tgz#2e667f0ea5d9314307427625345e915edf91b989" @@ -19923,6 +19920,11 @@ lines-and-columns@^1.1.6: resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== +linkifyjs@^3.0.5: + version "3.0.5" + resolved "https://registry.yarnpkg.com/linkifyjs/-/linkifyjs-3.0.5.tgz#99e51a3a0c0e232fcb63ebb89eea3ff923378f34" + integrity sha512-1Y9XQH65eQKA9p2xtk+zxvnTeQBG7rdAXSkUG97DmuI/Xhji9uaUzaWxRj6rf9YC0v8KKHkxav7tnLX82Sz5Fg== + lint-staged@^12.4.3: version "12.5.0" resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-12.5.0.tgz#d6925747480ae0e380d13988522f9dd8ef9126e3" From 0c71ec5d2693fb5218a4926115659ccc16958cf0 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Tue, 17 Jan 2023 21:12:33 +0000 Subject: [PATCH 15/20] feat: Adding target blank on description text --- .../ProposalDescription/ProposalDescription.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/components/ProposalDescription/ProposalDescription.tsx b/src/components/ProposalDescription/ProposalDescription.tsx index 075e1b50b..dfe0f3711 100644 --- a/src/components/ProposalDescription/ProposalDescription.tsx +++ b/src/components/ProposalDescription/ProposalDescription.tsx @@ -21,7 +21,15 @@ export const ProposalDescription: React.FC = ({ return ( {metadata?.description ? ( - {metadata.description} + + {metadata.description} + ) : ( )} From a05f8c0af8d4365684493decb583c4b8790cc2b8 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Wed, 18 Jan 2023 13:31:54 +0000 Subject: [PATCH 16/20] fix: Fixing date input and duration display --- package.json | 2 +- .../GenericCall/GenericCallParamsMatcher.tsx | 9 +- .../GenericCallParamsMatcher.test.tsx.snap | 4 +- .../primitives/Forms/DateInput/DateInput.tsx | 146 ++++++++---------- yarn.lock | 44 +++++- 5 files changed, 113 insertions(+), 92 deletions(-) diff --git a/package.json b/package.json index 3f05a77e7..63e97f60f 100644 --- a/package.json +++ b/package.json @@ -93,7 +93,7 @@ "react": "^18.2.0", "react-app-rewired": "^2.1.8", "react-countdown": "^2.3.2", - "react-datetime": "^3.1.1", + "react-datepicker": "^4.8.0", "react-device-detect": "^2.1.2", "react-diff-viewer": "^3.1.1", "react-dom": "^18.2.0", diff --git a/src/components/ActionsBuilder/SupportedActions/GenericCall/GenericCallParamsMatcher.tsx b/src/components/ActionsBuilder/SupportedActions/GenericCall/GenericCallParamsMatcher.tsx index 9cb108993..e18ff770a 100644 --- a/src/components/ActionsBuilder/SupportedActions/GenericCall/GenericCallParamsMatcher.tsx +++ b/src/components/ActionsBuilder/SupportedActions/GenericCall/GenericCallParamsMatcher.tsx @@ -4,7 +4,8 @@ import { ChildrenNode, Matcher, MatchResponse, Node } from 'interweave'; import moment from 'moment'; import { BlockExplorerLink } from 'components/primitives/Links'; import { FunctionParamWithValue } from 'components/ActionsBuilder/SupportedActions/GenericCall/GenericCallInfoLine'; -import { capitalizeFirstLetter } from 'utils'; +import { getDurationData } from 'hooks/Guilds/useDuration/getDurationData'; +// import { capitalizeFirstLetter } from 'utils'; interface MatcherOptions { params: FunctionParamWithValue[]; } @@ -37,9 +38,9 @@ export const renderGenericCallParamValue = ( return `${moment.unix(Number(param.value)).utc().format('LLLL')} UTC`; case 'duration': case 'time': - return capitalizeFirstLetter( - moment.duration(Number(param.value), 'seconds').humanize() - ); + return param.value === '0' + ? '0 seconds' + : getDurationData(Number(param.value))?.string; case 'boolean': return `${param.value}`; case 'tokenAmount': diff --git a/src/components/ActionsBuilder/SupportedActions/GenericCall/__snapshots__/GenericCallParamsMatcher.test.tsx.snap b/src/components/ActionsBuilder/SupportedActions/GenericCall/__snapshots__/GenericCallParamsMatcher.test.tsx.snap index d06ba6a0a..074586f3f 100644 --- a/src/components/ActionsBuilder/SupportedActions/GenericCall/__snapshots__/GenericCallParamsMatcher.test.tsx.snap +++ b/src/components/ActionsBuilder/SupportedActions/GenericCall/__snapshots__/GenericCallParamsMatcher.test.tsx.snap @@ -169,7 +169,7 @@ exports[`GenericCallParamsMatcher Should match snapshot for all component types exports[`GenericCallParamsMatcher Should match snapshot for all component types 5`] = `
- 52 years + 53 years, 2 months, 1 day, 18 hours, 17 minutes and 18 seconds
`; @@ -399,7 +399,7 @@ exports[`GenericCallParamsMatcher replaces all component types correctly 5`] = ` matchedparam="timeParam" style="display: inline-block;" > - 52 years + 53 years, 2 months, 1 day, 18 hours, 17 minutes and 18 seconds
diff --git a/src/components/primitives/Forms/DateInput/DateInput.tsx b/src/components/primitives/Forms/DateInput/DateInput.tsx index 66a01d514..94d3bf8fb 100644 --- a/src/components/primitives/Forms/DateInput/DateInput.tsx +++ b/src/components/primitives/Forms/DateInput/DateInput.tsx @@ -1,86 +1,77 @@ -import styled from 'styled-components'; -import DateTime from 'react-datetime'; -import { Moment } from 'moment'; -import 'react-datetime/css/react-datetime.css'; +import { createGlobalStyle } from 'styled-components'; +import DatePicker from 'react-datepicker'; +import moment, { Moment } from 'moment'; +import 'react-datepicker/dist/react-datepicker.css'; import { Input, InputProps } from 'components/primitives/Forms/Input'; -import { useMemo } from 'react'; +import { forwardRef } from 'react'; -const StyledDateTime = styled(DateTime)` - .rdtPicker { - background: ${({ theme }) => theme.colors.bg3}; - box-shadow: 0 0 0.5rem rgba(0, 0, 0, 0.25); +const GlobalDatePickerStyles = createGlobalStyle` + .react-datepicker { + background-color: ${({ theme }) => theme.colors.bg3}; + box-shadow: 0 0 1rem rgba(0, 0, 0, 0.4); border: 1px solid ${({ theme }) => theme.colors.border1}; - padding: 1.5rem; border-radius: 0.625rem; font-family: ${({ theme }) => theme.fonts.body}; - color: ${({ theme }) => theme.colors.grey}; - position: fixed; + color: ${({ theme }) => theme.colors.white}; } - - .rdtPicker .rdtMonths td, - .rdtPicker .rdtYears td { - height: 3.5rem; + .react-datepicker__day, .react-datepicker__day-name { + color: ${({ theme }) => theme.colors.white}; + width: 2.5rem; + line-height: 2.5rem; + } + .react-datepicker__header { + color: ${({ theme }) => theme.colors.white}; + background-color: transparent; + border-bottom: none; + padding-top: 16px; } - .rdtPicker .rdtDays td, - .rdtPicker .rdtDays th, - .rdtPicker .rdtMonths th, - .rdtPicker .rdtYears th { - height: 2.5rem; - width: 2.5rem; + .react-datepicker__navigation--previous { + left: 8px; + top: 10px; } - .rdtPicker td.rdtYear:hover, - .rdtPicker td.rdtMonth:hover, - .rdtPicker td.rdtDay:hover, - .rdtPicker td.rdtHour:hover, - .rdtPicker td.rdtMinute:hover, - .rdtPicker td.rdtSecond:hover { - background: ${({ theme }) => theme.colors.bg4}; - border-radius: 50%; - outline: 1px solid ${({ theme }) => theme.colors.text}; + .react-datepicker__navigation--next { + right: 8px; + top: 8.5px; } - .rdtPicker td.rdtTimeToggle:hover, - .rdtPicker td.rdtSwitch:hover { - background: ${({ theme }) => theme.colors.bg4}; - cursor: pointer; + .react-datepicker__day-names { + margin-top: 16px; + margin-bottom: -16px; + } + + .react-datepicker__day--keyboard-selected { + background-color: transparent; } - .rdtPicker td.rdtOld, - .rdtPicker td.rdtNew { - color: ${({ theme }) => theme.colors.grey}; + .react-datepicker__current-month, .react-datepicker__day-name { + color: ${({ theme }) => theme.colors.white}; } - .rdtPicker td.rdtToday:before { - display: none; + .react-datepicker__day:hover { + background: ${({ theme }) => theme.colors.bg4}; + border-radius: 50%; + outline: 1px solid ${({ theme }) => theme.colors.text}; } - .rdtPicker td.rdtActive, - .rdtPicker td.rdtActive:hover { + .react-datepicker__day--selected { border-radius: 50%; background-color: ${({ theme }) => theme.colors.bg1}; cursor: pointer; } - .rdtPicker th { - border: none; - } - - .rdtPicker th.rdtNext, - .rdtPicker th.rdtPrev { - vertical-align: middle; + .react-datepicker__day--outside-month { + color: ${({ theme }) => theme.colors.grey}; } - .rdtPicker th.rdtSwitch:hover, - .rdtPicker th.rdtNext:hover, - .rdtPicker th.rdtPrev:hover, - .rdtPicker .rdtCounter .rdtBtn:hover { - background: ${({ theme }) => theme.colors.bg4}; - cursor: pointer; + .react-datepicker__triangle::before, .react-datepicker__triangle::after{ + border-top-color: ${({ theme }) => theme.colors.bg3} !important; + border-bottom-color: ${({ theme }) => theme.colors.bg3} !important; } `; +// TODO: Implement time and datetime export enum InputType { DATE, TIME, @@ -101,36 +92,23 @@ export const DateInput: React.FC = ({ isValidDate = () => true, ...rest }) => { - const { dateFormat, timeFormat } = useMemo(() => { - if (inputType === InputType.DATETIME) { - return { - dateFormat: 'DD/MM/YYYY', - timeFormat: 'HH:mm:ss A', - }; - } else if (inputType === InputType.TIME) { - return { - dateFormat: false, - timeFormat: 'HH:mm:ss A', - }; - } - - return { - dateFormat: 'DD/MM/YYYY', - timeFormat: false, - }; - }, [inputType]); + const CustomInput = forwardRef(({ value, onClick }: any, ref) => ( + + )); return ( - ( - - )} - /> + <> + + { + onChange(moment(date)); + }} + dateFormat={'dd/MM/yyyy'} + onMonthChange={() => {}} + closeOnScroll={true} + customInput={} + /> + ); }; diff --git a/yarn.lock b/yarn.lock index 8575de4af..e6bc5451e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3839,7 +3839,7 @@ schema-utils "^3.0.0" source-map "^0.7.3" -"@popperjs/core@^2.9.0": +"@popperjs/core@^2.9.0", "@popperjs/core@^2.9.2": version "2.11.6" resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.6.tgz#cee20bd55e68a1720bdab363ecf0c821ded4cd45" integrity sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw== @@ -11923,6 +11923,11 @@ datastore-pubsub@^2.0.0: interface-datastore "^6.0.2" uint8arrays "^3.0.0" +date-fns@^2.24.0: + version "2.29.3" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.29.3.tgz#27402d2fc67eb442b511b70bbdf98e6411cd68a8" + integrity sha512-dDCnyH2WnnKusqvZZ6+jA1O51Ibt8ZMRNkDZdyAyK4YfbDwa/cEmuztzG5pk6hqlp9aSBPYcjOlktquahGwGeA== + dateformat@^4.5.1: version "4.6.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-4.6.3.tgz#556fa6497e5217fedb78821424f8a1c22fa3f4b5" @@ -24140,6 +24145,18 @@ react-countdown@^2.3.2: dependencies: prop-types "^15.7.2" +react-datepicker@^4.8.0: + version "4.8.0" + resolved "https://registry.yarnpkg.com/react-datepicker/-/react-datepicker-4.8.0.tgz#11b8918d085a1ce4781eee4c8e4641b3cd592010" + integrity sha512-u69zXGHMpxAa4LeYR83vucQoUCJQ6m/WBsSxmUMu/M8ahTSVMMyiyQzauHgZA2NUr9y0FUgOAix71hGYUb6tvg== + dependencies: + "@popperjs/core" "^2.9.2" + classnames "^2.2.6" + date-fns "^2.24.0" + prop-types "^15.7.2" + react-onclickoutside "^6.12.0" + react-popper "^2.2.5" + react-datetime@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/react-datetime/-/react-datetime-3.2.0.tgz#fdfa4dced5a9b59724f4c478a1ecc3cb6a6a80cf" @@ -24246,6 +24263,11 @@ react-error-overlay@^6.0.11: resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-6.0.11.tgz#92835de5841c5cf08ba00ddd2d677b6d17ff9adb" integrity sha512-/6UZ2qgEyH2aqzYZgQPxEnz33NJ2gNsnHA2o5+o4wW9bLM/JYQitNP9xPhsXwC08hMMovfGe/8retsdDsczPRg== +react-fast-compare@^3.0.1: + version "3.2.0" + resolved "https://registry.yarnpkg.com/react-fast-compare/-/react-fast-compare-3.2.0.tgz#641a9da81b6a6320f270e89724fb45a0b39e43bb" + integrity sha512-rtGImPZ0YyLrscKI9xTpV8psd6I8VAtjKCzQDlzyDvqJA8XOW78TXYQwNRNd8g8JZnDu8q9Fu/1v4HPAVwVdHA== + react-hook-form@^7.29.0: version "7.38.0" resolved "https://registry.yarnpkg.com/react-hook-form/-/react-hook-form-7.38.0.tgz#53d6a68df587ce4ce88352f63e0ecc7fc8779320" @@ -24345,6 +24367,19 @@ react-native-url-polyfill@^1.3.0: dependencies: whatwg-url-without-unicode "8.0.0-3" +react-onclickoutside@^6.12.0: + version "6.12.2" + resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.12.2.tgz#8e6cf80c7d17a79f2c908399918158a7b02dda01" + integrity sha512-NMXGa223OnsrGVp5dJHkuKxQ4czdLmXSp5jSV9OqiCky9LOpPATn3vLldc+q5fK3gKbEHvr7J1u0yhBh/xYkpA== + +react-popper@^2.2.5: + version "2.3.0" + resolved "https://registry.yarnpkg.com/react-popper/-/react-popper-2.3.0.tgz#17891c620e1320dce318bad9fede46a5f71c70ba" + integrity sha512-e1hj8lL3uM+sgSR4Lxzn5h1GxBlpa4CQz0XLF8kx4MDrDRWY0Ena4c97PUeSX9i5W3UAfDP0z0FXCTQkoXUl3Q== + dependencies: + react-fast-compare "^3.0.1" + warning "^4.0.2" + react-refresh@^0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" @@ -28552,6 +28587,13 @@ walletlink@2.0.2: preact "^10.3.3" rxjs "^6.5.4" +warning@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3" + integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w== + dependencies: + loose-envify "^1.0.0" + watchify@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/watchify/-/watchify-4.0.0.tgz#53b002d51e7b0eb640b851bb4de517a689973392" From 7f76abd131fff4ca331ca48e02ade1749dec9c07 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Wed, 18 Jan 2023 13:35:48 +0000 Subject: [PATCH 17/20] style: Removing comment --- .../SupportedActions/GenericCall/GenericCallParamsMatcher.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/ActionsBuilder/SupportedActions/GenericCall/GenericCallParamsMatcher.tsx b/src/components/ActionsBuilder/SupportedActions/GenericCall/GenericCallParamsMatcher.tsx index e18ff770a..5113f499f 100644 --- a/src/components/ActionsBuilder/SupportedActions/GenericCall/GenericCallParamsMatcher.tsx +++ b/src/components/ActionsBuilder/SupportedActions/GenericCall/GenericCallParamsMatcher.tsx @@ -5,7 +5,6 @@ import moment from 'moment'; import { BlockExplorerLink } from 'components/primitives/Links'; import { FunctionParamWithValue } from 'components/ActionsBuilder/SupportedActions/GenericCall/GenericCallInfoLine'; import { getDurationData } from 'hooks/Guilds/useDuration/getDurationData'; -// import { capitalizeFirstLetter } from 'utils'; interface MatcherOptions { params: FunctionParamWithValue[]; } From b0ec1582e2c859ae5235872ddab701b3a270e298 Mon Sep 17 00:00:00 2001 From: Ross Neilson <39137239+rossneilson@users.noreply.github.com> Date: Thu, 19 Jan 2023 12:16:32 +0000 Subject: [PATCH 18/20] Update index.html --- public/index.html | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/public/index.html b/public/index.html index 34ed952c5..162161f4c 100644 --- a/public/index.html +++ b/public/index.html @@ -6,14 +6,14 @@ - + - + - + @@ -21,7 +21,7 @@ - + From 6d6a82cd4bde76e7756d6b74f6444bd3b1cb74d1 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Mon, 30 Jan 2023 12:24:19 +0000 Subject: [PATCH 19/20] fix: Fixing crashing metadata render --- package.json | 1 - .../ProposalDescription.tsx | 23 ++++++++----------- yarn.lock | 14 +---------- 3 files changed, 10 insertions(+), 28 deletions(-) diff --git a/package.json b/package.json index 63e97f60f..81cccffe8 100644 --- a/package.json +++ b/package.json @@ -83,7 +83,6 @@ "jsonexport": "^3.2.0", "jszip": "^3.7.1", "lodash": "^4.17.21", - "markdown-to-jsx": "^7.1.5", "mini-css-extract-plugin": "2.4.5", "minisearch": "^3.1.0", "moment": "^2.24.0", diff --git a/src/components/ProposalDescription/ProposalDescription.tsx b/src/components/ProposalDescription/ProposalDescription.tsx index dfe0f3711..e3c210dd9 100644 --- a/src/components/ProposalDescription/ProposalDescription.tsx +++ b/src/components/ProposalDescription/ProposalDescription.tsx @@ -1,8 +1,9 @@ import { ProposalDescriptionWrapper } from './ProposalDescription.styled'; import { ProposalDescriptionProps } from './types'; -import Markdown from 'markdown-to-jsx'; import { Loading } from 'components/primitives/Loading'; import { useTranslation } from 'react-i18next'; +import { Interweave } from 'interweave'; +import { GlobalErrorBoundary } from 'components/ErrorBoundary'; export const ProposalDescription: React.FC = ({ metadata, @@ -20,19 +21,13 @@ export const ProposalDescription: React.FC = ({ return ( - {metadata?.description ? ( - - {metadata.description} - - ) : ( - - )} + + {metadata?.description ? ( + + ) : ( + + )} + ); }; diff --git a/yarn.lock b/yarn.lock index e6bc5451e..cdee1a824 100644 --- a/yarn.lock +++ b/yarn.lock @@ -20439,11 +20439,6 @@ markdown-escapes@^1.0.0: resolved "https://registry.yarnpkg.com/markdown-escapes/-/markdown-escapes-1.0.4.tgz#c95415ef451499d7602b91095f3c8e8975f78535" integrity sha512-8z4efJYk43E0upd0NbVXwgSTQs6cT3T06etieCMEg7dRbzCbxUCK/GHlX8mhHRDcp+OLlHkPKsvqQTCvsRl2cg== -markdown-to-jsx@^7.1.5: - version "7.1.7" - resolved "https://registry.yarnpkg.com/markdown-to-jsx/-/markdown-to-jsx-7.1.7.tgz#a5f22102fb12241c8cea1ca6a4050bb76b23a25d" - integrity sha512-VI3TyyHlGkO8uFle0IOibzpO1c1iJDcXcS/zBrQrXQQvJ2tpdwVzVZ7XdKsyRz1NdRmre4dqQkMZzUHaKIG/1w== - matcher@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/matcher/-/matcher-3.0.0.tgz#bd9060f4c5b70aa8041ccc6f80368760994f30ca" @@ -23637,7 +23632,7 @@ prompts@^2.0.1, prompts@^2.4.0, prompts@^2.4.2: kleur "^3.0.3" sisteransi "^1.0.5" -prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.5.7, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.0.0, prop-types@^15.5.10, prop-types@^15.6.0, prop-types@^15.6.2, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -24157,13 +24152,6 @@ react-datepicker@^4.8.0: react-onclickoutside "^6.12.0" react-popper "^2.2.5" -react-datetime@^3.1.1: - version "3.2.0" - resolved "https://registry.yarnpkg.com/react-datetime/-/react-datetime-3.2.0.tgz#fdfa4dced5a9b59724f4c478a1ecc3cb6a6a80cf" - integrity sha512-w5XdeNIGzBht9CadaZIJhKUhEcDTgH0XokKxGPCxeeJRYL7B3HIKA8CM6Q0xej2JFJt0n5d+zi3maMwaY3262A== - dependencies: - prop-types "^15.5.7" - react-dev-utils@^12.0.1: version "12.0.1" resolved "https://registry.yarnpkg.com/react-dev-utils/-/react-dev-utils-12.0.1.tgz#ba92edb4a1f379bd46ccd6bcd4e7bc398df33e73" From 7f181cabac2dcbfc82a3458091476be9805c7611 Mon Sep 17 00:00:00 2001 From: rossneilson Date: Mon, 30 Jan 2023 12:49:18 +0000 Subject: [PATCH 20/20] docs: Increase version to .1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 81cccffe8..63b5dd85b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "davi", - "version": "2.4.0", + "version": "2.4.1", "description": "Decentralized Autonomous Voting Interface", "scripts": { "dev": "./scripts/dev.sh",