ERC-8240: Trust Infrastructure for Agents and Assets

Hi everyone,

I’d like to start a discussion for a new ERC proposal: Trust Infrastructure for Autonomous Agents and Tokenized Assets.

The problem in one sentence

Every tokenized asset on-chain has a price feed. None of them have a quality feed.

Why now

On April 18, 2026, Aave absorbed $196M in bad debt from rsETH (Kelp DAO). The asset had a price. It did not have a standardized quality assessment. The dependency chain — custodian, issuer, bridge, oracle — was invisible to consuming protocols. Guardian reaction took 77 minutes.

With $27B in tokenized assets on-chain today, 122K+ AI agents on BNB Chain, and Coinbase launching tokenized equities on Base in Q2 2026, the ecosystem needs a standard way to answer: is this asset sound? Is this agent trustworthy? Who is accountable when things go wrong?

What this ERC defines

Five composable interfaces — not a scoring methodology, not a rating system. The standard defines what trust data looks like, not how it’s computed:

Interface Purpose Level
IAttestation Factual, signed, contestable quality measurements MUST
IDecisionTrail On-chain audit trail for autonomous decisions SHOULD
IAccountability Dispute resolution, liability chain, insurance SHOULD
IRiskSignal Cross-chain risk regime detection (STABLE → CRISIS) SHOULD
IRWAPassport Machine-readable 7-layer risk passport for RWAs MAY

Full specification with Solidity interfaces in the draft below.

Key design decisions

  1. Factual, not opinion-based. Attestations are measurements (“847 jobs, 92% success rate”), never ratings or recommendations. Contestable by design.

  2. Implementation-agnostic. The standard defines interfaces. Scoring methodologies, risk models, and evaluation approaches are implementation-defined. Implementations compete on execution.

  3. Cross-chain by architecture. IRiskSignal is bridge-agnostic. Risk data created on one chain is readable on any other via mirror contracts. No bridge dependency.

  4. Composable, not subordinate. This ERC is composable with ERC-4626 (vaults), ERC-8004 (agent identity), ERC-3643 (regulated tokens), and ERC-8192 (mandated vault execution). It operates at the trust layer above these standards.

Relationship with ERC-8192

ERC-8192 defines delegated execution with risk bounds for vaults. This standard operates above: an ERC-8192 vault SHOULD consume IAttestation to validate executor trustworthiness, and IRiskSignal to halt execution during adverse regimes. ERC-8192 answers “how can an agent execute safely?” — this ERC answers “should this agent be trusted to execute?”

Reference implementation

A reference implementation is deployed and operational across two chains:

  • Base mainnet: 19 contracts including a live ERC-4626 vault with regime detection and auto-lockdown

  • Gnosis Chain: 7 canonical contracts for governance and dispute resolution

  • 439 Solidity tests, 0 failures, 28 test suites

  • 120+ tokenized assets scored continuously

  • Independent verification script running 8 checks across both chains

Verified contracts on BaseScan and GnosisScan. Full implementation available for reviewers upon request.

Products this standard enables

The standard is the engine — the products are what consumers build:

  • Quality-gated lending (collateral scored by quality, not just price)

  • Dynamic structured products (tranches rebalance on quality changes)

  • Quality-weighted indices (S&P 500 of tokenized assets)

  • Cross-chain quality arbitrage

  • Agent marketplaces with verifiable track records

  • MiCA/EU AI Act compliance via IDecisionTrail

Feedback requested

  1. Is the five-interface split the right decomposition?

  2. Is [0, 1000] the right score range for attestations?

  3. Are four regime states sufficient for IRiskSignal?

  4. Should the standard recommend a canonical/compute/mirror deployment topology, or stay silent?

  5. Is the composability model with ERC-8192 (trust layer above execution layer) useful?

Full draft specification (Abstract, Motivation, Specification with Solidity interfaces, Rationale, Backwards Compatibility, Security Considerations) is in the next post below.

Looking forward to feedback.

— Patrick Nicolas Badoux avvatar.io | patrick@avvatar.io

1 Like

ERC-XXXX: Trust Infrastructure for Autonomous Agents and Tokenized Assets

Discussion thread for a proposed ERC standard.

  • Author: Patrick Nicolas Badoux (patrick@avvatar.io)

  • Status: Draft

  • Type: Standards Track (ERC)

  • Created: 2026-04-22

  • Requires: ERC-165

  • Composable with: ERC-4626, ERC-8004, ERC-3643, ERC-8192


Abstract

This ERC defines five composable interfaces that provide verifiable trust infrastructure for autonomous AI agents and tokenized real-world assets (RWAs). The standard enables any on-chain or off-chain consumer — human, protocol, or AI agent — to query factual, signed, contestable attestations about an asset’s quality or an agent’s track record, trace the decision history behind any autonomous action, resolve disputes through a decentralized tribunal, consume cross-chain risk signals in real time, and read a machine-readable passport for any tokenized real-world asset.

The standard does not define scoring algorithms, risk models, or evaluation methodologies. It defines what trust data looks like — not how it is computed. Implementations are free to use any methodology that produces outputs conforming to these interfaces.


Motivation

The Problem

