├── .changeset └── config.json ├── .commitlintrc.js ├── .dockerignore ├── .editorconfig ├── .eslintignore ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ ├── feature_request.md │ └── questions.md ├── actions │ ├── discord-notify │ │ └── action.yml │ └── setup-env │ │ └── action.yml ├── dependabot.yml ├── pull_request_template.md └── workflows │ ├── checks.yml │ ├── deploy-mochi-web-beta.yml │ ├── deploy-mochi-web-prod.yml │ ├── gke-preview.yml │ ├── gke-prod.yml │ ├── release-web.yaml │ └── release.yml ├── .gitignore ├── .husky ├── .gitignore ├── commit-msg └── pre-commit ├── .npmrc ├── .npmrc.example ├── .prettierignore ├── .prettierrc ├── .releaserc ├── .vscode └── settings.json ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── Dockerfile ├── LICENSE ├── Makefile ├── README.md ├── apps ├── mochi-web │ ├── .editorconfig │ ├── .env.example │ ├── .eslintrc.js │ ├── .gitignore │ ├── README.md │ ├── __tests__ │ │ └── components │ │ │ └── copy-button.test.tsx │ ├── app │ │ └── layout │ │ │ ├── footer.tsx │ │ │ ├── index.tsx │ │ │ ├── nprogress.ts │ │ │ └── seo.tsx │ ├── assets │ │ ├── Inter-Black.ttf │ │ ├── Inter-Bold.ttf │ │ ├── Inter-ExtraBold.ttf │ │ ├── Inter-ExtraLight.ttf │ │ ├── Inter-Light.ttf │ │ ├── Inter-Medium.ttf │ │ ├── Inter-Regular.ttf │ │ ├── Inter-SemiBold.ttf │ │ ├── Inter-Thin.ttf │ │ ├── RobotoMono-Light.ttf │ │ └── RobotoMono-Regular.ttf │ ├── components │ │ ├── Amount.tsx │ │ ├── ApplicationDetailSidebarHeader.tsx │ │ ├── BottomSheet │ │ │ └── index.tsx │ │ ├── Changelog │ │ │ ├── ChangelogDetailTitle │ │ │ │ ├── ChangelogDetailTitle.tsx │ │ │ │ └── index.ts │ │ │ └── Markdown │ │ │ │ ├── Markdown.tsx │ │ │ │ └── index.ts │ │ ├── CopyButton.tsx │ │ ├── DashLine.tsx │ │ ├── Dashboard │ │ │ ├── Card │ │ │ │ ├── index.ts │ │ │ │ └── styles.ts │ │ │ ├── Form │ │ │ │ ├── Field.tsx │ │ │ │ └── styles.ts │ │ │ ├── Input │ │ │ │ ├── FileInput.tsx │ │ │ │ ├── Input.tsx │ │ │ │ ├── index.ts │ │ │ │ └── styles.ts │ │ │ ├── Menu │ │ │ │ ├── Menu.tsx │ │ │ │ └── index.ts │ │ │ ├── Pagination │ │ │ │ ├── Pagination.tsx │ │ │ │ └── index.ts │ │ │ ├── Radio │ │ │ │ ├── RadioGroup.tsx │ │ │ │ └── index.ts │ │ │ ├── Select │ │ │ │ ├── Select.tsx │ │ │ │ ├── index.ts │ │ │ │ └── styles.ts │ │ │ ├── Switch │ │ │ │ ├── Switch.tsx │ │ │ │ └── index.ts │ │ │ ├── Table │ │ │ │ ├── Table.tsx │ │ │ │ └── index.ts │ │ │ ├── Tabs │ │ │ │ ├── Tabs.tsx │ │ │ │ ├── index.ts │ │ │ │ └── styles.ts │ │ │ └── types │ │ │ │ └── misc.ts │ │ ├── DashboardBody.tsx │ │ ├── DashboardLayout.tsx │ │ ├── DashboardSkeleton.tsx │ │ ├── DataList.tsx │ │ ├── Dialog.tsx │ │ ├── Feed │ │ │ ├── index.tsx │ │ │ └── store.ts │ │ ├── Header │ │ │ ├── DashboardMobileSidebar.tsx │ │ │ ├── Header.tsx │ │ │ ├── MobileNavAccordionItem.tsx │ │ │ ├── index.ts │ │ │ ├── type.ts │ │ │ └── util.ts │ │ ├── Home │ │ │ ├── ApiIntegration.tsx │ │ │ ├── Banner.tsx │ │ │ ├── ChainAndPartner.tsx │ │ │ ├── CommandMessages.tsx │ │ │ ├── ExpressYourSelf.tsx │ │ │ ├── Heading.tsx │ │ │ ├── Left.tsx │ │ │ ├── List.tsx │ │ │ ├── PayYourFrens.tsx │ │ │ ├── Right.tsx │ │ │ ├── SendAGift.tsx │ │ │ ├── SetupIsSimple.tsx │ │ │ └── SkipTheMath.tsx │ │ ├── IntegratedChains.tsx │ │ ├── MainSidebarHeader.tsx │ │ ├── MochiWidget │ │ │ ├── AmountInput │ │ │ │ ├── AmountInput.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── useSolPrice.ts │ │ │ ├── ChainPicker │ │ │ │ ├── ChainItem.tsx │ │ │ │ ├── ChainList.tsx │ │ │ │ ├── ChainPicker.tsx │ │ │ │ ├── EmptyList.tsx │ │ │ │ ├── data.ts │ │ │ │ └── index.ts │ │ │ ├── MessagePicker │ │ │ │ ├── MessagePicker.tsx │ │ │ │ ├── data.ts │ │ │ │ └── useDefaultMessage.ts │ │ │ ├── PlatformPicker │ │ │ │ ├── PlatformIcon.tsx │ │ │ │ ├── PlatformItem.tsx │ │ │ │ ├── PlatformList.tsx │ │ │ │ ├── PlatformPicker.tsx │ │ │ │ ├── icons │ │ │ │ │ ├── discord-ic.tsx │ │ │ │ │ ├── github-ic.tsx │ │ │ │ │ ├── google-ic.tsx │ │ │ │ │ ├── onchain-ic.tsx │ │ │ │ │ ├── reddit-ic.tsx │ │ │ │ │ ├── telegram-ic.tsx │ │ │ │ │ └── x-ic.tsx │ │ │ │ ├── index.ts │ │ │ │ └── type.ts │ │ │ ├── Recipient │ │ │ │ ├── ContactList.tsx │ │ │ │ ├── EmptyList.tsx │ │ │ │ ├── Recipient.tsx │ │ │ │ ├── RecipientItem.tsx │ │ │ │ ├── RecipientList.tsx │ │ │ │ ├── SelectedRecipient.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── platform-detector.tsx │ │ │ ├── ThemePicker │ │ │ │ └── ThemePicker.tsx │ │ │ ├── Timer │ │ │ │ └── index.tsx │ │ │ ├── Tip │ │ │ │ ├── Skeleton.tsx │ │ │ │ ├── StepOne.tsx │ │ │ │ ├── StepTwo.tsx │ │ │ │ ├── index.tsx │ │ │ │ └── store.tsx │ │ │ ├── TokenPicker │ │ │ │ ├── EmptyList.tsx │ │ │ │ ├── TokenItem.tsx │ │ │ │ ├── TokenList.tsx │ │ │ │ ├── TokenPicker.tsx │ │ │ │ ├── default-data.ts │ │ │ │ ├── index.ts │ │ │ │ ├── sort-order.json │ │ │ │ ├── type.ts │ │ │ │ └── utils.ts │ │ │ ├── TransactionPreview │ │ │ │ └── TransactionPreview.tsx │ │ │ └── index.tsx │ │ ├── Modal.tsx │ │ ├── MonikerTableList.tsx │ │ ├── NativeImage │ │ │ ├── NativeImage.tsx │ │ │ └── index.ts │ │ ├── NotificationList │ │ │ ├── AirdropRow.tsx │ │ │ ├── NotificationModal.tsx │ │ │ ├── PayLinkRow.tsx │ │ │ ├── PayMeRow.tsx │ │ │ ├── Row.tsx │ │ │ ├── Skeleton.tsx │ │ │ ├── SwapRow.tsx │ │ │ ├── TransferRow.tsx │ │ │ ├── WithdrawRow.tsx │ │ │ ├── index.tsx │ │ │ └── util.ts │ │ ├── Pay │ │ │ ├── Card.tsx │ │ │ ├── ConnectSocialButton.tsx │ │ │ ├── CopyLinkButton.tsx │ │ │ ├── DropdownButton.tsx │ │ │ ├── Footer.tsx │ │ │ ├── PaymentButton.tsx │ │ │ ├── QRCodeButton.tsx │ │ │ ├── ShareButton.tsx │ │ │ ├── WalletAddressForm.tsx │ │ │ ├── WalletButton.tsx │ │ │ └── components │ │ │ │ └── SocialButtons.tsx │ │ ├── PayRequest │ │ │ ├── Footer.tsx │ │ │ ├── Header.tsx │ │ │ ├── LowerBody.tsx │ │ │ ├── PayButton.tsx │ │ │ ├── PayLink.tsx │ │ │ ├── PayMe.tsx │ │ │ ├── ShareButton.tsx │ │ │ ├── UpperBody.tsx │ │ │ ├── WithdrawButton.tsx │ │ │ ├── index.tsx │ │ │ ├── type.ts │ │ │ └── utils.ts │ │ ├── Popover.tsx │ │ ├── Profile │ │ │ ├── ProfileWidget.tsx │ │ │ ├── RecapSection.tsx │ │ │ └── TransactionSection.tsx │ │ ├── ProfileDropdown.tsx │ │ ├── Receipt │ │ │ ├── Buttons.tsx │ │ │ ├── Header.tsx │ │ │ ├── ListUser.tsx │ │ │ ├── Template.tsx │ │ │ ├── index.tsx │ │ │ └── utils.ts │ │ ├── SaveBar.tsx │ │ ├── TipNetwork │ │ │ ├── Graph.tsx │ │ │ ├── NetworkModal.tsx │ │ │ ├── ProfileBar.tsx │ │ │ └── SelectedProfile.tsx │ │ ├── Toast │ │ │ ├── ToastError.tsx │ │ │ ├── ToastLoading.tsx │ │ │ └── ToastSuccess.tsx │ │ ├── TokenAvatar.tsx │ │ ├── TokenTableList.tsx │ │ ├── TransactionPeekingCard │ │ │ ├── TransactionPeekingCard.tsx │ │ │ └── index.ts │ │ ├── TransactionTable │ │ │ ├── TransactionAction.tsx │ │ │ ├── TransactionBadge.tsx │ │ │ ├── TransactionHeaderAction.tsx │ │ │ ├── TransactionHeaderTotalValue.tsx │ │ │ ├── TransactionHeaderWen.tsx │ │ │ ├── TransactionIssuedBy.tsx │ │ │ ├── TransactionRecipients.tsx │ │ │ ├── TransactionStatusIcon.tsx │ │ │ ├── TransactionTable.tsx │ │ │ ├── TransactionTime.tsx │ │ │ ├── TransactionTxGroup.tsx │ │ │ ├── index.ts │ │ │ ├── types.ts │ │ │ └── utils.tsx │ │ ├── VerifyWallet │ │ │ ├── VerifyWallet.tsx │ │ │ └── index.tsx │ │ ├── Wallet │ │ │ ├── ConnectDetail.tsx │ │ │ ├── ConnectWalletIntro.tsx │ │ │ ├── ConnectWalletModal.tsx │ │ │ └── QRCode.tsx │ │ ├── app │ │ │ ├── AppListing.tsx │ │ │ ├── DeleteAppModal.tsx │ │ │ ├── NewAppForm.tsx │ │ │ ├── Statistics.tsx │ │ │ ├── StatisticsBox.tsx │ │ │ └── detail │ │ │ │ ├── AppDetailApiCalls.tsx │ │ │ │ ├── AppDetailIntegration.tsx │ │ │ │ ├── AppDetailMembers.tsx │ │ │ │ ├── AppDetailNewUrl.tsx │ │ │ │ ├── AppDetailPageHeader.tsx │ │ │ │ ├── AppDetailPlatforms.tsx │ │ │ │ ├── AppDetailSkeleton.tsx │ │ │ │ ├── AppDetailStatistics.tsx │ │ │ │ ├── AppDetailUrl.tsx │ │ │ │ ├── CodeSnippet.tsx │ │ │ │ └── ResetKeyModal.tsx │ │ ├── base │ │ │ ├── alert │ │ │ │ ├── alert.tsx │ │ │ │ └── index.ts │ │ │ ├── avatar │ │ │ │ ├── avatar.tsx │ │ │ │ └── index.ts │ │ │ ├── button │ │ │ │ ├── button.tsx │ │ │ │ └── index.ts │ │ │ ├── dnd │ │ │ │ ├── DndItem.tsx │ │ │ │ ├── DndWrapper.tsx │ │ │ │ ├── StrictModeDroppable.tsx │ │ │ │ └── index.ts │ │ │ ├── input │ │ │ │ ├── index.ts │ │ │ │ └── input.tsx │ │ │ ├── radio │ │ │ │ ├── index.ts │ │ │ │ └── radio.tsx │ │ │ ├── section-list │ │ │ │ ├── index.ts │ │ │ │ └── section-list.tsx │ │ │ ├── switch │ │ │ │ ├── index.ts │ │ │ │ └── switch.tsx │ │ │ └── text │ │ │ │ ├── index.ts │ │ │ │ └── text.tsx │ │ ├── drawer.tsx │ │ ├── explore │ │ │ └── index │ │ │ │ ├── components │ │ │ │ ├── ChainPicker.tsx │ │ │ │ ├── PlatformPicker.tsx │ │ │ │ └── index.ts │ │ │ │ ├── index.ts │ │ │ │ ├── sections │ │ │ │ ├── SummarySection.tsx │ │ │ │ ├── TransactionSection.tsx │ │ │ │ └── index.ts │ │ │ │ └── stores │ │ │ │ ├── index.ts │ │ │ │ ├── useTransactionStore.ts │ │ │ │ └── useTransactionSummaryStore.ts │ │ ├── landing │ │ │ ├── Divider.tsx │ │ │ ├── GridFeatures.tsx │ │ │ ├── LivePlatforms.tsx │ │ │ ├── SoonAvailablePlatforms.tsx │ │ │ ├── SupportedPlatforms.tsx │ │ │ └── TabbedFeatures.tsx │ │ ├── profile.tsx │ │ ├── settings │ │ │ ├── general │ │ │ │ ├── AddNewWalletModal.tsx │ │ │ │ ├── DefaultMessage.tsx │ │ │ │ ├── GeneralPage.tsx │ │ │ │ ├── MessageModal.tsx │ │ │ │ ├── MoneySource.tsx │ │ │ │ ├── ReceiverPlatform.tsx │ │ │ │ ├── TokenPriority.tsx │ │ │ │ ├── TokenPriorityModal.tsx │ │ │ │ ├── TransactionLimit.tsx │ │ │ │ ├── TransactionLimitModal.tsx │ │ │ │ ├── TransactionPrivacy.tsx │ │ │ │ └── WalletPrivacy.tsx │ │ │ └── notification │ │ │ │ ├── NotificationPage.tsx │ │ │ │ └── type.ts │ │ └── stats.tsx │ ├── constants │ │ ├── api.ts │ │ ├── app.ts │ │ ├── common.ts │ │ ├── date.ts │ │ ├── events.ts │ │ ├── index.ts │ │ ├── mochi.ts │ │ ├── resources.ts │ │ ├── routes.ts │ │ ├── settings.ts │ │ └── transactions.ts │ ├── context │ │ ├── app │ │ │ └── sidebar.tsx │ │ ├── wallet-context.tsx │ │ └── wallets │ │ │ ├── Wallet.ts │ │ │ ├── ethereum │ │ │ ├── EVMWalletProvider.tsx │ │ │ ├── chains.ts │ │ │ ├── getDefaultWallets.ts │ │ │ ├── getWalletConnectConnector.ts │ │ │ ├── ronin │ │ │ │ └── ronin.d.ts │ │ │ └── walletConnectors.ts │ │ │ ├── recentWalletIds.ts │ │ │ ├── solana │ │ │ ├── SolanaWalletProvider.tsx │ │ │ ├── chains.ts │ │ │ ├── getDefaultWallets.ts │ │ │ └── walletAdapters.ts │ │ │ ├── sui │ │ │ └── SuiWalletProvider.tsx │ │ │ └── useWalletConnectors.ts │ ├── envs.ts │ ├── hooks │ │ ├── app │ │ │ ├── useFetchApplicationDetail.ts │ │ │ ├── useFetchApplicationDetailMembers.ts │ │ │ ├── useFetchApplicationDetailStats.ts │ │ │ ├── useFetchApplicationDetailWebhookLogs.ts │ │ │ ├── useFetchApplicationList.ts │ │ │ ├── useFetchApplicationStats.ts │ │ │ └── useFetchChangelogLatest.ts │ │ ├── changelog │ │ │ └── useFetchChangelogs.ts │ │ ├── profile │ │ │ ├── useFetchMonthlyStats.ts │ │ │ ├── useFetchPayRequests.ts │ │ │ ├── useFetchProfileGlobalInfo.ts │ │ │ └── useFetchTotalBalance.ts │ │ ├── settings │ │ │ ├── useFetchGeneralSettings.ts │ │ │ └── useFetchNotificationSettings.ts │ │ ├── useIsVisible.ts │ │ ├── useLockScreenScroll.ts │ │ ├── useLoginAfterConnect.ts │ │ ├── useResponsiveScreen.ts │ │ ├── useTheme.ts │ │ ├── useWarnIfUnsavedChanges.ts │ │ └── wallets │ │ │ ├── useAccount.ts │ │ │ ├── useChain.ts │ │ │ ├── useEns.ts │ │ │ ├── useSendEVMToken.ts │ │ │ ├── useSendSOLToken.ts │ │ │ ├── useSignMessage.ts │ │ │ ├── useSns.ts │ │ │ └── useSolBalance.ts │ ├── next-env.d.ts │ ├── next.config.js │ ├── package.json │ ├── pages │ │ ├── 404.tsx │ │ ├── [username] │ │ │ └── receive │ │ │ │ └── [pay_code].tsx │ │ ├── _app.tsx │ │ ├── _components.tsx │ │ ├── _document.tsx │ │ ├── airdrop │ │ │ └── [id].tsx │ │ ├── api │ │ │ ├── auth │ │ │ │ ├── discord-callback.ts │ │ │ │ ├── facebook-callback.ts │ │ │ │ ├── mail-callback.ts │ │ │ │ ├── telegram-callback.ts │ │ │ │ └── twitter-callback.ts │ │ │ ├── pay-og.tsx │ │ │ └── transfer-og.tsx │ │ ├── applications │ │ │ ├── [id].tsx │ │ │ ├── [id] │ │ │ │ └── revenue.tsx │ │ │ └── index.tsx │ │ ├── changelog │ │ │ ├── [version].tsx │ │ │ └── index.tsx │ │ ├── connect-telegram.tsx │ │ ├── developer.tsx │ │ ├── explore.tsx │ │ ├── features.tsx │ │ ├── index.tsx │ │ ├── pay │ │ │ └── [pay_code].tsx │ │ ├── privacy.tsx │ │ ├── profile │ │ │ └── index.tsx │ │ ├── server │ │ │ ├── [id].tsx │ │ │ └── index.tsx │ │ ├── settings.tsx │ │ ├── tip-network.tsx │ │ ├── tx │ │ │ └── [id].tsx │ │ └── verify.tsx │ ├── postcss.config.js │ ├── proxy-config.json │ ├── public │ │ ├── android-chrome-192x192.png │ │ ├── android-chrome-512x512.png │ │ ├── android-chrome-96x96.png │ │ ├── apple-touch-icon.png │ │ ├── assets │ │ │ ├── ads │ │ │ │ ├── 512x512.png │ │ │ │ ├── big-ad.png │ │ │ │ ├── discord-1546x423.png │ │ │ │ ├── no-img.png │ │ │ │ ├── small-ad.png │ │ │ │ └── tele-1546x423.png │ │ │ ├── app-statistics.png │ │ │ ├── coin.png │ │ │ ├── dashboard │ │ │ │ ├── coin.png │ │ │ │ └── xp.png │ │ │ ├── eth-icon.png │ │ │ ├── explore │ │ │ │ └── explore.thumbnail.png │ │ │ ├── fail-stamp.png │ │ │ ├── metamask.svg │ │ │ ├── mochi-gray.png │ │ │ ├── mochi.png │ │ │ ├── mochisan-meditate.png │ │ │ ├── mochisan-money.png │ │ │ ├── mochisan-panic.png │ │ │ ├── mochisan-spaceship.png │ │ │ ├── mochisan-stars.png │ │ │ ├── mochisan-vault.png │ │ │ ├── mochisan.png │ │ │ ├── money.png │ │ │ ├── sol-icon.png │ │ │ ├── success-stamp.png │ │ │ ├── ticker.png │ │ │ ├── tip.png │ │ │ ├── tip │ │ │ │ ├── dianne.png │ │ │ │ ├── edwards.png │ │ │ │ ├── jenny.png │ │ │ │ ├── simmons.png │ │ │ │ └── wade.png │ │ │ ├── tx │ │ │ │ ├── achievement.png │ │ │ │ ├── appreciation.png │ │ │ │ ├── hpbd.png │ │ │ │ └── wedding.png │ │ │ ├── verify.png │ │ │ ├── wallet-intro.png │ │ │ └── watch-red.png │ │ ├── browserconfig.xml │ │ ├── chain-and-partner.png │ │ ├── changelog-thumbnail.png │ │ ├── consolelabs-black.svg │ │ ├── developer │ │ │ ├── balance.png │ │ │ ├── browse-api-left-border.png │ │ │ ├── build-with-mochi-apis-1.png │ │ │ ├── link.png │ │ │ ├── profile-circle.png │ │ │ ├── server.png │ │ │ ├── tip.png │ │ │ └── vault.png │ │ ├── diag.png │ │ ├── dot-bg.png │ │ ├── favicon-16x16.png │ │ ├── favicon-32x32.png │ │ ├── favicon.ico │ │ ├── feature-1.png │ │ ├── feature-10.png │ │ ├── feature-11.png │ │ ├── feature-12.png │ │ ├── feature-13.png │ │ ├── feature-14.png │ │ ├── feature-15.png │ │ ├── feature-16.png │ │ ├── feature-2.png │ │ ├── feature-3.png │ │ ├── feature-4.png │ │ ├── feature-5.png │ │ ├── feature-6.png │ │ ├── feature-7.png │ │ ├── feature-8.png │ │ ├── feature-9.png │ │ ├── featured.png │ │ ├── hero-bg.png │ │ ├── home.png │ │ ├── home │ │ │ ├── airdrop.svg │ │ │ ├── api.png │ │ │ ├── apple.png │ │ │ ├── avatar.png │ │ │ ├── deposit.svg │ │ │ ├── express-yourself.png │ │ │ ├── pay-link.svg │ │ │ ├── pay-me.svg │ │ │ ├── send-n-receive.png │ │ │ ├── send-n-receive.svg │ │ │ ├── social-icons.png │ │ │ ├── split.svg │ │ │ ├── swap.svg │ │ │ ├── tip-list.svg │ │ │ └── tip.svg │ │ ├── icon-container.png │ │ ├── integrated-chains │ │ │ ├── aptos.png │ │ │ ├── arb.png │ │ │ ├── base.webp │ │ │ ├── bnb.png │ │ │ ├── btc.png │ │ │ ├── eth.png │ │ │ ├── ftm.png │ │ │ ├── okx.png │ │ │ ├── onus.webp │ │ │ ├── op.png │ │ │ ├── polygon.png │ │ │ ├── sol.png │ │ │ └── sui.png │ │ ├── logo.png │ │ ├── mochi-logo.png │ │ ├── mochi-qilin.jpg │ │ ├── mochi-snowman.jpg │ │ ├── mochi-text-circle.png │ │ ├── mochi-welcome.jpg │ │ ├── mstile-150x150.png │ │ ├── nft-rarity-ranking.png │ │ ├── partner │ │ │ ├── blue-move.png │ │ │ ├── okx.png │ │ │ ├── onus.webp │ │ │ └── solscan.webp │ │ ├── party.gif │ │ ├── pay-request-bg.png │ │ ├── platforms │ │ │ ├── app.png │ │ │ ├── discord.png │ │ │ ├── telegram.webp │ │ │ ├── web.png │ │ │ └── x.png │ │ ├── rings.png │ │ ├── rocket.gif │ │ ├── rocket.png │ │ ├── safari-pinned-tab.svg │ │ ├── site.webmanifest │ │ ├── svg │ │ │ ├── chain-icons │ │ │ │ ├── arbitrum.svg │ │ │ │ ├── avalanche.svg │ │ │ │ ├── ethereum.svg │ │ │ │ ├── hardhat.svg │ │ │ │ ├── optimism.svg │ │ │ │ ├── polygon.svg │ │ │ │ └── solana.svg │ │ │ ├── wallet-icons │ │ │ │ ├── argent.svg │ │ │ │ ├── brave.svg │ │ │ │ ├── coinbase.svg │ │ │ │ ├── imToken.svg │ │ │ │ ├── injected.png │ │ │ │ ├── ledger.svg │ │ │ │ ├── metaMask.svg │ │ │ │ ├── rainbow.svg │ │ │ │ ├── ronin.svg │ │ │ │ ├── steak.svg │ │ │ │ ├── trust.svg │ │ │ │ └── walletConnect.svg │ │ │ └── wavy-pattern.svg │ │ ├── teams │ │ │ └── dango.png │ │ ├── thumbs-up.gif │ │ ├── tip-theme-christmas.jpg │ │ ├── tip-theme-hpbd.jpg │ │ ├── tip-theme-more.jpg │ │ ├── tip-theme-new-year.jpg │ │ ├── tip.png │ │ ├── to-the-moon.png │ │ ├── util-1.png │ │ ├── util-2.png │ │ ├── util-3.png │ │ ├── util-4.png │ │ └── warpcast.png │ ├── store │ │ ├── auth.ts │ │ ├── dashboard.ts │ │ ├── index.ts │ │ ├── mochi-widget.ts │ │ ├── pay-request.ts │ │ ├── profile.ts │ │ ├── unsaved-changes.ts │ │ └── wallets.ts │ ├── styles │ │ ├── global.css │ │ ├── home.css │ │ ├── nprogress.css │ │ └── tos.css │ ├── tailwind.config.js │ ├── tsconfig.json │ ├── types │ │ ├── api.ts │ │ ├── app.ts │ │ ├── global.d.ts │ │ ├── mochi-pay-schema.ts │ │ ├── mochi-profile-schema.ts │ │ ├── mochi-schema.ts │ │ └── tip-graph.ts │ └── utils │ │ ├── changelog.ts │ │ ├── image.ts │ │ ├── isMobile.ts │ │ ├── next-font.ts │ │ ├── number.ts │ │ ├── omitUndefinedValues.ts │ │ ├── pagination.ts │ │ ├── sol.ts │ │ ├── string.ts │ │ ├── time.ts │ │ └── url.ts └── vault │ ├── .env │ ├── .eslintrc.json │ ├── .gitignore │ ├── README.md │ ├── app │ ├── favicon.ico │ ├── globals.css │ ├── layout.tsx │ └── page.tsx │ ├── components.json │ ├── components │ ├── summary-stats.tsx │ ├── ui │ │ └── progress.tsx │ ├── vault.tsx │ └── vaults.tsx │ ├── constants.ts │ ├── envs.ts │ ├── lib │ └── utils.ts │ ├── next.config.mjs │ ├── package.json │ ├── postcss.config.mjs │ ├── providers │ └── index.tsx │ ├── public │ ├── bg.svg │ ├── logo.png │ ├── next.svg │ └── vercel.svg │ ├── tailwind.config.ts │ ├── tsconfig.json │ └── utils.ts ├── clean-package.config.json ├── config ├── eslint │ ├── CHANGELOG.md │ ├── README.md │ ├── next.js │ ├── package.json │ └── react.js └── tsconfig │ ├── CHANGELOG.md │ ├── base.json │ ├── nextjs.json │ ├── overrides.d.ts │ ├── package.json │ └── react-library.json ├── jest.config.js ├── package.json ├── packages ├── components │ ├── accordion │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── accordion.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── accordion.tsx │ │ │ └── index.ts │ │ ├── stories │ │ │ └── accordion.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── action-bar │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── package.json │ │ ├── src │ │ │ ├── action-bar-action-group.tsx │ │ │ ├── action-bar-body.tsx │ │ │ ├── action-bar-cancel.tsx │ │ │ ├── action-bar-confirm.tsx │ │ │ ├── action-bar-content.tsx │ │ │ ├── action-bar-description.tsx │ │ │ ├── action-bar-icon.tsx │ │ │ ├── action-bar-title.tsx │ │ │ ├── action-bar-trigger.tsx │ │ │ ├── action-bar.tsx │ │ │ └── index.ts │ │ ├── stories │ │ │ └── action-bar.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── alert │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── alert.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── alert-action-group.tsx │ │ │ ├── alert-body.tsx │ │ │ ├── alert-cancel.tsx │ │ │ ├── alert-close.tsx │ │ │ ├── alert-confirm.tsx │ │ │ ├── alert-description.tsx │ │ │ ├── alert-icon.tsx │ │ │ ├── alert-link.tsx │ │ │ ├── alert-title.tsx │ │ │ ├── alert.tsx │ │ │ ├── context.ts │ │ │ └── index.ts │ │ ├── stories │ │ │ └── alert.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── avatar-group │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── avatar-group.tsx │ │ │ └── index.ts │ │ ├── stories │ │ │ └── avatar-group.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── avatar │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ ├── avatar.test.tsx │ │ │ └── util.test.ts │ │ ├── package.json │ │ ├── src │ │ │ ├── avatar.tsx │ │ │ ├── index.ts │ │ │ └── util.ts │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── badge │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── badge.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── badge.tsx │ │ │ ├── context.ts │ │ │ ├── index.ts │ │ │ └── type.ts │ │ ├── stories │ │ │ └── badge.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── button │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── button.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── button.tsx │ │ │ └── index.ts │ │ ├── stories │ │ │ └── button.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── card │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── card.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── card.tsx │ │ │ └── index.ts │ │ ├── stories │ │ │ └── card.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── checkbox │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── checkbox.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── checkbox.tsx │ │ │ └── index.ts │ │ ├── stories │ │ │ └── checkbox.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── content-editable │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── content-editable.tsx │ │ │ └── index.ts │ │ ├── stories │ │ │ └── content-editable.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── drawer │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── drawer.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── context.ts │ │ │ ├── drawer.tsx │ │ │ ├── index.ts │ │ │ └── type.ts │ │ ├── stories │ │ │ └── drawer.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── dropdown │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── dropdown.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── dropdown.tsx │ │ │ ├── index.ts │ │ │ └── type.ts │ │ ├── stories │ │ │ └── dropdown.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── footer │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── footer.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── footer.tsx │ │ │ └── index.ts │ │ ├── stories │ │ │ └── footer.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── form-context │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── context.tsx │ │ │ └── index.ts │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── form │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── package.json │ │ ├── src │ │ │ ├── form-control.tsx │ │ │ ├── form-error-message.tsx │ │ │ ├── form-helper-text.tsx │ │ │ ├── form-label.tsx │ │ │ ├── index.ts │ │ │ └── type.ts │ │ ├── stories │ │ │ └── form-control.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── icon-button │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── icon-button.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── icon-button.tsx │ │ │ └── index.ts │ │ ├── stories │ │ │ └── icon-button.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── icons │ │ ├── stories │ │ │ └── icon.stories.tsx │ │ └── tsconfig.json │ ├── input │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── input.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── textfield.tsx │ │ ├── stories │ │ │ └── input.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── label │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── label.tsx │ │ ├── stories │ │ │ └── label.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── layout │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── layout.test.tsx │ │ ├── hooks │ │ │ ├── index.ts │ │ │ └── useHasSidebar.ts │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── layout.tsx │ │ ├── stories │ │ │ └── layout.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── list │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── list.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── list.tsx │ │ ├── stories │ │ │ └── list.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── logo │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── logo.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── logo.tsx │ │ │ └── svg-element.tsx │ │ ├── stories │ │ │ └── logo.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── modal │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── modal.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── modal.tsx │ │ ├── stories │ │ │ └── modal.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── page-content │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── page-content.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── page-content.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── page-header │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── page-header.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── page-header.tsx │ │ │ └── type.ts │ │ ├── stories │ │ │ └── page-header.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── pagination │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── pagination.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── pagination.tsx │ │ │ └── utils.ts │ │ ├── stories │ │ │ └── pagination.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── polymorphic │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── polymorphic.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── popover │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── popover.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── popover.tsx │ │ ├── stories │ │ │ └── popover.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── profile-badge │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── profile-badge.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── profile-badge.tsx │ │ ├── stories │ │ │ └── profile-badge.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── scroll-area │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── scroll-area.tsx │ │ ├── stories │ │ │ └── scroll-area.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── section-header │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── section-header.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── context.ts │ │ │ ├── index.ts │ │ │ ├── section-header.tsx │ │ │ └── type.ts │ │ ├── stories │ │ │ └── section-header.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── select │ │ ├── .eslintrc.js │ │ ├── .prettierignore │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── select.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── context.ts │ │ │ ├── index.ts │ │ │ ├── select.tsx │ │ │ └── type.ts │ │ ├── stories │ │ │ └── select.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── separator │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── separator.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── separator.tsx │ │ ├── stories │ │ │ └── separator.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── sidebar │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── sidebar.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ ├── sidebar-item-list.tsx │ │ │ ├── sidebar-item.tsx │ │ │ └── sidebar.tsx │ │ ├── stories │ │ │ └── sidebar.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── skeleton │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── skeleton.tsx │ │ ├── stories │ │ │ └── skeleton.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── stepper │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── context.ts │ │ │ ├── index.ts │ │ │ ├── step-content.tsx │ │ │ ├── step-description.tsx │ │ │ ├── step-indicator.tsx │ │ │ ├── step-item.tsx │ │ │ ├── step-separator.tsx │ │ │ ├── step-title.tsx │ │ │ └── stepper.tsx │ │ ├── stories │ │ │ └── stepper.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── switch │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── switch.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── Switch.tsx │ │ │ └── index.ts │ │ ├── stories │ │ │ └── switch.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── table │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── table.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── table.tsx │ │ ├── stories │ │ │ └── table.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── tabs │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── tabs.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── tabs.tsx │ │ ├── stories │ │ │ └── tabs.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── toast │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── package.json │ │ ├── src │ │ │ ├── hook │ │ │ │ ├── index.ts │ │ │ │ └── use-toast │ │ │ │ │ ├── constants.ts │ │ │ │ │ ├── index.ts │ │ │ │ │ ├── reducer.ts │ │ │ │ │ ├── toast.ts │ │ │ │ │ ├── type.ts │ │ │ │ │ ├── use-toast.ts │ │ │ │ │ └── utils.ts │ │ │ ├── index.ts │ │ │ ├── toast-body.tsx │ │ │ ├── toast-close.tsx │ │ │ ├── toast-description.tsx │ │ │ ├── toast-icon.tsx │ │ │ ├── toast-link.tsx │ │ │ ├── toast-title.tsx │ │ │ ├── toast.tsx │ │ │ ├── toaster.tsx │ │ │ └── type.ts │ │ ├── stories │ │ │ └── toast.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── toggle-button │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── toggle-button.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── toggle-button.tsx │ │ ├── stories │ │ │ └── toggle-button.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── tooltip │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── tooltip.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── tooltip.tsx │ │ ├── stories │ │ │ └── tooltip.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── top-bar │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── top-bar.test.tsx │ │ ├── hooks │ │ │ ├── index.ts │ │ │ └── useLockScreenScroll.ts │ │ ├── package.json │ │ ├── src │ │ │ ├── desktop-nav.tsx │ │ │ ├── index.ts │ │ │ ├── mobile-nav.tsx │ │ │ ├── top-bar.tsx │ │ │ └── type.ts │ │ ├── stories │ │ │ └── top-bar.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ ├── typography │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ │ └── typography.test.tsx │ │ ├── package.json │ │ ├── src │ │ │ ├── index.ts │ │ │ └── typography.tsx │ │ ├── stories │ │ │ └── typography.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts │ └── value-change │ │ ├── .eslintrc.js │ │ ├── CHANGELOG.md │ │ ├── README.md │ │ ├── __tests__ │ │ └── value-change.test.tsx │ │ ├── package.json │ │ ├── src │ │ ├── context.ts │ │ ├── index.ts │ │ ├── type.ts │ │ └── value-change.tsx │ │ ├── stories │ │ └── value-change.stories.tsx │ │ ├── tsconfig.json │ │ └── tsup.config.ts ├── core │ ├── .eslintrc.js │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── provider.d.ts │ ├── src │ │ └── index.ts │ ├── tsconfig.json │ └── tsup.config.ts ├── icons │ ├── .eslintrc.js │ ├── .gitignore │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── scripts │ │ ├── build-clean-packages.ts │ │ ├── clean.ts │ │ ├── generate-icon-components.ts │ │ └── paths.ts │ ├── src │ │ └── svg │ │ │ ├── line │ │ │ ├── alert-circle.svg │ │ │ ├── alert-triangle.svg │ │ │ ├── arrow-bottom-left.svg │ │ │ ├── arrow-bottom-right.svg │ │ │ ├── arrow-down-short.svg │ │ │ ├── arrow-down.svg │ │ │ ├── arrow-left.svg │ │ │ ├── arrow-right-short.svg │ │ │ ├── arrow-right.svg │ │ │ ├── arrow-top-left.svg │ │ │ ├── arrow-top-right.svg │ │ │ ├── arrow-up-down.svg │ │ │ ├── arrow-up-short.svg │ │ │ ├── arrow-up.svg │ │ │ ├── back.svg │ │ │ ├── bank.svg │ │ │ ├── bullets-list.svg │ │ │ ├── calendar.svg │ │ │ ├── chart.svg │ │ │ ├── check-circle-half-colored.svg │ │ │ ├── check.svg │ │ │ ├── chevron-down.svg │ │ │ ├── chevron-left.svg │ │ │ ├── chevron-right.svg │ │ │ ├── chevron-up.svg │ │ │ ├── clock-circle-arrow-colored.svg │ │ │ ├── close-lg.svg │ │ │ ├── close.svg │ │ │ ├── coin-swap.svg │ │ │ ├── copy.svg │ │ │ ├── corner-bottom-left.svg │ │ │ ├── direction.svg │ │ │ ├── edit.svg │ │ │ ├── face-id.svg │ │ │ ├── gear.svg │ │ │ ├── gift.svg │ │ │ ├── inbox.svg │ │ │ ├── link-horizontal.svg │ │ │ ├── link.svg │ │ │ ├── magnifier.svg │ │ │ ├── mail.svg │ │ │ ├── minus.svg │ │ │ ├── monitor.svg │ │ │ ├── moon.svg │ │ │ ├── parachute.svg │ │ │ ├── payment-cash-out.svg │ │ │ ├── plus.svg │ │ │ ├── profile-guard-success-colored.svg │ │ │ ├── profile-guard-success-dark-colored.svg │ │ │ ├── scan.svg │ │ │ ├── sidebar-arrow.svg │ │ │ ├── spinner.svg │ │ │ ├── sun.svg │ │ │ ├── three-dot.svg │ │ │ ├── trash-bin-2.svg │ │ │ ├── trash-bin.svg │ │ │ └── trophy.svg │ │ │ ├── outlined │ │ │ ├── book-mark.svg │ │ │ ├── check-circle.svg │ │ │ ├── cross-circle.svg │ │ │ ├── exclamation-triangle.svg │ │ │ ├── info-circle.svg │ │ │ ├── minus-circle.svg │ │ │ └── plus-circle.svg │ │ │ ├── pictogram │ │ │ ├── arrow-down-down-colored.svg │ │ │ ├── arrow-up-up-colored.svg │ │ │ ├── bag-colored.svg │ │ │ ├── bag-dark-colored.svg │ │ │ ├── bag-dark.svg │ │ │ ├── bag.svg │ │ │ ├── binary-lock-colored.svg │ │ │ ├── binary-lock-dark-colored.svg │ │ │ ├── blocks-colored.svg │ │ │ ├── blocks-dark-colored.svg │ │ │ ├── dango.svg │ │ │ ├── dollar-colored.svg │ │ │ ├── encrypted-colored.svg │ │ │ ├── encrypted-dark-colored.svg │ │ │ ├── hand-key-colored.svg │ │ │ ├── hand-key-dark-colored.svg │ │ │ ├── heart-colored.svg │ │ │ ├── layers-colored.svg │ │ │ ├── layers-dark-colores.svg │ │ │ ├── link-colored.svg │ │ │ ├── password-lock-colored.svg │ │ │ ├── password-lock-dark-colored.svg │ │ │ ├── pay-link-colored.svg │ │ │ ├── pay-link-dark-colored.svg │ │ │ ├── profile-shield-colored.svg │ │ │ ├── profile-shield-dark-colored.svg │ │ │ ├── server-colored.svg │ │ │ ├── server-dark-colored.svg │ │ │ ├── spinner.svg │ │ │ ├── three-dot-loading.svg │ │ │ ├── tip-colored.svg │ │ │ ├── tip-dark-colored.svg │ │ │ ├── user-shield-colored.svg │ │ │ ├── vault-colored.svg │ │ │ ├── vault-dark-colored.svg │ │ │ ├── wallet-password-colored.svg │ │ │ └── wallet-password-dark-colored.svg │ │ │ ├── social │ │ │ ├── apple-colored.svg │ │ │ ├── apple.svg │ │ │ ├── chrome-colored.svg │ │ │ ├── discord-colored.svg │ │ │ ├── discord.svg │ │ │ ├── facebook-colored.svg │ │ │ ├── facebook.svg │ │ │ ├── farcaster-colored.svg │ │ │ ├── farcaster.svg │ │ │ ├── github.svg │ │ │ ├── google-colored.svg │ │ │ ├── google.svg │ │ │ ├── master-card.svg │ │ │ ├── reddit-colored.svg │ │ │ ├── reddit.svg │ │ │ ├── slack-colored.svg │ │ │ ├── slack.svg │ │ │ ├── telegram-colored.svg │ │ │ ├── telegram.svg │ │ │ ├── x.svg │ │ │ └── youtube.svg │ │ │ ├── solid │ │ │ ├── add-user.svg │ │ │ ├── airdrop-circle.svg │ │ │ ├── arrow-down-square.svg │ │ │ ├── arrow-up-square.svg │ │ │ ├── bar-chart.svg │ │ │ ├── bell-new.svg │ │ │ ├── bell.svg │ │ │ ├── binocular.svg │ │ │ ├── book-mark.svg │ │ │ ├── category.svg │ │ │ ├── chart.svg │ │ │ ├── coding.svg │ │ │ ├── computer-pc-laptop.svg │ │ │ ├── copy.svg │ │ │ ├── desktop-code.svg │ │ │ ├── document-one.svg │ │ │ ├── document-star.svg │ │ │ ├── dollar-bubble-circle.svg │ │ │ ├── dollar-bubble.svg │ │ │ ├── dollar-square.svg │ │ │ ├── eye-hidden.svg │ │ │ ├── eye-show.svg │ │ │ ├── fire.svg │ │ │ ├── game.svg │ │ │ ├── gear.svg │ │ │ ├── gift.svg │ │ │ ├── home.svg │ │ │ ├── inbox.svg │ │ │ ├── key.svg │ │ │ ├── life-buoy.svg │ │ │ ├── link-circled.svg │ │ │ ├── link-squircled.svg │ │ │ ├── logout.svg │ │ │ ├── mail.svg │ │ │ ├── menu-add.svg │ │ │ ├── menu.svg │ │ │ ├── paperplane-circle.svg │ │ │ ├── paperplane.svg │ │ │ ├── payment-cash-out.svg │ │ │ ├── plug.svg │ │ │ ├── plus-circle.svg │ │ │ ├── quests.svg │ │ │ ├── refresh.svg │ │ │ ├── safe-box.svg │ │ │ ├── shapes.svg │ │ │ ├── share.svg │ │ │ ├── shield-done.svg │ │ │ ├── solid-dot.svg │ │ │ ├── star.svg │ │ │ ├── stars.svg │ │ │ ├── super-group.svg │ │ │ ├── swap-circle.svg │ │ │ ├── tea.svg │ │ │ ├── tip.svg │ │ │ ├── trash-bin.svg │ │ │ ├── trophy.svg │ │ │ ├── twinkle.svg │ │ │ ├── union.svg │ │ │ ├── user.svg │ │ │ ├── vault.svg │ │ │ ├── vault2.svg │ │ │ ├── wallet-add.svg │ │ │ ├── wallet.svg │ │ │ └── web.svg │ │ │ ├── two-tone │ │ │ └── vault.svg │ │ │ ├── wallet │ │ │ ├── argent-wallet.svg │ │ │ ├── backpack-wallet.svg │ │ │ ├── coin98-wallet.svg │ │ │ ├── coinbase-wallet.svg │ │ │ ├── connect-wallets.svg │ │ │ ├── glow-wallet.svg │ │ │ ├── ledger-wallet.svg │ │ │ ├── martian-wallet.svg │ │ │ ├── metamask-wallet.svg │ │ │ ├── okx-wallet.svg │ │ │ ├── phantom-wallet.svg │ │ │ ├── rabby-wallet.svg │ │ │ ├── rainbow-wallet.svg │ │ │ ├── ronin-wallet.svg │ │ │ ├── safepal-wallet.svg │ │ │ ├── suiet-wallet.svg │ │ │ ├── ton-keeper-wallet.svg │ │ │ ├── trust-wallet.svg │ │ │ └── uniswap-wallet.svg │ │ │ └── web3 │ │ │ ├── apt.svg │ │ │ ├── arb.svg │ │ │ ├── atom.svg │ │ │ ├── avalanche.svg │ │ │ ├── base.svg │ │ │ ├── bnb.svg │ │ │ ├── btc.svg │ │ │ ├── consolelabs.svg │ │ │ ├── eth.svg │ │ │ ├── ftm.svg │ │ │ ├── matic.svg │ │ │ ├── mnt.svg │ │ │ ├── mochi.svg │ │ │ ├── op.svg │ │ │ ├── ron.svg │ │ │ ├── sol.svg │ │ │ ├── sui.svg │ │ │ ├── ton.svg │ │ │ └── zkSync.svg │ ├── tsconfig.json │ ├── tsup.config.ts │ └── types.d.ts ├── storybook │ ├── .gitignore │ ├── .storybook │ │ ├── assets │ │ │ ├── banner.webp │ │ │ ├── favicon.ico │ │ │ ├── favicon.png │ │ │ ├── logo-black.png │ │ │ └── logo-white.png │ │ ├── main.ts │ │ ├── manager-head.html │ │ ├── preview-head.html │ │ ├── preview.tsx │ │ └── styles.css │ ├── package.json │ ├── postcss.config.js │ ├── src │ │ ├── colors.stories.mdx │ │ ├── installation.stories.mdx │ │ ├── philosophy.stories.mdx │ │ └── welcome.stories.mdx │ ├── tailwind.config.js │ └── tsconfig.json ├── theme │ ├── .eslintrc.js │ ├── CHANGELOG.md │ ├── README.md │ ├── clean-package.config.json │ ├── package.json │ ├── plugin.d.ts │ ├── plugin.js │ ├── src │ │ ├── colors │ │ │ ├── common.ts │ │ │ ├── index.ts │ │ │ ├── semantic.ts │ │ │ └── types.ts │ │ ├── components │ │ │ ├── accordion.ts │ │ │ ├── action-bar.ts │ │ │ ├── alert.ts │ │ │ ├── avatar.ts │ │ │ ├── badge.ts │ │ │ ├── button.ts │ │ │ ├── card.ts │ │ │ ├── checkbox.ts │ │ │ ├── connect-wallet-widget.ts │ │ │ ├── content-editable.ts │ │ │ ├── drawer.ts │ │ │ ├── dropdown.ts │ │ │ ├── footer.ts │ │ │ ├── form-control.ts │ │ │ ├── icon-button.ts │ │ │ ├── index.ts │ │ │ ├── label.ts │ │ │ ├── layout.ts │ │ │ ├── list.ts │ │ │ ├── login-widget.ts │ │ │ ├── logo.ts │ │ │ ├── modal.ts │ │ │ ├── page-content.ts │ │ │ ├── page-header.ts │ │ │ ├── pagination.ts │ │ │ ├── popover.ts │ │ │ ├── profile-badge.ts │ │ │ ├── scroll-area.ts │ │ │ ├── section-header.ts │ │ │ ├── select.ts │ │ │ ├── separator.ts │ │ │ ├── sidebar.ts │ │ │ ├── skeleton.ts │ │ │ ├── stepper.ts │ │ │ ├── switch.ts │ │ │ ├── table.ts │ │ │ ├── tabs.ts │ │ │ ├── textfield.ts │ │ │ ├── toast.ts │ │ │ ├── toggle-button.ts │ │ │ ├── tooltip.ts │ │ │ ├── top-bar.ts │ │ │ ├── typography.ts │ │ │ └── value-change.ts │ │ ├── index.ts │ │ ├── plugin.ts │ │ ├── types.ts │ │ └── util.ts │ ├── tsconfig.json │ └── tsup.config.ts └── web3 │ ├── connect-wallet-widget │ ├── .eslintrc.js │ ├── CHANGELOG.md │ ├── README.md │ ├── package.json │ ├── src │ │ ├── connect-wallet-widget.tsx │ │ ├── constants.ts │ │ ├── index.ts │ │ ├── providers │ │ │ ├── base.ts │ │ │ ├── disabled-provider.ts │ │ │ ├── evm-provider.ts │ │ │ ├── index.ts │ │ │ ├── provider.ts │ │ │ ├── ron-provider.ts │ │ │ └── sol-provider.ts │ │ ├── wallet-list.tsx │ │ └── wallet.tsx │ ├── stories │ │ └── connect-wallet-widget.stories.tsx │ ├── tsconfig.json │ └── tsup.config.ts │ └── login-widget │ ├── .eslintrc.js │ ├── CHANGELOG.md │ ├── PROVIDERS.md │ ├── README.md │ ├── package.json │ ├── src │ ├── connect-social.tsx │ ├── fetchers.ts │ ├── index.ts │ ├── login-content.tsx │ ├── login-widget.tsx │ ├── reducer.ts │ └── store.tsx │ ├── stories │ └── login-widget.stories.tsx │ ├── tsconfig.json │ └── tsup.config.ts ├── plop └── component │ ├── .eslintrc.js.hbs │ ├── README.md.hbs │ ├── __tests__ │ └── {{componentName}}.test.tsx.hbs │ ├── package.json.hbs │ ├── src │ ├── index.ts.hbs │ └── {{componentName}}.tsx.hbs │ ├── stories │ └── {{componentName}}.stories.tsx.hbs │ ├── tsconfig.json.hbs │ └── tsup.config.ts.hbs ├── plopfile.ts ├── pnpm-lock.yaml ├── pnpm-workspace.yaml ├── scripts ├── check-build-apps.js ├── copy-files.ts ├── modify-publish-root.ts ├── release-notify.ts ├── script-utils.ts └── setup-test.ts ├── tsconfig.json ├── turbo.json └── vercel.json /.changeset/config.json: -------------------------------------------------------------------------------- 1 | { 2 | "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json", 3 | "changelog": [ 4 | "@changesets/changelog-github", 5 | { "repo": "consolelabs/mochi-ui" } 6 | ], 7 | "commit": false, 8 | "fixed": [], 9 | "linked": [], 10 | "access": "public", 11 | "baseBranch": "main", 12 | "updateInternalDependencies": "patch", 13 | "___experimentalUnsafeOptions_WILL_CHANGE_IN_PATCH": { 14 | "onlyUpdatePeerDependentsWhenOutOfRange": true 15 | }, 16 | "ignore": ["mochi-web", "@mochi-ui/storybook"] 17 | } 18 | -------------------------------------------------------------------------------- /.commitlintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | extends: ['@commitlint/config-conventional'], 3 | rules: { 4 | 'header-max-length': [2, 'always', 80], 5 | 'type-enum': [ 6 | 2, 7 | 'always', 8 | [ 9 | 'feat', 10 | 'fix', 11 | 'release', 12 | 'docs', 13 | 'style', 14 | 'refactor', 15 | 'perf', 16 | 'test', 17 | 'chore', 18 | 'revert', 19 | 'ci', 20 | 'build', 21 | 'hotfix', 22 | ], 23 | ], 24 | }, 25 | } 26 | -------------------------------------------------------------------------------- /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [*.md] 12 | trim_trailing_whitespace = false 13 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | .next/* 2 | *.json 3 | *.md 4 | *.css 5 | *.d.ts 6 | node_modules 7 | .turbo 8 | .changeset 9 | dist 10 | public/* 11 | tests/* 12 | scripts/* 13 | *.config.js 14 | .DS_Store 15 | node_modules 16 | coverage 17 | .next 18 | build 19 | plopfile.js 20 | !.commitlintrc.cjs 21 | jest.config.js 22 | !tsup.config.ts 23 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | version: 2 2 | updates: 3 | - package-ecosystem: 'npm' 4 | directory: '/' 5 | open-pull-requests-limit: 0 6 | schedule: 7 | interval: 'weekly' 8 | allow: 9 | - dependency-type: 'production' 10 | -------------------------------------------------------------------------------- /.github/workflows/deploy-mochi-web-beta.yml: -------------------------------------------------------------------------------- 1 | name: Vercel Preview Deployment 2 | env: 3 | VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} 4 | VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} 5 | on: 6 | release: 7 | types: [prereleased] 8 | jobs: 9 | Deploy-Preview: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - uses: actions/checkout@v2 13 | - name: Merge to Preview 14 | uses: devmasx/merge-branch@master 15 | with: 16 | type: now 17 | from_branch: mochi-web-preview 18 | target_branch: mochi-web-preview-release 19 | github_token: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.github/workflows/deploy-mochi-web-prod.yml: -------------------------------------------------------------------------------- 1 | name: Vercel Production Deployment 2 | env: 3 | VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} 4 | VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} 5 | on: 6 | workflow_dispatch: 7 | release: 8 | types: [released] 9 | jobs: 10 | Deploy-Production: 11 | runs-on: ubuntu-latest 12 | steps: 13 | - uses: actions/checkout@v2 14 | - name: Merge to Prod 15 | uses: devmasx/merge-branch@master 16 | with: 17 | type: now 18 | from_branch: main 19 | target_branch: mochi-web-prod 20 | github_token: ${{ secrets.GITHUB_TOKEN }} -------------------------------------------------------------------------------- /.husky/.gitignore: -------------------------------------------------------------------------------- 1 | _ 2 | -------------------------------------------------------------------------------- /.husky/commit-msg: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | npx --no-install commitlint --edit "" 5 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | . "$(dirname "$0")/_/husky.sh" 3 | 4 | pnpm lint-staged 5 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | auto-install-peers=true 2 | -------------------------------------------------------------------------------- /.npmrc.example: -------------------------------------------------------------------------------- 1 | auto-install-peers=true 2 | registry=https://registry.npmjs.org 3 | @mochi-ui:registry=https://registry.npmjs.org 4 | @mochi-web3:registry=https://registry.npmjs.org 5 | //registry.npmjs.org/:_authToken=NPM_ACCESS_TOKEN 6 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | /build/ 2 | /dist/ 3 | coverage/ 4 | __snapshots__/ 5 | node_modules/ 6 | storybook-static/ 7 | package-lock.json 8 | pnpm-lock.yaml 9 | yarn.lock 10 | package.json 11 | 12 | # changeset 13 | CHANGELOG.md 14 | .changeset/ 15 | # next.js 16 | /.next/ 17 | /out/ 18 | # turborepo 19 | /.turbo/ 20 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "bracketSpacing": true, 3 | "bracketSameLine": false, 4 | "jsxSingleQuote": false, 5 | "printWidth": 80, 6 | "proseWrap": "always", 7 | "semi": false, 8 | "singleQuote": true, 9 | "tabWidth": 2, 10 | "trailingComma": "all", 11 | "htmlWhitespaceSensitivity": "ignore" 12 | } 13 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "eslint.workingDirectories": [ 3 | { 4 | "mode": "auto" 5 | } 6 | ], 7 | "cSpell.words": ["clsx"] 8 | } 9 | -------------------------------------------------------------------------------- /apps/mochi-web/.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | -------------------------------------------------------------------------------- /apps/mochi-web/.eslintrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | root: true, 3 | extends: ['next/core-web-vitals', 'next', 'custom/next'], 4 | } 5 | -------------------------------------------------------------------------------- /apps/mochi-web/.gitignore: -------------------------------------------------------------------------------- 1 | # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. 2 | 3 | # dependencies 4 | /node_modules 5 | /.pnp 6 | .pnp.js 7 | 8 | # testing 9 | /coverage 10 | 11 | # next.js 12 | /.next/ 13 | /out/ 14 | 15 | # production 16 | /build 17 | 18 | # misc 19 | .DS_Store 20 | 21 | # debug 22 | npm-debug.log* 23 | yarn-debug.log* 24 | yarn-error.log* 25 | 26 | # local env files 27 | .env.local 28 | .env.development.local 29 | .env.test.local 30 | .env.production.local 31 | .env 32 | 33 | # vercel 34 | .vercel 35 | 36 | # editor 37 | .vscode 38 | 39 | components/icons/components 40 | 41 | .env 42 | -------------------------------------------------------------------------------- /apps/mochi-web/__tests__/components/copy-button.test.tsx: -------------------------------------------------------------------------------- 1 | import { render } from '@testing-library/react' 2 | import CopyButton from '~cpn/CopyButton' 3 | 4 | describe('CopyButton', () => { 5 | it('renders the button with the correct text', () => { 6 | const buttonText = 'Copy me' 7 | const { getByText } = render({buttonText}) 8 | const button = getByText('Copy...me') 9 | expect(button).toBeInTheDocument() 10 | }) 11 | }) 12 | -------------------------------------------------------------------------------- /apps/mochi-web/assets/Inter-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/consolelabs/mochi-ui/0b8cd8b0722d05bd7e56101cab5e828844909b9d/apps/mochi-web/assets/Inter-Black.ttf -------------------------------------------------------------------------------- /apps/mochi-web/assets/Inter-Bold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/consolelabs/mochi-ui/0b8cd8b0722d05bd7e56101cab5e828844909b9d/apps/mochi-web/assets/Inter-Bold.ttf -------------------------------------------------------------------------------- /apps/mochi-web/assets/Inter-ExtraBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/consolelabs/mochi-ui/0b8cd8b0722d05bd7e56101cab5e828844909b9d/apps/mochi-web/assets/Inter-ExtraBold.ttf -------------------------------------------------------------------------------- /apps/mochi-web/assets/Inter-ExtraLight.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/consolelabs/mochi-ui/0b8cd8b0722d05bd7e56101cab5e828844909b9d/apps/mochi-web/assets/Inter-ExtraLight.ttf -------------------------------------------------------------------------------- /apps/mochi-web/assets/Inter-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/consolelabs/mochi-ui/0b8cd8b0722d05bd7e56101cab5e828844909b9d/apps/mochi-web/assets/Inter-Light.ttf -------------------------------------------------------------------------------- /apps/mochi-web/assets/Inter-Medium.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/consolelabs/mochi-ui/0b8cd8b0722d05bd7e56101cab5e828844909b9d/apps/mochi-web/assets/Inter-Medium.ttf -------------------------------------------------------------------------------- /apps/mochi-web/assets/Inter-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/consolelabs/mochi-ui/0b8cd8b0722d05bd7e56101cab5e828844909b9d/apps/mochi-web/assets/Inter-Regular.ttf -------------------------------------------------------------------------------- /apps/mochi-web/assets/Inter-SemiBold.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/consolelabs/mochi-ui/0b8cd8b0722d05bd7e56101cab5e828844909b9d/apps/mochi-web/assets/Inter-SemiBold.ttf -------------------------------------------------------------------------------- /apps/mochi-web/assets/Inter-Thin.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/consolelabs/mochi-ui/0b8cd8b0722d05bd7e56101cab5e828844909b9d/apps/mochi-web/assets/Inter-Thin.ttf -------------------------------------------------------------------------------- /apps/mochi-web/assets/RobotoMono-Light.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/consolelabs/mochi-ui/0b8cd8b0722d05bd7e56101cab5e828844909b9d/apps/mochi-web/assets/RobotoMono-Light.ttf -------------------------------------------------------------------------------- /apps/mochi-web/assets/RobotoMono-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/consolelabs/mochi-ui/0b8cd8b0722d05bd7e56101cab5e828844909b9d/apps/mochi-web/assets/RobotoMono-Regular.ttf -------------------------------------------------------------------------------- /apps/mochi-web/components/Changelog/ChangelogDetailTitle/index.ts: -------------------------------------------------------------------------------- 1 | export * from './ChangelogDetailTitle' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/Changelog/Markdown/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Markdown' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/DashLine.tsx: -------------------------------------------------------------------------------- 1 | export default function DashLine() { 2 | return ( 3 |
4 |
5 |
6 | ) 7 | } 8 | -------------------------------------------------------------------------------- /apps/mochi-web/components/Dashboard/Card/index.ts: -------------------------------------------------------------------------------- 1 | export { card } from './styles' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/Dashboard/Form/styles.ts: -------------------------------------------------------------------------------- 1 | import type { VariantProps } from 'class-variance-authority' 2 | import { cva } from 'class-variance-authority' 3 | 4 | const labelVariant = cva([ 5 | 'tracking-wider font-medium text-dashboard-gray-2 text-xs uppercase mb-2 block', 6 | ]) 7 | 8 | type LabelProps = VariantProps & { className?: string } 9 | 10 | export const label = ({ className = '', ...rest }: LabelProps = {}) => 11 | labelVariant({ className, ...rest }) 12 | -------------------------------------------------------------------------------- /apps/mochi-web/components/Dashboard/Input/index.ts: -------------------------------------------------------------------------------- 1 | export { Input } from './Input' 2 | export { FileInput } from './FileInput' 3 | export { input } from './styles' 4 | -------------------------------------------------------------------------------- /apps/mochi-web/components/Dashboard/Menu/index.ts: -------------------------------------------------------------------------------- 1 | export { Menu } from './Menu' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/Dashboard/Pagination/index.ts: -------------------------------------------------------------------------------- 1 | export { Pagination } from './Pagination' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/Dashboard/Radio/index.ts: -------------------------------------------------------------------------------- 1 | export { RadioGroup } from './RadioGroup' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/Dashboard/Select/index.ts: -------------------------------------------------------------------------------- 1 | export { Select } from './Select' 2 | export { select } from './styles' 3 | -------------------------------------------------------------------------------- /apps/mochi-web/components/Dashboard/Switch/index.ts: -------------------------------------------------------------------------------- 1 | export { Switch } from './Switch' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/Dashboard/Table/index.ts: -------------------------------------------------------------------------------- 1 | export { Table } from './Table' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/Dashboard/Tabs/index.ts: -------------------------------------------------------------------------------- 1 | export { Tabs } from './Tabs' 2 | export { tab } from './styles' 3 | -------------------------------------------------------------------------------- /apps/mochi-web/components/Dashboard/Tabs/styles.ts: -------------------------------------------------------------------------------- 1 | import type { VariantProps } from 'class-variance-authority' 2 | import { cva } from 'class-variance-authority' 3 | 4 | const variant = cva(['w-full flex flex-col gap-y-2'], { 5 | variants: { 6 | appearance: { 7 | default: ['border-black/10'], 8 | invalid: ['border-mochi-900'], 9 | }, 10 | }, 11 | defaultVariants: { 12 | appearance: 'default', 13 | }, 14 | }) 15 | 16 | type Props = VariantProps & { className?: string } 17 | 18 | export const tab = ({ className = '', ...rest }: Props = {}) => 19 | variant({ className, ...rest }) 20 | -------------------------------------------------------------------------------- /apps/mochi-web/components/Dashboard/types/misc.ts: -------------------------------------------------------------------------------- 1 | export type BoxProps = { 2 | as?: T 3 | } & JSX.IntrinsicElements[T] 4 | -------------------------------------------------------------------------------- /apps/mochi-web/components/DashboardBody.tsx: -------------------------------------------------------------------------------- 1 | import { PageContent } from '@mochi-ui/page-content' 2 | 3 | interface DashboardBodyProps { 4 | children: React.ReactNode 5 | className?: string 6 | containerClassName?: string 7 | } 8 | 9 | export const DashboardBody = (props: DashboardBodyProps) => { 10 | const { children, className, containerClassName } = props 11 | 12 | return ( 13 | {children} 14 | ) 15 | } 16 | -------------------------------------------------------------------------------- /apps/mochi-web/components/Header/index.ts: -------------------------------------------------------------------------------- 1 | export * from './Header' 2 | export * from './MobileNavAccordionItem' 3 | export * from './type' 4 | -------------------------------------------------------------------------------- /apps/mochi-web/components/Header/type.ts: -------------------------------------------------------------------------------- 1 | import { ReactNode } from 'react' 2 | 3 | export interface NavItem { 4 | label: ReactNode 5 | href?: string 6 | onClick?: () => void 7 | iconLeft?: ReactNode 8 | component?: ReactNode 9 | } 10 | -------------------------------------------------------------------------------- /apps/mochi-web/components/Header/util.ts: -------------------------------------------------------------------------------- 1 | import { create } from 'zustand' 2 | 3 | export const useIsNavOpenStore = create<{ 4 | isNavOpen: boolean 5 | setIsNavOpen: (b: boolean) => void 6 | }>((set) => ({ 7 | isNavOpen: false, 8 | setIsNavOpen: (isNavOpen) => set({ isNavOpen }), 9 | })) 10 | -------------------------------------------------------------------------------- /apps/mochi-web/components/Home/ChainAndPartner.tsx: -------------------------------------------------------------------------------- 1 | import { NativeImage } from '~cpn/NativeImage' 2 | 3 | export default function ChainAndPartner() { 4 | return ( 5 |
6 |
7 | 12 |
13 |
14 | ) 15 | } 16 | -------------------------------------------------------------------------------- /apps/mochi-web/components/MainSidebarHeader.tsx: -------------------------------------------------------------------------------- 1 | import { NativeImage } from './NativeImage' 2 | 3 | export const MainSidebarHeader = ({ expanded }: { expanded?: boolean }) => { 4 | return expanded ? ( 5 | 10 | ) : ( 11 | 12 | ) 13 | } 14 | -------------------------------------------------------------------------------- /apps/mochi-web/components/MochiWidget/AmountInput/index.tsx: -------------------------------------------------------------------------------- 1 | export * from './AmountInput' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/MochiWidget/AmountInput/useSolPrice.ts: -------------------------------------------------------------------------------- 1 | import useSWR from 'swr' 2 | import { API } from '~constants/api' 3 | 4 | export function useSolPrice() { 5 | const { data } = useSWR(['sol-price'], async () => { 6 | const data = await API.MOCHI_PAY.get('/999/tokens/sol').json((r) => r.data) 7 | return data.price ?? 0 8 | }) 9 | 10 | return data 11 | } 12 | -------------------------------------------------------------------------------- /apps/mochi-web/components/MochiWidget/ChainPicker/EmptyList.tsx: -------------------------------------------------------------------------------- 1 | export const EmptyList: React.FC = () => ( 2 |
3 | No results 4 | 5 | Try searching for something else. 6 | 7 |
8 | ) 9 | -------------------------------------------------------------------------------- /apps/mochi-web/components/MochiWidget/ChainPicker/data.ts: -------------------------------------------------------------------------------- 1 | import { Eth, Bnb, Ftm, Matic, Avalanche, Sol } from '@mochi-ui/icons' 2 | 3 | export const Chains = [ 4 | { 5 | id: 1, 6 | name: 'Ethereum', 7 | icon: Eth, 8 | }, 9 | { 10 | id: 2, 11 | name: 'Binance', 12 | icon: Bnb, 13 | }, 14 | { 15 | id: 3, 16 | name: 'Fantom', 17 | icon: Ftm, 18 | }, 19 | { 20 | id: 4, 21 | name: 'Polygon', 22 | icon: Matic, 23 | }, 24 | { 25 | id: 5, 26 | name: 'Avalanche', 27 | icon: Avalanche, 28 | }, 29 | { 30 | id: 6, 31 | name: 'Solana', 32 | icon: Sol, 33 | }, 34 | ] 35 | -------------------------------------------------------------------------------- /apps/mochi-web/components/MochiWidget/ChainPicker/index.ts: -------------------------------------------------------------------------------- 1 | export * from './ChainItem' 2 | export * from './ChainList' 3 | export * from './ChainPicker' 4 | -------------------------------------------------------------------------------- /apps/mochi-web/components/MochiWidget/MessagePicker/useDefaultMessage.ts: -------------------------------------------------------------------------------- 1 | import useSWR from 'swr' 2 | import { API } from '~constants/api' 3 | 4 | export function useDefaultMessage(profileId?: string) { 5 | const { data } = useSWR( 6 | ['tip-default-message', profileId], 7 | async ([_, profileId]) => { 8 | if (!profileId) return '' 9 | return API.MOCHI.get( 10 | `/profiles/${profileId}/settings/tip/default-message`, 11 | ) 12 | .notFound(() => '') 13 | .json((r) => r.data.message) 14 | }, 15 | ) 16 | 17 | return data 18 | } 19 | -------------------------------------------------------------------------------- /apps/mochi-web/components/MochiWidget/PlatformPicker/icons/x-ic.tsx: -------------------------------------------------------------------------------- 1 | import { SVGProps } from 'react' 2 | 3 | export default function X(props: SVGProps) { 4 | return ( 5 | 13 | 17 | 18 | ) 19 | } 20 | -------------------------------------------------------------------------------- /apps/mochi-web/components/MochiWidget/PlatformPicker/index.ts: -------------------------------------------------------------------------------- 1 | export * from './PlatformItem' 2 | export * from './PlatformList' 3 | export * from './PlatformPicker' 4 | -------------------------------------------------------------------------------- /apps/mochi-web/components/MochiWidget/PlatformPicker/type.ts: -------------------------------------------------------------------------------- 1 | // TODO: replace it with Mochi Types 2 | export type Platform = { 3 | id: string 4 | platform: PlatformType 5 | } 6 | 7 | export type PlatformType = 8 | | 'discord' 9 | | 'github' 10 | | 'telegram' 11 | | 'facebook' 12 | | 'x' 13 | | 'email' 14 | | 'on-chain' 15 | | 'reddit' 16 | -------------------------------------------------------------------------------- /apps/mochi-web/components/MochiWidget/Recipient/EmptyList.tsx: -------------------------------------------------------------------------------- 1 | export const EmptyList: React.FC = () => ( 2 |
3 | No results 4 | 5 | Try searching for something else. 6 | 7 |
8 | ) 9 | -------------------------------------------------------------------------------- /apps/mochi-web/components/MochiWidget/Recipient/index.tsx: -------------------------------------------------------------------------------- 1 | export * from './Recipient' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/MochiWidget/TokenPicker/EmptyList.tsx: -------------------------------------------------------------------------------- 1 | export const EmptyList: React.FC = () => ( 2 |
3 | No results 4 | 5 | Try searching for something else. 6 | 7 |
8 | ) 9 | -------------------------------------------------------------------------------- /apps/mochi-web/components/MochiWidget/TokenPicker/default-data.ts: -------------------------------------------------------------------------------- 1 | import { Balance } from '~store' 2 | 3 | export const DEFAULT_BALANCE = { 4 | id: 'default-balance', 5 | amount: '$0', 6 | token: { 7 | id: '', 8 | name: 'sol', 9 | symbol: 'SOL', 10 | icon: 'https://cdn.discordapp.com/emojis/1150803875884978216.png?size=240&quality=lossless', 11 | }, 12 | type: 'token', 13 | asset_balance: 0, 14 | usd_balance: 0, 15 | } as unknown as Balance 16 | -------------------------------------------------------------------------------- /apps/mochi-web/components/MochiWidget/TokenPicker/index.ts: -------------------------------------------------------------------------------- 1 | export * from './TokenItem' 2 | export * from './TokenList' 3 | export * from './TokenPicker' 4 | -------------------------------------------------------------------------------- /apps/mochi-web/components/MochiWidget/TokenPicker/sort-order.json: -------------------------------------------------------------------------------- 1 | ["SOL"] 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/MochiWidget/TokenPicker/type.ts: -------------------------------------------------------------------------------- 1 | export type SectionBase = { 2 | title: string 3 | data: Item[] 4 | } 5 | 6 | export type Moniker = { 7 | type: 'moniker' 8 | id: string 9 | name: string 10 | group: string 11 | asset_balance: number 12 | token_amount: number 13 | source: { 14 | id: string 15 | title: string 16 | } 17 | token: { 18 | icon: string 19 | address: string 20 | price: number 21 | decimal: number 22 | symbol: string 23 | chain_id: string 24 | native: boolean 25 | chain: { 26 | type: string 27 | } 28 | } 29 | disabled: boolean 30 | } 31 | -------------------------------------------------------------------------------- /apps/mochi-web/components/NativeImage/index.ts: -------------------------------------------------------------------------------- 1 | export * from './NativeImage' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/NotificationList/Skeleton.tsx: -------------------------------------------------------------------------------- 1 | import Row from './Row' 2 | 3 | const Skeleton = () => { 4 | return {}} isSkeleton action="transfer" time="" /> 5 | } 6 | 7 | export default Skeleton 8 | -------------------------------------------------------------------------------- /apps/mochi-web/components/PayRequest/index.tsx: -------------------------------------------------------------------------------- 1 | export { default as PayLink } from './PayLink' 2 | export { default as PayMe } from './PayMe' 3 | -------------------------------------------------------------------------------- /apps/mochi-web/components/TransactionPeekingCard/index.ts: -------------------------------------------------------------------------------- 1 | export * from './TransactionPeekingCard' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/TransactionTable/index.ts: -------------------------------------------------------------------------------- 1 | export * from './TransactionTable' 2 | export * from './types' 3 | -------------------------------------------------------------------------------- /apps/mochi-web/components/VerifyWallet/index.tsx: -------------------------------------------------------------------------------- 1 | export * from './VerifyWallet' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/base/alert/index.ts: -------------------------------------------------------------------------------- 1 | export * from './alert' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/base/avatar/index.ts: -------------------------------------------------------------------------------- 1 | export * from './avatar' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/base/button/index.ts: -------------------------------------------------------------------------------- 1 | export * from './button' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/base/dnd/StrictModeDroppable.tsx: -------------------------------------------------------------------------------- 1 | import { useEffect, useState } from 'react' 2 | import { Droppable, DroppableProps } from 'react-beautiful-dnd' 3 | 4 | export const StrictModeDroppable = ({ children, ...props }: DroppableProps) => { 5 | const [enabled, setEnabled] = useState(false) 6 | 7 | useEffect(() => { 8 | const animation = requestAnimationFrame(() => setEnabled(true)) 9 | return () => { 10 | cancelAnimationFrame(animation) 11 | setEnabled(false) 12 | } 13 | }, []) 14 | 15 | if (!enabled) { 16 | return null 17 | } 18 | 19 | return {children} 20 | } 21 | -------------------------------------------------------------------------------- /apps/mochi-web/components/base/dnd/index.ts: -------------------------------------------------------------------------------- 1 | export * from './DndWrapper' 2 | export * from './DndItem' 3 | -------------------------------------------------------------------------------- /apps/mochi-web/components/base/input/index.ts: -------------------------------------------------------------------------------- 1 | export * from './input' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/base/radio/index.ts: -------------------------------------------------------------------------------- 1 | export * from './radio' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/base/section-list/index.ts: -------------------------------------------------------------------------------- 1 | export * from './section-list' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/base/switch/index.ts: -------------------------------------------------------------------------------- 1 | export * from './switch' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/base/text/index.ts: -------------------------------------------------------------------------------- 1 | export * from './text' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/explore/index/components/index.ts: -------------------------------------------------------------------------------- 1 | export * from './ChainPicker' 2 | export * from './PlatformPicker' 3 | -------------------------------------------------------------------------------- /apps/mochi-web/components/explore/index/index.ts: -------------------------------------------------------------------------------- 1 | export * from './sections' 2 | export * from './stores' 3 | -------------------------------------------------------------------------------- /apps/mochi-web/components/explore/index/sections/index.ts: -------------------------------------------------------------------------------- 1 | export * from './SummarySection' 2 | export * from './TransactionSection' 3 | -------------------------------------------------------------------------------- /apps/mochi-web/components/explore/index/stores/index.ts: -------------------------------------------------------------------------------- 1 | export * from './useTransactionSummaryStore' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/components/landing/Divider.tsx: -------------------------------------------------------------------------------- 1 | import clsx from 'clsx' 2 | 3 | export function Divider({ 4 | noSpace = false, 5 | fullWidth = false, 6 | className = '', 7 | }: { 8 | className?: string 9 | noSpace?: boolean 10 | fullWidth?: boolean 11 | }) { 12 | return ( 13 |
24 | ) 25 | } 26 | -------------------------------------------------------------------------------- /apps/mochi-web/constants/date.ts: -------------------------------------------------------------------------------- 1 | export const TIMESTAMP_FORMAT = 'MMMM dd yyyy, hh:mm aaa' 2 | -------------------------------------------------------------------------------- /apps/mochi-web/constants/events.ts: -------------------------------------------------------------------------------- 1 | const TIP_WIDGET = { 2 | FOCUS_AMOUNT: 'mochi__tip_widget__focus_amount', 3 | } 4 | 5 | const EVENTS = { TIP_WIDGET } 6 | 7 | export default EVENTS 8 | -------------------------------------------------------------------------------- /apps/mochi-web/constants/mochi.ts: -------------------------------------------------------------------------------- 1 | import UI from '@consolelabs/mochi-formatter' 2 | import MochiApi from '@consolelabs/mochi-rest' 3 | import { MOCHI_API, MOCHI_PAY_API, MOCHI_PROFILE_API } from '~envs' 4 | 5 | const api = new MochiApi({ 6 | payUrl: MOCHI_PAY_API, 7 | profileUrl: MOCHI_PROFILE_API, 8 | baseUrl: MOCHI_API, 9 | log: false, 10 | }) 11 | api.init() 12 | 13 | UI.api = api 14 | 15 | export { UI, api } 16 | -------------------------------------------------------------------------------- /apps/mochi-web/constants/resources.ts: -------------------------------------------------------------------------------- 1 | export const TELEGRAM_LINK = 'https://t.me/dmmochibot' 2 | export const DISCORD_INSTALL_BOT_LINK = 3 | 'https://discord.com/oauth2/authorize?client_id=1062540132269432863&permissions=8&scope=bot%20applications.commands' 4 | -------------------------------------------------------------------------------- /apps/mochi-web/context/wallets/ethereum/ronin/ronin.d.ts: -------------------------------------------------------------------------------- 1 | // Types declaration for Ronin global variable 2 | declare global { 3 | interface Window { 4 | ronin: { 5 | provider: ethers.providers.ExternalProvider 6 | roninEvent: EventListener 7 | } 8 | } 9 | } 10 | 11 | export {} 12 | -------------------------------------------------------------------------------- /apps/mochi-web/context/wallets/sui/SuiWalletProvider.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactNode } from 'react' 2 | import { 3 | SuiDevnetChain, 4 | SuiTestnetChain, 5 | SuiMainnetChain, 6 | WalletProvider, 7 | } from '@suiet/wallet-kit' 8 | 9 | const chains = [SuiDevnetChain, SuiTestnetChain, SuiMainnetChain] 10 | 11 | export type SUIWalletProviderProps = { 12 | children: ReactNode 13 | } 14 | 15 | export const SuiWalletProvider = ({ children }: SUIWalletProviderProps) => { 16 | return ( 17 | 18 | {children} 19 | 20 | ) 21 | } 22 | -------------------------------------------------------------------------------- /apps/mochi-web/hooks/app/useFetchChangelogLatest.ts: -------------------------------------------------------------------------------- 1 | import useSWR from 'swr' 2 | import { API, GET_PATHS } from '~constants/api' 3 | import { ResponseProductChangelogLatest } from '~types/mochi-schema' 4 | 5 | export const SWR_KEY_FETCH_CHANGELOG_LATEST = 'SWR_KEY_FETCH_CHANGELOG_LATEST' 6 | 7 | export const useFetchChangelogLatest = () => { 8 | const { data, ...rest } = useSWR( 9 | [SWR_KEY_FETCH_CHANGELOG_LATEST], 10 | async () => { 11 | return API.MOCHI.get(GET_PATHS.CHANGELOGS_LATEST).json((r) => r ?? []) 12 | }, 13 | ) 14 | 15 | return { 16 | data: data?.data, 17 | ...rest, 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /apps/mochi-web/hooks/useIsVisible.ts: -------------------------------------------------------------------------------- 1 | import { useState, useEffect } from 'react' 2 | 3 | export function useIsVisible(ref: React.RefObject | null) { 4 | const [isIntersecting, setIntersecting] = useState(false) 5 | 6 | useEffect(() => { 7 | const observer = new IntersectionObserver(([entry]) => 8 | setIntersecting(entry.isIntersecting), 9 | ) 10 | 11 | if (ref?.current) { 12 | observer.observe(ref.current) 13 | } 14 | 15 | return () => { 16 | observer.disconnect() 17 | } 18 | }, [ref]) 19 | 20 | return isIntersecting 21 | } 22 | -------------------------------------------------------------------------------- /apps/mochi-web/hooks/wallets/useChain.ts: -------------------------------------------------------------------------------- 1 | import { useAppWalletContext } from 'context/wallet-context' 2 | import { solanaChain } from 'context/wallets/solana/chains' 3 | import { useNetwork } from 'wagmi' 4 | 5 | export const useChain = () => { 6 | const { blockchain, getChainById } = useAppWalletContext() 7 | const { chain: activeChain } = useNetwork() 8 | 9 | const evmChain = activeChain ? getChainById(activeChain.id) : undefined 10 | 11 | return { 12 | chain: blockchain === 'EVM' ? evmChain : solanaChain, 13 | unsupported: blockchain === 'EVM' ? activeChain?.unsupported : false, 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /apps/mochi-web/next-env.d.ts: -------------------------------------------------------------------------------- 1 | /// 2 | /// 3 | /// 4 | 5 | // NOTE: This file should not be edited 6 | // see https://nextjs.org/docs/basic-features/typescript for more information. 7 | -------------------------------------------------------------------------------- /apps/mochi-web/pages/[username]/receive/[pay_code].tsx: -------------------------------------------------------------------------------- 1 | import PayRequest, { getServerSideProps, Props } from '../../pay/[pay_code]' 2 | 3 | export { getServerSideProps } 4 | 5 | export default function PayMe({ payRequest }: Props) { 6 | return 7 | } 8 | 9 | PayMe.layoutType = 'landing' 10 | -------------------------------------------------------------------------------- /apps/mochi-web/pages/api/auth/discord-callback.ts: -------------------------------------------------------------------------------- 1 | import { NextApiRequest, NextApiResponse } from 'next' 2 | import qs from 'query-string' 3 | 4 | export default async function handler( 5 | req: NextApiRequest, 6 | res: NextApiResponse, 7 | ) { 8 | const { url_location, ...rest } = req.query 9 | return res.redirect(`${url_location}?${qs.stringify(rest)}`) 10 | } 11 | -------------------------------------------------------------------------------- /apps/mochi-web/pages/api/auth/facebook-callback.ts: -------------------------------------------------------------------------------- 1 | import { NextApiRequest, NextApiResponse } from 'next' 2 | import qs from 'query-string' 3 | 4 | export default async function handler( 5 | req: NextApiRequest, 6 | res: NextApiResponse, 7 | ) { 8 | const { url_location, ...rest } = req.query 9 | return res.redirect(`${url_location}?${qs.stringify(rest)}`) 10 | } 11 | -------------------------------------------------------------------------------- /apps/mochi-web/pages/api/auth/mail-callback.ts: -------------------------------------------------------------------------------- 1 | import handler from './discord-callback' 2 | 3 | export default handler 4 | -------------------------------------------------------------------------------- /apps/mochi-web/pages/api/auth/telegram-callback.ts: -------------------------------------------------------------------------------- 1 | import { NextApiRequest, NextApiResponse } from 'next' 2 | import { HOME_URL } from '~envs' 3 | 4 | export default async function handler( 5 | req: NextApiRequest, 6 | res: NextApiResponse, 7 | ) { 8 | const { token, url_location } = req.query 9 | return res.redirect( 10 | `${HOME_URL}?token=${token}${ 11 | url_location ? `&url_location=${url_location}` : '' 12 | }`, 13 | ) 14 | } 15 | -------------------------------------------------------------------------------- /apps/mochi-web/pages/api/auth/twitter-callback.ts: -------------------------------------------------------------------------------- 1 | import handler from './discord-callback' 2 | 3 | export default handler 4 | -------------------------------------------------------------------------------- /apps/mochi-web/pages/applications/[id]/revenue.tsx: -------------------------------------------------------------------------------- 1 | import { PageHeader, PageHeaderTitle } from '@mochi-ui/core' 2 | import { DashboardBody } from '~cpn/DashboardBody' 3 | 4 | const RevenuePage = () => { 5 | return ( 6 | <> 7 | 8 | Revenue 9 | 10 | 11 | TBD 12 | 13 | ) 14 | } 15 | 16 | export default RevenuePage 17 | -------------------------------------------------------------------------------- /apps/mochi-web/pages/privacy.tsx: -------------------------------------------------------------------------------- 1 | import { Layout } from '~app/layout' 2 | import { SEO } from '~app/layout/seo' 3 | import { PAGES } from '~constants' 4 | 5 | export default function PrivacyPolicy() { 6 | return ( 7 | 8 | 9 |