diff --git a/packages/thirdweb/package.json b/packages/thirdweb/package.json index 9da061cecd7..b0321ef20a1 100644 --- a/packages/thirdweb/package.json +++ b/packages/thirdweb/package.json @@ -127,24 +127,60 @@ }, "typesVersions": { "*": { - "adapters/*": ["./dist/types/exports/adapters/*.d.ts"], - "auth": ["./dist/types/exports/auth.d.ts"], - "chains": ["./dist/types/exports/chains.d.ts"], - "contract": ["./dist/types/exports/contract.d.ts"], - "deploys": ["./dist/types/exports/deploys.d.ts"], - "event": ["./dist/types/exports/event.d.ts"], - "extensions/*": ["./dist/types/exports/extensions/*.d.ts"], - "pay": ["./dist/types/exports/pay.d.ts"], - "react": ["./dist/types/exports/react.d.ts"], - "react-native": ["./dist/types/exports/react-native.d.ts"], - "rpc": ["./dist/types/exports/rpc.d.ts"], - "storage": ["./dist/types/exports/storage.d.ts"], - "transaction": ["./dist/types/exports/transaction.d.ts"], - "utils": ["./dist/types/exports/utils.d.ts"], - "wallets": ["./dist/types/exports/wallets.d.ts"], - "wallets/*": ["./dist/types/exports/wallets/*.d.ts"], - "modules": ["./dist/types/exports/modules.d.ts"], - "social": ["./dist/types/exports/social.d.ts"] + "adapters/*": [ + "./dist/types/exports/adapters/*.d.ts" + ], + "auth": [ + "./dist/types/exports/auth.d.ts" + ], + "chains": [ + "./dist/types/exports/chains.d.ts" + ], + "contract": [ + "./dist/types/exports/contract.d.ts" + ], + "deploys": [ + "./dist/types/exports/deploys.d.ts" + ], + "event": [ + "./dist/types/exports/event.d.ts" + ], + "extensions/*": [ + "./dist/types/exports/extensions/*.d.ts" + ], + "pay": [ + "./dist/types/exports/pay.d.ts" + ], + "react": [ + "./dist/types/exports/react.d.ts" + ], + "react-native": [ + "./dist/types/exports/react-native.d.ts" + ], + "rpc": [ + "./dist/types/exports/rpc.d.ts" + ], + "storage": [ + "./dist/types/exports/storage.d.ts" + ], + "transaction": [ + "./dist/types/exports/transaction.d.ts" + ], + "utils": [ + "./dist/types/exports/utils.d.ts" + ], + "wallets": [ + "./dist/types/exports/wallets.d.ts" + ], + "wallets/*": [ + "./dist/types/exports/wallets/*.d.ts" + ], + "modules": [ + "./dist/types/exports/modules.d.ts" + ], + "social": [ + "./dist/types/exports/social.d.ts" + ] } }, "browser": { @@ -181,7 +217,7 @@ "fuse.js": "7.0.0", "input-otp": "^1.4.1", "mipd": "0.0.7", - "ox": "0.3.0", + "ox": "0.4.0", "uqr": "0.1.2", "viem": "2.21.51" }, diff --git a/packages/thirdweb/src/extensions/erc1271/checkContractWalletSignedTypedData.ts b/packages/thirdweb/src/extensions/erc1271/checkContractWalletSignedTypedData.ts index c84e7b60200..ded7a836a8d 100644 --- a/packages/thirdweb/src/extensions/erc1271/checkContractWalletSignedTypedData.ts +++ b/packages/thirdweb/src/extensions/erc1271/checkContractWalletSignedTypedData.ts @@ -1,4 +1,4 @@ -import { type TypedData, type TypedDataDefinition, hashTypedData } from "viem"; +import * as ox__TypedData from "ox/TypedData"; import type { ThirdwebContract } from "../../contract/contract.js"; import { isHex } from "../../utils/encoding/hex.js"; import { isValidSignature } from "./__generated__/isValidSignature/read/isValidSignature.js"; @@ -7,11 +7,11 @@ import { isValidSignature } from "./__generated__/isValidSignature/read/isValidS * @extension ERC1271 */ export type CheckContractWalletSignTypedDataOptions< - typedData extends TypedData | Record, + typedData extends ox__TypedData.TypedData | Record, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData, > = { contract: ThirdwebContract; - data: TypedDataDefinition; + data: ox__TypedData.Definition; signature: string; }; const MAGIC_VALUE = "0x1626ba7e"; @@ -42,7 +42,7 @@ const MAGIC_VALUE = "0x1626ba7e"; * @returns A promise that resolves with a boolean indicating if the signature is valid. */ export async function checkContractWalletSignedTypedData< - typedData extends TypedData | Record, + typedData extends ox__TypedData.TypedData | Record, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData, >(options: CheckContractWalletSignTypedDataOptions) { if (!isHex(options.signature)) { @@ -50,7 +50,11 @@ export async function checkContractWalletSignedTypedData< } const result = await isValidSignature({ contract: options.contract, - hash: hashTypedData(options.data), + hash: ox__TypedData.hashStruct({ + primaryType: options.data.primaryType, + data: options.data.message as Record, + types: options.data.types as ox__TypedData.Definition["types"], + }), signature: options.signature, }); return result === MAGIC_VALUE; diff --git a/packages/thirdweb/src/utils/signatures/helpers/parse-typed-data.ts b/packages/thirdweb/src/utils/signatures/helpers/parse-typed-data.ts index 93b6261e5d8..11d5a4c5f03 100644 --- a/packages/thirdweb/src/utils/signatures/helpers/parse-typed-data.ts +++ b/packages/thirdweb/src/utils/signatures/helpers/parse-typed-data.ts @@ -1,25 +1,29 @@ -import type { TypedData } from "abitype"; -import type { TypedDataDefinition } from "viem"; -import { type Hex, hexToNumber, isHex } from "../../encoding/hex.js"; +import * as ox__Hex from "ox/Hex"; +import type * as ox__TypedData from "ox/TypedData"; +import type { Hex } from "../../encoding/hex.js"; -type UnknownDomain = unknown & { chainId?: unknown }; // TODO: create our own typed data types so this is cleaner -type HexDomain = unknown & { chainId: Hex }; // TODO: create our own typed data types so this is cleaner +type UnknownDomain = unknown & { chainId?: unknown }; +type HexDomain = unknown & { chainId: Hex }; /** * @internal */ export function parseTypedData< - typedData extends TypedData | Record = TypedData, + typedData extends + | ox__TypedData.TypedData + | Record = ox__TypedData.TypedData, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData, >( - typedData: TypedDataDefinition, -): TypedDataDefinition { + typedData: ox__TypedData.Definition, +): ox__TypedData.Definition { const domain = typedData.domain as UnknownDomain; - if (domain?.chainId !== undefined && isHex(domain.chainId)) { + if (domain?.chainId !== undefined && ox__Hex.validate(domain.chainId)) { typedData.domain = { ...(typedData.domain as HexDomain), - chainId: hexToNumber((typedData.domain as unknown as HexDomain).chainId), - } as unknown as TypedDataDefinition["domain"]; + chainId: ox__Hex.toNumber( + (typedData.domain as unknown as HexDomain).chainId, + ), + } as unknown as ox__TypedData.Definition["domain"]; } return typedData; } diff --git a/packages/thirdweb/src/utils/signatures/sign-message.ts b/packages/thirdweb/src/utils/signatures/sign-message.ts index c30e0a0706d..18a461975d0 100644 --- a/packages/thirdweb/src/utils/signatures/sign-message.ts +++ b/packages/thirdweb/src/utils/signatures/sign-message.ts @@ -1,9 +1,10 @@ +import * as ox__Hex from "ox/Hex"; +import * as ox__PersonalMessage from "ox/PersonalMessage"; +import * as ox__Secp256k1 from "ox/Secp256k1"; +import * as ox__Signature from "ox/Signature"; import type { Account } from "../../wallets/interfaces/wallet.js"; import type { Hex } from "../encoding/hex.js"; -import { hashMessage } from "../hashing/hashMessage.js"; import type { Prettify } from "../type-utils.js"; -import { sign } from "./sign.js"; -import { signatureToHex } from "./signature-to-hex.js"; type Message = Prettify< | string @@ -59,9 +60,17 @@ export function signMessage( options: SignMessageOptions | { message: Message; account: Account }, ): Hex | Promise { if ("privateKey" in options) { - const { message, privateKey } = options; - const signature = sign({ hash: hashMessage(message), privateKey }); - return signatureToHex(signature); + const payload = ox__PersonalMessage.getSignPayload( + typeof options.message === "object" + ? options.message.raw + : ox__Hex.fromString(options.message), + ); + + const signature = ox__Secp256k1.sign({ + payload, + privateKey: options.privateKey, + }); + return ox__Signature.toHex(signature); } if ("account" in options) { const { message, account } = options; diff --git a/packages/thirdweb/src/utils/signatures/sign-typed-data.test.ts b/packages/thirdweb/src/utils/signatures/sign-typed-data.test.ts index a6783871138..8364451f085 100644 --- a/packages/thirdweb/src/utils/signatures/sign-typed-data.test.ts +++ b/packages/thirdweb/src/utils/signatures/sign-typed-data.test.ts @@ -83,21 +83,6 @@ test("domain: chainId", async () => { ); }); -test("domain: chainId hex", async () => { - expect( - signTypedData({ - ...typedData.complex, - domain: { - chainId: "0x1" as unknown as number, - }, - primaryType: "Mail", - privateKey: ANVIL_PKEY_A, - }), - ).toMatchInlineSnapshot( - '"0x6e100a352ec6ad1b70802290e18aeed190704973570f3b8ed42cb9808e2ea6bf4a90a229a244495b41890987806fcbd2d5d23fc0dbe5f5256c2613c039d76db81c"', - ); -}); - test("domain: name", async () => { expect( signTypedData({ diff --git a/packages/thirdweb/src/utils/signatures/sign-typed-data.ts b/packages/thirdweb/src/utils/signatures/sign-typed-data.ts index 3443cbff7da..bd9074e0396 100644 --- a/packages/thirdweb/src/utils/signatures/sign-typed-data.ts +++ b/packages/thirdweb/src/utils/signatures/sign-typed-data.ts @@ -1,14 +1,14 @@ -import type { TypedData } from "abitype"; -import { type TypedDataDefinition, hashTypedData } from "viem"; +import * as ox__Secp256k1 from "ox/Secp256k1"; +import * as ox__Signature from "ox/Signature"; +import * as ox__TypedData from "ox/TypedData"; import type { Hex } from "../encoding/hex.js"; -import { parseTypedData } from "./helpers/parse-typed-data.js"; -import { sign } from "./sign.js"; -import { signatureToHex } from "./signature-to-hex.js"; export type SignTypedDataOptions< - typedData extends TypedData | Record = TypedData, + typedData extends + | ox__TypedData.TypedData + | Record = ox__TypedData.TypedData, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData, -> = TypedDataDefinition & { +> = ox__TypedData.Definition & { privateKey: Hex; }; @@ -28,17 +28,18 @@ export type SignTypedDataOptions< * @utils */ export function signTypedData< - const typedData extends TypedData | Record, + const typedData extends ox__TypedData.TypedData | Record, primaryType extends keyof typedData | "EIP712Domain", >(options: SignTypedDataOptions): Hex { const { privateKey, ...typedData } = options as unknown as SignTypedDataOptions; - const parsedTypeData = parseTypedData(typedData); + const payload = ox__TypedData.getSignPayload(typedData); - const signature = sign({ - hash: hashTypedData(parsedTypeData), // TODO: Implement native hashTypedData + const signature = ox__Secp256k1.sign({ + payload, privateKey, }); - return signatureToHex(signature); + + return ox__Signature.toHex(signature); } diff --git a/packages/thirdweb/src/utils/signatures/sign.ts b/packages/thirdweb/src/utils/signatures/sign.ts index d77e3cf4449..9b57d7ec768 100644 --- a/packages/thirdweb/src/utils/signatures/sign.ts +++ b/packages/thirdweb/src/utils/signatures/sign.ts @@ -1,5 +1,4 @@ -import { secp256k1 } from "@noble/curves/secp256k1"; -import type { Signature } from "viem"; +import * as ox__Secp256k1 from "ox/Secp256k1"; import { type Hex, toHex } from "../encoding/hex.js"; @@ -28,12 +27,12 @@ export type SignOptions = { * ``` * @utils */ -export function sign({ hash, privateKey }: SignOptions): Signature { - const { r, s, recovery } = secp256k1.sign(hash.slice(2), privateKey.slice(2)); +export function sign({ hash, privateKey }: SignOptions) { + const { r, s, yParity } = ox__Secp256k1.sign({ payload: hash, privateKey }); return { r: toHex(r, { size: 32 }), s: toHex(s, { size: 32 }), - v: recovery ? 28n : 27n, - yParity: recovery, + v: yParity === 1 ? 28n : 27n, + yParity, }; } diff --git a/packages/thirdweb/src/utils/signatures/signature-to-hex.ts b/packages/thirdweb/src/utils/signatures/signature-to-hex.ts index cf87698e8fa..0d7691ad006 100644 --- a/packages/thirdweb/src/utils/signatures/signature-to-hex.ts +++ b/packages/thirdweb/src/utils/signatures/signature-to-hex.ts @@ -1,6 +1,6 @@ -import { secp256k1 } from "@noble/curves/secp256k1"; -import type { Signature } from "viem"; -import { type Hex, hexToBigInt } from "../encoding/hex.js"; +import * as ox__Hex from "ox/Hex"; +import * as ox__Signature from "ox/Signature"; +import type { Hex } from "../encoding/hex.js"; /** * Converts a signature to a hex string. @@ -25,15 +25,31 @@ import { type Hex, hexToBigInt } from "../encoding/hex.js"; * ``` * @utils */ -export function signatureToHex(signature: Signature): Hex { +export function signatureToHex(signature: { + r: Hex; + s: Hex; + v?: bigint | number | Hex | undefined; + yParity?: bigint | number | Hex | undefined; +}): Hex { const { r, s, v, yParity } = signature; - const yParity_ = (() => { - if (yParity === 0 || yParity === 1) return yParity; - if (v && (v === 27n || v === 28n || v >= 35n)) return v % 2n === 0n ? 1 : 0; - throw new Error("Invalid `v` or `yParity` value"); - })(); - return `0x${new secp256k1.Signature( - hexToBigInt(r), - hexToBigInt(s), - ).toCompactHex()}${yParity_ === 0 ? "1b" : "1c"}`; + return ox__Signature.toHex( + ox__Signature.from( + typeof yParity !== "undefined" + ? { + r, + s, + yParity: !ox__Hex.validate(yParity) + ? ox__Hex.fromNumber(yParity) + : yParity, + } + : { + r, + s, + v: + !ox__Hex.validate(v) && typeof v !== "undefined" + ? ox__Hex.fromNumber(v) + : v, + }, + ), + ); } diff --git a/packages/thirdweb/src/wallets/coinbase/coinbase-web.test.ts b/packages/thirdweb/src/wallets/coinbase/coinbase-web.test.ts index 4968d4ae97e..638b363a42e 100644 --- a/packages/thirdweb/src/wallets/coinbase/coinbase-web.test.ts +++ b/packages/thirdweb/src/wallets/coinbase/coinbase-web.test.ts @@ -1,6 +1,7 @@ import type { ProviderInterface } from "@coinbase/wallet-sdk"; +import * as ox__Hex from "ox/Hex"; +import * as ox__TypedData from "ox/TypedData"; import { beforeEach, describe, expect, test, vi } from "vitest"; -import {} from "../../chains/utils.js"; import { COINBASE } from "../constants.js"; import type { Wallet } from "../interfaces/wallet.js"; import { @@ -41,6 +42,21 @@ vi.mock("../../utils/normalizeChainId.js", () => ({ normalizeChainId: vi.fn((chainId) => Number(chainId)), })); +vi.mock("ox/Hex", async () => { + const actualModule = await vi.importActual("ox/Hex"); + return { + ...actualModule, + validate: vi.fn(() => true), + toNumber: vi.fn((hex) => Number.parseInt(hex, 16)), + }; +}); + +vi.mock("ox/TypedData", () => ({ + extractEip712DomainTypes: vi.fn(() => []), + validate: vi.fn(), + serialize: vi.fn(() => "serializedData"), +})); + describe("Coinbase Web", () => { let provider: ProviderInterface; @@ -102,4 +118,59 @@ describe("Coinbase Web", () => { expect(account.address).toBe("0x123"); expect(chain.id).toBe(1); }); + + test("signMessage uses ox__Hex for validation", async () => { + const account = { + address: "0x123", + signMessage: async ({ message }: { message: string }) => { + const messageToSign = `0x${ox__Hex.fromString(message)}`; + const res = await provider.request({ + method: "personal_sign", + params: [messageToSign, account.address], + }); + expect(ox__Hex.validate(res)).toBe(true); + return res; + }, + }; + + provider.request = vi.fn().mockResolvedValue("0xsignature"); + const signature = await account.signMessage({ message: "hello" }); + expect(signature).toBe("0xsignature"); + }); + + test("signTypedData uses ox__TypedData for serialization", async () => { + const account = { + address: "0x123", + // biome-ignore lint/suspicious/noExplicitAny: Inside tests + signTypedData: async (typedData: any) => { + const { domain, message, primaryType } = typedData; + const types = { + EIP712Domain: ox__TypedData.extractEip712DomainTypes(domain), + ...typedData.types, + }; + ox__TypedData.validate({ domain, message, primaryType, types }); + const stringifiedData = ox__TypedData.serialize({ + domain: domain ?? {}, + message, + primaryType, + types, + }); + const res = await provider.request({ + method: "eth_signTypedData_v4", + params: [account.address, stringifiedData], + }); + expect(ox__Hex.validate(res)).toBe(true); + return res; + }, + }; + + provider.request = vi.fn().mockResolvedValue("0xsignature"); + const signature = await account.signTypedData({ + domain: {}, + message: {}, + primaryType: "EIP712Domain", + types: {}, + }); + expect(signature).toBe("0xsignature"); + }); }); diff --git a/packages/thirdweb/src/wallets/coinbase/coinbase-web.ts b/packages/thirdweb/src/wallets/coinbase/coinbase-web.ts index 1cd60789f67..8784e10fe2b 100644 --- a/packages/thirdweb/src/wallets/coinbase/coinbase-web.ts +++ b/packages/thirdweb/src/wallets/coinbase/coinbase-web.ts @@ -1,12 +1,7 @@ import type { ProviderInterface } from "@coinbase/wallet-sdk"; import type { Address } from "abitype"; -import { - type SignTypedDataParameters, - getTypesForEIP712Domain, - isHex, - serializeTypedData, - validateTypedData, -} from "viem"; +import * as ox__Hex from "ox/Hex"; +import * as ox__TypedData from "ox/TypedData"; import type { Account, Wallet } from "../interfaces/wallet.js"; import type { SendTransactionOption } from "../interfaces/wallet.js"; import type { AppMetadata, DisconnectFn, SwitchChainFn } from "../types.js"; @@ -338,29 +333,30 @@ function createAccount({ method: "personal_sign", params: [messageToSign, account.address], }); - if (!isHex(res)) { + if (!ox__Hex.validate(res)) { throw new Error("Invalid signature returned"); } return res; }, - async signTypedData(_typedData) { + async signTypedData(typedData) { if (!account.address) { throw new Error("Provider not setup"); } - const typedData = parseTypedData(_typedData); - const { domain, message, primaryType } = - typedData as unknown as SignTypedDataParameters; + + const { domain, message, primaryType } = parseTypedData( + typedData, + ) as ox__TypedData.Definition; const types = { - EIP712Domain: getTypesForEIP712Domain({ domain }), + EIP712Domain: ox__TypedData.extractEip712DomainTypes(domain), ...typedData.types, }; // Need to do a runtime validation check on addresses, byte ranges, integer ranges, etc // as we can't statically check this with TypeScript. - validateTypedData({ domain, message, primaryType, types }); + ox__TypedData.validate({ domain, message, primaryType, types }); - const stringifiedData = serializeTypedData({ + const stringifiedData = ox__TypedData.serialize({ domain: domain ?? {}, message, primaryType, @@ -371,7 +367,7 @@ function createAccount({ method: "eth_signTypedData_v4", params: [account.address, stringifiedData], }); - if (!isHex(res)) { + if (!ox__Hex.validate(res)) { throw new Error("Invalid signed payload returned"); } return res; diff --git a/packages/thirdweb/src/wallets/in-app/core/actions/sign-typed-data.enclave.ts b/packages/thirdweb/src/wallets/in-app/core/actions/sign-typed-data.enclave.ts index c1cba42593d..4808ba33cc5 100644 --- a/packages/thirdweb/src/wallets/in-app/core/actions/sign-typed-data.enclave.ts +++ b/packages/thirdweb/src/wallets/in-app/core/actions/sign-typed-data.enclave.ts @@ -1,5 +1,4 @@ -import type { TypedData } from "abitype"; -import type { TypedDataDefinition } from "viem"; +import type * as ox__TypedData from "ox/TypedData"; import type { ThirdwebClient } from "../../../../client/client.js"; import { getThirdwebBaseUrl } from "../../../../utils/domains.js"; import { getClientFetch } from "../../../../utils/fetch.js"; @@ -7,7 +6,7 @@ import { stringify } from "../../../../utils/json.js"; import type { ClientScopedStorage } from "../authentication/client-scoped-storage.js"; export async function signTypedData< - const typedData extends TypedData | Record, + const typedData extends ox__TypedData.TypedData | Record, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData, >({ client, @@ -15,7 +14,7 @@ export async function signTypedData< storage, }: { client: ThirdwebClient; - payload: TypedDataDefinition; + payload: ox__TypedData.Definition; storage: ClientScopedStorage; }) { const authToken = await storage.getAuthCookie(); diff --git a/packages/thirdweb/src/wallets/interfaces/wallet.ts b/packages/thirdweb/src/wallets/interfaces/wallet.ts index d88bed8ab8d..76d17e30be9 100644 --- a/packages/thirdweb/src/wallets/interfaces/wallet.ts +++ b/packages/thirdweb/src/wallets/interfaces/wallet.ts @@ -1,11 +1,6 @@ import type { Address } from "abitype"; -import type { - Hex, - SignableMessage, - TransactionSerializable, - TypedData, - TypedDataDefinition, -} from "viem"; +import type * as ox__TypedData from "ox/TypedData"; +import type { Hex, SignableMessage, TransactionSerializable } from "viem"; import type { Chain } from "../../chains/types.js"; import type { EIP712TransactionOptions, @@ -191,10 +186,10 @@ export type Account = { * ``` */ signTypedData: < - const typedData extends TypedData | Record, + const typedData extends ox__TypedData.TypedData | Record, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData, >( - _typedData: TypedDataDefinition, + _typedData: ox__TypedData.Definition, ) => Promise; // OPTIONAL diff --git a/packages/thirdweb/src/wallets/private-key.ts b/packages/thirdweb/src/wallets/private-key.ts index 034280e065a..101c7326150 100644 --- a/packages/thirdweb/src/wallets/private-key.ts +++ b/packages/thirdweb/src/wallets/private-key.ts @@ -1,10 +1,6 @@ import { secp256k1 } from "@noble/curves/secp256k1"; -import type { - SignableMessage, - TransactionSerializable, - TypedData, - TypedDataDefinition, -} from "viem"; +import type * as ox__TypedData from "ox/TypedData"; +import type { SignableMessage, TransactionSerializable } from "viem"; import { publicKeyToAddress } from "viem/utils"; import { getCachedChain } from "../chains/utils.js"; import type { ThirdwebClient } from "../client/client.js"; @@ -69,13 +65,11 @@ export function privateKeyToAccount( const privateKey = `0x${options.privateKey.replace(/^0x/, "")}` satisfies Hex; const publicKey = toHex(secp256k1.getPublicKey(privateKey.slice(2), false)); - const address = publicKeyToAddress(publicKey); // TODO: Implement publicKeyToAddress natively (will need checksumAddress downstream) + const address = publicKeyToAddress(publicKey); const account = { address, sendTransaction: async ( - // TODO: figure out how we would pass our "chain" object in here? - // maybe we *do* actually have to take in a tx object instead of the raw tx? tx: TransactionSerializable & { chainId: number }, ) => { const rpcRequest = getRpcClient({ @@ -101,10 +95,10 @@ export function privateKeyToAccount( }); }, signTypedData: async < - const typedData extends TypedData | Record, + const typedData extends ox__TypedData.TypedData | Record, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData, >( - _typedData: TypedDataDefinition, + _typedData: ox__TypedData.Definition, ) => { return signTypedData({ ..._typedData, diff --git a/packages/thirdweb/src/wallets/smart/index.ts b/packages/thirdweb/src/wallets/smart/index.ts index c9b42647468..d33347b1871 100644 --- a/packages/thirdweb/src/wallets/smart/index.ts +++ b/packages/thirdweb/src/wallets/smart/index.ts @@ -1,11 +1,5 @@ -import { - type SignableMessage, - type TypedData, - type TypedDataDefinition, - type TypedDataDomain, - hashTypedData, - maxUint96, -} from "viem"; +import * as ox__TypedData from "ox/TypedData"; +import { type SignableMessage, maxUint96 } from "viem"; import type { Chain } from "../../chains/types.js"; import { getCachedChain } from "../../chains/utils.js"; import type { ThirdwebClient } from "../../client/client.js"; @@ -140,7 +134,6 @@ export async function connectSmartWallet( chain: chain, }); - // TODO: listen for chainChanged event on the personal wallet and emit the disconnect event on the smart wallet const accountAddress = await predictAddress({ factoryContract, adminAddress: personalAccount.address, @@ -334,9 +327,9 @@ async function createSmartAccount( ); }, async signTypedData< - const typedData extends TypedData | Record, + const typedData extends ox__TypedData.TypedData | Record, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData, - >(_typedData: TypedDataDefinition) { + >(_typedData: ox__TypedData.Definition) { const typedData = parseTypedData(_typedData); const [ { isContractDeployed }, @@ -353,7 +346,7 @@ async function createSmartAccount( ]); const isSelfVerifyingContract = ( - typedData.domain as TypedDataDomain + typedData.domain as ox__TypedData.Domain )?.verifyingContract?.toLowerCase() === accountContract.address?.toLowerCase(); @@ -376,7 +369,11 @@ async function createSmartAccount( }); } - const originalMsgHash = hashTypedData(typedData); + const originalMsgHash = ox__TypedData.hashStruct({ + ...typedData, + types: typedData.types as ox__TypedData.Definition["types"], + data: typedData.message as Record, + }); // check if the account contract supports EIP721 domain separator based signing let factorySupports712 = false; try { @@ -554,9 +551,9 @@ function createZkSyncAccount(args: { return connectionOptions.personalAccount.signMessage({ message }); }, async signTypedData< - const typedData extends TypedData | Record, + const typedData extends ox__TypedData.TypedData | Record, primaryType extends keyof typedData | "EIP712Domain" = keyof typedData, - >(_typedData: TypedDataDefinition) { + >(_typedData: ox__TypedData.Definition) { const typedData = parseTypedData(_typedData); return connectionOptions.personalAccount.signTypedData(typedData); }, diff --git a/packages/thirdweb/src/wallets/smart/smart.test.ts b/packages/thirdweb/src/wallets/smart/smart.test.ts new file mode 100644 index 00000000000..f589ae92777 --- /dev/null +++ b/packages/thirdweb/src/wallets/smart/smart.test.ts @@ -0,0 +1,87 @@ +import { describe, expect, it } from "vitest"; +import { TEST_CLIENT } from "../../../test/src/test-clients.js"; +import { defineChain } from "../../chains/utils.js"; +import { generateAccount } from "../utils/generateAccount.js"; +import { connectSmartWallet, disconnectSmartWallet } from "./index.js"; +import { smartWallet } from "./smart-wallet.js"; + +describe("Smart Wallet Index", () => { + const chain = defineChain(1); // Ethereum mainnet + const client = TEST_CLIENT; + + describe("connectSmartWallet", () => { + it("should connect a smart wallet", async () => { + const personalAccount = await generateAccount({ client }); + const wallet = smartWallet({ + chain, + gasless: true, + }); + + const [account, connectedChain] = await connectSmartWallet( + wallet, + { + client, + personalAccount, + }, + { + chain, + gasless: true, + }, + ); + + expect(account.address).toBeDefined(); + expect(account.address).toMatch(/^0x[a-fA-F0-9]{40}$/); + expect(connectedChain.id).toBe(chain.id); + }); + }); + + describe("disconnectSmartWallet", () => { + it("should disconnect a smart wallet", async () => { + const personalAccount = await generateAccount({ client }); + const wallet = smartWallet({ + chain, + gasless: true, + }); + + await connectSmartWallet( + wallet, + { + client, + personalAccount, + }, + { + chain, + gasless: true, + }, + ); + + await expect(disconnectSmartWallet(wallet)).resolves.not.toThrow(); + }); + + it("should clear wallet mappings on disconnect", async () => { + const personalAccount = await generateAccount({ client }); + const wallet = smartWallet({ + chain, + gasless: true, + }); + + await connectSmartWallet( + wallet, + { + client, + personalAccount, + }, + { + chain, + gasless: true, + }, + ); + + await disconnectSmartWallet(wallet); + + // Verify wallet state is cleared + expect(wallet.getAccount()).toBeUndefined(); + expect(wallet.getAdminAccount?.()).toBeUndefined(); + }); + }); +}); diff --git a/packages/thirdweb/src/wallets/wallet-connect/receiver/session-request.test.ts b/packages/thirdweb/src/wallets/wallet-connect/receiver/session-request.test.ts index 30d78c0c317..4455f4af42a 100644 --- a/packages/thirdweb/src/wallets/wallet-connect/receiver/session-request.test.ts +++ b/packages/thirdweb/src/wallets/wallet-connect/receiver/session-request.test.ts @@ -141,7 +141,7 @@ describe("session_request", () => { personalSignRequest = cloneObject(REQUEST_EVENT_MOCK); personalSignRequest.params.request.method = "personal_sign"; personalSignRequest.params.request.params = [ - "my message", + "0xeeeee", TEST_ACCOUNT_A.address, ] as WalletConnectSignRequestPrams; }); @@ -159,7 +159,7 @@ describe("session_request", () => { id: REQUEST_EVENT_MOCK.id, jsonrpc: "2.0", result: - "0x66ea9c2ac4a99a5ac26f5fa3e800171036210e135d486f1d0d02d64eaa7dd56275b4323e153e62c1fad57a6be54420248ed54604f4857ec75ce7761eefad10e41c", + "0x7b7806017c0666b88ff1a51a2af716b808c4974bdb31a4fb734fe2d16c121766363847d2556eb466d1cd04b26541aa5a2a1f5be4154cfd9bef8137dfb7b711ff1c", }, }); }); @@ -221,7 +221,7 @@ describe("session_request", () => { ethSignRequest = cloneObject(REQUEST_EVENT_MOCK); ethSignRequest.params.request.method = "eth_sign"; ethSignRequest.params.request.params = [ - "my message", + "0xeeeee", TEST_ACCOUNT_A.address, ] as WalletConnectSignRequestPrams; }); @@ -239,14 +239,14 @@ describe("session_request", () => { id: REQUEST_EVENT_MOCK.id, jsonrpc: "2.0", result: - "0x66ea9c2ac4a99a5ac26f5fa3e800171036210e135d486f1d0d02d64eaa7dd56275b4323e153e62c1fad57a6be54420248ed54604f4857ec75ce7761eefad10e41c", + "0x7b7806017c0666b88ff1a51a2af716b808c4974bdb31a4fb734fe2d16c121766363847d2556eb466d1cd04b26541aa5a2a1f5be4154cfd9bef8137dfb7b711ff1c", }, }); }); it("should reject if active account address differs from requested address", async () => { ethSignRequest.params.request.params = [ - "my message", + "0xeeeee", TEST_ACCOUNT_B.address, ] as WalletConnectSignRequestPrams; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ed231dd906f..49a4d18c370 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -139,7 +139,7 @@ importers: version: 1.1.4(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(types-react-dom@19.0.0-rc.1)(types-react@19.0.0-rc.1) '@sentry/nextjs': specifier: 8.40.0 - version: 8.40.0(@opentelemetry/core@1.28.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.28.0(@opentelemetry/api@1.9.0))(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.49.0)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) + version: 8.40.0(@opentelemetry/core@1.28.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.28.0(@opentelemetry/api@1.9.0))(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.49.0)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(webpack@5.96.1(@swc/core@1.9.3)) '@shazow/whatsabi': specifier: ^0.17.0 version: 0.17.0(@noble/hashes@1.6.1)(typescript@5.7.2)(zod@3.23.8) @@ -154,7 +154,7 @@ importers: version: link:../../packages/service-utils '@vercel/functions': specifier: ^1.4.2 - version: 1.5.0(@aws-sdk/credential-provider-web-identity@3.696.0(@aws-sdk/client-sts@3.699.0)) + version: 1.5.0(@aws-sdk/credential-provider-web-identity@3.696.0) '@vercel/og': specifier: ^0.6.4 version: 0.6.4 @@ -283,7 +283,7 @@ importers: version: 2.5.5 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.15(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2))) + version: 1.0.7(tailwindcss@3.4.15(ts-node@10.9.2(@types/node@22.10.0)(typescript@5.7.2))) thirdweb: specifier: workspace:* version: link:../../packages/thirdweb @@ -332,7 +332,7 @@ importers: version: 8.4.5(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10)) '@storybook/nextjs': specifier: 8.4.5 - version: 8.4.5(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.49.0)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021))(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10))(type-fest@4.28.1)(typescript@5.7.2)(webpack-hot-middleware@2.26.1)(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) + version: 8.4.5(@swc/core@1.9.3)(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.49.0)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021))(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10))(type-fest@4.28.1)(typescript@5.7.2)(webpack-hot-middleware@2.26.1)(webpack@5.96.1(@swc/core@1.9.3)) '@storybook/react': specifier: 8.4.5 version: 8.4.5(@storybook/test@8.4.5(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10)))(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10))(typescript@5.7.2) @@ -380,7 +380,7 @@ importers: version: 10.4.20(postcss@8.4.49) checkly: specifier: ^4.11.0 - version: 4.11.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10) + version: 4.11.0(@swc/core@1.9.3)(@types/node@22.10.0)(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10) eslint: specifier: 8.57.0 version: 8.57.0 @@ -407,7 +407,7 @@ importers: version: 8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10) tailwindcss: specifier: 3.4.15 - version: 3.4.15(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2)) + version: 3.4.15(ts-node@10.9.2(@types/node@22.10.0)(typescript@5.7.2)) typescript: specifier: 5.7.2 version: 5.7.2 @@ -525,10 +525,10 @@ importers: version: 8.4.49 tailwindcss: specifier: 3.4.15 - version: 3.4.15(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2)) + version: 3.4.15(ts-node@10.9.2(@types/node@22.10.0)(typescript@5.7.2)) tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.15(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2))) + version: 1.0.7(tailwindcss@3.4.15(ts-node@10.9.2(@types/node@22.10.0)(typescript@5.7.2))) typescript: specifier: 5.7.2 version: 5.7.2 @@ -540,13 +540,13 @@ importers: version: 1.0.5(react@19.0.0-rc-69d4b800-20241021) '@mdx-js/loader': specifier: ^2.3.0 - version: 2.3.0(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))) + version: 2.3.0(webpack@5.96.1) '@mdx-js/react': specifier: ^2.3.0 version: 2.3.0(react@19.0.0-rc-69d4b800-20241021) '@next/mdx': specifier: 15.0.3 - version: 15.0.3(@mdx-js/loader@2.3.0(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))))(@mdx-js/react@2.3.0(react@19.0.0-rc-69d4b800-20241021)) + version: 15.0.3(@mdx-js/loader@2.3.0(webpack@5.96.1))(@mdx-js/react@2.3.0(react@19.0.0-rc-69d4b800-20241021)) '@radix-ui/react-dialog': specifier: 1.1.2 version: 1.1.2(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(types-react-dom@19.0.0-rc.1)(types-react@19.0.0-rc.1) @@ -627,7 +627,7 @@ importers: version: 2.5.5 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.15(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2))) + version: 1.0.7(tailwindcss@3.4.15(ts-node@10.9.2(@types/node@22.10.0)(typescript@5.7.2))) thirdweb: specifier: workspace:* version: link:../../packages/thirdweb @@ -685,7 +685,7 @@ importers: version: 1.2.4 eslint-plugin-tailwindcss: specifier: ^3.17.5 - version: 3.17.5(tailwindcss@3.4.15(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2))) + version: 3.17.5(tailwindcss@3.4.15(ts-node@10.9.2(@types/node@22.10.0)(typescript@5.7.2))) next-sitemap: specifier: ^4.2.3 version: 4.2.3(next@15.0.3(@opentelemetry/api@1.9.0)(@playwright/test@1.49.0)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)) @@ -694,7 +694,7 @@ importers: version: 8.4.49 tailwindcss: specifier: 3.4.15 - version: 3.4.15(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2)) + version: 3.4.15(ts-node@10.9.2(@types/node@22.10.0)(typescript@5.7.2)) tsx: specifier: 4.19.2 version: 4.19.2 @@ -763,7 +763,7 @@ importers: version: 2.5.5 tailwindcss-animate: specifier: ^1.0.7 - version: 1.0.7(tailwindcss@3.4.15(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2))) + version: 1.0.7(tailwindcss@3.4.15(ts-node@10.9.2(@types/node@22.10.0)(typescript@5.7.2))) thirdweb: specifier: workspace:* version: link:../../packages/thirdweb @@ -812,7 +812,7 @@ importers: version: 6.0.1(jiti@2.4.0)(postcss@8.4.49)(tsx@4.19.2)(yaml@2.6.1) tailwindcss: specifier: 3.4.15 - version: 3.4.15(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2)) + version: 3.4.15(ts-node@10.9.2(@types/node@22.10.0)(typescript@5.7.2)) typescript: specifier: 5.7.2 version: 5.7.2 @@ -957,8 +957,8 @@ importers: specifier: 0.0.7 version: 0.0.7(typescript@5.7.2) ox: - specifier: 0.3.0 - version: 0.3.0(typescript@5.7.2)(zod@3.23.8) + specifier: 0.4.0 + version: 0.4.0(typescript@5.7.2)(zod@3.23.8) uqr: specifier: 0.1.2 version: 0.1.2 @@ -995,7 +995,7 @@ importers: version: 2.1.0(react-native@0.76.3(@babel/core@7.26.0)(@babel/preset-env@7.26.0(@babel/core@7.26.0))(@react-native-community/cli-server-api@15.1.2(bufferutil@4.0.8)(utf-8-validate@5.0.10))(bufferutil@4.0.8)(react@19.0.0-rc-69d4b800-20241021)(types-react@19.0.0-rc.1)(utf-8-validate@5.0.10)) '@size-limit/preset-big-lib': specifier: 11.1.6 - version: 11.1.6(bufferutil@4.0.8)(size-limit@11.1.6)(utf-8-validate@5.0.10) + version: 11.1.6(bufferutil@4.0.8)(esbuild@0.24.0)(size-limit@11.1.6)(utf-8-validate@5.0.10) '@storybook/addon-essentials': specifier: 8.4.5 version: 8.4.5(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.3.3)(utf-8-validate@5.0.10))(types-react@19.0.0-rc.1) @@ -5367,9 +5367,6 @@ packages: '@swc/helpers@0.5.13': resolution: {integrity: sha512-UoKGxQ3r5kYI9dALKJapMmuK+1zWM/H17Z1+iwnNmzcJRnfFuevZs375TA5rW31pu4BS4NoSy1fRsexDXfWn5w==} - '@swc/helpers@0.5.15': - resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} - '@swc/types@0.1.17': resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==} @@ -10903,8 +10900,8 @@ packages: typescript: optional: true - ox@0.3.0: - resolution: {integrity: sha512-Kq+La3m69dgTN0y9ZQy0fAwVxeLOdAFKuscbKXwaVpe9WW/7Ji3wzYK5iSVCjGRvVV4xTkZaoXUBXN5iCVmznA==} + ox@0.4.0: + resolution: {integrity: sha512-F+Q8R/7SZ8AvBcejIV6QUcACLjRuFtSShCkwTuCFWLAN5DoS8dSwiFsDBltvQplEXXNGmAEZCV4HDe7orEDSxA==} peerDependencies: typescript: '>=5.4.0' peerDependenciesMeta: @@ -16977,11 +16974,11 @@ snapshots: react: 19.0.0-rc-69d4b800-20241021 react-dom: 19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021) - '@mdx-js/loader@2.3.0(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15)))': + '@mdx-js/loader@2.3.0(webpack@5.96.1)': dependencies: '@mdx-js/mdx': 2.3.0 source-map: 0.7.4 - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15)) + webpack: 5.96.1 transitivePeerDependencies: - supports-color @@ -17121,11 +17118,11 @@ snapshots: dependencies: fast-glob: 3.3.1 - '@next/mdx@15.0.3(@mdx-js/loader@2.3.0(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))))(@mdx-js/react@2.3.0(react@19.0.0-rc-69d4b800-20241021))': + '@next/mdx@15.0.3(@mdx-js/loader@2.3.0(webpack@5.96.1))(@mdx-js/react@2.3.0(react@19.0.0-rc-69d4b800-20241021))': dependencies: source-map: 0.7.4 optionalDependencies: - '@mdx-js/loader': 2.3.0(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))) + '@mdx-js/loader': 2.3.0(webpack@5.96.1) '@mdx-js/react': 2.3.0(react@19.0.0-rc-69d4b800-20241021) '@next/swc-darwin-arm64@15.0.3': @@ -17283,7 +17280,7 @@ snapshots: widest-line: 3.1.0 wrap-ansi: 7.0.0 - '@oclif/core@2.8.11(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2)': + '@oclif/core@2.8.11(@swc/core@1.9.3)(@types/node@22.10.0)(typescript@5.7.2)': dependencies: '@types/cli-progress': 3.11.6 ansi-escapes: 4.3.2 @@ -17309,7 +17306,7 @@ snapshots: strip-ansi: 6.0.1 supports-color: 8.1.1 supports-hyperlinks: 2.3.0 - ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2) + ts-node: 10.9.2(@swc/core@1.9.3)(@types/node@22.10.0)(typescript@5.7.2) tslib: 2.8.1 widest-line: 3.1.0 wordwrap: 1.0.0 @@ -17347,10 +17344,10 @@ snapshots: dependencies: '@oclif/core': 1.26.2 - '@oclif/plugin-not-found@2.3.23(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2)': + '@oclif/plugin-not-found@2.3.23(@swc/core@1.9.3)(@types/node@22.10.0)(typescript@5.7.2)': dependencies: '@oclif/color': 1.0.13 - '@oclif/core': 2.8.11(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2) + '@oclif/core': 2.8.11(@swc/core@1.9.3)(@types/node@22.10.0)(typescript@5.7.2) fast-levenshtein: 3.0.0 lodash: 4.17.21 transitivePeerDependencies: @@ -17375,9 +17372,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@oclif/plugin-warn-if-update-available@2.0.24(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2)': + '@oclif/plugin-warn-if-update-available@2.0.24(@swc/core@1.9.3)(@types/node@22.10.0)(typescript@5.7.2)': dependencies: - '@oclif/core': 2.8.11(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2) + '@oclif/core': 2.8.11(@swc/core@1.9.3)(@types/node@22.10.0)(typescript@5.7.2) chalk: 4.1.2 debug: 4.3.7(supports-color@8.1.1) fs-extra: 9.1.0 @@ -17768,7 +17765,7 @@ snapshots: dependencies: playwright: 1.49.0 - '@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.14.2)(type-fest@4.28.1)(webpack-hot-middleware@2.26.1)(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0))': + '@pmmmwh/react-refresh-webpack-plugin@0.5.15(react-refresh@0.14.2)(type-fest@4.28.1)(webpack-hot-middleware@2.26.1)(webpack@5.96.1(@swc/core@1.9.3))': dependencies: ansi-html: 0.0.9 core-js-pure: 3.39.0 @@ -17778,7 +17775,7 @@ snapshots: react-refresh: 0.14.2 schema-utils: 4.2.0 source-map: 0.7.4 - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0) + webpack: 5.96.1(@swc/core@1.9.3) optionalDependencies: type-fest: 4.28.1 webpack-hot-middleware: 2.26.1 @@ -18786,7 +18783,7 @@ snapshots: dependencies: '@sentry/types': 8.40.0 - '@sentry/nextjs@8.40.0(@opentelemetry/core@1.28.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.28.0(@opentelemetry/api@1.9.0))(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.49.0)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0))': + '@sentry/nextjs@8.40.0(@opentelemetry/core@1.28.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.54.2(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@1.28.0(@opentelemetry/api@1.9.0))(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.49.0)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(webpack@5.96.1(@swc/core@1.9.3))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/instrumentation-http': 0.53.0(@opentelemetry/api@1.9.0) @@ -18799,7 +18796,7 @@ snapshots: '@sentry/react': 8.40.0(react@19.0.0-rc-69d4b800-20241021) '@sentry/types': 8.40.0 '@sentry/vercel-edge': 8.40.0 - '@sentry/webpack-plugin': 2.22.6(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) + '@sentry/webpack-plugin': 2.22.6(webpack@5.96.1(@swc/core@1.9.3)) chalk: 3.0.0 next: 15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.49.0)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021) resolve: 1.22.8 @@ -18881,12 +18878,12 @@ snapshots: '@sentry/core': 8.40.0 '@sentry/types': 8.40.0 - '@sentry/webpack-plugin@2.22.6(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0))': + '@sentry/webpack-plugin@2.22.6(webpack@5.96.1(@swc/core@1.9.3))': dependencies: '@sentry/bundler-plugin-core': 2.22.6 unplugin: 1.0.1 uuid: 9.0.1 - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0) + webpack: 5.96.1(@swc/core@1.9.3) transitivePeerDependencies: - encoding - supports-color @@ -18953,11 +18950,11 @@ snapshots: dependencies: size-limit: 11.1.6 - '@size-limit/preset-big-lib@11.1.6(bufferutil@4.0.8)(size-limit@11.1.6)(utf-8-validate@5.0.10)': + '@size-limit/preset-big-lib@11.1.6(bufferutil@4.0.8)(esbuild@0.24.0)(size-limit@11.1.6)(utf-8-validate@5.0.10)': dependencies: '@size-limit/file': 11.1.6(size-limit@11.1.6) '@size-limit/time': 11.1.6(bufferutil@4.0.8)(size-limit@11.1.6)(utf-8-validate@5.0.10) - '@size-limit/webpack': 11.1.6(size-limit@11.1.6) + '@size-limit/webpack': 11.1.6(esbuild@0.24.0)(size-limit@11.1.6) size-limit: 11.1.6 transitivePeerDependencies: - '@swc/core' @@ -18977,11 +18974,11 @@ snapshots: - supports-color - utf-8-validate - '@size-limit/webpack@11.1.6(size-limit@11.1.6)': + '@size-limit/webpack@11.1.6(esbuild@0.24.0)(size-limit@11.1.6)': dependencies: nanoid: 5.0.7 size-limit: 11.1.6 - webpack: 5.96.1 + webpack: 5.96.1(esbuild@0.24.0) transitivePeerDependencies: - '@swc/core' - esbuild @@ -19621,7 +19618,7 @@ snapshots: ts-dedent: 2.2.0 vite: 6.0.0(@types/node@22.10.0)(jiti@2.4.0)(lightningcss@1.28.2)(terser@5.36.0)(tsx@4.19.2)(yaml@2.6.1) - '@storybook/builder-webpack5@8.4.5(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10))(typescript@5.7.2)': + '@storybook/builder-webpack5@8.4.5(@swc/core@1.9.3)(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10))(typescript@5.7.2)': dependencies: '@storybook/core-webpack': 8.4.5(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10)) '@types/node': 22.10.0 @@ -19630,23 +19627,23 @@ snapshots: case-sensitive-paths-webpack-plugin: 2.4.0 cjs-module-lexer: 1.4.1 constants-browserify: 1.0.0 - css-loader: 6.11.0(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) + css-loader: 6.11.0(webpack@5.96.1(@swc/core@1.9.3)) es-module-lexer: 1.5.4 - fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.7.2)(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) - html-webpack-plugin: 5.6.3(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) + fork-ts-checker-webpack-plugin: 8.0.0(typescript@5.7.2)(webpack@5.96.1(@swc/core@1.9.3)) + html-webpack-plugin: 5.6.3(webpack@5.96.1(@swc/core@1.9.3)) magic-string: 0.30.14 path-browserify: 1.0.1 process: 0.11.10 semver: 7.6.3 storybook: 8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10) - style-loader: 3.3.4(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) - terser-webpack-plugin: 5.3.10(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) + style-loader: 3.3.4(webpack@5.96.1(@swc/core@1.9.3)) + terser-webpack-plugin: 5.3.10(@swc/core@1.9.3)(webpack@5.96.1(@swc/core@1.9.3)) ts-dedent: 2.2.0 url: 0.11.4 util: 0.12.5 util-deprecate: 1.0.2 - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0) - webpack-dev-middleware: 6.1.3(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) + webpack: 5.96.1(@swc/core@1.9.3) + webpack-dev-middleware: 6.1.3(webpack@5.96.1(@swc/core@1.9.3)) webpack-hot-middleware: 2.26.1 webpack-virtual-modules: 0.6.2 optionalDependencies: @@ -19758,7 +19755,7 @@ snapshots: dependencies: storybook: 8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10) - '@storybook/nextjs@8.4.5(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.49.0)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021))(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10))(type-fest@4.28.1)(typescript@5.7.2)(webpack-hot-middleware@2.26.1)(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0))': + '@storybook/nextjs@8.4.5(@swc/core@1.9.3)(next@15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.49.0)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021))(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10))(type-fest@4.28.1)(typescript@5.7.2)(webpack-hot-middleware@2.26.1)(webpack@5.96.1(@swc/core@1.9.3))': dependencies: '@babel/core': 7.26.0 '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.26.0) @@ -19773,31 +19770,31 @@ snapshots: '@babel/preset-react': 7.25.9(@babel/core@7.26.0) '@babel/preset-typescript': 7.26.0(@babel/core@7.26.0) '@babel/runtime': 7.26.0 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.14.2)(type-fest@4.28.1)(webpack-hot-middleware@2.26.1)(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) - '@storybook/builder-webpack5': 8.4.5(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10))(typescript@5.7.2) - '@storybook/preset-react-webpack': 8.4.5(@storybook/test@8.4.5(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10)))(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10))(typescript@5.7.2) + '@pmmmwh/react-refresh-webpack-plugin': 0.5.15(react-refresh@0.14.2)(type-fest@4.28.1)(webpack-hot-middleware@2.26.1)(webpack@5.96.1(@swc/core@1.9.3)) + '@storybook/builder-webpack5': 8.4.5(@swc/core@1.9.3)(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10))(typescript@5.7.2) + '@storybook/preset-react-webpack': 8.4.5(@storybook/test@8.4.5(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10)))(@swc/core@1.9.3)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10))(typescript@5.7.2) '@storybook/react': 8.4.5(@storybook/test@8.4.5(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10)))(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10))(typescript@5.7.2) '@storybook/test': 8.4.5(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10)) '@types/node': 22.10.0 '@types/semver': 7.5.8 - babel-loader: 9.2.1(@babel/core@7.26.0)(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) - css-loader: 6.11.0(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) + babel-loader: 9.2.1(@babel/core@7.26.0)(webpack@5.96.1(@swc/core@1.9.3)) + css-loader: 6.11.0(webpack@5.96.1(@swc/core@1.9.3)) find-up: 5.0.0 image-size: 1.1.1 loader-utils: 3.3.1 next: 15.0.3(@babel/core@7.26.0)(@opentelemetry/api@1.9.0)(@playwright/test@1.49.0)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021) - node-polyfill-webpack-plugin: 2.0.1(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) + node-polyfill-webpack-plugin: 2.0.1(webpack@5.96.1(@swc/core@1.9.3)) pnp-webpack-plugin: 1.7.0(typescript@5.7.2) postcss: 8.4.49 - postcss-loader: 8.1.1(postcss@8.4.49)(typescript@5.7.2)(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) + postcss-loader: 8.1.1(postcss@8.4.49)(typescript@5.7.2)(webpack@5.96.1(@swc/core@1.9.3)) react: 19.0.0-rc-69d4b800-20241021 react-dom: 19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021) react-refresh: 0.14.2 resolve-url-loader: 5.0.0 - sass-loader: 13.3.3(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) + sass-loader: 13.3.3(webpack@5.96.1(@swc/core@1.9.3)) semver: 7.6.3 storybook: 8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10) - style-loader: 3.3.4(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) + style-loader: 3.3.4(webpack@5.96.1(@swc/core@1.9.3)) styled-jsx: 5.1.6(@babel/core@7.26.0)(react@19.0.0-rc-69d4b800-20241021) ts-dedent: 2.2.0 tsconfig-paths: 4.2.0 @@ -19805,7 +19802,7 @@ snapshots: optionalDependencies: sharp: 0.33.5 typescript: 5.7.2 - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0) + webpack: 5.96.1(@swc/core@1.9.3) transitivePeerDependencies: - '@rspack/core' - '@swc/core' @@ -19825,11 +19822,11 @@ snapshots: - webpack-hot-middleware - webpack-plugin-serve - '@storybook/preset-react-webpack@8.4.5(@storybook/test@8.4.5(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10)))(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10))(typescript@5.7.2)': + '@storybook/preset-react-webpack@8.4.5(@storybook/test@8.4.5(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10)))(@swc/core@1.9.3)(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10))(typescript@5.7.2)': dependencies: '@storybook/core-webpack': 8.4.5(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10)) '@storybook/react': 8.4.5(@storybook/test@8.4.5(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10)))(react-dom@19.0.0-rc-69d4b800-20241021(react@19.0.0-rc-69d4b800-20241021))(react@19.0.0-rc-69d4b800-20241021)(storybook@8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10))(typescript@5.7.2) - '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.7.2)(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) + '@storybook/react-docgen-typescript-plugin': 1.0.6--canary.9.0c3f3b7.0(typescript@5.7.2)(webpack@5.96.1(@swc/core@1.9.3)) '@types/node': 22.10.0 '@types/semver': 7.5.8 find-up: 5.0.0 @@ -19841,7 +19838,7 @@ snapshots: semver: 7.6.3 storybook: 8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10) tsconfig-paths: 4.2.0 - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0) + webpack: 5.96.1(@swc/core@1.9.3) optionalDependencies: typescript: 5.7.2 transitivePeerDependencies: @@ -19860,7 +19857,7 @@ snapshots: dependencies: storybook: 8.4.5(bufferutil@4.0.8)(prettier@3.4.1)(utf-8-validate@5.0.10) - '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.7.2)(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0))': + '@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0(typescript@5.7.2)(webpack@5.96.1(@swc/core@1.9.3))': dependencies: debug: 4.3.7(supports-color@8.1.1) endent: 2.1.0 @@ -19870,7 +19867,7 @@ snapshots: react-docgen-typescript: 2.2.2(typescript@5.7.2) tslib: 2.8.1 typescript: 5.7.2 - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0) + webpack: 5.96.1(@swc/core@1.9.3) transitivePeerDependencies: - supports-color @@ -20358,7 +20355,7 @@ snapshots: '@swc/core-win32-x64-msvc@1.9.3': optional: true - '@swc/core@1.9.3(@swc/helpers@0.5.15)': + '@swc/core@1.9.3': dependencies: '@swc/counter': 0.1.3 '@swc/types': 0.1.17 @@ -20373,7 +20370,6 @@ snapshots: '@swc/core-win32-arm64-msvc': 1.9.3 '@swc/core-win32-ia32-msvc': 1.9.3 '@swc/core-win32-x64-msvc': 1.9.3 - '@swc/helpers': 0.5.15 optional: true '@swc/counter@0.1.3': {} @@ -20382,11 +20378,6 @@ snapshots: dependencies: tslib: 2.8.1 - '@swc/helpers@0.5.15': - dependencies: - tslib: 2.8.1 - optional: true - '@swc/types@0.1.17': dependencies: '@swc/counter': 0.1.3 @@ -20899,7 +20890,7 @@ snapshots: '@urql/core': 5.0.8(graphql@16.9.0) wonka: 6.3.4 - '@vercel/functions@1.5.0(@aws-sdk/credential-provider-web-identity@3.696.0(@aws-sdk/client-sts@3.699.0))': + '@vercel/functions@1.5.0(@aws-sdk/credential-provider-web-identity@3.696.0)': optionalDependencies: '@aws-sdk/credential-provider-web-identity': 3.696.0(@aws-sdk/client-sts@3.699.0) @@ -21783,12 +21774,12 @@ snapshots: transitivePeerDependencies: - supports-color - babel-loader@9.2.1(@babel/core@7.26.0)(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)): + babel-loader@9.2.1(@babel/core@7.26.0)(webpack@5.96.1(@swc/core@1.9.3)): dependencies: '@babel/core': 7.26.0 find-cache-dir: 4.0.0 schema-utils: 4.2.0 - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0) + webpack: 5.96.1(@swc/core@1.9.3) babel-plugin-istanbul@6.1.1: dependencies: @@ -22249,13 +22240,13 @@ snapshots: check-error@2.1.1: {} - checkly@4.11.0(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10): + checkly@4.11.0(@swc/core@1.9.3)(@types/node@22.10.0)(bufferutil@4.0.8)(typescript@5.7.2)(utf-8-validate@5.0.10): dependencies: - '@oclif/core': 2.8.11(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2) + '@oclif/core': 2.8.11(@swc/core@1.9.3)(@types/node@22.10.0)(typescript@5.7.2) '@oclif/plugin-help': 5.1.20 - '@oclif/plugin-not-found': 2.3.23(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2) + '@oclif/plugin-not-found': 2.3.23(@swc/core@1.9.3)(@types/node@22.10.0)(typescript@5.7.2) '@oclif/plugin-plugins': 5.4.4 - '@oclif/plugin-warn-if-update-available': 2.0.24(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2) + '@oclif/plugin-warn-if-update-available': 2.0.24(@swc/core@1.9.3)(@types/node@22.10.0)(typescript@5.7.2) '@typescript-eslint/typescript-estree': 7.18.0(typescript@5.7.2) acorn: 8.8.1 acorn-walk: 8.2.0 @@ -22701,7 +22692,7 @@ snapshots: css-gradient-parser@0.0.16: {} - css-loader@6.11.0(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)): + css-loader@6.11.0(webpack@5.96.1(@swc/core@1.9.3)): dependencies: icss-utils: 5.1.0(postcss@8.4.49) postcss: 8.4.49 @@ -22712,7 +22703,7 @@ snapshots: postcss-value-parser: 4.2.0 semver: 7.6.3 optionalDependencies: - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0) + webpack: 5.96.1(@swc/core@1.9.3) css-select@4.3.0: dependencies: @@ -23382,7 +23373,7 @@ snapshots: '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.7.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0))(eslint@8.57.0) eslint-plugin-import: 2.31.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-typescript@3.6.3)(eslint@8.57.0) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.0) eslint-plugin-react: 7.37.2(eslint@8.57.0) @@ -23402,13 +23393,13 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0): + eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0))(eslint@8.57.0): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.3.7(supports-color@8.1.1) enhanced-resolve: 5.17.1 eslint: 8.57.0 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) fast-glob: 3.3.2 get-tsconfig: 4.8.1 is-bun-module: 1.2.1 @@ -23442,14 +23433,14 @@ snapshots: - bluebird - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0): + eslint-module-utils@2.12.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 7.14.1(eslint@8.57.0)(typescript@5.7.2) eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0) + eslint-import-resolver-typescript: 3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0))(eslint@8.57.0) transitivePeerDependencies: - supports-color @@ -23464,7 +23455,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.0 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0)(eslint@8.57.0))(eslint@8.57.0) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.3(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint-import-resolver-node@0.3.9)(eslint-plugin-import@2.31.0(@typescript-eslint/parser@7.14.1(eslint@8.57.0)(typescript@5.7.2))(eslint@8.57.0))(eslint@8.57.0))(eslint@8.57.0) hasown: 2.0.2 is-core-module: 2.15.1 is-glob: 4.0.3 @@ -23573,11 +23564,11 @@ snapshots: eslint-plugin-svg-jsx@1.2.4: {} - eslint-plugin-tailwindcss@3.17.5(tailwindcss@3.4.15(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2))): + eslint-plugin-tailwindcss@3.17.5(tailwindcss@3.4.15(ts-node@10.9.2(@types/node@22.10.0)(typescript@5.7.2))): dependencies: fast-glob: 3.3.2 postcss: 8.4.49 - tailwindcss: 3.4.15(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2)) + tailwindcss: 3.4.15(ts-node@10.9.2(@types/node@22.10.0)(typescript@5.7.2)) eslint-scope@5.1.1: dependencies: @@ -24255,7 +24246,7 @@ snapshots: cross-spawn: 7.0.6 signal-exit: 4.1.0 - fork-ts-checker-webpack-plugin@8.0.0(typescript@5.7.2)(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)): + fork-ts-checker-webpack-plugin@8.0.0(typescript@5.7.2)(webpack@5.96.1(@swc/core@1.9.3)): dependencies: '@babel/code-frame': 7.26.2 chalk: 4.1.2 @@ -24270,7 +24261,7 @@ snapshots: semver: 7.6.3 tapable: 2.2.1 typescript: 5.7.2 - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0) + webpack: 5.96.1(@swc/core@1.9.3) form-data-encoder@2.1.4: {} @@ -24741,7 +24732,7 @@ snapshots: html-void-elements@3.0.0: {} - html-webpack-plugin@5.6.3(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)): + html-webpack-plugin@5.6.3(webpack@5.96.1(@swc/core@1.9.3)): dependencies: '@types/html-minifier-terser': 6.1.0 html-minifier-terser: 6.1.0 @@ -24749,7 +24740,7 @@ snapshots: pretty-error: 4.0.0 tapable: 2.2.1 optionalDependencies: - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0) + webpack: 5.96.1(@swc/core@1.9.3) htmlparser2@3.10.1: dependencies: @@ -27233,7 +27224,7 @@ snapshots: node-int64@0.4.0: {} - node-polyfill-webpack-plugin@2.0.1(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)): + node-polyfill-webpack-plugin@2.0.1(webpack@5.96.1(@swc/core@1.9.3)): dependencies: assert: 2.1.0 browserify-zlib: 0.2.0 @@ -27260,7 +27251,7 @@ snapshots: url: 0.11.4 util: 0.12.5 vm-browserify: 1.1.2 - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0) + webpack: 5.96.1(@swc/core@1.9.3) node-releases@2.0.18: {} @@ -27535,7 +27526,7 @@ snapshots: transitivePeerDependencies: - zod - ox@0.3.0(typescript@5.7.2)(zod@3.23.8): + ox@0.4.0(typescript@5.7.2)(zod@3.23.8): dependencies: '@adraffy/ens-normalize': 1.11.0 '@noble/curves': 1.7.0 @@ -27883,13 +27874,13 @@ snapshots: camelcase-css: 2.0.1 postcss: 8.4.49 - postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2)): + postcss-load-config@4.0.2(postcss@8.4.49)(ts-node@10.9.2(@types/node@22.10.0)(typescript@5.7.2)): dependencies: lilconfig: 3.1.2 yaml: 2.6.1 optionalDependencies: postcss: 8.4.49 - ts-node: 10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2) + ts-node: 10.9.2(@swc/core@1.9.3)(@types/node@22.10.0)(typescript@5.7.2) postcss-load-config@6.0.1(jiti@2.4.0)(postcss@8.4.49)(tsx@4.19.2)(yaml@2.6.1): dependencies: @@ -27900,14 +27891,14 @@ snapshots: tsx: 4.19.2 yaml: 2.6.1 - postcss-loader@8.1.1(postcss@8.4.49)(typescript@5.7.2)(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)): + postcss-loader@8.1.1(postcss@8.4.49)(typescript@5.7.2)(webpack@5.96.1(@swc/core@1.9.3)): dependencies: cosmiconfig: 9.0.0(typescript@5.7.2) jiti: 1.21.6 postcss: 8.4.49 semver: 7.6.3 optionalDependencies: - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0) + webpack: 5.96.1(@swc/core@1.9.3) transitivePeerDependencies: - typescript @@ -29064,10 +29055,10 @@ snapshots: safer-buffer@2.1.2: {} - sass-loader@13.3.3(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)): + sass-loader@13.3.3(webpack@5.96.1(@swc/core@1.9.3)): dependencies: neo-async: 2.6.2 - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0) + webpack: 5.96.1(@swc/core@1.9.3) satori@0.12.0: dependencies: @@ -29592,9 +29583,9 @@ snapshots: structured-headers@0.4.1: {} - style-loader@3.3.4(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)): + style-loader@3.3.4(webpack@5.96.1(@swc/core@1.9.3)): dependencies: - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0) + webpack: 5.96.1(@swc/core@1.9.3) style-to-object@0.4.4: dependencies: @@ -29739,11 +29730,11 @@ snapshots: tailwind-merge@2.5.5: {} - tailwindcss-animate@1.0.7(tailwindcss@3.4.15(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2))): + tailwindcss-animate@1.0.7(tailwindcss@3.4.15(ts-node@10.9.2(@types/node@22.10.0)(typescript@5.7.2))): dependencies: - tailwindcss: 3.4.15(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2)) + tailwindcss: 3.4.15(ts-node@10.9.2(@types/node@22.10.0)(typescript@5.7.2)) - tailwindcss@3.4.15(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2)): + tailwindcss@3.4.15(ts-node@10.9.2(@types/node@22.10.0)(typescript@5.7.2)): dependencies: '@alloc/quick-lru': 5.2.0 arg: 5.0.2 @@ -29762,7 +29753,7 @@ snapshots: postcss: 8.4.49 postcss-import: 15.1.0(postcss@8.4.49) postcss-js: 4.0.1(postcss@8.4.49) - postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2)) + postcss-load-config: 4.0.2(postcss@8.4.49)(ts-node@10.9.2(@types/node@22.10.0)(typescript@5.7.2)) postcss-nested: 6.2.0(postcss@8.4.49) postcss-selector-parser: 6.1.2 resolve: 1.22.8 @@ -29824,28 +29815,27 @@ snapshots: ansi-escapes: 4.3.2 supports-hyperlinks: 2.3.0 - terser-webpack-plugin@5.3.10(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)): + terser-webpack-plugin@5.3.10(@swc/core@1.9.3)(webpack@5.96.1(@swc/core@1.9.3)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.36.0 - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0) + webpack: 5.96.1(@swc/core@1.9.3) optionalDependencies: - '@swc/core': 1.9.3(@swc/helpers@0.5.15) - esbuild: 0.24.0 + '@swc/core': 1.9.3 - terser-webpack-plugin@5.3.10(@swc/core@1.9.3(@swc/helpers@0.5.15))(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))): + terser-webpack-plugin@5.3.10(esbuild@0.24.0)(webpack@5.96.1(esbuild@0.24.0)): dependencies: '@jridgewell/trace-mapping': 0.3.25 jest-worker: 27.5.1 schema-utils: 3.3.0 serialize-javascript: 6.0.2 terser: 5.36.0 - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15)) + webpack: 5.96.1(esbuild@0.24.0) optionalDependencies: - '@swc/core': 1.9.3(@swc/helpers@0.5.15) + esbuild: 0.24.0 terser-webpack-plugin@5.3.10(webpack@5.96.1): dependencies: @@ -29982,7 +29972,7 @@ snapshots: ts-mixer@6.0.4: {} - ts-node@10.9.2(@swc/core@1.9.3(@swc/helpers@0.5.15))(@types/node@22.10.0)(typescript@5.7.2): + ts-node@10.9.2(@swc/core@1.9.3)(@types/node@22.10.0)(typescript@5.7.2): dependencies: '@cspotcode/source-map-support': 0.8.1 '@tsconfig/node10': 1.0.11 @@ -30000,7 +29990,7 @@ snapshots: v8-compile-cache-lib: 3.0.1 yn: 3.1.1 optionalDependencies: - '@swc/core': 1.9.3(@swc/helpers@0.5.15) + '@swc/core': 1.9.3 ts-pnp@1.2.0(typescript@5.7.2): optionalDependencies: @@ -30754,7 +30744,7 @@ snapshots: - bufferutil - utf-8-validate - webpack-dev-middleware@6.1.3(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)): + webpack-dev-middleware@6.1.3(webpack@5.96.1(@swc/core@1.9.3)): dependencies: colorette: 2.0.20 memfs: 3.5.3 @@ -30762,7 +30752,7 @@ snapshots: range-parser: 1.2.1 schema-utils: 4.2.0 optionalDependencies: - webpack: 5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0) + webpack: 5.96.1(@swc/core@1.9.3) webpack-hot-middleware@2.26.1: dependencies: @@ -30806,7 +30796,7 @@ snapshots: - esbuild - uglify-js - webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15)): + webpack@5.96.1(@swc/core@1.9.3): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 @@ -30828,7 +30818,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.9.3(@swc/helpers@0.5.15))(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))) + terser-webpack-plugin: 5.3.10(@swc/core@1.9.3)(webpack@5.96.1(@swc/core@1.9.3)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: @@ -30836,7 +30826,7 @@ snapshots: - esbuild - uglify-js - webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0): + webpack@5.96.1(esbuild@0.24.0): dependencies: '@types/eslint-scope': 3.7.7 '@types/estree': 1.0.6 @@ -30858,7 +30848,7 @@ snapshots: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.1 - terser-webpack-plugin: 5.3.10(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)(webpack@5.96.1(@swc/core@1.9.3(@swc/helpers@0.5.15))(esbuild@0.24.0)) + terser-webpack-plugin: 5.3.10(esbuild@0.24.0)(webpack@5.96.1(esbuild@0.24.0)) watchpack: 2.4.2 webpack-sources: 3.2.3 transitivePeerDependencies: