User Story: As a developer, I want a reusable asset representation and explicit status enums so that multi-asset support and state transitions are consistent and auditable.
Acceptance Criteria:
AssetInfo: asset_code: String, issuer: Option<Address> (None for XLM), with an is_xlm() helper; validated at initialization
CampaignStatus: Active, GoalReached, Ended, Cancelled; MilestoneStatus: Locked, Unlocked, Released — both derive contracttype
- Doc comments on each enum stating which transitions are valid; invalid transitions elsewhere in the contract must panic with a descriptive error (wire the check where the mutation actually happens, document the rule here)
User Story: As a developer, I want a reusable asset representation and explicit status enums so that multi-asset support and state transitions are consistent and auditable.
Acceptance Criteria:
AssetInfo:asset_code: String,issuer: Option<Address>(Nonefor XLM), with anis_xlm()helper; validated at initializationCampaignStatus:Active,GoalReached,Ended,Cancelled;MilestoneStatus:Locked,Unlocked,Released— both derivecontracttype