From 9ee416f3abbdf6d849c00d75d6e903e82832caaa Mon Sep 17 00:00:00 2001 From: ByteZhang Date: Tue, 3 Sep 2024 17:32:49 +0800 Subject: [PATCH] feat: support ton sign Proof --- packages/example/.gitignore | 3 + .../components/chains/ton/TonProofDemoApi.ts | 89 +++ .../example/components/chains/ton/example.tsx | 66 ++- .../example/components/chains/ton/params.ts | 4 +- .../example/lib/localStorageForGithubPages.ts | 20 + packages/example/package.json | 10 + packages/example/pages/_app.tsx | 3 + packages/example/server/MswProvider.ts | 21 + packages/example/server/api/checkProof.ts | 36 ++ .../example/server/api/generatePayload.ts | 22 + packages/example/server/api/getAccountInfo.ts | 30 + .../server/dto/checkProofRequestDto.ts | 20 + .../example/server/services/tonApiService.ts | 47 ++ .../server/services/tonProofService.ts | 116 ++++ packages/example/server/utils/httpUtils.ts | 28 + packages/example/server/utils/jwt.ts | 69 +++ packages/example/server/worker.ts | 11 + .../server/wrappers/walletContractV4R1.ts | 18 + .../example/server/wrappers/walletsData.ts | 95 ++++ packages/example/yarn.lock | 527 ++++++++++++++---- 20 files changed, 1131 insertions(+), 104 deletions(-) create mode 100644 packages/example/components/chains/ton/TonProofDemoApi.ts create mode 100644 packages/example/lib/localStorageForGithubPages.ts create mode 100644 packages/example/server/MswProvider.ts create mode 100644 packages/example/server/api/checkProof.ts create mode 100644 packages/example/server/api/generatePayload.ts create mode 100644 packages/example/server/api/getAccountInfo.ts create mode 100644 packages/example/server/dto/checkProofRequestDto.ts create mode 100644 packages/example/server/services/tonApiService.ts create mode 100644 packages/example/server/services/tonProofService.ts create mode 100644 packages/example/server/utils/httpUtils.ts create mode 100644 packages/example/server/utils/jwt.ts create mode 100644 packages/example/server/worker.ts create mode 100644 packages/example/server/wrappers/walletContractV4R1.ts create mode 100644 packages/example/server/wrappers/walletsData.ts diff --git a/packages/example/.gitignore b/packages/example/.gitignore index f8fb48366..671698aad 100644 --- a/packages/example/.gitignore +++ b/packages/example/.gitignore @@ -36,3 +36,6 @@ yarn-error.log* # typescript *.tsbuildinfo + +# msw +public/mockServiceWorker.js \ No newline at end of file diff --git a/packages/example/components/chains/ton/TonProofDemoApi.ts b/packages/example/components/chains/ton/TonProofDemoApi.ts new file mode 100644 index 000000000..be20c02f6 --- /dev/null +++ b/packages/example/components/chains/ton/TonProofDemoApi.ts @@ -0,0 +1,89 @@ +import { + Account, + ConnectAdditionalRequest, + TonProofItemReplySuccess, +} from '@tonconnect/ui-react'; +import '../../../lib/localStorageForGithubPages'; + +class TonProofDemoApiService { + private localStorageKey = 'demo-api-access-token'; + + private host = window.location.origin; + + public accessToken: string | null = null; + + public readonly refreshIntervalMs = 9 * 60 * 1000; + + constructor() { + this.accessToken = localStorage.getItem(this.localStorageKey); + + if (!this.accessToken) { + this.generatePayload(); + } + } + + async generatePayload(): Promise { + try { + const response = await ( + await fetch(`${this.host}/api/generate_payload`, { + method: 'POST', + }) + ).json(); + return { tonProof: response.payload as string }; + } catch { + return null; + } + } + + async checkProof(proof: TonProofItemReplySuccess['proof'], account: Account): Promise { + try { + const reqBody = { + address: account.address, + network: account.chain, + public_key: account.publicKey, + proof: { + ...proof, + state_init: account.walletStateInit, + }, + }; + + const response = await ( + await fetch(`${this.host}/api/check_proof`, { + method: 'POST', + body: JSON.stringify(reqBody), + }) + ).json(); + + if (response?.token) { + localStorage.setItem(this.localStorageKey, response.token); + this.accessToken = response.token; + return true; + } + return false; + } catch (e) { + console.log('checkProof error:', e); + throw e; + } + } + + async getAccountInfo(account: Account) { + const response = await ( + await fetch(`${this.host}/api/get_account_info`, { + headers: { + Authorization: `Bearer ${this.accessToken}`, + 'Content-Type': 'application/json', + }, + }) + ).json(); + + return response as {}; + } + + reset() { + this.accessToken = null; + localStorage.removeItem(this.localStorageKey); + this.generatePayload(); + } +} + +export const TonProofDemoApi = new TonProofDemoApiService(); diff --git a/packages/example/components/chains/ton/example.tsx b/packages/example/components/chains/ton/example.tsx index 7de4cc98f..6ea4ca3da 100644 --- a/packages/example/components/chains/ton/example.tsx +++ b/packages/example/components/chains/ton/example.tsx @@ -11,6 +11,7 @@ import { } from '@tonconnect/ui-react'; import InfoLayout from '../../InfoLayout'; import params from './params'; +import { TonProofDemoApi } from './TonProofDemoApi'; export function Example() { const userFriendlyAddress = useTonAddress(); @@ -33,6 +34,69 @@ export function Example() { )} + + { + // 断开连接,重置 accessToken + if (tonConnectUI.connected) { + await tonConnectUI?.disconnect(); + TonProofDemoApi.reset(); + } + + // 设置 loading 状态 + tonConnectUI.setConnectRequestParameters({ state: 'loading' }); + + const payload = await TonProofDemoApi.generatePayload(); + if (payload) { + tonConnectUI.setConnectRequestParameters({ state: 'ready', value: payload }); + } else { + tonConnectUI.setConnectRequestParameters(null); + } + + return payload; + }} + /> + { + void tonConnectUI.openModal(); + return 'success'; + }} + onValidate={async (request: string, response: string) => { + if (wallet.connectItems?.tonProof && 'proof' in wallet.connectItems.tonProof) { + try { + const result = await TonProofDemoApi.checkProof(wallet.connectItems.tonProof.proof, wallet.account); + return JSON.stringify({ + success: result, + proof: wallet.connectItems.tonProof.proof + }); + } catch (e: any) { + return JSON.stringify({ + success: false, + errorMessage: e?.message, + proof: null + }); + } + } + return Promise.resolve('error'); + }} + /> + { + const response = await TonProofDemoApi.getAccountInfo(wallet.account); + return response; + }} + /> + + - {/* */} + {/* */} ); diff --git a/packages/example/components/chains/ton/params.ts b/packages/example/components/chains/ton/params.ts index e5f736d3c..724e201ac 100644 --- a/packages/example/components/chains/ton/params.ts +++ b/packages/example/components/chains/ton/params.ts @@ -14,7 +14,7 @@ export default { }, { id: 'sendTransaction-native-two', - name: 'Native', + name: 'Native Two', value: JSON.stringify({ messages: [ { @@ -30,7 +30,7 @@ export default { }, { id: 'sendTransaction-native-four', - name: 'Native', + name: 'Native Four', value: JSON.stringify({ messages: [ { diff --git a/packages/example/lib/localStorageForGithubPages.ts b/packages/example/lib/localStorageForGithubPages.ts new file mode 100644 index 000000000..d5d527f2a --- /dev/null +++ b/packages/example/lib/localStorageForGithubPages.ts @@ -0,0 +1,20 @@ +/* eslint-disable @typescript-eslint/no-unsafe-member-access */ +const separator = `${window.location.pathname.replace(/\/+$/, '')}:`; + +const setItem = localStorage.setItem; +localStorage.constructor.prototype.setItem = (key: string, value: string) => + setItem.apply(localStorage, [separator + key, value]); +localStorage.setItem = (key: string, value: string) => + setItem.apply(localStorage, [separator + key, value]); + +const getItem = localStorage.getItem; +localStorage.constructor.prototype.getItem = (key: string) => + getItem.apply(localStorage, [separator + key]); +localStorage.getItem = (key: string) => getItem.apply(localStorage, [separator + key]); + +const removeItem = localStorage.removeItem; +localStorage.constructor.prototype.removeItem = (key: string) => + removeItem.apply(localStorage, [separator + key]); +localStorage.removeItem = (key: string) => removeItem.apply(localStorage, [separator + key]); + +export {}; diff --git a/packages/example/package.json b/packages/example/package.json index 2105b363c..ec7c106d9 100644 --- a/packages/example/package.json +++ b/packages/example/package.json @@ -51,6 +51,9 @@ "@starcoin/starcoin": "^2.1.6", "@starcoin/starmask-onboarding": "^1.0.0", "@tanstack/react-query": "^5.40.0", + "@ton/core": "^0.57.0", + "@ton/crypto": "^3.3.0", + "@ton/ton": "^15.0.0", "@tonconnect/ui-react": "^2.0.6", "@uiw/react-codemirror": "^4.22.1", "@unisat/wallet-utils": "^1.0.0", @@ -74,11 +77,13 @@ "console-feed": "^3.5.0", "cosmjs-types": "^0.9.0", "ethereumjs-util": "^7.1.5", + "jose": "^5.8.0", "js-conflux-sdk": "^2.1.8", "lodash-es": "^4.17.21", "long": "^5.2.3", "lucid-cardano": "^0.10.7", "lucide-react": "^0.378.0", + "msw": "^2.4.1", "near-api-js": "^0.44.2", "next": "^13.5.6", "next-themes": "^0.3.0", @@ -111,5 +116,10 @@ "sass": "^1.51.0", "tailwindcss": "^3.4.3", "typescript": "5.1.6" + }, + "msw": { + "workerDirectory": [ + "public" + ] } } diff --git a/packages/example/pages/_app.tsx b/packages/example/pages/_app.tsx index 917d38741..da5c3a68a 100644 --- a/packages/example/pages/_app.tsx +++ b/packages/example/pages/_app.tsx @@ -3,11 +3,14 @@ import '../styles/globals.css'; import type { AppProps } from 'next/app'; import { ThemeProvider } from 'next-themes'; import { Toaster } from '../components/ui/toaster'; +import MswProvider from '../server/MswProvider'; function MyApp({ Component, pageProps }: AppProps) { return ( + + ); diff --git a/packages/example/server/MswProvider.ts b/packages/example/server/MswProvider.ts new file mode 100644 index 000000000..4309b6825 --- /dev/null +++ b/packages/example/server/MswProvider.ts @@ -0,0 +1,21 @@ +'use client'; + +import { handlers } from './worker'; +import { useEffect, useState } from 'react'; + +export default function MswProvider({ children }: { children: React.ReactNode }) { + const [mocksReady, setMocksReady] = useState(false); + + useEffect(() => { + if (typeof window !== 'undefined') { + void import('msw/browser').then((a) => { + void a + .setupWorker(...handlers(window.location.origin)) + .start() + .then(() => setMocksReady(true)); + }); + } + }, []); + + return mocksReady && children; +} diff --git a/packages/example/server/api/checkProof.ts b/packages/example/server/api/checkProof.ts new file mode 100644 index 000000000..24e4f91f6 --- /dev/null +++ b/packages/example/server/api/checkProof.ts @@ -0,0 +1,36 @@ +import { HttpResponseResolver } from 'msw'; +import { CheckProofRequest } from '../dto/checkProofRequestDto'; +import { TonApiService } from '../services/tonApiService'; +import { TonProofService } from '../services/tonProofService'; +import { badRequest, ok } from '../utils/httpUtils'; +import { createAuthToken, verifyToken } from '../utils/jwt'; + +/** + * Checks the proof and returns an access token. + * + * POST /api/check_proof + */ +export const checkProof: HttpResponseResolver = async ({ request }) => { + try { + const body = CheckProofRequest.parse(await request.json()); + + const client = TonApiService.create(body.network); + const service = new TonProofService(); + + const isValid = await service.checkProof(body, (address) => client.getWalletPublicKey(address)); + if (!isValid) { + return badRequest({ error: 'Invalid proof' }); + } + + const payloadToken = body.proof.payload; + if (!(await verifyToken(payloadToken))) { + return badRequest({ error: 'Invalid token' }); + } + + const token = await createAuthToken({ address: body.address, network: body.network }); + + return ok({ token: token }); + } catch (e) { + return badRequest({ error: 'Invalid request', trace: e }); + } +}; diff --git a/packages/example/server/api/generatePayload.ts b/packages/example/server/api/generatePayload.ts new file mode 100644 index 000000000..5c05025e1 --- /dev/null +++ b/packages/example/server/api/generatePayload.ts @@ -0,0 +1,22 @@ +import { HttpResponseResolver } from 'msw'; +import { TonProofService } from '../services/tonProofService'; +import { badRequest, ok } from '../utils/httpUtils'; +import { createPayloadToken } from '../utils/jwt'; + +/** + * Generates a payload for ton proof. + * + * POST /api/generate_payload + */ +export const generatePayload: HttpResponseResolver = async () => { + try { + const service = new TonProofService(); + + const payload = service.generatePayload(); + const payloadToken = await createPayloadToken({ payload: payload }); + + return ok({ payload: payloadToken }); + } catch (e) { + return badRequest({ error: 'Invalid request', trace: e }); + } +}; diff --git a/packages/example/server/api/getAccountInfo.ts b/packages/example/server/api/getAccountInfo.ts new file mode 100644 index 000000000..962a9ad86 --- /dev/null +++ b/packages/example/server/api/getAccountInfo.ts @@ -0,0 +1,30 @@ +import { HttpResponseResolver } from 'msw'; +import { TonApiService } from '../services/tonApiService'; +import { badRequest, ok, unauthorized } from '../utils/httpUtils'; +import { decodeAuthToken, verifyToken } from '../utils/jwt'; + +/** + * Returns account info. + * + * GET /api/get_account_info + */ +export const getAccountInfo: HttpResponseResolver = async ({ request }) => { + try { + const token = request.headers.get('Authorization')?.replace('Bearer ', ''); + + if (!token || !(await verifyToken(token))) { + return unauthorized({ error: 'Unauthorized' }); + } + + const payload = decodeAuthToken(token); + if (!payload?.address || !payload?.network) { + return unauthorized({ error: 'Invalid token' }); + } + + const client = TonApiService.create(payload.network); + + return ok(await client.getAccountInfo(payload.address)); + } catch (e) { + return badRequest({ error: 'Invalid request', trace: e }); + } +}; diff --git a/packages/example/server/dto/checkProofRequestDto.ts b/packages/example/server/dto/checkProofRequestDto.ts new file mode 100644 index 000000000..cb8d10da5 --- /dev/null +++ b/packages/example/server/dto/checkProofRequestDto.ts @@ -0,0 +1,20 @@ +import { CHAIN } from '@tonconnect/ui-react'; +import zod from 'zod'; + +export const CheckProofRequest = zod.object({ + address: zod.string(), + network: zod.enum([CHAIN.MAINNET, CHAIN.TESTNET]), + public_key: zod.string(), + proof: zod.object({ + timestamp: zod.number(), + domain: zod.object({ + lengthBytes: zod.number(), + value: zod.string(), + }), + payload: zod.string(), + signature: zod.string(), + state_init: zod.string(), + }), +}); + +export type CheckProofRequestDto = zod.infer; diff --git a/packages/example/server/services/tonApiService.ts b/packages/example/server/services/tonApiService.ts new file mode 100644 index 000000000..e8e065127 --- /dev/null +++ b/packages/example/server/services/tonApiService.ts @@ -0,0 +1,47 @@ +import { Address, TonClient4 } from '@ton/ton'; +import { CHAIN } from '@tonconnect/ui-react'; +import { Buffer } from 'buffer'; + +export class TonApiService { + public static create(client: TonClient4 | CHAIN): TonApiService { + if (client === CHAIN.MAINNET) { + client = new TonClient4({ + endpoint: 'https://mainnet-v4.tonhubapi.com', + }); + } + if (client === CHAIN.TESTNET) { + client = new TonClient4({ + endpoint: 'https://testnet-v4.tonhubapi.com', + }); + } + return new TonApiService(client); + } + + private readonly client: TonClient4; + + private constructor(client: TonClient4) { + this.client = client; + } + + /** + * Get wallet public key by address. + */ + public async getWalletPublicKey(address: string): Promise { + const masterAt = await this.client.getLastBlock(); + const result = await this.client.runMethod( + masterAt.last.seqno, + Address.parse(address), + 'get_public_key', + [], + ); + return Buffer.from(result.reader.readBigNumber().toString(16).padStart(64, '0'), 'hex'); + } + + /** + * Get account info by address. + */ + public async getAccountInfo(address: string): Promise> { + const masterAt = await this.client.getLastBlock(); + return await this.client.getAccount(masterAt.last.seqno, Address.parse(address)); + } +} diff --git a/packages/example/server/services/tonProofService.ts b/packages/example/server/services/tonProofService.ts new file mode 100644 index 000000000..564f7df74 --- /dev/null +++ b/packages/example/server/services/tonProofService.ts @@ -0,0 +1,116 @@ +import { sha256 } from '@noble/hashes/sha256'; +import { Address, Cell, contractAddress, loadStateInit } from '@ton/ton'; +import { Buffer } from 'buffer'; +import { randomBytes, sign } from 'tweetnacl'; +import { CheckProofRequestDto } from '../dto/checkProofRequestDto'; +import { tryParsePublicKey } from '../wrappers/walletsData'; + +const tonProofPrefix = 'ton-proof-item-v2/'; +const tonConnectPrefix = 'ton-connect'; +const allowedDomains = ['ton-connect.github.io', 'localhost:5173']; +const validAuthTime = 15 * 60; // 15 minute + +export class TonProofService { + /** + * Generate a random payload. + */ + public generatePayload(): string { + return Buffer.from(randomBytes(32)).toString('hex'); + } + + /** + * Reference implementation of the checkProof method: + * https://github.com/ton-blockchain/ton-connect/blob/main/requests-responses.md#address-proof-signature-ton_proof + */ + public async checkProof( + payload: CheckProofRequestDto, + getWalletPublicKey: (address: string) => Promise, + ): Promise { + try { + const stateInit = loadStateInit(Cell.fromBase64(payload.proof.state_init).beginParse()); + + // 1. First, try to obtain public key via get_public_key get-method on smart contract deployed at Address. + // 2. If the smart contract is not deployed yet, or the get-method is missing, you need: + // 2.1. Parse TonAddressItemReply.walletStateInit and get public key from stateInit. You can compare the walletStateInit.code + // with the code of standard wallets contracts and parse the data according to the found wallet version. + const publicKey = tryParsePublicKey(stateInit) ?? (await getWalletPublicKey(payload.address)); + if (!publicKey) { + return false; + } + + // 2.2. Check that TonAddressItemReply.publicKey equals to obtained public key + const wantedPublicKey = Buffer.from(payload.public_key, 'hex'); + if (!publicKey.equals(wantedPublicKey)) { + return false; + } + + // 2.3. Check that TonAddressItemReply.walletStateInit.hash() equals to TonAddressItemReply.address. .hash() means BoC hash. + const wantedAddress = Address.parse(payload.address); + const address = contractAddress(wantedAddress.workChain, stateInit); + if (!address.equals(wantedAddress)) { + return false; + } + + if (!allowedDomains.includes(payload.proof.domain.value)) { + return false; + } + + const now = Math.floor(Date.now() / 1000); + if (now - validAuthTime > payload.proof.timestamp) { + return false; + } + + const message = { + workchain: address.workChain, + address: address.hash, + domain: { + lengthBytes: payload.proof.domain.lengthBytes, + value: payload.proof.domain.value, + }, + signature: Buffer.from(payload.proof.signature, 'base64'), + payload: payload.proof.payload, + stateInit: payload.proof.state_init, + timestamp: payload.proof.timestamp, + }; + + const wc = Buffer.alloc(4); + wc.writeUInt32BE(message.workchain, 0); + + const ts = Buffer.alloc(8); + ts.writeBigUInt64LE(BigInt(message.timestamp), 0); + + const dl = Buffer.alloc(4); + dl.writeUInt32LE(message.domain.lengthBytes, 0); + + // message = utf8_encode("ton-proof-item-v2/") ++ + // Address ++ + // AppDomain ++ + // Timestamp ++ + // Payload + const msg = Buffer.concat([ + Buffer.from(tonProofPrefix), + wc, + message.address, + dl, + Buffer.from(message.domain.value), + ts, + Buffer.from(message.payload), + ]); + + const msgHash = Buffer.from(sha256(msg)); + + // signature = Ed25519Sign(privkey, sha256(0xffff ++ utf8_encode("ton-connect") ++ sha256(message))) + const fullMsg = Buffer.concat([ + Buffer.from([0xff, 0xff]), + Buffer.from(tonConnectPrefix), + msgHash, + ]); + + const result = Buffer.from(sha256(fullMsg)); + + return sign.detached.verify(result, message.signature, publicKey); + } catch (e) { + return false; + } + } +} diff --git a/packages/example/server/utils/httpUtils.ts b/packages/example/server/utils/httpUtils.ts new file mode 100644 index 000000000..ba171a7f0 --- /dev/null +++ b/packages/example/server/utils/httpUtils.ts @@ -0,0 +1,28 @@ +import { HttpResponse, JsonBodyType, StrictResponse } from 'msw'; + +/** + * Receives a body and returns an HTTP response with the given body and status code 200. + */ +export function ok(body: T): StrictResponse { + return HttpResponse.json(body, { status: 200, statusText: 'OK' }); +} + +/** + * Receives a body and returns an HTTP response with the given body and status code 400. + */ +export function badRequest(body: T): StrictResponse { + return HttpResponse.json(body, { + status: 400, + statusText: 'Bad Request', + }); +} + +/** + * Receives a body and returns an HTTP response with the given body and status code 401. + */ +export function unauthorized(body: T): StrictResponse { + return HttpResponse.json(body, { + status: 401, + statusText: 'Unauthorized', + }); +} diff --git a/packages/example/server/utils/jwt.ts b/packages/example/server/utils/jwt.ts new file mode 100644 index 000000000..98f7f8878 --- /dev/null +++ b/packages/example/server/utils/jwt.ts @@ -0,0 +1,69 @@ +import { CHAIN } from '@tonconnect/ui-react'; +import { decodeJwt, JWTPayload, jwtVerify, SignJWT } from 'jose'; + +/** + * Secret key for the token. + */ +const JWT_SECRET_KEY = 'your_secret_key'; + +/** + * Payload of the token. + */ +export type AuthToken = { + address: string; + network: CHAIN; +}; + +export type PayloadToken = { + payload: string; +}; + +/** + * Create a token with the given payload. + */ +function buildCreateToken( + expirationTime: string, +): (payload: T) => Promise { + return async (payload: T) => { + const encoder = new TextEncoder(); + const key = encoder.encode(JWT_SECRET_KEY); + return new SignJWT(payload) + .setProtectedHeader({ alg: 'HS256' }) + .setIssuedAt() + .setExpirationTime(expirationTime) + .sign(key); + }; +} + +export const createAuthToken = buildCreateToken('1Y'); +export const createPayloadToken = buildCreateToken('15m'); + +/** + * Verify the given token. + */ +export async function verifyToken(token: string): Promise { + const encoder = new TextEncoder(); + const key = encoder.encode(JWT_SECRET_KEY); + try { + const { payload } = await jwtVerify(token, key); + return payload; + } catch (e) { + return null; + } +} + +/** + * Decode the given token. + */ +function buildDecodeToken(): (token: string) => T | null { + return (token: string) => { + try { + return decodeJwt(token) as T; + } catch (e) { + return null; + } + }; +} + +export const decodeAuthToken = buildDecodeToken(); +export const decodePayloadToken = buildDecodeToken(); diff --git a/packages/example/server/worker.ts b/packages/example/server/worker.ts new file mode 100644 index 000000000..c378eb87e --- /dev/null +++ b/packages/example/server/worker.ts @@ -0,0 +1,11 @@ +import { http } from 'msw'; +import { checkProof } from './api/checkProof'; +import { generatePayload } from './api/generatePayload'; +import { getAccountInfo } from './api/getAccountInfo'; + +// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment +export const handlers = (baseUrl: string) => [ + http.post(`${baseUrl}/api/generate_payload`, generatePayload), + http.post(`${baseUrl}/api/check_proof`, checkProof), + http.get(`${baseUrl}/api/get_account_info`, getAccountInfo), +]; diff --git a/packages/example/server/wrappers/walletContractV4R1.ts b/packages/example/server/wrappers/walletContractV4R1.ts new file mode 100644 index 000000000..8256a8c2b --- /dev/null +++ b/packages/example/server/wrappers/walletContractV4R1.ts @@ -0,0 +1,18 @@ +import { Cell, contractAddress, WalletContractV4 as WalletContractV4R2 } from '@ton/ton'; +import { Buffer } from 'buffer'; + +export class WalletContractV4R1 { + static create(args: { workchain: number; publicKey: Buffer; walletId?: number | null }) { + const wallet = WalletContractV4R2.create(args); + const { data } = wallet.init; + const code = Cell.fromBoc( + Buffer.from( + 'B5EE9C72410215010002F5000114FF00F4A413F4BCF2C80B010201200203020148040504F8F28308D71820D31FD31FD31F02F823BBF263ED44D0D31FD31FD3FFF404D15143BAF2A15151BAF2A205F901541064F910F2A3F80024A4C8CB1F5240CB1F5230CBFF5210F400C9ED54F80F01D30721C0009F6C519320D74A96D307D402FB00E830E021C001E30021C002E30001C0039130E30D03A4C8CB1F12CB1FCBFF1112131403EED001D0D3030171B0915BE021D749C120915BE001D31F218210706C7567BD228210626C6E63BDB022821064737472BDB0925F03E002FA403020FA4401C8CA07CBFFC9D0ED44D0810140D721F404305C810108F40A6FA131B3925F05E004D33FC8258210706C7567BA9131E30D248210626C6E63BAE30004060708020120090A005001FA00F404308210706C7567831EB17080185005CB0527CF165003FA02F40012CB69CB1F5210CB3F0052F8276F228210626C6E63831EB17080185005CB0527CF1624FA0214CB6A13CB1F5230CB3F01FA02F4000092821064737472BA8E3504810108F45930ED44D0810140D720C801CF16F400C9ED54821064737472831EB17080185004CB0558CF1622FA0212CB6ACB1FCB3F9410345F04E2C98040FB000201200B0C0059BD242B6F6A2684080A06B90FA0218470D4080847A4937D29910CE6903E9FF9837812801B7810148987159F31840201580D0E0011B8C97ED44D0D70B1F8003DB29DFB513420405035C87D010C00B23281F2FFF274006040423D029BE84C600201200F100019ADCE76A26840206B90EB85FFC00019AF1DF6A26840106B90EB858FC0006ED207FA00D4D422F90005C8CA0715CBFFC9D077748018C8CB05CB0222CF165005FA0214CB6B12CCCCC971FB00C84014810108F451F2A702006C810108D718C8542025810108F451F2A782106E6F746570748018C8CB05CB025004CF16821005F5E100FA0213CB6A12CB1FC971FB00020072810108D718305202810108F459F2A7F82582106473747270748018C8CB05CB025005CF16821005F5E100FA0214CB6A13CB1F12CB3FC973FB00000AF400C9ED5446A9F34F', + 'hex', + ), + )[0]!; + (wallet as any).init = { data, code }; + (wallet as any).address = contractAddress(args.workchain, wallet.init); + return wallet; + } +} diff --git a/packages/example/server/wrappers/walletsData.ts b/packages/example/server/wrappers/walletsData.ts new file mode 100644 index 000000000..cf2e72953 --- /dev/null +++ b/packages/example/server/wrappers/walletsData.ts @@ -0,0 +1,95 @@ +import { + Slice, + StateInit, + WalletContractV1R1, + WalletContractV1R2, + WalletContractV1R3, + WalletContractV2R1, + WalletContractV2R2, + WalletContractV3R1, + WalletContractV3R2, + WalletContractV4 as WalletContractV4R2, + WalletContractV5Beta, + WalletContractV5R1, +} from '@ton/ton'; +import { Buffer } from 'buffer'; +import { WalletContractV4R1 } from './walletContractV4R1'; + +const knownWallets = [ + { contract: WalletContractV1R1, loadData: loadWalletV1Data }, + { contract: WalletContractV1R2, loadData: loadWalletV1Data }, + { contract: WalletContractV1R3, loadData: loadWalletV1Data }, + { contract: WalletContractV2R1, loadData: loadWalletV2Data }, + { contract: WalletContractV2R2, loadData: loadWalletV2Data }, + { contract: WalletContractV3R1, loadData: loadWalletV3Data }, + { contract: WalletContractV3R2, loadData: loadWalletV3Data }, + { contract: WalletContractV4R1, loadData: loadWalletV4Data }, + { contract: WalletContractV4R2, loadData: loadWalletV4Data }, + { contract: WalletContractV5Beta, loadData: loadWalletV5BetaData }, + { contract: WalletContractV5R1, loadData: loadWalletV5Data }, +].map(({ contract, loadData }) => ({ + contract: contract, + loadData: loadData, + wallet: contract.create({ workchain: 0, publicKey: Buffer.alloc(32) }), +})); + +function loadWalletV1Data(cs: Slice) { + const seqno = cs.loadUint(32); + const publicKey = cs.loadBuffer(32); + return { seqno, publicKey }; +} + +function loadWalletV2Data(cs: Slice) { + const seqno = cs.loadUint(32); + const publicKey = cs.loadBuffer(32); + return { seqno, publicKey }; +} + +function loadWalletV3Data(cs: Slice) { + const seqno = cs.loadUint(32); + const walletId = cs.loadUint(32); + const publicKey = cs.loadBuffer(32); + return { seqno, publicKey, walletId }; +} + +function loadWalletV4Data(cs: Slice) { + const seqno = cs.loadUint(32); + const walletId = cs.loadUint(32); + const publicKey = cs.loadBuffer(32); + const plugins = cs.loadMaybeRef(); + return { seqno, publicKey, walletId, plugins }; +} + +function loadWalletV5BetaData(cs: Slice) { + const isSignatureAuthAllowed = cs.loadBoolean(); + const seqno = cs.loadUint(32); + const walletId = cs.loadUintBig(80); + const publicKey = cs.loadBuffer(32); + const plugins = cs.loadMaybeRef(); + return { isSignatureAuthAllowed, seqno, publicKey, walletId, plugins }; +} + +function loadWalletV5Data(cs: Slice) { + const isSignatureAuthAllowed = cs.loadBoolean(); + const seqno = cs.loadUint(32); + const walletId = cs.loadUint(32); + const publicKey = cs.loadBuffer(32); + const plugins = cs.loadMaybeRef(); + return { isSignatureAuthAllowed, seqno, publicKey, walletId, plugins }; +} + +export function tryParsePublicKey(stateInit: StateInit): Buffer | null { + if (!stateInit.code || !stateInit.data) { + return null; + } + + for (const { wallet, loadData } of knownWallets) { + try { + if (wallet.init.code.equals(stateInit.code)) { + return loadData(stateInit.data.beginParse()).publicKey; + } + } catch (e) {} + } + + return null; +} diff --git a/packages/example/yarn.lock b/packages/example/yarn.lock index 32e807ee9..05f6ccbef 100644 --- a/packages/example/yarn.lock +++ b/packages/example/yarn.lock @@ -1010,6 +1010,28 @@ "@noble/hashes" "^1.1.5" "@noble/secp256k1" "^1.7.1" +"@bundled-es-modules/cookie@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/cookie/-/cookie-2.0.0.tgz#c3b82703969a61cf6a46e959a012b2c257f6b164" + integrity sha512-Or6YHg/kamKHpxULAdSqhGqnWFneIXu1NKvvfBBzKGwpVsYuFIQ5aBPHDnnoR3ghW1nvSkALd+EF9iMtY7Vjxw== + dependencies: + cookie "^0.5.0" + +"@bundled-es-modules/statuses@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz#761d10f44e51a94902c4da48675b71a76cc98872" + integrity sha512-yn7BklA5acgcBr+7w064fGV+SGIFySjCKpqjcWgBAIfrAkY+4GQTJJHQMeT3V/sgz23VTEVV8TtOmkvJAhFVfg== + dependencies: + statuses "^2.0.1" + +"@bundled-es-modules/tough-cookie@^0.1.6": + version "0.1.6" + resolved "https://registry.yarnpkg.com/@bundled-es-modules/tough-cookie/-/tough-cookie-0.1.6.tgz#fa9cd3cedfeecd6783e8b0d378b4a99e52bde5d3" + integrity sha512-dvMHbL464C0zI+Yqxbz6kZ5TOEp7GLW+pry/RWndAR8MJQAXZ2rPmIs8tziTZjeIyhSNZgZbCePtfSbdWqStJw== + dependencies: + "@types/tough-cookie" "^4.0.5" + tough-cookie "^4.1.4" + "@cfxjs/abi@>=0.0.2": version "0.0.2" resolved "https://registry.yarnpkg.com/@cfxjs/abi/-/abi-0.0.2.tgz#749fbfa30db1033f4cc6b3b54b0a2394550c66f8" @@ -1782,6 +1804,45 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz#e5211452df060fa8522b55c7b3c0c4d1981cb044" integrity sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw== +"@inquirer/confirm@^3.0.0": + version "3.1.22" + resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-3.1.22.tgz#23990624c11f60c6f7a5b0558c7505c35076a037" + integrity sha512-gsAKIOWBm2Q87CDfs9fEo7wJT3fwWIJfnDGMn9Qy74gBnNFOACDNfhUzovubbJjWnKLGBln7/NcSmZwj5DuEXg== + dependencies: + "@inquirer/core" "^9.0.10" + "@inquirer/type" "^1.5.2" + +"@inquirer/core@^9.0.10": + version "9.0.10" + resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-9.0.10.tgz#4270191e2ad3bea6223530a093dd9479bcbc7dd0" + integrity sha512-TdESOKSVwf6+YWDz8GhS6nKscwzkIyakEzCLJ5Vh6O3Co2ClhCJ0A4MG909MUWfaWdpJm7DE45ii51/2Kat9tA== + dependencies: + "@inquirer/figures" "^1.0.5" + "@inquirer/type" "^1.5.2" + "@types/mute-stream" "^0.0.4" + "@types/node" "^22.1.0" + "@types/wrap-ansi" "^3.0.0" + ansi-escapes "^4.3.2" + cli-spinners "^2.9.2" + cli-width "^4.1.0" + mute-stream "^1.0.0" + signal-exit "^4.1.0" + strip-ansi "^6.0.1" + wrap-ansi "^6.2.0" + yoctocolors-cjs "^2.1.2" + +"@inquirer/figures@^1.0.5": + version "1.0.5" + resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.5.tgz#57f9a996d64d3e3345d2a3ca04d36912e94f8790" + integrity sha512-79hP/VWdZ2UVc9bFGJnoQ/lQMpL74mGgzSYX1xUqCVk7/v73vJCMw1VuyWN1jGkZ9B3z7THAbySqGbCNefcjfA== + +"@inquirer/type@^1.5.2": + version "1.5.2" + resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-1.5.2.tgz#15f5e4a4dae02c4203650cb07c8a000cdd423939" + integrity sha512-w9qFkumYDCNyDZmNQjf/n6qQuvQ4dMC3BJesY4oF+yr0CxR5vxujflAVeIcS6U336uzi9GM0kAfZlLrZ9UTkpA== + dependencies: + mute-stream "^1.0.0" + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -2244,6 +2305,18 @@ "@motionone/dom" "^10.16.4" tslib "^2.3.1" +"@mswjs/interceptors@^0.29.0": + version "0.29.1" + resolved "https://registry.yarnpkg.com/@mswjs/interceptors/-/interceptors-0.29.1.tgz#e77fc58b5188569041d0440b25c9e9ebb1ccd60a" + integrity sha512-3rDakgJZ77+RiQUuSK69t1F0m8BQKA8Vh5DCS5V0DWvNY67zob2JhhQrhCO0AKLGINTRSFd1tBaHcJTkhefoSw== + dependencies: + "@open-draft/deferred-promise" "^2.2.0" + "@open-draft/logger" "^0.3.0" + "@open-draft/until" "^2.0.0" + is-node-process "^1.2.0" + outvariant "^1.2.1" + strict-event-emitter "^0.5.1" + "@mysten/bcs@0.11.1": version "0.11.1" resolved "https://registry.yarnpkg.com/@mysten/bcs/-/bcs-0.11.1.tgz#0cc0b0f5960f60cfe5cf6a8c229affa59cd09b1b" @@ -2495,152 +2568,170 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@onekeyfe/cross-inpage-provider-core@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@onekeyfe/cross-inpage-provider-core/-/cross-inpage-provider-core-2.0.4.tgz#ae29d8acb74491f85c5cba4cf8d831abd2ea243e" - integrity sha512-q20HSeQCGWBUkqNVSqZSH2Y0YunlD+qvIzJDFS7OumBmX5TeosyoSFVsLoBIh5eEtlhCjEwBKIcn7Vlyhce4jw== +"@onekeyfe/cross-inpage-provider-core@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@onekeyfe/cross-inpage-provider-core/-/cross-inpage-provider-core-2.1.2.tgz#c0f063dea233a577f0d7531bd274995b6848564f" + integrity sha512-bZqxfQqonNcUFhbqRGHh3vpLBOCqOZXjDLs1noj7Nops2/vrRMGVdnEd+EJkY0A/j9smwXCmDIF82dWnfeKNdw== dependencies: - "@onekeyfe/cross-inpage-provider-errors" "2.0.4" - "@onekeyfe/cross-inpage-provider-events" "2.0.4" - "@onekeyfe/cross-inpage-provider-types" "2.0.4" + "@onekeyfe/cross-inpage-provider-errors" "2.1.2" + "@onekeyfe/cross-inpage-provider-events" "2.1.2" + "@onekeyfe/cross-inpage-provider-types" "2.1.2" events "^3.3.0" lodash-es "^4.17.21" ms "^2.1.3" -"@onekeyfe/cross-inpage-provider-errors@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@onekeyfe/cross-inpage-provider-errors/-/cross-inpage-provider-errors-2.0.4.tgz#0b7dfe0ec00a6c10f8b1d856938544afc36babe1" - integrity sha512-EKGV5892cLMrSRifregRdqhVxZZ3E1GPZCA8DlOYMYTt9bRO7GBRZV1PZ6rmo+gaA7sDGs6A29ti+RyHafSKJw== +"@onekeyfe/cross-inpage-provider-errors@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@onekeyfe/cross-inpage-provider-errors/-/cross-inpage-provider-errors-2.1.2.tgz#6130d4d6515357aaf2e00c323d6a371cb0e5b260" + integrity sha512-kOopw0cM6jpbOTfSYu414KrGJ6OcK4BvBJEUQ4tYFJEGp7GZK2lekxlQZ+WDg3xDIZD3IYm76sWtnk8BBlJVHQ== dependencies: fast-safe-stringify "^2.0.6" -"@onekeyfe/cross-inpage-provider-events@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@onekeyfe/cross-inpage-provider-events/-/cross-inpage-provider-events-2.0.4.tgz#b0f97e4604c56b7343178c58e36075ebb828df26" - integrity sha512-vNCxBjLQjx7HuUiLBTqX3r8QQW9ycwzf79b73eAAPuHaI7WNsVAlre8AFLYNEv5mWEer1v6iJxXGRx0WbyXOsA== +"@onekeyfe/cross-inpage-provider-events@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@onekeyfe/cross-inpage-provider-events/-/cross-inpage-provider-events-2.1.2.tgz#fd3041e8bcb3bf625e569ac608778a03d6542a26" + integrity sha512-Hr3xyPjVY8q2/ZuZgKJ4rlzMOM54jXTkughyyiUipndhN+jzjOFvgl0OPzV0pqX8PyREKXQ65OZ67quJsK78ng== -"@onekeyfe/cross-inpage-provider-types@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@onekeyfe/cross-inpage-provider-types/-/cross-inpage-provider-types-2.0.4.tgz#ecd3692da6455b0a9ee15c6f811b7fcd093eae88" - integrity sha512-6X9JZ6/gV1VrDDWdJvWDiD/R2ge4AFHyjKW1YlSsNsE2W5W9vWB5n2Ls6N5eoc9zpa+mIKPiBvTNu6sdfgJiwQ== +"@onekeyfe/cross-inpage-provider-types@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@onekeyfe/cross-inpage-provider-types/-/cross-inpage-provider-types-2.1.2.tgz#d599c17266f5d914c3c48d3845d4c2cc3edf7024" + integrity sha512-iYKz4Gq+Ro9sLZdWf0GFhcELH15a6denloUCjloKrp9FyqHNRftKJ2f1oO7JxJxOoj307IVHS5mopAtriYkdCg== -"@onekeyfe/extension-bridge-injected@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@onekeyfe/extension-bridge-injected/-/extension-bridge-injected-2.0.4.tgz#4d466cdc9c3784e7bbfd16f3b834f0eb77faf3d7" - integrity sha512-Yzf2CPads2V/b9Rj9T9gA3gvU8o45z4L2sSDy//g1QRouI76IgJQZqv5qJ2vldaB3QqGIAMX0ilEvwaJfiOEoQ== +"@onekeyfe/extension-bridge-injected@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@onekeyfe/extension-bridge-injected/-/extension-bridge-injected-2.1.2.tgz#af719639a09ea1de188d0d14dc1170b2fb14b1d0" + integrity sha512-LKrPjh9VVHnUFn4UW7QR32w6huPNHQqzHt/6Ws57JAyCyllfjTvYtdsdPLLIB9kNo6Gk834uV7cm4wn+MDYP7w== dependencies: - "@onekeyfe/cross-inpage-provider-core" "2.0.4" - "@onekeyfe/cross-inpage-provider-types" "2.0.4" + "@onekeyfe/cross-inpage-provider-core" "2.1.2" + "@onekeyfe/cross-inpage-provider-types" "2.1.2" -"@onekeyfe/onekey-aptos-provider@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-aptos-provider/-/onekey-aptos-provider-2.0.4.tgz#5a4e2cdc664062eb624d420dbcb1e715bc4a7561" - integrity sha512-q2GQ253rNetbfALpdj1HBFy7a2EdeNRy8CCMFlhZ+9VQSWSNiX+qZ06bk83MTdsP1haGHw8NH7X2RvKJribJ4Q== +"@onekeyfe/onekey-aptos-provider@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-aptos-provider/-/onekey-aptos-provider-2.1.2.tgz#f9ccc05feaa8af5f1be47b0d5214d7b319450176" + integrity sha512-i8hW4LTJN0gb3HJbPYtJxHpy9hDUpqgvzv9UGrTnT2dfSAWFNoHJrkmGEknuG7J1j7u+zED3qu1Eb40Tyr6TGw== dependencies: - "@onekeyfe/cross-inpage-provider-core" "2.0.4" - "@onekeyfe/cross-inpage-provider-errors" "2.0.4" - "@onekeyfe/cross-inpage-provider-types" "2.0.4" - "@onekeyfe/extension-bridge-injected" "2.0.4" + "@onekeyfe/cross-inpage-provider-core" "2.1.2" + "@onekeyfe/cross-inpage-provider-errors" "2.1.2" + "@onekeyfe/cross-inpage-provider-types" "2.1.2" + "@onekeyfe/extension-bridge-injected" "2.1.2" aptos "^1.3.17" eth-rpc-errors "^4.0.3" -"@onekeyfe/onekey-cardano-provider@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-cardano-provider/-/onekey-cardano-provider-2.0.4.tgz#b7b6209a8a480ccd50a2699ddb6908f36a159f5a" - integrity sha512-y/bYlF9mCqL8rsNUS4hLbIW0sU22r8qma4LCLXrvoXMIPEI03ysRWQOX8uoOpzoQrgXp55RjVpCW383uvMpyww== +"@onekeyfe/onekey-cardano-provider@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-cardano-provider/-/onekey-cardano-provider-2.1.2.tgz#c35947dbee1fc7b43dd60934fef44ffbbc4a291e" + integrity sha512-pxGQIFX8gHE87/UBx2Bg+OLXsZmjBDWs99eb3gdTZX0uFFgfGmKGpLAumvkVr8DNc5bIXJuWOQJGa78loSGF0g== dependencies: - "@onekeyfe/cross-inpage-provider-core" "2.0.4" - "@onekeyfe/cross-inpage-provider-errors" "2.0.4" - "@onekeyfe/cross-inpage-provider-types" "2.0.4" - "@onekeyfe/extension-bridge-injected" "2.0.4" + "@onekeyfe/cross-inpage-provider-core" "2.1.2" + "@onekeyfe/cross-inpage-provider-errors" "2.1.2" + "@onekeyfe/cross-inpage-provider-types" "2.1.2" + "@onekeyfe/extension-bridge-injected" "2.1.2" -"@onekeyfe/onekey-conflux-provider@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-conflux-provider/-/onekey-conflux-provider-2.0.4.tgz#334f1aabb1e5bc480c111faaa9ef476707733338" - integrity sha512-0OVTp1sw1gyVTDhE6D7bnCIBFUpC/f80H1bcJiFmZUhTwbdEOgBn/DsWWg9qjr5uWV06OkrIK3uAQH9dtEa5uQ== +"@onekeyfe/onekey-conflux-provider@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-conflux-provider/-/onekey-conflux-provider-2.1.2.tgz#e5231f9434ef85b27e22a95d46f9933914740f66" + integrity sha512-7Z8p0bf0ThyeSyc5VqtrTFgiEeY3hWIcOEeUrkIzj/YlMN6NIj/XJwd7jpn/98q3+FCkx3z5+bRf+CX7cAceig== dependencies: - "@onekeyfe/cross-inpage-provider-core" "2.0.4" - "@onekeyfe/cross-inpage-provider-errors" "2.0.4" - "@onekeyfe/cross-inpage-provider-types" "2.0.4" - "@onekeyfe/extension-bridge-injected" "2.0.4" + "@onekeyfe/cross-inpage-provider-core" "2.1.2" + "@onekeyfe/cross-inpage-provider-errors" "2.1.2" + "@onekeyfe/cross-inpage-provider-types" "2.1.2" + "@onekeyfe/extension-bridge-injected" "2.1.2" -"@onekeyfe/onekey-cosmos-provider@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-cosmos-provider/-/onekey-cosmos-provider-2.0.4.tgz#63efdba2b162061789aa748381ded8efe7d74afb" - integrity sha512-hy3t/eEaJ1xb+eEcE3y7C5joGlbiIB2dHW6YfdejBIB7xR7BS9SeW7dAwK5FrNBekwCKnEQidWlwUTrflXSayA== +"@onekeyfe/onekey-cosmos-provider@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-cosmos-provider/-/onekey-cosmos-provider-2.1.2.tgz#e2ac2772ffad3014b07fbc978df2f45e55fcc05d" + integrity sha512-UfVJAqcqeLhNFzHxkzQRQzVF1h4C+FlGG/DrHn5Vokvu5vzL1cygic0pQWRRZbTZy5h6L3gnImdvuv8DVn1x2A== dependencies: "@noble/hashes" "^1.3.0" - "@onekeyfe/cross-inpage-provider-core" "2.0.4" - "@onekeyfe/cross-inpage-provider-errors" "2.0.4" - "@onekeyfe/cross-inpage-provider-types" "2.0.4" - "@onekeyfe/extension-bridge-injected" "2.0.4" + "@onekeyfe/cross-inpage-provider-core" "2.1.2" + "@onekeyfe/cross-inpage-provider-errors" "2.1.2" + "@onekeyfe/cross-inpage-provider-types" "2.1.2" + "@onekeyfe/extension-bridge-injected" "2.1.2" eth-rpc-errors "^4.0.3" long "^5.2.1" mitt "^3.0.0" -"@onekeyfe/onekey-near-provider@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-near-provider/-/onekey-near-provider-2.0.4.tgz#2f98e8afefbcb0be49591ca311362fd2554dbe02" - integrity sha512-E75vS1HoUdD6uTQsLV/AvW1rW9+RI8ToxkJuU1y3a3hg0lgLXmuaIS+UBQTZxu5QVPB5VifSerUevOZKoHqCrA== +"@onekeyfe/onekey-near-provider@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-near-provider/-/onekey-near-provider-2.1.2.tgz#11305590af16a9e73fceef1ae1fad2816efbf797" + integrity sha512-8bEah6KsUXxaLchUD0lDo0xTiHQ+GhX8nIJS66hxTnMPYLbBmoB3qW8rmusP8zujv+yu9JgvD4vki/TcvR/dKw== dependencies: - "@onekeyfe/cross-inpage-provider-core" "2.0.4" - "@onekeyfe/cross-inpage-provider-errors" "2.0.4" - "@onekeyfe/cross-inpage-provider-types" "2.0.4" - "@onekeyfe/extension-bridge-injected" "2.0.4" + "@onekeyfe/cross-inpage-provider-core" "2.1.2" + "@onekeyfe/cross-inpage-provider-errors" "2.1.2" + "@onekeyfe/cross-inpage-provider-types" "2.1.2" + "@onekeyfe/extension-bridge-injected" "2.1.2" borsh "^0.6.0" depd "^2.0.0" tweetnacl "^1.0.3" -"@onekeyfe/onekey-solana-provider@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-solana-provider/-/onekey-solana-provider-2.0.4.tgz#d1ad041e5a16d6654518c3723b2bf7d2cd46f5a6" - integrity sha512-1qhCEpq1u07nt+so2/g/nWMgMepvEeYBcwbrd0mFHoPiGJMrz7Leozl0ZEN9dF/CATVJ5iahZ3kD0eUa59+UtA== +"@onekeyfe/onekey-solana-provider@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-solana-provider/-/onekey-solana-provider-2.1.2.tgz#1e6379cfe4b9ed0f179ad8ae7f8707df6f41a6aa" + integrity sha512-a0QxMR6HtWDqbsP1x5R3IzWeQ2ahfUntW0wZOKk32znR35vsf/1M9ZpCN2SAo+zD1oP/9y8GJQodRiIKcXsMPw== dependencies: - "@onekeyfe/cross-inpage-provider-core" "2.0.4" - "@onekeyfe/cross-inpage-provider-errors" "2.0.4" - "@onekeyfe/cross-inpage-provider-types" "2.0.4" - "@onekeyfe/extension-bridge-injected" "2.0.4" + "@onekeyfe/cross-inpage-provider-core" "2.1.2" + "@onekeyfe/cross-inpage-provider-errors" "2.1.2" + "@onekeyfe/cross-inpage-provider-types" "2.1.2" + "@onekeyfe/extension-bridge-injected" "2.1.2" "@solana/wallet-standard-features" "^1.1.0" "@solana/web3.js" "^1.41.3" "@wallet-standard/base" "^1.0.1" bs58 "^5.0.0" -"@onekeyfe/onekey-sui-provider@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-sui-provider/-/onekey-sui-provider-2.0.4.tgz#c68559cc4683e618bf96fffe9c2c62986761c3f6" - integrity sha512-TjxkAmhR0hw1jhtWquwB4HO3WOSM7X7Dc6waJofbUAS+XTBpfLiFidb3v7PAEQOlM2VZc+RYDHOZUya23nx5+g== +"@onekeyfe/onekey-sui-provider@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-sui-provider/-/onekey-sui-provider-2.1.2.tgz#ba1022ead5cd10d2a74fca75074f0ce21a9a2e52" + integrity sha512-vJ6cYvuErjol+fBUftPW4PtlgQAYk+9HL1c/NZY1HVYLSN9/D0Yh6Q+KEdZYklupfAKLFravxY8RjJ/IsyS1CA== dependencies: "@mysten/wallet-standard" "^0.7.2" - "@onekeyfe/cross-inpage-provider-core" "2.0.4" - "@onekeyfe/cross-inpage-provider-errors" "2.0.4" - "@onekeyfe/cross-inpage-provider-types" "2.0.4" - "@onekeyfe/extension-bridge-injected" "2.0.4" + "@onekeyfe/cross-inpage-provider-core" "2.1.2" + "@onekeyfe/cross-inpage-provider-errors" "2.1.2" + "@onekeyfe/cross-inpage-provider-types" "2.1.2" + "@onekeyfe/extension-bridge-injected" "2.1.2" eth-rpc-errors "^4.0.3" mitt "^3.0.0" -"@onekeyfe/onekey-tron-provider@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-tron-provider/-/onekey-tron-provider-2.0.4.tgz#472cb7a3a77996276d831c8b31d250fc3a23e76f" - integrity sha512-XAhp0PGeLF7PviD/f+BsreiX9Pd8dh/g/e8Ft/ovkFklgKtO+i0rUUz6mrZhCuEFE3OGGw9X33uvKrZUnPNE0w== +"@onekeyfe/onekey-tron-provider@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-tron-provider/-/onekey-tron-provider-2.1.2.tgz#ee46529514456aedc7e3d24332cdca6eccc99f5c" + integrity sha512-VVzYWfBdcWDpUjiwmzQNjqw8mBEzGRb/6TcbpLWMzlpFzEuBJN+8W16Kks0SPSuCRrHstTzlb14h7hQ/lh8QhA== dependencies: "@noble/secp256k1" "1.7.1" - "@onekeyfe/cross-inpage-provider-core" "2.0.4" - "@onekeyfe/cross-inpage-provider-errors" "2.0.4" - "@onekeyfe/cross-inpage-provider-types" "2.0.4" - "@onekeyfe/extension-bridge-injected" "2.0.4" + "@onekeyfe/cross-inpage-provider-core" "2.1.2" + "@onekeyfe/cross-inpage-provider-errors" "2.1.2" + "@onekeyfe/cross-inpage-provider-types" "2.1.2" + "@onekeyfe/extension-bridge-injected" "2.1.2" querystring "^0.2.1" sunweb "^1.0.7" tronweb "^5.3.2" -"@onekeyfe/onekey-webln-provider@2.0.4": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-webln-provider/-/onekey-webln-provider-2.0.4.tgz#faeac97df74fb45f8b200f7e951de7ce8c9f5a2e" - integrity sha512-giyaM+fkDFs3SRJPnJ0KW7APPO5i1Yrm/EfClmx26FeRDU0X/vemXMy27Njgr6Kpapw1mi1V2bVP8tIVpvMksA== +"@onekeyfe/onekey-webln-provider@2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@onekeyfe/onekey-webln-provider/-/onekey-webln-provider-2.1.2.tgz#f8ca35c63a42aa3d1bb8740b382e8bd1d6f3c671" + integrity sha512-O36YnuehUBULjaKaowtEFQ05LYR2ATQ761ZQvhVjwM64p2kFX+Qxll3y0SZAD1Nk1R34w2r/nSmPsg5clDkbXQ== dependencies: - "@onekeyfe/cross-inpage-provider-core" "2.0.4" - "@onekeyfe/cross-inpage-provider-errors" "2.0.4" - "@onekeyfe/cross-inpage-provider-types" "2.0.4" - "@onekeyfe/extension-bridge-injected" "2.0.4" + "@onekeyfe/cross-inpage-provider-core" "2.1.2" + "@onekeyfe/cross-inpage-provider-errors" "2.1.2" + "@onekeyfe/cross-inpage-provider-types" "2.1.2" + "@onekeyfe/extension-bridge-injected" "2.1.2" + +"@open-draft/deferred-promise@^2.2.0": + version "2.2.0" + resolved "https://registry.yarnpkg.com/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz#4a822d10f6f0e316be4d67b4d4f8c9a124b073bd" + integrity sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA== + +"@open-draft/logger@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@open-draft/logger/-/logger-0.3.0.tgz#2b3ab1242b360aa0adb28b85f5d7da1c133a0954" + integrity sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ== + dependencies: + is-node-process "^1.2.0" + outvariant "^1.4.0" + +"@open-draft/until@^2.0.0", "@open-draft/until@^2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@open-draft/until/-/until-2.1.0.tgz#0acf32f470af2ceaf47f095cdecd40d68666efda" + integrity sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg== "@open-rpc/client-js@^1.8.1": version "1.8.1" @@ -5418,6 +5509,40 @@ dependencies: "@tanstack/query-core" "5.40.0" +"@ton/core@^0.57.0": + version "0.57.0" + resolved "https://registry.yarnpkg.com/@ton/core/-/core-0.57.0.tgz#fdf2d32848a3d1135b890e9a5bd8295e958a4a81" + integrity sha512-UOehEXEV5yqi+17qmmWdD01YfVgQlYtitSm5OfN/WMg6PAMkt+Uf91JRC4mdPNtkKDhyKuujJuhYs6QiOsHPfw== + dependencies: + symbol.inspect "1.0.1" + +"@ton/crypto-primitives@2.1.0": + version "2.1.0" + resolved "https://registry.yarnpkg.com/@ton/crypto-primitives/-/crypto-primitives-2.1.0.tgz#8c9277c250b59aae3c819e0d6bd61e44d998e9ca" + integrity sha512-PQesoyPgqyI6vzYtCXw4/ZzevePc4VGcJtFwf08v10OevVJHVfW238KBdpj1kEDQkxWLeuNHEpTECNFKnP6tow== + dependencies: + jssha "3.2.0" + +"@ton/crypto@^3.3.0": + version "3.3.0" + resolved "https://registry.yarnpkg.com/@ton/crypto/-/crypto-3.3.0.tgz#019103df6540fbc1d8102979b4587bc85ff9779e" + integrity sha512-/A6CYGgA/H36OZ9BbTaGerKtzWp50rg67ZCH2oIjV1NcrBaCK9Z343M+CxedvM7Haf3f/Ee9EhxyeTp0GKMUpA== + dependencies: + "@ton/crypto-primitives" "2.1.0" + jssha "3.2.0" + tweetnacl "1.0.3" + +"@ton/ton@^15.0.0": + version "15.0.0" + resolved "https://registry.yarnpkg.com/@ton/ton/-/ton-15.0.0.tgz#03aab727d082db877ec6012f3b1b3fb6aa564b40" + integrity sha512-0xBivkN0u0+vczt3mKJrx5yqkCxRR00wM8gXCmN/eOzzHKXRFWDEjJp8EEs5J/mq1Op/OhCOFExmOZkr58wgOA== + dependencies: + axios "^1.6.7" + dataloader "^2.0.0" + symbol.inspect "1.0.1" + teslabot "^1.3.0" + zod "^3.21.4" + "@tonconnect/isomorphic-eventsource@^0.0.2": version "0.0.2" resolved "https://registry.yarnpkg.com/@tonconnect/isomorphic-eventsource/-/isomorphic-eventsource-0.0.2.tgz#e58c44cf9953e090f2c35da9a638946ddb614be5" @@ -5797,6 +5922,11 @@ dependencies: "@types/node" "*" +"@types/cookie@^0.6.0": + version "0.6.0" + resolved "https://registry.yarnpkg.com/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" + integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== + "@types/debug@^4.1.7": version "4.1.12" resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.12.tgz#a155f21690871953410df4b6b6f53187f0500917" @@ -5850,6 +5980,13 @@ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.34.tgz#10964ba0dee6ac4cd462e2795b6bebd407303433" integrity sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g== +"@types/mute-stream@^0.0.4": + version "0.0.4" + resolved "https://registry.yarnpkg.com/@types/mute-stream/-/mute-stream-0.0.4.tgz#77208e56a08767af6c5e1237be8888e2f255c478" + integrity sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow== + dependencies: + "@types/node" "*" + "@types/node-fetch@^2.6.2": version "2.6.2" resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-2.6.2.tgz#d1a9c5fd049d9415dce61571557104dec3ec81da" @@ -5909,6 +6046,13 @@ dependencies: undici-types "~5.26.4" +"@types/node@^22.1.0": + version "22.5.2" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.5.2.tgz#e42344429702e69e28c839a7e16a8262a8086793" + integrity sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg== + dependencies: + undici-types "~6.19.2" + "@types/parse-json@^4.0.0": version "4.0.0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" @@ -5959,6 +6103,16 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== +"@types/statuses@^2.0.4": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/statuses/-/statuses-2.0.5.tgz#f61ab46d5352fd73c863a1ea4e1cef3b0b51ae63" + integrity sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A== + +"@types/tough-cookie@^4.0.5": + version "4.0.5" + resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304" + integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA== + "@types/trusted-types@^2.0.2": version "2.0.7" resolved "https://registry.yarnpkg.com/@types/trusted-types/-/trusted-types-2.0.7.tgz#baccb07a970b91707df3a3e8ba6896c57ead2d11" @@ -5986,6 +6140,11 @@ dependencies: "@types/node" "*" +"@types/wrap-ansi@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@types/wrap-ansi/-/wrap-ansi-3.0.0.tgz#18b97a972f94f60a679fd5c796d96421b9abb9fd" + integrity sha512-ltIpx+kM7g/MLRZfkbL7EsCEjfzCcScLpkg37eXEtx5kmrAKBkTJwd1GIAjDSL8wTpM6Hzn5YO4pSb91BEwu1g== + "@types/ws@^7.2.0", "@types/ws@^7.4.4": version "7.4.7" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-7.4.7.tgz#f7c390a36f7a0679aa69de2d501319f4f8d9b702" @@ -6682,6 +6841,13 @@ anser@^1.4.9: resolved "https://registry.yarnpkg.com/anser/-/anser-1.4.10.tgz#befa3eddf282684bd03b63dcda3927aef8c2e35b" integrity sha512-hCv9AqTQ8ycjpSd3upOJd7vFwW1JaoYQ7tpham03GJ1ca8/65rqn0RpaWpItOAd6ylW9wAw6luXYPJIyPFVOww== +ansi-escapes@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + ansi-fragments@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansi-fragments/-/ansi-fragments-0.2.1.tgz#24409c56c4cc37817c3d7caa99d8969e2de5a05e" @@ -7050,6 +7216,15 @@ axios@^1.6.2: form-data "^4.0.0" proxy-from-env "^1.1.0" +axios@^1.6.7: + version "1.7.7" + resolved "https://registry.yarnpkg.com/axios/-/axios-1.7.7.tgz#2f554296f9892a72ac8d8e4c5b79c14a91d0a47f" + integrity sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q== + dependencies: + follow-redirects "^1.15.6" + form-data "^4.0.0" + proxy-from-env "^1.1.0" + axobject-query@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-3.2.1.tgz#39c378a6e3b06ca679f29138151e45b2b32da62a" @@ -7894,11 +8069,16 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-spinners@^2.5.0: +cli-spinners@^2.5.0, cli-spinners@^2.9.2: version "2.9.2" resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41" integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== +cli-width@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5" + integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ== + client-only@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/client-only/-/client-only-0.0.1.tgz#38bba5d403c41ab150bff64a95c85013cf73bca1" @@ -8131,6 +8311,11 @@ cookie-es@^1.0.0: resolved "https://registry.yarnpkg.com/cookie-es/-/cookie-es-1.1.0.tgz#68f8d9f48aeb5a534f3896f80e792760d3d20def" integrity sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw== +cookie@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + cookiejar@^2.1.2: version "2.1.3" resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" @@ -8359,6 +8544,11 @@ data-uri-to-buffer@^4.0.0: resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-4.0.1.tgz#d8feb2b2881e6a4f58c2e08acfd0e2834e26222e" integrity sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A== +dataloader@^2.0.0: + version "2.2.2" + resolved "https://registry.yarnpkg.com/dataloader/-/dataloader-2.2.2.tgz#216dc509b5abe39d43a9b9d97e6e5e473dfbe3e0" + integrity sha512-8YnDaaf7N3k/q5HnTJVuzSyLETjoZjVmHc4AeKAzOvKHEFQKcn64OKBfzHYtE9zGjctNM7V9I0MfnUVLpi7M5g== + dayjs@^1.8.15: version "1.11.11" resolved "https://registry.yarnpkg.com/dayjs/-/dayjs-1.11.11.tgz#dfe0e9d54c5f8b68ccf8ca5f72ac603e7e5ed59e" @@ -10222,6 +10412,11 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +headers-polyfill@^4.0.2: + version "4.0.3" + resolved "https://registry.yarnpkg.com/headers-polyfill/-/headers-polyfill-4.0.3.tgz#922a0155de30ecc1f785bcf04be77844ca95ad07" + integrity sha512-IScLbePpkvO846sIwOtOTDjutRMWdXdJmXdMvk6gCBHxFO8d+QKOQedyZSxFTTFYRSmlgSTDtXqqq4pcenBXLQ== + hermes-estree@0.19.1: version "0.19.1" resolved "https://registry.yarnpkg.com/hermes-estree/-/hermes-estree-0.19.1.tgz#d5924f5fac2bf0532547ae9f506d6db8f3c96392" @@ -10658,6 +10853,11 @@ is-negative-zero@^2.0.2: resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150" integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== +is-node-process@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/is-node-process/-/is-node-process-1.2.0.tgz#ea02a1b90ddb3934a19aea414e88edef7e11d134" + integrity sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw== + is-number-object@^1.0.4: version "1.0.7" resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.7.tgz#59d50ada4c45251784e9904f5246c742f07a42fc" @@ -11025,6 +11225,11 @@ joi@^17.2.1: "@sideway/formula" "^3.0.1" "@sideway/pinpoint" "^2.0.0" +jose@^5.8.0: + version "5.8.0" + resolved "https://registry.yarnpkg.com/jose/-/jose-5.8.0.tgz#0165cee08d89a6546d7eeeb9524dc42f458a56de" + integrity sha512-E7CqYpL/t7MMnfGnK/eg416OsFCVUrU/Y3Vwe7QjKhu/BkS1Ms455+2xsqZQVN57/U2MHMBvEb5SrmAZWAIntA== + js-base64@^3.7.5: version "3.7.7" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.7.tgz#e51b84bf78fbf5702b9541e2cb7bfcb893b43e79" @@ -11252,7 +11457,7 @@ jsqr@^1.2.0: resolved "https://registry.yarnpkg.com/jsqr/-/jsqr-1.4.0.tgz#8efb8d0a7cc6863cb6d95116b9069123ce9eb2d1" integrity sha512-dxLob7q65Xg2DvstYkRpkYtmKm2sPJ9oFhrhmudT1dZvNFFTlroai3AWSpLey/w5vMcLBXRgOJsbXpdN9HzU/A== -jssha@^3.2.0: +jssha@3.2.0, jssha@^3.2.0: version "3.2.0" resolved "https://registry.yarnpkg.com/jssha/-/jssha-3.2.0.tgz#88ec50b866dd1411deaddbe6b3e3692e4c710f16" integrity sha512-QuruyBENDWdN4tZwJbQq7/eAK85FqrI4oDbXjy5IBhYD+2pTJyBUWZe8ctWaCkrV0gy6AaelgOZZBMeswEa/6Q== @@ -12007,6 +12212,28 @@ ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.3: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== +msw@^2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/msw/-/msw-2.4.1.tgz#bb0ead0311de39d5847ff0836b9dd67e7bba02b8" + integrity sha512-HXcoQPzYTwEmVk+BGIcRa0vLabBT+J20SSSeYh/QfajaK5ceA6dlD4ZZjfz2dqGEq4vRNCPLP6eXsB94KllPFg== + dependencies: + "@bundled-es-modules/cookie" "^2.0.0" + "@bundled-es-modules/statuses" "^1.0.1" + "@bundled-es-modules/tough-cookie" "^0.1.6" + "@inquirer/confirm" "^3.0.0" + "@mswjs/interceptors" "^0.29.0" + "@open-draft/until" "^2.1.0" + "@types/cookie" "^0.6.0" + "@types/statuses" "^2.0.4" + chalk "^4.1.2" + headers-polyfill "^4.0.2" + is-node-process "^1.2.0" + outvariant "^1.4.2" + path-to-regexp "^6.2.0" + strict-event-emitter "^0.5.1" + type-fest "^4.9.0" + yargs "^17.7.2" + muggle-string@^0.4.0: version "0.4.1" resolved "https://registry.yarnpkg.com/muggle-string/-/muggle-string-0.4.1.tgz#3b366bd43b32f809dc20659534dd30e7c8a0d328" @@ -12022,6 +12249,11 @@ mustache@^4.0.0: resolved "https://registry.yarnpkg.com/mustache/-/mustache-4.2.0.tgz#e5892324d60a12ec9c2a73359edca52972bf6f64" integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== +mute-stream@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-1.0.0.tgz#e31bd9fe62f0aed23520aa4324ea6671531e013e" + integrity sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA== + mz@^2.7.0: version "2.7.0" resolved "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32" @@ -12569,6 +12801,11 @@ os-tmpdir@~1.0.2: resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== +outvariant@^1.2.1, outvariant@^1.4.0, outvariant@^1.4.2: + version "1.4.3" + resolved "https://registry.yarnpkg.com/outvariant/-/outvariant-1.4.3.tgz#221c1bfc093e8fec7075497e7799fdbf43d14873" + integrity sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA== + p-limit@^2.0.0, p-limit@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" @@ -12731,6 +12968,11 @@ path-scurry@^1.11.0: lru-cache "^10.2.0" minipass "^5.0.0 || ^6.0.2 || ^7.0.0" +path-to-regexp@^6.2.0: + version "6.2.2" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.2.tgz#324377a83e5049cbecadc5554d6a63a9a4866b36" + integrity sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw== + path-type@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" @@ -13035,6 +13277,11 @@ proxy-from-env@^1.1.0: resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + public-encrypt@^4.0.0: version "4.0.3" resolved "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz#4fcc9d77a07e48ba7527e7cbe0de33d0701331e0" @@ -13060,6 +13307,11 @@ punycode@^2.1.0: resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== +punycode@^2.1.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + pushdata-bitcoin@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/pushdata-bitcoin/-/pushdata-bitcoin-1.0.1.tgz#15931d3cd967ade52206f523aa7331aef7d43af7" @@ -13152,6 +13404,11 @@ querystring@^0.2.1: resolved "https://registry.yarnpkg.com/querystring/-/querystring-0.2.1.tgz#40d77615bb09d16902a85c3e38aa8b5ed761c2dd" integrity sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg== +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + queue-microtask@^1.2.2: version "1.2.3" resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" @@ -13622,6 +13879,11 @@ require-main-filename@^2.0.0: resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + resize-observer-polyfill@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz#0e9020dd3d21024458d4ebd27e23e40269810464" @@ -14348,7 +14610,7 @@ stacktrace-parser@^0.1.10: dependencies: type-fest "^0.7.1" -statuses@2.0.1: +statuses@2.0.1, statuses@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== @@ -14391,6 +14653,11 @@ strict-event-emitter-types@^2.0.0: resolved "https://registry.yarnpkg.com/strict-event-emitter-types/-/strict-event-emitter-types-2.0.0.tgz#05e15549cb4da1694478a53543e4e2f4abcf277f" integrity sha512-Nk/brWYpD85WlOgzw5h173aci0Teyv8YdIAEtV+N88nDB0dLlazZyJMIsN6eo1/AR61l+p6CJTG1JIyFaoNEEA== +strict-event-emitter@^0.5.1: + version "0.5.1" + resolved "https://registry.yarnpkg.com/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz#1602ece81c51574ca39c6815e09f1a3e8550bd93" + integrity sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ== + strict-uri-encode@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz#b9c7330c7042862f6b142dc274bbcc5866ce3546" @@ -14739,6 +15006,11 @@ svelte2tsx@^0.7.6: dedent-js "^1.0.1" pascal-case "^3.1.1" +symbol.inspect@1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/symbol.inspect/-/symbol.inspect-1.0.1.tgz#e13125b8038c4996eb0dfa1567332ad4dcd0763f" + integrity sha512-YQSL4duoHmLhsTD1Pw8RW6TZ5MaTX5rXJnqacJottr2P2LZBF/Yvrc3ku4NUpMOm8aM0KOCqM+UAkMA5HWQCzQ== + synckit@^0.8.5: version "0.8.5" resolved "https://registry.yarnpkg.com/synckit/-/synckit-0.8.5.tgz#b7f4358f9bb559437f9f167eb6bc46b3c9818fa3" @@ -14819,6 +15091,11 @@ terser@^5.15.0: commander "^2.20.0" source-map-support "~0.5.20" +teslabot@^1.3.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/teslabot/-/teslabot-1.5.0.tgz#70f544516699ca5f696d8ae94f3d12cd495d5cd6" + integrity sha512-e2MmELhCgrgZEGo7PQu/6bmYG36IDH+YrBI1iGm6jovXkeDIGa3pZ2WSqRjzkuw2vt1EqfkZoV5GpXgqL8QJVg== + text-encoding-utf-8@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/text-encoding-utf-8/-/text-encoding-utf-8-1.0.2.tgz#585b62197b0ae437e3c7b5d0af27ac1021e10d13" @@ -14925,6 +15202,16 @@ toidentifier@1.0.1: resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== +tough-cookie@^4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36" + integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + tr46@~0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a" @@ -15026,11 +15313,21 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== +type-fest@^0.21.3: + version "0.21.3" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" + integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== + type-fest@^0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.7.1.tgz#8dda65feaf03ed78f0a3f9678f1869147f7c5c48" integrity sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg== +type-fest@^4.9.0: + version "4.26.0" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.26.0.tgz#703f263af10c093cd6277d079e26b9e17d517c4b" + integrity sha512-OduNjVJsFbifKb57UqZ2EMP1i4u64Xwow3NYXUtBbD4vIwJdQd4+xl8YDou1dlm4DVrtwT/7Ky8z8WyCULVfxw== + type@^1.0.1: version "1.2.0" resolved "https://registry.yarnpkg.com/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0" @@ -15161,6 +15458,11 @@ undici-types@~5.26.4: resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617" integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA== +undici-types@~6.19.2: + version "6.19.8" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.19.8.tgz#35111c9d1437ab83a7cdc0abae2f26d88eda0a02" + integrity sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw== + unenv@^1.9.0: version "1.9.0" resolved "https://registry.yarnpkg.com/unenv/-/unenv-1.9.0.tgz#469502ae85be1bd3a6aa60f810972b1a904ca312" @@ -15212,6 +15514,11 @@ universalify@^0.1.0: resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + universalify@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.1.tgz#168efc2180964e6386d061e094df61afe239b18d" @@ -15286,6 +15593,14 @@ url-loader@^4.0.0: mime-types "^2.1.27" schema-utils "^3.0.0" +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + usb@^2.11.0: version "2.12.1" resolved "https://registry.yarnpkg.com/usb/-/usb-2.12.1.tgz#f7a68ddb1314d56758e3e3b1265bc467922a9503" @@ -15844,7 +16159,7 @@ yargs@^15.1.0, yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.2" -yargs@^17.6.2: +yargs@^17.6.2, yargs@^17.7.2: version "17.7.2" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== @@ -15862,6 +16177,16 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== +yoctocolors-cjs@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz#f4b905a840a37506813a7acaa28febe97767a242" + integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA== + +zod@^3.21.4: + version "3.23.8" + resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d" + integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== + zustand@^4.4.1: version "4.5.2" resolved "https://registry.yarnpkg.com/zustand/-/zustand-4.5.2.tgz#fddbe7cac1e71d45413b3682cdb47b48034c3848"