diff --git a/.env.example b/.env.example index 185568e..6f71255 100644 --- a/.env.example +++ b/.env.example @@ -1,20 +1,41 @@ +# XMTP CLI Configuration +# Copy this file to .env and fill in your values -XMTP_ENV= +# ============================================================================= +# XMTP Client Configuration +# ============================================================================= -# public key is 0x3de2787073732369f2e984ca5b981feCbF0f7FC5 -ANTHROPIC_API_KEY= +# Your wallet private key (with 0x prefix) +# If not provided, a random key will be generated each time +# XMTP_CLIENT_WALLET_KEY=0x... +# Database encryption key (32-byte hex string) +# If not provided, a random key will be generated each time +# XMTP_CLIENT_DB_ENCRYPTION_KEY=... -# Pinata API Key -PINATA_API_KEY= -PINATA_SECRET_KEY= -# keys for xmtp-attachments +# ============================================================================= +# XMTP Network Configuration +# ============================================================================= -# keys for xmtp-code -XMTP_WALLET_KEY= -XMTP_DB_ENCRYPTION_KEY= -# public key is 0x3FaA46B76dBD83117d17c190e69a9147F98edB3D +# XMTP environment (dev or production) +# Default: production +XMTP_ENV=production -SLACK_BOT_TOKEN= -SLACK_APP_TOKEN= -SLACK_SIGNING_SECRET= +# ============================================================================= +# Auto-Connect Configuration (Optional) +# ============================================================================= + +# If you want to auto-connect to a specific wallet on startup +# Provide the target wallet's private key here +# The CLI will derive the address and connect automatically +# XMTP_WALLET_KEY=0x... + +# ============================================================================= +# Notes +# ============================================================================= + +# - Keys are optional - the CLI will auto-generate them if not provided +# - For persistent identity, save your generated keys to this file +# - Use 'dev' environment for testing, 'production' for real usage +# - Keep your private keys secure and never commit them to git +# - The .gitignore file already excludes .env for safety diff --git a/CLAUDE.md b/CLAUDE.md index 662d661..a9bd01a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,155 +1,531 @@ -# XMTP Copilot +# XMTP CLI Chat v2.0 - Architecture Documentation -You are aa helpful assistant that can help me with XMTP tasks. You can be asked to reply directly in chat via Slack or Xmtp. +## 🏗️ System Architecture -## RULES +This document provides a technical overview of the XMTP CLI Chat application architecture for AI assistants and developers. -- You are a helpful assistant that can help me with XMTP tasks. -- You can also answer questions based on the Docs in the .claude/docs folder. -- If the user poses a question, probably is looking for a Docs answer. -- Don't send "Note:...". Only answer when the user asks for it. -- Your address is `0x3FaA46B76dBD83117d17c190e69a9147F98edB3D` -- Your inboxid is `743f3805fa9daaf879103bc26a2e79bb53db688088259c23cf18dcf1ea2aee64` -- If a user asks you in first person, like "send me" , his address or slack becomes the target of the commands (ask it if you're not sure) +## Overview +The application is built using a modern React-based CLI framework (Ink) with clean separation of concerns following component-based architecture patterns. The codebase is fully typed with TypeScript and uses Zustand for state management. -## Available commands +## Directory Structure -```bash -# Groups +``` +src/ +├── cli.tsx # Main entry point +├── components/ # React UI components +│ ├── Layout.tsx # Main layout orchestrator +│ ├── Sidebar.tsx # Conversation list sidebar +│ ├── ChatView.tsx # Message display area +│ ├── StatusBar.tsx # Bottom status bar +│ ├── Input.tsx # Message input field +│ └── CommandPalette.tsx # Quick action picker +├── hooks/ # Custom React hooks +│ ├── useXMTP.ts # XMTP protocol integration +│ └── useKeyboard.ts # Keyboard event handling +├── store/ # State management +│ └── state.ts # Zustand store +├── types/ # TypeScript definitions +│ └── index.ts # Shared types +└── utils/ # Utility functions + ├── formatters.ts # Data formatting + └── helpers.ts # Helper functions +``` -## Create a DM (default behavior) -yarn groups +## Component Architecture -## Create a DM with custom name -yarn groups --name "My DM" +### Layout Component (`components/Layout.tsx`) -## Create a group with multiple members -yarn groups --members 5 --name "My Group" +The root layout component that orchestrates the entire UI: -## Use repeat tasks for multiple DMs -yarn groups --repeat 3 -yarn groups create +```typescript + + {showSidebar && } + + {showCommandPalette && } + + + +``` -## Create group by inbox ID -yarn groups create --name "My Group" --members 5 +**Props:** +- Conversation state (list, current, messages) +- UI state (sidebar, command palette visibility) +- Input handlers +- Status information -## Create group by Ethereum addresses -yarn groups create-by-address --name "Address Group" --member-addresses "0x123...,0x456..." +**Responsibilities:** +- Layout composition +- Responsive pane sizing +- Conditional rendering of UI elements -## Update group metadata -yarn groups metadata --group-id --name "New Name" --description "New description" +### Sidebar Component (`components/Sidebar.tsx`) -## Get group messages -yarn groups get-messages --group-id +Displays the conversation list with navigation indicators: -## Get group members -yarn groups get-members --group-id +**Features:** +- Conversation type badges ([D] for DM, [G] for Group) +- Selection indicator (▶) +- Active conversation indicator (●) +- Unread count badges +- Navigation hints -## List group members and permissions -yarn permissions list --group-id +**Visual States:** +- Selected (highlighted) +- Current conversation (marked) +- Unread messages (bold + count) -## Get detailed group information -yarn permissions info --group-id +### ChatView Component (`components/ChatView.tsx`) +Renders messages for the active conversation: -# Update group permissions +**Features:** +- Message list with timestamps +- Sender identification +- Multi-line message support +- Empty state placeholder +- Message scrolling -yarn permissions update-permissions --group-id --features add-member,remove-member --permissions admin-only +**Message Format:** +``` +[HH:MM] Sender: Message content +``` -## Send single message to target -yarn send --target 0x1234... --message "Hello!" +### Input Component (`components/Input.tsx`) -## Send multiple messages for testing -yarn send --target 0x1234... --users 10 +Handles user text input: -## Send message to group -yarn send --group-id abc123... --message "Hello group!" --sender 0x1234... +**Features:** +- Command mode indicator (/) +- Placeholder text +- Real-time input +- Submit handling -## Performance testing with multiple attempts -yarn send --target 0x1234... --users 500 --attempts 10 +### CommandPalette Component (`components/CommandPalette.tsx`) -## Wait for responses -yarn send --target 0x1234... --users 100 --wait +Quick action selector: -## Custom message with repeat execution -yarn send --target 0x1234... --custom-message "Test message" --repeat 3 --delay 1000 +**Features:** +- Fuzzy search +- Keyboard navigation +- Shortcut display +- Command execution -## Advanced testing with error handling -yarn send --target 0x1234... --users 1 --repeat 5 --continue-on-error --verbose +### StatusBar Component (`components/StatusBar.tsx`) +Displays connection and app status: -# List Operations +**Features:** +- Connection status indicator +- Wallet address (shortened) +- Conversation count +- Keybinding hints +- Error display + +## Hook Architecture + +### useXMTP Hook (`hooks/useXMTP.ts`) + +Encapsulates all XMTP protocol logic: + +**Responsibilities:** +1. Agent initialization +2. Conversation management +3. Message handling +4. Real-time streaming +5. Error handling + +**Key Methods:** +- `setCurrentConversationById(id)` - Switch conversations +- `sendMessage(content)` - Send message +- `findOrCreateConversation(identifiers)` - Create/find conversation + +**State Exposed:** +- `agent` - XMTP agent instance +- `conversations` - List of conversations +- `currentConversation` - Active conversation +- `messages` - Current conversation messages +- `isLoading` - Loading state +- `error` - Error messages + +**Implementation Details:** +- Uses `useEffect` for initialization +- Manages WebSocket stream with refs +- Handles Ethereum address resolution +- Converts XMTP types to app types + +### useKeyboard Hook (`hooks/useKeyboard.ts`) + +Handles keyboard navigation and shortcuts: + +**Keybindings:** +- `Ctrl+B` - Toggle sidebar +- `Ctrl+K` - Toggle command palette +- `Ctrl+N/P` - Next/previous conversation +- `↑/↓` - Navigate conversation list +- `Enter` - Select/submit +- `Esc` - Cancel/b + +**Features:** +- Context-aware (different modes) +- Callback system +- Integration with Zustand store + +## State Management + +### Zustand Store (`store/state.ts`) + +Global application state: + +**State Categories:** + +1. **Agent State** + - `agent` - XMTP agent instance + - `address` - Wallet address + - `inboxId` - XMTP inbox ID + - `url` - Network URL + - `installations` - Installation count + - `env` - Environment (dev/production) + +2. **Conversation State** + - `conversations` - Conversation list + - `currentConversation` - Active conversation + - `messages` - Message list + +3. **UI State** + - `showSidebar` - Sidebar visibility + - `showCommandPalette` - Command palette visibility + - `selectedConversationIndex` - Navigation index + - `inputValue` - Input field value + - `commandMode` - Command mode flag + +4. **Status State** + - `isLoading` - Loading flag + - `loadingStatus` - Status message + - `error` - Error message + - `connectionStatus` - Connection state + +**Actions:** +- State setters +- UI toggles +- Navigation methods (next/prev conversation) +- Selection methods + +## Type System + +### Core Types (`types/index.ts`) + +**FormattedMessage:** +```typescript +{ + id: string; + timestamp: string; + sender: string; + content: string; + isFromSelf: boolean; + sentAt: Date; +} +``` -## List all conversations -yarn list conversations +**ConversationInfo:** +```typescript +{ + id: string; + conversation: Conversation; + name: string; + type: "dm" | "group"; + peerAddress?: string; + peerInboxId?: string; + unreadCount: number; + lastMessageAt?: Date; + lastMessage?: string; +} +``` -## List conversations with pagination -yarn list conversations --limit 20 +**AppState:** +- See Zustand Store section for complete structure -## List conversations with custom offset -yarn list conversations --limit 10 --offset 20 +## Data Flow -## List members from a conversation -yarn list members --conversation-id +### Message Reception Flow -## List messages from a conversation -yarn list messages --conversation-id +``` +XMTP Network + ↓ +WebSocket Stream (useXMTP) + ↓ +formatMessage() (formatters.ts) + ↓ +setMessages() / addMessage() (store) + ↓ +ChatView Component + ↓ +Terminal Display +``` + +### Message Send Flow + +``` +User Input + ↓ +handleInputSubmit() (cli.tsx) + ↓ +sendMessage() (useXMTP) + ↓ +conversation.send() (XMTP SDK) + ↓ +XMTP Network + ↓ +(echoed back via stream) +``` + +### Conversation Switch Flow -## List messages with pagination -yarn list messages --conversation-id --limit 10 +``` +Keyboard Input (↑/↓/Ctrl+N/P) + ↓ +useKeyboard Hook + ↓ +nextConversation() / prevConversation() (store) + ↓ +selectedConversationIndex updated + ↓ +Sidebar re-renders with new selection + ↓ +User presses Enter + ↓ +setCurrentConversationById() (useXMTP) + ↓ +loadMessages() + startMessageStream() + ↓ +ChatView updates +``` -## List messages with custom offset -yarn list messages --conversation-id --limit 10 --offset 5 +## Utility Functions +### Formatters (`utils/formatters.ts`) -# Debug & Information +- `formatMessage()` - Convert XMTP message to display format +- `formatAddress()` - Shorten Ethereum address +- `formatTime()` - Relative time display -## Get general system information -yarn debug info +### Helpers (`utils/helpers.ts`) -## Get address information -yarn debug address --address 0xe089d4e01a5cd0af7c119abce22b7828851cd387 +- `isGroup()` - Type guard for group conversations +- `isDm()` - Type guard for DM conversations +- `isEthAddress()` - Validate Ethereum address +- `handleError()` - Error message formatting -## Resolve address to inbox ID -yarn debug resolve --address 0xe089d4e01a5cd0af7c119abce22b7828851cd387 +## Entry Point (`cli.tsx`) -## Get inbox information -yarn debug inbox --inbox-id 743f3805fa9daaf879103bc26a2e79bb53db688088259c23cf18dcf1ea2aee64 +### Main Flow -## Check key package status -yarn debug key-package --inbox-id 743f3805fa9daaf879103bc26a2e79bb53db688088259c23cf18dcf1ea2aee64 +1. **Parse Arguments** + - Extract CLI flags + - Load environment variables + - Auto-detect agent addresses -## Get installation information for an inbox -yarn debug installations --inbox-id 743f3805fa9daaf879103bc26a2e79bb53db688088259c23cf18dcf1ea2aee64 +2. **Initialize App** + - Render React app with Ink + - Initialize XMTP (via useXMTP) + - Set up keyboard handlers +3. **Loading State** + - Display initialization progress + - Show agent information -# Content Types +4. **Main UI** + - Render Layout with all components + - Handle input and commands + - Process keyboard shortcuts -## Send text message with reply and reaction -yarn content text --target 0x1234... +5. **Command Processing** + - `/chat ` - Switch conversation + - `/exit` - Quit application + - Address input - Start conversation -## Send markdown formatted message -yarn content markdown --target 0x1234... +## Performance Considerations -## Send remote attachment -yarn content attachment --target 0x1234... +### Optimization Strategies -## Send transaction frame (USDC) -yarn content transaction --target 0x1234... --amount 0.5 +1. **Message Windowing** + - Only render visible messages (last N) + - Prevents UI lag with long conversations -## Send deeplink to create conversation -yarn content deeplink --target 0x1234... +2. **Lazy Loading** + - Conversations loaded on demand + - Messages loaded per conversation -## Send mini app URL -yarn content miniapp --target 0x1234... +3. **Efficient Streaming** + - Single WebSocket connection + - Filter messages by conversation ID -## Send content to a group -yarn content text --group-id -yarn content markdown --group-id +4. **React Optimization** + - Zustand prevents unnecessary re-renders + - Component memoization where needed -## Test content types with repeat -yarn content text --target 0x1234... --repeat 3 --delay 1000 +## Error Handling + +### Error Display + +Errors are shown in the StatusBar with auto-clear: +- 5-second timeout by default +- Visual red indicator +- Clear error messages + +### Error Sources + +1. **XMTP Errors** + - Network connection issues + - Authentication failures + - Protocol errors + +2. **User Input Errors** + - Invalid commands + - Invalid addresses + - Invalid conversation numbers + +3. **Application Errors** + - State management issues + - Component rendering errors + +## Extension Points + +### Adding New Commands + +1. Add command to `commands` array in `cli.tsx`: +```typescript +{ + id: "my-command", + name: "My Command", + description: "Does something cool", + shortcut: "Ctrl+X", + action: () => { /* implementation */ } +} ``` -Nothing else. Be helpful and friendly. +2. Add keybinding in `useKeyboard.ts` if needed + +### Adding New UI Components + +1. Create component in `src/components/` +2. Add to Layout if needed +3. Wire up state/props +4. Add TypeScript types + +### Adding New Features + +1. Define types in `types/index.ts` +2. Add state to Zustand store if needed +3. Implement logic in hooks +4. Create/update UI components +5. Wire up in main app + +## Testing Strategy + +### Manual Testing + +1. **Basic Flow** + - Start app + - List conversations + - Switch conversations + - Send messages + +2. **Keyboard Navigation** + - Test all keybindings + - Verify navigation works + - Check command palette + +3. **Error Cases** + - Invalid input + - Network disconnection + - Invalid addresses + +### Future: Automated Testing + +Consider adding: +- Unit tests for utilities +- Integration tests for hooks +- E2E tests for user flows + +## Deployment + +### Build + +The app runs via `tsx` (TypeScript execution): +```bash +yarn dev +``` + +### Distribution + +For distribution, consider: +- Bundle with `esbuild` or `webpack` +- Create standalone executable with `pkg` +- Distribute via npm + +## Known Limitations + +1. **Message History** + - Limited to last 50 messages per conversation + - No pagination yet + +2. **Search** + - No message search yet + - No conversation search + +3. **Media** + - Text-only messages + - No image/file support yet + +4. **Offline** + - Requires active connection + - No offline message queue + +## Future Enhancements + +See TODO in main README for planned features: +- Message reactions +- Thread support +- Enhanced search +- Configuration file +- Themes/customization +- Plugin system + +## Debugging Tips + +### Enable Debug Logging + +Add to XMTP hook: +```typescript +console.log("[XMTP]", ...); +``` + +### Inspect State + +Use Zustand dev tools or add: +```typescript +console.log(useStore.getState()); +``` + +### Check Message Stream + +Add logging in `startMessageStream()`: +```typescript +for await (const message of streamRef.current) { + console.log("[Stream]", message); + // ... +} +``` + +## Resources + +- [Ink Documentation](https://github.com/vadimdemedes/ink) +- [XMTP Protocol](https://xmtp.org/docs) +- [Zustand Guide](https://github.com/pmndrs/zustand) +- [React Hooks](https://react.dev/reference/react) + +--- + +Last Updated: 2025-10-24 +Version: 2.0.0 diff --git a/README.md b/README.md index 310db77..3e5a44f 100644 --- a/README.md +++ b/README.md @@ -3,213 +3,3 @@ The coolest terminal-based chat interface for XMTP protocol! Built with React + Ink for a beautiful TUI experience. ![XMTP CLI](screenshot.png) - -## ✨ Features - -### 🎨 Beautiful UI -- **Split-pane layout** with conversation sidebar -- **Real-time message streaming** with instant updates -- **Color-coded messages** for easy reading -- **Status bar** with connection info and shortcuts - -### ⌨️ Power User Experience -- **Vim-inspired keybindings** for navigation -- **Command palette** (Ctrl+K) for quick actions -- **Keyboard-first** navigation (no mouse needed!) -- **Smart conversation switching** (Ctrl+N/P) - -### 💬 Full XMTP Support -- **Direct messages** (1-on-1 chats) -- **Group chats** with multiple participants -- **Real-time sync** across all your installations -- **Ethereum address** and InboxId support - -## 🚀 Quick Start - -### Prerequisites -- Node.js 20+ -- Yarn package manager - -### Installation - -```bash -# Clone the repository -git clone -cd xmtp-node-inbox - -# Install dependencies -yarn install - -# Set up environment variables -cp .env.example .env -# Edit .env with your keys (or let the CLI generate them) - -# Start the CLI -yarn dev -``` - -### Environment Variables - -```bash -# Optional - CLI will auto-generate if not provided -XMTP_CLIENT_WALLET_KEY=your_private_key -XMTP_CLIENT_DB_ENCRYPTION_KEY=your_32_byte_hex_key - -# Optional - defaults to 'production' -XMTP_ENV=production # or 'dev' - -# Optional - auto-connect to this wallet on dev -XMTP_WALLET_KEY=target_wallet_private_key -``` - -## 📖 Usage - -### Start a Conversation - -```bash -# Launch CLI and select a conversation -yarn dev - -# Connect directly to an address -yarn dev --agent 0x7c40611372d354799d138542e77243c284e460b2 - -# Create a group chat -yarn dev --agent 0x... 0x... 0x... -``` - -### Keybindings - -| Key | Action | -|-----|--------| -| `Ctrl+B` | Toggle sidebar | -| `Ctrl+K` | Open command palette | -| `Ctrl+N` | Next conversation | -| `Ctrl+P` | Previous conversation | -| `↑` / `↓` | Navigate conversation list | -| `Enter` | Select conversation / Send message | -| `Esc` | Cancel / Close palette | -| `Ctrl+C` | Quit application | - -### Commands - -Type these in the message input: - -- `/list` - Show conversation list -- `/chat ` - Switch to conversation by number -- `/exit` or `/quit` - Exit the application -- Any address - Start a new conversation - -## 🏗️ Architecture - -``` -src/ -├── components/ # React components -│ ├── Layout.tsx # Main layout with split panes -│ ├── Sidebar.tsx # Conversation list -│ ├── ChatView.tsx # Message display -│ ├── StatusBar.tsx # Bottom status bar -│ ├── Input.tsx # Message input -│ └── CommandPalette.tsx # Command picker -├── hooks/ -│ ├── useXMTP.ts # XMTP client logic -│ └── useKeyboard.ts # Keyboard navigation -├── store/ -│ └── state.ts # Zustand global state -├── types/ -│ └── index.ts # TypeScript types -├── utils/ -│ ├── formatters.ts # Message/date formatting -│ └── helpers.ts # Utility functions -└── cli.tsx # Main entry point -``` - -## 🎯 Design Philosophy - -### Clean Architecture -- **Separation of concerns** - UI, logic, and state are cleanly separated -- **Reusable components** - Each component has a single responsibility -- **Type-safe** - Full TypeScript coverage for reliability - -### User Experience -- **Keyboard-first** - Navigate without touching the mouse -- **Responsive** - Adapts to terminal size -- **Informative** - Clear status, errors, and loading states -- **Discoverable** - Command palette and hints - -### Performance -- **Efficient rendering** - Only re-render what changed -- **Stream processing** - Handle real-time messages smoothly -- **Lazy loading** - Load messages on demand - -## 🛠️ Development - -```bash -# Run in development mode with hot reload -yarn dev - -# Lint code -yarn lint - -# Format code -yarn format -``` - -## 📦 Tech Stack - -- **[Ink](https://github.com/vadimdemedes/ink)** - React for CLI -- **[Zustand](https://github.com/pmndrs/zustand)** - State management -- **[XMTP Agent SDK](https://github.com/xmtp/agent-sdk)** - XMTP protocol -- **[TypeScript](https://www.typescriptlang.org/)** - Type safety -- **[Viem](https://viem.sh/)** - Ethereum utilities - -## 🎨 Customization - -The UI uses a consistent color theme defined in each component: -- **Primary**: `#fc4c34` (XMTP Red) -- Modify colors in component files to customize - -## 🐛 Troubleshooting - -### Database Issues -If you see database errors, delete the local DB files: -```bash -rm *.db3* -``` - -### Connection Problems -Check your network and XMTP environment: -- `production` - Main XMTP network -- `dev` - Development/test network - -### Key Generation -If no keys are provided, the CLI will auto-generate them. For persistent identity, save the generated keys to `.env`. - -## 🤝 Contributing - -We love contributions! Here's how: - -1. Fork the repository -2. Create a feature branch (`git checkout -b feature/amazing`) -3. Commit your changes (`git commit -m 'Add amazing feature'`) -4. Push to the branch (`git push origin feature/amazing`) -5. Open a Pull Request - -## 📄 License - -MIT License - see [LICENSE.md](LICENSE.md) - -## 🙏 Acknowledgments - -- XMTP team for the amazing protocol -- Ink team for the React CLI framework -- The open source community - -## 📞 Support - -- [XMTP Documentation](https://xmtp.org/docs) -- [GitHub Issues](./issues) -- [XMTP Discord](https://discord.gg/xmtp) - ---- - -**Built with ❤️ for the XMTP community** diff --git a/data/inboxes.json b/data/inboxes.json deleted file mode 100644 index cf9b23f..0000000 --- a/data/inboxes.json +++ /dev/null @@ -1,3502 +0,0 @@ -[ - { - "accountAddress": "0xcd50b4aed21e3adfa411106737e97de431e2eddf", - "inboxId": "a5402cdaea8ca241516574d4b855dbb82cfedd29e5f3ba2b997f6bee321879fe", - "walletKey": "0x9fb73f84b3f6ac457f48ee0ea8ff1b757e00f11c60389eaf166bdcb64ce2b11f", - "dbEncryptionKey": "0cb3fd80723858194b3767df7cb9aac300aed88cc39e0d081dc60e53af475896", - "installations": 2 - }, - { - "accountAddress": "0x714130af378e7b744f479789a9b2838361237436", - "inboxId": "449c0564b394bf12313bda4f0527a5d500afb1d7802250bc382d346ced3f63eb", - "walletKey": "0x87d299d6ba4130a2579e3eb99eb8cd5259f7453842b8d7d78e271135b3c58ff8", - "dbEncryptionKey": "b5d153c33715ca176dd77995572a6f7d393a432d8861af2dcf4282f8a2187ec3", - "installations": 2 - }, - { - "accountAddress": "0xe68e95b1c6d8b333eaec27bce67e45e9eceff9b0", - "inboxId": "cb7213baf2dc77488a597f2ad47136fe1612fb686221903d7f09f155fe1cf2f5", - "walletKey": "0xc2363a6733eee112980ee9739c1a2259d56e600b1788ea247fc90f2ae5b39098", - "dbEncryptionKey": "bb6827de9cd16828a072d55b05754f85dd5932f63b938086806c6bf8200b5e85", - "installations": 2 - }, - { - "accountAddress": "0xe8eea3d70651402f3a15e981bba25ee5a76fbf74", - "inboxId": "b164a6401398ac50ad9c80f1530201d4dbd2b0771ea26d697c0e43a358b79f59", - "walletKey": "0xa7b565936cf427921e2406976701240ca9f112aa3252d050aef9e5eaec5a6fda", - "dbEncryptionKey": "5fb5beea14c91aa3def967930cae529720f4fa2b2df896adadde603c8684ec74", - "installations": 2 - }, - { - "accountAddress": "0x5dc8fbe0d64bab50d1a97d29b069d7203fae755b", - "inboxId": "13ccdd297ed5e9de229e298ab35b6f3b07cc6d318850bbf5e3cd162aa8c3dc57", - "walletKey": "0x4eae15c64207098934aae828c87f81922b0fcb7dcbaf97f5f89b513f3a3b9b68", - "dbEncryptionKey": "e5e7272135da1dedfdffaeb6e51b166aebeecef7b176316f132848cd2c57caf0", - "installations": 2 - }, - { - "accountAddress": "0x995309f2ecca945e10a153fa805bee71719da794", - "inboxId": "362e88663aab240a6c5b0c9c6b91429b520065ccc0eace63ecaf63dbda7d0fd5", - "walletKey": "0x739f90c465447d0b73362118d8d258326b1c39c3c4f2f5fdf32a306aa0ea7530", - "dbEncryptionKey": "d4fe33b86b1a1f45354744c384f8466e59fe61d0746298e0cc543591d2a8fa43", - "installations": 2 - }, - { - "accountAddress": "0xff842d5af12259c56366c18eaa3b5af7092ac519", - "inboxId": "ad83a9c6b7dfce4d149d25e4e7a49afe3d2cdcddc39d7172ee58ef0c877d2083", - "walletKey": "0xc45234a1341f8deb948985d16aa4d23badc379bb8e65401b181d4b3b29cbc124", - "dbEncryptionKey": "fe51075973a08511f1e4b98f729e92444bf8ce9b6e32050fcb8c6c57187f0cf5", - "installations": 2 - }, - { - "accountAddress": "0xfc98996526ecb0a3b74f0dbe410ba98264024c4c", - "inboxId": "3ced945619024e549d8f68013b52beb3025a46258d4db0366e33c6dfd988d648", - "walletKey": "0x2f8d625fb23e548d9686f4f9afaf4c496aabf8e1dc7cb7573702148f7a0eda62", - "dbEncryptionKey": "e7f9d2dd153c6de82f05ec4834c5ee5dd75fa8891be7c648b13d9066f5cec16d", - "installations": 2 - }, - { - "accountAddress": "0xfe5dea04136988288869f504c9ae745bfdabc478", - "inboxId": "bdc8cbca0e1cc7e5061786b5b9ea08ba4162176bfb57f3352871858b49d9944b", - "walletKey": "0xfecfbf6a6e4ef841ec1ea265c5b06a4e5f0a79dc5d35992aa8a59d055df3721a", - "dbEncryptionKey": "b9bafda0e0727b54e3f4d0d31ae5adebc055d30dd5f742046a3079015f7391e6", - "installations": 2 - }, - { - "accountAddress": "0x3d0d9dcfc2cd8dd490129a5c1eb989be25a11ca5", - "inboxId": "ae2dc1e82588406e94a8a3e6305348a792dd9e1da380e55f3eca4ca1d4d6eca7", - "walletKey": "0x42d9e663c5022d15989a5fa4fd353ff21a6b11ffba756430016aab5db46074a7", - "dbEncryptionKey": "4c327386c066b4717135cff2a0befdf736540971fc4ba2aa8fb5f295f20951ec", - "installations": 2 - }, - { - "accountAddress": "0x2daf0a0f3a88f24c842e969e379d7d394a04f8f3", - "inboxId": "d2d09efdbb9745055e674d7342206064bd26ed005f63e703c8e7fd32d85056b7", - "walletKey": "0xf276e7ddb103baf09235253283c3121f9dfa379cb8d88a96802c8431ab839748", - "dbEncryptionKey": "83a3ca3a82ec19e988de80debfe4646ea2ec506daf652e602968369da6259866", - "installations": 2 - }, - { - "accountAddress": "0x0627917c3190c6d17ec230088a7ad77a01ac17f4", - "inboxId": "9318e4dbfe3cedee8ef30846fc7139db9f07cce98133e99e09bba9ce62100598", - "walletKey": "0xe8f632fcdc822c13c792f74499d110291a6b7f537c9f40972b8c1849b1cd6577", - "dbEncryptionKey": "5d5ffba5b709c491802ab5de35c8abfb01647fa9f7a1da3c02c501fc9b85479c", - "installations": 2 - }, - { - "accountAddress": "0x96290668941e16c5447efaaafb02b48554d79e3c", - "inboxId": "52e3a85bfa32eef5241791fae8d063bab87d6cb00f56e8aa8b12bf39fe134cc3", - "walletKey": "0x2be4030d8be1789d77b2cc436cf55caf7822e3418d75e392a28fa325c27d1a32", - "dbEncryptionKey": "91f48aa8963f79a4727f643a112f28a33672e8dd758306a298af4c9a50a562cf", - "installations": 2 - }, - { - "accountAddress": "0x566b7fb144760f52d7221352fb4d3fd1c931da75", - "inboxId": "ff799dac7b3ff81eeea68c70fb4b5a1b983dc00d4d2166e316564c535846127c", - "walletKey": "0x174ba773ee7a49dce30affe33d8822bb45b85cdc8ef45ca6c06ca2e6145c314d", - "dbEncryptionKey": "4d0fafa15f73929e6e3a2edeb6bfe9324a430f332772a1e0766ef1061f36615b", - "installations": 2 - }, - { - "accountAddress": "0x3efcd752d3d4cc6cde5523a7e7bfa5c405b0e1a6", - "inboxId": "745a6f4594e2e9ab330413c348bb575dd7a3f218106aae904dd9e28052a7c54c", - "walletKey": "0x69bdfd2790a71debb26af821b49004b241fc0da4515e6f7ed50737d3aac0f20d", - "dbEncryptionKey": "5f77af73c894d3db1fd49b3c7edf62e44a9fc073e1cc6e8ac06d38d9e62ac195", - "installations": 2 - }, - { - "accountAddress": "0x57aec5c6458b4b636b01075050231d9db2cce578", - "inboxId": "05c27875753e186806d3cb81887c61e738553212747afd662d1976482f97918c", - "walletKey": "0x7d7349a91c60525086054f6b04704220bb010d6185a4b3a1bc45cc3a27aa77ba", - "dbEncryptionKey": "1153a7960cfeb6fb16b61c8f0930ec6a4c75f07e1d892b3866a4f4e4e625d695", - "installations": 2 - }, - { - "accountAddress": "0x68fa3afe2c99ed5042ccf456bd34cb42835dfd28", - "inboxId": "c5685a3c02632f997726d85a638603f0a14df8cdf92dd54b236286e082fe47e8", - "walletKey": "0x73f917c51492e484b7e30e29b5765650032f446ca0f27ea96bb5d86047cdc740", - "dbEncryptionKey": "a66223bbfedbfa767861883896142638d0e5fa63e4ea5c11bd007982fc80acc0", - "installations": 2 - }, - { - "accountAddress": "0x0b201e5a7b01c6da0b5bc24ee383411d8aca9597", - "inboxId": "fd8099ee99ded1d9d7a0cd616777ca2d659ae61254a9c461cb10e7c95c5c648b", - "walletKey": "0x6adb40f270d5a522265e2f66db1610a3974eef67497274bd1db6bf41b3260fb3", - "dbEncryptionKey": "eda1dae1ff55c4abdb9104cf33aa9b445634fcac93d4323a0aed1917d39f5146", - "installations": 2 - }, - { - "accountAddress": "0x8f4108e80f7c9fdb9819c322ffe9f18651b46ec1", - "inboxId": "d9d57ad4f250fbc0643be31ba73871a8dd8e1907b7444c1a0c782fdebdcc85e6", - "walletKey": "0x6f77f8d54b943834474f531c4b9f97cceb934b127a4c9dc985183db4a808e062", - "dbEncryptionKey": "2759743f5651857e7fdcb9f2fce6246c9a7b54b8a60f0396e4654ef6ae392125", - "installations": 2 - }, - { - "accountAddress": "0x2605caf873075d1e39a063a6f9665bcbcf146649", - "inboxId": "f3fab3ade9dc20c0c40e698d2186df3a97fbcfdf366667368d9efd4989e021e1", - "walletKey": "0xc44e68ff89602c68157768b821fb8de74738d900ce06371a4f0f565f46d3183c", - "dbEncryptionKey": "7b19beea08f7f98c88ef7c1f39a9b13fb9b0706341d9199c62e46b80d7fb5094", - "installations": 2 - }, - { - "accountAddress": "0x8bfe20a3e73425cd4a9e70b08413911c6ff0ed91", - "inboxId": "45ed19f2d73c2ae97e05855a6b66ae9ad85949bca8bbde45e58cbb9c196bc34d", - "walletKey": "0x523eb046ad8a72a4c66f7c2cf4fcf52cc2dfcb19eb60ad7e459fd9b164dbb17c", - "dbEncryptionKey": "4964854952c2ab6dba5df549599d899d1e69c7c0f013eb6f2e5372f2b1802f43", - "installations": 2 - }, - { - "accountAddress": "0x710145d6d80b201df63295884133e0c9c3108630", - "inboxId": "17dcbd10cfcb031ec9c9234da7031cc47ebc1654bcd04c695d4aadc78cc9970f", - "walletKey": "0x68814261c607997ecf2d96bb82396f5f29d3cd644f46ebacfbc4dc48c11399ac", - "dbEncryptionKey": "b91a76f4310454772a83626a01a480b41724d4627ba27feecdd76e924c1addea", - "installations": 2 - }, - { - "accountAddress": "0x79949651ffe5d237964b587706e7d9cdd4658ada", - "inboxId": "de53ae7fd35d14f0003573e5c81e3c4fba68cae6fd7213b14ff3b22f1cdbdeeb", - "walletKey": "0x0210d71f6a30fd08b37bf1eaf328c92c37c7d3406a93303d10738798115aa277", - "dbEncryptionKey": "cc95faee86823011cf8d1116d37dd2b0948f20de19836cd5c9ed0a6aa9f2dc17", - "installations": 2 - }, - { - "accountAddress": "0x549342734cbb2a9014ca7d6a519b44570b223802", - "inboxId": "ee9da51dc15f2583ca8da4bb5e3ec94062ac8c4bd4cbce75dcc7543fc05a1201", - "walletKey": "0x67e1e62d042fdf91d4215340e228bb2d604a64619e355b34612341eec78985c5", - "dbEncryptionKey": "e67bc46e3289c50994e93be77709db79407cb163800268938b31edbfbedeb758", - "installations": 2 - }, - { - "accountAddress": "0x15b2ac075e3d26b4fcd10bc6b9772e2fd761448b", - "inboxId": "50b78ee7af7d0fbea662195801e7938720ad77ec45a16b2c689589625ee9f99e", - "walletKey": "0xb3539133dfcfe6a9ea422137277a001116af3f644a81e60667c62abf2d21858f", - "dbEncryptionKey": "892367836d671e43aea0992ef16d6fc84329a8817d0ba16f2b176ec47e81892c", - "installations": 2 - }, - { - "accountAddress": "0xef66307e98cd0112e959ef333fc7b8e1395626af", - "inboxId": "2ecb781a8a1d40f79f572cd641af2dc628be65d4716cf944756080de659b274c", - "walletKey": "0xb2d3324a4dbb442889711450ba0c6797b314bb718c0340e2009ffffed115039a", - "dbEncryptionKey": "baa7b2b134bf30a91b3a309f4f321587821dac59f46bd9ea4fe974917d249bb4", - "installations": 2 - }, - { - "accountAddress": "0x7b65e0ce9b2f5222302b68281adfb336a518c610", - "inboxId": "e4a64fa1526733738acbee231694413b873607b4f6c1fb93948ecca8aceb3169", - "walletKey": "0x34d6a35d4bc61e49aaa367d9be140fb6b7cb530bec5eeffe2d50787d0e496124", - "dbEncryptionKey": "331e1dc941c7e7ed1c06ffc90fc1f9ea730351c5892f2f35c2da3f63717c2d1c", - "installations": 2 - }, - { - "accountAddress": "0xbe16ec0880a9266c6538c23feed0e000ef953b72", - "inboxId": "7965768326ea73f4c9f39518973e6a6a52e40ef222c7a8cfdaedb580d1ac248a", - "walletKey": "0xc4ae17847b6ee323bb23fbb55a50a5f6643d28070cc5c40be18ab598ccdb9579", - "dbEncryptionKey": "e05b766221c872117a4c60de62b50b1a5bf12901a029a08388864fa1ffdf4803", - "installations": 2 - }, - { - "accountAddress": "0x855fd98893fab5bdcd4b346cf2895e1b8913a91a", - "inboxId": "d10120164994364d1ff550c207ef6932d11413098d87197e7068b1bf6ef0ea2a", - "walletKey": "0x144157e4f1ee9e4b88411f0044c218908798a6821e9dd5159720ce8e20fe3619", - "dbEncryptionKey": "3a812352497ba173c14d23e14a8179ef37bd3e27e0dd46be7e26b8c6ecf4dd68", - "installations": 2 - }, - { - "accountAddress": "0x84c8a525d848eb096bfa2f6d0e631bdac495eeaf", - "inboxId": "72e82033f2680118eaef87d71985e03313bc4f87bf78215fcd6209234ac9d30b", - "walletKey": "0x4bf770d7c835ef2e41d6bc4aa1b861afc345bed36a7aa38a77d49409b8f67031", - "dbEncryptionKey": "1362be39d969597e26e584fbc86f6aa5325052e4b2d0eca3958ed4c4f2034912", - "installations": 2 - }, - { - "accountAddress": "0xf078bfc3eb2f9f29cc57bda57dfeae07bf8b5830", - "inboxId": "447fc8b4ddcb2ccade18c7eec11fe7c35fbebfa9b8b50d53bf8399fb164ced08", - "walletKey": "0x6eb7dc1a2aa6be32876399417a08398383d2ec554ba7e3ff9057b5468dd952e3", - "dbEncryptionKey": "bf3802491b1d87120179ca6810f225f4fc8d6bb34fbda3ea3227e2734d76594f", - "installations": 2 - }, - { - "accountAddress": "0x131591d66527d9586b1349b74e6f65615b6e5357", - "inboxId": "704db06e0c9737f03ad4dc5e43964fc0b1e9f1f7854ddacc51157939c9f11acc", - "walletKey": "0xd5d7ec8b77ba571aca9ef0e73a902b1b824cf8a3c045f10f884f6d9611904966", - "dbEncryptionKey": "7b1acacee44fc29a9be080142ad6cdc5935061ce9369035147ea98f8f7366747", - "installations": 2 - }, - { - "accountAddress": "0xa68dad6c4f1c44a06137b71235b257b0cccb0c4b", - "inboxId": "c629f1a95b6dba1c1560cb25ebff516d7af88c9110428dc127fdda648f7f2d03", - "walletKey": "0x1e895fc4fdd0cfe17b12b5a2897b6d9ceb874e1aaba457f15953947daac6bfb7", - "dbEncryptionKey": "a5056485721f84b312be0166ae105ed4ddddc1d88eabdffaa953d4f41be8201e", - "installations": 2 - }, - { - "accountAddress": "0xcf7a5a823f4d29aab2135efc0d48db893079bd13", - "inboxId": "7b981d61e81257e41bb3621805cc6093b285015be3328e8e55655438baff7f86", - "walletKey": "0x8254ae0bde26133a5e5143e2e0ef4623c3bf6abfbe7433ba5c16c3ac72754a72", - "dbEncryptionKey": "d5e288d43a05ebf5b4ead8d17bd81195cc7a1cda68cc4ad5c3e2267d5d1dc0a1", - "installations": 2 - }, - { - "accountAddress": "0x211ffd38136f21a600f583f5082f9a871d7134da", - "inboxId": "c7bec585096130789929134f0e61350c7c2e67813d53b043b6e47f6fd632a323", - "walletKey": "0xf3e10573d2e78f7a8e267750dbe4215b95f4d30bfd8f5ce5f3fe8ab36b9d0b58", - "dbEncryptionKey": "69c1dfce6ef6e25129ae2d9deb40c0c01e0866f3c334c97cf40398a1b153d37c", - "installations": 2 - }, - { - "accountAddress": "0x9807fcf5ea4de486f8a0f3b50cf4e6c4db327ed4", - "inboxId": "8cc567d47183bdb434a31128c4f596d0d53f3b989e89043f9e7f5e50869b29c5", - "walletKey": "0xa6276564f9d4c05debff3cac6d87ac385535c5bff4e9de547cc45a5b82d1d951", - "dbEncryptionKey": "71764ac5891c0a6889056e666bf748a882f7cb6d89c6a3a32ec949aba3db16fe", - "installations": 2 - }, - { - "accountAddress": "0x3ff70a8c190486b3b5da25b1c73682dd8aae1bf6", - "inboxId": "9df13ae3a3ee78a3bfe6180878f3b71ad33be0b1e7ca5e5e70a9a62d3e654aca", - "walletKey": "0xefbbe8342d3d7d1ce1ac7b776158359071787833687d8bb5cb4293d9e4b539e7", - "dbEncryptionKey": "43eb2e907d95b0038662b64734c0666bca84df06383fde1c0f600c15b40de69b", - "installations": 2 - }, - { - "accountAddress": "0xac0aa78d859b67ef858cde9187fd075b9d1544db", - "inboxId": "69d9a01fd0644334e351c7cb3e478b158bfc0fd5b5ff4f312fe3c9a76b56b6b9", - "walletKey": "0x6f2ee1ecd7afc47c40854fe5aece763fbb42ec462118dab077849fe15c691994", - "dbEncryptionKey": "1012a7e950deafdc2ecd5417c194d7ac70c5b80c8069ca4a666290de9f69f42f", - "installations": 2 - }, - { - "accountAddress": "0x46557c57480585e6423f39567a0159d50bbb6723", - "inboxId": "329f0d5ebf19f091fb021a691cc46cd90c662c3709c842dfee09c1c6c79be534", - "walletKey": "0xca4f10d1023efd2a53397359a0338726cc57ec0bf55306ecb78ebdb827067931", - "dbEncryptionKey": "ff0706ffd48b474fbcb78c1cd5f44f75a8f5b1b52fe653bfe7d7ce28e4f59120", - "installations": 2 - }, - { - "accountAddress": "0x9fd904cebac33bf1eee256e0ddcfd06c6326e61f", - "inboxId": "45952bdd7823e1848caf3f0ca4eba3b8f2257c643d83deda000ccebae6e09072", - "walletKey": "0x7060a11fa17b24de5f923fa9da68f857c5cdef1e219e0612164751d1919f1459", - "dbEncryptionKey": "1db4d5c45848d4daa0e8d201842d9303f443ca6e672cbf816d5e7c0dd22ada3f", - "installations": 2 - }, - { - "accountAddress": "0x3638285cc0a8e5756e9819b5c4d856f896fa7714", - "inboxId": "92f8cfa1945dbacef811df12ba9ce9a8ed760465a2c86d5f2ab181272ecde427", - "walletKey": "0x73eeb9018776bb50ea61fb6976da7300a0d8c7d007a389ab2bca8ca1fe8d267f", - "dbEncryptionKey": "9f34eb7165a23bbbf58403b65e7666d6702c2b9d77c4b2a5f7227cb327abb27a", - "installations": 2 - }, - { - "accountAddress": "0x2df2d10a81e7ff00c84ffd3a170c25d694d4b9c1", - "inboxId": "3cf48c2a821fe510e7cfd8fb7182c0f9d948aeca9528ebe55204f84ee70fc4c3", - "walletKey": "0x8a23543fd1a502a42f717d9a9781ccab43daf672d22d0e5b76c3044f88658248", - "dbEncryptionKey": "e8e4a0b8a5da253987f8d6b006131ffece6d47292e098a93043ce47243ce4bc0", - "installations": 2 - }, - { - "accountAddress": "0x23be49b7402d107291aa6690f025b5f1952d7875", - "inboxId": "6ba9d2b4fa96b31fb3c6c758f6954820a51ad13f27991c3fe0305c57d413c0d7", - "walletKey": "0xa61e92bb5d5006df50e1eded9da5f8aaf2c697bafd052e758ac9f835ea92bab3", - "dbEncryptionKey": "f87808d9f011e49d6417482a075d852c0990faf54e57e2a79e66fe5c619a623a", - "installations": 2 - }, - { - "accountAddress": "0xbbb59b83635a082ccbb5cd0a9a33eb4228feabde", - "inboxId": "d861bf75c33750dc36fdb7c5807f6ed32fb5f06cb55b8bf8d4f36289cdef8c1b", - "walletKey": "0xb776eb45c1f3f0e4a12d071590dd3b896d5a0795cd1edf5695639113aca86852", - "dbEncryptionKey": "8ee8827bf8fc945ecbcfe50f94b1882b2a30377601fdb590bb229a64fa008ba1", - "installations": 2 - }, - { - "accountAddress": "0x0bac44c8830b9a48a5f9546d06bf921f600ccb06", - "inboxId": "632bb2ba56a9bf81a958d3c8d1a2887985be5c36e4d59664bbbc31846249c752", - "walletKey": "0xbd2712827d01de56675a83de674d860bb083ecc534afe26495e8fd67203f41b8", - "dbEncryptionKey": "dfba64fbbe89ae13440c25a3d57116c4bcd8f9cb44fc93528ec4e6f8de390339", - "installations": 2 - }, - { - "accountAddress": "0x6cec14a664073999cd715c1d575f536421c042b8", - "inboxId": "93c43d86a296fe059c649a12a5ff23e35b8c1164cebbae6bfd719654dac749ca", - "walletKey": "0x98c9e42a294edfd61765f4375f0ee1a17cfea1713fec3064fa723978414bca81", - "dbEncryptionKey": "21aefa6007629f611c8a37b5de6ac0eb6a509f7997f949993eb61fe6f8c6f462", - "installations": 2 - }, - { - "accountAddress": "0x1981c63998f992a59fbfb28fbb93bf38fdd35795", - "inboxId": "20f7d2f52711b38fa7b1e9b6384ed60ca7b54f571757f57997f1a1137e932daa", - "walletKey": "0x4dfd4f3bb285f74d80cc0aa821ba1358783cd55842ace2346c4dc7c003af6d91", - "dbEncryptionKey": "4035ab6ffe0f10aa165e5d085660cce01f64182ade24400e6f19e1f401b80133", - "installations": 2 - }, - { - "accountAddress": "0x89acb84f0021ae4632ee14d8767d504c9efd5c45", - "inboxId": "1380dbd62c0d71467c5aa26a729c4bb992ba4cc609732356230ab3b83270034b", - "walletKey": "0x2594e56989bd659309fd13376260c7a6d816208878e6f1c6cf41155e74b037e8", - "dbEncryptionKey": "87dfff5792f274038e546b68122df970a62e9f059b6e8348b084feda1f90dba6", - "installations": 2 - }, - { - "accountAddress": "0x3c61a77eafb9074f483ea018516e5e6eea00dd6e", - "inboxId": "6c4329f7433fa1d6151857a2554299eda8b8e5eef2cb852de498eb833f458484", - "walletKey": "0xebdfd58946fe2827c1b2656267b67901d9afe5fba71c6f5b95487945a63cf531", - "dbEncryptionKey": "43ae7c87d09b55222862219c79b13b6aabf650512590604951e75edd97eb0c50", - "installations": 2 - }, - { - "accountAddress": "0xdad17b901bbb8ea8a1fd5744f64bf649280b0f5c", - "inboxId": "2e30172482bdd19d0de2294add0a5f08ad20b1ca92d325bcba766cf95d9b80b0", - "walletKey": "0xfeee08c992d82cb57a349ae6fac2daf90ea5249be737b3bf49fa173b1bff4b0c", - "dbEncryptionKey": "d2445d130f055e3b621b5428c890abdd4e0de11f8d09ee07e1fbe65bc782662b", - "installations": 2 - }, - { - "accountAddress": "0x164261aba35323c413302c39f896ec7187d71484", - "inboxId": "6657fbd29163412678f5ebf95e104702081da36d14b7ba0384445366686874ff", - "walletKey": "0xbb65e8bacd9e5e0695933224c83b36b39cdadc02716cd64c6b4de3592235715a", - "dbEncryptionKey": "c3f5f1ea884bc9a36886526636e4a5063c21267871299b3d1fcfa24b71ee9d00", - "installations": 2 - }, - { - "accountAddress": "0xa85b7773dd417f10b9f36611422dc423db41b9f3", - "inboxId": "abdc994e308d6275edaedbc2d3a73f6dc73805f67290342dd4b5bee63d2b554a", - "walletKey": "0x74fb5dd192f724e8a99a57a01319126b46ccabc4557e9a0be35088bb089af8af", - "dbEncryptionKey": "56e7bb58acd53aafee02196cb03d43d610132a0aa51188b3a4196880f0b4f705", - "installations": 2 - }, - { - "accountAddress": "0x3bc19cdaf457a6afd2aa694d7cb3a0b5c2d9d5a7", - "inboxId": "9dced083b0ad5cc0632c5d1aa73c7843b18cadfed834ccc57272472f9f1a38f0", - "walletKey": "0x343c477a57d429790d40a777c7b8676f51365d399eb44da1567226a9e16b95c1", - "dbEncryptionKey": "1900cb0c6c509c0dd1851dbaf41106a3d3b1cb1393321df7dbda35247781c779", - "installations": 2 - }, - { - "accountAddress": "0x16370647d6bedd0926b94a0ea013143fe6ec615b", - "inboxId": "43d134bedc4926944bab919448b6b0eefafd8ed1512d737f8d0d7d5200efbf08", - "walletKey": "0x483571bcf8a86632429c1e5e2763ddc6b15284fded8b6face7bbacc084ad05b8", - "dbEncryptionKey": "ca091ff91f30c9b035b4447e888b985373ec643660763e725ffa5561a7a281fe", - "installations": 2 - }, - { - "accountAddress": "0x48d4858167560453112dfbaa972315539c397e18", - "inboxId": "c27b2fd327de00c06b0f4660e801d30259b7587f7924b7b0284bcfb2a3ecc226", - "walletKey": "0xf7ff474374e47f08d013a513be10f0a97a13947866f8af84969d2e12689c8f24", - "dbEncryptionKey": "1ef9fbebd113e355028ed2b6705056d5d4b40a4909338d15ad72cf5db423fa5f", - "installations": 2 - }, - { - "accountAddress": "0x0f4a3a7a131e5214110348421f22b1ec5cea24cc", - "inboxId": "b449da4e9b99a56998207836e0bfa41fe674831afb8d81c666e58a20dff78dba", - "walletKey": "0x2cb0a907b45de415df859159fa895836eb05e10a407d9813aa227c86f0d2e514", - "dbEncryptionKey": "5f1bc20dafff9da3b8c33e439f8f4ed37aad4b1695cd625dc5dc7e3ba1b16225", - "installations": 2 - }, - { - "accountAddress": "0xb857315c68b3902073a545a1a5aa441685ecfe93", - "inboxId": "11b7edac0f0d15e3abb401f1b9cc8ab19962c08847c8ad87be8218a38f85aad2", - "walletKey": "0xe1d4f317d0c02ba3e7faefc3a20bc2272af1929576068e842c2928ebad6c7209", - "dbEncryptionKey": "4599bbc29092834426e31c0c71466c505385f51b8b2d66c1fe398f46766ad921", - "installations": 2 - }, - { - "accountAddress": "0x6c567b415ea1fb42ac7dd70e9435d340bddd0e85", - "inboxId": "c1d8e412a545808b919275de225048c0cfa1a348f512a9c8b437f11c3338aff6", - "walletKey": "0x4ad6197bc60f363617803b9b32f0b4fa73438fe4379de9672c41856e230e0773", - "dbEncryptionKey": "6162c2e5c7592210bc4988dbfcd9f9ce0d42b4524dc4982af767349cdf079808", - "installations": 2 - }, - { - "accountAddress": "0x9aeec1f82f807d79107380ef8c84c76f547164c7", - "inboxId": "7b81382be474999dc39ad4454e95964205efff51c22df9c42edc7809cac2ca47", - "walletKey": "0x17f5b413c38e9813d7431b2b9a132af77614a6d9b35b62c330e3a7ee046ad63a", - "dbEncryptionKey": "246348f7adc8fefff955dca9d79b9208fa3275a2df790f34552338b2301e117e", - "installations": 2 - }, - { - "accountAddress": "0x66b4544be038a26ae4b6140c2c64aee18ce403c2", - "inboxId": "3283670a95a1be33daa2c2de2a4464bb4aeda6445047d5daf8fe1e5dd1124221", - "walletKey": "0x5efab8522f9c897143ff465d8a3148627aac2d7ba13d805329b97531ce3dfccd", - "dbEncryptionKey": "d0725944f8fae3eddcd354f21d019c71ba2308ce5def7af7690aec1111c27b3a", - "installations": 2 - }, - { - "accountAddress": "0x312e3b80403b9eb902615290caab6df4f04c8a5f", - "inboxId": "8615b67271c122768ae9e36ca3e16ba396d9098c757559b54d52fca66c943b6f", - "walletKey": "0x9117bca66957fec2848903dd71ef3de4207644d3c3e59ec841959728fe0d15e5", - "dbEncryptionKey": "e0fb9d95f03be9a571d6c7e070e042610f6dbd19b9066fd59e8e2b81d4b4e805", - "installations": 2 - }, - { - "accountAddress": "0x6ae598b3c911d41cd50cdfd4d6edbc0f9de345ef", - "inboxId": "ca687fef8d62419452ac2ce3777069e1b51f48216932cf58862b4270272a8ec9", - "walletKey": "0x71d8c301fb6a528cb4c956e2d4e3b529f28ec356c78fe28d1ae745a25c154abd", - "dbEncryptionKey": "b318c6febfa1dbc3216f0a8b134408edb877947e48cd678853a269c90706e861", - "installations": 2 - }, - { - "accountAddress": "0x4b4c72ca75c69123478b2b1ea14f407b1edb12c1", - "inboxId": "d80b283013e7d0690ff5584f88793a23961a6f8ddf866f6c0265e4c8a10ee8cc", - "walletKey": "0x855777c4ce4696798a2a7c146a74f8aae4551671fc470dc527f1ddbdd3014e63", - "dbEncryptionKey": "7f3b3352afdca7b1e0eee40268ee4b947728bc67dd54090efcc4e2b073de8d23", - "installations": 2 - }, - { - "accountAddress": "0x4aea02201caec9521ded668977a1c6a64fde3a7b", - "inboxId": "626f0034bbedb4254cad7fd30076f51c44145f47a12326ccf9ad5d07ac57b51d", - "walletKey": "0xeb77683d1cefad3a6bd1466ebdb67a1520eb0c2aecfeeba840c8255b9d08ebfd", - "dbEncryptionKey": "2215f19da2d7013dd6ff24c3909cd0e8039a2ce93abe8a561b2ce92926233a65", - "installations": 2 - }, - { - "accountAddress": "0xaa019696b81f71006d947d13633190eac46b1449", - "inboxId": "33100643fc9ce601575289840da42e47dba66fe81b2faf45560b6ce70e45e832", - "walletKey": "0x1eb9e6c4c167975057398c752c10d8ef9c2377051f5274c3e67b017b6bcff32b", - "dbEncryptionKey": "c0e8410e0f804ccfcdd57f62164ef0ac315663ab206997d42aaaeed95d68ebf6", - "installations": 2 - }, - { - "accountAddress": "0x80e744ce46f21d6c724a689f73192afd9d7825ea", - "inboxId": "39e70674eced8a45713b8d079027759a9d6f594d89aa4c91aabe44d4d731fd5f", - "walletKey": "0x8282e9d0863d4a33fbd46349719aadd3aadb9dee594d07083ab827e1775ef038", - "dbEncryptionKey": "bed4640594e7a309badfd4fb82609c6d7e4b31a19c8028eb4522fb3e904d0be4", - "installations": 2 - }, - { - "accountAddress": "0xb2217ea41fa6b80e51e9fb740b14841c92e86149", - "inboxId": "d61b4072898803204bffd12703659fa57d27cd9537df0a0f165bd9e720a69f50", - "walletKey": "0x29c2607ba08d8e634b4786e716ff2dac23cdd30866ae422ecd19949fb82d4e24", - "dbEncryptionKey": "c5ce7028f6ce58a60ed83dacdc59bca168f5656ede9b4fe1dd6483c01e70bec3", - "installations": 2 - }, - { - "accountAddress": "0xeb262cb6a6fe00c5f46725c1513686cc4815b0a3", - "inboxId": "401660e813f6d1d0e7c33b1c63ea3670c8b5bd47d6475add336c80a79e0cf59a", - "walletKey": "0x341fd6c45caa6e9481901d985c2b8d23ff28d57bba0b5af5bb29c42b7dc66fb7", - "dbEncryptionKey": "b23f449d87455a997560891eae78bb0af816e5695830bb14d399b1eee162b976", - "installations": 2 - }, - { - "accountAddress": "0x520e613f7c0f4d8b883146b2c041a910c908cc74", - "inboxId": "3e12e72ab71eae02d7b78aee62bf58f6d84977525de42c4dd4eb5988c9c9578b", - "walletKey": "0x1da7d2a26bbdef9e1bdce62edf21f2dd524eaf5c1a3abe23989d59593baf3cfa", - "dbEncryptionKey": "bd08111bd6b9d2df3e76d22f962a665e5a6224ef9df7053e56cb12fb896761eb", - "installations": 2 - }, - { - "accountAddress": "0x0b0c8c1ef41357102c7ddc5b27a8999b1978d08a", - "inboxId": "209e6e83fe709b5d1ded8793118bc88cb07adf9e6bb99c246d57d35fdd2b8141", - "walletKey": "0xe4015461926ff60f83a1e0c8dec351f0298e63d6072362cb64b85a719e4c0bb2", - "dbEncryptionKey": "e11ef9d3bcea195cd4c3efa05fccffd62457128963526375da93c8463595760d", - "installations": 2 - }, - { - "accountAddress": "0x9a8f6c03105ac9171d235b912e65669489ca9963", - "inboxId": "88ada15cce3801cf485968ec50ec416a2ca25ef8ff27f81d210352e8faa47453", - "walletKey": "0xa932745329146c36feb4a910b5ea5805f0e2ff07cd74cefb3ef10d7ecced3cf7", - "dbEncryptionKey": "c0a3027e3761f1cbe725788e835550e5b3a90222e75c76f4958610e12737c060", - "installations": 2 - }, - { - "accountAddress": "0xf79b7b541dfdfceab984e5b7b2b4df7b087a92b2", - "inboxId": "ebd4bc360d33c3b991e140e3062820197f305134ea9d96fe7b49fbed2baa8109", - "walletKey": "0xaca96c7746a02726db196f58aa0a483fe8df46eb102578a6ebd0d4cedbe74990", - "dbEncryptionKey": "70cf9301cb4b6eb81f462eb9cd33bb78586b884e441ef2f33e60e23f53fba12c", - "installations": 2 - }, - { - "accountAddress": "0x891be5f49344485522b16c83ba8dd6788bb85f50", - "inboxId": "17d6110563fe45f60015ddc59d876bd57a667d52d535707f66393af40769f1eb", - "walletKey": "0x32997a1848fcb7896eb198b804f7916d16164c1715831ea086381b5b58081825", - "dbEncryptionKey": "c83904641b13db8bd1d7ed1eb160e8dd889afa36651814d2c50cd260688ce130", - "installations": 2 - }, - { - "accountAddress": "0x039bd7b78c1f39a6cc953ecb3a9b9380a46079cd", - "inboxId": "bf9449f3cb45cf0d80706a795508da02ffa5fc6422a41ac87a8da6a4d281a37d", - "walletKey": "0xff46d20bd2968e0400cddf262e9b79b11f49030bd994e02561f6489f8041d774", - "dbEncryptionKey": "df1524bec62382eac4adcc6196654249f70455141704620d7a7569e973b48b6e", - "installations": 2 - }, - { - "accountAddress": "0xaf865b217f81051db4b6aa8ed697149eae42b632", - "inboxId": "f2b60c9e056b7c075bbb118f30a427206764d0319cc56007e4b64c255aef5f98", - "walletKey": "0xcc188547e27495d9b2b3c6a3481d036c31b3883916946c90452f46cb992eafb5", - "dbEncryptionKey": "9c81c57504f7faf4de860d1bab8318b8daa8fde5a2238b57b4abb6ae44246cb7", - "installations": 2 - }, - { - "accountAddress": "0x09fda80147b5aa886892a4882d3a397777e1abde", - "inboxId": "cfe6195db05d4bd082c205f4d5c1c99dcb8ff56982d73b3d0845a95df9fbce66", - "walletKey": "0x2e6a070b0d06e0adb69bff81dcea6b4b0540eaecbec4d63a5d1cb3a2120d17a5", - "dbEncryptionKey": "790da6cc0c4cade21cdc4005ae657e6d6b6ac0614ea0611d3d305c4735a68650", - "installations": 2 - }, - { - "accountAddress": "0x65c3bdb5556df94bf499775c7852f2fe0ac2e7f7", - "inboxId": "9dc0108c27447db3b40fb4cf2ca1795ca94f05ff38fa1c285dad0d4425492c8e", - "walletKey": "0x19162623ff237f8898148a5cc2245043d552a7c1b19fc13cfa986a707c41ea7c", - "dbEncryptionKey": "4f20b7d3716da425625875cd8193208a4ce28af8256e95eed3b641a8b8ff7a52", - "installations": 2 - }, - { - "accountAddress": "0x0a35d6072014a0359960b403326a15dc9e457917", - "inboxId": "8a81a4e6582073f646230ecda59122848de7189a9e3da94b2cb77bca3414073e", - "walletKey": "0xd61b4e3a98005c4f7a843d16eedabf0b5d0c758a3fe05b99eacc49790fab1da5", - "dbEncryptionKey": "5d15d44317b00f249bf9368d7f923fd91df0eed62d9c817cb16ca03de000d92e", - "installations": 2 - }, - { - "accountAddress": "0xb0ad0bc8eb4336502da36241465f98d5d7043462", - "inboxId": "1bc8e8b1a0018fb39aac7a0a50e43b60d255e3b30569b28d0b554cc49d36c1ac", - "walletKey": "0xeb99f688c03e1c58a744f7e29b9dca3e0d69cc6f7c551f7d4574cf40e9fdfab6", - "dbEncryptionKey": "d58d8e4b3edb7c78c71442e0bee23916cae837af015b5d8c8d946c73c02d5d82", - "installations": 2 - }, - { - "accountAddress": "0x3831ad958cac60244374ade2f0004bd4c3676ec1", - "inboxId": "20909f862378ace5554c21c41f2740f9bc1a98900481fe80ced6a8f11e071717", - "walletKey": "0x1eaeb427142fe8a0ea4aad26f80e2e348001d07f9e76842176fbb2f25ee08bec", - "dbEncryptionKey": "ba31c3a4d50e2a82d78fa8fa9078759392e773c122fbfa74667bfa0e26028e76", - "installations": 2 - }, - { - "accountAddress": "0x614527855cdaf169e38ba5da6c60231ecbcae5ac", - "inboxId": "e65edaf00809caa1eb88ac48bca58b3f6fb5e559b4dec44a8fa2ea31e5a4e65d", - "walletKey": "0x8ac5033aa350591e04717409a09638e2ab8dfae7803a6c8aa50fd80eff544e19", - "dbEncryptionKey": "b33a1094ab18b6605087b93012abfe8a072e0f2e1dc7fe6dc14eece53b524129", - "installations": 2 - }, - { - "accountAddress": "0xb620a3db7f1348940ae86e1c25811e50a219b6c9", - "inboxId": "9e029f5760fc450631dfa7cbe695d57989c3a1aac073b1d3523f1c30640576bb", - "walletKey": "0x33d894188040324abebedb959f81ad40d10da3065d4674c180a0d8cd9966bc20", - "dbEncryptionKey": "df1ed7e74aabda39806d938a187efe3f9e7b7d38412628841f88b78d2644e2a4", - "installations": 2 - }, - { - "accountAddress": "0x980a344082fb4b5a7a4bcd9fbfb9e00436e92584", - "inboxId": "9fdfe1798507c88ca0dd3be22183807782c5a7aaaf5bf73b18a824bb31a91967", - "walletKey": "0xdc1db114aab87cb4943d864d8aaaa10040a54dc85b1184082584752cb93050ab", - "dbEncryptionKey": "c08c8ef52db797e6a33057990ea69458ad8bbbf7976b5d8fde6cbfda7ccca487", - "installations": 2 - }, - { - "accountAddress": "0x2fb4e049b7cf25e5e7a7139122f6e9ec380c1c49", - "inboxId": "5aa51a78a62cdfbc34a54fb0ffbd92bce2e9e53c51d47f5b6d6c261e54a4aeb1", - "walletKey": "0x7d60b43db02ebfbdf6f4b9ed215c67755073f418f0f4d8474fca80852cd02ad3", - "dbEncryptionKey": "7efa30e167aa83ad74548409c9b9e15bda1f1f868fa1803ec2ec9199c5c73887", - "installations": 2 - }, - { - "accountAddress": "0x5c557d2249d7d42bcfeddf7872024508399c90bc", - "inboxId": "e2de8cadf8ce5638c81c0ec6bcc22490f25d341c82e9e849773a42ed08b08451", - "walletKey": "0xcc0670c3aa3fe79735d6884faf6f7889b27bcb3f013497f0d39d168a6b133a8f", - "dbEncryptionKey": "a3c492945333f776eaa3391bd2d3d69e5beb08ee3b49aff05696a7acb38903b9", - "installations": 2 - }, - { - "accountAddress": "0x43673532fab93333f793bfd72c71226f0f2e7a8f", - "inboxId": "3d289370f899e8bb663d5b3c5bf125c4391c6e9cc0a98afa75eb5a4e4061a071", - "walletKey": "0x7eab0c50cd7548af94090d5f60d1b473ee9d36d10a11d6e03ed1c253f0c47226", - "dbEncryptionKey": "d81236eab39564764affb28ac3cd44a3042658405185243e12ac5e54ccf270ed", - "installations": 2 - }, - { - "accountAddress": "0x4e1da18604113db78ab582d3a2f65bf6d8c1ce60", - "inboxId": "dc6ece50803b3b314d1bde48774abe5d9665ab9e12047f94360429593116d068", - "walletKey": "0x37868ed179a328efd7a7ea845ab45ada129f5cc082f88a18b8f8afbd313f21d2", - "dbEncryptionKey": "046128742a3022498effa4dd19658e9a4c93b22ec069bebb96a5ea77a00eb93a", - "installations": 2 - }, - { - "accountAddress": "0x0134180a060eb0b756cdc0baf243c3b265c165cf", - "inboxId": "ebe7a84b5818440e243afde7fa4eb80a8aee7e6c44994667216f1a4765d5993b", - "walletKey": "0x851643caa737f94c1dd69c2e884f037e6562990e77ea4ac46d3316a001dc7be2", - "dbEncryptionKey": "abbcca4706f99e4919ec74fe43bfa45dbbcc0ae4ca8a89b1a3940dfe378cf5ef", - "installations": 2 - }, - { - "accountAddress": "0x6ec3e55d9372108939519a24141e8fa27414eba0", - "inboxId": "7e33fe6c470a645410c94ad724b359628a6c54411aa12e2c12fbe0e992c791f7", - "walletKey": "0x5066fb27482f5d962ae6adb8d4acc51a1debd444ad8db582952c963e0fd70bce", - "dbEncryptionKey": "99b6c1d8b5e2fde4cbb3edff161f8318a261176edf142e733d4b45ee7951f435", - "installations": 2 - }, - { - "accountAddress": "0x16923b821e7af2fdc3e93d380bfe0e87bbc9b994", - "inboxId": "9aba16cf1e8b6800dd66b182927eaa801361e33e2d11a43841ece7c232cc6201", - "walletKey": "0x54c988e1816a30bd5fe3377e31d30bd07b1c4fc28292dd661bcedd060b59238c", - "dbEncryptionKey": "e2fbff36b66a820a8da11603588dba25e6a18713e731d17adc18333750b6f2aa", - "installations": 2 - }, - { - "accountAddress": "0x45492003ae73984589ef63e94be8ab230cc625f5", - "inboxId": "e7b5513d262271b78779d201ab898bab5c6522fdee36cccef8eb0d2c6dcf70c8", - "walletKey": "0x2969e77755b77b2a17b08cdaa62728f2492c44c58cc3cf546c917a7836e4eee0", - "dbEncryptionKey": "7919cdd7da97a78f9e507f7a2c6cdb1be6ddd0da138c663d14898ab0073e9932", - "installations": 2 - }, - { - "accountAddress": "0x084af43124b5e5d8d0bc6802c62955edfdb1d662", - "inboxId": "eb39750c9a7451d234e9c142417d2a02d55bf216ae4755715546b28e1e2be1b8", - "walletKey": "0x709c9141971569d6438059e8ac2a59a5aab64b81164096af8f90e2e4f24a7614", - "dbEncryptionKey": "1507aaf0b75bdcba86221c399af5caf8f74a3b591d9b36751fbaff9cfc1b2069", - "installations": 2 - }, - { - "accountAddress": "0x3ac7e239fa3e660ae93c960e0b67dcc608dd98df", - "inboxId": "aa9295dffd8cca0a66c366ec4ed58b7cb4a26130b6d3530acf4f17b103f79b91", - "walletKey": "0xaca65e2e53c756ad49947b213b34f8081e2146a7e7baaebea3f048fc2f07ba3d", - "dbEncryptionKey": "1f77076f6ac58b3a01335ca1f0794e992c7090ec3709f0f3390dec2b5d8e4811", - "installations": 2 - }, - { - "accountAddress": "0x4ba3f0b2054021121c57cd2fdea0d02d5099602f", - "inboxId": "b1516a8420138ff552aeab8158e56d21927d929ab9a6cccd37bf28f5c2dc8d47", - "walletKey": "0x2416f083aba32d54bf578032e8cee9f29bbc2e7b0a8e894cc8ef4d09f0a25354", - "dbEncryptionKey": "05148a715b07e50dc84bddc080217f746c92fdab41dafc81d304196126d1565b", - "installations": 2 - }, - { - "accountAddress": "0x4906c2db71bc2a2eac5cb03ff35b5d33ad3bcb02", - "inboxId": "1b238d8ffc61610f13d1590aa0d8d2338cd614c10fddb26014632cab2b966415", - "walletKey": "0x235fda26f2d8871cb9c83c12bdf94e8c94c50813c1df9f1fb9ff65565b493e92", - "dbEncryptionKey": "5e49857a5e2a96470e3ca1cb57f9376b1d4aec5c15825a3ebabd879b1e7591f5", - "installations": 2 - }, - { - "accountAddress": "0x02666a89fcffd6831d3b217ef323967d0ff62132", - "inboxId": "38830d6b7c45a2f9a6d3ded20f5bbbd23946ca41877f80a0d207637db9ae7be7", - "walletKey": "0xed776da22f689713d2eff0361ea799bde90f22e2884c8dcd21d7dd507a3ccee7", - "dbEncryptionKey": "acd3357d42b8492324c201d69e753c5e0c8973cb3f39a10c58bfea8925f36dfd", - "installations": 2 - }, - { - "accountAddress": "0x920892311f941796e35765a241f27fb6f8af0cf8", - "inboxId": "08004d3c7c82fb48b02314b1c84d7e5688e57a75a01231ddd6c2ebf2810a5b23", - "walletKey": "0x8c4d9001588db54beafe76514b115065171572d2210503cffb6deb03e0f20088", - "dbEncryptionKey": "3924019ed7b9fde2a5c54a7af7fac1f5d1c162fe249bd27a8fadc4576f844115", - "installations": 2 - }, - { - "accountAddress": "0x5eac3cc5fca4ed090c33cdafda9f798e81028c8c", - "inboxId": "05f91bda4a72e972a54d37459670731e84e7d8d4d7b99e100dde7894bd3228b0", - "walletKey": "0xf05a13e85fceef1e0a3c7491e00620776c4aa53d8d82e265576ec1fe4da165b8", - "dbEncryptionKey": "9096e4079477da4dc664e8d9201c7edfa165ef9a3febc073b4b88126e46c6ba5", - "installations": 2 - }, - { - "accountAddress": "0xc1c69bf53d078fc12eb82f503e1e2bf84b4960fd", - "inboxId": "4512e2a52de3847d0e298fbb0463b16b3d080f9f4d1999a2f7bfcaf7542a8f02", - "walletKey": "0x3ab42041abfb66808e3d75f89b08a964e215f604ac6ba2ec1501169a885468c3", - "dbEncryptionKey": "bd6f561ea2cf74b6f296d004001b82f2f6831f917399c0f35fdbe85d20a6c8c0", - "installations": 2 - }, - { - "accountAddress": "0x977a29bf2fe591f9b124ccb596b4ab00bc2dc4de", - "inboxId": "692136ce3fabf871f4bb67b704b943f3dcab6338879090cea8468ca648e8c722", - "walletKey": "0x72dde9d3e20be8459b254dd1b84dd50db3c254675f7e6010551e0245c47290e2", - "dbEncryptionKey": "056ce62fcc0b2f9b08a2ed687a662ecea7ea89d5eaa67f8cb1df3de6c40da9a1", - "installations": 2 - }, - { - "accountAddress": "0xc59430a59bc9681428133f9e5e8ba59310d6d8fb", - "inboxId": "c7cedc9721a73d39aacce79b11cfdc3d57299b4c9c50340f05dcdc4b8d20d5d8", - "walletKey": "0x5adc71bc7120ec99707617923ebf7379a7b80557707696c37b87e9fd0cf157e6", - "dbEncryptionKey": "132bf43a92696971678f1c49db7509084f7215a0e021ff39785a8d7bc5e65ccf", - "installations": 2 - }, - { - "accountAddress": "0xe166a99461f5cde03edc832fb841eb48f1b7c95f", - "inboxId": "40c7bea64d4a1c55c4e78c8fb216139d4d1db0d2754029608417dfd50c34a75a", - "walletKey": "0xe9dcb2d4a0d45fb1d8bdfe0566d02ce10e0f6809e4cc2ed46e14af5a8050c7aa", - "dbEncryptionKey": "7ab8b8ec21c5614a9deddd180ee21089cf2df17082d148680d63a3d40f763832", - "installations": 2 - }, - { - "accountAddress": "0xfdb7687b3aaeaa0a92d7ccc57fd5976d20ca1e8c", - "inboxId": "269868e4f3822ca6060a23e7753fd4fea17de026e7f1b41de6d342246062aac2", - "walletKey": "0xec4afb755d9815e4a5b7350fe6897843c35a32923af46fbdd7e7a2acc3c40bec", - "dbEncryptionKey": "70c31b8b8902e2f5aee84cf7415ea056b979e15b9e3b21fb42667015a9d74c21", - "installations": 2 - }, - { - "accountAddress": "0x2000774cebb4431251c09554d0c305bafcf371f7", - "inboxId": "04d1111e510aa1e2adff1220f52f538a4edb4d2d555035616b34dadb3842c277", - "walletKey": "0x79675cbaad4fce95f9be154e9e8004b7dcbc426fddcb1ae1c188022360eb5046", - "dbEncryptionKey": "fcbe43a1e0c6bfdbbfe7b32620a73e4e1c6c3251022241b863f35e11ba67bb24", - "installations": 2 - }, - { - "accountAddress": "0xe35e6b0cf39aacef401547e024671595ade7e807", - "inboxId": "40113e7ae5cc167ae29f8ae00c51f10366407ebdbd57ead8ac69592a5f5a47ab", - "walletKey": "0x6b8acaf073ae4a943217a7f0164993dfcc11a0cc73436c1f070e14e4450461a6", - "dbEncryptionKey": "70494be9489b4e5a10d05749573928381904fe5a3585128172000184fe21568c", - "installations": 2 - }, - { - "accountAddress": "0x791952d8fcd6f3b06527c289612778c812df05d4", - "inboxId": "4959b8b51ea4777930311ae73e0aa13c87e42fc412270da5f868decb0d838c29", - "walletKey": "0x418b3496ea4f81a0bae59106059f6e79a9b7f1d87bb6f878cc34347f02b6bc71", - "dbEncryptionKey": "25f267909f6d165fdc59219117699507d4392da990e627098764dfc32124b3c2", - "installations": 2 - }, - { - "accountAddress": "0x76d8c35297ca2a3163862fbed1fb06d82af7a5fb", - "inboxId": "fce305c744f3857be626f55402e9c776cee61bdf918f56c311512b0605b0d323", - "walletKey": "0x6541ae27ed93266d0a65663a73d27ca655f11349d3ea36406fd799375174d00e", - "dbEncryptionKey": "f9442451eecb7c2ef010a9627cf7d991fcd3ee357be8ae67b7f389c52a470af8", - "installations": 2 - }, - { - "accountAddress": "0xffad0effc475590d97b6da04df205e4c1b72cd16", - "inboxId": "9de9250937407b1552e12c9a8259d23f1fa538a9760a93d9272cc8e0752a0150", - "walletKey": "0xabda656e588cde166271d6c5a39de76a23807ae339bfdc3b58f984026f188877", - "dbEncryptionKey": "eeb5ddfe308f7a0b53d3a37ce45ca09b1cff9e9762b6850e6de8c8d2b176cb4d", - "installations": 2 - }, - { - "accountAddress": "0x9b3ac871c910209818bf123b6cd0fa491fdb9211", - "inboxId": "41155506348ae57f7ac9b1db5c5f8d2ed6dc64c7e579b7e4e28de504b1951c1b", - "walletKey": "0xc0d3ac269304221cc9826f33c12c3a09ae684f43db0b6c4affb7cdc10d7166b2", - "dbEncryptionKey": "b707135a165b08a1699c6788187c83c28baf68b65c3639855b4d7871a45abbe8", - "installations": 2 - }, - { - "accountAddress": "0x8bbdb33fd412513a7043e5cd78a989608046aa1a", - "inboxId": "ab09e95b4414f7841bfef0f995c9430edeb9352425d0b148b8540e84b2c9b525", - "walletKey": "0x6f4f8a8f83dcaae0396c14508a456e53c1ca89057ddda2b2e85a24e3e6b9023f", - "dbEncryptionKey": "5509e460bc83ca86face0122af1b1dc96b84901a8676fac3ee8c51312e5d2a51", - "installations": 2 - }, - { - "accountAddress": "0x8d7dd85d6c2247d362b5fde5b483a70e088105a9", - "inboxId": "5c6893f74e78ed544b2ea08b57a4216224a6a1f25258d8b61896fddbcbb5f9c7", - "walletKey": "0xc04f1b3441554f886150df2344eddf1b910aaf4276a5f26ee7c8166f07188db1", - "dbEncryptionKey": "122ae032ecdb0cbd4f8b4c0cf7f05d16f6061943dd15753706c3b7d736927f1c", - "installations": 2 - }, - { - "accountAddress": "0x145b2acff649dae09c7433b3af2f979c33d340c7", - "inboxId": "7655e71f8c68dabd32d6d205412a3d6f7117744a2b2dd960138bd833ac53be25", - "walletKey": "0xba0c33d1a71ef8a5a09e060306db7e5add96ef72a98dc05cc90e963291729d10", - "dbEncryptionKey": "33379f1c35b4881254aed6af2e567a44c1e6810b566b9471bdd845d5ef201e3c", - "installations": 2 - }, - { - "accountAddress": "0x120c7433bd312e1d669fcc670bbcbb0313771439", - "inboxId": "c1dadad97678016529dd81e28f0679a3f13f349672239c9f4aa86b7144edb0df", - "walletKey": "0xfaf3c0116ac0ae0c695b551680e41f97206e83809d6a735baebbb2bcc58951dc", - "dbEncryptionKey": "ff9248fd20d29637f86d96c6b1c82a9a028bd82c393a6c693a009e095224f12a", - "installations": 2 - }, - { - "accountAddress": "0x070a2461da48685611cf2aa14ba292f32f094d79", - "inboxId": "7fe1058e348977897db6449df58b7efc388dfa9f088429d305535e8c974b1279", - "walletKey": "0x6e33c32983d96a12680d7318c0e964c5558babe3a92e86b0d49442f1fa083c0a", - "dbEncryptionKey": "ab8835acb8eb8a6d93754e304d0792ffe22ebce84110b608b6c2edaefdb097d9", - "installations": 2 - }, - { - "accountAddress": "0xa8d6349c58975d05384dc38fea55eaacf98df5b4", - "inboxId": "3573eeb7840309ce095c1c0a4eb872aea443b8f30463a4e774e5b80e74e9777c", - "walletKey": "0x498759465d44dc781e4547d36d9805dd0bb9626e3f15e92004a851adee650f54", - "dbEncryptionKey": "8d020535d3f204690d6dd3a6ad48f709828a350b9a5389428203013b793e44f1", - "installations": 2 - }, - { - "accountAddress": "0xae8091566d0227a8319cb6a805eac321a2a77f21", - "inboxId": "740511fd464273669290eedeb091450980bce2b9ea32e08f096b53fa38752a88", - "walletKey": "0xb8678f6e0a8da1367f3da26e45fd6637d11a9eaa69124f8edadb07099abf0edf", - "dbEncryptionKey": "33afeb188df4e940bc7ffd773bb8e91882afd840126d17628b274f4b5c074dd9", - "installations": 2 - }, - { - "accountAddress": "0xe30f2618b21900ff666aacfb2f9c0e2abb080e9d", - "inboxId": "70dfd8915a68bae280920585ce0fde6dc0f6bdb0966ac642fc050ff7298cb389", - "walletKey": "0xe4c9ba8f505ee0b6185190e2be9584af9e2699302d812ba3bccb81a8878b9ce9", - "dbEncryptionKey": "5ba167abbc73f657da1f24e9b4f48784280cfcdec029a832cb7b954b81dfb77d", - "installations": 2 - }, - { - "accountAddress": "0x733023c3c9efddaa4e01a25f61bc9e90d9be8415", - "inboxId": "640b75b40293e5b8f2a5ca534d96bb5ba6c5c131da898c35d7f4b979aa96a270", - "walletKey": "0x67de6014f1fcd9ffd92093c27e1e6f8ee8565cd7139d26ff6751f18ebaf78d69", - "dbEncryptionKey": "1c847b7cd1bca2736a50021c71cfb9a65b1892764151e3aada5362aac2f378a4", - "installations": 2 - }, - { - "accountAddress": "0xec64f8903052742a8a4bdfb92a018a9b50fc63fa", - "inboxId": "9b4d4660ec6ca4ae32106f04bcc283260de74d25ee69747f8584b56766b660ed", - "walletKey": "0x086912eb751a8a05f46b2643de69ec56e8cef5ea91ed28adef08bb9de1abbb45", - "dbEncryptionKey": "37208dfbfba8812ff3d7d8296b350078bda123cfc3e987b7e7799054e4a7dc77", - "installations": 2 - }, - { - "accountAddress": "0xdf90aed5208037ce405beccb7ecec97288588a16", - "inboxId": "55f49bc8268c5f59f02799d2d7c0e2e8f7dc06a5ea25b942ddbba0d11fb1b7e0", - "walletKey": "0xa4bc19a03f3b9ac7a81a29c8f21b8fc81ef4a1a8e9f48709008d1c23de92f004", - "dbEncryptionKey": "28d6b159b82fc9a671af30674b57bef1b47d8b906d7b2bc6914f2893d9bbe634", - "installations": 2 - }, - { - "accountAddress": "0xf88c630e757732c86f3c8a9e474ba99434fd4bad", - "inboxId": "33c577257f9f05e40faccdf35756fefc4f769d1ee5b383b3c257686ceea196be", - "walletKey": "0x3c93244af7137fb2225dbb6fb7874e0a83774c1bb81b5a759600e313ffe519a0", - "dbEncryptionKey": "019b4faf793f1b79448754fda3db632596293cd58a2d44314c79e5d7ae44213f", - "installations": 2 - }, - { - "accountAddress": "0xe15b0b6bcc7f8f4d552d3b472564d6866ec0e39c", - "inboxId": "e751aea64ef7e6137a081226c842f46e04b7cc93dc1d0d8e38e1e66fdfb8d719", - "walletKey": "0x66677609be4a39f190f0c66e37d193a5bd35b83825a3bcfedb04c729c036a3fc", - "dbEncryptionKey": "3b6710944099e45408df458e028890884be0a868ce3f72cd2df292725e6c8ec2", - "installations": 2 - }, - { - "accountAddress": "0x195cc62641c68a406027630357a02593c2bb3600", - "inboxId": "899e4e81109b167a6bf1cc467facf2f3d131e10267fb88bdf5d495914f95b54a", - "walletKey": "0x00885115eef5c4e6c375d531f6356e3b93c2844c5ebaf061224f9b2c0856091a", - "dbEncryptionKey": "560f974e94469a5253a49d19f94bbbf70c788494859b6b9caf2f06e8a378f935", - "installations": 2 - }, - { - "accountAddress": "0xae49b5644918c93d860f9111c572ca71d14e98f6", - "inboxId": "c0577656558de1581c9ae7241e3623ad081032e79e31ef626de451659b09384c", - "walletKey": "0xf80864518ebeee05b6de789ef662e5139295ed1fe486d4102cbb6008b270f0df", - "dbEncryptionKey": "be129bc956b380c060881ea08e7820086948bbce36812069d2ff01b5f947b1f2", - "installations": 2 - }, - { - "accountAddress": "0x8b7b353672c56a6e4418fe90e79da21112e61d64", - "inboxId": "306ff3e3d8099392e6e87335eedc7853d2b0263a7233e1e8eb435352c5f95ffe", - "walletKey": "0x3a1ba5b733e3252fff87ecd5a8f9708c9d34d6a9f542dfee7c448115dc120747", - "dbEncryptionKey": "2c2c8e947cfc2f2a286335b333eab400c4ecee06ca8ab5108f89aa4399dd7e43", - "installations": 2 - }, - { - "accountAddress": "0xb4d30ebc3544e0ea3a05e478ace9984c100f6074", - "inboxId": "d4b5b0547871c721ef2ffb5478732d65712a2413b1de3d41601497b72822c089", - "walletKey": "0x55dfeeab2387939a4e1ef6a3b13d646459227af23688f2c59867c364b3ad3657", - "dbEncryptionKey": "494bb32bf8ec37e8f0e9fe5ffd0a146dfc1c9f3069e2b8f3bd0be2fea61746fd", - "installations": 2 - }, - { - "accountAddress": "0xdfbbea10312b7bc7dfb7cf0121c52d68a8d67f40", - "inboxId": "39eeab33a93eaa53cf09d1fa122fabef684310aeb1e3cde1555f71bd4d0f0f86", - "walletKey": "0x514c49aba3632c9683a97fde77cf3f12db0f75dc377ab4fbcee7566757cc6a14", - "dbEncryptionKey": "9b1f51f386da26d471349bc70a9f9f2957688e146046e1aa352c7391a11701a8", - "installations": 2 - }, - { - "accountAddress": "0xc9f2796899c48c39e0884d35c803535170e07c88", - "inboxId": "e30c60bdf905234fca590fd6eeee78f4ae7a4dd89030262baa9b35d9a07d2117", - "walletKey": "0x28bfa9193ad1acb9360f263d0074d3529202874f0aae56b593b14a71e7ee6c0c", - "dbEncryptionKey": "b0e56f88859316eda9b1d83eeaf419a6513f7d886b331ff5edffe110686ed047", - "installations": 2 - }, - { - "accountAddress": "0x286f626ba201c3101d61ba5a06ae40a189f2c887", - "inboxId": "449c0ab2cbc78bd859aace02ff9d5f4c108d4df7a8d10049f1db3ac70b007a55", - "walletKey": "0x24cfaebb0fa7ae82a03adaf50d507dc1f31ac5ab15fda2cd0706196a5a630045", - "dbEncryptionKey": "0ba0cd98a3119ae1a22eb6c0a4a1b03b082e575efc12e93b9e187effc8ad57ab", - "installations": 2 - }, - { - "accountAddress": "0xa399d09c939dc727741c9ec27ce27178abb414b1", - "inboxId": "14a2796033fb380ab2c8aff05db521576a63dcebe034ba7d6f5f7cce735aaeea", - "walletKey": "0x4478814a5eba6da6c2c57f8cfa232fde2a9162098c650a393cac9d7533721de6", - "dbEncryptionKey": "a1f042ae822dd56fd41cbd4ef0416c2ced7cad7966f0766ecd35daecffb62791", - "installations": 2 - }, - { - "accountAddress": "0x8933e9f5b071f175157811f9de82ca55f2ac8848", - "inboxId": "8c7b602a9883dec1e3782b6f48f3970825bdc775528d0b6a846009668e914ad2", - "walletKey": "0x01a1d3d297a4ec2c4fd85fb0ff86f220dc2936f60868c6128ade4ab91b2bd53f", - "dbEncryptionKey": "7265f969cd0fd5ea1392c1613842a0f1f4221bf179a1f71b838fb43f073e9186", - "installations": 2 - }, - { - "accountAddress": "0x4fcd93248a911a99d6a1d70967c113271ed1c534", - "inboxId": "d6fc9367b68bff7baa46e0121a12778c4f9e31c80eae44da71624f8bbf1ca597", - "walletKey": "0x542ac1116d26d0e3af6556cbe1fd6afd392dfa6ae932fa15cf2a142e6ca2276c", - "dbEncryptionKey": "82cf76806b65d6b0935a23aaf632d5a146f2c0fd175155f4546064afffc20934", - "installations": 2 - }, - { - "accountAddress": "0x5a8fe953ba1f12d1110c80e7c9550a767671f36e", - "inboxId": "5c33e1631e97986a2ddf421875ad4df6c60c901f313e81c3851da34a3ceac1d4", - "walletKey": "0x1d54600c40ecceafd793f13e6bbde755ac4a48186dedc65c9636e887e06ebc85", - "dbEncryptionKey": "81df74faba8324c3cea8efc9c12b772b421b0ac7319f11973f4ed946d7c70df6", - "installations": 2 - }, - { - "accountAddress": "0x10bc346a31bcaf76c0cddf2ad6a32589b68aa4af", - "inboxId": "e86e80a4fd1b34eeef8487809abe66f2b2eca0211487cc257e3fb6009544766b", - "walletKey": "0x72d22791daba5b36bc8f9752e7cd1e749d7b12730c0ecdb89e3765015e534329", - "dbEncryptionKey": "ddd55009d41f3d784f43868794cbf09faa3eb275b63a6b92c2c769f40d2970d8", - "installations": 2 - }, - { - "accountAddress": "0x4edc3d65fe57aa261541f92e853c83194f3ef312", - "inboxId": "0e95dd2c29d3ec71044aef9628ca1c55b722bdac472418121bc7d74fa9a789b7", - "walletKey": "0x46a3f69e35ece69440c85a8321acd4003b2cda5724fd38285709c5d7688c80da", - "dbEncryptionKey": "2e3a866973bd6cd8b35e070dfc9f908bc5d5253f7dd8e11fa59c9848ba141132", - "installations": 2 - }, - { - "accountAddress": "0x1b34168bab7bdf83042bdfeffeeca9333d0671bd", - "inboxId": "a5c50050a04f85bde0252f06ea340d9d173f9d13c7384e1391959cf3923f714b", - "walletKey": "0x68990eb61f21c3674ba0604cb31b3a82d402839cdb8ca98f8a5913245b8341e0", - "dbEncryptionKey": "9fd546bf65a74b08d8fc2700b293d8d0fc42829242fa1660d5bab0837cb108b9", - "installations": 2 - }, - { - "accountAddress": "0x8247ed80285f2e6d29cc419faeba6f1b88165e4a", - "inboxId": "8ac0b5e5bcdf10cdfa00a66756cfeb78a560422cf618946d977cd721744e0d9d", - "walletKey": "0x240ee0577f599e539d0bdfbe2e3610fe470dc6c3d9ddb105a45dfb940f98c647", - "dbEncryptionKey": "746c582ffd0efd9a38abbd331ea6926330c440491b08fd8cd189fcd493525da0", - "installations": 2 - }, - { - "accountAddress": "0x375da798278fec1bf88810639522e95ae7e06207", - "inboxId": "9ef742ba86c55ea4bf95c7ed21dcce4bcb94a00f43690f6ffe9aeafc6a3e078d", - "walletKey": "0x6ff889432d1ecc5c26fe0e7902969b451e6c7ce63aa12d1bef322f497bf9e8e0", - "dbEncryptionKey": "1f5dc009ca122c25e7a0212669e80fb4c7714183a5e9b26c1cbb52bedfa1a8b7", - "installations": 2 - }, - { - "accountAddress": "0xfbf0aed87e23353f826b8cc6a8f4fd8bc3b66f0e", - "inboxId": "0401a399b4db508db0a9fe09fe92ed7f5fbc1a813baad4247a14281cabb5b3d1", - "walletKey": "0x41901de1ff12b5fc1834d57bf964c2a8b377f392d1e13c1c916a6c6bcebfc828", - "dbEncryptionKey": "f66cd0db6e09e7c7f99cb3a4cee93767303f5ae7f6a1ffbcb4e4a99cdb84d004", - "installations": 2 - }, - { - "accountAddress": "0xbf93dc4a98a98ac23cdccc6ad73f90f89440cb63", - "inboxId": "fdabc08be83c197b4f81904ff6231bb7a4f5c6c8bf4efa9733874ea6cff8b9bc", - "walletKey": "0x701a271c62785b3e4ff96ade58e8accb80a76aefa1c5427628804889c9b8902e", - "dbEncryptionKey": "1f27a707d8c98d1363af3c73b27be9437369adb14e969d6a59ded8e9f7603766", - "installations": 2 - }, - { - "accountAddress": "0x6d6dbd9d003e5625efc78d606886567db4fa8de2", - "inboxId": "3dc9899312f47fbc6b621f375379c7ac9b89c48b61e9e7e2e40249ff658a7e0f", - "walletKey": "0xd6737c6245e3c3f4793f68f5cf678b1e71a03677dc6baf7a126c3585bddd3559", - "dbEncryptionKey": "6ae11f4dbea7d29878bfdd78c4ea4d87cddce1a580d80bbd769732788173f74e", - "installations": 2 - }, - { - "accountAddress": "0xb5614718ea2f356abab8bcdbce891e9a2203b382", - "inboxId": "14c62dec2551f260e5a4f64bba9feab70f73e33184f93e4507c39a2514f83621", - "walletKey": "0xf91880c047a1ef776fd2cf8e83812f6dbc6218fa522c0b19c01c4d6240ff6d68", - "dbEncryptionKey": "f0dbb8d450db8503c859a4a70a1c65328dd94b54a331a84e00d544f245a15c9f", - "installations": 2 - }, - { - "accountAddress": "0x2a4754bef1e33be9f614cb506f62721d0ac59e5e", - "inboxId": "af5f8e0be8d51259eca34c4ccac8bccf111b6b6c6a2416165c5453a702ffea80", - "walletKey": "0x643f331f0fad07a8fb02ca08017ef3999ea2d8c0ed4cee95604f9a766a0aad4d", - "dbEncryptionKey": "3ef92511b533b12859687daac0bee3900215d97e278951f36168dd406c7f85a9", - "installations": 2 - }, - { - "accountAddress": "0xc4cfae9e23e7151fe9a32fc3441e8335654f1724", - "inboxId": "45efe6bda465476ee7d0d454406a8dec4104f806b5c4e189183cda1167218710", - "walletKey": "0x50213de5b9383c0f57c1fb327932d105fee5175261c0ce66500250817085a8e2", - "dbEncryptionKey": "9c7db636b6f1aa17e9e39be1f9bd77c41e1ca36842f86ddb368ddf268a1d6aea", - "installations": 2 - }, - { - "accountAddress": "0x0029ecef1b7b60bf0768eca8a3cd52138a911d27", - "inboxId": "6e85355662205967ab2465c87a1288edfd05b671e77f7ac65d8a8629e0768e0e", - "walletKey": "0x484a496a94b81ba16a829ad053a460595103eed65d3778382aef892b0f360bfb", - "dbEncryptionKey": "47565e8e3ff11327588629202dc3870ba09bcd38d55794104f84ec41e254e4d5", - "installations": 2 - }, - { - "accountAddress": "0xb5c78fc3b2e238a35fffc87fa804ecc278b7e64d", - "inboxId": "7275f907f45e22a38cc0369a4c81b3906d8c02233722c69f4cd5ee8e5512ae78", - "walletKey": "0x5bed75c2196eb0f90913abbe07b96f8baa69a996d783ee689b74321af356421b", - "dbEncryptionKey": "162b68fb2e06386796ccd19184dd671c9746d24fa9a2116c9329c1a7cc21cd3c", - "installations": 2 - }, - { - "accountAddress": "0x857378015732b13a2f01fd108b7704c709838828", - "inboxId": "450e3f5480a1165dd49f2413f19aafeee2d412d885df7ef9ed9a411b948df9fd", - "walletKey": "0xf948c7a2e5bd1c36ff3c0587708fa9297c0ecbed3b0bf10fb16bb67402e51481", - "dbEncryptionKey": "2970555c6f5fcd7094d59e207e212a28923f9aff51f74aac1b312ececd2f56ae", - "installations": 2 - }, - { - "accountAddress": "0x1689b4a9d7065885872e73524dba52767e3251c9", - "inboxId": "68333fe79dbfe07a68d854199c651774abbdbd5b5bddc363b79a2d4cfa2e80e9", - "walletKey": "0x35a60ac4bc07faa12192530ddf9365c83fb9598f7118349e01d4f9aadbce421a", - "dbEncryptionKey": "664c9f1fd2c06f3e9f0c939e3bb079aa37e8ee5d126a7e04f292609a94938a2d", - "installations": 2 - }, - { - "accountAddress": "0xbd1e5a1a055c08b98f630f6595fdb6b0667b2094", - "inboxId": "97f4d51d9b55d8af652a2669ffee04e445b508077612226d53b76090858c86fa", - "walletKey": "0xf7c7e7b06d7fc251465dd882c37f7a4c5163edeba244c600bbaf9daccbe60eb0", - "dbEncryptionKey": "b11313f366c716125f30f5df1394d3177cebc289430d3fbd449eb68a3843fb2a", - "installations": 2 - }, - { - "accountAddress": "0xd4f17e3ce459a7516a5dc30e87a08f9c68aa2dda", - "inboxId": "ace506b6c95468a8e05c822c778756c4cc157b44053d4b515d8720b54f9d8a4a", - "walletKey": "0x7ed9550d853c4b57b9ad3408f72bc88fbf3b69df4972628e0fec6900b471d671", - "dbEncryptionKey": "735f37ba5c991e69358403607dda2bcd34bb3761c5c5aebd9997a4e682f2b745", - "installations": 2 - }, - { - "accountAddress": "0x05983677f8539f8be373633c77f6a5d509da1143", - "inboxId": "4ecdce4c704a178c9a861b1065eceaa3c522afccca7db497c22b6e293d19f9ca", - "walletKey": "0xb3eefc5a551989a2b6e726dd05e40347db79bfab8b7dde1a6593bad3f07a87a7", - "dbEncryptionKey": "6df9e9702cf00b233b54ffa9bb609340a8afb8d647baf2b47357cf6203816cc8", - "installations": 2 - }, - { - "accountAddress": "0x032fe02e9c80728b08c58f8e57f3a70d9a790521", - "inboxId": "eedc5d524f4f861f547d9c57e0fca32bc64cc23b0237e6f9dbcbabc72cbcb33f", - "walletKey": "0x630488c5d33178f37ee90de66658fa693156895c19fde305821f5a747620061c", - "dbEncryptionKey": "9c087ad182fabef7a6ea571c8162da738e51b8796ce35121e473fbd3972f53e1", - "installations": 2 - }, - { - "accountAddress": "0x6cd2a66f2c073db73f8ed7b1a2e6e5db5fd7a403", - "inboxId": "69d2c242c0b83cf0197b04355d2e6f26275b9b7711d8d37245e9e4b8e8f7d240", - "walletKey": "0xd79f7db4741c98dd9d7606f5c510783636efbffec1c3b1e891bf121abd757500", - "dbEncryptionKey": "c6ee955a4d26e0757b97e2101a902e7d00ce9cd218ed664a076d577824427ff2", - "installations": 2 - }, - { - "accountAddress": "0x6b2af82090e4df6afedac6b74477c1806216e98e", - "inboxId": "21a4ea45027f2780affe9dad949c944a3561bd9aaebbdf2081970238c66403a8", - "walletKey": "0xd8788ca7cbf48d1aca2cdac6dde5fa5fdcc21e9a9bc8759dc3c848de5a02a4f9", - "dbEncryptionKey": "2e4cc340e13532ffad4ba09028df52a74f4720235877e0b3f6687b8499ffdb8e", - "installations": 2 - }, - { - "accountAddress": "0x983fc68aa8180b2ee17e2b6821c7fe7c0dc60564", - "inboxId": "cd2d4eb0555704807defd73fde4cc5fb3a0e0f0e15c199702d6b651e13d305bb", - "walletKey": "0xd52c56592330a68442e7d5124523b6103bd75b1db7f95b9bab4fffddb4562402", - "dbEncryptionKey": "e72baa2c345ff4a10af689122f5fd7fc22260cf474ba323d876dc405cd0a54c6", - "installations": 2 - }, - { - "accountAddress": "0x19c19ffcf3501f8c4f48ee6cd52bcfce8f973cf5", - "inboxId": "b950aeaf2f897040f53ef15391a25501b8d69bbf69f5a87af1fc0ab5f7e26602", - "walletKey": "0x055b19abde2de5441f96bde4fe8bd162074a267ac7b7d25cb58074190ec2dbd8", - "dbEncryptionKey": "769ead4e3c0bcd7b2a3cc4272ba850ceea1c8b1ac61684706edf1179e2922fdf", - "installations": 2 - }, - { - "accountAddress": "0xc7b5f8f26fe9b2a785c80844128a840a219cc6a6", - "inboxId": "9c92d52e577f908d4e411a4d04e3230bc3ec8b06acd11c6b988497a325626e20", - "walletKey": "0x5f481323c31f995042776a306c3eb19ef8ca6242802b4d7607e472bd751d285c", - "dbEncryptionKey": "9f57d4e36cae3e8d63c1b2cc0be0015c776950ad902a13b63ab70a6c05568be6", - "installations": 2 - }, - { - "accountAddress": "0xb1741a75e57279b01322f097ff7439aa6293dae8", - "inboxId": "9b4e0648d2603a46acbd34904b6b69bb44795a2729bdf0d2d4a6822c045a44c9", - "walletKey": "0xee0a47a54968b96ad2b8310f38cf48c4a945d1c43bc9c2ceb92d5844974fd8b2", - "dbEncryptionKey": "d00e6b90799c83f906b401da5ae4ba1127a1d5fa55e1640b51b9491fc209a896", - "installations": 2 - }, - { - "accountAddress": "0x5bcc9e7bdd9b5eb28b129255961730184e6d3f69", - "inboxId": "e09309c64fe7914eb5a4f00b3963d4397f759d2ea6f87c18ab80254f6a4e4ec6", - "walletKey": "0xef1fb35892a292b7f9d9f2d5cc3caa723d9f2a9dac0855456a2e63f3655e0087", - "dbEncryptionKey": "6067e9800c4bfb8b2fef46c715c096a001f262d3f06e828daa3afa3c13f7d0a3", - "installations": 2 - }, - { - "accountAddress": "0x7a864a5540245c08b92e814177092ab1c24fb86e", - "inboxId": "5774bef27710d436da5099781a69bbcef682003206479ebec045ae94a1d8685e", - "walletKey": "0xae641918b73509e27cc5ec278149876cdb0a2f785c223a004e23f5e38e0ef529", - "dbEncryptionKey": "881a45e6cf9581758166b8eaa1619db633e20e9b4acaa9a50a71bccc137dcb55", - "installations": 2 - }, - { - "accountAddress": "0x9a2cd4a7d57ce51d3f71bcc0556ecc4a2ee1fe17", - "inboxId": "932be8eaf4bca21568cd29b59a689202f66e883a71a193590a3adfc5997cb835", - "walletKey": "0xdb4fb03c6d87ede67927045088ed45b2b3ea269f23710c26bed512178fdbf4f2", - "dbEncryptionKey": "c7f52178b175162c5ca450f8608e306b82ad095f1d3d76d3734f771cbf5d768b", - "installations": 2 - }, - { - "accountAddress": "0x6ba7a563231353f13e32c6fc240a2cbbeb12e88c", - "inboxId": "a9d88e2ec1ac5f53de0ee1ae62b9dc37e43f0a2f72c4a2296f5957dec5a5765b", - "walletKey": "0x58fc6f25e06903b92a8acc2cac65b8e710d25a449043feb03adeef3a0ca5a6d8", - "dbEncryptionKey": "12c0248bf685c48ba5cfdd86da315ee9532141fee6a0fe66d3b7cf1dc6677338", - "installations": 2 - }, - { - "accountAddress": "0x26de466ea0649a9ca69da43f80b0d02c5af2dccd", - "inboxId": "6218e0ecd692252f4e1b4daa54661b061a35c04d407d102f9cbf046d71973e15", - "walletKey": "0xe81e130588dfaa0bbb28cff301b648bfaf0253c04d7553141a049056557815d9", - "dbEncryptionKey": "24b7ce9e7cde2314ddda1b8073c5148fef0c591f869f3c8bc7cb50ca7847d083", - "installations": 2 - }, - { - "accountAddress": "0xe34707b08424acf6a30c14742fed4affbc770dac", - "inboxId": "997484720d3cacd39bc50acb3081f5f6ba4e7ace0bc013236ac36b54ddf62438", - "walletKey": "0xcc0e3e1564fb40d354c0f9c0cf36258c81a19c5f97270f67cb1d2ac5e5dc4ad3", - "dbEncryptionKey": "be82cd62fa6ae1e754d8cd62c66bbdbe260c8592fb4002532f80a7f148063331", - "installations": 2 - }, - { - "accountAddress": "0xea04f03d14b98b04612ba84cc4d98be4f1cea919", - "inboxId": "251a9feae0f1b3034cb6a3e5c0fe84ea0b88e50912e10cf51ed50befc82a51c9", - "walletKey": "0xf7de73e64aee740bf7a1bb8df52fc4f0b7dc5837cf43408088be14535738ed4b", - "dbEncryptionKey": "32c719469ea8331ec5b2ffe0f6060607f6faa852809a98df144b503a55617aa9", - "installations": 2 - }, - { - "accountAddress": "0xa45eebd3f29ee5713a318bd3ea55fab347998373", - "inboxId": "68280285cb0f0fbc0eda0fab661593129c1b31854ad4b5938a878d51d4a14f32", - "walletKey": "0x9c1fb31d5275d83b087d10b208733f496ac0fc7b693320fe1d036d6ce5bcf2b6", - "dbEncryptionKey": "bdd126c1f27f34b06778d18fd0e05b65fbe5da0237c8582f4a0d76b0c8d7382f", - "installations": 2 - }, - { - "accountAddress": "0xdb64c0a9b58a913aeb462a720df4cb7753334e04", - "inboxId": "6ab62a33a31924e67a0d1c94571c665fa72565a4bd3a1377e8293e9e2329703f", - "walletKey": "0x0f6e1b92f678f0086a65bbc222a1f21d8728c8184d1e7c9666fc17c50719e470", - "dbEncryptionKey": "b9cedf4b67029fb2e43d5206133e4919d898f5c9626db613496cf74b0fb0027a", - "installations": 2 - }, - { - "accountAddress": "0x784749137d6a586154b0f8222bd14437580d0d08", - "inboxId": "ef13e23c4748d58f9af88bb60fc0d2dd32266001f28e5de26c2dcb58efc9fa0d", - "walletKey": "0x05acbf1279c99ab702e6358926287dcb021f669a90c0774f5ea9eb2114d5972e", - "dbEncryptionKey": "c3aaea8cfe10fec32e4e3c56ab54c71c2b04749ef0d835eb3ff6a1e0e67cbfd0", - "installations": 2 - }, - { - "accountAddress": "0x85aa5683b1622d720b68f41d58213b2f8f6c51e6", - "inboxId": "d4d41f71cb51b1d87b9cdc443cb491b6b42d4961b3a70b6e166aa53509acc10e", - "walletKey": "0xe98bd6703f4c20a19232fd707912173a44a6767113467674c62d6deccaf827ca", - "dbEncryptionKey": "3dab3ff76865f6807e0a4e214b4683c628dde7d2a1e799f4fccd66d8a7464d49", - "installations": 2 - }, - { - "accountAddress": "0x303ce3351b92adf9f93b7de87f35a2ff864c0ed4", - "inboxId": "4ba00825dde67083b7376fabd3419a1d85bd8f448a1dbdf5ec3be1b4b9302ffa", - "walletKey": "0xc8e65b85d74e68cb12a5884564ab8dd743d70cbb85c7338b045fd87c96f8c34a", - "dbEncryptionKey": "eb13bd6f5ab94c60293770c271dae4dd387b494d053d2f87d395f94ce1cc1239", - "installations": 2 - }, - { - "accountAddress": "0x66c958cdd0a0df46369b6d345f64d27964acebd9", - "inboxId": "6aea363b6dc6323aa282d941e1d861941a17491cc86acd8b7eb7ecc06dbf7e1b", - "walletKey": "0x0e7bc699a45dd08ce0dd9a573349e6fc8be5ccbf4a20179e06da0ecb3a8b6640", - "dbEncryptionKey": "797917cc18316badda00687955148d21e3e5a3e383ab12ff7f787eaf85e70a7a", - "installations": 2 - }, - { - "accountAddress": "0x337a0506fb193e434da547b59076c85b33b58767", - "inboxId": "6907ddbba589df3fbff13e8687a2c7f8a3969162aba2b7e13165b9673f39221c", - "walletKey": "0xf6c7c69e853cdbd5650dd2b2dbd01c5ce0934f9e08adbbb2b83f5e8dc45b7e83", - "dbEncryptionKey": "9ebda0b516cd90b52d7f0e84220677dfd48fbfea98b60260847cec18e062f081", - "installations": 2 - }, - { - "accountAddress": "0xe4b66243c9fc901a587203ef1893489581fe9c01", - "inboxId": "a018a2d55c5f3629c593b6db345e3051a39577a8ab88df50116bfe6fd2a097cd", - "walletKey": "0xff57e42dc8ccba7cf9b082531b06010f5cf7b77fb1875e451555839817149263", - "dbEncryptionKey": "744f5484a41d1572692d5fd3bc81a2ab5cf8555f636d7498582bffc4527fdfd9", - "installations": 2 - }, - { - "accountAddress": "0xbdd1eec41e8c2355929b932ac13156ce4214bb89", - "inboxId": "dcad0daf72f44eceb21875d5697703d0bdf12e29921f7780f66de7fb92571a73", - "walletKey": "0x109a8ad4fb45bdbbd04cb372febd9cc9232d8a8dca2dbc0bc64565e3c15d5c78", - "dbEncryptionKey": "0ea73190fcafd1281275c18f661d929fd090fc1484a7711affea172d96a0faf9", - "installations": 2 - }, - { - "accountAddress": "0x7f7883f8b5c6059275b4c2b009602739edbd466f", - "inboxId": "8df5a1a8c13138ef56e684ae10788b35e0e11f74e183206c43ca7ffe7dbba94d", - "walletKey": "0x4d99d0a35095f5585afe26a402ec9e61069e9360b4026b73d753e861a7f04a42", - "dbEncryptionKey": "62584a321ad695078ef490eb417aad7cd4bf16f7c5e396344b76f1b05c5d4708", - "installations": 2 - }, - { - "accountAddress": "0x7cec0f8b3f54a1288dc8f6891d87a5352bcd4a6c", - "inboxId": "5fa262b0f806ad3dbefce597e62a0b87a8ee24b519a3354e380a619f7a1a6979", - "walletKey": "0x14594bcfa88f9b29d4ead051581c36bd43180238049b6e54533740f0c829fc52", - "dbEncryptionKey": "7a16dcb508ba8826fa9c63f2990a8acd515100717410974e051d4f4cfb43ee72", - "installations": 2 - }, - { - "accountAddress": "0x3954db1d2d18d719543f4181a0504d65c3553cbe", - "inboxId": "3baa7b65d98a0e603d05ffe6d22dc78e0ec9e6d86c4e354fcdfd9866a60aa546", - "walletKey": "0x8a61ca95ff4488b52c86e37ba97c34d85cc275a38fcbec04dbd55daef01533af", - "dbEncryptionKey": "9e3f091d28ce4bff35d058445232e02bdcc1be3cdf7f89541e63287f07cc5b06", - "installations": 2 - }, - { - "accountAddress": "0x9be996b0d4eea93c0d40f9c6ae97a2ee327bcfe8", - "inboxId": "93ecdb07d14e31381abc6a23111aa2d4e26ae31911489d7b23d9b7e15fc5ff4b", - "walletKey": "0xd162e66aa45eb6b5e16d9c229d4894a7d61ee508842913dc668350bd6bcb8919", - "dbEncryptionKey": "1d26dfee19da5d28721a5b972e66366d94bdfb97dbc5d6d4a35d6a75867fee9c", - "installations": 2 - }, - { - "accountAddress": "0xedd2ef38fa8106bb9fe8e2844643111de55ccc20", - "inboxId": "ed6ed52e6625d6b20cbed96de874cebd56dc119625501dafd588d2620eb71e39", - "walletKey": "0x3029d1e474baf61a68b4094e096cb0db15b8f8c2df7523d757fca77cf9797a52", - "dbEncryptionKey": "0c1ab7acc462801e7edf6e2836cc3725497c043e207588790ceaab37e7403c1e", - "installations": 2 - }, - { - "accountAddress": "0x574d1c8da9b665cae69a5206a1355ca9c4639ea9", - "inboxId": "97fc35b01fca007bc990b9c7e5dbbf0287e86a0a9e63801dba68ba9b721a38c6", - "walletKey": "0x224af10b861f864f1642d558c0357d63c149dc6a141f94f5c0cbdef9871a2bed", - "dbEncryptionKey": "baffe0da71b96e9bf53d7f7cad01b3384e35427aebef41c4b91ab9c5c9ac1868", - "installations": 2 - }, - { - "accountAddress": "0xdf8daf3b04ff26af5bed8e7c27917c15e14e0efc", - "inboxId": "f6bb40d6c7dc2573644941314aebf202d0cb4222afaef8ab7df09a9694e74112", - "walletKey": "0x7ec2df5e36866141ced1a60edea49ecff13a02a375c59a923f9efc239304a541", - "dbEncryptionKey": "3ccb155bd4c89c92b384be1bbf39fd079b5005a6e72bc7b81ad578ab722fb318", - "installations": 2 - }, - { - "accountAddress": "0xbe48e8e18e28eba179c1472d3ffe792fbe21c7a1", - "inboxId": "c7d6e4bbdc4ab2e1d4c05057a4ecb30115514b2fb9d5697f09872c8784ddf8c4", - "walletKey": "0x1121b0dbae5d6c158bb93a11a167a43b7b4a8110ea2ad9510c3f92b49e181586", - "dbEncryptionKey": "3f094c4616214c4e4a00bc8a6c6cabaf66c766eadc448026c01ac505be41018f", - "installations": 2 - }, - { - "accountAddress": "0x8f4ea713f5c123aa4d640ca7ee7abe3698495425", - "inboxId": "085a4f7f699ed7ca36b87f57039c750fecc587e4ebbc8fd573d16448fed6fc12", - "walletKey": "0x395edbdcbbb2642061149af78ab9c0fe1eeaf666ceb34045aa1c609d6cf221ee", - "dbEncryptionKey": "1fa5b92c79c31892cc418fbc654a0834810b70dcdd1917ac25fc8623c29cd820", - "installations": 2 - }, - { - "accountAddress": "0xdfabd157d6b76aa9014d13ee6da8934063e1b6d4", - "inboxId": "ede856537732739328fe97a6d877296d45a1e893402aac170c8a247105af3757", - "walletKey": "0xb1426c6e9c986d6ffaeb7b90b2617d66063949632b60001905409579d72afb3b", - "dbEncryptionKey": "2c397442b0703fc513d34088c6d9c8e8c537f149a7de68a760d4df61fe7b85d1", - "installations": 2 - }, - { - "accountAddress": "0x1a98fa2d586b3f42e6ac2dfe4b5d9e93cef0b787", - "inboxId": "540777029568e8162b5e18e76867aae1e18fa0584f392c2b81aa85ec6d140756", - "walletKey": "0x30f0d5aa5b45d46cd61c5f23208b8d52fcba578bb50ba857226608eaede76f36", - "dbEncryptionKey": "1b4083113e7f505279dc00133d817ed3ff52f2eadb9d61333272cf7a31624605", - "installations": 2 - }, - { - "accountAddress": "0x7b8412a4ecb49c81dd8175c5f28d135349403461", - "inboxId": "c9aee1b7b939ca390c0e01f0e7973568ff6f51c75559e9994b299b6325189768", - "walletKey": "0x675db993913a4ffa8dc94421ca5c89ad25d221ac0a9245b493c908e7e3809f75", - "dbEncryptionKey": "75b3097d86bfd3076746deafc4cf5c5ac9722e5528efd830c095f1906dddf438", - "installations": 2 - }, - { - "accountAddress": "0x7b7fe1d18084e5ba1af610e2cf9177965376a510", - "inboxId": "705775af9574111282f5a021e8765777a87dae13878cd0d30d2a71752b31e46c", - "walletKey": "0x8c58acfb0e487d708fb45c636ef46b9fa00455d1fcfcd1b57b97b7cf8a70e1a0", - "dbEncryptionKey": "a82d0b4c59888f79b09976e7e9732fd165125dfb9d4961fa87e3b89e0224e2ce", - "installations": 2 - }, - { - "accountAddress": "0x7a62116ca44986cb1ea9534e488e84025364e32f", - "inboxId": "b8de3794379608cfe70961484bbbf1e08c3772caeb4410e2e422a6bfef38a295", - "walletKey": "0x7b298920bceaa52b9d85b52a0f5c785d0a50f4923c3a7827d6529442a513f914", - "dbEncryptionKey": "a71d6bf261e0e1e6962e21e54e50c2a62ecd1b571fd893b2e90c6ae37b81c99a", - "installations": 2 - }, - { - "accountAddress": "0x1218dd15fd912dc5bda11c1fe4e4d2b5621b67f1", - "inboxId": "fd05dd1cfd5efeefb3bd22da1cc766c02794f3cddbe5a20f3f048c370754ed11", - "walletKey": "0x1bd3fbe2b7e0c1ffea259970e52c9e35d3309310315088b417c2c10ac4916a89", - "dbEncryptionKey": "20fa23dc3c1f490dd9165e25747adb1e2db9cec3ebe19dec58387819a07bc63f", - "installations": 2 - }, - { - "accountAddress": "0xd8a418ff907dd1e2cc0cdf18197ea9ecbd9e4f5b", - "inboxId": "737ee326ac087086d43c9e522d9f55856eba2349d3dbd69ff1a5f577a3333eb9", - "walletKey": "0x712e89a4fc83bff06467eca4640aaa339d92712bc6eb138f023c23c11cba1d37", - "dbEncryptionKey": "725a08db4fd6da065c2c8514d294a08db26845b8742c841d59eda4156deaddfd", - "installations": 2 - }, - { - "accountAddress": "0x226c2b282d3f777f8f1407680ff29793b7573928", - "inboxId": "c26cf6a259c806e1a333d2c92899703e078f19c84c294e3220324e375459a0c8", - "walletKey": "0x7016071cd91782f35f2b872258d9f4ca5a54a920d3fa46ebd8fc9c28cd10d712", - "dbEncryptionKey": "eef32bca8494f11fd63fe7e795d7356f2d933665a26c01ce37740a99da335e67", - "installations": 2 - }, - { - "accountAddress": "0x848d30494be6aece101336e78876f9fc4ae5f86e", - "inboxId": "9d63edc53f5012d1a87a0b667bec1a4ec565d8f343c6c2ba6223d02bec75558d", - "walletKey": "0xa191d0b71e703c9132f050f012eb59d8e226b49713eceac8d40c7492a82436c0", - "dbEncryptionKey": "01c54b13f90b335e1bdcff8f75213fa5be733a349dd256fcf404c09a5e3f0052", - "installations": 2 - }, - { - "accountAddress": "0xb9d8a2541339c56c034049813bceeab3c4fd4029", - "inboxId": "f085f1a4682e916c269be405ee61285be9e7bace5ade9108e296254ef525a3d6", - "walletKey": "0x4e6d3387183849cf26672c8e5f77ce8d908b358dfb2a135d6076e31c8dc820d4", - "dbEncryptionKey": "0cf3e5a1696a17e14efaae1e9042b940d74d468e6529f22b092ce6fa85e5bdbf", - "installations": 2 - }, - { - "accountAddress": "0x6b105c0433c807310b2ffe0fe9630d4a89e6f868", - "inboxId": "3c22e814c8b9df23730a618be44e35e5f8df4a7daac3dbfaf4b6812b3cfef018", - "walletKey": "0xc7720aa901626162a4c32c0d7818c563b129e30fd586a9094f06e76f39d75db1", - "dbEncryptionKey": "66b5d7ec440fa49313ddde504d096d19c89990a6c84dfd1d98a57af4da6637be", - "installations": 2 - }, - { - "accountAddress": "0xbb804f984dd5b91fc5a893ae1088b7e26b040dd7", - "inboxId": "a302c10adb94ebf001fc364a37e4446d576c8278aa2835a1258456aabe4eb83a", - "walletKey": "0xa7afab0f82f0e631649cd50893c022c2b34c0c8306697181b02c22665c6b2d58", - "dbEncryptionKey": "13dea76701c49b80244fcbb8af7fc60f3073814332d30bd323ddc243219f98a9", - "installations": 2 - }, - { - "accountAddress": "0xd618129c3a72a21cca8444f245f5faae5da399dd", - "inboxId": "c2e16514c3231e6b3738ba0e2cfd19aae4aee036774595a9bbc27259ea1f2876", - "walletKey": "0x5fb04e8f1ee00f50133c7cd6185b08d50c96555f81e7f9b7d26dd9593806b0fd", - "dbEncryptionKey": "0670bda48c15b9cb1f7de91f620aaac83a36eeb45d3ce83eac97edc4ac836baf", - "installations": 2 - }, - { - "accountAddress": "0xd5514920fce34fbd2f16efa81d4dd4986d406df6", - "inboxId": "c7356fc2a799df28936d8ff5fc29ee9beb94226d93ce9a6b84b792e802a6cf6d", - "walletKey": "0x55fa68bcb1133ff479906f6546aabe9366d6cd5ee870b6a11702c94efbda7c60", - "dbEncryptionKey": "0436bd23afdd03d14f6a77d8c23b930e90b921d316c8abc4564d785315f59581", - "installations": 2 - }, - { - "accountAddress": "0xccfb62411e0f87735c4b275b9e65901ff6482a06", - "inboxId": "7d1c5e14cb1097d719a0104a74823e85b8713dc8e8f59718cd1eaa1d7ddd76a3", - "walletKey": "0x65c45844f94e42765a8f63abf2e7d3603ccf88ca1eb82d63cbda45fb7ea14993", - "dbEncryptionKey": "91f2d1572be2b19ad6c4484a13eb6aa1591bcbbf30f5c89d5aa23a4a7b205c32", - "installations": 2 - }, - { - "accountAddress": "0xb27313caaa73422460f63c26c745bdb0578d3d7d", - "inboxId": "ba01d2d02b62990d5e72cf09c43c8b953be70cf7948a6098ce42a43a1fef73de", - "walletKey": "0x58a1f27d156795e828b1f81d5b752dc8cbf48957ce55bfd1448e875977e9665e", - "dbEncryptionKey": "a91a83e78f5fa5a5f2eb0cafa62b8015d465d38f83a94edf46617406136f43c1", - "installations": 2 - }, - { - "accountAddress": "0xf1794d29aa9ca7124ebc47cc465be3d24770d74a", - "inboxId": "ce5069482513854fe132284c5b505724c1333f48cfc957fd6425df90f0a134ce", - "walletKey": "0xd4aea0903cee37ab3689948acc4a639fc04235e55c0d9c00b500f210c213188d", - "dbEncryptionKey": "8525113473c1c7ea46aed6de5bfb089860ce7a5952274e9dc7d261e2f1f3fd54", - "installations": 2 - }, - { - "accountAddress": "0xb137fa9614d999bc441ef3075401232a7feb9d13", - "inboxId": "54c24530d0bb9ca3e79c842a44d1b9aa3a73c9f2fadc65b2a91c225b900b84d9", - "walletKey": "0xac5413c83e5ea7eb1d4b716abfccebbe17c545f1165f54aeb7b4e1df785574c3", - "dbEncryptionKey": "0fdf503236e831bcf190b9e0f6af998345eedd38fa978ec776b4e834b1356967", - "installations": 2 - }, - { - "accountAddress": "0xa3a8036b959781f2f9fc7794fa29acd6f3900ad5", - "inboxId": "b29c04979a9229c908cde6a093a387d4de60b1c3d882de64057f21337463faf6", - "walletKey": "0x082c791104e05be3b391b4fcbee19b3b80845f68a2949d05556e7e9bbb8d18a3", - "dbEncryptionKey": "92643a4c94cea919852676eed3169d46bf81160c3be6fd353a6c3096f1d53eaf", - "installations": 2 - }, - { - "accountAddress": "0xc963117cac65450eef1beb786bd88c860e80ae09", - "inboxId": "b6683d0623fd9baeb0bc9977fccd7d10fba2b4d0db3ad0fa29a5d55a1b1219d8", - "walletKey": "0x08f50430d9adbd7810f4d2795f01c83af8f348c5b1d151170968338e5d290726", - "dbEncryptionKey": "e3fb9b760c9a1141f75a367eb050b68be0cb2cb6b619a13fdf2d3379b91fdadb", - "installations": 2 - }, - { - "accountAddress": "0x2bff36554429a47bf5a3c4d3990c9404b7fe0e8d", - "inboxId": "ded290cede00913b4c54b6fd6e61e5695a9d4df7909ea820326b85f914edfe69", - "walletKey": "0x653a90c6fbcd3635d2918fca214b9f1ea4390e53ecb08a7d8a224d0f14a881a6", - "dbEncryptionKey": "ef8aa1343edcf9227ae3396f23d1acb663bea7fd7ee779d9da675badd6703e1c", - "installations": 2 - }, - { - "accountAddress": "0x50c7dd4c44f17975532e6e1863d0a5eb962d8d5d", - "inboxId": "a6ff1829fa3c393775d30ceef4989242f3356e0435f89394b5b31ab0097747ff", - "walletKey": "0xfaf4cab67cd459e75a014add2b1870bc331289437a00e1d60b913e89c19f2470", - "dbEncryptionKey": "adaa411f488ae39a39a7c49d60042049b9926877589f47b74adc7e7252e7c323", - "installations": 2 - }, - { - "accountAddress": "0x61d1f08d13223021ed84ec2c986242317780a7ea", - "inboxId": "b999eb7aff4541a284fa4de9b840dd26f7f6a3c4bf48d6e6c3cd172cfd4dae05", - "walletKey": "0xc88f52d16e0040595affc3828a5abde1af087508aeca26afbbabc9393fa703d7", - "dbEncryptionKey": "1ba42b87a17664979bc2b88d7f448a5cfe212bfb77e106ed1b434082ff4e93b2", - "installations": 2 - }, - { - "accountAddress": "0xc57daf4d1f679bce5424c66a29dc9985bd72ff57", - "inboxId": "bed862c9f02278e44b1d037d88e987ca3eb1ba62f0567b3e352edc61185f9a6a", - "walletKey": "0x1893a34a88b4f844e2cfb876705b812b477321b1c306d1ac30f4f5fe3f848686", - "dbEncryptionKey": "a24f616f49e0ac28fe1a627acb01bcf225b4c2764c51c5f6431143c72c737a6f", - "installations": 2 - }, - { - "accountAddress": "0x0793ab7226df702a9ccfd9b39ee7e78725c30b6e", - "inboxId": "433f1752580933f2d94561191141380744831990f0cb66d8d82e5c6ab303a936", - "walletKey": "0x11b4abf58546b39255765bb5592f4832b60966ab7d746d24a3c4f3956e091e57", - "dbEncryptionKey": "0726fd339d1892a53a059b4797fd87c1df06cc8acffa2fb4efbd713bf6bd4fa3", - "installations": 2 - }, - { - "accountAddress": "0x8848d0e3609d71e219d0f1818f2a9f3eabfdc426", - "inboxId": "b5f0d123d5953f2eb4692bb61400984006d049e76179073993a7688fdd01de1d", - "walletKey": "0x537360bcfcbb7ce0855b5d9841eaa7867294e2bf94462049d26a418aebc43038", - "dbEncryptionKey": "38d85bb2dd152673f1d3f24e70bd5c4502f9f76e14b5f9fd3ec8065443b67da6", - "installations": 2 - }, - { - "accountAddress": "0x85f8152a21da42b6e68b56657976f85a99222b80", - "inboxId": "b2a1efe986620c8f6c499e30dacae876d334a36a4b4e34ebc85101be2ae02ec7", - "walletKey": "0x6e27fe1185edfc2444cd295c369ac584a9f1fcbc9f62674e8d9609472de79302", - "dbEncryptionKey": "042ef7900a43e972d825723e3976eb87be8d4140d7509dc06b3268c6a0e41a4d", - "installations": 2 - }, - { - "accountAddress": "0x4e7d56c7d20d92046e431e7e2655a81b5cdc2a58", - "inboxId": "7712d099ddc3cf162e11dbe95bf3254e1ac10eccc274256da8fd43617b99b6c4", - "walletKey": "0xfe9fbea982d1b4432a25790bc5bc21be1c0cf64e7713bd0743fa4015a73ae0e7", - "dbEncryptionKey": "5220ddef5aeb7c553aefc48063ecd0b5c6b2fba5dd44acf1920bc695e55906cf", - "installations": 2 - }, - { - "accountAddress": "0xd8a4cb3680cb506d66a5b71e18f4d620e16d3655", - "inboxId": "3dcc62df14f049016780d05d056804d13da13ce80a7856edd5f73f6b64d8b31a", - "walletKey": "0x332f84405a9bb147d5b20fc407be5f899dc7ec0f987ab59ae023b5e94b60040b", - "dbEncryptionKey": "a9761ee8bc7532d8d669e5a5e15ae0ce4ae394f75db8b51dc3a251e2773254b2", - "installations": 2 - }, - { - "accountAddress": "0x38aa941da2340c59230cd2dc30a3b6bbade72c4d", - "inboxId": "36d5b170a8f1f3f14789a82a6a2b481269b52d9361511b5ba4b068ef61a82970", - "walletKey": "0xac2eb6015b2fad41421352cfd1772f6ce668a1548e1588098a9fc30fbd5c3079", - "dbEncryptionKey": "2bcf511acc0406855ff9a20752f67834fafe1c766e0ccc2e93a598977ef85f79", - "installations": 2 - }, - { - "accountAddress": "0xfc8a506aa2db2557125a5e38608c08b03ceada51", - "inboxId": "fc509dccf91eb3267ee7361d262ab4b2959ecc0666a99922bcb6d600d9801526", - "walletKey": "0x434ed834cfc4034fac8e1724ee6d487ffac45800073435a2b5f4cf21893d65d4", - "dbEncryptionKey": "c73fb843cd336fb657c0c630f3f4e4f48e5f235657dd79e02359ae434c7c2eed", - "installations": 2 - }, - { - "accountAddress": "0x5e75292c3fda4df0afda514236186aab30e01cd8", - "inboxId": "bb12b484deba2fe03a306c576547c99c5a779a5dd0fa0956f2a75a76be863d03", - "walletKey": "0x33f3dd64110d756f6ee7e45815505d8f1a444e9b1ec0754bd6cba3a434195513", - "dbEncryptionKey": "0e9988a131d9895c121b03f306812aa4963ceaef83269190fb9f7087a2989f01", - "installations": 2 - }, - { - "accountAddress": "0x93b80c4dd32f96b90c63f531bc898f2135605a9f", - "inboxId": "44ccc4dad11d7a14d9972fe8c30c6e0807ffff83cc2457161cf637e0000541b1", - "walletKey": "0xf4ac539f771185c7450af47fee0c13ad705d8ad47a5b49e0aa020f0fc3dd3a4d", - "dbEncryptionKey": "0a5e2a77d8b15ea6d96db0dd5ab97f10ab1f37c9b9e187d1052c030737970537", - "installations": 2 - }, - { - "accountAddress": "0xbce5bb18850eea8765d864404658639545cf7b04", - "inboxId": "6dca05532f071a151240d26b66de149b5bbd711d1e6c5c7e409a9bc8aa6dab32", - "walletKey": "0xe35775a7cae9d9d1278d23036d49f6bf22b541ecef34ccbcfbc7243764639053", - "dbEncryptionKey": "808a8f96e81839d8ba17e4b89dbc95eaf2026c4d9fffd0f42f05055a1c6aa9d0", - "installations": 2 - }, - { - "accountAddress": "0x16c938cb5d95509a74c795bc93c90bd65610d20a", - "inboxId": "361fbcb8a105a1f16056a7d10d37def30b0e9ee09fedd3a664d5f9969838fc06", - "walletKey": "0xea897ffdf96b697743fb50765693f81ffb97cf397e8918a1aef2e40c3c653422", - "dbEncryptionKey": "c714cec98e8a004a0bbf3d8d771e57989816663ae51949d82a1fccc17a3aa20a", - "installations": 2 - }, - { - "accountAddress": "0xeebcc9af6610cbcf5696a47fd163e0161fe35999", - "inboxId": "e3ed796a657a623757208e26f56d4eb9cd7f972ee6053336fc7d08e208a82004", - "walletKey": "0x99b0f1924d91e1ccba653cf983b1c2dc44ad9f8a3cd4aa681088afaef24c65c9", - "dbEncryptionKey": "cc8f08089263620c1224a41ab15cba8f823c7a4211f02bf0ffe6dd4667c96c53", - "installations": 2 - }, - { - "accountAddress": "0x7cc8ac688cfb4f4674ff5d342f63d8673544f00f", - "inboxId": "5ff49f51e6a850f64375b24fcc0b7431579734e41a7925437c49ecc2655962bf", - "walletKey": "0xced7a805ea105494de63138def25eb6f0eb61bce7224d126cedf46087ca81020", - "dbEncryptionKey": "3c0a9c055429e18da70bca9358a7a16323776c641b076ffc12a7c4a1b6ff4360", - "installations": 2 - }, - { - "accountAddress": "0xab04f8d2d29f4e0967220f34dd8238d2dee5888e", - "inboxId": "ed4a91354611accaa9bec1123f1aeb33006112ff195ac672ac2c1355f2623160", - "walletKey": "0x462f9d6767fce562bcc0f0c8ce0f3473edc4d6c8ee2142b7d39514edd77128be", - "dbEncryptionKey": "5fb13b3eba6281d2501218d606af7eaac682372d50ac0d4e0e0736411d0cd057", - "installations": 2 - }, - { - "accountAddress": "0xc40093d48792f7896eecc12aee88e6814e7b5cdb", - "inboxId": "219cc2997c05c9901389983de16a1fc2924d9980273eb44798a23888747e0876", - "walletKey": "0x220a847a508f9385030b3e90beaaf68131f0848d199120222c28aef41c667e44", - "dbEncryptionKey": "1a13fa134b9f70b606f9d67b6ac0a4eb9f15a7e6c732748b0f7ac290d8686cbb", - "installations": 2 - }, - { - "accountAddress": "0x584ccbcb87dee0b8e6f91da1776cb507862bafd4", - "inboxId": "4333e53e365299ea94610c45e0a127aa57ebcb572c72044234a687f049d5e9ef", - "walletKey": "0xc9b46b01f710712125e083b28021381e5cd9f2c5b7fe092d776283d308747419", - "dbEncryptionKey": "9d180c5b3903fc372b9586413f358a8d636595f2e277f4c37730789e4a0c7ac6", - "installations": 2 - }, - { - "accountAddress": "0xbce44024fc1d4b861e94cf2596eb5ea80ed0d860", - "inboxId": "c40feb480190239c11baeadc189004356037845d5ecd839031c4af73cff29b1c", - "walletKey": "0xd4a3330482a030fc37701c34e8d3415b22610e8e3c433eb6eef385f6942fc984", - "dbEncryptionKey": "b41c513630a67e8cfc680c5caeb53fe5b480030b5e282ad1c1e097c75fe141ba", - "installations": 2 - }, - { - "accountAddress": "0x701e7d9c7e9fc44d19b76b820f270bacb39662d0", - "inboxId": "17e6fc9245a522344fa62925e3d892c11005ba5a816c277473340ad3d473535f", - "walletKey": "0x9c3a8493ce2e8564ccd1563f03b861d27157e46c02845e7ec791f307c3a5a221", - "dbEncryptionKey": "5d5fbd34111a8ca53a51f4f17e4778694069ca85bf92eb5e48f6762ed2f61afe", - "installations": 2 - }, - { - "accountAddress": "0x6fc16eeffdabe71922317235dea2d83f6cfbd17a", - "inboxId": "15c953543e6296fbc934e0f51db7c0b92832e10b849c52b4bd396d0a2ce71f0f", - "walletKey": "0x2ca593ec9a802a0a27b93bbcf39105fdd9af02c502655beb2056de189c228436", - "dbEncryptionKey": "4c3b2e0f40ceddeec10c2ea312fdc4f11625cdedda5e18d220aecc27e918da47", - "installations": 2 - }, - { - "accountAddress": "0x0e42204d9faa6d2fede1764ddac8c4dbad92c3fb", - "inboxId": "69c5a2ed40c8b52a0e800e5fc21c194c2913e846eac415b8a7f6e178f9f9efab", - "walletKey": "0x68b771dadfa446b0d56817e630a9809722bd955e38355e80050417ad56751181", - "dbEncryptionKey": "09a23f59aeb0aec3bae8083b808fe0b1db21e4c834e49d16af7a3636972a5403", - "installations": 2 - }, - { - "accountAddress": "0x804b9aa2caef18f3f719a91ec5f8f17ea6a24171", - "inboxId": "c818e1efc314cdd18f32bb61ff7356bdc65d5ba7460f9118d8dea08daa55e0a1", - "walletKey": "0xcce49f946453aba36ca973bf78510c62656549c9571bb70afc9b99fb46ef6bbb", - "dbEncryptionKey": "6bd9bb826146cd1b4ab0320f330b173570837195b11c186e7505e8f8bc555008", - "installations": 2 - }, - { - "accountAddress": "0x67baee5085a0d79ea6fb8ec6b2a232a48b2274d0", - "inboxId": "391acd936c7cfb2e76da4b9e52294b86fb33af4639f16955802a2e500a4edd63", - "walletKey": "0x8443087896aeb010e9b7a40ceb5b9774274d4e6eccd1b8f6367df3029f4143dc", - "dbEncryptionKey": "f82921a3a1d9cb8f799c4eae0a0f4b024da3b3446f607487915e2307d4f60728", - "installations": 2 - }, - { - "accountAddress": "0x603c647329a404fa99642636ed5b8f0389e5a230", - "inboxId": "e928468fc969c1b52a1f785d4f5a500ed308cb3fd4e2681edd8c4733a2dbb70b", - "walletKey": "0xa2256267eaec50fcf7fc6e4422bd4072fad3268f09e9833c677198e7ddc002a6", - "dbEncryptionKey": "8868bfe645e0da9f7356718ca74b4d0dc034600fd4638d2ce5a18e4f63d0c243", - "installations": 2 - }, - { - "accountAddress": "0x8eb5e58e62e336694cc0450b23641158b84ef4ee", - "inboxId": "d766e53f79211febc1a39bc6eaaefce7d863f29ef241534da4bbf0fadd10236b", - "walletKey": "0xf1fa8989056b55770741aec148402dcaca9df433ac640379972d7ffdb5fdaf4f", - "dbEncryptionKey": "37606a5cf2860f68bb4ebce0b14633aa10251f05573e5c1897b771c099ccae41", - "installations": 2 - }, - { - "accountAddress": "0x80663269b2664cb6aa58d5d685d9a60c907d0ccb", - "inboxId": "2a0e564e0409719eebfc27fc54bf7706b70bc911227f6a433d42b9f639b7f7c6", - "walletKey": "0xb87190c2984bfb5eb70998b26df14517d75d017404e0334e79ea73ce93b9fe05", - "dbEncryptionKey": "f9b005c5a1e4e338f967bf713083d27a192d236f47b87b5487c84e181f7396af", - "installations": 2 - }, - { - "accountAddress": "0x91a3059a8d7c913b88f72b050885e50106c44847", - "inboxId": "544bad4facc7b53d76285d9602abcd455e1f9c93c4662a0adb76ba71b126a385", - "walletKey": "0xadd25a4a01ef63f577ab33302f6a6f7005b697fdceaba09bd55452db19bf4cb5", - "dbEncryptionKey": "75cf063f86c0d383ef11f83bb285ceec2cac0f6754fab66c2cf66ff21c3bfd13", - "installations": 2 - }, - { - "accountAddress": "0x98d7e20610c395dcdf69792f00f94ed61337a2f5", - "inboxId": "9231e71fc97873c7a5993fdbdac413a5c23e2d7d8d24b1d4e14bd340aab87938", - "walletKey": "0xbb09f81db8fe72decb98c3f96835a7454a2ef1b848734dceb69754f4e443b161", - "dbEncryptionKey": "a83f79f248beff53189a7e38722074104d770f133495d6dbd348b31fb2f5a417", - "installations": 2 - }, - { - "accountAddress": "0x5a65d353b5041f41e009c0e4844d6d9270d38ab9", - "inboxId": "9ad0d40cbe617b09fc80c93725e8a91c7671d8e56c5ac0fd660c01f6187346be", - "walletKey": "0x7d93d48cb3454a91b12150bed1464b9a8ded7c026ee416c75f991e0375b721b6", - "dbEncryptionKey": "ab34533326383b96e5e88ab1904b15fee4972cb56c1d3418b8ccf6a909e333e6", - "installations": 2 - }, - { - "accountAddress": "0xc75f3d5f6e99c89ce938288bc35716be5a95a10f", - "inboxId": "9251a04a3b59960ecc6ad1ab90be5a0faf5310d007c801ea330ab7e4183d0f32", - "walletKey": "0x511bccd935e4b3cf441f12fa2c903a78a1b6c37e2aff13dcbe457b89fa8bb7b2", - "dbEncryptionKey": "f78a8f0999e34a6ff2117d97041b4997069cd0fe7577634432a5efd65f602a98", - "installations": 2 - }, - { - "accountAddress": "0x71b21608de5d08be0732fec513df6f7b5d7b9490", - "inboxId": "f0b56dc19a5efe11c57a3ff4e41d59c9469e49f8c70f4baeba0b82f2d53e0a3c", - "walletKey": "0xa31f19441ff3edd2babe04fa46ee4522d6b6e0f6b7388824c2d6736e796f2b60", - "dbEncryptionKey": "8cf4fd3f6102c6efaa9f95ab61836e7b92093c488bb0110acab9ade098d580d8", - "installations": 2 - }, - { - "accountAddress": "0xa3b12222768f8aa34a0143f06d4250eaf5f000da", - "inboxId": "b3f2151da1cb45efb14523692c474873a4da294ee5690e80f6d3bbd97b99773b", - "walletKey": "0x234c6a93edb9304c5df7df2e941176db17b3bfb320928c3586d575cbf1715684", - "dbEncryptionKey": "87f503bd1ae58e11f9ab04f4dbf5f994590a3b5ead201f43207c548354a983d9", - "installations": 2 - }, - { - "accountAddress": "0x4a04d82f5745dddd6e3aba09ec826095433241a9", - "inboxId": "dbd52462e608b72c6a266bdef56583c2d38ec7facdf6685f3149f592f7f527e4", - "walletKey": "0xa0a84a83c184a893bab6772f467b3546632305fa9c2eeeb0fceb3324c9b59da9", - "dbEncryptionKey": "13f6a0a40ae04d39025e6a32e6154b0145242602fdeed6d8e9eaa673c7da202b", - "installations": 2 - }, - { - "accountAddress": "0xac0002424a665bb1c5141c46b3af7f20b72a3c23", - "inboxId": "510a2c21b9097b87b363deb7a0b709fe7ba2af69a4f29eafcad14ff2a3a169b3", - "walletKey": "0x18dc2f89787e3fb743cec661adb4fd54a41e9f050aecc5d51990aed4ea3b9f42", - "dbEncryptionKey": "050915e57ebb5ed5df48d91891a88d0a09d03f82471a550d48eae73d32db8153", - "installations": 2 - }, - { - "accountAddress": "0xc2e9d135f889d38dde385faeb33160be204acfae", - "inboxId": "cceb187a9a4235c1e8b718ec772391d5976c979ce27d338af5b0015b87b58de2", - "walletKey": "0x8d4854650f1faef3dfc14ac287885d344b02bc16872cf5a76bdcc5fbff07d704", - "dbEncryptionKey": "5635986996f278490f67b62a47e5c9f01f25ef515054de740eda4ad6401baf03", - "installations": 2 - }, - { - "accountAddress": "0x5baa7c9c276eb06ce9caab78be60adbe096b493d", - "inboxId": "7d8e76c7b1aa5fd161afd5f1402dad21c028bcf6ffb6d5b62055a144739724e5", - "walletKey": "0xa692bad678f6bdffb3f838cf1de8369d19027c05883c68b62a44ace1e59bc10a", - "dbEncryptionKey": "2b6e6c301fa48041f3998e585f4462986b326847bde1413f4d8be22dc3400540", - "installations": 2 - }, - { - "accountAddress": "0x590a3d379e956d753026c3a8f90179b6e6f8f460", - "inboxId": "61b920879de14bfc725624608a4df594a33217fc12a5d2e8c691e0ab0639fb7b", - "walletKey": "0x48cafa0cb1f1e3c5c4e8d095c7752c86866fbe1c5544de4b0bcb5df9bf69751c", - "dbEncryptionKey": "f7f91d4b13ca1fd7580a2b02479de9e0251e942ab641ce6bdee418474356b8a8", - "installations": 2 - }, - { - "accountAddress": "0x4b6a74d300be66bd4a0e0301cb18fe3a8ac0b4d8", - "inboxId": "c36aae5b54daac912065cb6aa56c46996e2d7e38fde30f8855430768dfeebac6", - "walletKey": "0x6b6b0d51368b4029f5f8eb109fb72f1f3f4a22bfa45717929256625aea95fe1a", - "dbEncryptionKey": "21d4e891780369fe9488fa27f19dd7a9cec423d11e4ef01f174eeefb87012fd8", - "installations": 2 - }, - { - "accountAddress": "0x6c116680f805b24068106b8dbb56e73f8c23e8c0", - "inboxId": "01f380ffc5e6c29a60456007f4b72bef84563c7d40a3d2d0ce37f13496464f60", - "walletKey": "0x55ee2c1d07b48f3d61547182ab58f3754190cffb2ae0c8acc99b30a98d08693f", - "dbEncryptionKey": "65346b6caf92bdad7bbc0693611840e2360bea2d1ac134fdf138c7c495c312fa", - "installations": 2 - }, - { - "accountAddress": "0xac0fa6319d01e9371972950774df927da4358063", - "inboxId": "d49192e50b5422cf55788d97a68b1f55310ceb8757938ec5182226b66cabccf4", - "walletKey": "0xd7c35f9a325b84aa67080897fd370828693317d84c31cafaeb8b2a7139780498", - "dbEncryptionKey": "a39c87faabec2bcfacd11def32e908886f8c077aa558d06967c5984db9a5416e", - "installations": 2 - }, - { - "accountAddress": "0xc035d7ebda6abcf614a2bf5398bc54066240cf3d", - "inboxId": "57b4fe0287a289ed888c83b5544f1fda48d60a18f3e983720e716034ca744ab4", - "walletKey": "0x2b682449d59b755e7a27db1ea40d4dca8752a0b3345579e05ff6f937fb4d1589", - "dbEncryptionKey": "7b11c48751c5658a9bb07c5937da357f82effbd904c079b0a0e468951512efca", - "installations": 2 - }, - { - "accountAddress": "0x082e1820e5d47aa9fdd2b4cdd897ae0643975d82", - "inboxId": "ecd0d6ba8b09d1c18c934ef60cc62746e348384710c91a08ec5b56cf302b6353", - "walletKey": "0x12731428175159913743d1ad9fc6a4c432e0550b3da1c149738381a88bd5bf3b", - "dbEncryptionKey": "52a0569b277f4c9c44ed5c00b72b0388802e913483205fc525f931851651913d", - "installations": 2 - }, - { - "accountAddress": "0xd333409e6a066a2c816d40e13a7466af676d4e8e", - "inboxId": "29479beee76278d993168e44cd6af6295b7fb53df9a7d66e29c01a6f2b99f5f7", - "walletKey": "0x0652e01c30e4dfa4f402ba410c1fdbd9852e463f1097a042fc8fb5633754772d", - "dbEncryptionKey": "5810eb071852e14760c569046d3bb0d0b46231fd1b9725b65eed0a81a60a1d76", - "installations": 2 - }, - { - "accountAddress": "0x1f7980214b7d4f38113175b808b44b633e13e850", - "inboxId": "969c1bb29963d06913e91f739b9db1dcf6457893b81e96973a64090c41cf5d61", - "walletKey": "0x9a390a3f12c951266437cc87438a7df12efd8b23509f540f2de5904d31eb874b", - "dbEncryptionKey": "39e7a68542b7d2c544b309f7660bdc4a95b54f838fbd01e308ae53b413e375c8", - "installations": 2 - }, - { - "accountAddress": "0x102853c3d2962cf3fb28cbe232fc0b1e635ec428", - "inboxId": "bab776f7a1e107fbfc46aa4fabb9434038a95a7e69569c4484bfc76926f555a8", - "walletKey": "0x6d38362ce632cf3e9d690f748ad4419eab51867af13366859e4ac4da88984d8f", - "dbEncryptionKey": "dfb9b68ade52eebe7194fef0d838aae5256e0c9fa7fbed2b8fa2d24926eeea5a", - "installations": 2 - }, - { - "accountAddress": "0xd162e0d02482b65cbfc82ddcdcb6a668707d5663", - "inboxId": "205a71d8c11034b9f5522fbb5139ad0912e59b1dc8d7274bd2d5f44e8821cffc", - "walletKey": "0x22c9ab66a5e122b885abd3316ef6fcc3897b50bd2035e226a3d772e56d2783ab", - "dbEncryptionKey": "6e589cf3846fab3b62b40debf61755e1b7005d3b529491b0032a64a1ef077da6", - "installations": 2 - }, - { - "accountAddress": "0x54747d9ccc06af16cb621ecc3dea006630912d4e", - "inboxId": "1810467134692954fbea7bc982d44a487607de469f83550e46cdfa246b5b86d0", - "walletKey": "0x66a6c034a801438bfce6fb547d38126ac0152150b128facfe7b93a895067cd51", - "dbEncryptionKey": "d34791434cccd2d3df9aa0f33a1b2abf23693ae9cc8a550473c20223f40d9254", - "installations": 2 - }, - { - "accountAddress": "0xd57660e3c7723ed84f12c7574c291a56a93fd454", - "inboxId": "25eb1e486263e12c9ab44ad73a361a48371db9f280fcaee7d1d72790cf856f3a", - "walletKey": "0x77ba88bd0c7871f78d7b62892ec76dd77f747b01142f793619b078376de0c60d", - "dbEncryptionKey": "11e95502322ea433153a47729fc4f986c42d962674a7940a5f1b465f014f079e", - "installations": 2 - }, - { - "accountAddress": "0x32f78dd63d05fba533b5c97dbe885700b9a4a016", - "inboxId": "3d7f313286a7cfe2e906db16a183b7ab08462545e52d788fc9ddc9aaa7f03408", - "walletKey": "0x4289cd38a16f6bdb471362f7dffbff8da296b41dd40ab2fa74317733e33e89b2", - "dbEncryptionKey": "863c2aaba98934f9bb8bbd172d85a3c0043da0fff8f725feb698110a9bb56e24", - "installations": 2 - }, - { - "accountAddress": "0x3f83923f3637cdbeb216102f6ab2397555ab9b55", - "inboxId": "a36a24d34f075cd8cc2447bdfbcb6094b8dfd178391864b5f9ac9880b01d2788", - "walletKey": "0x0656d8264e58bffdb97b1b8d6ab34982620dd8a235b27a7ff99d24bd0f077089", - "dbEncryptionKey": "76e9ff4114497345f39e56ad824435c1a2b53a828c6220dec651232f295bd7ce", - "installations": 2 - }, - { - "accountAddress": "0x0c34bfa85f7e817a79cdbeff63f677394abeb0e3", - "inboxId": "45132cd136c1a90c93af514da48c076bf51eacc3eb22a5456d867d6347d3b37f", - "walletKey": "0x82a620c208148d7b6466206703b8c1b61bbe8b9457f6302ada5953735fa4eb5d", - "dbEncryptionKey": "3be9af77623dd2542ec7fb853f7c299c5e5cbd73f04cfe12de8d5039211d7adb", - "installations": 2 - }, - { - "accountAddress": "0x6abaeeded6400e263d5690c724f9251021fcdc8c", - "inboxId": "e14ee0bbfa785ed48c072a80934aa2b17acb84e3153199f6b65c10e745adb27a", - "walletKey": "0x107f3ef90ce68b739cb964d106275ab2635a2fd4a486d22ab03b4bb0bfb48382", - "dbEncryptionKey": "6a3921031deb47427cf58a17f188081aae4cff0b54028244dc86867a8adb3292", - "installations": 2 - }, - { - "accountAddress": "0xa01c0c09297ac2979403db5c7373f9f9ee849341", - "inboxId": "73736d0287dc114bc1930426d9cb76b83a6586af94bf3114da31d83b4745aedb", - "walletKey": "0xb69aeba60e9cd7fdb87b171f63177908b7121b7dcbe78949cf2a15d01ce5fe9c", - "dbEncryptionKey": "1d9687fc30558752490413adab52abde9c1a9bdb21a2e1302eba8ed82d9546b3", - "installations": 2 - }, - { - "accountAddress": "0xd37ea10200eb8829cf000407c08208c88c61a4f9", - "inboxId": "4838b32c77faa259b743d5a9e5afd249fd1c2b0e2a3a87e307394472ebf4365d", - "walletKey": "0xc5fbbe495312c0fd0434d3f9244e035231a82383ae43d34d757be9f8f54346d5", - "dbEncryptionKey": "e54e857c5ff893210393f23c904cd25cb3cc2651b51eb546eb0f2afea65e0c1b", - "installations": 2 - }, - { - "accountAddress": "0xf61a1253c1ee54e12a79af005d4b5aa10a9e2087", - "inboxId": "d48949eb956c25562e42193d72cf2093ec623c985d468458e89369cb952864b9", - "walletKey": "0x4723c72ceaff4b0d2a98e5f2fe207deb30032b997ca7644506cfa9260ddf0ad3", - "dbEncryptionKey": "473ad29ac845f2d0419b18ac4a91a82204666cbf116c862e969396ff2a8e1802", - "installations": 2 - }, - { - "accountAddress": "0x6d92b1033b4a0bc96c68c9c53ce6900eb22debe4", - "inboxId": "0c67d59a032d656bcd106ab0e2221e4f989b5e49b4c6e5b127079348f4720c94", - "walletKey": "0x2dab80ca2329c063d31a0224e88ea4f79535353e4eda0f3b73c1b72081d6a5b6", - "dbEncryptionKey": "6b4cf7ee34cf750cc69ff8304c866bb5b8490723ad2238db390b3f35165b6bbf", - "installations": 2 - }, - { - "accountAddress": "0xf30fb93a73694e81b5c45183aa51820392a03f8c", - "inboxId": "acea310937b071e9ce374c486369f149b245b84fedab706effc89502d94f1e82", - "walletKey": "0x311f7a64b6c9682b9302e5e0cfdf8de77f217f71adf7063dd26ee519cdaf1cf9", - "dbEncryptionKey": "3e4a2bac0d12f741bb4e365f47254aea0c3529e2bbd8428de5ee20dd39309742", - "installations": 2 - }, - { - "accountAddress": "0x0bd01e777edc60292f0f3d4efa07ae1b1bfe4687", - "inboxId": "b34052abcb87a00f716e3e08d54f433291e5e0cf008b6923f2213eaabd862484", - "walletKey": "0xf97f6cbcf3da6360f36781da004339d3404f1c8e65fe1b2cce66bc479792bb46", - "dbEncryptionKey": "4d65393efdf84761dba3419b7a6cd35c4acd8bc21e417da71b21a4aa1f75c33c", - "installations": 2 - }, - { - "accountAddress": "0x7b08153338996ffa0238491edf7ad1037bc03328", - "inboxId": "311ba8e0c1a63f25eea85503da4c77eb4b1a3e77b71e4ffc34c630ee77bbde94", - "walletKey": "0x424f65a5288d8b74f252fe8390f401c1306b3d581f0fecbec0128e4eab9bf06f", - "dbEncryptionKey": "ebd2c16a50f9e6d31def3ee68310c019ce22d26063d79f2433cdfe436b8c0d0a", - "installations": 2 - }, - { - "accountAddress": "0x92c7e791a7a6d44efbc570c76ec273eb7126a959", - "inboxId": "81ccbae8ebb9de93be94672a608d99d9ced8514f14f0cd6efb0cf16f1e62bf5d", - "walletKey": "0x3aa59516a30ca1f38351b60cc26c40af31e0e168843bb866c9e298e9834be344", - "dbEncryptionKey": "8b095132363025a97eed71603ac15f3eed6d136ad5385b6a97792d0d92e5b9a8", - "installations": 2 - }, - { - "accountAddress": "0x63341bfd122748f1888263a6474fb7ba41858404", - "inboxId": "c5de3b19998f2fb544cb95a66c9c465d94f9f06235e0e37416b40c332167d2f5", - "walletKey": "0xb603e7c0563f5e0ac86bd9dc2853611c8413b6af109302d68c0387ecd5ce5dc5", - "dbEncryptionKey": "72f9f91d06eb26f5cc2cc7aaeb7e463b313cc8c9b56bbe9f9a2364d023ca10b6", - "installations": 2 - }, - { - "accountAddress": "0xc5c1bcdd4e0657be06a42a8f144427ce905a2d0f", - "inboxId": "bc17854b43972742a7c854bf62313a268340e8bd7bf8acdbf492f52f7dd5fe08", - "walletKey": "0x8bbce9afc19caba03b377a346abcb4fd4b920fa6e84e8e40751028ff01981931", - "dbEncryptionKey": "3ca64168db505bcc5157403f96fd43c95a0a298e20a2b47f8b866b95ce5f0d25", - "installations": 2 - }, - { - "accountAddress": "0x3d13b6a4fdc48cc7ab485afbac89f5c94bae6cec", - "inboxId": "5872b06bb84e9660bc0a604323534997cddad15057ec67be5595ce3f0a00d7c3", - "walletKey": "0x2c6bff803939b4a1c1b18aedba3a5036af5a92823849aae701a092f241c6ef8a", - "dbEncryptionKey": "d5d4c240a0da08e4268368ebf096a3c64fb74a6750db936b228f330a88a80002", - "installations": 2 - }, - { - "accountAddress": "0x0b1965995c344fb179eaf7e1f53787d8c1bf3267", - "inboxId": "2c884a799bf405c970e8bedab8b18347793eb3de58bb1c2d601411fbda86153d", - "walletKey": "0x1b7b60fe26ded33a83df685e06ad4c112e0f25da512878152371575b3610b6e4", - "dbEncryptionKey": "d2c93be53db49586e9c06dc98316d040222bcb51ee3b589840b640d7c2e9c268", - "installations": 2 - }, - { - "accountAddress": "0xef8d10a18e08117512ec5452fd0d1d8000591d43", - "inboxId": "d278806a777aef99535ae86f4df9b645d4d0c07b5d08f60aa2ae3116cf3a7eb2", - "walletKey": "0xde8a08c76ddd42351691904a29c45d8dffe22aa3ab87b778a538d212e05dd9ed", - "dbEncryptionKey": "e76a83a6690ad9cbdc5be6b057bb678abcd7b93ebec39f12a67f2c7e085305a0", - "installations": 2 - }, - { - "accountAddress": "0xb42db85a46a0ae25d24f50f6f427b9d8774f0105", - "inboxId": "991c4937d2fc4396431c328278c26b5c64c9246576ae90075a82c5c9329f3a77", - "walletKey": "0xc887a02cc147f7a9c670cd09a65462208bef0d8d323f656e7895e59da48be0c8", - "dbEncryptionKey": "c0a0e9dea1fbad45d30934a8d89bf8f3638ad1aae19f31fde5513180a8f0d080", - "installations": 2 - }, - { - "accountAddress": "0xeebf1e8d856134d4d03921736b8c8aed132becf1", - "inboxId": "dfcbb12934032ea57f42383be767f41d8200e36e076b6c411fa073aa77bd3934", - "walletKey": "0xa0eb3eb1e9254b70cefc192f43d4113712945760cde2eafc6d8231d5621cc56b", - "dbEncryptionKey": "5756eca173e8ca40e770d7ea9b850ff5a01535918a6d742dbd3ad76c9f59a569", - "installations": 2 - }, - { - "accountAddress": "0x60229eafdb7216dc43722fd00d4fc2323389ec7a", - "inboxId": "14316385087573c35ef809a16bdfba0b70163f26f2abee7b0855810644500d35", - "walletKey": "0x82ae427f10a393670a3360930aac76215a435c6a82c33efe2f48c788e5e68cf2", - "dbEncryptionKey": "d1f4247db006da49a69ec359f15fdb8a673e2fe691a15a200c2c56f19b17d021", - "installations": 2 - }, - { - "accountAddress": "0x4c42f71a0fb1401061d0790b14e384f5e08f8d09", - "inboxId": "062b653890b6ff052bed8fc7d69b9cacfbca9eebbe8f4f6631bc95a30661975c", - "walletKey": "0x5fd917a703d0824d586171c7e5250ce07813afb129a588be10393ed5b4a75561", - "dbEncryptionKey": "09d7db38ee003e1c147fc2322c1da90926bc5cbd5f11962c90ee548c70697cd3", - "installations": 2 - }, - { - "accountAddress": "0x417be8a96215369782406a2e2ad002bec6e6b30a", - "inboxId": "11e3c792a4b444b43650827de954a0e6615a65edda1492e2e306530bb13fac96", - "walletKey": "0xf655f891761dd61e462c87932ed68522ddcca1d83b9c313c924b0666138ffbf1", - "dbEncryptionKey": "5930871e4cfacba536a55e3ab35bea18c9e66bd843e29c0ec8e88ee4a5943008", - "installations": 2 - }, - { - "accountAddress": "0x8cad58ad8ac345d7e79ab30c1d712d8544237694", - "inboxId": "c0d87f03676ad9f91fd4c1a4162fd8c2cfa3c060314fa6bd18f1528257bd6f67", - "walletKey": "0xc84987fb2099fd5def5f89c466e1922f50e4710c9badc884b9916679a511848c", - "dbEncryptionKey": "425f09c5e9dfeb051ce84a660b700ea572c4892e838c2f4ba0b32d8042544b97", - "installations": 2 - }, - { - "accountAddress": "0x5cfc6db989ea4437693cf07b681a74b501071331", - "inboxId": "028c38ee2692b8df0d2a19ac38fa1535135d7ca13c90705bafb8d8706f2f9669", - "walletKey": "0x820e75e6c23eb1e48ed23e7abf056b3e8d2bf16b75736346d7faa25b5b76327f", - "dbEncryptionKey": "76eb68d8c3fd46bc1b268c8a447fc6be465c1639641b0b5de1f8255ae99544b3", - "installations": 2 - }, - { - "accountAddress": "0x11f2b2a10be81e4f5776dfd7f7a5bb0d9cda5f76", - "inboxId": "1df3fa45a3a12ba5950bb859352c121be3227eefaaacaf4cd8d228f4691a2f4c", - "walletKey": "0xdf8956f02a2630675d67859bb39d72f69e51c9f516f8134b8e79d3332cbd6ee4", - "dbEncryptionKey": "0cff472bf6c9734acca0ca9fd12be746e0bfca7c078438933851bcc1337c2df2", - "installations": 2 - }, - { - "accountAddress": "0x24db48ac1499ac8c4c12dac764bbd05c80ac4aec", - "inboxId": "14107fc9da4a865c4113d4cda8cfd27ca96b2c897ecd5b97b55ea3288066e5bf", - "walletKey": "0xec498a163b0f913ac30449b0467179a1ed17582136e196568ffea3e763a6d6d0", - "dbEncryptionKey": "01726edd0c504e4b0d8601f1f6ae74343adefed7ff2a0a4f749585630ec3f036", - "installations": 2 - }, - { - "accountAddress": "0x3b5e59210e100448aed68ad813ab779b2d2bfc60", - "inboxId": "9958ada11f49ae7ea3820353779740b620807e84447be69cad195ccf48f8635a", - "walletKey": "0x1e27c8ecb3e6cc6c225e0ca54f73f9defb12d9a448025f9f92c70de02e3bf752", - "dbEncryptionKey": "3d763ec323f89610e527b088af8c6e4d21e5b7b042dd65b55c926e449e041bb5", - "installations": 2 - }, - { - "accountAddress": "0xffaf5fdcfe01283d2cb166272b5ec784196a9898", - "inboxId": "9d1bb3be3305c60b33825f790d699f1d39ce88b498dd587b9dee87ace44a6dc7", - "walletKey": "0x7d47982651072796632b4dd61cc2b22c1e85905957b718d8db99b244c4f40b69", - "dbEncryptionKey": "0c473f16428d079e2b1e95e42f96a90b5bfbda0c5a19556c173baa6ae0f9d34d", - "installations": 2 - }, - { - "accountAddress": "0x4cf06297308da7180a4a7db4de45c62050b6e8b2", - "inboxId": "22e29942a351fc6ae89311c3584d2b878edbb7d0f8f9a6345a6a12a372a08054", - "walletKey": "0x8942cce9176ba7c28aff72f39fc9b646b83482ef9a38a519e77757858a217f54", - "dbEncryptionKey": "6903959caa4313ce42c5a887f6ffb390892afa91ebe0ed4af9d907b0a50e6fe1", - "installations": 2 - }, - { - "accountAddress": "0x42a5a5b2b0b65cd644c8a9b9232235aebcdaa847", - "inboxId": "7e6240a67adf8f69cfbc0fbc30148b954fcf9f9423c3feadb5f39cca595b371d", - "walletKey": "0xd494e076c28b5afce2f9d827fc7a26fda6caac01e95fcdc46a71a5c91100992b", - "dbEncryptionKey": "8ed05b69a130020381b5b074c1482d6400f75755819be54ed4807d30080dcd6d", - "installations": 2 - }, - { - "accountAddress": "0x0f1b8d81a28f99a442cb9f4b280ad26b5ee72814", - "inboxId": "be73f8e3f881ef9db5f2ad0cd46f464ab1ef55e4d6a9d1f2827a403bfa2eca6e", - "walletKey": "0xbe013a49e6bf44db6b8d1612c3341d22c9c03c6ec5ed80255bf22a98135b7948", - "dbEncryptionKey": "932c7296ff4a36c5fb9c339c299328905456cdbf6a46df0ad1552d36f0a03741", - "installations": 2 - }, - { - "accountAddress": "0x9d4ce81533ef874a76eeaa5b9e42c7c876a3df88", - "inboxId": "9761098684a1d626009070765e129df7537ec247e9933460cbb3015df9db98c3", - "walletKey": "0xce4149554de096456d40e0c7d3f63022d6d7722ba6e139c932bf9f63e365714a", - "dbEncryptionKey": "029d021c4d1e0940a24267ba1472b51f24690c46c61924a65defe00bdba3c031", - "installations": 2 - }, - { - "accountAddress": "0x9bc6f2c7eba78d9dc01f5dd1798a5713aabdc0ce", - "inboxId": "9e0ad51a425206feab3734d696cb626116a42dee07b06fe6c435825766a5c062", - "walletKey": "0x6ccd85c5ef2aee474273dfff718faf1c5c9d17be535346c47fe847157f175a0b", - "dbEncryptionKey": "fda883e8092d30cf414a76e874391fd0228dd7e26b8e9a7c48ba64f4d7fa9171", - "installations": 2 - }, - { - "accountAddress": "0xd9b98ee7dbef80c7a7432607e9ac818d737ff887", - "inboxId": "3b1a75b8c149f7b7e20458f92af578a195ace27a76d77132c343d93055539a8d", - "walletKey": "0x186402c64bd40a2ab93b820c00cb84d00bc52d9366b3f47f6f59c524861cb008", - "dbEncryptionKey": "433e2dd15e48994f550a2297becf66a51355cfda662841b16855d3b40fe80d7d", - "installations": 2 - }, - { - "accountAddress": "0x1a70866545162a2cf6f680f5564a199e86532760", - "inboxId": "3f42f83f3972ea2b988ac1f6efce83986f69dca5c347f6911dee7eb53fbf45f6", - "walletKey": "0xfb2c4921f86f4b2641d4e8c3b866cd81d0c2011d2e171e115d279f000cbfec53", - "dbEncryptionKey": "57c356b82c5ab4e0aa22f7bb41a5ca76c8c4ea95c8615d521fd7f7e494b2aaf5", - "installations": 2 - }, - { - "accountAddress": "0x4141fbcd33fb030dec49ee9c51f2e2166409dcf8", - "inboxId": "6599ad9c1703602b62e389211e4e5e78e8d283d475c2330a9a4a9acaa979aa4f", - "walletKey": "0x981b29082d8b20e1436523b30dbafd19d36b5a9810e23101adc636475ab0c8b6", - "dbEncryptionKey": "da31eb67a334558e38d9b8b3d3a3700d8cb4d0a36a0c8a85033e7acc9053a40b", - "installations": 2 - }, - { - "accountAddress": "0x9c32dffb5632c8aa589a66b06796a281bad30b74", - "inboxId": "92e785bda0d4aed1233af715ebe91e48719904fb445de6c31f448eda8ce43d27", - "walletKey": "0x307c721b9a0369c9b367b039693f9773b5fa1e97a71853b4cd606d79d3839090", - "dbEncryptionKey": "ac5ba7ba7ad9cc8386458090c4efd7d29bf8abee253100e4faa42e26dbe8bc67", - "installations": 2 - }, - { - "accountAddress": "0xe0bb43d91ecc5962f413e058268c9027d67f7229", - "inboxId": "a8e0a4fbb8fe2a43a4889246c3ac4104b04ca68ac0892a59b65ecfd16878b0ac", - "walletKey": "0x3839eec70be911ed36456b638150dad306ffaf10a6138c6c72abe113df45bc5b", - "dbEncryptionKey": "72f83f4dd02f1ec8ca23239b8d87a17182a8ef14fed2ea45de8f6f15696a8e19", - "installations": 2 - }, - { - "accountAddress": "0xd35d83aa24f8bf5fb4a24c8bba36da4ef4ed5481", - "inboxId": "190b9b8f0b2c83d298d68f821a772706681b605861401d1a59067ca3e491e2da", - "walletKey": "0xaf52cf08c0ca3acb1874e5365809dbc0993d7130fa61207d1973ddd77db4a40d", - "dbEncryptionKey": "bc174c08dac091a15d600ea880c3ffbba99dc5b5b647de3c048d2f0e4fed4dae", - "installations": 2 - }, - { - "accountAddress": "0x987cb06466ea1d52d870bc25d23ab366eadacc5b", - "inboxId": "c28ceda90f8ddcf833e083c58db7df9480491fbc56946d0dea0a1a7f5d7539e8", - "walletKey": "0xb2d2b0a30b1ffc1ea3e845780d81d9bc1a4350bb7a2dbd0ab170c7749474da0e", - "dbEncryptionKey": "813a37280cb4ce7bc08b6b103bf8de0d3fc92b4cd1a19a55ceb13cff4f2293b1", - "installations": 2 - }, - { - "accountAddress": "0xa0edd964db167a3632be5a19063dd741106c96dd", - "inboxId": "afe3732f0f1c19560ae02021b64b62ee49ed6bb2bb2f13bd55f9b257dd50edcf", - "walletKey": "0x6d2a03cee8ae5e8b50bb5212951d9692d2e311ed89492d4c9cce614a8c6b403a", - "dbEncryptionKey": "5cde942162df112705eb9cfc4bad54b0c979e2465e114bc8b55ee7d0a8437d8d", - "installations": 2 - }, - { - "accountAddress": "0x26409acc3c650519c8e96d6ea45e8f2ccb13d932", - "inboxId": "26d2fee58ffa4b024312ea03d0cae32535d63cc3f43d0936dab185de57ef7fbe", - "walletKey": "0xbbd24f2e53cad2efb5ebbf140b894e1cd6d33938cda8deb18a2d3ee0f3863cba", - "dbEncryptionKey": "12f2a2a65864896ef868082df4bb818c7e0f97abdb9d925f6af9d85d1aa464f3", - "installations": 2 - }, - { - "accountAddress": "0x1cc041636820149f086f6bedcb6094f1adea0812", - "inboxId": "15ef195749852eff5131a3e642b5e98ddc2413a77758bcbd3d14f395d22b1245", - "walletKey": "0xf16345e5bc3b67603c1e93b6b705c84f74d2649682ffe17270ea19655d0f736b", - "dbEncryptionKey": "d2d6589ddccd58d0e494e9ef3d01abe63ed3a9e870508f0f656f8bf75b91b303", - "installations": 2 - }, - { - "accountAddress": "0x6cb54c1e5fb09cc8e6dffdf893aa9cf2f161ce25", - "inboxId": "05ba53b5e73b96962068fd920ff2a84f376c61db26f3c82af5c44a9aa0f56168", - "walletKey": "0x2742e88b0e2fcdafe1666ca8f9f860ee7bc046b3cf2c785140abd1f0d28f01ef", - "dbEncryptionKey": "758c2990cb40b91db2b68ac7c4ca2bd9bb1399a0eac6f04573393151fc918ad2", - "installations": 2 - }, - { - "accountAddress": "0x05a81999dea10599d85d26f66d9fbf8751ad1534", - "inboxId": "f86902dfc1842e292e0d993383b92ad0308e5fd3634898d3c1b4e8baa1cac889", - "walletKey": "0x60f2291cb05e43b35c4f26df9be1e7d6f631719578b3d195170bcb971a7de5c1", - "dbEncryptionKey": "5de0f093f4eaa1a64bd0472c56efd80b58a6cd11626a85c7e1b0018497d25ac1", - "installations": 2 - }, - { - "accountAddress": "0x0b00b36d7c5ee5656fbc955cf326b09bfefed33e", - "inboxId": "3fe2b80fa0c5e17a0a1e6f6b4d2382dcef7355a8664205a26dfc233968d90e39", - "walletKey": "0xa7b203f02f09ca7289a5c1709c271d0bb7601218c996cd805afaf3fc0660e27f", - "dbEncryptionKey": "1b5e93e856684c924a9e508baaff263589bdfa2b93430497aaa4936a6eeaaf79", - "installations": 2 - }, - { - "accountAddress": "0x696fa10a79c4f4d114617a45e7b85ca3fa356e67", - "inboxId": "15f207e3a89dfba0ca4cc87e4d09f26caa82ddc64e6b8757a1997361b2318de5", - "walletKey": "0x0c175f2bcd5824355b1da4bd28b451b05cc3721baa389280f18116bfb01add4b", - "dbEncryptionKey": "51e0a85aaf03d5924ef4957106c4f0580f47985af765cddedd484a9261d4fa21", - "installations": 2 - }, - { - "accountAddress": "0x57a59ee8ff488a6a1d7274ba6c157ffbfc9369aa", - "inboxId": "f3183ea29d0caa63ba08e08b7016e525c180333edb85c6f02da2a0a851e5f08f", - "walletKey": "0x97b73b2420842d7e25cb44be8ab5c9a19a68870a752b6fd71b12b6742b9a1e31", - "dbEncryptionKey": "1304cd746bd56be859649f564162a82e81655dcf6416a28ec8a2941514ec21dc", - "installations": 2 - }, - { - "accountAddress": "0x755a881679cfc9a1793a4f1058b4a203a9d41981", - "inboxId": "4b489198d344b2cb285d8b1750a37c72a1508c2d3644fa2969dbe62f79d64d3e", - "walletKey": "0x4a0cedcdb99aab3fefbe2f1cf4b917b5b507bbc73aec41e78b31f97cc44d7f47", - "dbEncryptionKey": "b93d31f2e5ad2816f117497c0cf0e6b3b9c4f6f40a42f4c22132e348559a0e12", - "installations": 2 - }, - { - "accountAddress": "0xf08f9888b81ad8c4f048d558a5c13b70393968fc", - "inboxId": "d8f84b9e1a6d559b1cd56a2aeea4a7cfaee893771dff2c76fd14dfbb38f724fd", - "walletKey": "0xeb7fbae5d137f911715606cb0ac69df28ca6ca2c92decd5cada85aa3ea387268", - "dbEncryptionKey": "88dcc2bf489c4a27a3b0258a53de82765cb8eeb67619c04b5caa5ef7d76bb681", - "installations": 2 - }, - { - "accountAddress": "0x2d2c6ed5d20f7b7c6532177b21924e5a071a8797", - "inboxId": "93dab6359deaa1f33ef8b11fb3e97f6ac90c568b7ef940c125b8d5293579aa7b", - "walletKey": "0x34a8ce2786534a945d69be71d564e4c3adff1ab1207cc92546e94258c436294f", - "dbEncryptionKey": "2a2180ba63988ad7a4440b231334be8c23d8e5d10b6b95a88e280fda6c85f887", - "installations": 2 - }, - { - "accountAddress": "0xdf9a963fc64201ab1306557cc9d435856c2b8a8b", - "inboxId": "37292c96c5089bd9abcdca2213983b95897df0711da04dfaa5686c8e2fb362d7", - "walletKey": "0x3b620ae1a088ffe05553392605fb1a73bd26e44979260b5d06c4a692f36cb2e3", - "dbEncryptionKey": "68de7bf55e53e0a998408f267bf38b46cc63cf27dec8e41373415e95e81d0bc8", - "installations": 2 - }, - { - "accountAddress": "0x1a7f4ebcd1680bedb779a984eef986a2498924bf", - "inboxId": "4f22e347b5b269ad81ede2f5c1ad5646475fe554fc282d8464a27b0c78450000", - "walletKey": "0xfa19d7086d901431abd6bbf0a38e997145dc06ffdba19796b2a7822a1750da7c", - "dbEncryptionKey": "282ddf1af7b80e86af1c6c1492c44dd6150382c920c2f88ccc3540bb1c3642db", - "installations": 2 - }, - { - "accountAddress": "0xa650e6237318fd4d4e5253667709f3a02113a2a8", - "inboxId": "0839b8434a4e31c4cd4f220ddc1f9e4d9ef26c28c36a077ccb19315982e6fcd2", - "walletKey": "0x3b7ffcd801803ab85fe3e65de16a5d6cac776bffdb3d0fb9b63092b9c543a041", - "dbEncryptionKey": "0f0a5b4d2f40a5d6b5f35d16c1974f25c66c4c3805328312aee8fa9a1ac8e9bc", - "installations": 2 - }, - { - "accountAddress": "0xd25ff32f7ab9501f369687e1b831a00d14e0ec42", - "inboxId": "c855add569084ec5490fe7bccfd84119012f682e1b7d174d1d39f047554efdba", - "walletKey": "0x14acd966769f32a0f15eca7aeb3a0bfc89238784e20ec47368dd6b3bbbc37781", - "dbEncryptionKey": "58a0f68d988e52417bdf490ac1de7a8d71083fb7355eb19b26223406f6d00270", - "installations": 2 - }, - { - "accountAddress": "0xff5b1921bb1665224ae5a997098592696cfe6237", - "inboxId": "b0811a3c9de67b10481e98e531088eae56cedf7a6a83cc6f36c8d80b3d1b19b7", - "walletKey": "0x47e2b8b91c04490aee73a11431f3381f24876dd05f05b8170681841bdf52b039", - "dbEncryptionKey": "25d026cab4ba0ab1af14a8a53d9db27e7c9efc67c2c99793e0434331ba18466a", - "installations": 2 - }, - { - "accountAddress": "0x01523cd0bd63b234267aeb24bc87eb57607f1bbc", - "inboxId": "95b99dfa8b247dd69fdfb5c28983bcbcddbef4d66615edbc1c59a66fd4fc83c6", - "walletKey": "0x28c53bb9fc071031287a00e5fad2bcf12c08832d6f9af9446dbf0ba4cdb9316e", - "dbEncryptionKey": "3c13ecfcd2391f29cd46bf94e21a13e3a97a847bdc244dcec382cea387dae925", - "installations": 2 - }, - { - "accountAddress": "0x50d3800b1022bbe062499698be791105dea1dde1", - "inboxId": "ad9cdaa18624a135ebadc800de90381467b2047c28fc7878c0735d69d8f98f69", - "walletKey": "0x0b9144fe9564008d9178adeb020e6c85b2cb659c2662c3bc6851752ce8b3b05f", - "dbEncryptionKey": "1c9f26ab71aeff4d77b89380c6d4c2e81ad8690ab9be694ce2614ca34d2651bd", - "installations": 2 - }, - { - "accountAddress": "0xf1e6a770aa1cad2ca82aa6c0633c6e9ac3429528", - "inboxId": "c8cc5d8a0e6bf1fb711419cb87d024ebdee068e1ae66e0a70a06d5c31b531456", - "walletKey": "0x99625d58ccad59a96650815b89cc55c7e9402bd76691d8a120743f77e5d6b199", - "dbEncryptionKey": "7d820e2e2b62e9c687ecb2b8927ef8b97844699639cb1ae4238b4d5748d8feae", - "installations": 2 - }, - { - "accountAddress": "0x0de23940275369d1919eb53ef8cd7c02724302aa", - "inboxId": "73748b538ad1796298be10499733d794ff22071a69ecc71f773a414b9115f84c", - "walletKey": "0x108bd528f25653019a09e13c6976b05203f4255ea730a2ac7fcdff8dff75e64d", - "dbEncryptionKey": "21feb9e4fc5b16e1b236fc26f1e4705849a1b0be3e8521b224bda38b4ad1361b", - "installations": 2 - }, - { - "accountAddress": "0x3f72e1c18e2e0fb811ff9bc53c924114bba9984b", - "inboxId": "31c8ac8bb3962fbbb82afc845bfb5475325595cdc1bf6992c7fa8bf64f808430", - "walletKey": "0x25a299a9d3febbeaae86ce9c46dadd798fbf07195f112131acc6ed7199437cc3", - "dbEncryptionKey": "ea3348ec548509dc4c2b9057fd8e171ea30a3fd861aa13a8025f5acf530b5c86", - "installations": 2 - }, - { - "accountAddress": "0x8a5fb07d44f4fb7694144d32583043f3e8d1e678", - "inboxId": "81d6bd909eafc5c6cd01636ff13ca3e0a2ca162581f3cbbad0b9e231898862fc", - "walletKey": "0xaa5ff0d0e816bbf4973d6a85e0d5af0a91777f556d68a3bf8f7d6e327da31012", - "dbEncryptionKey": "9f16acb01cd3ae6f10e1ea210b00261434efdba07cfaeffdf43f8610ffeeffea", - "installations": 2 - }, - { - "accountAddress": "0xb8bb50a784b5a201bba11f15405b91baaa059a99", - "inboxId": "1da45e0f68837a9b34bc46f1c555d8e1b9e61c62cf7d39bd3678aa8c4cc3c650", - "walletKey": "0x55f49a824a87807aee31abe6705c5fb9665b49fa2b3ea2105d2b02e08d10cb39", - "dbEncryptionKey": "a70fdb3428a90ddc3372f102fc79a9748bd6491b823c4332e634e3de19f7d77a", - "installations": 2 - }, - { - "accountAddress": "0xe2c43c4272aea82a2bb078a94f6d20e52a9f447b", - "inboxId": "a9488f3a5194c213a089a8af06365de0bf303d115673e7d04b4bdffcaa6efacb", - "walletKey": "0xd5a3bb3fb90b9f80bc9fc58c7077229dcdbef7b4413604a57e54f64eba72b6bb", - "dbEncryptionKey": "2d2ff863bc424e9af4221bd443ef409151a1d9674afa4b96a43afdaa2f714a52", - "installations": 2 - }, - { - "accountAddress": "0x1b4eec0ea2d578bf323706231c3cc79628193caf", - "inboxId": "b1aafbe54b29d47cfbae45c990e6bb6817fb72ee934f44d36973042348198c1a", - "walletKey": "0xc8c3bfcd970f80bf178b64cd17b093024235c1d46e9002699705b46ea6db30be", - "dbEncryptionKey": "123f710ffa532e41598d965dc7620eee203fb495c8fa96b9466b2817c1ce4fe0", - "installations": 2 - }, - { - "accountAddress": "0x9111b452e77c4dc7630e28fb6337e95cfd33eff9", - "inboxId": "a17446c704bed5fd2cf3078e33010102e6cd239926393c78a9d69dfbed64165b", - "walletKey": "0xe754c5bb2736721e51ee46198cf004946b54281498a60b14e6259a04bc477f37", - "dbEncryptionKey": "871cc940b56851242485403a7ae1870ba9557474f6e9d270b37779cbb3fe9b1b", - "installations": 2 - }, - { - "accountAddress": "0x2261aa9b4b360e2cfef95f17e2ba766a1295bd58", - "inboxId": "6d556b0589b30b2fa4611cedcc9e179f8f97fae465791204fde117d78c37c84d", - "walletKey": "0x53646f89533579d91ab765a475b0b9a26e2c7f2f79766e8049f76789ecb9236d", - "dbEncryptionKey": "8252d053e1cca0d1d91c94d4cf95bd385e707b4b0d554da1537c2afae403fe9d", - "installations": 2 - }, - { - "accountAddress": "0x4c5ab0e6a96fd0bcf086140a8c3dfdc0e94044d0", - "inboxId": "6a676f9aa900a5ca7708cb81efd091b45334d6397440ea3f515a32ee1303bc9b", - "walletKey": "0xda6cea5eed75e44cf1af093457851d372d7463955158cdbc602773c0dedb9ea2", - "dbEncryptionKey": "894c36da5e567959d92538e3bc45f2fb6ff358d3fba94d444a62dce21310c801", - "installations": 2 - }, - { - "accountAddress": "0xf535ff204738d8cb3d8c1f6765cc74b7c9903376", - "inboxId": "a17f24ab754a18c4d48a70ca15271741ecdabc4517289391546ec0e4e279c7f3", - "walletKey": "0xa5694e79a6c3a553c0b64b76b6ccc88a91880a32921be752c23f58a5604a8e5f", - "dbEncryptionKey": "43e63334245f52bf1015ae9304aca0f88f8f1979c53f17f80632aecab3d04260", - "installations": 2 - }, - { - "accountAddress": "0xacfc9c6b300af15205d9adfe523ce813f8d5e451", - "inboxId": "77ec8aa3853696d57ff65c3e9c9fe6ced2ae81448a7188353774d56e16df2022", - "walletKey": "0xa7a8e75b0a865f659c7e978de437bddef62931da8b541184ff7d3eda0c6e9892", - "dbEncryptionKey": "b4561715401fa6898905c7382ecd1aa5ee914a9dd48c48eb3a9667f3775a84d8", - "installations": 2 - }, - { - "accountAddress": "0xb6c435643ce82a8092ef57a45f66ffb9e3b1a627", - "inboxId": "ce3da43f70fb829b15ceb5dfdb52c345de7f2a292ee565feeb6976b61a8c3bc7", - "walletKey": "0xb742c13a723e11821ba539a29c58c698a98398d285392344e4ff425866eecd88", - "dbEncryptionKey": "59fb646299a9dc3d443849884f392893cb78026b9463ab3f5cfcaed227825a64", - "installations": 2 - }, - { - "accountAddress": "0x79904e67227ad6d2046a54c1bb22ceaf33687c50", - "inboxId": "eb7b2ca72c09f310f3d0e15cbdb5a8d3aa26761ac397a6e86b63d57728c71b27", - "walletKey": "0xcc3b8f51c5ca21e883ba28594d364f67cbcf80d69b22f49735c9c7a4d91009b7", - "dbEncryptionKey": "fbae833a7f29596a78516ca8af8dec838a7cb7b67bb18b6b7b9aa90585667b6e", - "installations": 2 - }, - { - "accountAddress": "0xefef8f169579bdad12a1eb0d9d9d814d968d4d39", - "inboxId": "583db3f766c152e9fec756ec79988a7ea3eb436de19e07d253eaf71cd6f9383f", - "walletKey": "0xc0da50d175484e26c92e4797e9e5ed87f5fe79e1d42138769cddc66f8d272d38", - "dbEncryptionKey": "b7fd255df7c7fe7a5adffd6467660040c34325131af32cf7b87ba8a43a548da9", - "installations": 2 - }, - { - "accountAddress": "0xc019f16d10eec130fa99970f51fb8417762a44d3", - "inboxId": "378ba1f097a0fc79c158cf65c8bcccd61f6946b1cb177747a291b5fcb46b9f1b", - "walletKey": "0x604ab0f73fbed1e1e70b69bd72086f35a8be4df5a52c582410eaef8f77bd8311", - "dbEncryptionKey": "3ff0751bf98dc44640ad5ccaa7e19d97e17a93efff1e7f7eb58c4713eceb617a", - "installations": 2 - }, - { - "accountAddress": "0xe2a83c566f31e138dd0c60abf8518fdf4615d401", - "inboxId": "16275227c06ebd8bcdcc591f34aae8d5e85ed7c79c3253b1872bef725f39ac7b", - "walletKey": "0x74c631f2a57ce81b2eb23e3f6c613a9fe5b17f2329b8777d561dae24fd8fe34a", - "dbEncryptionKey": "da4120ef8e10ca6ffd585bc094b9c79151e172c158089802cfecd8f306aa9640", - "installations": 2 - }, - { - "accountAddress": "0x2e9395c07bc1fe94302fda71fa5d03122135125e", - "inboxId": "c1b9cf27446331c7ee11c4f507b2835e356684db2ca05cf475b6389927c3d147", - "walletKey": "0xd3ea27cc70ddcdea7a3b2f578de26d35529a209a02b132fc8a8a808c6618420c", - "dbEncryptionKey": "d749a41f21a964bfafe439e59f73b8231b65d628a991afe49126be14e172ed6d", - "installations": 2 - }, - { - "accountAddress": "0x4f98588ddd6c3d26e1ba34b145aa81c439eaba86", - "inboxId": "51bfe8ce608f5b5dd212c4af2ce54f69f84b1aba22d5851b7074ce43915f0045", - "walletKey": "0xdc78a63a8c48156344d3a01a31d7e08f9ce8ce04a1887afcce95811b61b06e40", - "dbEncryptionKey": "a765d32b0f879af4e629edc52aa539b96d663d3b0528aa9b1abf6e10e7bdb02e", - "installations": 2 - }, - { - "accountAddress": "0x66c14478df4f8feaeac6600cd89da90bb60b12db", - "inboxId": "7e20be75689fe553debf4569cd2775b442ac4de0ba5777bd9a975736c83b9ae2", - "walletKey": "0xc874a6cb673c757e7c33e4a48e510db2f5c603de708dd9c94820eed2c6c38689", - "dbEncryptionKey": "0cb6981dd4dde5d7e30039b621ac0382e8fd09379fe468cfea60c0bafda7eef0", - "installations": 2 - }, - { - "accountAddress": "0x01c5bbf0ec328872f1ff5e62fcfcedad99cb5e92", - "inboxId": "48c49138cfdf4f1743e56808326aade4e2d1ab37a9ad50b12daa7575c3d6ab14", - "walletKey": "0xc4956a9a0bd5f3e63053f2bf879ce30eaaa18c26e93bf4a0b131439f6a5ad050", - "dbEncryptionKey": "2bebfbc3dee21ffa46c3da73c1601bce0bb7efb79ec4eb20eba2741b83274d26", - "installations": 2 - }, - { - "accountAddress": "0x284711b740d8c6f0dc13b1e915079f760ae04907", - "inboxId": "4e87d29f9adabd29fc70f0dd02113194c8de73e79a75f1251fc1fa662e52ad5e", - "walletKey": "0x6e518d6638f7773b1e37e88b47d1a9e07cda636168f941be7b85b9c3ef34a732", - "dbEncryptionKey": "0b61acbcfff03952e045d1f4ff18d5843d7b282a3c6c397db3e38e1cea10d60e", - "installations": 2 - }, - { - "accountAddress": "0x93347ef4294ecf07cccfa377c29f585737dfb82b", - "inboxId": "aa0f3719593ada267993d7bd0ff7f0cc5c748c4a5cc8f947b2040be2d9830918", - "walletKey": "0x1707a614413505d2133a1c9ad7ec6795af1371204687f1c521a293c6e664eb94", - "dbEncryptionKey": "6037c162009060ecf42b8e07729c3095bb17016c5905ec0ff387048ea2471b68", - "installations": 2 - }, - { - "accountAddress": "0x2a09019ca69e8721ae36eb183e63e4ca644a5a88", - "inboxId": "2d6abbcafa41e24440b079f8b008af2914c0818aed40073b98a917f7604a0412", - "walletKey": "0xdd3b9a955884a4105ab5cf836add63b310120acdb9307bfa1491af81201ce82a", - "dbEncryptionKey": "8f72562c5554a7239bba3e04f0b072d7d78087b6e8719cd7e67c85127484010c", - "installations": 2 - }, - { - "accountAddress": "0xfd14d4a067c8a6d7a7c62d9da9c07c18e792b465", - "inboxId": "e3e23e2563b7a7ed894c36ae5afd773fe547e5411b6a4ec73431ff474d423653", - "walletKey": "0xd61639dded785e54d5d7f38b68ca0221f3d5efb6c1b3aeb6165775b2f9658a3d", - "dbEncryptionKey": "a013c5fcc04c336cc994d6ce2f7c26228b33fa5d31ef0898a969f9481b42967c", - "installations": 2 - }, - { - "accountAddress": "0xc827d25e75eeb804bdd26bde0e58f848fc000285", - "inboxId": "6dd235438030ce2ca4b88587905b98ccd3b53fbcd38f2a2b11146546e38eaab0", - "walletKey": "0x025ec6f49c444ea7ea558fd105237e43ef43ba2a8247fdb543445fe141b10721", - "dbEncryptionKey": "713c666ed8396408103a390468cd53298e7967d51b9cc204628f7532bd5be986", - "installations": 2 - }, - { - "accountAddress": "0xd295e6633406066bb514b5c718a7cac3cb5cdba3", - "inboxId": "77f75ba7a3fbf054d1931b951a76ffd42096620e8dfd59ef028b88b381fafb9d", - "walletKey": "0x4623fdd35841416add305d79734a3f1cc9e382cc8cd402fe063fe1c268998f1d", - "dbEncryptionKey": "dc8e62fdc13ceecf5eaa43519aa9fc2aebca457a13a4c02319fb5de44dea2b90", - "installations": 2 - }, - { - "accountAddress": "0x93f65daba98f7ef5e00b8f1e783af4a4d6a792ce", - "inboxId": "2b6feb45ec3346cbb6006ebe806a2c3b6bb271f4eab6f5e710b19ba95af977ea", - "walletKey": "0x903eb67535d54dbf792574b2c939ce8d00e4f7db568a574ecae0627972f75623", - "dbEncryptionKey": "c37292d589ce22fed06aab16031c7e88129f645827f0e406cb2b92fb7007d236", - "installations": 2 - }, - { - "accountAddress": "0x873f3d88a57e0bc43fc00ae9a246d70970f2259d", - "inboxId": "1632e92fc89c8d859439061bb391c773edd16624dd5257e17eb8db074887363c", - "walletKey": "0xa22ba9027c222b66ea961e4c04a9be57d10dc579fb0479fbcbc236ffc3292c19", - "dbEncryptionKey": "6d6e9f57eb0d301d8fa97656934dfc65534238e10eaea4a9a0aa63d77dfd5527", - "installations": 2 - }, - { - "accountAddress": "0x867fdc42842094045b586fd50821bdf5b6a64cae", - "inboxId": "4681b543f7370515e584c1a6271d42e35ef34460902e812a4bbf5bf41bddb2ea", - "walletKey": "0xcd411b5b873250c6ad27446c7b422bb19eddaf434f3e5d98ff561d88ac9a36fc", - "dbEncryptionKey": "1959c2a61e7d57a93880c1c121be2f33e591c44a43f8c98209c6e178429eba86", - "installations": 2 - }, - { - "accountAddress": "0x8025f7e8b9801a991b173e398cb5da363532e2ba", - "inboxId": "e9eb1e179e4b8f1aab311cfc615f1c5acb81cb0e5593af4ad4a5a4bd013bb340", - "walletKey": "0x80ad27669257e35b0d508478f2767330c7298a188fae5d9197c6b74147f41fca", - "dbEncryptionKey": "1eba8082773b22e0681acfedea989ea4b9f547dfa9e8102e047a4459301caa40", - "installations": 2 - }, - { - "accountAddress": "0x3621f116795e0eaa9e75e037480a45afaddf36f3", - "inboxId": "f4ce9a458336f33ae20d614344966fca8bec60030de5cd615e2f3cfed10549fb", - "walletKey": "0x05866cfc70a95ef46700812699ab22401b7e20c2fcea4e5f1259c7c44429baf7", - "dbEncryptionKey": "69cd1f9b9f8d387a7c6c5bf4591d776300d22603ea810c0071a0c30f7b9bee89", - "installations": 2 - }, - { - "accountAddress": "0x8710ec8c5eb024e7c13aa48034bffe43338e827d", - "inboxId": "0c41a2b1525a7a42e6f6272e1ed493cd3ab6ad1f45dc2ffd08f910b77709ee3a", - "walletKey": "0x9aa4c404c94d99d10716c93476df8999e286856cac1ed66119ed0d0119b6e96e", - "dbEncryptionKey": "4cdadf6f056398396c9835ee627d8325c8c1dfb38a3d8700e7f3dbf5efcf38c7", - "installations": 2 - }, - { - "accountAddress": "0xfa2b964f3fca3b4a29df4b0c12aaa47c860cca33", - "inboxId": "dfe0fa04d2c2d792be88df2173655d68ac1f2f86924a3af109e316d48893cb4e", - "walletKey": "0x60887bf0874323dcdb8400706b3acaf85ab3c38cf0110dfb0a56786f0819de8e", - "dbEncryptionKey": "51a59a0bcfc3d29f4e6526a9f039da788bcf32f5339e13a865bea97cf739ded7", - "installations": 2 - }, - { - "accountAddress": "0x2fed57125ebaf38cf0cd56bece4185ba7c014f6c", - "inboxId": "5be19391f66f0b4df210bc646cb033ef7be20b57d6b002b0dc748b261b9ddf29", - "walletKey": "0xccf6ecb394d8e49eb55567deebbf7eab15e3fc1f0ce176f22784d1967623d3ed", - "dbEncryptionKey": "33bdbc0c67a538c44a5aa0888333edb91e24e513ae965b702d779c8cd1225c4c", - "installations": 2 - }, - { - "accountAddress": "0xb37439e9c7d02c2bc27aee66d1ea3a74e53dd7c4", - "inboxId": "36dcedfdd9f86c5c33e5d3b6dc21f3bc9d14bd9bb32be307fe692e359dcfdbc4", - "walletKey": "0x4879e4bb94e3908ef01ec2529bed725a6bea6bc8e59e14772c2ce3f6ccbc6b9b", - "dbEncryptionKey": "23d31b233996e758c4d05dbbc6456176bce24f8419f684eb95e4734fc92ec190", - "installations": 2 - }, - { - "accountAddress": "0x0b10c8597cf397e236c1394f4be58ef2c10b4fb8", - "inboxId": "001ba805a9d904ba1b67cf681d5b02d6c7db904c1c1c343445f4cf3349a876b3", - "walletKey": "0x5b772cc4ca4de15ebda64cc1a0f0f846abca8aef62892cd6f50c0105a8dd3b8c", - "dbEncryptionKey": "2e816dee6615de6305980d5284a5bb5d96114769e9f48ffd4a6589147b13805e", - "installations": 2 - }, - { - "accountAddress": "0xfe914ca9d811645a5b8ddb60334822fb4a8b9afc", - "inboxId": "34672f02a817ec3394f6a6c631e1aad9812149f4207b5636619a00cd4a51f2ef", - "walletKey": "0x19e3844cc67f4f195a1e22703a570a1984bfd09f22be5264a3b59294dcfdebcf", - "dbEncryptionKey": "1130f1ca485d3f914a88c48b790517d0a2872359b42b19055b4e575613285d1d", - "installations": 2 - }, - { - "accountAddress": "0xe4cb732486659ada144eae5ae7472df13f3b6c80", - "inboxId": "c5aee18197ae2bbaa4b91745bc0fef418a54f51168c038426da94d039aac9169", - "walletKey": "0x6113cba1bd1c5443cf297f403d2a0f4ac3c4c62227168e54464b0ec739e2c754", - "dbEncryptionKey": "04f8f7e067022b496467af2a3ce2acedbbaccfb0a9153962e0a43eb98c578b23", - "installations": 2 - }, - { - "accountAddress": "0x7e497ea7d0fc895a683f6fd9b769312b1128cb9d", - "inboxId": "bc3689d6449e2af5f3521abbeb69bac2b68e389005ac554ac6100e54b998c867", - "walletKey": "0x9f09616da84ef8309f073d9bf88523d00d9cfa51b0375d7da14f9d7160711241", - "dbEncryptionKey": "21a4596262c38399702a286a4cbdf083445f10fc4fdfbe951ef0dcd016288b65", - "installations": 2 - }, - { - "accountAddress": "0xb915887c9e0ccb2d8d47be55a6f9eb3049c4a9f5", - "inboxId": "f345f3237c82085c13027b666960027046214456bc33d2c97ecadab9c84d94dc", - "walletKey": "0x2c69b131b89b0599bcf8c72c980f6d1d234edf928db32a00bb193e3c4a3552ca", - "dbEncryptionKey": "87260b4d26ac7fc148d47cb2893f058018540d2292bd9685cd1edafc168f616e", - "installations": 2 - }, - { - "accountAddress": "0x88ce9b5ccba770985c412b5294da6c58db9ddfdf", - "inboxId": "4b62ec2f0b311df784dc855f1fd328cc6c8500be4191e641e8741edebd64e09e", - "walletKey": "0xbfb1ed9a4437cf3650005e695e549a1581398329593f9ee6e27defef94112088", - "dbEncryptionKey": "64d89c40d57a869156c8440062cb5995d1e4aed9952c910a54669547edd821a9", - "installations": 2 - }, - { - "accountAddress": "0xa7a9477d0a3d0cb25af2ce42948fd3e34a7a5387", - "inboxId": "13067bf82e5d740eac45813598032ba72077afed14a42009c9e15515416d3f64", - "walletKey": "0xfaf45a80d3cb3d9ba154cb7fb771a079734a6e9e0f91ca83b1e16f6f912953c2", - "dbEncryptionKey": "9e7c1483fdd596f02a6cc6e1a6e78eebe07efc38c80a609cededbef6b1cad8b4", - "installations": 2 - }, - { - "accountAddress": "0xcaf559e0bc0f59697baf63a252c6460d084d15b4", - "inboxId": "b8a53b5629afdeff40d0e9deb56f3204ae0ee7071f8f9642088cabf43ac2dd88", - "walletKey": "0x1c54dde4cf563439824b644e11ad02ac01d3c40a76080ef178f68a507b4a2a01", - "dbEncryptionKey": "f667af58963f50c8dc3612dc40d89286acd555a79d2947329026342b73f25879", - "installations": 2 - }, - { - "accountAddress": "0x6b18d2d6a0d5004a0faed63281c518d7ccaf3c4c", - "inboxId": "5a83c8577981458f25dbaff10ace327fb7f23e60b7075214e4e03af974f59e05", - "walletKey": "0xdb8fd2526eb4a4f18ef405229bd1b6fc0bff8ec3dff0d3d55f06c4323ba31379", - "dbEncryptionKey": "a5f5fd4942addb06be13bdc6c1f039544025c2eb366db94413323390e7d7ac67", - "installations": 2 - }, - { - "accountAddress": "0x16c07772b720383d24ab54e97d7eb6ac85703c26", - "inboxId": "9bff703159cd5d7b18170868bd752dfa5ca887b282b9ad6bd68fa76c4579672e", - "walletKey": "0x005e9c0a9f0d36beecee499a07e2b5a2d70e599190084fcf65904eec7d8aaa6e", - "dbEncryptionKey": "27d1efad75f183cad9bc24db82b41c0ef573807fa14c76974884ed11170d2327", - "installations": 2 - }, - { - "accountAddress": "0x520937be9f1ecc8cfcec80292b648831032f4f22", - "inboxId": "8c870364c00d6cbe37846e9c67db9f31fd8d1f35e984b99bd4f4ced6ae027185", - "walletKey": "0x55bc69b6b451f4590f38e3c8bfdec1d583dffabcf1b6766a66dd0613dcb41373", - "dbEncryptionKey": "39a14558dbb8ed55b193c80101beb5fdd994ab05fbdd38cc5e1cfa1135dcb846", - "installations": 2 - }, - { - "accountAddress": "0x7c44d4df6f2045f9edc1d62e4b4730a8af743e22", - "inboxId": "4559f865a1eb5bdec2d6ba8e9942f4f956bb4f6a63e20a167dcabd5181a389f0", - "walletKey": "0x217893ddf3333e7a585b715ca27cc9593791ce2eda7f8a2be3e479c4d66a1318", - "dbEncryptionKey": "1c59c4c363e449adbca855117b6a25fd0f5e6b199efc630d6d1118116e1a0a5c", - "installations": 2 - }, - { - "accountAddress": "0xf44b30cfe275f9fc586f0c6c5fd34cfeba04ded9", - "inboxId": "597b289bbfbaa6dc6846ffdbfa30b027b15837e4308a729ba801aa2c176bc3c7", - "walletKey": "0x9ecee412c730fd25c7017aa8d11c22b4ee85f2045ac03ce8a15f092275ebcd03", - "dbEncryptionKey": "316ce59ab4502921d0cada230095e4d288e2a26a627bc46c726ead00973b9b52", - "installations": 2 - }, - { - "accountAddress": "0xded93116cc94e28d3f43a3c2f953debbedf38e3d", - "inboxId": "3b149434eaca4570293f61f7d7df1a7afaddad2277f5bbebfdd8473763aa7889", - "walletKey": "0x74a5d6a5dfe29692f70af94369f531a33cfeed5ecfbe5afbe8b07840cc2c7fab", - "dbEncryptionKey": "541a5c034aeb4d2841dc4f25223a21fc6a47cd3ca6a9c6dea5deebcbddb618d6", - "installations": 2 - }, - { - "accountAddress": "0x4dd2c74e53d06c2147e06c9326975d8de86c1edf", - "inboxId": "40fb0315299e6a9d7a67b366eecd868923bbd0873ce9d0e7987a730e9a464f1e", - "walletKey": "0xfb3209a5572ea766317663cbefe18d713bf12601d60bbc9cae04311cc855549f", - "dbEncryptionKey": "edb218ba00c02c07609dcdc84b4259325aee52cff053d1d5602369efba97f11d", - "installations": 2 - }, - { - "accountAddress": "0x6bffebae3aa5c57d78d12cdc340289d2c6766da0", - "inboxId": "c3ad267b61d59f83dd9d5fe09a6666597ef782fce6ee52a11b260c2ba4885eaf", - "walletKey": "0xc8dd8f841109959ca1f7e00d52cdfc495be67ff47dad7fdc6fa8a75af1f3be36", - "dbEncryptionKey": "cd5734ae61cd6aa0e1bbdf0b93702642e07ed1138d663f01403ea9b5aae84eb8", - "installations": 2 - }, - { - "accountAddress": "0xf7f4a2e13d5840198a9953e2ec46632c249dbb7d", - "inboxId": "a71b2008c64357e01a0fbe5f7aafd5fbc2748ae76c6c7121fcccdda2f080013e", - "walletKey": "0x281908b2eaae7dba8361a399fc45dbe4848e8d75571614060dc119ef54aaa68f", - "dbEncryptionKey": "e712ec5069e0f445a34bc5e28fcc8c50072f781e1c544bf56383ac5126f49a78", - "installations": 2 - }, - { - "accountAddress": "0x98cf42f1d06212c6c4ae3774e06c0ca46c97dd95", - "inboxId": "1a21c4fbb9f6ffebd29d75e0214fe2c58bb4f2fcf12d68f2f8f5cdce84713729", - "walletKey": "0x936c052e2a7d84a537ea4d868d0025c23085d1070245c341c3eac89cc8bf0261", - "dbEncryptionKey": "c42439332a68ce404456412f9a383fcdc1762b6e9880690a3bb0225b5b6f76f1", - "installations": 2 - }, - { - "accountAddress": "0xf15ddbdf8190b65aaefdd4adbea77129a5bec35a", - "inboxId": "ebb35fb8a5a3b76eb6140eebe6814ebb532b1aff5bec36be12f5fcac2a4c1d84", - "walletKey": "0x3c724912346597e9e7b8a0f66cf174341b61516f8d5e516aa3d0d615ffc91dc7", - "dbEncryptionKey": "e0828afe4f14b50c85386366ab454a1c384e114680bb17692a703345d313d62b", - "installations": 2 - }, - { - "accountAddress": "0xe1434141af96995f207e498854a84deb35b1a169", - "inboxId": "d12d8c08061af70bb161ead41f5ab3b0fcf943432e01fda1292851f19ed4ebe0", - "walletKey": "0x9b488de52db6444d4556d74d3fa45440eb7b2ebf11fa545bd5641fe85a96fd33", - "dbEncryptionKey": "653e665eafd0f8ea5ea6f482b00e881b27dbdaece36eb10fb8a76132719c56d9", - "installations": 2 - }, - { - "accountAddress": "0x2cabfd411089e633f37eb53ab03a13f2fb2712c7", - "inboxId": "4f55e759683c59ecfdd26aa2950665094548228fd6f31454d68d754a0e7b87be", - "walletKey": "0x997a740376e97ec5573f5da0d2a1e7d7fd1a01437788224afbc7865e926b9055", - "dbEncryptionKey": "b783572825346f3f289b792568034a49fc71a677d46c712d61862cf5fb5c3e0c", - "installations": 2 - }, - { - "accountAddress": "0xefb80f595ae6fedf371134f7062fc912347124b4", - "inboxId": "078029b10b0a39670744f17a68c2fd541cd69217191175d94802b90e67cddb9f", - "walletKey": "0x36d735367f5f632943b241f0ce4a5cc4ac22e508c21bbfca741b3c051883cb56", - "dbEncryptionKey": "fa137491d633fbe0c23b784f060a379f1c659ac5aa2cd3805876593cd8b6b8ad", - "installations": 2 - }, - { - "accountAddress": "0x6d35c299e3e37f8fe7f0c3bb19b0ae2bb88088b0", - "inboxId": "9dabba32ac30a08ec3071ac00cb9d05369bc0b6fc97b29e3abe5bb19a016ce82", - "walletKey": "0x6396d28e1ca74c991da184c09141842114a2f245a6685a5df78f1d8794638d3a", - "dbEncryptionKey": "fee9f3b51e70d484c34cce6ca91a6ea6d8798605345b962b8485bd8a4d4144c8", - "installations": 2 - }, - { - "accountAddress": "0xbbd5a1f73c3e861b615171de99e8669fcd3b1af6", - "inboxId": "2c6ef09975f2b805c128b617a934269574d1368ecfc859796b2ce31dd229122a", - "walletKey": "0x4acee6703ce37d25fc1aee5f5e86d09029cd1d16f42ace8ebe6427bbd57bc8e5", - "dbEncryptionKey": "f358ef9e6f3880944220c70c4d21583d37dd9829163fa88ebc977dcd3547672f", - "installations": 2 - }, - { - "accountAddress": "0xaa3c3463e68247ca7fcd3042fa8393ffdb03b8d2", - "inboxId": "d120cbc71923d586bb824f8d916eff013fde966de3ae0e1d18a6734843f9abd0", - "walletKey": "0x1a1f2a331cff4d759284228040c7b7cb3795da536614cf396746a520530b8818", - "dbEncryptionKey": "c45bc265d2f6ca359be84dce5d8d9b7b49d0354860e1180732ddcbff3caa295f", - "installations": 2 - }, - { - "accountAddress": "0x9bf67bd24f0b8aefd5b942f8069146667d079235", - "inboxId": "1edab278020647d9d661aacfc5887548f57e47fa69df08605186acfd1be06cde", - "walletKey": "0x07a75e622a4b538aed3fba7ffe93041849c78578df83bc4e51c340d46167042c", - "dbEncryptionKey": "80b820ccd312fb97de4d6600e425604ce156ba12402f4c96b72b0033f4885748", - "installations": 2 - }, - { - "accountAddress": "0x7f938992bbf484002606b23290e57e8b0608dfd9", - "walletKey": "0x8f23ed4a1cc13b00e1a8a68ad8097b6ba9e8d0a14be513eb7d404b3ff2cd6128", - "dbEncryptionKey": "71f31846ca17a321e026d5eca40d4c68e54c7e061b8cf66292c8965929397cf8", - "inboxId": "fe95296c5bbd9acf6bea4b178791ed825b94220dfb432044cbe6cd7f60ca328e", - "installations": 2 - }, - { - "accountAddress": "0x262ec3772511a7e55b882f8cdcb7cbc64e0a84aa", - "walletKey": "0x57b9c42fee196e8136d9bc26101df8ac89944a22f31704de8b86a186450132c0", - "dbEncryptionKey": "b4e2b7393c3658873d88c7ae33c76d2d0b8de6007abfc31e767852f8169b390a", - "inboxId": "9a58882f6878fd0248306327fea23cd186177948e5029f584d43eb1425c50569", - "installations": 2 - }, - { - "accountAddress": "0x283e59c95b7dc52849f016f876d49738a729ce1c", - "walletKey": "0x571ff0dee4a0ab124ecdc770285839724bac2976a88f782868674cf7df57d140", - "dbEncryptionKey": "6ff9ff8a4d83918eefe42fffafeb5b819a26e482b31eae895d9525e87df2472b", - "inboxId": "7d0e88f151780b27a793d475dda814eba830d3ff627dc95fcf381aa217ab7d7f", - "installations": 2 - }, - { - "accountAddress": "0x54aab157132ee9128dd90908be4f482bf4f4137b", - "walletKey": "0x6231bfee0574f662fd468b5879eab9a898d3a42adef9ec9ef5107a431bbf61b9", - "dbEncryptionKey": "054baacc30d252112e6f1dbe6cb55595b04ddd3e20001e69888e2663325fb4ad", - "inboxId": "15efee8a12f534eb021bb1aad0224443d178e8941268f839fef99f0af10122e9", - "installations": 2 - }, - { - "accountAddress": "0x6973f0e9f58b617f2e3236a97ea9a497751f1861", - "walletKey": "0xde53ee4c5bcb361abc4a697b6a91e9e95fb895b97e7f221156ce30a6c39e49da", - "dbEncryptionKey": "84bfc503328782eab17d107ebbd7aa27a012972bec102267d1e4f4834b3a2fd8", - "inboxId": "0ceb418c7632bc4eeb0421b2ba9de7f04b83a3db888df8aa8e92b89a25f0da7c", - "installations": 2 - }, - { - "accountAddress": "0xbb69b09972bb37ec5d20aaa44e17bcd88016cffa", - "walletKey": "0xc246c69383da00f696845187d21fdc185914ab691867e4c28a5df12bc70b047d", - "dbEncryptionKey": "cb71ee97d799d55b36561a6677e52425178e6579211a59af8481ea6bbe9dc7cf", - "inboxId": "a6856b47a1a8d726c81bcc33b0eed4409a67d68a4277084ed3176bb256a273f4", - "installations": 2 - }, - { - "accountAddress": "0xf840516396210c856e2a15c5d97bacb7f95bffcf", - "walletKey": "0xe918567d8d6d800899ab8aef54fb254e4ea5afe210d6614dc124106ca4c5e3ac", - "dbEncryptionKey": "1c5412404eeb94a3e15858b1d8597f477aed075870d2fd59be69d60394676115", - "inboxId": "98c35bd1b101e07562cb38dd07a5211ad250dd9f7e9b5fef505511ddb9aa3569", - "installations": 2 - }, - { - "accountAddress": "0xabbf2eabc62a18d9dc46edd755d3f1ff6a0f50a1", - "walletKey": "0xdb8b4a5d434e499b22baedbe039c1a072566b711058d59646568dc7256e509e7", - "dbEncryptionKey": "9f6288542c5bc2afa7a9892712b6fcba8c7da9810e2a98515912bde4ce87c407", - "inboxId": "34ed2a995413a48e75de47f427dbd803255c31a1decf99e0d721060dc9999b42", - "installations": 2 - }, - { - "accountAddress": "0x900efdfb7cf9ff4521d21b9cb6829d664420d084", - "walletKey": "0x587f2dda2d9927e4a46cbc838156a944b1710a02eb9fa722666bbc45385667c7", - "dbEncryptionKey": "72e25994371fa44f28ebf107b2e3ebfadc397fa015975a3865d3d2e59e450aad", - "inboxId": "787269d38bccd6890c28164c5634cf1da4f90c105a1411ec51cfd20c05302361", - "installations": 2 - }, - { - "accountAddress": "0x5bcf6114cdfc3694dc35445c9dcc1256577cf002", - "walletKey": "0xa115253c19ce1930d45b311638241361364474d51a295461487d48e92a283228", - "dbEncryptionKey": "6637dd04d9fe19eca6d9c2f37e116872cb7bb6590bd9b8e70532c431374fc78e", - "inboxId": "ef567b49ffb9a893cc0931712b7584115d1425fb40ffa29bc663579e04d159f6", - "installations": 2 - }, - { - "accountAddress": "0xeac1e1772fbd20eb9acc493d78178609c9e69f28", - "walletKey": "0xa691e41a15e1085d6897a0c51e713fe3c0c231fc15301155174d758d331f1730", - "dbEncryptionKey": "021dffc4e546a728f93af377bd780b0360f43f9f441906ca2178bc20eb56ccc7", - "inboxId": "08c7cd27c78616b88af95bf86a7ac8f502e7d95ddb89d8b43ec34359a4321db0", - "installations": 2 - }, - { - "accountAddress": "0x1d154bec9b734b7b184ef54e52cfed1443d77ecb", - "walletKey": "0xed75df442a03b32f686005b578617450019ee123785e39b886c9c244bb9f9f29", - "dbEncryptionKey": "5de2d4c39e89157b16d874062aa94a5747c2a282f9b817e7702a3c822dfb6b5e", - "inboxId": "47fe6ac76b0cc5325d02ede000d2caf28c94519ba799ffe441e6df72772bf024", - "installations": 2 - }, - { - "accountAddress": "0x1b7448f43ec9c600ce158bbfeabef71d47c6cf98", - "walletKey": "0x1b214564f0c1cb54cdefa2a2098e692b0b007e41a055ae0abbdfaf8cf97dc0e8", - "dbEncryptionKey": "a76e6956c11e8ef0d8521b9e569892e5a3a3f18cbedb5d4dd28613e8494bade2", - "inboxId": "a3a30f160b6bb1481affc3852a15110975cb5da07f165c2c97b9966877f62004", - "installations": 2 - }, - { - "accountAddress": "0xb45f7eb6085f79719beeb4769be0acdf3805d777", - "walletKey": "0xce1a8e584c3608f13b4839f3e12ac46cf76b94998ac0ec05ab85e59e1eeaafad", - "dbEncryptionKey": "492c6f34ac5bd407a37653e7a501a2b9f71c54ec28b792bfdbe71a7a0ba56983", - "inboxId": "19296c8ed5b425fe4448a3fdac6487040e657ee3191a3099b49765cfb87e7284", - "installations": 2 - }, - { - "accountAddress": "0x77836ec28651dd1a5ba42836670c82dbf808fcee", - "walletKey": "0x7265e50968d61df0aaf1d36db9873c580e5ace313c274fa8421bb2d06d326af4", - "dbEncryptionKey": "da744bd777a031b7169dd668fb5513c08f66edf53118aa08c319400017e84e0f", - "inboxId": "4eca9a45b23aefeac7796a30ab4552d017e65cfbff0b06341c2f061219371a59", - "installations": 2 - }, - { - "accountAddress": "0xa414b31c08bcd2f245b1041e7504e21b8ca2e218", - "walletKey": "0x5aad527fd60e5149cc0b46db7502d01f0c7ba88fa46fe6989cf55edb05bda385", - "dbEncryptionKey": "31a5f5aa18893129744054281c00a0845fd66ecdc1c498e6dcaef0559b778688", - "inboxId": "7305438ba1986e019d77a70ed314d35efa6fc6def742327793c3b41a204b17fb", - "installations": 2 - }, - { - "accountAddress": "0xbf9b146ab9014606577152735a54957c6d7d1bba", - "walletKey": "0x51a62bcd90c5f41350b57048ab894b02efa4dbe466583f619c961a6002a865c8", - "dbEncryptionKey": "6ac784d09360beb44a9ed70b450b01991c8f267ae463a4f502d048436158a794", - "inboxId": "9c508b2f224785014b44f5c846182e6f9d8b592b900d5b6dfc56e4cfbb33a615", - "installations": 2 - }, - { - "accountAddress": "0x4e479fd8a3193c65057a5527d5d8fcf1fa92722d", - "walletKey": "0x0b24cd58055445d3984057ff214da4bcc188999146184df56c0757a0857844b7", - "dbEncryptionKey": "1e9cb0f4f7cd9a8edafa8ae9f9e94efc78cdd9df0ce217de276e739c3f81ac0a", - "inboxId": "7d77a6307688ea5ad9024420d4473981b28564d54c805dff784cf3ab8a2882b2", - "installations": 2 - }, - { - "accountAddress": "0x0a94f02ae656bbde3eb775a4c19dc764c1d65dd7", - "walletKey": "0x9624887dbaaface96861d51955f24fbe66b5da9642eb500ba7542af2f91dd935", - "dbEncryptionKey": "3952e714bb9837a4358da314913ee72dee63ec3954eeede9d59afcc545823d24", - "inboxId": "927ed44a86f58b405a94629ee907ef43212907144602d35f6e0f303881c36ce0", - "installations": 2 - }, - { - "accountAddress": "0x46868146b0792a991b089f7098e241e0e02c21c1", - "walletKey": "0x7a87a3380eb0c59cd483da8cf21ea74c71f5f82b8602ed5213e926e4d42da251", - "dbEncryptionKey": "7aa9d4861834362d0f4bca10a81b5fb10182f14dcb087ad67c5bf85b2533d4b4", - "inboxId": "006004d04fe07c9f69c5e0a81860505acbe96d8a67273fea6ecac53b8b876f64", - "installations": 2 - }, - { - "accountAddress": "0xf3997a36a92180a04ecebce7c19e0ca972b49290", - "walletKey": "0xefc9c24a4b99ab96d3a327f2deda62f1afa5089fff32345802e750f6675a3df1", - "dbEncryptionKey": "f786a5f9c87f92259f5f18a971949e98a42768178d3e077e1cfd948e57b26ee8", - "inboxId": "b5a5256eb6549e80f0c32c0afbc20ca3efe5e0398e98e47dd0c53fc761f862b1", - "installations": 2 - }, - { - "accountAddress": "0x02ca7f897bdbc9ab2897013eafb802ed55e173ea", - "walletKey": "0xa707133e4ee116abf420450f25fd1aee25af5596a022ca04623ec2d78f390966", - "dbEncryptionKey": "cc96ad4b91efc4ab11f719343f112ac1770dab6d3d01fbad7e96a5359c3ffc96", - "inboxId": "d5e5b51e3d384a0bb6e1140960e0bd2ee05ba71ef395f27e49c6f35bb0e45955", - "installations": 2 - }, - { - "accountAddress": "0xa6eb00107a0161a306414dd973dc451d32b4c8c4", - "walletKey": "0xf2fb02c94a28cb234d2888544503ccf342f20501b43df98b9a3f689ac8ad92af", - "dbEncryptionKey": "d3c54483030749550a272f857025d0a0e460e1a75befc8421c5479bd511870fb", - "inboxId": "c3bdde396682f04d4ae2be821d698b5d0b5370dbd09c396170e5ab0ed3ca26cd", - "installations": 2 - }, - { - "accountAddress": "0x6a08a3423377bd7da6741e421502e57cec29a7ec", - "walletKey": "0x9766a23b8451ab350251a5910753ae4632485008c89e986c21bd8ce45778c475", - "dbEncryptionKey": "2d5397317180d256ed8d87e6e685684742d7ab6072501436b506cd88594e73f5", - "inboxId": "3af6c02367dd66920542b0bfd181a7141768dae23810f72f1b85b3a698b2f3e6", - "installations": 2 - }, - { - "accountAddress": "0xebc63ea74ef1c6f1d0cb08db49c45280e327c135", - "walletKey": "0xb7a2f8cd5236334f9c59f0cfc100c90a556ec3833c3e671f6eab33471c763243", - "dbEncryptionKey": "a80a799ba66101064d666a3466d80e4c44809f116250141ad7ff58354b2c736a", - "inboxId": "121c3ece42b8fcd8d70ceef876842e2d7aa78ec8fcfa70e77c2e9a56e799ed89", - "installations": 2 - }, - { - "accountAddress": "0xdbc5c2037c6ccd889c1c72879388e93482404091", - "walletKey": "0x9e4c0e6529b27aebee1cb863bfa9eac433295c716f584b6c4684cc001c57dcce", - "dbEncryptionKey": "fc3ea3ef2601326e7112a2ee65d42ad78af625755b8ca9356661e03877608303", - "inboxId": "bb2b67f36c548358957a4183647bbc22f34fd98b0be5f817978e3f832301a20b", - "installations": 2 - }, - { - "accountAddress": "0xdc46d6f123b222c2bea5315e3a31072108f33f96", - "walletKey": "0x4fb2bf653cc62cc753ae8279a1485d5199bdaeb77005759b0e5419ea3cfe8450", - "dbEncryptionKey": "ae40b0d8f5e68558bdaa6ac2152edcc584d963547433dbe18aaf444b09891720", - "inboxId": "cd5f586f214fa5a40da0e7ff3e6539cd93eea183b36a5b7568db8b796b8d6ba1", - "installations": 2 - }, - { - "accountAddress": "0xc36364a3199878f9333ff2704007ea771f5828a8", - "walletKey": "0x75a7df8cd6e60f2f257f3626115562688f3dfb7cc83e8fdfa21f7473d6a5bac4", - "dbEncryptionKey": "012c595899d4373ad8de3caae1e67e75407bc0c0a75752f5a665d99113d50cf4", - "inboxId": "a6db5401bb81fd533182be052a191862288f2be70a88e79a269a38900b90aaf9", - "installations": 2 - }, - { - "accountAddress": "0xf9f27092e2ae2ed021fc1dedc600404aa4d92060", - "walletKey": "0xed5fd89aeaf53b8cc99885a06670014e802fb37626c86dab41fac64c2d4df70d", - "dbEncryptionKey": "3b5d1463ee3e74c6368ceba2b11a3f5281943317328379d1daffcad5d9c8c209", - "inboxId": "784c689e427f96efe9b249e83e92c72b8e1a9743acc266ec34d5320139ddd888", - "installations": 2 - }, - { - "accountAddress": "0xd2732c2d8c1f8af413c865186d7ca6ac1aba318a", - "walletKey": "0xce983d1d780f57269c11238223d39acc5de481a709ea586149613569d801102c", - "dbEncryptionKey": "ecc413782704977e0f80528f96eacc2dd19706208470f4f5b6b122cccad11b3e", - "inboxId": "9401f67c0176e64210fd02454cf4763b81b92c12dcaf493b129111d4451b5825", - "installations": 2 - }, - { - "accountAddress": "0x3ba655956a982650bfc7a47d415cb361da32c7a9", - "walletKey": "0xda540c3199cac1682c3c168d604515662fd20e0a5e59d57fb0d71d527aaa09a1", - "dbEncryptionKey": "115125db2d7f48061bd75839b5ba2232fea8343130f9326418ca0123dd236faa", - "inboxId": "1993a4ff30528b36e917508c0a685c0ca272ece2d17c03487a6c63a49b1f6c07", - "installations": 2 - }, - { - "accountAddress": "0x0225b9b2037b16b860cb8c697c2734526f5ef567", - "walletKey": "0x94dabd6e41039de75e497d6560624e466196d5112e6e79f2d4f92f679cf17c18", - "dbEncryptionKey": "6d2933e255544b434e92d874c462697d5aae8536fd6615ae6ae3c41541e6431f", - "inboxId": "986e72939bca755f2cd45fbdc3dc222830b743841d94e4df26376cc0d188b823", - "installations": 2 - }, - { - "accountAddress": "0xc03154db0d50e2904a383a664e20eac9f25a0da4", - "walletKey": "0xc31eaca52ba117091d254db1a12ef7868717974602ba297e4f9cfc0045e5bcf3", - "dbEncryptionKey": "66d8172ed055d48fd928ea494f63b238fe9e42a078eef6a7de6c4e90a5e1c1a3", - "inboxId": "2a0317e07f5c0e1ed87f2d20429dda974595670fa63be56f797875de78e63c3d", - "installations": 2 - }, - { - "accountAddress": "0xbc3a0f6c1edf0c6cfdf3280f109191b4ed5a2834", - "walletKey": "0x6c54c282a4ed4743db8a1e1df0ab646dc18a4d2168c010250545db8de55f2875", - "dbEncryptionKey": "e600e7480cd3b1ce30a4d972ed99cc8efc32c2c44be13d45eb132f64d7138a44", - "inboxId": "5a55f23d76ed2367a115b5944f8457fe54ec654987ba06596d42b013a0d499a6", - "installations": 2 - }, - { - "accountAddress": "0x932266e47caeb81e11d9c073d15dfff4f1f93869", - "walletKey": "0xfabea9ebf29889c155b3c6f7d56da4778f5df39c51a853327171a9d60e632cd1", - "dbEncryptionKey": "bc2496b6f8c7feea5a335a16ebd79ad15b15c1b5243d095a116028bec280482e", - "inboxId": "3ee743b56ac8a80e31bf5730ff32d4e3669261075ad3f10c1600275cd971adb8", - "installations": 2 - }, - { - "accountAddress": "0x776d925d4d37643e0ec7e55d957f50f9644aff0f", - "walletKey": "0xe1d279c06cbaf553df0645cb48e248792460162a5de9254d587458ef9e888ef8", - "dbEncryptionKey": "fc9d7741733c4fff9e1fe52ba0e2082134919572da6c76854d2d36dc2d775c6c", - "inboxId": "18ee627ae30463255dfa5d9e99176fd946e26aa6470b433067978e9ed2e694e8", - "installations": 2 - }, - { - "accountAddress": "0xad51cc579c561bece6627b2f266b98b0a59a984d", - "walletKey": "0x10a0dd08dfde08da267d25d50bebceec1b25e1b17fc25e003dac50fd312a11ca", - "dbEncryptionKey": "1131ba9fbef55ea38a0df35c1cb92442a0336eacfe1bcf323d222276bbe3ac8f", - "inboxId": "3580c965850f88dacb0105556e488bfd4556c2d9862c74d04f15e2d9be615e8f", - "installations": 2 - }, - { - "accountAddress": "0xe76d4191e7e224c37e403bb9469055ff6bca067c", - "walletKey": "0xfcaaa07d2afe4d1e424b2eb42604df027b025efb5559aadf6ecf11145ed6108a", - "dbEncryptionKey": "b2c5cdeafd534619c03dba291a06f16b571e9fd6068c21126abe0f54c12f95ee", - "inboxId": "3c72064f3a32f595c671fba499d74629909ed938aceb431d1ffc13afe144281f", - "installations": 2 - }, - { - "accountAddress": "0x6097b8920fbb52e9cb8026b61b298c9a39ce9843", - "walletKey": "0xc3aaa75dc909438eeeb5b86ee9fccbe4f77c6112c0dc3b7f406ff3f5cd803595", - "dbEncryptionKey": "00a9cd3099b4c12ccd69592c813237039a21fec4b063480c39c14c393fffea92", - "inboxId": "fcb43c062d5071eec43310557e0d82a621814810b8294477b254ad23cc696de1", - "installations": 2 - }, - { - "accountAddress": "0x646a58c36692cab90ae928a3ed1eb4542ca31bee", - "walletKey": "0xa274c8e2b342d3c556fad6c22da56e84f1be27fdb5a9b43b652d3bf5ca5e7587", - "dbEncryptionKey": "f9d61be4194cfd97b7eb013c8dfe79d2d5acfa97ce240003bf9b7abec25ec59f", - "inboxId": "4f490d4ee1f5a708894593988e725da38416dfa9688119be00ba7af3ea1dc3c5", - "installations": 2 - }, - { - "accountAddress": "0xfeb83783acf45367975c2f88b06b7adf4cefdd31", - "walletKey": "0xf38e313d7003752cdb6c5fa12642db22a003be73d6afd8633033871827876aff", - "dbEncryptionKey": "1d60ff51c24ec714b496ab032be819db1dfd7ca6fb3d167527dd517f75b09f1c", - "inboxId": "555ebdd05ed88e8fed4cd8e85ecad13ab7f2a6d9c8a78929e9f602be31f7e950", - "installations": 2 - }, - { - "accountAddress": "0x13e4689338442338b896891af9a1b1ccff8a30a7", - "walletKey": "0xc73d2a307c5b19e713dd504f07f54d2e59a1d0aeb202ec5e2589357594a2693d", - "dbEncryptionKey": "74742f63433a89439ce35dd1e76c12fac9b358f080d65ecede88685bd2734341", - "inboxId": "663c13068582053387a7e3730e915919c348c7495e14ee82a572bc82e70c1703", - "installations": 2 - }, - { - "accountAddress": "0x38698f7a43d5b762d8d930009271f9f62b3a0dac", - "walletKey": "0x499631fa49d59a51336a81beb53829b4b5258c007174bf773410a3b9b8200047", - "dbEncryptionKey": "6f3b92dbf3b5f7f278f3d30f1e2b30025474b190b5146f692bb81169f497d60c", - "inboxId": "da26cffb01471cdc38de7bced9f596fa692a9e9e728dd640f222eb1c9bade909", - "installations": 2 - }, - { - "accountAddress": "0xe5692355b0c174e7f384628dd6d1c71e6a175065", - "walletKey": "0xd23780f4db10b08ddd9fea900006acb73659e7cb3996f1dacfbbdb49c462c30a", - "dbEncryptionKey": "afeabc0ce03f32e32593b95012e966c39788a567c91df144b368a5296c9ab601", - "inboxId": "91c96243beadfb360826b72f27942599830beafa1e919add5bbae68be80cc8ae", - "installations": 2 - }, - { - "accountAddress": "0xa4e1751694e235aa5acc09a18777d826aa0f8122", - "walletKey": "0xa540626753c05cfdf0335c89de3bf90a91dbed79e2e4b834e1cc8d7374722e19", - "dbEncryptionKey": "804fa319f5f12a0d51659b6c12225c005a44794e8d54ec0c4545b64230c38e3d", - "inboxId": "b9a1c55100507c231dd06699ea5daf7ab92bfc98b2f1a71bddd194c2b8f94208", - "installations": 2 - }, - { - "accountAddress": "0x0e6a1f819debc6bbb441d1b31033b26ee45a45fb", - "walletKey": "0x6906fb819f99080085e1053e184d9a3b1f89f11a8b0cf8d38ae1d9ce344333e9", - "dbEncryptionKey": "dceba52a01ff8ba969b52e4067408e1e1ca1319dabaa087527ccd95de93373ab", - "inboxId": "125df7d90373691ad869a261dbe24d2b3de2af04843fd461ace8d2fc10e9df8a", - "installations": 2 - }, - { - "accountAddress": "0x0a9b5d9afcfd547ff66fd3bb77b1c49e46e07318", - "walletKey": "0xc86287ddb8e44215a63e71b769b7e0733ac1be6cf2b6d1833a42e2d65896ca52", - "dbEncryptionKey": "ab88f14b4967892e3053626cd97fd18bebb4f8bc2038c795c1578c63220b6a71", - "inboxId": "4cb07afee33c9a31370900e9490def25541466e54c5128d9124af46c9c271140", - "installations": 2 - }, - { - "accountAddress": "0xddc1e8db04cf6b6c760e96ae09b5210c400a9550", - "walletKey": "0x3daed0f041db747682b2d522c9e6a4a691ca5eeeb70119912d1ec520c14c9bfa", - "dbEncryptionKey": "eea39e106a484e8f68755ddcbe4eabae9814dad099613afca161b7b282dd6b91", - "inboxId": "bdb349ef8fb67839dda70ee396aee6dd987f4764e2aecbeec4f9c0bcde021ae7", - "installations": 2 - }, - { - "accountAddress": "0x19e4e0517ef8e8edf9956f762c871fcf90efea36", - "walletKey": "0x2d940730a27d973187e74912835523acb70a68fc269225da8460bfaeb31767a1", - "dbEncryptionKey": "4b71e7364823ef691e2abcae52f974ee0170644bbd7a38e042efaaa88c63ab5b", - "inboxId": "86d2b074681fa5deaaa084d84f09b35e0ec6ff009d5283c3620ec333fad508df", - "installations": 2 - }, - { - "accountAddress": "0x4f50ed7e03b42398d219e1688d9ba92a9118ec49", - "walletKey": "0x4958c0edc9dcba80d9912ec8c5f1ff66e876195f54b7c3f31f413199c306ff88", - "dbEncryptionKey": "8e31c6921e0c299eeeb5241e615c37643a9ea327f71e62937f0b4463ef6075e7", - "inboxId": "efb3c94ff47ad652c9068db56be9a72863fac1eed7c54fc18431baf7fab3ff5a", - "installations": 2 - }, - { - "accountAddress": "0x622aba51eab24bb480480a7c84e3558c3ace17a0", - "walletKey": "0x13ea9213ed44682cf06b50f4c82c8039ea0377fb39eef29e78dc38569fbd64af", - "dbEncryptionKey": "b72e10de29b66443d579673a792d053b25188fdcb25d8b034e7ebab3c3d53145", - "inboxId": "b395e13a974b1cac8e7572ba12010d0972acdcdefb80e6a19d7a0ef38d0ed43a", - "installations": 2 - }, - { - "accountAddress": "0xa6b381b85d029e98a23ab40df5f0e7f3198008cf", - "walletKey": "0x3f65ff902931644c1eb707ab317facbb36f514bd3b293aa0bd8c4b5834b1eff5", - "dbEncryptionKey": "9e1fe0bac7e1828294a137816334ef09aa635b5927b590df4568191a21da70f8", - "inboxId": "569688d2dcc728413e3cb38cbda1d708d7dda191df1f8e05413cd5018b8a3543", - "installations": 2 - }, - { - "accountAddress": "0x428d0942524abaf9467645b6eab8f893e1922327", - "walletKey": "0x99c3d261d1c3b3819b89675ee72b5ca2150d704d8de9ded60963c955f354e28d", - "dbEncryptionKey": "f006d47b7819a6d6fccea2b53dff22387d6f36ee08d59f9b9168b9f035a3a2a3", - "inboxId": "6422a14f3afc89549c4a743f64a0420a259cf6cb9780cb85bd1dd5954ebe5313", - "installations": 2 - }, - { - "accountAddress": "0x8fbdd1eeef3cf4e8480e19d73c649871c6f05348", - "walletKey": "0xdcdaf4949ec9f29885ee722e9035f3c454cd32aa28f564bb96a167a1138e3c4b", - "dbEncryptionKey": "37f87922292c213b8ff525a052fd7eaa2fa2fd60f4565d4db9b548ba348d9d2f", - "inboxId": "bc86b075a511368806bd67a65f68e471e3d4acd815df83034d59bf8afe5545b6", - "installations": 2 - }, - { - "accountAddress": "0xced7e627967ea6ac5c7a3bb231c49161173394df", - "walletKey": "0x77ee6742ba613c911d230753b4f8f79d0111b27da5a14195b4b5cb92f340ba28", - "dbEncryptionKey": "71d150042deae2c89b7752361a2ad93377f085e8f0f217d8fcd1ad6cefc97f3d", - "inboxId": "acaef266e87744f882da013aff827e32defc66d9fd2af723b51f143c563d9e34", - "installations": 2 - }, - { - "accountAddress": "0x989560266c92f9eab4ef303b53f2d0e5e7efb89b", - "walletKey": "0xd4c98d0b81c1639681e5a903ea7cc91d4747ff123e1ce7a35fe404c4584a11bf", - "dbEncryptionKey": "f34d2d0b1987ca577935d9c3b49d3f0fe524062271a9cae2630f9a83a7936a69", - "inboxId": "ea39aa86e8db053faf0ec13abe3097d7ee125f69aacbb472f8143d865300337a", - "installations": 2 - }, - { - "accountAddress": "0xdee22b49bc9ebde0e92c58ba9e88a14b70d6e4e1", - "walletKey": "0xe5223fc0f05c8f507d2473400159c43d83e2c6b5ac21cbf70197c322cfe9e181", - "dbEncryptionKey": "ed8279f43f01a4dc03f168b677363346a8b6cc115b28586ed27b8a24cee8ddfa", - "inboxId": "5ae7e8e21d4e2f9c1701f25be1bc518c8308c461d0eab80aea795871cd3879b7", - "installations": 2 - }, - { - "accountAddress": "0x1b12b6621323986670a6b75db5a970bc45d902ec", - "walletKey": "0xa0d91002412704cde5f5e40d13038a7e7e7b93c1bc525308a910249ea1688bad", - "dbEncryptionKey": "47ec6b8377f5d0f729eac88d00297c4b9cee2e123f7203311f85c7d8227174f9", - "inboxId": "52bad360b65753060c9b6179653cf7b33065b6d0ae608df0f66839e06fd7db97", - "installations": 2 - }, - { - "accountAddress": "0x8d5eabef107fef706725308d79c68e131e15f8f1", - "walletKey": "0x590cbec748df224b08a8eceffbadb0afdb9904d9026a45846edc90114868c732", - "dbEncryptionKey": "f571360ed82972336b41cb59e1dcb7e7805494752b5feda3c21929a162f333c0", - "inboxId": "81b5e47443dbca2896794ddcb13030c71a7a66704c09d7fa61c64bb2ae4bec82", - "installations": 2 - }, - { - "accountAddress": "0xff48e377253c651d973652e99a23e48f977844be", - "walletKey": "0xae7e49f093e3c1779e0bc07de730b0835a810c2cde83b3644f01cca2f721d04c", - "dbEncryptionKey": "3e51401aa455191fe2ae89a0f40d37afbff5ec7a47ec092222a93f3b13b45491", - "inboxId": "49ee759fda83d00664d4a16e279dd9ace303dce89bf0765e7ab86947978f2a9a", - "installations": 2 - }, - { - "accountAddress": "0xfcaa7a2d16f913eaf7f2c6dd4d4ff42b7cf3d76f", - "walletKey": "0x0f93decafb3b9c6b7667173df1e8d6b5abe8f25455eb992126fe027d99aa49ef", - "dbEncryptionKey": "90c3c435074a3c7e34effa5627e8d696ff685dac0c7751ccb2f8df27c8ec3d47", - "inboxId": "02fa1e24933d8d1a0e562f1d2ba969e01b0634c6e1c5d447d84cf19fe05d1606", - "installations": 2 - }, - { - "accountAddress": "0x8aca2d7b80a02c2647fd4a8591063fe4e57d1cb1", - "walletKey": "0xe47d5a73de7fd87c5bbd84acec652b245f4640b02fff3db800ab3018a1285d17", - "dbEncryptionKey": "e7be1ccb4488647e945c1d5e0b4cccda345a1dce83cff33ca8a4a6df3032f24e", - "inboxId": "2afcaa14d7110ce1cab5414056f6ede3c08b52dfecd13b9e2083e930cdd23b3f", - "installations": 2 - }, - { - "accountAddress": "0xf679c352df0d08d2853606e9ce6775073abd000b", - "walletKey": "0x10a4fd0a5fa03909d02a369635f4bc6cf7b643f2eae75f784968ff4067ba56a6", - "dbEncryptionKey": "d7007fbe3c95ca57bdd7cc48de5e5510da65752a9a8021ff273fcfe2007a9568", - "inboxId": "3bdcd71172d1e70f734e5b8317e0c00c83ed1b160db9ad8eb77ba9b8644874f8", - "installations": 2 - }, - { - "accountAddress": "0x325b0d9d4080c26848fe8d90ca2177f89cb21130", - "walletKey": "0xf0d0f539032a2ddcbe3d8b2bd60c7abe0f7ffb97e8cc453437d4269f83a5123a", - "dbEncryptionKey": "6a4fa230850268f98c4a14e62b17e6797064ce9632e8d51afbed99cc8adb37a2", - "inboxId": "0055b380be1c24bfa3184db5fa06834e5c5d4681dc0bc25f859307326b73f12c", - "installations": 2 - }, - { - "accountAddress": "0xbf6c4526e29b383f50fea177befe2ca3a4a7ded8", - "walletKey": "0xb89fc6f713c43442c79bbe0d8d0a137f456f6b14bdfe4f8220cf83883f175230", - "dbEncryptionKey": "e7f93e769da6cf6050b3fb5ceab57b1062e805f7ead889fd0489d824552d4d63", - "inboxId": "96724ac1dad0fcf9565f8a61358911b72528cba2a9f6ec31be082034c6fa7a83", - "installations": 2 - }, - { - "accountAddress": "0x7bc50357d2eeeadd4c7ee37bcd85029a99713e6b", - "walletKey": "0xcc9b1bfcffeedf745104aa6f40b30254b6c9f2027df05860fc007863e1d8c380", - "dbEncryptionKey": "21de678814fabeec5c9e79ca9d96419612df25cd5432f3d109526ec48a1da233", - "inboxId": "fb3178649fc459f3e9c6d01360632fe30247c923e60cf5fcc929f2698c0522d0", - "installations": 2 - }, - { - "accountAddress": "0x41c472c809e5ab6ea584134865b3e89e6de100d6", - "walletKey": "0xda0119677fb1de720271d1d4a0f016228758c90513ecee50e840343fd421ed01", - "dbEncryptionKey": "36a62516828b68313b70afebbf3744fd6a2eb54705249668eff8bad1ec3f57cf", - "inboxId": "b8151eead3601f53f33c1efda72e27c334539125484fdbaacc040a25831da91b", - "installations": 2 - }, - { - "accountAddress": "0xf1b0de77a5908eab8dd3ab11b09add3914c5b5e3", - "walletKey": "0x4c603f469ee048706fd9c80ac225610ebc03a8f23d7031df33d8c3a371a4fbbd", - "dbEncryptionKey": "38ecca7049742fccf0c10bf0c1684da1b712008ff043079d3ad81268dc41631f", - "inboxId": "4f0b9cfa71905e0f15286c10554e0f702258a4c4c11e49fab9742065d24547fc", - "installations": 2 - }, - { - "accountAddress": "0x252c464e14f747d97cd00926fcf73eed51d5a4a1", - "walletKey": "0x2f470eee4a7f47bdfd322a46d9ecf1acaab74988e456978c03f5a9602b66644a", - "dbEncryptionKey": "a534f3d5d2595c5c9463bdc081e2174b4c852f0e850e1e2589b6bdfaa841c73d", - "inboxId": "38ea62780997ca6f957a9b80fc2e743616bf99e22491f7e967a174ccaed14110", - "installations": 2 - }, - { - "accountAddress": "0x03eb2c5443ea1d18ba4d4ad6fd14aa5f436861bf", - "walletKey": "0x915c3bded5728a203a393888a55b3f0f33115b7c961c990eb11ef6a72545e8af", - "dbEncryptionKey": "1eff9ab317f4aed0d49caa9d499886a6af2190e8acac4f51d08789c25199ab65", - "inboxId": "d9a03833d897cd9ea03e942cbb8ec81e80a181a2f75112cc811fce5054c88098", - "installations": 2 - }, - { - "accountAddress": "0xc9bcde1019050698b526141a75861c688f6233bf", - "walletKey": "0xbdfaa01343ae3fee7e84cd29b0683d340cd64575a79eef351d19d717311a9d06", - "dbEncryptionKey": "37ddc60f34fa7fbb93f9a836467fb81dcc3b6e45bce28c3c2fffc8fba1b6a089", - "inboxId": "bca2f447f0a98e2a5745b68916050824c7a6269993e4fd4a3c56f5509bbe0f01", - "installations": 2 - }, - { - "accountAddress": "0xc0fa7cfdfaaaf2fe5df0e7ca12b2195eabeae118", - "walletKey": "0xae29b74f59196e295992fec553471ede84beaf1d9e0d3f1aa44ca15c3a70a2a6", - "dbEncryptionKey": "3dc9f5b1a08e32ac92284aca89ae1890cc5c80d60ca497588606cdb25e25d2b4", - "inboxId": "8ad12f3352e93954d68d1cd41fc5e44d20a5468280129bcb1cb0b14e21f570e1", - "installations": 2 - }, - { - "accountAddress": "0xdf4624e54234a4fbdec99fab6d4f2adcecd66c67", - "walletKey": "0xaca7eaeedc4e89112b8ba29d18dcd20309a81d791f4d2f98b044f84b5514e8ac", - "dbEncryptionKey": "a83bbf06fc6f549d2e4244a685fbdb73ed2952bca4cef4312889121b4d8b6db1", - "inboxId": "073a8b07aae90c1e843849fe02a2800059a8c890ac04b5cb5a2cfd8d05fd465f", - "installations": 2 - }, - { - "accountAddress": "0x7c6ee377422739aca7d2be1f12f6e608de9294fc", - "walletKey": "0x2cca6709d45d61c5817d515ede2eb990fbdc8275a1160e4333093e95362e825a", - "dbEncryptionKey": "ae3db2c311f16ce44cc18456b7ebdbaa7349b0031ad64c3340f21fe33fa7cb67", - "inboxId": "5e36c8bfc7fe69b31552c8cb9ac03ef5fe51cf356ffb7840062f3f22d0a44643", - "installations": 2 - }, - { - "accountAddress": "0x48a0c48f61ac70cc67d22f6ceee985c5bfd64a0d", - "walletKey": "0x0a0b02f56191294fdf63f8b5936b50f9703c46ea89119a7e1f1d660954466dfa", - "dbEncryptionKey": "c2eccb947f3473fec3e4650887f1d61a1a60e26160006bee62d791820f271791", - "inboxId": "1013b66971310ce3546737a7e326a10067ef478a5ac0a32d3035a832bf384662", - "installations": 2 - }, - { - "accountAddress": "0xbc02bcf002339317efb06dde6dd627b2bb193c36", - "walletKey": "0x097c7e0648caa370486f1dbc8f6525dbf8aa0de6bbacd038f662419e8f490751", - "dbEncryptionKey": "20ab80da61e2fd9f11e2aca763cc5f0b210825e162624f36877ecc25f77eb6d3", - "inboxId": "65936aa21d7a57eb2dc6cff0669d88ddff2aa66a3e7be84b208d574dd3b6986d", - "installations": 2 - }, - { - "accountAddress": "0xec0c799acc8a9571e9d1a6d8ee57010c90570749", - "walletKey": "0x7dd9c081275f6f7bb92dd770439ed09a2ea14e619e66fdf0ebce15e37157b329", - "dbEncryptionKey": "9d5964078a6c33fc6eebc2b21145f444f2fca6dcf92016f1e8f8a6f1d10cded7", - "inboxId": "6858b368c22f7a2c46d574495218705a8ec161243f62455936404fa4cd8b1942", - "installations": 2 - }, - { - "accountAddress": "0xf93b9f37e1210ef53a0e8b5169b3e96cc61d5c74", - "walletKey": "0xad332fe741f439b25cc5ce5c0cf8b7889a21d82f750ad52c4ddcbde87e20a586", - "dbEncryptionKey": "2ec0b2190753973c784a95b8ecff20aa3b1597275d480885b2fe2809fea4fe76", - "inboxId": "6d441cad176cb18554cb43b978da85b6509042c302660cad775b6065f2d14419", - "installations": 2 - }, - { - "accountAddress": "0xade8251873803557443adba6b50e02275974175a", - "walletKey": "0xb400d7491a8454fbcada8656705cbfe55b550c0a35311b6d9572669f24a44d79", - "dbEncryptionKey": "0f6bb883c345f292a15921b6e8edf504ed164645f791e6efbb0207cd8fa2d8f9", - "inboxId": "9d16eb40ffb62a2dc8a34fa7e0c7e1653ce6fcc42a37ebb490328fe512365533", - "installations": 2 - }, - { - "accountAddress": "0x280275cd3ff9d6ca27abe003b09e7c90e992956d", - "walletKey": "0xad1fed5f28a2d60fad5ecfb9f501890884ede68f6ab08d5f73ee019ffc3602ac", - "dbEncryptionKey": "6c0292fd898d68d0cdd5982214d8a9f6b09a39964df90107cf76e2a625af9539", - "inboxId": "38ba136b08d335882837eaaaf72db3e9d2d19bb969cf1bfef9bed91a90ec127c", - "installations": 2 - }, - { - "accountAddress": "0xd4d2960a5c80e883cd7bed74e004a06b6ed5d99b", - "walletKey": "0x4371054add1d44b324cfc32bdad6e19e70e5650ce5cb0a8e1a86cdda6ddb4b5f", - "dbEncryptionKey": "05efad24f8133df5df6540ecec7f434e46efad978430ab5f16f6c4a500117a54", - "inboxId": "a954ac7bd9d86b081dc73f4c5e5d7476c7ba5a562a658cc263fd8c4b1615a8e1", - "installations": 2 - }, - { - "accountAddress": "0x473924cf3035714792be1af159265ea270ccb7a1", - "walletKey": "0x69707d01cbf0be8613833a3b4fbae117d45af3263b0aa54deb71eb711308afd0", - "dbEncryptionKey": "fbdb9d9897a4898a3cafb5fadd86290653643dd1ec68ba725e34289aabf08bea", - "inboxId": "ba4f15bba5126d441f8d37f39108ef5e364f85147f67e4809ae5cdb09265445f", - "installations": 2 - }, - { - "accountAddress": "0x6fe848afba950fce31a59757bfd4871dcb6d9a30", - "walletKey": "0xcf56bf86e5d42aa136337cbcc9c9f95c1c19f81cc59954fb824fe9605b04e666", - "dbEncryptionKey": "4b2404fc5b629a110d3f28baea6267c388a13742dd9ab559cdc4026686a1915e", - "inboxId": "8c20b945a12e63468756b98b7b46a18e024dac43f6aeb463d6136d78c525d4ea", - "installations": 2 - }, - { - "accountAddress": "0x16b9108288b3889934aea1421e9f55bf90c91f48", - "walletKey": "0x4b83b29b36e251c606b366588d00e29d33b6bb3d016fca812a5529cf66a40ab6", - "dbEncryptionKey": "9f123900b33e5d40251273008a2e9aea832e53cb6c2dfe5242f1758bec8844e0", - "inboxId": "d6fe39ef54011d7df3cd2773ef3f5aafc416618fe5983eb2d6b2cf71b21822ab", - "installations": 2 - }, - { - "accountAddress": "0x6dacf3a68345df4242423f2ee69c37d1007cb833", - "walletKey": "0xe7d8390280f2a88385ae8952c2e3b7834c71d0b2f6d82d5c3a0147cdd79613d7", - "dbEncryptionKey": "f7da611829ed876ed7d15864e3b042c2e091efe237e20d34c4a0b095daaff555", - "inboxId": "875d194d73bb763413dbf7cd238f3ca71f34a0e90c4a1b3957ec252fc03f8d88", - "installations": 2 - }, - { - "accountAddress": "0xc8246c69bcc3a8a09a29d1bd53cb8d38b273be5b", - "walletKey": "0x7e7e7a624c579c0c014fe49f403dc0cb61a035b52cba4bc83c76bb8781f4a491", - "dbEncryptionKey": "8fe9af7d8b9e16717aa9afa3879f7cf0ac47daa760f100783cd0afa6e4230ce4", - "inboxId": "3abfcd978793e6d70a39c505c093b6cac135b68d5670476b178415cca408c296", - "installations": 2 - }, - { - "accountAddress": "0x7cc714d3b075b1eca8cc66b62716f45c67a69f23", - "walletKey": "0x0e44b754d9b5ca9cdcc5c88c93c9732c2f1db5c6f2436ef38f8f39078fe2a421", - "dbEncryptionKey": "2662e9319d98901edfc92d1af7336abb3470e2b90449424d3e5150f6219b890a", - "inboxId": "8e81741f0a96f8ccd09a4a766eb0bab6a6c1b16a7b70cd23b604d891b2edac62", - "installations": 2 - }, - { - "accountAddress": "0x43e33cf223a487ec6291abd69e0d139d2fd7a1fe", - "walletKey": "0x928ab30d33b173e55dbd9dbb0e181f416ecb1d72062d2800a8eee7d7abe8390d", - "dbEncryptionKey": "a5fab71c9e3c96b6c78047f21ef1a3f36c0903ab297f613e444fdff29942219e", - "inboxId": "df96e9319f3db406092285da6a93ad7b516270c9c8c286dffc21e0e83167a18a", - "installations": 2 - }, - { - "accountAddress": "0xc1e51ad2fe543ff3106cf6282df06e61fb2c8806", - "walletKey": "0x3c8f426373cd9cfbc3c6d82aca0ada4a7f8e2d50209da4eefcfc919b58075de5", - "dbEncryptionKey": "c1e6d48a537237d7e205d7ab609a66e59e82b8d219326f2405b0fce4ad7efc21", - "inboxId": "0bbeffbf1ecbe4d227a00caf4588d9c6aec8e60c9cae81f4bf0b22c1bb3b57be", - "installations": 2 - }, - { - "accountAddress": "0x6f165c6e82381fdf597d51d5081eda4a23e69282", - "walletKey": "0xbc67035c6abbdff3de717b4ab71940f108fb2950fcd1b11be2bcb302ed496019", - "dbEncryptionKey": "7367692953a2a831a0759c5497714be5a4ed7e387a11a308aa32f26d3f7cf08c", - "inboxId": "e18ffcdaff0df6983600773e5344e9ee289a0993f1a88ba79407cb008c63d9d4", - "installations": 2 - }, - { - "accountAddress": "0xba7df7dc1d9232777da445bbbf2081df05f719be", - "walletKey": "0x5e67a4937ba75d37781f4417646754e1314125cde491bc754dfcfa68d5d3ea2e", - "dbEncryptionKey": "23f2bc9193b11c5a652e4ab8d39737469070ae1622cd1faa23e9c8ecf6d33612", - "inboxId": "665b64943c1dcf36f135577b8581952d1ccf47a4e173327e36c83d4d7c293ca5", - "installations": 2 - }, - { - "accountAddress": "0x2d1ee7ee349c326adfaf4cee11380ae4bff568c1", - "walletKey": "0x046ca85903ed675309ce6f07a9a8738dd117dd1089e568d88f2c4c9f88dc629a", - "dbEncryptionKey": "b40df87d14f7fe5f31cb98ccfca18ce5dcbbe215a1592ae5521a0f62dfa8f8cf", - "inboxId": "a337ab144b91e2fe82dc73190a4221f601a947657fc7159118d0c3bff66bb8f6", - "installations": 2 - }, - { - "accountAddress": "0xc7156717e0658e0757994e1c7f0a934c755b9456", - "walletKey": "0x2c734c6548884b005f8c2c6d682d121821b41a4439e25062ff40d83a87bb9291", - "dbEncryptionKey": "5c75c0c27590214032a7baca25b63fc664d94aa881a36d2bbd606e9402ea6ce7", - "inboxId": "2edc234977953ae7855e6f8dcaa960a25e26c9db4c67f8f13dfa689a1d957954", - "installations": 2 - }, - { - "accountAddress": "0x9c49cf24fa2202e8d158c4822d878b5298198cad", - "walletKey": "0x359941b8b3581c0334ef873c03c1bc7c6bce4dae072b839f50febcbb2f11c476", - "dbEncryptionKey": "0d6339fd3b9c7d5dfe4944aaa7fb0d60bb70e854f16adf9fb2c890e178538051", - "inboxId": "cf2f0916edaf16f2cb682e16fc9c026dea14cdc1819009f5d20173d9a27f4340", - "installations": 2 - }, - { - "accountAddress": "0x94138cd47295a2a8226f493d74932e79bf2fb7f9", - "walletKey": "0x540e7d308f00ff7f0f72581ff37b2fae56e22340ef9b5000fba13c4f9de74f91", - "dbEncryptionKey": "a829318aaa1a8b2382ac1a7155e37184f8195f79e618f49bf733a8c67342c0b7", - "inboxId": "abd306f77f0b85528abaa6c3aa5eb146a8a1d6d1eaea583c8aeb4810a425986a", - "installations": 2 - }, - { - "accountAddress": "0xc48994297bfd98f021e5a724eed37d98aa2efcb9", - "walletKey": "0x60cc392d1625afed9535afbf18103a8707c0d2d2d98897d9c80ac50a958988bc", - "dbEncryptionKey": "7f915069ec40e20f2239bf2aa5f247af6fc4017a7df13d9ac4b7fa0a3ccf9be3", - "inboxId": "4137a40e040eb1f930729de8f2fc6251457a03dfebd6afeaf1803c6cbe16b93e", - "installations": 2 - }, - { - "accountAddress": "0x99512e6145e5659112bb90342771ce6f033783c4", - "walletKey": "0x17f2244acfe2b3d0b0dcb3abfd80abd1a6171d8da7f5b5f4b4f19b6147c2c7f5", - "dbEncryptionKey": "fd1538ef6e070ec22ba733ec173a50f9ae6872855ad832280cabe020d41a0c71", - "inboxId": "6cdf62b5a4d6852e7e760ad601d188926fd1e86af971c466299133c6db965517", - "installations": 2 - }, - { - "accountAddress": "0x36ef00c1baec727b1ed1db8b3f15f556f4a366f5", - "walletKey": "0xe2ea28bfcf4d7aa88e9b2eaae95b92751b0b6a78753537773d038a952d0c66ed", - "dbEncryptionKey": "5f32199ab00596ba44d1e4c240cf18f552dd579eb6115938ac72c92840c1d267", - "inboxId": "4dbf389fad487a0ed0e5f1391909d7bdb171c715b192aba3854e4975cad99225", - "installations": 2 - }, - { - "accountAddress": "0xaa47d5aea77366ed845ee96b5f8be6178885f930", - "walletKey": "0x9c6e5b527ef02345c848ee3c901d86dbb5209517c22144c4a344bcd874524b26", - "dbEncryptionKey": "c6c0b1ea0a73cede3dcaaa2c4a8f04d27da5145bbf2bb211caaf87cd6324b0c7", - "inboxId": "bae8d99d38cb18aa1581defb3d1ac28d094a5f445a0ddc0e4dc5c95b54c2faf2", - "installations": 2 - }, - { - "accountAddress": "0x80951b8b05106976a92d2dfe3c57dbdc6b42d7e4", - "walletKey": "0x528903a5a1d9b824a2e1bfecc1ce6372b2daa7f32dda26ccd1c265b9c798ef01", - "dbEncryptionKey": "17a485d1744113d491db40c3ddae21e54b457c942a99dfed86cc9dfba58809b7", - "inboxId": "5ed048722769477b8196bf6a1f08404488348d86096b95df6281bb5aaf3949b7", - "installations": 2 - }, - { - "accountAddress": "0x4772acb0af606b431a4ccd8165cc2fd519070736", - "walletKey": "0x736015a406ff5ed5c19537f265957554eb504101620710788ac3d06fbca108fd", - "dbEncryptionKey": "dc67f250a6eb2e9cfeb06aba27c4b3fb29900dc546e41c1b9d87f1c5cef81737", - "inboxId": "a15ac551a580a33e1584039953dbde5cced5fb871cceb49d6aca095628cbdfd5", - "installations": 2 - }, - { - "accountAddress": "0xcad5a4b2d3dd2502a92c15db5cc2269fc9061b29", - "walletKey": "0xe93f03bd5f767a104320324e8d4badd270dbfed271684ba0da0077cced945c1a", - "dbEncryptionKey": "6405521196838d5bd2136b4f00b34a40c865921f55d6b86353e3a48ae17dccad", - "inboxId": "d001da08330cb41afba14f7517b0c5a5ded3f0ac98dab42f9721e07499dbb2e7", - "installations": 2 - }, - { - "accountAddress": "0x278ed0cf41bca75c574e485689a88173cb57b14e", - "walletKey": "0x2aa4bba2168675a7acead1e5257ddb4ced6a3aa718ac3f196df693ba8f143488", - "dbEncryptionKey": "682285c7bf9a53f06448b13a84a02cff22aed4e05c3314d7adc5c372faa9237e", - "inboxId": "449bc232ab73fc5214d3f329f58233aef0428c1d2cadebd379f9417c4d9bb869", - "installations": 2 - }, - { - "accountAddress": "0x51b2af5cea1473f075d8e27ae3a6251c2a2caf26", - "walletKey": "0x44072337ee4dedd4ac7cf6688426b91fcb38db563b143b501d1e744c0ba765e8", - "dbEncryptionKey": "763ff235e9212385ad580a85be3a287033581b6431d13a411ad3354b83f29f92", - "inboxId": "538a9950408d048170b857a0eb8a5712830325279ec9886f144b6ac9fd75ff30", - "installations": 2 - }, - { - "accountAddress": "0x7a5a7a1dfe005ce6ee3e79c8b6acc98fe501445c", - "walletKey": "0xb7ba585d2ed3ea00895d0259c918d93ab12e923ae08272647c47b3ecfa2f0286", - "dbEncryptionKey": "f626f11c084324a6306179c9c4efd642fa0a18278c8c9f873a430b1fa5d3c2f9", - "inboxId": "a89944b366dba78709fb763a3f2e032ed5c59836c5add8d7a81b566a638d89ce", - "installations": 2 - }, - { - "accountAddress": "0x56cefbccaf9fbd82cbe439b4a94c8436bf1a9833", - "walletKey": "0x51af0070a065dc20f0a326f31ce7609e4a9bf4b15a22dd5383e7ba2d234329a4", - "dbEncryptionKey": "e09e654b61bf330b1a35a3afdd9b0bbcb96aaeb9758bf45e64b4ae26aa87dda7", - "inboxId": "99ea95f3f52bdf0daca360a7d2c83a49728239c43326103803e7bf2c412a61f6", - "installations": 2 - }, - { - "accountAddress": "0x37b70e0ff1ade19d664d413cd4dec343fc17b626", - "walletKey": "0x3b281a7e3977c287cff9f6d167954b865ea69b10f8c0e3e791e0a90c05e53a5a", - "dbEncryptionKey": "1c92af27c43534be9fecc5851e3d38a9a81ed51f6f5086c636e4576262314a5d", - "inboxId": "3fa70de7a450bf74a9653c64780a4d118503256ce7d0d6dede928e53e54007f4", - "installations": 2 - }, - { - "accountAddress": "0x325387688bc4451979f1e35a55dce1f1558b4556", - "walletKey": "0x831471ea000f50396248b30488ad6e590cc04a1ee206243f580ce760b0d93508", - "dbEncryptionKey": "ad26d08238ef5241766dcf7c1bd96d6c35777e27f2f2fd1782a86779cef03d5c", - "inboxId": "b1b1e777582d9ba68154ceb4f6a6a6acd1de3a1680bf4dd65ecd7bd223676cba", - "installations": 2 - }, - { - "accountAddress": "0xafba808beed698fd2b51538da5cb06fbd32831be", - "walletKey": "0xb4c5e45e42e7e277660229a39d6d91c8f2f1e92aab4ce7ece828d8ca17aecd96", - "dbEncryptionKey": "783560c6a9b65fbe72f29a8cc523749bd8b00dccb9fd0e3cab06e7fb1ad6b52b", - "inboxId": "0cef5c60826ea53e51e728950329416ded0fb179223df360cb8f08d38bacf7a5", - "installations": 2 - }, - { - "accountAddress": "0x7b1f2edb93c24eade26ecca322545d4b2b197a69", - "walletKey": "0xcc889918de7165022f8e52e44ade8ec273fb90216ce47a0237d5c82921f97396", - "dbEncryptionKey": "972cacaf35df7d73d8d2c4714c67d66be2b926c3a794965d426c7955de30fff6", - "inboxId": "4fd6a88ff71921883a62f8690ca4c0582f974cb9ec1a0cdf16ac0e7edd98ef27", - "installations": 2 - }, - { - "accountAddress": "0xe895ea8d5ff080e56ad9add481d473c6d123174a", - "walletKey": "0x3f9917b3d912cccea8ced0503b84286b259f4caf0cc7f39af01d7b11702ea6ed", - "dbEncryptionKey": "54df84305689cac3885e25aada36eee66a15a6cb516964eb74b905bd82495d4a", - "inboxId": "61224b9ec156bf72225adff80512da777fed88621b48236dd3aeaf7480a126b9", - "installations": 2 - }, - { - "accountAddress": "0x6d1e783cdf6ace3911f0636a0da8fc754f40d2a0", - "walletKey": "0x490532939769871708d88361a30c9692cf93d295ee4675d811c3f769dbf9f6cd", - "dbEncryptionKey": "a2d0b53c15a0510876ad8ed7b293d27b84a1c6598089501671413422fd996ee7", - "inboxId": "3fb2bd5eba04cca94dfca94c4808fa28c460c968f0f429239471e9ec61788bf6", - "installations": 2 - }, - { - "accountAddress": "0x247cb2c71fa99b83c12249c9f10e633e8061c844", - "walletKey": "0x9769717503133efaac9490c0b224677f37416b194b05f57eaf93e9c5653662bb", - "dbEncryptionKey": "5980672791d5fa6689a28515b4823388f72d2d2698daeba7c3683a153f98eae5", - "inboxId": "4e408ab5d41a1e037b219f1f90d2dc7e8bb622d1c8814e0e90d9764b70a65f06", - "installations": 2 - }, - { - "accountAddress": "0xd3d866dfa9b042eabe4a425372f7232e34db8c2a", - "walletKey": "0xd51bc97ba5d19c599a1b88c3776e5bd7bb7fff85393b766614673081ac6e5cc2", - "dbEncryptionKey": "5ad31fee0b90dc1f1699875f5d2d582d1c84cc06dc7a00d112d4a4f3a5315d27", - "inboxId": "238020693a8345d228661d75141cea79365244113b0b8d9aae7feef0b7bcf54d", - "installations": 2 - }, - { - "accountAddress": "0x4027436f1e51ec2137dda7dd631c9b9c668763a9", - "walletKey": "0x1dcbcbba68daa3523badd92326791526a7cc0911a355325952ce61b5a6ed709d", - "dbEncryptionKey": "a29d17c342ea5ac699d5b6fb7f7bcc993fc94e8bba787d1f08f1714259c7bb97", - "inboxId": "0e1d117374db64f8a4f2d7434423252d5b0540460671ad1038c3398540f85e18", - "installations": 2 - }, - { - "accountAddress": "0x23770c53c591fccce46cf71980a44acb807bcad1", - "walletKey": "0x07170158380f16675b520309cdfbf197aba1aa6772a804a2cd21f7c6ceb457d8", - "dbEncryptionKey": "016b37ea074f3e0264bfd6ec7eef47608051b381b6474d51841c430b9a24452b", - "inboxId": "bfaa081865c614d7a2b6d6b13138b709f008c2acf03e039964971865656daf2b", - "installations": 2 - }, - { - "accountAddress": "0xf1d587292f6521181fd992f6fd6739809b798967", - "walletKey": "0x505d70385f45ebc7ae832c4710b2c90e945b20e92f7662d8d791c34f6cc63045", - "dbEncryptionKey": "36d568ebe900d9a8566de0afa72506bedfb41227492a731c15ebf10810fcfabf", - "inboxId": "aa7d846944dcd99f4601e6b030f33c01d35dc164f1351c06b7666d49747f5155", - "installations": 2 - }, - { - "accountAddress": "0x4734d6e1f22b0aff38586afebc345107b1338cf4", - "walletKey": "0xb9f26f964fbf3653a8127a7a7fda8215da13d243451268a8b64516a915d86760", - "dbEncryptionKey": "2ec65e8d577d93b612d691e3f56d6807b8765a18e85151f24aa1dbbcf944b5a0", - "inboxId": "0dfe318f136158a3292cd6f34e2fd14dd1a6fe6150d9d15746c6ea4536986515", - "installations": 2 - }, - { - "accountAddress": "0x2272ef2761c64026ce063d4c45eb4a23cdd1f84b", - "walletKey": "0x2468de6454890227c3441065460f296f5a93249d2424031603867c7e2ccabd60", - "dbEncryptionKey": "d3066f8e9e54b2c0990cd83b23f1079c14c68905a43dd34e94197f10733dc1e0", - "inboxId": "36fe01ac97428a6bc855af0b6c08430a2b56f51e47d250484cfe1bcb61612130", - "installations": 2 - }, - { - "accountAddress": "0x9b04edcadfc252a61edde8e426458ef52314a8df", - "walletKey": "0x2a806f248a5021910a3d350edf15dfb4bd0783df29b61767f7e23577f9bff296", - "dbEncryptionKey": "c5d09c243aacc575744feb8992f9ef7779951870291c8fc6807b0477509ba023", - "inboxId": "a4bc20bed71360801de893d8b426f337afd765b1275dc53a9b3fd3f342818842", - "installations": 2 - }, - { - "accountAddress": "0x7df1f78e6ffac44b85ac190ea962953e51c279e6", - "walletKey": "0xa0fc8029e0e1b8beedf07ffbcbd82d2f9f7b9be8d21a27bd7e8c4c88bcad1499", - "dbEncryptionKey": "066ad88a53aaf59182702b06459c14b5fda2474252d41b58297c141a4e95626b", - "inboxId": "8f79171efe2690530f17dee2be9a94f436f846a77415cf43820e7a1b1e5b4df4", - "installations": 2 - }, - { - "accountAddress": "0xa9ef8af50a53e33956151eaceee7b6b31188334f", - "walletKey": "0x40e3ac8a81498ce4bd87008dde740333659f47c50ab86ee3b218d0015891786c", - "dbEncryptionKey": "6b14b46581c8283f3108a5db0c2a1b855704b67d0f904e8a7ba797c0a67ebe46", - "inboxId": "cfdf96b58662357595590097ca8b02be4099eec2f71b4f6a7430fa15ffdbee79", - "installations": 2 - }, - { - "accountAddress": "0x3ba250cac1db71ba68ae361112c2d165ca56884f", - "walletKey": "0x01c7ce68a9dc342856d9805342cd4086d1b705adb373a65c9bede03fc1897e0f", - "dbEncryptionKey": "e7bb11b7fe75e77914c02fcba8d64da0e24c57c49854962a9f366aab9128f415", - "inboxId": "39c8f8af7753355607d71f4adc32560f992774b70ea98e647ee0ed84f4cacf97", - "installations": 2 - }, - { - "accountAddress": "0x1c102ff901e60c1201177411bac8c5a003568bf8", - "walletKey": "0x50ea965f96c9bb668668fa8ca14968ba50620e62b66e91da5ca28738a310394b", - "dbEncryptionKey": "9838c3b8d06d2c9b98d8ed57ac2ead37f70b8bb18fc6f15d22019442494fc188", - "inboxId": "1dd23df66fa83a98556e2bcc0942ee1fe757d3a872b11fd6f0a984ae810f153f", - "installations": 2 - }, - { - "accountAddress": "0xfd1b8a0a8f3b61e47f40345c37d9cbd79cf9dccd", - "walletKey": "0x13d0d5332a0e1a406d66b0c2556358ed15f76f8ab7b6eb61a732e8690e6ffad8", - "dbEncryptionKey": "bfd1fed7fcce5ea2ca947d1c461f9e1f92c5e32ccebcdebace6edde9ebc9701c", - "inboxId": "7d361d75343cb421492e939c683c9dad9921914cbf77a08eaaf263449d3dfbda", - "installations": 2 - }, - { - "accountAddress": "0x3e14a658461db5b77bcfd1632a4cdb00d1777624", - "walletKey": "0x1072655b2c8a40c4a76f92b64aff37ab65634172962291edc94f391948d7a0a0", - "dbEncryptionKey": "747ef3e4ed1df9b95bba2ca45c856ae828a3b17ef2c903ac863205d0b64a434f", - "inboxId": "d8e582053edf2a98af37081f24d90f27e5acfa4a4eceb897b8d69e0a6d8900ea", - "installations": 2 - } -] diff --git a/data/users.json b/data/users.json deleted file mode 100644 index e47a726..0000000 --- a/data/users.json +++ /dev/null @@ -1,39 +0,0 @@ -[ - { - "app": "fabri-convos-desktop", - "inboxId": "3a54da678a547ea3012b55734d22eb5682c74da1747a31f907d36afe20e5b8f9", - "address": "0x62bd2ac2e5a9728b764775cfc88836519efc93b7", - "network": "production", - "name": "prod-testing" - }, - { - "app": "fabri-tba", - "inboxId": "7e5d2a57b752d7b0a29807929c09b416f64ec0878204b87ab6a32c0b47729f27", - "network": "production", - "name": "prod-testing" - }, - { - "app": "fabri-xmtpchat", - "inboxId": "2ac60b0589a33b1ba027aebc1f3c193a61cc3f3893d31e1b3ed5c56d561c1771", - "network": "local", - "name": "local-testing" - }, - { - "app": "fabri-convos", - "inboxId": "68afe2066b84b48e0b09c2b78be7324a4fb66a973bb0def478ea390312e759b5", - "network": "production", - "name": "prod-" - }, - { - "app": "fabri-convos-oneoff", - "inboxId": "c2982d604ab4a3b21949893060e430388c1219f33124aa214eb44d727b4b70d6", - "network": "production", - "name": "prod-testing" - }, - { - "app": "fabri-convos-dev", - "inboxId": "0fb3a0a9eaa2d8ef25a4b05c2154c1dbdb3324fe873c8ee25d89b7126d57e880", - "network": "dev", - "name": "dev-oneoff" - } -] diff --git a/package.json b/package.json index c7e086d..7a12bb5 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,13 @@ "description": "XMTP Copilot - CLI commands and Slack bot integration for XMTP protocol testing and management", "type": "module", "scripts": { - "dev": "tsx src/cli.tsx" + "dev": "tsx src/cli.tsx", + "start": "tsx src/cli.tsx", + "chat": "tsx src/cli.tsx", + "build": "tsc --project config/tsconfig.json", + "lint": "eslint src --config config/eslint.config.js", + "format": "prettier --write 'src/**/*.{ts,tsx}'", + "type-check": "tsc --noEmit" }, "dependencies": { "@anthropic-ai/claude-code": "latest", @@ -17,8 +23,10 @@ "@xmtp/content-type-wallet-send-calls": "^2.0.0", "dotenv": "^17.2.3", "ink": "^6.3.1", + "ink-box": "^2.0.0", "ink-text-input": "^6.0.0", - "react": "^19.2.0" + "react": "^19.2.0", + "zustand": "^5.0.8" }, "devDependencies": { "@eslint/compat": "^1.2.6", diff --git a/screenshot.png b/screenshot.png index a3f7651..43683da 100644 Binary files a/screenshot.png and b/screenshot.png differ diff --git a/src/cli-old.tsx b/src/cli-old.tsx new file mode 100644 index 0000000..ea119d8 --- /dev/null +++ b/src/cli-old.tsx @@ -0,0 +1,910 @@ +import "dotenv/config"; +import React, { useState, useEffect, useRef } from "react"; +import { render, Box, Text, useApp } from "ink"; +import TextInput from "ink-text-input"; +import { + Agent, + IdentifierKind, + type Conversation, + type DecodedMessage, + type XmtpEnv, + type Group, + type Dm, +} from "@xmtp/agent-sdk"; +import { getRandomValues } from "node:crypto"; +import { Client } from "@xmtp/node-sdk"; +import { getTestUrl } from "@xmtp/agent-sdk/debug"; +import { createSigner, createUser } from "@xmtp/agent-sdk/user"; +import { generatePrivateKey, privateKeyToAddress } from "viem/accounts"; +import { fromString, toString } from "uint8arrays"; + +function showHelp(): void { + console.log(` +XMTP CLI Chat Interface + +Chat with your XMTP conversations directly from the terminal. + +USAGE: + yarn chat [options] + +OPTIONS: + --agent Connect to agent(s) by Ethereum address or inbox ID + Single address: creates/opens a DM + Multiple addresses: creates a group chat + [auto-detected in dev environment if not provided] + -h, --help Show this help message + +IN-CHAT COMMANDS: + /c Switch to a different conversation + /b Return to conversation list + /exit Quit the application + +EXAMPLES: + yarn chat + yarn chat --agent 0x7c40611372d354799d138542e77243c284e460b2 + yarn chat --agent 0x7c40611372d354799d138542e77243c284e460b2 0x1234567890abcdef1234567890abcdef12345678 + yarn chat --agent 1180478fde9f6dfd4559c25f99f1a3f1505e1ad36b9c3a4dd3d5afb68c419179 + +ENVIRONMENT VARIABLES: + XMTP_ENV Default environment + XMTP_CLIENT_WALLET_KEY Wallet private key (required) + XMTP_CLIENT_DB_ENCRYPTION_KEY Database encryption key (required) +`); +} + +// Red color - matching the original theme (rgb: 252, 76, 52) +const RED = "#fc4c34"; +// Standard red for errors +const ERROR_RED = "#fc4c34"; + +// ============================================================================ +// Types +// ============================================================================ +interface FormattedMessage { + timestamp: string; + sender: string; + content: string; + isFromSelf: boolean; +} + +// ============================================================================ +// Utility Functions +// ============================================================================ +const isGroup = (conversation: Conversation): conversation is Group => { + return conversation.constructor.name === "Group"; +}; + +const isDm = (conversation: Conversation): conversation is Dm => { + return conversation.constructor.name === "Dm"; +}; + +const isEthAddress = (identifier: string): boolean => { + return identifier.startsWith("0x") && identifier.length === 42; +}; + +const handleError = ( + error: unknown, + setError: (msg: string) => void, + context: string, + clearAfter?: number, +): void => { + const err = error as Error; + setError(`${context}: ${err.message}`); + + // Auto-clear error after specified time (default 5 seconds) + if (clearAfter) { + setTimeout(() => { + setError(""); + }, clearAfter); + } +}; + +// ============================================================================ +// Reusable UI Components +// ============================================================================ +interface StatusBoxProps { + children: React.ReactNode; + color?: string; + borderColor?: string; +} + +const StatusBox: React.FC = ({ + children, + color = ERROR_RED, + borderColor = ERROR_RED, +}) => ( + + + {children} + + +); + +interface InfoTextProps { + children: React.ReactNode; + marginTop?: number; +} + +const InfoText: React.FC = ({ children, marginTop = 1 }) => ( + + {children} + +); + +// ============================================================================ +// Header Component +// ============================================================================ +interface HeaderProps { + conversation: Conversation | null; + env: XmtpEnv; + url: string; + conversations: number; + installations: number; + address: string; + inboxId: string; + peerAddress: string; +} + +const Header: React.FC = ({ + conversation, + conversations, + env, + url, + installations, + address, + inboxId, + peerAddress, +}) => { + const logoLines = [ + " ██╗ ██╗███╗ ███╗████████╗██████╗ ", + " ╚██╗██╔╝████╗ ████║╚══██╔══╝██╔══██╗", + " ╚███╔╝ ██╔████╔██║ ██║ ██████╔╝", + " ██╔██╗ ██║╚██╔╝██║ ██║ ██╔═══╝ ", + " ██╔╝ ██╗██║ ╚═╝ ██║ ██║ ██║ ", + " ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ", + ]; + + if (!conversation) { + // Show initialization header + return ( + + + + {logoLines.map((line, i) => ( + + {line} + + ))} + + + + InboxId: {inboxId.slice(0, 36)}... + + + Address: {address} + + + Conversations: {conversations} + + + Installations: {installations} + + + Network: {env} + + + URL: {url.slice(0, 30)}... + + + + + ); + } + + return ( + + + {isGroup(conversation) ? ( + + {" "} + GROUP: {conversation.name || "Unnamed Group"}{" "} + + ) : ( + + {" "} + DM:{" "} + {peerAddress || + (conversation as Dm).peerInboxId.slice(0, 16) + "..."}{" "} + + )} + + Commands: /c <number> • /b • /exit + + ); +}; + +// ============================================================================ +// Messages Component +// ============================================================================ +interface MessagesProps { + messages: FormattedMessage[]; + height: number; +} + +const Messages: React.FC = ({ messages, height }) => { + // Show last N messages that fit in the height + const visibleMessages = messages.slice(-height); + + // Helper function to format long text with proper indentation + const formatLongText = (text: string, prefix: string) => { + const lines = text.split("\n"); + if (lines.length === 1) { + return text; + } + + // For multi-line content, indent continuation lines + return lines + .map((line, index) => { + if (index === 0) return line; + // Add indentation to match the prefix length + const indent = " ".repeat(prefix.length); + return `${indent}${line}`; + }) + .join("\n"); + }; + + return ( + + {visibleMessages.length === 0 ? ( + No messages yet... + ) : ( + visibleMessages.map((msg, index) => { + const prefix = `[${msg.timestamp}] ${msg.sender}: `; + const formattedContent = formatLongText(msg.content, prefix); + + return ( + + + [{msg.timestamp}] + + {msg.sender}: + + {formattedContent} + + + ); + }) + )} + + ); +}; + +// ============================================================================ +// Input Component +// ============================================================================ +interface InputBoxProps { + value: string; + onChange: (value: string) => void; + onSubmit: (value: string) => void; + placeholder?: string; +} + +const InputBox: React.FC = ({ + value, + onChange, + onSubmit, + placeholder = "Send a message to the agent", +}) => { + return ( + + + + + + ); +}; + +// ============================================================================ +// Conversation List Component +// ============================================================================ +interface ConversationListProps { + conversations: Conversation[]; + currentConversationId: string | null; +} +const getEthereumAddress = async ( + conversation: Conversation, +): Promise => { + const members = await conversation.members(); + + for (const member of members) { + // Get Ethereum address + const ethIdentifier = member.accountIdentifiers.find( + (id) => id.identifierKind === IdentifierKind.Ethereum, + ); + + if (ethIdentifier) { + return ethIdentifier.identifier; + } + } + return null; +}; +const ConversationList: React.FC = ({ + conversations, + currentConversationId, +}) => { + const [addressMap, setAddressMap] = React.useState>( + {}, + ); + const [loading, setLoading] = React.useState(true); + + React.useEffect(() => { + const loadAddresses = async () => { + const newAddressMap: Record = {}; + + for (const conv of conversations) { + if (!isGroup(conv)) { + const address = await getEthereumAddress(conv); + if (address) { + newAddressMap[conv.id] = address; + } + } + } + + setAddressMap(newAddressMap); + setLoading(false); + }; + + loadAddresses(); + }, [conversations]); + + return ( + + Your conversations + + {conversations.length === 0 ? ( + No conversations found + ) : loading ? ( + Loading conversations... + ) : ( + conversations.map((conv, index) => { + const isCurrent = conv.id === currentConversationId; + const label = isCurrent ? "●" : " "; + + if (isGroup(conv)) { + return ( + + {label} + {index + 1}. + [GROUP] + {conv.name || "Unnamed"} + + ); + } else { + const peerShort = addressMap[conv.id]; + if (peerShort) { + return ( + + {label} + {index + 1}. + [DM] + {peerShort} + + ); + } + } + }) + )} + + + Use /c <number> to switch conversations + + + ); +}; + +// ============================================================================ +// Main App Component +// ============================================================================ +interface AppProps { + env: XmtpEnv; + agentIdentifiers?: string[]; +} + +const App: React.FC = ({ env, agentIdentifiers }) => { + const { exit } = useApp(); + const [agent, setAgent] = useState(null); + const [address, setAddress] = useState(""); + const [url, setUrl] = useState(""); + const [installations, setInstallations] = useState(0); + const [inboxId, setInboxId] = useState(""); + const [currentConversation, setCurrentConversation] = + useState(null); + const [messages, setMessages] = useState([]); + const [inputValue, setInputValue] = useState(""); + const [conversations, setConversations] = useState([]); + const [showConversationList, setShowConversationList] = useState(false); + const [error, setError] = useState(""); + const [errorTimeout, setErrorTimeout] = useState(null); + const [loadingStatus, setLoadingStatus] = useState( + "Initializing XMTP cli client...", + ); + const [peerAddress, setPeerAddress] = useState(""); + + // Function to set error with auto-clear + const setErrorWithTimeout = (message: string, timeoutMs = 5000) => { + setError(message); + if (errorTimeout) { + clearTimeout(errorTimeout); + } + const timeout = setTimeout(() => { + setError(""); + setErrorTimeout(null); + }, timeoutMs); + setErrorTimeout(timeout); + }; + const streamRef = useRef | null>(null); + const isStreamingRef = useRef(false); + + // Initialize agent + useEffect(() => { + const initAgent = async () => { + setLoadingStatus("Initializing XMTP cli client..."); + + let walletKey = process.env.XMTP_CLIENT_WALLET_KEY; + let dbEncryptionKey = process.env.XMTP_CLIENT_DB_ENCRYPTION_KEY; + + if (!walletKey || !dbEncryptionKey) { + walletKey = generatePrivateKey(); + dbEncryptionKey = toString(getRandomValues(new Uint8Array(32)), "hex"); + } + + const user = createUser(walletKey as `0x${string}`); + const signer = createSigner(user); + + // Convert hex string to Uint8Array for dbEncryptionKey + const encryptionKeyBytes = fromString(dbEncryptionKey, "hex"); + + const newAgent = await Agent.create(signer, { + env, + dbEncryptionKey: encryptionKeyBytes, + dbPath: (inboxId) => "." + `/cli-${env}-${inboxId.slice(0, 8)}.db3`, + }); + + setAgent(newAgent); + setAddress(newAgent.address || ""); + setInboxId(newAgent.client.inboxId); + setUrl(getTestUrl(newAgent.client) || ""); + + const finalInboxState = await Client.inboxStateFromInboxIds( + [newAgent.client.inboxId], + env, + ); + setInstallations(finalInboxState[0].installations.length); + + setLoadingStatus("Syncing conversations..."); + // Sync conversations + await newAgent.client.conversations.sync(); + const convList = await newAgent.client.conversations.list(); + setConversations(convList); + + // If agent identifiers provided, create/find conversation + if (agentIdentifiers && agentIdentifiers.length > 0) { + setLoadingStatus("Connecting to agent..."); + const conv = await findOrCreateConversation(newAgent, agentIdentifiers); + if (conv) { + setLoadingStatus("Loading messages..."); + setCurrentConversation(conv); + + // Fetch peer address for DMs + if (!isGroup(conv)) { + const address = await getEthereumAddress(conv); + setPeerAddress(address || ""); + } else { + setPeerAddress(""); + } + + await loadMessages(conv, newAgent); + await startMessageStream(conv, newAgent); + } + } + + setLoadingStatus(""); + }; + + initAgent().catch((err) => { + handleError(err, setError, "Failed to initialize"); + setLoadingStatus(""); + }); + }, []); + + // Find or create conversation + const findOrCreateConversation = async ( + agentInstance: Agent, + identifiers: string[], + ): Promise => { + const client = agentInstance.client; + const groupOptions = { + groupName: "CLI Group Chat", + groupDescription: "Group created from CLI", + }; + + try { + if (identifiers.length > 1) { + // Create group + const allEthAddresses = identifiers.every(isEthAddress); + + if (allEthAddresses) { + const memberIdentifiers = identifiers.map((id) => ({ + identifier: id, + identifierKind: IdentifierKind.Ethereum, + })); + return await client.conversations.newGroupWithIdentifiers( + memberIdentifiers, + groupOptions, + ); + } + + return await client.conversations.newGroup(identifiers, groupOptions); + } + + // Create/find DM + const identifier = identifiers[0]; + + // Try to find existing conversation + await client.conversations.sync(); + const convs = await client.conversations.list(); + + for (const conv of convs) { + if (!isDm(conv)) continue; + + if (conv.peerInboxId.toLowerCase() === identifier.toLowerCase()) { + return conv; + } + + if (isEthAddress(identifier)) { + const members = await conv.members(); + const foundMember = members.find((member) => { + const ethId = member.accountIdentifiers.find( + (id) => id.identifierKind === IdentifierKind.Ethereum, + ); + return ethId?.identifier.toLowerCase() === identifier.toLowerCase(); + }); + + if (foundMember) return conv; + } + } + + // Create new DM + return isEthAddress(identifier) + ? await client.conversations.newDmWithIdentifier({ + identifier, + identifierKind: IdentifierKind.Ethereum, + }) + : await client.conversations.newDm(identifier); + } catch (err: unknown) { + handleError(err, setError, "Failed to create conversation"); + return null; + } + }; + + // Load messages + const loadMessages = async (conv: Conversation, agentInstance: Agent) => { + await conv.sync(); + const msgs = await conv.messages(); + const formatted = msgs + .slice(-50) + .map((msg) => formatMessage(msg, agentInstance)); + setMessages(formatted); + }; + + // Format message + const formatMessage = ( + message: DecodedMessage, + agentInstance: Agent, + ): FormattedMessage => { + const timestamp = message.sentAt.toLocaleTimeString("en-US", { + hour: "2-digit", + minute: "2-digit", + }); + + const isFromSelf = message.senderInboxId === agentInstance.client.inboxId; + const sender = isFromSelf + ? "You" + : agentInstance.address?.slice(0, 4) + + "..." + + agentInstance.address?.slice(-4); + + let content: string; + if (typeof message.content === "string") { + content = message.content; + } else { + // Try to format JSON nicely, fallback to compact if it fails + try { + content = JSON.stringify(message.content, null, 2); + } catch { + content = JSON.stringify(message.content); + } + } + + return { timestamp, sender, content, isFromSelf }; + }; + + // Start message stream + const startMessageStream = async ( + conv: Conversation, + agentInstance: Agent, + ) => { + if (isStreamingRef.current) return; + + isStreamingRef.current = true; + const client = agentInstance.client; + + try { + streamRef.current = await client.conversations.streamAllMessages(); + + (async () => { + if (!streamRef.current) return; + + for await (const message of streamRef.current) { + if (message.conversationId !== conv.id) continue; + + const formatted = formatMessage(message, agentInstance); + setMessages((prev) => [...prev, formatted]); + } + })().catch((err) => { + handleError(err, setError, "Stream error"); + isStreamingRef.current = false; + }); + } catch (err: unknown) { + handleError(err, setError, "Failed to start stream"); + isStreamingRef.current = false; + } + }; + + // Command handlers + const commands = { + "/exit": () => exit(), + "/b": () => { + setCurrentConversation(null); + setPeerAddress(""); + setMessages([]); + setShowConversationList(false); + } + }; + + const handleChatCommand = async (message: string) => { + const parts = message.split(" "); + if (parts.length !== 2) { + setErrorWithTimeout("Usage: /chat "); + return; + } + + const index = parseInt(parts[1]) - 1; + if (isNaN(index) || index < 0 || index >= conversations.length) { + setErrorWithTimeout("Invalid conversation number"); + return; + } + + const newConv = conversations[index]; + setCurrentConversation(newConv); + setShowConversationList(false); + + // Fetch peer address for DMs + if (!isGroup(newConv)) { + const address = await getEthereumAddress(newConv); + setPeerAddress(address || ""); + } else { + setPeerAddress(""); + } + + if (agent) { + await loadMessages(newConv, agent); + await startMessageStream(newConv, agent); + } + }; + + // Handle input submit + const handleSubmit = async (value: string) => { + if (!value.trim()) return; + + const message = value.trim(); + setInputValue(""); + + // Handle direct commands + if (commands[message as keyof typeof commands]) { + commands[message as keyof typeof commands](); + return; + } + + // Handle /chat command + if (message.startsWith("/chat ")) { + await handleChatCommand(message); + return; + } + + // If not in a conversation, try to connect to agent address + if (!currentConversation) { + if (agent) { + try { + const conv = await findOrCreateConversation(agent, [message]); + if (conv) { + setCurrentConversation(conv); + + // Fetch peer address for DMs + if (!isGroup(conv)) { + const address = await getEthereumAddress(conv); + setPeerAddress(address || ""); + } else { + setPeerAddress(""); + } + + await loadMessages(conv, agent); + await startMessageStream(conv, agent); + return; + } + } catch (err: unknown) { + handleError(err, setError, "Failed to connect to agent"); + return; + } + } + setErrorWithTimeout( + "No active conversation. Use /b to see available chats or /c to select one.", + ); + return; + } + + // Send message + if (!agent) { + setErrorWithTimeout("Agent not initialized"); + return; + } + + try { + await currentConversation.send(message); + } catch (err: unknown) { + handleError(err, setError, "Failed to send"); + } + }; + + // Show loading state + if (!agent || loadingStatus) { + return ( + + + + 🔄 {loadingStatus} + + + {agent && ( + + ✓ Agent initialized + + Address: {address.slice(0, 10)}...{address.slice(-8)} + + + )} + + ); + } + + return ( + +
+ + {/* Show error inline if present */} + {error && ( + + + Error: {error} + + + )} + + {showConversationList && ( + + )} + + {currentConversation && } + + + + {!currentConversation && conversations.length > 0 && ( + + Available commands: /b, /c <n>, /exit + + )} + + ); +}; + +// ============================================================================ +// CLI Entry Point +// ============================================================================ +function parseArgs(): { env: XmtpEnv; help: boolean; agents?: string[] } { + const args = process.argv.slice(2); + const env = (process.env.XMTP_ENV as XmtpEnv) || "production"; + let help = false; + const agents: string[] = []; + + for (let i = 0; i < args.length; i++) { + const arg = args[i]; + const nextArg = args[i + 1]; + + if (arg === "--help" || arg === "-h") { + help = true; + } else if (arg === "--agent" && nextArg) { + i++; + while (i < args.length && !args[i].startsWith("--")) { + agents.push(args[i]); + i++; + } + i--; + } + } + + // Auto-detect agent address if not provided and we're in dev environment + if (agents.length === 0 && env === "dev") { + // Try to get agent address from environment or use the known dev agent address + const autoAgentAddressKey = process.env.XMTP_WALLET_KEY || ""; + const autoAgentAddress = privateKeyToAddress( + autoAgentAddressKey as `0x${string}`, + ); + if (autoAgentAddress) { + agents.push(autoAgentAddress); + } + console.log(`🔗 Auto-connecting to agent: ${autoAgentAddress}`); + } + + return { env, help, agents: agents.length > 0 ? agents : undefined }; +} + +async function main(): Promise { + const { env, help, agents } = parseArgs(); + + if (help) { + showHelp(); + process.exit(0); + } + // Create a mutable array of agent identifiers + const agentIdentifiers = agents ? [...agents] : []; + + // If no agents specified, use the agent from XMTP_WALLET_KEY + if (agentIdentifiers.length === 0) { + const walletKey = process.env.XMTP_WALLET_KEY || ""; + if (walletKey) { + const publicKey = privateKeyToAddress(walletKey as `0x${string}`); + agentIdentifiers.push(publicKey); + } + } + + render(); +} + +void main(); diff --git a/src/cli.tsx b/src/cli.tsx index d93b770..f8e0aa2 100644 --- a/src/cli.tsx +++ b/src/cli.tsx @@ -1,414 +1,65 @@ import "dotenv/config"; -import React, { useState, useEffect, useRef } from "react"; -import { render, Box, Text, useApp } from "ink"; -import TextInput from "ink-text-input"; -import { - Agent, - IdentifierKind, - type Conversation, - type DecodedMessage, - type XmtpEnv, - type Group, - type Dm, -} from "@xmtp/agent-sdk"; -import { getRandomValues } from "node:crypto"; -import { Client } from "@xmtp/node-sdk"; -import { getTestUrl } from "@xmtp/agent-sdk/debug"; -import { createSigner, createUser } from "@xmtp/agent-sdk/user"; -import { generatePrivateKey, privateKeyToAddress } from "viem/accounts"; -import { fromString, toString } from "uint8arrays"; +import React, { useState, useEffect } from "react"; +import { render, Box, Text, useApp, useInput } from "ink"; +import type { XmtpEnv } from "@xmtp/agent-sdk"; +import { privateKeyToAddress } from "viem/accounts"; +import { Layout } from "./components/Layout.js"; +import type { Command } from "./components/CommandPalette.js"; +import { CommandSuggestion } from "./components/CommandSuggestions.js"; +import { useXMTP } from "./hooks/useXMTP.js"; +import { useKeyboard } from "./hooks/useKeyboard.js"; +import { useStore } from "./store/state.js"; +const RED = "#fc4c34"; + +// ============================================================================ +// Help Display +// ============================================================================ function showHelp(): void { console.log(` -XMTP CLI Chat Interface +XMTP CLI Chat Interface v2.0 +━━━━━━━━━━━━━━━━━━━━━━━━━━━━ Chat with your XMTP conversations directly from the terminal. USAGE: - yarn chat [options] + yarn dev [options] OPTIONS: --agent Connect to agent(s) by Ethereum address or inbox ID Single address: creates/opens a DM Multiple addresses: creates a group chat - [auto-detected in dev environment if not provided] -h, --help Show this help message -IN-CHAT COMMANDS: - /list List all your conversations with numbers - /chat Switch to a different conversation - /back Return to conversation list - /exit Quit the application +KEYBINDINGS: + Cmd+B (macOS) / Ctrl+B Toggle sidebar + Cmd+K (macOS) / Ctrl+K Open command palette + Ctrl+N/P Next/previous conversation + ↑↓ Navigate conversations + Enter Open selected conversation / Send message + Esc Go back to main screen / Cancel input + Ctrl+C Quit + +COMMANDS: + /back Return to main conversation list + /list Toggle sidebar visibility + /chat Switch to conversation number + /new
Create new conversation with address + /refresh Refresh inbox and update conversations + /exit, /quit Exit application EXAMPLES: - yarn chat - yarn chat --agent 0x7c40611372d354799d138542e77243c284e460b2 - yarn chat --agent 0x7c40611372d354799d138542e77243c284e460b2 0x1234567890abcdef1234567890abcdef12345678 - yarn chat --agent 1180478fde9f6dfd4559c25f99f1a3f1505e1ad36b9c3a4dd3d5afb68c419179 + yarn dev + yarn dev --agent 0x7c40611372d354799d138542e77243c284e460b2 + yarn dev --agent 0x... 0x... (creates group) ENVIRONMENT VARIABLES: - XMTP_ENV Default environment - XMTP_CLIENT_WALLET_KEY Wallet private key (required) - XMTP_CLIENT_DB_ENCRYPTION_KEY Database encryption key (required) + XMTP_ENV Default environment (dev/production) + XMTP_CLIENT_WALLET_KEY Wallet private key + XMTP_CLIENT_DB_ENCRYPTION_KEY Database encryption key `); } -// Red color - matching the original theme (rgb: 252, 76, 52) -const RED = "#fc4c34"; -// Standard red for errors -const ERROR_RED = "#fc4c34"; - -// ============================================================================ -// Types -// ============================================================================ -interface FormattedMessage { - timestamp: string; - sender: string; - content: string; - isFromSelf: boolean; -} - -// ============================================================================ -// Utility Functions -// ============================================================================ -const isGroup = (conversation: Conversation): conversation is Group => { - return conversation.constructor.name === "Group"; -}; - -const isDm = (conversation: Conversation): conversation is Dm => { - return conversation.constructor.name === "Dm"; -}; - -const isEthAddress = (identifier: string): boolean => { - return identifier.startsWith("0x") && identifier.length === 42; -}; - -const handleError = ( - error: unknown, - setError: (msg: string) => void, - context: string, - clearAfter?: number, -): void => { - const err = error as Error; - setError(`${context}: ${err.message}`); - - // Auto-clear error after specified time (default 5 seconds) - if (clearAfter) { - setTimeout(() => { - setError(""); - }, clearAfter); - } -}; - -// ============================================================================ -// Reusable UI Components -// ============================================================================ -interface StatusBoxProps { - children: React.ReactNode; - color?: string; - borderColor?: string; -} - -const StatusBox: React.FC = ({ - children, - color = ERROR_RED, - borderColor = ERROR_RED, -}) => ( - - - {children} - - -); - -interface InfoTextProps { - children: React.ReactNode; - marginTop?: number; -} - -const InfoText: React.FC = ({ children, marginTop = 1 }) => ( - - {children} - -); - -// ============================================================================ -// Header Component -// ============================================================================ -interface HeaderProps { - conversation: Conversation | null; - env: XmtpEnv; - url: string; - conversations: number; - installations: number; - address: string; - inboxId: string; - peerAddress: string; -} - -const Header: React.FC = ({ - conversation, - conversations, - env, - url, - installations, - address, - inboxId, - peerAddress, -}) => { - const logoLines = [ - " ██╗ ██╗███╗ ███╗████████╗██████╗ ", - " ╚██╗██╔╝████╗ ████║╚══██╔══╝██╔══██╗", - " ╚███╔╝ ██╔████╔██║ ██║ ██████╔╝", - " ██╔██╗ ██║╚██╔╝██║ ██║ ██╔═══╝ ", - " ██╔╝ ██╗██║ ╚═╝ ██║ ██║ ██║ ", - " ╚═╝ ╚═╝╚═╝ ╚═╝ ╚═╝ ╚═╝ ", - ]; - - if (!conversation) { - // Show initialization header - return ( - - - - {logoLines.map((line, i) => ( - - {line} - - ))} - - - - InboxId: {inboxId.slice(0, 36)}... - - - Address: {address} - - - Conversations: {conversations} - - - Installations: {installations} - - - Network: {env} - - - URL: {url.slice(0, 30)}... - - - - - ); - } - - return ( - - - {isGroup(conversation) ? ( - - {" "} - GROUP: {conversation.name || "Unnamed Group"}{" "} - - ) : ( - - {" "} - DM:{" "} - {peerAddress || - (conversation as Dm).peerInboxId.slice(0, 16) + "..."}{" "} - - )} - - Commands: /list • /back • /exit - - ); -}; - -// ============================================================================ -// Messages Component -// ============================================================================ -interface MessagesProps { - messages: FormattedMessage[]; - height: number; -} - -const Messages: React.FC = ({ messages, height }) => { - // Show last N messages that fit in the height - const visibleMessages = messages.slice(-height); - - // Helper function to format long text with proper indentation - const formatLongText = (text: string, prefix: string) => { - const lines = text.split("\n"); - if (lines.length === 1) { - return text; - } - - // For multi-line content, indent continuation lines - return lines - .map((line, index) => { - if (index === 0) return line; - // Add indentation to match the prefix length - const indent = " ".repeat(prefix.length); - return `${indent}${line}`; - }) - .join("\n"); - }; - - return ( - - {visibleMessages.length === 0 ? ( - No messages yet... - ) : ( - visibleMessages.map((msg, index) => { - const prefix = `[${msg.timestamp}] ${msg.sender}: `; - const formattedContent = formatLongText(msg.content, prefix); - - return ( - - - [{msg.timestamp}] - - {msg.sender}: - - {formattedContent} - - - ); - }) - )} - - ); -}; - -// ============================================================================ -// Input Component -// ============================================================================ -interface InputBoxProps { - value: string; - onChange: (value: string) => void; - onSubmit: (value: string) => void; - placeholder?: string; -} - -const InputBox: React.FC = ({ - value, - onChange, - onSubmit, - placeholder = "Send a message to the agent", -}) => { - return ( - - - - - - ); -}; - -// ============================================================================ -// Conversation List Component -// ============================================================================ -interface ConversationListProps { - conversations: Conversation[]; - currentConversationId: string | null; -} -const getEthereumAddress = async ( - conversation: Conversation, -): Promise => { - const members = await conversation.members(); - - for (const member of members) { - // Get Ethereum address - const ethIdentifier = member.accountIdentifiers.find( - (id) => id.identifierKind === IdentifierKind.Ethereum, - ); - - if (ethIdentifier) { - return ethIdentifier.identifier; - } - } - return null; -}; -const ConversationList: React.FC = ({ - conversations, - currentConversationId, -}) => { - const [addressMap, setAddressMap] = React.useState>( - {}, - ); - const [loading, setLoading] = React.useState(true); - - React.useEffect(() => { - const loadAddresses = async () => { - const newAddressMap: Record = {}; - - for (const conv of conversations) { - if (!isGroup(conv)) { - const address = await getEthereumAddress(conv); - if (address) { - newAddressMap[conv.id] = address; - } - } - } - - setAddressMap(newAddressMap); - setLoading(false); - }; - - loadAddresses(); - }, [conversations]); - - return ( - - Your conversations - - {conversations.length === 0 ? ( - No conversations found - ) : loading ? ( - Loading conversations... - ) : ( - conversations.map((conv, index) => { - const isCurrent = conv.id === currentConversationId; - const label = isCurrent ? "●" : " "; - - if (isGroup(conv)) { - return ( - - {label} - {index + 1}. - [GROUP] - {conv.name || "Unnamed"} - - ); - } else { - const peerShort = addressMap[conv.id]; - if (peerShort) { - return ( - - {label} - {index + 1}. - [DM] - {peerShort} - - ); - } - } - }) - )} - - - Use /chat <number> to switch conversations - - - ); -}; - // ============================================================================ // Main App Component // ============================================================================ @@ -419,368 +70,383 @@ interface AppProps { const App: React.FC = ({ env, agentIdentifiers }) => { const { exit } = useApp(); - const [agent, setAgent] = useState(null); - const [address, setAddress] = useState(""); - const [url, setUrl] = useState(""); - const [installations, setInstallations] = useState(0); - const [inboxId, setInboxId] = useState(""); - const [currentConversation, setCurrentConversation] = - useState(null); - const [messages, setMessages] = useState([]); + + // Global state + const { + showSidebar, + showCommandPalette, + toggleCommandPalette, + setCommandMode, + selectedConversationIndex, + conversations: storeConversations, + setConversations, + statusMessage, + setStatusMessage, + } = useStore(); + + // Local state const [inputValue, setInputValue] = useState(""); - const [conversations, setConversations] = useState([]); - const [showConversationList, setShowConversationList] = useState(false); - const [error, setError] = useState(""); + const [error, setError] = useState(""); const [errorTimeout, setErrorTimeout] = useState(null); - const [loadingStatus, setLoadingStatus] = useState( - "Initializing XMTP cli client...", - ); - const [peerAddress, setPeerAddress] = useState(""); + const [isInputActive, setIsInputActive] = useState(false); + + // Command suggestions state + const [showSuggestions, setShowSuggestions] = useState(false); + const [selectedSuggestionIndex, setSelectedSuggestionIndex] = useState(0); + + + // Handle suggestion navigation + const handleSuggestionNavigation = (direction: 'up' | 'down') => { + if (!showSuggestions || suggestions.length === 0) return; + + if (direction === 'up') { + setSelectedSuggestionIndex(prev => + prev > 0 ? prev - 1 : suggestions.length - 1 + ); + } else { + setSelectedSuggestionIndex(prev => + prev < suggestions.length - 1 ? prev + 1 : 0 + ); + } + }; + + // Handle suggestion selection + const handleSuggestionSelect = (suggestion: CommandSuggestion) => { + // Find the corresponding command + const command = commands.find(cmd => cmd.id === suggestion.id); + if (command) { + setInputValue(`/${command.name.toLowerCase().replace(/\s+/g, '-')}`); + setShowSuggestions(false); + setSelectedSuggestionIndex(0); + } + }; + + // Handle input change with suggestions + const handleInputChange = (value: string) => { + setInputValue(value); + + // Show suggestions when user types "/" + if (value.startsWith("/")) { + setShowSuggestions(true); + setSelectedSuggestionIndex(0); + } else { + setShowSuggestions(false); + setSelectedSuggestionIndex(0); + } + }; + + // Custom keyboard handler for suggestions + useInput((input, key) => { + if (!isInputActive || !showSuggestions) return; + + // Handle arrow keys for suggestion navigation + if (key.upArrow) { + handleSuggestionNavigation('up'); + return; + } + + if (key.downArrow) { + handleSuggestionNavigation('down'); + return; + } + + // Handle tab for suggestion completion + if (key.tab && suggestions.length > 0) { + const selectedSuggestion = suggestions[selectedSuggestionIndex]; + if (selectedSuggestion) { + handleSuggestionSelect(selectedSuggestion); + } + return; + } + + // Handle enter to execute selected suggestion + if (key.return && suggestions.length > 0) { + const selectedSuggestion = suggestions[selectedSuggestionIndex]; + if (selectedSuggestion) { + // Find the corresponding command and execute it + const command = commands.find(cmd => cmd.id === selectedSuggestion.id); + if (command) { + setInputValue(`/${command.name.toLowerCase().replace(/\s+/g, '-')}`); + setShowSuggestions(false); + setSelectedSuggestionIndex(0); + // Execute the command immediately + command.action(); + } + } + return; + } + }, { isActive: isInputActive && showSuggestions }); + + // XMTP hook + const { + agent, + address, + conversations, + currentConversation, + messages, + isLoading, + error: xmtpError, + setCurrentConversationById, + sendMessage, + findOrCreateConversation, + refreshConversations, + } = useXMTP({ + env, + agentIdentifiers, + onError: (err) => setErrorWithTimeout(err), + onStatusChange: (status) => { + if (status) { + // Show loading status + } + }, + }); + + // Update store when conversations change + useEffect(() => { + setConversations(conversations); + }, [conversations, setConversations]); - // Function to set error with auto-clear + // Auto-clear errors const setErrorWithTimeout = (message: string, timeoutMs = 5000) => { setError(message); - if (errorTimeout) { - clearTimeout(errorTimeout); - } + if (errorTimeout) clearTimeout(errorTimeout); const timeout = setTimeout(() => { setError(""); setErrorTimeout(null); }, timeoutMs); setErrorTimeout(timeout); }; - const streamRef = useRef | null>(null); - const isStreamingRef = useRef(false); - - // Initialize agent - useEffect(() => { - const initAgent = async () => { - setLoadingStatus("Initializing XMTP cli client..."); - let walletKey = process.env.XMTP_CLIENT_WALLET_KEY; - let dbEncryptionKey = process.env.XMTP_CLIENT_DB_ENCRYPTION_KEY; + // Commands + const commands: Command[] = [ + { + id: "toggle-sidebar", + name: "Toggle Sidebar", + description: "Show/hide the conversation list", + shortcut: "Cmd+B (macOS) / Ctrl+B", + action: () => useStore.getState().toggleSidebar(), + }, + { + id: "next-conversation", + name: "Next Conversation", + description: "Switch to the next conversation", + shortcut: "Ctrl+N", + action: () => useStore.getState().nextConversation(), + }, + { + id: "prev-conversation", + name: "Previous Conversation", + description: "Switch to the previous conversation", + shortcut: "Ctrl+P", + action: () => useStore.getState().prevConversation(), + }, + { + id: "list-conversations", + name: "List Conversations", + description: "Show all conversations", + action: () => useStore.getState().toggleSidebar(), + }, + { + id: "new-chat", + name: "New Chat", + description: "Start a new conversation", + action: () => { + useStore.getState().setCurrentConversation(null); + useStore.getState().selectConversation(-1); + setIsInputActive(true); + }, + }, + { + id: "quit", + name: "Quit", + description: "Exit the application", + shortcut: "Ctrl+C", + action: () => exit(), + }, + ]; - if (!walletKey || !dbEncryptionKey) { - walletKey = generatePrivateKey(); - dbEncryptionKey = toString(getRandomValues(new Uint8Array(32)), "hex"); + // Command suggestions logic + const getCommandSuggestions = (query: string): CommandSuggestion[] => { + if (!query.startsWith("/")) return []; + + const commandQuery = query.slice(1).toLowerCase(); + return commands.filter(cmd => + cmd.name.toLowerCase().includes(commandQuery) || + cmd.description.toLowerCase().includes(commandQuery) + ).slice(0, 6).map(cmd => ({ + id: cmd.id, + name: cmd.name, + description: cmd.description, + shortcut: cmd.shortcut, + })); + }; + + const suggestions = getCommandSuggestions(inputValue); + + // Keyboard navigation + useKeyboard({ + onSelectConversation: async () => { + // Handle "New Chat" selection or when no conversations exist + if (selectedConversationIndex === -1 || storeConversations.length === 0) { + // "New Chat" selected or no conversations - activate input for typing address + setIsInputActive(true); + return; } + + // Open/switch to the selected conversation + if (storeConversations[selectedConversationIndex]) { + await setCurrentConversationById( + storeConversations[selectedConversationIndex].id, + ); + setIsInputActive(true); // Activate input for chatting + } + }, + onToggleCommandPalette: () => { + toggleCommandPalette(); + }, + onEscape: () => { + if (showCommandPalette) { + toggleCommandPalette(); + return; + } + if (showSuggestions) { + setShowSuggestions(false); + setSelectedSuggestionIndex(0); + return; + } + if (isInputActive) { + setIsInputActive(false); + setInputValue(""); + return; + } + setCommandMode(false); + }, + disabled: isLoading || isInputActive, // Disable when input is active + }); - const user = createUser(walletKey as `0x${string}`); - const signer = createSigner(user); - - // Convert hex string to Uint8Array for dbEncryptionKey - const encryptionKeyBytes = fromString(dbEncryptionKey, "hex"); + // Handle input submit + const handleInputSubmit = async (value: string) => { + if (!value.trim()) return; - const newAgent = await Agent.create(signer, { - env, - dbEncryptionKey: encryptionKeyBytes, - dbPath: (inboxId) => "." + `/cli-${env}-${inboxId.slice(0, 8)}.db3`, - }); + const message = value.trim(); + setInputValue(""); - setAgent(newAgent); - setAddress(newAgent.address || ""); - setInboxId(newAgent.client.inboxId); - setUrl(getTestUrl(newAgent.client) || ""); + // Command mode + if (message.startsWith("/")) { + const cmd = message.slice(1).toLowerCase().trim(); - const finalInboxState = await Client.inboxStateFromInboxIds( - [newAgent.client.inboxId], - env, - ); - setInstallations(finalInboxState[0].installations.length); - - setLoadingStatus("Syncing conversations..."); - // Sync conversations - await newAgent.client.conversations.sync(); - const convList = await newAgent.client.conversations.list(); - setConversations(convList); - - // If agent identifiers provided, create/find conversation - if (agentIdentifiers && agentIdentifiers.length > 0) { - setLoadingStatus("Connecting to agent..."); - const conv = await findOrCreateConversation(newAgent, agentIdentifiers); - if (conv) { - setLoadingStatus("Loading messages..."); - setCurrentConversation(conv); - - // Fetch peer address for DMs - if (!isGroup(conv)) { - const address = await getEthereumAddress(conv); - setPeerAddress(address || ""); - } else { - setPeerAddress(""); - } + if (cmd === "exit" || cmd === "quit") { + exit(); + return; + } - await loadMessages(conv, newAgent); - await startMessageStream(conv, newAgent); - } + if (cmd === "back") { + // Go back to main conversation selector + const store = useStore.getState(); + store.setCurrentConversation(null); + setError(""); + // Also reset selection to "New Chat" and deactivate input + store.selectConversation(-1); + setIsInputActive(false); + // Show status message + setStatusMessage("Returned to main menu"); + // Clear status message after 3 seconds + setTimeout(() => setStatusMessage(""), 3000); + return; } - setLoadingStatus(""); - }; - - initAgent().catch((err) => { - handleError(err, setError, "Failed to initialize"); - setLoadingStatus(""); - }); - }, []); - - // Find or create conversation - const findOrCreateConversation = async ( - agentInstance: Agent, - identifiers: string[], - ): Promise => { - const client = agentInstance.client; - const groupOptions = { - groupName: "CLI Group Chat", - groupDescription: "Group created from CLI", - }; + if (cmd === "list") { + const store = useStore.getState(); + store.toggleSidebar(); + setStatusMessage(store.showSidebar ? "Sidebar shown" : "Sidebar hidden"); + setTimeout(() => setStatusMessage(""), 3000); + return; + } - try { - if (identifiers.length > 1) { - // Create group - const allEthAddresses = identifiers.every(isEthAddress); - - if (allEthAddresses) { - const memberIdentifiers = identifiers.map((id) => ({ - identifier: id, - identifierKind: IdentifierKind.Ethereum, - })); - return await client.conversations.newGroupWithIdentifiers( - memberIdentifiers, - groupOptions, - ); + if (cmd.startsWith("chat ")) { + const parts = cmd.split(" "); + const index = parseInt(parts[1]) - 1; + if ( + !isNaN(index) && + index >= 0 && + index < storeConversations.length + ) { + await setCurrentConversationById(storeConversations[index].id); + setStatusMessage(`Switched to conversation ${index + 1}`); + setTimeout(() => setStatusMessage(""), 3000); + return; } - - return await client.conversations.newGroup(identifiers, groupOptions); + setErrorWithTimeout("Invalid conversation number"); + return; } - // Create/find DM - const identifier = identifiers[0]; - - // Try to find existing conversation - await client.conversations.sync(); - const convs = await client.conversations.list(); - - for (const conv of convs) { - if (!isDm(conv)) continue; - - if (conv.peerInboxId.toLowerCase() === identifier.toLowerCase()) { - return conv; + if (cmd.startsWith("new ")) { + const parts = cmd.split(" "); + const address = parts[1]; + if (!address) { + setErrorWithTimeout("Please provide an address: /new
"); + return; } - - if (isEthAddress(identifier)) { - const members = await conv.members(); - const foundMember = members.find((member) => { - const ethId = member.accountIdentifiers.find( - (id) => id.identifierKind === IdentifierKind.Ethereum, - ); - return ethId?.identifier.toLowerCase() === identifier.toLowerCase(); - }); - - if (foundMember) return conv; + try { + setError(""); + await findOrCreateConversation([address]); + setStatusMessage(`Created conversation with ${address.slice(0, 6)}...${address.slice(-4)}`); + setTimeout(() => setStatusMessage(""), 3000); + return; + } catch (err: unknown) { + setErrorWithTimeout(`Failed to create conversation: ${(err as Error).message}`); + return; } } - // Create new DM - return isEthAddress(identifier) - ? await client.conversations.newDmWithIdentifier({ - identifier, - identifierKind: IdentifierKind.Ethereum, - }) - : await client.conversations.newDm(identifier); - } catch (err: unknown) { - handleError(err, setError, "Failed to create conversation"); - return null; - } - }; - - // Load messages - const loadMessages = async (conv: Conversation, agentInstance: Agent) => { - await conv.sync(); - const msgs = await conv.messages(); - const formatted = msgs - .slice(-50) - .map((msg) => formatMessage(msg, agentInstance)); - setMessages(formatted); - }; - - // Format message - const formatMessage = ( - message: DecodedMessage, - agentInstance: Agent, - ): FormattedMessage => { - const timestamp = message.sentAt.toLocaleTimeString("en-US", { - hour: "2-digit", - minute: "2-digit", - }); - - const isFromSelf = message.senderInboxId === agentInstance.client.inboxId; - const sender = isFromSelf - ? "You" - : agentInstance.address?.slice(0, 4) + - "..." + - agentInstance.address?.slice(-4); - - let content: string; - if (typeof message.content === "string") { - content = message.content; - } else { - // Try to format JSON nicely, fallback to compact if it fails - try { - content = JSON.stringify(message.content, null, 2); - } catch { - content = JSON.stringify(message.content); - } - } - - return { timestamp, sender, content, isFromSelf }; - }; - - // Start message stream - const startMessageStream = async ( - conv: Conversation, - agentInstance: Agent, - ) => { - if (isStreamingRef.current) return; - - isStreamingRef.current = true; - const client = agentInstance.client; - - try { - streamRef.current = await client.conversations.streamAllMessages(); - - (async () => { - if (!streamRef.current) return; - - for await (const message of streamRef.current) { - if (message.conversationId !== conv.id) continue; - - const formatted = formatMessage(message, agentInstance); - setMessages((prev) => [...prev, formatted]); - } - })().catch((err) => { - handleError(err, setError, "Stream error"); - isStreamingRef.current = false; - }); - } catch (err: unknown) { - handleError(err, setError, "Failed to start stream"); - isStreamingRef.current = false; - } - }; - - // Command handlers - const commands = { - "/exit": () => exit(), - "/back": () => { - setCurrentConversation(null); - setPeerAddress(""); - setMessages([]); - setShowConversationList(false); - }, - "/list": () => setShowConversationList((prev) => !prev), - }; - - const handleChatCommand = async (message: string) => { - const parts = message.split(" "); - if (parts.length !== 2) { - setErrorWithTimeout("Usage: /chat "); - return; - } - - const index = parseInt(parts[1]) - 1; - if (isNaN(index) || index < 0 || index >= conversations.length) { - setErrorWithTimeout("Invalid conversation number"); - return; - } - - const newConv = conversations[index]; - setCurrentConversation(newConv); - setShowConversationList(false); - - // Fetch peer address for DMs - if (!isGroup(newConv)) { - const address = await getEthereumAddress(newConv); - setPeerAddress(address || ""); - } else { - setPeerAddress(""); - } - - if (agent) { - await loadMessages(newConv, agent); - await startMessageStream(newConv, agent); - } - }; - - // Handle input submit - const handleSubmit = async (value: string) => { - if (!value.trim()) return; - - const message = value.trim(); - setInputValue(""); - - // Handle direct commands - if (commands[message as keyof typeof commands]) { - commands[message as keyof typeof commands](); - return; - } - - // Handle /chat command - if (message.startsWith("/chat ")) { - await handleChatCommand(message); - return; - } - - // If not in a conversation, try to connect to agent address - if (!currentConversation) { - if (agent) { + if (cmd === "refresh") { try { - const conv = await findOrCreateConversation(agent, [message]); - if (conv) { - setCurrentConversation(conv); - - // Fetch peer address for DMs - if (!isGroup(conv)) { - const address = await getEthereumAddress(conv); - setPeerAddress(address || ""); - } else { - setPeerAddress(""); - } - - await loadMessages(conv, agent); - await startMessageStream(conv, agent); - return; + setError(""); + if (agent) { + setStatusMessage("Refreshing conversations..."); + await refreshConversations(); + setStatusMessage(`Found ${conversations.length} conversations`); + setTimeout(() => setStatusMessage(""), 3000); + } else { + setErrorWithTimeout("Not connected to XMTP"); } + return; } catch (err: unknown) { - handleError(err, setError, "Failed to connect to agent"); + setErrorWithTimeout(`Failed to refresh: ${(err as Error).message}`); return; } } - setErrorWithTimeout( - "No active conversation. Use /list to see available chats or /chat to select one.", - ); + + setErrorWithTimeout("Unknown command. Try /back, /list, /chat , /new
, /refresh, or /exit"); return; } - // Send message - if (!agent) { - setErrorWithTimeout("Agent not initialized"); + // If not in a conversation, try to connect to address + if (!currentConversation) { + try { + setError(""); + await findOrCreateConversation([message]); + } catch (err: unknown) { + setErrorWithTimeout(`Failed to connect: ${(err as Error).message}`); + } return; } + // Send message try { - await currentConversation.send(message); + await sendMessage(message); } catch (err: unknown) { - handleError(err, setError, "Failed to send"); + setErrorWithTimeout(`Failed to send: ${(err as Error).message}`); } }; // Show loading state - if (!agent || loadingStatus) { + if (isLoading || !agent) { return ( - + - 🔄 {loadingStatus} + 🔄 Initializing XMTP Client... {agent && ( @@ -796,53 +462,30 @@ const App: React.FC = ({ env, agentIdentifiers }) => { } return ( - -
- - {/* Show error inline if present */} - {error && ( - - - Error: {error} - - - )} - - {showConversationList && ( - - )} - - {currentConversation && } - - - - {!currentConversation && conversations.length > 0 && ( - - Available commands: /list, /chat <number>, /exit - - )} - + cmd.action()} + onCommandPaletteClose={() => toggleCommandPalette()} + suggestions={suggestions} + selectedSuggestionIndex={selectedSuggestionIndex} + showSuggestions={showSuggestions} + onSuggestionSelect={handleSuggestionSelect} + /> ); }; @@ -871,17 +514,13 @@ function parseArgs(): { env: XmtpEnv; help: boolean; agents?: string[] } { } } - // Auto-detect agent address if not provided and we're in dev environment - if (agents.length === 0 && env === "dev") { - // Try to get agent address from environment or use the known dev agent address - const autoAgentAddressKey = process.env.XMTP_WALLET_KEY || ""; - const autoAgentAddress = privateKeyToAddress( - autoAgentAddressKey as `0x${string}`, - ); - if (autoAgentAddress) { - agents.push(autoAgentAddress); + // Auto-detect agent address if not provided + if (agents.length === 0) { + const walletKey = process.env.XMTP_WALLET_KEY || ""; + if (walletKey) { + const publicKey = privateKeyToAddress(walletKey as `0x${string}`); + agents.push(publicKey); } - console.log(`🔗 Auto-connecting to agent: ${autoAgentAddress}`); } return { env, help, agents: agents.length > 0 ? agents : undefined }; @@ -894,19 +533,11 @@ async function main(): Promise { showHelp(); process.exit(0); } - // Create a mutable array of agent identifiers - const agentIdentifiers = agents ? [...agents] : []; - // If no agents specified, use the agent from XMTP_WALLET_KEY - if (agentIdentifiers.length === 0) { - const walletKey = process.env.XMTP_WALLET_KEY || ""; - if (walletKey) { - const publicKey = privateKeyToAddress(walletKey as `0x${string}`); - agentIdentifiers.push(publicKey); - } - } + const agentIdentifiers = agents ? [...agents] : []; render(); } void main(); + diff --git a/src/components/ChatView.tsx b/src/components/ChatView.tsx new file mode 100644 index 0000000..496beb3 --- /dev/null +++ b/src/components/ChatView.tsx @@ -0,0 +1,96 @@ +import React from "react"; +import { Box, Text } from "ink"; +import type { FormattedMessage, ConversationInfo } from "../types/index.js"; +import { ConversationSelector } from "./ConversationSelector.js"; + +const RED = "#fc4c34"; + +interface ChatViewProps { + conversation: ConversationInfo | null; + messages: FormattedMessage[]; + height?: number; + // Conversation selector props + allConversations?: ConversationInfo[]; + selectedConversationIndex?: number; + onSelectConversation?: (index: number) => void; +} + +export const ChatView: React.FC = ({ + conversation, + messages, + height = 15, + allConversations = [], + selectedConversationIndex = 0, + onSelectConversation, +}) => { + // Show last N messages that fit in the height + const visibleMessages = messages.slice(-height); + + // Helper function to format long text with proper indentation + const formatLongText = (text: string, prefix: string) => { + const lines = text.split("\n"); + if (lines.length === 1) { + return text; + } + + // For multi-line content, indent continuation lines + return lines + .map((line, index) => { + if (index === 0) return line; + // Add indentation to match the prefix length + const indent = " ".repeat(prefix.length); + return `${indent}${line}`; + }) + .join("\n"); + }; + + if (!conversation) { + // Show conversation selector instead of empty state + return ( + + {})} + /> + + ); + } + + return ( + + {/* Chat header */} + + + {conversation.type === "group" ? "👥 GROUP: " : "💬 DM: "} + {conversation.name} + + + + {/* Messages */} + + {visibleMessages.length === 0 ? ( + No messages yet... + ) : ( + visibleMessages.map((msg) => { + const prefix = `[${msg.timestamp}] ${msg.sender}: `; + const formattedContent = formatLongText(msg.content, prefix); + + return ( + + + [{msg.timestamp}] + + {msg.sender}: + + {formattedContent} + + + ); + }) + )} + + + ); +}; + diff --git a/src/components/CommandPalette.tsx b/src/components/CommandPalette.tsx new file mode 100644 index 0000000..59b9ad3 --- /dev/null +++ b/src/components/CommandPalette.tsx @@ -0,0 +1,138 @@ +import React, { useState, useEffect } from "react"; +import { Box, Text, useInput } from "ink"; +import TextInput from "ink-text-input"; + +const RED = "#fc4c34"; + +export interface Command { + id: string; + name: string; + description: string; + shortcut?: string; + action: () => void; +} + +interface CommandPaletteProps { + commands: Command[]; + onClose: () => void; + onExecute: (command: Command) => void; +} + +export const CommandPalette: React.FC = ({ + commands, + onClose, + onExecute, +}) => { + const [query, setQuery] = useState(""); + const [selectedIndex, setSelectedIndex] = useState(0); + + // Filter commands based on query + const filteredCommands = commands.filter( + (cmd) => + cmd.name.toLowerCase().includes(query.toLowerCase()) || + cmd.description.toLowerCase().includes(query.toLowerCase()), + ); + + // Reset selected index when query changes + useEffect(() => { + setSelectedIndex(0); + }, [query]); + + // Keyboard navigation + useInput((input, key) => { + if (key.upArrow) { + setSelectedIndex(prev => + prev > 0 ? prev - 1 : filteredCommands.length - 1 + ); + return; + } + + if (key.downArrow) { + setSelectedIndex(prev => + prev < filteredCommands.length - 1 ? prev + 1 : 0 + ); + return; + } + + if (key.return) { + if (filteredCommands.length > 0) { + onExecute(filteredCommands[selectedIndex]); + onClose(); + } + return; + } + + if (key.escape) { + onClose(); + return; + } + }); + + const handleSubmit = () => { + if (filteredCommands.length > 0) { + onExecute(filteredCommands[selectedIndex]); + onClose(); + } + }; + + return ( + + {/* Header */} + + + Command Palette + + (Press Esc to close) + + + {/* Search input */} + + + + + + {/* Command list */} + + {filteredCommands.length === 0 ? ( + No commands found + ) : ( + filteredCommands.slice(0, 10).map((cmd, index) => { + const isSelected = index === selectedIndex; + return ( + + + {isSelected ? "▶ " : " "} + + + {cmd.name} + + - {cmd.description} + {cmd.shortcut && ( + ({cmd.shortcut}) + )} + + ); + }) + )} + + + {/* Footer */} + + ↑↓: Navigate • Enter: Execute • Esc: Close + + + ); +}; + diff --git a/src/components/CommandSuggestions.tsx b/src/components/CommandSuggestions.tsx new file mode 100644 index 0000000..1332a4c --- /dev/null +++ b/src/components/CommandSuggestions.tsx @@ -0,0 +1,71 @@ +import React from "react"; +import { Box, Text } from "ink"; + +const RED = "#fc4c34"; + +export interface CommandSuggestion { + id: string; + name: string; + description: string; + shortcut?: string; +} + +interface CommandSuggestionsProps { + suggestions: CommandSuggestion[]; + selectedIndex: number; + query: string; + visible: boolean; +} + +export const CommandSuggestions: React.FC = ({ + suggestions, + selectedIndex, + query, + visible, +}) => { + if (!visible || suggestions.length === 0) { + return null; + } + + return ( + + + + 💡 Command suggestions for "{query}" + + + + + {suggestions.slice(0, 6).map((suggestion, index) => { + const isSelected = index === selectedIndex; + return ( + + {isSelected && ( + + )} + + /{suggestion.name} + + - {suggestion.description} + {suggestion.shortcut && ( + ({suggestion.shortcut}) + )} + + ); + })} + + + + ↑↓: Navigate • Tab: Complete • Enter: Execute • Esc: Close + + + ); +}; \ No newline at end of file diff --git a/src/components/ConversationSelector.tsx b/src/components/ConversationSelector.tsx new file mode 100644 index 0000000..67f262f --- /dev/null +++ b/src/components/ConversationSelector.tsx @@ -0,0 +1,140 @@ +import React from "react"; +import { Box, Text } from "ink"; +import type { ConversationInfo } from "../types/index.js"; +import { formatTime } from "../utils/formatters.js"; + +const RED = "#fc4c34"; + +interface ConversationSelectorProps { + conversations: ConversationInfo[]; + selectedIndex: number; + onSelect: (index: number) => void; +} + +export const ConversationSelector: React.FC = ({ + conversations, + selectedIndex, +}) => { + return ( + + {/* Header */} + + + 📱 XMTP Chat - Main Menu + + + + 💡 TIP: Use ↑↓ arrows to navigate, then press Enter + + + + + {/* New Chat Option */} + + + {selectedIndex === -1 ? "▶ " : " "} + ➕ New Chat + + + {selectedIndex === -1 && ( + + + Press Enter, then type an address + + + )} + + {/* Divider */} + {conversations.length > 0 && ( + + ────────────────────────────────────── + + )} + + {/* Conversation List */} + + {conversations.length === 0 ? ( + + 📭 No conversations yet! + + + Select "New Chat" above to start chatting + + + + ) : ( + <> + + 💬 Your Conversations: + + {conversations.map((conv, index) => { + const isSelected = index === selectedIndex; + const hasUnread = conv.unreadCount > 0; + + return ( + + {/* Selection indicator */} + + {isSelected ? "▶ " : " "} + + + {/* Type badge */} + + {conv.type === "group" ? "👥" : "👤"} + + + {/* Name */} + + {" "} + {conv.name} + + + {/* Last message preview */} + {conv.lastMessage && ( + + {" "} + - {conv.lastMessage.slice(0, 30)} + {conv.lastMessage.length > 30 ? "..." : ""} + + )} + + {/* Time */} + {conv.lastMessageAt && ( + ({formatTime(conv.lastMessageAt)}) + )} + + {/* Unread count */} + {hasUnread && ( + + {" "} + ({conv.unreadCount}) + + )} + + ); + })} + + )} + + + {/* Navigation hints */} + + ⌨️ Controls: + ↑↓: Navigate • Enter: Select • Esc: Back + + + ); +}; + diff --git a/src/components/Input.tsx b/src/components/Input.tsx new file mode 100644 index 0000000..a64bd19 --- /dev/null +++ b/src/components/Input.tsx @@ -0,0 +1,70 @@ +import React from "react"; +import { Box, Text } from "ink"; +import TextInput from "ink-text-input"; +import { CommandSuggestions, CommandSuggestion } from "./CommandSuggestions"; + +const RED = "#fc4c34"; + +interface InputProps { + value: string; + onChange: (value: string) => void; + onSubmit: (value: string) => void; + placeholder?: string; + commandMode?: boolean; + suggestions?: CommandSuggestion[]; + selectedSuggestionIndex?: number; + showSuggestions?: boolean; + onSuggestionSelect?: (suggestion: CommandSuggestion) => void; +} + +export const Input: React.FC = ({ + value, + onChange, + onSubmit, + placeholder = "Type a message...", + commandMode = false, + suggestions = [], + selectedSuggestionIndex = 0, + showSuggestions = false, + onSuggestionSelect, +}) => { + return ( + + + + + + + + + + {/* Command suggestions */} + + + {commandMode && !showSuggestions && ( + + + 💡 Press Enter to execute command + + + )} + + ); +}; + diff --git a/src/components/Layout.tsx b/src/components/Layout.tsx new file mode 100644 index 0000000..d9d5a7d --- /dev/null +++ b/src/components/Layout.tsx @@ -0,0 +1,169 @@ +import React from "react"; +import { Box, Text } from "ink"; +import { Sidebar } from "./Sidebar.js"; +import { ChatView } from "./ChatView.js"; +import { StatusBar } from "./StatusBar.js"; +import { Input } from "./Input.js"; +import { CommandPalette, type Command } from "./CommandPalette.js"; +import { CommandSuggestion } from "./CommandSuggestions.js"; +import type { ConversationInfo, FormattedMessage } from "../types/index.js"; + +interface LayoutProps { + // Sidebar props + conversations: ConversationInfo[]; + selectedConversationIndex: number; + showSidebar: boolean; + + // Chat props + currentConversation: ConversationInfo | null; + messages: FormattedMessage[]; + + // Input props + inputValue: string; + onInputChange: (value: string) => void; + onInputSubmit: (value: string) => void; + commandMode: boolean; + isInputActive?: boolean; + + // Status bar props + connectionStatus: "connected" | "disconnected" | "connecting"; + address: string; + error?: string; + statusMessage?: string; + + // Command palette props + showCommandPalette: boolean; + commands: Command[]; + onCommandExecute: (command: Command) => void; + onCommandPaletteClose: () => void; + + // Command suggestions props + suggestions?: CommandSuggestion[]; + selectedSuggestionIndex?: number; + showSuggestions?: boolean; + onSuggestionSelect?: (suggestion: CommandSuggestion) => void; +} + +export const Layout: React.FC = ({ + conversations, + selectedConversationIndex, + showSidebar, + currentConversation, + messages, + inputValue, + onInputChange, + onInputSubmit, + commandMode, + isInputActive = false, + connectionStatus, + address, + error, + statusMessage, + showCommandPalette, + commands, + onCommandExecute, + onCommandPaletteClose, + suggestions = [], + selectedSuggestionIndex = 0, + showSuggestions = false, + onSuggestionSelect, +}) => { + return ( + + {/* Main content area */} + + {/* Sidebar */} + {showSidebar && ( + + )} + + {/* Chat view + Input (right side) - wrapped in border */} + + {/* Chat view */} + { + // This will be handled by the main app + }} + /> + + {/* Input inside chat window border */} + + {isInputActive || currentConversation ? ( + + ) : ( + + + {conversations.length === 0 + ? "No conversations available. Press Enter to start a new chat..." + : selectedConversationIndex === -1 + ? "Press Enter to start typing address..." + : "↑↓ to navigate • Enter to open chat • Type to search"} + + + )} + + + + + {/* Command palette overlay */} + {showCommandPalette && ( + + + + )} + + {/* Status bar */} + + + + + ); +}; + diff --git a/src/components/Sidebar.tsx b/src/components/Sidebar.tsx new file mode 100644 index 0000000..e4d1efb --- /dev/null +++ b/src/components/Sidebar.tsx @@ -0,0 +1,98 @@ +import React from "react"; +import { Box, Text } from "ink"; +import type { ConversationInfo } from "../types/index.js"; + +const RED = "#fc4c34"; +const DIM_RED = "#cc3f2a"; + +interface SidebarProps { + conversations: ConversationInfo[]; + selectedIndex: number; + currentConversationId: string | null; + width?: number; +} + +export const Sidebar: React.FC = ({ + conversations, + selectedIndex, + currentConversationId, + width = 25, +}) => { + return ( + + {/* Header */} + + + Conversations ({conversations.length}) + + + + {/* Conversation List */} + + {conversations.length === 0 ? ( + No conversations + ) : ( + conversations.map((conv, index) => { + const isSelected = index === selectedIndex; + const isCurrent = conv.id === currentConversationId; + const hasUnread = conv.unreadCount > 0; + + return ( + + {/* Selection indicator */} + + {isSelected ? "▶" : " "} + + + {/* Current conversation indicator */} + + {isCurrent ? "●" : " "} + + + {/* Type badge */} + + {conv.type === "group" ? "[G]" : "[D]"} + + + {/* Name */} + + {" "} + {conv.name.length > 20 + ? `${conv.name.slice(0, 6)}...${conv.name.slice(-6)}` + : conv.name.slice(0, width - 12)} + + + {/* Unread count */} + {hasUnread && ( + + {" "} + ({conv.unreadCount}) + + )} + + ); + }) + )} + + + {/* Footer hints */} + + ↑↓:Navigate Enter:Open + + + ); +}; + diff --git a/src/components/StatusBar.tsx b/src/components/StatusBar.tsx new file mode 100644 index 0000000..1b49d2b --- /dev/null +++ b/src/components/StatusBar.tsx @@ -0,0 +1,88 @@ +import React from "react"; +import { Box, Text } from "ink"; + +const RED = "#fc4c34"; + +interface StatusBarProps { + connectionStatus: "connected" | "disconnected" | "connecting"; + address: string; + conversationCount: number; + error?: string; + statusMessage?: string; +} + +export const StatusBar: React.FC = ({ + connectionStatus, + address, + conversationCount, + error, + statusMessage, +}) => { + const statusColor = + connectionStatus === "connected" + ? "green" + : connectionStatus === "connecting" + ? "yellow" + : "red"; + const statusText = + connectionStatus === "connected" + ? "●" + : connectionStatus === "connecting" + ? "◐" + : "○"; + + return ( + + {/* Error bar */} + {error && ( + + ⚠ {error} + + )} + + {/* Status bar */} + + {/* Left side: connection status */} + + {statusText} + + {" "} + {address} + + • {conversationCount} chats + + + ^B: + Sidebar + ^K: + Switch + ^C: + Quit + + + + {/* Status message - at the very bottom */} + {statusMessage && ( + + ✓ {statusMessage} + + )} + + ); +}; + diff --git a/src/hooks/useKeyboard.ts b/src/hooks/useKeyboard.ts new file mode 100644 index 0000000..b502f23 --- /dev/null +++ b/src/hooks/useKeyboard.ts @@ -0,0 +1,120 @@ +import { useInput } from "ink"; +import { useStore } from "../store/state.js"; + +interface UseKeyboardOptions { + onSelectConversation?: () => void; + onSwitchConversation?: (direction: "next" | "prev") => void; + onToggleSidebar?: () => void; + onToggleCommandPalette?: () => void; + onEscape?: () => void; + disabled?: boolean; +} + +export const useKeyboard = (options: UseKeyboardOptions = {}) => { + const { + onSelectConversation, + onSwitchConversation, + onToggleSidebar, + onToggleCommandPalette, + onEscape, + disabled = false, + } = options; + + const { + nextConversation, + prevConversation, + toggleSidebar, + toggleCommandPalette, + showCommandPalette, + currentConversation, + } = useStore(); + + useInput( + (input, key) => { + if (disabled) return; + + // Command palette is open - different keybindings + if (showCommandPalette) { + if (key.escape) { + onEscape?.(); + } + return; + } + + // In main menu (no conversation) - navigation mode + const inMainMenu = !currentConversation; + + // Ctrl+B or Cmd+B - Toggle sidebar (macOS uses Cmd) + if (input === "b" && (key.ctrl || key.meta)) { + onToggleSidebar?.(); + toggleSidebar(); + return; + } + + // Ctrl+K or Cmd+K - Toggle command palette (macOS uses Cmd) + if (input === "k" && (key.ctrl || key.meta)) { + onToggleCommandPalette?.(); + toggleCommandPalette(); + return; + } + + // Ctrl+N - Next conversation + if (input === "n" && key.ctrl) { + onSwitchConversation?.("next"); + nextConversation(); + return; + } + + // Ctrl+P - Previous conversation + if (input === "p" && key.ctrl) { + onSwitchConversation?.("prev"); + prevConversation(); + return; + } + + // Up arrow - Navigate in main menu or switch conversations + if (key.upArrow) { + if (inMainMenu) { + prevConversation(); + } else { + onSwitchConversation?.("prev"); + } + return; + } + + // Down arrow - Navigate in main menu or switch conversations + if (key.downArrow) { + if (inMainMenu) { + nextConversation(); + } else { + onSwitchConversation?.("next"); + } + return; + } + + // Enter - Select conversation (works in main menu and sidebar) + if (key.return) { + onSelectConversation?.(); + return; + } + + // Escape - Go back to main menu or cancel input + if (key.escape) { + onEscape?.(); + if (currentConversation) { + useStore.getState().setCurrentConversation(null); + useStore.getState().selectConversation(-1); + } + return; + } + + // Any other key in main menu - activate input for searching/typing + if (inMainMenu && !key.ctrl && !key.meta && input && input.length === 1) { + // Let the input component handle this + return; + } + }, + { isActive: !disabled }, + ); +}; + diff --git a/src/hooks/useXMTP.ts b/src/hooks/useXMTP.ts new file mode 100644 index 0000000..567cd8a --- /dev/null +++ b/src/hooks/useXMTP.ts @@ -0,0 +1,406 @@ +import { useState, useEffect, useRef } from "react"; +import { + Agent, + IdentifierKind, + type Conversation, + type DecodedMessage, + type XmtpEnv, + type Dm, +} from "@xmtp/agent-sdk"; +import { Client } from "@xmtp/node-sdk"; +import { getTestUrl } from "@xmtp/agent-sdk/debug"; +import { createSigner, createUser } from "@xmtp/agent-sdk/user"; +import { generatePrivateKey } from "viem/accounts"; +import { getRandomValues } from "node:crypto"; +import { fromString, toString } from "uint8arrays"; +import { isGroup, isDm, isEthAddress } from "../utils/helpers.js"; +import { formatMessage } from "../utils/formatters.js"; +import type { ConversationInfo, FormattedMessage } from "../types/index.js"; + +interface UseXMTPOptions { + env: XmtpEnv; + agentIdentifiers?: string[]; + onError?: (error: string) => void; + onStatusChange?: (status: string) => void; +} + +interface UseXMTPReturn { + agent: Agent | null; + address: string; + inboxId: string; + url: string; + installations: number; + conversations: ConversationInfo[]; + currentConversation: ConversationInfo | null; + messages: FormattedMessage[]; + isLoading: boolean; + error: string; + setCurrentConversationById: (id: string) => Promise; + sendMessage: (content: string) => Promise; + findOrCreateConversation: (identifiers: string[]) => Promise; + refreshConversations: () => Promise; +} + +// Helper to get Ethereum address from conversation +const getEthereumAddress = async ( + conversation: Conversation, +): Promise => { + const members = await conversation.members(); + + for (const member of members) { + const ethIdentifier = member.accountIdentifiers.find( + (id) => id.identifierKind === IdentifierKind.Ethereum, + ); + + if (ethIdentifier) { + return ethIdentifier.identifier; + } + } + return null; +}; + +// Convert Conversation to ConversationInfo +const toConversationInfo = async ( + conversation: Conversation, +): Promise => { + const messages = await conversation.messages(); + const lastMessage = messages[messages.length - 1]; + + if (isGroup(conversation)) { + return { + id: conversation.id, + conversation, + name: conversation.name || "Unnamed Group", + type: "group", + unreadCount: 0, + lastMessageAt: lastMessage?.sentAt, + lastMessage: typeof lastMessage?.content === "string" ? lastMessage.content : "", + }; + } else { + const dm = conversation as Dm; + const peerAddress = await getEthereumAddress(conversation); + return { + id: conversation.id, + conversation, + name: peerAddress || dm.peerInboxId.slice(0, 16) + "...", + type: "dm", + peerAddress: peerAddress || undefined, + peerInboxId: dm.peerInboxId, + unreadCount: 0, + lastMessageAt: lastMessage?.sentAt, + lastMessage: typeof lastMessage?.content === "string" ? lastMessage.content : "", + }; + } +}; + +export const useXMTP = (options: UseXMTPOptions): UseXMTPReturn => { + const { env, agentIdentifiers, onError, onStatusChange } = options; + + const [agent, setAgent] = useState(null); + const [address, setAddress] = useState(""); + const [inboxId, setInboxId] = useState(""); + const [url, setUrl] = useState(""); + const [installations, setInstallations] = useState(0); + const [conversations, setConversations] = useState([]); + const [currentConversation, setCurrentConversation] = + useState(null); + const [messages, setMessages] = useState([]); + const [isLoading, setIsLoading] = useState(true); + const [error, setError] = useState(""); + + const streamRef = useRef | null>(null); + const isStreamingRef = useRef(false); + const refreshIntervalRef = useRef(null); + + // Initialize agent + useEffect(() => { + const initAgent = async () => { + try { + onStatusChange?.("Initializing XMTP client..."); + + let walletKey = process.env.XMTP_CLIENT_WALLET_KEY; + let dbEncryptionKey = process.env.XMTP_CLIENT_DB_ENCRYPTION_KEY; + + if (!walletKey || !dbEncryptionKey) { + walletKey = generatePrivateKey(); + dbEncryptionKey = toString(getRandomValues(new Uint8Array(32)), "hex"); + } + + const user = createUser(walletKey as `0x${string}`); + const signer = createSigner(user); + + const encryptionKeyBytes = fromString(dbEncryptionKey, "hex"); + + const newAgent = await Agent.create(signer, { + env, + dbEncryptionKey: encryptionKeyBytes, + dbPath: (inboxId) => "." + `/cli-${env}-${inboxId.slice(0, 8)}.db3`, + }); + + setAgent(newAgent); + setAddress(newAgent.address || ""); + setInboxId(newAgent.client.inboxId); + setUrl(getTestUrl(newAgent.client) || ""); + + const finalInboxState = await Client.inboxStateFromInboxIds( + [newAgent.client.inboxId], + env, + ); + setInstallations(finalInboxState[0].installations.length); + + onStatusChange?.("Syncing conversations..."); + await newAgent.client.conversations.sync(); + const convList = await newAgent.client.conversations.list(); + const conversationInfos = await Promise.all( + convList.map(toConversationInfo), + ); + setConversations(conversationInfos); + + // If agent identifiers provided, create/find conversation + if (agentIdentifiers && agentIdentifiers.length > 0) { + onStatusChange?.("Connecting to conversation..."); + const conv = await findOrCreateConversationInternal( + newAgent, + agentIdentifiers, + ); + if (conv) { + const convInfo = await toConversationInfo(conv); + setCurrentConversation(convInfo); + await loadMessages(conv, newAgent); + await startMessageStream(conv, newAgent); + } + } + + onStatusChange?.(""); + setIsLoading(false); + + // Set up live streaming - refresh conversations every 30 seconds + if (refreshIntervalRef.current) { + clearInterval(refreshIntervalRef.current); + } + refreshIntervalRef.current = setInterval(async () => { + try { + await newAgent.client.conversations.sync(); + const convList = await newAgent.client.conversations.list(); + const conversationInfos = await Promise.all( + convList.map(toConversationInfo), + ); + setConversations(conversationInfos); + } catch (err) { + // Silently fail for background refresh + console.warn("Background refresh failed:", err); + } + }, 30000); // 30 seconds + } catch (err: unknown) { + const errMsg = `Failed to initialize: ${(err as Error).message}`; + setError(errMsg); + onError?.(errMsg); + setIsLoading(false); + } + }; + + initAgent(); + + // Cleanup interval on unmount + return () => { + if (refreshIntervalRef.current) { + clearInterval(refreshIntervalRef.current); + } + }; + }, [env, agentIdentifiers, onError, onStatusChange]); + + // Find or create conversation + const findOrCreateConversationInternal = async ( + agentInstance: Agent, + identifiers: string[], + ): Promise => { + const client = agentInstance.client; + const groupOptions = { + groupName: "CLI Group Chat", + groupDescription: "Group created from CLI", + }; + + try { + if (identifiers.length > 1) { + // Create group + const allEthAddresses = identifiers.every(isEthAddress); + + if (allEthAddresses) { + const memberIdentifiers = identifiers.map((id) => ({ + identifier: id, + identifierKind: IdentifierKind.Ethereum, + })); + return await client.conversations.newGroupWithIdentifiers( + memberIdentifiers, + groupOptions, + ); + } + + return await client.conversations.newGroup(identifiers, groupOptions); + } + + // Create/find DM + const identifier = identifiers[0]; + + // Try to find existing conversation + await client.conversations.sync(); + const convs = await client.conversations.list(); + + for (const conv of convs) { + if (!isDm(conv)) continue; + + if (conv.peerInboxId.toLowerCase() === identifier.toLowerCase()) { + return conv; + } + + if (isEthAddress(identifier)) { + const members = await conv.members(); + const foundMember = members.find((member) => { + const ethId = member.accountIdentifiers.find( + (id) => id.identifierKind === IdentifierKind.Ethereum, + ); + return ethId?.identifier.toLowerCase() === identifier.toLowerCase(); + }); + + if (foundMember) return conv; + } + } + + // Create new DM + return isEthAddress(identifier) + ? await client.conversations.newDmWithIdentifier({ + identifier, + identifierKind: IdentifierKind.Ethereum, + }) + : await client.conversations.newDm(identifier); + } catch (err: unknown) { + const errMsg = `Failed to create conversation: ${(err as Error).message}`; + setError(errMsg); + onError?.(errMsg); + return null; + } + }; + + // Load messages + const loadMessages = async (conv: Conversation, agentInstance: Agent) => { + await conv.sync(); + const msgs = await conv.messages(); + const formatted = msgs + .slice(-50) + .map((msg) => + formatMessage(msg, agentInstance.client.inboxId, agentInstance.address), + ); + setMessages(formatted); + }; + + // Start message stream + const startMessageStream = async ( + conv: Conversation, + agentInstance: Agent, + ) => { + if (isStreamingRef.current) return; + + isStreamingRef.current = true; + const client = agentInstance.client; + + try { + streamRef.current = await client.conversations.streamAllMessages(); + + (async () => { + if (!streamRef.current) return; + + for await (const message of streamRef.current) { + if (message.conversationId !== conv.id) continue; + + const formatted = formatMessage( + message, + agentInstance.client.inboxId, + agentInstance.address, + ); + setMessages((prev) => [...prev, formatted]); + } + })().catch((err) => { + const errMsg = `Stream error: ${(err as Error).message}`; + setError(errMsg); + onError?.(errMsg); + isStreamingRef.current = false; + }); + } catch (err: unknown) { + const errMsg = `Failed to start stream: ${(err as Error).message}`; + setError(errMsg); + onError?.(errMsg); + isStreamingRef.current = false; + } + }; + + // Public methods + const setCurrentConversationById = async (id: string) => { + const conv = conversations.find((c) => c.id === id); + if (conv && agent) { + setCurrentConversation(conv); + await loadMessages(conv.conversation, agent); + await startMessageStream(conv.conversation, agent); + } + }; + + const sendMessage = async (content: string) => { + if (!currentConversation || !agent) { + throw new Error("No active conversation or agent"); + } + + await currentConversation.conversation.send(content); + }; + + const findOrCreateConversation = async (identifiers: string[]) => { + if (!agent) throw new Error("Agent not initialized"); + + const conv = await findOrCreateConversationInternal(agent, identifiers); + if (conv) { + const convInfo = await toConversationInfo(conv); + setCurrentConversation(convInfo); + + // Update conversations list + const exists = conversations.find((c) => c.id === convInfo.id); + if (!exists) { + setConversations([...conversations, convInfo]); + } + + await loadMessages(conv, agent); + await startMessageStream(conv, agent); + } + }; + + const refreshConversations = async () => { + if (!agent) throw new Error("Agent not initialized"); + + try { + // Sync conversations to get latest + await agent.client.conversations.sync(); + const convList = await agent.client.conversations.list(); + const conversationInfos = await Promise.all( + convList.map(toConversationInfo), + ); + setConversations(conversationInfos); + } catch (err: unknown) { + throw new Error(`Failed to refresh conversations: ${(err as Error).message}`); + } + }; + + return { + agent, + address, + inboxId, + url, + installations, + conversations, + currentConversation, + messages, + isLoading, + error, + setCurrentConversationById, + sendMessage, + findOrCreateConversation, + refreshConversations, + }; +}; + diff --git a/src/store/state.ts b/src/store/state.ts new file mode 100644 index 0000000..fa27107 --- /dev/null +++ b/src/store/state.ts @@ -0,0 +1,107 @@ +import { create } from "zustand"; +import type { AppState } from "../types/index.js"; +import type { XmtpEnv } from "@xmtp/agent-sdk"; + +export const useStore = create((set, get) => ({ + // Agent state + agent: null, + address: "", + inboxId: "", + url: "", + installations: 0, + env: (process.env.XMTP_ENV as XmtpEnv) || "production", + + // Conversation state + conversations: [], + currentConversation: null, + messages: [], + + // UI state + showSidebar: true, + showCommandPalette: false, + selectedConversationIndex: -1, // Start with no conversation selected + inputValue: "", + commandMode: false, + + // Status state + isLoading: true, + loadingStatus: "Initializing...", + error: "", + statusMessage: "", + connectionStatus: "connecting", + + // Actions + setAgent: (agent) => + set({ + agent, + address: agent?.address || "", + inboxId: agent?.client?.inboxId || "", + connectionStatus: "connected", + }), + + setConversations: (conversations) => set({ conversations }), + + setCurrentConversation: (conversation) => + set({ + currentConversation: conversation, + selectedConversationIndex: conversation + ? get().conversations.findIndex((c) => c.id === conversation.id) + : 0, + }), + + setMessages: (messages) => set({ messages }), + + addMessage: (message) => + set((state) => ({ messages: [...state.messages, message] })), + + toggleSidebar: () => set((state) => ({ showSidebar: !state.showSidebar })), + + toggleCommandPalette: () => + set((state) => ({ showCommandPalette: !state.showCommandPalette })), + + setInputValue: (inputValue) => set({ inputValue }), + + setError: (error) => set({ error }), + + setStatusMessage: (statusMessage) => set({ statusMessage }), + + setLoadingStatus: (loadingStatus) => + set({ loadingStatus, isLoading: loadingStatus !== "" }), + + nextConversation: () => { + const { conversations, selectedConversationIndex } = get(); + // If no conversations, stay at -1 (no selection) + if (conversations.length === 0) { + set({ selectedConversationIndex: -1 }); + return; + } + // Start from -1 (New Chat) if no conversations, otherwise cycle through + const maxIndex = conversations.length - 1; + const nextIndex = selectedConversationIndex >= maxIndex ? -1 : selectedConversationIndex + 1; + set({ selectedConversationIndex: nextIndex }); + }, + + prevConversation: () => { + const { conversations, selectedConversationIndex } = get(); + // If no conversations, stay at -1 (no selection) + if (conversations.length === 0) { + set({ selectedConversationIndex: -1 }); + return; + } + const maxIndex = conversations.length - 1; + // Cycle: ... -> 2 -> 1 -> 0 -> -1 (New Chat) -> maxIndex -> ... + const prevIndex = selectedConversationIndex <= -1 ? maxIndex : selectedConversationIndex - 1; + set({ selectedConversationIndex: prevIndex }); + }, + + selectConversation: (index) => { + const { conversations } = get(); + // Allow -1 for "New Chat" option + if (index === -1 || (index >= 0 && index < conversations.length)) { + set({ selectedConversationIndex: index }); + } + }, + + setCommandMode: (commandMode) => set({ commandMode }), +})); + diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..5604def --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,78 @@ +import type { Conversation, XmtpEnv } from "@xmtp/agent-sdk"; + +export interface FormattedMessage { + id: string; + timestamp: string; + sender: string; + content: string; + isFromSelf: boolean; + sentAt: Date; +} + +export interface ConversationInfo { + id: string; + conversation: Conversation; + name: string; + type: "dm" | "group"; + peerAddress?: string; + peerInboxId?: string; + unreadCount: number; + lastMessageAt?: Date; + lastMessage?: string; +} + +export interface AppState { + // Agent state + agent: any | null; + address: string; + inboxId: string; + url: string; + installations: number; + env: XmtpEnv; + + // Conversation state + conversations: ConversationInfo[]; + currentConversation: ConversationInfo | null; + messages: FormattedMessage[]; + + // UI state + showSidebar: boolean; + showCommandPalette: boolean; + selectedConversationIndex: number; + inputValue: string; + commandMode: boolean; + + // Status state + isLoading: boolean; + loadingStatus: string; + error: string; + statusMessage: string; + connectionStatus: "connected" | "disconnected" | "connecting"; + + // Actions + setAgent: (agent: any) => void; + setConversations: (conversations: ConversationInfo[]) => void; + setCurrentConversation: (conversation: ConversationInfo | null) => void; + setMessages: (messages: FormattedMessage[]) => void; + addMessage: (message: FormattedMessage) => void; + toggleSidebar: () => void; + toggleCommandPalette: () => void; + setInputValue: (value: string) => void; + setError: (error: string) => void; + setStatusMessage: (message: string) => void; + setLoadingStatus: (status: string) => void; + nextConversation: () => void; + prevConversation: () => void; + selectConversation: (index: number) => void; + setCommandMode: (mode: boolean) => void; +} + +export type KeyBinding = { + key: string; + ctrl?: boolean; + shift?: boolean; + alt?: boolean; + description: string; + action: () => void; +}; + diff --git a/src/utils/formatters.ts b/src/utils/formatters.ts new file mode 100644 index 0000000..dd152d2 --- /dev/null +++ b/src/utils/formatters.ts @@ -0,0 +1,66 @@ +import type { DecodedMessage } from "@xmtp/agent-sdk"; +import type { FormattedMessage } from "../types/index.js"; + +export const formatMessage = ( + message: DecodedMessage, + selfInboxId: string, + selfAddress?: string, +): FormattedMessage => { + const timestamp = message.sentAt.toLocaleTimeString("en-US", { + hour: "2-digit", + minute: "2-digit", + }); + + const isFromSelf = message.senderInboxId === selfInboxId; + const sender = isFromSelf + ? "You" + : selfAddress + ? selfAddress.slice(0, 6) + "..." + selfAddress.slice(-4) + : message.senderInboxId.slice(0, 8) + "..."; + + let content: string; + if (typeof message.content === "string") { + content = message.content; + } else { + try { + content = JSON.stringify(message.content, null, 2); + } catch { + content = JSON.stringify(message.content); + } + } + + return { + id: message.id, + timestamp, + sender, + content, + isFromSelf, + sentAt: message.sentAt, + }; +}; + +export const formatAddress = (address: string, length = 10): string => { + if (address.length <= length) return address; + const start = Math.floor(length / 2); + const end = length - start - 3; + return `${address.slice(0, start)}...${address.slice(-end)}`; +}; + +export const formatTime = (date: Date): string => { + const now = new Date(); + const diffMs = now.getTime() - date.getTime(); + const diffMins = Math.floor(diffMs / 60000); + const diffHours = Math.floor(diffMins / 60); + const diffDays = Math.floor(diffHours / 24); + + if (diffMins < 1) return "now"; + if (diffMins < 60) return `${diffMins}m`; + if (diffHours < 24) return `${diffHours}h`; + if (diffDays < 7) return `${diffDays}d`; + + return date.toLocaleDateString("en-US", { + month: "short", + day: "numeric", + }); +}; + diff --git a/src/utils/helpers.ts b/src/utils/helpers.ts new file mode 100644 index 0000000..0f5e7fe --- /dev/null +++ b/src/utils/helpers.ts @@ -0,0 +1,22 @@ +import type { Conversation, Group, Dm } from "@xmtp/agent-sdk"; + +export const isGroup = (conversation: Conversation): conversation is Group => { + return conversation.constructor.name === "Group"; +}; + +export const isDm = (conversation: Conversation): conversation is Dm => { + return conversation.constructor.name === "Dm"; +}; + +export const isEthAddress = (identifier: string): boolean => { + return identifier.startsWith("0x") && identifier.length === 42; +}; + +export const handleError = ( + error: unknown, + context: string, +): string => { + const err = error as Error; + return `${context}: ${err.message}`; +}; + diff --git a/yarn.lock b/yarn.lock index dca08a9..4a49612 100644 --- a/yarn.lock +++ b/yarn.lock @@ -914,6 +914,13 @@ ajv@^6.12.4: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +ansi-align@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-3.0.1.tgz#0cdf12e111ace773a86e9a1fad1225c43cb19a59" + integrity sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w== + dependencies: + string-width "^4.1.0" + ansi-escapes@^7.0.0: version "7.1.1" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-7.1.1.tgz#fdd39427a7e5a26233e48a8b4366351629ffea1b" @@ -921,6 +928,16 @@ ansi-escapes@^7.0.0: dependencies: environment "^1.0.0" +ansi-regex@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.1.tgz#123d6479e92ad45ad897d4054e3c7ca7db4944e1" + integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== + +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -931,6 +948,13 @@ ansi-regex@^6.0.1: resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1" integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg== +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + ansi-styles@^4.0.0, ansi-styles@^4.1.0: version "4.3.0" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" @@ -958,6 +982,20 @@ balanced-match@^1.0.0: resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee" integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== +boxen@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-3.2.0.tgz#fbdff0de93636ab4450886b6ff45b92d098f45eb" + integrity sha512-cU4J/+NodM3IHdSL2yN8bqYqnmlBTidDR4RC7nJs61ZmtGz8VZzM3HLQX0zY5mrSmPtR3xWwsq2jOUQqFZN8+A== + dependencies: + ansi-align "^3.0.0" + camelcase "^5.3.1" + chalk "^2.4.2" + cli-boxes "^2.2.0" + string-width "^3.0.0" + term-size "^1.2.0" + type-fest "^0.3.0" + widest-line "^2.0.0" + brace-expansion@^1.1.7: version "1.1.12" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.12.tgz#ab9b454466e5a8cc3a187beaad580412a9c5b843" @@ -985,6 +1023,11 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + chalk@4.1.2, chalk@^4.0.0: version "4.1.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" @@ -993,11 +1036,25 @@ chalk@4.1.2, chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@^5.3.0, chalk@^5.6.0: version "5.6.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.6.2.tgz#b1238b6e23ea337af71c7f8a295db5af0c158aea" integrity sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA== +cli-boxes@^2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-2.2.1.tgz#ddd5035d25094fce220e9cab40a45840a440318f" + integrity sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw== + cli-boxes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-3.0.0.tgz#71a10c716feeba005e4504f36329ef0b17cf3145" @@ -1034,6 +1091,13 @@ code-excerpt@^4.0.0: dependencies: convert-to-spaces "^2.0.1" +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + color-convert@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" @@ -1041,6 +1105,11 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + color-name@~1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" @@ -1068,6 +1137,15 @@ convert-to-spaces@^2.0.1: resolved "https://registry.yarnpkg.com/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz#61a6c98f8aa626c16b296b862a91412a33bceb6b" integrity sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ== +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + cross-spawn@^7.0.6: version "7.0.6" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" @@ -1114,6 +1192,11 @@ emoji-regex@^10.3.0: resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-10.6.0.tgz#bf3d6e8f7f8fd22a65d9703475bc0147357a6b0d" integrity sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A== +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -1166,6 +1249,11 @@ escalade@^3.1.1: resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + escape-string-regexp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz#a30304e99daa32e23b2fd20f51babd07cffca344" @@ -1285,6 +1373,19 @@ eventemitter3@5.0.1: resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-5.0.1.tgz#53f5ffd0a492ac800721bb42c66b841de96423c4" integrity sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA== +execa@^0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.7.0.tgz#944becd34cc41ee32a63a9faf27ad5a65fc59777" + integrity sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw== + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" @@ -1378,6 +1479,11 @@ get-east-asian-width@^1.0.0, get-east-asian-width@^1.3.1: resolved "https://registry.yarnpkg.com/get-east-asian-width/-/get-east-asian-width-1.4.0.tgz#9bc4caa131702b4b61729cb7e42735bc550c9ee6" integrity sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q== +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + integrity sha512-GlhdIUuVakc8SJ6kK0zAFbiGzRFzNnY4jUuEbV9UROo4Y+0Ny4fjvcZFVTeDA4odpFyOQzaw6hXukJSq/f28sQ== + get-tsconfig@^4.7.5: version "4.13.0" resolved "https://registry.yarnpkg.com/get-tsconfig/-/get-tsconfig-4.13.0.tgz#fcdd991e6d22ab9a600f00e91c318707a5d9a0d7" @@ -1419,6 +1525,11 @@ graphemer@^1.4.0: resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + has-flag@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" @@ -1452,6 +1563,14 @@ indent-string@^5.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-5.0.0.tgz#4fd2980fccaf8622d14c64d694f4cf33c81951a5" integrity sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg== +ink-box@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/ink-box/-/ink-box-2.0.0.tgz#1bbf4617d6cc18c127b3e38f80b81cf1cc92b4bf" + integrity sha512-GTn8oEl/8U+w5Yrqo75xCnOh835n6upxeTkL2SkSGVt1I5a9ONXjFUHtLORZoh5fNAgImiTz+oT13bOlgaZWKg== + dependencies: + boxen "^3.0.0" + prop-types "^15.7.2" + ink-text-input@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/ink-text-input/-/ink-text-input-6.0.0.tgz#71bdfacbfd161fbaff88bb8ca6b3a55dbc3d36e0" @@ -1494,6 +1613,11 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -1533,6 +1657,11 @@ is-plain-obj@^4.1.0: resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-4.1.0.tgz#d65025edec3657ce032fd7db63c97883eaed71f0" integrity sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg== +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + integrity sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ== + isexe@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" @@ -1543,7 +1672,7 @@ isows@1.0.7: resolved "https://registry.yarnpkg.com/isows/-/isows-1.0.7.tgz#1c06400b7eed216fbba3bcbd68f12490fc342915" integrity sha512-I1fSfDCZL5P0v33sVqeTDSpcstAg/N+wF5HS033mogOVIp4B+oHC7oOCsA3axAbBSGTJ8QubbNmnIRN/h8U7hg== -js-tokens@^4.0.0: +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== @@ -1607,6 +1736,21 @@ long@^5.0.0, long@^5.2.0: resolved "https://registry.yarnpkg.com/long/-/long-5.3.2.tgz#1d84463095999262d7d7b7f8bfd4a8cc55167f83" integrity sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA== +loose-envify@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf" + integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q== + dependencies: + js-tokens "^3.0.0 || ^4.0.0" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz#8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + merge2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" @@ -1654,6 +1798,18 @@ natural-compare@^1.4.0: resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + integrity sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw== + dependencies: + path-key "^2.0.0" + +object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + onetime@^5.1.0: version "5.1.2" resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" @@ -1687,6 +1843,11 @@ ox@0.9.6: abitype "^1.0.9" eventemitter3 "5.0.1" +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + integrity sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow== + p-limit@^3.0.2: version "3.1.0" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b" @@ -1718,6 +1879,11 @@ path-exists@^4.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw== + path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -1763,6 +1929,15 @@ prettier@^3.4.2: resolved "https://registry.yarnpkg.com/prettier/-/prettier-3.6.2.tgz#ccda02a1003ebbb2bfda6f83a074978f608b9393" integrity sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ== +prop-types@^15.7.2: + version "15.8.1" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" + integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== + dependencies: + loose-envify "^1.4.0" + object-assign "^4.1.1" + react-is "^16.13.1" + protobufjs@^7.0.0: version "7.5.4" resolved "https://registry.yarnpkg.com/protobufjs/-/protobufjs-7.5.4.tgz#885d31fe9c4b37f25d1bb600da30b1c5b37d286a" @@ -1781,6 +1956,11 @@ protobufjs@^7.0.0: "@types/node" ">=13.7.0" long "^5.0.0" +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + punycode@^2.1.0: version "2.3.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" @@ -1791,6 +1971,11 @@ queue-microtask@^1.2.2: resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.3.tgz#4929228bbc724dfac43e0efb058caf7b6cfb6243" integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== +react-is@^16.13.1: + version "16.13.1" + resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + react-reconciler@^0.32.0: version "0.32.0" resolved "https://registry.yarnpkg.com/react-reconciler/-/react-reconciler-0.32.0.tgz#a08bcd8c454a4cd839164d6e05926e30a7a7fac2" @@ -1855,6 +2040,13 @@ semver@^7.5.2, semver@^7.6.0, semver@^7.7.1: resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -1862,6 +2054,11 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" @@ -1872,7 +2069,7 @@ shell-quote@1.8.3: resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.8.3.tgz#55e40ef33cf5c689902353a3d8cd1a6725f08b4b" integrity sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw== -signal-exit@^3.0.2, signal-exit@^3.0.7: +signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.7: version "3.0.7" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== @@ -1918,6 +2115,23 @@ stack-utils@^2.0.6: dependencies: escape-string-regexp "^2.0.0" +string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string-width@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: version "4.2.3" resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" @@ -1936,6 +2150,20 @@ string-width@^7.0.0, string-width@^7.2.0: get-east-asian-width "^1.0.0" strip-ansi "^7.1.0" +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow== + dependencies: + ansi-regex "^3.0.0" + +strip-ansi@^5.1.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -1950,6 +2178,11 @@ strip-ansi@^7.1.0: dependencies: ansi-regex "^6.0.1" +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + integrity sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q== + strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" @@ -1962,6 +2195,13 @@ supports-color@8.1.1: dependencies: has-flag "^4.0.0" +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + supports-color@^7.1.0: version "7.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" @@ -1976,6 +2216,13 @@ synckit@0.11.11, synckit@^0.11.7: dependencies: "@pkgr/core" "^0.2.9" +term-size@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/term-size/-/term-size-1.2.0.tgz#458b83887f288fc56d6fffbfad262e26638efa69" + integrity sha512-7dPUZQGy/+m3/wjVz3ZW5dobSoD/02NxJpoXUX0WIyjfVS3l0c+b/+9phIDFA7FHzkYtwtMFgeGZ/Y8jVTeqQQ== + dependencies: + execa "^0.7.0" + tinyglobby@^0.2.12: version "0.2.15" resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2" @@ -2023,6 +2270,11 @@ type-check@^0.4.0, type-check@~0.4.0: dependencies: prelude-ls "^1.2.1" +type-fest@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1" + integrity sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ== + type-fest@^4.18.2, type-fest@^4.27.0: version "4.41.0" resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58" @@ -2088,6 +2340,13 @@ viem@^2.37.6: ox "0.9.6" ws "8.18.3" +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + which@^2.0.1: version "2.0.2" resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" @@ -2095,6 +2354,13 @@ which@^2.0.1: dependencies: isexe "^2.0.0" +widest-line@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.1.tgz#7438764730ec7ef4381ce4df82fb98a53142a3fc" + integrity sha512-Ba5m9/Fa4Xt9eb2ELXt77JxVDV8w7qQrH0zS/TWSJdLyAwQjWoOzpzj5lwVftDz6n/EOu3tNACS84v509qwnJA== + dependencies: + string-width "^2.1.1" + widest-line@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-5.0.0.tgz#b74826a1e480783345f0cd9061b49753c9da70d0" @@ -2135,6 +2401,11 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + yargs-parser@^21.1.1: version "21.1.1" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" @@ -2162,3 +2433,8 @@ yoga-layout@~3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/yoga-layout/-/yoga-layout-3.2.1.tgz#d2d1ba06f0e81c2eb650c3e5ad8b0b4adde1e843" integrity sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ== + +zustand@^5.0.8: + version "5.0.8" + resolved "https://registry.yarnpkg.com/zustand/-/zustand-5.0.8.tgz#b998a0c088c7027a20f2709141a91cb07ac57f8a" + integrity sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw==