v0.2 shipped · EVM + Solana + Tron + BTC

Stop wallet drains,
cryptographically.

A browser extension, a TypeScript SDK, and an on-chain Safe guard that decode every approval, signature, and transaction before your wallet signs. Real code. Public tests. Transparent audit log. No "military grade" marketing — just the exact primitives Permit2 drainers rely on, reversed.

$2.2B
stolen from wallets in 2024
8
attack classes defended
4
chains — EVM, SOL, TRX, BTC
57 + 10 + 18
tests passing (Go · TS · Solidity)
How it works

One modal. One fresh decoder. One human-readable summary.

Shield intercepts every wallet RPC call in the page before MetaMask / Phantom / Unisat receive it. It decodes EIP-712 Permit structs, 4-byte function selectors, nested multicalls and Safe multiSends, then shows you what the transaction actually does in plain English.

You see the real action, not the phishing page's lie.

When a dApp calls eth_signTypedData_v4, Shield decodes the struct and checks whether it's a Permit, Permit2, or PermitForAll — the three off-chain patterns responsible for $150M+ of drains in 2024.

If the signed domain doesn't match the page origin (a fake Uniswap domain trying to sign a real Uniswap Permit), Shield shows a DOMAIN MISMATCH warning and requires you to type APPROVE before continuing. No dark-pattern dismissal.

  • Recursive multicall walker — decodes wrappers like multicall(bytes[]), Multicall3 aggregate3, Safe multiSend. Risk bubbles up from inner calls.
  • Clipboard guard — hashes addresses you copy, flags mismatch on paste. Defeats ClipBanker-style malware on any chain.
  • Signed dApp registry — Ed25519-signed, verified in your browser against a root key compiled into the extension. No MITM surface.
  • Active approval ledger — tap the popup to see every allowance you've granted, revoke with one click.
Three customer tiers

One crypto library. Three very different products.

The same decoder powers a free consumer extension, a TypeScript SDK for wallets and exchanges, and an on-chain Solidity guard for multisig treasuries. Pick the layer that matches your threat model.

01 · INDIVIDUAL

Browser extension

Free · Chrome + Firefox

Install once. Protects you on every dApp, across every supported chain. Intercepts wallet RPC calls before MetaMask / Phantom / Unisat see them.

  • EVM, Solana, Tron, Bitcoin coverage
  • Permit2 / setApprovalForAll decode
  • Multicall / Safe multiSend walker
  • Clipboard guard — chain-agnostic
  • Active approval ledger + revoke UI
  • Signed phishing-URL registry
Shipped · v0.2
02 · PLATFORM

@zoza/shield

TypeScript · npm + ESM + CJS

The same decoder, packaged for wallets, exchanges, and dApps to embed in their own apps. Your users get the decoder without installing anything.

  • Pure TS — no window, no DOM
  • Works in browsers, Node, Workers, RN
  • TypeScript types + 10 passing tests
  • Optional B2B API key (metered)
  • Origin-mismatch signature detection
  • Open-source release planned
Shipped · v0.1.0
03 · TREASURY

ZozaSafeGuard.sol

On-chain · Gnosis Safe module

A Solidity guard that blocks every Safe transaction whose calldata hasn't been pre-authorised by an out-of-band intent signer. The contract that would have stopped Bybit.

  • Pre-authorised intent gate for Safe
  • ECDSA signature verification (EIP-191)
  • Single-use + multi-use + revocable intents
  • 24h-timelocked emergency disable
  • 18 Foundry tests passing in CI
  • Authority rotation + canonical-s check
Code ready · audit pending
See Shield in action

Six detailed walk-throughs of what users actually see.

Not mock-ups of a future vision. These are the exact UI states the shipped extension produces today. Every screenshot is a self-contained HTML rendering — view source to verify nothing is fabricated.

01 · Status at a glance

The Shield icon tells you the site's trust level before you even connect.

