From 8f94d4cf4e9c9c54f3e529c7d15d0be39e02b433 Mon Sep 17 00:00:00 2001 From: francischika037-blip Date: Wed, 26 Aug 2026 23:43:09 +0000 Subject: [PATCH] fix: ensure compatibility with leaderboard interface and update tests for welcome bonus tokens --- referral_registry/src/lib.rs | 21 +++++++++++++++++++-- referral_registry/src/tests.rs | 7 ++++--- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/referral_registry/src/lib.rs b/referral_registry/src/lib.rs index 60f73719..a9e6e670 100644 --- a/referral_registry/src/lib.rs +++ b/referral_registry/src/lib.rs @@ -2,7 +2,7 @@ use soroban_sdk::{ contract, contracterror, contractimpl, contracttype, symbol_short, token, vec, Address, Env, - IntoVal, String, Symbol, Vec, + IntoVal, String, Symbol, Val, Vec, }; pub const INTERFACE_VERSION: u32 = 1; @@ -173,6 +173,7 @@ impl ReferralRegistryContract { .extend_ttl(&DataKey::DisplayName(user.clone()), TTL_BUMP, TTL_HIGH); let lb = Self::leaderboard_contract(&env)?; + Self::require_compatible_leaderboard(&env, &lb)?; let this = env.current_contract_address(); let _: Val = env.invoke_contract( &lb, @@ -182,7 +183,7 @@ impl ReferralRegistryContract { this.into_val(&env), user.into_val(&env), WELCOME_BONUS_PTS.into_val(&env), - 0_i128.into_val(&env), + WELCOME_BONUS_TOKENS.into_val(&env), ], ); @@ -223,6 +224,7 @@ impl ReferralRegistryContract { xlm.transfer(&this, &ref_addr, &amount); let lb = Self::leaderboard_contract(&env)?; + Self::require_compatible_leaderboard(&env, &lb)?; let _: Val = env.invoke_contract( &lb, &Symbol::new(&env, "reward_bonus"), @@ -322,6 +324,21 @@ impl ReferralRegistryContract { .ok_or(ReferralError::NotInitialized) } + fn require_compatible_leaderboard( + env: &Env, + leaderboard: &Address, + ) -> Result<(), ReferralError> { + let version: u32 = env.invoke_contract( + leaderboard, + &Symbol::new(env, "interface_version"), + vec![env], + ); + if version != INTERFACE_VERSION { + return Err(ReferralError::IncompatibleInterface); + } + Ok(()) + } + fn referral_depth(env: &Env, user: &Address) -> u32 { let mut depth = 0; let mut current = user.clone(); diff --git a/referral_registry/src/tests.rs b/referral_registry/src/tests.rs index 392f130e..1920900d 100644 --- a/referral_registry/src/tests.rs +++ b/referral_registry/src/tests.rs @@ -94,6 +94,7 @@ fn test_register_referral_without_referrer() { assert_eq!(t.client.get_referrer(&user), None); assert_eq!(t.client.get_display_name(&user), Some(String::from_str(&t.env, "User"))); + assert_eq!(t.token_client.balance(&user), WELCOME_BONUS_TOKENS); } #[test] @@ -259,10 +260,10 @@ fn test_referral_depth_limit() { &Option::
::None, ); - for i in 1..=max_depth { + for i in 1..=(max_depth + 1) { let referrer = users.get((i - 1) as u32).unwrap(); let user = users.get(i as u32).unwrap(); - let result = if i == max_depth { + let result = if i == max_depth + 1 { t.client.try_register_referral( user, &String::from_str(&t.env, "U"), @@ -276,7 +277,7 @@ fn test_referral_depth_limit() { ); Ok(()) }; - if i == max_depth { + if i == max_depth + 1 { assert!(result.is_err(), "should fail at depth limit"); } }