basis.
This is the dispute-loop surface. When a merchant disputes a credit-risk verdict, when a service provider cross-attests inventory custody, when a business buyer attests a merchant’s reliability — those are all Schema D rows. The reconciler closes the loop by mirroring current registry status onto every ACTIVE Schema D attestation every 6 hours, so verifiers can decide whether to honor an attestation issued by a party whose standing has since changed.
| Schema name | CrossAttestation |
| EAS revocable | yes |
| Expiry semantics | none |
| Issued by | Any registered merchant / lender / business-buyer / service-provider |
| Subject | Any registered merchant / lender / business-buyer / service-provider |
| MCP tool | verify_cross_attestation, get_trust_dossier |
| Verifier API | GET /v2/attestations/cross/subject/:rootUid and GET /v2/attestations/cross/issuer/:rootUid |
Network & UIDs
| Network | EAS contract | Schema UID | Explorer |
|---|---|---|---|
| Base mainnet | 0x4200000000000000000000000000000000000021 | 0xb076cf65e9547678fe0e0c5ff010b504e7133ffe03977dc5fad2598723e5554e | basescan · easscan schema |
| Base Sepolia | 0x4200000000000000000000000000000000000021 | resolve via chain field on /v2/attestations/cross/* | sepolia.basescan |
Field reference
ABI schema string:| Field | Solidity type | Semantic | Mutability |
|---|---|---|---|
issuerRootUid | string | Attester anchor. Form: "<entityType>:<entityId>" where entityType ∈ {merchant, lender, business-buyer, service-provider}. | immutable per attestation |
subjectRootUid | string | Subject anchor. Same form as issuerRootUid. | immutable per attestation |
trustScore | uint8 | 0-100. Semantically not canonicalized by Droplinked — a 70 from a lender and a 70 from a business-buyer are not directly comparable. Always combine with basis and issuerEntityType when consuming. | immutable per attestation |
basis | string | Free-text basis for the score. Capped at 512 bytes (~$0.08 mainnet gas). | immutable per attestation |
attestedAt | uint256 | Unix seconds. Block-mined issuance time. | immutable |
| Envelope field | Type | Semantic |
|---|---|---|
uid | bytes32 | Attestation UID. |
schema | bytes32 | Schema UID (above). |
attester | address | Issuer’s on-chain signing wallet. For service-provider issuers this is the partner’s operator wallet (currently ACTIVE in ServiceProviderRegistry). |
recipient | address | Subject’s wallet or 0x0 (subject identity is in subjectRootUid). |
time | uint64 | Mirrors attestedAt. |
expirationTime | uint64 | 0 (no expiry). |
revocationTime | uint64 | 0 if active. |
revocable | bool | true. |
data | bytes | ABI-encoded payload per the schema string above. |
Registry-status mirror (attestorCurrentStatus)
The reconciler sweeps every 6 hours and mirrors the current issuer registry status onto every ACTIVE Schema D row. This is how Schema D closes the dispute loop:
service-provider issuers, this mirrors ServiceProviderRegistry. For other issuer types (merchant, lender, business-buyer), this remains null until those registry lookups are wired into the reconciler.
The reconciler never auto-revokes. A Schema D attestation issued by a service provider that has since been SUSPENDED (e.g., contract terminated, custody dispute) is still on-chain ACTIVE — the chain has no opinion. Verifier policy decides whether to honor it. The MCP get_trust_dossier tool exposes the mirror in its envelope.
How Schema D closes the loop on disputes
The 4-axis trust fabric is open on the inputs (lenders write B + C, operators write A) but the resolution loop is also open: a disputing party writes a Schema D attestation referencing the disputed record. Two patterns are observed in production:- Counter-attestation — a merchant disputes a Schema B verdict by minting a Schema D row with
subjectRootUid = "lender:<lenderId>",trustScorelow, andbasisciting the disputed UID. Subsequent verifiers see both records and apply their own policy. - Service-provider attestation — a WMS partner (e.g., Stor’d) cross-attests inventory custody. This is independent evidence feeding back into the lender’s Schema B re-underwrite at next term. The
service-providerissuer class is registered inServiceProviderRegistry; the partner’s signing wallet must beACTIVEfor the attestation to be honored.
Read via Droplinked API
By subject — “what has anyone said about this entity”:Read via viem (TypeScript)
Read via ethers (TypeScript)
Read via Cast (Foundry)
Indexer access (EAS GraphQL)
- Base mainnet: https://base.easscan.org/graphql
- Base Sepolia: https://base-sepolia.easscan.org/graphql
GET /v2/attestations/cross/subject/:rootUid). EAS GraphQL has no native index on the encoded subjectRootUid string.
Trust assumptions
A Schema D attestation is authoritative if and only if:- The on-chain
schemamatches the mainnet UID above. - The on-chain
attesterwallet maps to a currentlyACTIVEregistered entity. Forservice-providerissuers, checkServiceProviderRegistry(Droplinked-side admin lookup) — the verifier API exposes the mirror viaattestorCurrentStatus. revocationTime == 0.- The semantic interpretation of
trustScoreis the consumer’s responsibility — Droplinked does not canonicalize a comparable scale acrossissuerEntityTypeclasses. Always readbasisandissuerEntityTypetogether with the score.
Related
- Trust Fabric overview
- Schemas overview
- Schema B — Credit-risk attestation (the most-disputed surface)
- Schema C — Repayment-history attestation
get_trust_dossierMCP tool — multi-axis composite read