Data Flows & Messaging
1. Data Flows & Messaging
1.1 Wallet Connection
flowchart TD
A["User clicks Connect Wallet"] --> B["popup.tsx: connectWallet()"]
B --> C["chrome.runtime.sendMessage<br/>{ type: CONNECT_WALLET }"]
C --> D["background.ts: handleConnectWallet()"]
D --> E["getActiveTabId()"]
E --> F["executeInMainWorld(tabId,<br/>() => !!window.ethereum)<br/>Check provider"]
F --> G["executeInMainWorld(tabId,<br/>() => eth_requestAccounts)<br/>Request accounts"]
G --> H["executeInMainWorld(tabId,<br/>() => window.ethereum.chainId)<br/>Get chain"]
H --> I["updateWalletState(<br/>{ address, chainId, connected: true })"]
I --> J["chrome.storage.local.set({ walletState })"]
J --> K["Return WalletState"]
K --> L["setWallet(response)"]
L --> M["UI update"]
1.2 dApp Safety Check (Auto)
flowchart TD
A["User visits webpage"] --> B["dapp-checker.tsx: detectDApp() === true"]
B --> C["chrome.runtime.sendMessage<br/>{ type: CHECK_DAPP, url }"]
C --> D["background.ts: handleCheckDapp(url)"]
D --> E["Parse hostname, check cache"]
E --> F["Tier 1: Local safe/scam lists"]
F --> G{Match found?}
G -->|Scam| H["Return { level: danger }"]
G -->|Safe| I["Return { level: safe }"]
G -->|No match| J["Tier 2: DOMAN API<br/>GET /api/v1/check-domain"]
J --> K{DOMAN data?}
K -->|isScam = true| H
K -->|riskScore < 40| I
K -->|riskScore >= 60| L["Return { level: warning }"]
K -->|No data / error| M["Tier 3: GoPlus API<br/>/api/v1/phishing_site?url=..."]
M --> N{Is phishing?}
N -->|Yes| H
N -->|No| L
H --> O["Cache result (10 min TTL)"]
I --> O
L --> O
O --> P["Return { level, reason }"]
P --> Q{level is danger/warning?}
Q -->|Yes| R["Show banner overlay"]
A --> S["contents/index.tsx: also runs CHECK_DAPP"]
S --> T["chrome.runtime.sendMessage<br/>{ type: DAPP_RESULT, level, hostname }"]
T --> U["background.ts: setDappActionBadge(tabId, level)"]
U --> V["chrome.action.setBadgeText({ text, tabId })"]
V --> W["chrome.action.setBadgeBackgroundColor({ color, tabId })"]
1.3 Address Check
flowchart TD
A["User inputs address/ENS/domain<br/>and clicks Check"] --> B["popup.tsx: checkAddress()"]
B --> C["chrome.runtime.sendMessage<br/>{ type: CHECK_ADDRESS, address }"]
C --> D["background.ts: handleCheckAddress(input)"]
D --> E["scanInputApi(input)<br/>Universal scan"]
E --> F["checkAddressApi(address)<br/>Detailed check (if valid address)"]
F --> G["Return { success, data: { inputType,<br/>address, riskScore, ... } }"]
G --> H["setAddressResult(data)"]
H --> I["loadAddressTags(address)"]
I --> J["chrome.runtime.sendMessage<br/>{ type: GET_ADDRESS_TAGS, address }"]
J --> K["background.ts: handleGetAddressTags()"]
K --> L["getAddressTagsApi(address)"]
L --> M["Return { success, data: { tags: [...] } }"]
M --> N["setAddressTags(tags)"]
1.4 Wallet Events (Real-time)
flowchart TD
A["MetaMask: accountsChanged / chainChanged"] --> B["MAIN world listener<br/>(injected by background)"]
B --> C["window.dispatchEvent<br/>('doman-wallet-event', { event, data })"]
C --> D["wallet-bridge.ts<br/>(ISOLATED world listener)"]
D --> E["chrome.runtime.sendMessage<br/>{ type: INPAGE_EVENT, event, data }"]
E --> F["background.ts: handleWalletEvent()"]
F --> G["updateWalletState({ address / chainId })"]
G --> H["chrome.storage.local.set({ walletState })"]
H --> I["chrome.storage.onChanged fires"]
I --> J["popup.tsx: handleStorageChange()"]
J --> K["setWallet(newValue)"]
1.5 Page Status (On Popup Open)
flowchart TD
A["Popup opens"] --> B["popup.tsx: useEffect -> loadPageStatus()"]
B --> C["chrome.tabs.query({ active: true })"]
C --> D["chrome.runtime.sendMessage<br/>{ type: GET_PAGE_STATUS, url }"]
D --> E["background.ts: handleGetPageStatus(url)"]
E --> F["handleCheckDapp(url)<br/>Safety check"]
E --> G["checkDomainApi(domain)<br/>API check"]
F --> H["Return { safetyLevel, reason,<br/>isScam, riskScore, category }"]
G --> H
H --> I["setPageSafety(level)"]
I --> J["setPageReason(reason)"]