├── .browserslistrc ├── .env ├── .env.test ├── .eslintignore ├── .eslintrc.js ├── .github ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── ISSUE_TEMPLATE │ ├── BUG_REPORT.yml │ └── FEATURE_REQUEST.yml ├── PULL_REQUEST_TEMPLATE.md ├── dependabot.yml ├── stale.yml └── workflows │ ├── deploy.yml │ ├── nodejs.yml │ └── update-snapshot-packages.yml ├── .gitignore ├── .gitmodules ├── .gitpod.yml ├── .husky ├── post-checkout ├── post-merge ├── pre-commit └── pre-push ├── .nvmrc ├── .prettierrc.js ├── LICENSE ├── README.md ├── babel.config.js ├── crowdin.yml ├── cypress.config.ts ├── cypress ├── e2e │ ├── create-proposal.spec.cy.js │ └── voting-proposal.spec.cy.js └── support │ ├── commands.js │ └── e2e.js ├── index.html ├── package.json ├── postcss.config.js ├── public ├── .well-known │ └── assetlinks.json ├── about │ ├── big_planet.png │ ├── main.png │ └── small_planet.png ├── avatar.png ├── favicon.png ├── icon.svg ├── manifest.json ├── service-worker.js └── stickers │ ├── hooray.png │ └── just_signed.png ├── src ├── App.vue ├── assets │ ├── fonts │ │ ├── Calibre-Medium-Custom.woff2 │ │ ├── Calibre-Semibold-Custom.woff2 │ │ ├── iconfont.css │ │ ├── iconfont.eot │ │ ├── iconfont.json │ │ ├── iconfont.svg │ │ ├── iconfont.ttf │ │ ├── iconfont.woff │ │ ├── iconfont.woff2 │ │ └── space-mono-v11-latin-700.woff2 │ └── icons │ │ ├── coingecko.svg │ │ ├── discord.svg │ │ ├── github.svg │ │ ├── lenster.svg │ │ ├── shutter.svg │ │ ├── signature.svg │ │ ├── twitter.svg │ │ ├── voted.svg │ │ └── youtube.svg ├── components │ ├── AboutMembersListItem.vue │ ├── AboutSubheader.vue │ ├── AvatarOverlayEdit.vue │ ├── AvatarSpace.vue │ ├── AvatarToken.vue │ ├── AvatarUser.vue │ ├── BaseAvatar.vue │ ├── BaseBadge.vue │ ├── BaseBlock.vue │ ├── BaseButton.test.js │ ├── BaseButton.vue │ ├── BaseButtonIcon.vue │ ├── BaseButtonRound.vue │ ├── BaseCalendar.vue │ ├── BaseCombobox.vue │ ├── BaseComboboxMultiple.vue │ ├── BaseContainer.vue │ ├── BaseCounter.vue │ ├── BaseIcon.vue │ ├── BaseIndicator.vue │ ├── BaseInput.vue │ ├── BaseLink.vue │ ├── BaseListbox.vue │ ├── BaseListboxMultiple.vue │ ├── BaseLoading.vue │ ├── BaseMarkdown.vue │ ├── BaseMenu.vue │ ├── BaseMessage.vue │ ├── BaseMessageBlock.vue │ ├── BaseModal.vue │ ├── BaseModalSelectItem.vue │ ├── BaseNetworkItem.vue │ ├── BaseNoResults.vue │ ├── BasePill.vue │ ├── BasePluginItem.vue │ ├── BasePopover.vue │ ├── BasePopoverHover.vue │ ├── BaseProgressBar.vue │ ├── BaseProgressRadial.vue │ ├── BaseSearch.vue │ ├── BaseSidebarNavigationItem.vue │ ├── BaseSkinItem.vue │ ├── BaseStrategyItem.vue │ ├── BaseUser.vue │ ├── BlockLink.vue │ ├── BlockSpacesList.vue │ ├── BlockSpacesListButtonMore.vue │ ├── BlockSpacesListItem.vue │ ├── BlockSpacesListSkeleton.vue │ ├── ButtonBack.vue │ ├── ButtonCard.vue │ ├── ButtonFollow.vue │ ├── ButtonPlayground.vue │ ├── ButtonShare.vue │ ├── ButtonTheme.vue │ ├── ComboboxNetwork.vue │ ├── ContainerParallelInput.vue │ ├── ExploreMenuCategories.vue │ ├── ExploreSkeletonLoading.vue │ ├── ExploreSpaces.vue │ ├── FooterLinks.vue │ ├── FooterLinksItem.vue │ ├── FooterSocials.vue │ ├── FooterSocialsItem.vue │ ├── FooterTitle.vue │ ├── FormArray.vue │ ├── FormObject.vue │ ├── IconDiscord.vue │ ├── IconInformationTooltip.vue │ ├── IconSocial.vue │ ├── IconVerifiedSpace.vue │ ├── IndicatorAssetsChange.spec.js │ ├── IndicatorAssetsChange.vue │ ├── InputCheckbox.vue │ ├── InputDate.vue │ ├── InputEmail.vue │ ├── InputNewsletter.vue │ ├── InputNumber.vue │ ├── InputRadio.vue │ ├── InputSelect.vue │ ├── InputSelectPrivacy.vue │ ├── InputSelectVoteType.vue │ ├── InputSelectVoteValidation.vue │ ├── InputSocial.vue │ ├── InputString.vue │ ├── InputSwitch.vue │ ├── InputUploadAvatar.vue │ ├── InputUploadImage.vue │ ├── InputUrl.vue │ ├── LabelInput.vue │ ├── LabelProposalState.vue │ ├── LabelProposalVoted.vue │ ├── LinkSpace.vue │ ├── ListboxMultipleCategories.vue │ ├── LoadingList.vue │ ├── LoadingPage.vue │ ├── LoadingRow.vue │ ├── LoadingSpinner.vue │ ├── MenuAccount.vue │ ├── MenuLanguages.vue │ ├── MessageWarningGnosisNetwork.vue │ ├── MessageWarningValidation.vue │ ├── ModalAccount.vue │ ├── ModalConfirmAction.vue │ ├── ModalControllerEdit.vue │ ├── ModalDelegate.vue │ ├── ModalMessage.vue │ ├── ModalNotice.vue │ ├── ModalPlugins.vue │ ├── ModalPostVote.vue │ ├── ModalProfileForm.vue │ ├── ModalReceipt.vue │ ├── ModalRevokeDelegate.vue │ ├── ModalSelectDate.vue │ ├── ModalSkins.vue │ ├── ModalSpaces.vue │ ├── ModalSpacesListItem.vue │ ├── ModalStrategies.vue │ ├── ModalStrategy.vue │ ├── ModalTerms.vue │ ├── ModalTreasury.vue │ ├── ModalUnsupportedNetwork.vue │ ├── ModalValidation.vue │ ├── ModalVote.vue │ ├── ModalVoteValidation.vue │ ├── ModalVotingPrivacy.vue │ ├── ModalVotingType.vue │ ├── NavbarAccount.vue │ ├── NavbarExtras.vue │ ├── NavbarNotifications.vue │ ├── PopoverHoverProfile.vue │ ├── ProfileAboutBiography.vue │ ├── ProfileAboutDelegate.vue │ ├── ProfileAboutDelegateListItem.vue │ ├── ProfileActivityList.vue │ ├── ProfileActivityListItem.vue │ ├── ProfileAddressCopy.vue │ ├── ProfileName.vue │ ├── ProfileSidebar.vue │ ├── ProfileSidebarHeader.vue │ ├── ProfileSidebarHeaderSkeleton.vue │ ├── ProfileSidebarNavigation.vue │ ├── ProposalsItem.vue │ ├── ProposalsItemBody.vue │ ├── ProposalsItemFooter.vue │ ├── ProposalsItemResults.vue │ ├── ProposalsItemTitle.vue │ ├── SettingsDangerzoneBlock.vue │ ├── SettingsDomainBlock.vue │ ├── SettingsLinkBlock.vue │ ├── SettingsMembersBlock.vue │ ├── SettingsMembersPopoverButton.vue │ ├── SettingsMembersPopoverContent.vue │ ├── SettingsPluginsBlock.vue │ ├── SettingsProfileBlock.vue │ ├── SettingsProposalBlock.vue │ ├── SettingsStrategiesBlock.vue │ ├── SettingsSubSpacesBlock.vue │ ├── SettingsTreasuriesBlock.vue │ ├── SettingsTreasuriesBlockItem.vue │ ├── SettingsValidationBlock.vue │ ├── SettingsVotingBlock.vue │ ├── SetupButtonBack.vue │ ├── SetupButtonCreate.vue │ ├── SetupButtonNext.vue │ ├── SetupDomain.vue │ ├── SetupDomainRegister.vue │ ├── SetupExtras.vue │ ├── SetupIntro.vue │ ├── SetupMessageHelp.vue │ ├── SetupProfile.vue │ ├── SetupSidebarStepper.vue │ ├── SetupStrategy.vue │ ├── SetupStrategyAdvanced.vue │ ├── SetupStrategyBasic.vue │ ├── SetupStrategyVote.vue │ ├── SidebarSpacesSkeleton.vue │ ├── SidebarUnreadIndicator.vue │ ├── SpaceCreateContent.vue │ ├── SpaceCreatePlugins.vue │ ├── SpaceCreateVoting.vue │ ├── SpaceCreateVotingDateEnd.vue │ ├── SpaceCreateVotingDateStart.vue │ ├── SpaceCreateWarnings.vue │ ├── SpaceProposalContent.vue │ ├── SpaceProposalHeader.vue │ ├── SpaceProposalInformation.vue │ ├── SpaceProposalPage.vue │ ├── SpaceProposalPlugins.vue │ ├── SpaceProposalPluginsSidebar.vue │ ├── SpaceProposalResults.vue │ ├── SpaceProposalResultsError.vue │ ├── SpaceProposalResultsList.vue │ ├── SpaceProposalResultsListItem.vue │ ├── SpaceProposalResultsProgressBar.vue │ ├── SpaceProposalResultsQuorum.vue │ ├── SpaceProposalResultsShutter.vue │ ├── SpaceProposalVote.vue │ ├── SpaceProposalVoteApproval.vue │ ├── SpaceProposalVoteQuadratic.vue │ ├── SpaceProposalVoteRankedChoice.vue │ ├── SpaceProposalVoteSingleChoice.vue │ ├── SpaceProposalVotesList.vue │ ├── SpaceProposalVotesListItem.vue │ ├── SpaceProposalVotesListItemChoice.vue │ ├── SpaceProposalVotesModal.vue │ ├── SpaceProposalsMenuFilter.vue │ ├── SpaceProposalsNoProposals.vue │ ├── SpaceProposalsNotice.vue │ ├── SpaceSidebar.vue │ ├── SpaceSidebarFooter.vue │ ├── SpaceSidebarHeader.vue │ ├── SpaceSidebarNavigation.vue │ ├── SpaceSidebarSkeleton.vue │ ├── SpaceSidebarSubspaces.vue │ ├── SpaceWarningFlagged.vue │ ├── StrategiesBlockWarning.vue │ ├── StrategiesListItem.vue │ ├── TextAutolinker.vue │ ├── TextareaArray.vue │ ├── TextareaAutosize.vue │ ├── TextareaJson.vue │ ├── TheFlashNotification.vue │ ├── TheFooter.vue │ ├── TheHeader.vue │ ├── TheLayout.vue │ ├── TheModalNotification.vue │ ├── TheNavbar.vue │ ├── TheSearchBar.vue │ ├── TheSidebar.vue │ ├── TreasuryAssetsList.vue │ ├── TreasuryAssetsListItem.spec.js │ ├── TreasuryAssetsListItem.vue │ ├── TreasuryWalletsList.spec.js │ ├── TreasuryWalletsList.vue │ ├── TreasuryWalletsListItem.spec.js │ ├── TreasuryWalletsListItem.vue │ └── Ui │ │ ├── Collapsible.vue │ │ ├── CollapsibleContent.vue │ │ ├── CollapsibleText.vue │ │ ├── Input.vue │ │ └── Select.vue ├── composables │ ├── useAliasAction.ts │ ├── useApolloQuery.ts │ ├── useApp.ts │ ├── useCategories.ts │ ├── useClient.ts │ ├── useCopy.ts │ ├── useDelegate.ts │ ├── useEns.ts │ ├── useExtendedSpaces.ts │ ├── useFlashNotification.ts │ ├── useFollowSpace.ts │ ├── useFormSpaceProposal.ts │ ├── useFormSpaceSettings.ts │ ├── useFormValidation.ts │ ├── useGnosis.ts │ ├── useI18n.ts │ ├── useImageUpload.ts │ ├── useInfiniteLoader.ts │ ├── useIntl.ts │ ├── useMeta.ts │ ├── useModal.ts │ ├── useModalNotification.ts │ ├── useNetworksFilter.ts │ ├── useNotifications.ts │ ├── usePlugins.ts │ ├── useProfiles.ts │ ├── useProposalVotes.ts │ ├── useProposals.ts │ ├── useQuorum.ts │ ├── useReportDownload.ts │ ├── useSafe.ts │ ├── useSharing.ts │ ├── useSkin.ts │ ├── useSkinsFilter.ts │ ├── useSnapshot.ts │ ├── useSpaceController.ts │ ├── useSpaceSubscription.ts │ ├── useSpaces.ts │ ├── useStrategies.ts │ ├── useTerms.ts │ ├── useTreasury.ts │ ├── useTxStatus.ts │ ├── useUnseenProposals.ts │ ├── useUsername.ts │ └── useWeb3.ts ├── env.d.ts ├── helpers │ ├── abi.ts │ ├── apollo.ts │ ├── auth.ts │ ├── b64.ts │ ├── beams.ts │ ├── categories.json │ ├── clientEIP712.ts │ ├── clientGnosisSafe.ts │ ├── connectors.json │ ├── covalent.ts │ ├── delegation.ts │ ├── ens.ts │ ├── i18n.ts │ ├── interfaces.ts │ ├── profile.ts │ ├── queries.ts │ ├── shutter.ts │ ├── snapshot.ts │ ├── utils.test.js │ ├── utils.ts │ └── validation.ts ├── locales │ ├── ar-SA.json │ ├── de-DE.json │ ├── default.json │ ├── es-ES.json │ ├── fil-PH.json │ ├── fr-FR.json │ ├── hi-IN.json │ ├── id-ID.json │ ├── it-IT.json │ ├── ja-JP.json │ ├── ko-KR.json │ ├── languages.json │ ├── pt-PT.json │ ├── ro-RO.json │ ├── ru-RU.json │ ├── tr-TR.json │ ├── uk-UA.json │ ├── vi-VN.json │ └── zh-CN.json ├── main.ts ├── plugins │ ├── README.md │ ├── commentBox │ │ ├── Proposal.vue │ │ ├── components │ │ │ ├── Comment.vue │ │ │ ├── CommentBlock.vue │ │ │ ├── CustomBlock.vue │ │ │ ├── ListReply.vue │ │ │ └── ReplyBlock.vue │ │ └── plugin.json │ ├── gnosis │ │ ├── Create.vue │ │ ├── ProposalSidebar.vue │ │ ├── components │ │ │ ├── Config.vue │ │ │ └── CustomBlock.vue │ │ ├── index.ts │ │ └── plugin.json │ ├── hal │ │ ├── ProposalSidebar.vue │ │ ├── components │ │ │ └── CustomBlock.vue │ │ └── plugin.json │ ├── poap │ │ ├── ProposalSidebar.vue │ │ ├── components │ │ │ └── CustomBlock.vue │ │ ├── index.ts │ │ └── plugin.json │ ├── progress │ │ ├── ProposalSidebar.vue │ │ ├── components │ │ │ └── CustomBlock.vue │ │ ├── index.ts │ │ ├── plugin.json │ │ └── readme.md │ ├── projectGalaxy │ │ ├── ProposalSidebar.vue │ │ ├── README.md │ │ ├── components │ │ │ └── CustomBlock.vue │ │ ├── index.ts │ │ └── plugin.json │ ├── quorum │ │ ├── examples.json │ │ └── plugin.json │ └── safeSnap │ │ ├── Create.vue │ │ ├── Proposal.vue │ │ ├── components │ │ ├── Config.vue │ │ ├── Form │ │ │ ├── ContractInteraction.vue │ │ │ ├── ImportTransactionsButton.vue │ │ │ ├── RawTransaction.vue │ │ │ ├── SendAsset.vue │ │ │ ├── Transaction.vue │ │ │ ├── TransactionBatch.vue │ │ │ └── TransferFunds.vue │ │ ├── HandleOutcome.vue │ │ ├── HandleOutcomeUma.vue │ │ ├── Input │ │ │ ├── Address.vue │ │ │ ├── Amount.vue │ │ │ ├── ArrayType.vue │ │ │ └── MethodParameter.vue │ │ ├── Modal │ │ │ └── OptionApproval.vue │ │ ├── SafeTransactions.vue │ │ └── Tooltip.vue │ │ ├── constants.ts │ │ ├── index.ts │ │ ├── logo.png │ │ ├── plugin.json │ │ └── utils │ │ ├── abi.ts │ │ ├── coins.ts │ │ ├── decoder.ts │ │ ├── index.ts │ │ ├── multiSend.ts │ │ ├── realityETH.ts │ │ ├── realityModule.ts │ │ ├── safe.ts │ │ ├── transactions.ts │ │ ├── umaModule.ts │ │ └── validator.ts ├── router.ts ├── style.scss ├── vars.scss └── views │ ├── AboutView.vue │ ├── DelegateView.vue │ ├── ExploreView.vue │ ├── PlaygroundView.vue │ ├── ProfileAbout.vue │ ├── ProfileActivity.vue │ ├── ProfileView.vue │ ├── RankingView.vue │ ├── SetupView.vue │ ├── SpaceAbout.vue │ ├── SpaceCreate.vue │ ├── SpaceProposal.vue │ ├── SpaceProposals.vue │ ├── SpaceSettings.vue │ ├── SpaceTreasury.vue │ ├── SpaceView.vue │ ├── StrategyView.vue │ └── TimelineView.vue ├── tailwind.config.js ├── tsconfig.json ├── vite.config.ts ├── vitest.ts └── yarn.lock /.browserslistrc: -------------------------------------------------------------------------------- 1 | > 1% 2 | last 2 versions 3 | not dead 4 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.env.test: -------------------------------------------------------------------------------- 1 | CYPRESS_REMOTE_DEBUGGING_PORT=9222 2 | NETWORK_NAME=mainnet 3 | SECRET_WORDS='test test test test test test test test test test test junk' 4 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | src/plugins/* -------------------------------------------------------------------------------- /.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | env: { 4 | node: true 5 | }, 6 | extends: [ 7 | 'plugin:cypress/recommended', 8 | 'plugin:vue/vue3-recommended', 9 | 'eslint:recommended', 10 | '@vue/eslint-config-typescript/recommended', 11 | '@vue/eslint-config-prettier', 12 | '.eslintrc-auto-import.json' 13 | ], 14 | ignorePatterns: ['/node_modules/**/*.*'], 15 | parserOptions: { 16 | ecmaVersion: 2020 17 | }, 18 | rules: { 19 | 'no-console': 'off', 20 | 'prefer-template': 'error', 21 | 'no-debugger': process.env.NODE_ENV === 'production' ? 'warn' : 'off', 22 | '@typescript-eslint/no-explicit-any': 'off', 23 | '@typescript-eslint/ban-ts-ignore': 'off', 24 | '@typescript-eslint/camelcase': 'off', 25 | '@typescript-eslint/no-undef': 'off', 26 | '@typescript-eslint/no-var-requires': 'off', 27 | '@typescript-eslint/no-use-before-define': ['error', { functions: false }], 28 | 'vue/script-setup-uses-vars': 'error' 29 | }, 30 | globals: { 31 | $ref: 'readonly', 32 | defineProps: 'readonly', 33 | defineEmits: 'readonly', 34 | withDefaults: 'readonly' 35 | } 36 | }; 37 | -------------------------------------------------------------------------------- /.github/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | ### Issues 2 | *_(Include references to issues that this PR addresses)_* 3 | 4 | Fixes # 5 | 6 | ### Changes 7 | *_(Briefly describe the changes made in this PR)_* 8 | 9 | 1. 10 | 11 | ### How to test 12 | *_(Explain how the changes can be tested, including any required setup steps)_* 13 | 14 | 1. 15 | 16 | ### To-Do 17 | *_(List any outstanding tasks be addressed before or after this PR is merged)_* 18 | 19 | - [ ] 20 | 21 | 22 | ### Self-review checklist 23 | - [ ] I have performed a full self-review of my changes 24 | - [ ] I have tested my changes on a preview deployment 25 | - [ ] I have tested my changes on a custom domain 26 | - [ ] I have run end-to-end tests `yarn cypress:test:e2e`, and they have passed 27 | 28 | ### Additional notes or considerations 29 | *_(Include any other relevant information or context that may be helpful for the reviewer)_* 30 | 31 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: 'npm' 4 | directory: '/' 5 | schedule: 6 | interval: 'weekly' 7 | - package-ecosystem: 'gitsubmodule' 8 | directory: '/' 9 | schedule: 10 | interval: 'daily' 11 | -------------------------------------------------------------------------------- /.github/stale.yml: -------------------------------------------------------------------------------- 1 | daysUntilStale: 120 2 | daysUntilClose: 14 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 | -------------------------------------------------------------------------------- /.github/workflows/deploy.yml: -------------------------------------------------------------------------------- 1 | name: Deploy 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | target: 7 | type: choice 8 | description: Target 9 | options: 10 | - stable 11 | 12 | jobs: 13 | deploy: 14 | runs-on: ubuntu-latest 15 | 16 | steps: 17 | # Checks-out repo on develop branch 18 | - uses: actions/checkout@v3 19 | with: 20 | ref: 'develop' 21 | # Overwrite target 22 | - run: | 23 | git checkout -b ${{ github.event.inputs.target }} 24 | git push --set-upstream origin ${{ github.event.inputs.target }} --force 25 | -------------------------------------------------------------------------------- /.github/workflows/nodejs.yml: -------------------------------------------------------------------------------- 1 | name: Node CI 2 | 3 | on: 4 | push: 5 | 6 | jobs: 7 | build: 8 | runs-on: ubuntu-latest 9 | 10 | strategy: 11 | matrix: 12 | node-version: [16.x] 13 | 14 | steps: 15 | - name: Checkout repository 16 | uses: actions/checkout@v3 17 | 18 | - name: Use Node.js ${{ matrix.node-version }} 19 | uses: actions/setup-node@v3 20 | with: 21 | node-version: ${{ matrix.node-version }} 22 | 23 | - name: Install dependencies 24 | run: yarn 25 | 26 | - name: Build 27 | run: yarn run build 28 | 29 | - name: Lint 30 | run: yarn run lint 31 | 32 | 33 | -------------------------------------------------------------------------------- /.github/workflows/update-snapshot-packages.yml: -------------------------------------------------------------------------------- 1 | name: Update Snapshot packages 2 | 3 | on: 4 | workflow_dispatch: 5 | schedule: 6 | - cron: 0 10 * * 1 7 | 8 | jobs: 9 | update-dep: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | - uses: actions/setup-node@v1 14 | with: 15 | node-version: '14.x' 16 | - name: Update snapshot.js 17 | run: | 18 | yarn upgrade @snapshot-labs/snapshot.js --latest 19 | - name: Update lock.js 20 | run: | 21 | yarn upgrade @snapshot-labs/lock --latest 22 | - name: Create Pull Request 23 | uses: peter-evans/create-pull-request@v3 24 | with: 25 | commit-message: Update Snapshot packages 26 | title: Update Snapshot packages 27 | body: | 28 | - Updates from snapshot.js or lock packages 29 | 30 | Auto-generated by Github Actions 31 | branch: update-snapshot-packages 32 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | node_modules 3 | /dist 4 | .yalc 5 | components.d.ts 6 | auto-imports.d.ts 7 | .eslintrc-auto-import.json 8 | 9 | # local env files 10 | .env.local 11 | .env.*.local 12 | 13 | # Log files 14 | npm-debug.log* 15 | yarn-debug.log* 16 | yarn-error.log* 17 | pnpm-debug.log* 18 | 19 | # Editor directories and files 20 | .idea 21 | .vscode 22 | *.suo 23 | *.ntvs* 24 | *.njsproj 25 | *.sln 26 | *.sw? 27 | 28 | # Vitest 29 | 30 | /coverage -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "snapshot-spaces"] 2 | path = snapshot-spaces 3 | url = https://github.com/snapshot-labs/snapshot-spaces 4 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.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 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | npx lint-staged -------------------------------------------------------------------------------- /.husky/pre-push: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | -------------------------------------------------------------------------------- /.nvmrc: -------------------------------------------------------------------------------- 1 | v15.14.0 -------------------------------------------------------------------------------- /.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | singleQuote: true, 3 | trailingComma: 'none', 4 | arrowParens: 'avoid' 5 | }; 6 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) Snapshot Labs 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: ['@vue/cli-plugin-babel/preset'] 3 | }; 4 | -------------------------------------------------------------------------------- /crowdin.yml: -------------------------------------------------------------------------------- 1 | files: 2 | - source: /src/locales/default.json 3 | translation: /src/locales/%locale%.json 4 | -------------------------------------------------------------------------------- /cypress.config.ts: -------------------------------------------------------------------------------- 1 | const { defineConfig } = require('cypress'); 2 | const synpressPlugins = require('@synthetixio/synpress/plugins'); 3 | 4 | module.exports = defineConfig({ 5 | userAgent: 'synpress', 6 | viewportHeight: 900, 7 | viewportWidth: 1280, 8 | screenshotOnRunFailure: false, 9 | video: false, 10 | chromeWebSecurity: true, 11 | defaultCommandTimeout: 30000, 12 | pageLoadTimeout: 30000, 13 | requestTimeout: 30000, 14 | e2e: { 15 | testIsolation: true, 16 | setupNodeEvents(on, config) { 17 | synpressPlugins(on, config); 18 | }, 19 | baseUrl: 'http://localhost:8081/#/', 20 | supportFile: 'cypress/support/e2e.js' 21 | // specPattern: 'cypress/e2e/voting-proposal.spec.cy.js' 22 | } 23 | }); 24 | -------------------------------------------------------------------------------- /cypress/support/commands.js: -------------------------------------------------------------------------------- 1 | // *********************************************** 2 | // This example commands.js shows you how to 3 | // create various custom commands and overwrite 4 | // existing commands. 5 | // 6 | // For more comprehensive examples of custom 7 | // commands please read more here: 8 | // https://on.cypress.io/custom-commands 9 | // *********************************************** 10 | // 11 | // 12 | // -- This is a parent command -- 13 | // Cypress.Commands.add('login', (email, password) => { ... }) 14 | // 15 | // 16 | // -- This is a child command -- 17 | // Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... }) 18 | // 19 | // 20 | // -- This is a dual command -- 21 | // Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... }) 22 | // 23 | // 24 | // -- This will overwrite an existing command -- 25 | // Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... }) 26 | -------------------------------------------------------------------------------- /cypress/support/e2e.js: -------------------------------------------------------------------------------- 1 | import './commands'; 2 | import '@synthetixio/synpress/support'; 3 | 4 | beforeEach(() => { 5 | cy.visit('/'); 6 | cy.get('[data-testid="button-connect-wallet"]').click(); 7 | cy.get('[data-testid="button-connnect-wallet-injected"]').click(); 8 | cy.acceptMetamaskAccess(); 9 | }); 10 | 11 | afterEach(() => { 12 | cy.disconnectMetamaskWalletFromAllDapps(); 13 | cy.resetMetamaskAccount(); 14 | }); 15 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 10 | Snapshot 11 | 12 | 13 |
14 |