There are $27B in tokenized assets on-chain today, projected to reach $16T by 2030. Over 122,000 AI agents are registered on BNB Chain alone. BlackRock, Franklin Templeton, and Apollo are tokenizing on public blockchains. Every one of these assets has a price feed. None of them have a quality feed.

Price ≠ quality. An asset can have a high price and catastrophic quality (Luna/UST, 2022). A collateral position can be worth $10M in price and $0 in verifiable quality. An agent can have an ERC-8004 identity and zero track record.

On April 18, 2026, Aave — the largest lending protocol with $22B TVL — absorbed $196M in bad debt from a single tokenized asset (rsETH via Kelp DAO). The asset had a price. It did not have a quality assessment. The dependency chain (custodian, issuer, bridge, oracle) was not being measured continuously by any standard interface. The protocol’s Guardian reaction took 77 minutes. $6.2B left the protocol in 48 hours.

The problem was not the smart contract. The problem was the absence of a standard way to continuously assess the quality of tokenized assets and the trustworthiness of agents operating on them.

Why a Standard

Without standardization, every protocol reinvents trust assessment with incompatible interfaces:

  • Lending protocols cannot compare collateral quality across assets using a common interface

  • AI agents cannot prove their track record portably across chains

  • Regulators (MiCA, EU AI Act) require auditable decision trails that no current standard provides

  • Vault operators cannot gate deposits or execution by quality without custom integrations

  • Cross-chain consumers cannot read trust data created on another chain

This ERC provides the “thin waist” for trust data — a minimal, composable set of interfaces that any implementation can conform to, enabling an ecosystem of interoperable trust consumers and producers.

Products This Standard Enables

The standard is the engine. The products are what consumers build:

  • Quality-gated lending: a vault reads IAttestation to set borrowing terms by collateral quality (AAA = 3%, CCC = 12%) rather than price alone

  • Dynamic structured products: tranches that rebalance automatically when IRiskSignal detects quality changes

  • Quality-weighted indices: asset indices weighted by attestation scores with built-in decay

  • Cross-chain quality arbitrage: same asset on two chains, different quality assessments — detectable only with a standard interface

  • Agent marketplaces: match agents by verifiable track record via IAttestation, with disputes resolved via IAccountability

  • Compliance automation: IDecisionTrail provides the audit trail required by MiCA Article 60 and the EU AI Act for automated decision-making


Specification

The key words “MUST”, “MUST NOT”, “SHOULD”, “SHOULD NOT”, and “MAY” are to be interpreted as described in RFC 2119.

Overview

The standard defines five interfaces across two requirement levels:

Interface Purpose Level
IAttestation Factual, signed, contestable claims about subjects MUST
IDecisionTrail Auditable record of autonomous decisions SHOULD
IAccountability Dispute resolution, liability, insurance SHOULD
IRiskSignal Cross-chain risk signals and regime detection SHOULD
IRWAPassport Machine-readable identity for tokenized assets MAY

A conforming implementation MUST implement IAttestation and ERC-165. All other interfaces are optional but, if implemented, MUST conform to the signatures and semantics defined below.

1. IAttestation (MUST)

Factual, signed, contestable claims. An attestation is never an opinion or recommendation — it is a verifiable measurement: “847 jobs completed, 92% success rate, 3 certified evaluators” — never “good agent.”

solidity

interface IAttestation {
    /// @notice A new attestation has been recorded
    event AttestationCreated(
        bytes32 indexed attestationId,
        address indexed subject,
        address indexed attester,
        uint256 timestamp
    );

    /// @notice An attestation has been contested
    event AttestationContested(
        bytes32 indexed attestationId,
        address indexed challenger,
        bytes32 disputeId
    );

    /// @notice Record a factual attestation about a subject
    /// @param subject The address being attested (asset, agent, or protocol)
    /// @param factHash A keccak256 commitment to the factual claim data
    /// @param score A numeric quality measurement (0-1000)
    /// @param confidence The attester's confidence in the measurement (0-100)
    /// @param signature EIP-712 typed signature by the attester
    /// @return attestationId Unique identifier for this attestation
    function attest(
        address subject,
        bytes32 factHash,
        uint256 score,
        uint256 confidence,
        bytes calldata signature
    ) external returns (bytes32 attestationId);

    /// @notice Retrieve the current attestation for a subject
    /// @param subject The address to query
    /// @return score Current quality score (0-1000)
    /// @return confidence Confidence level (0-100)
    /// @return timestamp When the attestation was last updated
    /// @return attester Who created the attestation
    function getAttestation(address subject)
        external
        view
        returns (
            uint256 score,
            uint256 confidence,
            uint256 timestamp,
            address attester
        );

    /// @notice Check if an attestation is still fresh (not decayed)
    /// @param subject The address to query
    /// @param maxAge Maximum acceptable age in seconds
    /// @return fresh Whether the attestation is within maxAge
    /// @return age Actual age in seconds
    function isFresh(address subject, uint256 maxAge)
        external
        view
        returns (bool fresh, uint256 age);

    /// @notice Contest an existing attestation, initiating dispute resolution
    /// @param attestationId The attestation being contested
    /// @param evidence A keccak256 commitment to counter-evidence
    /// @return disputeId Identifier for the resulting dispute
    function contest(bytes32 attestationId, bytes32 evidence)
        external
        returns (bytes32 disputeId);
}

