🎯 Objective
Add Soroban event emission for agent registration, deregistration, error reporting/resolution, admin changes, and contract initialization to enable off-chain indexer synchronization.
📁 Files to Modify
| Action |
File Path |
Description |
| Modify |
smart-contracts/contracts/agent_registry/src/lib.rs |
Add events().publish() calls to 7 functions |
📁 Files to Create/Modify (Tests)
| Action |
File Path |
Description |
| Modify |
smart-contracts/contracts/agent_registry/src/lib.rs (mod test) |
Add event emission verification tests |
📁 Files to Modify (Backend)
| Action |
File Path |
Description |
| Modify |
backend/src/registry/sync.ts |
Listen for new event types |
🔍 Current State — Events Emitted vs Missing
| Function |
Events? |
Action Needed |
initialize |
❌ None |
Add (registry, initialized) event |
set_admin |
❌ None |
Add (registry, admin_changed) event |
register_agent |
❌ None |
Add (registry, agent_registered) event |
register_agents |
❌ None |
Add per-registration event |
deregister_agent |
❌ None |
Add (registry, agent_deregistered) event |
report_error |
❌ None |
Add (registry, error_reported) event |
resolve_errors |
❌ None |
Add per-resolution event |
pause |
✅ Yes |
— |
unpause |
✅ Yes |
— |
freeze_agent |
✅ Yes |
— |
unfreeze_agent |
✅ Yes |
— |
update_pricing |
✅ Yes |
— |
💥 Impact
- Off-chain indexers (backend
registry/sync.ts) cannot detect new agent registrations
- Admin role changes are not auditable on-chain
- Error lifecycle is invisible to monitoring systems
- Frontend cannot show real-time agent registration events
✅ Expected Implementation
Pattern to Follow (Existing Events)
// Existing pattern in pause()
events().publish(
(Symbol::new(env, "registry"), Symbol::new(env, "paused")),
(admin.clone(),),
);
New Events to Add
// initialize
events().publish(
(Symbol::new(env, "registry"), Symbol::new(env, "initialized")),
(admin.clone(),),
);
// set_admin
events().publish(
(Symbol::new(env, "registry"), Symbol::new(env, "admin_changed")),
(old_admin, new_admin),
);
// register_agent
events().publish(
(Symbol::new(env, "registry"), Symbol::new(env, "agent_registered")),
(record.id.clone(), record.owner.clone(), record.capability.clone(), record.price_stroops),
);
// deregister_agent
events().publish(
(Symbol::new(env, "registry"), Symbol::new(env, "agent_deregistered")),
(agent_id,),
);
// report_error
events().publish(
(Symbol::new(env, "registry"), Symbol::new(env, "error_reported")),
(error_id, reporter),
);
// resolve_errors (per error in batch)
events().publish(
(Symbol::new(env, "registry"), Symbol::new(env, "error_resolved")),
(error_id, resolution),
);
📁 Reference Files
| File Path |
Purpose |
smart-contracts/contracts/agent_registry/src/lib.rs |
All functions that need events |
smart-contracts/contracts/agent_registry/src/lib.rs (pause/unpause) |
Existing event pattern to follow |
backend/src/registry/sync.ts |
Backend event listener to update |
smart-contracts/contracts/agent_registry/src/lib.rs (mod test) |
Test pattern for event verification |
🧪 Test Pattern
#[test]
fn register_agent_emits_event() {
let env = Env::default();
let contract_id = env.register_contract(None, AgentRegistry);
let client = AgentRegistryClient::new(&env, &contract_id);
let admin = Address::generate(&env);
let owner = Address::generate(&env);
client.initialize(&admin);
env.mock_all_auths();
client.register_agent(&AgentParams {
id: Symbol::new(&env, "agent_1"),
// ... other fields
});
let events = env.events().all();
assert_eq!(events.len(), 1);
// Verify event topics and data
}
✅ Acceptance Criteria
🎯 Objective
Add Soroban event emission for agent registration, deregistration, error reporting/resolution, admin changes, and contract initialization to enable off-chain indexer synchronization.
📁 Files to Modify
smart-contracts/contracts/agent_registry/src/lib.rsevents().publish()calls to 7 functions📁 Files to Create/Modify (Tests)
smart-contracts/contracts/agent_registry/src/lib.rs(mod test)📁 Files to Modify (Backend)
backend/src/registry/sync.ts🔍 Current State — Events Emitted vs Missing
initialize(registry, initialized)eventset_admin(registry, admin_changed)eventregister_agent(registry, agent_registered)eventregister_agentsderegister_agent(registry, agent_deregistered)eventreport_error(registry, error_reported)eventresolve_errorspauseunpausefreeze_agentunfreeze_agentupdate_pricing💥 Impact
registry/sync.ts) cannot detect new agent registrations✅ Expected Implementation
Pattern to Follow (Existing Events)
New Events to Add
📁 Reference Files
smart-contracts/contracts/agent_registry/src/lib.rssmart-contracts/contracts/agent_registry/src/lib.rs(pause/unpause)backend/src/registry/sync.tssmart-contracts/contracts/agent_registry/src/lib.rs(mod test)🧪 Test Pattern
✅ Acceptance Criteria
initialize— topic:(registry, initialized)set_admin— topic:(registry, admin_changed)register_agent— topic:(registry, agent_registered)register_agents— emit per registrationderegister_agent— topic:(registry, agent_deregistered)report_error— topic:(registry, error_reported)resolve_errors— emit per resolution in batchbackend/src/registry/sync.tsto handle new event typescargo test— all tests pass