26da66710e
One wallet, one grin seed / one balance, but a SET of nostr identities (nsecs), exactly one active at a time. New identities module owns the held-identity index (identities.json): which identities the wallet holds, their order, and which is active. It stores no secrets; each held identity is its own NIP-49 ncryptsec on disk, exactly like the single identity today (identity.rs create/unlock/backup reused unchanged, plus save_at/load_at for the per-identity files and pubkey_hex for the index key). Migration is fund-safe and needs no key regen: a pre-feature wallet has only identity.json, which the index adopts in place as the single active identity number one; the legacy file is never overwritten, so an older build still opens the wallet on it (clean rollback). The store gains a per-identity last_active_at so a switch back to a dormant identity can catch up from when it last listened, not merely from the wallet-wide last connection. Unit tests cover migration, add/switch/cap/dedupe, active resolution across a reload, corrupt-index fallback, reencrypt-all, and the catch-up-since rule.