Decay semantics: Implementations SHOULD apply score decay when attestations are not refreshed. The decay model is implementation-defined, but isFresh() MUST accurately reflect whether the attestation meets the caller’s freshness requirement.

Score range: Scores are integers in [0, 1000]. Implementations MUST NOT return values outside this range. The mapping from score to qualitative labels (e.g., AAA, BBB, CCC) is implementation-defined and outside the scope of this standard.

2. IDecisionTrail (SHOULD)

Every autonomous decision recorded on-chain with its context.

solidity

interface IDecisionTrail {
    event DecisionRecorded(
        uint256 indexed decisionId,
        address indexed agent,
        uint8 actionType,
        uint256 timestamp
    );

    /// @notice Record an autonomous decision
    /// @param decisionHash Commitment to the full decision context
    /// @param actionType Enumerated action category
    /// @return decisionId Sequential decision identifier
    function commit(bytes32 decisionHash, uint8 actionType)
        external
        returns (uint256 decisionId);

    /// @notice Retrieve a recorded decision
    /// @param decisionId The decision to query
    /// @return agent Who made the decision
    /// @return decisionHash The committed context
    /// @return actionType The action category
    /// @return timestamp When it was recorded
    function getDecision(uint256 decisionId)
        external
        view
        returns (
            address agent,
            bytes32 decisionHash,
            uint8 actionType,
            uint256 timestamp
        );

    /// @notice Total number of decisions recorded
    function totalDecisions() external view returns (uint256);
}

Compliance note: This interface is designed to satisfy the audit trail requirements of MiCA (Markets in Crypto-Assets Regulation) and the EU AI Act for automated decision-making. Each decision is immutable, timestamped, and attributable to a specific agent.

3. IAccountability (SHOULD)

Dispute resolution, liability identification, and insurance. The first on-chain framework for agent accountability.

solidity

interface IAccountability {
    event DisputeFiled(
        bytes32 indexed disputeId,
        address indexed claimant,
        address indexed respondent
    );

    event VerdictReached(
        bytes32 indexed disputeId,
        uint8 outcome,
        uint256 timestamp
    );

    /// @notice File a dispute against an agent or evaluator
    /// @param respondent The party being disputed
    /// @param evidence Commitment to evidence data
    /// @param attestationId The attestation in question (if applicable)
    /// @return disputeId Unique dispute identifier
    function fileDispute(
        address respondent,
        bytes32 evidence,
        bytes32 attestationId
    ) external returns (bytes32 disputeId);

    /// @notice Query the status of a dispute
    /// @param disputeId The dispute to query
    /// @return status 0=pending, 1=deliberating, 2=resolved, 3=appealed
    /// @return outcome 0=undecided, 1=claimant wins, 2=respondent wins, 3=split
    /// @return deadline Timestamp by which verdict must be reached
    function getDisputeStatus(bytes32 disputeId)
        external
        view
        returns (uint8 status, uint8 outcome, uint256 deadline);

    /// @notice Identify the liability chain for a decision
    /// @param decisionId A decision from IDecisionTrail
    /// @return deployer Who deployed the agent
    /// @return operator Who operates the agent
    /// @return evaluator Who attested to the agent's quality
    function getLiabilityChain(uint256 decisionId)
        external
        view
        returns (
            address deployer,
            address operator,
            address evaluator
        );
}

Tribunal mechanics: Implementations that provide dispute resolution SHOULD use a panel of certified evaluators (minimum 3) with time-bounded deliberation (recommended 48 hours). Evaluator selection, scoring, and meta-scoring (scoring the judges) are implementation-defined.

Insurance: Implementations MAY include an insurance pool that compensates verified claims. The pool mechanics (premiums, coverage, payout triggers) are implementation-defined.

4. IRiskSignal (SHOULD)

Cross-chain risk signals with regime detection. Bridge-agnostic by design.

solidity

interface IRiskSignal {
    event RegimeChanged(
        uint8 indexed previousRegime,
        uint8 indexed newRegime,
        uint256 criValue,
        uint256 timestamp
    );

    event RiskAlert(
        address indexed subject,
        uint8 severity,
        bytes32 alertHash,
        uint256 timestamp
    );

    /// @notice Get the current system risk regime
    /// @return regime 0=STABLE, 1=ELEVATED, 2=CRISIS_FORMING, 3=CRISIS
    /// @return criGlobal Composite risk index (0-100)
    /// @return criStructural Topology concentration index (0-100)
    /// @return criActive Cascade signal index (0-100)
    /// @return lastUpdated Timestamp of last regime evaluation
    function getRegime()
        external
        view
        returns (
            uint8 regime,
            uint256 criGlobal,
            uint256 criStructural,
            uint256 criActive,
            uint256 lastUpdated
        );

    /// @notice Check if a specific subject is under risk alert
    /// @param subject The address to query
    /// @return underAlert Whether an active alert exists
    /// @return severity Alert severity (0=none, 1=low, 2=medium, 3=high)
    /// @return alertHash Commitment to alert details
    function getAlert(address subject)
        external
        view
        returns (bool underAlert, uint8 severity, bytes32 alertHash);

    /// @notice Get the contagion exposure of a subject
    /// @param subject The address to query
    /// @return exposureCount Number of dependencies under stress
    /// @return maxImpact Worst-case cascade impact (0-100)
    function getContagionExposure(address subject)
        external
        view
        returns (uint256 exposureCount, uint256 maxImpact);
}

