├── .nvmrc ├── packages ├── api │ ├── .prettierrc │ ├── tsconfig.json │ ├── src │ │ └── index.ts │ └── package.json ├── core │ ├── .prettierrc │ ├── src │ │ ├── persistent-storage.ts │ │ ├── flow-interactions.service.ts │ │ ├── logger.ts │ │ ├── index.ts │ │ ├── flow-flix-v1.service.ts │ │ ├── utils.spec.ts │ │ ├── flix-v1.ts │ │ ├── flix-v11.ts │ │ └── http.service.ts │ ├── tsconfig.json │ └── package.json ├── ui │ ├── .prettierrc │ ├── src │ │ ├── assets │ │ │ └── long_logo.png │ │ ├── styles │ │ │ ├── spacings.scss │ │ │ ├── rules.scss │ │ │ ├── scrollbars.scss │ │ │ ├── typography.scss │ │ │ └── colors.scss │ │ ├── common │ │ │ ├── buttons │ │ │ │ ├── CopyButton │ │ │ │ │ ├── CopyButton.module.scss │ │ │ │ │ └── CopyButton.tsx │ │ │ │ ├── SimpleButton │ │ │ │ │ ├── SimpleButton.module.scss │ │ │ │ │ └── SimpleButton.tsx │ │ │ │ ├── PrimaryButton │ │ │ │ │ ├── PrimaryButton.module.scss │ │ │ │ │ └── PrimaryButton.tsx │ │ │ │ ├── IconButton │ │ │ │ │ ├── IconButton.module.scss │ │ │ │ │ └── IconButton.tsx │ │ │ │ ├── RadioButton │ │ │ │ │ ├── RadioButton.module.scss │ │ │ │ │ └── RadioButton.tsx │ │ │ │ ├── ActionButton │ │ │ │ │ ├── ActionButton.tsx │ │ │ │ │ └── ActionButton.module.scss │ │ │ │ ├── ToggleButton │ │ │ │ │ ├── ToggleButton.module.scss │ │ │ │ │ └── ToggleButton.tsx │ │ │ │ └── LoaderButton │ │ │ │ │ └── LoaderButton.tsx │ │ │ ├── time │ │ │ │ ├── DateDisplay │ │ │ │ │ ├── DateDisplay.module.scss │ │ │ │ │ └── DateDisplay.tsx │ │ │ │ └── TimeAgo │ │ │ │ │ └── TimeAgo.tsx │ │ │ ├── inputs │ │ │ │ ├── index.ts │ │ │ │ ├── Input │ │ │ │ │ ├── Input.tsx │ │ │ │ │ └── Input.module.scss │ │ │ │ ├── SelectInput │ │ │ │ │ ├── SelectInput.module.scss │ │ │ │ │ └── SelectInput.tsx │ │ │ │ └── SearchInput │ │ │ │ │ ├── SearchInput.module.scss │ │ │ │ │ └── SearchInput.tsx │ │ │ ├── status │ │ │ │ ├── ErrorMessage.module.scss │ │ │ │ ├── Status.module.scss │ │ │ │ ├── TransactionStatusBadge.module.scss │ │ │ │ └── ErrorMessage.tsx │ │ │ ├── overlays │ │ │ │ ├── dialogs │ │ │ │ │ ├── snapshot │ │ │ │ │ │ └── SnapshotDialog.module.scss │ │ │ │ │ ├── base │ │ │ │ │ │ └── BaseDialog.module.scss │ │ │ │ │ ├── action │ │ │ │ │ │ ├── ActionDialog.tsx │ │ │ │ │ │ └── ActionDialog.module.scss │ │ │ │ │ └── consent │ │ │ │ │ │ └── ConsentDialog.module.scss │ │ │ │ ├── Tooltip │ │ │ │ │ ├── Tooltip.scss │ │ │ │ │ └── Tooltip.tsx │ │ │ │ └── Menu │ │ │ │ │ ├── Menu.scss │ │ │ │ │ └── Menu.tsx │ │ │ ├── layouts │ │ │ │ ├── BasicLayout │ │ │ │ │ ├── BasicLayout.module.scss │ │ │ │ │ └── BasicLayout.tsx │ │ │ │ └── ProjectLayout │ │ │ │ │ ├── ProjectLayout.module.scss │ │ │ │ │ └── WorkspaceLayout.tsx │ │ │ ├── misc │ │ │ │ ├── BaseBadge │ │ │ │ │ ├── BaseBadge.module.scss │ │ │ │ │ └── BaseBadge.tsx │ │ │ │ ├── LineSeparator │ │ │ │ │ ├── LineSeparator.module.scss │ │ │ │ │ └── LineSeparator.tsx │ │ │ │ ├── Label │ │ │ │ │ ├── Label.module.scss │ │ │ │ │ └── Label.tsx │ │ │ │ ├── Callout │ │ │ │ │ ├── Callout.module.scss │ │ │ │ │ └── Callout.tsx │ │ │ │ ├── Value │ │ │ │ │ ├── Value.module.scss │ │ │ │ │ └── Value.tsx │ │ │ │ ├── SizedBox │ │ │ │ │ └── SizedBox.tsx │ │ │ │ ├── BaseTable │ │ │ │ │ └── BaseTable.module.scss │ │ │ │ ├── SideNavigation │ │ │ │ │ └── SideNavigation.module.scss │ │ │ │ └── Breadcrumbs │ │ │ │ │ └── Breadcrumbs.module.scss │ │ │ ├── icons │ │ │ │ ├── assets │ │ │ │ │ ├── play.svg │ │ │ │ │ ├── close.svg │ │ │ │ │ ├── open.svg │ │ │ │ │ ├── search.svg │ │ │ │ │ ├── plus.svg │ │ │ │ │ ├── star-fill.svg │ │ │ │ │ ├── logs.svg │ │ │ │ │ ├── caret.svg │ │ │ │ │ ├── restart.svg │ │ │ │ │ ├── copy.svg │ │ │ │ │ ├── close-logs.svg │ │ │ │ │ ├── open-logs.svg │ │ │ │ │ ├── exit.svg │ │ │ │ │ ├── circle-cross.svg │ │ │ │ │ ├── circle-question-mark.svg │ │ │ │ │ ├── document-with-arrow.svg │ │ │ │ │ ├── circle-check.svg │ │ │ │ │ ├── key.svg │ │ │ │ │ ├── share.svg │ │ │ │ │ ├── transactions.svg │ │ │ │ │ ├── cancel.svg │ │ │ │ │ ├── logout.svg │ │ │ │ │ ├── circle_arrow_left.svg │ │ │ │ │ ├── user.svg │ │ │ │ │ ├── pending-tx-icon.svg │ │ │ │ │ ├── finalised-tx-icon.svg │ │ │ │ │ ├── trash.svg │ │ │ │ │ ├── executed-tx-icon.svg │ │ │ │ │ ├── blocks.svg │ │ │ │ │ ├── settings.svg │ │ │ │ │ ├── script.svg │ │ │ │ │ ├── question-mark.svg │ │ │ │ │ ├── snapshot.svg │ │ │ │ │ ├── back-button.svg │ │ │ │ │ ├── transaction.svg │ │ │ │ │ └── plus-round.svg │ │ │ │ ├── CaretIcon │ │ │ │ │ ├── CaretIcon.module.scss │ │ │ │ │ └── CaretIcon.tsx │ │ │ │ └── TokenIcon │ │ │ │ │ └── TokenIcon.tsx │ │ │ ├── code │ │ │ │ ├── JsonView │ │ │ │ │ ├── JsonView.module.scss │ │ │ │ │ └── JsonView.tsx │ │ │ │ └── CadenceEditor │ │ │ │ │ ├── cadence-editor.css │ │ │ │ │ └── CadenceEditor.tsx │ │ │ ├── links │ │ │ │ ├── ProjectLink │ │ │ │ │ ├── ProjectLink.module.scss │ │ │ │ │ └── ProjectLink.tsx │ │ │ │ └── ExternalLink │ │ │ │ │ ├── ExternalLink.module.scss │ │ │ │ │ └── ExternalLink.tsx │ │ │ ├── cards │ │ │ │ ├── BaseCard │ │ │ │ │ ├── BaseCard.module.scss │ │ │ │ │ └── BaseCard.tsx │ │ │ │ └── DetailsCard │ │ │ │ │ └── DetailsCard.module.scss │ │ │ ├── loaders │ │ │ │ ├── Spinner │ │ │ │ │ ├── Spinner.module.scss │ │ │ │ │ ├── Spinner.tsx │ │ │ │ │ └── SpinnerWithLabel.tsx │ │ │ │ ├── FullScreenLoading │ │ │ │ │ ├── FullScreenLoading.module.scss │ │ │ │ │ └── FullScreenLoading.tsx │ │ │ │ └── Shimmer │ │ │ │ │ └── Shimmer.tsx │ │ │ ├── errors │ │ │ │ ├── ErrorMessage.module.scss │ │ │ │ ├── Message.tsx │ │ │ │ └── ErrorMessage.tsx │ │ │ ├── ellipsis │ │ │ │ ├── Ellipsis.tsx │ │ │ │ └── MiddleEllipsis.tsx │ │ │ └── tabs │ │ │ │ └── StyledTabs │ │ │ │ ├── StyledTabs.module.scss │ │ │ │ └── StyledTabs.tsx │ │ ├── blocks │ │ │ ├── BlockLink │ │ │ │ └── BlockLink.module.scss │ │ │ ├── BlockDetails │ │ │ │ └── BlockDetails.module.scss │ │ │ └── BlocksTable │ │ │ │ └── BlocksTable.module.scss │ │ ├── accounts │ │ │ ├── AccountAvatar │ │ │ │ └── avatars │ │ │ │ │ ├── 1.jpg │ │ │ │ │ ├── 2.jpg │ │ │ │ │ ├── 3.jpg │ │ │ │ │ ├── 4.jpg │ │ │ │ │ ├── 5.jpg │ │ │ │ │ ├── 6.jpg │ │ │ │ │ ├── 7.jpg │ │ │ │ │ ├── 8.jpg │ │ │ │ │ ├── 9.jpg │ │ │ │ │ ├── 10.jpg │ │ │ │ │ ├── 11.jpg │ │ │ │ │ ├── 12.jpg │ │ │ │ │ ├── 13.jpg │ │ │ │ │ ├── 14.jpg │ │ │ │ │ ├── 15.jpg │ │ │ │ │ ├── 16.jpg │ │ │ │ │ ├── service.png │ │ │ │ │ └── README.md │ │ │ ├── PublicPrivateStorageCard │ │ │ │ └── gradient.png │ │ │ ├── AccountLink │ │ │ │ └── AccountLink.module.scss │ │ │ ├── AccountsTable │ │ │ │ └── AccountsTable.module.scss │ │ │ ├── StorageDomainBadge │ │ │ │ ├── StorageDomainBadge.module.scss │ │ │ │ └── StorageDomainBadge.tsx │ │ │ ├── AccountDetails │ │ │ │ └── AccountDetails.module.scss │ │ │ ├── StorageDataTypes │ │ │ │ └── StorageDataTypes.module.scss │ │ │ ├── AccountKeysTable │ │ │ │ └── AccountKeysTable.module.scss │ │ │ ├── AccountName │ │ │ │ └── AccountName.tsx │ │ │ └── AccountStorage │ │ │ │ └── AccountStorage.module.scss │ │ ├── transactions │ │ │ ├── TransactionLink │ │ │ │ └── TransactionLink.module.scss │ │ │ ├── SignaturesTable │ │ │ │ └── SignaturesTable.module.scss │ │ │ ├── TransactionDetails │ │ │ │ ├── TransactionDetails.module.scss │ │ │ │ └── TransactionDetails.tsx │ │ │ ├── TransactionsTable │ │ │ │ └── TransactionsTable.module.scss │ │ │ └── TransactionSource │ │ │ │ └── TransactionSource.module.scss │ │ ├── contracts │ │ │ ├── ContractsTable │ │ │ │ └── ContractsTable.module.scss │ │ │ ├── ContractName │ │ │ │ ├── ContractName.module.scss │ │ │ │ └── ContractName.tsx │ │ │ └── ContractDetails │ │ │ │ └── ContractDetails.module.scss │ │ ├── events │ │ │ ├── EventsTable │ │ │ │ └── EventsTable.module.scss │ │ │ ├── EventDetails │ │ │ │ └── EventDetails.module.scss │ │ │ ├── utils.ts │ │ │ └── EventOriginLink │ │ │ │ └── EventOriginLink.tsx │ │ ├── interactions │ │ │ ├── components │ │ │ │ ├── InteractionIcon │ │ │ │ │ ├── InteractionIcon.module.scss │ │ │ │ │ └── InteractionIcon.tsx │ │ │ │ ├── ValueBuilder │ │ │ │ │ ├── interface.ts │ │ │ │ │ ├── ArrayBuilder │ │ │ │ │ │ └── ArrayBuilder.module.scss │ │ │ │ │ ├── DictionaryBuilder │ │ │ │ │ │ └── DictionaryBuilder.module.scss │ │ │ │ │ ├── TextualBuilder │ │ │ │ │ │ └── TextualBuilder.tsx │ │ │ │ │ ├── IntegerNumberBuilder │ │ │ │ │ │ └── IntegerNumberBuilder.tsx │ │ │ │ │ └── FixedPointNumberBuilder │ │ │ │ │ │ └── FixedPointNumberBuilder.tsx │ │ │ │ ├── InteractionLabel │ │ │ │ │ └── InteractionLabel.module.scss │ │ │ │ ├── ExecutionSettings │ │ │ │ │ └── ExecutionSettings.module.scss │ │ │ │ ├── ParamBuilder │ │ │ │ │ └── ParamBuilder.module.scss │ │ │ │ ├── InteractionOutcomeDisplay │ │ │ │ │ └── InteractionOutcomeDisplay.module.scss │ │ │ │ ├── FlixInfo │ │ │ │ │ └── FlixInfo.module.scss │ │ │ │ └── InteractionHistory │ │ │ │ │ └── InteractionHistory.module.scss │ │ │ ├── core │ │ │ │ ├── core-types.ts │ │ │ │ └── core-utils.ts │ │ │ └── InteractionsPage.module.scss │ │ ├── index.ts │ │ ├── hooks │ │ │ ├── use-current-project-id.ts │ │ │ ├── use-mouse-move.ts │ │ │ ├── use-filter-data.ts │ │ │ └── use-error-handler.ts │ │ ├── utils │ │ │ ├── multi-map.ts │ │ │ ├── text-utils.ts │ │ │ └── common-utils.ts │ │ ├── assets.d.ts │ │ ├── contexts │ │ │ ├── file-picker.context.tsx │ │ │ └── flow-network.context.tsx │ │ └── workspaces │ │ │ └── WorkspaceSettings │ │ │ └── WorkspaceSettings.module.scss │ └── tsconfig.json ├── nodejs │ ├── .gitignore │ ├── .prettierrc │ ├── src │ │ └── index.ts │ └── package.json └── config │ ├── package.json │ └── tsconfig.json ├── pkg ├── .gitignore └── main │ └── main.go ├── apps ├── web │ ├── .eslintrc.json │ ├── public │ │ ├── flowdiver.png │ │ ├── flowview.png │ │ ├── Inter-Black.ttf │ │ ├── Inter-Regular.ttf │ │ └── contractbrowser.png │ ├── src │ │ ├── app │ │ │ ├── Inter.woff2 │ │ │ ├── favicon.ico │ │ │ ├── [networkId] │ │ │ │ ├── [interaction] │ │ │ │ │ └── page.tsx │ │ │ │ └── page.tsx │ │ │ ├── layout.tsx │ │ │ └── index.scss │ │ └── common │ │ │ ├── interaction-page-params.ts │ │ │ ├── root-loader.tsx │ │ │ ├── use-interaction-page-params.ts │ │ │ └── NetworkDropdown.tsx │ ├── postcss.config.js │ ├── tailwind.config.ts │ ├── .gitignore │ ├── tsconfig.json │ └── package.json └── electron │ ├── assets │ ├── icon.png │ ├── Inter.woff2 │ ├── macos-background.png │ ├── macos-background.tiff │ ├── entitlements.mac.plist │ └── assets.d.ts │ ├── release │ └── app │ │ ├── yarn.lock │ │ ├── package-lock.json │ │ └── package.json │ ├── .erb │ ├── configs │ │ ├── .eslintrc │ │ ├── webpack.config.eslint.ts │ │ └── webpack.paths.ts │ └── scripts │ │ ├── .eslintrc │ │ ├── link-modules.ts │ │ ├── clean.js │ │ ├── check-node-env.js │ │ ├── check-port-in-use.js │ │ ├── delete-source-maps.js │ │ ├── electron-rebuild.js │ │ ├── check-build-exists.ts │ │ └── notarize.js │ ├── src │ ├── utils.ts │ ├── renderer │ │ ├── index.tsx │ │ ├── preload.d.ts │ │ ├── index.ejs │ │ ├── components │ │ │ ├── DependencyErrors │ │ │ │ └── DependencyErrors.module.scss │ │ │ └── loaders │ │ │ │ ├── ExitLoader.tsx │ │ │ │ ├── UpdateLoader.tsx │ │ │ │ └── Loader.module.scss │ │ ├── ipc-index-cache.ts │ │ └── App.scss │ ├── main │ │ ├── preload.ts │ │ └── util.ts │ ├── __tests__ │ │ └── App.test.tsx │ └── services │ │ ├── types.ts │ │ ├── fingerprint.service.ts │ │ ├── sentry-main.service.ts │ │ ├── sentry-renderer.service.ts │ │ ├── blockchain-index.service.ts │ │ ├── file-storage.service.ts │ │ └── analytics.service.ts │ ├── .editorconfig │ ├── .gitattributes │ ├── .gitignore │ ├── tsconfig.json │ └── .eslintignore ├── .husky └── pre-commit ├── .github ├── config.yml ├── ISSUE_TEMPLATE │ ├── feature_request.md │ └── bug_report.md ├── stale.yml └── workflows │ └── publish.yml ├── .gitignore ├── turbo.json ├── internal └── misc │ └── address.go └── LICENSE /.nvmrc: -------------------------------------------------------------------------------- 1 | 18 2 | -------------------------------------------------------------------------------- /packages/api/.prettierrc: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /packages/core/.prettierrc: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /packages/ui/.prettierrc: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /packages/nodejs/.gitignore: -------------------------------------------------------------------------------- 1 | bin 2 | -------------------------------------------------------------------------------- /packages/nodejs/.prettierrc: -------------------------------------------------------------------------------- 1 | {} 2 | -------------------------------------------------------------------------------- /pkg/.gitignore: -------------------------------------------------------------------------------- 1 | # Temp installation dir used for testing 2 | test-install -------------------------------------------------------------------------------- /apps/web/.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "next/core-web-vitals" 3 | } 4 | -------------------------------------------------------------------------------- /packages/api/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@onflowser/config/tsconfig.json" 3 | } 4 | -------------------------------------------------------------------------------- /packages/api/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./capabilities"; 2 | export * from "./resources"; 3 | -------------------------------------------------------------------------------- /.husky/pre-commit: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env sh 2 | . "$(dirname -- "$0")/_/husky.sh" 3 | 4 | npx lint-staged 5 | -------------------------------------------------------------------------------- /apps/electron/assets/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/apps/electron/assets/icon.png -------------------------------------------------------------------------------- /apps/web/public/flowdiver.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/apps/web/public/flowdiver.png -------------------------------------------------------------------------------- /apps/web/public/flowview.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/apps/web/public/flowview.png -------------------------------------------------------------------------------- /apps/web/src/app/Inter.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/apps/web/src/app/Inter.woff2 -------------------------------------------------------------------------------- /apps/web/src/app/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/apps/web/src/app/favicon.ico -------------------------------------------------------------------------------- /apps/electron/assets/Inter.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/apps/electron/assets/Inter.woff2 -------------------------------------------------------------------------------- /apps/web/public/Inter-Black.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/apps/web/public/Inter-Black.ttf -------------------------------------------------------------------------------- /apps/web/public/Inter-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/apps/web/public/Inter-Regular.ttf -------------------------------------------------------------------------------- /apps/web/public/contractbrowser.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/apps/web/public/contractbrowser.png -------------------------------------------------------------------------------- /packages/ui/src/assets/long_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/assets/long_logo.png -------------------------------------------------------------------------------- /packages/ui/src/styles/spacings.scss: -------------------------------------------------------------------------------- 1 | $spacing-s: 6px; 2 | $spacing-base: 12px; 3 | $spacing-l: 16px; 4 | $spacing-xl: 50px; 5 | -------------------------------------------------------------------------------- /apps/web/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /packages/ui/src/common/buttons/CopyButton/CopyButton.module.scss: -------------------------------------------------------------------------------- 1 | .root { 2 | cursor: pointer; 3 | display: inline-flex; 4 | } 5 | -------------------------------------------------------------------------------- /apps/electron/assets/macos-background.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/apps/electron/assets/macos-background.png -------------------------------------------------------------------------------- /apps/electron/assets/macos-background.tiff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/apps/electron/assets/macos-background.tiff -------------------------------------------------------------------------------- /apps/electron/release/app/yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/ui/src/blocks/BlockLink/BlockLink.module.scss: -------------------------------------------------------------------------------- 1 | .ellipsis { 2 | max-width: 13vw; 3 | display: inline-block; 4 | overflow: hidden; 5 | } 6 | -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/AccountAvatar/avatars/1.jpg -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/AccountAvatar/avatars/2.jpg -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/AccountAvatar/avatars/3.jpg -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/AccountAvatar/avatars/4.jpg -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/AccountAvatar/avatars/5.jpg -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/6.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/AccountAvatar/avatars/6.jpg -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/7.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/AccountAvatar/avatars/7.jpg -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/8.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/AccountAvatar/avatars/8.jpg -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/9.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/AccountAvatar/avatars/9.jpg -------------------------------------------------------------------------------- /.github/config.yml: -------------------------------------------------------------------------------- 1 | requiredHeaders: 2 | - Prerequisites 3 | - Expected Behavior 4 | - Current Behavior 5 | - Possible Solution 6 | - Your Environment 7 | -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/10.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/AccountAvatar/avatars/10.jpg -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/11.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/AccountAvatar/avatars/11.jpg -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/12.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/AccountAvatar/avatars/12.jpg -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/13.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/AccountAvatar/avatars/13.jpg -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/14.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/AccountAvatar/avatars/14.jpg -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/15.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/AccountAvatar/avatars/15.jpg -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/16.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/AccountAvatar/avatars/16.jpg -------------------------------------------------------------------------------- /packages/ui/src/common/time/DateDisplay/DateDisplay.module.scss: -------------------------------------------------------------------------------- 1 | .root { 2 | white-space: nowrap; 3 | overflow: hidden; 4 | text-overflow: ellipsis; 5 | } 6 | -------------------------------------------------------------------------------- /packages/ui/src/styles/rules.scss: -------------------------------------------------------------------------------- 1 | $border-radius-button: 6px; 2 | $border-radius-card: 8px; 3 | $border-radius-input: 8px; 4 | 5 | $border-radius-md: 18px; 6 | -------------------------------------------------------------------------------- /packages/ui/src/common/inputs/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./SelectInput/SelectInput"; 2 | export * from "./SearchInput/SearchInput"; 3 | export * from "./Input/Input"; 4 | -------------------------------------------------------------------------------- /packages/config/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@onflowser/config", 3 | "version": "0.0.0", 4 | "private": true, 5 | "files": [ 6 | "tsconfig.json" 7 | ] 8 | } 9 | -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/service.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/AccountAvatar/avatars/service.png -------------------------------------------------------------------------------- /packages/ui/src/blocks/BlockDetails/BlockDetails.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/spacings"; 2 | 3 | .root { 4 | display: flex; 5 | flex-direction: column; 6 | } 7 | -------------------------------------------------------------------------------- /packages/ui/src/transactions/TransactionLink/TransactionLink.module.scss: -------------------------------------------------------------------------------- 1 | .ellipsis { 2 | max-width: 13vw; 3 | display: inline-block; 4 | overflow: hidden; 5 | } 6 | -------------------------------------------------------------------------------- /apps/electron/.erb/configs/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "no-console": "off", 4 | "global-require": "off", 5 | "import/no-dynamic-require": "off" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /packages/ui/src/accounts/PublicPrivateStorageCard/gradient.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/onflowser/flowser/HEAD/packages/ui/src/accounts/PublicPrivateStorageCard/gradient.png -------------------------------------------------------------------------------- /packages/ui/src/common/status/ErrorMessage.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/scrollbars"; 2 | 3 | .root { 4 | overflow: scroll; 5 | @include hiddenScrollbars(); 6 | } 7 | -------------------------------------------------------------------------------- /packages/ui/src/contracts/ContractsTable/ContractsTable.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/colors"; 2 | 3 | .tag { 4 | border-color: $green-10; 5 | color: $green-10; 6 | } 7 | -------------------------------------------------------------------------------- /packages/ui/src/common/overlays/dialogs/snapshot/SnapshotDialog.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../../../styles/spacings"; 2 | 3 | .description { 4 | margin-bottom: $spacing-l * 2; 5 | } 6 | -------------------------------------------------------------------------------- /packages/ui/src/transactions/SignaturesTable/SignaturesTable.module.scss: -------------------------------------------------------------------------------- 1 | .hash { 2 | max-width: 20vw; 3 | min-width: 10vw; 4 | display: inline-block; 5 | overflow: hidden; 6 | } 7 | -------------------------------------------------------------------------------- /apps/electron/.erb/configs/webpack.config.eslint.ts: -------------------------------------------------------------------------------- 1 | /* eslint import/no-unresolved: off, import/no-self-import: off */ 2 | 3 | module.exports = require('./webpack.config.renderer.dev').default; 4 | -------------------------------------------------------------------------------- /packages/ui/src/contracts/ContractName/ContractName.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/spacings"; 2 | 3 | .root { 4 | display: flex; 5 | align-items: center; 6 | column-gap: $spacing-s; 7 | } 8 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | node_modules 3 | .DS_Store 4 | .env 5 | database/db 6 | flowdb 7 | flow.json 8 | .flowser 9 | .envrc 10 | server/certbot 11 | .envrc 12 | dist 13 | .turbo 14 | *.tsbuildinfo 15 | -------------------------------------------------------------------------------- /packages/core/src/persistent-storage.ts: -------------------------------------------------------------------------------- 1 | export interface PersistentStorage { 2 | // Returns `undefined` if storage is empty. 3 | read(): Promise; 4 | write(data: string): Promise; 5 | } 6 | -------------------------------------------------------------------------------- /packages/core/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@onflowser/config/tsconfig.json", 3 | "include": ["src"], 4 | "exclude": ["dist", "node_modules"], 5 | "compilerOptions": { 6 | "outDir": "./dist" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /apps/electron/.erb/scripts/.eslintrc: -------------------------------------------------------------------------------- 1 | { 2 | "rules": { 3 | "no-console": "off", 4 | "global-require": "off", 5 | "import/no-dynamic-require": "off", 6 | "import/no-extraneous-dependencies": "off" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /packages/core/src/flow-interactions.service.ts: -------------------------------------------------------------------------------- 1 | import { ParsedInteractionOrError } from "@onflowser/api"; 2 | 3 | export interface IFlowInteractions { 4 | parse(sourceCode: string): Promise; 5 | } 6 | -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountLink/AccountLink.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/colors"; 2 | @import "../../styles/spacings"; 3 | 4 | .root { 5 | display: flex; 6 | align-items: center; 7 | column-gap: $spacing-s; 8 | } 9 | -------------------------------------------------------------------------------- /packages/ui/src/events/EventsTable/EventsTable.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/spacings"; 2 | @import "../../styles/animations"; 3 | 4 | .hashEvents { 5 | max-width: 13vw; 6 | display: flex; 7 | overflow: hidden; 8 | } 9 | -------------------------------------------------------------------------------- /apps/electron/src/utils.ts: -------------------------------------------------------------------------------- 1 | type ErrorWithMessage = { message: string }; 2 | 3 | export function isErrorWithMessage(error: unknown): error is ErrorWithMessage { 4 | return typeof error === 'object' && error !== null && 'message' in error; 5 | } 6 | -------------------------------------------------------------------------------- /packages/core/src/logger.ts: -------------------------------------------------------------------------------- 1 | export interface IFlowserLogger { 2 | error(message: any, error?: unknown): void; 3 | log(message: any): void; 4 | warn(message: any): void; 5 | debug(message: any): void; 6 | verbose(message: any): void; 7 | } 8 | -------------------------------------------------------------------------------- /packages/ui/src/common/layouts/BasicLayout/BasicLayout.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../../styles/colors"; 2 | 3 | .root { 4 | .header { 5 | position: sticky; 6 | top: 0; 7 | background: $gray-110; 8 | z-index: 100; 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /apps/electron/src/renderer/index.tsx: -------------------------------------------------------------------------------- 1 | import { createRoot } from 'react-dom/client'; 2 | import { App } from './App'; 3 | 4 | const container = document.getElementById('root') as HTMLElement; 5 | const root = createRoot(container); 6 | root.render(); 7 | -------------------------------------------------------------------------------- /apps/electron/src/main/preload.ts: -------------------------------------------------------------------------------- 1 | import { contextBridge } from 'electron'; 2 | import { electronInvokers } from './ipc/invokers'; 3 | 4 | contextBridge.exposeInMainWorld('electron', electronInvokers); 5 | 6 | export type ElectronInvokers = typeof electronInvokers; 7 | -------------------------------------------------------------------------------- /apps/electron/.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 | -------------------------------------------------------------------------------- /apps/electron/.gitattributes: -------------------------------------------------------------------------------- 1 | * text eol=lf 2 | *.exe binary 3 | *.png binary 4 | *.jpg binary 5 | *.jpeg binary 6 | *.ico binary 7 | *.icns binary 8 | *.eot binary 9 | *.otf binary 10 | *.ttf binary 11 | *.woff binary 12 | *.woff2 binary 13 | -------------------------------------------------------------------------------- /apps/electron/src/renderer/preload.d.ts: -------------------------------------------------------------------------------- 1 | import { ElectronInvokers } from '../main/preload'; 2 | 3 | declare global { 4 | // eslint-disable-next-line no-unused-vars 5 | interface Window { 6 | electron: ElectronInvokers; 7 | } 8 | } 9 | 10 | export {}; 11 | -------------------------------------------------------------------------------- /packages/ui/src/common/overlays/Tooltip/Tooltip.scss: -------------------------------------------------------------------------------- 1 | @import "../../../styles/colors"; 2 | 3 | .popup-content { 4 | background: $gray-10; 5 | color: $violet-110; 6 | border-color: transparent; 7 | } 8 | 9 | .popup-arrow { 10 | color: $violet-10; 11 | } 12 | -------------------------------------------------------------------------------- /packages/ui/src/events/EventDetails/EventDetails.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/spacings"; 2 | @import "../../styles/colors"; 3 | 4 | .root { 5 | display: flex; 6 | flex-direction: column; 7 | 8 | .dataCard { 9 | background: $gray-100; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/ui/src/common/misc/BaseBadge/BaseBadge.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../../styles/colors"; 2 | @import "../../../styles/spacings"; 3 | 4 | .root { 5 | border: 1px solid $gray-10; 6 | color: $gray-10; 7 | border-radius: 12px; 8 | padding: 2px $spacing-s; 9 | } 10 | -------------------------------------------------------------------------------- /packages/ui/src/interactions/components/InteractionIcon/InteractionIcon.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../../styles/colors"; 2 | 3 | .script { 4 | } 5 | 6 | .transaction { 7 | * { 8 | fill: $yellow; 9 | } 10 | } 11 | 12 | .questionMark { 13 | transform: scale(1.1); 14 | } 15 | -------------------------------------------------------------------------------- /packages/ui/src/transactions/TransactionDetails/TransactionDetails.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/spacings"; 2 | @import "../../styles/animations"; 3 | 4 | .root { 5 | display: flex; 6 | flex-direction: column; 7 | 8 | .tabContent { 9 | overflow: unset; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/ui/src/common/buttons/SimpleButton/SimpleButton.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../../styles/colors"; 2 | @import "../../../styles/typography"; 3 | 4 | .root { 5 | background: none; 6 | border: none; 7 | cursor: pointer; 8 | color: $blue; 9 | font-size: $font-size-normal; 10 | } 11 | -------------------------------------------------------------------------------- /apps/electron/src/__tests__/App.test.tsx: -------------------------------------------------------------------------------- 1 | import '@testing-library/jest-dom'; 2 | import { render } from '@testing-library/react'; 3 | import App from '../renderer/App'; 4 | 5 | describe('App', () => { 6 | it('should render', () => { 7 | expect(render()).toBeTruthy(); 8 | }); 9 | }); 10 | -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountsTable/AccountsTable.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/spacings"; 2 | @import "../../styles/colors"; 3 | 4 | .tagsColumn { 5 | display: flex; 6 | column-gap: $spacing-base; 7 | .tag { 8 | border-color: $green-10; 9 | color: $green-10; 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /packages/ui/src/transactions/TransactionsTable/TransactionsTable.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/spacings"; 2 | @import "../../styles/animations"; 3 | 4 | .hash { 5 | max-width: 15vw; 6 | min-width: 10vw; 7 | display: inline-block; 8 | } 9 | 10 | .nameColumn { 11 | overflow: hidden; 12 | } 13 | -------------------------------------------------------------------------------- /packages/ui/src/accounts/AccountAvatar/avatars/README.md: -------------------------------------------------------------------------------- 1 | ## Toy Faces Library - 3D Avatars 2 | 3 | from amritpaldesign.com 4 | 5 | Licenses Explained: https://amritpaldesign.com/licenses 6 | 7 | ## Thanks for your support ;) 8 | 9 | Please contact me if you have any questions via amrit@amritpaldesign.com 10 | -------------------------------------------------------------------------------- /packages/ui/src/common/icons/assets/play.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/ui/src/common/code/JsonView/JsonView.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../../styles/colors"; 2 | @import "../../../styles/scrollbars"; 3 | 4 | .root { 5 | display: inline-block; 6 | font-size: 14px; 7 | overflow: scroll; 8 | height: 100%; 9 | width: 100%; 10 | 11 | @include hiddenScrollbars(); 12 | } 13 | -------------------------------------------------------------------------------- /packages/ui/src/common/time/TimeAgo/TimeAgo.tsx: -------------------------------------------------------------------------------- 1 | import ReactTimeAgo, { ReactTimeagoProps } from "react-timeago"; 2 | import React, { ReactElement } from "react"; 3 | 4 | export function TimeAgo(props: ReactTimeagoProps): ReactElement { 5 | return ; 6 | } 7 | -------------------------------------------------------------------------------- /packages/ui/src/common/links/ProjectLink/ProjectLink.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../../styles/colors"; 2 | @import "../../../styles/spacings"; 3 | 4 | .root { 5 | color: transparentize($blue, 0.1); 6 | cursor: pointer; 7 | 8 | &:hover { 9 | * { 10 | text-decoration: underline; 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/ui/src/common/overlays/dialogs/base/BaseDialog.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../../../styles/colors"; 2 | @import "../../../../styles/rules"; 3 | @import "../../../../styles/spacings"; 4 | 5 | .closeButton { 6 | cursor: pointer; 7 | position: absolute; 8 | top: $spacing-base; 9 | right: $spacing-base; 10 | } 11 | -------------------------------------------------------------------------------- /apps/web/src/common/interaction-page-params.ts: -------------------------------------------------------------------------------- 1 | import { FlowNetworkId } from "@onflowser/core/src/flow-utils"; 2 | 3 | // Must be placed in separate (type-only) file, 4 | // so that opengraph-image doesn't reach code size limit. 5 | export type InteractionsPageParams = { 6 | networkId: FlowNetworkId; 7 | interaction?: string; 8 | } 9 | -------------------------------------------------------------------------------- /apps/electron/release/app/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "flowser", 3 | "version": "3.2.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "flowser", 9 | "version": "3.2.0", 10 | "hasInstallScript": true, 11 | "license": "MIT" 12 | } 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/ui/src/common/icons/assets/close.svg: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /apps/electron/src/renderer/index.ejs: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 9 | Flowser 10 | 11 | 12 |
13 | 14 | 15 | -------------------------------------------------------------------------------- /packages/ui/src/common/status/Status.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/spacings"; 2 | @import "../../styles/colors"; 3 | @import "../../styles/typography"; 4 | 5 | .root { 6 | display: flex; 7 | align-items: center; 8 | 9 | .statusLabel { 10 | margin-left: $spacing-base; 11 | color: $grey; 12 | font-size: $font-size-small; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /packages/ui/src/common/status/TransactionStatusBadge.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/spacings"; 2 | @import "../../styles/typography"; 3 | @import "../../styles/colors"; 4 | 5 | .root { 6 | font-size: $font-size-small; 7 | display: flex; 8 | align-items: center; 9 | border-radius: 100px; 10 | padding: 0 $spacing-base; 11 | font-weight: bold; 12 | } 13 | -------------------------------------------------------------------------------- /packages/ui/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "@onflowser/config/tsconfig.json", 3 | "include": ["src"], 4 | "exclude": ["dist", "node_modules"], 5 | "compilerOptions": { 6 | "outDir": "./dist", 7 | "module": "esnext", 8 | "target": "es5", 9 | "lib": ["es6", "dom", "ES2021"], 10 | "jsx": "react-jsx", 11 | "baseUrl": "src" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /apps/electron/src/services/types.ts: -------------------------------------------------------------------------------- 1 | export enum FlowserDependencyErrorType { 2 | UNSUPPORTED_CLI_VERSION, 3 | MISSING_FLOW_CLI, 4 | } 5 | 6 | export interface FlowserDependencyError { 7 | name: string; 8 | type: FlowserDependencyErrorType; 9 | 10 | unsupportedCliVersion?: { 11 | minSupportedVersion: string; 12 | actualVersion: string; 13 | }; 14 | } 15 | -------------------------------------------------------------------------------- /packages/ui/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./transactions/TransactionOverview/TransactionOverview"; 2 | export * from "./transactions/TransactionsTable/TransactionsTable"; 3 | export * from "./transactions/TransactionDetailsTabs/TransactionDetailsTabs"; 4 | // export * from "./transactions/TransactionSource/TransactionSource"; 5 | 6 | export * from "./accounts/AccountName/AccountName"; 7 | -------------------------------------------------------------------------------- /apps/electron/.erb/scripts/link-modules.ts: -------------------------------------------------------------------------------- 1 | import fs from 'fs'; 2 | import webpackPaths from '../configs/webpack.paths'; 3 | 4 | const { srcNodeModulesPath } = webpackPaths; 5 | const { appNodeModulesPath } = webpackPaths; 6 | 7 | if (!fs.existsSync(srcNodeModulesPath) && fs.existsSync(appNodeModulesPath)) { 8 | fs.symlinkSync(appNodeModulesPath, srcNodeModulesPath, 'junction'); 9 | } 10 | -------------------------------------------------------------------------------- /apps/electron/.erb/scripts/clean.js: -------------------------------------------------------------------------------- 1 | import { rimrafSync } from 'rimraf'; 2 | import fs from 'fs'; 3 | import webpackPaths from '../configs/webpack.paths'; 4 | 5 | const foldersToRemove = [ 6 | webpackPaths.distPath, 7 | webpackPaths.buildPath, 8 | webpackPaths.dllPath, 9 | ]; 10 | 11 | foldersToRemove.forEach((folder) => { 12 | if (fs.existsSync(folder)) rimrafSync(folder); 13 | }); 14 | -------------------------------------------------------------------------------- /apps/electron/assets/entitlements.mac.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | com.apple.security.cs.allow-unsigned-executable-memory 6 | 7 | com.apple.security.cs.allow-jit 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /packages/ui/src/common/icons/assets/open.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/ui/src/interactions/components/ValueBuilder/interface.ts: -------------------------------------------------------------------------------- 1 | import { CadenceType } from "@onflowser/api"; 2 | import { FclValue } from "@onflowser/core"; 3 | 4 | export type CadenceValueBuilder = { 5 | disabled?: boolean; 6 | type: CadenceType; 7 | value: FclValue; 8 | setValue: (value: FclValue) => void; 9 | addressBuilderOptions?: { 10 | showManagedAccountsOnly: boolean; 11 | }; 12 | }; 13 | -------------------------------------------------------------------------------- /packages/ui/src/common/misc/LineSeparator/LineSeparator.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../../styles/colors"; 2 | @import "../../../styles/spacings"; 3 | 4 | .root { 5 | background: $gray-10; 6 | opacity: 0.2; 7 | } 8 | 9 | .horizontal { 10 | width: 100%; 11 | height: 1px; 12 | margin: $spacing-base 0; 13 | } 14 | 15 | .vertical { 16 | height: 100%; 17 | width: 1px; 18 | margin: 0 $spacing-base; 19 | } 20 | -------------------------------------------------------------------------------- /packages/ui/src/hooks/use-current-project-id.ts: -------------------------------------------------------------------------------- 1 | import { useParams } from "../contexts/navigation.context"; 2 | 3 | export function useCurrentWorkspaceId(): string { 4 | const params = useParams(); 5 | const workspaceId = params.workspaceId as string | undefined; 6 | 7 | 8 | // if (!workspaceId) { 9 | // throw new Error("Workspace ID not found in URL"); 10 | // } 11 | 12 | return workspaceId ?? ""; 13 | } 14 | -------------------------------------------------------------------------------- /packages/ui/src/interactions/components/InteractionLabel/InteractionLabel.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../../styles/spacings"; 2 | 3 | .root { 4 | display: flex; 5 | align-items: center; 6 | .iconWrapper { 7 | height: 20px; 8 | width: 20px; 9 | display: flex; 10 | align-items: center; 11 | justify-content: center; 12 | } 13 | .label { 14 | text-overflow: ellipsis; 15 | overflow: hidden; 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /apps/electron/src/renderer/components/DependencyErrors/DependencyErrors.module.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../../../packages/ui/src/styles/typography'; 2 | @import '../../../../../../packages/ui/src/styles/spacings'; 3 | 4 | .missingRequirementItem { 5 | .title { 6 | font-size: $font-size-large; 7 | margin-bottom: $spacing-base; 8 | display: block; 9 | } 10 | .description { 11 | margin-bottom: $spacing-s; 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/ui/src/common/icons/assets/search.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/ui/src/common/icons/assets/plus.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/ui/src/accounts/StorageDomainBadge/StorageDomainBadge.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../styles/spacings"; 2 | @import "../../styles/colors"; 3 | @import "../../styles/typography"; 4 | 5 | .root { 6 | border-radius: 8px; 7 | padding-left: 10px; 8 | padding-right: 10px; 9 | font-weight: 600; 10 | background: $gradient-1; 11 | color: $violet-100; 12 | font-size: $font-size-normal; 13 | text-transform: uppercase; 14 | width: fit-content; 15 | } 16 | -------------------------------------------------------------------------------- /packages/ui/src/common/icons/assets/star-fill.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 5 | -------------------------------------------------------------------------------- /packages/ui/src/utils/multi-map.ts: -------------------------------------------------------------------------------- 1 | // https://en.wikipedia.org/wiki/Multimap 2 | export class MultiMap extends Map { 3 | constructor(entries?: readonly (readonly [K, V])[] | null) { 4 | super(); 5 | 6 | for (const entry of entries ?? []) { 7 | const [key, value] = entry; 8 | const existingEntries = this.get(key) ?? []; 9 | existingEntries.push(value); 10 | this.set(key, existingEntries); 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /packages/ui/src/interactions/components/ValueBuilder/ArrayBuilder/ArrayBuilder.module.scss: -------------------------------------------------------------------------------- 1 | @import "../../../../styles/spacings"; 2 | 3 | .root { 4 | display: flex; 5 | flex-direction: column; 6 | row-gap: $spacing-base; 7 | flex: 1; 8 | 9 | .arrayElement { 10 | display: flex; 11 | flex-direction: row; 12 | .indexDisplay { 13 | display: flex; 14 | align-items: center; 15 | margin-right: $spacing-s; 16 | } 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /packages/ui/src/styles/scrollbars.scss: -------------------------------------------------------------------------------- 1 | @import "colors"; 2 | 3 | @mixin styledScrollbars { 4 | &::-webkit-scrollbar, 5 | *::-webkit-scrollbar { 6 | width: 10px; 7 | } 8 | 9 | &::-webkit-scrollbar-thumb, 10 | *::-webkit-scrollbar-thumb { 11 | box-shadow: inset 0 0 6px $gray-80; 12 | border-radius: 5pt; 13 | } 14 | } 15 | 16 | @mixin hiddenScrollbars { 17 | &::-webkit-scrollbar, 18 | *::-webkit-scrollbar { 19 | display: none; 20 | } 21 | } 22 | -------------------------------------------------------------------------------- /packages/nodejs/src/index.ts: -------------------------------------------------------------------------------- 1 | export * from "./async-interval-scheduler"; 2 | export * from "./go-bindings.service"; 3 | export * from "./flow-interactions.service"; 4 | export * from "./flow-emulator.service"; 5 | export * from "./flow-dev-wallet.service"; 6 | export * from "./flow-config.service"; 7 | export * from "./flow-cli.service"; 8 | export * from "./wallet.service"; 9 | export * from "./processes/process-manager.service"; 10 | export * from "./processes/managed-process"; 11 | -------------------------------------------------------------------------------- /packages/ui/src/common/buttons/SimpleButton/SimpleButton.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactElement } from "react"; 2 | import classes from "./SimpleButton.module.scss"; 3 | import classNames from "classnames"; 4 | 5 | export type SimpleButtonProps = React.ButtonHTMLAttributes; 6 | 7 | export function SimpleButton(props: SimpleButtonProps): ReactElement { 8 | return ( 9 | 24 | } 25 | > 26 | {supportedNetworks.map(network => ( 27 | { 30 | if (network !== value) { 31 | onChange(network) 32 | } 33 | }} 34 | className="capitalize" 35 | > 36 | {network} 37 | 38 | ))} 39 | 40 | ) 41 | } 42 | -------------------------------------------------------------------------------- /packages/ui/src/common/icons/assets/transaction.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | -------------------------------------------------------------------------------- /packages/ui/src/common/layouts/ProjectLayout/WorkspaceLayout.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactNode } from "react"; 2 | import classes from "./ProjectLayout.module.scss"; 3 | import { Logs } from "../../../logs/Logs"; 4 | import classNames from "classnames"; 5 | import { Breadcrumbs } from "../../misc/Breadcrumbs/Breadcrumbs"; 6 | import { SideNavigation } from "../../misc/SideNavigation/SideNavigation"; 7 | import { useLocation } from "../../../contexts/navigation.context"; 8 | 9 | type ProjectLayoutProps = { 10 | children: ReactNode; 11 | }; 12 | 13 | export const scrollableElementId = "flowser-scroll"; 14 | 15 | export function WorkspaceLayout(props: ProjectLayoutProps) { 16 | const location = useLocation(); 17 | const showMargin = !location.pathname.endsWith("interactions"); 18 | 19 | return ( 20 |
21 | 22 |
23 | 24 |
30 | {props.children} 31 |
32 | 33 |
34 |
35 | ); 36 | } 37 | -------------------------------------------------------------------------------- /packages/ui/src/transactions/TransactionDetails/TransactionDetails.tsx: -------------------------------------------------------------------------------- 1 | import React, { FunctionComponent } from "react"; 2 | import classes from "./TransactionDetails.module.scss"; 3 | import FullScreenLoading from "../../common/loaders/FullScreenLoading/FullScreenLoading"; 4 | import { TransactionOverview } from "../TransactionOverview/TransactionOverview"; 5 | import { SizedBox } from "../../common/misc/SizedBox/SizedBox"; 6 | import { TransactionDetailsTabs } from "../TransactionDetailsTabs/TransactionDetailsTabs"; 7 | import { useGetTransaction } from "../../api"; 8 | 9 | type TransactionDetailsProps = { 10 | transactionId: string; 11 | }; 12 | 13 | export const TransactionDetails: FunctionComponent = ( 14 | props, 15 | ) => { 16 | const { transactionId } = props; 17 | const { data: transaction, isLoading } = useGetTransaction(transactionId); 18 | 19 | if (isLoading || !transaction) { 20 | return ; 21 | } 22 | 23 | return ( 24 |
25 | 26 | 27 | 33 |
34 | ); 35 | }; 36 | -------------------------------------------------------------------------------- /packages/ui/src/common/status/ErrorMessage.tsx: -------------------------------------------------------------------------------- 1 | import React, { ReactElement } from "react"; 2 | import { FlowUtils } from "../../utils/flow-utils"; 3 | import classes from "./ErrorMessage.module.scss"; 4 | import { JsonView } from "../code/JsonView/JsonView"; 5 | import { ExternalLink } from "../links/ExternalLink/ExternalLink"; 6 | import { Callout } from "../misc/Callout/Callout"; 7 | import { SizedBox } from "../misc/SizedBox/SizedBox"; 8 | 9 | type ScriptErrorProps = { 10 | cadenceSource: string; 11 | errorMessage: string; 12 | }; 13 | 14 | export function ScriptError(props: ScriptErrorProps): ReactElement { 15 | const parsedMessage = FlowUtils.parseScriptError(props.errorMessage); 16 | 17 | if (parsedMessage === undefined) { 18 | return
{props.errorMessage}
; 19 | } 20 | 21 | if (parsedMessage.responseBody?.message) { 22 | return ( 23 |
{parsedMessage.responseBody.message}
24 | ); 25 | } 26 | 27 | return ( 28 | 29 | ); 30 | } 31 | 32 | type TransactionErrorProps = { 33 | cadenceSource: string; 34 | errorMessage: string; 35 | }; 36 | 37 | export function TransactionError(props: TransactionErrorProps): ReactElement { 38 | return
{props.errorMessage}
; 39 | } 40 | -------------------------------------------------------------------------------- /packages/core/src/flix-v1.ts: -------------------------------------------------------------------------------- 1 | // https://github.com/onflow/flips/blob/main/application/20220503-interaction-templates.md#interaction-interfaces 2 | import { FlowNetworkId } from "./flow-utils"; 3 | 4 | export type FlixV1Template = { 5 | id: string; 6 | f_type: "InteractionTemplate"; 7 | f_version: "1.0.0"; 8 | data: { 9 | messages: FlixV1Messages; 10 | dependencies: Record; 11 | cadence: string; 12 | arguments: Record; 13 | }; 14 | }; 15 | 16 | export type FlixV1Auditor = { 17 | f_type: "FlowInteractionTemplateAuditor"; 18 | f_version: string; 19 | address: string; 20 | name: string; 21 | twitter_url: string; 22 | website_url: string; 23 | } 24 | 25 | export type FlixV1Argument = { 26 | index: number; 27 | type: string; 28 | messages: FlixV1Messages; 29 | } 30 | 31 | type FlixV1Dependency = Record< 32 | string, 33 | // Only defined for `testnet` and `mainnet` networks. 34 | Record 35 | >; 36 | 37 | type FlixV1DependencyOnNetwork = { 38 | address: string; 39 | fq_address: string; 40 | pin: string; 41 | pin_block_height: number; 42 | }; 43 | 44 | type FlixV1Messages = { 45 | title?: FlixV1I18nMessage; 46 | description?: FlixV1I18nMessage; 47 | }; 48 | 49 | type FlixV1I18nMessage = { 50 | i18n: { 51 | "en-US"?: string; 52 | }; 53 | }; 54 | -------------------------------------------------------------------------------- /packages/ui/src/common/icons/assets/plus-round.svg: -------------------------------------------------------------------------------- 1 | 3 | 4 | 6 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /apps/electron/src/renderer/App.scss: -------------------------------------------------------------------------------- 1 | @import '../../../../packages/ui/src/styles/colors'; 2 | @import '../../../../packages/ui/src/styles/typography'; 3 | 4 | @font-face { 5 | font-family: 'Inter'; 6 | font-style: normal; 7 | font-weight: 400; 8 | /* Path to font must start without "/" prefix, otherwise it won't work on Windows. */ 9 | src: url(../../assets/Inter.woff2) format('woff2'); 10 | unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, 11 | U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, 12 | U+2193, U+2212, U+2215, U+FEFF, U+FFFD; 13 | } 14 | 15 | * { 16 | margin: 0; 17 | padding: 0; 18 | box-sizing: content-box; 19 | outline: none; 20 | 21 | &:focus-visible { 22 | outline: 2px solid $blue; 23 | } 24 | } 25 | 26 | html, 27 | body { 28 | color: $gray-10; 29 | background: $gray-110; 30 | font-family: "Inter"; 31 | font-size: $font-size-normal; 32 | font-style: normal; 33 | font-weight: normal; 34 | letter-spacing: $character-spacing-small; 35 | line-height: $line-spacing-m; 36 | -webkit-font-smoothing: antialiased; 37 | -moz-osx-font-smoothing: grayscale; 38 | 39 | min-height: 100%; 40 | height: 100%; 41 | 42 | scroll-behavior: smooth; 43 | 44 | &::-webkit-scrollbar { 45 | display: none; 46 | } 47 | } 48 | 49 | a { 50 | text-decoration: none; 51 | color: $blue; 52 | } 53 | -------------------------------------------------------------------------------- /packages/core/src/flix-v11.ts: -------------------------------------------------------------------------------- 1 | // https://github.com/onflow/flips/blob/main/application/20220503-interaction-templates.md#interaction-interfaces 2 | import { FlowNetworkId } from "./flow-utils"; 3 | 4 | export type FlixV11Template = { 5 | id: string; 6 | f_type: "InteractionTemplate"; 7 | f_version: "1.1.0"; 8 | data: { 9 | messages: FlixV11Message[] | null; 10 | cadence: { 11 | body: string; 12 | network_pins: FlixV11NetworkPin[]; 13 | }; 14 | parameters: FlixV11Parameter[]; 15 | dependencies: { contracts: FlixV11ContractDependency[] }[] | null; 16 | }; 17 | }; 18 | 19 | export type FlixV11ContractDependency = { 20 | // Name of the contract (e.g. "EVM") 21 | contract: string; 22 | networks: FlixV11ContractNetwork[]; 23 | } 24 | 25 | export type FlixV11ContractNetwork = { 26 | network: FlowNetworkId; 27 | address: string; 28 | } 29 | 30 | export type FlixV11NetworkPin = { 31 | network: FlowNetworkId; 32 | pin_self: string; 33 | } 34 | 35 | export type FlixV11Message = { 36 | // Standard keys: "title", "description",.. 37 | key: string; 38 | i18n: FlixV11MessageI18n[]; 39 | } 40 | 41 | export type FlixV11MessageI18n = { 42 | // Language key (e.g. "en-US") 43 | tag: string; 44 | translation: string; 45 | } 46 | 47 | export type FlixV11Parameter = { 48 | label: string; 49 | index: 0; 50 | type: string; 51 | messages: FlixV11Message[]; 52 | } 53 | -------------------------------------------------------------------------------- /packages/ui/src/common/buttons/IconButton/IconButton.tsx: -------------------------------------------------------------------------------- 1 | import React, { FunctionComponent, ReactElement } from "react"; 2 | import Button, { ButtonProps } from "../Button/Button"; 3 | import classes from "./IconButton.module.scss"; 4 | import classNames from "classnames"; 5 | 6 | interface IconButtonProps extends ButtonProps { 7 | icon: ReactElement; 8 | iconPosition?: "before" | "after" | "after-end"; 9 | } 10 | 11 | const IconButton: FunctionComponent = ({ 12 | icon, 13 | iconPosition = "before", 14 | ...restProps 15 | }) => { 16 | let children = icon; 17 | if (restProps.children) { 18 | if (iconPosition === "before") { 19 | children = ( 20 | 21 | {icon} {restProps.children} 22 | 23 | ); 24 | } else if (iconPosition === "after-end") { 25 | children = ( 26 | 27 | {restProps.children} {icon} 28 | 29 | ); 30 | } else { 31 | children = ( 32 | 33 | {restProps.children} {icon} 34 | 35 | ); 36 | } 37 | } 38 | return ( 39 | 45 | ); 46 | }; 47 | 48 | export default IconButton; 49 | -------------------------------------------------------------------------------- /.github/workflows/publish.yml: -------------------------------------------------------------------------------- 1 | name: Publish 2 | 3 | on: 4 | release: 5 | types: 6 | - created 7 | 8 | jobs: 9 | publish: 10 | runs-on: ${{ matrix.os }} 11 | 12 | strategy: 13 | matrix: 14 | os: [ macos-latest ] 15 | 16 | steps: 17 | - name: Checkout git repo 18 | uses: actions/checkout@v3 19 | 20 | - name: Install Node and NPM 21 | uses: actions/setup-node@v3 22 | with: 23 | node-version: 18 24 | cache: npm 25 | 26 | - name: Run install 27 | uses: borales/actions-yarn@v4 28 | with: 29 | cmd: install 30 | 31 | - name: Setup Go environment 32 | uses: actions/setup-go@v4.1.0 33 | 34 | - name: Build 35 | run: | 36 | yarn run build 37 | 38 | - name: Publish releases 39 | env: 40 | # These values are used for auto updates signing 41 | APPLE_ID: ${{ secrets.APPLE_ID }} 42 | APPLE_APP_SPECIFIC_PASSWORD: ${{ secrets.APPLE_APP_SPECIFIC_PASSWORD }} 43 | CSC_LINK: ${{ secrets.CSC_LINK }} 44 | CSC_KEY_PASSWORD: ${{ secrets.CSC_KEY_PASSWORD }} 45 | # This is used for uploading release assets to github 46 | GH_TOKEN: ${{ secrets.GH_TOKEN }} 47 | run: | 48 | npm exec electron-builder -- --publish always --win --mac --linux 49 | working-directory: ./apps/electron 50 | -------------------------------------------------------------------------------- /packages/core/src/http.service.ts: -------------------------------------------------------------------------------- 1 | import axios, { Method } from "axios"; 2 | import axiosRetry from 'axios-retry'; 3 | import { IFlowserLogger } from "./logger"; 4 | 5 | type RequestConfig = { 6 | url: string; 7 | method?: Method; 8 | } 9 | 10 | export class HttpService { 11 | constructor(private readonly logger: IFlowserLogger) {} 12 | 13 | public async isReachable(url: string) { 14 | try { 15 | await axios.request({ 16 | method: "GET", 17 | url, 18 | // Prevent axios from throwing on certain http response codes 19 | // https://github.com/axios/axios/issues/41 20 | validateStatus: () => true, 21 | }); 22 | // Assume that if response is received, the HTTP server is online. 23 | return true; 24 | } catch (error) { 25 | return false; 26 | } 27 | } 28 | 29 | public async request(config: RequestConfig) { 30 | const client = axios.create({ 31 | // Prevent axios from throwing on certain http response codes 32 | // https://github.com/axios/axios/issues/41 33 | validateStatus: () => true, 34 | }); 35 | 36 | axiosRetry(client, { 37 | retries: 4, 38 | retryDelay: axiosRetry.exponentialDelay, 39 | onRetry: retryCount => { 40 | this.logger.debug(`Retrying ${config.url} (${retryCount})`); 41 | } 42 | }); 43 | 44 | return client.request(config); 45 | } 46 | } 47 | --------------------------------------------------------------------------------