diff --git a/.i18n-codegen.json b/.i18n-codegen.json index 0e88dbae02d2..cb999243cc8d 100644 --- a/.i18n-codegen.json +++ b/.i18n-codegen.json @@ -181,6 +181,18 @@ "trans": "Translate", "sourceMap": "inline" } + }, + { + "input": "./packages/plugins/GoPlusSecurity/src/locales/en-US.json", + "output": "./packages/plugins/GoPlusSecurity/src/locales/i18n_generated", + "parser": "i18next", + "generator": { + "type": "i18next/react-hooks", + "hooks": "useI18N", + "namespace": "io.gopluslabs.security", + "trans": "Translate", + "sourceMap": "inline" + } } ] } diff --git a/cspell.json b/cspell.json index a95e6fc19fa4..35bc186fb02e 100644 --- a/cspell.json +++ b/cspell.json @@ -309,6 +309,7 @@ "gamification", "getdodoroute", "getx", + "gopluslabs", "gorli", "gusd", "gwapj", @@ -347,6 +348,7 @@ "nyfi", "onflow", "openocean", + "pausable", "pkts", "pnpm", "poap", diff --git a/packages/icons/general/Risk.tsx b/packages/icons/general/Risk.tsx index ec4879d374e8..954ea2825e52 100644 --- a/packages/icons/general/Risk.tsx +++ b/packages/icons/general/Risk.tsx @@ -5,11 +5,11 @@ export const RiskIcon = createIcon( , '0 0 24 24', diff --git a/packages/mask/.webpack/config.ts b/packages/mask/.webpack/config.ts index e5a143627592..8fe5fbdd2ac9 100644 --- a/packages/mask/.webpack/config.ts +++ b/packages/mask/.webpack/config.ts @@ -88,6 +88,7 @@ export function createConfiguration(rawFlags: BuildFlags): Configuration { '@masknet/plugin-wallet': join(__dirname, '../../plugins/Wallet/src/'), '@masknet/plugin-file-service': join(__dirname, '../../plugins/FileService/src/'), '@masknet/plugin-cyberconnect': join(__dirname, '../../plugins/CyberConnect/src/'), + '@masknet/plugin-go-plus-security': join(__dirname, '../../plugins/GoPlusSecurity/src/'), '@masknet/external-plugin-previewer': join(__dirname, '../../external-plugin-previewer/src/'), '@masknet/public-api': join(__dirname, '../../public-api/src/'), '@masknet/sdk': join(__dirname, '../../mask-sdk/server/'), diff --git a/packages/mask/package.json b/packages/mask/package.json index 46985cd97798..a209f3631107 100644 --- a/packages/mask/package.json +++ b/packages/mask/package.json @@ -29,6 +29,7 @@ "@masknet/plugin-rss3": "workspace:*", "@masknet/plugin-solana": "workspace:*", "@masknet/plugin-wallet": "workspace:*", + "@masknet/plugin-go-plus-security": "workspace:*", "@masknet/public-api": "workspace:*", "@masknet/sdk": "workspace:*", "@masknet/shared": "workspace:*", diff --git a/packages/mask/src/plugin-infra/register.js b/packages/mask/src/plugin-infra/register.js index 46f4973e183a..5cbbf531805e 100644 --- a/packages/mask/src/plugin-infra/register.js +++ b/packages/mask/src/plugin-infra/register.js @@ -10,6 +10,7 @@ import '@masknet/plugin-rss3' import '@masknet/plugin-dao' import '@masknet/plugin-solana' import '@masknet/plugin-cyberconnect' +import '@masknet/plugin-go-plus-security' import '../plugins/Wallet' import '../plugins/EVM' import '../plugins/RedPacket' diff --git a/packages/plugin-infra/src/types.ts b/packages/plugin-infra/src/types.ts index 9b2209b1bf7d..e0bc35cd42ec 100644 --- a/packages/plugin-infra/src/types.ts +++ b/packages/plugin-infra/src/types.ts @@ -688,6 +688,7 @@ export enum PluginId { UnlockProtocol = 'com.maskbook.unlockprotocol', FileService = 'com.maskbook.fileservice', CyberConnect = 'me.cyberconnect.app', + GoPlusSecurity = 'io.gopluslabs.security', // @masknet/scripts: insert-here } diff --git a/packages/plugins/GoPlusSecurity/package.json b/packages/plugins/GoPlusSecurity/package.json new file mode 100644 index 000000000000..378301090576 --- /dev/null +++ b/packages/plugins/GoPlusSecurity/package.json @@ -0,0 +1,20 @@ +{ + "name": "@masknet/plugin-go-plus-security", + "private": true, + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "dependencies": { + "react-feather": "^2.0.9", + "@masknet/icons": "workspace:*", + "@masknet/plugin-infra": "workspace:*", + "@masknet/shared": "workspace:*", + "@masknet/shared-base-ui": "workspace:*", + "@masknet/shared-base": "workspace:*", + "@masknet/theme": "workspace:*", + "@masknet/web3-providers": "workspace:*", + "@masknet/web3-shared-evm": "workspace:*", + "react-use": "^17.3.2", + "bignumber.js": "^9.0.2", + "urlcat": "^2.0.4" + } +} diff --git a/packages/plugins/GoPlusSecurity/src/Dashboard/index.tsx b/packages/plugins/GoPlusSecurity/src/Dashboard/index.tsx new file mode 100644 index 000000000000..c11379ee47db --- /dev/null +++ b/packages/plugins/GoPlusSecurity/src/Dashboard/index.tsx @@ -0,0 +1,9 @@ +import type { Plugin } from '@masknet/plugin-infra' +import { base } from '../base' + +const dashboard: Plugin.Dashboard.Definition = { + ...base, + init(signal) {}, +} + +export default dashboard diff --git a/packages/plugins/GoPlusSecurity/src/SNSAdaptor/CheckSecurityDialog.tsx b/packages/plugins/GoPlusSecurity/src/SNSAdaptor/CheckSecurityDialog.tsx new file mode 100644 index 000000000000..f679c307e226 --- /dev/null +++ b/packages/plugins/GoPlusSecurity/src/SNSAdaptor/CheckSecurityDialog.tsx @@ -0,0 +1,86 @@ +import { Box, DialogContent, Stack } from '@mui/material' +import { makeStyles, MaskDialog, useStylesExtends } from '@masknet/theme' +import { useI18N } from '../locales' +import { SearchBox } from './components/SearchBox' +import { useAsyncFn } from 'react-use' +import { GoPlusLabs } from '@masknet/web3-providers' +import { Searching } from './components/Searching' +import { SecurityPanel } from './components/SecurityPanel' +import { Footer } from './components/Footer' +import { Center, TokenSecurity } from './components/Common' +import { DefaultPlaceholder } from './components/DefaultPlaceholder' +import { NotFound } from './components/NotFound' +import type { ChainId } from '@masknet/web3-shared-evm' + +const useStyles = makeStyles()((theme) => ({ + root: { + width: 600, + }, + paperRoot: { + backgroundImage: 'none', + '&>h2': { + height: 30, + border: `1px solid ${theme.palette.divider}`, + padding: theme.spacing(1.875, 2.5, 1.875, 2.5), + marginBottom: 24, + }, + }, + content: { + width: 552, + height: 510, + maxHeight: 510, + paddingBottom: theme.spacing(3), + }, +})) + +export interface BuyTokenDialogProps extends withClasses { + open: boolean + onClose(): void +} + +export function CheckSecurityDialog(props: BuyTokenDialogProps) { + const t = useI18N() + const classes = useStylesExtends(useStyles(), props) + const { open, onClose } = props + + const [{ value, loading: searching, error }, onSearch] = useAsyncFn(async (chainId: ChainId, content: string) => { + const values = await GoPlusLabs.getTokenSecurity(chainId, [content.trim()]) + if (!Object.keys(values ?? {}).length) throw new Error('Contract Not Found') + return Object.entries(values ?? {}).map((x) => ({ ...x[1], contract: x[0], chainId }))[0] as + | TokenSecurity + | undefined + }, []) + + return ( + + + + + + + + {searching && ( +
+ +
+ )} + {error && !searching && } + {!error && !searching && value && } + {!error && !searching && !value && ( +
+ +
+ )} +
+ +