AgentIdentity account maintains separate counters for verified and unverified feedback, so consumers can weight reputation scores accordingly.
FeedbackEntry PDA
Seeds:[b"feedback", nft_mint.as_ref(), reviewer.as_ref(), created_at.to_le_bytes()]
Event-only fields
These fields are emitted in theFeedbackGiven event but are not stored on the PDA. This saves approximately 236 bytes per feedback entry.
The
auth_verified boolean replaces storing the full 64-byte signature on-chain. The signature is always recoverable from the transaction logs.Ed25519 authorization flow
Before feedback can be submitted, the agent’sfeedback_authority must sign an authorization. This prevents spam by requiring the agent to acknowledge the reviewer.
1
Construct the message
The message is a 64-byte concatenation of the reviewer’s public key and the agent’s NFT mint:This minimal format authorizes any feedback from that reviewer for that agent, without being tied to a specific score or timestamp.
2
Sign with feedback authority
The agent’s server signs the message using the
feedback_authority private key (Ed25519).3
Submit with Ed25519 precompile
The reviewer includes the signature in the transaction. The Solana Ed25519 precompile program verifies the signature in a preceding instruction before
give_feedback executes.Payment proof weighting
TheAgentIdentity account maintains two pairs of counters:
Consumers can compute weighted reputation scores. For example, a simple approach is to weight verified feedback 3x:
has_payment_proof flag.
SDK examples
Submit feedback
Revoke feedback
Only the original reviewer can revoke their feedback. Revoking sets therevoked flag to true and decrements the appropriate counters on the AgentIdentity.
Anti-sybil measures
On-chain rate limiting is not enforced. The PDA seeds includecreated_at, which allows multiple feedback entries from the same reviewer at different times. Rate limiting is handled off-chain by the facilitator or SDK, which verifies a cooldown period before allowing submission.
The combination of payment proof weighting and off-chain rate limiting provides practical sybil resistance without adding on-chain complexity. Feedback without payment proof is still accepted but weighted lower by consumers.
Validation
Validation is a structured assessment of an agent by a designated validator. Unlike feedback (which anyone can submit), validation follows a two-step request-response flow aligned with ERC-8004: the agent owner requests validation, and the validator responds with a score and evidence.Two-step flow
1
Agent requests validation
The agent owner (or a delegate with appropriate permissions) calls
validation_request, specifying the validator, a hash of the request data, and a categorical tag. A ValidationRequest PDA is created with responded = false.2
Validator responds
The designated validator calls
validation_response with a score (0-100), tag, and evidence. The program creates a ValidationResponse PDA, sets responded = true on the request, and increments the agent’s validation_count.ValidationRequest PDA
Seeds:[b"val_request", nft_mint.as_ref(), validator.as_ref(), request_hash[..8]]
The PDA seeds use only the first 8 bytes of
request_hash. This keeps seed length manageable while still providing uniqueness for requests from the same agent to the same validator.ValidationResponse PDA
Seeds:[b"val_response", nft_mint.as_ref(), validator.as_ref(), request_hash[..8]]
Score range
Validation scores use the full 0-100 range (stored asu8), following ERC-8004 guidance for granular assessment.
Score interpretation is a convention, not enforced on-chain. Different validator communities may define their own scales. The program only enforces that the value is between 0 and 100.
No staking in v1
Following the ERC-8004 pattern, x84 v1 does not include staking requirements for validators. Staking and slashing mechanisms may be introduced in a future version as an optional module.Validation SDK examples
Request validation
requestUri is event-only — it is emitted in the ValidationRequested event for off-chain indexers but not stored on the PDA.