Two independent agents, a real on-chain payment, cryptographically verified cross-attestations, and a trust score that moves on genuine, non-self-dealing data.
| Role | Address |
|---|---|
| Agent A (payer) | 0xeAC9B63C5297623CB8BE50669B471D72b749B6Ff |
| Agent B (payee) | 0xe1017d91d74f7d15e1c89ca033BFf22303009344 |
Distinct keypairs, distinct addresses, neither owns the other.
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.
0x6c4aec2a1bfda9ed9fbd2ba0efc4622e8970de26ce6b7886af11a3168ea7aa00tx.from = relayer; USDC Transfer from = Agent A → to = Agent B, value 2000000Both parties attested to the same payment using the public client helper, POSTed to the live /v2/api/attest:
| Attester | Role | Result | ID |
|---|---|---|---|
| Agent A | payer | verified | 12 |
| Agent B | payee | verified | 13 |
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.
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.
GET /v2/api/trust?agent_id=demo-agent-001 → byte-identical to the pre-build baseline (1021 bytes, score 656).afg-v2 service has no attestation weight set → defaults to 0 (off).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.
0x6c4aec2a1bfda9ed9fbd2ba0efc4622e8970de26ce6b7886af11a3168ea7aa00 (Base Sepolia)0xc1428db562f4fbbff963f35d5d8f23f4d8dc13535164f571e9d8ed3aa1502095GET /v2/api/attestations?address=0x...