Regime semantics: The four regimes represent escalating risk states. Consumers (vaults, agents, protocols) SHOULD define behavioral responses to regime changes. For example, a vault MAY block deposits during CRISIS regime (regime == 3).

Cross-chain design: This interface is designed for cross-chain consumption. Risk signals created on one chain SHOULD be readable on other chains via mirror contracts. The bridge mechanism is intentionally unspecified — implementations may use Chainlink CCIP, LayerZero, Hyperlane, or any relay. The standard does not depend on any specific bridge.

5. IRWAPassport (MAY)

Machine-readable identity for tokenized real-world assets. Seven risk layers.

solidity

interface IRWAPassport {
    /// @notice Get the full passport for a tokenized asset
    /// @param asset The token address
    /// @return issuer Address or identifier of the asset issuer
    /// @return assetClass Enumerated asset classification
    /// @return riskLayers Encoded risk assessment across 7 dimensions
    /// @return lastAudit Timestamp of last comprehensive audit
    /// @return incidentCount Number of recorded incidents
    function getPassport(address asset)
        external
        view
        returns (
            bytes32 issuer,
            uint8 assetClass,
            bytes32 riskLayers,
            uint256 lastAudit,
            uint256 incidentCount
        );

    /// @notice Get a specific risk layer score for an asset
    /// @param asset The token address
    /// @param layer 0=issuance, 1=counterparty, 2=market, 3=contagion,
    ///              4=regulatory, 5=smartContract, 6=operational
    /// @return score Risk layer score (0-100)
    /// @return confidence Measurement confidence (0-100)
    function getRiskLayer(address asset, uint8 layer)
        external
        view
        returns (uint256 score, uint256 confidence);
}

Seven risk layers: The standard defines seven risk dimensions for RWAs: issuance, counterparty, market, contagion, regulatory, smart contract, and operational. Each layer is scored independently (0-100). The aggregation methodology is implementation-defined.

Asset classes: The enumeration of asset classes (e.g., stablecoin, equity, commodity, real estate, DePIN node, infrastructure) is implementation-defined. The standard only requires that implementations use consistent uint8 encoding.


Rationale

Why Five Interfaces, Not One

Trust is not a single dimension. A high-quality asset (good IAttestation) may still be dangerous in a systemic crisis (bad IRiskSignal). An agent with excellent track record may have no accountability framework. Splitting into five interfaces allows consumers to adopt incrementally — a lending protocol may only need IAttestation and IRiskSignal, while a regulated fund may need all five.

Why Factual Attestations, Not Ratings

The standard deliberately avoids the word “rating” or “recommendation.” Attestations are factual measurements: “847 jobs, 92% success rate.” This is a design constraint, not a limitation. Factual attestations are machine-verifiable, contestable, and do not create the conflicts of interest inherent in rating agencies. The 2008 financial crisis demonstrated the failure of opinion-based ratings.

Why On-Chain Dispute Resolution

Off-chain dispute resolution is opaque and non-composable. On-chain disputes via IAccountability create a public, auditable, precedent-setting record. When an evaluator is found to have attested inaccurately, that finding is visible to all consumers forever. This creates a self-correcting incentive system without requiring a central authority.

Why Implementation-Agnostic

The standard defines what trust data looks like, not how it is computed. This is intentional: scoring methodologies, risk models, and evaluation approaches will evolve faster than standards. By standardizing the interface layer, we allow competition between implementations while preserving interoperability for consumers.


Backwards Compatibility

ERC-4626 (Tokenized Vaults)

A vault implementing ERC-4626 can consume IAttestation to gate deposits by collateral quality and IRiskSignal to adjust behavior by risk regime. The interfaces are additive — they do not modify ERC-4626 semantics.

ERC-8004 (Agent Identity)

ERC-8004 provides identity. This standard provides verifiable capability and track record. An ERC-8004 agent identity gains a quality attestation via IAttestation, a portable track record across chains, and a dispute resolution framework via IAccountability. The two standards are composable: identity (8004) + trust (this ERC).

ERC-3643 (Regulated Tokens)

ERC-3643 provides compliance infrastructure for security tokens. IRWAPassport extends this with continuous risk assessment across seven layers. IDecisionTrail provides the audit trail that regulated token operators need for MiCA compliance.

ERC-8192 (Mandated Execution for Tokenized Vaults)

ERC-8192 defines delegated execution with risk bounds for ERC-4626 vaults. This standard operates at the layer above: an ERC-8192 vault SHOULD consume IAttestation to validate executor trustworthiness before granting execution rights, and SHOULD consume IRiskSignal to halt mandated execution during adverse regime conditions (e.g., CRISIS). The two standards are complementary — ERC-8192 answers “how can an agent execute safely?” while this ERC answers “should this agent be trusted to execute, and is the asset it touches sound?”


Security Considerations

Adversarial Constraints

The following six constraints MUST be considered by any implementation:

Constraint 1 — Bridge Independence. The standard MUST NOT depend on any specific cross-chain bridge. If a bridge fails, the trust data on each chain must remain valid independently. Implementations SHOULD support multiple relay mechanisms.

