Smart Contract Verification
A deployed smart contract is a blob of EVM bytecode at an address. Nothing in that bytecode tells a user who wrote it, which source it was compiled from, or whether it has been audited. Block explorers partially solve this with source uploads, but that solution is centralized, per-chain, and impersonatable. Notareum binds a contract address to an issuer identity, a source commit, and (optionally) an audit attestation, then anchors the binding in the on-chainNotaRegistry with validator signatures.
What a contract .nota proves
A .nota file for a deployed contract carries:
- The
chainIdandidentifier(the contract address). - The issuer identity (developer, DAO, or protocol team) that signed the file.
- A pointer to the verified source bundle (git commit hash, IPFS CID, or explorer URL).
- Optional audit metadata: auditor name, report hash, severity summary, audit date.
- A verification level set by validator quorum after independent review.
VERIFIED or higher level gives a wallet or dapp a single on-chain question to answer: is this contract what its deployer says it is?
Trust model
The deployer does not need the wallet to trust them: they need the wallet to trust the signature and the validator quorum. Because the deployer’s address already deployed the contract, a signature from the same key over the.nota file closes the loop cryptographically.
Creating the contract .nota
identifier MUST equal the deployed contract address. Validators fetch the deployed bytecode, compile the referenced source with the declared compiler settings, and reject the attestation if the resulting runtime bytecode does not match.
Consumer verification
A wallet or dapp verifying a contract before interaction runs four checks:Proxy and upgradeable contracts
Upgradeable contracts complicate verification because the logic contract behind the proxy can change. Notareum handles this in two ways:- Proxy-level
.notatargets the proxy address and declaresupgradeable: true. The verification level applies to the proxy and its upgrade process (timelock, admin, governance controls), not to the current implementation. - Implementation-level
.notatargets the current logic contract address. Each upgrade publishes a new implementation.notareferencing the new commit. A wallet can enforce both: “proxy must be verified AND the current implementation must be verified”.
Audit attestations
Audit firms can operate as validators. An audit firm’s validator node submits a dedicated attestation with a structured payload:Revocation and recompiles
Revocation fits naturally here:- A contract discovered to have a vulnerability gets its
.notarevoked by the issuer. Consumers treating a revoked entry as untrusted immediately stop routing users to it. - A deployer who loses control of the deployer key revokes the associated
.nota, then registers a new one from a replacement key controlled by the DAO. - A proxy upgrade to a malicious implementation triggers auto-revocation by a watcher validator if the new impl’s
.notais missing.
Integration patterns
- Block explorers fetch
.notarecords alongside bytecode and render a “Notareum Verified” badge. - Wallets require at least
ENHANCEDverification before enabling approval-heavy actions (permit,approve(max), upgradeable proxy interactions). - DEX aggregators filter pool routes through registered contracts to avoid honeypots.
- Security products subscribe to
ResourceRevokedevents to surface warnings within minutes of an incident.

