diff --git a/apps/cli/package.json b/apps/cli/package.json new file mode 100644 index 0000000..a5037ea --- /dev/null +++ b/apps/cli/package.json @@ -0,0 +1,24 @@ +{ + "name": "@signet/cli", + "version": "0.1.0", + "private": true, + "description": "Signet command line interface", + "type": "module", + "bin": { + "signet": "./bin/signet.js" + }, + "scripts": { + "build": "tsc", + "dev": "tsc --watch" + }, + "dependencies": { + "@inquirer/prompts": "^3.0.0", + "commander": "^11.0.0", + "dotenv": "^17.4.2", + "open": "^11.0.2" + }, + "devDependencies": { + "@types/node": "^20.0.0", + "typescript": "^5.6.3" + } +} diff --git a/apps/cli/src/index.ts b/apps/cli/src/index.ts new file mode 100644 index 0000000..fccbe33 --- /dev/null +++ b/apps/cli/src/index.ts @@ -0,0 +1,127 @@ +#!/usr/bin/env node + +import { Command } from 'commander'; +import { confirm } from '@inquirer/prompts'; +import { spawnSync } from 'node:child_process'; +import * as dotenv from 'dotenv'; +import { resolve } from 'node:path'; +import { createServer } from 'node:http'; +import open from 'open'; +import { Keypair } from '@stellar/stellar-sdk'; + +dotenv.config({ path: resolve(process.cwd(), '../../.env') }); +dotenv.config({ path: resolve(process.cwd(), '.env') }); + +const program = new Command(); + +program + .name('signet') + .description('Signet CLI to manage developer profiles and deploy keys') + .version('0.1.0'); + +const getPubkey = (source: string): string => { + const res = spawnSync('stellar', ['keys', 'address', source]); + if (res.status !== 0) { + console.error(`Error: Could not get public key for source '${source}'. Are you sure it exists?`); + process.exit(1); + } + return res.stdout.toString().trim(); +}; + +const getSecret = (source: string): string => { + const res = spawnSync('stellar', ['keys', 'show', source]); + if (res.status !== 0) { + console.error(`Error: Could not get secret key for source '${source}'.`); + process.exit(1); + } + return res.stdout.toString().trim(); +}; + +program + .command('link') + .description('Link a deploy wallet to your profile') + .option('--source ', 'The Stellar CLI identity to use as the deploy key', 'deployer') + .option('--app-url ', 'The Signet app URL', process.env.NEXT_PUBLIC_APP_URL || 'http://localhost:3000') + .action(async (options) => { + const pubkey = getPubkey(options.source); + + console.log(`Linking deploy key (source: ${options.source}, ${pubkey})...`); + + const server = createServer(); + + const tokenPromise = new Promise<{ token: string; handle: string }>((resolvePromise, rejectPromise) => { + server.on('request', (req, res) => { + try { + const url = new URL(req.url || '', `http://localhost:${(server.address() as any).port}`); + if (url.pathname === '/callback') { + const token = url.searchParams.get('token'); + const handle = url.searchParams.get('handle'); + + if (!token || !handle) { + res.writeHead(400, { 'Content-Type': 'text/html' }); + res.end('

Error

Missing token or handle.

'); + return rejectPromise(new Error('Missing token or handle in callback')); + } + + res.writeHead(200, { 'Content-Type': 'text/html' }); + res.end('

Approved!

You can close this window and return to your terminal.

