diff --git a/package.json b/package.json index d5ec62b5e7cd..41992d8f074f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "mask-network", "packageManager": "pnpm@6.23.1", - "version": "2.3.0", + "version": "2.4.4", "private": true, "license": "AGPL-3.0-or-later", "scripts": { diff --git a/packages/dashboard/src/pages/Wallets/components/FungibleTokenTableRow/index.tsx b/packages/dashboard/src/pages/Wallets/components/FungibleTokenTableRow/index.tsx index e5333b42c0fd..4d3a0e074628 100644 --- a/packages/dashboard/src/pages/Wallets/components/FungibleTokenTableRow/index.tsx +++ b/packages/dashboard/src/pages/Wallets/components/FungibleTokenTableRow/index.tsx @@ -52,8 +52,6 @@ const useStyles = makeStyles()((theme) => ({ bottom: 0, height: 16, width: 16, - border: `1px solid ${theme.palette.background.default}`, - borderRadius: '50%', }, tip: { padding: theme.spacing(1), diff --git a/packages/icons/general/Selected.tsx b/packages/icons/general/Selected.tsx index 8ab2ad2a7831..2b99be6d01d7 100644 --- a/packages/icons/general/Selected.tsx +++ b/packages/icons/general/Selected.tsx @@ -2,21 +2,15 @@ import { createIcon } from '../utils' export const SelectedIcon = createIcon( 'SelectedIcon', - - - - - - - - - - + + + + , '0 0 16 16', ) diff --git a/packages/mask/public/patches.js b/packages/mask/public/patches.js index fe782e91d2a9..4e3f6866390a 100644 --- a/packages/mask/public/patches.js +++ b/packages/mask/public/patches.js @@ -83,7 +83,7 @@ globalThis.regeneratorRuntime = undefined } { - if (typeof trustedTypes) { + if (typeof trustedTypes === 'object') { trustedTypes.createPolicy('default', { createHTML: (string) => { console.trace('[Trusted Types](default policy): Possible XSS happened. Please remove it.', string) diff --git a/packages/mask/src/extension/background-script/EthereumServices/request.ts b/packages/mask/src/extension/background-script/EthereumServices/request.ts index 04cc98cbee00..8e7ebbc9264a 100644 --- a/packages/mask/src/extension/background-script/EthereumServices/request.ts +++ b/packages/mask/src/extension/background-script/EthereumServices/request.ts @@ -55,30 +55,7 @@ function isSendMethod(method: EthereumMethodType) { return method === EthereumMethodType.ETH_SEND_TRANSACTION } -export function request( - requestArguments: RequestArguments, - overrides?: SendOverrides, - options?: RequestOptions, -) { - return new Promise((resolve, reject) => { - requestSend( - { - jsonrpc: '2.0', - id, - params: [], - ...requestArguments, - }, - (error, response) => { - if (error || response?.error) reject(error ?? response?.error) - else resolve(response?.result) - }, - overrides, - options, - ) - }) -} - -export async function requestSend( +async function requestSend( payload: JsonRpcPayload, callback: (error: Error | null, response?: JsonRpcResponse) => void, overrides?: SendOverrides, @@ -177,6 +154,29 @@ export async function requestSend( getSendMethod()(payload_, hijackedCallback, overrides) } +export async function request( + requestArguments: RequestArguments, + overrides?: SendOverrides, + options?: RequestOptions, +) { + return new Promise(async (resolve, reject) => { + requestSend( + { + jsonrpc: '2.0', + id, + params: [], + ...requestArguments, + }, + (error, response) => { + if (error || response?.error) reject(error ?? response?.error) + else resolve(response?.result) + }, + overrides, + options, + ) + }) +} + export async function confirmRequest(payload: JsonRpcPayload) { const pid = getPayloadId(payload) if (!pid) return diff --git a/packages/mask/src/manifest.json b/packages/mask/src/manifest.json index f9fc4ff9aef6..53c0141549a5 100644 --- a/packages/mask/src/manifest.json +++ b/packages/mask/src/manifest.json @@ -1,6 +1,6 @@ { "name": "Mask Network", - "version": "2.3.0", + "version": "2.4.4", "manifest_version": 2, "permissions": ["storage", "downloads", "webNavigation", "activeTab"], "optional_permissions": ["", "notifications", "clipboardRead"], diff --git a/packages/mask/src/plugins/Wallet/SNSAdaptor/SelectProviderDialog/PluginProviderRender.tsx b/packages/mask/src/plugins/Wallet/SNSAdaptor/SelectProviderDialog/PluginProviderRender.tsx index 1241980cf79e..1ac44f468090 100644 --- a/packages/mask/src/plugins/Wallet/SNSAdaptor/SelectProviderDialog/PluginProviderRender.tsx +++ b/packages/mask/src/plugins/Wallet/SNSAdaptor/SelectProviderDialog/PluginProviderRender.tsx @@ -53,7 +53,6 @@ const useStyles = makeStyles()((theme) => ({ height: 14, background: '#fff', borderRadius: '50%', - border: `1px solid ${theme.palette.background.default}`, }, alert: { fontSize: 12, diff --git a/packages/mask/src/social-network-adaptor/twitter.com/utils/selector.ts b/packages/mask/src/social-network-adaptor/twitter.com/utils/selector.ts index 6cc4b0eb2827..aef488835659 100644 --- a/packages/mask/src/social-network-adaptor/twitter.com/utils/selector.ts +++ b/packages/mask/src/social-network-adaptor/twitter.com/utils/selector.ts @@ -16,18 +16,11 @@ const querySelectorAll = (selector: string) => { // #region "Enhanced Profile" export const searchProfileSelector: () => LiveSelector = () => querySelector('[aria-label][role="navigation"]') -export const searchProfileTabListLastChildSelector: () => LiveSelector = () => { - const q = querySelector( - '[data-testid="primaryColumn"] > div > div >div >div >:nth-child(2)>div>div>:nth-child(2)>div>:nth-child(2)>div>:last-child', - ) - if (!q.evaluate()) { - return querySelector( - '[data-testid="primaryColumn"] > div > :nth-child(2) > div > div > :nth-child(2) >div>:last-child', - ) - } - return q -} +export const searchProfileTabListLastChildSelector: () => LiveSelector = () => + querySelector( + '[data-testid="primaryColumn"] div + [role="navigation"][aria-label] [data-testid="ScrollSnap-nextButtonWrapper"]', + ) export const searchProfileTabPageSelector: () => LiveSelector = () => querySelector( diff --git a/packages/plugins/DAO/src/constants.ts b/packages/plugins/DAO/src/constants.ts index dbdcc56845dc..b5e4c331dcab 100644 --- a/packages/plugins/DAO/src/constants.ts +++ b/packages/plugins/DAO/src/constants.ts @@ -8,9 +8,12 @@ export const PLUGIN_NAME = 'DAO' export const SUPPORTED_TWITTER_IDS = [ 'ConstitutionDAO', 'juiceboxETH', + 'AssangeDAO', + 'OfficialMoonDAO', 'TheSpiceDAO', /* cspell:disable-next-line */ 'sharkdao', + 'CrayonFinance', 'merge_dao', /* cspell:disable-next-line */ 'DAOTaiFung', diff --git a/packages/shared/src/UI/components/WalletIcon/index.tsx b/packages/shared/src/UI/components/WalletIcon/index.tsx index 580cf0c11cea..360772fe1f28 100644 --- a/packages/shared/src/UI/components/WalletIcon/index.tsx +++ b/packages/shared/src/UI/components/WalletIcon/index.tsx @@ -24,10 +24,7 @@ const useStyles = makeStyles()((theme, props) => ({ bottom: -2, }, networkIcon: {}, - providerIcon: { - border: `1px solid ${theme.palette.background.default}`, - borderRadius: '50%', - }, + providerIcon: {}, })) interface WalletIconProps extends withClasses<'networkIcon' | 'providerIcon'> { diff --git a/packages/web3-shared/evm/constants/index.ts b/packages/web3-shared/evm/constants/index.ts index 37a858d8a389..2f097d807fb7 100644 --- a/packages/web3-shared/evm/constants/index.ts +++ b/packages/web3-shared/evm/constants/index.ts @@ -25,9 +25,12 @@ import OpenseaAPI from '@masknet/web3-constants/evm/opensea-api.json' import CryptoArtAI from '@masknet/web3-constants/evm/cryptoartai.json' import { hookTransform, transform, transformFromJSON } from './utils' -function getEnvConstants(key: string) { +function getEnvConstants(key: 'WEB3_CONSTANTS_RPC') { try { - return process.env[key] ?? '' + const map = { + WEB3_CONSTANTS_RPC: process.env.WEB3_CONSTANTS_RPC, + } + return map[key] ?? '' } catch { return '' } @@ -83,7 +86,7 @@ export const useMaskBoxConstants = hookTransform(getMaskBoxConstants) export const getRPCConstants = transformFromJSON(getEnvConstants('WEB3_CONSTANTS_RPC'), RPC) export const useRPCConstants = hookTransform(getRPCConstants) -export const getExplorerConstants = transformFromJSON(getEnvConstants('WEB3_CONSTANTS_EXPLORER'), Explorer) +export const getExplorerConstants = transform(Explorer) export const useExplorerConstants = hookTransform(getExplorerConstants) export const getTokenListConstants = transform(TokenList) diff --git a/packages/web3-shared/evm/utils/provider.ts b/packages/web3-shared/evm/utils/provider.ts index fdf81c247868..a9cf64d7258a 100644 --- a/packages/web3-shared/evm/utils/provider.ts +++ b/packages/web3-shared/evm/utils/provider.ts @@ -1,7 +1,48 @@ import Web3 from 'web3' import type { RequestArguments } from 'web3-core' import type { JsonRpcPayload, JsonRpcResponse } from 'web3-core-helpers' -import type { RequestOptions, SendOverrides } from '../types' +import { EthereumMethodType, RequestOptions, SendOverrides } from '../types' + +const cache = new Map>() + +/** + * If it returns a cache id, it means the request can be cached. + * @param requestArguments + * @returns + */ +function getCacheId(requestArguments: RequestArguments, overrides?: SendOverrides) { + // The -1 is not a valid chain id, only used for distinguishing with other explicit chain id. + const chainId = overrides?.chainId ?? -1 + const { method, params } = requestArguments + switch (method) { + case EthereumMethodType.ETH_GET_BALANCE: + const [account, tag = 'latest'] = params as string[] + return [chainId, method, account, tag].join('_') + case EthereumMethodType.ETH_BLOCK_NUMBER: + return [chainId, method].join('_') + default: + return + } +} + +function createSquashedRequest( + request: (requestArguments: RequestArguments, overrides?: SendOverrides, options?: RequestOptions) => Promise, +) { + return async (requestArguments: RequestArguments, overrides?: SendOverrides, options?: RequestOptions) => { + const id = getCacheId(requestArguments, overrides) + + // the request cannot be cached + if (!id) return request(requestArguments, overrides, options) + + // the request is already cached + if (cache.has(id)) return cache.get(id) + + // the request can be cached + const unresolved = request(requestArguments, overrides, options).finally(() => cache.delete(id)) + cache.set(id, unresolved) + return unresolved + } +} export function createExternalProvider( request: ( @@ -12,8 +53,9 @@ export function createExternalProvider( getOverrides?: () => SendOverrides, getOptions?: () => RequestOptions, ) { + const request_ = createSquashedRequest(request) const send = (payload: JsonRpcPayload, callback: (error: Error | null, response?: JsonRpcResponse) => void) => { - request( + request_( { method: payload.method, params: payload.params, @@ -40,7 +82,7 @@ export function createExternalProvider( isStatus: true, host: '', path: '', - request: (requestArguments: RequestArguments) => request(requestArguments, getOverrides?.(), getOptions?.()), + request: (requestArguments: RequestArguments) => request_(requestArguments, getOverrides?.(), getOptions?.()), send, sendAsync: send, }