33 Winner ,
44 LeaderboardEntry ,
55 Guild ,
6+ GuildMember ,
67 UserVaultData ,
78 VaultConfig
89} from '../types' ;
@@ -30,6 +31,7 @@ class VaultService {
3031 } ;
3132
3233 private eventSubscribers : Array < ( event : any ) => void > = [ ] ;
34+ private static readonly MAX_SUBSCRIBERS = 50 ; // Prevent memory leaks
3335 private updateInterval : NodeJS . Timeout | null = null ;
3436
3537 public static getInstance ( ) : VaultService {
@@ -259,12 +261,25 @@ class VaultService {
259261 const maxMembers = Math . floor ( memberCount * 1.5 ) + 10 ;
260262 const totalReferrals = Math . floor ( generateStableRandom ( seed + '_referrals' , 50 , 300 ) ) ;
261263
264+ // Generate realistic member data for demo
265+ const members : GuildMember [ ] = [ ] ;
266+ for ( let j = 0 ; j < memberCount ; j ++ ) {
267+ const memberAddress = this . generateStableAddress ( `${ seed } _member_${ j } ` ) ;
268+ members . push ( {
269+ address : memberAddress ,
270+ joinDate : new Date ( Date . now ( ) - generateStableRandom ( `${ seed } _member_${ j } _join` , 0 , 60 * 24 * 60 * 60 * 1000 ) ) ,
271+ referrals : Math . floor ( generateStableRandom ( `${ seed } _member_${ j } _refs` , 0 , 20 ) ) ,
272+ earnings : Math . floor ( generateStableRandom ( `${ seed } _member_${ j } _earnings` , 100 , 2000 ) ) ,
273+ role : j === 0 ? 'owner' : ( j === 1 && generateStableRandom ( `${ seed } _member_${ j } _admin` ) > 0.7 ? 'admin' : 'member' ) ,
274+ } ) ;
275+ }
276+
262277 guilds . push ( {
263278 id : `guild_${ i } ` ,
264279 name : guildNames [ i % guildNames . length ] ,
265280 description : `${ guildNames [ i % guildNames . length ] } guild focused on maximizing rewards and community growth` ,
266281 creator : this . generateStableAddress ( seed + '_creator' ) ,
267- members : [ ] , // Simplified for demo
282+ members,
268283 maxMembers,
269284 totalReferrals,
270285 totalEarnings : Math . floor ( generateStableRandom ( seed + '_earnings' , 5000 , 50000 ) ) ,
@@ -382,6 +397,12 @@ class VaultService {
382397
383398 // Real-time event simulation
384399 subscribeToEvents ( callback : ( event : any ) => void ) : ( ) => void {
400+ // Prevent memory leaks by limiting subscribers
401+ if ( this . eventSubscribers . length >= VaultService . MAX_SUBSCRIBERS ) {
402+ console . warn ( 'VaultService: Maximum subscribers reached, removing oldest subscriber' ) ;
403+ this . eventSubscribers . shift ( ) ; // Remove oldest subscriber
404+ }
405+
385406 this . eventSubscribers . push ( callback ) ;
386407
387408 // Return unsubscribe function
@@ -434,16 +455,16 @@ class VaultService {
434455 try {
435456 // TODO: Replace with actual on-chain guild joining
436457 const userGuilds = VaultStorage . get ( 'userGuilds' , [ ] ) as any [ ] ;
437- const existingGuild = userGuilds . find ( g => g . id === guildId ) ;
458+ const existingUserGuild = userGuilds . find ( g => g . id === guildId && g . members && g . members . includes ( userAddress ) ) ;
438459
439- if ( existingGuild && existingGuild . members . includes ( userAddress ) ) {
460+ if ( existingUserGuild ) {
440461 return {
441462 success : false ,
442463 message : 'You are already a member of this guild.' ,
443464 } ;
444465 }
445466
446- // Simulate guild capacity check
467+ // Get current guild data to check capacity
447468 const guildData = await this . getGuildById ( guildId ) ;
448469 if ( guildData && guildData . members . length >= guildData . maxMembers ) {
449470 return {
@@ -452,6 +473,7 @@ class VaultService {
452473 } ;
453474 }
454475
476+ // Update user's guild list
455477 userGuilds . push ( {
456478 id : guildId ,
457479 name : guildData ?. name || 'Unknown Guild' ,
@@ -464,6 +486,27 @@ class VaultService {
464486
465487 VaultStorage . set ( 'userGuilds' , userGuilds ) ;
466488
489+ // Update the guild's member list in cache (sync the two data stores)
490+ const cacheKey = 'guilds' ;
491+ const cached = VaultStorage . get ( cacheKey , null ) as { guilds : Guild [ ] ; timestamp : number } | null ;
492+ if ( cached && cached . guilds ) {
493+ const guildIndex = cached . guilds . findIndex ( g => g . id === guildId ) ;
494+ if ( guildIndex !== - 1 ) {
495+ // Add user to guild's member list if not already present
496+ const existingMember = cached . guilds [ guildIndex ] . members . find ( m => m . address === userAddress ) ;
497+ if ( ! existingMember ) {
498+ cached . guilds [ guildIndex ] . members . push ( {
499+ address : userAddress ,
500+ joinDate : new Date ( ) ,
501+ referrals : 0 ,
502+ earnings : 0 ,
503+ role : 'member' ,
504+ } ) ;
505+ VaultStorage . set ( cacheKey , cached ) ;
506+ }
507+ }
508+ }
509+
467510 return {
468511 success : true ,
469512 message : 'Successfully joined the guild!' ,
@@ -484,13 +527,13 @@ class VaultService {
484527 // Check if user has joined a specific guild
485528 isUserInGuild ( guildId : string , userAddress : string ) : boolean {
486529 const userGuilds = VaultStorage . get ( 'userGuilds' , [ ] ) as any [ ] ;
487- return userGuilds . some ( g => g . id === guildId && g . userAddress === userAddress ) ;
530+ return userGuilds . some ( g => g . id === guildId && g . members && g . members . includes ( userAddress ) ) ;
488531 }
489532
490533 // Get all guilds user has joined
491534 getUserGuilds ( userAddress : string ) : any [ ] {
492535 const userGuilds = VaultStorage . get ( 'userGuilds' , [ ] ) as any [ ] ;
493- return userGuilds . filter ( g => g . userAddress === userAddress ) ;
536+ return userGuilds . filter ( g => g . members && g . members . includes ( userAddress ) ) ;
494537 }
495538
496539 // Add cleanup method
0 commit comments