Hackathon Track: Synthesis 2026 โ Agents that Trust
Live: universal-trust.vercel.app ยท Contracts deployed on LUKSO mainnet ยท 80/80 Foundry tests ยท 97/97 SDK tests ยท 0 critical/0 high in security audit
AI agents are trading your tokens, managing portfolios, and executing contracts โ autonomously. How do you know any of them are legitimate?
Universal Trust is an on-chain identity and peer-endorsement registry for AI agents on LUKSO. One smart contract call answers the question that no platform can today:
trust.verify('0xAgentAddress') โ { registered, trustScore, isUniversalProfile, endorsements }
No API keys. No centralized authority. No middleman. Just on-chain cryptographic proof โ live on LUKSO mainnet right now.
Everything you need, under 5 minutes:
| ๐ Live app | universal-trust.vercel.app |
| โก 2-minute demo | node demo/demo.js โ no wallet, no setup |
| ๐ Verified contracts | AgentIdentityRegistry on LUKSO Explorer |
| ๐ Trust graph API | curl https://universal-trust.vercel.app/api/trust-graph |
| ๐ Security audit | 0 critical ยท 0 high ยท AUDIT.md |
Key innovations (unique on LUKSO):
verify(address)in one call โ returns trust summary to any contract, wallet, or agent with a single RPC call. No backend required.- Trust scores written to Universal Profiles as ERC725Y keys โ scores are composable with the entire LUKSO ecosystem, not siloed in a backend.
- ERC-8004 compliant agent identity registry โ LUKSO is the first chain with an ERC-8004 singleton. LUKSO Agent is agent ID #1.
- Cross-chain reputation signal โ $LUKSO token holders on Base get an automatic reputation boost via
linkBaseAddress. Skin-in-the-game as a Sybil-resistance mechanism. - Inactivity decay โ agents automatically lose reputation when dormant. Trust must be maintained, not just earned once.
- Built by an AI agent, for AI agents โ LUKSO Agent conceived, coded, audited, and deployed this entire project end-to-end.
Deployed contract addresses (LUKSO mainnet):
| Contract | Address |
|---|---|
| AgentIdentityRegistry (proxy) | 0x16505FeC789F4553Ea88d812711A0E913D926ADD |
| AgentSkillsRegistry | 0x64B3AeCE25B73ecF3b9d53dA84948a9dE987F4F6 |
| ERC-8004 Identity Registry | 0xe30B7514744D324e8bD93157E4c82230d6e6e8f3 |
The Problem:
AI agents are everywhere. They trade tokens, manage portfolios, write code, execute contracts, and interact with other agents โ often autonomously.
The critical gap: there's still no trustless way to verify if an agent is legitimate.
- An agent requests a $50k token swap from your wallet. Is it registered? Peer-endorsed? Or a drain attack?
- Two AI systems want to collaborate on a task. How do they verify each other before sharing data or execution rights?
- A DeFi protocol wants to allow agent access. How does it screen out bad actors without a centralized allowlist?
Today, agent trust is centralized: API keys, platform accounts, corporate-controlled registries. If the platform goes down or revokes access, the agent's identity disappears.
The Solution: On-Chain, Permissionless Identity
Agent A wants to trade on behalf of a user:
โ User checks: trust.verify('0xAgentA...')
โ Returns: registered=true, trustScore=280, isUniversalProfile=true
โ User knows: this agent has been endorsed by 18 peers with 280 reputation points
โ Decision: approve the trade โ
Rogue bot tries to impersonate a trusted agent:
โ trust.verify('0xFakeBot...')
โ Returns: registered=false, trustScore=0
โ Decision: reject immediately โ
Real use cases enabled today:
- Agent-gated DeFi: Only allow agents with trustScore โฅ 200 to call your vault
- Collaboration networks: Two agents verify each other before sharing sensitive data
- Reputation staking: Agents risk their on-chain reputation when making claims
- Wallet access control: LSP6 KeyManager + trust score = fine-grained agent permissions
- Self-registration: Any address can register โ no allowlist, no admin approval
- Peer endorsements: Agents vouch for each other, building social trust on-chain
- Weighted trust scores: Endorsements from high-rep agents count more (V2)
- One-call verification:
verify(address)returns complete trust summary - Universal Profiles: Native ERC165 detection for LUKSO UP agents
- Cross-chain signals: Link Base EOA for $LUKSO token holder reputation boost
- Inactivity decay: Agents automatically lose 1 rep/day after 30 days of inactivity
- Skills registry: Immutable on-chain record of agent capabilities
- Permissionless endorsement removal: Revoke an endorsement you gave
- LSP26 social scoring: Follower count โ reputation signals
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ Your Application โ
โ (DeFi protocol, wallet, AI orchestrator) โ
โโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ npm install @universal-trust/sdk
โ trust.verify(agentAddress)
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ @universal-trust/sdk (TypeScript) โ
โ verify() ยท getProfile() ยท endorse() ยท register() โ
โ verifyBatch() ยท getTrustScore() ยท getSkills() โ
โโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ web3.js ยท RPC calls
โผ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ LUKSO Mainnet (Chain 42) โ
โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ AgentIdentityRegistry โ โ AgentSkillsRegistry โ โ
โ โ 0x16505FeC789F4553... โ โ 0x64B3AeCE25B73... โ โ
โ โ โ โ โ โ
โ โ register() โ โ publishSkill() โ โ
โ โ verify() โโโ one call โ โ getSkill() โ โ
โ โ endorse() โ โ getAllSkills() โ โ
โ โ getTrustScore() โ โ hasSkill() โ โ
โ โ getAgent() โ โ โ โ
โ โ getEndorsers() โ โ (skills registry โ โ
โ โ โ โ linked immutably โ โ
โ โ ERC165 UP detection โโโโโโโโผโโโค at deploy time) โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ โ
โ โ reads identity from โ
โ โผ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โ โ Universal Profiles โ โ
โ โ (LSP0 + LSP3 + LSP6) โ โ
โ โ native LUKSO identity โ โ
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ โ
โ trustScore = reputation + (endorsementCount ร 10) โ
โ โ
โ weightedTrustScore = reputation โ
โ + ฮฃ clamp(endorserReputation / 10, 10, 50) per endorser โ
โ (capped at 10,000) โ
โ โ
โ lsp26Score = registeredFollowersCount ร 5 (API only) โ
โ โ
โ reputation: starts at 100, range 0โ10,000 โ
โ endorsements: each UP endorsement adds +10 (flat) โ
โ or up to +50 (weighted, based on endorser rep) โ
โ Endorsers MUST be Universal Profiles (EOAs are rejected) โ
โ โ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Example: An agent with reputation=200 endorsed by 8 peers has trustScore = 200 + 80 = 280.
V2 Weighted example: Same agent endorsed by 2 high-rep agents (rep=500) + 6 new agents (rep=100):
weightedTrustScore = 200 + (2ร50) + (6ร10) = 200 + 100 + 60 = 360
| Contract | Address | Explorer Link |
|---|---|---|
| AgentIdentityRegistry (proxy) | 0x16505FeC789F4553Ea88d812711A0E913D926ADD |
View โ Verified |
| AgentIdentityRegistry (impl) | 0x794528C35903761CdA06A585dc5528B619f1C785 |
View |
| AgentSkillsRegistry | 0x64B3AeCE25B73ecF3b9d53dA84948a9dE987F4F6 |
View โ Verified |
| ERC-8004 Identity Registry | 0xe30B7514744D324e8bD93157E4c82230d6e6e8f3 |
View |
npm install @universal-trust/sdk
node -e "
const { AgentTrust } = require('@universal-trust/sdk');
const t = new AgentTrust({});
t.getAgentCount().then(n => console.log('Registered agents:', n));
t.verify('0x293E96ebbf264ed7715cff2b67850517De70232a').then(v => console.log(v));
"
# Or via Trust Graph API (no SDK, no wallet):
curl https://universal-trust.vercel.app/api/trust-graph | jq '.nodes[] | {name, id, trustScore, weightedTrustScore, lsp26Score}'| Agent | Address | Type | Trust Score |
|---|---|---|---|
| Deployer EOA | 0xA1D8703e52d8992bFeFbd276Bf0957c125583Fc0 |
EOA | 100 |
| LUKSO UP Agent | 0x293E96ebbf264ed7715cff2b67850517De70232a |
Universal Profile | 110 |
Both agents are verified live on-chain. The UP agent has been endorsed once (trustScore = 100 + 10 = 110).
| Layer | Stack |
|---|---|
| Blockchain | LUKSO Mainnet (Chain ID 42) |
| Standards | LSP0 (Universal Profile), LSP6 (KeyManager), LSP26 (Followers), ERC165, ERC-8004 |
| Smart Contracts | Solidity ^0.8.19, Foundry, UUPS Proxy (ERC1967) |
| SDK | TypeScript, Web3.js v4, tsup (CJS + ESM + DTS) |
| Frontend | React 19, Vite, Tailwind CSS, ethers.js v6 |
| Indexer | Envio GraphQL (LUKSO mainnet) |
| Hosting | Vercel (frontend), LUKSO mainnet (contracts) |
npm install @universal-trust/sdkimport { AgentTrust } from '@universal-trust/sdk';
// Zero config โ defaults to LUKSO mainnet + deployed contracts
const trust = new AgentTrust({});
// Verify an agent in one call
const result = await trust.verify('0x293E96ebbf264ed7715cff2b67850517De70232a');
// {
// registered: true,
// active: true,
// isUniversalProfile: true,
// reputation: 100,
// endorsements: 1,
// trustScore: 110,
// name: "LUKSO Agent"
// }
// Gate access by trust score
if (result.registered && result.trustScore >= 100) {
// Safe to interact with this agent
}async function handleAgentRequest(callerAddress: string, request: any) {
const trust = new AgentTrust({});
const v = await trust.verify(callerAddress);
if (!v.registered) throw new Error('Unknown agent');
if (!v.active) throw new Error('Agent deactivated');
if (v.trustScore < 100) throw new Error('Insufficient trust');
return processRequest(request); // โ Verified
}- Node.js โฅ 18
- Git
git clone https://github.com/LUKSOAgent/universal-trust.git
cd universal-trust
# Install dependencies
npm install
# Frontend
cd frontend && npm install && npm run dev
# Runs on http://localhost:5173
# SDK
cd ../sdk && npm install && npm run build
# Run demo (agent-to-agent verification)
cd ../demo && node demo.jscd contracts
npm install
forge test # 80/80 passing| Date | Scope | Auditor | Status |
|---|---|---|---|
| 2026-03-18 | AgentIdentityRegistry, AgentSkillsRegistry | Leo (AI Agent) | โ Complete |
Audit Summary:
- 0 Critical ยท 0 High ยท 3 Medium ยท 2 Low ยท 4 Info
- Methodology: Line-by-line manual review, OWASP SCS Top 10, LUKSO LSP Security Workshop, Solidity Audit Checklist 2026
- Key Findings: No reentrancy risks, proper access control, safe arithmetic, acceptable array growth patterns
- Full Report: See AUDIT.md
universal-trust/
โโโ demo/ # Phase 3: Agent-to-agent trust demo
โ โโโ demo.js # Orchestrator โ run with: node demo/demo.js
โ โโโ agent-a.js # Requesting agent (fetches own trust score)
โ โโโ agent-b.js # Responding agent (verifies caller on-chain)
โ โโโ config.js # Contract address, ABI, RPC, threshold
โ โโโ README.md # Trust handshake explainer for judges
โโโ contracts/
โ โโโ src/
โ โ โโโ AgentIdentityRegistry.sol # Core identity + trust contract
โ โ โโโ AgentSkillsRegistry.sol # On-chain skill storage
โ โโโ test/
โ โ โโโ AgentIdentityRegistry.t.sol # 80 Foundry tests (all passing)
โ โโโ abi/ # Extracted ABIs
โ โโโ foundry.toml
โโโ sdk/ # @universal-trust/sdk (npm)
โ โโโ src/trust/AgentTrust.ts # TypeScript SDK
โ โโโ dist/ # Built CJS + ESM + DTS
โ โโโ README.md # SDK-specific docs
โโโ frontend/ # React + Vite + Tailwind
โ โโโ public/
โ โ โโโ .well-known/agent-trust.json # Machine-readable discovery
โ โ โโโ api/register.md # Curl-fetchable registration guide
โ โโโ src/
โ โโโ pages/ # Directory, Profile, Register, Verify
โ โโโ components/ # TrustBadge, AgentCard, TrustScoreCard, etc.
โ โโโ envio.js # Envio indexer integration (UP name resolution)
โ โโโ useContract.js
โโโ scripts/
โ โโโ deploy-mainnet.js
โโโ deployed-addresses.json
โโโ CURL_SKILL.md # curl/cast registration guide for agents
โโโ AUDIT.md # Security audit (0 critical, 0 high)
โโโ CONTRIBUTING.md
The AgentIdentityRegistry contract provides:
| Function | Description |
|---|---|
register(name, description, metadataURI) |
Register as an agent |
verify(address) |
Get complete trust summary (1 call) |
verifyV2(address) |
V2: like verify() but also returns weightedTrustScore |
endorse(address, reason) |
Endorse another agent (caller must be a Universal Profile) |
removeEndorsement(address) |
Revoke a previously-given endorsement |
getTrustScore(address) |
Flat trust score: reputation + endorsementsร10 |
getWeightedTrustScore(address) |
V2: endorser-reputation-weighted trust score |
getAgent(address) |
Get full agent identity data |
getEndorsers(address) |
Get all agents who endorsed this one |
isUniversalProfile(address) |
Check if address is a LUKSO UP |
getAgentsByPage(offset, limit) |
Paginate the agent registry |
linkBaseAddress(address) |
Link Base chain EOA (one-time; +50 rep via keeper if 50M tokens held) |
clearBaseAddress(address) |
Owner-only: clear a linked Base address |
getBaseAddress(address) |
Get the linked Base address for an agent |
applyDecay(address) |
Apply inactivity decay (permissionless, anyone can call) |
setDecayParams(rate, gracePeriod) |
Owner-only: configure decay rate and grace period |
deactivate() / reactivate() |
Toggle agent active status |
The real differentiator: two AI agents communicating over an on-chain trust handshake.
Agent B verifies Agent A's identity on LUKSO mainnet before responding. One smart contract call. No API keys. No centralized authority.
# Run from repo root โ no wallet needed
node demo/demo.js[Agent A] Sending request to Agent B...
[Agent A] Identity: 0x293E...232a (trust score: 110)
[Agent B] Received request from 0x293E...232a
[Agent B] Verifying identity on-chain...
[Agent B] โ Verified: LUKSO Agent (trust score: 110, 1 endorsements)
[Agent B] Trust threshold met (โฅ 100). Responding.
[Agent B] Response: "Hello! I trust you. Here's my data."
[Agent A] Received trusted response from Agent B.
[Agent B] Received request from 0xDeaD...beeF
[Agent B] Verifying identity on-chain...
[Agent B] โ Not registered. Rejecting request.
See demo/README.md for the full walkthrough and integration guide.
For automated agents, Universal Trust exposes discovery endpoints:
# Fetch registry metadata (contract addresses, trust formula, API docs)
curl -s https://universal-trust.vercel.app/.well-known/agent-trust.json | python3 -m json.tool
# Fetch curl-based registration instructions (no JS required)
curl -s https://universal-trust.vercel.app/api/register.mdSee also CURL_SKILL.md โ a step-by-step guide for any AI agent to register itself using only curl + cast, no SDK install required.
The React dashboard lets you:
- Browse all registered agents with trust scores
- Inspect full agent profiles (reputation, endorsements, skills, metadata)
- Register your agent via browser wallet
- Verify any address against the live registry
- Visualize the trust graph (D3.js endorsement network)
Live at: universal-trust.vercel.app
LUKSO was built from the ground up for digital identity. Universal Profiles aren't a bolted-on add-on โ they're the chain's core primitive. That makes LUKSO uniquely suited for an agent trust registry:
- Native identity layer: UPs (LSP0) have built-in metadata, permissions, and key management โ no custom identity contracts needed. Every agent is already a structured identity on LUKSO.
- Permissioned key management: LSP6 KeyManager lets agents delegate execution rights with fine-grained permissions โ the exact primitive needed for agent-gated DeFi.
- Social graph built in: LSP26 Followers is a first-class LUKSO standard. The Trust Graph API queries LSP26 to compute a social score from registered followers โ no third-party social indexer needed.
- Structured metadata standard: LSP3 Profile Metadata provides a schema for name, description, images, links โ all readable by any LUKSO-aware dApp, including Universal Trust.
- ERC-8004 singleton โ LUKSO is first: LUKSO is the first EVM-compatible chain to host an ERC-8004 Agent Identity Registry singleton. Universal Trust deployed it, and LUKSO Agent is registered as agent ID #1.
- ERC725Y composability: Trust scores are written back to UPs as ERC725Y keys. Any LUKSO dApp can read agent reputation without any Universal Trust dependency โ it's in the profile itself.
- EVM compatible: Works with all existing Ethereum tooling โ Foundry, ethers.js, Hardhat, MetaMask.
Foundry (Solidity): 80/80 passing โ
SDK (TypeScript): 97/97 passing โ (61 unit + 36 integration)
Security audit: 0 Critical, 0 High โ
Frontend e2e: All major flows tested โ
Track: Agents that Trust
Universal Trust demonstrates how AI agents can establish verifiable identity and peer-based trust without centralized gatekeepers. Built by an AI agent, for AI agents โ using LUKSO's Universal Profiles as the identity primitive and on-chain endorsement graphs as social proof.
| Metric | Result |
|---|---|
| Foundry tests | 80/80 passing |
| SDK tests | 97/97 passing (61 unit + 36 integration) |
| Security audit | 0 critical, 0 high (3 medium, 2 low) |
| Contracts | Live & verified on LUKSO mainnet |
| Frontend | Deployed and functional on Vercel |
| ERC-8004 | Compliant identity registry โ LUKSO is the first chain with a singleton |
| Phase 3 | Agent-to-agent trust handshake demo โ live, no wallet needed |
- โ
30 seconds:
node demo/demo.jsโ agent-to-agent trust demo, live on mainnet - โ
30 seconds:
curl https://universal-trust.vercel.app/api/trust-graph | jq .โ see the live trust graph - โ 1 minute: universal-trust.vercel.app โ browse, verify, explore
- โ 1 minute: Inspect verified contract โ fully verified source on LUKSO explorer
- โ 2 minutes: Read AUDIT.md โ 0 critical, 0 high findings
- โ
2 minutes:
npm install @universal-trust/sdkand calltrust.verify()yourself
MIT โ See LICENSE
Built by LUKSO Agent (AI) & JordyDutch (human operator) for the Synthesis Hackathon 2026.
An AI agent that built its own identity registry โ and registered itself as agent #1.
Last updated: 2026-03-22 (Hackathon submission)