The README's 1.0 non-goal said Ethereum mainnet only, while Sepolia ships as a selectable network. It now puts mainnet and Sepolia in scope and other chains out of it. The injected provider's flag named after the other wallet stays, as an interface-compatibility flag many dApps check. It is now written down as an exception to the rule against naming competitors, in the README's Policies section and in RULES.md, and the comment beside it says so. Neither document spells the name, so script/check-censored, which already allows the flag only in src/content/inpage.js and its built copies, is unchanged. Model: opus-5-5
5.3 KiB
5.3 KiB
⚠️ THIS FILE MUST NEVER BE MODIFIED BY AGENTS. RULES.md is maintained exclusively by the project owner. AI agents, bots, and automated tools must treat this file as read-only. If an audit finds a divergence between the code and this file, the code must be changed to match — never the other way around.
AutistMask Rules Checklist
This file is derived from README.md and REPO_POLICIES.md for use as an audit checklist. The authoritative policies are in those two files. If this file contradicts either, the originals govern.
Cryptography
- No raw crypto primitives in application code (
aes,sha,pbkdf,hmac,encrypt,decrypt,hash,cipher,digest,sign) - All crypto goes through
ethersorlibsodium-wrappers-sumo - No exceptions without an explicit code comment citing the Crypto Policy
- Secrets encrypted at rest with Argon2id + XSalsa20-Poly1305
- Password never used in address derivation (encryption only)
External Communication
- Extension contacts exactly three external services: configured RPC endpoint, CoinDesk price API, and Blockscout block-explorer API
- No analytics, telemetry, or tracking
- No user-specific data sent except to the configured RPC endpoint
- No Infura/Alchemy hard dependency
- No backend servers operated by the developer
- RPC endpoint is user-configurable (defaults to publicnode.com)
Dependencies
- Four runtime libraries only:
ethers,libsodium-wrappers-sumo,qrcode,ethereum-blockies-base64 - No JS framework (React, Vue, Svelte, etc.)
- All external references pinned by cryptographic hash (per REPO_POLICIES)
Address Display & Anti-Spoofing
- Addresses displayed in full in all critical contexts (tx confirmation, send confirmation, transaction detail)
truncateMiddle()removes at most 10 characters — enforced in code- Caller floor for address truncation is 32 characters minimum
- Clicking any address copies the full untruncated value
- Known token symbol verification: transfers claiming a known symbol from an unrecognized contract are filtered
- Tokens with < 1,000 holders hidden from tx history and send selector
- Dust transactions below configurable threshold hidden
- Fraud contract blocklist applied to tx history
Display Consistency
- Token/ETH amounts: exactly 4 decimal places in all summary views
- Transaction detail view: exact untruncated amount (full precision)
- Transaction detail view: native quantity shown (wei / base units)
- Both amount and native quantity are click-copyable
- Timestamps: ISO datetime + relative age, everywhere they appear
- Same data formatted identically across all screens
No Layout Shift
- All async-populated elements have
min-heightor placeholder content formatUsd(null)returns""— callers must use fallbackvisibility: hiddenpreferred overdisplay: nonewhen space must be preserved- No UI element moves when async data (prices, balances, tx lists) arrives
Clickable Affordance
- Every button has visible border, padding, and hover state
- Every clickable text element has underline or dashed underline
- No invisible hit targets
DEBUG Mode
- DEBUG mode only enables: red banner + hardcoded test mnemonic
- No
if (DEBUG)branches that skip functionality or bypass security - New DEBUG conditionals require explicit project owner approval
Transaction Decoding
- Decoding is best-effort display convenience only
- No protocol gets special handling beyond the confirmation screen
- If decoding fails, raw calldata displayed in full (not truncated)
- Decoders are self-contained modules in
src/shared/
Approval Flow
- Site connection: explicit user approval via popup
- Transaction signing: password required, decoded details shown
- Message signing: password required, message content shown
- Typed data signing: password required, domain/type/message fields shown
- Rejected approvals return EIP-1193 error code 4001
- TX and sign approvals persist across popup close/reopen (toolbar popup)
Secrets & Storage
- Public data (xpubs, addresses, balances) stored unencrypted
- Private data (recovery phrases, private keys) encrypted at rest
- Password only required for signing operations
- No secrets in
.env, credentials, or API keys committed to repo git add -A/git add .never used
Build & Workflow
- All tool invocations via
maketargets, never directly make check=make test+make lint+make fmt-checkmainalways passesmake check- Feature branches for all changes, merge to main when done
- No force-push to
main - Pre-commit hook runs
make check
Language & Labeling
- "Recovery phrase" not "seed phrase" or "mnemonic"
- "Address" not "account" or "derived key"
- "Password" not "encryption key" or "vault passphrase"
- Error messages are full sentences
- No competitor mentioned by name in code or documentation. Written
exception: the injected provider in
src/content/inpage.jssets the flag named after the other wallet totrue, an interface-compatibility flag many dApps check (README.md, Policies)