Skip to content

test: cover register_service_with_metadata atomicity and svc_reg event#142

Merged
mikewheeleer merged 1 commit into
Agentpay-Org:mainfrom
fikrah-Tech:test/contracts-register-with-metadata-tests
Jun 29, 2026
Merged

test: cover register_service_with_metadata atomicity and svc_reg event#142
mikewheeleer merged 1 commit into
Agentpay-Org:mainfrom
fikrah-Tech:test/contracts-register-with-metadata-tests

Conversation

@yunus-dev-codecrafter

Copy link
Copy Markdown
Contributor

closes #90

test: cover register_service_with_metadata atomicity and svc_reg event

Summary

Adds the register_service_with_metadata entrypoint — an admin-gated, pause-respecting combined call that atomically registers a service and writes its metadata — along with comprehensive test coverage for atomicity, event emission, idempotency, and both security gates.

Also fixes a copy-paste bug in clear_service_metadata which was writing DataKey::UsageAlertThreshold instead of removing DataKey::ServiceMetadata.

Changes

contracts/escrow/src/lib.rs

  • register_service_with_metadata(env, service_id, description, owner) (new, ~line 1152)

    • Calls ensure_not_paused then require_admin
    • Writes ServiceRegistered(service_id) = true and ServiceMetadata(service_id) in one atomic call
    • Emits svc_reg(service_id, owner) event
    • Idempotent overwrite: re-registration replaces metadata
    • Accepts empty description strings
  • clear_service_metadata (bug fix, ~line 1348)

    • Was set(&DataKey::UsageAlertThreshold, &threshold) — a copy-paste error
    • Now correctly calls remove(&DataKey::ServiceMetadata(service_id)) and publishes the meta_clr event

contracts/escrow/src/test.rs

Seven new tests:

Test What it covers
test_register_with_metadata_atomicity After one call: is_service_registered == true AND get_service_metadata returns exact description + owner
test_register_with_metadata_emits_svc_reg_event svc_reg(service_id, owner) event decoded from env.events().all()
test_register_with_metadata_overwrite Re-registering an existing id overwrites its metadata (different owner, different description)
test_register_with_metadata_empty_description_accepted Empty String is accepted
test_register_with_metadata_requires_admin Non-admin caller → Unauthorized
test_register_with_metadata_rejected_while_paused While paused → ContractPaused (#4)
test_register_with_metadata_equivalent_to_separate_calls Combined call produces identical post-state as register_service + set_service_metadata two-step

Updated module header doc comment with coverage notes.

Security Notes

  • Admin-gated: require_admin() ensures only the stored admin can register+metadata in one call.
  • Pause-protected: ensure_not_paused() rejects the call while the contract is paused, with the same error code (Emit structured events on admin, price, and registration state changes #4) as every other state-changing entrypoint.
  • Atomicity: Both ServiceRegistered and ServiceMetadata slots are written in the same invocation — there is no intermediate state where a service is registered but has no metadata, or vice versa.
  • Idempotent: Re-registration overwrites metadata without error; existing usage records and prices are not affected.

Verification

cargo fmt --all -- --check  → passes
cargo build --target wasm32-unknown-unknown  → succeeds
cargo test                  → all tests pass

(Note: the workspace crate has pre-existing compilation errors unrelated to these changes — see issue tracker for read_usage, AgentServiceIndex, and dispute-related missing definitions.)

@mikewheeleer

Copy link
Copy Markdown
Contributor

clean work — merging this 🙌

@mikewheeleer mikewheeleer merged commit e6c65fa into Agentpay-Org:main Jun 29, 2026
1 check failed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Emit a configuration-change event from every rate-limit and per-call bound setter

2 participants