Warrant
warrantprotocol.xyz
BUIDL CTC 2026 Fall · AI
Creditcoin CC3 · chain 102031

An ERC‑8004 validator
with no keys and
no opinion.

ERC‑8004 names three things you can trust to validate an agent's work: a reviewer, a staked node, a TEE. All three are somebody you must trust. Warrant is a contract in that slot which answers 100 only when the payment is provable on Ethereum mainnet, and 0 otherwise.

Status
Live on CC3
Precompile
0x0FD2
Attested chain
chainKey 3
Validator
0x606D9162aD1666B9c5735545A2c81af1f3948cF1
Exhibit 01  ·  The problem

An agent finishes a job and says it was paid. Who checks?

ERC‑8004, the Trustless Agents standard, answers with a Validation Registry. Work is submitted, a validatorAddress responds with a score from 0 to 100, and that score becomes the agent's on‑chain reputation.

The standard names three ways to fill that slot. A human reviewer, who can be lazy or bought. A staked node, only as honest as its stake is large. A TEE, which is a hardware vendor's promise.

So the standard called "Trustless Agents" settles its most consequential question — did this actually happen? — by picking whom to trust.

Exhibit 02  ·  The observation

A contract does not need an opinion.

validatorAddress is an address. The spec constrains it no further. An address can be a contract.

Creditcoin's Attestcoin Protocol exposes a block‑prover precompile at 0x0FD2 that verifies natively, with no oracle operator, that a transaction was included in a finalized block of an attested chain. So a validator can be a contract that answers 100 only when the work is provable on Ethereum mainnet.

No keys. No stake. No quorum. Nothing to bribe, because there is nobody to bribe.

Exhibit 03  ·  The gap

Inclusion is not success.

The block prover precompile does not validate if a transaction was successful or not. Attestcoin Protocol documentation

A transaction that reverted, ran out of gas, or moved nothing at all is still in the block — and it proves exactly as well as one that transferred a million dollars. A validator that stops at "the proof verified" will settle a payment that never happened.

Warrant decodes the receipt from the proven transaction bytes. Four invariants must hold before it will answer 100.

I‑1

Inclusion

0x0FD2 verifies the Merkle proof and continuity chain. The precompile reverts on a bad proof, and a block beyond the attested frontier fails here too — so finality is covered by this one call.

I‑2

Replay

One proof, one settlement. Without it, a single real payment settles an unlimited number of jobs.

I‑3

Receipt status

The transaction must have succeeded. This is the invariant the precompile explicitly does not check for you.

I‑4

Emitter and argument binding

The log must come from the expected token, and payer, payee and amount must match the claim. An event signature is not exclusive — anyone can deploy a contract that emits Transfer. The caller's assertion is not evidence.

Exhibit 04  ·  Proof

Two payments. One block. Two answers.

Both are real USDC transfers on Ethereum mainnet, sitting in the same block. Same Merkle root, same continuity proof, same attestation. One moved 45.00 USDC. One reverted and moved nothing.

Ethereum mainnet  ·  block 25,971,533  ·  identical attestation
The payment that happened
Tx
0x45f3697…857b41
Receipt
status 1 — success
Moved
45.00 USDC
Tag
attestcoin:0x0FD2
100Validated
The payment that did not
Tx
0x415fab3…2d7ea6
Receipt
status 0 — reverted
Moved
nothing. 0 logs emitted
Tag
REVERTED
0Rejected
The precompile returns true for both — correctly, since both are genuinely in that block. Warrant does not. The second settlement emits RejectedRevertedTransaction, on chain, where anyone can read it.
Exhibit 05  ·  Integration

The protocol is the trust model, not a feature.

On chain

prove() calls the block‑prover precompile directly. Remove it and there is no validator, only another party to trust.

Off chain

The CLI builds Merkle and continuity proofs through @gluwa/usc-sdk, and reads the attested frontier from the chain‑info precompile so a caller can tell whether a block is provable yet.

// AttestcoinValidator.sol — I-1 INCLUSION
try NativeQueryVerifierLib.getVerifier().verify(
    chainKey, c.blockHeight, txb, c.merkleProof, c.continuityProof
) returns (bool ok) {
    if (!ok) return _reject(requestHash, txKey, "INCLUSION");
} catch {
    return _reject(requestHash, txKey, "INCLUSION");
}

Warrant occupies the validatorAddress slot of an otherwise ordinary Validation Registry. ValidationRegistry.sol knows nothing about Attestcoin — it is the spec surface, unmodified. Warrant is a drop‑in for any ERC‑8004 deployment, not a fork of one.

Exhibit 06  ·  On chain

Check it yourself.

Deployed on Creditcoin CC3 testnet, chain 102031. All three contracts verified on Blockscout.

ContractAddressSource
AttestcoinValidator0x606D9162aD1666B9c5735545A2c81af1f3948cF1verified
ValidationRegistry0x8b619C6F701598f48Acffd218F18A93CeB698Fbdverified
IdentityRegistry0x57e56f81b36d55931662A960b6F7c3B8ec02F0B9verified
Settlement → 1000x6d601ec874682c3ea89d9ff28ae9dbfb657e2be4f64415741ca471a9ef1c44d9transaction
Settlement → 00xda90af0212f2e372fe445c104775973607a870d419efeaadb332501a2bc9b809transaction
# reproduce the thesis without deploying anything
git clone https://github.com/Leihyn/warrant && cd warrant
forge test                                     # 4/4
cd tools && npm install && cd ..
node tools/warrant.mjs preflight 0x415fab30…2d7ea6   # the reverted one