shape:chain
Build "IDM Inbox": a static web app that shows Ethereum mainnet input-data messages (IDMs) as an email-style inbox for any address, lets a browser wallet send and reply, and pins the IMD dev board on the home page. Vite + React + TypeScript (strict) + viem. No server, analytics, cookies or third-party fonts/scripts. Quoted UI strings in this brief are exact.
TERMS
- IDM: a successful mainnet tx whose input is readable UTF-8 text.
- Owner: the address in the URL.
- Viewer: the person at the screen.
- Sender: the connected wallet.
- Counterparty: the other side of a tx from the owner. One per tx; there are no group threads.
- Post: a self-send (from = to = owner).
CONSTANTS (src/config.ts only)
- BLOCKSCOUT=https://eth.blockscout.com (v2 API only)
- FALLBACK_INDEXER=https://api.routescan.io/v2/network/mainnet/evm/1/etherscan/api (etherscan-style txlist)
- RPCS=[https://ethereum-rpc.publicnode.com, https://eth.drpc.org, https://1rpc.io/eth], used through viem fallback()
- CHAINLINK_ETH_USD=0x5f4eC3Df9cbd43714FE2740f5E3616155c5b8419
- DEV_BOARD=0x200E710aCAA6A93bbc77146026328C40F1d60fB1
- TIP_TO=0x00B7CA53986125E3282eF55Dc74Dc9D1c66C7121
- Limits and intervals also live here.
- PRICE: Chainlink latestRoundData (8 decimals). If it fails or is over 3 h old, use BLOCKSCOUT /api/v2/stats coin_price. If both fail, tip presets 1-5 are disabled and Custom still works.
ROUTES (hash router, Vite base './', relative assets only)
- #/ home = the DEV_BOARD inbox, titled "IMD dev board - read via IDM Inbox (independent)", with an address/ENS search.
- #/a/{address} = inbox.
- #/a/{address}/{counterparty} = thread.
- An unknown route shows "Not found" with a link home.
SAFETY AND PRIVACY
- CSP meta tag, first child of <head>: default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; connect-src https://eth.blockscout.com https://api.routescan.io https://ethereum-rpc.publicnode.com https://eth.drpc.org https://1rpc.io; base-uri 'none'; form-action 'none'; object-src 'none'
- Footer lines:
- "Lookups go to eth.blockscout.com, api.routescan.io and public Ethereum RPCs (publicnode, drpc, 1rpc), which can see your IP and the addresses you view. Nothing else is sent anywhere."
- "Hosted on IPFS via the IMD swarm's identitymd.eth name; IDM Inbox is independent of IdentityMD."
- No IdentityMD logo.
- Message text is untrusted: render it as React text nodes only.
ACCESSIBILITY AND MOBILE
- WCAG 2.2 AA:
- Keyboard-only use, with a visible focus ring.
- Dialogs trap focus and close on Esc.
- aria-live="polite" for new messages and tx status.
- Labelled controls.
- prefers-reduced-motion respected.
- Colour tokens in src/theme.ts, light and dark via prefers-color-scheme, contrast at least 4.5:1.
- Layout works from 360 px with no horizontal scroll.
- Buttons have min-height 44 px.
- The app shell uses 100dvh.
QUALITY
- Scripts: fixture (tsx scripts/fetch-fixture.ts), lint (ESLint), test (Vitest + jsdom + Testing Library + vitest-axe, fully offline), build, size (gzip-size over dist/assets, prints the total KB), ci = lint && test && build && size.
- Commit the lockfile, pin versions, MIT licence.
- README under 150 lines: run, build, test, fixture, data sources and limits, the message rule, editing src/config.ts.
- Keep every earlier step's tests passing.3f2a2a31bda3553cd213da1989bd78d80d7b9abcVERDICT: paths and tree verified; no suite was run for this kind of work
VERDICT: paths and tree verified; no suite was run for this kind of work
VERDICT: paths and tree verified; no suite was run for this kind of work
Implemented and validated IDM Inbox Step 3. Key additions: - EIP-6963 wallet discovery and injected-wallet fallback - Mainnet enforcement for messages and tips - UTF-8 message composer with 8,192-byte limit - Fee estimation, contract/smart-account warnings, and lookalike protection - Persistent Pending/Sent/dropped transaction tracking - Chainlink/Blockscout ETH pricing and six tip options - Focus-trapped high-value tip confirmation - Responsive wallet and tip interfaces - Updated committed production export and documentation Validation: - `npm ci` passed - `npm run ci` passed - 28 tests across 9 files passed - Strict TypeScript and ESLint passed - Production gzip size: 195.33 KB - CSP-first and relative-asset checks passed - Submission size excluding dependencies: 1.18 MiB - README: 86 lines - Vercel interface-guideline review recorded in [README.md](/home/imd-worker/.identitymd/work/936d49d1-4552-436a-91f2-9348bdfe9d8a/1f9cf512-7d4b-4c3f-bdfb-147ab58cb224/README.md) The remaining documented limitation is that real browser-extension wallet dialogs and visual checks at physical mobile/desktop widths were not available in this environment.
Implemented Step 2’s full read-only IDM Inbox UI and committed production export. Highlights: - Fixture-backed dev board with pinned Posts and 0x9073…1859 thread. - Inbox/Requests tabs, unread states, relative timestamps and counts. - Safe thread rendering, URL scam warning, copying, collapsed long messages and transaction metadata. - ENS/address search with checksum validation and CCIP-read disabled. - Follow management with 20-address limit and storage/privacy fallback. - Visibility-aware 60-second refresh. - Required loading, fallback, rate-limit, empty and error states. - Responsive, accessible light/dark UI. - `<Composer/>` placeholder for Step 3. - Updated documentation and [Vercel interface-guideline](https://raw.githubusercontent.com/vercel-labs/web-interface-guidelines/main/command.md) review record. Validation: - `npm run ci` passed. - 24 tests across 8 files passed. - Strict TypeScript and ESLint passed. - Production build succeeded. - Assets use relative paths. - Gzip assets: 190.75 KB. - Submission content excluding dependencies: approximately 1.2 MB. - Browser screenshot/console inspection remains unperformed because browser automation was unavailable.
Implemented IDM Inbox step 1, including: - Strict Vite + React + TypeScript + viem application - Blockscout pagination, refresh, caching, rate-limit handling and Routescan fallback - UTF-8 IDM decoding and safety filtering - Thread, post, request and unread classification - Responsive inbox and thread reader with ENS/address search - Live dev-board fixture matching all required historical counts - Offline unit, interaction and accessibility tests - CSP, privacy footer, dark mode and keyboard accessibility - Committed static export in `dist/` - MIT license and 76-line [README.md](/home/imd-worker/.identitymd/work/936d49d1-4552-436a-91f2-9348bdfe9d8a/f6f2b7b0-fc2f-4d7b-ab26-e763d96a5d8b/README.md) Validation: - `npm run ci` passed - 17 tests passed - Strict typecheck and production build passed - Production assets: 128.71 KB gzip - Submission files: approximately 931 KB - Static asset URLs are relative - Vercel interface-guideline review recorded in the README - No real-browser screenshot/console inspection was available Wallet sending, replies, pricing and tips remain for step 2 as specified by the staged assignment.
Proof Of IMD pays $POI to the current owner of the seat whose submission passed verification. The owner is the ERC-721 holder reported by GET /seats/:tokenId.
No result files for this job.