@@ -108,6 +108,7 @@ impl OnboardingContract {
108108 env. storage ( )
109109 . persistent ( )
110110 . set ( & DataKey :: Config , & config) ;
111+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: Config , 1000 , 518400 ) ;
111112
112113 let admin_username = String :: from_str ( & env, "admin" ) ;
113114 let normalized = normalize_username ( & env, & admin_username) ;
@@ -124,11 +125,13 @@ impl OnboardingContract {
124125 env. storage ( )
125126 . persistent ( )
126127 . set ( & DataKey :: UserProfile ( admin. clone ( ) ) , & admin_profile) ;
128+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: UserProfile ( admin. clone ( ) ) , 1000 , 518400 ) ;
127129
128130 // Reserve the "admin" username
129131 env. storage ( )
130132 . persistent ( )
131- . set ( & DataKey :: Username ( normalized) , & admin) ;
133+ . set ( & DataKey :: Username ( normalized. clone ( ) ) , & admin) ;
134+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: Username ( normalized) , 1000 , 518400 ) ;
132135
133136 config
134137 }
@@ -164,6 +167,7 @@ impl OnboardingContract {
164167 . persistent ( )
165168 . get ( & DataKey :: Config )
166169 . expect ( "Contract not initialized" ) ;
170+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: Config , 1000 , 518400 ) ;
167171
168172 // Normalize the username (lowercase + trim whitespace)
169173 let normalized = normalize_username ( & env, & username) ;
@@ -183,6 +187,9 @@ impl OnboardingContract {
183187 let existing: Option < UserProfile > = env. storage ( )
184188 . persistent ( )
185189 . get ( & DataKey :: UserProfile ( user. clone ( ) ) ) ;
190+ if existing. is_some ( ) {
191+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: UserProfile ( user. clone ( ) ) , 1000 , 518400 ) ;
192+ }
186193
187194 assert ! ( existing. is_none( ) , "User already onboarded" ) ;
188195
@@ -207,11 +214,13 @@ impl OnboardingContract {
207214 env. storage ( )
208215 . persistent ( )
209216 . set ( & DataKey :: UserProfile ( user. clone ( ) ) , & profile) ;
217+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: UserProfile ( user. clone ( ) ) , 1000 , 518400 ) ;
210218
211219 // Store username → address mapping for uniqueness enforcement
212220 env. storage ( )
213221 . persistent ( )
214- . set ( & DataKey :: Username ( normalized) , & user) ;
222+ . set ( & DataKey :: Username ( normalized. clone ( ) ) , & user) ;
223+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: Username ( normalized) , 1000 , 518400 ) ;
215224
216225 // Emit event
217226 env. events ( )
@@ -228,10 +237,12 @@ impl OnboardingContract {
228237 /// # Returns
229238 /// UserProfile if user exists, reverts otherwise
230239 pub fn get_user ( env : Env , user : Address ) -> UserProfile {
231- env. storage ( )
240+ let profile : UserProfile = env. storage ( )
232241 . persistent ( )
233- . get ( & DataKey :: UserProfile ( user) )
234- . expect ( "User not found" )
242+ . get ( & DataKey :: UserProfile ( user. clone ( ) ) )
243+ . expect ( "User not found" ) ;
244+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: UserProfile ( user) , 1000 , 518400 ) ;
245+ profile
235246 }
236247
237248 /// Get user profile by username (case-insensitive)
@@ -246,13 +257,17 @@ impl OnboardingContract {
246257
247258 let owner: Address = env. storage ( )
248259 . persistent ( )
249- . get ( & DataKey :: Username ( normalized) )
260+ . get ( & DataKey :: Username ( normalized. clone ( ) ) )
250261 . expect ( "Username not found" ) ;
262+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: Username ( normalized) , 1000 , 518400 ) ;
251263
252- env. storage ( )
264+ let profile : UserProfile = env. storage ( )
253265 . persistent ( )
254- . get ( & DataKey :: UserProfile ( owner) )
255- . expect ( "User not found" )
266+ . get ( & DataKey :: UserProfile ( owner. clone ( ) ) )
267+ . expect ( "User not found" ) ;
268+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: UserProfile ( owner) , 1000 , 518400 ) ;
269+
270+ profile
256271 }
257272
258273 /// Check if a username is already taken (case-insensitive)
@@ -264,9 +279,13 @@ impl OnboardingContract {
264279 /// true if username is taken, false if available
265280 pub fn is_username_taken ( env : Env , username : String ) -> bool {
266281 let normalized = normalize_username ( & env, & username) ;
267- env. storage ( )
282+ let has = env. storage ( )
268283 . persistent ( )
269- . has ( & DataKey :: Username ( normalized) )
284+ . has ( & DataKey :: Username ( normalized. clone ( ) ) ) ;
285+ if has {
286+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: Username ( normalized) , 1000 , 518400 ) ;
287+ }
288+ has
270289 }
271290
272291 /// Check if user is onboarded
@@ -277,10 +296,14 @@ impl OnboardingContract {
277296 /// # Returns
278297 /// true if user has onboarded, false otherwise
279298 pub fn is_onboarded ( env : Env , user : Address ) -> bool {
280- env. storage ( )
299+ let has = env. storage ( )
281300 . persistent ( )
282- . get :: < DataKey , UserProfile > ( & DataKey :: UserProfile ( user) )
283- . is_some ( )
301+ . get :: < DataKey , UserProfile > ( & DataKey :: UserProfile ( user. clone ( ) ) )
302+ . is_some ( ) ;
303+ if has {
304+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: UserProfile ( user) , 1000 , 518400 ) ;
305+ }
306+ has
284307 }
285308
286309 /// Get user's role
@@ -293,9 +316,12 @@ impl OnboardingContract {
293316 pub fn get_user_role ( env : Env , user : Address ) -> UserRole {
294317 match env. storage ( )
295318 . persistent ( )
296- . get :: < DataKey , UserProfile > ( & DataKey :: UserProfile ( user) )
319+ . get :: < DataKey , UserProfile > ( & DataKey :: UserProfile ( user. clone ( ) ) )
297320 {
298- Some ( profile) => profile. role ,
321+ Some ( profile) => {
322+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: UserProfile ( user) , 1000 , 518400 ) ;
323+ profile. role
324+ } ,
299325 None => UserRole :: None ,
300326 }
301327 }
@@ -319,6 +345,7 @@ impl OnboardingContract {
319345 . persistent ( )
320346 . get ( & DataKey :: Config )
321347 . expect ( "Contract not initialized" ) ;
348+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: Config , 1000 , 518400 ) ;
322349
323350 // Only admin can update roles
324351 config. platform_admin . require_auth ( ) ;
@@ -328,6 +355,7 @@ impl OnboardingContract {
328355 . persistent ( )
329356 . get ( & DataKey :: UserProfile ( user. clone ( ) ) )
330357 . expect ( "User not found" ) ;
358+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: UserProfile ( user. clone ( ) ) , 1000 , 518400 ) ;
331359
332360 // Update role
333361 let _old_role = profile. role ;
@@ -337,6 +365,7 @@ impl OnboardingContract {
337365 env. storage ( )
338366 . persistent ( )
339367 . set ( & DataKey :: UserProfile ( user. clone ( ) ) , & profile) ;
368+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: UserProfile ( user. clone ( ) ) , 1000 , 518400 ) ;
340369
341370 // Emit event
342371 env. events ( )
@@ -359,6 +388,7 @@ impl OnboardingContract {
359388 . persistent ( )
360389 . get ( & DataKey :: Config )
361390 . expect ( "Contract not initialized" ) ;
391+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: Config , 1000 , 518400 ) ;
362392
363393 // Only admin can verify users
364394 config. platform_admin . require_auth ( ) ;
@@ -368,6 +398,7 @@ impl OnboardingContract {
368398 . persistent ( )
369399 . get ( & DataKey :: UserProfile ( user. clone ( ) ) )
370400 . expect ( "User not found" ) ;
401+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: UserProfile ( user. clone ( ) ) , 1000 , 518400 ) ;
371402
372403 // Set verified
373404 profile. is_verified = true ;
@@ -376,6 +407,7 @@ impl OnboardingContract {
376407 env. storage ( )
377408 . persistent ( )
378409 . set ( & DataKey :: UserProfile ( user. clone ( ) ) , & profile) ;
410+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: UserProfile ( user. clone ( ) ) , 1000 , 518400 ) ;
379411
380412 // Emit event
381413 env. events ( )
@@ -389,10 +421,12 @@ impl OnboardingContract {
389421 /// # Returns
390422 /// OnboardingConfig struct
391423 pub fn get_config ( env : Env ) -> OnboardingConfig {
392- env. storage ( )
424+ let config : OnboardingConfig = env. storage ( )
393425 . persistent ( )
394426 . get ( & DataKey :: Config )
395- . expect ( "Contract not initialized" )
427+ . expect ( "Contract not initialized" ) ;
428+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: Config , 1000 , 518400 ) ;
429+ config
396430 }
397431
398432 /// Check if user has specific role
@@ -417,9 +451,12 @@ impl OnboardingContract {
417451 pub fn is_verified ( env : Env , user : Address ) -> bool {
418452 match env. storage ( )
419453 . persistent ( )
420- . get :: < DataKey , UserProfile > ( & DataKey :: UserProfile ( user) )
454+ . get :: < DataKey , UserProfile > ( & DataKey :: UserProfile ( user. clone ( ) ) )
421455 {
422- Some ( profile) => profile. is_verified ,
456+ Some ( profile) => {
457+ env. storage ( ) . persistent ( ) . extend_ttl ( & DataKey :: UserProfile ( user) , 1000 , 518400 ) ;
458+ profile. is_verified
459+ } ,
423460 None => false ,
424461 }
425462 }
0 commit comments