Every URL you visit is checked against the signed dApp registry in the background. The extension icon gets a small badge that reflects the lookup result. No clicks required, no popup needed.

  1. Green check: the domain is verified in the registry — Zoza has audited it or the project team has claimed it cryptographically.
  2. Yellow question: domain is not in the registry. Not necessarily bad, but Shield is watching every signature and transaction on this page with extra care.
  3. Red exclamation: domain is flagged as phishing. Shield has already injected a full-page block overlay.
🔒 app.uniswap.org/swap VERIFIED
🛡️
Badge states in practice
🛡️
VERIFIED
e.g. Uniswap, Aave, Blur
🛡️?
UNKNOWN
not in registry
🛡️!
PHISHING
page blocked
02 · Phishing block

If the domain is in the signed threat list, you never reach the form.

The moment a page loads, Shield checks the hostname against the signed threat registry (Ed25519 against a root key compiled into the extension binary). A match triggers a full-viewport red overlay that has to be dismissed manually. Did-you-mean hints suggest the real domain when the fake is a typosquat.

This is the showBlockOverlay() function in extension/content.js. All registry updates are audit-logged — see the public audit log.

🔒 uniswap-airdrop.xyz/claim BLOCKED
🛡️!
Zoza Shield — Site Blocked
BLOCKED: This site is a confirmed drainer targeting Uniswap. Do NOT connect your wallet.
Did you mean: app.uniswap.org?
03 · Approvals ledger

Click the extension icon to see every allowance you've ever granted.

Ice-phishing works because approvals are invisible. You grant one, forget, and weeks later the attacker drains you. Shield makes them visible forever. Every approve, setApprovalForAll, and Permit signature you confirm is recorded locally with enough metadata to revoke it in one tap.

The ledger is stored in chrome.storage.local on your device. Nothing is sent to Zoza servers — see the data retention policy. Tabs: Approvals / Clipboard / About.

Zoza Shield
v0.2 · EVM + SOL + TRX + BTC
docs
14
Tracked
3
Critical
3
Chains
setApprovalForAll
Critical
ETH · opensea.io · 2d ago
Grants 0x1E00…0fA3 the power to move ALL of your NFTs in Bored Ape Yacht Club, now and forever
approve (USDC)
High
ETH · app.aave.com · 5d ago
Grants UNLIMITED USDC allowance to 0xA17e…5B42 (Aave V3 Pool)
approve (USDT TRC-20)
High
TRON · justlend.org · 11d ago
Grants 100,000 USDT allowance to TYzx…u9Z
04 · Multicall walker

When the outer TX is a wrapper, Shield unpacks every inner call.

A common drainer trick: wrap the real drain inside multicall(bytes[]) or Multicall3 aggregate3. Your wallet shows a harmless wrapper name. The real damage is in the inner calls.

Shield's decoder recursively walks wrapper patterns (depth capped at 3 to stop decode bombs) and surfaces every inner call in the modal. Risk bubbles up — if any inner call is critical, the whole wrapper is marked critical. Tested against mainnet examples.

Decoded call
multicall 0xac9650d8 Critical
multicall — wraps 3 inner calls, including critical inner operations. Each must be reviewed.
↳ Inner calls (3)
#1approve0x095ea7b3
High
grants 1,000 token allowance to 0xaaa…aaa
#2setApprovalForAll0xa22cb465
Critical
grants 0xbbb…bbb the power to move ALL of your NFTs in this collection
#3transferFrom0x23b872dd
Medium
moves token from 0xccc…ccc to 0xddd…ddd
05 · Clipboard guard

Clipboard malware swaps addresses. Shield catches the swap.

When you copy any wallet address (EVM, Solana, Bitcoin, Tron), Shield hashes it with SHA-256 and stores the hash in chrome.storage.local with a 5-minute TTL. When a transaction is about to go out, Shield re-hashes the destination address and compares.

A mismatch means the clipboard was rewritten between copy and send — classic ClipBanker / Laplas Clipper behaviour. The user sees a warning callout showing the actual prefix/suffix they originally copied vs what's about to be sent.

