Skip to content

Commit e7384ca

Browse files
Merge pull request #135 from 1nonlypiece/validation
Feat: Comprehensive Module Refactoring: Centralized Architecture for Predictify Hybrid Contract
2 parents 578a50c + afa51a4 commit e7384ca

3 files changed

Lines changed: 1738 additions & 1 deletion

File tree

contracts/predictify-hybrid/src/lib.rs

Lines changed: 155 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,18 @@ use events::{EventEmitter, EventLogger, EventValidator, EventHelpers, EventTesti
5454

5555
pub mod resolution;
5656

57+
pub mod validation;
58+
use validation::{
59+
ValidationError, ValidationResult, InputValidator,
60+
MarketValidator as ValidationMarketValidator,
61+
OracleValidator as ValidationOracleValidator,
62+
FeeValidator as ValidationFeeValidator,
63+
VoteValidator as ValidationVoteValidator,
64+
DisputeValidator as ValidationDisputeValidator,
65+
ConfigValidator as ValidationConfigValidator,
66+
ComprehensiveValidator, ValidationErrorHandler, ValidationDocumentation,
67+
};
68+
5769
#[contract]
5870
pub struct PredictifyHybrid;
5971

@@ -1106,5 +1118,148 @@ impl PredictifyHybrid {
11061118
pub fn validate_event_timestamp(timestamp: u64) -> bool {
11071119
EventHelpers::is_valid_timestamp(timestamp)
11081120
}
1121+
1122+
// ===== VALIDATION METHODS =====
1123+
1124+
/// Validate input parameters for market creation
1125+
pub fn validate_market_creation_inputs(
1126+
env: Env,
1127+
admin: Address,
1128+
question: String,
1129+
outcomes: Vec<String>,
1130+
duration_days: u32,
1131+
oracle_config: OracleConfig,
1132+
) -> ValidationResult {
1133+
ComprehensiveValidator::validate_complete_market_creation(
1134+
&env, &admin, &question, &outcomes, &duration_days, &oracle_config
1135+
)
1136+
}
1137+
1138+
/// Validate market state
1139+
pub fn validate_market_state(env: Env, market_id: Symbol) -> ValidationResult {
1140+
if let Some(market) = env.storage().persistent().get::<Symbol, Market>(&market_id) {
1141+
ComprehensiveValidator::validate_market_state(&env, &market, &market_id)
1142+
} else {
1143+
ValidationResult::invalid()
1144+
}
1145+
}
1146+
1147+
/// Validate vote parameters
1148+
pub fn validate_vote_inputs(
1149+
env: Env,
1150+
user: Address,
1151+
market_id: Symbol,
1152+
outcome: String,
1153+
stake_amount: i128,
1154+
) -> ValidationResult {
1155+
let mut result = ValidationResult::valid();
1156+
1157+
// Validate user address
1158+
if let Err(_error) = InputValidator::validate_address(&env, &user) {
1159+
result.add_error();
1160+
}
1161+
1162+
// Validate outcome string
1163+
if let Err(_error) = InputValidator::validate_string(&env, &outcome, 1, 100) {
1164+
result.add_error();
1165+
}
1166+
1167+
// Validate stake amount
1168+
if let Err(_error) = ValidationVoteValidator::validate_stake_amount(&stake_amount) {
1169+
result.add_error();
1170+
}
1171+
1172+
// Validate market exists and is valid for voting
1173+
if let Some(market) = env.storage().persistent().get::<Symbol, Market>(&market_id) {
1174+
if let Err(_error) = ValidationMarketValidator::validate_market_for_voting(&env, &market, &market_id) {
1175+
result.add_error();
1176+
}
1177+
1178+
// Validate outcome against market outcomes
1179+
if let Err(_error) = ValidationVoteValidator::validate_outcome(&env, &outcome, &market.outcomes) {
1180+
result.add_error();
1181+
}
1182+
} else {
1183+
result.add_error();
1184+
}
1185+
1186+
result
1187+
}
1188+
1189+
/// Validate oracle configuration
1190+
pub fn validate_oracle_config(env: Env, oracle_config: OracleConfig) -> ValidationResult {
1191+
let mut result = ValidationResult::valid();
1192+
1193+
if let Err(error) = ValidationOracleValidator::validate_oracle_config(&env, &oracle_config) {
1194+
result.add_error();
1195+
}
1196+
1197+
result
1198+
}
1199+
1200+
/// Validate fee configuration
1201+
pub fn validate_fee_config(
1202+
env: Env,
1203+
platform_fee_percentage: i128,
1204+
creation_fee: i128,
1205+
min_fee_amount: i128,
1206+
max_fee_amount: i128,
1207+
collection_threshold: i128,
1208+
) -> ValidationResult {
1209+
ValidationFeeValidator::validate_fee_config(
1210+
&env, &platform_fee_percentage, &creation_fee, &min_fee_amount, &max_fee_amount, &collection_threshold
1211+
)
1212+
}
1213+
1214+
/// Validate dispute creation
1215+
pub fn validate_dispute_creation(
1216+
env: Env,
1217+
user: Address,
1218+
market_id: Symbol,
1219+
dispute_stake: i128,
1220+
) -> ValidationResult {
1221+
let mut result = ValidationResult::valid();
1222+
1223+
// Validate user address
1224+
if let Err(_error) = InputValidator::validate_address(&env, &user) {
1225+
result.add_error();
1226+
}
1227+
1228+
// Validate dispute stake
1229+
if let Err(_error) = ValidationDisputeValidator::validate_dispute_stake(&dispute_stake) {
1230+
result.add_error();
1231+
}
1232+
1233+
// Validate market exists and is resolved
1234+
if let Some(market) = env.storage().persistent().get::<Symbol, Market>(&market_id) {
1235+
if let Err(_error) = ValidationMarketValidator::validate_market_for_fee_collection(&env, &market, &market_id) {
1236+
result.add_error();
1237+
}
1238+
} else {
1239+
result.add_error();
1240+
}
1241+
1242+
result
1243+
}
1244+
1245+
/// Get validation rules documentation
1246+
pub fn get_validation_rules(env: Env) -> Map<String, String> {
1247+
ValidationDocumentation::get_validation_rules(&env)
1248+
}
1249+
1250+
/// Get validation error codes
1251+
pub fn get_validation_error_codes(env: Env) -> Map<String, String> {
1252+
ValidationDocumentation::get_validation_error_codes(&env)
1253+
}
1254+
1255+
/// Get validation system overview
1256+
pub fn get_validation_overview(env: Env) -> String {
1257+
ValidationDocumentation::get_validation_overview(&env)
1258+
}
1259+
1260+
/// Test validation utilities
1261+
pub fn test_validation_utilities(env: Env) -> ValidationResult {
1262+
validation::ValidationTestingUtils::create_test_validation_result(&env)
1263+
}
11091264
}
11101265
mod test;

0 commit comments

Comments
 (0)