Files
2026-05-27 23:29:53 +01:00

2.9 KiB

OpenSpec Change: enterprise-react-crypto

  • Change ID: enterprise-react-crypto
  • Package: @suaveplan/react-crypto
  • Category: react
  • Target path: react/auth/react-crypto
  • Status: PROPOSED
  • Date: 2026-04-24
  • Reference spec: /mnt/s/web/suaveplan/enterprise/react-crypto.md

Summary

Deliver @suaveplan/react-crypto on genesis from scratch at enterprise quality. Wallet UI for EVM chains: WalletConnect, AddressDisplay, BalanceDisplay, TransactionList, and useWallet hook — fully implemented (no stub 0x000... address, no README-vs-reality gaps). Integrates with @suaveplan/crypto for signing and @suaveplan/crypto-browser for WebCrypto operations. useWallet fully implements MetaMask/WalletConnect via injected provider interface, autoConnect, switchNetwork, sendTransaction, signMessage.


Current-state audit (genesis)

Package does not exist on genesis — fresh build.


Available workspace deps on genesis

Package Role
@suaveplan/error (workspace:^) WalletError
@suaveplan/crypto (workspace:^) Signing utilities
@suaveplan/crypto-browser (workspace:^) WebCrypto adapters
@suaveplan/react-translate (workspace:^) i18n
zod (catalog:forms) Network/transaction schemas
@opentelemetry/api (catalog:observability) wallet.connect / wallet.sign spans

External: tslib catalog:build. React 18 peer.


Public API surface

WalletConnect, AddressDisplay, BalanceDisplay, TransactionList
useWallet

explorerUrl, formatAddress, formatBalance, isValidEvmAddress, networkDisplayName

// Types
Network, TokenBalance, Transaction, TransactionDirection, TransactionStatus,
WalletInfo, WalletStatus

New additions for genesis

  1. Full useWallet implementation — injected WalletProvider interface (MetaMask/WalletConnect adapters); connect(), disconnect(), autoConnect, switchNetwork(chainId), sendTransaction(tx), signMessage(msg). No stubs.
  2. WalletError — codes: WALLET_CONNECT_FAILED, WALLET_NOT_CONNECTED, WALLET_SIGN_FAILED, WALLET_NETWORK_ERROR.
  3. OTel spans — wallet.connect, wallet.sign, wallet.send_transaction.
  4. Stories — connected, disconnected, loading, wrong-network, playground.
  5. Playwright E2E — injected mock provider; connect → address shown; signMessage → tx hash shown.

File layout

react/auth/react-crypto/
  package.json
  tsconfig.json
  vitest.config.ts
  src/
    index.ts
    hooks/
      use-wallet/ (ts + types + md + test + stories + index)
    components/
      wallet-connect/ address-display/ balance-display/ transaction-list/
    providers/
      wallet-provider/ (ts + types + md + test + index)
    utils/
      evm-utils/ (ts + md + test + index)
    types/
      crypto.types.ts
  e2e/
    wallet.spec.ts