'); + resolvePromise({ token, handle }); + } else { + res.writeHead(404); + res.end(); + } + } catch (e) { + rejectPromise(e); + } + }); + }); + + server.listen(0, async () => { + const port = (server.address() as any).port; + const callbackUrl = `http://localhost:${port}/callback`; + const approveUrl = `${options.appUrl}/app/cli/approve?pubkey=${pubkey}&callback=${encodeURIComponent(callbackUrl)}`; + + console.log(`Opening approval link in your browser:`); + console.log(approveUrl); + + try { + await open(approveUrl); + } catch (e) { + console.log(`Failed to open browser automatically. Please open the link manually.`); + } + + try { + const { token, handle } = await tokenPromise; + server.close(); + + console.log(`Received approval from web app. Verifying ownership...`); + + const secret = getSecret(options.source); + const kp = Keypair.fromSecret(secret); + const signature = kp.sign(Buffer.from(token, 'utf8')).toString('base64'); + + const response = await fetch(`${options.appUrl}/api/cli/link`, { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ token, signature }), + }); + + const data = await response.json(); + + if (!response.ok) { + console.error(`Failed to link wallet: ${data.error || response.statusText}`); + process.exit(1); + } + + console.log(`Successfully linked ${pubkey} to handle '@${handle}'.`); + } catch (e: any) { + server.close(); + console.error(`Error: ${e.message}`); + process.exit(1); + } + }); + }); + + + +program.parse(); diff --git a/apps/cli/tsconfig.json b/apps/cli/tsconfig.json new file mode 100644 index 0000000..8f24167 --- /dev/null +++ b/apps/cli/tsconfig.json @@ -0,0 +1,8 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "./dist", + "rootDir": "./src" + }, + "include": ["src/**/*"] +} diff --git a/apps/web/app/(dashboard)/app/cli/approve/page.tsx b/apps/web/app/(dashboard)/app/cli/approve/page.tsx new file mode 100644 index 0000000..bf529f2 --- /dev/null +++ b/apps/web/app/(dashboard)/app/cli/approve/page.tsx @@ -0,0 +1,86 @@ +import { currentAddress } from '@/lib/server/session'; +import { getAccount } from '@/lib/server/account'; +import { redirect } from 'next/navigation'; +import { Button } from '@/components/button'; +import { createCliLinkToken } from '@/lib/cli-auth'; + +const display = { fontFamily: 'var(--font-display)' } as const; +const mono = { fontFamily: 'var(--font-mono)' } as const; + +export default async function ApproveCliPage(props: { searchParams: Promise<{ pubkey?: string; callback?: string }> }) { + const searchParams = await props.searchParams; + const address = await currentAddress(); + if (!address) { + redirect('/'); + } + + const account = await getAccount(address); + const { pubkey, callback } = searchParams; + + if (!pubkey || !callback) { + return ( +
+

Error

+

Missing pubkey or callback in URL parameters.