Constraint 2 — Attester Collusion. Implementations MUST consider the risk that attesters collude to inflate scores. Recommended mitigations include: requiring multiple independent attesters, implementing meta-scoring (scoring the scorers), and enforcing decay on attestations from inactive evaluators.

Constraint 3 — Score Manipulation. Attestation scores MUST NOT be manipulable within a single transaction. Implementations SHOULD enforce minimum time delays between score updates and SHOULD use commit-reveal schemes for high-stakes attestations.

Constraint 4 — Regime Gaming. The risk regime (IRiskSignal) MUST NOT be triggerable by a single actor. Implementations SHOULD derive regime from multiple independent data sources and SHOULD implement hysteresis (requiring sustained signals before regime transitions).

Constraint 5 — Pillar Extraction. The five interfaces are designed to be interdependent. An attestation (IAttestation) without accountability (IAccountability) creates unaccountable claims. A risk signal (IRiskSignal) without a decision trail (IDecisionTrail) creates unattributable alerts. Implementations that adopt only a subset SHOULD document which trust guarantees are weakened.

Constraint 6 — Implementation Leakage. The normative sections of this standard MUST NOT contain implementation-specific details (specific cryptographic schemes, proprietary algorithms, or platform-specific constructs). The standard defines interfaces; implementations compete on execution.

Oracle Trust

Consumers of IAttestation and IRiskSignal should be aware that these interfaces surface data produced by off-chain or on-chain evaluation processes. The standard provides contestability (contest() in IAttestation, fileDispute() in IAccountability) as the mechanism for challenging incorrect data, rather than assuming any evaluator is infallible.

Freshness and Decay

Stale trust data is dangerous. The isFresh() function in IAttestation allows consumers to enforce their own freshness requirements. Implementations SHOULD make their decay model transparent and SHOULD emit events when attestations transition freshness tiers.


Reference Implementation

A reference implementation is deployed and operational:

  • Base mainnet (chainId 8453): 19 contracts, including a live ERC-4626 vault with regime detection and auto-lockdown

  • Gnosis Chain (chainId 100): 7 canonical contracts for governance and dispute resolution

  • Test coverage: 439 Solidity tests, 0 failures, 28 test suites

  • Continuous verification: An independent verification script (verify_alia.py) runs 8 checks across both chains

  • Assets monitored: 120+ tokenized assets scored continuously

The reference implementation is available for reviewers upon request. A public documentation site is in preparation.

Verified contract addresses:

Contract Chain Address
COLOracle (IAttestation) Base 0xe1D56f8DB28C4F257dF4A501e1D304073475ce14
DecisionRegistry (IDecisionTrail) Base 0x7C74b49DDF20063aE935D43c90799E19f10f1C42
ALIAStandardRegistry Gnosis 0xfC9cA736d384D482af5d23CC7616765C66244D29
EvaluatorScoring Gnosis 0x002daE518967a6eADaF71F41e95A1D04DA47bC4A
LiabilityResolver (IAccountability) Gnosis 0x8E6434d860A9c83728376E807b6c55C8e3395d2c
ALIASwarmAppeal (IAccountability) Gnosis 0x75bFA66024A4810CD82C587706706298a3e2DD7D

Feedback Requested

  1. Interface granularity: Is the split into five interfaces the right level of decomposition, or should IDecisionTrail and IAccountability be merged into a single IAuditability interface?

  2. Score range: Is [0, 1000] the right range for attestation scores? Alternatives considered: [0, 100] (simpler but less granular), [0, 10000] (basis points alignment).

  3. Regime enum: Are four regime states (STABLE, ELEVATED, CRISIS_FORMING, CRISIS) sufficient, or should the standard allow implementation-defined extensions?

  4. Cross-chain canonical model: The reference implementation uses a canonical chain (Gnosis) for governance and compute chains (Base, BNB) for scoring. Should the standard recommend this architecture, or remain silent on deployment topology?

  5. Relationship with ERC-8192: Is the composability model described above (this ERC as the trust layer above ERC-8192’s execution layer) the right framing? Would ERC-8192 implementers find this integration useful?


Copyright

Copyright and related rights waived via CC0.

Update on the Aave/rsETH proof point referenced in the original post.

Bankless published a full analysis two days ago (“DeFi Shaken by rsETH Attack”). The contagion data confirms exactly the pattern IRiskSignal is designed to detect:

  • Aave: -$6.2B (-23%) net outflows

  • Morpho: -$716M (-9%)

  • Sky: -$272M (-4%)

  • JupLend: -$76M (-8%)

The attack vector: the attacker poisoned the RPC infrastructure used by LayerZero’s DVN, forcing failover onto compromised nodes, then spoofed a cross-chain message to mint 116.5K unbacked rsETH. A bridge dependency that no protocol was measuring continuously.

Ryan Sean Adams’ take: “$2-3 billion in bridge hacks since 2021. 35% of DeFi TVL today has third-party bridge dependency.”

This is the exact problem the five interfaces in this proposal address:

  • IAttestation would have surfaced the bridge dependency as a scored risk factor — not hidden in documentation, but queryable on-chain by any protocol

  • IRiskSignal would have detected the regime shift (STABLE → CRISIS) and propagated it cross-chain in seconds, not minutes

  • IAccountability traces the liability chain — who operated the bridge DVN, who attested to its reliability, who pays

