Skip to content

[Smart Contracts] Add Missing Event Emissions for register_agent, deregister_agent, report_error, and set_admin #155

Description

@devJaja

🎯 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

  • Add event to initialize — topic: (registry, initialized)
  • Add event to set_admin — topic: (registry, admin_changed)
  • Add event to register_agent — topic: (registry, agent_registered)
  • Add event to register_agents — emit per registration
  • Add event to deregister_agent — topic: (registry, agent_deregistered)
  • Add event to report_error — topic: (registry, error_reported)
  • Add event to resolve_errors — emit per resolution in batch
  • Add unit tests verifying event emission for all 7 functions
  • Update backend/src/registry/sync.ts to handle new event types
  • Run cargo test — all tests pass

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions