- Tx
- 0x45f3697…857b41
- Receipt
- status 1 — success
- Moved
- 45.00 USDC
- Tag
- attestcoin:0x0FD2
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.
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.
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.
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.
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.
One proof, one settlement. Without it, a single real payment settles an unlimited number of jobs.
The transaction must have succeeded. This is the invariant the precompile explicitly does not check for you.
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.
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.
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.prove() calls the block‑prover precompile directly. Remove it and
there is no validator, only another party to trust.
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.
Deployed on Creditcoin CC3 testnet, chain 102031. All three contracts verified on Blockscout.
| Contract | Address | Source |
|---|---|---|
| AttestcoinValidator | 0x606D9162aD1666B9c5735545A2c81af1f3948cF1 | verified |
| ValidationRegistry | 0x8b619C6F701598f48Acffd218F18A93CeB698Fbd | verified |
| IdentityRegistry | 0x57e56f81b36d55931662A960b6F7c3B8ec02F0B9 | verified |
| Settlement → 100 | 0x6d601ec874682c3ea89d9ff28ae9dbfb657e2be4f64415741ca471a9ef1c44d9 | transaction |
| Settlement → 0 | 0xda90af0212f2e372fe445c104775973607a870d419efeaadb332501a2bc9b809 | transaction |
# 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