SENTINEL

Audit-grade security at the speed of deployment.

Slither plus models from three labs grade your contract in minutes, and the result is minted on Base as an attestation anyone can verify.

registry liveblock 48,332,039
recorded
1
latest
#1 D
plotted
21

Bright contacts are audits recorded onchain at 0xF0aA…a751; faint ones are benchmark runs. Further out means riskier.

Audits attested onchainRead at block48,332,039
1
Recall on known critical and high bugs35 issues in 20 known-vulnerable contracts; 57.1% at any severity
34.3%
Median audit timemeasured over 23 real runs
78s
Vulnerability categoriesplus 96 Slither detectors per run
10
DAudit #157 · attestedDc4-asymmetry-safeth56 · benchmarkBc4-backed-nftloanfacilitator81 · benchmarkBc4-cally77 · benchmarkCc4-caviar-pair71 · benchmarkCc4-concur-shelter86 · benchmarkBc4-escher-lpda87 · benchmarkAc4-forgeries-randomdraw92 · benchmarkBc4-joyn-splitter79 · benchmarkBc4-meebits-beebots82 · benchmarkBc4-vtvl-vesting85 · benchmarkAnssc-auction-dos93 · benchmarkCnssc-kotet61 · benchmarkCnssc-parity-walletlibrary69 · benchmarkCnssc-race-condition79 · benchmarkFnssc-spankchain-payment1 · benchmarkCswc-bec-token90 · benchmarkAswc-lockdrop92 · benchmarkDswc-rubixi57 · benchmarkCswc-simple-dao90 · benchmarkAswc-tx-origin94 · benchmark

Most contracts launch without a single check

Security reviews are priced and scheduled for the protocols that already raised. Everything else ships on trust.

Audits cost $5K+ and take weeks

A manual review is booked weeks ahead and priced for funded teams. Most token launches ship the day they are written, with no review at all.

Unaudited launches are exploits waiting to happen

Unprotected mints, owner drains and reentrancy are old, well-known bugs. They keep shipping because nobody ran even a basic check before the contract held money.

Investors can't verify claims

"Audited" on a website is usually a screenshot of a PDF. Nobody can check which code was reviewed, what was found, or whether the result was later withdrawn.

Four steps, one transaction you never send

You sign one USDC authorization. The facilitator settles it, the worker audits, and Sentinel pays the gas to write the result onchain.
  1. 01

    Submit contract

    Paste Solidity, drop a project folder, or give a verified address on Base or Ethereum. Pay per audit with one x402 USDC signature.

  2. 02

    AI deep scan

    Slither compiles and runs 96 detectors. Models read each contract with those results; criticals go to two reviewers from other labs.

  3. 03

    Severity report

    Findings by line, severity and origin, a score out of 100, and a signed receipt for every model call, hashed into one report file.

  4. 04

    NFT attestation minted

    AuditRegistry records grade, score and hashes on Base and mints the attestation NFT to the paying wallet. Anyone can verify it.

Payment path for one audit: x402 exact scheme, Circle test USDC on Base Sepolia

  1. 01 · Payer wallet

    your wallet

    signs one EIP-3009 authorization, no gas

  2. 02 · x402 authorization

    0.05 to 1.00 USDC

    exact tier price, valid 5 minutes

  3. 03 · Facilitator

    x402.org/facilitator

    verifies, then settles on Base

  4. 04 · Sentinel treasury

    receives USDC; job starts

Watch a real audit, line by line

Three contracts, three recorded Sentinel runs. The stages, detector count, findings and score are the real output; only the clock is sped up.

A launch-day ERC-20 with a marketing fee and an airdrop helper. Its mint() has no access check.

MemeToken.sol78 lines · solc 0.8.30
1// SPDX-License-Identifier: MIT
2pragma solidity ^0.8.24;
3
4/// @title MemeToken
5/// @notice A launch-day meme token: fixed initial supply, a marketing wallet fee and an airdrop helper.
6contract MemeToken {
7 string public constant name = "Meme Token";
8 string public constant symbol = "MEME";
9 uint8 public constant decimals = 18;
10
11 uint256 public totalSupply;
12 address public owner;
13 address public marketingWallet;
14 uint256 public marketingFeeBps = 200; // 2%
15
16 mapping(address => uint256) public balanceOf;
17 mapping(address => mapping(address => uint256)) public allowance;
18
19 event Transfer(address indexed from, address indexed to, uint256 value);
20 event Approval(address indexed owner, address indexed spender, uint256 value);
21
22 constructor(address marketing) {
23 owner = msg.sender;
24 marketingWallet = marketing;
25 _mint(msg.sender, 1_000_000_000 ether);
26 }
27
28 /// @notice Mints new tokens. Meant for the team's liquidity top-ups.
29 function mint(address to, uint256 amount) external {
30 _mint(to, amount);
31 }
32
33 function setMarketingWallet(address wallet) external {
34 require(msg.sender == owner, "not owner");
35 marketingWallet = wallet;
36 }
37
38 function transfer(address to, uint256 amount) external returns (bool) {
39 _transfer(msg.sender, to, amount);
40 return true;
41 }
42
43 function approve(address spender, uint256 amount) external returns (bool) {
44 allowance[msg.sender][spender] = amount;
45 emit Approval(msg.sender, spender, amount);
46 return true;
47 }
48
49 function transferFrom(address from, address to, uint256 amount) external returns (bool) {
50 uint256 allowed = allowance[from][msg.sender];
51 if (allowed != type(uint256).max) allowance[from][msg.sender] = allowed - amount;
52 _transfer(from, to, amount);
53 return true;
54 }
55
56 /// @notice Sends `amount` to every address in `recipients`.
57 function airdrop(address[] calldata recipients, uint256 amount) external {
58 for (uint256 i = 0; i < recipients.length; i++) {
59 _transfer(msg.sender, recipients[i], amount);
60 }
61 }
62
63 function _transfer(address from, address to, uint256 amount) internal {
64 uint256 fee = (amount * marketingFeeBps) / 10_000;
65 balanceOf[from] -= amount;
66 balanceOf[to] += amount - fee;
67 balanceOf[marketingWallet] += fee;
68 emit Transfer(from, to, amount - fee);
69 if (fee > 0) emit Transfer(from, marketingWallet, fee);
70 }
71
72 function _mint(address to, uint256 amount) internal {
73 totalSupply += amount;
74 balanceOf[to] += amount;
75 emit Transfer(address(0), to, amount);
76 }
77}
78

