From 285b3307df9021b08255480c5ad22dd62c9655d4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 29 Jul 2026 13:20:10 +0000 Subject: [PATCH 01/11] Initial plan From ffc85a63fdef68c3e46f9bfa334a0a2cf46b3c49 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 29 Jul 2026 13:34:08 +0000 Subject: [PATCH 02/11] feat: add secure GoodWidget integration boundary --- .../(bottomsheet)/[widgetRoute]/page.tsx | 20 ++ .../Form/RoundButton/RoundButton.tsx | 26 +- .../Home/components/WalletSection.tsx | 109 +++--- src/widgets/AuthenticatedWidgetRoute.tsx | 79 +++++ src/widgets/WidgetRenderer.tsx | 34 ++ src/widgets/hostProperties.test.ts | 33 ++ src/widgets/hostProperties.ts | 24 ++ src/widgets/hostTypes.ts | 39 ++ src/widgets/hosts/ReactWidgetHost.tsx | 57 +++ src/widgets/hosts/WebComponentWidgetHost.tsx | 89 +++++ .../RestrictedEip1193Provider.test.ts | 159 +++++++++ .../provider/RestrictedEip1193Provider.ts | 334 ++++++++++++++++++ src/widgets/provider/WidgetProvider.tsx | 63 ++++ src/widgets/provider/policy.ts | 65 ++++ src/widgets/registry.test.ts | 95 +++++ src/widgets/registry.ts | 193 ++++++++++ src/widgets/resolveReactWidget.test.ts | 25 ++ src/widgets/resolveReactWidget.ts | 17 + tests-playwright/wallet-flows.e2e.ts | 6 + 19 files changed, 1398 insertions(+), 69 deletions(-) create mode 100644 src/app/[locale]/@home/(home)/(bottomsheet)/[widgetRoute]/page.tsx create mode 100644 src/widgets/AuthenticatedWidgetRoute.tsx create mode 100644 src/widgets/WidgetRenderer.tsx create mode 100644 src/widgets/hostProperties.test.ts create mode 100644 src/widgets/hostProperties.ts create mode 100644 src/widgets/hostTypes.ts create mode 100644 src/widgets/hosts/ReactWidgetHost.tsx create mode 100644 src/widgets/hosts/WebComponentWidgetHost.tsx create mode 100644 src/widgets/provider/RestrictedEip1193Provider.test.ts create mode 100644 src/widgets/provider/RestrictedEip1193Provider.ts create mode 100644 src/widgets/provider/WidgetProvider.tsx create mode 100644 src/widgets/provider/policy.ts create mode 100644 src/widgets/registry.test.ts create mode 100644 src/widgets/registry.ts create mode 100644 src/widgets/resolveReactWidget.test.ts create mode 100644 src/widgets/resolveReactWidget.ts diff --git a/src/app/[locale]/@home/(home)/(bottomsheet)/[widgetRoute]/page.tsx b/src/app/[locale]/@home/(home)/(bottomsheet)/[widgetRoute]/page.tsx new file mode 100644 index 0000000..dfe5a0b --- /dev/null +++ b/src/app/[locale]/@home/(home)/(bottomsheet)/[widgetRoute]/page.tsx @@ -0,0 +1,20 @@ +import { notFound } from "next/navigation" + +import { AuthenticatedWidgetRoute } from "@/widgets/AuthenticatedWidgetRoute" +import { getWidgetByRoute } from "@/widgets/registry" + +/** + * Static core routes take precedence; this fallback can mount only a reviewed + * registry route and treats every other unknown bottom-sheet URL as not found. + */ +export default async function WidgetRoutePage({ + params, +}: { + params: Promise<{ widgetRoute: string }> +}) { + const { widgetRoute } = await params + const widget = getWidgetByRoute(widgetRoute) + if (!widget) notFound() + + return +} diff --git a/src/components/Form/RoundButton/RoundButton.tsx b/src/components/Form/RoundButton/RoundButton.tsx index cd10473..cc0ab6d 100644 --- a/src/components/Form/RoundButton/RoundButton.tsx +++ b/src/components/Form/RoundButton/RoundButton.tsx @@ -1,13 +1,19 @@ "use client" +import type { ReactNode } from "react" import { BsLink45Deg, BsPlusCircle } from "react-icons/bs" import { Icon, type IconName } from "ui" export type RoundButtonProps = { onClick?: () => void - buttonType: RoundButtonType + buttonType?: RoundButtonType + /** Registry actions may use a system icon without adding a legacy button type. */ + icon?: IconName + /** Registry actions may use a reviewed local asset without serializing it. */ + iconElement?: ReactNode text?: string fill?: boolean + indicator?: "connected" | "available" } export const enum RoundButtonType { @@ -32,10 +38,16 @@ const buttonIcons: Record = { export const RoundButton = ({ buttonType, + icon, + iconElement, onClick, text, fill = false, + indicator, }: RoundButtonProps) => { + const selectedIcon = + icon ?? (buttonType === undefined ? undefined : buttonIcons[buttonType]) + return (
- + {selectedIcon ? ( + + ) : ( + iconElement + )} - {fill && buttonType === RoundButtonType.WalletConnect ? ( + {indicator === "connected" || + (fill && buttonType === RoundButtonType.WalletConnect) ? ( ) : null} - {fill && buttonType === RoundButtonType.GoodDollar ? ( + {indicator === "available" || + (fill && buttonType === RoundButtonType.GoodDollar) ? ( - - - ) - - const receiveLink = ( - - - - ) - - const swapLink = ( - - - - ) - - const predictionsLink = ( - - - - ) - - const goodDollarLink = ( - - - - ) - - const walletConnectLink = ( - - 0} - /> - - ) + const actionLabels: Record = { + gooddollar: homeTranslations.gooddollar, + send: homeTranslations.send, + receive: homeTranslations.receive, + swap: homeTranslations.swap, + predictions: homeTranslations.predictions, + walletconnect: homeTranslations.walletConnect, + } + // Widgets append to the existing grid, allowing the current responsive + // collapse control to keep owning the More behavior and core ordering. + const dashboardActions = [...coreDashboardActions, ...widgetDashboardActions] return ( <> @@ -273,12 +230,34 @@ export default function WalletSection({ } data-testid="wallet-actions" > - {goodDollarLink} - {sendLink} - {receiveLink} - {swapLink} - {predictionsLink} - {walletConnectLink} + {dashboardActions.map((action) => { + const icon = + action.icon.kind === "system" ? action.icon.name : undefined + const iconElement = + action.icon.kind === "local" ? action.icon.render() : undefined + const indicator = + action.id === "gooddollar" && canClaim + ? "available" + : action.id === "walletconnect" && sessions.length > 0 + ? "connected" + : undefined + + return ( + + + + ) + })}
{hasMultipleActionRows ? (
{ + const { signer, isLoading } = useSessionContext() + const widget = widgetRegistry.get(widgetId) + + useEffect(() => { + if (widget) { + setBottomSheetProps({ + title: widget.displayName, + subtitle: widget.description, + }) + } + return () => setBottomSheetProps({}) + }, [widget]) + + if (!widget) throw new Error(`Unknown widget route: ${widgetId}`) + if (isLoading) return + if (!signer?.EVM) return null + + return ( + + + + ) +} + +/** + * The provider capability enters the renderer only after authentication. + */ +const MountedWidget = ({ + widget, + themeOverrides, + config, +}: { + widget: RegisteredWidget + themeOverrides?: WidgetHostProps["themeOverrides"] + config?: WidgetHostProps["config"] +}) => { + const provider = useWidgetProvider() + + return ( + + ) +} diff --git a/src/widgets/WidgetRenderer.tsx b/src/widgets/WidgetRenderer.tsx new file mode 100644 index 0000000..6922033 --- /dev/null +++ b/src/widgets/WidgetRenderer.tsx @@ -0,0 +1,34 @@ +"use client" + +import { ReactWidgetHost } from "./hosts/ReactWidgetHost" +import { WebComponentWidgetHost } from "./hosts/WebComponentWidgetHost" +import type { WidgetHostProps } from "./hostTypes" +import { type RegisteredWidget, resolveWidgetIntegrationMode } from "./registry" + +/** + * This is the sole integration-mode decision point for every widget route. + */ +export const WidgetRenderer = ({ + widget, + ...hostProps +}: WidgetHostProps & { + widget: RegisteredWidget +}) => { + if (resolveWidgetIntegrationMode(widget) === "react") { + return ( + + ) + } + + return ( + + ) +} diff --git a/src/widgets/hostProperties.test.ts b/src/widgets/hostProperties.test.ts new file mode 100644 index 0000000..c13a3e9 --- /dev/null +++ b/src/widgets/hostProperties.test.ts @@ -0,0 +1,33 @@ +import { describe, expect, it } from "vitest" + +import { + assignHostedWidgetProperties, + clearHostedWidgetProperties, +} from "./hostProperties" +import type { HostedWidgetElement } from "./hostTypes" +import type { RestrictedEip1193Provider } from "./provider/RestrictedEip1193Provider" + +describe("Web Component host properties", () => { + it("hands objects over by identity and clears Wallet references on cleanup", () => { + const provider = {} as RestrictedEip1193Provider + const element = {} as HostedWidgetElement + const themeOverrides = { color: { primary: "#00AFFE" } } + const config = { environment: "production" } + + assignHostedWidgetProperties(element, { + provider, + themeOverrides, + config, + }) + + expect(element.provider).toBe(provider) + expect(element.themeOverrides).toBe(themeOverrides) + expect(element.config).toBe(config) + + clearHostedWidgetProperties(element) + + expect(element.provider).toBeNull() + expect(element.themeOverrides).toBeUndefined() + expect(element.config).toBeUndefined() + }) +}) diff --git a/src/widgets/hostProperties.ts b/src/widgets/hostProperties.ts new file mode 100644 index 0000000..bf8214b --- /dev/null +++ b/src/widgets/hostProperties.ts @@ -0,0 +1,24 @@ +import type { HostedWidgetElement, WidgetHostProps } from "./hostTypes" + +/** + * Hands the non-serializable wallet capability to the mounted Custom Element. + */ +export const assignHostedWidgetProperties = ( + element: HostedWidgetElement, + { provider, themeOverrides, config }: WidgetHostProps, +): void => { + element.provider = provider + element.themeOverrides = themeOverrides + element.config = config +} + +/** + * Removes wallet-owned references before a detached element can retain them. + */ +export const clearHostedWidgetProperties = ( + element: HostedWidgetElement, +): void => { + element.provider = null + element.themeOverrides = undefined + element.config = undefined +} diff --git a/src/widgets/hostTypes.ts b/src/widgets/hostTypes.ts new file mode 100644 index 0000000..b0bd7ba --- /dev/null +++ b/src/widgets/hostTypes.ts @@ -0,0 +1,39 @@ +import type { ComponentType } from "react" + +import type { RestrictedEip1193Provider } from "./provider/RestrictedEip1193Provider" + +/** + * This is the complete wallet-to-widget contract for both host implementations. + * Widgets do not receive a signer, seed, RPC client, or wallet session object. + */ +export type WidgetHostProps = { + provider: RestrictedEip1193Provider + themeOverrides?: Record + config?: Record +} + +/** + * Registry loaders deliberately return an untyped module because independently + * released widgets are normalized by the host before they are rendered. + */ +export type ReactWidgetLoader = () => Promise> + +export type HostedReactWidget = ComponentType + +/** + * The element module must register its declared tag only after the host mounts + * in the browser, avoiding Custom Element evaluation during server rendering. + */ +export type WebComponentWidgetLoader = () => Promise<{ + register: (tagName?: string) => string | Promise +}> + +/** + * Widget values are object properties, rather than HTML attributes, so the + * restricted provider never appears in serialized markup. + */ +export type HostedWidgetElement = HTMLElement & { + provider: RestrictedEip1193Provider | null + themeOverrides?: Record + config?: Record +} diff --git a/src/widgets/hosts/ReactWidgetHost.tsx b/src/widgets/hosts/ReactWidgetHost.tsx new file mode 100644 index 0000000..bbd8cfe --- /dev/null +++ b/src/widgets/hosts/ReactWidgetHost.tsx @@ -0,0 +1,57 @@ +"use client" + +import { useEffect, useState } from "react" + +import { LoadingSpinner } from "@/components/Snippet/LoadingSpinner" + +import type { + HostedReactWidget, + ReactWidgetLoader, + WidgetHostProps, +} from "../hostTypes" +import { resolveReactWidget } from "../resolveReactWidget" + +/** + * Loads a reviewed React entry only after this bottom-sheet route reaches the + * browser and passes it the same limited contract as Custom Elements receive. + */ +export const ReactWidgetHost = ({ + load, + exportName, + ...hostProps +}: WidgetHostProps & { + load: ReactWidgetLoader + exportName: string +}) => { + const [Component, setComponent] = useState(null) + const [loadError, setLoadError] = useState(null) + + useEffect(() => { + let isMounted = true + + load() + .then((module) => { + if (!isMounted) return + const exportedComponent = resolveReactWidget(module, exportName) + // Functions are React state updaters, so keep the component wrapped. + setComponent(() => exportedComponent) + }) + .catch((error: unknown) => { + if (!isMounted) return + setLoadError( + error instanceof Error + ? error + : new Error("Unable to load the widget React entry"), + ) + }) + + return () => { + isMounted = false + } + }, [exportName, load]) + + if (loadError) throw loadError + if (!Component) return + + return +} diff --git a/src/widgets/hosts/WebComponentWidgetHost.tsx b/src/widgets/hosts/WebComponentWidgetHost.tsx new file mode 100644 index 0000000..7917046 --- /dev/null +++ b/src/widgets/hosts/WebComponentWidgetHost.tsx @@ -0,0 +1,89 @@ +"use client" + +import { createElement, useEffect, useRef, useState } from "react" + +import { LoadingSpinner } from "@/components/Snippet/LoadingSpinner" + +import { + assignHostedWidgetProperties, + clearHostedWidgetProperties, +} from "../hostProperties" +import type { + HostedWidgetElement, + WebComponentWidgetLoader, + WidgetHostProps, +} from "../hostTypes" + +/** + * Registers and mounts a widget Custom Element exclusively on the client. + */ +export const WebComponentWidgetHost = ({ + load, + tagName, + provider, + themeOverrides, + config, +}: WidgetHostProps & { + load: WebComponentWidgetLoader + tagName: string +}) => { + const elementRef = useRef(null) + const [registeredTagName, setRegisteredTagName] = useState( + null, + ) + const [loadError, setLoadError] = useState(null) + + useEffect(() => { + let isMounted = true + + // Element classes may depend on HTMLElement at module evaluation time. + load() + .then(async (module) => { + const registered = await module.register(tagName) + if (!isMounted) return + if (registered !== tagName) { + throw new Error( + `Widget registered ${registered}; expected declared tag ${tagName}`, + ) + } + setRegisteredTagName(registered) + }) + .catch((error: unknown) => { + if (!isMounted) return + setLoadError( + error instanceof Error + ? error + : new Error("Unable to register the widget Custom Element"), + ) + }) + + return () => { + isMounted = false + } + }, [load, tagName]) + + useEffect(() => { + const element = elementRef.current + if (!element || !registeredTagName) return + + // Object assignment preserves provider identity and prevents HTML leakage. + assignHostedWidgetProperties(element, { + provider, + themeOverrides, + config, + }) + + return () => { + clearHostedWidgetProperties(element) + } + }, [config, provider, registeredTagName, themeOverrides]) + + if (loadError) throw loadError + if (!registeredTagName) return + + return createElement(registeredTagName, { + ref: (element: HTMLElement | null) => { + elementRef.current = element as HostedWidgetElement | null + }, + }) +} diff --git a/src/widgets/provider/RestrictedEip1193Provider.test.ts b/src/widgets/provider/RestrictedEip1193Provider.test.ts new file mode 100644 index 0000000..892de54 --- /dev/null +++ b/src/widgets/provider/RestrictedEip1193Provider.test.ts @@ -0,0 +1,159 @@ +import { describe, expect, it, vi } from "vitest" + +vi.mock("@/chain/provider/EVM/viemClients", () => ({ + getViemClient: vi.fn(), +})) + +import { + RestrictedEip1193Provider, + WidgetProviderError, +} from "./RestrictedEip1193Provider" + +const address = "0x1111111111111111111111111111111111111111" +const signer = { + address, + signMessage: vi.fn(async () => "0xmessage"), + signTypedData: vi.fn(async () => "0xtyped"), + signTransaction: vi.fn(async () => "0xraw"), +} + +const allTestMethods = [ + "eth_accounts", + "eth_chainId", + "eth_getBalance", + "wallet_switchEthereumChain", + "personal_sign", + "eth_signTypedData_v4", + "eth_sendTransaction", +] + +const createProvider = ( + options: Partial< + ConstructorParameters[0] + > = {}, +) => { + const rpcRequest = vi.fn(async () => "0xresult") + const requestWalletApproval = vi.fn(async () => true) + return { + provider: new RestrictedEip1193Provider({ + signer, + chainIds: [1, 42220], + rpcRequest, + requestWalletApproval, + ...options, + requiredMethods: options.requiredMethods ?? allTestMethods, + }), + rpcRequest, + requestWalletApproval, + } +} + +describe("RestrictedEip1193Provider", () => { + it("exposes only the active account and forwards reviewed reads", async () => { + const { provider, rpcRequest } = createProvider() + await expect(provider.request({ method: "eth_accounts" })).resolves.toEqual( + [address], + ) + await expect( + provider.request({ + method: "eth_getBalance", + params: [address, "latest"], + }), + ).resolves.toBe("0xresult") + expect(rpcRequest).toHaveBeenCalledWith(1, { + method: "eth_getBalance", + params: [address, "latest"], + }) + }) + + it("enforces each widget's configured method subset", async () => { + const { provider } = createProvider({ + requiredMethods: ["eth_accounts"], + }) + await expect( + provider.request({ + method: "eth_getBalance", + params: [address, "latest"], + }), + ).rejects.toMatchObject({ code: 4100 }) + }) + + it("rejects unknown methods and incompatible provider contracts", async () => { + const { provider } = createProvider() + await expect( + provider.request({ method: "wallet_getSeed" }), + ).rejects.toMatchObject({ code: 4200 }) + expect(() => + createProvider({ requiredMethods: ["wallet_getSeed"] }), + ).toThrow("unsupported provider methods") + }) + + it("allows only configured chain switches and emits normalized chain IDs", async () => { + const { provider } = createProvider() + const listener = vi.fn() + provider.on("chainChanged", listener) + await provider.request({ + method: "wallet_switchEthereumChain", + params: [{ chainId: "0xa4ec" }], + }) + expect(listener).toHaveBeenCalledWith("0xa4ec") + await expect( + provider.request({ + method: "wallet_switchEthereumChain", + params: [{ chainId: "0x89" }], + }), + ).rejects.toBeInstanceOf(WidgetProviderError) + }) + + it("requires account and chain validation plus Wallet approval for transactions", async () => { + const { provider, requestWalletApproval, rpcRequest } = createProvider() + await expect( + provider.request({ + method: "eth_sendTransaction", + params: [{ from: address, chainId: 1, to: address, value: BigInt(1) }], + }), + ).resolves.toBe("0xresult") + expect(requestWalletApproval).toHaveBeenCalledWith( + expect.objectContaining({ method: "eth_sendTransaction", chainId: 1 }), + ) + expect(signer.signTransaction).toHaveBeenCalled() + expect(rpcRequest).toHaveBeenCalledWith(1, { + method: "eth_sendRawTransaction", + params: ["0xraw"], + }) + }) + + it("keeps signing disabled until the Wallet explicitly approves it", async () => { + const { provider } = createProvider({ requestWalletApproval: undefined }) + await expect( + provider.request({ + method: "personal_sign", + params: ["message", address], + }), + ).rejects.toMatchObject({ code: 4001 }) + }) + + it("rejects mismatched signing accounts and typed-data chains before approval", async () => { + const { provider, requestWalletApproval } = createProvider() + await expect( + provider.request({ + method: "personal_sign", + params: ["message", "0x2222222222222222222222222222222222222222"], + }), + ).rejects.toMatchObject({ code: 4100 }) + await expect( + provider.request({ + method: "eth_signTypedData_v4", + params: [ + address, + JSON.stringify({ + domain: { name: "Widget", chainId: 42220 }, + types: { Thing: [{ name: "value", type: "uint256" }] }, + message: { value: 1 }, + }), + ], + }), + ).rejects.toMatchObject({ code: 4100 }) + expect(requestWalletApproval).not.toHaveBeenCalled() + }) +}) diff --git a/src/widgets/provider/RestrictedEip1193Provider.ts b/src/widgets/provider/RestrictedEip1193Provider.ts new file mode 100644 index 0000000..2e294e8 --- /dev/null +++ b/src/widgets/provider/RestrictedEip1193Provider.ts @@ -0,0 +1,334 @@ +import type { + TransactionRequest, + TypedDataDomain, + TypedDataField, +} from "ethers" +import { getBytes } from "ethers" + +import { getViemClient } from "@/chain/provider/EVM/viemClients" +import type { EVMSigner } from "@/login" + +import { + WIDGET_EVM_CHAIN_IDS, + WIDGET_PROVIDER_METHODS, + WIDGET_READ_METHODS, +} from "./policy" + +export type ProviderRequest = { + method: string + params?: readonly unknown[] | Record +} + +export type WalletApprovalRequest = { + method: string + params: readonly unknown[] + account: string + chainId: number +} + +export class WidgetProviderError extends Error { + constructor( + public readonly code: 4001 | 4100 | 4200 | 4901, + message: string, + public readonly data?: unknown, + ) { + super(message) + this.name = "WidgetProviderError" + } +} + +export type RestrictedProviderOptions = { + signer: EVMSigner + chainIds: readonly number[] + requiredMethods: readonly string[] + initialChainId?: number + /** + * This callback belongs to GoodWallet UI, never to the widget. Its secure + * default leaves every signing method disabled until that UI is supplied. + */ + requestWalletApproval?: (request: WalletApprovalRequest) => Promise + rpcRequest?: (chainId: number, request: ProviderRequest) => Promise +} + +const asParams = (params: ProviderRequest["params"]): readonly unknown[] => + Array.isArray(params) ? params : [] + +const asChainId = (value: unknown): number => { + if (typeof value !== "string" || !/^0x[0-9a-f]+$/i.test(value)) { + throw new WidgetProviderError(4200, "Invalid hexadecimal chain ID") + } + return Number.parseInt(value, 16) +} + +const addressesMatch = (left: unknown, right: string): boolean => + typeof left === "string" && left.toLowerCase() === right.toLowerCase() + +const normalizeError = (error: unknown): WidgetProviderError => { + if (error instanceof WidgetProviderError) return error + const message = + error instanceof Error ? error.message : "Provider request failed" + const rejected = /reject|denied|declined|cancel/i.test(message) + return new WidgetProviderError(rejected ? 4001 : 4200, message, error) +} + +/** + * A capability-limited EIP-1193 facade over GoodWallet's active EVM session. + * The real signer and session are private fields and cannot be retrieved by a + * widget through this interface. + */ +export class RestrictedEip1193Provider { + readonly #allowedChainIds: ReadonlySet + readonly #allowedMethods: ReadonlySet + readonly #listeners = new Map< + "accountsChanged" | "chainChanged", + Set<(...args: unknown[]) => void> + >() + readonly #requestWalletApproval: NonNullable< + RestrictedProviderOptions["requestWalletApproval"] + > + readonly #rpcRequest: NonNullable + #chainId: number + #signer: EVMSigner + + constructor(options: RestrictedProviderOptions) { + if (options.chainIds.length === 0) { + throw new Error("At least one widget chain is required") + } + + const unsupportedChains = options.chainIds.filter( + (chainId) => !WIDGET_EVM_CHAIN_IDS.has(chainId), + ) + if (unsupportedChains.length > 0) { + throw new Error( + `Widget requested unsupported chains: ${unsupportedChains.join(", ")}`, + ) + } + + const unsupportedMethods = options.requiredMethods.filter( + (method) => !WIDGET_PROVIDER_METHODS.has(method), + ) + if (unsupportedMethods.length > 0) { + throw new Error( + `Widget requires unsupported provider methods: ${unsupportedMethods.join(", ")}`, + ) + } + + this.#allowedChainIds = new Set(options.chainIds) + this.#allowedMethods = new Set(options.requiredMethods) + this.#chainId = options.initialChainId ?? options.chainIds[0] + if (!this.#allowedChainIds.has(this.#chainId)) { + throw new Error("The initial chain must be allowed") + } + + this.#signer = options.signer + // Signing is disabled unless a Wallet-owned confirmation surface opts in. + this.#requestWalletApproval = + options.requestWalletApproval ?? (async () => false) + this.#rpcRequest = + options.rpcRequest ?? + (async (chainId, request) => { + const client = getViemClient(chainId) + return await ( + client.request as (request: ProviderRequest) => Promise + )(request) + }) + } + + get chainId(): number { + return this.#chainId + } + + get supportedMethods(): readonly string[] { + return [...this.#allowedMethods] + } + + on( + event: "accountsChanged" | "chainChanged", + listener: (...args: unknown[]) => void, + ): this { + const listeners = this.#listeners.get(event) ?? new Set() + listeners.add(listener) + this.#listeners.set(event, listeners) + return this + } + + removeListener( + event: "accountsChanged" | "chainChanged", + listener: (...args: unknown[]) => void, + ): this { + this.#listeners.get(event)?.delete(listener) + return this + } + + /** + * Session updates retain the facade while notifying a widget of account loss. + */ + updateAccount(signer: EVMSigner): void { + const accountChanged = !addressesMatch(signer.address, this.#signer.address) + this.#signer = signer + if (accountChanged) this.#emit("accountsChanged", [signer.address]) + } + + async request(request: ProviderRequest): Promise { + if (!WIDGET_PROVIDER_METHODS.has(request.method)) { + throw new WidgetProviderError( + 4200, + `Method ${request.method} is not permitted for widgets`, + ) + } + if (!this.#allowedMethods.has(request.method)) { + throw new WidgetProviderError( + 4100, + `Method ${request.method} is not approved for this widget`, + ) + } + + try { + const params = asParams(request.params) + switch (request.method) { + case "eth_accounts": + case "eth_requestAccounts": + return [this.#signer.address] + case "eth_chainId": + return `0x${this.#chainId.toString(16)}` + case "wallet_switchEthereumChain": + return this.#switchChain(params) + case "personal_sign": + return await this.#signMessage(params) + case "eth_signTypedData_v4": + return await this.#signTypedData(params) + case "eth_sendTransaction": + return await this.#sendTransaction(params) + default: + if (WIDGET_READ_METHODS.has(request.method)) { + return await this.#rpcRequest(this.#chainId, request) + } + throw new WidgetProviderError(4200, "Unsupported widget request") + } + } catch (error) { + throw normalizeError(error) + } + } + + #emit(event: "accountsChanged" | "chainChanged", value: unknown): void { + for (const listener of this.#listeners.get(event) ?? []) listener(value) + } + + #assertAccount(account: unknown): void { + if (!addressesMatch(account, this.#signer.address)) { + throw new WidgetProviderError( + 4100, + "The signing account does not match the active GoodWallet session", + ) + } + } + + async #requestSigningApproval( + method: string, + params: readonly unknown[], + ): Promise { + const approved = await this.#requestWalletApproval({ + method, + params, + account: this.#signer.address, + chainId: this.#chainId, + }) + if (!approved) { + throw new WidgetProviderError( + 4001, + "GoodWallet did not approve the signing request", + ) + } + } + + #switchChain(params: readonly unknown[]): null { + const requested = params[0] + const rawChainId = + requested && typeof requested === "object" && "chainId" in requested + ? requested.chainId + : undefined + const chainId = asChainId(rawChainId) + if (!this.#allowedChainIds.has(chainId)) { + throw new WidgetProviderError( + 4901, + `Chain ${chainId} is not allowed for this widget`, + ) + } + if (chainId !== this.#chainId) { + this.#chainId = chainId + this.#emit("chainChanged", `0x${chainId.toString(16)}`) + } + return null + } + + async #signMessage(params: readonly unknown[]): Promise { + const [message, account] = params + this.#assertAccount(account) + if (typeof message !== "string") { + throw new WidgetProviderError(4200, "personal_sign requires a message") + } + await this.#requestSigningApproval("personal_sign", params) + return await this.#signer.signMessage( + /^0x[0-9a-f]*$/i.test(message) ? getBytes(message) : message, + ) + } + + async #signTypedData(params: readonly unknown[]): Promise { + const [account, rawData] = params + this.#assertAccount(account) + if (typeof rawData !== "string") { + throw new WidgetProviderError( + 4200, + "eth_signTypedData_v4 requires JSON typed data", + ) + } + const data = JSON.parse(rawData) as { + domain?: TypedDataDomain + types?: Record + message?: Record + } + if (!data.domain || !data.types || !data.message) { + throw new WidgetProviderError(4200, "Invalid EIP-712 typed data") + } + const { EIP712Domain: _domainType, ...types } = data.types + if ( + data.domain.chainId !== undefined && + Number(data.domain.chainId) !== this.#chainId + ) { + throw new WidgetProviderError( + 4100, + "Typed-data chain does not match the active widget chain", + ) + } + await this.#requestSigningApproval("eth_signTypedData_v4", params) + return await this.#signer.signTypedData(data.domain, types, data.message) + } + + async #sendTransaction(params: readonly unknown[]): Promise { + const transaction = params[0] + if (!transaction || typeof transaction !== "object") { + throw new WidgetProviderError(4200, "A transaction object is required") + } + const request = transaction as TransactionRequest & { + from?: string + chainId?: string | number + } + this.#assertAccount(request.from) + if ( + request.chainId !== undefined && + Number(request.chainId) !== this.#chainId + ) { + throw new WidgetProviderError( + 4100, + "Transaction chain does not match the active widget chain", + ) + } + await this.#requestSigningApproval("eth_sendTransaction", params) + const { from: _from, ...signableRequest } = request + const rawTransaction = await this.#signer.signTransaction(signableRequest) + return await this.#rpcRequest(this.#chainId, { + method: "eth_sendRawTransaction", + params: [rawTransaction], + }) + } +} diff --git a/src/widgets/provider/WidgetProvider.tsx b/src/widgets/provider/WidgetProvider.tsx new file mode 100644 index 0000000..f807577 --- /dev/null +++ b/src/widgets/provider/WidgetProvider.tsx @@ -0,0 +1,63 @@ +"use client" + +import { + createContext, + type ReactNode, + useContext, + useEffect, + useMemo, +} from "react" + +import { useSessionContext } from "@/login/hooks/context" + +import { RestrictedEip1193Provider } from "./RestrictedEip1193Provider" + +const WidgetProviderContext = createContext( + null, +) + +/** + * This is the sole bridge from an authenticated session into widget code. + */ +export const WidgetProvider = ({ + chainIds, + requiredMethods, + children, +}: { + chainIds: readonly number[] + requiredMethods: readonly string[] + children: ReactNode +}) => { + const { signer } = useSessionContext() + const evmSigner = signer?.EVM + const provider = useMemo( + () => + evmSigner + ? new RestrictedEip1193Provider({ + signer: evmSigner, + chainIds, + requiredMethods, + }) + : null, + [evmSigner, chainIds, requiredMethods], + ) + + useEffect(() => { + if (provider && evmSigner) provider.updateAccount(evmSigner) + }, [evmSigner, provider]) + + if (!provider) return null + return ( + + {children} + + ) +} + +export const useWidgetProvider = (): RestrictedEip1193Provider => { + const provider = useContext(WidgetProviderContext) + if (!provider) { + throw new Error("useWidgetProvider must be used inside WidgetProvider") + } + return provider +} diff --git a/src/widgets/provider/policy.ts b/src/widgets/provider/policy.ts new file mode 100644 index 0000000..3074ae5 --- /dev/null +++ b/src/widgets/provider/policy.ts @@ -0,0 +1,65 @@ +import { + BASE_CHAIN_ID, + BNB_CHAIN_ID, + CELO_CHAIN_ID, + ETHEREUM_CHAIN_ID, + FUSE_CHAIN_ID, + HOODI_CHAIN_ID, + OPTIMISM_CHAIN_ID, + POLYGON_CHAIN_ID, + SEPOLIA_CHAIN_ID, + XDC_CHAIN_ID, +} from "@/chain/chain-ids" + +/** + * This central allowlist is the outer security boundary for every in-process + * widget. Registry entries can narrow it, but cannot broaden it. + */ +export const WIDGET_READ_METHODS = new Set([ + "eth_blockNumber", + "eth_call", + "eth_estimateGas", + "eth_feeHistory", + "eth_gasPrice", + "eth_getBalance", + "eth_getBlockByHash", + "eth_getBlockByNumber", + "eth_getBlockTransactionCountByHash", + "eth_getBlockTransactionCountByNumber", + "eth_getCode", + "eth_getLogs", + "eth_getStorageAt", + "eth_getTransactionByHash", + "eth_getTransactionCount", + "eth_getTransactionReceipt", + "eth_maxPriorityFeePerGas", + "net_version", +]) + +export const WIDGET_SIGNING_METHODS = new Set([ + "personal_sign", + "eth_signTypedData_v4", + "eth_sendTransaction", +]) + +export const WIDGET_PROVIDER_METHODS = new Set([ + "eth_accounts", + "eth_requestAccounts", + "eth_chainId", + "wallet_switchEthereumChain", + ...WIDGET_READ_METHODS, + ...WIDGET_SIGNING_METHODS, +]) + +export const WIDGET_EVM_CHAIN_IDS = new Set([ + ETHEREUM_CHAIN_ID, + OPTIMISM_CHAIN_ID, + XDC_CHAIN_ID, + BNB_CHAIN_ID, + FUSE_CHAIN_ID, + POLYGON_CHAIN_ID, + BASE_CHAIN_ID, + CELO_CHAIN_ID, + SEPOLIA_CHAIN_ID, + HOODI_CHAIN_ID, +]) diff --git a/src/widgets/registry.test.ts b/src/widgets/registry.test.ts new file mode 100644 index 0000000..e2b2da5 --- /dev/null +++ b/src/widgets/registry.test.ts @@ -0,0 +1,95 @@ +import { describe, expect, it } from "vitest" + +import { + coreDashboardActions, + createWidgetRegistry, + DEFAULT_WIDGET_INTEGRATION_MODE, + defineWidget, + resolveWidgetIntegrationMode, +} from "./registry" + +const widget = defineWidget({ + widgetId: "goodwidget.goodreserve", + packageName: "@goodwidget/goodreserve-widget", + packageVersion: "1.0.0", + entries: { + react: { + exportName: "GoodReserveWidget", + load: async () => ({ GoodReserveWidget: () => null }), + }, + webComponent: { + tagName: "gw-goodreserve-widget", + load: async () => ({ register: (tagName) => tagName ?? "unused" }), + }, + }, + routeSlug: "goodreserve", + displayName: "GoodReserve", + description: "Reserve", + icon: { kind: "system", name: "Cash" }, + providerPolicy: { + chainIds: [1, 42220], + requiredMethods: ["eth_accounts", "eth_chainId"], + }, +}) + +describe("widget registry", () => { + it("indexes typed widgets by immutable ID", () => { + expect(createWidgetRegistry([widget]).get(widget.widgetId)).toBe(widget) + }) + + it("defaults to Web Components and permits a reviewed React override", () => { + expect(DEFAULT_WIDGET_INTEGRATION_MODE).toBe("web-component") + expect(resolveWidgetIntegrationMode(widget)).toBe("web-component") + expect( + resolveWidgetIntegrationMode({ ...widget, integrationMode: "react" }), + ).toBe("react") + }) + + it("rejects duplicate IDs and routes", () => { + expect(() => createWidgetRegistry([widget, widget])).toThrow( + "Duplicate widget ID", + ) + expect(() => + createWidgetRegistry([ + widget, + { ...widget, widgetId: "goodwidget.other" }, + ]), + ).toThrow("Duplicate widget route") + }) + + it("rejects non-exact package versions and unsupported policy entries", () => { + expect(() => + createWidgetRegistry([{ ...widget, packageVersion: "^1.0.0" } as never]), + ).toThrow("exact package version") + expect(() => + createWidgetRegistry([ + { + ...widget, + providerPolicy: { ...widget.providerPolicy, chainIds: [999] }, + } as never, + ]), + ).toThrow("unsupported chains") + expect(() => + createWidgetRegistry([ + { + ...widget, + providerPolicy: { + ...widget.providerPolicy, + requiredMethods: ["wallet_getSeed"], + }, + } as never, + ]), + ).toThrow("unsupported methods") + }) + + it("keeps the six reviewed core actions ahead of widget actions", () => { + expect(coreDashboardActions.map(({ id }) => id)).toEqual([ + "gooddollar", + "send", + "receive", + "swap", + "predictions", + "walletconnect", + ]) + }) +}) diff --git a/src/widgets/registry.ts b/src/widgets/registry.ts new file mode 100644 index 0000000..a5e3730 --- /dev/null +++ b/src/widgets/registry.ts @@ -0,0 +1,193 @@ +import type { ReactNode } from "react" +import type { IconName } from "ui" + +import type { ReactWidgetLoader, WebComponentWidgetLoader } from "./hostTypes" +import { + WIDGET_EVM_CHAIN_IDS, + WIDGET_PROVIDER_METHODS, +} from "./provider/policy" + +export type WidgetIntegrationMode = "web-component" | "react" + +/** + * Custom Elements are the normal plugin boundary; React is an explicit, + * reviewed exception for packages which cannot expose a Custom Element. + */ +export const DEFAULT_WIDGET_INTEGRATION_MODE: WidgetIntegrationMode = + "web-component" + +export type DashboardIcon = + | { kind: "system"; name: IconName } + | { kind: "local"; render: () => ReactNode } + +export type DashboardAction = { + id: string + routeSlug: string + label: string + icon: DashboardIcon + widgetId?: string +} + +/** + * A registry entry is reviewed source rather than remote widget metadata. + * This prevents a package or its manifest from enlarging wallet authority. + */ +export type RegisteredWidget = { + widgetId: `goodwidget.${string}` + packageName: `@goodwidget/${string}` + packageVersion: `${number}.${number}.${number}` + integrationMode?: WidgetIntegrationMode + entries: { + react: { exportName: string; load: ReactWidgetLoader } + webComponent: { + tagName: `${string}-${string}` + load: WebComponentWidgetLoader + } + } + routeSlug: string + displayName: string + description: string + icon: DashboardIcon + providerPolicy: { + chainIds: readonly number[] + requiredMethods: readonly string[] + } +} + +export const defineWidget = (widget: T): T => + widget + +export const resolveWidgetIntegrationMode = ( + widget: RegisteredWidget, +): WidgetIntegrationMode => + widget.integrationMode ?? DEFAULT_WIDGET_INTEGRATION_MODE + +const EXACT_PACKAGE_VERSION = /^\d+\.\d+\.\d+$/ +const ROUTE_SLUG = /^[a-z0-9]+(?:-[a-z0-9]+)*$/ + +/** + * Validates every security-sensitive registry field before it becomes routable. + */ +const validateWidget = (widget: RegisteredWidget): void => { + if (!EXACT_PACKAGE_VERSION.test(widget.packageVersion)) { + throw new Error( + `Widget ${widget.widgetId} must use an exact package version`, + ) + } + if (!ROUTE_SLUG.test(widget.routeSlug)) { + throw new Error(`Widget ${widget.widgetId} has an invalid route slug`) + } + const unsupportedChains = widget.providerPolicy.chainIds.filter( + (chainId) => !WIDGET_EVM_CHAIN_IDS.has(chainId), + ) + if (unsupportedChains.length > 0) { + throw new Error( + `Widget ${widget.widgetId} requests unsupported chains: ${unsupportedChains.join(", ")}`, + ) + } + if ( + new Set(widget.providerPolicy.chainIds).size !== + widget.providerPolicy.chainIds.length + ) { + throw new Error(`Widget ${widget.widgetId} repeats a provider chain`) + } + const unsupportedMethods = widget.providerPolicy.requiredMethods.filter( + (method) => !WIDGET_PROVIDER_METHODS.has(method), + ) + if (unsupportedMethods.length > 0) { + throw new Error( + `Widget ${widget.widgetId} requests unsupported methods: ${unsupportedMethods.join(", ")}`, + ) + } +} + +/** + * Creates both identity and route indexes, rejecting collisions at module load. + */ +export const createWidgetRegistry = ( + widgets: readonly RegisteredWidget[], +): ReadonlyMap => { + const registry = new Map() + const routes = new Set() + + for (const widget of widgets) { + validateWidget(widget) + if (registry.has(widget.widgetId)) { + throw new Error(`Duplicate widget ID: ${widget.widgetId}`) + } + if (routes.has(widget.routeSlug)) { + throw new Error(`Duplicate widget route: ${widget.routeSlug}`) + } + registry.set(widget.widgetId, widget) + routes.add(widget.routeSlug) + } + + return registry +} + +/** + * Add a released package only with literal import loaders and its exact version. + * No package is registered until a reviewed widget-specific follow-up exists. + */ +export const WIDGETS: readonly RegisteredWidget[] = [] +export const widgetRegistry = createWidgetRegistry(WIDGETS) + +export const getWidgetByRoute = ( + routeSlug: string, +): RegisteredWidget | undefined => + WIDGETS.find((widget) => widget.routeSlug === routeSlug) + +/** + * These six action IDs preserve the existing dashboard order and behavior. + */ +export const coreDashboardActions = [ + { + id: "gooddollar", + routeSlug: "gooddollar", + label: "GoodDollar", + icon: { kind: "system", name: "goodDollarLogo" }, + }, + { + id: "send", + routeSlug: "send", + label: "Send", + icon: { kind: "system", name: "ArrowUpAlt" }, + }, + { + id: "receive", + routeSlug: "receive", + label: "Receive", + icon: { kind: "system", name: "ArrowDownAlt" }, + }, + { + id: "swap", + routeSlug: "swap", + label: "Swap", + icon: { kind: "system", name: "Swap" }, + }, + { + id: "predictions", + routeSlug: "predictions", + label: "Predictions", + icon: { kind: "system", name: "Predictions" }, + }, + { + id: "walletconnect", + routeSlug: "walletconnect", + label: "WalletConnect", + icon: { kind: "system", name: "walletConnectLogo" }, + }, +] as const satisfies readonly DashboardAction[] + +/** + * Widgets join the existing responsive action list after the six core actions. + */ +export const widgetDashboardActions = WIDGETS.map( + (widget): DashboardAction => ({ + id: widget.widgetId, + widgetId: widget.widgetId, + routeSlug: widget.routeSlug, + label: widget.displayName, + icon: widget.icon, + }), +) diff --git a/src/widgets/resolveReactWidget.test.ts b/src/widgets/resolveReactWidget.test.ts new file mode 100644 index 0000000..a771531 --- /dev/null +++ b/src/widgets/resolveReactWidget.test.ts @@ -0,0 +1,25 @@ +import { describe, expect, it } from "vitest" + +import { resolveReactWidget } from "./resolveReactWidget" + +describe("React widget export resolution", () => { + it("returns the exact declared component export", () => { + const GoodReserveWidget = () => null + + expect(resolveReactWidget({ GoodReserveWidget }, "GoodReserveWidget")).toBe( + GoodReserveWidget, + ) + }) + + it("rejects a missing or non-component export", () => { + expect(() => resolveReactWidget({}, "MissingWidget")).toThrow( + "does not export React component MissingWidget", + ) + expect(() => + resolveReactWidget( + { GoodReserveWidget: "not-a-component" }, + "GoodReserveWidget", + ), + ).toThrow("does not export React component GoodReserveWidget") + }) +}) diff --git a/src/widgets/resolveReactWidget.ts b/src/widgets/resolveReactWidget.ts new file mode 100644 index 0000000..c9d2788 --- /dev/null +++ b/src/widgets/resolveReactWidget.ts @@ -0,0 +1,17 @@ +import type { HostedReactWidget } from "./hostTypes" + +/** + * Resolves the reviewed export name and makes stale registry exports explicit. + */ +export const resolveReactWidget = ( + module: Record, + exportName: string, +): HostedReactWidget => { + const exportedComponent = module[exportName] + if (typeof exportedComponent !== "function") { + throw new Error( + `Widget module does not export React component ${exportName}`, + ) + } + return exportedComponent as HostedReactWidget +} diff --git a/tests-playwright/wallet-flows.e2e.ts b/tests-playwright/wallet-flows.e2e.ts index 1838649..aa12482 100644 --- a/tests-playwright/wallet-flows.e2e.ts +++ b/tests-playwright/wallet-flows.e2e.ts @@ -76,6 +76,12 @@ test("captures the authenticated home balance and responsive action grid", async await expect(page.getByText("$124.68")).toBeVisible() const walletActions = page.getByTestId("wallet-actions") await expect(walletActions).toBeVisible() + // The registry-backed dashboard keeps all six core actions in their order. + await expect(walletActions.getByRole("link")).toHaveCount(6) + await expect(walletActions.getByRole("link").first()).toHaveAttribute( + "href", + "/en/gooddollar", + ) if (testInfo.project.name === "mobile") { const actionsToggle = page.getByTestId("wallet-actions-toggle") From fb8e572a2ad811390be2c4f91415b4c874115db8 Mon Sep 17 00:00:00 2001 From: blueogin Date: Thu, 30 Jul 2026 10:17:26 -0400 Subject: [PATCH 03/11] feat: enhance widget registration and validation - Added validation for reserved widget routes and empty chain IDs in the widget registry. - Implemented duplicate Custom Element tag checks during widget registration. - Updated the AuthenticatedWidgetRoute and WidgetRenderer components to include widgetId as a key for better rendering. - Enhanced the RestrictedEip1193Provider to support transaction preparation and improved error handling for signing requests. - Introduced tests for new validation rules and widget registration logic. --- src/widgets/AuthenticatedWidgetRoute.tsx | 1 + src/widgets/WidgetRenderer.tsx | 2 + src/widgets/hosts/ReactWidgetHost.tsx | 2 + .../hosts/WebComponentWidgetHost.test.ts | 37 ++++ src/widgets/hosts/WebComponentWidgetHost.tsx | 63 +++++- .../RestrictedEip1193Provider.test.ts | 170 +++++++++++++- .../provider/RestrictedEip1193Provider.ts | 207 +++++++++++++++--- src/widgets/provider/WidgetProvider.tsx | 48 +++- src/widgets/registry.test.ts | 24 ++ src/widgets/registry.ts | 26 +++ src/widgets/resolveReactWidget.test.ts | 16 ++ src/widgets/resolveReactWidget.ts | 10 +- 12 files changed, 557 insertions(+), 49 deletions(-) create mode 100644 src/widgets/hosts/WebComponentWidgetHost.test.ts diff --git a/src/widgets/AuthenticatedWidgetRoute.tsx b/src/widgets/AuthenticatedWidgetRoute.tsx index b993ca8..3e202a1 100644 --- a/src/widgets/AuthenticatedWidgetRoute.tsx +++ b/src/widgets/AuthenticatedWidgetRoute.tsx @@ -42,6 +42,7 @@ export const AuthenticatedWidgetRoute = ({ return ( diff --git a/src/widgets/WidgetRenderer.tsx b/src/widgets/WidgetRenderer.tsx index 6922033..a90e558 100644 --- a/src/widgets/WidgetRenderer.tsx +++ b/src/widgets/WidgetRenderer.tsx @@ -17,6 +17,7 @@ export const WidgetRenderer = ({ if (resolveWidgetIntegrationMode(widget) === "react") { return ( { let isMounted = true + setComponent(null) + setLoadError(null) load() .then((module) => { diff --git a/src/widgets/hosts/WebComponentWidgetHost.test.ts b/src/widgets/hosts/WebComponentWidgetHost.test.ts new file mode 100644 index 0000000..3c27612 --- /dev/null +++ b/src/widgets/hosts/WebComponentWidgetHost.test.ts @@ -0,0 +1,37 @@ +import { afterEach, describe, expect, it, vi } from "vitest" + +import { registerElement } from "./WebComponentWidgetHost" + +describe("Custom Element registration", () => { + afterEach(() => { + vi.restoreAllMocks() + vi.unstubAllGlobals() + }) + + it("registers a tag once and rejects a different loader for the same tag", async () => { + const define = vi.fn() + const get = vi.fn(() => undefined) + vi.stubGlobal("customElements", { define, get }) + + const firstLoad = vi.fn(async () => ({ + register: async (tagName?: string) => { + get.mockReturnValue(class {} as CustomElementConstructor) + return tagName ?? "gw-widget" + }, + })) + const secondLoad = vi.fn(async () => ({ + register: async (tagName?: string) => tagName ?? "gw-widget", + })) + + await expect(registerElement(firstLoad, "gw-widget")).resolves.toBe( + "gw-widget", + ) + await expect(registerElement(firstLoad, "gw-widget")).resolves.toBe( + "gw-widget", + ) + expect(firstLoad).toHaveBeenCalledTimes(1) + await expect(registerElement(secondLoad, "gw-widget")).rejects.toThrow( + "already registered", + ) + }) +}) diff --git a/src/widgets/hosts/WebComponentWidgetHost.tsx b/src/widgets/hosts/WebComponentWidgetHost.tsx index 7917046..bb68a1b 100644 --- a/src/widgets/hosts/WebComponentWidgetHost.tsx +++ b/src/widgets/hosts/WebComponentWidgetHost.tsx @@ -14,6 +14,55 @@ import type { WidgetHostProps, } from "../hostTypes" +type TagRegistration = { + load: WebComponentWidgetLoader + promise: Promise +} + +const registrationCache = new Map() + +export const registerElement = ( + load: WebComponentWidgetLoader, + tagName: string, +): Promise => { + const existingDefinition = customElements.get(tagName) + const cached = registrationCache.get(tagName) + if (cached) { + if (cached.load !== load) { + return Promise.reject( + new Error(`Custom Element tag ${tagName} is already registered`), + ) + } + return cached.promise + } + if (existingDefinition) { + return Promise.reject( + new Error(`Custom Element tag ${tagName} is already registered`), + ) + } + + const promise = load() + .then(async (module) => { + const registered = await module.register(tagName) + if (registered !== tagName) { + throw new Error( + `Widget registered ${registered}; expected declared tag ${tagName}`, + ) + } + if (!customElements.get(tagName)) { + throw new Error(`Widget did not register Custom Element ${tagName}`) + } + return registered + }) + .catch((error: unknown) => { + registrationCache.delete(tagName) + throw error + }) + + registrationCache.set(tagName, { load, promise }) + return promise +} + /** * Registers and mounts a widget Custom Element exclusively on the client. */ @@ -35,17 +84,12 @@ export const WebComponentWidgetHost = ({ useEffect(() => { let isMounted = true + setRegisteredTagName(null) + setLoadError(null) - // Element classes may depend on HTMLElement at module evaluation time. - load() - .then(async (module) => { - const registered = await module.register(tagName) + registerElement(load, tagName) + .then((registered) => { if (!isMounted) return - if (registered !== tagName) { - throw new Error( - `Widget registered ${registered}; expected declared tag ${tagName}`, - ) - } setRegisteredTagName(registered) }) .catch((error: unknown) => { @@ -66,7 +110,6 @@ export const WebComponentWidgetHost = ({ const element = elementRef.current if (!element || !registeredTagName) return - // Object assignment preserves provider identity and prevents HTML leakage. assignHostedWidgetProperties(element, { provider, themeOverrides, diff --git a/src/widgets/provider/RestrictedEip1193Provider.test.ts b/src/widgets/provider/RestrictedEip1193Provider.test.ts index 892de54..f0208ec 100644 --- a/src/widgets/provider/RestrictedEip1193Provider.test.ts +++ b/src/widgets/provider/RestrictedEip1193Provider.test.ts @@ -1,4 +1,7 @@ -import { describe, expect, it, vi } from "vitest" +import type { TransactionRequest } from "ethers" +import { beforeEach, describe, expect, it, vi } from "vitest" + +import type { EVMSigner } from "@/login" vi.mock("@/chain/provider/EVM/viemClients", () => ({ getViemClient: vi.fn(), @@ -34,21 +37,39 @@ const createProvider = ( ) => { const rpcRequest = vi.fn(async () => "0xresult") const requestWalletApproval = vi.fn(async () => true) + const prepareTransaction = vi.fn( + async ( + _chainId: number, + _signer: EVMSigner, + request: TransactionRequest, + ) => ({ + ...request, + nonce: 7, + gasLimit: request.gasLimit ?? BigInt(21000), + gasPrice: BigInt(1), + }), + ) return { provider: new RestrictedEip1193Provider({ signer, chainIds: [1, 42220], rpcRequest, requestWalletApproval, + prepareTransaction, ...options, requiredMethods: options.requiredMethods ?? allTestMethods, }), rpcRequest, requestWalletApproval, + prepareTransaction, } } describe("RestrictedEip1193Provider", () => { + beforeEach(() => { + vi.clearAllMocks() + }) + it("exposes only the active account and forwards reviewed reads", async () => { const { provider, rpcRequest } = createProvider() await expect(provider.request({ method: "eth_accounts" })).resolves.toEqual( @@ -106,16 +127,30 @@ describe("RestrictedEip1193Provider", () => { }) it("requires account and chain validation plus Wallet approval for transactions", async () => { - const { provider, requestWalletApproval, rpcRequest } = createProvider() + const { provider, requestWalletApproval, prepareTransaction, rpcRequest } = + createProvider() await expect( provider.request({ method: "eth_sendTransaction", - params: [{ from: address, chainId: 1, to: address, value: BigInt(1) }], + params: [ + { + from: address, + chainId: 1, + to: address, + value: BigInt(1), + gas: "0x5208", + }, + ], }), ).resolves.toBe("0xresult") expect(requestWalletApproval).toHaveBeenCalledWith( expect.objectContaining({ method: "eth_sendTransaction", chainId: 1 }), ) + expect(prepareTransaction).toHaveBeenCalledWith( + 1, + signer, + expect.objectContaining({ gasLimit: BigInt(21000) }), + ) expect(signer.signTransaction).toHaveBeenCalled() expect(rpcRequest).toHaveBeenCalledWith(1, { method: "eth_sendRawTransaction", @@ -156,4 +191,133 @@ describe("RestrictedEip1193Provider", () => { ).rejects.toMatchObject({ code: 4100 }) expect(requestWalletApproval).not.toHaveBeenCalled() }) + + it("signs the transaction snapshot that was presented for approval", async () => { + let resolveApproval: ((approved: boolean) => void) | undefined + const requestWalletApproval = vi.fn( + () => + new Promise((resolve) => { + resolveApproval = resolve + }), + ) + const { provider, prepareTransaction } = createProvider({ + requestWalletApproval, + }) + const originalRecipient = "0x2222222222222222222222222222222222222222" + const changedRecipient = "0x3333333333333333333333333333333333333333" + const transaction = { + from: address, + chainId: 1, + to: originalRecipient, + value: BigInt(1), + } + const pending = provider.request({ + method: "eth_sendTransaction", + params: [transaction], + }) + await vi.waitFor(() => expect(requestWalletApproval).toHaveBeenCalled()) + transaction.to = changedRecipient + resolveApproval?.(true) + await expect(pending).resolves.toBe("0xresult") + expect(prepareTransaction).toHaveBeenCalledWith( + 1, + signer, + expect.objectContaining({ to: originalRecipient }), + ) + expect(signer.signTransaction).toHaveBeenCalledWith( + expect.objectContaining({ to: originalRecipient }), + ) + }) + + it("rejects approval when the account or chain changes", async () => { + let resolveApproval: ((approved: boolean) => void) | undefined + const requestWalletApproval = vi.fn( + () => + new Promise((resolve) => { + resolveApproval = resolve + }), + ) + const { provider } = createProvider({ requestWalletApproval }) + const pending = provider.request({ + method: "personal_sign", + params: ["message", address], + }) + await vi.waitFor(() => expect(requestWalletApproval).toHaveBeenCalled()) + provider.updateAccount({ + ...signer, + address: "0x2222222222222222222222222222222222222222", + }) + resolveApproval?.(true) + await expect(pending).rejects.toMatchObject({ code: 4100 }) + expect(signer.signMessage).not.toHaveBeenCalled() + }) + + it("revokes retained providers and pending approvals", async () => { + let resolveApproval: ((approved: boolean) => void) | undefined + const requestWalletApproval = vi.fn( + () => + new Promise((resolve) => { + resolveApproval = resolve + }), + ) + const { provider } = createProvider({ requestWalletApproval }) + const listener = vi.fn() + provider.on("accountsChanged", listener) + const pending = provider.request({ + method: "personal_sign", + params: ["message", address], + }) + await vi.waitFor(() => expect(requestWalletApproval).toHaveBeenCalled()) + provider.dispose() + resolveApproval?.(true) + await expect(pending).rejects.toMatchObject({ code: 4100 }) + await expect( + provider.request({ method: "eth_accounts" }), + ).rejects.toMatchObject({ code: 4100 }) + expect(listener).toHaveBeenCalledWith([]) + expect(signer.signMessage).not.toHaveBeenCalled() + }) + + it("rejects conflicting gas fields and same-address signer replacement", async () => { + const { provider } = createProvider() + await expect( + provider.request({ + method: "eth_sendTransaction", + params: [ + { + from: address, + chainId: 1, + to: address, + gas: "0x5208", + gasLimit: "0x5209", + }, + ], + }), + ).rejects.toMatchObject({ code: 4200 }) + + let resolveApproval: ((approved: boolean) => void) | undefined + const requestWalletApproval = vi.fn( + () => + new Promise((resolve) => { + resolveApproval = resolve + }), + ) + const { provider: signingProvider } = createProvider({ + requestWalletApproval, + }) + const pending = signingProvider.request({ + method: "personal_sign", + params: ["message", address], + }) + await vi.waitFor(() => expect(requestWalletApproval).toHaveBeenCalled()) + signingProvider.updateAccount({ + address, + signMessage: vi.fn(async () => "0xother"), + signTypedData: vi.fn(async () => "0xtyped"), + signTransaction: vi.fn(async () => "0xraw"), + }) + resolveApproval?.(true) + await expect(pending).rejects.toMatchObject({ code: 4100 }) + expect(signer.signMessage).not.toHaveBeenCalled() + }) }) diff --git a/src/widgets/provider/RestrictedEip1193Provider.ts b/src/widgets/provider/RestrictedEip1193Provider.ts index 2e294e8..b939cd7 100644 --- a/src/widgets/provider/RestrictedEip1193Provider.ts +++ b/src/widgets/provider/RestrictedEip1193Provider.ts @@ -4,9 +4,12 @@ import type { TypedDataField, } from "ethers" import { getBytes } from "ethers" +import { copyRequest } from "ethers/providers" import { getViemClient } from "@/chain/provider/EVM/viemClients" +import { getEthersProvider } from "@/ethers-utils" import type { EVMSigner } from "@/login" +import { WalletWrapper } from "@/sections/WalletConnect/utils/WalletWrapper" import { WIDGET_EVM_CHAIN_IDS, @@ -47,6 +50,11 @@ export type RestrictedProviderOptions = { * default leaves every signing method disabled until that UI is supplied. */ requestWalletApproval?: (request: WalletApprovalRequest) => Promise + prepareTransaction?: ( + chainId: number, + signer: EVMSigner, + request: TransactionRequest, + ) => Promise rpcRequest?: (chainId: number, request: ProviderRequest) => Promise } @@ -63,6 +71,16 @@ const asChainId = (value: unknown): number => { const addressesMatch = (left: unknown, right: string): boolean => typeof left === "string" && left.toLowerCase() === right.toLowerCase() +const approvalTransaction = ( + request: TransactionRequest, +): Record => + Object.fromEntries( + Object.entries(request).map(([key, value]) => [ + key, + typeof value === "bigint" ? `0x${value.toString(16)}` : value, + ]), + ) + const normalizeError = (error: unknown): WidgetProviderError => { if (error instanceof WidgetProviderError) return error const message = @@ -86,8 +104,13 @@ export class RestrictedEip1193Provider { readonly #requestWalletApproval: NonNullable< RestrictedProviderOptions["requestWalletApproval"] > + readonly #prepareTransaction: NonNullable< + RestrictedProviderOptions["prepareTransaction"] + > readonly #rpcRequest: NonNullable + #approvalPending = false #chainId: number + #revoked = false #signer: EVMSigner constructor(options: RestrictedProviderOptions) { @@ -124,6 +147,15 @@ export class RestrictedEip1193Provider { // Signing is disabled unless a Wallet-owned confirmation surface opts in. this.#requestWalletApproval = options.requestWalletApproval ?? (async () => false) + this.#prepareTransaction = + options.prepareTransaction ?? + (async (chainId, signer, request) => { + const connectedSigner = new WalletWrapper( + signer, + getEthersProvider(chainId), + ) + return await connectedSigner.populateTransaction(request) + }) this.#rpcRequest = options.rpcRequest ?? (async (chainId, request) => { @@ -142,6 +174,10 @@ export class RestrictedEip1193Provider { return [...this.#allowedMethods] } + get isRevoked(): boolean { + return this.#revoked + } + on( event: "accountsChanged" | "chainChanged", listener: (...args: unknown[]) => void, @@ -164,12 +200,21 @@ export class RestrictedEip1193Provider { * Session updates retain the facade while notifying a widget of account loss. */ updateAccount(signer: EVMSigner): void { + this.#assertActive() const accountChanged = !addressesMatch(signer.address, this.#signer.address) this.#signer = signer if (accountChanged) this.#emit("accountsChanged", [signer.address]) } + dispose(): void { + if (this.#revoked) return + this.#revoked = true + this.#emit("accountsChanged", []) + this.#listeners.clear() + } + async request(request: ProviderRequest): Promise { + this.#assertActive() if (!WIDGET_PROVIDER_METHODS.has(request.method)) { throw new WidgetProviderError( 4200, @@ -201,7 +246,9 @@ export class RestrictedEip1193Provider { return await this.#sendTransaction(params) default: if (WIDGET_READ_METHODS.has(request.method)) { - return await this.#rpcRequest(this.#chainId, request) + const result = await this.#rpcRequest(this.#chainId, request) + this.#assertActive() + return result } throw new WidgetProviderError(4200, "Unsupported widget request") } @@ -214,30 +261,79 @@ export class RestrictedEip1193Provider { for (const listener of this.#listeners.get(event) ?? []) listener(value) } - #assertAccount(account: unknown): void { + #assertActive(): void { + if (this.#revoked) { + throw new WidgetProviderError(4100, "The widget provider was revoked") + } + } + + #captureSigningContext(account: unknown): { + signer: EVMSigner + account: string + chainId: number + } { + this.#assertActive() if (!addressesMatch(account, this.#signer.address)) { throw new WidgetProviderError( 4100, "The signing account does not match the active GoodWallet session", ) } + return { + signer: this.#signer, + account: this.#signer.address, + chainId: this.#chainId, + } + } + + #assertSigningContext(context: { + signer: EVMSigner + account: string + chainId: number + }): void { + this.#assertActive() + if ( + this.#signer !== context.signer || + !addressesMatch(this.#signer.address, context.account) || + this.#chainId !== context.chainId + ) { + throw new WidgetProviderError( + 4100, + "The active wallet account or chain changed during approval", + ) + } } async #requestSigningApproval( method: string, params: readonly unknown[], + context: { + signer: EVMSigner + account: string + chainId: number + }, ): Promise { - const approved = await this.#requestWalletApproval({ - method, - params, - account: this.#signer.address, - chainId: this.#chainId, - }) - if (!approved) { - throw new WidgetProviderError( - 4001, - "GoodWallet did not approve the signing request", - ) + if (this.#approvalPending) { + throw new WidgetProviderError(4200, "Another widget approval is pending") + } + this.#assertSigningContext(context) + this.#approvalPending = true + try { + const approved = await this.#requestWalletApproval({ + method, + params, + account: context.account, + chainId: context.chainId, + }) + this.#assertSigningContext(context) + if (!approved) { + throw new WidgetProviderError( + 4001, + "GoodWallet did not approve the signing request", + ) + } + } finally { + this.#approvalPending = false } } @@ -250,7 +346,7 @@ export class RestrictedEip1193Provider { const chainId = asChainId(rawChainId) if (!this.#allowedChainIds.has(chainId)) { throw new WidgetProviderError( - 4901, + 4100, `Chain ${chainId} is not allowed for this widget`, ) } @@ -263,19 +359,21 @@ export class RestrictedEip1193Provider { async #signMessage(params: readonly unknown[]): Promise { const [message, account] = params - this.#assertAccount(account) if (typeof message !== "string") { throw new WidgetProviderError(4200, "personal_sign requires a message") } - await this.#requestSigningApproval("personal_sign", params) - return await this.#signer.signMessage( + const context = this.#captureSigningContext(account) + const approvalParams = [message, context.account] as const + await this.#requestSigningApproval("personal_sign", approvalParams, context) + const signature = await context.signer.signMessage( /^0x[0-9a-f]*$/i.test(message) ? getBytes(message) : message, ) + this.#assertSigningContext(context) + return signature } async #signTypedData(params: readonly unknown[]): Promise { const [account, rawData] = params - this.#assertAccount(account) if (typeof rawData !== "string") { throw new WidgetProviderError( 4200, @@ -290,45 +388,94 @@ export class RestrictedEip1193Provider { if (!data.domain || !data.types || !data.message) { throw new WidgetProviderError(4200, "Invalid EIP-712 typed data") } + const context = this.#captureSigningContext(account) const { EIP712Domain: _domainType, ...types } = data.types if ( data.domain.chainId !== undefined && - Number(data.domain.chainId) !== this.#chainId + Number(data.domain.chainId) !== context.chainId ) { throw new WidgetProviderError( 4100, "Typed-data chain does not match the active widget chain", ) } - await this.#requestSigningApproval("eth_signTypedData_v4", params) - return await this.#signer.signTypedData(data.domain, types, data.message) + const approvalParams = [context.account, rawData] as const + await this.#requestSigningApproval( + "eth_signTypedData_v4", + approvalParams, + context, + ) + const signature = await context.signer.signTypedData( + data.domain, + types, + data.message, + ) + this.#assertSigningContext(context) + return signature } async #sendTransaction(params: readonly unknown[]): Promise { const transaction = params[0] - if (!transaction || typeof transaction !== "object") { + if ( + !transaction || + typeof transaction !== "object" || + Array.isArray(transaction) + ) { throw new WidgetProviderError(4200, "A transaction object is required") } - const request = transaction as TransactionRequest & { + const rawRequest = transaction as TransactionRequest & { from?: string + gas?: string | number | bigint chainId?: string | number } - this.#assertAccount(request.from) + const context = this.#captureSigningContext(rawRequest.from) if ( - request.chainId !== undefined && - Number(request.chainId) !== this.#chainId + rawRequest.chainId !== undefined && + Number(rawRequest.chainId) !== context.chainId ) { throw new WidgetProviderError( 4100, "Transaction chain does not match the active widget chain", ) } - await this.#requestSigningApproval("eth_sendTransaction", params) - const { from: _from, ...signableRequest } = request - const rawTransaction = await this.#signer.signTransaction(signableRequest) - return await this.#rpcRequest(this.#chainId, { + if ( + rawRequest.gas !== undefined && + rawRequest.gasLimit !== undefined && + BigInt(rawRequest.gas) !== BigInt(rawRequest.gasLimit) + ) { + throw new WidgetProviderError( + 4200, + "Transaction gas and gasLimit must match", + ) + } + const copiedRequest = copyRequest({ + ...rawRequest, + chainId: context.chainId, + gasLimit: rawRequest.gasLimit ?? rawRequest.gas, + }) + const { from: _from, ...unsignedRequest } = copiedRequest + const populatedRequest = copyRequest( + await this.#prepareTransaction( + context.chainId, + context.signer, + unsignedRequest, + ), + ) + this.#assertSigningContext(context) + const approvalParams = [approvalTransaction(populatedRequest)] as const + await this.#requestSigningApproval( + "eth_sendTransaction", + approvalParams, + context, + ) + const rawTransaction = + await context.signer.signTransaction(populatedRequest) + this.#assertSigningContext(context) + const result = await this.#rpcRequest(context.chainId, { method: "eth_sendRawTransaction", params: [rawTransaction], }) + this.#assertSigningContext(context) + return result } } diff --git a/src/widgets/provider/WidgetProvider.tsx b/src/widgets/provider/WidgetProvider.tsx index f807577..6c9c0e7 100644 --- a/src/widgets/provider/WidgetProvider.tsx +++ b/src/widgets/provider/WidgetProvider.tsx @@ -6,16 +6,44 @@ import { useContext, useEffect, useMemo, + useRef, } from "react" import { useSessionContext } from "@/login/hooks/context" +import { openWalletConnectDialog } from "@/sections/WalletConnect/store/walletConnectDialogStore" -import { RestrictedEip1193Provider } from "./RestrictedEip1193Provider" +import { + RestrictedEip1193Provider, + type WalletApprovalRequest, +} from "./RestrictedEip1193Provider" const WidgetProviderContext = createContext( null, ) +const requestWalletApproval = async ( + request: WalletApprovalRequest, +): Promise => { + const status = await openWalletConnectDialog({ + type: "generic", + title: "Approve widget request", + bodyText: JSON.stringify( + { + method: request.method, + account: request.account, + chainId: request.chainId, + params: request.params, + }, + (_key, value: unknown) => + typeof value === "bigint" ? `0x${value.toString(16)}` : value, + 2, + ), + acceptBtnText: "Approve", + rejectBtnText: "Reject", + }) + return status === "accepted" +} + /** * This is the sole bridge from an authenticated session into widget code. */ @@ -30,6 +58,7 @@ export const WidgetProvider = ({ }) => { const { signer } = useSessionContext() const evmSigner = signer?.EVM + const liveProviderRef = useRef(null) const provider = useMemo( () => evmSigner @@ -37,16 +66,27 @@ export const WidgetProvider = ({ signer: evmSigner, chainIds, requiredMethods, + requestWalletApproval, }) : null, [evmSigner, chainIds, requiredMethods], ) useEffect(() => { - if (provider && evmSigner) provider.updateAccount(evmSigner) - }, [evmSigner, provider]) + liveProviderRef.current = provider + return () => { + const disposedProvider = provider + if (liveProviderRef.current === disposedProvider) { + liveProviderRef.current = null + } + queueMicrotask(() => { + if (liveProviderRef.current === disposedProvider) return + disposedProvider?.dispose() + }) + } + }, [provider]) - if (!provider) return null + if (!provider || !evmSigner) return null return ( {children} diff --git a/src/widgets/registry.test.ts b/src/widgets/registry.test.ts index e2b2da5..ac74e12 100644 --- a/src/widgets/registry.test.ts +++ b/src/widgets/registry.test.ts @@ -82,6 +82,30 @@ describe("widget registry", () => { ).toThrow("unsupported methods") }) + it("rejects reserved routes, empty chains, and duplicate Custom Element tags", () => { + expect(() => + createWidgetRegistry([{ ...widget, routeSlug: "send" }]), + ).toThrow("reserved route") + expect(() => + createWidgetRegistry([ + { + ...widget, + providerPolicy: { ...widget.providerPolicy, chainIds: [] }, + }, + ]), + ).toThrow("at least one chain") + expect(() => + createWidgetRegistry([ + widget, + { + ...widget, + widgetId: "goodwidget.other", + routeSlug: "other", + }, + ]), + ).toThrow("Duplicate widget Custom Element tag") + }) + it("keeps the six reviewed core actions ahead of widget actions", () => { expect(coreDashboardActions.map(({ id }) => id)).toEqual([ "gooddollar", diff --git a/src/widgets/registry.ts b/src/widgets/registry.ts index a5e3730..664e9f3 100644 --- a/src/widgets/registry.ts +++ b/src/widgets/registry.ts @@ -64,6 +64,17 @@ export const resolveWidgetIntegrationMode = ( const EXACT_PACKAGE_VERSION = /^\d+\.\d+\.\d+$/ const ROUTE_SLUG = /^[a-z0-9]+(?:-[a-z0-9]+)*$/ +const RESERVED_WIDGET_ROUTES = new Set([ + "gooddollar", + "send", + "receive", + "swap", + "predictions", + "walletconnect", + "options", + "promo", + "qr", +]) /** * Validates every security-sensitive registry field before it becomes routable. @@ -77,6 +88,14 @@ const validateWidget = (widget: RegisteredWidget): void => { if (!ROUTE_SLUG.test(widget.routeSlug)) { throw new Error(`Widget ${widget.widgetId} has an invalid route slug`) } + if (RESERVED_WIDGET_ROUTES.has(widget.routeSlug)) { + throw new Error( + `Widget ${widget.widgetId} uses a reserved route: ${widget.routeSlug}`, + ) + } + if (widget.providerPolicy.chainIds.length === 0) { + throw new Error(`Widget ${widget.widgetId} requires at least one chain`) + } const unsupportedChains = widget.providerPolicy.chainIds.filter( (chainId) => !WIDGET_EVM_CHAIN_IDS.has(chainId), ) @@ -109,6 +128,7 @@ export const createWidgetRegistry = ( ): ReadonlyMap => { const registry = new Map() const routes = new Set() + const tags = new Set() for (const widget of widgets) { validateWidget(widget) @@ -118,8 +138,14 @@ export const createWidgetRegistry = ( if (routes.has(widget.routeSlug)) { throw new Error(`Duplicate widget route: ${widget.routeSlug}`) } + if (tags.has(widget.entries.webComponent.tagName)) { + throw new Error( + `Duplicate widget Custom Element tag: ${widget.entries.webComponent.tagName}`, + ) + } registry.set(widget.widgetId, widget) routes.add(widget.routeSlug) + tags.add(widget.entries.webComponent.tagName) } return registry diff --git a/src/widgets/resolveReactWidget.test.ts b/src/widgets/resolveReactWidget.test.ts index a771531..6269c25 100644 --- a/src/widgets/resolveReactWidget.test.ts +++ b/src/widgets/resolveReactWidget.test.ts @@ -11,6 +11,22 @@ describe("React widget export resolution", () => { ) }) + it("accepts memoized and forwarded React component objects", () => { + const MemoWidget = { + $$typeof: Symbol.for("react.memo"), + type: () => null, + } + const ForwardWidget = { + $$typeof: Symbol.for("react.forward_ref"), + render: () => null, + } + + expect(resolveReactWidget({ MemoWidget }, "MemoWidget")).toBe(MemoWidget) + expect(resolveReactWidget({ ForwardWidget }, "ForwardWidget")).toBe( + ForwardWidget, + ) + }) + it("rejects a missing or non-component export", () => { expect(() => resolveReactWidget({}, "MissingWidget")).toThrow( "does not export React component MissingWidget", diff --git a/src/widgets/resolveReactWidget.ts b/src/widgets/resolveReactWidget.ts index c9d2788..836d8fb 100644 --- a/src/widgets/resolveReactWidget.ts +++ b/src/widgets/resolveReactWidget.ts @@ -1,5 +1,11 @@ import type { HostedReactWidget } from "./hostTypes" +const isReactComponent = (value: unknown): value is HostedReactWidget => { + if (typeof value === "function") return true + if (!value || typeof value !== "object") return false + return typeof (value as { $$typeof?: unknown }).$$typeof === "symbol" +} + /** * Resolves the reviewed export name and makes stale registry exports explicit. */ @@ -8,10 +14,10 @@ export const resolveReactWidget = ( exportName: string, ): HostedReactWidget => { const exportedComponent = module[exportName] - if (typeof exportedComponent !== "function") { + if (!isReactComponent(exportedComponent)) { throw new Error( `Widget module does not export React component ${exportName}`, ) } - return exportedComponent as HostedReactWidget + return exportedComponent } From 2ce2810581bc4ce9cf73dd9dd3115845f1688121 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 30 Jul 2026 14:24:21 +0000 Subject: [PATCH 04/11] Serialize wallet approval dialogs --- .../store/walletConnectDialogStore.test.ts | 27 +++++++++++++ .../store/walletConnectDialogStore.ts | 40 ++++++++++++++----- 2 files changed, 57 insertions(+), 10 deletions(-) create mode 100644 src/sections/WalletConnect/store/walletConnectDialogStore.test.ts diff --git a/src/sections/WalletConnect/store/walletConnectDialogStore.test.ts b/src/sections/WalletConnect/store/walletConnectDialogStore.test.ts new file mode 100644 index 0000000..dffa203 --- /dev/null +++ b/src/sections/WalletConnect/store/walletConnectDialogStore.test.ts @@ -0,0 +1,27 @@ +import { + openWalletConnectDialog, + walletConnectDialogStore, +} from "./walletConnectDialogStore" + +const dialog = (title: string) => ({ + type: "generic" as const, + title, + bodyText: title, + acceptBtnText: "Approve", +}) + +describe("openWalletConnectDialog", () => { + it("keeps concurrent approvals bound to their own dialogs", async () => { + const first = openWalletConnectDialog(dialog("First")) + const second = openWalletConnectDialog(dialog("Second")) + + expect(walletConnectDialogStore.dialog.title).toBe("First") + + walletConnectDialogStore.status = "accepted" + await expect(first).resolves.toBe("accepted") + expect(walletConnectDialogStore.dialog.title).toBe("Second") + + walletConnectDialogStore.status = "rejected" + await expect(second).resolves.toBe("rejected") + }) +}) diff --git a/src/sections/WalletConnect/store/walletConnectDialogStore.ts b/src/sections/WalletConnect/store/walletConnectDialogStore.ts index ef6c220..7914973 100644 --- a/src/sections/WalletConnect/store/walletConnectDialogStore.ts +++ b/src/sections/WalletConnect/store/walletConnectDialogStore.ts @@ -44,22 +44,42 @@ export const walletConnectDialogStore = proxy<{ exiting: boolean }>() -export const openWalletConnectDialog = async (args: WalletConnectDialog) => { - walletConnectDialogStore.dialog = args +type QueuedDialog = { + args: WalletConnectDialog + resolve: (status: WalletConnectDialogStatus) => void +} + +const dialogQueue: QueuedDialog[] = [] +let dialogOpen = false + +const openNextDialog = (): void => { + if (dialogOpen) return + const queuedDialog = dialogQueue.shift() + if (!queuedDialog) return + + dialogOpen = true + walletConnectDialogStore.dialog = queuedDialog.args walletConnectDialogStore.status = "pending" walletConnectDialogStore.exiting = false - await new Promise((resolve) => { - subscribe(walletConnectDialogStore, () => { - if (walletConnectDialogStore.status !== "pending") { - resolve(null) - } - }) + const unsubscribe = subscribe(walletConnectDialogStore, () => { + if (walletConnectDialogStore.status === "pending") return + const status = walletConnectDialogStore.status + unsubscribe() + dialogOpen = false + queuedDialog.resolve(status) + openNextDialog() }) - - return walletConnectDialogStore.status as WalletConnectDialogStatus } +export const openWalletConnectDialog = ( + args: WalletConnectDialog, +): Promise => + new Promise((resolve) => { + dialogQueue.push({ args, resolve }) + openNextDialog() + }) + export const updateWalletConnectDialogStatus = async ( status: WalletConnectDialogStatus, ) => { From 88f19bf747caae2cf9aa8bf07878f3f84e837572 Mon Sep 17 00:00:00 2001 From: blueogin Date: Thu, 30 Jul 2026 10:50:26 -0400 Subject: [PATCH 05/11] refactor: clean up comments and improve widget registration structure - Removed outdated comments from various files to enhance code clarity. - Updated the widget registration logic to streamline the integration of React and web component entries. - Adjusted tests to reflect changes in widget registration and validation processes. --- .../(bottomsheet)/[widgetRoute]/page.tsx | 4 -- .../Form/RoundButton/RoundButton.tsx | 2 - .../Home/components/WalletSection.tsx | 2 - .../store/walletConnectDialogStore.test.ts | 6 +- src/widgets/AuthenticatedWidgetRoute.tsx | 7 --- src/widgets/WidgetRenderer.tsx | 17 ++---- src/widgets/hostProperties.ts | 6 -- src/widgets/hostTypes.ts | 16 ------ src/widgets/hosts/ReactWidgetHost.tsx | 5 -- .../hosts/WebComponentWidgetHost.test.ts | 4 +- src/widgets/hosts/WebComponentWidgetHost.tsx | 3 - .../RestrictedEip1193Provider.test.ts | 50 +---------------- .../provider/RestrictedEip1193Provider.ts | 22 +------- src/widgets/provider/WidgetProvider.tsx | 3 - src/widgets/provider/policy.ts | 4 -- src/widgets/registry.test.ts | 27 +++++---- src/widgets/registry.ts | 55 +++++++------------ src/widgets/resolveReactWidget.ts | 3 - tests-playwright/wallet-flows.e2e.ts | 1 - 19 files changed, 49 insertions(+), 188 deletions(-) diff --git a/src/app/[locale]/@home/(home)/(bottomsheet)/[widgetRoute]/page.tsx b/src/app/[locale]/@home/(home)/(bottomsheet)/[widgetRoute]/page.tsx index dfe5a0b..2e68b36 100644 --- a/src/app/[locale]/@home/(home)/(bottomsheet)/[widgetRoute]/page.tsx +++ b/src/app/[locale]/@home/(home)/(bottomsheet)/[widgetRoute]/page.tsx @@ -3,10 +3,6 @@ import { notFound } from "next/navigation" import { AuthenticatedWidgetRoute } from "@/widgets/AuthenticatedWidgetRoute" import { getWidgetByRoute } from "@/widgets/registry" -/** - * Static core routes take precedence; this fallback can mount only a reviewed - * registry route and treats every other unknown bottom-sheet URL as not found. - */ export default async function WidgetRoutePage({ params, }: { diff --git a/src/components/Form/RoundButton/RoundButton.tsx b/src/components/Form/RoundButton/RoundButton.tsx index cc0ab6d..afdaecd 100644 --- a/src/components/Form/RoundButton/RoundButton.tsx +++ b/src/components/Form/RoundButton/RoundButton.tsx @@ -7,9 +7,7 @@ import { Icon, type IconName } from "ui" export type RoundButtonProps = { onClick?: () => void buttonType?: RoundButtonType - /** Registry actions may use a system icon without adding a legacy button type. */ icon?: IconName - /** Registry actions may use a reviewed local asset without serializing it. */ iconElement?: ReactNode text?: string fill?: boolean diff --git a/src/sections/Home/components/WalletSection.tsx b/src/sections/Home/components/WalletSection.tsx index f89b509..d3eb5fd 100644 --- a/src/sections/Home/components/WalletSection.tsx +++ b/src/sections/Home/components/WalletSection.tsx @@ -196,8 +196,6 @@ export default function WalletSection({ predictions: homeTranslations.predictions, walletconnect: homeTranslations.walletConnect, } - // Widgets append to the existing grid, allowing the current responsive - // collapse control to keep owning the More behavior and core ordering. const dashboardActions = [...coreDashboardActions, ...widgetDashboardActions] return ( diff --git a/src/sections/WalletConnect/store/walletConnectDialogStore.test.ts b/src/sections/WalletConnect/store/walletConnectDialogStore.test.ts index dffa203..b12e190 100644 --- a/src/sections/WalletConnect/store/walletConnectDialogStore.test.ts +++ b/src/sections/WalletConnect/store/walletConnectDialogStore.test.ts @@ -1,3 +1,5 @@ +import { describe, expect, it } from "vitest" + import { openWalletConnectDialog, walletConnectDialogStore, @@ -15,11 +17,11 @@ describe("openWalletConnectDialog", () => { const first = openWalletConnectDialog(dialog("First")) const second = openWalletConnectDialog(dialog("Second")) - expect(walletConnectDialogStore.dialog.title).toBe("First") + expect(walletConnectDialogStore.dialog).toMatchObject({ title: "First" }) walletConnectDialogStore.status = "accepted" await expect(first).resolves.toBe("accepted") - expect(walletConnectDialogStore.dialog.title).toBe("Second") + expect(walletConnectDialogStore.dialog).toMatchObject({ title: "Second" }) walletConnectDialogStore.status = "rejected" await expect(second).resolves.toBe("rejected") diff --git a/src/widgets/AuthenticatedWidgetRoute.tsx b/src/widgets/AuthenticatedWidgetRoute.tsx index 3e202a1..583d32e 100644 --- a/src/widgets/AuthenticatedWidgetRoute.tsx +++ b/src/widgets/AuthenticatedWidgetRoute.tsx @@ -11,9 +11,6 @@ import { useWidgetProvider, WidgetProvider } from "./provider/WidgetProvider" import { type RegisteredWidget, widgetRegistry } from "./registry" import { WidgetRenderer } from "./WidgetRenderer" -/** - * Requires an authenticated wallet session before any widget package is loaded. - */ export const AuthenticatedWidgetRoute = ({ widgetId, themeOverrides, @@ -42,7 +39,6 @@ export const AuthenticatedWidgetRoute = ({ return ( @@ -55,9 +51,6 @@ export const AuthenticatedWidgetRoute = ({ ) } -/** - * The provider capability enters the renderer only after authentication. - */ const MountedWidget = ({ widget, themeOverrides, diff --git a/src/widgets/WidgetRenderer.tsx b/src/widgets/WidgetRenderer.tsx index a90e558..c1c61a4 100644 --- a/src/widgets/WidgetRenderer.tsx +++ b/src/widgets/WidgetRenderer.tsx @@ -3,23 +3,19 @@ import { ReactWidgetHost } from "./hosts/ReactWidgetHost" import { WebComponentWidgetHost } from "./hosts/WebComponentWidgetHost" import type { WidgetHostProps } from "./hostTypes" -import { type RegisteredWidget, resolveWidgetIntegrationMode } from "./registry" +import type { RegisteredWidget } from "./registry" -/** - * This is the sole integration-mode decision point for every widget route. - */ export const WidgetRenderer = ({ widget, ...hostProps }: WidgetHostProps & { widget: RegisteredWidget }) => { - if (resolveWidgetIntegrationMode(widget) === "react") { + if (widget.integrationMode === "react") { return ( ) @@ -27,9 +23,8 @@ export const WidgetRenderer = ({ return ( ) diff --git a/src/widgets/hostProperties.ts b/src/widgets/hostProperties.ts index bf8214b..c8542a5 100644 --- a/src/widgets/hostProperties.ts +++ b/src/widgets/hostProperties.ts @@ -1,8 +1,5 @@ import type { HostedWidgetElement, WidgetHostProps } from "./hostTypes" -/** - * Hands the non-serializable wallet capability to the mounted Custom Element. - */ export const assignHostedWidgetProperties = ( element: HostedWidgetElement, { provider, themeOverrides, config }: WidgetHostProps, @@ -12,9 +9,6 @@ export const assignHostedWidgetProperties = ( element.config = config } -/** - * Removes wallet-owned references before a detached element can retain them. - */ export const clearHostedWidgetProperties = ( element: HostedWidgetElement, ): void => { diff --git a/src/widgets/hostTypes.ts b/src/widgets/hostTypes.ts index b0bd7ba..0c162e3 100644 --- a/src/widgets/hostTypes.ts +++ b/src/widgets/hostTypes.ts @@ -2,36 +2,20 @@ import type { ComponentType } from "react" import type { RestrictedEip1193Provider } from "./provider/RestrictedEip1193Provider" -/** - * This is the complete wallet-to-widget contract for both host implementations. - * Widgets do not receive a signer, seed, RPC client, or wallet session object. - */ export type WidgetHostProps = { provider: RestrictedEip1193Provider themeOverrides?: Record config?: Record } -/** - * Registry loaders deliberately return an untyped module because independently - * released widgets are normalized by the host before they are rendered. - */ export type ReactWidgetLoader = () => Promise> export type HostedReactWidget = ComponentType -/** - * The element module must register its declared tag only after the host mounts - * in the browser, avoiding Custom Element evaluation during server rendering. - */ export type WebComponentWidgetLoader = () => Promise<{ register: (tagName?: string) => string | Promise }> -/** - * Widget values are object properties, rather than HTML attributes, so the - * restricted provider never appears in serialized markup. - */ export type HostedWidgetElement = HTMLElement & { provider: RestrictedEip1193Provider | null themeOverrides?: Record diff --git a/src/widgets/hosts/ReactWidgetHost.tsx b/src/widgets/hosts/ReactWidgetHost.tsx index 6ba2646..a57829b 100644 --- a/src/widgets/hosts/ReactWidgetHost.tsx +++ b/src/widgets/hosts/ReactWidgetHost.tsx @@ -11,10 +11,6 @@ import type { } from "../hostTypes" import { resolveReactWidget } from "../resolveReactWidget" -/** - * Loads a reviewed React entry only after this bottom-sheet route reaches the - * browser and passes it the same limited contract as Custom Elements receive. - */ export const ReactWidgetHost = ({ load, exportName, @@ -35,7 +31,6 @@ export const ReactWidgetHost = ({ .then((module) => { if (!isMounted) return const exportedComponent = resolveReactWidget(module, exportName) - // Functions are React state updaters, so keep the component wrapped. setComponent(() => exportedComponent) }) .catch((error: unknown) => { diff --git a/src/widgets/hosts/WebComponentWidgetHost.test.ts b/src/widgets/hosts/WebComponentWidgetHost.test.ts index 3c27612..f382bf5 100644 --- a/src/widgets/hosts/WebComponentWidgetHost.test.ts +++ b/src/widgets/hosts/WebComponentWidgetHost.test.ts @@ -10,7 +10,9 @@ describe("Custom Element registration", () => { it("registers a tag once and rejects a different loader for the same tag", async () => { const define = vi.fn() - const get = vi.fn(() => undefined) + const get = vi.fn<() => CustomElementConstructor | undefined>( + () => undefined, + ) vi.stubGlobal("customElements", { define, get }) const firstLoad = vi.fn(async () => ({ diff --git a/src/widgets/hosts/WebComponentWidgetHost.tsx b/src/widgets/hosts/WebComponentWidgetHost.tsx index bb68a1b..4074de5 100644 --- a/src/widgets/hosts/WebComponentWidgetHost.tsx +++ b/src/widgets/hosts/WebComponentWidgetHost.tsx @@ -63,9 +63,6 @@ export const registerElement = ( return promise } -/** - * Registers and mounts a widget Custom Element exclusively on the client. - */ export const WebComponentWidgetHost = ({ load, tagName, diff --git a/src/widgets/provider/RestrictedEip1193Provider.test.ts b/src/widgets/provider/RestrictedEip1193Provider.test.ts index f0208ec..d35a138 100644 --- a/src/widgets/provider/RestrictedEip1193Provider.test.ts +++ b/src/widgets/provider/RestrictedEip1193Provider.test.ts @@ -229,29 +229,6 @@ describe("RestrictedEip1193Provider", () => { ) }) - it("rejects approval when the account or chain changes", async () => { - let resolveApproval: ((approved: boolean) => void) | undefined - const requestWalletApproval = vi.fn( - () => - new Promise((resolve) => { - resolveApproval = resolve - }), - ) - const { provider } = createProvider({ requestWalletApproval }) - const pending = provider.request({ - method: "personal_sign", - params: ["message", address], - }) - await vi.waitFor(() => expect(requestWalletApproval).toHaveBeenCalled()) - provider.updateAccount({ - ...signer, - address: "0x2222222222222222222222222222222222222222", - }) - resolveApproval?.(true) - await expect(pending).rejects.toMatchObject({ code: 4100 }) - expect(signer.signMessage).not.toHaveBeenCalled() - }) - it("revokes retained providers and pending approvals", async () => { let resolveApproval: ((approved: boolean) => void) | undefined const requestWalletApproval = vi.fn( @@ -278,7 +255,7 @@ describe("RestrictedEip1193Provider", () => { expect(signer.signMessage).not.toHaveBeenCalled() }) - it("rejects conflicting gas fields and same-address signer replacement", async () => { + it("rejects conflicting gas fields", async () => { const { provider } = createProvider() await expect( provider.request({ @@ -294,30 +271,5 @@ describe("RestrictedEip1193Provider", () => { ], }), ).rejects.toMatchObject({ code: 4200 }) - - let resolveApproval: ((approved: boolean) => void) | undefined - const requestWalletApproval = vi.fn( - () => - new Promise((resolve) => { - resolveApproval = resolve - }), - ) - const { provider: signingProvider } = createProvider({ - requestWalletApproval, - }) - const pending = signingProvider.request({ - method: "personal_sign", - params: ["message", address], - }) - await vi.waitFor(() => expect(requestWalletApproval).toHaveBeenCalled()) - signingProvider.updateAccount({ - address, - signMessage: vi.fn(async () => "0xother"), - signTypedData: vi.fn(async () => "0xtyped"), - signTransaction: vi.fn(async () => "0xraw"), - }) - resolveApproval?.(true) - await expect(pending).rejects.toMatchObject({ code: 4100 }) - expect(signer.signMessage).not.toHaveBeenCalled() }) }) diff --git a/src/widgets/provider/RestrictedEip1193Provider.ts b/src/widgets/provider/RestrictedEip1193Provider.ts index b939cd7..058085b 100644 --- a/src/widgets/provider/RestrictedEip1193Provider.ts +++ b/src/widgets/provider/RestrictedEip1193Provider.ts @@ -45,10 +45,6 @@ export type RestrictedProviderOptions = { chainIds: readonly number[] requiredMethods: readonly string[] initialChainId?: number - /** - * This callback belongs to GoodWallet UI, never to the widget. Its secure - * default leaves every signing method disabled until that UI is supplied. - */ requestWalletApproval?: (request: WalletApprovalRequest) => Promise prepareTransaction?: ( chainId: number, @@ -89,11 +85,6 @@ const normalizeError = (error: unknown): WidgetProviderError => { return new WidgetProviderError(rejected ? 4001 : 4200, message, error) } -/** - * A capability-limited EIP-1193 facade over GoodWallet's active EVM session. - * The real signer and session are private fields and cannot be retrieved by a - * widget through this interface. - */ export class RestrictedEip1193Provider { readonly #allowedChainIds: ReadonlySet readonly #allowedMethods: ReadonlySet @@ -144,7 +135,6 @@ export class RestrictedEip1193Provider { } this.#signer = options.signer - // Signing is disabled unless a Wallet-owned confirmation surface opts in. this.#requestWalletApproval = options.requestWalletApproval ?? (async () => false) this.#prepareTransaction = @@ -196,16 +186,6 @@ export class RestrictedEip1193Provider { return this } - /** - * Session updates retain the facade while notifying a widget of account loss. - */ - updateAccount(signer: EVMSigner): void { - this.#assertActive() - const accountChanged = !addressesMatch(signer.address, this.#signer.address) - this.#signer = signer - if (accountChanged) this.#emit("accountsChanged", [signer.address]) - } - dispose(): void { if (this.#revoked) return this.#revoked = true @@ -440,7 +420,7 @@ export class RestrictedEip1193Provider { } if ( rawRequest.gas !== undefined && - rawRequest.gasLimit !== undefined && + rawRequest.gasLimit != null && BigInt(rawRequest.gas) !== BigInt(rawRequest.gasLimit) ) { throw new WidgetProviderError( diff --git a/src/widgets/provider/WidgetProvider.tsx b/src/widgets/provider/WidgetProvider.tsx index 6c9c0e7..4ca5462 100644 --- a/src/widgets/provider/WidgetProvider.tsx +++ b/src/widgets/provider/WidgetProvider.tsx @@ -44,9 +44,6 @@ const requestWalletApproval = async ( return status === "accepted" } -/** - * This is the sole bridge from an authenticated session into widget code. - */ export const WidgetProvider = ({ chainIds, requiredMethods, diff --git a/src/widgets/provider/policy.ts b/src/widgets/provider/policy.ts index 3074ae5..546e6c3 100644 --- a/src/widgets/provider/policy.ts +++ b/src/widgets/provider/policy.ts @@ -11,10 +11,6 @@ import { XDC_CHAIN_ID, } from "@/chain/chain-ids" -/** - * This central allowlist is the outer security boundary for every in-process - * widget. Registry entries can narrow it, but cannot broaden it. - */ export const WIDGET_READ_METHODS = new Set([ "eth_blockNumber", "eth_call", diff --git a/src/widgets/registry.test.ts b/src/widgets/registry.test.ts index ac74e12..9cc5127 100644 --- a/src/widgets/registry.test.ts +++ b/src/widgets/registry.test.ts @@ -12,15 +12,9 @@ const widget = defineWidget({ widgetId: "goodwidget.goodreserve", packageName: "@goodwidget/goodreserve-widget", packageVersion: "1.0.0", - entries: { - react: { - exportName: "GoodReserveWidget", - load: async () => ({ GoodReserveWidget: () => null }), - }, - webComponent: { - tagName: "gw-goodreserve-widget", - load: async () => ({ register: (tagName) => tagName ?? "unused" }), - }, + entry: { + tagName: "gw-goodreserve-widget", + load: async () => ({ register: (tagName) => tagName ?? "unused" }), }, routeSlug: "goodreserve", displayName: "GoodReserve", @@ -32,6 +26,17 @@ const widget = defineWidget({ }, }) +const reactWidget = defineWidget({ + ...widget, + widgetId: "goodwidget.react", + routeSlug: "react", + integrationMode: "react", + entry: { + exportName: "GoodReserveWidget", + load: async () => ({ GoodReserveWidget: () => null }), + }, +}) + describe("widget registry", () => { it("indexes typed widgets by immutable ID", () => { expect(createWidgetRegistry([widget]).get(widget.widgetId)).toBe(widget) @@ -40,9 +45,7 @@ describe("widget registry", () => { it("defaults to Web Components and permits a reviewed React override", () => { expect(DEFAULT_WIDGET_INTEGRATION_MODE).toBe("web-component") expect(resolveWidgetIntegrationMode(widget)).toBe("web-component") - expect( - resolveWidgetIntegrationMode({ ...widget, integrationMode: "react" }), - ).toBe("react") + expect(resolveWidgetIntegrationMode(reactWidget)).toBe("react") }) it("rejects duplicate IDs and routes", () => { diff --git a/src/widgets/registry.ts b/src/widgets/registry.ts index 664e9f3..28ef92d 100644 --- a/src/widgets/registry.ts +++ b/src/widgets/registry.ts @@ -9,10 +9,6 @@ import { export type WidgetIntegrationMode = "web-component" | "react" -/** - * Custom Elements are the normal plugin boundary; React is an explicit, - * reviewed exception for packages which cannot expose a Custom Element. - */ export const DEFAULT_WIDGET_INTEGRATION_MODE: WidgetIntegrationMode = "web-component" @@ -28,22 +24,10 @@ export type DashboardAction = { widgetId?: string } -/** - * A registry entry is reviewed source rather than remote widget metadata. - * This prevents a package or its manifest from enlarging wallet authority. - */ -export type RegisteredWidget = { +type RegisteredWidgetBase = { widgetId: `goodwidget.${string}` packageName: `@goodwidget/${string}` packageVersion: `${number}.${number}.${number}` - integrationMode?: WidgetIntegrationMode - entries: { - react: { exportName: string; load: ReactWidgetLoader } - webComponent: { - tagName: `${string}-${string}` - load: WebComponentWidgetLoader - } - } routeSlug: string displayName: string description: string @@ -54,6 +38,21 @@ export type RegisteredWidget = { } } +export type RegisteredWidget = RegisteredWidgetBase & + ( + | { + integrationMode?: "web-component" + entry: { + tagName: `${string}-${string}` + load: WebComponentWidgetLoader + } + } + | { + integrationMode: "react" + entry: { exportName: string; load: ReactWidgetLoader } + } + ) + export const defineWidget = (widget: T): T => widget @@ -76,9 +75,6 @@ const RESERVED_WIDGET_ROUTES = new Set([ "qr", ]) -/** - * Validates every security-sensitive registry field before it becomes routable. - */ const validateWidget = (widget: RegisteredWidget): void => { if (!EXACT_PACKAGE_VERSION.test(widget.packageVersion)) { throw new Error( @@ -120,9 +116,6 @@ const validateWidget = (widget: RegisteredWidget): void => { } } -/** - * Creates both identity and route indexes, rejecting collisions at module load. - */ export const createWidgetRegistry = ( widgets: readonly RegisteredWidget[], ): ReadonlyMap => { @@ -138,23 +131,19 @@ export const createWidgetRegistry = ( if (routes.has(widget.routeSlug)) { throw new Error(`Duplicate widget route: ${widget.routeSlug}`) } - if (tags.has(widget.entries.webComponent.tagName)) { + if (widget.integrationMode !== "react" && tags.has(widget.entry.tagName)) { throw new Error( - `Duplicate widget Custom Element tag: ${widget.entries.webComponent.tagName}`, + `Duplicate widget Custom Element tag: ${widget.entry.tagName}`, ) } registry.set(widget.widgetId, widget) routes.add(widget.routeSlug) - tags.add(widget.entries.webComponent.tagName) + if (widget.integrationMode !== "react") tags.add(widget.entry.tagName) } return registry } -/** - * Add a released package only with literal import loaders and its exact version. - * No package is registered until a reviewed widget-specific follow-up exists. - */ export const WIDGETS: readonly RegisteredWidget[] = [] export const widgetRegistry = createWidgetRegistry(WIDGETS) @@ -163,9 +152,6 @@ export const getWidgetByRoute = ( ): RegisteredWidget | undefined => WIDGETS.find((widget) => widget.routeSlug === routeSlug) -/** - * These six action IDs preserve the existing dashboard order and behavior. - */ export const coreDashboardActions = [ { id: "gooddollar", @@ -205,9 +191,6 @@ export const coreDashboardActions = [ }, ] as const satisfies readonly DashboardAction[] -/** - * Widgets join the existing responsive action list after the six core actions. - */ export const widgetDashboardActions = WIDGETS.map( (widget): DashboardAction => ({ id: widget.widgetId, diff --git a/src/widgets/resolveReactWidget.ts b/src/widgets/resolveReactWidget.ts index 836d8fb..4c1c66b 100644 --- a/src/widgets/resolveReactWidget.ts +++ b/src/widgets/resolveReactWidget.ts @@ -6,9 +6,6 @@ const isReactComponent = (value: unknown): value is HostedReactWidget => { return typeof (value as { $$typeof?: unknown }).$$typeof === "symbol" } -/** - * Resolves the reviewed export name and makes stale registry exports explicit. - */ export const resolveReactWidget = ( module: Record, exportName: string, diff --git a/tests-playwright/wallet-flows.e2e.ts b/tests-playwright/wallet-flows.e2e.ts index aa12482..fed5675 100644 --- a/tests-playwright/wallet-flows.e2e.ts +++ b/tests-playwright/wallet-flows.e2e.ts @@ -76,7 +76,6 @@ test("captures the authenticated home balance and responsive action grid", async await expect(page.getByText("$124.68")).toBeVisible() const walletActions = page.getByTestId("wallet-actions") await expect(walletActions).toBeVisible() - // The registry-backed dashboard keeps all six core actions in their order. await expect(walletActions.getByRole("link")).toHaveCount(6) await expect(walletActions.getByRole("link").first()).toHaveAttribute( "href", From a96cfbffcb29ade83e7f1228c9acf2d6e2a9bfca Mon Sep 17 00:00:00 2001 From: blueogin Date: Thu, 30 Jul 2026 11:01:09 -0400 Subject: [PATCH 06/11] feat: implement session storage tests and refactor session management - Added unit tests for session storage functionality to ensure proper handling of legacy sessions and private-key sessions. - Refactored session management logic to clear persisted sessions and improve state handling. - Updated session context to include masterSeed for better session management in the UI. --- .../context/SessionContext/storage.test.ts | 48 ++++++++++++++++ src/login/context/SessionContext/storage.ts | 56 ++----------------- src/login/hooks/context.ts | 1 + src/sections/Options/OptionsView.tsx | 12 +--- 4 files changed, 58 insertions(+), 59 deletions(-) create mode 100644 src/login/context/SessionContext/storage.test.ts diff --git a/src/login/context/SessionContext/storage.test.ts b/src/login/context/SessionContext/storage.test.ts new file mode 100644 index 0000000..7584823 --- /dev/null +++ b/src/login/context/SessionContext/storage.test.ts @@ -0,0 +1,48 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from "vitest" + +import type { ISigner, ISignerSession } from "@/login/types" + +const localStorageMock = () => ({ + getItem: vi.fn(), + setItem: vi.fn(), + removeItem: vi.fn(), +}) + +describe("session storage", () => { + beforeEach(() => { + vi.resetModules() + }) + + afterEach(() => { + vi.unstubAllGlobals() + }) + + it("purges a legacy persisted signer session on startup", async () => { + const storage = localStorageMock() + vi.stubGlobal("localStorage", storage) + + await import("./storage") + + expect(storage.removeItem).toHaveBeenCalledWith("SIGNER_SESSION") + expect(storage.getItem).not.toHaveBeenCalled() + }) + + it("keeps private-key sessions in memory only", async () => { + const storage = localStorageMock() + vi.stubGlobal("localStorage", storage) + const { sessionState, setSession } = await import("./storage") + const session: ISignerSession = { + type: "PRIVATE_KEY", + sessionOrigin: "test", + signer: {} as ISigner, + masterSeed: "secret", + } + + setSession(session) + + expect(sessionState.session).toBe(session) + expect(storage.setItem).not.toHaveBeenCalled() + expect(storage.removeItem).toHaveBeenCalledWith("SIGNER_SESSION") + expect(sessionState.isLoading).toBe(false) + }) +}) diff --git a/src/login/context/SessionContext/storage.ts b/src/login/context/SessionContext/storage.ts index 2bd202d..9fed69a 100644 --- a/src/login/context/SessionContext/storage.ts +++ b/src/login/context/SessionContext/storage.ts @@ -1,43 +1,13 @@ -import type { Jsonify } from "type-fest" import { proxy, ref } from "valtio" -import { getPrivateKeySession } from "@/login/adapters/privatekey" import type { Addresses, ISigner, ISignerSession } from "@/login/types" const SIGNER_SESSION_KEY = "SIGNER_SESSION" -export const getSessionFromLocalStorage = - async (): Promise => { - if (typeof localStorage === "undefined") { - return null - } - const session = localStorage.getItem(SIGNER_SESSION_KEY) - if (!session) { - return null - } - const sessionJSON = JSON.parse(session) as Jsonify - return await fromJSON(sessionJSON) - } - -const fromJSON = async ( - sessionJSON: Partial>, -): Promise => { - switch (sessionJSON.type) { - case "PRIVATE_KEY": { - const { userName, profileImage, authProvider, masterSeed } = sessionJSON - if (!masterSeed) { - return null - } - return await getPrivateKeySession( - masterSeed, - "localStorage", - authProvider ?? "NA", - userName, - profileImage, - ) - } +const clearPersistedSession = () => { + if (typeof localStorage !== "undefined") { + localStorage.removeItem(SIGNER_SESSION_KEY) } - return null } type SessionState = { @@ -64,15 +34,7 @@ export const setSession = (session: ISignerSession | null) => { sessionState.addresses = undefined } - if (sessionState.session) { - localStorage.setItem( - SIGNER_SESSION_KEY, - JSON.stringify(sessionState.session), - ) - } else { - localStorage.removeItem(SIGNER_SESSION_KEY) - } - + clearPersistedSession() sessionState.isLoading = false } @@ -80,11 +42,5 @@ export const logout = () => { setSession(null) } -if (typeof window !== "undefined") { - getSessionFromLocalStorage() - .then(setSession) - .catch((e) => { - console.error("error getting persisted session", e) - setSession(null) - }) -} +clearPersistedSession() +sessionState.isLoading = false diff --git a/src/login/hooks/context.ts b/src/login/hooks/context.ts index db71aa9..51f16f1 100644 --- a/src/login/hooks/context.ts +++ b/src/login/hooks/context.ts @@ -10,6 +10,7 @@ import type { Addresses, ISignerSession } from "../types" export type ISessionContext = Partial & { addresses?: Addresses isLoading: boolean + masterSeed?: string logout?: () => void setSession(session: ISignerSession): void } diff --git a/src/sections/Options/OptionsView.tsx b/src/sections/Options/OptionsView.tsx index b7dac64..7539077 100644 --- a/src/sections/Options/OptionsView.tsx +++ b/src/sections/Options/OptionsView.tsx @@ -11,7 +11,6 @@ import { truncateString } from "@/components/Utils/format" import VersionTag from "@/components/VersionTag/VersionTag" import { type ISigner, useSessionContext } from "@/login" import { getPrivateKeyHex } from "@/login/adapters/privatekey" -import { getSessionFromLocalStorage } from "@/login/context/SessionContext/storage" import OptionsMenu from "./components/OptionsMenu" import styles from "./OptionsView.module.css" @@ -21,14 +20,12 @@ export default function OptionsView() { const { createToast } = useToast() const optionsTranslations = translations.options setBottomSheetProps({ title: optionsTranslations.title }) - const { signer, type } = useSessionContext() + const { signer, type, masterSeed } = useSessionContext() const { captureEvent } = useAnalytics() const [expanded, setExpanded] = useState(false) const [selectedChainType, setSelectedChainType] = useState() const handleCopyPrivateKey = async () => { - if (!selectedChainType) return - const session = await getSessionFromLocalStorage() - if (!session || session.type !== "PRIVATE_KEY") return + if (!selectedChainType || type !== "PRIVATE_KEY" || !masterSeed) return const status = await openDialog({ title: optionsTranslations.confirmation, @@ -38,10 +35,7 @@ export default function OptionsView() { }) if (status === "accepted") { - const privateKey = await getPrivateKeyHex( - selectedChainType, - session.masterSeed, - ) + const privateKey = await getPrivateKeyHex(selectedChainType, masterSeed) navigator.clipboard.writeText(privateKey) captureEvent({ type: AnalyticsEventTypes.PrivateKeyCopied }) setSelectedChainType(undefined) From 84649cdd9d6f74e7ffbf849cdb282f69483b456a Mon Sep 17 00:00:00 2001 From: blueogin Date: Thu, 30 Jul 2026 11:09:50 -0400 Subject: [PATCH 07/11] feat: enhance wallet connect dialog management and widget module validation - Introduced reset functionality for wallet connect dialogs to ensure proper state management during user interactions. - Updated widget registration logic to include metadata validation for package name and version, improving integration reliability. - Enhanced tests for wallet connect dialogs and widget registration to cover new validation scenarios and reset behavior. --- src/login/context/SessionContext/storage.ts | 2 + .../store/walletConnectDialogStore.test.ts | 41 +++++++++++- .../store/walletConnectDialogStore.ts | 57 ++++++++++++++--- src/widgets/WidgetRenderer.tsx | 4 ++ src/widgets/hostTypes.ts | 36 ++++++++++- src/widgets/hosts/ReactWidgetHost.tsx | 16 +++-- .../hosts/WebComponentWidgetHost.test.ts | 62 ++++++++++++++++--- src/widgets/hosts/WebComponentWidgetHost.tsx | 35 ++++++++--- .../RestrictedEip1193Provider.test.ts | 13 ++++ .../provider/RestrictedEip1193Provider.ts | 11 ++-- src/widgets/registry.test.ts | 16 ++++- src/widgets/resolveReactWidget.test.ts | 16 +++++ 12 files changed, 268 insertions(+), 41 deletions(-) diff --git a/src/login/context/SessionContext/storage.ts b/src/login/context/SessionContext/storage.ts index 9fed69a..7df4762 100644 --- a/src/login/context/SessionContext/storage.ts +++ b/src/login/context/SessionContext/storage.ts @@ -1,6 +1,7 @@ import { proxy, ref } from "valtio" import type { Addresses, ISigner, ISignerSession } from "@/login/types" +import { resetWalletConnectDialogs } from "@/sections/WalletConnect/store/walletConnectDialogStore" const SIGNER_SESSION_KEY = "SIGNER_SESSION" @@ -39,6 +40,7 @@ export const setSession = (session: ISignerSession | null) => { } export const logout = () => { + resetWalletConnectDialogs() setSession(null) } diff --git a/src/sections/WalletConnect/store/walletConnectDialogStore.test.ts b/src/sections/WalletConnect/store/walletConnectDialogStore.test.ts index b12e190..f59b28d 100644 --- a/src/sections/WalletConnect/store/walletConnectDialogStore.test.ts +++ b/src/sections/WalletConnect/store/walletConnectDialogStore.test.ts @@ -1,7 +1,9 @@ -import { describe, expect, it } from "vitest" +import { afterEach, describe, expect, it, vi } from "vitest" import { openWalletConnectDialog, + resetWalletConnectDialogs, + updateWalletConnectDialogStatus, walletConnectDialogStore, } from "./walletConnectDialogStore" @@ -13,6 +15,11 @@ const dialog = (title: string) => ({ }) describe("openWalletConnectDialog", () => { + afterEach(() => { + resetWalletConnectDialogs() + vi.useRealTimers() + }) + it("keeps concurrent approvals bound to their own dialogs", async () => { const first = openWalletConnectDialog(dialog("First")) const second = openWalletConnectDialog(dialog("Second")) @@ -26,4 +33,36 @@ describe("openWalletConnectDialog", () => { walletConnectDialogStore.status = "rejected" await expect(second).resolves.toBe("rejected") }) + + it("rejects active and queued dialogs when reset", async () => { + const first = openWalletConnectDialog(dialog("First")) + const second = openWalletConnectDialog(dialog("Second")) + + resetWalletConnectDialogs() + + await expect(first).resolves.toBe("rejected") + await expect(second).resolves.toBe("rejected") + + const next = openWalletConnectDialog(dialog("Next")) + expect(walletConnectDialogStore.dialog).toMatchObject({ title: "Next" }) + walletConnectDialogStore.status = "rejected" + await expect(next).resolves.toBe("rejected") + }) + + it("ignores a delayed update after reset", async () => { + vi.useFakeTimers() + const first = openWalletConnectDialog(dialog("First")) + const update = updateWalletConnectDialogStatus("accepted") + + resetWalletConnectDialogs() + await expect(first).resolves.toBe("rejected") + + const second = openWalletConnectDialog(dialog("Second")) + await vi.advanceTimersByTimeAsync(200) + await update + + expect(walletConnectDialogStore.status).toBe("pending") + resetWalletConnectDialogs() + await expect(second).resolves.toBe("rejected") + }) }) diff --git a/src/sections/WalletConnect/store/walletConnectDialogStore.ts b/src/sections/WalletConnect/store/walletConnectDialogStore.ts index 7914973..2fa7d3c 100644 --- a/src/sections/WalletConnect/store/walletConnectDialogStore.ts +++ b/src/sections/WalletConnect/store/walletConnectDialogStore.ts @@ -50,25 +50,33 @@ type QueuedDialog = { } const dialogQueue: QueuedDialog[] = [] -let dialogOpen = false +let activeDialog: QueuedDialog | undefined +let unsubscribeActive: (() => void) | undefined + +const settleActiveDialog = (status: WalletConnectDialogStatus): void => { + const settledDialog = activeDialog + if (!settledDialog) return + + unsubscribeActive?.() + unsubscribeActive = undefined + activeDialog = undefined + settledDialog.resolve(status) + openNextDialog() +} const openNextDialog = (): void => { - if (dialogOpen) return + if (activeDialog) return const queuedDialog = dialogQueue.shift() if (!queuedDialog) return - dialogOpen = true + activeDialog = queuedDialog walletConnectDialogStore.dialog = queuedDialog.args walletConnectDialogStore.status = "pending" walletConnectDialogStore.exiting = false - const unsubscribe = subscribe(walletConnectDialogStore, () => { + unsubscribeActive = subscribe(walletConnectDialogStore, () => { if (walletConnectDialogStore.status === "pending") return - const status = walletConnectDialogStore.status - unsubscribe() - dialogOpen = false - queuedDialog.resolve(status) - openNextDialog() + settleActiveDialog(walletConnectDialogStore.status) }) } @@ -80,10 +88,41 @@ export const openWalletConnectDialog = ( openNextDialog() }) +export const resetWalletConnectDialogs = (): void => { + const pendingDialogs = activeDialog + ? [activeDialog, ...dialogQueue.splice(0)] + : dialogQueue.splice(0) + + unsubscribeActive?.() + unsubscribeActive = undefined + activeDialog = undefined + walletConnectDialogStore.status = "rejected" + walletConnectDialogStore.exiting = false + + for (const pendingDialog of pendingDialogs) { + pendingDialog.resolve("rejected") + } +} + export const updateWalletConnectDialogStatus = async ( status: WalletConnectDialogStatus, ) => { + const dialog = activeDialog + if ( + !dialog || + walletConnectDialogStore.status !== "pending" || + walletConnectDialogStore.exiting + ) { + return + } + walletConnectDialogStore.exiting = true await new Promise((resolve) => setTimeout(resolve, 200)) + if ( + activeDialog !== dialog || + walletConnectDialogStore.status !== "pending" + ) { + return + } walletConnectDialogStore.status = status } diff --git a/src/widgets/WidgetRenderer.tsx b/src/widgets/WidgetRenderer.tsx index c1c61a4..0b084c9 100644 --- a/src/widgets/WidgetRenderer.tsx +++ b/src/widgets/WidgetRenderer.tsx @@ -16,6 +16,8 @@ export const WidgetRenderer = ({ ) @@ -25,6 +27,8 @@ export const WidgetRenderer = ({ ) diff --git a/src/widgets/hostTypes.ts b/src/widgets/hostTypes.ts index 0c162e3..496db4a 100644 --- a/src/widgets/hostTypes.ts +++ b/src/widgets/hostTypes.ts @@ -8,13 +8,43 @@ export type WidgetHostProps = { config?: Record } -export type ReactWidgetLoader = () => Promise> +export type WidgetModuleMetadata = { + packageName: string + packageVersion: string +} + +export type WidgetModule = { + goodWidgetMetadata: WidgetModuleMetadata +} + +export type ReactWidgetModule = Record & WidgetModule + +export type ReactWidgetLoader = () => Promise export type HostedReactWidget = ComponentType -export type WebComponentWidgetLoader = () => Promise<{ +export type WebComponentWidgetModule = WidgetModule & { register: (tagName?: string) => string | Promise -}> +} + +export type WebComponentWidgetLoader = () => Promise + +export const assertWidgetModuleMetadata = ( + module: WidgetModule, + packageName: string, + packageVersion: string, +): void => { + const metadata = module.goodWidgetMetadata + if ( + !metadata || + metadata.packageName !== packageName || + metadata.packageVersion !== packageVersion + ) { + throw new Error( + `Widget module identity mismatch: expected ${packageName}@${packageVersion}`, + ) + } +} export type HostedWidgetElement = HTMLElement & { provider: RestrictedEip1193Provider | null diff --git a/src/widgets/hosts/ReactWidgetHost.tsx b/src/widgets/hosts/ReactWidgetHost.tsx index a57829b..18fbe99 100644 --- a/src/widgets/hosts/ReactWidgetHost.tsx +++ b/src/widgets/hosts/ReactWidgetHost.tsx @@ -4,20 +4,25 @@ import { useEffect, useState } from "react" import { LoadingSpinner } from "@/components/Snippet/LoadingSpinner" -import type { - HostedReactWidget, - ReactWidgetLoader, - WidgetHostProps, +import { + assertWidgetModuleMetadata, + type HostedReactWidget, + type ReactWidgetLoader, + type WidgetHostProps, } from "../hostTypes" import { resolveReactWidget } from "../resolveReactWidget" export const ReactWidgetHost = ({ load, exportName, + packageName, + packageVersion, ...hostProps }: WidgetHostProps & { load: ReactWidgetLoader exportName: string + packageName: string + packageVersion: string }) => { const [Component, setComponent] = useState(null) const [loadError, setLoadError] = useState(null) @@ -30,6 +35,7 @@ export const ReactWidgetHost = ({ load() .then((module) => { if (!isMounted) return + assertWidgetModuleMetadata(module, packageName, packageVersion) const exportedComponent = resolveReactWidget(module, exportName) setComponent(() => exportedComponent) }) @@ -45,7 +51,7 @@ export const ReactWidgetHost = ({ return () => { isMounted = false } - }, [exportName, load]) + }, [exportName, load, packageName, packageVersion]) if (loadError) throw loadError if (!Component) return diff --git a/src/widgets/hosts/WebComponentWidgetHost.test.ts b/src/widgets/hosts/WebComponentWidgetHost.test.ts index f382bf5..744daa2 100644 --- a/src/widgets/hosts/WebComponentWidgetHost.test.ts +++ b/src/widgets/hosts/WebComponentWidgetHost.test.ts @@ -16,24 +16,68 @@ describe("Custom Element registration", () => { vi.stubGlobal("customElements", { define, get }) const firstLoad = vi.fn(async () => ({ + goodWidgetMetadata: { + packageName: "@goodwidget/test-widget", + packageVersion: "1.0.0", + }, register: async (tagName?: string) => { get.mockReturnValue(class {} as CustomElementConstructor) return tagName ?? "gw-widget" }, })) const secondLoad = vi.fn(async () => ({ + goodWidgetMetadata: { + packageName: "@goodwidget/test-widget", + packageVersion: "1.0.0", + }, register: async (tagName?: string) => tagName ?? "gw-widget", })) - await expect(registerElement(firstLoad, "gw-widget")).resolves.toBe( - "gw-widget", - ) - await expect(registerElement(firstLoad, "gw-widget")).resolves.toBe( - "gw-widget", - ) + await expect( + registerElement( + firstLoad, + "gw-widget", + "@goodwidget/test-widget", + "1.0.0", + ), + ).resolves.toBe("gw-widget") + await expect( + registerElement( + firstLoad, + "gw-widget", + "@goodwidget/test-widget", + "1.0.0", + ), + ).resolves.toBe("gw-widget") expect(firstLoad).toHaveBeenCalledTimes(1) - await expect(registerElement(secondLoad, "gw-widget")).rejects.toThrow( - "already registered", - ) + await expect( + registerElement( + secondLoad, + "gw-widget", + "@goodwidget/test-widget", + "1.0.0", + ), + ).rejects.toThrow("already registered") + }) + + it("rejects module metadata that does not match the registry", async () => { + const get = vi.fn(() => undefined) + vi.stubGlobal("customElements", { define: vi.fn(), get }) + const load = vi.fn(async () => ({ + goodWidgetMetadata: { + packageName: "@goodwidget/test-widget", + packageVersion: "2.0.0", + }, + register: async (tagName?: string) => tagName ?? "gw-versioned-widget", + })) + + await expect( + registerElement( + load, + "gw-versioned-widget", + "@goodwidget/test-widget", + "1.0.0", + ), + ).rejects.toThrow("expected @goodwidget/test-widget@1.0.0") }) }) diff --git a/src/widgets/hosts/WebComponentWidgetHost.tsx b/src/widgets/hosts/WebComponentWidgetHost.tsx index 4074de5..c675e7d 100644 --- a/src/widgets/hosts/WebComponentWidgetHost.tsx +++ b/src/widgets/hosts/WebComponentWidgetHost.tsx @@ -8,14 +8,17 @@ import { assignHostedWidgetProperties, clearHostedWidgetProperties, } from "../hostProperties" -import type { - HostedWidgetElement, - WebComponentWidgetLoader, - WidgetHostProps, +import { + assertWidgetModuleMetadata, + type HostedWidgetElement, + type WebComponentWidgetLoader, + type WidgetHostProps, } from "../hostTypes" type TagRegistration = { load: WebComponentWidgetLoader + packageName: string + packageVersion: string promise: Promise } @@ -24,11 +27,17 @@ const registrationCache = new Map() export const registerElement = ( load: WebComponentWidgetLoader, tagName: string, + packageName: string, + packageVersion: string, ): Promise => { const existingDefinition = customElements.get(tagName) const cached = registrationCache.get(tagName) if (cached) { - if (cached.load !== load) { + if ( + cached.load !== load || + cached.packageName !== packageName || + cached.packageVersion !== packageVersion + ) { return Promise.reject( new Error(`Custom Element tag ${tagName} is already registered`), ) @@ -43,6 +52,7 @@ export const registerElement = ( const promise = load() .then(async (module) => { + assertWidgetModuleMetadata(module, packageName, packageVersion) const registered = await module.register(tagName) if (registered !== tagName) { throw new Error( @@ -59,19 +69,28 @@ export const registerElement = ( throw error }) - registrationCache.set(tagName, { load, promise }) + registrationCache.set(tagName, { + load, + packageName, + packageVersion, + promise, + }) return promise } export const WebComponentWidgetHost = ({ load, tagName, + packageName, + packageVersion, provider, themeOverrides, config, }: WidgetHostProps & { load: WebComponentWidgetLoader tagName: string + packageName: string + packageVersion: string }) => { const elementRef = useRef(null) const [registeredTagName, setRegisteredTagName] = useState( @@ -84,7 +103,7 @@ export const WebComponentWidgetHost = ({ setRegisteredTagName(null) setLoadError(null) - registerElement(load, tagName) + registerElement(load, tagName, packageName, packageVersion) .then((registered) => { if (!isMounted) return setRegisteredTagName(registered) @@ -101,7 +120,7 @@ export const WebComponentWidgetHost = ({ return () => { isMounted = false } - }, [load, tagName]) + }, [load, packageName, packageVersion, tagName]) useEffect(() => { const element = elementRef.current diff --git a/src/widgets/provider/RestrictedEip1193Provider.test.ts b/src/widgets/provider/RestrictedEip1193Provider.test.ts index d35a138..83b60f0 100644 --- a/src/widgets/provider/RestrictedEip1193Provider.test.ts +++ b/src/widgets/provider/RestrictedEip1193Provider.test.ts @@ -189,6 +189,19 @@ describe("RestrictedEip1193Provider", () => { ], }), ).rejects.toMatchObject({ code: 4100 }) + await expect( + provider.request({ + method: "eth_signTypedData_v4", + params: [ + address, + JSON.stringify({ + domain: { name: "Widget" }, + types: { Thing: [{ name: "value", type: "uint256" }] }, + message: { value: 1 }, + }), + ], + }), + ).rejects.toMatchObject({ code: 4100 }) expect(requestWalletApproval).not.toHaveBeenCalled() }) diff --git a/src/widgets/provider/RestrictedEip1193Provider.ts b/src/widgets/provider/RestrictedEip1193Provider.ts index 058085b..3327d16 100644 --- a/src/widgets/provider/RestrictedEip1193Provider.ts +++ b/src/widgets/provider/RestrictedEip1193Provider.ts @@ -370,10 +370,13 @@ export class RestrictedEip1193Provider { } const context = this.#captureSigningContext(account) const { EIP712Domain: _domainType, ...types } = data.types - if ( - data.domain.chainId !== undefined && - Number(data.domain.chainId) !== context.chainId - ) { + if (data.domain.chainId === undefined) { + throw new WidgetProviderError( + 4100, + "Typed-data domain must declare the active widget chain", + ) + } + if (Number(data.domain.chainId) !== context.chainId) { throw new WidgetProviderError( 4100, "Typed-data chain does not match the active widget chain", diff --git a/src/widgets/registry.test.ts b/src/widgets/registry.test.ts index 9cc5127..b8c9ab7 100644 --- a/src/widgets/registry.test.ts +++ b/src/widgets/registry.test.ts @@ -14,7 +14,13 @@ const widget = defineWidget({ packageVersion: "1.0.0", entry: { tagName: "gw-goodreserve-widget", - load: async () => ({ register: (tagName) => tagName ?? "unused" }), + load: async () => ({ + goodWidgetMetadata: { + packageName: "@goodwidget/goodreserve-widget", + packageVersion: "1.0.0", + }, + register: (tagName) => tagName ?? "unused", + }), }, routeSlug: "goodreserve", displayName: "GoodReserve", @@ -33,7 +39,13 @@ const reactWidget = defineWidget({ integrationMode: "react", entry: { exportName: "GoodReserveWidget", - load: async () => ({ GoodReserveWidget: () => null }), + load: async () => ({ + goodWidgetMetadata: { + packageName: "@goodwidget/goodreserve-widget", + packageVersion: "1.0.0", + }, + GoodReserveWidget: () => null, + }), }, }) diff --git a/src/widgets/resolveReactWidget.test.ts b/src/widgets/resolveReactWidget.test.ts index 6269c25..48f456e 100644 --- a/src/widgets/resolveReactWidget.test.ts +++ b/src/widgets/resolveReactWidget.test.ts @@ -1,5 +1,6 @@ import { describe, expect, it } from "vitest" +import { assertWidgetModuleMetadata } from "./hostTypes" import { resolveReactWidget } from "./resolveReactWidget" describe("React widget export resolution", () => { @@ -38,4 +39,19 @@ describe("React widget export resolution", () => { ), ).toThrow("does not export React component GoodReserveWidget") }) + + it("rejects module metadata that does not match the registry", () => { + expect(() => + assertWidgetModuleMetadata( + { + goodWidgetMetadata: { + packageName: "@goodwidget/react-widget", + packageVersion: "2.0.0", + }, + }, + "@goodwidget/react-widget", + "1.0.0", + ), + ).toThrow("expected @goodwidget/react-widget@1.0.0") + }) }) From 1694e75e42399acbce7f6ebe3b0a9e37c9b951d6 Mon Sep 17 00:00:00 2001 From: blueogin Date: Thu, 30 Jul 2026 17:27:58 -0400 Subject: [PATCH 08/11] fix: update wallet flow tests and improve navigation handling - Modified the login test to check for wallet actions visibility using test ID instead of text. - Enhanced the claim verification test by clicking the GoodDollar link instead of directly navigating, ensuring better interaction simulation. - Updated screenshots for various onboarding flows to reflect recent UI changes. --- .../desktop/home-balances-overflow-en.png | Bin 49240 -> 50622 bytes .../desktop/login-onboarding-da.png | Bin 36300 -> 37058 bytes .../mobile/login-onboarding-da.png | Bin 113960 -> 113918 bytes tests-playwright/wallet-flows.e2e.ts | 11 +++++------ 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/tests-playwright/screenshots/desktop/home-balances-overflow-en.png b/tests-playwright/screenshots/desktop/home-balances-overflow-en.png index 4834f2d44911c99a8bbae999833229ec28e939fd..8b9365eb3c171d185449f7854eacc2468b1e31e6 100644 GIT binary patch literal 50622 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 literal 49240 zcmdRW^+IV*H6>aqW-1T}MEmCTD@_oH4EUFL=o&F_ zdCs9s1OiZ9Ml&__L&y{O^WVT?%k29k zrlvw@m}opb`G+){R2KYW52^CH5`4iEOK-T-oW~QA z8t1W#q_RF9o(*&9lF<*B?xy=}AM^?=R9f~%Fo`k%&j_%4b;~C6Wo%rW?h~WTlka8d zej|@Ry}erh23t(6ni)tHGg3CVq2=>Oh^8(DDfiE=q1WvIs;LIo4eJb;*NiRq?r@VF zezht!)r9JKgp}EHf7MY7v&%2viVergOq!HV9Yutk@Ry}Vb!6QVHs6QK9E_NLhgqcC&We|^h}-jQ%s;vkH6Q{7$iAYbDlA0e*&%MZtSPMr+boFIll9fVTH&o1TLlna zkdOLkzAFB7u>}=z;k&ggMZJC{v5g)qYhE7N$bcQpI>`~N#;n<--QVe8V#5Wenm>-~ zL42Qh8MSKo4Lm!n-lHsQJP`4@e9WD3T@F8Oo&G(>bHS_E5xJa0kBULmuW$ESep>y* zY4K_K3-~q&G@wYvSXekwYNQa^u!|2(_g`9D97Q9VE>310sWLJx;dgFvU*&)>w09wH zczHsTpl@GhAjxVsdn@)L1w~l=pwo$YR#j;jb9p!ze|5U+vzQq;D0iyq93)T2zMWC` zg5ponQy)nwsW`a*rnFuZ=uJE zK7dt~i@B7RCQUq#0Xus;btpd2c(xO2!6R;w#i?;8%@cerDnra?z_uX6wJiXD>ycWR zclc#Zk5`#_N1r$5S8#Z`-}-qCbW%Zev{n_3E^8^at;)Z7SIPghBgLsz>j)kV#{Li; zl+>9#&g)Gi?5zwg30{d?VbVP39$5d*ZR8s_W8fh;&NuRl)%fkq)a0>4lg#OvWnQx< z2|_AthTr2_tkb+^_PaUI{7+JmW=n-mioIZwtBaFlSs%4Az1!%_&vY_`xhl==$)sug zE;3mVd3kX`%VKePLn)$u=>ooEo9=rMgTbUe*2-tV39^7dVsu1|JOw`3R$1OF-op{p z&a@{(NG#DRyoZDze%>bn*o7#oWeTnTo)k)sLbpwPr%vO{g1Maj-KMS z+DI-kJh2ARG8e12)a5=zzj^z%nb6ua0N%wc8j;hoI(J&$g?No0x2vN^@d8F$s8?ybwPPcb%`Pnm21^fJzw zGWeq^1AIdD|aelK1O$NW`z@HBw; zfqzvf9ax`y!52MWm_*JlbnntOtIqjgwTOa4=4eL(qNCdzmEn(fz(uhgoFwua&3X6I znj%hy64}F&*W@-XSdXQN85GtP75;pRF#!ut7U8!iGUc4 zZO-$lE1Nij%+x?}oz@(0hV{4qB3duHign;zK++gKkM+~}+n@fq!>Q%GI2U42b_zbz zf8e<>kY@3CRTO-&xbxyOJsywC$j!Z6y=C?HG=#;;r1{gk|$p@l{6EJ<&YAUy|RICOWaU6Mya0$~vD z;feA}p%FA_#QgZ6Zi@74p+OPaI-HvEBVRj0AU-<@h!(t6l~q6Hi0^n62&;ZSC)~-7 z-x-#V60YgcdKm^St6#n;jgFGJ_-!`nIce&;mgf1&ZRIkBAt3M9ljK^ZQ>^>;Sd1Yy z*ZFqG~=@k#*JssSZd5@=a1|P`O~% zttXkOa=1&lTAB}jH>>;Ctc-;1$XORl8UM3=hq?ux;LJrWukhxI4+ZJf{^Z4~FESYv zU%o6PG@LGY0Z|opc`5TP$fVINb_rV6Fsz1rASk$dz*jb3!>2dkOUpP!D3|Y-C^K&0 z{o$A3p0;OlDszt{G@4N$I+V>yPVVGvbcqeAa{Q?$-gXIfhTHX@A%Wpen8Y#nn9k0V zgb&UpA?qd+578$mB+3kaRW<)%;zlUPqiA}Wv)3N_E2~beSB^8)TXvoy93p+}o1+Dj z{Sqcl1Y>7>!)%GjE)mHEP{2=2v;zVU;#hGpuM^5;-*7H1zB;e;n^#9S$P7xW<*= zJ{7%O?o`Q^^EgRuXz|(A^S-s&7`Sj2CTldA`649yt_`TIH5^2vJqFy>kzx1KV_#t- z!{vYy@Ct1(%vu zb+J#k!lWN>hp11~s*Gl$NP9Y&29N(H@j%1%|*?EODyrb zmWQaB)8PbOG!)T#{n$=fxrdtr$z9~q8J2)(zG$?V{2N!$bLO+#!09XU_(nlN!P@%z z)qXbwssGq;8SAx?&XD>Xf3n+v_ON`Ub2y&iC(eOrIqB)^>sx%P*(-~k%1IdK*LBW? zNtLDfaq+9DPO*bMN|L{Dh4!vM{MF052^a9`=NBhNPE@;ZRpeX)+-sb-@D+(F5gg$C zitda`{~!m=^?{UvUsTAYr0XQ0a{5eS8tt#EvvKNjFLts-)xc}mrrp8yfd|js|NeQ+ zaXenY_N;nvU;t>!PWHRmMw<<)^dLU2D_yFz%oc9wiQ_rff$y3-Kn+lry<)}v!Ygt3 zZ}$#@pShj2yIQH^V3_)}>1p{;b_qkj!=x>P5Y%o};-t*oGD$_zG-o!6fc_c<{x;+;(+ zo051|*`F%rGn(J;L2rsArJ7U+A2yGL%>v08b>yGx_T+e*=nD6jJ84Z1DBS+aZHd?M z7f`_k*dPgdq7O<-(@PbR{>C=T!Mi4IcGdOe{_5Qg1$8pg5$aGWA{Bl7o5wRX=-rlQ1BO zZdM4tGpo*(X6n3T87+5^`Fm1JowjD?8j^m`eG>J=_Pj(?9lcNrhebcAaGO4WB3k~c zMa0@hgO{q4OnntA>*ie(RAUeM>l8hS2`96=IH!QycLEZodyjAw`Vw|jx)FB;4ZIH? zTet3AYVjLB1z&7(?!*|?IT|7T}-+L<@tGEmEb@M(rho2WI%FdtiHY;ifB5|i3V$dPSXDs;IO)ySi8S_U9>D< z+%g>gLONQQCdYMhfknb$X1-~9 zm3YQKp2xII3;vR%dWF!kms50E0|>EleaYFC)a@P6aICxDP<0> z5GC+2X!*nd(+%|O4a$z)toXU|f~R54g5Sd;3r|BjA^gh>?}f^huC=vc6QnLeHca{L zn)4IZOt{SJ$U)CBe6^Qwg;pCI-bpFk7L@2Hxgn*xSfq1fBHK`2iF6_RjbsT` ziGud$zirRAuC+b?)^i&cz6zL+Ab3?U=`);abheNJt{YN$O3h}oUBYA@s2k+?>6;|R z=HUZMrLM(t$+wRgdDwuLP1kr!e>+bB!vA1Xv6Z>z?nw0m4o2a?7t3TIvyAH{vmqwS zMsD{opV}ZDHB}{dOqs+Z+Tsn9-wQD@^4tNwuUNDt!F!>Y=-bb&!6aFH%{~K3J09BM zp>ED`+Yfse1R9f3tnienbb-&4>1GmD5%T_oSZ6&N4NM#`+-nJBwEv>8V5VXdNkbDK z0-|}v7wZ>($1hwL*3kuBip=1YM-XTYEeiAvkCFrSir`7t zrq%i!(cKez#rtl1Qmh<4e4*Z(Jy*FF^-{u>Pv~8 zF(!Tq|JKes#A8UN+dS-sw67V;^Y!|E5;MNo8Oi{iL$CDCb^Qm$Y=T|qytKYvbCw#cPFHwBk_$4{H z88D%bI4^%CzlS2Z@*#Tr!+NgM4U<9?B~}CYq>}yiXc3@}2JTWZgmPK|OEq>atI;Vl zIVtPhNZP2Iwe0zWTG8?>r4V!3?_b=TUKu|mN8@A5z$6sUe)EcvXpxfJ0~1`b^X^M_ z4XXT6fBP@Q`A-#vb)z?(KTUSs$-4hs)8pB(R(yv1RU9$pDaOu})iTM4qm#$;ov=_XPM@C%kese0%*kjJ!Aj6`imuE&QQPZ65 zeFdBtl$n3+M3KRRs~p*1b!QvXgW6BXHE8Ou$~UN(;0QQ=uBu-rkS0>1mf`O2A|6fe z#>a)m%ab=*m%Qtg_z|e%e492a@E);HszBu>%Ufg?k*ck^4#fXzLWuaU_|VL>8Zv}X z)XM?u-!hqCGM45yLKHtQog!2e*XvI3J_(wY77P*skgz_Km(IISC_TmBWNmm*3C^cc zrR?`>@RSTZzO+(0h`n09$@_`b>|H7RwiSOMV4<`IW`)-q@kudSZC>}xRl8z1k z`&tiwr-vX=`KiqfF#&@Jq#HF;+r@sT3(M3l?BF(Sz+!pl$cw zn|XH-Ujo@Q_xZfovL6y(>0ohD!`l+#5=w1d{7%l}%CUnTR`>PlX2G~V z>MvqdAFBp(@(5*Tgm@A; zY?$`%QJ7ewuzK{y7f^Q(OLCJsQWJEeX$DhB|HCKTqy6UaL}-^8{I>nNDSWMJ+*F5><|FYTnwjlGDUmC~;Ypf0fjR?LkA|A(n_?_7 zxKYGx$<3w`;Xtbq{0u_p7M*+env*MAvqY?BmMjw!BPd`>`=O@Yu*q|y8h!Y_Yx#5) zgGDJ_S&5LnxLIN*S{&Wd*vq{4=BD^V5*C4eUOFQ-1zbtWlMBqCkf{4Ba@}>E-zPhq zmz@wo=~vFMwp=qwb|S`ic?td`>Q@XiZSKtzw2==+5xs0YmlvU2^eMx7=|69UiZ~0s zh6W1RW7|vUB`|`#BX`}VQg6b5HbPi2=7F73s1+e`2m*)i@RF*&FzIoWA;abN9jM#%}HC5b>5?&NZ6&FCZFHQe5i+ zm~vr$av|r7cMFyA91zd!@CCH6lZBHaM4jit&}&NI8q`Ck7Twh&KnBe+t;8Ti<8Rc@ zmfvCTqMUoc54QrRnGO^ zmrFbIWT$KlmP&JYT`@^A+V&Hsk|j%g`26=L_fQH!e1U-=Ag}O`El6D#z5-%O%uoDf zofy^e`IA8LXII{rTa#g}2V-IF?0gsACDrzK!umJSNVTcC7K4V#Mul>hV8`0qo8M*{ zlU}?c29h|CW16a_kClW#vpHA&=~tfMk)XPBF=<3>EMjoTy=oQush_dLhZgs$;jLx* zvpTh?lr;z+I3OS3< z8x=N76$^F$SuiWf$Z|-v-PAlh23!+mke}~WTI^g-S#4ofCuMdb_1@CB%FUisU_Q+L zngf*+F>L^dX6mIwM9p4hxj968g}!Yf4++e7(B#$34L!v!gBpk^iP5-Obh6(Hv}q>F zS&S{y>!z=Y-#-2{s=_NPrcP(gL2E$90?p4Es@1UaP0>iX+h{grr!s}XfhmBOew*RXCox)vU+ z`EVmM2fZN-Sb$UlbqX(|>zmTCTb_9?y>AXPj@SHcT7BhD?Yy(hJ;J%7O)ce)4N2rW z*u|R$4h&oDl3_Mv-s2+)1n&Uyow3!lp^iPors!Mw6An6D^`?-GBr#=Cih8em4A zQ$B?RRyh9joKP|}j%^x!W7u-%V*T9eH?7lG%O zgZOu9C}6u5AR+{Bq& zCPL-mjg;w}lGFnDGtB)Dvo~RX)yu>~8&YV;CI`PSm%Ga%02tk_eG|HF+7Dr_4R6z> z-uUytxsbU;`_)r&*1vh6vt94oey5x`7c zK*|6Uybqwsr%lu~jjC%Pc{{Q>p$F8>@+$&{A<|U`N7c#}5#HCBxH2eV}W4 zO^w9G5FQb?7C(idyFMPgC$na*B!TX(et0%`A{r`DDFcY+(Co33!e4jTf z-D^C7pnDrnU5Qb&)4id8&Qih@2yMd1ur{6~EmEKTTZ48!^Xfk)@|k(xk?K#-bHy;7 zaw{-64uQnLs^XWq z!oQ5uA6zu4!^JRwDI_}?_P)Vh%nst;MH4c08buR9q0~3%Cn+`jl+x1fA^9+gI zQwsk$Yn_*LqQHaf&oP38pL&<%WrMuy&Yix|Fq3jBG)DC3n&e#~#;;~yJm_PjW8YO- z>*;$AwZ~XdF#P95&geyn`7=76`O`IBIej9hd+I0ty7~D-Vxj8-Zov`xWQgS9h_6Dd z_3TrPTg}K>O29pMt&)6e-eDu_r=2#%@7xF#4l5SC9!26QX?hfOKU<-?Vda|JV{=lK z_7JNt0wfdlMeM-alK-S)^J6qzG=$*Zw#+Y1UrY4U`RI@?WknRPMD+E&lA*j-Ab~8q zyiyH8Zp5VUG!S?*u_#l%@z-i&2V?#J#R4R5ZZl&)t%Z%seDpc;=rAfgdfBg+xwbpx zBHrXuSIo;`zr!lYER0br{}rY4kcp+opYenH*F4Y{ptlzO(=6m4rW}OM(s!gAN|+D7*iJ3{E2RTS>xIQopk{iL7i`f9rOg@H<@^N!rW+rY{*j@ zz%3bSQ-rGD!SAaE4-|wvI@q4&s~U zyiP~XSWIz&kNpxxV*PDK*1t01rk<^V%rh;Bu{tR@Uy(4^whG_ zw0ws3V&zpNe=rsJ_Amw=SekT2A9BY_MxKcA+R}`Iq_G8wRcSqC^<2XWf&_!okHXz!|>?FGF!Zj}ngH#Y)E6zG=Qi#c%N> z^n@LMdD)M4hI`Gv!yPyIx8Edm`QMuWnx^**^IoLtnIVoP*6^dNKj#!yNOyeVr|2Gu zo~k$jp_}<)URmRN;XuHbGg7+4RK5Asn~T-bKb?>C^tItd_kP|OUo!kwl|)W#nZ(2|I`D(2H`$|3i(Rk7ZqvL1oUV8*O@8kobd{0cg+u#|8hbnp zRWbWn{V;+`Y}D|FA2j;v^xxxtWW_HOHifBc`l$F;E|eRs8T+xs_}64}qa){8lfH)# z0RegQPh+PkWl8l-MO{N;_A#;3rSQ5Y-u>v2HG>&!vK4;{F9?*{Q#kwkwX&8^f){+L zQB|9ZXKgCyH{3t6M_QNYgy@Kv_SNvqD=x*|_r>LteETD%v&#5K`#Q$Bl>_URQYRCA47_ZNZr@~(*9WAV{wbO1bfUAE zIHIjW>33w*uZs@iawC8y)*tqgc%Q0!-js|UoO>KC-IAU}fJ%6{uS3wx>)x_hLshi9 zHp9ndKaTX_(^3!j3tvJSF{n+0rs~R-Q^yqhEK)@o`4ZLG))HF!)6y!UG@Nf^@BX&U zE53`$2iHkDmzm8nwFB4X6)SvVl$C$cYWY5ck{dfC_|f+QDVDFWiv~dQk>p+R33D0iqg2nO5)AzO+Os$nd(|%X(X~uN8dSs&Hg5RvF$P*Pk3<7@JWqT=y9%WE%Hc`ptit^u8 zP0q*`MSwtguDc&Ur;Q+RrKIVGRBfg}J8{xFw(9G1ub9&9oOOPuN`>C{nVp65fk({- z6*aXI4C;}Q@H3J5c;r?z_~~-_5-JLh2l!WJzdz*?rM|eeq@30LA$j`Rf*6-PnbxBb zC_w#VM)Im?=w&jI76T?tF1X_zPIaH1NqKf|)eCN9+Y=Z)n@GJ@0UZiP_;7X?P$RXT zY=@^kbDwMW>Yb@UW1Fw;FcslmA^~bu*5F{Z@fa=bW(bGF90iDoZNQwI({@8!#xGrCv-lRm@@A8!wX1EkCL$`@iPgEmQV{+S> z=@g1U5zeZnAbM{ej`$x8HyzC4_Hxu0V7v0k_yoOl!Dm2I{*E`N`3kI;#+b_0W@|%C zi-Eb@C5(}JM|;MVj^34X>l;_-E|^H9at@i1H)--{T|Q8;Fk6^A*AP@qmvLC{n?9W< zeE+igA)4v&QkCCTydaYKc#*_Y}c=BrN9BtdAYxT)sbPHW7_==MSB!`%s4&3rh0qN0LmB&cFDH~8#(k~=XSD< zM&qnFPop|}S?rnC!&3nx5p~`?KwuX;{rzkPP)rH7GK+a1(YHTdi{ola_n7&Mo^+}| zEWd&$dHk0RC0C1!#Zh|M1 zH4a9)6-bXF(K_hl$p*x)>9m#bceK`F_Vp(<)lv?*|4g^M8n<^3DnXGU#z4e6BC0r` zC6r32{B+G{p2hRwlNtRDluiun1IGN;=Cg0J5ZN8KrWH63*@CPMxh`Bcdp_zkx&llu z=bSm_#NjW}m@Bh_B#_fg`L7+2i5TQ4TDd}s($?43V5jrZBF;lEDA@hZvTiCPYpDLj z6}(M&Jy)QPXoYzXLdy4$$yE>2tN<0x`Ma0-SILC_RJH`agy~PSm{#aS$+X9@`%?C% zG!I@FE9iA}?n`~=XXM1l=!o`owe9@O%03{~oT291(o+n9@Bojns_92FiyZr=g8wcC@Cp5N7MIFZw5)0IDb-93Ra!eKLsCda> zhU76!aYuaWTvL3Y=gDvWJZ%o^cy3W95O!g8pbZ z{M+Jq&5n|^)FDm0gerX((!-dfpx~6xJV{&hE}ubS2ER=BfmlY^7Nc*M#;N5SQx#ePs(Gof|o|Ka+k$ z+~VJh40S(i$knUzm`J!?($j?{g~wBRpKRXY-~hX>mjEIj0V$~>Kjkp7IxEk3K)hLH zu~kVzj>-7`LlSlo5lnse@gXnjZ$pEZQnZZbqjbsr3_#;&X=#}To7mEPkbX3HTc=nI zI{6qr$d9x2L~G89xHQdmMti2L+~qf2KK8a;=YD&sv|gZ!)&=wyK$L_&c^&si)gt|$ z8Z`MWZ-<_VSMr$CXQHW==mm3 z>FvS}i1$+RFqisQ*);yq{SV6 zUNH#9#m_&HvibGpO=U!7z~MUoR4u>CP5eNb^o~mAWQl>%1p;1};eYP1ADf3e#_W&9 zMfY6#A0AtCr#fTGOd6I%Ib=A2t>L%Cj8fjVI!8O~Zr!@Cr)dS)YX!Sknvs9)yCPt}#w%hfr)x88q}SMDMAbi?{U+biC)6oPC$+U@D>ZCb5_KfGRR zH~pYOcR5_Jg_o1s)6-zGY1dB((8PSpB%x=#F6RfxVF0<2qTh>lChJr~q+d^I9qMYJ ziKE(KbbCPBF-CI-P|>sW0qt03ZEqTvV`!h$s7bZZ`ce%G{CdenOCkzUYu0RgAcmc+zuiJvr74N=3r)7G#jCp92(PZ>jiR2RYTG!)NRhk} z-j2F?Z$NedIYfrC`&=Y%0K0!K(bf3(y(9_N^a3Pmte0l(m{a8jtVHV}lb8QOQBQZu zt|>k#zvuDNjLyP-bn;Fk>|8PHc(Zr3`9MDt!_m^V$6(j`vSW|e#Lu^fb%=Jp;IRqQ z!G}LN=8QizR6|Lh(*T10ZL6`q>D=v|7ZnA{WjNZNX>IHg zb!H{7E&lPY+@+{^ws0!xX-=EWw^E!_%Db)Jp5336qGfX~1#-{3;^qO=H-Xx_4I4{=s6}zv4Gx#0F;cuK>8>o#mc){xfgz*K`VZhRFe}C znNI|oqOk38M&Q&LRtsD5%#!*7@~7BHgad(5ez)X1q%RRO(z$tFxW;z~c*;QjRV`Ef#d+iB2S?J{fwtu2a3@YYsv@)-TD!|WNGW1#x zu4F?%Am!X|m}3CLjG37!oYikw(dIf}u#=u_sCy#3`zhC!>N(~Ej*{HzGO2Tu+kHlGUG%#alaG8b=a8G!hK-U+jl-AiQr z**lMC)Em93@$Rp=aHx3}X<>0mb}NDn9@$TQ#NfXf?)R?sas>PeI>e7Hx2~=}X%`Mg zLCOS~TT*sCyyoTyhL}&rG!5;JXBoW%XKMSVT7OMR_DZ1T^L%uY8w}ZQdiKpOeejLT zI92=fHbLD^+Ovt%B+{ENxnd@nSFm@g=I@kHuf+bF50hOZ3qQUuW4((LCp1)Sv+}An zLmcfPRu-jCYoF}(<6o^=11J(mk`f4;`-Za}EA;hmR2=Tg%4MY|YN%Vfee`^`Ah~F@ zD=4uE=e~`j3|T+H_(wMFCj69E+ZooA*y51Dyx=dDw~4p}H)Pq(K-{G|=T}&FQS@jP zfBsQxubcA}^EtfV;Jts-vk0Ry-?B7nMEe=%GEDColucCRM z6or^7+on19@Te2eCr_^$4e6u7Tdt+`gGc@@c1`s;C>M7r)r7!@&U(r!I!tr(gJCRq zi&q!GNg-*+vz0OrC51@w)dWt+!BOi&-m8$fBn#rfr9qZ|Hq~B$$luGqlpV}cSBMm? z6%eO#?F&r(8q#X`a=xBq_v;T$TkMrUnDh!ae^tSZR%~IouX}}zJXYiQXOdjx7iT?$ zinis@PmWEdlOad$!-!A1ckcT}+-@`B4-JVPmbl!wI(0`yct-Rea^~B+m%l9mY%bCO z`RGyoOvKPH&D2+@Ao`HI%@W!>#(e733*g+n4QK@BIBUy@Zd|01G{gJC6f3pq$X}L7 z@M<3@%+;gv%;>H89Y3UJjS#%V$6h8i-DzG>A_oAvAi+1|WAj&-dEc4)(HPsS2K}2` zvN88jbI9Ba5kzg-Sb24A;& zrv<&dw}3`60LBP-4W;3g_>wv`QWpH6eOnH;ptn#_7plHu=c>QCW9|Th^>(cyCEh}0 z-y{Uyj}gPT(m-A;6;}26)gIKbNU>P7NuLaS6?CYEJkD6(_Kj`Y0ui1d9*@$*pJ_NK z)&IKL>a^t)3^uhjJvT1z(8o7P>4mVTTI*RMhNRbIUizjDjRvK)ZaIadZ=3G!dNKuj zWeM-QSFeWrTRghw-1^VoI_FhiqeDxvM3h)66vSAt=zT9;hW3_g{D6Uwp~?kgeRUyME+fB!WxAmKmon`+SK)pxHmE*fw&{i;^OUX+-vk6}k`AEE?M+IYAVo#*2&y3>&4d;-3t=<; z)V9QjTjs_^s#sjOnmIJhD-}jCy+D%zVhw=)vs{vL2mciN z^{z~)T#gtvr>D?(tM18MnmQelI;O(XeAv4vt3ieWeA9RP>X0Y_+444TGWLtuH3_i) z3hN=5^4Qo!&4V5`U7uIxdbWq{mRA-Y3o49v92;<)0TJ%F z@B>=77%41ur)4x~)oGr$hwRJ?~pH&4D)b$4Yv zo0-3QBJT>f%K|3Le~!YibZn9F!{i+RY*bJO1R>UK$M~fn``sT#I-SU8kNGc)n&xlp zb3*9Vk$wWv){71wm6~tLF6h0Jydd6P-3ThJF`@POz5if zu>dB*3xu0FE4&?sJKxdha9o94v9X(yQJ~< zefv4$IyB!dmrczrlT|qh4|DBSl0o}e+K$$ON5=6#3S)j|;jH|ZQ;sXBcBP;F89JWk z*gk9>3WEU+1qjCjxVijML&lwE@R*+6t@l8sxUAT1YD&v0j+n52H}@?ANcKydEph1+ zNd$IT%ijA~52fjji$;GKp{119nl77QE8-%42meV2kA@vWwvG3WnG`MhPFS6_K3R#! zud_RU_~qsAb77)!nfK?X%1igl2LA?%c~b`lcfdZz9Z-b-{=o)s0h_K};cj@sKb!PZ zys6L&SBXmR+ICYOoVR;|*U%ByD_B_x0oyKMBqB~xlfH53Vd-OWn@k4*vNmT_)c!3+ zBUHr;o2ErnN@=$CKQ{phShhZ11C!r%}tjCC(rS|nLobaOxCF8?!U=637ctrr<3>#vuEAP z1*RB9_?Oip_WIAC`bOv?BmFbYqrV=d)HLt)Y8{W?>W?aNt=oim-Sztzmd?<)8`HG% zQFC7x7>F|nI37oGw(hTWcGY>#!D?j>VPM^|n=%P+mUkj+z!|SIF%AbORKP5kHoDQS z;alehDz-aV_X^n(C!^)74JIA0h}1}pDviFUXii7gH7YmO9ju%0*(cZqiv~B{Y7u^y zWr=exP3_%(jQxC0BGx?-yzue#H`|r2^Otzp$da{Uk@^{q9j4nKyE$QNs9>;h{y}9} zM(cQcJC3AjyY5ZB-8bHZ`0%yv%c;mJYVfn>qi@F!Dx4WU;mJ1LGhYk7J;nz%_H!;Y z!W4$gcVj5~ObaI3Si1vC4|ucMt5W4T}D8iRD+>uGxbwrG9-tLjcdVH^t} z_5ex#+xHMX=9lfj-}PO$n}a}}Hl96RiT#zqn(er6~U5y{^z~UR~{R!|CtA-N<7$zWHQX`M7ZhyW3Ymjj9jQtr)bp zfRx?V8VaJpzyJwG+6adKVdw3hOzlC7NFN_Zg@rt#Z!8$lq4s~ zMjsrt^bx9cVW(|IEgzhy2NDv;+U8eMzn)Xxjs&__ZQRf&&)%$yRP}5t)$N@n^<#eO z|4r@ye;Iw_T@J4AC2{$9x8CO$G(BY9rAF$>wus3G6$NS236W<$ z58`rLFFifu@OjM&*@y~QL+hsW`Qxj&mBBNqqq5+fmRs!MKQgC@(if6|K8G8;K}~A5 zlycnKG)dOpSY3ciF3Wwoi*#a6u}Y?`4F#8x30@?4EeL6$BzvQ}HMq%)ccPqY*vka3 z#GdAFfjmP$JV>-r;Yw8kR4Cgz>q``iZvh^(@2Nbz@+#8v;IOPV6iRuFDZmbJ*FR$| zt>xEnXYL)Xza=-JIcxi|<^k#;``~;x3C-@-1b;EPr&seF@drz=RsK5CGVeCY??cL?8=?ZtJ^w+A(}F4Mz~AL@<1 z3yGG#;0K((YeFGJVlZLh@3_nBGoSvw=1re}N?;52R7PfVMjk#ONO`M@ZO%>w6dNK6ei?aMc!Vg5%~UB; ztQE=bmRIARU>K#l&d|%ji2mjHZIzGb61#k+r38Jo(bbi1= zpsz44j!*g&yc1C78uQGja}lYD830Eqmt zCmKqeio;0^Qoykg;FlL@!lv8*FzFJ~mEg@DN*CF~=ix}tI82k_q%K?vLM-ck8s$ zw>bQQ*xRr+woIxFi`pUU!%tOh1uSKmd-58LmHnPZpRag8%OqWyJyX}iBxLphfbk}c zXVALZccT8d%(?X(pT*Mi!KYd}_wbksL%XKSq{hM^HlP!f)cI8d_g&!-Za(ixa+32t zq=mGuSCJnP_Z#sgO<#a5K?r6mf$mR6G7iqVWO70cd@KXi9BT ztT}yow)=SJg@{1`+uA)9N@f-@cg3P~0)$A-o-_EDIxW75QE?!Fy@>NC0zG#RtEbi! zmMHkju60?{9+2~qR_OZQcOL)4-g^c$*|qV$SP-S!=m;tz(v{x9M+E`tgwO-hl-@gu zpnwR7AVulDBy^;gfJhC!x6pf+UP3r4@3Y@Mv(L==vOk!>gzS*vc7zH(cd*x_lMY}2fw zJx2!45)$^gG!K6s4l0Xd2C@gb-_RDyHHNDcAP;eOCmF%6L+K~GBmiXOZyL_5wk?GV8{}5gK?RG201;IBH9PN)iV(UbT3x6L8c;5AU5rJHHx@Hq!cd z>CPp(ZW_4Bn|HLgDlO#5q7h-e?OKSQo?&Xy>MVVV)V)#&KLHY>6}AAX2%qxR_UAWI zA?}TebE}&iz55jo5lsK3gjl5~>y{(B7Dc+frW;^x$XcY@cX{Oe8jGvMwKMXX>jp&w z(S5H#FspTG?`gWR(>_<&jjUT>)CJ6nP9HK?x*Ig0jt`e!g z3oD+HClBqmWv@z`E;B$w9)MAuLRzWE@|c9tsVz0HiRwj#KoOtAo4IWUafcNRn;EwA z%b<7RCR^>DR~G?-!(-auOqL8uqErRk#R3nWoISvfN=^@L5S=yx3xK3pPHr@Guqd_i|Bot5{Bw%p7k)P)wxa~yIs zR`bvo<3k<0u;mj;sBqNU;$`RRvSqf>$;L(-l9cO72UUO6j-Vw98bN$)n!H8_!Wz!G zg?9^G@Mx2(g_$>mc_S0UeDRR}LeC|L+doG6#!P4-UH|F$lTms^r?=eZ8^Ykd#lbWG72eu5X3UM7vccIb z8?7(Y2pLa*?W3){E$VS9z4o-_!bI*V*%iXr(^@g|oRxY@?EV0MM!M4Yu*ml)-B>j= za0@aVuKi;(@$kzRl)1%Bzwld0kki zw0k`0$UcqST#e+K%~r-jH7HK+^6KrpwAaTx7_6}|J;gD9amiUczNm)|Z;W>f81jk29 z+S(?NP8FQ?g!0X=iwau72W5Y>cBn2dtlhb`>H$Tjpfz~v=CqzL7m&ykUFTTL&%k?BC zE{$e#1XuFUL=fe5l5c>fMj3Mb)sZ5Y5XmEU@4N`!^yltS3)OtL7u2zNlI^^z3E+sj zEsjYcjl7T_>C1T{!#!$@mU`}|2MlhRBM7X0sxP+ip4XMtku6e;<pW2W zPsyFat?iqb>u4xjQ%Qb`@_U0A@|I>jTfspcsoCTX7kHy>>*VD$`YHTU*HIM2>ysS z)u(>){G9Te-_nDIVp8ij;_TtNo!sqrn_m<2eNZIG8YAo4i|T3F)1j_?l*^gLYrmEr zIh{G7-*%pN;qmfBV5&{%>a2C!I>?4KO}(ebt0YFFSzci~nk+hn@_36n6Js{MbO!d9 za78i{LUs8R8+DAHrI-GM=a&`*PJHRQ?T%G+kB>GJV9~$g7Nj@)!Gy$^b(Buxra$X0 z-!no3nHhYiYWM?~zjfK8QcBJ|;kR-#<#pP8+7_$=5~rLfcP_3g zLA-wtT1}JDhwCh+i_2;~J=)cj+8^^DF|A#R1FIH*vT3E@7)4pvWHha11}=BSZE6%* zZ0hCJTn(}`mQt&Uo-1&D3w2g_FgnTp^XzHtgcYZ4CalZy>OdiStQ0eS{%Z-H>EJRw z*ld7&L4J+sKFwW)7`+{)YV>W?*pLpZ&dqYZjsr{M8XlJv8O!ye2POAyj!tY0$(dr{ zu2{r8tfrKU)gk4!4UVagM(@=$$qk36U}@p2eV~@|%H>_cEt~84jCeO?FzYX9;A8qM zuEq4O4ZAqAXLTB-v#rPRBu8WNuEaZzD55Ryyo>Fror8{bC3Q`%7ZRN{6gn=H9Xa7tGL=Lz9L%5|Fq32ODLlrF*MurbEYhT+7>&bmll7B>!S zRSTUuxte^9q5>bgQbC(3uvs{b3yU+rr=W=So-;OXWnBqha(^%Pbg_R4WaQ%5Zaz;} zEWu}MJ1@(on;Y)Is5bUuoeyS&>ZC8E!Zt{YN?^OX$@65A6j{@ z++a`oq^aJib&Uek-Qbq2v$Tkwr5`PluopI1^3>_#ITI+Iv(AE!F;?Xz<(sjayB~As zj#^TTZabcwxeGJ?6GUQ69one(l7;$@F%i*Qn9i8cXzJ@@!_RqiHbd~u5dTemnt+0N z3d(rfq)l&z6QYyu+W%?+e00MfeWe+_-kpNSG`-*6g`Vy|i*43>KlsBu=9H!{4Q_?h z+TmJ_cro8nMc+Zbag3`uoe`fQx&?;M(Z&VKjG2nHEa1v+4<#$@Fn#1 z(WJtL7f+5D%m~NygJx_{hb$yTu1MnD1t@YSb;z+{eEnN4hu_9^!)Ex?W>P_DQ3!l< z9nLyXND6;7v+j>oBe7_Lr`Xanf%K(LXj>8eyHlI1Lnt&FGsJZWr>-EE(BHtfG6fa_RSCk zRGr5qeu^f=PPf@T&fjl1ho3i3t?aLFn_(`9n+3hI=*U6X?;x&BhW32!A>WI?be1;L z5Z%y7Zc`Sat(U_7&iWICwEWt>>{c1?p3vE!{(nTygwl&Ju$i)L&JDgpE6|zEhj{u#0%F)VMNv9qobo^f7h6wq&o3xMJd@+vU}tuy9uFFky9AXJyT6bWXupzx-p=&j-3vltzgwOkNrD zj6TsLGo-PhTxrxR@WnjB_TqTbUYzTl)Rgn5#Y>SCo`tEPo0-Pc@Wgj7(G^jTFvgJf zH28@Z(YOU=s5!qw-Q5T;b+fjV;EYclsaB6%vcH@k6fi3rZ`p*v77ppl-KRqpNzq!` zULwljNc+d)eiVaA)8VW7TdB|hyKpnQ2oXWjka|6jpCg|+PiW%dt7oL2LD2UwI>B#K zpY)yHO!H35D{U&Mw&r8y0e^ZOG9wVhdwCCs=HLso9H8&-Zk}9q}o@RraODOp7ucT`f+S6C!rmFlh;Vj^|SdsAv!-L|0eHG+I>|caT%}o zA&Rf=!oyY!41G>Bab#CP#oadzfufSjR)cJfhZA|9nC^Ytq)m$~A{F%3=G^!ykH6FC zSM@|3*2gLuPevpg%Kt_3hMNNQ^~~n1VSqc~@=5*#SzlPUJiaPwc z`O_QH7iF!=ti1~MP2TmrRBWm$)*HLux27ggn&$^PRS81P65Lh7*qe}GPR%>kjgPD7Pp^Zt`h>>ZTT|x;ut4@QxGzE zc4_p<78~o@MJh*FoBJz-KT97i0hBTtrpBT3s_e7&Eko$5@{saYx`^aEG(RAt-JGLA zF`VYSKt}!SDo1a`Eq#rVZE-?lnp)^JIA{>TZy4RkoLONvi4aM9yn*2Ph2Zy>k_jrf zLRqJ`Q6KV<@Uv0soqKbp`J5VqJf4?d?Gtx^bB%&Ld!`cr^5g{6$LFVcUtCYQ3%wh z;mYKi6WQoVHB@wJWdE-W7YG;D=Ye}^v32Qq84%*~O2E!7Ok`L^{fv|~HHoVyvd1jb^A`RnR#3*CteN#8iZKjrDWOR(egCS~H_NP9vs(ui zSfy1yg4VEN6IGo=u(0WRMc6?_u~k}9*_%as=!t~Z7LBf)u7kvboQzOki^h93E%)kX z!cHqE$lc4N|A1sKY%hGgs{31Ie4WuMF{e99>{k3~{eJkw6f~GU7cH^4CK!D{EHnpHSGgxXPKYhVv@0oo@E^3FyjR z{UEK6Y0?-6>#&D1t~FndAJCCfX>$mX1(MEOhNIIcUlG)0Nc9};R~f*B8qaz(t@eB% zMtUE&w&2jJxWgkA-*%CC+r=);Vs4*CcA0eHF32L}Bkg3d^`s}+7D&?3eAFXZ9v-h>8XH-xga!pKQpS&89 zS-z*@H7;_d*|n2PcgMiNbb>#b`*^8Cf5)!^`HP{5a5gq;NdBVS)(!t{@7Gnb2cR8n zRGv*FRAQGp_nXH>ZI6zW0z^1}?Ec>CKB&&|rY9$#QZuFQ4y%#6V=zc9FnY>`uVH>+}rzV-<>@btg3}wb>&#_rmSqo z{;mAoM+?y=&hr1Y&+FK#J>Xv>&a@m&Jk7*Nwlyl$ozv)+0>^OhOe+Mnx$2rKz0CzV zAh&L$aBh^(t>Y@1srQ6IForz$s$0ee#|DpLtfmJqr64Qs5)C?R;YaAF45kNTA>=#f zd!e17osmc{=98Eox($dUe`y|htX2W1+cP9AL1bh8-(QF@~fa@d~4tMy&vU6m{P_DO-bUtAiUthad0*eS(Rj512}+_ ztood{q4sM^1uE>?CW$X;Y7bJMRnOd0%^Cl9(1f$utdSB~JtlnQ>Cq(-dh5rGm{z2Y zW~EZ|$PmK;zxH`P@2$dla-VBI3&FHexK3c34RvVius3H=ARPupd>qN8j7Pa`}%m*RxTI zi~O`csoDx;MyrC(jnMayqM7KL7A{zH{$Hfg&fwrFz;7DX`vh>ZfD!3Rlp}T>oFr%d z;?26>_lgG#lbxCuV-q}nJAx*e8!R$z8!V+3J<fK$}md|=wVt%2_6 zI-jZJr>Rveo-e^GpT36h3b}+q4XAm*5V!)K9R>x|wA`1Qa>E)Bqlzgf0JD?Skq{e$$9*qdKc|w0 zZ~O(IY5XD}GZV9)oy1P_)-NbFJ?RO64{y*9=V`|gjs*}g=L6RZBUtFwqBG>UJs>%$ zWW4e2Mn*<(Bm4*qK3*#CUbg(!r*WdpR$zWwL6iLg3tE>T%*CB0bD|GZ)MeHx}AF zx)VV4vO{jcI}t$rG(QZtR@mrqk%g_VQM^*XCDyr` z_--3IU#fU;Pg#676w=Wra~M8p2G7o5=jCpw_Y(_R+-f$n#MWp8IPaL*WW?!VR{Zwy z+Pb~jag}AVsLvmhGAp(Mo#GNz^mAnG=pZ%G;1e)^2t}go1bhdWAiNZef*!cyppDrc z>5DbM2)-c)i+?l)nr@uBCp|H-`E5NtP-K$8PN*fy&?e*YX|&`22_mCC95 zibgWQ@Qmll6VdeqGMTdlUwYOnEWSI3pcWq6vUM%g;TZjF^oEMeNTZH{->@4FDB5DHe*|Po0F3QtT!( zfX-POWM6gA9ocVh{%p4by8G;{C#_^cBD~IM8??DS1<&%~YkJY6+7R=MTCKn9ex}Zi zsONb+l{PzowwaItqgTm|EtyzldvI}n^d~AR>IxN8&f&{E9uE~26$69G;~U?vQAqz$ zLEi?Mb$pa%lIL^$TIOx|6mhKLX;){b7Ijk=C6N#rNY@EPg1B&VJmb({Z>ei-2*rM7 zY-|j1A(gsvRXI-3ZY=Fp-(NBsUeHe&GOj5WZ{QjadCS%4#OLuX5$-FU{0D1%T6Vs_ zSIEDMbvG*f1P;}{5pdT_!Eo(}%X?Y;YsRkP46wDu=04xzf)+&bptXz9SW&xp2{*(=Jam7l;Q;d34^co>ayhUl(s$7qmO$jHqaN{-)_nhxe~JA8=2 zxGV}LQCXGKtA%!So`bi7gKzkr?Q2lq{77ab#p(Os)706zy2z#G{bVrHIU?R4bouQA z;y9P^xm>Mdc;y|fOs*0C3Ha%1EEg|&p}S`5Y-wU!F>VP{D5s$1F@vu$e+#jDRz4%o z?CD`;bsh`z((d;1ky@L0n=LkbY-)a4_ppgdW+Q+WroMQGk&KxIV8BW2L1XYSst{c@ z*J1rV(h7Ug@FF<4>`UTtrK!9dAocdiGfQ67mdczg?5!7|Uq!zN&3DuXlvsc!=UW$) zk%4uejaFRl?(Cc_F;_A%NyRKiqSu|U^W094xeNnnYsIyi{jbOlf%rBjA~Zp{AcH*J zI6NL{hbn6%Jg-?xKF0+#&Q{Q3eh;6{ef z@U7Nd_|@3XahdmnrmOsiJbtFOjo?vS{PjzV!&=EvLPVtE-GMh?+#7lQrN8m|wl5|b zZfemujX0uEKs&|F6S@*-V!`@SwG88ZKgXLWQ4V@W{r7rKa3O_-)k}f9*aLBJ&yKAp z3-k5LnB3ZK&H7eZnq{am$p`~by7iHCM>R=_dhu1J|MjlD1_O?>%CAEYdDxpb=KN@6 zC|5HZG_rxl?PSn>>0KN3aiJHzvcFw>5O?nbJFuUKe&KW_U4w6#>&TxZ`q{AdintDS z2$>zMpPT+Tu>vM>-nsX?5W(y?x+7xb-M;Cjw4eWuYP7g`rYr8JttQNOv#aEnLD7|z zyDgd826#a_Z|hpy3E>izASRcTgsvN3Ckrj9#3mO1{t>d9eEpN+xu7yi$9aBKf5%E= zjEs_K2yC5GEIP(?>M38dQQ>yx`3`;63Th5JoV#l(qk=(KITOE25&5xCJq%8t-tpX` z#7V-1XWJiI@xx%p_!@quPDEAgfZKba$mGSN+fbELNHK`86I}5t_UL2W02Nprq7WB} z4@?2D&I%%1HCAs0wCC1&Vq)U$tI`uTakj-3Eg?n=_81Jtxr%d}mktN^8)0C3 zrN;X6yzr4_RH1g69ah|XrVS8<4+g(WgAw?aT}e6rVv&|*NJS-P7R)dnO)a}jYd-~a z$A(hDwB`C`j5zkQzM7iDxhoWb>#I5ZK{buQ%>R`<*mtIq!c`)R=yZ3?F)=L8oeDBO zGHdI6GEz&U-}wa?;X8Q!SM1(On+4nG3lQcsgK(Fol@PU3fsiGR!!n&KT}iA1 zLTDERLDDUs)8EdjW%eUm0FoVsDF0 z9t+ynAAChVvRR96DJI-HpgX0=^^YiruR9iuzmR8w|G;+HAGe_jt2Y1%Kl&4ZPfIqb z-IFM1@o4w}u+qfrHA~g;6<4df$2ALRKKeSN)uLOC9C9g}cMUZ{IrSYN3jVgKi^WcQ z(j6@ z?z(oDhNj~xF){J(yNb`eusyK45292u30ow>HDhSk5m2u(;H>*TE?F3APtR|*1Do%V~_eI?fRP7gE{s~?x& z{xg-uTSYK=5IxDbGX>gWgKJ>E2g;>OU7(HB&?rv)U>Yp^ys-LzjH-8j?@8l!zB|Ei z2CTvdoa)5ZOhm|_n3zW8POt)PnNXqbartV(c<1+L6Nz~AYCY!V_SVWmcqO+1v!l&s z^r_WcqJ(?>-WCaPk{LcdSciC49idg&M0UdJlp#nd!=1HOf0QERFY)$N{`v_pky*EO zmlrxHx%74RYC(4neI zH?Q{sSOh%)jUa|wH!eOtHoDBW@As>DJnjs%ZPox!hSsm=tP&FXkPo1Qx?YzhXA=Wi z9B(2ngmYIS4XBNFfPDuZEbSV1A&`$k1)Q;_U`vc-R!+GzsMUh}yS76M@wo?4OO+T_ z7WUA zmrzd;f07SY*{Yt6*hRDGsDii3`GW4PrUx87DCDdFEiPl!zyTTr+JjJ5|86fKc_!e4 zalzmx<2s=!Rg(q7LG+l`9GyAo9bVrt`<6I_)=+OJ@zI|pe@0A8P8p=^-z}}p+OxC{ z5wQPys|CUg8_;M0nroo0@wq=zGhH3ZMAecH{E&)MtM*o4Vdc#KIE<5pQS()r{%6B@ zkFa4h12)!nBf)CBFOI?qs1y=wHj5Z2MD@FIkxl6GjC|PUv!a=E`zN?1rhGjb12NYy zE`s<`mvKrs--iU<;VK{xTKO-pRCG!>Z;a<1UITRr%WY7f=_HhsaL!sdmeVk+UAEpOJI2z}-mpYMm;N{h!)Z^+q!oI1s>|GzNVly2g(( zTPb{HVM5PA2#XAfse<8xlUGV*`j&mbp_*cRbay;-ccO=?XF7~_#7Z{2t^XYiV}qzB zBiKBV8sL5t9dfiF(P4SiNvtr)*!rT5E<_4?7Ln8h+dp^Po2nD~Tt^VCAYzP2%f>Rd zCI5A>%Kj_Qtrh1wPqPx8-6lvqVa2w=#k+--FPI@^8ku@&xyZNgczb4QB&B-xzKT!i z2qX`tPtdI)U9a1#<~!L`+Pd)}@Ae_GfHB?}?V^K09L7 z5L1sI0Hf})|fLEOh}6%_6X_C64vN>EuD$9=pq`ak8XjypAkZ@WT} zuQ0unpq$tHnt{EIp&2uWT|zGB$KjM3rh8Voo3-DQ4!cf3w+?5^CmJ8j!|h{5Lx=V& z?}beMy-r+L;=MWvs~Z#H?sb1(*>X&(*ecMVJ5~BLNz4NZ`&j+zS2Vl~fO{u1Vk|ajU0BuVWA+ zP+TUpMeJf2sMxIrZCwkk)XVV)N$%s;dU!X;i#A-1H*9Ha`!cI{UH!5A^c>4zAicRy zI_kvO9rHlQo$w=xwKE0X>?qv5(|*`Ko6M?pwpGUy45RM6kRu45eZY-o`U8~mmb01( z<}EAlN^N#f@iWw>mu8u-HUXv6#T;yMnK3}?Xplx^`9@^Wa~i$#!-AH&(8TpcI z0)!j9HAx(+T;&LZuFnFQ33*)Ia*8;}59z8;2ldrs>snjdP1MWCX}uxaZiZ=jyyF#M zJVtbFMon)XUSM$rk|?K_FUZ63f-MuJx4J}D6+cwa6^L7~6L!lRf}ZCNpQ8@xL5WUh zlAaeW^kacu;$zO@f=^eWPSr-=ta&{Sud&*rsx~A>Hm(12Ff+tZ4xX}5JH7Ma;rEH! zNVgX!6m)@&S@k^yjsQ}386;9bwf!vvP|yNigx&$dI}@nhB)mHSA0fhf!!2+<2`~Bo zo&WHG!3OM=L0=F%BJ|u72Q!rhK&6jV%*aCnObm}jPr}11V4pj=|Nai*fY6zc2ymtXc1#Fmr_C;DfQr2p8Zzhm>*$)PVZ)B^0N2`v#AZ zsFHR9?oFKNR-OCwyUEH3&e%_%K0&x>a^v#mP!d^h;`#ACGVo|23CG_oFyFt9HEy;T z{M1bHp*lK7WtA=_)61^l?Tx#9R6kRvB=S98oV)H zAzCqneMTCKG=K)#*Zw^mf*L+|DwV*v&4F^cPbIriV({AayCFoCZr{FhC*-{58&!nrx1NY+aap;fbRt`Yz$6Ou0Y{-& zcM8nN#QvPpF3p&{c&u{T`ZP3$T5JDK8vYv$zB&fLN|?g8E4?3q9^^9*22fC&nG9}c zz$A!8z;*3c8s>>9P3PG*kRQLXorAsIMzoR3n?CeodOkGCnAVi{vTOThW1%+D&58ev zd2Js3(N^c@KqOb!Zu4B2CFzzv`X`qhAbC~~C+vB}&gJ9;Tf=b4!v%2qzKf6%G;Y_K zUoPg|z*3jSEE>2ns)(KZ0eg$B>iJ<{n`a28ij=}1HAo$@=K(y`>Hfu6QJ+uzjET$~ z^d%`pDWe>w%3xG<-%&`3^o#O3Fe~e5`1X;KNd}%q&Sy}0{K4;q`M@R`F%7s@-~CO1 z^AnW}UJ};}%y+y7!$b_y-v;8Slf60=fP4oXo{r6v&vl}$xu$eFAPt<7NSJyNqYvcU z^&jM`6=n>*l5C0M+tnw$ZL1zxWJ~xdvn|s%xT}U(HDQ0 zf&JfPop(jfGmVPX-c&5ui$5@hpSyOREGI(t_x5)8=I7_lJAmh6D1(q5sB4NQO})qY zo5!GXW#PMu=vHMqus|EhhmJ6dSr6NYd1-sc4j+#=5j${%hO&}!^g{^9e=L48Ou~ye4=+LuSRo~$*XUu0liZR5 zJVnn5a37L-`)3Cv6HeP$<$Q$JCV;vgC20PJ!_5`5whm_8MJ{b#y;@NzDMMl7U=3g{ zW`P;b7ZVfHxYjvdU+1;j@!~^7z z#*aiP@9vsy->B&5Oioz~IgNcV;{l+YqKd+6=KAd^i4C!;^KS1D!{@VK@DEfI1jpbC z_)X43#t`0g4SS5m-sZ}-d1qi)yxC=Q+t;(EU+_W-#fEs3D7290>C_nu2kL$vQOaWw zQ{?2v@ETgMpn@ahDkmf;DGryRPv z6Nux#w7J&A?2PcXr-dUZtGs8XaG6EH(kn?vQ@*AE>9orlw80!M-!bAD!S#>kEnDqa zKK%znr8An|XSZPC48EAIk&#?YdH%iTSOYQR2E4jvOV(TH5kQ;qlsy+C+3#7%rC)sy zD34D}tc!ld2{0{hLKv#7M|i#O zTh)yU!20Dk-Ga%bPFcR>pve?!Zzlm`MV_*OWH@eV!i$f!r zphA6+`N@qJu{SEU*o=l6=(!NT3O;>7nWgpIG~-c_f>R5O^gA|gWBnx zZ)%vGdT0DJvz7V87xkBb5yHQtD->N+}GPHumNcI<7qG-Bu-eRUUASmn6*B^q1p zrcS*F{BOOFR@p8Bxl7kN0hcWXF<_?L?oiD2#Gp^cEO~@W0h09f+;?)AM<3=h`~IwB zHuVLS*LoMU#$`(@#+)0u0@FN}3C&LO>Ie8y7MvB)XGfeSaY~lnFOT*<`DBm9=ve#? zcEr&!X@7q|T;>G#mpv(lwX|ld{vtXy>HGZeM2S)WvaILPFP968s8Fh`o2>>?{~;3b zn|B}@*$t8zB6bP7YHA)`Wg^`_O|N~JutT3M#TTMyaL%Npqy=?bS!vF@I5IxO!D8#w zKiitBGDjfo0Rx7moEDO2lS&i}g5RpF2C~YS@L%zSB^rU@esZvRev-|yu(;fljCN>2 z2(U@MtaCgMr07BKbO5u{U#6`p9L(biqK5!bhOa+k@j4u1r)2VJ6e0>Y8C}F6fl<-*jLd~_9t-5VwUw2**ird)Z15sjXG6Lr|g*yR2 zN_@V^^i$K*H#b_&j@F$|GHE^M=C(qIn#noc>h7Lp^T1DBI~)A2m~AQ<;|W4oZNu^3 zJB4*i9mY1L?8hKmn0Z{~G_(ftK4v-*-l;r#zrd=yC3g5D0w8On-`Ahv;R(a@>uh;6{;e0lyrsXR8a0QcSFk9upOONXuq)?+h# zI$TjnDVolwDXgOHaz{;COmXO*?tbCwp~QCG-#}|K&4_(Co)}1&#r(%Zq@eaVCgxVU zp)R3OGV0s6B9GY(247at&!i|1YBs>@1FPC4&~gnr9xnqe3B3M)<8uz$yg<*&|HsYP z|JQ@`m%sF3k4bdp1JJrNEyL|VY716jcMgK6`lG2J1YXGKl58|c&ZRSmbVT{Fz)x-4 zBNved-4e^c#>>7VaPK?k*f5GeH+pAZi2t&ea2}p?L;%dd2O>}s!?X;7^5avKs;czr zF|g8Pd-Uj+&Dh+isT>?X7Szh(9*VS~HE`Hk3PWAnpN3s>DF5^4liW{=%~>~F{n+!c zASRz)Hrm8{KGh~oEw1ar3yX`<_yQ1$W6UNhwu_S8)<*G2E?%2&5d}mIW1y7AA?A*% z=+^##N`xQCz-@vwnqG<7>bH;AV8A3Cc(}S>_`1XQHr=I@RUt{~UnLDLebCsPDC-jh z-qzfeY5J4F-z8eiXdm`(C4SV zJ-m)|Oe&*m~cyRm-HK4FOdfY>AMBg!gFC zgUB$x${l|1Q?SI(gRq`a>NIGNx6-V!_M*REV=>dYTdWk^3F&0%wfH^}tWOQoJg?sK zTy~59Y5`BVj;TSsEwhs{%kR+9&TinkXbw1%eB9hR)h=VcM>6|I$HAlx^;@6jzgkU- zI!`9w0SlR4p%Hc)fwNuhUu=Z3QBg5eB2Y11)cEbek9~-M2GL&6%-=j=Ei+U znrzjsOB;&FY+~JIeDDFWpj^RsFKncJpk~`sR;_@0{#+lNa!eUkhtI%w05 z>#CR@BZ(@9AsDTxaQIeH&tEkoUrrkcl;FP;1=m7Y@~&fRM&NF?^bPeLTL+4f*^&kN z70*?^DJfBai zQy?fIqGWnkt^>dL82+1m3Jfx-BJ(|M^8@{Xw(2p3N}8^&k62**o0rG!-PxiX9|f_s z8!HL8TokUTqG&bPwsBEq8dT2CETaKmNWShlULJ;~26*oF-AW!{SM?%O;oc}KB;W!HBE&-k}$;-0~p?bS*HLxDQ{s00g|vaT}0%2!i5bY!Vq& znzVh+$6*l80%0RpB~hF`*~ModOF66O*xqiT@$LEP!KU9Ym(mt4`553B9DZu$9r|(w zn7>b$@(Xl*14@~8fk7tGM*29hm$3?1-XC$x1P5D?-O8OD&riv`&mHcVBvmicy40o5 zCfwTW87KUHFt6&TY5KTK?4wqzorG`SdJAk()voKW`$RpO9ubXJ069(+14IkXa1b36 zlJH>8mjU=;`6D|3XnqZZksua+m$Sp$Tu(t#_ot+h^8xj)sMX*~4ix;MlbKG~<+Egg zUYWRzjLflBeumzzC}6|Z1mzp!%K12xWDq9De~1pBxn&+ruL>k1{!*MRXF{iVpKuEn z{w~vdZa?`;msx-xht)OD$ToCs4gl3BMm|2ZzL^1r&v=L5u78=^!qyCew7p>MnAInZ z+p0P(Nv4K|z}Vg1GXec!tB^>P_!8ZRQXgPuyIp5rZp19UpVBuCFMd1b{|tTp6cFV> zJy-=6epGI&%U1U{gs;B4qa!kb+XNteWx~A5ypQY%+8t1WMgIfk=PIl>37<9-a;pD( zYEAHs2JC3b(^1Xc{nQKW5wLTH3#{z{&*6fUl$oy*+v-Gz>R{6P`IACx#>+6iXIbCQ zkje(eSZmhql-sH(bPRTtVrHW=cfPXZ=EXC&qp8NkmLQF{4XDJ9Q-G5L%{h)(TcpqJ z%u<4!7Q@Sbv^{;+@cex9SqLp3C~;8Dg^sKrjI&%OQXz~g(UEBf3^mk9!m_)zE573O zmSOSR#T(fGKOPP+m;cieYEoy)6`nEkD~X&^@=dmaXWP@C&1 zp1SEN$TJUAsM>q;pR8pn#ohy2PrF>rm=AAw@|(AQ-6S{fOc1mD{fC1ees*~8F!7tXs|_?;Wiu@q&13Do1Iy5G z+F0PY=s>?xW)LYUlq=6K;;q-I_lb^5rzR5p7!y-`mSjvsw7UBK`(s>0WTeyh>hjey zADU82mG;ig+TFEvnPNLyaw4IBe0*?XmWh!+e(W6NYyi4<%{KzAkTXvJ6yyW;wTjBt5GtFA8;)-t zAyDQ)s+^m*dmu->36vCpRRXuuR7gsc@Cod62`_nISx$KW-^g+7JZWgWU0|3=WNiQ1 zBfaeMhdL8^x75oCib|MwNWym#jgA0^cfvnru7k8Hc>SN4`u|)9!Z`RpEw#0{5}&VzpGb&OT0kW>kyTPH4)^KUqhbP^q0qF*H5|on{`Rf^r@9Qi zU`Izs>0}WZw8KH%0nlgo@TPmaA8+)||J{D*YREUfq+8%H*WQ2s!bCZj@V|FU zhk`Lu{1Geb8TQ9klE@vt8FFKnWpL7V_KEUt;pYuTjP_jfM6u!_MjT$!37>Rx8 z5V90T%Wa_T!VsKgt0xjG-|niB1op*B{yBe|!MM_BnJl-J?=CPXTV^n~c%2sGcTb`; zmfLWZXJ5$X$74^O{=&}o->)#~S+U=^{dAW!J4*Lxxcgj7Ckm=vBiV8}QGI1vE^Ley z_9GgkRXlMb5nhERbQZQF4~w1Wv+_~eh2P&yq#AMsH%2;TCUL)d?-`4`W)?SOE&MuF zN7r?pH*rEi#jd|HwNt-%k8hb01i@Tr`t}Nb-FZ3s!xEdR+ODLOeb4V=W7R?^`J=D= zm&#y(5ch(Zj!13qHRqmJ-EE+;mFQx{%R*FGA-Xk>YV6J}IB1ogX_6Kx#TJxIPqmT4 z7w@O4>u#nk^XbII|6lEWS0J13`**r%DV=D|wra0$?NPK^)ZTk2!7I;_!cC0rxy& zb}WsT;*+efHnFn8WeFxz@!A4^ERzgoB)h0O>%6xedo1=gK4H|yzyIY-K4 z@jZq$KxWBi{?>1$DN8M>x+5cUOKVb{N7A|9WoTC}m3ZTi{kqNL7!euQAV0|ZIv*i2 zu^4Du^yb*r+{scT)hhbsh5zzCZ-perTjQ`w0Eo5p<8*&+T;abtbKE=}RvL7EwRU=Y zKTOI`>k@Un&auU%bPDVM{ZRr1P5(oub*dc=htG*eCe;vMqV%IjGq-}}WJR}anyOw> zCsexQ6#7dH(llb&9H3^h9zXi~4}B)keEv>;(H2sPclo4y9Fimek;n{qt{D`B`j=+2 zou7c<7vR~Jha9(TCT>w5#Shoi^mcd8d#fCXS{|| z1a!rjdhoNyAma?_L&yZ54tM2B%l45}vFMs?bJPGV$`QDyf2dRAj3% zdfk4frkbl!@95=r)-mr#=3-)4Tu~;~k6aJC0bHe7g^ozC*igiywx_C(($k5$>rR zxK9+tl#glx;7^tKj&Pafy4N+0biT z_ksTKCeSyZ27pvGE_p>J*2IVCkcN}vz@4=|9@(z+qj5;0BQ(;W@u14RdV7I-OrX%u zTXzpA&;qh$15ltKv5E3|q}~cX{sWU-|0+q)vOdc_g&x>zm^g%9i5`N&_CJaND^(v; zWLY66RcHtXHvqa!l-Bnfe|d$!fT`{g{C&OU1+O&*4c!| zkF8JBgkfdXndd?GC;*2SfKc9kEa5gb#w~Kttpuo6^;3`HU-}W?uckow#m{l$>pi2G z^M(4K7lq7|zv>#TWNl^YQcYk)oXiHvG_QZUlnoXWdP|?0+S)1r5(sDz)GfqqTQ~ckM`~Mqr=!}Ty|C_+MwN-3Fa(}g!#Oad_ z2x1Fh=K4@9YZ47^cgceF^Wm$LLk=#yZjcr-K|`j}BR4BV3dXygs7F`pPwdU{diD<7 z2cRN=nU04As~qgCB&S)*gYC^z^VRaJE|51&kcMH1SGMx?#sC7yEiNgO_sua^sy<&? z&K2@fdh!&TT_`cYF z8bN;TnMPc>@&{Ny1$U|-$DE0IJOk>amBHnKGE&a((?Ui*Sybaul6sPO$1151)(tr= zykcY$`Uz5vblBzu42}dVx2HBX>&5ke)#5%;u3^9`HFVErm{pK}hyM2MHlreoY8|}2 zT0${DH#h$zGU#2$eEW+Mz+j;_xV6?d2{@EMZ%lnY3kiAw%f4J6LR3oCsERJGvdY~Q zfR$jpaV4994Kn_LYDpO?vlOmF5PmyQ^ylrRT2=sg4gJJT$^D4+6~`jqfN}Zsez2H~ zgz6#Dbl@#APF|^+AkZvb-GK&dzElg07whL#pzB+4?vYQe%eJAxOZ%on zr*`$bU%m-g-H)jYQ5~1srbjaJ$pjf;tj76P235M-()=&01cY~r5B;G8GOst z?yHUfOT^_z35(?L*W1pU-Ua$cK5e3K@y_AM^le5!O$-rkFQ?1ofn6UmIro)4;+xr>|P<3-cb2{zn67Dm2G;U36{e> zc3FeQ7twM+_d4Ep4m{m!of8~-N-S$YWHN1BM)itf$jt2QXeHP%U(-E8LieT>V6OrZ z?g>MIWI(1_dP8k(XQEj~bYs5!0rIr~b0>lQetPl7a10P@tvw10n`#wz{=$iEId$w# zoR&t%)|U8dTtWR(B>Li==iu*HBay;_2(h=_&U^O=vSETz}-=7+e|9&!oI z8S(nK_FzA4jAR3$Lo-0s#!T9WgiM#yA*($md1fOmL>&w|05xcyuUWp1a}XHjvuM-_ ziAt%q7i(8fm-YA3)ckd>Ak}-(Am{3J*h7b=)OO<}dc{GC*390&O3f*&s zA`Nm)sWMuvF{nsYK#>c}E+Q@@QC#U_6@>3dqKPExL*cO_3BY{aiY%Jht z*_(wf)E!HhFF2hxj?eoK7r88~pqYSn%liF!f<6y?I2KLTLa(ps2{fNj-wV}al7Ogu z_*`PavqIaW*SOdoRpwq_*Ly61Xq))?BATU#R0e+m~(@0{5zi@`?J~WNN?vBb|>H z<6FDjp^RHvua6k>)!}rcgsf1p^0sn9)Ikbd#9t@f(gIMh^ybT3#cQc!YirDh9+^2^ zW_fY$N+&z^#`M|?8aVTVx;$)G`zXdGIb;-NlpZF*#x4trK zwf!*9r$xEO2lv6h$hrguuJq3%83abU8gY*u-3N_n5AsiBoSG5nu4HjlP0g>_mQpoI zSZf!3{y00FCd+7>PDW=q^9!+d(a)Q6mw^gu&BC#_I5n>2S>0Fm{%UV81ZiC}6zHOl z_zKU{NC(oy?okSw8k;HKjeA7i+0v&k&FDRx?0hMF!Ta8W4K#iGm%A@i5n}!mUzbG| zh8Is9>X}y$gAYC>Z98>Ya#!@#8sIixCJgg*aJL!@^NZXY(V`6|CeFQRaNgvLfVvF< z+W=j-yq=g=z|QOtYER>n;*9-#?B9~g(P7xmTOn`NA^{n*#wU|bHPh=}b_~)IO;teL zE`85a#JlES_yVB^?;7^}t83ahOyM2Guh}o9zVn(!C9*629u}7O{>E`hFvz|vosA^r zT`7=)^Y-yct^h1YsoHoew}JNzb&YG!L`^olpPx(?T>?Vq-u2ENced{9zK@CUC$_Kl zV^GXI?H=k|n76Smr`<78nSg33zxzJ)U1yb>qxT07c~rWt7Okhl9IHDK@JS;RioVc1 zp;gk;J5Co;lsBQix#ur)O`%bZw%sAZvB$(2F6Ufa#O@)5s_;>+Itp}1akEE7>$W8B zC?+M{C9Mv@WkMs4G=7um85oX(5+dd$jjNvRZu#lxc>M$Eu zvfeu}CdqN3t!?U}iwjTrxKe}K$&rKI7c@WDtI=v#gKACUrcva0cvGT+2})s(EdiLJ z-z_|@etk1^!s%POI8K_5$~GDidx0LS8sC%iSNaQuqcXEZTpDW84tk&3Exz`KX=FI? zob*hM*udX!glt7-wuG%?_jB8gsmMRT+H+(cPFw zv(V+F`D=y8M2(zJ4MntMxa*Cpt|iNuUE(aN%e`7a`;=F^t4qj5R^}YOw5JFydESkq z3VrCz<$Z#jH510@5qcEfyEfER)Rkx{+i2x_EI#mDb<60WUZ=E=;;_4}u3q&bhmdW{Y_Xgv?T1^qc^i8JcDIwN&gY!flPz6s?k^CESc1I-k-B zkl+XpL-;ErKA)w6y77Xj;$1{Rf8am)jiZMLwqc}N za9c0cQ!b1YB_L)1_mYm)Mz)!99n_Gonl=J$KCXjQoVz8xuKBrYmI z$85@<%xjHsaCrzeU4H(=fA^{C#$^hIL?bb1ev+|Tj27E#S$Qwi+gI>|u@)QmA zwJpIkAxoSK&k@cf*Giv0G&-6mB2pK`v&h~X9`hT3^l9s719sUr#y2bf1nRgxS#@`p zl?xvJRa7pK`9{Em#+*aY{c7vzs8~HtM1*ycbxHm*7nR3>b|pu($Td@xlJWEtuHyHMbb{p*!ZHkKREvOu46im(S1?yNEfK5%S5S~=35K0Ly zf0rs!Z9*|gv6T0M($7J7=jdcOG<^N!O@6Ws%$WD~D!&pb+Lp-NBr!`E9U)28y1#z* z?2$lZG~MV=x;L|aS6yKjdq)Rt$!tn6#RJsyaxax?;z4M4T5zRER%PLJq-mvP-*g#d zw$NfavkZ&lkR~vX>rcV7Z8qG+pVHh-PIV&FG{*ScLOlkl=d4S4g z4U4niW?jNz2;b)U!yJp~xS*pM@UpWPp(5B|i<1XLJt~GT9+_2*b-| zJn&{C*JX0osx(7!_`61!S^Xns+FaL_FG+62frv)2W;fVm{x!4Q13#l}g~%yivfjDp zv->O6yKrpyPZn@{DET*h^ihGB-LMm-{;0R57b5v!e!c?=7u#6*1io?mcd8x*dgo(S zenKUZ53v%fdJCM$ebsf!4sL0LT4;~w5%YxKI$f}tC?Gl;wYg%#@TA$JEQ(ZgJEdYl3N$HoP_MJ*Ggjie?Nhfo&sO4#j+>v^itfJq zc*|;u;M?KPv>y}nR%~(k4U0(^tidR|{GgMos62iK3H~g75$_&gsx%+_)5g}Tn7tq> z16Y2jqiIR_9rNRcKNCh>3{nF+GMo`UGc%imn%=lz`2Q zB)jL4+;6ODjt*7=%MDGiWM*0?u3jM=7TT~F)3#p&mYdJW8=JAJCs9?SH;hUOnB6PA zF7{%Ej6+Mle&ek?_%QqD0F+u{vOVhUYmIYZU=c;E<}YKK^HRQ4v>>SacfMKIusO1< zzb{&V1)ByZ&X4tYiLQ%5xU|u?MsnBW;P8QOOdj7Cs$LEWE`+Se`1grTUAkyJh0jm*=x>l=ZgJMh7MTVPWv0YlJ)d-aj)uvo0x zY6B&plT0`P&Bh3%XG5ucOQ$&UJ_CS!TT6in_*buV>9s`Y_!;s`zw^#IWGmIHqa{l3}O2_+u9M>B?N+(e}Lf z;&cO3qQUU~@f#=bb>vLW(vqCX&=4W1m&s?2by_J3FbMLxUh1trZT6g%G<9ooLRRTH z=l%}2zI2C07r{UwA0V2adHyNZP*G;~@w%0(V)l*dRn2knyre=k-gLPjvO?XfpPQ|0 zfOA>wm9xSqxlTWPa5>|<-}bSqq0rdLM1XBRT+BLcoji`ey+@Rsl$Ou)-+>S3#24jIDvhj@JGKBS&XGkkEoW=9^|&dv9sW^a0wf0)bo zgz?@$pANjKg-_pA>c{Z%pF=lD=AQ>WbKS)Vn}&vQO&x`2hKO>vOE=L4CL5mtuFPZF;ocQ%T+kB77K7SG3zaObJGD7hK)hHHEQUyA??oES6S* z3O?)l8INeZa4gFh-_0gvwh*(OLCR)xm(r9fSlvAEM4gL&gmgb}e%OBit-j)7B26n# zt5HB=U8#g2(Y-5+OD*nm%Ii0jDxz?uGI-bR!L$Nw3sYc&safJAn`FJHuV*Q?B#(N@ z#JveMPyH^sNewQ>#qxtQ#s5K!@4DRlk-GG4Cc$bSgDFjML7yBdvxo_*%_qi3kwndZ0t4u#VwklP&mGBpB z0$Ryc?Oc+Vg{q)v7K@v8%NR5E-!;c~RKzk?Fs>Ks2Rbf%U1-NFBN^QV^1Nq9)zL!f zs-YNj7^V0k4;<`99ASt=Ll2*V2RK<~$~zxA0W4;+qW3Kq-_ zsL=t4-%BBE(#iE=s@&w zu(dmgbSz>PY#CK)^R{Watn5B)_<+Ci-EC^csLZCum=ydSnu`;4a>zl*Y*6)#idZk2 z#Zb);Viv>+Czc7V;7l2rSisD9KX0y^WvnU|4JVszFSW;wHHHNbLmXi+S@6_K(Q6pP z2n;rZ(_(iwu$xdKT_5z;!2*bXNcqb<`&N z)49rvRq%za_e|Kw7W_$)!Dy{;(pcv}4QGCXN^Zv}HVrR6W-5%45tlCTMQQj4ZrS3v ztOW#0z+w{^==ib<(j2khC#_@ASBraHaT_Z0bINDWC;Sjd8y?IrdX5@G8>XcF z>XXZYowkrnXx7$F0R6&_;$Ezb)Lqgpvf?RbH^xp>){kO7C5%;l*I1o!JRYrr2U+cs z{akDaQs)aU7d5C$nbyVkQA8Q$-xj-Yz}lz0F@`VHT-7LW>?gHeY?}Yaj6d#({Ej1V zocJa8+JiyQADdp-4(6yJjYycGNNIIqKh?-6c=y}@flw!{gS<4*XT~RgJ%@{PlfHEJ z+$0_Ndci<8h1L7x&3MYsX;P02xY`VU*OPu2G_9OgA*EZq4l@fIkR?P{qdcOoQ;~<8 zlo4Oy*X)hG*RLnue_lXbSWU5vO-ruHpvZN6Len*9MPy?7!)KHi;ws#8-g_;CrF*jLD8eKB*fQcFEfY_xfnt4B;;{$QH2eH85T z_~k*C*B!CvN=g*|MDiDCYmD>5vT;M?I(`iWLBMxLxcmpgL$=(0RJ$X@mMgIacWI#) zGZXtNA>0-y^%vDnpl53 zzxkSmIExl5<&NV0)H`f-k3}-kk9LF0{Ldvyjp?ieNLNqQ zXZf(97N6=_g>UNuL)nMJqcmHrU7?Ej0gB)vBmt zb`jYlpTz!FVaaRRiLfUUG6k^aK7yg>gqc1d^71x8;hFRyVCZ^QuxV5lE#3 zSkwPpHcE>e8k6?dM94jFcV~iB?syYd=2b4a!E~{qoBSyq%g+jfzLoMev9p&A4)NEx zzwS~+n}H+fp;bxSzK;>5yV{U3AM z3hDbG6 ziQ{@uK1$CAj&9ClAW#ib4pX@fU5rTXCT8@8nMPGZEX~XarXJbn-)!go%upB@@@EU) zEm71bpX_Cu?Xo?V9c(_@D7ZF()rI}DA@h{!t0wR9cA|gOtn1@5rBBEd;pA2BA$-0Q z(6pBS>ku#)U>R*duJ&|jWV5HetZ+s_3`8Zk-03B>+iLZ0X*E;x*2e+WK zCZ%(usqLCvS5ugnoJL&s-Q3+cYip%L_ulNP<@TS19Q4KRx46b*L*pL$PrSRgbJVxZb;VSFt%y?c?mg(nrC z3Ic7y=0E$90TfU`=ex3LzCe0s4Al$3|c%J1{?1X~UcAH-;rMtEl# zlu1L+Z5MH$J)Fuhe2MvaTtZ~B@5cIa)O?Q|CVNgQ#4E?R5@J3^Ai#+2J39k=o7$Zl zyJ8dbc+selqzGgpm$EVi&0*hjnYy55UosiBDu)}mb2cbfDID{JNV_Dr=4u(~Fe4$Y zWh`PnyeV^T+MMK~V3aRr*U(^5sGn!di|vN{S#~6Wq>T3~a zv4AeAjlk2Ed1uirLsq5>pzmg_Dz>0ki&t9?;#`1nU!MrdDJXohT3@W5^5Wq}$hN1Q zh@7aTHj5nnD&Zp+Z#Zc`A-xAwAl)%g?;wpEhQDRE+DH1Fq1lxsx< zan8tUGW5jurJHYny`-T8)M4%9B#rX(!uojV*!cL}s}!pg1^S{v9VNvOXApMsbo3h~r8j15s{_i>L!2wl6BZTKmLR=8X+)uj4GnRe zJGRpfI5odrzg>ewLHbCgs4bWJ7VXSv9I1E^Rvqoa+NqMp7BX89*j zl%Ht{x=<0CVI-2SntMhik2L@&do-=BER0z_D(0>$OOo6>-n?nfG5!1}Zz`uhS^txP zzM-+f!@>01_gpF0mjZ|>qJTesjk1)Ydx6647^-KK72SGG`r)DhK_KB11t$2!ddlwGXYC?6lr4MoIi&gVp7gk?0u-eV~8;pdA830nsPWpHqvsd7={{|*N3=| zrb^gdfB}4qAA)(z(d(5s=Ga2*PKHX>@8(ZEpA2{~f*Tie@<&pDzNY|@1YmgG1lc0q z!YAMS_@4XcQAOrqDWXv|jlHSNS=9W{H|xd2xucmlGat;*I-v;Rw&U5EHHn0d^2SHY zNYkpKSy-Otm#!&Y0@GZVW}aBwUKZ$n`(RodS{liq^gs-Us=&lAEidan4U&&X3?`fd zZQcW572kctQ9Q=W}ArcWh$BpG>N#9ayz6?+B#JA%aT3f>FYO?}of900V zbz5T01#hP|_C9rRQS8#@&XGh6NcT=6J26#d1`?x0B0OgL+#%WMbzwxLM%@!5B2PtL zzlcbpsABHUa-ml z?b$p6z85H<+wgHA;~HSsh0T!3>wtk_K|wIo)*mQ>c{w=P`8g`!hmMbT#_I8K$#kJ2 zk6#;OwT-1U<>j@1rur%hBd7zjKUS-CAn~0h=-R46FfnMzNdq@vrf(x|v2HaVuoqxi z5qP*jvMsBrsE|0d9Z6csZuMzjyftfAsIPQO;C5vAIAJ8|mPUi$!xS@ug#{c>{fh2e z#YnI;{1G6+Zik#7$?OJFXAL0BJ^3?q}bek(RXq2t*)Q7Zp|WC%O){ zZTj$LT8b3{CU*-2nt0CeZ?+y+FQA}+W9rI(5Vc%DJIQzf^j%cJqVk98Bj;aNHxO;13^T zAz}rV1xxw138z3w!Rb zpJa%P0^&Kl-BTLQLr*pTv7~>k(cE0>-@7@^n4Vb=$roU-M~c^9j`H)Pr&gSwQ0KH` z=C~Pgb?4f}u-Bh#J4JO zeL*LY<&QVGV_*MeV5e3#;+l(3@8GT)g*UvBhV{<&7j?O#EuHVeh-(MyhKJA&K z-Nrj__{s2T;+?-_Ia}48tAQRE7?KWoWyfU;eZf9HILUX%10nz187QE7m&)?$_xCgT z@JgiD5G42DcvLps0HcwQ`x7uGiB{*lb@}3h=@(^RM2doJWBw&1e_qD>!ywR_O-BAb zd!IL^o^DdO`-4*M4b#M1hpH{hj@Qnf2bygI1>4t)MwKJb=dhtrcf6#Y>#FNh*UodR zrc()R-_Ndj#g3->PQ0jw<5tS*i|V4GbBhwmy#cPAe(}pGE}Hq<)qlUCOAJ(fiwEW? zHGG4Yo@&HxP?9o9J0@V?-E58Biv&sxZ=crG)zwv18Sdt%AI))v?rf(E2=b#p z^uANLPao;vlcd`0QTaMW;qP=M3)?-Lg$kiZ5{I1yFPi;bqa^Wj|r!zr(mnkt+UkB%9K;VavK#NYl+=={F?yuItU~xjn^nuPcPAz zKDev6C4VxfwLX4G&X+%4K0U(8qZ;pMJ*1~+i2l@@{I+K!-wY^w4JZ*&OX}~f2zat1 z$CQTzsDth3N2n@iZ0PaO>0*VJJk(O>Qa~R9#K!VU?Ebc-L|ESCzw=e#GfL%o=%1=v zwu?O)I?b~>`NI~<64`upmC@SZ6+;Ea=Vkcc!eJn^ChIG{a1-8y^Mk~~QBum}(L(4c z-YV+Tr=zCHQ@D-6t6P!4*H~UCQi*HlUGBf~SGRe3mz>|cQcIKA;ef@WTDJ|4w-T`j zGm%1az+_q-uO$9?9-J9f_r&#Py!VJCXW-MnV+V%kQCAj%n5o`P6eB zLFsIGvqGls859#ZG`j)be5Bb{6h}QiE=wQ~1l|juEJudc0$FB6S0JBDO%13T8nwGi z3f-SiR8nhdYAW0b!OX}*Zqytz`Tpha#$DR;n-Rs|#9)ri8@mi@yuI{e6bD)NkEPcq zv23*O<8>;MIu{o52m~1!nP-{WncDnDnz}`t7yeSfoL>ksE5q38*VfenvLI?UXm8Wz z-t}PuL5(vOawXW!7jW9?BjaO9gPi};%$!g4ohmop`~Gd(MAh72IS*z%jJYKc>KhyN zR>O{ukH@?aP3%hGYYiCI75Gn~H?QQnCuY2Kq2jT3Khd!6zI+i)56c%*h!RgxNo>!D ztDKDmNR#Cija8X(8v|7~dv;3_5bf)j-$n=+UH$hVQiGMB0jW12^GBWD&FQK{e?MrN3dP`yEVxdTb~fsc`LBPu`NE(^spihr z9BIT*^1it^BXMngMKf2Iiz&aojiE)**VlJ#W5eL;X_9Zqf}HW+$IcG;zYb~U#V0q~ z-oJI(4-m+4?X8VMzFJy6OKr}D=G{5F9ZIFTQYmVoSHAzf;}O8?PCDm`c@JUpuO`_d zlsa;^41@V%e>3l=Ig2tfeMpkCl7{mpc95Z1rv%gg+$A-=4ISVA$bq9O3ko`U;%RUH z96BABqt|R(rq8=<#i5H8xPI9e>c?|z_(>JeBy`ld-kC2RbPp2Ev+pU0x>!c7o& zlydh$i|@CD&Q5>#68AUt8*)5(nDLWN$C9xU7ZpDN_d}L@Ob(jC{&1z;g`slvwuMbXITiq@qgN*08{U- zeKZjS{Vg{!ko9i@-sXRc4Bi4{(PRpwX(#mG^O^rS|MmcMBwGO2J^4$X=zni}%Xw}O vUYzmYpGh0QJ5NthBco%$9~5U!`2|oXSEqTo%Lb5P0|KciYCbPkunzkl;E!M7 diff --git a/tests-playwright/screenshots/desktop/login-onboarding-da.png b/tests-playwright/screenshots/desktop/login-onboarding-da.png index 805c6b54c28bb39903cf1c1e5f2dff7b0d044b1e..8805469f33fa9018562b27c74b0e60a4726191fb 100644 GIT binary patch literal 37058 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 literal 36300 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'PSJ{907*6s_Yt2kT^S3tjjNi z-yEM9p$9hB-0)E!FblwCouYC6rI7{0Q+#~2+c>SXp(i0jyjc_6XT{ z`IV)mCwz&UAfED?yRb1jngWSG4xXt`Z@AV$VUg>U!Zbg7`${7_s9+%t$Nw$jD#m8K zDEh0e2UI_~ zINfAvqas@7%T^1?3~kWbxV3ao_s4&&2of63sRYMduML*>0Q}K*`p6gIva)Vig*)Ns7lsl1%sLtG zC&Wq(_q+vnVjPP}N3)2|k$Sx@5A9U6$;N*7QeHwJ<|CcWV$!yT{s5 zkE7(@^9f?`r>c1ksRU}I6v-AASSkgfQD!M6Sm{T-$hTZF$}$P% zD-}`KdVMzSE$Z)w?9r3#0zyepH4E-hmN7)S)6t$sGYaXr2g)(mLgsy9==ieduw3` z*h--=Z$UOBjFPThDVbSGGb7BSRDl^dYWw%|gdy03yi$R}NPqh$KijgV+@Pdjr372Tms(Jm yfq&KF$Bn?&i;u^oc_$L(gG+ycZE{jDei7nHul6-wbbth4L0~F6%H@hr!u}7VQ0-{| diff --git a/tests-playwright/wallet-flows.e2e.ts b/tests-playwright/wallet-flows.e2e.ts index fed5675..9c8e995 100644 --- a/tests-playwright/wallet-flows.e2e.ts +++ b/tests-playwright/wallet-flows.e2e.ts @@ -47,7 +47,7 @@ const preparePage = async (page: Page, showOnboarding: boolean) => { const login = async (page: Page) => { await page.goto("/en?login=master_seed") await page.getByRole("button", { name: "Playwright test wallet" }).click() - await expect(page.getByText("Playwright test wallet")).toBeVisible() + await expect(page.getByTestId("wallet-actions")).toBeVisible() } test("captures the locale-aware onboarding and login entry", async ({ @@ -96,11 +96,10 @@ test("captures the claim verification requirement", async ({ }, testInfo) => { await preparePage(page, false) await login(page) - await expect(page.getByRole("link", { name: "GoodDollar" })).toHaveAttribute( - "href", - "/en/gooddollar", - ) - await page.goto("/en/gooddollar") + const goodDollarLink = page.getByRole("link", { name: "GoodDollar" }) + await expect(goodDollarLink).toHaveAttribute("href", "/en/gooddollar") + await goodDollarLink.click() + await expect(page).toHaveURL(/\/en\/gooddollar/) await expect( page.getByText( From 7a097e6222c4f01cc1a2b276713da8caaf9f3001 Mon Sep 17 00:00:00 2001 From: blueogin Date: Thu, 30 Jul 2026 17:43:35 -0400 Subject: [PATCH 09/11] fix: improve wallet flow test reliability and update screenshot - Enhanced the claim verification test by replacing direct URL navigation with a wait for URL method, improving test stability. - Increased timeout for visibility checks to ensure elements are properly rendered before assertions. - Updated the home balances overflow screenshot to reflect recent UI changes. --- .../desktop/home-balances-overflow-en.png | Bin 50622 -> 48940 bytes tests-playwright/wallet-flows.e2e.ts | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests-playwright/screenshots/desktop/home-balances-overflow-en.png b/tests-playwright/screenshots/desktop/home-balances-overflow-en.png index 8b9365eb3c171d185449f7854eacc2468b1e31e6..055f72cc161c80739c4399e7c68e5cd590337d13 100644 GIT binary patch literal 48940 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 TCpwFd@AFJe_etd=+n4_bffd7& literal 50622 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 diff --git a/tests-playwright/wallet-flows.e2e.ts b/tests-playwright/wallet-flows.e2e.ts index 9c8e995..5a4c6f2 100644 --- a/tests-playwright/wallet-flows.e2e.ts +++ b/tests-playwright/wallet-flows.e2e.ts @@ -99,13 +99,13 @@ test("captures the claim verification requirement", async ({ const goodDollarLink = page.getByRole("link", { name: "GoodDollar" }) await expect(goodDollarLink).toHaveAttribute("href", "/en/gooddollar") await goodDollarLink.click() - await expect(page).toHaveURL(/\/en\/gooddollar/) + await page.waitForURL(/\/en\/gooddollar/, { timeout: 60_000 }) await expect( page.getByText( "Before you can start to claim your GoodDollars you first need to pass face verification to whitelist your account.", ), - ).toBeVisible() + ).toBeVisible({ timeout: 30_000 }) await expect(page.getByRole("button", { name: "Verify" })).toBeVisible() await captureScreenshot(page, testInfo, "claim-requires-verification-en.png") }) From f7608adb765d629d1f45066e9829441ea4569d45 Mon Sep 17 00:00:00 2001 From: blueogin Date: Fri, 31 Jul 2026 11:20:22 -0400 Subject: [PATCH 10/11] refactor: streamline session management and enhance widget integration - Removed unused properties and functions from the RoundButton component to simplify its API. - Refactored session storage logic to improve handling of local storage and session retrieval. - Updated session context to eliminate unnecessary state variables, enhancing clarity and performance. - Introduced a test fixture widget for improved testing capabilities and validation of widget integration. - Enhanced wallet flow tests to include the new test fixture, ensuring comprehensive coverage of widget interactions. --- .../Form/RoundButton/RoundButton.tsx | 39 +------- .../context/SessionContext/storage.test.ts | 48 ---------- src/login/context/SessionContext/storage.ts | 56 ++++++++++-- src/login/hooks/context.ts | 1 - src/sections/Options/OptionsView.tsx | 12 ++- src/widgets/fixtures/TestFixtureWidget.tsx | 16 ++++ .../RestrictedEip1193Provider.test.ts | 69 ++------------- .../provider/RestrictedEip1193Provider.ts | 88 +------------------ src/widgets/provider/policy.ts | 44 +--------- src/widgets/registry.test.ts | 12 ++- src/widgets/registry.ts | 34 +++++-- tests-playwright/wallet-flows.e2e.ts | 42 ++++++++- 12 files changed, 158 insertions(+), 303 deletions(-) delete mode 100644 src/login/context/SessionContext/storage.test.ts create mode 100644 src/widgets/fixtures/TestFixtureWidget.tsx diff --git a/src/components/Form/RoundButton/RoundButton.tsx b/src/components/Form/RoundButton/RoundButton.tsx index afdaecd..7b76f59 100644 --- a/src/components/Form/RoundButton/RoundButton.tsx +++ b/src/components/Form/RoundButton/RoundButton.tsx @@ -6,46 +6,19 @@ import { Icon, type IconName } from "ui" export type RoundButtonProps = { onClick?: () => void - buttonType?: RoundButtonType icon?: IconName iconElement?: ReactNode text?: string - fill?: boolean indicator?: "connected" | "available" } -export const enum RoundButtonType { - Fund, - Send, - Receive, - GoodDollar, - Swap, - WalletConnect, - Predictions, -} - -const buttonIcons: Record = { - [RoundButtonType.Fund]: "Cash", - [RoundButtonType.Send]: "ArrowUpAlt", - [RoundButtonType.Receive]: "ArrowDownAlt", - [RoundButtonType.GoodDollar]: "goodDollarLogo", - [RoundButtonType.Swap]: "Swap", - [RoundButtonType.WalletConnect]: "walletConnectLogo", - [RoundButtonType.Predictions]: "Predictions", -} - export const RoundButton = ({ - buttonType, icon, iconElement, onClick, text, - fill = false, indicator, }: RoundButtonProps) => { - const selectedIcon = - icon ?? (buttonType === undefined ? undefined : buttonIcons[buttonType]) - return (
- {selectedIcon ? ( - - ) : ( - iconElement - )} + {icon ? : iconElement} - {indicator === "connected" || - (fill && buttonType === RoundButtonType.WalletConnect) ? ( + {indicator === "connected" ? ( ) : null} - {indicator === "available" || - (fill && buttonType === RoundButtonType.GoodDollar) ? ( + {indicator === "available" ? ( ({ - getItem: vi.fn(), - setItem: vi.fn(), - removeItem: vi.fn(), -}) - -describe("session storage", () => { - beforeEach(() => { - vi.resetModules() - }) - - afterEach(() => { - vi.unstubAllGlobals() - }) - - it("purges a legacy persisted signer session on startup", async () => { - const storage = localStorageMock() - vi.stubGlobal("localStorage", storage) - - await import("./storage") - - expect(storage.removeItem).toHaveBeenCalledWith("SIGNER_SESSION") - expect(storage.getItem).not.toHaveBeenCalled() - }) - - it("keeps private-key sessions in memory only", async () => { - const storage = localStorageMock() - vi.stubGlobal("localStorage", storage) - const { sessionState, setSession } = await import("./storage") - const session: ISignerSession = { - type: "PRIVATE_KEY", - sessionOrigin: "test", - signer: {} as ISigner, - masterSeed: "secret", - } - - setSession(session) - - expect(sessionState.session).toBe(session) - expect(storage.setItem).not.toHaveBeenCalled() - expect(storage.removeItem).toHaveBeenCalledWith("SIGNER_SESSION") - expect(sessionState.isLoading).toBe(false) - }) -}) diff --git a/src/login/context/SessionContext/storage.ts b/src/login/context/SessionContext/storage.ts index 7df4762..9a0db9e 100644 --- a/src/login/context/SessionContext/storage.ts +++ b/src/login/context/SessionContext/storage.ts @@ -1,14 +1,44 @@ +import type { Jsonify } from "type-fest" import { proxy, ref } from "valtio" +import { getPrivateKeySession } from "@/login/adapters/privatekey" import type { Addresses, ISigner, ISignerSession } from "@/login/types" import { resetWalletConnectDialogs } from "@/sections/WalletConnect/store/walletConnectDialogStore" const SIGNER_SESSION_KEY = "SIGNER_SESSION" -const clearPersistedSession = () => { - if (typeof localStorage !== "undefined") { - localStorage.removeItem(SIGNER_SESSION_KEY) +export const getSessionFromLocalStorage = + async (): Promise => { + if (typeof localStorage === "undefined") { + return null + } + const session = localStorage.getItem(SIGNER_SESSION_KEY) + if (!session) { + return null + } + const sessionJSON = JSON.parse(session) as Jsonify + return await fromJSON(sessionJSON) + } + +const fromJSON = async ( + sessionJSON: Partial>, +): Promise => { + switch (sessionJSON.type) { + case "PRIVATE_KEY": { + const { userName, profileImage, authProvider, masterSeed } = sessionJSON + if (!masterSeed) { + return null + } + return await getPrivateKeySession( + masterSeed, + "localStorage", + authProvider ?? "NA", + userName, + profileImage, + ) + } } + return null } type SessionState = { @@ -35,7 +65,15 @@ export const setSession = (session: ISignerSession | null) => { sessionState.addresses = undefined } - clearPersistedSession() + if (sessionState.session) { + localStorage.setItem( + SIGNER_SESSION_KEY, + JSON.stringify(sessionState.session), + ) + } else { + localStorage.removeItem(SIGNER_SESSION_KEY) + } + sessionState.isLoading = false } @@ -44,5 +82,11 @@ export const logout = () => { setSession(null) } -clearPersistedSession() -sessionState.isLoading = false +if (typeof window !== "undefined") { + getSessionFromLocalStorage() + .then(setSession) + .catch((e) => { + console.error("error getting persisted session", e) + setSession(null) + }) +} diff --git a/src/login/hooks/context.ts b/src/login/hooks/context.ts index 51f16f1..db71aa9 100644 --- a/src/login/hooks/context.ts +++ b/src/login/hooks/context.ts @@ -10,7 +10,6 @@ import type { Addresses, ISignerSession } from "../types" export type ISessionContext = Partial & { addresses?: Addresses isLoading: boolean - masterSeed?: string logout?: () => void setSession(session: ISignerSession): void } diff --git a/src/sections/Options/OptionsView.tsx b/src/sections/Options/OptionsView.tsx index 7539077..b7dac64 100644 --- a/src/sections/Options/OptionsView.tsx +++ b/src/sections/Options/OptionsView.tsx @@ -11,6 +11,7 @@ import { truncateString } from "@/components/Utils/format" import VersionTag from "@/components/VersionTag/VersionTag" import { type ISigner, useSessionContext } from "@/login" import { getPrivateKeyHex } from "@/login/adapters/privatekey" +import { getSessionFromLocalStorage } from "@/login/context/SessionContext/storage" import OptionsMenu from "./components/OptionsMenu" import styles from "./OptionsView.module.css" @@ -20,12 +21,14 @@ export default function OptionsView() { const { createToast } = useToast() const optionsTranslations = translations.options setBottomSheetProps({ title: optionsTranslations.title }) - const { signer, type, masterSeed } = useSessionContext() + const { signer, type } = useSessionContext() const { captureEvent } = useAnalytics() const [expanded, setExpanded] = useState(false) const [selectedChainType, setSelectedChainType] = useState() const handleCopyPrivateKey = async () => { - if (!selectedChainType || type !== "PRIVATE_KEY" || !masterSeed) return + if (!selectedChainType) return + const session = await getSessionFromLocalStorage() + if (!session || session.type !== "PRIVATE_KEY") return const status = await openDialog({ title: optionsTranslations.confirmation, @@ -35,7 +38,10 @@ export default function OptionsView() { }) if (status === "accepted") { - const privateKey = await getPrivateKeyHex(selectedChainType, masterSeed) + const privateKey = await getPrivateKeyHex( + selectedChainType, + session.masterSeed, + ) navigator.clipboard.writeText(privateKey) captureEvent({ type: AnalyticsEventTypes.PrivateKeyCopied }) setSelectedChainType(undefined) diff --git a/src/widgets/fixtures/TestFixtureWidget.tsx b/src/widgets/fixtures/TestFixtureWidget.tsx new file mode 100644 index 0000000..0fe168c --- /dev/null +++ b/src/widgets/fixtures/TestFixtureWidget.tsx @@ -0,0 +1,16 @@ +"use client" + +import type { WidgetHostProps } from "../hostTypes" + +export const goodWidgetMetadata = { + packageName: "@goodwidget/test-fixture", + packageVersion: "0.0.0", +} as const + +export const TestFixtureWidget = (_props: WidgetHostProps) => { + return ( +
+ Test Fixture Widget +
+ ) +} diff --git a/src/widgets/provider/RestrictedEip1193Provider.test.ts b/src/widgets/provider/RestrictedEip1193Provider.test.ts index 83b60f0..e52c385 100644 --- a/src/widgets/provider/RestrictedEip1193Provider.test.ts +++ b/src/widgets/provider/RestrictedEip1193Provider.test.ts @@ -22,11 +22,10 @@ const signer = { const allTestMethods = [ "eth_accounts", + "eth_requestAccounts", "eth_chainId", - "eth_getBalance", "wallet_switchEthereumChain", "personal_sign", - "eth_signTypedData_v4", "eth_sendTransaction", ] @@ -70,21 +69,11 @@ describe("RestrictedEip1193Provider", () => { vi.clearAllMocks() }) - it("exposes only the active account and forwards reviewed reads", async () => { - const { provider, rpcRequest } = createProvider() + it("exposes only the active account", async () => { + const { provider } = createProvider() await expect(provider.request({ method: "eth_accounts" })).resolves.toEqual( [address], ) - await expect( - provider.request({ - method: "eth_getBalance", - params: [address, "latest"], - }), - ).resolves.toBe("0xresult") - expect(rpcRequest).toHaveBeenCalledWith(1, { - method: "eth_getBalance", - params: [address, "latest"], - }) }) it("enforces each widget's configured method subset", async () => { @@ -93,8 +82,7 @@ describe("RestrictedEip1193Provider", () => { }) await expect( provider.request({ - method: "eth_getBalance", - params: [address, "latest"], + method: "eth_chainId", }), ).rejects.toMatchObject({ code: 4100 }) }) @@ -138,7 +126,6 @@ describe("RestrictedEip1193Provider", () => { chainId: 1, to: address, value: BigInt(1), - gas: "0x5208", }, ], }), @@ -149,7 +136,7 @@ describe("RestrictedEip1193Provider", () => { expect(prepareTransaction).toHaveBeenCalledWith( 1, signer, - expect.objectContaining({ gasLimit: BigInt(21000) }), + expect.objectContaining({ to: address }), ) expect(signer.signTransaction).toHaveBeenCalled() expect(rpcRequest).toHaveBeenCalledWith(1, { @@ -168,7 +155,7 @@ describe("RestrictedEip1193Provider", () => { ).rejects.toMatchObject({ code: 4001 }) }) - it("rejects mismatched signing accounts and typed-data chains before approval", async () => { + it("rejects mismatched signing accounts before approval", async () => { const { provider, requestWalletApproval } = createProvider() await expect( provider.request({ @@ -176,32 +163,6 @@ describe("RestrictedEip1193Provider", () => { params: ["message", "0x2222222222222222222222222222222222222222"], }), ).rejects.toMatchObject({ code: 4100 }) - await expect( - provider.request({ - method: "eth_signTypedData_v4", - params: [ - address, - JSON.stringify({ - domain: { name: "Widget", chainId: 42220 }, - types: { Thing: [{ name: "value", type: "uint256" }] }, - message: { value: 1 }, - }), - ], - }), - ).rejects.toMatchObject({ code: 4100 }) - await expect( - provider.request({ - method: "eth_signTypedData_v4", - params: [ - address, - JSON.stringify({ - domain: { name: "Widget" }, - types: { Thing: [{ name: "value", type: "uint256" }] }, - message: { value: 1 }, - }), - ], - }), - ).rejects.toMatchObject({ code: 4100 }) expect(requestWalletApproval).not.toHaveBeenCalled() }) @@ -267,22 +228,4 @@ describe("RestrictedEip1193Provider", () => { expect(listener).toHaveBeenCalledWith([]) expect(signer.signMessage).not.toHaveBeenCalled() }) - - it("rejects conflicting gas fields", async () => { - const { provider } = createProvider() - await expect( - provider.request({ - method: "eth_sendTransaction", - params: [ - { - from: address, - chainId: 1, - to: address, - gas: "0x5208", - gasLimit: "0x5209", - }, - ], - }), - ).rejects.toMatchObject({ code: 4200 }) - }) }) diff --git a/src/widgets/provider/RestrictedEip1193Provider.ts b/src/widgets/provider/RestrictedEip1193Provider.ts index 3327d16..af7b3c7 100644 --- a/src/widgets/provider/RestrictedEip1193Provider.ts +++ b/src/widgets/provider/RestrictedEip1193Provider.ts @@ -1,8 +1,4 @@ -import type { - TransactionRequest, - TypedDataDomain, - TypedDataField, -} from "ethers" +import type { TransactionRequest } from "ethers" import { getBytes } from "ethers" import { copyRequest } from "ethers/providers" @@ -11,11 +7,7 @@ import { getEthersProvider } from "@/ethers-utils" import type { EVMSigner } from "@/login" import { WalletWrapper } from "@/sections/WalletConnect/utils/WalletWrapper" -import { - WIDGET_EVM_CHAIN_IDS, - WIDGET_PROVIDER_METHODS, - WIDGET_READ_METHODS, -} from "./policy" +import { WIDGET_EVM_CHAIN_IDS, WIDGET_PROVIDER_METHODS } from "./policy" export type ProviderRequest = { method: string @@ -156,18 +148,6 @@ export class RestrictedEip1193Provider { }) } - get chainId(): number { - return this.#chainId - } - - get supportedMethods(): readonly string[] { - return [...this.#allowedMethods] - } - - get isRevoked(): boolean { - return this.#revoked - } - on( event: "accountsChanged" | "chainChanged", listener: (...args: unknown[]) => void, @@ -220,16 +200,9 @@ export class RestrictedEip1193Provider { return this.#switchChain(params) case "personal_sign": return await this.#signMessage(params) - case "eth_signTypedData_v4": - return await this.#signTypedData(params) case "eth_sendTransaction": return await this.#sendTransaction(params) default: - if (WIDGET_READ_METHODS.has(request.method)) { - const result = await this.#rpcRequest(this.#chainId, request) - this.#assertActive() - return result - } throw new WidgetProviderError(4200, "Unsupported widget request") } } catch (error) { @@ -352,51 +325,6 @@ export class RestrictedEip1193Provider { return signature } - async #signTypedData(params: readonly unknown[]): Promise { - const [account, rawData] = params - if (typeof rawData !== "string") { - throw new WidgetProviderError( - 4200, - "eth_signTypedData_v4 requires JSON typed data", - ) - } - const data = JSON.parse(rawData) as { - domain?: TypedDataDomain - types?: Record - message?: Record - } - if (!data.domain || !data.types || !data.message) { - throw new WidgetProviderError(4200, "Invalid EIP-712 typed data") - } - const context = this.#captureSigningContext(account) - const { EIP712Domain: _domainType, ...types } = data.types - if (data.domain.chainId === undefined) { - throw new WidgetProviderError( - 4100, - "Typed-data domain must declare the active widget chain", - ) - } - if (Number(data.domain.chainId) !== context.chainId) { - throw new WidgetProviderError( - 4100, - "Typed-data chain does not match the active widget chain", - ) - } - const approvalParams = [context.account, rawData] as const - await this.#requestSigningApproval( - "eth_signTypedData_v4", - approvalParams, - context, - ) - const signature = await context.signer.signTypedData( - data.domain, - types, - data.message, - ) - this.#assertSigningContext(context) - return signature - } - async #sendTransaction(params: readonly unknown[]): Promise { const transaction = params[0] if ( @@ -408,7 +336,6 @@ export class RestrictedEip1193Provider { } const rawRequest = transaction as TransactionRequest & { from?: string - gas?: string | number | bigint chainId?: string | number } const context = this.#captureSigningContext(rawRequest.from) @@ -421,20 +348,9 @@ export class RestrictedEip1193Provider { "Transaction chain does not match the active widget chain", ) } - if ( - rawRequest.gas !== undefined && - rawRequest.gasLimit != null && - BigInt(rawRequest.gas) !== BigInt(rawRequest.gasLimit) - ) { - throw new WidgetProviderError( - 4200, - "Transaction gas and gasLimit must match", - ) - } const copiedRequest = copyRequest({ ...rawRequest, chainId: context.chainId, - gasLimit: rawRequest.gasLimit ?? rawRequest.gas, }) const { from: _from, ...unsignedRequest } = copiedRequest const populatedRequest = copyRequest( diff --git a/src/widgets/provider/policy.ts b/src/widgets/provider/policy.ts index 546e6c3..bcf4416 100644 --- a/src/widgets/provider/policy.ts +++ b/src/widgets/provider/policy.ts @@ -1,40 +1,7 @@ -import { - BASE_CHAIN_ID, - BNB_CHAIN_ID, - CELO_CHAIN_ID, - ETHEREUM_CHAIN_ID, - FUSE_CHAIN_ID, - HOODI_CHAIN_ID, - OPTIMISM_CHAIN_ID, - POLYGON_CHAIN_ID, - SEPOLIA_CHAIN_ID, - XDC_CHAIN_ID, -} from "@/chain/chain-ids" - -export const WIDGET_READ_METHODS = new Set([ - "eth_blockNumber", - "eth_call", - "eth_estimateGas", - "eth_feeHistory", - "eth_gasPrice", - "eth_getBalance", - "eth_getBlockByHash", - "eth_getBlockByNumber", - "eth_getBlockTransactionCountByHash", - "eth_getBlockTransactionCountByNumber", - "eth_getCode", - "eth_getLogs", - "eth_getStorageAt", - "eth_getTransactionByHash", - "eth_getTransactionCount", - "eth_getTransactionReceipt", - "eth_maxPriorityFeePerGas", - "net_version", -]) +import { CELO_CHAIN_ID, ETHEREUM_CHAIN_ID } from "@/chain/chain-ids" export const WIDGET_SIGNING_METHODS = new Set([ "personal_sign", - "eth_signTypedData_v4", "eth_sendTransaction", ]) @@ -43,19 +10,10 @@ export const WIDGET_PROVIDER_METHODS = new Set([ "eth_requestAccounts", "eth_chainId", "wallet_switchEthereumChain", - ...WIDGET_READ_METHODS, ...WIDGET_SIGNING_METHODS, ]) export const WIDGET_EVM_CHAIN_IDS = new Set([ ETHEREUM_CHAIN_ID, - OPTIMISM_CHAIN_ID, - XDC_CHAIN_ID, - BNB_CHAIN_ID, - FUSE_CHAIN_ID, - POLYGON_CHAIN_ID, - BASE_CHAIN_ID, CELO_CHAIN_ID, - SEPOLIA_CHAIN_ID, - HOODI_CHAIN_ID, ]) diff --git a/src/widgets/registry.test.ts b/src/widgets/registry.test.ts index b8c9ab7..ee81681 100644 --- a/src/widgets/registry.test.ts +++ b/src/widgets/registry.test.ts @@ -3,9 +3,7 @@ import { describe, expect, it } from "vitest" import { coreDashboardActions, createWidgetRegistry, - DEFAULT_WIDGET_INTEGRATION_MODE, defineWidget, - resolveWidgetIntegrationMode, } from "./registry" const widget = defineWidget({ @@ -27,7 +25,7 @@ const widget = defineWidget({ description: "Reserve", icon: { kind: "system", name: "Cash" }, providerPolicy: { - chainIds: [1, 42220], + chainIds: [42220], requiredMethods: ["eth_accounts", "eth_chainId"], }, }) @@ -54,10 +52,10 @@ describe("widget registry", () => { expect(createWidgetRegistry([widget]).get(widget.widgetId)).toBe(widget) }) - it("defaults to Web Components and permits a reviewed React override", () => { - expect(DEFAULT_WIDGET_INTEGRATION_MODE).toBe("web-component") - expect(resolveWidgetIntegrationMode(widget)).toBe("web-component") - expect(resolveWidgetIntegrationMode(reactWidget)).toBe("react") + it("accepts web-component and react integration modes", () => { + expect(widget.integrationMode).toBeUndefined() + expect(reactWidget.integrationMode).toBe("react") + expect(createWidgetRegistry([widget, reactWidget]).size).toBe(2) }) it("rejects duplicate IDs and routes", () => { diff --git a/src/widgets/registry.ts b/src/widgets/registry.ts index 28ef92d..51046d9 100644 --- a/src/widgets/registry.ts +++ b/src/widgets/registry.ts @@ -1,6 +1,8 @@ import type { ReactNode } from "react" import type { IconName } from "ui" +import { CELO_CHAIN_ID } from "@/chain/chain-ids" + import type { ReactWidgetLoader, WebComponentWidgetLoader } from "./hostTypes" import { WIDGET_EVM_CHAIN_IDS, @@ -9,9 +11,6 @@ import { export type WidgetIntegrationMode = "web-component" | "react" -export const DEFAULT_WIDGET_INTEGRATION_MODE: WidgetIntegrationMode = - "web-component" - export type DashboardIcon = | { kind: "system"; name: IconName } | { kind: "local"; render: () => ReactNode } @@ -56,11 +55,6 @@ export type RegisteredWidget = RegisteredWidgetBase & export const defineWidget = (widget: T): T => widget -export const resolveWidgetIntegrationMode = ( - widget: RegisteredWidget, -): WidgetIntegrationMode => - widget.integrationMode ?? DEFAULT_WIDGET_INTEGRATION_MODE - const EXACT_PACKAGE_VERSION = /^\d+\.\d+\.\d+$/ const ROUTE_SLUG = /^[a-z0-9]+(?:-[a-z0-9]+)*$/ const RESERVED_WIDGET_ROUTES = new Set([ @@ -144,7 +138,29 @@ export const createWidgetRegistry = ( return registry } -export const WIDGETS: readonly RegisteredWidget[] = [] +const testFixtureWidget = defineWidget({ + widgetId: "goodwidget.test-fixture", + packageName: "@goodwidget/test-fixture", + packageVersion: "0.0.0", + routeSlug: "test-fixture", + displayName: "Test Fixture", + description: "Playwright widget host fixture", + icon: { kind: "system", name: "Cash" }, + integrationMode: "react", + entry: { + exportName: "TestFixtureWidget", + load: () => import("./fixtures/TestFixtureWidget"), + }, + providerPolicy: { + chainIds: [CELO_CHAIN_ID], + requiredMethods: ["eth_accounts", "eth_chainId"], + }, +}) + +export const WIDGETS: readonly RegisteredWidget[] = + process.env.NEXT_PUBLIC_PLAYWRIGHT_TEST_MODE === "true" + ? [testFixtureWidget] + : [] export const widgetRegistry = createWidgetRegistry(WIDGETS) export const getWidgetByRoute = ( diff --git a/tests-playwright/wallet-flows.e2e.ts b/tests-playwright/wallet-flows.e2e.ts index 5a4c6f2..47d2ff5 100644 --- a/tests-playwright/wallet-flows.e2e.ts +++ b/tests-playwright/wallet-flows.e2e.ts @@ -50,6 +50,28 @@ const login = async (page: Page) => { await expect(page.getByTestId("wallet-actions")).toBeVisible() } +const openTestFixtureWidget = async (page: Page, testInfo: TestInfo) => { + const walletActions = page.getByTestId("wallet-actions") + const fixtureLink = walletActions.getByRole("link", { name: "Test Fixture" }) + + if (testInfo.project.name === "mobile") { + const actionsToggle = page.getByTestId("wallet-actions-toggle") + await expect(actionsToggle).toBeVisible() + if (!(await fixtureLink.isVisible())) { + await actionsToggle.getByRole("button").click() + } + } + + await expect(fixtureLink).toBeVisible() + await expect(fixtureLink).toHaveAttribute("href", "/en/test-fixture") + await fixtureLink.click() + await page.waitForURL(/\/en\/test-fixture/, { timeout: 60_000 }) + await expect(page.getByTestId("test-fixture-widget")).toBeVisible({ + timeout: 30_000, + }) + await expect(page.getByText("Test Fixture Widget")).toBeVisible() +} + test("captures the locale-aware onboarding and login entry", async ({ page, }, testInfo) => { @@ -76,11 +98,14 @@ test("captures the authenticated home balance and responsive action grid", async await expect(page.getByText("$124.68")).toBeVisible() const walletActions = page.getByTestId("wallet-actions") await expect(walletActions).toBeVisible() - await expect(walletActions.getByRole("link")).toHaveCount(6) + await expect(walletActions.getByRole("link")).toHaveCount(7) await expect(walletActions.getByRole("link").first()).toHaveAttribute( "href", "/en/gooddollar", ) + await expect( + walletActions.getByRole("link", { name: "Test Fixture" }), + ).toHaveAttribute("href", "/en/test-fixture") if (testInfo.project.name === "mobile") { const actionsToggle = page.getByTestId("wallet-actions-toggle") @@ -91,6 +116,21 @@ test("captures the authenticated home balance and responsive action grid", async await captureScreenshot(page, testInfo, "home-balances-overflow-en.png") }) +test("opens the registered test fixture widget from the dashboard", async ({ + page, +}, testInfo) => { + await preparePage(page, false) + await login(page) + await openTestFixtureWidget(page, testInfo) +}) + +test("rejects unregistered widget routes", async ({ page }) => { + await preparePage(page, false) + await login(page) + const response = await page.goto("/en/not-a-registered-widget") + expect(response?.status()).toBe(404) +}) + test("captures the claim verification requirement", async ({ page, }, testInfo) => { From 289372519efe99fb7b632b386e956824258a9663 Mon Sep 17 00:00:00 2001 From: blueogin Date: Fri, 31 Jul 2026 11:46:04 -0400 Subject: [PATCH 11/11] feat: enhance widget routing and static parameter generation - Added dynamicParams flag to disable dynamic routing for widgets. - Implemented generateStaticParams function to create static routes based on registered widgets. - Updated wallet flow test to check for visibility of 404 error messages for unregistered widget routes. - Updated home balances overflow screenshot to reflect recent UI changes. --- .../(bottomsheet)/[widgetRoute]/page.tsx | 8 +++++++- .../desktop/home-balances-overflow-en.png | Bin 48940 -> 49031 bytes tests-playwright/wallet-flows.e2e.ts | 8 ++++++-- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/app/[locale]/@home/(home)/(bottomsheet)/[widgetRoute]/page.tsx b/src/app/[locale]/@home/(home)/(bottomsheet)/[widgetRoute]/page.tsx index 2e68b36..2493448 100644 --- a/src/app/[locale]/@home/(home)/(bottomsheet)/[widgetRoute]/page.tsx +++ b/src/app/[locale]/@home/(home)/(bottomsheet)/[widgetRoute]/page.tsx @@ -1,7 +1,13 @@ import { notFound } from "next/navigation" import { AuthenticatedWidgetRoute } from "@/widgets/AuthenticatedWidgetRoute" -import { getWidgetByRoute } from "@/widgets/registry" +import { getWidgetByRoute, WIDGETS } from "@/widgets/registry" + +export const dynamicParams = false + +export function generateStaticParams() { + return WIDGETS.map((widget) => ({ widgetRoute: widget.routeSlug })) +} export default async function WidgetRoutePage({ params, diff --git a/tests-playwright/screenshots/desktop/home-balances-overflow-en.png b/tests-playwright/screenshots/desktop/home-balances-overflow-en.png index 055f72cc161c80739c4399e7c68e5cd590337d13..493df30ca5cebd2632911f50f0f8e568d2fdd249 100644 GIT binary patch literal 49031 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 literal 48940 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 TCpwFd@AFJe_etd=+n4_bffd7& diff --git a/tests-playwright/wallet-flows.e2e.ts b/tests-playwright/wallet-flows.e2e.ts index 47d2ff5..15fbc6e 100644 --- a/tests-playwright/wallet-flows.e2e.ts +++ b/tests-playwright/wallet-flows.e2e.ts @@ -127,8 +127,12 @@ test("opens the registered test fixture widget from the dashboard", async ({ test("rejects unregistered widget routes", async ({ page }) => { await preparePage(page, false) await login(page) - const response = await page.goto("/en/not-a-registered-widget") - expect(response?.status()).toBe(404) + await page.goto("/en/not-a-registered-widget") + await expect(page.getByRole("heading", { name: "404" })).toBeVisible() + await expect( + page.getByRole("heading", { name: "This page could not be found." }), + ).toBeVisible() + await expect(page.getByTestId("test-fixture-widget")).toHaveCount(0) }) test("captures the claim verification requirement", async ({