From efa4353bc5fd528393cdcf9d18db777f5d1e9560 Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Wed, 15 Dec 2021 16:35:52 +0800 Subject: [PATCH 1/4] Revert "refactor: remove unused code and move files (#5187)" This reverts commit 4a5a85ec776011cbaa0b06cdf69d0ebb95af17ea. --- package.json | 3 +- packages/dashboard/.storybook/main.js | 3 +- packages/dashboard/package.json | 3 +- packages/encryption/package.json | 4 +- .../payload_internal/version-38.encoder.ts | 25 +- .../src/payload_internal/version-38.parser.ts | 28 +- packages/mask/.webpack/config.ts | 2 +- packages/mask/package.json | 4 + packages/mask/src/crypto/crypto-alpha-40.ts | 14 +- packages/mask/src/database/Persona/helpers.ts | 2 +- packages/mask/src/database/type.ts | 14 + .../CryptoServices/encryptTo.ts | 11 +- .../CryptoServices/verifyOthersProve.ts | 6 +- .../background-script/IdentityService.ts | 26 +- .../IdentityServices/sign.ts | 5 +- .../background-script/WelcomeService.ts | 4 +- .../ITO/SNSAdaptor/hooks/useSwapCallback.ts | 6 +- .../plugins/Wallet/services/legacyWallet.ts | 8 +- .../mask/src/utils/mnemonic-code/index.ts | 14 +- .../src/utils/type-transform/BackupFile.ts | 18 - .../BackupFileShortRepresentation.ts | 130 ++++++ .../BackupFormat/JSON/version-2.ts | 3 +- .../type-transform/SECP256k1-Compression.ts | 54 +++ .../src/utils/type-transform/SECP256k1-ETH.ts | 31 +- .../mask/src/utils/type-transform/index.ts | 3 +- packages/mask/utils-pure/convert/index.ts | 12 + packages/mask/utils-pure/crypto/index.ts | 1 - packages/mask/utils-pure/index.ts | 1 + packages/shared-base/package.json | 2 - packages/shared-base/src/convert/index.ts | 15 - packages/shared-base/src/crypto/index.ts | 3 - packages/shared-base/src/crypto/secp256k1.ts | 67 ---- packages/shared-base/src/index.ts | 4 +- packages/theme/.storybook/main.cjs | 3 +- packages/theme/package.json | 3 +- patches/webpack+5.65.0.patch | 52 --- pnpm-lock.yaml | 369 +++++++++++++----- 37 files changed, 595 insertions(+), 358 deletions(-) create mode 100644 packages/mask/src/database/type.ts delete mode 100644 packages/mask/src/utils/type-transform/BackupFile.ts create mode 100644 packages/mask/src/utils/type-transform/BackupFileShortRepresentation.ts create mode 100644 packages/mask/src/utils/type-transform/SECP256k1-Compression.ts create mode 100644 packages/mask/utils-pure/convert/index.ts delete mode 100644 packages/shared-base/src/convert/index.ts delete mode 100644 packages/shared-base/src/crypto/index.ts delete mode 100644 packages/shared-base/src/crypto/secp256k1.ts delete mode 100644 patches/webpack+5.65.0.patch diff --git a/package.json b/package.json index 6f1b69238a40..b5167d71b2f2 100644 --- a/package.json +++ b/package.json @@ -77,8 +77,7 @@ "prettier": "^2.5.0", "ts-jest": "^27.0.7", "ts-node": "^10.4.0", - "typescript": "4.6.0-dev.20211202", - "webpack": "5.65.0" + "typescript": "4.6.0-dev.20211202" }, "engines": { "node": ">=16.0.0", diff --git a/packages/dashboard/.storybook/main.js b/packages/dashboard/.storybook/main.js index 38d0e79a5b1c..73f32a89ac95 100644 --- a/packages/dashboard/.storybook/main.js +++ b/packages/dashboard/.storybook/main.js @@ -16,7 +16,6 @@ module.exports = { fastRefresh: true, }, webpackFinal: async (config) => { - config.experiments = { asyncWebAssembly: true } config.resolve.fallback = { crypto: false, stream: 'stream-browserify', @@ -30,7 +29,7 @@ module.exports = { test: /\.m?js$/, type: 'javascript/auto', resolve: { - fullySpecified: false, + fullySpecified: false, // disable the behaviour }, }) diff --git a/packages/dashboard/package.json b/packages/dashboard/package.json index b51b5877efaf..7b273e28dc6a 100644 --- a/packages/dashboard/package.json +++ b/packages/dashboard/package.json @@ -62,6 +62,7 @@ "babel-loader": "^8.2.3", "buffer": "^6.0.3", "path-browserify": "^1.0.1", - "stream-browserify": "^3.0.0" + "stream-browserify": "^3.0.0", + "webpack": "^5.64.4" } } diff --git a/packages/encryption/package.json b/packages/encryption/package.json index 4d35d498f2c3..df08dd65a3d5 100644 --- a/packages/encryption/package.json +++ b/packages/encryption/package.json @@ -6,6 +6,8 @@ "types": "./dist/index.d.ts", "dependencies": { "@masknet/shared-base": "workspace:*", - "@msgpack/msgpack": "^2.7.0" + "@msgpack/msgpack": "^2.7.0", + "pvtsutils": "^1.2.0", + "tiny-secp256k1": "^2.1.2" } } diff --git a/packages/encryption/src/payload_internal/version-38.encoder.ts b/packages/encryption/src/payload_internal/version-38.encoder.ts index 8a896aaef9da..a2f211589210 100644 --- a/packages/encryption/src/payload_internal/version-38.encoder.ts +++ b/packages/encryption/src/payload_internal/version-38.encoder.ts @@ -1,11 +1,14 @@ import { encodeText, encodeArrayBuffer } from '@dimensiondev/kit' +import { combine, Convert } from 'pvtsutils' import { Ok, Option, Result } from 'ts-results' import type { PayloadWellFormed, Signature } from '..' import { AESAlgorithmEnum } from '../payload' import { CryptoException, PayloadException } from '../types' import { encryptWithAES, exportCryptoKeyToJWK } from '../utils' import { get_v38PublicSharedCryptoKey } from './shared' -import { CheckedError, compressSecp256k1Point } from '@masknet/shared-base' +import * as secp256k1 from 'tiny-secp256k1' +import { CheckedError } from '@masknet/shared-base' +const { isPoint, pointCompress } = secp256k1 const enum Index { authorPublicKey = 5, @@ -77,9 +80,23 @@ function encodeSignature(sig: Option) { async function compressSecp256k1Key(key: CryptoKey) { const jwk = await exportCryptoKeyToJWK(key) if (jwk.err) return jwk.mapErr((e) => new CheckedError(CryptoException.InvalidCryptoKey, e)) - const arr = Result.wrap(() => compressSecp256k1Point(jwk.val.x!, jwk.val.y!)).mapErr( - (e) => new CheckedError(CryptoException.InvalidCryptoKey, e), - ) + const arr = compressSecp256k1Point(jwk.val.x!, jwk.val.y!) if (arr.err) return arr return Ok(encodeArrayBuffer(arr.val.slice())) } + +/** + * Compress x & y into a single x + */ +function compressSecp256k1Point(x: string, y: string) { + return Result.wrap>(() => { + const xb = Convert.FromBase64Url(x) + const yb = Convert.FromBase64Url(y) + const point = new Uint8Array(combine(new Uint8Array([0x04]), xb, yb)) + if (isPoint(point)) { + return pointCompress(point, true) + } else { + throw new CheckedError(CryptoException.InvalidCryptoKey, 'invalid secp256k1 key') + } + }) +} diff --git a/packages/encryption/src/payload_internal/version-38.parser.ts b/packages/encryption/src/payload_internal/version-38.parser.ts index 39a1730b9f1c..8afbb30fe76e 100644 --- a/packages/encryption/src/payload_internal/version-38.parser.ts +++ b/packages/encryption/src/payload_internal/version-38.parser.ts @@ -17,17 +17,12 @@ import { importAsymmetryKeyFromJsonWebKeyOrSPKI, JSONParseF, } from '../utils' +import { Convert } from 'pvtsutils' +import { isPoint, isPointCompressed, pointCompress } from 'tiny-secp256k1' import type { PayloadParserResult } from '.' import { get_v38PublicSharedCryptoKey } from './shared' import { encodeText } from '@dimensiondev/kit' -import { - andThenAsync, - CheckedError, - Identifier, - OptionalResult, - ProfileIdentifier, - decompressSecp256k1Point, -} from '@masknet/shared-base' +import { andThenAsync, CheckedError, Identifier, OptionalResult, ProfileIdentifier } from '@masknet/shared-base' const decodeUint8Array = decodeUint8ArrayF(PayloadException.InvalidPayload, PayloadException.DecodeFailed) const decodeUint8ArrayCrypto = decodeUint8ArrayF(CryptoException.InvalidCryptoKey, CryptoException.InvalidCryptoKey) @@ -134,14 +129,10 @@ async function decodePublicSharedAESKey( async function decodeECDHPublicKey( compressedPublic: string, ): Promise> { - const key = decodeUint8ArrayCrypto(compressedPublic).andThen((val) => - Result.wrap(() => decompressSecp256k1Point(val)).mapErr( - (e) => new CheckedError(CryptoException.InvalidCryptoKey, e), - ), - ) + const key = decodeUint8ArrayCrypto(compressedPublic).andThen(decompressK256Point) if (key.err) return key - const { x, y } = key.val + const [x, y] = key.val const jwk: JsonWebKey = { crv: 'K-256', ext: true, @@ -157,3 +148,12 @@ async function decodeECDHPublicKey( key: imported.val, }) } + +function decompressK256Point(point: Uint8Array) { + if (!isPoint(point)) return new CheckedError(CryptoException.InvalidCryptoKey, null).toErr() + const uncompressed: Uint8Array = isPointCompressed(point) ? pointCompress(point, false) : point + const len = (uncompressed.length - 1) / 2 + const x = uncompressed.slice(1, len + 1) + const y = uncompressed.slice(len + 1) + return Ok([Convert.ToBase64Url(x), Convert.ToBase64Url(y)] as readonly [x: string, y: string]) +} diff --git a/packages/mask/.webpack/config.ts b/packages/mask/.webpack/config.ts index 9602fb8f0472..a89e46c48243 100644 --- a/packages/mask/.webpack/config.ts +++ b/packages/mask/.webpack/config.ts @@ -39,7 +39,7 @@ export function createConfiguration(rawFlags: BuildFlags): Configuration { devtool: sourceMapKind, target: ['web', 'es2019'], entry: {}, - experiments: { backCompat: false, asyncWebAssembly: true }, + experiments: { backCompat: false }, cache: { type: 'filesystem', buildDependencies: { config: [__filename] }, diff --git a/packages/mask/package.json b/packages/mask/package.json index dff57ae3c59b..2adc6f150887 100644 --- a/packages/mask/package.json +++ b/packages/mask/package.json @@ -49,6 +49,7 @@ "@types/react-window": "^1.8.4", "@types/remarkable": "^2.0.3", "@types/socket.io-client": "^1.4.36", + "@types/tiny-secp256k1": "^1.0.0", "@types/use-subscription": "^1.0.0", "@types/uuid": "^8.3.3", "@uniswap/sdk-core": "^3.0.1", @@ -92,6 +93,7 @@ "opensea-js": "^1.1.11", "promievent": "^0.1.4", "protobufjs": "^6.11.2", + "pvtsutils": "^1.0.14", "react-draggable": "^4.4.4", "react-feather": "^2.0.9", "react-highlight-words": "^0.17.0", @@ -108,6 +110,7 @@ "socket.io-client": "2.4.0", "stream-browserify": "^3.0.0", "stream-http": "^2.8.3", + "tiny-secp256k1": "^1.1.5", "unstated-next": "^1.1.0", "urlcat": "^2.0.4", "use-subscription": "^1.5.1", @@ -137,6 +140,7 @@ "react-refresh": "^0.11.0", "source-map-loader": "^3.0.0", "swc-loader": "^0.1.15", + "webpack": "^5.64.4", "webpack-cli": "^4.9.1", "webpack-dev-server": "^4.6.0", "webpack-target-webextension": "^1.0.1" diff --git a/packages/mask/src/crypto/crypto-alpha-40.ts b/packages/mask/src/crypto/crypto-alpha-40.ts index f87d76868387..a7f846aa940a 100644 --- a/packages/mask/src/crypto/crypto-alpha-40.ts +++ b/packages/mask/src/crypto/crypto-alpha-40.ts @@ -2,7 +2,13 @@ * @deprecated This version of payload is not in use. * Please goto Crypto alpha v38 */ -import { encodeText, encodeArrayBuffer, decodeArrayBuffer, decodeText, concatArrayBufferSync } from '@dimensiondev/kit' +import { + encodeText, + encodeArrayBuffer, + decodeArrayBuffer, + decodeText, + concatArrayBufferSync as addUint8Array, +} from '@dimensiondev/kit' import { memoizePromise } from '../../utils-pure' import { i18n } from '../../shared-ui/locales_legacy' import { CryptoWorker } from '../modules/workers' @@ -37,15 +43,15 @@ async function deriveAESKey( const derivedKey = await CryptoWorker.aes_to_raw(await derive_AES_GCM_256_Key_From_ECDH_256k1_Keys(pr, op)) const _salt = typeof salt === 'string' ? decodeArrayBuffer(salt) : salt - const UntitledUint8Array = concatArrayBufferSync(new Uint8Array(derivedKey), _salt) + const UntitledUint8Array = addUint8Array(new Uint8Array(derivedKey), _salt) const password = await crypto.subtle.digest( 'SHA-256', - concatArrayBufferSync(concatArrayBufferSync(UntitledUint8Array, _salt), decodeArrayBuffer('KEY')), + addUint8Array(addUint8Array(UntitledUint8Array, _salt), decodeArrayBuffer('KEY')), ) const iv_pre = new Uint8Array( await crypto.subtle.digest( 'SHA-256', - concatArrayBufferSync(concatArrayBufferSync(UntitledUint8Array, _salt), decodeArrayBuffer('IV')), + addUint8Array(addUint8Array(UntitledUint8Array, _salt), decodeArrayBuffer('IV')), ), ) const iv = new Uint8Array(16) diff --git a/packages/mask/src/database/Persona/helpers.ts b/packages/mask/src/database/Persona/helpers.ts index b6a6565ca503..c0fc8e03d6f0 100644 --- a/packages/mask/src/database/Persona/helpers.ts +++ b/packages/mask/src/database/Persona/helpers.ts @@ -32,8 +32,8 @@ import { type EC_Public_JsonWebKey, type EC_Private_JsonWebKey, type AESJsonWebKey, - ECKeyIdentifierFromJsonWebKey, } from '@masknet/shared-base' +import { ECKeyIdentifierFromJsonWebKey } from '../type' export async function profileRecordToProfile(record: ProfileRecord): Promise { const rec = { ...record } diff --git a/packages/mask/src/database/type.ts b/packages/mask/src/database/type.ts new file mode 100644 index 000000000000..439c327c69a1 --- /dev/null +++ b/packages/mask/src/database/type.ts @@ -0,0 +1,14 @@ +import { ECKeyIdentifier, type EC_JsonWebKey } from '@masknet/shared-base' +import { CryptoKeyToJsonWebKey } from '../utils/type-transform/CryptoKey-JsonWebKey' +import { compressSecp256k1Key } from '../utils/type-transform/SECP256k1-Compression' + +export function ECKeyIdentifierFromJsonWebKey(key: EC_JsonWebKey, type: 'public' | 'private' = 'public') { + const x = compressSecp256k1Key(key, type) + return new ECKeyIdentifier('secp256k1', x) +} +/** + * @deprecated We're using JWK instead of CryptoKey + */ +export async function ECKeyIdentifierFromCryptoKey(key: CryptoKey) { + return ECKeyIdentifierFromJsonWebKey(await CryptoKeyToJsonWebKey(key)) +} diff --git a/packages/mask/src/extension/background-script/CryptoServices/encryptTo.ts b/packages/mask/src/extension/background-script/CryptoServices/encryptTo.ts index 66a24f822a11..eb921b0615c2 100644 --- a/packages/mask/src/extension/background-script/CryptoServices/encryptTo.ts +++ b/packages/mask/src/extension/background-script/CryptoServices/encryptTo.ts @@ -8,14 +8,9 @@ import { prepareRecipientDetail } from './prepareRecipientDetail' import { getNetworkWorker } from '../../../social-network/worker' import { createPostDB, PostRecord } from '../../../../background/database/post' import { queryPersonaByProfileDB } from '../../../../background/database/persona/db' +import { compressSecp256k1Key } from '../../../utils/type-transform/SECP256k1-Compression' import { i18n } from '../../../../shared-ui/locales_legacy' -import { - isTypedMessageText, - TypedMessage, - TypedMessageText, - PayloadLatest, - compressSecp256k1Key, -} from '@masknet/shared-base' +import { isTypedMessageText, TypedMessage, TypedMessageText, PayloadLatest } from '@masknet/shared-base' import { encodeTextPayloadWorker } from '../../../social-network/utils/text-payload-worker' type EncryptedText = string @@ -77,7 +72,7 @@ export async function encryptTo( } try { const publicKey = (await queryPersonaByProfileDB(whoAmI))?.publicKey - if (publicKey) payload.authorPublicKey = compressSecp256k1Key(publicKey) + if (publicKey) payload.authorPublicKey = compressSecp256k1Key(publicKey, 'public') } catch { // ignore } diff --git a/packages/mask/src/extension/background-script/CryptoServices/verifyOthersProve.ts b/packages/mask/src/extension/background-script/CryptoServices/verifyOthersProve.ts index 47745da75604..21faf275de35 100644 --- a/packages/mask/src/extension/background-script/CryptoServices/verifyOthersProve.ts +++ b/packages/mask/src/extension/background-script/CryptoServices/verifyOthersProve.ts @@ -1,6 +1,8 @@ -import { type ProfileIdentifier, decompressSecp256k1Key, ECKeyIdentifierFromJsonWebKey } from '@masknet/shared-base' +import { decompressSecp256k1Key } from '../../../utils/type-transform/SECP256k1-Compression' +import type { ProfileIdentifier } from '@masknet/shared-base' import { decodePublicKeyWorker } from '../../../social-network/utils/text-payload-worker' import { createProfileWithPersona, queryPersonaRecord } from '../../../database' +import { ECKeyIdentifierFromJsonWebKey } from '../../../database/type' export async function verifyOthersProve(bio: string | { raw: string }, others: ProfileIdentifier): Promise { const compressedX = typeof bio === 'string' ? (await decodePublicKeyWorker(others.network))(bio) : [bio.raw] @@ -8,7 +10,7 @@ export async function verifyOthersProve(bio: string | { raw: string }, others: P const publicKey = compressedX .map((x) => { try { - return decompressSecp256k1Key(x) + return decompressSecp256k1Key(x, 'public') } catch { return null } diff --git a/packages/mask/src/extension/background-script/IdentityService.ts b/packages/mask/src/extension/background-script/IdentityService.ts index 4dd516e5d58b..bbcd92e78f9a 100644 --- a/packages/mask/src/extension/background-script/IdentityService.ts +++ b/packages/mask/src/extension/background-script/IdentityService.ts @@ -14,19 +14,7 @@ import { queryProfilesWithQuery, storeAvatar, } from '../../database' -import { - ECKeyIdentifier, - Identifier, - PersonaIdentifier, - ProfileIdentifier, - ECKeyIdentifierFromJsonWebKey, - EC_JsonWebKey, - EC_Private_JsonWebKey, - PersonaInformation, - ProfileInformation, - PostIVIdentifier, - RelationFavor, -} from '@masknet/shared-base' +import { ECKeyIdentifier, Identifier, PersonaIdentifier, ProfileIdentifier } from '@masknet/shared-base' import type { Persona, Profile } from '../../database/Persona/types' import { attachProfileDB, @@ -48,14 +36,18 @@ import { import { BackupJSONFileLatest, UpgradeBackupJSONFile } from '../../utils/type-transform/BackupFormat/JSON/latest' import { restoreBackup } from './WelcomeServices/restoreBackup' import { restoreNewIdentityWithMnemonicWord } from './WelcomeService' -import { convertBackupFileToObject, fixBackupFilePermission } from '../../utils/type-transform/BackupFile' +import { decompressBackupFile } from '../../utils/type-transform/BackupFileShortRepresentation' import { assertEnvironment, Environment } from '@dimensiondev/holoflows-kit' +import type { EC_JsonWebKey, EC_Private_JsonWebKey, PersonaInformation, ProfileInformation } from '@masknet/shared-base' import { getCurrentPersonaIdentifier } from './SettingsService' import { MaskMessages } from '../../utils' +import type { PostIVIdentifier } from '@masknet/shared-base' +import { RelationFavor } from '@masknet/shared-base' import { split_ec_k256_keypair_into_pub_priv } from '../../modules/CryptoAlgorithm/helper' import { first, orderBy } from 'lodash-unified' import { recover_ECDH_256k1_KeyPair_ByMnemonicWord } from '../../utils/mnemonic-code' +import { ECKeyIdentifierFromJsonWebKey } from '../../database/type' assertEnvironment(Environment.ManifestBackground) @@ -119,7 +111,7 @@ export async function queryPersonaByMnemonic(mnemonic: string, password: '') { } const { key } = await recover_ECDH_256k1_KeyPair_ByMnemonicWord(mnemonic, password) - const identifier = ECKeyIdentifierFromJsonWebKey(key.privateKey) + const identifier = ECKeyIdentifierFromJsonWebKey(key.privateKey, 'public') const persona = await queryPersonaDB(identifier, undefined, true) if (persona) { await loginPersona(persona.identifier) @@ -203,7 +195,7 @@ export async function restoreFromBase64(base64: string): Promise return restoreFromObject(JSON.parse(decodeText(decodeArrayBuffer(base64))) as BackupJSONFileLatest) } export async function restoreFromBackup(backup: string): Promise { - return restoreFromObject(fixBackupFilePermission(UpgradeBackupJSONFile(convertBackupFileToObject(backup)))) + return restoreFromObject(UpgradeBackupJSONFile(decompressBackupFile(backup))) } //#endregion @@ -383,7 +375,7 @@ export async function exportPersonaPrivateKey(identifier: PersonaIdentifier) { export async function queryPersonaByPrivateKey(privateKeyString: string) { const privateKey = decode(decodeArrayBuffer(privateKeyString)) as EC_JsonWebKey - const identifier = ECKeyIdentifierFromJsonWebKey(privateKey) + const identifier = ECKeyIdentifierFromJsonWebKey(privateKey, 'public') const persona = await queryPersonaDB(identifier, undefined, true) if (persona) { diff --git a/packages/mask/src/extension/background-script/IdentityServices/sign.ts b/packages/mask/src/extension/background-script/IdentityServices/sign.ts index e0d86701e47b..b87c68c7b556 100644 --- a/packages/mask/src/extension/background-script/IdentityServices/sign.ts +++ b/packages/mask/src/extension/background-script/IdentityServices/sign.ts @@ -9,9 +9,10 @@ import { ECDSASignature, } from 'ethereumjs-util' import { MaskMessages } from '../../../utils' +import { Convert } from 'pvtsutils' import { stringToBuffer } from 'arweave/web/lib/utils' import { constructSignRequestURL } from '../../popups' -import { delay, PersonaIdentifier, fromBase64URL } from '@masknet/shared-base' +import { delay, PersonaIdentifier } from '@masknet/shared-base' import { queryPersonasWithPrivateKey } from '../../../../background/database/persona/db' export interface SignRequest { /** The message to be signed. */ @@ -68,7 +69,7 @@ export async function signWithPersona({ message, method }: SignRequest): Promise // will have problem with UTF-8? const length = message.length const messageHash = keccakFromString(`\x19Ethereum Signed Message:\n${length}${message}`, 256) - const privateKey = Buffer.from(fromBase64URL(persona.privateKey.d!)) + const privateKey = Buffer.from(Convert.FromBase64Url(persona.privateKey.d!)) const signature = ecsign(messageHash, privateKey) return { diff --git a/packages/mask/src/extension/background-script/WelcomeService.ts b/packages/mask/src/extension/background-script/WelcomeService.ts index ff504eb80470..8aae360c5b8d 100644 --- a/packages/mask/src/extension/background-script/WelcomeService.ts +++ b/packages/mask/src/extension/background-script/WelcomeService.ts @@ -15,7 +15,7 @@ import { } from '../../utils/type-transform/BackupFormat/JSON/latest' import { assertEnvironment, Environment } from '@dimensiondev/holoflows-kit' -import { convertBackupFileToObject, extraPermissions, fixBackupFilePermission } from '../../utils' +import { decompressBackupFile, extraPermissions } from '../../utils' import { v4 as uuid } from 'uuid' import { getUnconfirmedBackup, restoreBackup, setUnconfirmedBackup } from './WelcomeServices/restoreBackup' import { openPopupWindow } from './HelperService' @@ -118,7 +118,7 @@ export async function openOptionsPage(route?: DashboardRoutes, search?: string) export { createPersonaByMnemonic } from '../../database' export function parseBackupStr(str: string) { - const json = fixBackupFilePermission(UpgradeBackupJSONFile(convertBackupFileToObject(str))) + const json = UpgradeBackupJSONFile(decompressBackupFile(str)) if (json) { const info = getBackupPreviewInfo(json) const id = uuid() diff --git a/packages/mask/src/plugins/ITO/SNSAdaptor/hooks/useSwapCallback.ts b/packages/mask/src/plugins/ITO/SNSAdaptor/hooks/useSwapCallback.ts index 1020e12615d1..62e2f571d1e9 100644 --- a/packages/mask/src/plugins/ITO/SNSAdaptor/hooks/useSwapCallback.ts +++ b/packages/mask/src/plugins/ITO/SNSAdaptor/hooks/useSwapCallback.ts @@ -21,7 +21,7 @@ import { useCallback } from 'react' import type { TransactionReceipt } from 'web3-core' import Web3Utils from 'web3-utils' import { useI18N } from '../../../../utils' -import { fromHex, toHex } from '@masknet/shared-base' +import { HexStringToUint8Array as hex2buf, Uint8ArrayToHexString as buf2hex } from '../../../../../utils-pure' import { useITO_Contract } from './useITO_Contract' import { useQualificationContract } from './useQualificationContract' import type { JSON_PayloadInMask } from '../../types' @@ -147,7 +147,7 @@ export function useSwapCallback( const swapParamsV1 = [ pid, Web3Utils.soliditySha3( - Web3Utils.hexToNumber(`0x${toHex(fromHex(Web3Utils.sha3(password) ?? '').slice(0, 5))}`), + Web3Utils.hexToNumber(`0x${buf2hex(hex2buf(Web3Utils.sha3(password) ?? '').slice(0, 5))}`), account, )!, Web3Utils.sha3(account)!, @@ -158,7 +158,7 @@ export function useSwapCallback( const swapParamsV2 = [ pid, Web3Utils.soliditySha3( - Web3Utils.hexToNumber(`0x${toHex(fromHex(Web3Utils.sha3(password) ?? '').slice(0, 5))}`), + Web3Utils.hexToNumber(`0x${buf2hex(hex2buf(Web3Utils.sha3(password) ?? '').slice(0, 5))}`), account, )!, swapTokenAt, diff --git a/packages/mask/src/plugins/Wallet/services/legacyWallet.ts b/packages/mask/src/plugins/Wallet/services/legacyWallet.ts index fc1b1637e4de..d49d30480fb0 100644 --- a/packages/mask/src/plugins/Wallet/services/legacyWallet.ts +++ b/packages/mask/src/plugins/Wallet/services/legacyWallet.ts @@ -6,7 +6,7 @@ import { first } from 'lodash-unified' import { createTransaction } from '../../../../background/database/utils/openDB' import { createWalletDBAccess } from '../database/Wallet.db' import type { LegacyWalletRecord } from '../database/types' -import { fromHex, toHex } from '@masknet/shared-base' +import { HexStringToUint8Array as hex2buf, Uint8ArrayToHexString as buf2hex } from '../../../../utils-pure' import { currySameAddress, isSameAddress, ProviderType } from '@masknet/web3-shared-evm' import { LegacyWalletRecordOutDB } from './helpers' import { currentAccountSettings, currentProviderSettings } from '../settings' @@ -92,7 +92,7 @@ async function makePrivateKey(record: LegacyWalletRecord) { const { privateKey } = record._private_key_ ? await recoverWalletFromPrivateKey(record._private_key_) : await recoverWalletFromMnemonicWords(record.mnemonic, record.passphrase, record.path) - return `0x${toHex(privateKey)}` + return `0x${buf2hex(privateKey)}` } export async function freezeLegacyWallet(address: string) { @@ -125,7 +125,7 @@ async function recoverWalletFromMnemonicWords( address: EthereumAddress.from(walletPublicKey).address, privateKey: walletPrivateKey, privateKeyValid: true, - privateKeyInHex: `0x${toHex(walletPrivateKey)}`, + privateKeyInHex: `0x${buf2hex(walletPrivateKey)}`, path, mnemonic, passphrase, @@ -138,7 +138,7 @@ async function recoverWalletFromPrivateKey(privateKey: string) { const key = ec.keyFromPrivate(privateKey_) return { address: EthereumAddress.from(key.getPublic(false, 'array') as any).address, - privateKey: fromHex(privateKey_), + privateKey: hex2buf(privateKey_), privateKeyValid: privateKeyVerify(privateKey_), privateKeyInHex: privateKey.startsWith('0x') ? privateKey : `0x${privateKey}`, mnemonic: [], diff --git a/packages/mask/src/utils/mnemonic-code/index.ts b/packages/mask/src/utils/mnemonic-code/index.ts index a474bc0e6cf3..f7e33f48d880 100644 --- a/packages/mask/src/utils/mnemonic-code/index.ts +++ b/packages/mask/src/utils/mnemonic-code/index.ts @@ -1,14 +1,10 @@ import * as bip39 from 'bip39' import * as wallet from 'wallet.ts' +import { decompressSecp256k1Key } from '../type-transform/SECP256k1-Compression' +import { Convert } from 'pvtsutils' import { encodeArrayBuffer } from '@dimensiondev/kit' import type { PersonaRecord } from '../../../background/database/persona/db' -import { - EC_Private_JsonWebKey, - EC_Public_JsonWebKey, - JsonWebKeyPair, - toBase64URL, - decompressSecp256k1Key, -} from '@masknet/shared-base' +import type { EC_Private_JsonWebKey, EC_Public_JsonWebKey, JsonWebKeyPair } from '@masknet/shared-base' import { split_ec_k256_keypair_into_pub_priv } from '../../modules/CryptoAlgorithm/helper' // Private key at m/44'/coinType'/account'/change/addressIndex @@ -63,7 +59,7 @@ export async function recover_ECDH_256k1_KeyPair_ByMnemonicWord( export const validateMnemonic = bip39.validateMnemonic function HDKeyToJwk(hdk: wallet.HDKey): JsonWebKey { - const jwk = decompressSecp256k1Key(encodeArrayBuffer(hdk.publicKey)) - jwk.d = hdk.privateKey ? toBase64URL(hdk.privateKey) : undefined + const jwk = decompressSecp256k1Key(encodeArrayBuffer(hdk.publicKey), 'public') + jwk.d = hdk.privateKey ? Convert.ToBase64Url(hdk.privateKey) : undefined return jwk } diff --git a/packages/mask/src/utils/type-transform/BackupFile.ts b/packages/mask/src/utils/type-transform/BackupFile.ts deleted file mode 100644 index 0067a9154519..000000000000 --- a/packages/mask/src/utils/type-transform/BackupFile.ts +++ /dev/null @@ -1,18 +0,0 @@ -import type { BackupJSONFileLatest } from './BackupFormat/JSON/latest' - -export function fixBackupFilePermission(backup: BackupJSONFileLatest): BackupJSONFileLatest -export function fixBackupFilePermission(backup: null | BackupJSONFileLatest): BackupJSONFileLatest | null -export function fixBackupFilePermission(backup: null | BackupJSONFileLatest): BackupJSONFileLatest | null { - if (!backup) return null - return { - ...backup, - grantedHostPermissions: backup.grantedHostPermissions.filter((url) => /^(http|)/.test(url)), - } -} - -export function convertBackupFileToObject(short: string): BackupJSONFileLatest { - const compressed = JSON.parse(short) - // TODO: maybe schema validate? - if (typeof compressed !== 'object') throw new TypeError('Invalid backup') - return compressed -} diff --git a/packages/mask/src/utils/type-transform/BackupFileShortRepresentation.ts b/packages/mask/src/utils/type-transform/BackupFileShortRepresentation.ts new file mode 100644 index 000000000000..d643f52a9a44 --- /dev/null +++ b/packages/mask/src/utils/type-transform/BackupFileShortRepresentation.ts @@ -0,0 +1,130 @@ +import { ECKeyIdentifierFromJsonWebKey } from '../../database/type' +import { compressSecp256k1Key, decompressSecp256k1Key } from './SECP256k1-Compression' +import type { BackupJSONFileLatest } from './BackupFormat/JSON/latest' +import type { ProfileRecord } from '../../../background/database/persona/db' +import { ProfileIdentifier, type PersonaIdentifier, Identifier, type AESJsonWebKey } from '@masknet/shared-base' + +export type BackupJSONFileLatestShort = [ + string, // version, should be "1" + // network and userId may be empty string for unconnected persona! + ProfileIdentifier['network'], + ProfileIdentifier['userId'], + ProfileRecord['nickname'], + // LocalKey, this field may be empty! + JsonWebKey['k'], + // Compressed privateKey + // ! We can recover pub from priv on ec, but if you want to support other type + // ! Please change this back to pub/priv pattern + string, + // BackupJSONFileLatest['grantedHostPermissions'].join(';'), + string, +] + +export function sanitizeBackupFile(backup: BackupJSONFileLatest): BackupJSONFileLatest { + return { + ...backup, + grantedHostPermissions: backup.grantedHostPermissions.filter((url) => /^(http|)/.test(url)), + } +} + +export function compressBackupFile( + file: BackupJSONFileLatest, + { + profileIdentifier, + personaIdentifier, + }: { + profileIdentifier?: ProfileIdentifier + personaIdentifier?: PersonaIdentifier + } = {}, +): string { + const { grantedHostPermissions, profiles, personas } = file + const personaIdentifier_ = + personaIdentifier?.toText() ?? profiles.find((x) => x.identifier === profileIdentifier?.toText())?.linkedPersona + const persona = personas.find((x) => x.identifier === personaIdentifier_) + if (!persona || !persona.privateKey) throw new Error('Target persona not found') + const linkedProfile = persona.linkedProfiles[0]?.[0] + const profileIdentifier_ = + profileIdentifier ?? linkedProfile + ? Identifier.fromString(linkedProfile, ProfileIdentifier).unwrap() + : undefined + const { localKey, nickname, privateKey } = persona + return ( + [ + '1', + profileIdentifier_?.network, + profileIdentifier_?.userId, + nickname, + localKey?.k || + profiles.filter((x) => x.identifier === profileIdentifier_?.toText()).filter((x) => x.localKey)[0] + ?.localKey?.k || + '', + compressSecp256k1Key(privateKey, 'private'), + grantedHostPermissions.join(';'), + ] as BackupJSONFileLatestShort + ).join('🤔') +} +export function decompressBackupFile(short: string): BackupJSONFileLatest { + let compressed: string + try { + compressed = JSON.parse(short) + if (typeof compressed === 'object') return sanitizeBackupFile(compressed) + } catch { + if (!short.includes('🤔')) throw new Error('This backup is not a compressed string') + compressed = short + } + const [version, network, userID, nickname, localKey, privateKey, grantedHostPermissions] = compressed.split( + '🤔', + ) as BackupJSONFileLatestShort + + if (version !== '1') throw new Error(`QR Code cannot be shared between different version of Mask`) + + const localKeyJWK = { + alg: 'A256GCM', + ext: true, + k: localKey, + key_ops: ['encrypt', 'decrypt'], + kty: 'oct', + } as AESJsonWebKey + const publicJWK = decompressSecp256k1Key(privateKey, 'public') + const privateJWK = decompressSecp256k1Key(privateKey, 'private') + + const profileID = network && userID ? new ProfileIdentifier(network, userID) : undefined + const ECID = ECKeyIdentifierFromJsonWebKey(publicJWK) + return sanitizeBackupFile({ + _meta_: { + createdAt: 0, + maskbookVersion: browser.runtime.getManifest().version, + version: 2, + type: 'maskbook-backup', + }, + grantedHostPermissions: grantedHostPermissions.split(';').filter(Boolean), + posts: [], + wallets: [], + relations: [], + userGroups: [], + personas: [ + { + createdAt: 0, + updatedAt: 0, + privateKey: privateJWK, + publicKey: publicJWK, + identifier: ECID.toText(), + linkedProfiles: profileID ? [[profileID.toText(), { connectionConfirmState: 'confirmed' }]] : [], + nickname, + localKey: localKeyJWK, + }, + ], + profiles: profileID + ? [ + { + createdAt: 0, + identifier: profileID.toText(), + updatedAt: 0, + linkedPersona: ECID.toText(), + nickname: nickname, + localKey: localKeyJWK, + }, + ] + : [], + }) +} diff --git a/packages/mask/src/utils/type-transform/BackupFormat/JSON/version-2.ts b/packages/mask/src/utils/type-transform/BackupFormat/JSON/version-2.ts index 394e5bd124d3..b7917e07d16f 100644 --- a/packages/mask/src/utils/type-transform/BackupFormat/JSON/version-2.ts +++ b/packages/mask/src/utils/type-transform/BackupFormat/JSON/version-2.ts @@ -1,6 +1,7 @@ /* eslint-disable import/no-deprecated */ import type { LinkedProfileDetails } from '../../../../../background/database/persona/db' import type { BackupJSONFileVersion1 } from './version-1' +import { ECKeyIdentifierFromJsonWebKey } from '../../../../database/type' import { type AESJsonWebKey, type EC_Public_JsonWebKey, @@ -9,7 +10,7 @@ import { } from '@masknet/shared-base' import { twitterBase } from '../../../../social-network-adaptor/twitter.com/base' import { facebookBase } from '../../../../social-network-adaptor/facebook.com/base' -import { type RelationFavor, ECKeyIdentifierFromJsonWebKey } from '@masknet/shared-base' +import type { RelationFavor } from '@masknet/shared-base' export type RecipientReasonJSON = ( | { type: 'auto-share' } diff --git a/packages/mask/src/utils/type-transform/SECP256k1-Compression.ts b/packages/mask/src/utils/type-transform/SECP256k1-Compression.ts new file mode 100644 index 000000000000..0591af8c929b --- /dev/null +++ b/packages/mask/src/utils/type-transform/SECP256k1-Compression.ts @@ -0,0 +1,54 @@ +import secp256k1 from 'tiny-secp256k1' +import { Convert, combine } from 'pvtsutils' +import { encodeArrayBuffer, decodeArrayBuffer } from '@dimensiondev/kit' +import { Buffer } from 'buffer' +import type { EC_JsonWebKey, EC_Public_JsonWebKey, EC_Private_JsonWebKey } from '@masknet/shared-base' +/** + * Compress x & y into a single x + */ +function compressSecp256k1Point(x: string, y: string): Buffer { + const xb = Convert.FromBase64Url(x) + const yb = Convert.FromBase64Url(y) + const point = Buffer.from(combine(new Uint8Array([0x04]), xb, yb)) + if (secp256k1.isPoint(point)) { + return secp256k1.pointCompress(point, true) + } else { + throw new TypeError('Not a point on secp256k1!') + } +} +/** + * Decompress x into x & y + */ +function decompressSecp256k1Point(point: ArrayBuffer): { x: string; y: string } { + const p = Buffer.from(point) + if (!secp256k1.isPoint(p)) throw new TypeError('Not a point on secp256k1!') + const uncompressed = secp256k1.isPointCompressed(p) ? secp256k1.pointCompress(p, false) : p + const len = (uncompressed.length - 1) / 2 + const x = uncompressed.slice(1, len + 1) + const y = uncompressed.slice(len + 1) + return { x: Convert.ToBase64Url(x), y: Convert.ToBase64Url(y) } +} + +export function compressSecp256k1Key(key: EC_JsonWebKey, type: 'public' | 'private'): string { + if (type === 'private' && !key.d) throw new Error('Private key does not contain secret') + const arr = compressSecp256k1Point(key.x!, key.y!) + return encodeArrayBuffer(arr) + (type === 'private' ? '🙈' + key.d! : '') +} +export function decompressSecp256k1Key(compressed: string, type: 'public'): EC_Public_JsonWebKey +export function decompressSecp256k1Key(compressed: string, type: 'private'): EC_Private_JsonWebKey +export function decompressSecp256k1Key(compressed: string, type: 'public' | 'private'): EC_JsonWebKey { + const [compressedPublic, privateKey] = compressed.split('🙈') + if (type === 'private' && privateKey.length < 1) throw new Error('Private key does not contain secret') + const arr = decodeArrayBuffer(compressedPublic) + const key = decompressSecp256k1Point(arr) + const jwk: JsonWebKey = { + crv: 'K-256', + ext: true, + x: key.x, + y: key.y, + key_ops: ['deriveKey', 'deriveBits'], + kty: 'EC', + d: type === 'private' ? privateKey : undefined, + } + return jwk as EC_JsonWebKey +} diff --git a/packages/mask/src/utils/type-transform/SECP256k1-ETH.ts b/packages/mask/src/utils/type-transform/SECP256k1-ETH.ts index d18ea1810fed..91c659b6c737 100644 --- a/packages/mask/src/utils/type-transform/SECP256k1-ETH.ts +++ b/packages/mask/src/utils/type-transform/SECP256k1-ETH.ts @@ -1,15 +1,9 @@ +import secp256k1 from 'tiny-secp256k1' import { ec as EC } from 'elliptic' import { EthereumAddress } from 'wallet.ts' -import { - toBase64URL, - fromBase64URL, - EC_Public_JsonWebKey, - EC_Private_JsonWebKey, - EC_JsonWebKey, - isSecp256k1Point, - isSecp256k1PrivateKey, -} from '@masknet/shared-base' -import { concatArrayBufferSync } from '@dimensiondev/kit' +import { Convert, combine } from 'pvtsutils' +import { Buffer } from 'buffer' +import type { EC_Public_JsonWebKey, EC_Private_JsonWebKey, EC_JsonWebKey } from '@masknet/shared-base' export function keyToJWK(key: string, type: 'public'): EC_Public_JsonWebKey export function keyToJWK(key: string, type: 'private'): EC_Private_JsonWebKey @@ -29,23 +23,26 @@ export function keyToJWK(key: string, type: 'public' | 'private'): JsonWebKey { d: type === 'private' ? base64(privKey.toArray()) : undefined, } function base64(nums: number[]) { - return toBase64URL(new Uint8Array(nums).buffer) + return Convert.ToBase64Url(new Uint8Array(nums).buffer) } } export function JWKToKey(jwk: EC_JsonWebKey, type: 'public' | 'private'): string { const ec = new EC('secp256k1') if (type === 'public' && jwk.x && jwk.y) { - const xb = fromBase64URL(jwk.x) - const yb = fromBase64URL(jwk.y) - const point = new Uint8Array(concatArrayBufferSync(new Uint8Array([0x04]), xb, yb)) - if (isSecp256k1Point(point)) return `0x${ec.keyFromPublic(point).getPublic(false, 'hex')}` + const xb = ab(jwk.x) + const yb = ab(jwk.y) + const point = Buffer.from(combine(new Uint8Array([0x04]), xb, yb)) + if (secp256k1.isPoint(point)) return `0x${ec.keyFromPublic(point).getPublic(false, 'hex')}` } if (type === 'private' && jwk.d) { - const db = fromBase64URL(jwk.d) - if (isSecp256k1PrivateKey(db)) return `0x${ec.keyFromPrivate(db).getPrivate('hex')}` + const db = Buffer.from(ab(jwk.d)) + if (secp256k1.isPrivate(db)) return `0x${ec.keyFromPrivate(db).getPrivate('hex')}` } throw new Error('invalid private key') + function ab(base64: string) { + return Convert.FromBase64Url(base64) + } } export function keyToAddr(key: string, type: 'public' | 'private'): string { diff --git a/packages/mask/src/utils/type-transform/index.ts b/packages/mask/src/utils/type-transform/index.ts index f19d98fa2759..7dc6a744d8c3 100644 --- a/packages/mask/src/utils/type-transform/index.ts +++ b/packages/mask/src/utils/type-transform/index.ts @@ -1,6 +1,7 @@ export * from './asyncIteratorHelpers' -export * from './BackupFile' +export * from './BackupFileShortRepresentation' export * from './BackupFormat' export * from './CryptoKey-JsonWebKey' export * from './Payload' +export * from './SECP256k1-Compression' export * from './SECP256k1-ETH' diff --git a/packages/mask/utils-pure/convert/index.ts b/packages/mask/utils-pure/convert/index.ts new file mode 100644 index 000000000000..510746eb4c8d --- /dev/null +++ b/packages/mask/utils-pure/convert/index.ts @@ -0,0 +1,12 @@ +export function Uint8ArrayToHexString(buffer: ArrayBuffer) { + return Array.prototype.map.call(new Uint8Array(buffer), (x) => ('00' + x.toString(16)).slice(-2)).join('') +} + +export function HexStringToUint8Array(hex: string) { + let hex_ = hex + hex_ = hex.replace(/^0x/, '') // strip 0x + if (hex_.length % 2) hex_ = `0${hex_}` // pad even zero + const buf: number[] = [] + for (let i = 0; i < hex_.length; i += 2) buf.push(Number.parseInt(hex_.substring(i, i + 2), 16)) + return new Uint8Array(buf) +} diff --git a/packages/mask/utils-pure/crypto/index.ts b/packages/mask/utils-pure/crypto/index.ts index 832c110720d4..7cf6d80c2a90 100644 --- a/packages/mask/utils-pure/crypto/index.ts +++ b/packages/mask/utils-pure/crypto/index.ts @@ -8,7 +8,6 @@ import type { EC_Private_JsonWebKey, EC_Public_JsonWebKey, } from '@masknet/shared-base' - export async function CryptoKeyToJsonWebKey(key: EC_Public_CryptoKey): Promise export async function CryptoKeyToJsonWebKey(key: EC_Private_CryptoKey): Promise export async function CryptoKeyToJsonWebKey(key: AESCryptoKey): Promise diff --git a/packages/mask/utils-pure/index.ts b/packages/mask/utils-pure/index.ts index 68cd8f99c2d1..ccdb08b91043 100644 --- a/packages/mask/utils-pure/index.ts +++ b/packages/mask/utils-pure/index.ts @@ -1,3 +1,4 @@ +export * from './convert' export * from './type' export * from './assertion' export * from './memoize' diff --git a/packages/shared-base/package.json b/packages/shared-base/package.json index 953373e52b9c..8b31e5e48d85 100644 --- a/packages/shared-base/package.json +++ b/packages/shared-base/package.json @@ -18,9 +18,7 @@ "bignumber.js": "^9.0.1", "immer": "^9.0.7", "lodash-es": "^4.17.21", - "pvtsutils": "^1.2.1", "react": "../empty", - "tiny-secp256k1": "^2.1.2", "typeson": "^6.1.0", "typeson-registry": "^1.0.0-alpha.38", "use-subscription": "^1.5.1" diff --git a/packages/shared-base/src/convert/index.ts b/packages/shared-base/src/convert/index.ts deleted file mode 100644 index 9fad970b0ffd..000000000000 --- a/packages/shared-base/src/convert/index.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { Convert } from 'pvtsutils' - -export function fromBase64URL(x: string) { - return new Uint8Array(Convert.FromBase64Url(x)) -} -export function toBase64URL(x: BufferSource) { - return Convert.ToBase64Url(x) -} -export function toHex(x: BufferSource) { - return Convert.ToHex(x) -} -export function fromHex(x: string) { - if (x.startsWith('0x')) x = x.slice(2) - return new Uint8Array(Convert.FromHex(x)) -} diff --git a/packages/shared-base/src/crypto/index.ts b/packages/shared-base/src/crypto/index.ts deleted file mode 100644 index f4a5f8d3ba7c..000000000000 --- a/packages/shared-base/src/crypto/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export * from './CryptoType' -export * from './JWKType' -export * from './secp256k1' diff --git a/packages/shared-base/src/crypto/secp256k1.ts b/packages/shared-base/src/crypto/secp256k1.ts deleted file mode 100644 index 47423faae372..000000000000 --- a/packages/shared-base/src/crypto/secp256k1.ts +++ /dev/null @@ -1,67 +0,0 @@ -import * as secp256k1 from 'tiny-secp256k1' -import { encodeArrayBuffer, decodeArrayBuffer, concatArrayBufferSync } from '@dimensiondev/kit' -import type { EC_JsonWebKey, EC_Public_JsonWebKey } from './JWKType' -import { fromBase64URL, toBase64URL } from '../convert' -import { ECKeyIdentifier } from '../Identifier/type' -import type { EC_CryptoKey } from '.' - -/** - * Compress x & y into a single x - */ -export function compressSecp256k1Point(x: string, y: string): Uint8Array { - const xb = fromBase64URL(x) - const yb = fromBase64URL(y) - const point = new Uint8Array(concatArrayBufferSync(new Uint8Array([0x04]), xb, yb)) - if (secp256k1.isPoint(point)) { - return secp256k1.pointCompress(point, true) - } else { - throw new TypeError('Not a point on secp256k1!') - } -} -/** - * Decompress x into x & y - */ -export function decompressSecp256k1Point(point: Uint8Array): { x: string; y: string } { - if (!secp256k1.isPoint(point)) throw new TypeError('Not a point on secp256k1!') - const uncompressed = secp256k1.isPointCompressed(point) ? secp256k1.pointCompress(point, false) : point - const len = (uncompressed.length - 1) / 2 - const x = uncompressed.slice(1, len + 1) - const y = uncompressed.slice(len + 1) - return { x: toBase64URL(x), y: toBase64URL(y) } -} - -export function compressSecp256k1Key(key: EC_JsonWebKey): string { - const arr = compressSecp256k1Point(key.x!, key.y!) - return encodeArrayBuffer(arr) -} -export function decompressSecp256k1Key(compressedPublic: string): EC_Public_JsonWebKey { - const arr = decodeArrayBuffer(compressedPublic) - const key = decompressSecp256k1Point(new Uint8Array(arr)) - const jwk: JsonWebKey = { - crv: 'K-256', - ext: true, - x: key.x, - y: key.y, - key_ops: ['deriveKey', 'deriveBits'], - kty: 'EC', - } - return jwk as EC_Public_JsonWebKey -} - -export function isSecp256k1Point(x: Uint8Array) { - return secp256k1.isPoint(x) -} - -export function isSecp256k1PrivateKey(d: Uint8Array) { - return secp256k1.isPrivate(d) -} - -export function ECKeyIdentifierFromJsonWebKey(key: EC_JsonWebKey) { - const x = compressSecp256k1Key(key) - return new ECKeyIdentifier('secp256k1', x) -} - -export async function ECKeyIdentifierFromCryptoKey(key: EC_CryptoKey) { - const k = (await crypto.subtle.exportKey('jwk', key)) as EC_JsonWebKey - return ECKeyIdentifierFromJsonWebKey(k) -} diff --git a/packages/shared-base/src/index.ts b/packages/shared-base/src/index.ts index 347dfe9de26b..83c3497d8de3 100644 --- a/packages/shared-base/src/index.ts +++ b/packages/shared-base/src/index.ts @@ -7,7 +7,8 @@ export * from './i18n' export * from './TypedMessage' export * from './utils' export * from './kv-storage' -export * from './crypto' +export * from './crypto/CryptoType' +export * from './crypto/JWKType' export * from './Persona/type' export * from './Post/type' export * from './Persona/type' @@ -15,4 +16,3 @@ export { PopupRoutes } from './Routes/PopupRoutes' export { DashboardRoutes } from './Routes/DashboardRoutes' export * from './Messages/Mask' export * from './Results' -export * from './convert' diff --git a/packages/theme/.storybook/main.cjs b/packages/theme/.storybook/main.cjs index 2d744209ac2c..abcd87d2f8cc 100644 --- a/packages/theme/.storybook/main.cjs +++ b/packages/theme/.storybook/main.cjs @@ -15,12 +15,11 @@ module.exports = { fastRefresh: true, }, webpackFinal: async (config) => { - config.experiments = { asyncWebAssembly: true } config.module.rules.push({ test: /\.m?js$/, type: 'javascript/auto', resolve: { - fullySpecified: false, + fullySpecified: false, // disable the behaviour }, }) return config diff --git a/packages/theme/package.json b/packages/theme/package.json index ba65f6f1b8a3..0db307e6cb8d 100644 --- a/packages/theme/package.json +++ b/packages/theme/package.json @@ -43,6 +43,7 @@ "@storybook/builder-webpack5": "^6.4.9", "@storybook/manager-webpack5": "^6.4.9", "@storybook/react": "^6.4.9", - "babel-loader": "^8.2.3" + "babel-loader": "^8.2.3", + "webpack": "^5.64.4" } } diff --git a/patches/webpack+5.65.0.patch b/patches/webpack+5.65.0.patch deleted file mode 100644 index 2c183ddbb9da..000000000000 --- a/patches/webpack+5.65.0.patch +++ /dev/null @@ -1,52 +0,0 @@ -# generated by patch-package 6.5.0 on 2021-12-15 10:34:26 -# -# command: -# npx patch-package webpack -# -# declared package: -# webpack: 5.65.0 -# -diff --git a/node_modules/webpack/lib/async-modules/AwaitDependenciesInitFragment.js b/node_modules/webpack/lib/async-modules/AwaitDependenciesInitFragment.js -index ec7974d..ad0f543 100644 ---- a/node_modules/webpack/lib/async-modules/AwaitDependenciesInitFragment.js -+++ b/node_modules/webpack/lib/async-modules/AwaitDependenciesInitFragment.js -@@ -50,7 +50,7 @@ class AwaitDependenciesInitFragment extends InitFragment { - if (promises.size === 1) { - for (const p of promises) { - return Template.asString([ -- `var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([${p}]);`, -+ `var ${p}, __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([${p}]);`, - `${p} = (__webpack_async_dependencies__.then ? await __webpack_async_dependencies__ : __webpack_async_dependencies__)[0];`, - "" - ]); -@@ -59,7 +59,7 @@ class AwaitDependenciesInitFragment extends InitFragment { - const sepPromises = Array.from(promises).join(", "); - // TODO check if destructuring is supported - return Template.asString([ -- `var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([${sepPromises}]);`, -+ `var ${sepPromises}, __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([${sepPromises}]);`, - `([${sepPromises}] = __webpack_async_dependencies__.then ? await __webpack_async_dependencies__ : __webpack_async_dependencies__);`, - "" - ]); -diff --git a/node_modules/webpack/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js b/node_modules/webpack/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js -index 90364d0..4599e95 100644 ---- a/node_modules/webpack/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js -+++ b/node_modules/webpack/lib/wasm-async/AsyncWebAssemblyJavascriptGenerator.js -@@ -161,7 +161,7 @@ class AsyncWebAssemblyJavascriptGenerator extends Generator { - const source = new RawSource( - promises.length > 0 - ? Template.asString([ -- `var __webpack_instantiate__ = ${runtimeTemplate.basicFunction( -+ `var ${promises.join(", ")}, __webpack_instantiate__ = ${runtimeTemplate.basicFunction( - `[${promises.join(", ")}]`, - `${importsCompatCode}return ${instantiateCall};` - )}`, -@@ -171,7 +171,7 @@ class AsyncWebAssemblyJavascriptGenerator extends Generator { - "__webpack_handle_async_dependencies__", - [ - importsCode, -- `var __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([${promises.join( -+ `var ${promises.join(", ")}, __webpack_async_dependencies__ = __webpack_handle_async_dependencies__([${promises.join( - ", " - )}]);`, - "return __webpack_async_dependencies__.then ? __webpack_async_dependencies__.then(__webpack_instantiate__) : __webpack_instantiate__(__webpack_async_dependencies__);" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 93fdb91640ef..7f4c3110badf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -61,7 +61,6 @@ importers: typescript: 4.6.0-dev.20211202 web3-core: 1.5.2 web3-core-method: 1.5.2 - webpack: 5.65.0 dependencies: '@dimensiondev/kit': 0.0.0-20211118134922-42648c0_903ac568566cb9483e6a82070d95c042 '@emotion/cache': 11.6.0 @@ -117,7 +116,6 @@ importers: ts-jest: 27.0.7_b2c58650c6f25cbfcbffe6700ea42d1a ts-node: 10.4.0_typescript@4.6.0-dev.20211202 typescript: 4.6.0-dev.20211202 - webpack: 5.65.0 packages/backup-format: specifiers: @@ -178,6 +176,7 @@ importers: wallet.ts: ^1.0.1 web3-core-helpers: 1.5.2 web3-utils: ^1.5.3 + webpack: ^5.64.4 zod: ^3.11.6 dependencies: '@dimensiondev/holoflows-kit': 0.9.0-20210902104757-7c3d0d0 @@ -224,15 +223,16 @@ importers: devDependencies: '@babel/core': 7.16.0 '@storybook/addon-actions': 6.4.9_7ce4a32944558e8f076f30caab2f5a44 - '@storybook/addon-essentials': 6.4.9_afd9df8826c4a2d1477ed0decd132221 + '@storybook/addon-essentials': 6.4.9_912b43caff9bfd829e368c43d0770ca1 '@storybook/addon-links': 6.4.9_757a802188413a36d4f24237d13b8e90 '@storybook/builder-webpack5': 6.4.9_f34427d7dbc706e5de14aabe8c678add '@storybook/manager-webpack5': 6.4.9_f34427d7dbc706e5de14aabe8c678add '@storybook/react': 6.4.9_b3b0e4ec79ecd1161d9324158ad5d26d - babel-loader: 8.2.3_8dd2b11efd9b7265f9b7da54f0e73ab1 + babel-loader: 8.2.3_d888b76bb52891dbb46d1b9f7384ff34 buffer: 6.0.3 path-browserify: 1.0.1 stream-browserify: 3.0.0 + webpack: 5.64.4 packages/empty: specifiers: {} @@ -241,9 +241,13 @@ importers: specifiers: '@masknet/shared-base': workspace:* '@msgpack/msgpack': ^2.7.0 + pvtsutils: ^1.2.0 + tiny-secp256k1: ^2.1.2 dependencies: '@masknet/shared-base': link:../shared-base '@msgpack/msgpack': 2.7.1 + pvtsutils: 1.2.1 + tiny-secp256k1: 2.1.2 packages/external-plugin-previewer: specifiers: @@ -323,6 +327,7 @@ importers: '@types/react-window': ^1.8.4 '@types/remarkable': ^2.0.3 '@types/socket.io-client': ^1.4.36 + '@types/tiny-secp256k1': ^1.0.0 '@types/use-subscription': ^1.0.0 '@types/uuid': ^8.3.3 '@types/webpack-dev-server': ^4.5.0 @@ -371,6 +376,7 @@ importers: opensea-js: ^1.1.11 promievent: ^0.1.4 protobufjs: ^6.11.2 + pvtsutils: ^1.0.14 react-devtools-core: ^4.21.0 react-draggable: ^4.4.4 react-feather: ^2.0.9 @@ -391,6 +397,7 @@ importers: stream-browserify: ^3.0.0 stream-http: ^2.8.3 swc-loader: ^0.1.15 + tiny-secp256k1: ^1.1.5 unstated-next: ^1.1.0 urlcat: ^2.0.4 use-subscription: ^1.5.1 @@ -403,6 +410,7 @@ importers: web3-eth-contract: 1.5.2 web3-utils: 1.5.2 webextension-polyfill: ^0.8.0 + webpack: ^5.64.4 webpack-cli: ^4.9.1 webpack-dev-server: ^4.6.0 webpack-target-webextension: ^1.0.1 @@ -454,6 +462,7 @@ importers: '@types/react-window': 1.8.5 '@types/remarkable': 2.0.3 '@types/socket.io-client': 1.4.36 + '@types/tiny-secp256k1': 1.0.0 '@types/use-subscription': 1.0.0 '@types/uuid': 8.3.3 '@uniswap/sdk-core': 3.0.1 @@ -497,6 +506,7 @@ importers: opensea-js: 1.1.11 promievent: 0.1.5 protobufjs: 6.11.2 + pvtsutils: 1.1.7 react-draggable: 4.4.4_757a802188413a36d4f24237d13b8e90 react-feather: 2.0.9_react@18.0.0-rc.0 react-highlight-words: 0.17.0_react@18.0.0-rc.0 @@ -513,6 +523,7 @@ importers: socket.io-client: 2.4.0 stream-browserify: 3.0.0 stream-http: 2.8.3 + tiny-secp256k1: 1.1.6 unstated-next: 1.1.0 urlcat: 2.0.4 use-subscription: 1.5.1_react@18.0.0-rc.0 @@ -529,21 +540,22 @@ importers: zod: 3.11.6 devDependencies: '@dimensiondev/webextension-shim': 0.0.3-20210823035705-4257e12_typescript@4.6.0-dev.20211202 - '@nice-labs/emit-file-webpack-plugin': 1.1.2_webpack@5.65.0 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.2_8e59b3f0e87318c463eedd29023ab4ad + '@nice-labs/emit-file-webpack-plugin': 1.1.2_webpack@5.64.4 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.2_e7696c31560350b53940c3b92a64e90e '@swc/core': 1.2.112 '@types/webpack-dev-server': 4.5.0_93fbbb02a3bda170b039a49a61f47e0a '@typescript-eslint/eslint-plugin': 5.4.0_53c7d699d271d8da5cf62c4ca51f6b9e '@typescript-eslint/parser': 5.4.0_50ca58de175a3bed05c547bae00c50b3 - copy-webpack-plugin: 10.0.0_webpack@5.65.0 - html-webpack-plugin: 5.5.0_webpack@5.65.0 + copy-webpack-plugin: 10.0.0_webpack@5.64.4 + html-webpack-plugin: 5.5.0_webpack@5.64.4 react-devtools-core: 4.21.0 react-refresh: 0.11.0 - source-map-loader: 3.0.0_webpack@5.65.0 - swc-loader: 0.1.15_@swc+core@1.2.112+webpack@5.65.0 - webpack-cli: 4.9.1_311ee83d262c84b540260d22b1747cb3 - webpack-dev-server: 4.6.0_webpack-cli@4.9.1+webpack@5.65.0 - webpack-target-webextension: 1.0.1_webpack@5.65.0 + source-map-loader: 3.0.0_webpack@5.64.4 + swc-loader: 0.1.15_@swc+core@1.2.112+webpack@5.64.4 + webpack: 5.64.4_93fbbb02a3bda170b039a49a61f47e0a + webpack-cli: 4.9.1_1007153fc50135f3f883eec27a3e61a8 + webpack-dev-server: 4.6.0_webpack-cli@4.9.1+webpack@5.64.4 + webpack-target-webextension: 1.0.1_webpack@5.64.4 packages/mask-sdk: specifiers: @@ -749,9 +761,7 @@ importers: bignumber.js: ^9.0.1 immer: ^9.0.7 lodash-es: ^4.17.21 - pvtsutils: ^1.2.1 react: ../empty - tiny-secp256k1: ^2.1.2 typeson: ^6.1.0 typeson-registry: ^1.0.0-alpha.38 use-subscription: ^1.5.1 @@ -769,9 +779,7 @@ importers: bignumber.js: 9.0.1 immer: 9.0.7 lodash-es: 4.17.21 - pvtsutils: 1.2.1 react: link:../empty - tiny-secp256k1: 2.1.2 typeson: 6.1.0 typeson-registry: 1.0.0-alpha.39 use-subscription: 1.5.1_react@18.0.0-rc.0 @@ -810,6 +818,7 @@ importers: tss-react: ^2.1.1 unstated-next: ^1.1.0 use-subscription: ^1.5.1 + webpack: ^5.64.4 dependencies: '@masknet/icons': link:../icons '@masknet/storybook-shared': link:../storybook-shared @@ -827,12 +836,13 @@ importers: devDependencies: '@babel/core': 7.16.0 '@storybook/addon-actions': 6.4.9_7ce4a32944558e8f076f30caab2f5a44 - '@storybook/addon-essentials': 6.4.9_afd9df8826c4a2d1477ed0decd132221 + '@storybook/addon-essentials': 6.4.9_912b43caff9bfd829e368c43d0770ca1 '@storybook/addon-links': 6.4.9_757a802188413a36d4f24237d13b8e90 '@storybook/builder-webpack5': 6.4.9_f34427d7dbc706e5de14aabe8c678add '@storybook/manager-webpack5': 6.4.9_f34427d7dbc706e5de14aabe8c678add '@storybook/react': 6.4.9_b3b0e4ec79ecd1161d9324158ad5d26d - babel-loader: 8.2.3_8dd2b11efd9b7265f9b7da54f0e73ab1 + babel-loader: 8.2.3_d888b76bb52891dbb46d1b9f7384ff34 + webpack: 5.64.4 packages/web3-constants: specifiers: {} @@ -4079,7 +4089,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.2.5 - '@types/node': 16.11.12 + '@types/node': 16.11.6 chalk: 4.1.2 jest-message-util: 27.3.1 jest-util: 27.3.1 @@ -4100,7 +4110,7 @@ packages: '@jest/test-result': 27.3.1 '@jest/transform': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.12 + '@types/node': 16.11.6 ansi-escapes: 4.3.2 chalk: 4.1.2 emittery: 0.8.1 @@ -4137,7 +4147,7 @@ packages: dependencies: '@jest/fake-timers': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.12 + '@types/node': 16.11.6 jest-mock: 27.3.0 dev: true @@ -4147,7 +4157,7 @@ packages: dependencies: '@jest/types': 27.2.5 '@sinonjs/fake-timers': 8.0.1 - '@types/node': 16.11.12 + '@types/node': 16.11.6 jest-message-util: 27.3.1 jest-mock: 27.3.0 jest-util: 27.3.1 @@ -4176,7 +4186,7 @@ packages: '@jest/test-result': 27.3.1 '@jest/transform': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.12 + '@types/node': 16.11.6 chalk: 4.1.2 collect-v8-coverage: 1.0.1 exit: 0.1.2 @@ -4294,7 +4304,7 @@ packages: dependencies: '@types/istanbul-lib-coverage': 2.0.3 '@types/istanbul-reports': 3.0.1 - '@types/node': 16.11.12 + '@types/node': 16.11.6 '@types/yargs': 16.0.4 chalk: 4.1.2 dev: true @@ -4642,13 +4652,13 @@ packages: resolution: {integrity: sha512-jDJTpta+P4p1NZTFVLHJ/TLFVYVcOqv6l8xwOeBKNPMgY/zDYH/YH7SJbvrr/h1RcS9GzbPcLKGzpuK9cV56UA==} dev: true - /@nice-labs/emit-file-webpack-plugin/1.1.2_webpack@5.65.0: + /@nice-labs/emit-file-webpack-plugin/1.1.2_webpack@5.64.4: resolution: {integrity: sha512-sa5df1UnX/Gej9C/jvLAF2u0rxZ5A0oPlwRHh3Y7Qdf+laHssT6AtAntsxKwRbEEZ1KZr9m90K5LTA7j59LtEw==} engines: {node: '>= 12'} peerDependencies: webpack: '>= 5' dependencies: - webpack: 5.65.0 + webpack: 5.64.4_93fbbb02a3bda170b039a49a61f47e0a dev: true /@nice-labs/git-rev/3.5.0: @@ -4806,7 +4816,7 @@ packages: randombytes: 2.1.0 dev: false - /@pmmmwh/react-refresh-webpack-plugin/0.5.2_8e59b3f0e87318c463eedd29023ab4ad: + /@pmmmwh/react-refresh-webpack-plugin/0.5.2_e7696c31560350b53940c3b92a64e90e: resolution: {integrity: sha512-BWOG6opI9+L5HjQIj6znFLwVXkjDS98PKfRDlbPFvinTz4wQ7ZSXxV0lLOfRW12HXcqk4DEzrphjRMJFXuihNg==} engines: {node: '>= 10.13'} peerDependencies: @@ -4842,8 +4852,8 @@ packages: react-refresh: 0.11.0 schema-utils: 3.1.1 source-map: 0.7.3 - webpack: 5.65.0 - webpack-dev-server: 4.6.0_webpack-cli@4.9.1+webpack@5.65.0 + webpack: 5.64.4_93fbbb02a3bda170b039a49a61f47e0a + webpack-dev-server: 4.6.0_webpack-cli@4.9.1+webpack@5.64.4 dev: true /@pmmmwh/react-refresh-webpack-plugin/0.5.3_40197ac6d9ae665387b5bc70002c2da9: @@ -5153,7 +5163,7 @@ packages: - webpack-command dev: true - /@storybook/addon-docs/6.4.9_afd698850d2d5c6c0cc397f84e2dfd0a: + /@storybook/addon-docs/6.4.9_d4c491b35386671e59d33258b349a562: resolution: {integrity: sha512-sJvnbp6Z+e7B1+vDE8gZVhCg1eNotIa7bx9LYd1Y2QwJ4PEv9hE2YxnzmWt3NZJGtrn4gdGaMCk7pmksugHi7g==} peerDependencies: '@storybook/angular': 6.4.9 @@ -5214,7 +5224,7 @@ packages: '@storybook/builder-webpack4': 6.4.9_2307e25715604594707d4f7b1e69ebcd '@storybook/client-logger': 6.4.9 '@storybook/components': 6.4.9_7ce4a32944558e8f076f30caab2f5a44 - '@storybook/core': 6.4.9_89e9964e2c42436aae8c7cf07e91cb15 + '@storybook/core': 6.4.9_2609309ece4ec1d4d050f9747fae6848 '@storybook/core-events': 6.4.9 '@storybook/csf': 0.0.2--canary.87bc651.0 '@storybook/csf-tools': 6.4.9 @@ -5249,7 +5259,7 @@ packages: remark-slug: 6.1.0 ts-dedent: 2.2.0 util-deprecate: 1.0.2 - webpack: 5.65.0 + webpack: 5.64.4 transitivePeerDependencies: - '@storybook/builder-webpack5' - '@storybook/manager-webpack5' @@ -5264,7 +5274,7 @@ packages: - webpack-command dev: true - /@storybook/addon-essentials/6.4.9_afd9df8826c4a2d1477ed0decd132221: + /@storybook/addon-essentials/6.4.9_912b43caff9bfd829e368c43d0770ca1: resolution: {integrity: sha512-3YOtGJsmS7A4aIaclnEqTgO+fUEX63pHq2CvqIKPGLVPgLmn6MnEhkkV2j30MfAkoe3oynLqFBvkCdYwzwJxNQ==} peerDependencies: '@babel/core': ^7.9.6 @@ -5293,7 +5303,7 @@ packages: '@storybook/addon-actions': 6.4.9_7ce4a32944558e8f076f30caab2f5a44 '@storybook/addon-backgrounds': 6.4.9_7ce4a32944558e8f076f30caab2f5a44 '@storybook/addon-controls': 6.4.9_f34427d7dbc706e5de14aabe8c678add - '@storybook/addon-docs': 6.4.9_afd698850d2d5c6c0cc397f84e2dfd0a + '@storybook/addon-docs': 6.4.9_d4c491b35386671e59d33258b349a562 '@storybook/addon-measure': 6.4.9_7ce4a32944558e8f076f30caab2f5a44 '@storybook/addon-outline': 6.4.9_7ce4a32944558e8f076f30caab2f5a44 '@storybook/addon-toolbars': 6.4.9_7ce4a32944558e8f076f30caab2f5a44 @@ -5301,13 +5311,13 @@ packages: '@storybook/addons': 6.4.9_757a802188413a36d4f24237d13b8e90 '@storybook/api': 6.4.9_757a802188413a36d4f24237d13b8e90 '@storybook/node-logger': 6.4.9 - babel-loader: 8.2.3_8dd2b11efd9b7265f9b7da54f0e73ab1 + babel-loader: 8.2.3_d888b76bb52891dbb46d1b9f7384ff34 core-js: 3.19.3 react: 18.0.0-rc.0 react-dom: 18.0.0-rc.0_react@18.0.0-rc.0 regenerator-runtime: 0.13.9 ts-dedent: 2.2.0 - webpack: 5.65.0 + webpack: 5.64.4 transitivePeerDependencies: - '@storybook/angular' - '@storybook/builder-webpack5' @@ -5919,6 +5929,45 @@ packages: - '@types/react' dev: true + /@storybook/core-client/6.4.9_9d5715f587493b93934801754da3185f: + resolution: {integrity: sha512-LZSpTtvBlpcn+Ifh0jQXlm/8wva2zZ2v13yxYIxX6tAwQvmB54U0N4VdGVmtkiszEp7TQUAzA8Pcyp4GWE+UMA==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 + react-dom: ^16.8.0 || ^17.0.0 + typescript: '*' + webpack: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@storybook/addons': 6.4.9_757a802188413a36d4f24237d13b8e90 + '@storybook/channel-postmessage': 6.4.9 + '@storybook/channel-websocket': 6.4.9 + '@storybook/client-api': 6.4.9_757a802188413a36d4f24237d13b8e90 + '@storybook/client-logger': 6.4.9 + '@storybook/core-events': 6.4.9 + '@storybook/csf': 0.0.2--canary.87bc651.0 + '@storybook/preview-web': 6.4.9_757a802188413a36d4f24237d13b8e90 + '@storybook/store': 6.4.9_757a802188413a36d4f24237d13b8e90 + '@storybook/ui': 6.4.9_7ce4a32944558e8f076f30caab2f5a44 + airbnb-js-shims: 2.2.1 + ansi-to-html: 0.6.15 + core-js: 3.19.3 + global: 4.4.0 + lodash: 4.17.21 + qs: 6.10.2 + react: 18.0.0-rc.0 + react-dom: 18.0.0-rc.0_react@18.0.0-rc.0 + regenerator-runtime: 0.13.9 + ts-dedent: 2.2.0 + typescript: 4.6.0-dev.20211202 + unfetch: 4.2.0 + util-deprecate: 1.0.2 + webpack: 5.64.4 + transitivePeerDependencies: + - '@types/react' + dev: true + /@storybook/core-client/6.4.9_d5ff8c61916f982659a39d4f350620cd: resolution: {integrity: sha512-LZSpTtvBlpcn+Ifh0jQXlm/8wva2zZ2v13yxYIxX6tAwQvmB54U0N4VdGVmtkiszEp7TQUAzA8Pcyp4GWE+UMA==} peerDependencies: @@ -6257,7 +6306,7 @@ packages: - webpack-command dev: true - /@storybook/core/6.4.9_81a8a21f1e6a8cead0c51780960f149f: + /@storybook/core/6.4.9_2609309ece4ec1d4d050f9747fae6848: resolution: {integrity: sha512-Mzhiy13loMSd3PCygK3t7HIT3X3L35iZmbe6+2xVbVmc/3ypCmq4PQALCUoDOGk37Ifrhop6bo6sl4s9YQ6UFw==} peerDependencies: '@storybook/builder-webpack5': 6.4.9 @@ -6271,12 +6320,13 @@ packages: typescript: optional: true dependencies: - '@storybook/core-client': 6.4.9_4a3c9ea574ac0b932e10866721e9f661 - '@storybook/core-server': 6.4.9_f34427d7dbc706e5de14aabe8c678add + '@storybook/builder-webpack5': 6.4.9_f34427d7dbc706e5de14aabe8c678add + '@storybook/core-client': 6.4.9_9d5715f587493b93934801754da3185f + '@storybook/core-server': 6.4.9_9fdaaf12e5af1c0610a85f6a0bc97de8 react: 18.0.0-rc.0 react-dom: 18.0.0-rc.0_react@18.0.0-rc.0 typescript: 4.6.0-dev.20211202 - webpack: 4.46.0 + webpack: 5.64.4 transitivePeerDependencies: - '@storybook/manager-webpack5' - '@types/react' @@ -6290,7 +6340,7 @@ packages: - webpack-command dev: true - /@storybook/core/6.4.9_89e9964e2c42436aae8c7cf07e91cb15: + /@storybook/core/6.4.9_81a8a21f1e6a8cead0c51780960f149f: resolution: {integrity: sha512-Mzhiy13loMSd3PCygK3t7HIT3X3L35iZmbe6+2xVbVmc/3ypCmq4PQALCUoDOGk37Ifrhop6bo6sl4s9YQ6UFw==} peerDependencies: '@storybook/builder-webpack5': 6.4.9 @@ -6304,13 +6354,12 @@ packages: typescript: optional: true dependencies: - '@storybook/builder-webpack5': 6.4.9_f34427d7dbc706e5de14aabe8c678add - '@storybook/core-client': 6.4.9_d5ff8c61916f982659a39d4f350620cd - '@storybook/core-server': 6.4.9_9fdaaf12e5af1c0610a85f6a0bc97de8 + '@storybook/core-client': 6.4.9_4a3c9ea574ac0b932e10866721e9f661 + '@storybook/core-server': 6.4.9_f34427d7dbc706e5de14aabe8c678add react: 18.0.0-rc.0 react-dom: 18.0.0-rc.0_react@18.0.0-rc.0 typescript: 4.6.0-dev.20211202 - webpack: 5.65.0 + webpack: 4.46.0 transitivePeerDependencies: - '@storybook/manager-webpack5' - '@types/react' @@ -7106,7 +7155,7 @@ packages: resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} dependencies: '@types/connect': 3.4.35 - '@types/node': 16.11.12 + '@types/node': 16.11.10 dev: true /@types/bonjour/3.5.9: @@ -7146,7 +7195,7 @@ packages: /@types/connect/3.4.35: resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} dependencies: - '@types/node': 16.11.12 + '@types/node': 16.11.10 dev: true /@types/d3-array/1.2.9: @@ -7382,7 +7431,7 @@ packages: /@types/express-serve-static-core/4.17.25: resolution: {integrity: sha512-OUJIVfRMFijZukGGwTpKNFprqCCXk5WjNGvUgB/CxxBR40QWSjsNK86+yvGKlCOGc7sbwfHLaXhkG+NsytwBaQ==} dependencies: - '@types/node': 16.11.12 + '@types/node': 16.11.10 '@types/qs': 6.9.7 '@types/range-parser': 1.2.4 dev: true @@ -7473,7 +7522,7 @@ packages: /@types/http-proxy/1.17.7: resolution: {integrity: sha512-9hdj6iXH64tHSLTY+Vt2eYOGzSogC+JQ2H7bdPWkuh7KXP5qLllWx++t+K9Wk556c3dkDdPws/SpMRi0sdCT1w==} dependencies: - '@types/node': 16.11.12 + '@types/node': 16.11.10 dev: true /@types/is-function/1.0.1: @@ -7587,7 +7636,7 @@ packages: /@types/pbkdf2/3.1.0: resolution: {integrity: sha512-Cf63Rv7jCQ0LaL8tNXmEyqTHuIJxRdlS5vMh1mj5voN4+QFhVZnlZruezqpWYDiJ8UTzhP0VmeLXCmBk66YrMQ==} dependencies: - '@types/node': 16.11.12 + '@types/node': 16.11.10 /@types/prettier/2.3.2: resolution: {integrity: sha512-eI5Yrz3Qv4KPUa/nSIAi0h+qX0XyewOliug5F2QAtuRg6Kjg6jfmxe1GIwoIRhZspD1A0RP8ANrPwvEXXtRFog==} @@ -7752,7 +7801,7 @@ packages: /@types/secp256k1/4.0.3: resolution: {integrity: sha512-Da66lEIFeIz9ltsdMZcpQvmrmmoqrfju8pm1BH8WbYjZSwUgCwXLb9C+9XYogwBITnbsSaMdVPb2ekf7TV+03w==} dependencies: - '@types/node': 16.11.12 + '@types/node': 16.11.10 /@types/serve-index/1.9.1: resolution: {integrity: sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==} @@ -7783,6 +7832,12 @@ packages: resolution: {integrity: sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==} dev: true + /@types/tiny-secp256k1/1.0.0: + resolution: {integrity: sha512-IW3dFGNyVkVLC1MCMogVWQaKH/ZtjPQdOW9c3X128o5lVpFYNsq/l3Qo1pV7sfTmvDzWEXR3QTxg1TMy1pyaAQ==} + dependencies: + '@types/node': 16.11.10 + dev: false + /@types/tinycolor2/1.4.3: resolution: {integrity: sha512-Kf1w9NE5HEgGxCRyIcRXR/ZYtDv0V8FVPtYHwLxl0O+maGX0erE77pQlD0gpP+/KByMZ87mOA79SjifhSB3PjQ==} dev: false @@ -8393,14 +8448,14 @@ packages: '@xtuc/long': 4.2.2 dev: true - /@webpack-cli/configtest/1.1.0_webpack-cli@4.9.1+webpack@5.65.0: + /@webpack-cli/configtest/1.1.0_webpack-cli@4.9.1+webpack@5.64.4: resolution: {integrity: sha512-ttOkEkoalEHa7RaFYpM0ErK1xc4twg3Am9hfHhL7MVqlHebnkYd2wuI/ZqTDj0cVzZho6PdinY0phFZV3O0Mzg==} peerDependencies: webpack: 4.x.x || 5.x.x webpack-cli: 4.x.x dependencies: - webpack: 5.65.0 - webpack-cli: 4.9.1_311ee83d262c84b540260d22b1747cb3 + webpack: 5.64.4_93fbbb02a3bda170b039a49a61f47e0a + webpack-cli: 4.9.1_1007153fc50135f3f883eec27a3e61a8 dev: true /@webpack-cli/info/1.4.0_webpack-cli@4.9.1: @@ -8409,7 +8464,7 @@ packages: webpack-cli: 4.x.x dependencies: envinfo: 7.8.1 - webpack-cli: 4.9.1_311ee83d262c84b540260d22b1747cb3 + webpack-cli: 4.9.1_1007153fc50135f3f883eec27a3e61a8 dev: true /@webpack-cli/serve/1.6.0_69695c7c9cf22b2285138f704ba481b9: @@ -8421,8 +8476,8 @@ packages: webpack-dev-server: optional: true dependencies: - webpack-cli: 4.9.1_311ee83d262c84b540260d22b1747cb3 - webpack-dev-server: 4.6.0_webpack-cli@4.9.1+webpack@5.65.0 + webpack-cli: 4.9.1_1007153fc50135f3f883eec27a3e61a8 + webpack-dev-server: 4.6.0_webpack-cli@4.9.1+webpack@5.64.4 dev: true /@xobotyi/scrollbar-width/1.9.5: @@ -8576,7 +8631,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.3 + debug: 4.3.2 transitivePeerDependencies: - supports-color @@ -9412,6 +9467,21 @@ packages: webpack: 5.65.0 dev: true + /babel-loader/8.2.3_d888b76bb52891dbb46d1b9f7384ff34: + resolution: {integrity: sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==} + engines: {node: '>= 8.9'} + peerDependencies: + '@babel/core': ^7.0.0 + webpack: '>=2' + dependencies: + '@babel/core': 7.16.0 + find-cache-dir: 3.3.2 + loader-utils: 1.4.0 + make-dir: 3.1.0 + schema-utils: 2.7.1 + webpack: 5.64.4 + dev: true + /babel-messages/6.23.0: resolution: {integrity: sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=} dependencies: @@ -10073,7 +10143,6 @@ packages: requiresBuild: true dependencies: file-uri-to-path: 1.0.0 - optional: true /bintrees/1.0.2: resolution: {integrity: sha1-SfiW1uhYpKSZ34XDj7OZua/4QPg=} @@ -10283,8 +10352,8 @@ packages: engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001286 - electron-to-chromium: 1.4.16 + caniuse-lite: 1.0.30001283 + electron-to-chromium: 1.4.3 escalade: 3.1.1 node-releases: 2.0.1 picocolors: 1.0.0 @@ -10540,6 +10609,9 @@ packages: engines: {node: '>=10'} dev: true + /caniuse-lite/1.0.30001283: + resolution: {integrity: sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg==} + /caniuse-lite/1.0.30001286: resolution: {integrity: sha512-zaEMRH6xg8ESMi2eQ3R4eZ5qw/hJiVsO/HlLwniIwErij0JDr9P+8V4dtx1l+kLq6j3yy8l8W4fst1lBnat5wQ==} @@ -11191,7 +11263,7 @@ packages: dependencies: toggle-selection: 1.0.6 - /copy-webpack-plugin/10.0.0_webpack@5.65.0: + /copy-webpack-plugin/10.0.0_webpack@5.64.4: resolution: {integrity: sha512-tuCVuFMBbRsb7IH0q1CUb50/Skv+7a6c7DJ+xi4fAbOzNLTYVMUTPnf8uGvKPtmqTvzYBrfEFo7YgP4TsUWmtg==} engines: {node: '>= 12.20.0'} peerDependencies: @@ -11203,7 +11275,7 @@ packages: normalize-path: 3.0.0 schema-utils: 4.0.0 serialize-javascript: 6.0.0 - webpack: 5.65.0 + webpack: 5.64.4_93fbbb02a3bda170b039a49a61f47e0a dev: true /core-js-builder/3.19.1: @@ -11943,6 +12015,7 @@ packages: optional: true dependencies: ms: 2.1.2 + dev: true /decamelize-keys/1.1.0: resolution: {integrity: sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=} @@ -12392,6 +12465,9 @@ packages: /electron-to-chromium/1.4.16: resolution: {integrity: sha512-BQb7FgYwnu6haWLU63/CdVW+9xhmHls3RCQUFiV4lvw3wimEHTVcUk2hkuZo76QhR8nnDdfZE7evJIZqijwPdA==} + /electron-to-chromium/1.4.3: + resolution: {integrity: sha512-hfpppjYhqIZB8jrNb0rNceQRkSnBN7QJl3W26O1jUv3F3BkQknqy1YTqVXkFnIcFtBc3Qnv5M7r5Lez2iOLgZA==} + /element-resize-detector/1.2.3: resolution: {integrity: sha512-+dhNzUgLpq9ol5tyhoG7YLoXL3ssjfFW+0gpszXPwRU6NjGr1fVHMEAF8fVzIiRJq57Nre0RFeIjJwI8Nh2NmQ==} dependencies: @@ -13819,7 +13895,6 @@ packages: /file-uri-to-path/1.0.0: resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} requiresBuild: true - optional: true /filesize/6.1.0: resolution: {integrity: sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg==} @@ -15161,6 +15236,20 @@ packages: webpack: 4.46.0 dev: true + /html-webpack-plugin/5.5.0_webpack@5.64.4: + resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} + engines: {node: '>=10.13.0'} + peerDependencies: + webpack: ^5.20.0 + dependencies: + '@types/html-minifier-terser': 6.0.0 + html-minifier-terser: 6.0.2 + lodash: 4.17.21 + pretty-error: 4.0.0 + tapable: 2.2.1 + webpack: 5.64.4_93fbbb02a3bda170b039a49a61f47e0a + dev: true + /html-webpack-plugin/5.5.0_webpack@5.65.0: resolution: {integrity: sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==} engines: {node: '>=10.13.0'} @@ -15246,7 +15335,7 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.3 + debug: 4.3.2 transitivePeerDependencies: - supports-color dev: false @@ -15292,7 +15381,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.3 + debug: 4.3.2 transitivePeerDependencies: - supports-color @@ -16144,7 +16233,7 @@ packages: '@jest/environment': 27.3.1 '@jest/test-result': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.12 + '@types/node': 16.11.6 chalk: 4.1.2 co: 4.6.0 dedent: 0.7.0 @@ -16267,7 +16356,7 @@ packages: '@jest/environment': 27.3.1 '@jest/fake-timers': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.12 + '@types/node': 16.11.6 jest-mock: 27.3.0 jest-util: 27.3.1 jsdom: 16.7.0 @@ -16285,7 +16374,7 @@ packages: '@jest/environment': 27.3.1 '@jest/fake-timers': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.12 + '@types/node': 16.11.6 jest-mock: 27.3.0 jest-util: 27.3.1 dev: true @@ -16322,7 +16411,7 @@ packages: dependencies: '@jest/types': 27.2.5 '@types/graceful-fs': 4.1.5 - '@types/node': 16.11.12 + '@types/node': 16.11.6 anymatch: 3.1.2 fb-watchman: 2.0.1 graceful-fs: 4.2.8 @@ -16345,7 +16434,7 @@ packages: '@jest/source-map': 27.0.6 '@jest/test-result': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.12 + '@types/node': 16.11.6 chalk: 4.1.2 co: 4.6.0 expect: 27.3.1 @@ -16400,7 +16489,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.2.5 - '@types/node': 16.11.12 + '@types/node': 16.11.6 dev: true /jest-pnp-resolver/1.2.2_jest-resolve@27.3.1: @@ -16461,7 +16550,7 @@ packages: '@jest/test-result': 27.3.1 '@jest/transform': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.12 + '@types/node': 16.11.6 chalk: 4.1.2 emittery: 0.8.1 exit: 0.1.2 @@ -16476,7 +16565,7 @@ packages: jest-runtime: 27.3.1 jest-util: 27.3.1 jest-worker: 27.3.1 - source-map-support: 0.5.21 + source-map-support: 0.5.20 throat: 6.0.1 transitivePeerDependencies: - bufferutil @@ -16531,7 +16620,7 @@ packages: resolution: {integrity: sha512-PtGdVK9EGC7dsaziskfqaAPib6wTViY3G8E5wz9tLVPhHyiDNTZn/xjZ4khAw+09QkoOVpn7vF5nPSN6dtBexA==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: - '@types/node': 16.11.12 + '@types/node': 16.11.6 graceful-fs: 4.2.8 dev: true @@ -16584,7 +16673,7 @@ packages: engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} dependencies: '@jest/types': 27.2.5 - '@types/node': 16.11.12 + '@types/node': 16.11.6 chalk: 4.1.2 ci-info: 3.2.0 graceful-fs: 4.2.8 @@ -16609,7 +16698,7 @@ packages: dependencies: '@jest/test-result': 27.3.1 '@jest/types': 27.2.5 - '@types/node': 16.11.12 + '@types/node': 16.11.6 ansi-escapes: 4.3.2 chalk: 4.1.2 jest-util: 27.3.1 @@ -16629,7 +16718,7 @@ packages: resolution: {integrity: sha512-ks3WCzsiZaOPJl/oMsDjaf0TRiSv7ctNgs0FqRr2nARsovz6AWWy4oLElwcquGSz692DzgZQrCLScPNs5YlC4g==} engines: {node: '>= 10.13.0'} dependencies: - '@types/node': 16.11.12 + '@types/node': 16.11.6 merge-stream: 2.0.0 supports-color: 8.1.1 dev: true @@ -18030,6 +18119,10 @@ packages: thenify-all: 1.6.0 dev: true + /nan/2.14.2: + resolution: {integrity: sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==} + dev: false + /nan/2.15.0: resolution: {integrity: sha512-8ZtvEnA2c5aYCZYd1cvgdnU6cqwixRoYg70xPLWUws5ORTa/lnw+u4amixRS/Ac5U5mQVgp9pnlSUnbNWFaWZQ==} requiresBuild: true @@ -21227,7 +21320,7 @@ packages: engines: {node: '>=0.10.0'} dev: true - /source-map-loader/3.0.0_webpack@5.65.0: + /source-map-loader/3.0.0_webpack@5.64.4: resolution: {integrity: sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -21236,7 +21329,7 @@ packages: abab: 2.0.5 iconv-lite: 0.6.3 source-map-js: 0.6.2 - webpack: 5.65.0 + webpack: 5.64.4_93fbbb02a3bda170b039a49a61f47e0a dev: true /source-map-resolve/0.5.3: @@ -21327,7 +21420,7 @@ packages: /spdy-transport/3.0.0: resolution: {integrity: sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==} dependencies: - debug: 4.3.3 + debug: 4.3.2 detect-node: 2.1.0 hpack.js: 2.1.6 obuf: 1.1.2 @@ -21807,7 +21900,7 @@ packages: xhr-request: 1.1.0 dev: false - /swc-loader/0.1.15_@swc+core@1.2.112+webpack@5.65.0: + /swc-loader/0.1.15_@swc+core@1.2.112+webpack@5.64.4: resolution: {integrity: sha512-cn1WPIeQJvXM4bbo3OwdEIapsQ4uUGOfyFj0h2+2+brT0k76DCGnZXDE2KmcqTd2JSQ+b61z2NPMib7eEwMYYw==} peerDependencies: '@swc/core': ^1.2.52 @@ -21815,7 +21908,7 @@ packages: dependencies: '@swc/core': 1.2.112 loader-utils: 2.0.0 - webpack: 5.65.0 + webpack: 5.64.4_93fbbb02a3bda170b039a49a61f47e0a dev: true /symbol-tree/3.2.4: @@ -22011,6 +22104,32 @@ packages: - acorn dev: true + /terser-webpack-plugin/5.2.5_acorn@8.6.0+webpack@5.64.4: + resolution: {integrity: sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + jest-worker: 27.3.1 + schema-utils: 3.1.1 + serialize-javascript: 6.0.0 + source-map: 0.6.1 + terser: 5.10.0_acorn@8.6.0 + webpack: 5.64.4 + transitivePeerDependencies: + - acorn + dev: true + /terser-webpack-plugin/5.2.5_acorn@8.6.0+webpack@5.65.0: resolution: {integrity: sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g==} engines: {node: '>= 10.13.0'} @@ -22137,7 +22256,7 @@ packages: dependencies: commander: 2.20.3 source-map: 0.7.3 - source-map-support: 0.5.21 + source-map-support: 0.5.20 dev: true /test-exclude/6.0.0: @@ -22253,6 +22372,18 @@ packages: resolution: {integrity: sha512-ytxQvrb1cPc9WBEI/HSeYYoGD0kWnGEOR8RY6KomWLBVhqz0RgTwVO9dLrGz7dC+nN9llyI7OKAgRq8Vq4ZBSw==} dev: false + /tiny-secp256k1/1.1.6: + resolution: {integrity: sha512-FmqJZGduTyvsr2cF3375fqGHUovSwDi/QytexX1Se4BPuPZpTE5Ftp5fg+EFSuEf3lhZqgCRjEG3ydUQ/aNiwA==} + engines: {node: '>=6.0.0'} + requiresBuild: true + dependencies: + bindings: 1.5.0 + bn.js: 4.12.0 + create-hmac: 1.1.7 + elliptic: 6.5.4 + nan: 2.14.2 + dev: false + /tiny-secp256k1/2.1.2: resolution: {integrity: sha512-8qPw7zDK6Hco2tVGYGQeOmOPp/hZnREwy2iIkcq0ygAuqc9WHo29vKN94lNymh1QbB3nthtAMF6KTIrdbsIotA==} engines: {node: '>=14.0.0'} @@ -22534,7 +22665,7 @@ packages: create-require: 1.1.1 diff: 4.0.2 make-error: 1.3.6 - source-map-support: 0.5.21 + source-map-support: 0.5.20 typescript: 4.5.2 yn: 3.1.1 dev: true @@ -23831,7 +23962,7 @@ packages: engines: {node: '>=12'} dev: false - /webpack-cli/4.9.1_311ee83d262c84b540260d22b1747cb3: + /webpack-cli/4.9.1_1007153fc50135f3f883eec27a3e61a8: resolution: {integrity: sha512-JYRFVuyFpzDxMDB+v/nanUdQYcZtqFPGzmlW4s+UkPMFhSpfRNmf1z4AwYcHJVdvEFAM7FFCQdNTpsBYhDLusQ==} engines: {node: '>=10.13.0'} hasBin: true @@ -23852,7 +23983,7 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.5 - '@webpack-cli/configtest': 1.1.0_webpack-cli@4.9.1+webpack@5.65.0 + '@webpack-cli/configtest': 1.1.0_webpack-cli@4.9.1+webpack@5.64.4 '@webpack-cli/info': 1.4.0_webpack-cli@4.9.1 '@webpack-cli/serve': 1.6.0_69695c7c9cf22b2285138f704ba481b9 colorette: 2.0.16 @@ -23862,8 +23993,8 @@ packages: import-local: 3.0.3 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.65.0 - webpack-dev-server: 4.6.0_webpack-cli@4.9.1+webpack@5.65.0 + webpack: 5.64.4_93fbbb02a3bda170b039a49a61f47e0a + webpack-dev-server: 4.6.0_webpack-cli@4.9.1+webpack@5.64.4 webpack-merge: 5.8.0 dev: true @@ -23896,7 +24027,7 @@ packages: webpack: 5.65.0 dev: true - /webpack-dev-middleware/5.2.2_webpack@5.65.0: + /webpack-dev-middleware/5.2.2_webpack@5.64.4: resolution: {integrity: sha512-DjZyYrsHhkikAFNvSNKrpnziXukU1EChFAh9j4LAm6ndPLPW8cN0KhM7T+RAiOqsQ6ABfQ8hoKIs9IWMTjov+w==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -23907,10 +24038,10 @@ packages: mime-types: 2.1.34 range-parser: 1.2.1 schema-utils: 4.0.0 - webpack: 5.65.0 + webpack: 5.64.4_93fbbb02a3bda170b039a49a61f47e0a dev: true - /webpack-dev-server/4.6.0_webpack-cli@4.9.1+webpack@5.65.0: + /webpack-dev-server/4.6.0_webpack-cli@4.9.1+webpack@5.64.4: resolution: {integrity: sha512-oojcBIKvx3Ya7qs1/AVWHDgmP1Xml8rGsEBnSobxU/UJSX1xP1GPM3MwsAnDzvqcVmVki8tV7lbcsjEjk0PtYg==} engines: {node: '>= 12.13.0'} hasBin: true @@ -23944,9 +24075,9 @@ packages: spdy: 4.0.2 strip-ansi: 7.0.1 url: 0.11.0 - webpack: 5.65.0 - webpack-cli: 4.9.1_311ee83d262c84b540260d22b1747cb3 - webpack-dev-middleware: 5.2.2_webpack@5.65.0 + webpack: 5.64.4_93fbbb02a3bda170b039a49a61f47e0a + webpack-cli: 4.9.1_1007153fc50135f3f883eec27a3e61a8 + webpack-dev-middleware: 5.2.2_webpack@5.64.4 ws: 8.3.0 transitivePeerDependencies: - bufferutil @@ -24000,13 +24131,13 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack-target-webextension/1.0.1_webpack@5.65.0: + /webpack-target-webextension/1.0.1_webpack@5.64.4: resolution: {integrity: sha512-S2wnCYD74gHVn7DgHuGeZMcRZhAWKg3uDkuPch3YsnDyhhSyM4zHlVWYd0nx6y6XrdpQimrtQMJmYtLJxmTY9w==} engines: {node: '>=14.17.6'} peerDependencies: webpack: ^5.0.0 dependencies: - webpack: 5.65.0 + webpack: 5.64.4_93fbbb02a3bda170b039a49a61f47e0a dev: true /webpack-virtual-modules/0.2.2: @@ -24086,6 +24217,46 @@ packages: webpack-sources: 1.4.3 dev: true + /webpack/5.64.4: + resolution: {integrity: sha512-LWhqfKjCLoYJLKJY8wk2C3h77i8VyHowG3qYNZiIqD6D0ZS40439S/KVuc/PY48jp2yQmy0mhMknq8cys4jFMw==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.1 + '@types/estree': 0.0.50 + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/wasm-edit': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + acorn: 8.6.0 + acorn-import-assertions: 1.8.0_acorn@8.6.0 + browserslist: 4.18.1 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.8.3 + es-module-lexer: 0.9.3 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.8 + json-parse-better-errors: 1.0.2 + loader-runner: 4.2.0 + mime-types: 2.1.34 + neo-async: 2.6.2 + schema-utils: 3.1.1 + tapable: 2.2.1 + terser-webpack-plugin: 5.2.5_acorn@8.6.0+webpack@5.64.4 + watchpack: 2.3.0 + webpack-sources: 3.2.2 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + /webpack/5.64.4_93fbbb02a3bda170b039a49a61f47e0a: resolution: {integrity: sha512-LWhqfKjCLoYJLKJY8wk2C3h77i8VyHowG3qYNZiIqD6D0ZS40439S/KVuc/PY48jp2yQmy0mhMknq8cys4jFMw==} engines: {node: '>=10.13.0'} @@ -24119,7 +24290,7 @@ packages: tapable: 2.2.1 terser-webpack-plugin: 5.2.5_30e1ca02d5697180a7a3162c0e819dbf watchpack: 2.3.0 - webpack-cli: 4.9.1_311ee83d262c84b540260d22b1747cb3 + webpack-cli: 4.9.1_1007153fc50135f3f883eec27a3e61a8 webpack-sources: 3.2.2 transitivePeerDependencies: - '@swc/core' From b5d86ccf3527510bd1edcc36676d2d2140078955 Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Sun, 12 Dec 2021 01:20:21 +0800 Subject: [PATCH 2/4] chore: remove cryptoartapi on D.Market --- packages/dashboard/src/pages/Labs/constants.ts | 1 - packages/dashboard/src/pages/Labs/index.tsx | 16 ++-------------- 2 files changed, 2 insertions(+), 15 deletions(-) diff --git a/packages/dashboard/src/pages/Labs/constants.ts b/packages/dashboard/src/pages/Labs/constants.ts index fdd9e875f6f3..84da37b752ee 100644 --- a/packages/dashboard/src/pages/Labs/constants.ts +++ b/packages/dashboard/src/pages/Labs/constants.ts @@ -14,7 +14,6 @@ export const PLUGIN_IDS = { MASK_BOX: 'com.maskbook.box', POOL_TOGETHER: 'com.pooltogether', GOOD_GHOSTING: 'co.good_ghosting', - CRYPTOARTAI: 'com.maskbook.cryptoartai', } type TUTORIAL_URLS_OPT = { diff --git a/packages/dashboard/src/pages/Labs/index.tsx b/packages/dashboard/src/pages/Labs/index.tsx index 983000e23de8..02f2e989c55c 100644 --- a/packages/dashboard/src/pages/Labs/index.tsx +++ b/packages/dashboard/src/pages/Labs/index.tsx @@ -1,4 +1,5 @@ import { useCallback, useEffect, useState } from 'react' +import { useLocation } from 'react-router-dom' import { Box } from '@mui/material' import { makeStyles, MaskColorVar } from '@masknet/theme' import { PageFrame } from '../../components/PageFrame' @@ -20,13 +21,10 @@ import { import { useDashboardI18N } from '../../locales' import MarketTrendSettingDialog from './components/MarketTrendSettingDialog' import { useAccount } from '@masknet/web3-shared-evm' -import { PluginMessages } from '../../API' +import { Services, PluginMessages } from '../../API' import { useRemoteControlledDialog } from '@masknet/shared' -import { Services } from '../../API' import { PLUGIN_IDS, TUTORIAL_URLS_EN } from './constants' -import { useLocation } from 'react-router-dom' import { ContentContainer } from '../../components/ContentContainer' -import { useLanguage } from '../Settings/api' import { WalletStateBar } from '../Wallets/components/WalletStateBar' import { PoolTogetherURL } from '../../assets' import { DHEDGEIcon } from '../../../../mask/src/resources/DHEDGEIcon' @@ -69,7 +67,6 @@ export default function Plugins() { [PLUGIN_IDS.MASK_BOX]: true, [PLUGIN_IDS.GOOD_GHOSTING]: true, [PLUGIN_IDS.POOL_TOGETHER]: true, - [PLUGIN_IDS.CRYPTOARTAI]: true, }) const plugins = [ @@ -172,17 +169,8 @@ export default function Plugins() { icon: , enabled: pluginStatus[PLUGIN_IDS.POOL_TOGETHER], }, - { - id: PLUGIN_IDS.POOL_TOGETHER, - title: t.labs_cryptoartai(), - desc: t.labs_cryptoartai_desc(), - icon: , - enabled: pluginStatus[PLUGIN_IDS.CRYPTOARTAI], - }, ] - const language = useLanguage() - const account = useAccount() const { setDialog: setBuyDialog } = useRemoteControlledDialog(PluginMessages.Transak.buyTokenDialogUpdated) const openTransakDialog = useCallback( From f8abcd650a867e455a3072260aa8241ee4f0bcb8 Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Sun, 12 Dec 2021 02:26:11 +0800 Subject: [PATCH 3/4] fix: the wrong collectible card link --- .../CollectibleList/CollectibleCard.tsx | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/packages/mask/src/extension/options-page/DashboardComponents/CollectibleList/CollectibleCard.tsx b/packages/mask/src/extension/options-page/DashboardComponents/CollectibleList/CollectibleCard.tsx index f63db136becc..c0513999714c 100644 --- a/packages/mask/src/extension/options-page/DashboardComponents/CollectibleList/CollectibleCard.tsx +++ b/packages/mask/src/extension/options-page/DashboardComponents/CollectibleList/CollectibleCard.tsx @@ -1,15 +1,9 @@ +import { useAsyncRetry } from 'react-use' import { Card, CircularProgress, Link } from '@mui/material' import { makeStyles } from '@masknet/theme' -import { - Wallet, - useChainId, - ERC721TokenDetailed, - resolveCollectibleLink, - NonFungibleAssetProvider, -} from '@masknet/web3-shared-evm' +import { Wallet, ERC721TokenDetailed, resolveCollectibleLink, NonFungibleAssetProvider } from '@masknet/web3-shared-evm' import { MaskSharpIconOfSize } from '../../../../resources/MaskIcon' import { ActionsBarNFT } from '../ActionsBarNFT' -import { useAsyncRetry } from 'react-use' import { Video } from '../../../../components/shared/Video' import { Image } from '../../../../components/shared/Image' @@ -51,12 +45,10 @@ export interface CollectibleCardProps { } const videoTypeRe = /\.(mp4|mp3|m4v|ogg)$/i -const videoMimeRe = /^video/ -const htmlMimeRe = /^text/ + export function CollectibleCard(props: CollectibleCardProps) { const { wallet, token, provider, readonly } = props const { classes } = useStyles() - const chainId = useChainId() const mediaUrl = token.info.mediaUrl const { loading, value } = useAsyncRetry(async () => { @@ -78,7 +70,7 @@ export function CollectibleCard(props: CollectibleCardProps) { ) : ( - + {readonly || !wallet ? null : ( From c4fd20c4c5d7ae3ca54bf11984326f7fda301078 Mon Sep 17 00:00:00 2001 From: guanbinrui Date: Wed, 15 Dec 2021 16:42:21 +0800 Subject: [PATCH 4/4] fix: lint errors --- packages/dashboard/.storybook/main.js | 2 +- .../DashboardComponents/CollectibleList/CollectibleCard.tsx | 5 ++++- packages/theme/.storybook/main.cjs | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/packages/dashboard/.storybook/main.js b/packages/dashboard/.storybook/main.js index 73f32a89ac95..c840e0f404f8 100644 --- a/packages/dashboard/.storybook/main.js +++ b/packages/dashboard/.storybook/main.js @@ -29,7 +29,7 @@ module.exports = { test: /\.m?js$/, type: 'javascript/auto', resolve: { - fullySpecified: false, // disable the behaviour + fullySpecified: false, }, }) diff --git a/packages/mask/src/extension/options-page/DashboardComponents/CollectibleList/CollectibleCard.tsx b/packages/mask/src/extension/options-page/DashboardComponents/CollectibleList/CollectibleCard.tsx index c0513999714c..fce271edfd8b 100644 --- a/packages/mask/src/extension/options-page/DashboardComponents/CollectibleList/CollectibleCard.tsx +++ b/packages/mask/src/extension/options-page/DashboardComponents/CollectibleList/CollectibleCard.tsx @@ -70,7 +70,10 @@ export function CollectibleCard(props: CollectibleCardProps) { ) : ( - + {readonly || !wallet ? null : ( diff --git a/packages/theme/.storybook/main.cjs b/packages/theme/.storybook/main.cjs index abcd87d2f8cc..99d5b45214de 100644 --- a/packages/theme/.storybook/main.cjs +++ b/packages/theme/.storybook/main.cjs @@ -19,7 +19,7 @@ module.exports = { test: /\.m?js$/, type: 'javascript/auto', resolve: { - fullySpecified: false, // disable the behaviour + fullySpecified: false, }, }) return config