Build with Hentol.
Hentol is a security layer for onchain execution. It reads a contract's runtime bytecode, forks current chain state and runs thousands of simulated transactions against it — then returns a single risk score and a list of concrete findings before anyone signs.
These docs cover everything you need to put that verdict inside your product: the REST API, the TypeScript and Python SDKs, drop-in React components, webhooks for live monitoring, and step-by-step guides for DEXes, launchpads and wallets.
The public API is in private beta. Keys are issued manually while we scale capacity — request access at access@hentol.systems. Endpoints and payloads documented here are stable for Hentol-Version: 2026-09-01.
How it works
Every scan goes through the same deterministic pipeline. Nothing depends on the token's website, socials or self-reported audit — Hentol only trusts what the bytecode actually does on a fork of the live chain.
What each stage does
- Bytecode & selectors. We pull runtime code at the requested block and recover every 4-byte function selector — including ones that are not in the verified source, which is where hidden mint and blacklist functions usually live.
- Proxy resolution. EIP-1967, EIP-1822 and legacy admin slots are read so the scan follows the implementation, not just the proxy shell. Upgrade rights are reported separately.
- Control-flow graph & privileged writes. We map which storage slots can be written and by whom. A write to
totalSupplyor a fee slot behind anonlyOwnerguard is flagged with its exact selector. - Fork simulation. State is forked at the latest block and we run hundreds of buy and sell sequences from fresh wallets. If sells revert, the token is a honeypot — no matter what the source says.
- Adversarial execution. An executor tries to trap exits: tax mutation mid-sequence, blacklist on first sell, liquidity pull. Each attempt that succeeds becomes a finding.
- Scoring. Findings roll up into seven surface scores and one 0–100 risk score. Same bytecode + same state = same score, every time.
Reports are cached by codeHash. A second scan of identical bytecode on the same block returns in a few milliseconds and does not count toward your quota.
Quickstart
From zero to your first verdict in about two minutes.
Keys are issued from the dashboard once your beta access is approved. You get two: sk_live_… (secret, server only) and pk_live_… (publishable, safe in the browser).
Node 18+, Bun and Deno are supported. Python 3.9+ for the Python client.
Pass a chain and an address. The call resolves when the full pipeline has finished — typically 30–60 ms for a cached contract and under 2 s for a cold one.
Use severity for a simple allow / warn / block decision, or read individual checks to show users exactly what was found. See Risk score for recommended thresholds.
Authentication
All requests are authenticated with a bearer token in the Authorization header. Requests without a valid key return 401 unauthorized.
Headers
Never put an sk_ key in frontend code, a mobile app or a public repo. If one leaks, roll it in the dashboard — the old key stops working immediately.
Risk score
Every report has a riskScore from 0 to 100. Higher is safer. The score maps to a fixed level and severity, so you can branch on a string instead of hard-coding numbers.
A high score is not an endorsement. It means Hentol found no exploitable path in the code and state it can see. Issuer-controlled assets such as regulated stablecoins can score well while still having pause or blacklist roles — those show up as warn or info checks so users can see them.
Checks
A report contains nine checks. Each has a status (pass, info, warn or crit), a short value for display and a detail string that points to the exact selector, slot or simulation result behind it.
Reading a check
Here the owner can change the tax, but the contract enforces a 10% ceiling (1000 basis points), so the check is a warning rather than critical. Without that require, the same check would be crit with the value MUTABLE · NO CAP.
Surface breakdown
Besides the single score, each report includes seven surface scores (0–100, higher is safer). They are useful for charts and for explaining why a token scored the way it did.
Overview
The API is REST over HTTPS. Request and response bodies are JSON, timestamps are ISO-8601 UTC, token amounts are strings in base units (wei) to avoid precision loss.
Scan a contract
Runs the full pipeline against one contract and returns a report. If an identical report exists for this codeHash at the same block it is returned from cache.
Body parameters
Request
Response
The response above is trimmed to three checks for readability. Real responses always include all nine.
Simulate a transaction
Executes an unsigned transaction on a fork of the latest block and tells you what would happen: balance changes, new approvals, reverts — plus a verdict. This is what powers wallet pre-sign warnings.
Retrieve reports
Every scan is stored and addressable by its id (scn_…). Reports are immutable — a new scan of the same contract produces a new id, so you can diff how a contract changed over time.
Monitors
A monitor watches one contract block by block and POSTs to your URL when something security-relevant changes. Use it to pause a listing the moment a tax is raised or an implementation is swapped.
Events are listed in Events & payloads. To stop a monitor, call DELETE /v1/monitors/:id.
Supported chains
Installation & client
@hentol/sdk is a thin, fully typed wrapper around the REST API. It handles auth, retries with backoff, response caching and typed errors. It ships ESM + CJS and works in Node, Bun, Deno, edge runtimes and the browser (with a publishable key).
Creating a client
Methods
Error handling
React components
@hentol/sdk/react gives you a provider, a hook and two ready-made components. They use the publishable key, deduplicate requests for the same address and work with Next.js App Router (client components).
DEX & launchpad overlay
The fastest integration: one script tag, no build step. The overlay finds every element marked with a token address and attaches a verdict card next to it. Your UI stays the same — Hentol renders on top.
- Add the script with your publishable key and default chain.
- Mark token elements with
data-token-address(or pointdata-selectorat your own attribute). - Optionally listen for
hentol:verdictDOM events to disable your buy button oncritical.
Using React? Prefer <HentolOverlay> from the SDK — same card, but you control mounting and get typed callbacks.
Wallet pre-sign guard
Wrap your send function so every transaction is simulated before the wallet popup appears. Users see a warning — or a hard block — before they ever get the chance to sign something malicious.
- Simulation adds roughly 40–120 ms. Run it while you are already showing a "preparing transaction" state and users will not notice.
- Always show
sim.reasonsto the user. A block without an explanation feels like a bug. - Fail open or closed? If the API is unreachable, most wallets fail open with a visible "not checked" label. Pick what fits your users.
Browser extension
The Hentol extension brings the same verdict to any site, with no integration from the site owner. It detects contract addresses in the active tab and in pending wallet requests, then shows the card from the toolbar.
The extension never sees your private keys and never signs anything. It only reads addresses and unsigned transaction data, sends them to the scan API and shows the result.
Events & payloads
When a monitor fires, Hentol sends a POST with a JSON body to your URL. Respond with any 2xx within 10 seconds. Failed deliveries are retried with exponential backoff for 24 hours (8 attempts).
Verifying signatures
Every delivery carries a Hentol-Signature header: t=<unix seconds>,v1=<hex HMAC>. The HMAC is SHA-256 over `${t}.${rawBody}` using your monitor's whsec_ secret. Always verify it — anyone can POST to a public URL.
Verify against the raw request body. Parsing JSON and re-serialising it changes whitespace and key order, and the signature will not match.
Errors
Errors use standard HTTP status codes and a consistent JSON body. Always log requestId — support can trace any request from it.
Rate limits
Limits are per key, over a rolling 60-second window. Cached reports (same codeHash and block) do not count.
Changelog
- Issuer-role detection for regulated stablecoins (mint allowances, pauser, blacklister).
- Faster cold scans on Base: p50 1.1 s → 0.7 s.
- New API version 2026-09-01: checks gain a selector field.
- score.changed webhook event.
- Python SDK 1.0.
- Adversarial executor enabled by default.
- BNB Chain and Polygon support.
FAQ
Does a high score mean a token is a good investment?+
No. Hentol measures contract and execution risk — whether the code can trap, drain or dilute you. It says nothing about price, team or market.
Can a contract change after it was scanned?+
Yes — through proxies, owner functions or liquidity moves. That is why reports are tied to a block, and why monitors exist.
Do you need the source code?+
No. Analysis runs on runtime bytecode. Verified source only adds the bytecode_verified check and nicer function names.
Which chains are supported?+
Ethereum, Base, Arbitrum, Optimism, Polygon, BNB Chain. More EVM chains are added based on demand.
How do I get access?+
Email access@hentol.systems with your project and expected volume. Beta keys are free.