├── src ├── vars.scss ├── assets │ ├── fonts │ │ ├── iconfont.eot │ │ ├── iconfont.ttf │ │ ├── iconfont.woff │ │ ├── iconfont.woff2 │ │ ├── Calibre-Medium-Custom.woff2 │ │ ├── Calibre-Semibold-Custom.woff2 │ │ └── space-mono-v11-latin-700.woff2 │ └── icons │ │ ├── telegram.svg │ │ ├── voted.svg │ │ ├── signature.svg │ │ ├── youtube.svg │ │ ├── github.svg │ │ ├── twitter.svg │ │ ├── lenster.svg │ │ └── coingecko.svg ├── plugins │ ├── safeSnap │ │ ├── logo.png │ │ ├── plugin.json │ │ ├── Create.vue │ │ ├── utils │ │ │ ├── validator.ts │ │ │ ├── realityETH.ts │ │ │ ├── safe.ts │ │ │ ├── coins.ts │ │ │ └── multiSend.ts │ │ ├── components │ │ │ ├── Input │ │ │ │ ├── Address.vue │ │ │ │ └── Amount.vue │ │ │ └── Tooltip.vue │ │ └── Proposal.vue │ ├── progress │ │ ├── index.ts │ │ ├── plugin.json │ │ └── ProposalSidebar.vue │ ├── hal │ │ ├── plugin.json │ │ ├── ProposalSidebar.vue │ │ └── components │ │ │ └── CustomBlock.vue │ ├── poap │ │ ├── plugin.json │ │ └── ProposalSidebar.vue │ ├── commentBox │ │ ├── plugin.json │ │ └── Proposal.vue │ ├── gnosis │ │ ├── plugin.json │ │ ├── ProposalSidebar.vue │ │ └── Create.vue │ ├── quorum │ │ └── plugin.json │ └── projectGalaxy │ │ ├── plugin.json │ │ └── ProposalSidebar.vue ├── components │ ├── IconDiscord.vue │ ├── BaseIndicator.vue │ ├── ContainerParallelInput.vue │ ├── FooterTitle.vue │ ├── FooterLinks.vue │ ├── SetupButtonBack.vue │ ├── FooterSocialsItem.vue │ ├── ProposalsItemBody.vue │ ├── AboutMembersListItem.vue │ ├── BasePill.vue │ ├── ButtonSidebar.vue │ ├── BaseLoading.vue │ ├── BaseContainer.vue │ ├── ButtonBack.vue │ ├── ProfileAboutBiography.vue │ ├── ButtonShare.vue │ ├── SidebarSpacesSkeleton.vue │ ├── LabelProposalVoted.vue │ ├── LabelInput.vue │ ├── SetupButtonNext.vue │ ├── AboutSubheader.vue │ ├── FooterLinksItem.vue │ ├── IconInformationTooltip.vue │ ├── ProfileActivityList.vue │ ├── LoadingPage.vue │ ├── BaseButtonIcon.vue │ ├── BaseIcon.vue │ ├── ProposalsItemTitle.vue │ ├── BaseButton.test.js │ ├── LoadingRow.vue │ ├── BaseNoResults.vue │ ├── BlockSpacesListButtonMore.vue │ ├── ButtonCard.vue │ ├── ButtonTheme.vue │ ├── BaseCounter.vue │ ├── ProfileSidebarHeaderSkeleton.vue │ ├── SidebarUnreadIndicator.vue │ ├── StrategiesBlockWarning.vue │ ├── ProfileName.vue │ ├── SpaceProposalResultsShutter.vue │ ├── BaseSidebarNavigationItem.vue │ ├── IconSocial.vue │ ├── TextAutolinker.vue │ ├── BaseBadge.vue │ ├── BaseMessage.vue │ ├── BaseMessageBlock.vue │ ├── BlockSpacesListSkeleton.vue │ ├── InputEmail.vue │ ├── ProfileSidebarNavigation.vue │ ├── SpaceProposalsNoProposals.vue │ ├── BaseSkinItem.vue │ ├── ExploreSkeletonLoading.vue │ ├── ProfileSidebarHeader.vue │ ├── InputNumber.vue │ ├── SetupMessageHelp.vue │ ├── ModalNotice.vue │ ├── SetupProfile.vue │ ├── SetupButtonCreate.vue │ ├── ModalConfirmAction.vue │ ├── InputRadio.vue │ ├── BaseValidationItem.vue │ ├── InputCheckbox.vue │ ├── AvatarToken.vue │ ├── SetupStrategyAdvanced.vue │ ├── InputUrl.vue │ ├── SpaceSidebar.vue │ ├── AvatarOverlayEdit.vue │ ├── SetupIntro.vue │ ├── ModalSpaces.vue │ ├── SpaceProposalPlugins.vue │ ├── AvatarSpace.vue │ ├── ProposalsItemActive.vue │ ├── SpaceCreateVotingDateEnd.vue │ ├── InputNewsletter.vue │ ├── InputSelectVoteValidation.vue │ ├── SpaceProposalPluginsSidebar.vue │ ├── TextareaJson.vue │ ├── BaseStrategyItem.vue │ ├── AvatarUser.vue │ ├── BaseLink.vue │ ├── SpaceProposalResultsProgressBar.vue │ ├── SpaceCreatePlugins.vue │ ├── BlockSpacesListItem.vue │ ├── SettingsAuthorsBlock.vue │ ├── MessageWarningGnosisNetwork.vue │ ├── SettingsTreasuriesBlockItem.vue │ ├── TextareaArray.vue │ ├── InputSelect.vue │ ├── SpaceProposalResultsQuorumPlugin.vue │ ├── BaseFlashNotification.vue │ ├── IconVerifiedSpace.vue │ ├── SpaceCreateVotingDateStart.vue │ ├── BaseModalSelectItem.vue │ ├── SpaceProposalResultsQuorum.vue │ ├── IndicatorAssetsChange.vue │ ├── SettingsStrategiesBlockItem.vue │ ├── ProfileAddressCopy.vue │ ├── TheLayout.vue │ ├── InputString.vue │ ├── SpaceProposalVoteSingleChoice.vue │ ├── InputSocial.vue │ ├── ListboxMultipleCategories.vue │ ├── SettingsAdminsBlock.vue │ ├── ButtonPlayground.vue │ ├── SpaceSidebarSkeleton.vue │ ├── LabelProposalState.vue │ ├── Ui │ │ ├── Select.vue │ │ ├── CollapsibleText.vue │ │ ├── CollapsibleContent.vue │ │ └── Collapsible.vue │ ├── MenuLanguages.vue │ ├── BaseNetworkItem.vue │ ├── ComboboxNetwork.vue │ ├── InputSelectVoteType.vue │ ├── SpaceProposalVotesListItemChoice.vue │ ├── ModalVotingType.vue │ ├── SetupExtras.vue │ ├── InputUploadAvatar.vue │ ├── ModalVotingPrivacy.vue │ ├── SpaceProposalVoteApproval.vue │ ├── SpaceProposalResultsList.vue │ ├── SpaceWarningFlagged.vue │ ├── InputDate.vue │ ├── InputSelectPrivacy.vue │ ├── TheHeader.vue │ ├── FooterSocials.vue │ ├── TreasuryAssetsList.vue │ ├── BaseUser.vue │ ├── SettingsLinkBlock.vue │ ├── SpaceProposalsMenuFilter.vue │ ├── ModalSpacesListItem.vue │ ├── ProfileSidebar.vue │ ├── ProfileActivityListItem.vue │ ├── InputUploadImage.vue │ ├── BaseButton.vue │ ├── BasePluginItem.vue │ ├── ModalReceipt.vue │ ├── ModalDelegate.vue │ ├── TheNavbar.vue │ ├── ModalTerms.vue │ ├── SettingsDomainBlock.vue │ ├── ModalVoteMessagePassport.vue │ ├── BasePopover.vue │ └── SpaceProposalResultsError.vue ├── composables │ ├── useModal.ts │ ├── useTxStatus.ts │ ├── useInfiniteLoader.ts │ ├── useScrollMonitor.ts │ ├── useCopy.ts │ ├── useTerms.ts │ ├── useSafe.ts │ ├── useUsername.ts │ ├── useFlashNotification.ts │ ├── useCategories.ts │ ├── useI18n.ts │ ├── useApolloQuery.ts │ ├── useGnosis.ts │ ├── useSkinsFilter.ts │ └── useValidationsFilter.ts ├── helpers │ ├── categories.json │ ├── abi.ts │ ├── clientEIP712.ts │ ├── clientGnosisSafe.ts │ ├── beams.ts │ ├── b64.ts │ ├── ens.ts │ ├── apollo.ts │ ├── auth.ts │ ├── utils.test.js │ ├── delegation.ts │ ├── shutter.ts │ ├── connectors.json │ ├── profile.ts │ └── covalent.ts ├── env.d.ts ├── locales │ └── languages.json ├── views │ ├── SpaceTreasury.vue │ └── ProfileView.vue └── main.ts ├── .nvmrc ├── .eslintignore ├── .browserslistrc ├── .husky ├── pre-push ├── pre-commit ├── post-checkout └── post-merge ├── babel.config.js ├── public ├── avatar.png ├── favicon.png ├── service-worker.js ├── about │ ├── main.png │ ├── big_planet.png │ └── small_planet.png ├── stickers │ ├── hooray.png │ └── just_signed.png ├── .well-known │ └── assetlinks.json ├── manifest.json └── icon.svg ├── crowdin.yml ├── .github ├── PULL_REQUEST_TEMPLATE.md ├── dependabot.yml ├── stale.yml └── workflows │ ├── nodejs.yml │ ├── deploy.yml │ └── update-snapshot-packages.yml ├── postcss.config.js ├── .prettierrc.js ├── .gitmodules ├── .gitpod.yml ├── vitest.ts ├── cypress.config.ts ├── .gitignore ├── cypress └── e2e │ └── createProposal.cy.js ├── .env ├── index.html ├── tsconfig.json ├── .eslintrc.js ├── LICENSE └── vite.config.ts /src/vars.scss: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v15.14.0 -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | src/plugins/* -------------------------------------------------------------------------------- /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not dead 4 | -------------------------------------------------------------------------------- /.husky/pre-push: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['@vue/cli-plugin-babel/preset'] 3 | }; 4 | -------------------------------------------------------------------------------- /public/avatar.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CashRussell/snapshot/HEAD/public/avatar.png -------------------------------------------------------------------------------- /public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CashRussell/snapshot/HEAD/public/favicon.png -------------------------------------------------------------------------------- /public/service-worker.js: -------------------------------------------------------------------------------- 1 | importScripts('https://js.pusher.com/beams/service-worker.js'); 2 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | npx lint-staged -------------------------------------------------------------------------------- /public/about/main.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CashRussell/snapshot/HEAD/public/about/main.png -------------------------------------------------------------------------------- /.husky/post-checkout: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | yarn run init-submodules 5 | -------------------------------------------------------------------------------- /.husky/post-merge: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | yarn run init-submodules 5 | -------------------------------------------------------------------------------- /public/stickers/hooray.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CashRussell/snapshot/HEAD/public/stickers/hooray.png -------------------------------------------------------------------------------- /crowdin.yml: -------------------------------------------------------------------------------- 1 | files: 2 | - source: /src/locales/default.json 3 | translation: /src/locales/%locale%.json 4 | -------------------------------------------------------------------------------- /public/about/big_planet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CashRussell/snapshot/HEAD/public/about/big_planet.png -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Fixes # 2 | 3 | Changes in this PR: 4 | 5 | How to test and review this PR? 6 | -------------------------------------------------------------------------------- /public/about/small_planet.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CashRussell/snapshot/HEAD/public/about/small_planet.png -------------------------------------------------------------------------------- /public/stickers/just_signed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CashRussell/snapshot/HEAD/public/stickers/just_signed.png -------------------------------------------------------------------------------- /src/assets/fonts/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CashRussell/snapshot/HEAD/src/assets/fonts/iconfont.eot -------------------------------------------------------------------------------- /src/assets/fonts/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CashRussell/snapshot/HEAD/src/assets/fonts/iconfont.ttf -------------------------------------------------------------------------------- /src/assets/fonts/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CashRussell/snapshot/HEAD/src/assets/fonts/iconfont.woff -------------------------------------------------------------------------------- /src/assets/fonts/iconfont.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CashRussell/snapshot/HEAD/src/assets/fonts/iconfont.woff2 -------------------------------------------------------------------------------- /src/plugins/safeSnap/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CashRussell/snapshot/HEAD/src/plugins/safeSnap/logo.png -------------------------------------------------------------------------------- /postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {} 5 | } 6 | } 7 | -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | singleQuote: true, 3 | trailingComma: 'none', 4 | arrowParens: 'avoid' 5 | }; 6 | -------------------------------------------------------------------------------- /src/components/IconDiscord.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "snapshot-spaces"] 2 | path = snapshot-spaces 3 | url = https://github.com/snapshot-labs/snapshot-spaces 4 | -------------------------------------------------------------------------------- /src/components/BaseIndicator.vue: -------------------------------------------------------------------------------- 1 | 4 | -------------------------------------------------------------------------------- /src/assets/fonts/Calibre-Medium-Custom.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CashRussell/snapshot/HEAD/src/assets/fonts/Calibre-Medium-Custom.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/Calibre-Semibold-Custom.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CashRussell/snapshot/HEAD/src/assets/fonts/Calibre-Semibold-Custom.woff2 -------------------------------------------------------------------------------- /src/assets/fonts/space-mono-v11-latin-700.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/CashRussell/snapshot/HEAD/src/assets/fonts/space-mono-v11-latin-700.woff2 -------------------------------------------------------------------------------- /src/plugins/progress/index.ts: -------------------------------------------------------------------------------- 1 | export default class Plugin { 2 | public author = 'nick'; 3 | public version = '0.1.0'; 4 | public name = 'progess'; 5 | } 6 | -------------------------------------------------------------------------------- /src/components/ContainerParallelInput.vue: -------------------------------------------------------------------------------- 1 | 6 | -------------------------------------------------------------------------------- /src/components/FooterTitle.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /src/components/FooterLinks.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /src/composables/useModal.ts: -------------------------------------------------------------------------------- 1 | import { ref } from 'vue'; 2 | 3 | const modalAccountOpen = ref(false); 4 | 5 | export function useModal() { 6 | return { modalAccountOpen }; 7 | } 8 | -------------------------------------------------------------------------------- /src/components/SetupButtonBack.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /src/helpers/categories.json: -------------------------------------------------------------------------------- 1 | [ 2 | "protocol", 3 | "social", 4 | "investment", 5 | "grant", 6 | "service", 7 | "media", 8 | "creator", 9 | "collector" 10 | ] 11 | -------------------------------------------------------------------------------- /src/components/FooterSocialsItem.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /src/components/ProposalsItemBody.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /src/helpers/abi.ts: -------------------------------------------------------------------------------- 1 | export const ERC20ABI = [ 2 | 'function name() public view returns (string)', 3 | 'function decimals() view returns (uint32)', 4 | 'function symbol() view returns (string)' 5 | ]; 6 | -------------------------------------------------------------------------------- /src/components/AboutMembersListItem.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 8 | -------------------------------------------------------------------------------- /.gitpod.yml: -------------------------------------------------------------------------------- 1 | tasks: 2 | - name: Setup 3 | init: | 4 | yarn install --frozen-lockfile --silent --network-timeout 100000 5 | command: yarn dev 6 | 7 | ports: 8 | - port: 3000 9 | onOpen: open-preview 10 | -------------------------------------------------------------------------------- /src/helpers/clientEIP712.ts: -------------------------------------------------------------------------------- 1 | import Client from '@snapshot-labs/snapshot.js/src/sign'; 2 | 3 | const hubUrl = import.meta.env.VITE_HUB_URL || 'https://testnet.snapshot.org'; 4 | const client = new Client(hubUrl); 5 | 6 | export default client; 7 | -------------------------------------------------------------------------------- /src/components/BasePill.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 10 | -------------------------------------------------------------------------------- /vitest.ts: -------------------------------------------------------------------------------- 1 | import createFetchMock from 'vitest-fetch-mock'; 2 | import { vi } from 'vitest'; 3 | 4 | const fetchMock = createFetchMock(vi); 5 | 6 | // sets globalThis.fetch and globalThis.fetchMock to our mocked version 7 | fetchMock.enableMocks(); 8 | -------------------------------------------------------------------------------- /src/components/ButtonSidebar.vue: -------------------------------------------------------------------------------- 1 | 8 | -------------------------------------------------------------------------------- /src/helpers/clientGnosisSafe.ts: -------------------------------------------------------------------------------- 1 | import Client from '@snapshot-labs/snapshot.js/src/sign'; 2 | 3 | const relayerUrl = 4 | import.meta.env.VITE_RELAYER_URL || 'https://testnet.snapshot.org'; 5 | const client = new Client(relayerUrl); 6 | 7 | export default client; 8 | -------------------------------------------------------------------------------- /src/plugins/hal/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "HAL", 3 | "version": "1.0.0", 4 | "author": "hal.xyz", 5 | "website": "https://github.com/snapshot-labs/snapshot/tree/develop/src/plugins/hal", 6 | "icon": "ipfs://QmUjiGPfzTUT6KZJe2iDNtca9XnuVw9iXwQUB2ncCLSoMK" 7 | } 8 | -------------------------------------------------------------------------------- /src/components/BaseLoading.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 13 | -------------------------------------------------------------------------------- /src/components/BaseContainer.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 12 | -------------------------------------------------------------------------------- /src/components/ButtonBack.vue: -------------------------------------------------------------------------------- 1 | 11 | -------------------------------------------------------------------------------- /src/components/ProfileAboutBiography.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | -------------------------------------------------------------------------------- /src/plugins/poap/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Poap Module", 3 | "version": "1.0.0", 4 | "author": "Poap-xyz", 5 | "website": "https://github.com/snapshot-labs/snapshot/tree/develop/src/plugins/poap", 6 | "icon": "ipfs://QmSH2PsJUSpHUwS9XAoqLKRvF7qibrsqmBTdmM9Mmyv5fb" 7 | } 8 | -------------------------------------------------------------------------------- /src/components/ButtonShare.vue: -------------------------------------------------------------------------------- 1 | 9 | -------------------------------------------------------------------------------- /src/plugins/hal/ProposalSidebar.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 12 | -------------------------------------------------------------------------------- /src/plugins/progress/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Progress", 3 | "version": "0.1.0", 4 | "author": "Deadeye07", 5 | "website": "https://github.com/Deadeye07/snapshot-develop/tree/master/src/plugins/progress", 6 | "icon": "ipfs://Qmd1Zpmscf5HBvh5ouu6AUcDTst28CKYyrpfGnPCqd73gZ" 7 | } 8 | -------------------------------------------------------------------------------- /src/plugins/commentBox/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Comment Box", 3 | "version": "0.0.1", 4 | "author": "spiritbro1", 5 | "website": "https://github.com/snapshot-labs/snapshot/tree/develop/src/plugins/commentBox", 6 | "icon": "ipfs://QmWpLpFpeQ3iH69uCeXXAfLu56YaL9mNESMGfeJ5XSpkhY" 7 | } 8 | -------------------------------------------------------------------------------- /src/plugins/gnosis/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Gnosis Impact", 3 | "version": "0.0.1", 4 | "author": "davidalbela", 5 | "website": "https://...", 6 | "icon": "ipfs://QmPhmL1jPjaYKeKeEzyetAueNHCsGgrUVqSJasiTrcPWvx", 7 | "defaults": { 8 | "space": {}, 9 | "proposal": {} 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /src/components/SidebarSpacesSkeleton.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 12 | -------------------------------------------------------------------------------- /src/components/LabelProposalVoted.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 11 | -------------------------------------------------------------------------------- /src/components/LabelInput.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 13 | -------------------------------------------------------------------------------- /src/env.d.ts: -------------------------------------------------------------------------------- 1 | interface ImportMetaEnv { 2 | readonly VITE_APP_TITLE: string; 3 | readonly VITE_HUB_URL: string; 4 | readonly VITE_RELAYER_URL: string; 5 | readonly VITE_SCORES_URL: string; 6 | readonly VITE_IPFS_GATEWAY: string; 7 | readonly VITE_DEFAULT_NETWORK: string; 8 | readonly VITE_PUSHER_BEAMS_INSTANCE_ID: string; 9 | } 10 | -------------------------------------------------------------------------------- /cypress.config.ts: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'cypress'; 2 | 3 | export default defineConfig({ 4 | viewportHeight: 900, 5 | viewportWidth: 1280, 6 | screenshotOnRunFailure: false, 7 | video: false, 8 | defaultCommandTimeout: 10000, 9 | e2e: { 10 | baseUrl: 'http://localhost:8081', 11 | supportFile: false 12 | } 13 | }); 14 | -------------------------------------------------------------------------------- /src/components/SetupButtonNext.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 17 | -------------------------------------------------------------------------------- /src/helpers/beams.ts: -------------------------------------------------------------------------------- 1 | import * as PusherPushNotifications from '@pusher/push-notifications-web'; 2 | 3 | let beams: any; 4 | 5 | try { 6 | beams = new PusherPushNotifications.Client({ 7 | instanceId: (import.meta.env.VITE_PUSHER_BEAMS_INSTANCE_ID as string) ?? '' 8 | }); 9 | } catch (e) { 10 | console.log(e); 11 | } 12 | 13 | export { beams }; 14 | -------------------------------------------------------------------------------- /src/components/AboutSubheader.vue: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | -------------------------------------------------------------------------------- /src/components/FooterLinksItem.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /src/components/IconInformationTooltip.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: "npm" 4 | directory: "/" 5 | schedule: 6 | interval: "daily" 7 | allow: 8 | # Allow updates for snapshot.js only 9 | - dependency-name: "@snapshot-labs/snapshot.js" 10 | - package-ecosystem: 'gitsubmodule' 11 | directory: '/' 12 | schedule: 13 | interval: 'daily' 14 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | daysUntilStale: 60 2 | daysUntilClose: 7 3 | exemptLabels: 4 | - pinned 5 | - enhancement 6 | - bug 7 | staleLabel: stale 8 | markComment: > 9 | This issue has been automatically marked as stale because it has not had 10 | recent activity. It will be closed if no further activity occurs. Thank you 11 | for your contributions. 12 | closeComment: false 13 | -------------------------------------------------------------------------------- /src/components/ProfileActivityList.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | -------------------------------------------------------------------------------- /src/components/LoadingPage.vue: -------------------------------------------------------------------------------- 1 | 10 | -------------------------------------------------------------------------------- /src/plugins/quorum/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Quorum", 3 | "version": "0.1.0", 4 | "author": "lbeder", 5 | "website": "https://github.com/snapshot-labs/snapshot/tree/develop/src/plugins/quorum", 6 | "icon": "ipfs://Qmbyq2emXpjv1oFFJnhS3jL8aXZAqnya7zmNtKYXEs8jXa", 7 | "defaults": { 8 | "space": { 9 | "strategy": "static", 10 | "total": 1234 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | .yalc 5 | components.d.ts 6 | 7 | # local env files 8 | .env.local 9 | .env.*.local 10 | 11 | # Log files 12 | npm-debug.log* 13 | yarn-debug.log* 14 | yarn-error.log* 15 | pnpm-debug.log* 16 | 17 | # Editor directories and files 18 | .idea 19 | .vscode 20 | *.suo 21 | *.ntvs* 22 | *.njsproj 23 | *.sln 24 | *.sw? 25 | 26 | # Vitest 27 | 28 | /coverage -------------------------------------------------------------------------------- /src/components/BaseButtonIcon.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 15 | -------------------------------------------------------------------------------- /src/plugins/commentBox/Proposal.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | -------------------------------------------------------------------------------- /src/components/BaseIcon.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 21 | -------------------------------------------------------------------------------- /public/.well-known/assetlinks.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "relation": [ 4 | "delegate_permission/common.handle_all_urls" 5 | ], 6 | "target": { 7 | "namespace": "android_app", 8 | "package_name": "org.snapshot", 9 | "sha256_cert_fingerprints": [ 10 | "44:5B:B1:EE:DF:5C:2A:90:7D:7A:10:DF:18:67:68:54:8E:8E:62:C1:DF:84:06:F7:8D:8E:AD:67:2E:B2:5C:E5" 11 | ] 12 | } 13 | } 14 | ] 15 | -------------------------------------------------------------------------------- /src/composables/useTxStatus.ts: -------------------------------------------------------------------------------- 1 | import { ref, watch, nextTick } from 'vue'; 2 | 3 | const pendingCount = ref(0); 4 | 5 | export function useTxStatus() { 6 | watch(pendingCount, () => { 7 | if (pendingCount.value < 0) { 8 | pendingCount.value = 0; 9 | } 10 | }); 11 | return { pendingCount }; 12 | } 13 | 14 | export function watchTxStatus(cb) { 15 | watch(pendingCount, () => nextTick(cb)); 16 | } 17 | -------------------------------------------------------------------------------- /src/locales/languages.json: -------------------------------------------------------------------------------- 1 | { 2 | "en-US": { 3 | "name": "English" 4 | }, 5 | "zh-CN": { 6 | "name": "Chinese", 7 | "nativeName": "简体中文" 8 | }, 9 | "ja-JP": { 10 | "name": "Japanese", 11 | "nativeName": "日本語" 12 | }, 13 | "ko-KR": { 14 | "name": "Korean", 15 | "nativeName": "한국어" 16 | }, 17 | "fr-FR": { 18 | "name": "French", 19 | "nativeName": "Français" 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /src/components/ProposalsItemTitle.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 16 | -------------------------------------------------------------------------------- /src/components/BaseButton.test.js: -------------------------------------------------------------------------------- 1 | import { describe, expect, it } from 'vitest'; 2 | import { mount } from '@vue/test-utils'; 3 | import BaseButton from './BaseButton.vue'; 4 | 5 | describe('Button.vue', () => { 6 | it('should slot text', () => { 7 | const wrapper = mount(BaseButton, { 8 | slots: { 9 | default: 'Hello world' 10 | } 11 | }); 12 | 13 | expect(wrapper.text()).toContain('Hello world'); 14 | }); 15 | }); 16 | -------------------------------------------------------------------------------- /src/components/LoadingRow.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 16 | -------------------------------------------------------------------------------- /src/composables/useInfiniteLoader.ts: -------------------------------------------------------------------------------- 1 | import { ref } from 'vue'; 2 | 3 | export function useInfiniteLoader(loadBy = 6) { 4 | const loadingMore = ref(false); 5 | const stopLoadingMore = ref(false); 6 | 7 | async function loadMore(loadFn) { 8 | if (!stopLoadingMore.value) { 9 | loadingMore.value = true; 10 | await loadFn(); 11 | loadingMore.value = false; 12 | } 13 | } 14 | 15 | return { loadBy, loadingMore, stopLoadingMore, loadMore }; 16 | } 17 | -------------------------------------------------------------------------------- /src/assets/icons/telegram.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /cypress/e2e/createProposal.cy.js: -------------------------------------------------------------------------------- 1 | /// 2 | 3 | /** 4 | * work in progress 5 | */ 6 | describe('createProposal', () => { 7 | beforeEach(() => { 8 | cy.visit('/#/fabien.eth'); 9 | }); 10 | 11 | it('shows warning and connect button when not connected', () => { 12 | cy.get('[data-testid="create-proposal-button"]').click(); 13 | cy.get('[data-testid="create-proposal-connect-wallet-button"]').should( 14 | 'exist' 15 | ); 16 | }); 17 | }); 18 | -------------------------------------------------------------------------------- /src/components/BaseNoResults.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 17 | -------------------------------------------------------------------------------- /src/components/BlockSpacesListButtonMore.vue: -------------------------------------------------------------------------------- 1 | 13 | -------------------------------------------------------------------------------- /src/components/ButtonCard.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /src/components/ButtonTheme.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 17 | -------------------------------------------------------------------------------- /src/composables/useScrollMonitor.ts: -------------------------------------------------------------------------------- 1 | import { onMounted, onBeforeUnmount, ref } from 'vue'; 2 | import scrollMonitor from 'scrollmonitor'; 3 | 4 | export function useScrollMonitor(fn) { 5 | let elementWatcher; 6 | 7 | const endElement: any = ref(null); 8 | 9 | onMounted(() => { 10 | elementWatcher = scrollMonitor.create(endElement.value); 11 | elementWatcher.enterViewport(fn); 12 | }); 13 | 14 | onBeforeUnmount(() => elementWatcher.destroy()); 15 | 16 | return { endElement }; 17 | } 18 | -------------------------------------------------------------------------------- /src/plugins/projectGalaxy/plugin.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Galxe", 3 | "version": "0.0.1", 4 | "author": "Galxe", 5 | "description": "Galxe OAT", 6 | "website": "https://github.com/snapshot-labs/snapshot/tree/develop/src/plugins/projectGalaxy", 7 | "icon": "https://ipfs.io/ipfs/bafkreibjxoeegwucimd4hjfn3xmxrmkes3je5gwa723gaqosirzgewutfq", 8 | "defaults": { 9 | "space": { 10 | "oats": { 11 | "": "/campaign/" 12 | } 13 | } 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/components/BaseCounter.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 18 | -------------------------------------------------------------------------------- /src/components/ProfileSidebarHeaderSkeleton.vue: -------------------------------------------------------------------------------- 1 | 14 | -------------------------------------------------------------------------------- /src/helpers/b64.ts: -------------------------------------------------------------------------------- 1 | /// URL-safe Base64 encoding and decoding. 2 | 3 | const B64U_LOOKUP = { 4 | '/': '_', 5 | _: '/', 6 | '+': '-', 7 | '-': '+', 8 | '=': '.', 9 | '.': '=' 10 | }; 11 | 12 | export const encode = str => 13 | btoa(str).replace(/(\+|\/|=)/g, m => B64U_LOOKUP[m]); 14 | 15 | export const decode = str => 16 | atob(str.replace(/(-|_|\.)/g, m => B64U_LOOKUP[m])); 17 | 18 | export const encodeJson = json => encode(JSON.stringify(json)); 19 | export const decodeJson = str => JSON.parse(decode(str)); 20 | -------------------------------------------------------------------------------- /src/components/SidebarUnreadIndicator.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 17 | -------------------------------------------------------------------------------- /src/components/StrategiesBlockWarning.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 16 | -------------------------------------------------------------------------------- /src/composables/useCopy.ts: -------------------------------------------------------------------------------- 1 | import { useI18n } from '@/composables/useI18n'; 2 | import { useClipboard } from '@vueuse/core'; 3 | import { useFlashNotification } from '@/composables/useFlashNotification'; 4 | 5 | export function useCopy() { 6 | const { t } = useI18n(); 7 | const { copy, copied } = useClipboard(); 8 | const { notify } = useFlashNotification(); 9 | 10 | function copyToClipboard(text) { 11 | copy(text); 12 | if (copied) notify(t('notify.copied')); 13 | } 14 | 15 | return { copyToClipboard }; 16 | } 17 | -------------------------------------------------------------------------------- /src/plugins/progress/ProposalSidebar.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 23 | -------------------------------------------------------------------------------- /src/components/ProfileName.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 23 | -------------------------------------------------------------------------------- /src/components/SpaceProposalResultsShutter.vue: -------------------------------------------------------------------------------- 1 | 19 | -------------------------------------------------------------------------------- /.github/workflows/nodejs.yml: -------------------------------------------------------------------------------- 1 | name: Node CI 2 | 3 | on: [push] 4 | 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | 9 | strategy: 10 | matrix: 11 | node-version: [14.x] 12 | 13 | steps: 14 | - uses: actions/checkout@v1 15 | - name: Use Node.js ${{ matrix.node-version }} 16 | uses: actions/setup-node@v1 17 | with: 18 | node-version: ${{ matrix.node-version }} 19 | - name: yarn install, build, lint 20 | run: | 21 | yarn 22 | yarn run build 23 | yarn run lint 24 | -------------------------------------------------------------------------------- /src/components/BaseSidebarNavigationItem.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 24 | -------------------------------------------------------------------------------- /src/components/IconSocial.vue: -------------------------------------------------------------------------------- 1 | 14 | 15 | 24 | -------------------------------------------------------------------------------- /.env: -------------------------------------------------------------------------------- 1 | VITE_HUB_URL=https://testnet.snapshot.org 2 | VITE_RELAYER_URL=https://testnet.snapshot.org 3 | VITE_SCORES_URL=https://score.snapshot.org 4 | VITE_IPFS_GATEWAY=snapshot.mypinata.cloud 5 | VITE_DEFAULT_NETWORK=1 6 | VITE_PUSHER_BEAMS_INSTANCE_ID=2e080021-d495-456d-b2cf-84f9fd718442 7 | VITE_SHUTTER_EON_PUBKEY=0x0e6493bbb4ee8b19aa9b70367685049ff01dc9382c46aed83f8bc07d2a5ba3e6030bd83b942c1fd3dff5b79bef3b40bf6b666e51e7f0be14ed62daaffad47435265f5c9403b1a801921981f7d8659a9bd91fe92fb1cf9afdb16178a532adfaf51a237103874bb03afafe9cab2118dae1be5f08a0a28bf488c1581e9db4bc23ca 8 | VITE_ENV=develop 9 | -------------------------------------------------------------------------------- /src/plugins/poap/ProposalSidebar.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 25 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | Snapshot 11 | 12 | 13 |
14 |