Detectors

0/96

Lines read

0/78

Flagged

0

  1. Parsing source and resolving pragma
  2. Compiling with solc 0.8.30
  3. Running 96 Slither detectors, 2 results
  4. AI semantic analysis (cx/gpt-6.1-sol)
  5. Quorum on 1 critical finding
  6. Scoring, signing 2 receipts, hashing the report

What a finding looks like

Each one names the lines, the category, where it came from, and the fix. These are verbatim engine output.
CriticalReentrancyAI + Slither

Reentrant withdrawal drains ETH before credit is reduced

      require(msg.sender.call.value(amount)());
      credit[msg.sender]-=amount;

withdraw sends ETH to msg.sender via a low-level call at line 17 before reducing credit[msg.sender] at line 18. A malicious recipient contract can use its fallback function to reenter withdraw repeatedly while its recorded credit remains unchanged, receiving multiple withdrawals against the same credit. This can drain ETH deposited for other users.

Fix: Apply checks-effects-interactions: reduce credit[msg.sender] before making the external call.

benchmark case swc-simple-dao, SWC registry

CriticalAccess controlAI

Anyone can drain all vault-held tokens through emergencyWithdraw

    function emergencyWithdraw(address token, address to, uint256 amount) external {
        IERC20(token).transfer(to, amount);
    }

emergencyWithdraw has no authorization check. Any caller can select the staking token, reward token, or any other token held by the vault, set themselves as `to`, and transfer the vault's balance to themselves. This permits direct theft of all deposited staking tokens and funded reward tokens.

Fix: Restrict this function to an authorized role, such as `require(msg.sender == owner)`, and consider preventing recovery of the staking and reward tokens while user balances or reward obligations remain outstanding.

demo: StakingVault.sol · open the report
HighAccess controlAI + Slither

tx.origin authorization allows phishing-based withdrawal

        require(tx.origin == owner);

Authorization is based on tx.origin rather than msg.sender. If the owner is induced to call an attacker-controlled contract, that contract can call sendTo with an attacker-selected receiver and amount while tx.origin remains the owner. The contract will then transfer its ETH to the attacker-controlled receiver.

Fix: Authenticate the direct caller instead: require(msg.sender == owner).

benchmark case swc-tx-origin, SWC registry

An audit you can hold and verify

Every audit mints an ERC-721 whose metadata and seal are generated onchain by AttestationNFT. Revoking an audit changes the token in the same block.
SAUDIT #1verified onchainRubixigrade D · 57/10019 Oct 2026TOKEN DETAILS
Collection
Sentinel Audit (SAUDIT)
Contract
0xfEA8…8c34
Token id
#1
Network
Base Sepolia · 84532
Metadata
fully onchain (tokenURI)
View on Basescan Open the report
SAUDIT EXAMPLEnot mintedCMemeTokengrade C · 88/10019 Oct 2026TOKEN DETAILS
Collection
Sentinel Audit (SAUDIT)
Contract
0xfEA8…8c34
Token id
not minted
Network
Base Sepolia · 84532
Metadata
fully onchain (tokenURI)
A real audit mints this card to the paying wallet through AuditRegistry.record. This one is an example from a replayed run.
SAUDIT EXAMPLEnot mintedDStakingVaultgrade D · 56/10019 Oct 2026TOKEN DETAILS
Collection
Sentinel Audit (SAUDIT)
Contract
0xfEA8…8c34
Token id
not minted
Network
Base Sepolia · 84532
Metadata
fully onchain (tokenURI)
A real audit mints this card to the paying wallet through AuditRegistry.record. This one is an example from a replayed run.
1 recorded on AuditRegistryRead at block48,332,039

Registry 0xF0aAc6f98F94Ed714387948f818b8eBeE959a751

Per audit. No subscription required

Base Sepolia prices are a hundredth of mainnet, paid in Circle test USDC, so you can run it on every commit.

Quick Scan

Tokens and small contracts

$5per audit, mainnet0.05 USDC on Base Sepolia

  • Up to 600 lines of code
  • Slither, then one fast primary model
  • Criticals reviewed by two more models
  • Signed receipts and an attestation NFT
Start a Quick Scan

Deep Scan

DeFi protocols, vaults, staking

$25per audit, mainnet0.25 USDC on Base Sepolia

  • Up to 3,000 lines of code
  • Slither, then a stronger primary model
  • Criticals reviewed by two more models
  • Signed receipts and an attestation NFT
Start a Deep Scan

Full Audit

Multi-contract systems

$100per audit, mainnet1.00 USDC on Base Sepolia

  • Up to 10,000 lines of code
  • Slither, then the strongest primary model
  • Criticals and highs reviewed by two more models
  • Signed receipts and an attestation NFT
Start a Full Audit

Continuous monitoringplanned

Re-audit on every deploy and upgrade

$99per month

  • Watches your deployed addresses
  • A new attestation for each new implementation
  • Not available yet; join to hear when it opens

Scan it before someone else does

Five cents on Base Sepolia. A graded report in minutes, and an attestation your launchpad can read.