Add a two-account member/operator journey (`--member`) to the sandbox smoke and
verify the remaining 6 execute commands end-to-end on chain. owner=FAMILY_OWNER
(controls family 1), operator=ACCOUNT_WITH_BONDED_NODE (controls node_id 31):
kick → invite/reject → invite/revoke → invite/accept/leave, each with per-step
state assertions, then restores node 31's membership (verified via --accounts:
family 1 back to 1 member). A real pre-existing family is left exactly as found.
Also adds read-only `--accounts` (prints owner/operator on-chain state) and
generalizes the .env loader to multiple keys (TAURI-WALLET / FAMILY_OWNER /
ACCOUNT_WITH_BONDED_NODE mnemonics) — all read at runtime, never printed.
With the earlier `--write` owner subset (create/update/disband), all 9 families
execute commands + the queries are now confirmed against the deployed sandbox
contract. Tasks 5.2/5.3/5.4 marked done; e2e/README updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds `--bond-check <address>` to report which node (nym-node / mixnode /
gateway, with node_id) an arbitrary account controls on the sandbox mixnet
contract — read-only, no state change. Used to confirm whether a candidate
account can act as the node operator for the invite/accept/kick flow.
Finding on sandbox: the family-owner accounts (n13nrrvw…, n18cuqlr…) control
no bonded node, so exercising the 6 member commands still needs an account
that controls a bonded node + its mnemonic.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Expand sandbox_families_smoke.rs from create→rename→disband to the complete
owner+operator journey, exercising all 9 execute commands against sandbox: the
account acts as both family owner and node operator, so one funded account
drives create → invite → revoke / reject / accept → leave / kick → disband,
each step gated on a state-poll assertion (pending present/absent, membership
joined/left).
The numeric node_id is resolved from the mixnet contract (owned nym-node, else
legacy mixnode). When the account controls no node, the harness runs the
owner-only subset (create/update/disband) and skips the 6 member-management
commands with a notice instead of aborting — so it stays useful either way.
Verified on sandbox: read smoke + owner subset green (real tx hashes, state
cleaned up). The member commands are implemented and auto-run once a node is
bonded to the account — currently the funded account `n13jtj2…` is an address,
not a node, and a bond lookup (nym-node/mixnode/gateway) finds nothing for it,
so there is no node_id to invite/accept/kick yet. Tasks 5.2-5.4 updated.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add a headless sandbox smoke (src-tauri/examples/sandbox_families_smoke.rs) that
exercises the node-families real-IPC layer against the contract deployed to
sandbox, via the same validator-client calls the Tauri commands wrap. GUI
automation of the real wallet can't run on macOS (tauri-driver is Linux/Windows
only; Playwright can't drive the native webview), so this is the runnable
equivalent of the manual Tier-3 smoke.
- Read smoke (task 4.1): resolves the bundled sandbox families contract address,
reads Config from raw state, lists live families/members/pending invites via
real IPC. Passes against sandbox (2 families, fee 50 NYM, limits 30/50).
- Guarded write journey (task 5.2, `-- --write`): create -> rename -> disband on
the funded test account, with on-chain-latency polling and cleanup; refuses to
run if the account already owns a family. All three txs confirmed on sandbox.
invite/accept/reject/kick/revoke/leave are wired but need a controllable,
unaffiliated sandbox node id (5.3 / rest of 5.2 still pending that fixture).
The funded account mnemonic is read from .env (TAURI-WALLET-MNEMONIC, gitignored)
at runtime and never printed or committed. Run instructions added to e2e/README.md;
tasks 4.1/4.2 marked done, 5.2/5.4 partial, 5.3 still blocked on a node fixture.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The e2e/README.md real-IPC + sandbox-smoke docs and the parent change §9.4
cross-ref already landed in ee1e6c4ac; reconcile the task checkboxes.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Add the missing Tauri command layer for the node-families contract and switch
the wallet's real provider onto it (node-families-real-ipc groups 1-3, docs).
Rust command layer (src-tauri/src/operations/families/):
- execute.rs: 9 state-changing commands over NodeFamiliesSigningClient, auto/
simulated gas; create_family attaches create_family_fee as base-denom funds.
Returns TransactionExecuteResult (family_events omitted per D2 - the provider
refreshAll()s reads after every execute).
- query.rs: 9 reads over NodeFamiliesQueryClient, normalised at the IPC boundary
to the wallet shapes in src/types/families.ts: base Coin -> display DecCoin
(paid_fee, create_family_fee), per-page contract envelopes -> { items,
start_next_after }, cw_serde tagged FamilyInvitationStatus -> { kind, at }.
get_family_config reads raw contract state at the "config" key (no smart query).
- Registered all 18 commands in main.rs; added the contract-common path dep.
- cargo build + cargo clippy clean.
Provider wiring:
- Replace the controlledNodeIds = [] stub in FamiliesContextProvider with a
derivation from useBondingContext().bondedNode ([nodeId]/[mixId]/[]); wrap the
/family route in BondingContextProvider (it is per-route, not global). D3.
- Fix the requests/families.ts execute bindings to pass camelCase arg keys
(Tauri maps JS camelCase -> Rust snake_case params).
Types reconciliation + drift guard:
- Fix the generated FamilyInvitationStatus `at` field (bigint -> number) and
export the 18 generated family types from the @nymproject/types barrel.
- Add src/types/families.contract-guard.ts: tsc-checked assertions locking the
wallet families types against the ts-rs-generated contract types; IPC-normalised
fields excluded with documented reasons.
Docs: real-IPC path + guarded sandbox write-flow procedure in e2e/README.md;
design D3 one-bonded-node-per-account note; parent change 9.4/9.5 cross-ref;
update_family arg shape confirmed against the contract (6.2).
Families Jest suites green; contract guard passes. Remaining sandbox read/write
smokes (3.3, groups 4-5) need a wired native build + sandbox + the funded test
account, tracked in tasks.md.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This change introduces the design, requirements, and tasks for connecting the
Node Families UI to the on-chain contract via the wallet's Tauri IPC layer.
The frontend currently calls 18 commands that are not implemented on the
Rust side, leaving a gap between the mock UI and the deployed contract.
This proposal details how to bridge this gap, replace the mock provider
with real data, and verify journeys against the sandbox environment.
Enhances Playwright E2E tests by capturing full-page screenshots at each
journey step, which are then stitched into a static `e2e-report/index.html`
filmstrip.
This report is uploaded as a CI artifact (even on failure) to provide a
visual overview of test execution, aiding in the detection of UI regressions
and expediting debugging of test failures.
This commit completes the setup for `tauri-driver` E2E tests by correctly wiring the mock binary and resolving a blocking build issue.
Key changes include:
- Implementing the `tauri.mock.conf.json` to boot the mock binary into `main.mock.html` and configuring persona-specific in-webview navigation within the E2E spec.
- Resolving a long-standing `webpack:prod` failure by adjusting `tsconfig.json` with `outDir: ./.tsbuild` and excluding test files from the main program, alongside adding a `declare module '*.css'` type declaration.
- Updating `wdio.conf.ts` and documentation to reflect the completed native leg wiring.
Implements the new Node Families E2E testing strategy, shifting the primary Playwright suite from Storybook iframes to a dedicated mock-wired app shell (`main.mock.html`). This provides higher-fidelity testing against the actual wallet UI and router without a Tauri runtime or login.
Also introduces an optional WebdriverIO + `tauri-driver` suite for native WebKitGTK webview validation, configured as a non-blocking CI job for Linux. A critical fix for `NymCard`'s `data-testid` prop is included to enable robust UI selectors across all E2E tiers.
Updates CI workflows, adds new scripts for mock builds and native tests, and provides comprehensive documentation in `e2e/README.md` for the tiered testing approach.
Resolves open questions, detailing runtime persona selection for the mock server (D2), consolidating the Playwright suite (D10), scoping the native leg to Linux-only (D8), and introducing a manual sandbox smoke test (D9). Updates related tasks accordingly.
Revises the end-to-end testing approach for Node Families. The primary
E2E suite now uses Playwright against the mock-wired dev server, ensuring
cross-platform coverage including macOS and reusing existing tooling. The
WebdriverIO + tauri-driver native-webview suite is re-scoped as an
optional, CI-only validation leg. Additionally, an optional read-only
sandbox IPC smoke test is introduced for higher fidelity.
This commit refines the design, proposal, and tasks for Node Families native webview E2E testing.
It reconciles the plan with recent merges, including the `ci-nym-wallet-frontend.yml` workflow (detailing the separate E2E job), Figma Code Connect, and the Nym 2.0 theme swap. The updates provide clearer guidance on CI integration and potential feature interactions.
Installs @figma/code-connect 1.4.7 as dev dependency. Adds figma.config.json
at nym-wallet root (include: src/**/*.figma.tsx). Creates FamilyPage.figma.tsx
mapping FamilyPage to Figma node 1861:1889 (Node Families composite,
moIK1E6AaXhFz8lI1pZVrI). Publish is Tier-1 gated — run separately with PAT.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This openspec outlines the design, proposal, requirements, and tasks to implement end-to-end tests for the Node Families feature within the actual Tauri desktop shell. It aims to verify the UI and user journeys against the native webview, complementing existing Storybook-based E2E tests.
The plan involves using WebdriverIO and `tauri-driver` to drive a mock-wired Tauri build, ensuring mock code is tree-shaken from production. These tests will run in Linux CI, providing confidence that the feature behaves as expected in its native environment.
```
Introduces interactive versions of the owner and operator lifecycle stories.
These allow developers to manually trigger actions (create, invite, accept,
kick, disband, leave) and observe UI state changes, complementing the
existing automated 'play' function stories.
This commit introduces the complete frontend implementation for the Node Families feature. It includes:
- All owner-side UI (create, edit, invite, manage members, disband) and operator-side UI (view/accept/reject invites, leave family).
- Client-side state management, query hooks, and Tauri IPC bindings.
- A full in-memory mock contract for isolated testing.
- Extensive Storybook component, page, and flow stories.
- Playwright end-to-end tests running against Storybook.
- Updates spec documentation with Figma design sources and resolves open questions.
This commit introduces the foundational setup for developing the Node Families wallet frontend. It integrates the OpenSpec AI development workflow, including prompts and skills, to enable a structured, AI-assisted approach. Additionally, Storybook is configured for comprehensive UI component visualization, mocking, and testing for the new features.
Refers to NYM-1199.
* First sweep packages + some minor tweaking
* Second sweep
* Regenerate lockfile + package.json mods
* Regenerate lockfile again
* Fix CI
* Fix CI again
* All building properly
* unblock
* Tweak examples
* Comments + readme + fix rotten unit test
* First pass docs
* Big pass
* Massive pass on new docs
* Update integrations.md w mobile
* Partial overhaul review
* new playground + big pass
* new fix lychee err
* IPR notice tweak
- Account loading now dedupes in-flight requests per network instead of sharing one global promise across all networks.
- Regression tests cover same-network reuse and cross-network isolation.
- Transaction success is now checked through a shared helper that validates hash, gas usage, and response payloads, not hash presence alone.
- Node settings error helper renamed to match its broader scope.
- Balance refresh now owns the loading flag so nested balance and vesting fetches do not race each other.
- Unbond modal removes the non-null assertion on compounded rewards.