The 77-minute Guardian response time at Aave is not an Aave-specific failure. It’s a structural gap: no standard interface for continuous quality assessment of tokenized asset dependencies. That gap cost Morpho $716M in outflows too.

Reference implementation on Base was in CRISIS regime during the exploit — the vault would have blocked deposits automatically.

Pat

1 Like

Update: this draft has been submitted as ERC-1705 to the ethereum/ERCs repository. PR: https://github.com/ethereum/ERCs/pull/1705

The discussions-to field in the preamble points to this thread. Feedback welcome here or on the PR.

Pat

Patrick — Aave/rsETH framing is sharp, and the trigger makes the case for why this matters now. Two notes from the envelope side (ERC-8183), since you named it in the composability list.

The split reads cleanly as complementary layers: 8183 specifies how independent issuers sign and compose attestations off-chain with JWKS and per-dimension isolation; ERC-1705’s `IAttestation` specifies how an on-chain consumer reads the result. Off-chain envelope → on-chain consumer, with minimal transformation if the vocabularies align.

Two concrete hooks worth naming so they don’t drift:

- **Per-predicate binding.** Envelope attestations bind a `conditionHash` plus a chain-appropriate block/slot/ledger anchor to each signed dimension. If `IAttestation` carries the same field (or an equivalent), a single off-chain attestation flows into an on-chain consumer without re-encoding.

- **Factual, not opinion-based.** Same invariant the envelope cases are pinned on. Worth stating it as a spec-level MUST in ERC-1705 if it isn’t already — cases that violate it (opinion dressed as attestation) aren’t rescuable at the interface layer.

A live case library for 8183 went up this week at [envelope-in-action](GitHub - erc-8183-cases/envelope-in-action: Case library and format-fit notes for the ERC-8183 Multi-Attestation Envelope · GitHub) — three cases across two topologies, contributed by different issuers. Fitness-for-purpose feedback from an ERC-1705-consumer perspective would be genuinely useful on our side.

On your question to @davidecrapis.eth about standardizing what the Evaluator attests — from the case-library angle, “envelope-conformant, JWKS-verifiable, conditionHash-bound” is a natural shape for the Evaluator’s output. Scoring methodology stays implementation-defined, which matches ERC-1705’s “data shape, not computation” stance.

1 Like

@ThoughtProof

First thanks for the detailed response.