1
User copies an address
0x742d35Cc6634C0532925a3b844Bc9e7595f8fA4a
2
Shield hashes & stores (5-min TTL)
SHA-256 = 8f2a…c3b1 · prefix=0x742d · suffix=fA4a · chain=eth
3
Malware rewrites clipboard (user never sees)
new clipboard: 0x742dAAAABBBBCCCCDDDDEEEEFFFFGGGGfA4a
4
User pastes & taps send
intercepted eth_sendTransaction to 0x742dAAAA…fA4a
5
Hash mismatch — warning modal
You recently copied an address starting with 0x742d and ending with fA4a. The destination of this transaction is different. Clipboard malware can swap silently — verify manually.
06 · Public audit log

Every registry change is hash-chained and signed. You verify it in your browser.

Insider trust is the weakest link in a centralised registry. If a Zoza employee approved a phishing site as "verified", how would you know?

Every change emits an Ed25519-signed entry with a hash chained over the previous entry + its signature. The public audit verifier re-computes every hash and verifies every signature in your browser using @noble/ed25519, against the Shield root pubkey. Tamper = broken chain = red result.

Shield audit log
✓ Chain verified
#142 register_dapp admin@zoza.world
Uniswap V4 · app.uniswap.org
✓ valid hash: 3a82…c81f
#141 add_threat admin@zoza.world
uniswap-airdrop.xyz · drainer
✓ valid hash: 7f0b…a2d5
#140 api_key_issue admin@zoza.world
zkid_a4b1…7f3e · enterprise
✓ valid hash: c9e1…40b8
#139 key_rotation system
root Ed25519 rotated via 2-of-3 multisig
✓ valid hash: 1e4a…92cf
BONUS · Safe Guard

How the on-chain guard stops a Bybit-style exploit.

The compromised UI shows one transaction. The hardware wallet signs another. Without this guard, the Safe executes whatever calldata reaches it. With it, the guard's checkTransaction hook fires before execution and checks every byte against pre-registered intents.

STEP 01
Off-band intent sign

Operator signs an intent on an isolated machine: (to, value, dataHash, operation, expiry, nonce). The signing key lives on a separate Yubikey from the Safe cosigners.

STEP 02
Register on-chain

Anyone relays registerIntent(). The contract verifies the signature, binds the intent to its discriminator, and stores (expiry, maxUses) in intents[hash].

STEP 03
Safe tries to execute

Normal Safe TX. The guard's checkTransaction hook computes the discriminator, looks up discriminatorToIntent[disc]. Match → allow + consume. No match → revert.

Legitimate path: operator signs intent for "transfer 100 ETH to 0xabc…". Safe UI builds exactly that TX. Discriminator matches. Intent consumed. TX executes.
Exploit blocked: compromised UI swaps in "upgrade implementation to attacker contract". Different calldata → different keccak256(data) → different discriminator → discriminatorToIntent[disc] == 0IntentNotRegistered(). Revert. Bybit doesn't lose $1.46B.
Attack anatomy

8 attack classes. The real mechanics. Honest defense status.

Each card shows how the attack works + which defense is shipped / partial / planned. No hand-waving. If the code doesn't exist yet, we say so.

Permit / Permit2 signature phishing

Shipped
$150M+ in 2024 · off-chain drain · hardest to detect
Attack

Victim signs an EIP-712 Permit thinking it's a login. The signature grants the attacker contract unlimited USDC allowance for 30 days. No visible TX. Drainer bot executes in one block.

Shield

Decodes EIP-712 domain + primary type. Flags Permit, PermitSingle, PermitBatch, PermitForAll. Origin-mismatch check. Critical-risk modal with typed APPROVE ack.

setApprovalForAll (ice phishing)

Shipped
Kevin Rose $1.1M, Premint $375K · dormant-drain pattern
Attack

Fake mint page calls setApprovalForAll(attacker, true). Looks like an "approval step" — no dollar amount shown. Weeks later attacker drains the whole collection.

Shield

Decodes the 4-byte selector, translates to plain English: "grants X the power to move ALL of your NFTs". Active-approval ledger keeps it visible forever until revoked.

Address poisoning

Clipboard shipped · contact book planned
Binance hot wallet $68M (2024) · history pollution
Attack

Attacker sends dust from a vanity address matching first/last 4 chars. Victim copies from wallet history, pastes, doesn't verify middle bytes. Funds go to attacker.

Shield

Clipboard hash-compare catches copy/paste mismatch. Personal signed contact book (planned) will verify against explicitly-added addresses instead of wallet history.

Fake airdrop claim drainers

Shipped
Inferno Drainer $87M · drainer-as-a-service
Attack

Attacker typosquats a real project's airdrop domain. Uses rented drainer kit. User signs a chain of approvals disguised as "claim eligibility verification". Entire wallet drains live.

Shield

Signed dApp registry with Levenshtein typosquat detection. Unknown domain → red full-page block. Typo of a verified project (e.g. unlswap.org) → "This looks like 'Uniswap' but isn't".

Discord / Telegram impersonation

Planned
Yuga, Premint, Azuki mass-compromises · social engineering
Attack

Fake "Uniswap Support" DM after posting for help in the real server. Attacker builds rapport, sends a "validate wallet" link that leads to a drainer or seed-phrase phish.

Shield

Planned: Shield badge banner on Discord / Telegram DOM, linking real project team to their Zoza-verified identity. Impersonators can't forge the badge without the project's key.

Clipboard hijacker malware

Shipped
Laplas Clipper $20M+ aggregate · local-malware vector
Attack

Malware watches clipboard. When user copies a wallet address, silently replaces with an attacker address that shares first/last 4 chars. User pastes into MetaMask, sees matching prefix/suffix, sends.

Shield

Hashes the address on copy event, compares to tx destination on send. Mismatch → warning callout with the actual copied prefix/suffix so user sees the divergence.

Blind signing on hardware wallets

Decoder shipped · Safe Guard audit pending
Bybit $1.46B, Radiant $50M, WazirX $230M · multisig blind-sign
Attack

Compromised Safe UI swaps displayed tx for malicious implementation-upgrade. Hardware wallet shows raw calldata hex. Signers blind-sign. Funds drain.

Shield

Two layers: the extension's plain-English calldata preview (shipped, tier 01). On-chain ZozaSafeGuard (tier 03) vetoes any calldata without a pre-registered signed intent. Code ready; pending external audit before treasury deploy.

Supply chain library injection

Planned
Ledger Connect Kit Dec 2023 ~$610K · NPM credential hijack
Attack

Attacker compromises NPM account of a widely-used wallet-connect library. Pushes a malicious minor version. Every dApp using the library serves the drainer to every user.

Shield

Planned: SHA-384 integrity registry of wallet-connect libraries. Extension verifies loaded script hashes against expected values. Mismatch → block. Requires a crawl of top libraries and a publisher-adoption pipeline; queued for Shield v0.3.

Chain coverage

Not just Ethereum. Drains happen everywhere.

ChainDrain share 2024Hooked providersStatus
EVM
ETH, Polygon, Arbitrum, Optimism, Base, BSC, Avalanche
~78% (Permit2 dominant) window.ethereum + EIP-6963. eth_sendTransaction, eth_signTypedData_v4, personal_sign. Full EIP-712 Permit/Permit2/PermitForAll + multicall walker. Shipped
Solana
Phantom, Solflare, Backpack, Glow
~15% (Rainbow Drainer, Drainer.so) window.solana + Wallet Standard. signTransaction, signAllTransactions, signAndSendTransaction, signMessage. Flags batch-drain pattern (≥5 txs in one confirm). Partial
Tron
TronLink
~4% (TRC-20 USDT approve drains) tronWeb.trx.sign. Reuses EVM 4-byte decoder for TRC-20 calldata (identical ABI). Flags approve, transferFrom, unlimited allowance. Shipped
Bitcoin
Xverse, Unisat, OKX, Leather
~2% (clipboard + address poison) Per-wallet adapters. PSBT decoder extracts outputs + amounts. Flags multi-output drainers + OP_RETURN (Ordinals / inscriptions). Shipped
Sui / Aptos / Near / Cosmos / TON ~1% combined No provider hook yet. Clipboard guard + phishing URL registry still work (chain-agnostic). Demand-driven
For platforms

