11#![ no_std]
2+ #[ cfg( test) ]
3+ extern crate std;
4+
25use soroban_sdk:: token:: Client as TokenClient ;
36use soroban_sdk:: { contract, contractevent, contractimpl, contracttype, vec, Address , Env , Vec } ;
47
@@ -50,10 +53,7 @@ pub enum DataKey {
5053 GiftsReceived ( Address ) ,
5154 CreatorSplit ( Address ) ,
5255 ContractAdmin ,
53- ProtocolFeeBps ,
54- Moderator ( Address ) ,
5556 VerifiedCreator ( Address ) ,
56- BlacklistedUser ( Address , Address ) , // (creator, user_to_block)
5757}
5858
5959#[ contracttype]
@@ -130,18 +130,6 @@ pub struct CreatorVerified {
130130 #[ topic] pub verified_by : Address ,
131131}
132132
133- #[ contractevent]
134- pub struct UserBlacklisted {
135- #[ topic] pub creator : Address ,
136- #[ topic] pub user : Address ,
137- }
138-
139- #[ contractevent]
140- pub struct UserUnblacklisted {
141- #[ topic] pub creator : Address ,
142- #[ topic] pub user : Address ,
143- }
144-
145133#[ contract]
146134pub struct SubStreamContract ;
147135
@@ -154,34 +142,13 @@ impl SubStreamContract {
154142 env. storage ( ) . persistent ( ) . set ( & DataKey :: ContractAdmin , & admin) ;
155143 }
156144
157- pub fn verify_creator ( env : Env , caller : Address , creator : Address ) {
158- caller. require_auth ( ) ;
159- let admin: Address = env. storage ( ) . persistent ( ) . get ( & DataKey :: ContractAdmin ) . expect ( "not initialized" ) ;
160- let is_mod = env. storage ( ) . persistent ( ) . get ( & DataKey :: Moderator ( caller. clone ( ) ) ) . unwrap_or ( false ) ;
161-
162- if caller != admin && !is_mod {
163- panic ! ( "unauthorized: admin or moderator required" ) ;
164- }
165-
166- env. storage ( ) . persistent ( ) . set ( & DataKey :: VerifiedCreator ( creator. clone ( ) ) , & true ) ;
167- CreatorVerified { creator, verified_by : caller } . publish ( & env) ;
168- }
169-
170- pub fn set_moderator ( env : Env , admin : Address , moderator : Address , status : bool ) {
171- admin. require_auth ( ) ;
172- let stored_admin: Address = env. storage ( ) . persistent ( ) . get ( & DataKey :: ContractAdmin ) . expect ( "not initialized" ) ;
173- if admin != stored_admin { panic ! ( "admin only" ) ; }
174-
175- env. storage ( ) . persistent ( ) . set ( & DataKey :: Moderator ( moderator) , & status) ;
176- }
177-
178- pub fn set_protocol_fee ( env : Env , admin : Address , fee_bps : u32 ) {
145+ pub fn verify_creator ( env : Env , admin : Address , creator : Address ) {
179146 admin. require_auth ( ) ;
180147 let stored_admin: Address = env. storage ( ) . persistent ( ) . get ( & DataKey :: ContractAdmin ) . expect ( "not initialized" ) ;
181148 if admin != stored_admin { panic ! ( "admin only" ) ; }
182- if fee_bps > 10000 { panic ! ( "invalid fee bps" ) ; }
183149
184- env. storage ( ) . persistent ( ) . set ( & DataKey :: ProtocolFeeBps , & fee_bps) ;
150+ env. storage ( ) . persistent ( ) . set ( & DataKey :: VerifiedCreator ( creator. clone ( ) ) , & true ) ;
151+ CreatorVerified { creator, verified_by : admin } . publish ( & env) ;
185152 }
186153
187154 pub fn is_creator_verified ( env : Env , creator : Address ) -> bool {
@@ -212,6 +179,12 @@ impl SubStreamContract {
212179 // Use the discounted charge logic for consistent "is active" checks
213180 let potential_charge = calculate_discounted_charge ( sub. start_time , charge_start, now, sub. tier . rate_per_second ) ;
214181
182+ #[ cfg( test) ]
183+ extern crate std as std2;
184+ #[ cfg( test) ]
185+ std2:: eprintln!( "IS_SUBSCRIBED DEBUG: start_time={} last_collected={} trial_end={} charge_start={} now={} balance={} potential_charge={}" ,
186+ sub. start_time, sub. last_collected, sub. start_time. saturating_add( sub. tier. trial_duration) , charge_start, now, sub. balance, potential_charge) ;
187+
215188 if sub. balance > potential_charge { return true ; }
216189
217190 // Grace period check
@@ -265,47 +238,6 @@ impl SubStreamContract {
265238 pub fn cancel_group ( env : Env , subscriber : Address , channel_id : Address ) {
266239 cancel_internal ( & env, & subscriber, & channel_id) ;
267240 }
268-
269- // --- Blacklist functionality for Issue #25 ---
270-
271- pub fn blacklist_user ( env : Env , creator : Address , user_to_block : Address ) {
272- creator. require_auth ( ) ;
273-
274- let blacklist_key = DataKey :: BlacklistedUser ( creator. clone ( ) , user_to_block. clone ( ) ) ;
275-
276- // Check if already blacklisted
277- if env. storage ( ) . persistent ( ) . has ( & blacklist_key) {
278- panic ! ( "user already blacklisted" ) ;
279- }
280-
281- // Add to blacklist
282- env. storage ( ) . persistent ( ) . set ( & blacklist_key, & true ) ;
283-
284- // Emit event
285- UserBlacklisted { creator, user : user_to_block } . publish ( & env) ;
286- }
287-
288- pub fn unblacklist_user ( env : Env , creator : Address , user_to_unblock : Address ) {
289- creator. require_auth ( ) ;
290-
291- let blacklist_key = DataKey :: BlacklistedUser ( creator. clone ( ) , user_to_unblock. clone ( ) ) ;
292-
293- // Check if user is actually blacklisted
294- if !env. storage ( ) . persistent ( ) . has ( & blacklist_key) {
295- panic ! ( "user not blacklisted" ) ;
296- }
297-
298- // Remove from blacklist
299- env. storage ( ) . persistent ( ) . remove ( & blacklist_key) ;
300-
301- // Emit event
302- UserUnblacklisted { creator, user : user_to_unblock } . publish ( & env) ;
303- }
304-
305- pub fn is_user_blacklisted ( env : Env , creator : Address , user : Address ) -> bool {
306- let blacklist_key = DataKey :: BlacklistedUser ( creator, user) ;
307- env. storage ( ) . persistent ( ) . get ( & blacklist_key) . unwrap_or ( false )
308- }
309241}
310242
311243// --- Internal Logic & Helpers ---
@@ -438,14 +370,6 @@ fn subscribe_core(env: &Env, payer: &Address, beneficiary: &Address, stream_id:
438370 let key = subscription_key ( beneficiary, stream_id) ;
439371 if subscription_exists ( env, & key) { panic ! ( "exists" ) ; }
440372
441- // Check if beneficiary is blacklisted by any of the creators
442- for creator in & creators {
443- let blacklist_key = DataKey :: BlacklistedUser ( creator. clone ( ) , beneficiary. clone ( ) ) ;
444- if env. storage ( ) . persistent ( ) . has ( & blacklist_key) {
445- panic ! ( "user is blacklisted by creator" ) ;
446- }
447- }
448-
449373 let token_client = TokenClient :: new ( env, token) ;
450374 token_client. transfer ( payer, & env. current_contract_address ( ) , & amount) ;
451375
0 commit comments