Note: the thread title has been updated to ERC-1705 to match the PR number on ethereum/ERCs ( Add ERC: Trust Infrastructure for Agents and Assets by nicobernad · Pull Request #1705 · ethereum/ERCs · GitHub ).

On your two hooks:

Per-predicate binding: IAttestation carries a contextHash (keccak256 commitment to methodology + data sources) and sourceChainId. If the envelope’s conditionHash maps 1:1 to contextHash, no re-encoding needed. Worth aligning the field names before both specs harden.

Factual MUST: Already in the spec as a normative constraint (Security Considerations, Constraint 3). I’ll promote it to a top-level MUST in the Specification section for cross-spec clarity.

Noted the case library at envelope-in-action . will map the three cases against submitAttestation() once the field alignment on conditionHash is clearer.

Pat

Hi Patrick:

:waving_hand: We build RNWY.com, trust intelligence for AI agents across ERC-8004, MCP servers, and A2A registries. A few thoughts on your feedback questions.

Five interfaces (question 1)

The decomposition feels right, including IRWAPassport.

Score range (question 2)

0–1000 feels like the right call.

Finer granularity matters when aggregating across many signal dimensions. A 100-point scale compresses distinctions that are meaningful in practice.

Regime states (question 3)

A possible five-state sequence: STABLE, WATCH, ELEVATED, CRISIS, RECOVERY.

RECOVERY covers the period after a crisis passes but before normal operation resumes.

Moving straight from CRISIS to STABLE assumes it’s over. Sometimes it isn’t. Each state should map to a specific set of automated protocol behaviors, otherwise the gradations have no operational meaning.

Deployment topology (question 4)

Stay silent. Implementers will find the topology that fits their environment. A prescribed pattern constrains without helping.

Trust layer above execution (question 5)

Yes. One addition worth considering: trust doesn’t just gate entry, it shapes what execution is permitted to do at each step. Higher trust unlocks wider permissions. Lower trust restricts them. New agents with no history operate with limited scope and earn wider permissions through demonstrated behavior over time. :slightly_smiling_face:

hi @RNWY thanks for the detailed feedback. Two points I want to address specifically:

RECOVERY state: Strong addition. We have CRISIS_FORMING for entry. RECOVERY handles exit. Moving CRISIS → STABLE in one step risks re-opening permissions before the system has actually stabilized. Will add RECOVERY as a fifth regime state in the next draft revision.

Trust shaping execution scope: This matches the reference implementation exactly. The VaultGuardian operates with 11 protection modes / so each regime restricts what actions are permitted. A new agent with no attestation history gets minimal permissions (deposit-only, no rebalance). Permissions widen as the attestation record grows. The spec should make this pattern explicit rather than leaving it implicit. Good call…..

On deployment topology . Agreed, staying silent is the right approach. Implementations will find their own architecture.

Would be interested to hear how RNWY’s trust intelligence pipeline maps to IAttestation — are you computing signals that could conform to the submitAttestation() interface?

Pat

Hi Pat: glad RECOVERY and trust-shaping both landed. Two draft revisions worth tracking.

Scope note first: RNWY’s surface is the agent and wallet side, not asset-level, so the Assets half of 1705 is out of our lane. For the Agents half:

Three signals map naturally to submitAttestation(), carried across two signed envelopes:

  • peer_review — reviewer-credibility-weighted feedback; coordinated-review clusters are nullified from the score, with the sybil flag surfaced separately.
  • behavioral_trust — longitudinal on-chain history, wallet tenure, ownership lineage.

Both emitted together from /api/trust-check?wallet=, kid rnwy-trust-v2.

  • wallet_intelligence — dual scores (Signal Depth/Activity, Risk Intensity) computed over history, not point-in-time state. Separate endpoint, kid rnwy-wallet-v1.

A fourth signal, rnwy-mcp-v1, covers MCP server attestations — sits outside the Agents half of 1705 but exists in the same JWKS if useful for adjacent specs.

Subjects are wallet-bound; chain auto-resolves server-side. All offline-verifiable against https://rnwy.com/.well-known/jwks.json.

One posture note: RNWY’s signals are observational, not policy-enforcing. Every score shows its math and leaves the decision to the consumer. Your permissions-widen-as-attestation-record-grows framing tracks with this naturally — the record accrues, the permissions earn in.

Happy to map field-by-field against submitAttestation() once v2 is out; easier with the interface in front of us than to pre-commit shape.

Pat — agreed on aligning before both specs harden. One observation from the envelope-issuer side:

conditionHash and contextHash commit to different objects, not just different algorithms. The envelope’s conditionHash is a per-call commitment over the evaluated predicate — SHA-256 over canonical JSON of the specific conditions queried, included for tamper-evidence on what was asked, and varies per attestation. In PR #1705, contextHash commits to the methodology/data-sources doc (L64 NatSpec + §1 SHOULD L98) — a per-methodology pointer that’s typically static across many attestations from the same issuer.

A 1:1 field-name mapping would force one or the other to give up its semantics: either conditionHash stops varying per-call, or contextHash churns per-attestation. Neither serves the field’s role.

Separate but compounding: your post pins contextHash to keccak256, but the spec text (L64 NatSpec + §1 conformance L95–99) leaves the algo unspecified — only decisionHash in §2 pins keccak256. Envelope is SHA-256 canonical JSON either way; wire-level bytes32 values wouldn’t interoperate even if the semantic targets matched.

Boundary on our side: InsumerAPI sits as an off-chain Evaluator input feeding an IAttestation consumer, not an IAttestation implementer directly — envelope-as-pre-image (Raul’s post #5) is how /v1/attest output travels into submitAttestation() on the consumer side.

— Douglas

@RNWY

Thanks for the detailed mapping, this is exactly the kind of input that strengthens the spec.

Three observations:

Agent-side scope: noted. The split makes sense — your three signals (peer_review, behavioral_trust, wallet_intelligence) cover the agent attestation surface. The asset side is a different set of attesters with different data sources. Clean separation.

Observational posture: “shows its math and leaves the decision to the consumer” is the same invariant as Constraint 3 in the spec (factual, not evaluative). Good alignment — means your signals wouldn’t need reshaping to conform.

Field mapping timing: agreed — easier with the interface in front of us. The PR is live at ethereum/ERCs#1705, the IAttestation interface is stable. Happy to coordinate when rnwy-trust-v2 ships.

One question: does the kid field in your JWKS map to what we call contextHash (keccak256 commitment to methodology + data sources)? If so, that’s the bridge between off-chain JWKS verification and on-chain attestation identity.

Patrick

@douglasborthwick-cry

Thanks for the precision on this, it catches a real spec ambiguity.

conditionHash ≠ contextHash: you’re right, these commit to different objects. contextHash is per-methodology (static across attestations from the same issuer). conditionHash is per-call (what was queried). Forcing a 1:1 mapping breaks one or the other. The spec should keep contextHash as-is and leave conditionHash as an envelope-layer concern — it’s part of the pre-image that feeds into submitAttestation(), not a field the on-chain interface needs to store.

Hash algo: good catch. The NatSpec references keccak256 but the normative conformance section doesn’t pin it. I’ll make this explicitly algo-agnostic in the next revision — bytes32 commitment, algorithm unspecified. This keeps the door open for SHA-256 canonical JSON on the envelope side and keccak256 on the EVM side without forcing either.

Boundary: “off-chain Evaluator input feeding an IAttestation consumer” is the clean layer split. The envelope produces the pre-image, the consumer calls submitAttestation(). No need for the interface to know about envelope internals.

Two spec revisions queued from this exchange: (1) NatSpec algo-agnostic on contextHash, (2) clarify that per-call predicate commitments live in the envelope layer, not in IAttestation.

Patrick

Hi Patrick, glad the mapping landed.

Quick clarification: rnwy-trust-v2 is already live in the JWKS; it’s what we sign trust-check envelopes with today. Happy to coordinate against IAttestation whenever the v2 PR is at a stable point.

On the kid to contextHash question: orthogonal. kid identifies the signing key (which RNWY rotation produced the JWS); contextHash as you’ve defined it commits to methodology and data sources, which is a different field doing different work. Same envelope, two concerns; one says who signed, the other says what was signed about.

Easy bridge to add. RNWY’s envelopes already carry methodology references and data-source provenance inline in the evidence object; computing a keccak256 over those is straightforward. The shape question: is contextHash intended to be stable per provider/methodology version (rotation-grade), or per-attestation (methodology plus the specific subject’s data inputs)? That changes whether it’s a kid-like field or a per-payload field. Easier to align once v2 is in front of us.

1 Like

@RNWY

thanks, good to know rnwy-trust-v2 is already live.

On kid vs contextHash: agreed, orthogonal — kid identifies the signer, contextHash identifies the methodology.

On the shape question: contextHash is per-provider/methodology version (stable across attestations from the same issuer using the same methodology). Per-attestation predicate commitments live in the envelope layer, not in IAttestation . this was clarified in an exchange with @douglasborthwick-cry earlier in this thread.

So for RNWY: one contextHash per kid version (e.g., rnwy-trust-v2 maps to one contextHash). It rotates when the methodology changes, not per call. The keccak256 over your methodology references + data-source provenance is the right computation.

Patrick

Hi @nicopat: we published our four contextHashes at https://rnwy.com/.well-known/context-hashes.json, one per active signing kid (rnwy-trust-v1, rnwy-trust-v2, rnwy-wallet-v1, rnwy-mcp-v1).

Each entry includes the canonical_input string so consumers can independently recompute the keccak256. Methodology or data-source category changes rotate the hash; nightly scoring runs don’t.

JWKS remains at https://rnwy.com/.well-known/jwks.json — four EC P-256 keys, same kid mapping.

Happy to discuss the canonicalization approach if it’s useful for the spec. :slight_smile:

1 Like

@RNWY

Really clean

The canonical_input approach is exactly right . deterministic recomputation is what makes contextHash trustless rather than opaque.

We’ll reference this as the first external implementation in the ERC-1705 spec update.

One question: would you be open to a joint interop test?

Your rnwy-mcp-v1 signs an attestation, ALIA’s contract verifies the contextHash on-chain, the decision gets committed to DecisionRegistry. End-to-end proof that two independent systems compose through the standard. Happy to set it up on Base Sepolia.

Really glad to have you pushing this forward.

@nicopat glad to hear it. We’re in for the interop test.

Confirmed on rnwy-mcp-v1 for the demo. contextHash and JWKS are both live at the well-known endpoints.

One question on logistics: what do you need from our side? Specifically — does ALIA’s contract need us to submit the signed envelope on-chain, or do you just need us to emit the JWS and you handle the verification and DecisionRegistry write from there?

That’ll tell us whether we need a Base Sepolia wallet on our end or whether this is purely your contract consuming our existing endpoints.

Ready when you are.

Hi @RNWY

Second option. you emit the JWS, we handle everything on-chain. No wallet or gas needed on your side.

Flow: ALIA’s keeper fetches your signed envelope from the well-known endpoint, verifies the JWS against your JWKS, recomputes contextHash from canonical_input, and writes to DecisionRegistry on Base Sepolia. Your side is purely your existing endpoints.

This is the cleaner demo — it proves an external evaluator can feed ERC-1705 without touching the chain. The standard supports direct on-chain submission too, but the off-chain envelope pattern is where the scale is.

I’ll deploy the Sepolia contracts this week and share the full flow.

PAtrick

@nicopat: sample attestation is live at https://rnwy.com/.well-known/sample-attestation.json

Signed under rnwy-mcp-v1, ES256. Includes the full score breakdown for blockscout/mcp-server. canonical_input is inline so your keeper can recompute the contextHash independently.

All three files your keeper needs:

Ready on our side whenever the Sepolia contracts are up.

@RNWY

Thanks for the sample attestation and the three endpoints. That’s exactly what the keeper needs. Status on our side: we built the keeper and the full evaluator interface this weekend, but haven’t run it against your endpoints yet — that’s this week’s priority.

One change from the original plan: we deployed the AttestationRegistry directly on Base mainnet (0xB6d759449317b061529e42543109dc89FAbFd482) instead of Sepolia. Gas on Base is <$0.001/tx.

You’re registered as evaluator #1. We can still deploy Sepolia if you prefer a testnet first. What’s ready: — Keeper: fetches JWS, verifies EC P-256 against JWKS, recomputes contextHash from canonical_input, writes submitAttestation() on-chain. --dry-run supported.

4 MCP tools evaluator-facing: submit, read-back, check status, track consumption. — Verification API + webhook notifications.

Important : We decided to build 5 new contracts that consume attestation data , to ease adoption and support you :

  • AgentLifecycle (your scores drive ACTIVE/SUSPENDED transitions),
  • BehaviorMonitor (sybil alerts on-chain),
  • DependencyGraph (hasSybilLink verifiable by any protocol),
  • AgentComposability (scores propagate through delegation chains),
  • AgentMandate (permissions gated by lifecycle state). Your data doesn’t just sit in a registry . it powers the state machines. Plan for this week: run the keeper against your sample attestation, first on-chain write, share the tx. We’ll need two things from you: (1) what address for your evaluator on-chain (currently placeholder), (2) webhook URL if you want event notifications. Happy to discuss evaluator economics when you’re ready . We have a fee model designed. Available all week. Thanks !