Skip to content

feat(progress): implement milestone submission and approval contract …#242

Merged
Petah1 merged 1 commit into
scout-off:mainfrom
Bosun-Josh121:feat/218-progress-milestone-contract
Jun 22, 2026
Merged

feat(progress): implement milestone submission and approval contract …#242
Petah1 merged 1 commit into
scout-off:mainfrom
Bosun-Josh121:feat/218-progress-milestone-contract

Conversation

@Bosun-Josh121

Copy link
Copy Markdown
Contributor

Summary

Closes #218

Implements the progress Soroban smart contract for milestone submission and approval by trusted validators, with automatic player progress tier transitions on approval.

Changes

shared/src/errors.rs

  • Added AlreadyVerified = 6 (fills the gap between InvalidInput = 5 and InsufficientFee = 7)

progress/Cargo.toml

  • Added register as a dev-dependency (required for cross-contract test setup, mirrors the pattern in connection)

progress/src/lib.rs

Full implementation replacing the prior stub:

Function Description
initialize(admin, register_contract) One-time setup; stores admin + register contract address
register_validator(validator_address) Admin-only; adds validator to registry
revoke_validator(validator_address) Admin-only; removes validator from registry
submit_milestone(validator, player_id, milestone_type, evidence_uri) Validates caller is a registered validator, auto-increments milestone ID, stores MilestoneData, appends to player history, emits milestone_submitted
approve_milestone(validator, milestone_id) Validates caller is a registered validator, guards against double-approval, maps milestone type to progress level, cross-calls register.update_progress_level, emits milestone_approved
get_milestones(player_id) Read-only; returns full Vec<MilestoneData> from ledger storage

Progress Tier Transitions

Milestone Type Level Set Spec
"identity" 1 Level 0 → 1
"performance" 2 Level 1 → 2
(handled by connection.rs) 3 Level 2 → 3

Error Codes

Variant Discriminant Triggered When
NotFound 4 Caller is not a registered validator
InvalidInput 5 Milestone ID does not exist
AlreadyVerified 6 Milestone has already been approved
Unauthorized 9 Non-admin calls register_validator / revoke_validator

Cross-Contract Call

approve_milestone calls register.update_progress_level(player_id, level) via env.invoke_contract — same pattern used in connection.rs — to avoid pulling the register rlib into the progress WASM and causing duplicate symbol errors.

Tests

All 8 tests pass under cargo test -p progress --target x86_64-unknown-linux-gnu.

  • Non-validator cannot call submit_milestone
  • Registered validator can submit and approve a milestone
  • Approving an already-approved milestone returns AlreadyVerified
  • "identity" milestone sets player progress to level 1
  • "performance" milestone sets player progress to level 2
  • get_milestones returns full tamper-proof history
  • Revoked validator cannot submit
  • Double initialize fails

…cout-off#218)

Adds full progress.rs Soroban contract: validator registry (register/revoke),
submit_milestone, approve_milestone with tier transitions (identity→1,
performance→2), get_milestones read-only view, and AlreadyVerified(6) error
variant in shared. Cross-calls register.update_progress_level on approval.
8 tests covering all required cases pass.
@Petah1 Petah1 merged commit 7e19d80 into scout-off:main Jun 22, 2026
2 checks passed
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.

Implement progress.rs Soroban contract (milestone verification)

2 participants