End-to-end loop demo

Two independent agents, a real on-chain payment, cryptographically verified cross-attestations, and a trust score that moves on genuine, non-self-dealing data.

1Two independent agents

RoleAddress
Agent A (payer)0xeAC9B63C5297623CB8BE50669B471D72b749B6Ff
Agent B (payee)0xe1017d91d74f7d15e1c89ca033BFf22303009344

Distinct keypairs, distinct addresses, neither owns the other.

2A real payment between them (x402 shape)

Agent A paid 2.0 USDC to Agent B, submitted by a relayer via EIP-2612 permit + transferFrom — so tx.from (the relayer) is not the USDC sender (Agent A). This is the real account-abstracted / x402 shape, and it's exactly the case that breaks naive "trust tx.from" designs.

3Cross-attestation (the non-self-dealing part)

Both parties attested to the same payment using the public client helper, POSTed to the live /v2/api/attest:

AttesterRoleResultID
Agent Apayerverified12
Agent Bpayeeverified13

The signer is recovered from the signature and matched to the on-chain USDC Transfer party (not tx.from), so the relayer-submitted payment verifies for both sides.

Why this matters: attestation #12 is signed by Agent A, about a payment to Agent B. When scoring Agent B, that is an independent attestation from a different wallet — so the self-dealing guard does not drop it. These are the first genuine non-self-dealing attestations in the table.

4The score moves — on real, independent data (test config only)

Scoring Agent B with the attestation weight turned on in a throwaway test process (the live service stayed at weight 0):

verified attestations involving B: 2
  - attester 0xe101…9344  (B itself)   -> DROPPED (G1 self-dealing)
  - attester 0xeAC9…B6Ff  (Agent A)    -> KEPT (independent)

baseline (no attestation factor): 500
TEST-config score for B:          515   (+15.0 pts)

dropped_self_dealing: 1
distinct_independent_attesters: 1

B's score rises only because of A's independent, verified attestation. B's self-attestation is dropped. Guards G1 (self-dealing), G2 (cluster), G3 (distinct attester) all evaluated.

5The live product is untouched

The capability is proven; the live score is unchanged. Calibrating real weights waits until there is real attestation volume to justify them — not a sample of wallets we seeded ourselves.

Verifiable artifacts
Payment tx: 0x6c4aec2a1bfda9ed9fbd2ba0efc4622e8970de26ce6b7886af11a3168ea7aa00 (Base Sepolia)
Funding tx: 0xc1428db562f4fbbff963f35d5d8f23f4d8dc13535164f571e9d8ed3aa1502095
Attestation IDs: 12 (A→payer), 13 (B→payee)
Client helper: afg_attest_client.py · Read them back: GET /v2/api/attestations?address=0x...