SDK integration in 15 lines.

Drop into your wallet / exchange before every user signs. No browser extension required for your users.

typescript import { ShieldClient } from '@zoza/shield'; const shield = new ShieldClient({ apiKey: 'zsk_live_...' }); // Before the user taps Sign: const assessment = await shield.assessTransaction({ chain: 'eth', tx: { to: '0x...', data: '0x095ea7b3...', value: '0x0' }, origin: 'https://your-app.com' }); if (assessment.risk === 'critical') { showWarning(assessment.summary); // "grants UNLIMITED USDC allowance to 0x742...4a8" if (assessment.requireTypedAck) await confirmWithAck(); }
Full integration guide Talk about commercial use
Transparency suite

Four pages that let you audit us, not the other way around.

Every claim we make is independently verifiable. If you disagree with any of them, the bounty program pays you to prove it.

Public audit log

Every registry change (new verified dApp, new threat flag, key rotation) is appended to a hash-chained, Ed25519-signed log. Verify the chain in your browser using @noble/ed25519 against our published root key. Tamper = red.

Open audit verifier →

Warrant canary

Every month, a signed statement confirming Zoza has received no secret subpoenas, NSLs, or gag orders. If the canary goes silent for 35+ days or the signature stops verifying, infer the worst and act accordingly.

View current canary →

Data retention policy

Plain-English breakdown of exactly what Shield collects, what it doesn't, retention windows per category, and what a subpoena would (and would not) return. Every claim verifiable in source.

Read the policy →

Responsible disclosure — cash payouts coming soon

Find a silent bypass, a forged-audit-log case, an HSM-key extraction, or a signature-forgery path in the Safe Guard. Full scope, severity tiers, SLA and safe-harbour (CFAA, India's IT Act, DMCA) are binding today. Dollar amounts activate on first paying pilot; every confirmed report is paid retroactively at the tier it was assigned.

View scope →
Honest roadmap

What's NOT yet built.

Vendors that pretend they have everything are lying. Here is every defense that doesn't have shipped code, and the specific blocker on each.

Deferred — gated on external dependencies

  • Yubikey HSM testing. shield-sign-hsm (PKCS#11, cgo) is code-complete and builds. End-to-end signing ceremony waits on Yubikey 5 hardware + SoftHSM staging setup. ~2 hours of work once hardware arrives.
  • External audit of ZozaSafeGuard.sol. Code + 18 Foundry tests ready; Trail of Bits / Spearbit engagement starts at $30-70K for ~1 week. Until audit completes, no real-treasury deployment.
  • Immunefi program listing. Bounty scope doc and public page are live. Waiting on Immunefi KYB + program activation (calendar-gated, 3-5 business days of their time once initiated).
  • First paying B2B customer. API key store, quota metering, billing surface all wired. No customers issued real keys yet; admin endpoints are gated by ZOZA_SHIELD_ADMIN_TOKEN env var and are off by default.
  • Nested Universal Router decoding. Uniswap V4 Universal Router commands pack into a single bytes stream we don't yet fully walk. Safe multiSend, Multicall3, and standard multicall(bytes[]) all work today.
  • Non-EVM / non-BTC chains. Sui, Aptos, Near, Cosmos, TON provider hooks. Low 2024 drain share means demand-driven; no ETA.
  • Discord / Telegram verified-team badges. Requires a DOM-injection layer for each platform's UI shell. Designed, not implemented.

Install, embed, or audit.

Three ways to use Shield today. One decoder powers all three. Everything else on this page is backed by real code — click any link and verify.