/** * Binds the Vest login the extension relays to this machine's Vest firm, so * nobody has to copy a wallet address into the dashboard. * * A Vest firm's only credential here is the wallet of the login whose session * it trades (lib/vest-session.ts). One person per machine, and Vest allows one * profile per person, so the Vest tab signed in on this machine is the one to * trade. It is bound automatically when: * - the firm has no credential yet. A saved one is never replaced: someone * chose it, and a different login in the tab is a mistake to flag (the * client says so), not one to follow; * - exactly one wallet has a live relayed session. Two logins in two tabs * can't be told apart, so the dashboard's one-click form decides. */ import { getCachedCatalog } from './firm-catalog'; import { getCredentials, setCredentials } from './db'; import { listVestSessions } from './vest-session'; import { reconcileClients } from './clients'; import { scheduleBackupPush } from './backup-sync'; /** Bind the relayed wallet to every Vest firm here that has no credential. * Returns the names of the firms it bound. */ export function autoBindVestWallet(now = Date.now()): string[] { const live = [...new Set(listVestSessions().filter((s) => s.expiresAt > now).map((s) => s.primaryAddr))]; if (live.length !== 1) return []; const wallet = live[0]; const bound: string[] = []; for (const firm of getCachedCatalog()) { if (firm.platform !== 'vest') continue; const creds = getCredentials(firm.id); if (creds && (creds.apiKey || creds.username || creds.password)) continue; setCredentials(firm.id, firm.name, '', '', wallet); bound.push(firm.name); console.log(`[vest] ${firm.name}: bound to wallet ${wallet}, the Vest login signed in on this machine`); } if (bound.length > 0) { reconcileClients(); scheduleBackupPush(); } return bound; }