From 0468719f9f846c5c45189cd59ccc5e741153d91b Mon Sep 17 00:00:00 2001 From: turnoffthiscomputer <98749896+remicolin@users.noreply.github.com> Date: Mon, 23 Jun 2025 07:01:23 -0400 Subject: [PATCH] App/eu id updates (#638) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix build issues * generate disclosure proof with euids * generate disclosure proof with euids * Eu id updates 2 (#648) * update vc_and_disclose_id test (dev branch) (#641) * fix: vc_and_disclose_id test * chore: yarn prettier * Show modal on NFC scan error (#642) * Add help button and error modal actions * fix the screen management * yarn nice * Bump build v2.5.4: ios 132; android 71 (#631) * bump version and build numbers * remove tamagui/toast * fix marketing version * fix: update TD1 and TD3 checks (#643) * bum yarn.lock * add version and user defined data --------- Co-authored-by: Vishalkulkarni45 <109329073+Vishalkulkarni45@users.noreply.github.com> Co-authored-by: Justin Hernandez Co-authored-by: Seshanth.S🐺 <35675963+seshanthS@users.noreply.github.com> * remove the mock user define data * get the useridentifier as a hash from the user defined data * chore: add version and userDefinedData * feat: use the version in register / dsc proofs as well * update calculateUserIdentifierHash * yarn nice * refactor: consolidate user context data handling and update payload structure * fix typing issues on sha1 * remove console.log(sha1) * fix sha1 import * refactor: streamline userDefinedData handling and adjust payload type for circuit * refactor: update sha1 usage and enhance logging in calculateUserIdentifierHash * yarn nice * yarn lint common * use ts-ignore for sha1 import * fix app ci tests * fix typing issue * remove unused ts-ignore * cast uuid before calling generateinputs * bump qrcode version * add tsup on the qrcode sdk * fix: exports on selfxyz/qrcode * update how we define config.version * fix yarn imports * yarn format --------- Co-authored-by: Vishalkulkarni45 <109329073+Vishalkulkarni45@users.noreply.github.com> Co-authored-by: Justin Hernandez Co-authored-by: Seshanth.S🐺 <35675963+seshanthS@users.noreply.github.com> Co-authored-by: Ayman --- app/jest.config.cjs | 2 +- app/jest.setup.js | 8 + app/package.json | 1 + app/src/screens/prove/ProveScreen.tsx | 25 + app/src/utils/ethers.ts | 1 - app/src/utils/proving/provingInputs.ts | 110 ++- app/src/utils/proving/provingMachine.ts | 50 +- app/src/utils/proving/provingUtils.ts | 44 +- app/src/utils/proving/validateDocument.ts | 11 +- .../tests/disclose/vc_and_disclose.test.ts | 3 +- .../tests/disclose/vc_and_disclose_id.test.ts | 3 +- common/.npmignore | 2 + common/bun.lockb | Bin 116866 -> 0 bytes common/index.ts | 3 + common/package.json | 8 +- common/src/utils/appType.ts | 7 + common/src/utils/circuits/generateInputs.ts | 5 +- common/src/utils/circuits/uuid.ts | 1 - common/src/utils/hash.ts | 34 + sdk/qrcode/components/SelfQRcode.tsx | 7 +- sdk/qrcode/index.ts | 5 +- sdk/qrcode/package.json | 20 +- sdk/qrcode/tsconfig.json | 4 +- sdk/qrcode/tsup.config.ts | 15 + yarn.lock | 625 +++++++++++++++++- 25 files changed, 881 insertions(+), 113 deletions(-) create mode 100644 common/.npmignore delete mode 100755 common/bun.lockb create mode 100644 sdk/qrcode/tsup.config.ts diff --git a/app/jest.config.cjs b/app/jest.config.cjs index 2c1879676..18468c601 100644 --- a/app/jest.config.cjs +++ b/app/jest.config.cjs @@ -2,7 +2,7 @@ module.exports = { preset: 'react-native', moduleFileExtensions: ['ts', 'tsx', 'js', 'jsx', 'json', 'node'], transformIgnorePatterns: [ - 'node_modules/(?!(react-native|@react-native|@react-navigation|@react-native-community|@segment/analytics-react-native|@openpassport|react-native-keychain|react-native-check-version|react-native-nfc-manager|react-native-passport-reader|uuid|@stablelib|@react-native-google-signin|react-native-cloud-storage|@react-native-clipboard|@react-native-firebase)/)', + 'node_modules/(?!(react-native|@react-native|@react-navigation|@react-native-community|@segment/analytics-react-native|@openpassport|react-native-keychain|react-native-check-version|react-native-nfc-manager|react-native-passport-reader|react-native-gesture-handler|uuid|@stablelib|@react-native-google-signin|react-native-cloud-storage|@react-native-clipboard|@react-native-firebase)/)', ], setupFiles: ['/jest.setup.js'], testRegex: '(/__tests__/.*|(\\.|/)(test|spec))\\.[jt]sx?$', diff --git a/app/jest.setup.js b/app/jest.setup.js index 30f36de6f..0f304e48d 100644 --- a/app/jest.setup.js +++ b/app/jest.setup.js @@ -47,6 +47,11 @@ jest.mock('@segment/analytics-react-native', () => { reset: jest.fn(), }; + // Mock flush policy classes + const MockFlushPolicy = class { + constructor() {} + }; + return { createClient: jest.fn(() => mockClient), EventPlugin: jest.fn(), @@ -54,7 +59,10 @@ jest.mock('@segment/analytics-react-native', () => { ENRICHMENT: 'enrichment', DESTINATION: 'destination', BEFORE: 'before', + before: 'before', }, + StartupFlushPolicy: MockFlushPolicy, + BackgroundFlushPolicy: MockFlushPolicy, }; }); diff --git a/app/package.json b/app/package.json index beaea521e..091917b98 100644 --- a/app/package.json +++ b/app/package.json @@ -39,6 +39,7 @@ "install-app:setup": "yarn install && yarn build:deps && cd ios && bundle install && cd ..", "ios": "react-native run-ios", "ios:fastlane-debug": "yarn reinstall && bundle exec fastlane --verbose ios internal_test", + "setup": "yarn clean:build && yarn install && yarn build:deps && cd ios && bundle install && bundle exec pod install --repo-update && cd .. && yarn clean:xcode-env-local", "lint": "eslint .", "lint:fix": "eslint --fix .", "nice": "yarn lint:fix && yarn fmt:fix", diff --git a/app/src/screens/prove/ProveScreen.tsx b/app/src/screens/prove/ProveScreen.tsx index ec1959251..bed40977f 100644 --- a/app/src/screens/prove/ProveScreen.tsx +++ b/app/src/screens/prove/ProveScreen.tsx @@ -233,6 +233,31 @@ const ProveScreen: React.FC = () => { onLayout={handleScrollViewLayout} > + + {/* Display userDefinedData if it exists */} + {selectedApp?.userDefinedData && ( + + + Additional Information: + + + + {selectedApp.userDefinedData} + + + + )} + { return crypto.createHmac(algo, key).update(data).digest(); }); -// @ts-expect-error ethers.pbkdf2.register((passwd, salt, iter, keylen, algo) => { return crypto.pbkdf2Sync(passwd, salt, iter, keylen, algo); }); diff --git a/app/src/utils/proving/provingInputs.ts b/app/src/utils/proving/provingInputs.ts index 698d40524..261f5b39d 100644 --- a/app/src/utils/proving/provingInputs.ts +++ b/app/src/utils/proving/provingInputs.ts @@ -2,8 +2,12 @@ import { LeanIMT } from '@openpassport/zk-kit-lean-imt'; import { SMT } from '@openpassport/zk-kit-smt'; import { attributeToPosition, + attributeToPosition_ID, DEFAULT_MAJORITY, + DocumentCategory, + ID_CARD_ATTESTATION_ID, PASSPORT_ATTESTATION_ID, + SelfAppDisclosureConfig, } from '@selfxyz/common'; import { SelfApp } from '@selfxyz/common'; import { getCircuitNameFromPassportData } from '@selfxyz/common'; @@ -13,9 +17,12 @@ import { generateCircuitInputsVCandDisclose, } from '@selfxyz/common'; import { hashEndpointWithScope } from '@selfxyz/common'; +import { calculateUserIdentifierHash } from '@selfxyz/common'; import { PassportData } from '@selfxyz/common'; import nameAndDobSMTData from '@selfxyz/common/ofacdata/outputs/nameAndDobSMT.json'; +import nameAndDobSMTDataID from '@selfxyz/common/ofacdata/outputs/nameAndDobSMT_ID.json'; import nameAndYobSMTData from '@selfxyz/common/ofacdata/outputs/nameAndYobSMT.json'; +import nameAndYobSMTDataID from '@selfxyz/common/ofacdata/outputs/nameAndYobSMT_ID.json'; import passportNoAndNationalitySMTData from '@selfxyz/common/ofacdata/outputs/passportNoAndNationalitySMT.json'; import { poseidon2 } from 'poseidon-lite'; @@ -55,19 +62,17 @@ export function generateTEEInputsDisclose( passportData: PassportData, selfApp: SelfApp, ) { - const { scope, userId, disclosures, endpoint } = selfApp; + const { scope, disclosures, endpoint, userId, userDefinedData, chainID } = + selfApp; + const userIdentifierHash = calculateUserIdentifierHash( + chainID, + userId, + userDefinedData, + ); const scope_hash = hashEndpointWithScope(endpoint, scope); - const selector_dg1 = Array(88).fill('0'); - Object.entries(disclosures).forEach(([attribute, reveal]) => { - if (['ofac', 'excludedCountries', 'minimumAge'].includes(attribute)) { - return; - } - if (reveal) { - const [start, end] = - attributeToPosition[attribute as keyof typeof attributeToPosition]; - selector_dg1.fill('1', start, end + 1); - } - }); + const document: DocumentCategory = passportData.documentCategory; + + const selector_dg1 = getSelectorDg1(document, disclosures); const majority = disclosures.minimumAge ? disclosures.minimumAge.toString() @@ -76,14 +81,18 @@ export function generateTEEInputsDisclose( const selector_ofac = disclosures.ofac ? 1 : 0; - const { passportNoAndNationalitySMT, nameAndDobSMT, nameAndYobSMT } = - getOfacSMTs(); - const serialized_tree = useProtocolStore.getState().passport.commitment_tree; + const { + passportNoAndNationalitySMT, + nameAndDobSMT, + nameAndYobSMT, + nameAndDobSMTID, + nameAndYobSMTID, + } = getOfacSMTs(); + const serialized_tree = useProtocolStore.getState()[document].commitment_tree; const tree = LeanIMT.import((a, b) => poseidon2([a, b]), serialized_tree); - const inputs = generateCircuitInputsVCandDisclose( secret, - PASSPORT_ATTESTATION_ID, + document === 'passport' ? PASSPORT_ATTESTATION_ID : ID_CARD_ATTESTATION_ID, passportData, scope_hash, selector_dg1, @@ -91,15 +100,18 @@ export function generateTEEInputsDisclose( tree, majority, passportNoAndNationalitySMT, - nameAndDobSMT, - nameAndYobSMT, + document === 'passport' ? nameAndDobSMT : nameAndDobSMTID, + document === 'passport' ? nameAndYobSMT : nameAndYobSMTID, selector_ofac, disclosures.excludedCountries ?? [], - userId, + userIdentifierHash.toString(), ); return { inputs, - circuitName: 'vc_and_disclose', + circuitName: + passportData.documentCategory === 'passport' + ? 'vc_and_disclose' + : 'vc_and_disclose_id', endpointType: selfApp.endpointType, endpoint: selfApp.endpoint, }; @@ -115,5 +127,59 @@ function getOfacSMTs() { nameAndDobSMT.import(nameAndDobSMTData); const nameAndYobSMT = new SMT(poseidon2, true); nameAndYobSMT.import(nameAndYobSMTData); - return { passportNoAndNationalitySMT, nameAndDobSMT, nameAndYobSMT }; + const nameAndDobSMTID = new SMT(poseidon2, true); + nameAndDobSMTID.import(nameAndDobSMTDataID); + const nameAndYobSMTID = new SMT(poseidon2, true); + nameAndYobSMTID.import(nameAndYobSMTDataID); + return { + passportNoAndNationalitySMT, + nameAndDobSMT, + nameAndYobSMT, + nameAndDobSMTID, + nameAndYobSMTID, + }; +} + +function getSelectorDg1( + document: DocumentCategory, + disclosures: SelfAppDisclosureConfig, +) { + switch (document) { + case 'passport': + return getSelectorDg1Passport(disclosures); + case 'id_card': + return getSelectorDg1IdCard(disclosures); + } +} + +function getSelectorDg1Passport(disclosures: SelfAppDisclosureConfig) { + const selector_dg1 = Array(88).fill('0'); + Object.entries(disclosures).forEach(([attribute, reveal]) => { + if (['ofac', 'excludedCountries', 'minimumAge'].includes(attribute)) { + return; + } + if (reveal) { + const [start, end] = + attributeToPosition[attribute as keyof typeof attributeToPosition]; + selector_dg1.fill('1', start, end + 1); + } + }); + return selector_dg1; +} + +function getSelectorDg1IdCard(disclosures: SelfAppDisclosureConfig) { + const selector_dg1 = Array(90).fill('0'); + Object.entries(disclosures).forEach(([attribute, reveal]) => { + if (['ofac', 'excludedCountries', 'minimumAge'].includes(attribute)) { + return; + } + if (reveal) { + const [start, end] = + attributeToPosition_ID[ + attribute as keyof typeof attributeToPosition_ID + ]; + selector_dg1.fill('1', start, end + 1); + } + }); + return selector_dg1; } diff --git a/app/src/utils/proving/provingMachine.ts b/app/src/utils/proving/provingMachine.ts index 4d7fd5afb..a7c042cb3 100644 --- a/app/src/utils/proving/provingMachine.ts +++ b/app/src/utils/proving/provingMachine.ts @@ -1,7 +1,11 @@ -import { WS_RPC_URL_VC_AND_DISCLOSE } from '@selfxyz/common'; -import { EndpointType, SelfApp } from '@selfxyz/common'; -import { getCircuitNameFromPassportData } from '@selfxyz/common'; -import { DocumentCategory, PassportData } from '@selfxyz/common'; +import { + DocumentCategory, + EndpointType, + getCircuitNameFromPassportData, + getSolidityPackedUserContextData, + PassportData, + SelfApp, +} from '@selfxyz/common'; import forge from 'node-forge'; import io, { Socket } from 'socket.io-client'; import { v4 } from 'uuid'; @@ -582,6 +586,7 @@ export const useProvingStore = create((set, get) => { actor!.send({ type: 'VALIDATION_SUCCESS' }); return; } else { + console.log('Passport is not registered with local CSCA'); actor!.send({ type: 'PASSPORT_DATA_NOT_FOUND' }); return; } @@ -634,26 +639,24 @@ export const useProvingStore = create((set, get) => { let circuitName, wsRpcUrl; if (get().circuitType === 'disclose') { circuitName = 'disclose'; - wsRpcUrl = WS_RPC_URL_VC_AND_DISCLOSE; + if (passportData.documentCategory === 'passport') { + wsRpcUrl = circuitsMapping?.DISCLOSE?.[circuitName]; + } else { + wsRpcUrl = circuitsMapping?.DISCLOSE_ID?.[circuitName]; + } } else { circuitName = getCircuitNameFromPassportData( passportData, get().circuitType as 'register' | 'dsc', ); if (get().circuitType === 'register') { - if ( - passportData.documentType === 'passport' || - passportData.documentType === 'mock_passport' - ) { + if (passportData.documentCategory === 'passport') { wsRpcUrl = circuitsMapping?.REGISTER?.[circuitName]; } else { wsRpcUrl = circuitsMapping?.REGISTER_ID?.[circuitName]; } } else { - if ( - passportData.documentType === 'passport' || - passportData.documentType === 'mock_passport' - ) { + if (passportData.documentCategory === 'passport') { wsRpcUrl = circuitsMapping?.DSC?.[circuitName]; } else { wsRpcUrl = circuitsMapping?.DSC_ID?.[circuitName]; @@ -664,7 +667,9 @@ export const useProvingStore = create((set, get) => { actor?.send({ type: 'CONNECT_ERROR' }); throw new Error('Could not determine circuit name'); } + if (!wsRpcUrl) { + actor?.send({ type: 'CONNECT_ERROR' }); throw new Error('No WebSocket URL available for TEE connection'); } @@ -797,7 +802,11 @@ export const useProvingStore = create((set, get) => { const document: DocumentCategory = passportData.documentCategory; const selfApp = useSelfAppStore.getState().selfApp; // TODO: according to the circuitType we could check that the params are valid. - let inputs, circuitName, endpointType, endpoint; + let inputs, + circuitName, + endpointType, + endpoint, + circuitTypeWithDocumentExtension; const protocolStore = useProtocolStore.getState(); switch (circuitType) { case 'register': @@ -807,6 +816,7 @@ export const useProvingStore = create((set, get) => { passportData, protocolStore[document].dsc_tree, )); + circuitTypeWithDocumentExtension = `${circuitType}${document === 'passport' ? '' : '_id'}`; break; case 'dsc': ({ inputs, circuitName, endpointType, endpoint } = @@ -814,6 +824,7 @@ export const useProvingStore = create((set, get) => { passportData, protocolStore[document].csca_tree as string[][], )); + circuitTypeWithDocumentExtension = `${circuitType}${document === 'passport' ? '' : '_id'}`; break; case 'disclose': ({ inputs, circuitName, endpointType, endpoint } = @@ -822,12 +833,19 @@ export const useProvingStore = create((set, get) => { passportData, selfApp as SelfApp, )); + circuitTypeWithDocumentExtension = `disclose`; break; default: console.error('Invalid circuit type:' + circuitType); throw new Error('Invalid circuit type:' + circuitType); } - let circuitTypeWithDocumentExtension = `${circuitType}${document === 'passport' ? '' : '_id'}`; + const userDefinedData = selfApp?.userDefinedData + ? getSolidityPackedUserContextData( + selfApp.chainID, + selfApp.userId, + selfApp.userDefinedData, + ).slice(2) + : ''; const payload = getPayload( inputs, circuitTypeWithDocumentExtension as @@ -838,6 +856,8 @@ export const useProvingStore = create((set, get) => { circuitName as string, endpointType as EndpointType, endpoint as string, + selfApp?.version, + userDefinedData, ); const forgeKey = forge.util.createBuffer( sharedKey?.toString('binary') as string, diff --git a/app/src/utils/proving/provingUtils.ts b/app/src/utils/proving/provingUtils.ts index f207b0af0..d3256d576 100644 --- a/app/src/utils/proving/provingUtils.ts +++ b/app/src/utils/proving/provingUtils.ts @@ -32,37 +32,49 @@ export function encryptAES256GCM( }; } -export type TEEPayloadDisclose = { - type: 'disclose'; - endpointType: string; - endpoint: string; - onchain: boolean; +type RegisterSuffixes = '' | '_id'; +type DscSuffixes = '' | '_id'; +type DiscloseSuffixes = '' | '_id'; +type ProofTypes = 'register' | 'dsc' | 'disclose'; +type RegisterProofType = + `${Extract}${RegisterSuffixes}`; +type DscProofType = `${Extract}${DscSuffixes}`; +type DiscloseProofType = + `${Extract}${DiscloseSuffixes}`; + +export type TEEPayloadBase = { + endpointType: EndpointType; circuit: { name: string; inputs: string; }; }; -export type TEEPayload = { - type: 'register' | 'dsc' | 'register_id' | 'dsc_id'; +export type TEEPayload = TEEPayloadBase & { + type: RegisterProofType | DscProofType; onchain: true; - endpointType: string; - circuit: { - name: string; - inputs: string; - }; +}; + +export type TEEPayloadDisclose = TEEPayloadBase & { + type: DiscloseProofType; + onchain: boolean; + endpoint: string; + userDefinedData: string; + version: number; }; export function getPayload( inputs: any, - circuitType: 'register' | 'dsc' | 'disclose' | 'register_id' | 'dsc_id', + circuitType: RegisterProofType | DscProofType | DiscloseProofType, circuitName: string, endpointType: EndpointType, endpoint: string, + version: number = 1, + userDefinedData: string = '', ) { if (circuitType === 'disclose') { const payload: TEEPayloadDisclose = { - type: 'disclose', + type: circuitName === 'vc_and_disclose' ? 'disclose' : 'disclose_id', endpointType: endpointType, endpoint: endpoint, onchain: endpointType === 'celo' ? true : false, @@ -70,11 +82,13 @@ export function getPayload( name: circuitName, inputs: JSON.stringify(inputs), }, + version, + userDefinedData, }; return payload; } else { const payload: TEEPayload = { - type: circuitType as 'register' | 'dsc' | 'register_id' | 'dsc_id', + type: circuitType as RegisterProofType | DscProofType, onchain: true, endpointType: endpointType, circuit: { diff --git a/app/src/utils/proving/validateDocument.ts b/app/src/utils/proving/validateDocument.ts index de812c002..1f0ffda94 100644 --- a/app/src/utils/proving/validateDocument.ts +++ b/app/src/utils/proving/validateDocument.ts @@ -7,6 +7,7 @@ import { getCircuitNameFromPassportData, getLeafDscTree, Hash, + ID_CARD_ATTESTATION_ID, parseCertificateSimple, PASSPORT_ATTESTATION_ID, type PassportData, @@ -78,11 +79,11 @@ export async function isUserRegistered( if (!passportData) { return false; } - const commitment = generateCommitment( - secret, - PASSPORT_ATTESTATION_ID, - passportData, - ); + const attestationId = + passportData.documentCategory === 'passport' + ? PASSPORT_ATTESTATION_ID + : ID_CARD_ATTESTATION_ID; + const commitment = generateCommitment(secret, attestationId, passportData); const document: DocumentCategory = passportData.documentCategory; const serializedTree = useProtocolStore.getState()[document].commitment_tree; const tree = LeanIMT.import((a, b) => poseidon2([a, b]), serializedTree); diff --git a/circuits/tests/disclose/vc_and_disclose.test.ts b/circuits/tests/disclose/vc_and_disclose.test.ts index a267f20fd..3efb55f77 100644 --- a/circuits/tests/disclose/vc_and_disclose.test.ts +++ b/circuits/tests/disclose/vc_and_disclose.test.ts @@ -20,6 +20,7 @@ import { genAndInitMockPassportData } from '@selfxyz/common/utils/passports/genM import { generateCommitment } from '@selfxyz/common/utils/passports/passport'; import { hashEndpointWithScope } from '@selfxyz/common/utils/scope'; import { fileURLToPath } from 'url'; +import { castFromUUID } from '@selfxyz/common/utils/circuits/uuid'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); @@ -40,7 +41,7 @@ describe('Disclose', function () { const secret = BigInt(Math.floor(Math.random() * Math.pow(2, 254))).toString(); const majority = '18'; - const user_identifier = crypto.randomUUID(); + const user_identifier = castFromUUID(crypto.randomUUID()); const selector_dg1 = Array(88).fill('1'); const selector_older_than = '1'; const endpoint = 'https://example.com'; diff --git a/circuits/tests/disclose/vc_and_disclose_id.test.ts b/circuits/tests/disclose/vc_and_disclose_id.test.ts index f64201875..215d7f99e 100644 --- a/circuits/tests/disclose/vc_and_disclose_id.test.ts +++ b/circuits/tests/disclose/vc_and_disclose_id.test.ts @@ -22,6 +22,7 @@ import { generateCommitment } from '@selfxyz/common/utils/passports/passport'; import { hashEndpointWithScope } from '@selfxyz/common/utils/scope'; import { genMockIdDocAndInitDataParsing } from '@selfxyz/common/utils/passports/genMockIdDoc'; import { fileURLToPath } from 'url'; +import { castFromUUID } from '@selfxyz/common/utils/circuits/uuid'; const __dirname = path.dirname(fileURLToPath(import.meta.url)); @@ -38,7 +39,7 @@ describe('Disclose', function () { const secret = BigInt(Math.floor(Math.random() * Math.pow(2, 254))).toString(); const majority = '18'; - const user_identifier = crypto.randomUUID(); + const user_identifier = castFromUUID(crypto.randomUUID()); const selector_dg1 = Array(90).fill('1'); const selector_older_than = '1'; const endpoint = 'https://example.com'; diff --git a/common/.npmignore b/common/.npmignore new file mode 100644 index 000000000..ed249baa3 --- /dev/null +++ b/common/.npmignore @@ -0,0 +1,2 @@ +dist/cjs/tsconfig.cjs.tsbuildinfo +dist/esm/tsconfig.tsbuildinfo diff --git a/common/bun.lockb b/common/bun.lockb deleted file mode 100755 index fd073df765eda1367286aaa0bb5e9ed7bde83d00..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 116866 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 I{}2EBFMUF`UjP6A diff --git a/common/index.ts b/common/index.ts index 83e58705c..64436e254 100644 --- a/common/index.ts +++ b/common/index.ts @@ -28,6 +28,7 @@ export { getSKIPEM } from './src/utils/csca.js'; export { formatMrz } from './src/utils/passports/format.js'; export { getCircuitNameFromPassportData } from './src/utils/circuits/circuitsName.js'; import * as Hash from './src/utils/hash.js'; +import { calculateUserIdentifierHash, getSolidityPackedUserContextData } from './src/utils/hash.js'; export * from './src/constants/countries.js'; export * from './src/constants/constants.js'; export * from './src/utils/appType.js'; @@ -63,4 +64,6 @@ export { genMockIdDoc, genMockIdDocAndInitDataParsing, buildSMT, + calculateUserIdentifierHash, + getSolidityPackedUserContextData, }; diff --git a/common/package.json b/common/package.json index 13909cfeb..a237e3cac 100644 --- a/common/package.json +++ b/common/package.json @@ -1,6 +1,6 @@ { "name": "@selfxyz/common", - "version": "0.0.3", + "version": "0.0.5", "description": "Constants and utils for self sdks", "license": "MIT", "author": "@Selfxyz Team", @@ -34,12 +34,12 @@ "module": "./dist/esm/index.js", "types": "./dist/esm/index.d.ts", "files": [ - "dist/cjs", - "dist/esm", + "dist/**/*", "src/mock_certificates" ], "scripts": { "build": "tsc -p tsconfig.json && tsc -p tsconfig.cjs.json && yarn postbuild", + "test-base": "yarn ts-mocha -n import=tsx --max-old-space-size=8192 --paths -p tsconfig.json", "postbuild": "node ./scripts/post-build.mjs", "format": "prettier --write .", "lint": "prettier --check .", @@ -60,6 +60,7 @@ "country-emoji": "^1.5.6", "country-iso-3-to-2": "^1.1.1", "elliptic": "^6.5.5", + "ethers": "^6.14.4", "fs": "^0.0.1-security", "i18n-iso-countries": "^7.13.0", "js-sha1": "^0.7.0", @@ -76,6 +77,7 @@ "uuid": "^11.0.5" }, "devDependencies": { + "@types/js-sha1": "^0.6.3", "@types/node-forge": "^1.3.10", "mocha": "^10.7.3", "prettier": "^3.3.3", diff --git a/common/src/utils/appType.ts b/common/src/utils/appType.ts index d9efcae1a..100c98914 100644 --- a/common/src/utils/appType.ts +++ b/common/src/utils/appType.ts @@ -7,6 +7,7 @@ import { v4 } from 'uuid'; import { REDIRECT_URL } from '../constants/constants.js'; import { Country3LetterCode } from '../constants/countries.js'; import { formatEndpoint } from './scope.js'; + export interface SelfApp { appName: string; logoBase64: string; @@ -19,6 +20,9 @@ export interface SelfApp { userIdType: UserIdType; devMode: boolean; disclosures: SelfAppDisclosureConfig; + version: number; + chainID: 42220 | 44787; + userDefinedData: string; } export interface SelfAppDisclosureConfig { @@ -92,6 +96,9 @@ export class SelfAppBuilder { header: '', logoBase64: '', disclosures: {}, + chainID: config.endpointType === 'staging_celo' ? 44787 : 42220, + version: config.version ?? 2, + userDefinedData: '', ...config, } as SelfApp; } diff --git a/common/src/utils/circuits/generateInputs.ts b/common/src/utils/circuits/generateInputs.ts index 5b47b1401..4f862b175 100644 --- a/common/src/utils/circuits/generateInputs.ts +++ b/common/src/utils/circuits/generateInputs.ts @@ -35,7 +35,7 @@ import { } from '../trees.js'; import { PassportData } from '../types.js'; import { formatCountriesList } from './formatInputs.js'; -import { castFromUUID, stringToAsciiBigIntArray } from './uuid.js'; +import { stringToAsciiBigIntArray } from './uuid.js'; export function generateCircuitInputsDSC( passportData: PassportData, @@ -245,7 +245,6 @@ export function generateCircuitInputsVCandDisclose( }; } } - // Build Final Input Object const baseInputs = { secret: formatInput(secret), @@ -262,7 +261,7 @@ export function generateCircuitInputsVCandDisclose( scope: formatInput(scope), current_date: formatInput(getCurrentDateYYMMDD()), majority: formatInput(majority_ascii), - user_identifier: formatInput(castFromUUID(user_identifier)), + user_identifier: formatInput(user_identifier), selector_ofac: formatInput(selector_ofac), forbidden_countries_list: formatInput(formatCountriesList(forbidden_countries_list)), }; diff --git a/common/src/utils/circuits/uuid.ts b/common/src/utils/circuits/uuid.ts index ddadbe541..c6c714cab 100644 --- a/common/src/utils/circuits/uuid.ts +++ b/common/src/utils/circuits/uuid.ts @@ -1,5 +1,4 @@ export type UserIdType = 'hex' | 'uuid'; - /// UUID function hexToBigInt(hex: string): bigint { return BigInt(`0x${hex}`); diff --git a/common/src/utils/hash.ts b/common/src/utils/hash.ts index 5850b0a92..362c66d21 100644 --- a/common/src/utils/hash.ts +++ b/common/src/utils/hash.ts @@ -17,10 +17,12 @@ import { poseidon16, } from 'poseidon-lite'; import { sha224, sha256 } from 'js-sha256'; +// @ts-ignore - ESLint incorrectly flags this as needing default import, but TypeScript definitions use named export import { sha1 } from 'js-sha1'; import { sha384, sha512 } from 'js-sha512'; import { hexToSignedBytes, packBytesArray } from './bytes.js'; import * as forge from 'node-forge'; +import { ethers } from 'ethers'; export function flexiblePoseidon(inputs: bigint[]): bigint { switch (inputs.length) { @@ -150,3 +152,35 @@ export function packBytesAndPoseidon(unpacked: number[]) { const packed = packBytesArray(unpacked); return customHasher(packed.map(String)).toString(); } + +export function calculateUserIdentifierHash( + destChainID: number, + userID: string, + userDefinedData: string +): BigInt { + const solidityPackedUserContextData = getSolidityPackedUserContextData( + destChainID, + userID, + userDefinedData + ); + const inputBytes = Buffer.from(solidityPackedUserContextData.slice(2), 'hex'); + const sha256Hash = ethers.sha256(inputBytes); + const ripemdHash = ethers.ripemd160(sha256Hash); + return BigInt(ripemdHash); +} + +export function getSolidityPackedUserContextData( + destChainID: number, + userID: string, + userDefinedData: string +): string { + const userIdHex = userID.replace(/-/g, ''); + return ethers.solidityPacked( + ['bytes32', 'bytes32', 'bytes'], + [ + ethers.zeroPadValue(ethers.toBeHex(destChainID), 32), + ethers.zeroPadValue('0x' + userIdHex, 32), + ethers.toUtf8Bytes(userDefinedData), + ] + ); +} diff --git a/sdk/qrcode/components/SelfQRcode.tsx b/sdk/qrcode/components/SelfQRcode.tsx index adcc2391c..92f3c0517 100644 --- a/sdk/qrcode/components/SelfQRcode.tsx +++ b/sdk/qrcode/components/SelfQRcode.tsx @@ -1,8 +1,8 @@ import React, { useEffect, useState, useRef } from 'react'; import { BounceLoader } from 'react-spinners'; import Lottie from 'lottie-react'; -import CHECK_ANIMATION from '../animations/check_animation.json'; -import X_ANIMATION from '../animations/x_animation.json'; +import CHECK_ANIMATION from '../animations/check_animation.json' with { type: 'json' }; +import X_ANIMATION from '../animations/x_animation.json' with { type: 'json' }; import LED from './LED.js'; import { REDIRECT_URL, @@ -19,9 +19,10 @@ import { QRCodeSVG } from 'qrcode.react'; import { initWebSocket } from '../utils/websocket.js'; import { getUniversalLink, - SelfApp, SelfAppBuilder, } from '@selfxyz/common/utils/appType'; +import type { SelfApp } from '@selfxyz/common/utils/appType'; + interface SelfQRcodeProps { selfApp: SelfApp; onSuccess: () => void; diff --git a/sdk/qrcode/index.ts b/sdk/qrcode/index.ts index aa46f5938..72dcdb40a 100644 --- a/sdk/qrcode/index.ts +++ b/sdk/qrcode/index.ts @@ -1,12 +1,13 @@ import SelfQRcodeWrapper, { SelfQRcode, - SelfApp, SelfAppBuilder, } from './components/SelfQRcode.js'; +import type { SelfApp } from './components/SelfQRcode.js'; import { WebAppInfo } from './utils/websocket.js'; import { countries } from '@selfxyz/common/constants/countries'; export default SelfQRcodeWrapper; -export { SelfQRcodeWrapper, SelfQRcode, SelfApp, SelfAppBuilder, countries }; +export { SelfQRcodeWrapper, SelfQRcode, SelfAppBuilder, countries }; +export type { SelfApp }; export type { WebAppInfo }; diff --git a/sdk/qrcode/package.json b/sdk/qrcode/package.json index 030b7a161..1b7bf4814 100644 --- a/sdk/qrcode/package.json +++ b/sdk/qrcode/package.json @@ -1,6 +1,6 @@ { "name": "@selfxyz/qrcode", - "version": "0.0.19", + "version": "1.0.8", "repository": { "type": "git", "url": "https://github.com/selfxyz/self" @@ -9,23 +9,28 @@ "author": "turnoffthiscomputer", "type": "module", "exports": { - ".": "./dist/index.js" + ".": { + "import": "./dist/index.js", + "require": "./dist/index.cjs", + "types": "./dist/index.d.cts" + } }, - "main": "dist/index.js", - "types": "dist/index.d.ts", + "main": "dist/index.cjs", + "module": "dist/index.js", + "types": "dist/index.d.cts", "files": [ "dist" ], "scripts": { - "build": "tsc --build", - "build:deps": "yarn workspaces foreach --from @selfxyz/qrcode --topological-dev --recursive run build", "format": "prettier --write .", "install-sdk": "yarn workspace focus @selfxyz/qrcode", "lint": "prettier --check .", "prepublishOnly": "yarn build", "publish": "yarn npm publish --access public", "test": "echo 'no tests found'", - "types": "yarn build" + "types": "yarn build", + "build": "tsup --config tsup.config.ts", + "build:deps": "yarn workspaces foreach --from @selfxyz/qrcode --topological-dev --recursive run build" }, "dependencies": { "@selfxyz/common": "workspace:^", @@ -38,6 +43,7 @@ "qrcode.react": "^4.1.0", "react-spinners": "^0.14.1", "socket.io-client": "^4.8.1", + "tsup": "^8.5.0", "uuid": "^10.0.0" }, "devDependencies": { diff --git a/sdk/qrcode/tsconfig.json b/sdk/qrcode/tsconfig.json index 106c15165..a5b78312c 100644 --- a/sdk/qrcode/tsconfig.json +++ b/sdk/qrcode/tsconfig.json @@ -1,7 +1,7 @@ { "compilerOptions": { "target": "ES2020", - "module": "Node16", + "module": "NodeNext", "declaration": true, "declarationDir": "./dist", "outDir": "./dist", @@ -11,7 +11,7 @@ "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, "jsx": "react", - "moduleResolution": "node16" + "moduleResolution": "NodeNext" }, "include": [ "animations", diff --git a/sdk/qrcode/tsup.config.ts b/sdk/qrcode/tsup.config.ts new file mode 100644 index 000000000..f3ad9abbc --- /dev/null +++ b/sdk/qrcode/tsup.config.ts @@ -0,0 +1,15 @@ +import type { Options } from 'tsup'; + +const env = process.env.NODE_ENV; + +export const tsup: Options = { + splitting: true, + clean: true, // clean up the dist folder + dts: true, // generate dts files + format: ['cjs', 'esm'], // generate cjs and esm files + skipNodeModulesBundle: true, + entryPoints: ['index.ts', 'animations/**/*', 'components/**/*', 'utils/**/*'], + watch: env === 'development', + target: 'es2020', + outDir: 'dist', +}; diff --git a/yarn.lock b/yarn.lock index a7ce6c760..d5247a388 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2331,7 +2331,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/gen-mapping@npm:^0.3.5": +"@jridgewell/gen-mapping@npm:^0.3.2, @jridgewell/gen-mapping@npm:^0.3.5": version: 0.3.8 resolution: "@jridgewell/gen-mapping@npm:0.3.8" dependencies: @@ -2366,7 +2366,7 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14": +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": version: 1.5.0 resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" checksum: 10c0/2eb864f276eb1096c3c11da3e9bb518f6d9fc0023c78344cdc037abadc725172c70314bdb360f2d4b7bffec7f5d657ce006816bc5d4ecb35e61b66132db00c18 @@ -4019,6 +4019,146 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm-eabi@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.44.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-android-arm64@npm:4.44.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.44.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.44.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-arm64@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.44.0" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-freebsd-x64@npm:4.44.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.44.0" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.44.0" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.44.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.44.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-loongarch64-gnu@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.44.0" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.44.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.44.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-musl@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.44.0" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.44.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.44.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.44.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.44.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.44.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.44.0": + version: 4.44.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.44.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@scure/base@npm:~1.1.0, @scure/base@npm:~1.1.6": version: 1.1.9 resolution: "@scure/base@npm:1.1.9" @@ -4189,6 +4329,7 @@ __metadata: "@openpassport/zk-kit-imt": "npm:^0.0.5" "@openpassport/zk-kit-lean-imt": "npm:^0.0.6" "@openpassport/zk-kit-smt": "npm:^0.0.1" + "@types/js-sha1": "npm:^0.6.3" "@types/node-forge": "npm:^1.3.10" asn1.js: "npm:^5.4.1" asn1js: "npm:^3.0.5" @@ -4198,6 +4339,7 @@ __metadata: country-emoji: "npm:^1.5.6" country-iso-3-to-2: "npm:^1.1.1" elliptic: "npm:^6.5.5" + ethers: "npm:^6.14.4" fs: "npm:^0.0.1-security" i18n-iso-countries: "npm:^7.13.0" js-sha1: "npm:^0.7.0" @@ -4434,6 +4576,7 @@ __metadata: ts-loader: "npm:^9.5.1" ts-mocha: "npm:^10.0.0" ts-node: "npm:^10.9.2" + tsup: "npm:^8.5.0" typescript: "npm:^5.4.5" uuid: "npm:^10.0.0" peerDependencies: @@ -8235,7 +8378,7 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:*, @types/estree@npm:^1.0.6": +"@types/estree@npm:*, @types/estree@npm:1.0.8, @types/estree@npm:^1.0.6": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" checksum: 10c0/39d34d1afaa338ab9763f37ad6066e3f349444f9052b9676a7cc0252ef9485a41c6d81c9c4e0d26e9077993354edf25efc853f3224dd4b447175ef62bdcc86a5 @@ -8328,6 +8471,13 @@ __metadata: languageName: node linkType: hard +"@types/js-sha1@npm:^0.6.3": + version: 0.6.3 + resolution: "@types/js-sha1@npm:0.6.3" + checksum: 10c0/69b8d505b897c485ae0ed5bbd1ddaff8dd24137408ffe4ce7e738b4dad67668afff3c3fd079541027a3436c149feafdce03094179f0a3383272e02110e3db5de + languageName: node + linkType: hard + "@types/json-schema@npm:*, @types/json-schema@npm:^7.0.15, @types/json-schema@npm:^7.0.9": version: 7.0.15 resolution: "@types/json-schema@npm:7.0.15" @@ -9565,6 +9715,13 @@ __metadata: languageName: node linkType: hard +"any-promise@npm:^1.0.0": + version: 1.3.0 + resolution: "any-promise@npm:1.3.0" + checksum: 10c0/60f0298ed34c74fef50daab88e8dab786036ed5a7fad02e012ab57e376e0a0b4b29e83b95ea9b5e7d89df762f5f25119b83e00706ecaccb22cfbacee98d74889 + languageName: node + linkType: hard + "anymatch@npm:^3.0.3, anymatch@npm:~3.1.2": version: 3.1.3 resolution: "anymatch@npm:3.1.3" @@ -10459,6 +10616,17 @@ __metadata: languageName: node linkType: hard +"bundle-require@npm:^5.1.0": + version: 5.1.0 + resolution: "bundle-require@npm:5.1.0" + dependencies: + load-tsconfig: "npm:^0.2.3" + peerDependencies: + esbuild: ">=0.18" + checksum: 10c0/8bff9df68eb686f05af952003c78e70ffed2817968f92aebb2af620cc0b7428c8154df761d28f1b38508532204278950624ef86ce63644013dc57660a9d1810f + languageName: node + linkType: hard + "bytes-iec@npm:^3.1.1": version: 3.1.1 resolution: "bytes-iec@npm:3.1.1" @@ -10480,6 +10648,13 @@ __metadata: languageName: node linkType: hard +"cac@npm:^6.7.14": + version: 6.7.14 + resolution: "cac@npm:6.7.14" + checksum: 10c0/4ee06aaa7bab8981f0d54e5f5f9d4adcd64058e9697563ce336d8a3878ed018ee18ebe5359b2430eceae87e0758e62ea2019c3f52ae6e211b1bd2e133856cd10 + languageName: node + linkType: hard + "cacache@npm:^19.0.1": version: 19.0.1 resolution: "cacache@npm:19.0.1" @@ -10601,9 +10776,9 @@ __metadata: linkType: hard "caniuse-lite@npm:^1.0.30001718": - version: 1.0.30001723 - resolution: "caniuse-lite@npm:1.0.30001723" - checksum: 10c0/e019503061759b96017c4d27ddd7ca1b48533eabcd0431b51d2e3156f99f6b031075e46c279c0db63424cdfc874bba992caec2db51b922a0f945e686246886f6 + version: 1.0.30001724 + resolution: "caniuse-lite@npm:1.0.30001724" + checksum: 10c0/ed9ec0bcf619f0e7ef2d33aac74d2346d1faf52060dfded1fb9c32d87854de5c2988b3ba338c281034c88bf797d6b55468a804ce8396a7e16a48cb0d481d4bfe languageName: node linkType: hard @@ -11267,6 +11442,13 @@ __metadata: languageName: node linkType: hard +"commander@npm:^4.0.0": + version: 4.1.1 + resolution: "commander@npm:4.1.1" + checksum: 10c0/84a76c08fe6cc08c9c93f62ac573d2907d8e79138999312c92d4155bc2325d487d64d13f669b2000c9f8caf70493c1be2dac74fec3c51d5a04f8bc3ae1830bab + languageName: node + linkType: hard + "commander@npm:^7.2.0": version: 7.2.0 resolution: "commander@npm:7.2.0" @@ -11350,6 +11532,13 @@ __metadata: languageName: node linkType: hard +"confbox@npm:^0.1.8": + version: 0.1.8 + resolution: "confbox@npm:0.1.8" + checksum: 10c0/fc2c68d97cb54d885b10b63e45bd8da83a8a71459d3ecf1825143dd4c7f9f1b696b3283e07d9d12a144c1301c2ebc7842380bdf0014e55acc4ae1c9550102418 + languageName: node + linkType: hard + "connect@npm:^3.6.5": version: 3.7.0 resolution: "connect@npm:3.7.0" @@ -11362,6 +11551,13 @@ __metadata: languageName: node linkType: hard +"consola@npm:^3.4.0": + version: 3.4.2 + resolution: "consola@npm:3.4.2" + checksum: 10c0/7cebe57ecf646ba74b300bcce23bff43034ed6fbec9f7e39c27cee1dc00df8a21cd336b466ad32e304ea70fba04ec9e890c200270de9a526ce021ba8a7e4c11a + languageName: node + linkType: hard + "convert-source-map@npm:^1.7.0": version: 1.9.0 resolution: "convert-source-map@npm:1.9.0" @@ -11472,7 +11668,19 @@ __metadata: languageName: node linkType: hard -"create-hmac@npm:^1.1.4, create-hmac@npm:^1.1.7": +"create-hash@npm:~1.1.3": + version: 1.1.3 + resolution: "create-hash@npm:1.1.3" + dependencies: + cipher-base: "npm:^1.0.1" + inherits: "npm:^2.0.1" + ripemd160: "npm:^2.0.0" + sha.js: "npm:^2.4.0" + checksum: 10c0/dbcf4a1b13c8dd5f2a69f5f30bd2701f919ed7d3fbf5aa530cf00b17a950c2b77f63bfe6a2981735a646ae2620d96c8f4584bf70aeeabf050a31de4e46219d08 + languageName: node + linkType: hard + +"create-hmac@npm:^1.1.7": version: 1.1.7 resolution: "create-hmac@npm:1.1.7" dependencies: @@ -12096,9 +12304,9 @@ __metadata: linkType: hard "electron-to-chromium@npm:^1.5.160": - version: 1.5.170 - resolution: "electron-to-chromium@npm:1.5.170" - checksum: 10c0/138c6d293b310729f7550f6d36ae4b2bdd0453220e8b11d8780395cf38c9ae816b1f30a3978d790f1951cfa89e7c7911af4a779094c33ae167c89c7ba6751834 + version: 1.5.171 + resolution: "electron-to-chromium@npm:1.5.171" + checksum: 10c0/e9d7e70d5fe829951c955287877155889a752336e48c715e373c6919f8e438bb686b7278511013aa8456c329c55895059a1d9e4b799217483f28dbae60c198d8 languageName: node linkType: hard @@ -12447,7 +12655,7 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:~0.25.0": +"esbuild@npm:^0.25.0, esbuild@npm:~0.25.0": version: 0.25.5 resolution: "esbuild@npm:0.25.5" dependencies: @@ -13122,7 +13330,7 @@ __metadata: languageName: node linkType: hard -"ethers@npm:^6.11.0, ethers@npm:^6.12.1, ethers@npm:^6.13.5, ethers@npm:^6.7.0": +"ethers@npm:^6.11.0, ethers@npm:^6.12.1, ethers@npm:^6.13.5, ethers@npm:^6.14.4, ethers@npm:^6.7.0": version: 6.14.4 resolution: "ethers@npm:6.14.4" dependencies: @@ -13565,6 +13773,17 @@ __metadata: languageName: node linkType: hard +"fix-dts-default-cjs-exports@npm:^1.0.0": + version: 1.0.1 + resolution: "fix-dts-default-cjs-exports@npm:1.0.1" + dependencies: + magic-string: "npm:^0.30.17" + mlly: "npm:^1.7.4" + rollup: "npm:^4.34.8" + checksum: 10c0/61a3cbe32b6c29df495ef3aded78199fe9dbb52e2801c899fe76d9ca413d3c8c51f79986bac83f8b4b2094ebde883ddcfe47b68ce469806ba13ca6ed4e7cd362 + languageName: node + linkType: hard + "flat-cache@npm:^3.0.4": version: 3.2.0 resolution: "flat-cache@npm:3.2.0" @@ -14048,7 +14267,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2": +"glob@npm:^10.2.2, glob@npm:^10.3.10": version: 10.4.5 resolution: "glob@npm:10.4.5" dependencies: @@ -14408,6 +14627,15 @@ __metadata: languageName: node linkType: hard +"hash-base@npm:^2.0.0": + version: 2.0.2 + resolution: "hash-base@npm:2.0.2" + dependencies: + inherits: "npm:^2.0.1" + checksum: 10c0/283f6060277b52e627a734c4d19d4315ba82326cab5a2f4f2f00b924d747dc7cc902a8cedb1904c7a3501075fcbb24c08de1152bae296698fdc5ad75b33986af + languageName: node + linkType: hard + "hash-base@npm:^3.0.0": version: 3.1.0 resolution: "hash-base@npm:3.1.0" @@ -15903,6 +16131,13 @@ __metadata: languageName: node linkType: hard +"joycon@npm:^3.1.1": + version: 3.1.1 + resolution: "joycon@npm:3.1.1" + checksum: 10c0/131fb1e98c9065d067fd49b6e685487ac4ad4d254191d7aa2c9e3b90f4e9ca70430c43cad001602bdbdabcf58717d3b5c5b7461c1bd8e39478c8de706b3fe6ae + languageName: node + linkType: hard + "js-base64@npm:^3.7.5": version: 3.7.7 resolution: "js-base64@npm:3.7.7" @@ -16344,7 +16579,7 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:^3.1.3": +"lilconfig@npm:^3.1.1, lilconfig@npm:^3.1.3": version: 3.1.3 resolution: "lilconfig@npm:3.1.3" checksum: 10c0/f5604e7240c5c275743561442fbc5abf2a84ad94da0f5adc71d25e31fa8483048de3dcedcb7a44112a942fed305fd75841cdf6c9681c7f640c63f1049e9a5dcc @@ -16358,6 +16593,13 @@ __metadata: languageName: node linkType: hard +"load-tsconfig@npm:^0.2.3": + version: 0.2.5 + resolution: "load-tsconfig@npm:0.2.5" + checksum: 10c0/bf2823dd26389d3497b6567f07435c5a7a58d9df82e879b0b3892f87d8db26900f84c85bc329ef41c0540c0d6a448d1c23ddc64a80f3ff6838b940f3915a3fcb + languageName: node + linkType: hard + "loader-runner@npm:^4.2.0": version: 4.3.0 resolution: "loader-runner@npm:4.3.0" @@ -16472,6 +16714,13 @@ __metadata: languageName: node linkType: hard +"lodash.sortby@npm:^4.7.0": + version: 4.7.0 + resolution: "lodash.sortby@npm:4.7.0" + checksum: 10c0/fc48fb54ff7669f33bb32997cab9460757ee99fafaf72400b261c3e10fde21538e47d8cfcbe6a25a31bcb5b7b727c27d52626386fc2de24eb059a6d64a89cdf5 + languageName: node + linkType: hard + "lodash.throttle@npm:^4.1.1": version: 4.1.1 resolution: "lodash.throttle@npm:4.1.1" @@ -16641,6 +16890,15 @@ __metadata: languageName: node linkType: hard +"magic-string@npm:^0.30.17": + version: 0.30.17 + resolution: "magic-string@npm:0.30.17" + dependencies: + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + checksum: 10c0/16826e415d04b88378f200fe022b53e638e3838b9e496edda6c0e086d7753a44a6ed187adc72d19f3623810589bf139af1a315541cd6a26ae0771a0193eaf7b8 + languageName: node + linkType: hard + "make-dir@npm:^2.0.0, make-dir@npm:^2.1.0": version: 2.1.0 resolution: "make-dir@npm:2.1.0" @@ -17535,6 +17793,18 @@ __metadata: languageName: node linkType: hard +"mlly@npm:^1.7.4": + version: 1.7.4 + resolution: "mlly@npm:1.7.4" + dependencies: + acorn: "npm:^8.14.0" + pathe: "npm:^2.0.1" + pkg-types: "npm:^1.3.0" + ufo: "npm:^1.5.4" + checksum: 10c0/69e738218a13d6365caf930e0ab4e2b848b84eec261597df9788cefb9930f3e40667be9cb58a4718834ba5f97a6efeef31d3b5a95f4388143fd4e0d0deff72ff + languageName: node + linkType: hard + "mnemonist@npm:^0.38.0": version: 0.38.5 resolution: "mnemonist@npm:0.38.5" @@ -17672,6 +17942,17 @@ __metadata: languageName: node linkType: hard +"mz@npm:^2.7.0": + version: 2.7.0 + resolution: "mz@npm:2.7.0" + dependencies: + any-promise: "npm:^1.0.0" + object-assign: "npm:^4.0.1" + thenify-all: "npm:^1.0.0" + checksum: 10c0/103114e93f87362f0b56ab5b2e7245051ad0276b646e3902c98397d18bb8f4a77f2ea4a2c9d3ad516034ea3a56553b60d3f5f78220001ca4c404bd711bd0af39 + languageName: node + linkType: hard + "nanoassert@npm:^2.0.0": version: 2.0.0 resolution: "nanoassert@npm:2.0.0" @@ -18017,7 +18298,7 @@ __metadata: languageName: node linkType: hard -"object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": +"object-assign@npm:^4.0.1, object-assign@npm:^4.1.0, object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" checksum: 10c0/1f4df9945120325d041ccf7b86f31e8bcc14e73d29171e37a7903050e96b81323784ec59f93f102ec635bcf6fa8034ba3ea0a8c7e69fa202b87ae3b6cec5a414 @@ -18525,6 +18806,13 @@ __metadata: languageName: node linkType: hard +"pathe@npm:^2.0.1": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10c0/c118dc5a8b5c4166011b2b70608762e260085180bb9e33e80a50dcdb1e78c010b1624f4280c492c92b05fc276715a4c357d1f9edc570f8f1b3d90b6839ebaca1 + languageName: node + linkType: hard + "pathval@npm:^1.1.1": version: 1.1.1 resolution: "pathval@npm:1.1.1" @@ -18540,15 +18828,16 @@ __metadata: linkType: hard "pbkdf2@npm:^3.0.17": - version: 3.1.2 - resolution: "pbkdf2@npm:3.1.2" + version: 3.1.3 + resolution: "pbkdf2@npm:3.1.3" dependencies: - create-hash: "npm:^1.1.2" - create-hmac: "npm:^1.1.4" - ripemd160: "npm:^2.0.1" - safe-buffer: "npm:^5.0.1" - sha.js: "npm:^2.4.8" - checksum: 10c0/5a30374e87d33fa080a92734d778cf172542cc7e41b96198c4c88763997b62d7850de3fbda5c3111ddf79805ee7c1da7046881c90ac4920b5e324204518b05fd + create-hash: "npm:~1.1.3" + create-hmac: "npm:^1.1.7" + ripemd160: "npm:=2.0.1" + safe-buffer: "npm:^5.2.1" + sha.js: "npm:^2.4.11" + to-buffer: "npm:^1.2.0" + checksum: 10c0/12779463dfb847701f186e0b7e5fd538a1420409a485dcf5100689c2b3ec3cb113204e82a68668faf3b6dd76ec19260b865313c9d3a9c252807163bdc24652ae languageName: node linkType: hard @@ -18587,7 +18876,7 @@ __metadata: languageName: node linkType: hard -"pirates@npm:^4.0.4, pirates@npm:^4.0.6": +"pirates@npm:^4.0.1, pirates@npm:^4.0.4, pirates@npm:^4.0.6": version: 4.0.7 resolution: "pirates@npm:4.0.7" checksum: 10c0/a51f108dd811beb779d58a76864bbd49e239fa40c7984cd11596c75a121a8cc789f1c8971d8bb15f0dbf9d48b76c05bb62fcbce840f89b688c0fa64b37e8478a @@ -18612,6 +18901,17 @@ __metadata: languageName: node linkType: hard +"pkg-types@npm:^1.3.0": + version: 1.3.1 + resolution: "pkg-types@npm:1.3.1" + dependencies: + confbox: "npm:^0.1.8" + mlly: "npm:^1.7.4" + pathe: "npm:^2.0.1" + checksum: 10c0/19e6cb8b66dcc66c89f2344aecfa47f2431c988cfa3366bdfdcfb1dd6695f87dcce37fbd90fe9d1605e2f4440b77f391e83c23255347c35cf84e7fd774d7fcea + languageName: node + linkType: hard + "pkijs@npm:^3.2.4": version: 3.2.5 resolution: "pkijs@npm:3.2.5" @@ -18673,6 +18973,29 @@ __metadata: languageName: node linkType: hard +"postcss-load-config@npm:^6.0.1": + version: 6.0.1 + resolution: "postcss-load-config@npm:6.0.1" + dependencies: + lilconfig: "npm:^3.1.1" + peerDependencies: + jiti: ">=1.21.0" + postcss: ">=8.0.9" + tsx: ^4.8.1 + yaml: ^2.4.2 + peerDependenciesMeta: + jiti: + optional: true + postcss: + optional: true + tsx: + optional: true + yaml: + optional: true + checksum: 10c0/74173a58816dac84e44853f7afbd283f4ef13ca0b6baeba27701214beec33f9e309b128f8102e2b173e8d45ecba45d279a9be94b46bf48d219626aa9b5730848 + languageName: node + linkType: hard + "postinstall-postinstall@npm:^2.1.0": version: 2.1.0 resolution: "postinstall-postinstall@npm:2.1.0" @@ -20029,6 +20352,16 @@ __metadata: languageName: node linkType: hard +"ripemd160@npm:=2.0.1": + version: 2.0.1 + resolution: "ripemd160@npm:2.0.1" + dependencies: + hash-base: "npm:^2.0.0" + inherits: "npm:^2.0.1" + checksum: 10c0/d4cbb4713c1268bb35e44815b12e3744a952a72b72e6a72110c8f3932227ddf68841110285fe2ed1c04805e2621d85f905deb5f55f9d91fa1bfc0f8081a244e6 + languageName: node + linkType: hard + "ripemd160@npm:^2.0.0, ripemd160@npm:^2.0.1": version: 2.0.2 resolution: "ripemd160@npm:2.0.2" @@ -20050,6 +20383,81 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^4.34.8": + version: 4.44.0 + resolution: "rollup@npm:4.44.0" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.44.0" + "@rollup/rollup-android-arm64": "npm:4.44.0" + "@rollup/rollup-darwin-arm64": "npm:4.44.0" + "@rollup/rollup-darwin-x64": "npm:4.44.0" + "@rollup/rollup-freebsd-arm64": "npm:4.44.0" + "@rollup/rollup-freebsd-x64": "npm:4.44.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.44.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.44.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.44.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.44.0" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.44.0" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.44.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.44.0" + "@rollup/rollup-linux-riscv64-musl": "npm:4.44.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.44.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.44.0" + "@rollup/rollup-linux-x64-musl": "npm:4.44.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.44.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.44.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.44.0" + "@types/estree": "npm:1.0.8" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loongarch64-gnu": + optional: true + "@rollup/rollup-linux-powerpc64le-gnu": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-riscv64-musl": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/ff3e0741f2fc7b7b183079628cf50fcfc9163bef86ecfbc9f4e4023adfdee375b7075940963514e2bc4969764688d38d67095bce038b0ad5d572207f114afff5 + languageName: node + linkType: hard + "run-parallel@npm:^1.1.9": version: 1.2.0 resolution: "run-parallel@npm:1.2.0" @@ -20358,7 +20766,7 @@ __metadata: languageName: node linkType: hard -"sha.js@npm:^2.4.0, sha.js@npm:^2.4.8": +"sha.js@npm:^2.4.0, sha.js@npm:^2.4.11, sha.js@npm:^2.4.8": version: 2.4.11 resolution: "sha.js@npm:2.4.11" dependencies: @@ -20793,6 +21201,15 @@ __metadata: languageName: node linkType: hard +"source-map@npm:0.8.0-beta.0": + version: 0.8.0-beta.0 + resolution: "source-map@npm:0.8.0-beta.0" + dependencies: + whatwg-url: "npm:^7.0.0" + checksum: 10c0/fb4d9bde9a9fdb2c29b10e5eae6c71d10e09ef467e1afb75fdec2eb7e11fa5b343a2af553f74f18b695dbc0b81f9da2e9fa3d7a317d5985e9939499ec6087835 + languageName: node + linkType: hard + "source-map@npm:^0.5.6": version: 0.5.7 resolution: "source-map@npm:0.5.7" @@ -21250,6 +21667,24 @@ __metadata: languageName: node linkType: hard +"sucrase@npm:^3.35.0": + version: 3.35.0 + resolution: "sucrase@npm:3.35.0" + dependencies: + "@jridgewell/gen-mapping": "npm:^0.3.2" + commander: "npm:^4.0.0" + glob: "npm:^10.3.10" + lines-and-columns: "npm:^1.1.6" + mz: "npm:^2.7.0" + pirates: "npm:^4.0.1" + ts-interface-checker: "npm:^0.1.9" + bin: + sucrase: bin/sucrase + sucrase-node: bin/sucrase-node + checksum: 10c0/ac85f3359d2c2ecbf5febca6a24ae9bf96c931f05fde533c22a94f59c6a74895e5d5f0e871878dfd59c2697a75ebb04e4b2224ef0bfc24ca1210735c2ec191ef + languageName: node + linkType: hard + "sudo-prompt@npm:^9.0.0": version: 9.2.1 resolution: "sudo-prompt@npm:9.2.1" @@ -21655,6 +22090,24 @@ __metadata: languageName: node linkType: hard +"thenify-all@npm:^1.0.0": + version: 1.6.0 + resolution: "thenify-all@npm:1.6.0" + dependencies: + thenify: "npm:>= 3.1.0 < 4" + checksum: 10c0/9b896a22735e8122754fe70f1d65f7ee691c1d70b1f116fda04fea103d0f9b356e3676cb789506e3909ae0486a79a476e4914b0f92472c2e093d206aed4b7d6b + languageName: node + linkType: hard + +"thenify@npm:>= 3.1.0 < 4": + version: 3.3.1 + resolution: "thenify@npm:3.3.1" + dependencies: + any-promise: "npm:^1.0.0" + checksum: 10c0/f375aeb2b05c100a456a30bc3ed07ef03a39cbdefe02e0403fb714b8c7e57eeaad1a2f5c4ecfb9ce554ce3db9c2b024eba144843cd9e344566d9fcee73b04767 + languageName: node + linkType: hard + "throat@npm:^5.0.0": version: 5.0.0 resolution: "throat@npm:5.0.0" @@ -21695,6 +22148,13 @@ __metadata: languageName: node linkType: hard +"tinyexec@npm:^0.3.2": + version: 0.3.2 + resolution: "tinyexec@npm:0.3.2" + checksum: 10c0/3efbf791a911be0bf0821eab37a3445c2ba07acc1522b1fa84ae1e55f10425076f1290f680286345ed919549ad67527d07281f1c19d584df3b74326909eb1f90 + languageName: node + linkType: hard + "tinyglobby@npm:^0.2.11, tinyglobby@npm:^0.2.12, tinyglobby@npm:^0.2.6": version: 0.2.14 resolution: "tinyglobby@npm:0.2.14" @@ -21744,6 +22204,17 @@ __metadata: languageName: node linkType: hard +"to-buffer@npm:^1.2.0": + version: 1.2.1 + resolution: "to-buffer@npm:1.2.1" + dependencies: + isarray: "npm:^2.0.5" + safe-buffer: "npm:^5.2.1" + typed-array-buffer: "npm:^1.0.3" + checksum: 10c0/bbf07a2a7d6ff9e3ffe503c689176c7149cf3ec25887ce7c4aa5c4841a8845cc71121cd7b4a4769957f823b3f31dbf6b1be6e0a5955798ad864bf2245ee8b5e4 + languageName: node + linkType: hard + "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -21760,6 +22231,15 @@ __metadata: languageName: node linkType: hard +"tr46@npm:^1.0.1": + version: 1.0.1 + resolution: "tr46@npm:1.0.1" + dependencies: + punycode: "npm:^2.1.0" + checksum: 10c0/41525c2ccce86e3ef30af6fa5e1464e6d8bb4286a58ea8db09228f598889581ef62347153f6636cd41553dc41685bdfad0a9d032ef58df9fbb0792b3447d0f04 + languageName: node + linkType: hard + "tr46@npm:~0.0.3": version: 0.0.3 resolution: "tr46@npm:0.0.3" @@ -21767,6 +22247,15 @@ __metadata: languageName: node linkType: hard +"tree-kill@npm:^1.2.2": + version: 1.2.2 + resolution: "tree-kill@npm:1.2.2" + bin: + tree-kill: cli.js + checksum: 10c0/7b1b7c7f17608a8f8d20a162e7957ac1ef6cd1636db1aba92f4e072dc31818c2ff0efac1e3d91064ede67ed5dc57c565420531a8134090a12ac10cf792ab14d2 + languageName: node + linkType: hard + "treeify@npm:^1.1.0": version: 1.1.0 resolution: "treeify@npm:1.1.0" @@ -21822,6 +22311,13 @@ __metadata: languageName: node linkType: hard +"ts-interface-checker@npm:^0.1.9": + version: 0.1.13 + resolution: "ts-interface-checker@npm:0.1.13" + checksum: 10c0/232509f1b84192d07b81d1e9b9677088e590ac1303436da1e92b296e9be8e31ea042e3e1fd3d29b1742ad2c959e95afe30f63117b8f1bc3a3850070a5142fea7 + languageName: node + linkType: hard + "ts-loader@npm:^9.5.1": version: 9.5.2 resolution: "ts-loader@npm:9.5.2" @@ -21962,6 +22458,48 @@ __metadata: languageName: node linkType: hard +"tsup@npm:^8.5.0": + version: 8.5.0 + resolution: "tsup@npm:8.5.0" + dependencies: + bundle-require: "npm:^5.1.0" + cac: "npm:^6.7.14" + chokidar: "npm:^4.0.3" + consola: "npm:^3.4.0" + debug: "npm:^4.4.0" + esbuild: "npm:^0.25.0" + fix-dts-default-cjs-exports: "npm:^1.0.0" + joycon: "npm:^3.1.1" + picocolors: "npm:^1.1.1" + postcss-load-config: "npm:^6.0.1" + resolve-from: "npm:^5.0.0" + rollup: "npm:^4.34.8" + source-map: "npm:0.8.0-beta.0" + sucrase: "npm:^3.35.0" + tinyexec: "npm:^0.3.2" + tinyglobby: "npm:^0.2.11" + tree-kill: "npm:^1.2.2" + peerDependencies: + "@microsoft/api-extractor": ^7.36.0 + "@swc/core": ^1 + postcss: ^8.4.12 + typescript: ">=4.5.0" + peerDependenciesMeta: + "@microsoft/api-extractor": + optional: true + "@swc/core": + optional: true + postcss: + optional: true + typescript: + optional: true + bin: + tsup: dist/cli-default.js + tsup-node: dist/cli-node.js + checksum: 10c0/2eddc1138ad992a2e67d826e92e0b0c4f650367355866c77df8368ade9489e0a8bf2b52b352e97fec83dc690af05881c29c489af27acb86ac2cef38b0d029087 + languageName: node + linkType: hard + "tsutils@npm:^3.21.0": version: 3.21.0 resolution: "tsutils@npm:3.21.0" @@ -22206,6 +22744,13 @@ __metadata: languageName: node linkType: hard +"ufo@npm:^1.5.4": + version: 1.6.1 + resolution: "ufo@npm:1.6.1" + checksum: 10c0/5a9f041e5945fba7c189d5410508cbcbefef80b253ed29aa2e1f8a2b86f4bd51af44ee18d4485e6d3468c92be9bf4a42e3a2b72dcaf27ce39ce947ec994f1e6b + languageName: node + linkType: hard + "uglify-js@npm:^3.1.4": version: 3.19.3 resolution: "uglify-js@npm:3.19.3" @@ -22669,10 +23214,17 @@ __metadata: languageName: node linkType: hard +"webidl-conversions@npm:^4.0.2": + version: 4.0.2 + resolution: "webidl-conversions@npm:4.0.2" + checksum: 10c0/def5c5ac3479286dffcb604547628b2e6b46c5c5b8a8cfaa8c71dc3bafc85859bde5fbe89467ff861f571ab38987cf6ab3d6e7c80b39b999e50e803c12f3164f + languageName: node + linkType: hard + "webpack-sources@npm:^3.2.3": - version: 3.3.2 - resolution: "webpack-sources@npm:3.3.2" - checksum: 10c0/b5308d8acba4c7c6710b6df77187b274800afe0856c1508cba8aa310304558634e745b7eac4991ea086175ea6da3c64d11d958cf508980e6cb7506aa5983913e + version: 3.3.3 + resolution: "webpack-sources@npm:3.3.3" + checksum: 10c0/ab732f6933b513ba4d505130418995ddef6df988421fccf3289e53583c6a39e205c4a0739cee98950964552d3006604912679c736031337fb4a9d78d8576ed40 languageName: node linkType: hard @@ -22730,6 +23282,17 @@ __metadata: languageName: node linkType: hard +"whatwg-url@npm:^7.0.0": + version: 7.1.0 + resolution: "whatwg-url@npm:7.1.0" + dependencies: + lodash.sortby: "npm:^4.7.0" + tr46: "npm:^1.0.1" + webidl-conversions: "npm:^4.0.2" + checksum: 10c0/2785fe4647690e5a0225a79509ba5e21fdf4a71f9de3eabdba1192483fe006fc79961198e0b99f82751557309f17fc5a07d4d83c251aa5b2f85ba71e674cbee9 + languageName: node + linkType: hard + "which-boxed-primitive@npm:^1.1.0, which-boxed-primitive@npm:^1.1.1": version: 1.1.1 resolution: "which-boxed-primitive@npm:1.1.1" @@ -23009,9 +23572,9 @@ __metadata: linkType: hard "xstate@npm:^5.19.2": - version: 5.19.4 - resolution: "xstate@npm:5.19.4" - checksum: 10c0/3a3a65c13263cd0f80de90c14d80113cfd53d37d9cb8c2dcaec4d14c07a980c976f508534fc64f09fb8f83d3513b76af43640bf9feca8886e356d209482e2baa + version: 5.20.0 + resolution: "xstate@npm:5.20.0" + checksum: 10c0/4443c87ce86901e71881842845785acb26eb5d7579c3a95966db83e6499f574325efbfd593e3051a21dbf5b101ba9474d284a43335ea56f518c666f0361bfc89 languageName: node linkType: hard