+
+ ); + } + + if (!account.handle) { + return ( +
+

Profile Not Found

+

You need to claim a handle on-chain before you can link a deploy key.

+
+ ); + } + + const approveLink = async () => { + 'use server'; + const profileId = account.id; // wait, account.id doesn't exist? account might just have handle. + // Let's look up the profile ID. Wait, I'll fix this below. + // The account object in getAccount has the profile id? I will look at getAccount. + }; + + return ( +
+

+ Link Deploy Key +

+ +

+ The Signet CLI wants to link a deploy key to your profile. Once linked, contracts deployed with this key will be attributed to your handle (@{account.handle}). +

+ +
+
+

Deploy Key

+

{pubkey}

+
+ +
+

Target Profile

+

@{account.handle}

+
+ +
{ + 'use server'; + const { prisma } = await import('@signet/db'); + const userWallet = await prisma.wallet.findUnique({ + where: { pubkey: address }, + select: { profileId: true } + }); + if (!userWallet) throw new Error('Profile not found'); + + const token = createCliLinkToken(pubkey, userWallet.profileId); + const callbackUrl = new URL(callback); + callbackUrl.searchParams.set('token', token); + callbackUrl.searchParams.set('handle', account.handle || ''); + redirect(callbackUrl.toString()); + }}> + +
+
+
+ ); +} diff --git a/apps/web/app/api/cli/link/route.ts b/apps/web/app/api/cli/link/route.ts new file mode 100644 index 0000000..710f156 --- /dev/null +++ b/apps/web/app/api/cli/link/route.ts @@ -0,0 +1,55 @@ +import { NextResponse } from 'next/server'; +import { verifySignature } from '@/lib/auth'; +import { verifyCliLinkToken } from '@/lib/cli-auth'; +import { prisma } from '@signet/db'; +import { logger } from '@/lib/logger'; +import { consumeNonce } from '@/lib/nonce-store'; + +export const runtime = 'nodejs'; + +export async function POST(req: Request) { + const { token, signature } = await req.json().catch(() => ({})); + + if (!token || !signature) { + return NextResponse.json({ error: 'Missing token or signature' }, { status: 400 }); + } + + const validToken = verifyCliLinkToken(token); + if (!validToken) { + return NextResponse.json({ error: 'Invalid or expired token' }, { status: 401 }); + } + + const { pubkey, profileId } = validToken; + + // Verify the signature. The CLI signed the raw token string. + const isSignatureValid = await verifySignature(pubkey, token, signature); + if (!isSignatureValid) { + logger.warn({ pubkey }, 'cli.invalidSignature'); + return NextResponse.json({ error: 'Invalid signature' }, { status: 401 }); + } + + // Prevent replay attacks + const nonceConsumed = await consumeNonce(`cli-link:${token}`, 5 * 60 * 1000); + if (!nonceConsumed) { + return NextResponse.json({ error: 'Token has already been used' }, { status: 401 }); + } + + try { + await prisma.wallet.create({ + data: { + profileId: profileId, + pubkey: pubkey, + source: 'curated', + isPrimary: false, + }, + }); + logger.info({ pubkey, profileId }, 'cli.linkedWallet'); + } catch (error: any) { + if (error.code === 'P2002') { + return NextResponse.json({ error: 'Wallet is already linked to a profile' }, { status: 409 }); + } + throw error; + } + + return NextResponse.json({ ok: true }); +} diff --git a/apps/web/lib/cli-auth.ts b/apps/web/lib/cli-auth.ts new file mode 100644 index 0000000..adca338 --- /dev/null +++ b/apps/web/lib/cli-auth.ts @@ -0,0 +1,36 @@ +import { createHmac, randomBytes } from 'node:crypto'; +import { getAuthSecret } from './auth'; + +const b64url = (b: Buffer): string => b.toString('base64url'); +const hmac = (data: string): Buffer => createHmac('sha256', getAuthSecret()).update(data).digest(); + +export function createCliLinkToken(pubkey: string, profileId: string): string { + const nonce = randomBytes(16).toString('hex'); + const issued = Date.now(); + const data = `${pubkey}|${profileId}|${issued}|${nonce}`; + const tag = b64url(hmac(data)); + return b64url(Buffer.from(`${data}|${tag}`)); +} + +export function verifyCliLinkToken(token: string): { pubkey: string; profileId: string } | null { + try { + const decoded = Buffer.from(token, 'base64url').toString('utf8'); + const parts = decoded.split('|'); + if (parts.length !== 5) return null; + + const [pubkey, profileId, issuedStr, nonce, tag] = parts; + const issued = parseInt(issuedStr, 10); + + // 5 minute TTL + if (Date.now() - issued > 5 * 60 * 1000) return null; + + const expectedData = `${pubkey}|${profileId}|${issuedStr}|${nonce}`; + const expectedTag = b64url(hmac(expectedData)); + + if (tag !== expectedTag) return null; + + return { pubkey, profileId }; + } catch { + return null; + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 16e54d0..b1b65a5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -38,6 +38,28 @@ importers: specifier: ^8.10.0 version: 8.59.3(eslint@9.39.4(jiti@1.21.7))(typescript@5.9.3) + apps/cli: + dependencies: + '@inquirer/prompts': + specifier: ^3.0.0 + version: 3.3.2 + commander: + specifier: ^11.0.0 + version: 11.1.0 + dotenv: + specifier: ^17.4.2 + version: 17.4.2 + open: + specifier: ^11.0.2 + version: 11.0.2 + devDependencies: + '@types/node': + specifier: ^20.0.0 + version: 20.19.41 + typescript: + specifier: ^5.6.3 + version: 5.9.3 + apps/indexer: dependencies: '@signet/db': @@ -591,6 +613,50 @@ packages: cpu: [x64] os: [win32] + '@inquirer/checkbox@1.5.2': + resolution: {integrity: sha512-CifrkgQjDkUkWexmgYYNyB5603HhTHI91vLFeQXh6qrTKiCMVASol01Rs1cv6LP/A2WccZSRlJKZhbaBIs/9ZA==} + engines: {node: '>=14.18.0'} + + '@inquirer/confirm@2.0.17': + resolution: {integrity: sha512-EqzhGryzmGpy2aJf6LxJVhndxYmFs+m8cxXzf8nejb1DE3sabf6mUgBcp4J0jAUEiAcYzqmkqRr7LPFh/WdnXA==} + engines: {node: '>=14.18.0'} + + '@inquirer/core@6.0.0': + resolution: {integrity: sha512-fKi63Khkisgda3ohnskNf5uZJj+zXOaBvOllHsOkdsXRA/ubQLJQrZchFFi57NKbZzkTunXiBMdvWOv71alonw==} + engines: {node: '>=14.18.0'} + + '@inquirer/editor@1.2.15': + resolution: {integrity: sha512-gQ77Ls09x5vKLVNMH9q/7xvYPT6sIs5f7URksw+a2iJZ0j48tVS6crLqm2ugG33tgXHIwiEqkytY60Zyh5GkJQ==} + engines: {node: '>=14.18.0'} + + '@inquirer/expand@1.1.16': + resolution: {integrity: sha512-TGLU9egcuo+s7PxphKUCnJnpCIVY32/EwPCLLuu+gTvYiD8hZgx8Z2niNQD36sa6xcfpdLY6xXDBiL/+g1r2XQ==} + engines: {node: '>=14.18.0'} + + '@inquirer/input@1.2.16': + resolution: {integrity: sha512-Ou0LaSWvj1ni+egnyQ+NBtfM1885UwhRCMtsRt2bBO47DoC1dwtCa+ZUNgrxlnCHHF0IXsbQHYtIIjFGAavI4g==} + engines: {node: '>=14.18.0'} + + '@inquirer/password@1.1.16': + resolution: {integrity: sha512-aZYZVHLUXZ2gbBot+i+zOJrks1WaiI95lvZCn1sKfcw6MtSSlYC8uDX8sTzQvAsQ8epHoP84UNvAIT0KVGOGqw==} + engines: {node: '>=14.18.0'} + + '@inquirer/prompts@3.3.2': + resolution: {integrity: sha512-k52mOMRvTUejrqyF1h8Z07chC+sbaoaUYzzr1KrJXyj7yaX7Nrh0a9vktv8TuocRwIJOQMaj5oZEmkspEcJFYQ==} + engines: {node: '>=14.18.0'} + + '@inquirer/rawlist@1.2.16': + resolution: {integrity: sha512-pZ6TRg2qMwZAOZAV6TvghCtkr53dGnK29GMNQ3vMZXSNguvGqtOVc4j/h1T8kqGJFagjyfBZhUPGwNS55O5qPQ==} + engines: {node: '>=14.18.0'} + + '@inquirer/select@1.3.3': + resolution: {integrity: sha512-RzlRISXWqIKEf83FDC9ZtJ3JvuK1l7aGpretf41BCWYrvla2wU8W8MTRNMiPrPJ+1SIqrRC1nZdZ60hD9hRXLg==} + engines: {node: '>=14.18.0'} + + '@inquirer/type@1.5.5': + resolution: {integrity: sha512-MzICLu4yS7V8AA61sANROZ9vT1H3ooca5dSmI1FjZkzq7o/koMsRfQSzRtFo+F3Ao4Sf1C0bpLKejpKB/+j6MA==} + engines: {node: '>=18'} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1804,6 +1870,9 @@ packages: '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + '@types/mute-stream@0.0.4': + resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} + '@types/node@12.20.55': resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} @@ -1833,6 +1902,9 @@ packages: '@types/web@0.0.197': resolution: {integrity: sha512-V4sOroWDADFx9dLodWpKm298NOJ1VJ6zoDVgaP+WBb/utWxqQ6gnMzd9lvVDAr/F3ibiKaxH9i45eS0gQPSTaQ==} + '@types/wrap-ansi@3.0.0': + resolution: {integrity: sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g==} + '@types/ws@7.4.7': resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} @@ -2063,6 +2135,10 @@ packages: ajv@6.15.0: resolution: {integrity: sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==} + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -2268,6 +2344,10 @@ packages: resolution: {integrity: sha512-ZMANVnAixE6AWWnPzlW2KpUrxhm9woycYvPOo67jWHyFowASTEd9s+QN1EIMsSDtwhIxN4sWE1jotpuDUIgyIw==} engines: {node: '>=6.14.2'} + bundle-name@4.1.0: + resolution: {integrity: sha512-tjwM5exMg6BGRI+kNmTntNsvdZS1X8BFYS6tnJ2hdH0kVxM6/eVZ2xy+FqStSWvYmtfFMDLIxurorHwDKfDz5Q==} + engines: {node: '>=18'} + call-bind-apply-helpers@1.0.2: resolution: {integrity: sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==} engines: {node: '>= 0.4'} @@ -2306,6 +2386,9 @@ packages: resolution: {integrity: sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + charenc@0.0.2: resolution: {integrity: sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==} @@ -2321,6 +2404,14 @@ packages: resolution: {integrity: sha512-Mz9QMT5fJe7bKI7MH31UilT5cEK5EHHRCccw/YRFsRY47AuNgaV6HY3rscp0/I4Q+tTW/5zoqpSeRRI54TkDWA==} engines: {node: '>= 0.10'} + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + client-only@0.0.1: resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} @@ -2346,6 +2437,10 @@ packages: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} + commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + commander@14.0.2: resolution: {integrity: sha512-TywoWNNRbhoD0BXs1P3ZEScW8W5iKrnbithIl0YH+uCmBd0QpPOA8yc82DS3BIE5Ma6FnBVUsJ7wVUDz4dvOWQ==} engines: {node: '>=20'} @@ -2419,10 +2514,22 @@ packages: deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + default-browser-id@5.0.1: + resolution: {integrity: sha512-x1VCxdX4t+8wVfd1so/9w+vQ4vx7lKd2Qp5tDRutErwmR85OgmfX7RlLRMWafRMY7hbEiXIbudNrjOAPa/hL8Q==} + engines: {node: '>=18'} + + default-browser@5.5.1: + resolution: {integrity: sha512-m1pAzaJgZ/gssEqlOhJkPJp8Xly7QyW6xcrkUa2KKcDeDSEMP7X8xipU3snUcfisTQx0w1AGae+9UtJSfVnXGw==} + engines: {node: '>=18'} + define-data-property@1.1.4: resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} engines: {node: '>= 0.4'} + define-lazy-prop@3.0.0: + resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} + engines: {node: '>=12'} + defu@6.1.7: resolution: {integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==} @@ -2464,6 +2571,10 @@ packages: dlv@1.1.3: resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dotenv@17.4.2: + resolution: {integrity: sha512-nI4U3TottKAcAD9LLud4Cb7b2QztQMUEfHbvhTH09bqXTxnSie8WnjPALV/WMCrJZ6UV/qHJ6L03OqO3LcdYZw==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -2520,6 +2631,10 @@ packages: resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==} engines: {node: '>=6'} + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2602,6 +2717,10 @@ packages: exponential-backoff@3.1.3: resolution: {integrity: sha512-ZgEeZXj30q+I0EN+CbSSpIyPaJ5HVQD18Z1m+u1FXbAeT94mr1zw50q4q6jiiC447Nl/YTcIYSAftiGqetwXCA==} + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + eyes@0.1.8: resolution: {integrity: sha512-GipyPsXO1anza0AOZdy69Im7hGFCNB7Y/NGjDlZGJ3GJJLtwNSb2vrzYrTYJRrRloVx7pl+bhUaTB8yiccPvFQ==} engines: {node: '> 0.1.90'} @@ -2640,6 +2759,10 @@ packages: feaxios@0.0.23: resolution: {integrity: sha512-eghR0A21fvbkcQBgZuMfQhrXxJzC0GNUGC9fXhBge33D+mFDTwl0aJ35zoQQn575BhyjQitRc5N4f+L4cP708g==} + figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -2800,6 +2923,10 @@ packages: humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + idb-keyval@6.2.1: resolution: {integrity: sha512-8Sb3veuYCyrZL+VBt9LJfZjLUPWVvqn8tG28VqYNFCo43KHcKuq+b4EiXGeuaLAQWL2YmyDgMp2aSpH9JHsEQg==} @@ -2856,6 +2983,11 @@ packages: resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} engines: {node: '>= 0.4'} + is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} engines: {node: '>=0.10.0'} @@ -2868,6 +3000,15 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-in-ssh@1.0.0: + resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} + engines: {node: '>=20'} + + is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + is-my-ip-valid@1.0.1: resolution: {integrity: sha512-jxc8cBcOWbNK2i2aTkCZP6i7wkHF1bqKFrwEHuN5Jtg5BSaZHUZQ/JTOJwoV41YvHnOaRyWWh72T/KvfNz9DJg==} @@ -2896,6 +3037,10 @@ packages: resolution: {integrity: sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==} engines: {node: '>= 0.4'} + is-wsl@3.1.1: + resolution: {integrity: sha512-e6rvdUCiQCAuumZslxRJWR/Doq4VpPR82kqclvcS0efgt430SlGIk05vdCN58+VrzgtIcfNODjozVielycD4Sw==} + engines: {node: '>=16'} + isarray@1.0.0: resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} @@ -3091,6 +3236,10 @@ packages: engines: {npm: '>=1.4.0'} hasBin: true + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + mz@2.7.0: resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} @@ -3192,10 +3341,18 @@ packages: resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} engines: {node: '>=14.0.0'} + open@11.0.2: + resolution: {integrity: sha512-RWqF+pBSkqecEvCKOn8QYhaNdRMJDZRIrlS/7rTDdLHaPcfXGCZ/h8zb413NfvdeAV0MR7T1yJcA34/q+CSm1Q==} + engines: {node: '>=20'} + optionator@0.9.4: resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} engines: {node: '>= 0.8.0'} + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + ox@0.14.29: resolution: {integrity: sha512-M5j87Ec4V99MQdRct/g09eWXW60g6zhHTUs1lr4deUtrPDnezBdCJTgKd7pxqTpSZBFveV0ALi9jMMuT1qKyNg==} peerDependencies: @@ -3349,6 +3506,14 @@ packages: resolution: {integrity: sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==} engines: {node: ^10 || ^12 || >=14} + powershell-utils@0.1.0: + resolution: {integrity: sha512-dM0jVuXJPsDN6DvRpea484tCUaMiXWjuCn++HGTqUWzGDjv5tZkEZldAJ/UMlqRYGFrD/etByo4/xOuC/snX2A==} + engines: {node: '>=20'} + + powershell-utils@0.2.1: + resolution: {integrity: sha512-C+y9x90UElAddDZmV4qOx9W53B61PO7cIqWz2dQsWlwswuq4mr8NEwytdGKboYbQlGZ3awrkTeNvcZiZNHnQ8A==} + engines: {node: '>=20'} + preact@10.24.2: resolution: {integrity: sha512-1cSoF0aCC8uaARATfrlz4VCBqE8LwZwRfLgkxJOQwAlQt6ayTmi0D9OF7nXid1POI5SZidFuG9CnlXbDfLqY/Q==} @@ -3484,6 +3649,14 @@ packages: rpc-websockets@9.3.9: resolution: {integrity: sha512-2iQDaTB4g5fDB2ihrTFSJSibCEuxaRi1q7qTW7ZO9/M5/TC+ToHA4D9/ffNLEbAoHNNrcdeP05oATNk44SKZXA==} + run-applescript@7.1.0: + resolution: {integrity: sha512-DPe5pVFaAsinSaV6QjQ6gdiedWDcRCbUuiQfQa2wmWV7+xC9bGulGI8+TdRmoFkAPaBXk8CrAbnlY2ISniJ47Q==} + engines: {node: '>=18'} + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} @@ -3503,6 +3676,9 @@ packages: resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==} engines: {node: '>=10'} + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + scheduler@0.23.2: resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} @@ -3555,6 +3731,10 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + slow-redact@0.3.2: resolution: {integrity: sha512-MseHyi2+E/hBRqdOi5COy6wZ7j7DxXRz9NkseavNYSvvWC06D8a5cidVZX3tcG5eCW3NIyVU4zT63hw0Q486jw==} @@ -3678,6 +3858,10 @@ packages: resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==} engines: {node: '>=12.0.0'} + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + to-buffer@1.2.2: resolution: {integrity: sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==} engines: {node: '>= 0.4'} @@ -3733,6 +3917,10 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + typed-array-buffer@1.0.3: resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==} engines: {node: '>= 0.4'} @@ -3975,6 +4163,10 @@ packages: utf-8-validate: optional: true + wsl-utils@1.0.0: + resolution: {integrity: sha512-Hl0ZOAs672vg+06kfujwRhoS6/jehvULrlFkuF2dRu6pHgA8U06h3xqNIqNNU1LTXPcedxByAR4GS6pwQK0mgA==} + engines: {node: '>=20'} + xrpl@4.6.0: resolution: {integrity: sha512-0nXZfqDHRJ6bsDv1WtA9MdCYalMtXuxVa9mtLdqT3xypRKf2LwT5DbuGL/kHcVfuqk3B+ly+SFARlrnX+LHtRQ==} engines: {node: '>=18.0.0'} @@ -4434,6 +4626,94 @@ snapshots: '@img/sharp-win32-x64@0.34.5': optional: true + '@inquirer/checkbox@1.5.2': + dependencies: + '@inquirer/core': 6.0.0 + '@inquirer/type': 1.5.5 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + figures: 3.2.0 + + '@inquirer/confirm@2.0.17': + dependencies: + '@inquirer/core': 6.0.0 + '@inquirer/type': 1.5.5 + chalk: 4.1.2 + + '@inquirer/core@6.0.0': + dependencies: + '@inquirer/type': 1.5.5 + '@types/mute-stream': 0.0.4 + '@types/node': 20.19.41 + '@types/wrap-ansi': 3.0.0 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-spinners: 2.9.2 + cli-width: 4.1.0 + figures: 3.2.0 + mute-stream: 1.0.0 + run-async: 3.0.0 + signal-exit: 4.1.0 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + '@inquirer/editor@1.2.15': + dependencies: + '@inquirer/core': 6.0.0 + '@inquirer/type': 1.5.5 + chalk: 4.1.2 + external-editor: 3.1.0 + + '@inquirer/expand@1.1.16': + dependencies: + '@inquirer/core': 6.0.0 + '@inquirer/type': 1.5.5 + chalk: 4.1.2 + figures: 3.2.0 + + '@inquirer/input@1.2.16': + dependencies: + '@inquirer/core': 6.0.0 + '@inquirer/type': 1.5.5 + chalk: 4.1.2 + + '@inquirer/password@1.1.16': + dependencies: + '@inquirer/core': 6.0.0 + '@inquirer/type': 1.5.5 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + + '@inquirer/prompts@3.3.2': + dependencies: + '@inquirer/checkbox': 1.5.2 + '@inquirer/confirm': 2.0.17 + '@inquirer/core': 6.0.0 + '@inquirer/editor': 1.2.15 + '@inquirer/expand': 1.1.16 + '@inquirer/input': 1.2.16 + '@inquirer/password': 1.1.16 + '@inquirer/rawlist': 1.2.16 + '@inquirer/select': 1.3.3 + + '@inquirer/rawlist@1.2.16': + dependencies: + '@inquirer/core': 6.0.0 + '@inquirer/type': 1.5.5 + chalk: 4.1.2 + + '@inquirer/select@1.3.3': + dependencies: + '@inquirer/core': 6.0.0 + '@inquirer/type': 1.5.5 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + figures: 3.2.0 + + '@inquirer/type@1.5.5': + dependencies: + mute-stream: 1.0.0 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.5 @@ -6320,6 +6600,10 @@ snapshots: '@types/json-schema@7.0.15': {} + '@types/mute-stream@0.0.4': + dependencies: + '@types/node': 20.19.41 + '@types/node@12.20.55': {} '@types/node@20.19.41': @@ -6345,6 +6629,8 @@ snapshots: '@types/web@0.0.197': {} + '@types/wrap-ansi@3.0.0': {} + '@types/ws@7.4.7': dependencies: '@types/node': 20.19.41 @@ -7008,6 +7294,10 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + ansi-regex@5.0.1: {} ansi-styles@4.3.0: @@ -7218,6 +7508,10 @@ snapshots: node-gyp-build: 4.8.4 optional: true + bundle-name@4.1.0: + dependencies: + run-applescript: 7.1.0 + call-bind-apply-helpers@1.0.2: dependencies: es-errors: 1.3.0 @@ -7254,6 +7548,8 @@ snapshots: chalk@5.6.2: {} + chardet@0.7.0: {} + charenc@0.0.2: {} chokidar@3.6.0: @@ -7278,6 +7574,10 @@ snapshots: safe-buffer: 5.2.1 to-buffer: 1.2.2 + cli-spinners@2.9.2: {} + + cli-width@4.1.0: {} + client-only@0.0.1: {} cliui@6.0.0: @@ -7301,6 +7601,8 @@ snapshots: dependencies: delayed-stream: 1.0.0 + commander@11.1.0: {} + commander@14.0.2: {} commander@14.0.3: {} @@ -7370,12 +7672,21 @@ snapshots: deep-is@0.1.4: {} + default-browser-id@5.0.1: {} + + default-browser@5.5.1: + dependencies: + bundle-name: 4.1.0 + default-browser-id: 5.0.1 + define-data-property@1.1.4: dependencies: es-define-property: 1.0.1 es-errors: 1.3.0 gopd: 1.2.0 + define-lazy-prop@3.0.0: {} + defu@6.1.7: {} delay@5.0.0: {} @@ -7401,6 +7712,8 @@ snapshots: dlv@1.1.3: {} + dotenv@17.4.2: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -7483,6 +7796,8 @@ snapshots: escalade@3.2.0: {} + escape-string-regexp@1.0.5: {} + escape-string-regexp@4.0.0: {} eslint-config-prettier@9.1.2(eslint@9.39.4(jiti@1.21.7)): @@ -7575,6 +7890,12 @@ snapshots: exponential-backoff@3.1.3: {} + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + eyes@0.1.8: {} fast-deep-equal@3.1.3: {} @@ -7607,6 +7928,10 @@ snapshots: dependencies: is-retry-allowed: 3.0.0 + figures@3.2.0: + dependencies: + escape-string-regexp: 1.0.5 + file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -7780,6 +8105,10 @@ snapshots: dependencies: ms: 2.1.3 + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + idb-keyval@6.2.1: optional: true @@ -7821,6 +8150,8 @@ snapshots: dependencies: hasown: 2.0.3 + is-docker@3.0.0: {} + is-extglob@2.1.1: {} is-fullwidth-code-point@3.0.0: {} @@ -7829,6 +8160,12 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-in-ssh@1.0.0: {} + + is-inside-container@1.0.0: + dependencies: + is-docker: 3.0.0 + is-my-ip-valid@1.0.1: {} is-my-json-valid@2.20.6: @@ -7854,6 +8191,10 @@ snapshots: dependencies: which-typed-array: 1.1.20 + is-wsl@3.1.1: + dependencies: + is-inside-container: 1.0.0 + isarray@1.0.0: {} isarray@2.0.5: {} @@ -8035,6 +8376,8 @@ snapshots: mustache@4.0.0: {} + mute-stream@1.0.0: {} + mz@2.7.0: dependencies: any-promise: 1.3.0 @@ -8133,6 +8476,15 @@ snapshots: on-exit-leak-free@2.1.2: {} + open@11.0.2: + dependencies: + default-browser: 5.5.1 + define-lazy-prop: 3.0.0 + is-in-ssh: 1.0.0 + is-inside-container: 1.0.0 + powershell-utils: 0.2.1 + wsl-utils: 1.0.0 + optionator@0.9.4: dependencies: deep-is: 0.1.4 @@ -8142,6 +8494,8 @@ snapshots: type-check: 0.4.0 word-wrap: 1.2.5 + os-tmpdir@1.0.2: {} + ox@0.14.29(typescript@5.9.3)(zod@3.22.4): dependencies: '@adraffy/ens-normalize': 1.11.1 @@ -8310,6 +8664,10 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + powershell-utils@0.1.0: {} + + powershell-utils@0.2.1: {} + preact@10.24.2: optional: true @@ -8464,6 +8822,10 @@ snapshots: bufferutil: 4.1.0 utf-8-validate: 6.0.6 + run-applescript@7.1.0: {} + + run-async@3.0.0: {} + run-parallel@1.2.0: dependencies: queue-microtask: 1.2.3 @@ -8482,6 +8844,8 @@ snapshots: safe-stable-stringify@2.5.0: {} + safer-buffer@2.1.2: {} + scheduler@0.23.2: dependencies: loose-envify: 1.4.0 @@ -8560,6 +8924,8 @@ snapshots: shebang-regex@3.0.0: {} + signal-exit@4.1.0: {} + slow-redact@0.3.2: {} smart-buffer@4.2.0: {} @@ -8707,6 +9073,10 @@ snapshots: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + to-buffer@1.2.2: dependencies: isarray: 2.0.5 @@ -8758,6 +9128,8 @@ snapshots: dependencies: prelude-ls: 1.2.1 + type-fest@0.21.3: {} + typed-array-buffer@1.0.3: dependencies: call-bound: 1.0.4 @@ -8950,6 +9322,11 @@ snapshots: bufferutil: 4.1.0 utf-8-validate: 6.0.6 + wsl-utils@1.0.0: + dependencies: + is-wsl: 3.1.1 + powershell-utils: 0.1.0 + xrpl@4.6.0(bufferutil@4.1.0)(utf-8-validate@6.0.6): dependencies: '@scure/bip32': 1.7.0