@@ -5,13 +5,13 @@ use soroban_token_sdk::metadata::TokenMetadata;
5
5
use soroban_token_sdk:: TokenUtils ;
6
6
use stellar_axelar_std:: events:: Event ;
7
7
use stellar_axelar_std:: interfaces:: OwnableInterface ;
8
- use stellar_axelar_std:: ttl:: { extend_instance_ttl, extend_persistent_ttl } ;
8
+ use stellar_axelar_std:: ttl:: extend_instance_ttl;
9
9
use stellar_axelar_std:: { ensure, interfaces, Upgradable } ;
10
10
11
11
use crate :: error:: ContractError ;
12
12
use crate :: event:: { MinterAddedEvent , MinterRemovedEvent } ;
13
13
use crate :: interface:: InterchainTokenInterface ;
14
- use crate :: storage_types :: { AllowanceDataKey , AllowanceValue , DataKey } ;
14
+ use crate :: storage :: { self , AllowanceDataKey , AllowanceValue } ;
15
15
16
16
#[ contract]
17
17
#[ derive( Upgradable ) ]
@@ -30,12 +30,10 @@ impl InterchainToken {
30
30
31
31
Self :: write_metadata ( & env, token_metadata) ;
32
32
33
- env . storage ( ) . instance ( ) . set ( & DataKey :: TokenId , & token_id) ;
33
+ storage:: set_token_id ( & env , & token_id) ;
34
34
35
35
if let Some ( minter) = minter {
36
- env. storage ( )
37
- . instance ( )
38
- . set ( & DataKey :: Minter ( minter. clone ( ) ) , & ( ) ) ;
36
+ storage:: set_minter_status ( & env, minter. clone ( ) ) ;
39
37
40
38
MinterAddedEvent { minter } . emit ( & env) ;
41
39
}
@@ -96,14 +94,11 @@ impl StellarAssetInterface for InterchainToken {
96
94
#[ contractimpl]
97
95
impl InterchainTokenInterface for InterchainToken {
98
96
fn token_id ( env : & Env ) -> BytesN < 32 > {
99
- env. storage ( )
100
- . instance ( )
101
- . get ( & DataKey :: TokenId )
102
- . expect ( "token id not found" )
97
+ storage:: token_id ( env)
103
98
}
104
99
105
100
fn is_minter ( env : & Env , minter : Address ) -> bool {
106
- env . storage ( ) . instance ( ) . has ( & DataKey :: Minter ( minter) )
101
+ storage:: is_minter ( env , minter)
107
102
}
108
103
109
104
fn mint_from (
@@ -133,23 +128,15 @@ impl InterchainTokenInterface for InterchainToken {
133
128
fn add_minter ( env : & Env , minter : Address ) {
134
129
Self :: owner ( env) . require_auth ( ) ;
135
130
136
- env. storage ( )
137
- . instance ( )
138
- . set ( & DataKey :: Minter ( minter. clone ( ) ) , & ( ) ) ;
139
-
140
- extend_instance_ttl ( env) ;
131
+ storage:: set_minter_status ( env, minter. clone ( ) ) ;
141
132
142
133
MinterAddedEvent { minter } . emit ( env) ;
143
134
}
144
135
145
136
fn remove_minter ( env : & Env , minter : Address ) {
146
137
Self :: owner ( env) . require_auth ( ) ;
147
138
148
- env. storage ( )
149
- . instance ( )
150
- . remove ( & DataKey :: Minter ( minter. clone ( ) ) ) ;
151
-
152
- extend_instance_ttl ( env) ;
139
+ storage:: remove_minter_status ( env, minter. clone ( ) ) ;
153
140
154
141
MinterRemovedEvent { minter } . emit ( env) ;
155
142
}
@@ -183,8 +170,7 @@ impl token::Interface for InterchainToken {
183
170
}
184
171
185
172
fn balance ( env : Env , id : Address ) -> i128 {
186
- extend_instance_ttl ( & env) ;
187
- Self :: read_balance ( & env, id)
173
+ storage:: try_balance ( & env, id) . unwrap_or_default ( )
188
174
}
189
175
190
176
fn transfer ( env : Env , from : Address , to : Address , amount : i128 ) {
@@ -257,26 +243,23 @@ impl InterchainToken {
257
243
}
258
244
259
245
fn read_allowance ( env : & Env , from : Address , spender : Address ) -> AllowanceValue {
260
- let key = DataKey :: Allowance ( AllowanceDataKey { from, spender } ) ;
261
- env. storage ( )
262
- . temporary ( )
263
- . get :: < _ , AllowanceValue > ( & key)
264
- . map_or (
265
- AllowanceValue {
266
- amount : 0 ,
267
- expiration_ledger : 0 ,
268
- } ,
269
- |allowance| {
270
- if allowance. expiration_ledger < env. ledger ( ) . sequence ( ) {
271
- AllowanceValue {
272
- amount : 0 ,
273
- expiration_ledger : allowance. expiration_ledger ,
274
- }
275
- } else {
276
- allowance
246
+ let key = AllowanceDataKey { from, spender } ;
247
+ storage:: try_allowance ( env, key) . map_or (
248
+ AllowanceValue {
249
+ amount : 0 ,
250
+ expiration_ledger : 0 ,
251
+ } ,
252
+ |allowance| {
253
+ if allowance. expiration_ledger < env. ledger ( ) . sequence ( ) {
254
+ AllowanceValue {
255
+ amount : 0 ,
256
+ expiration_ledger : allowance. expiration_ledger ,
277
257
}
278
- } ,
279
- )
258
+ } else {
259
+ allowance
260
+ }
261
+ } ,
262
+ )
280
263
}
281
264
282
265
fn write_allowance (
@@ -297,17 +280,15 @@ impl InterchainToken {
297
280
ContractError :: InvalidExpirationLedger
298
281
) ;
299
282
300
- let key = DataKey :: Allowance ( AllowanceDataKey { from, spender } ) ;
301
- env . storage ( ) . temporary ( ) . set ( & key , & allowance) ;
283
+ let key = AllowanceDataKey { from, spender } ;
284
+ storage:: set_allowance ( env , key . clone ( ) , & allowance) ;
302
285
303
286
if amount > 0 {
304
287
let live_for = expiration_ledger
305
288
. checked_sub ( env. ledger ( ) . sequence ( ) )
306
289
. unwrap ( ) ;
307
290
308
- env. storage ( )
309
- . temporary ( )
310
- . extend_ttl ( & key, live_for, live_for)
291
+ storage:: extend_allowance_ttl ( env, key, live_for, live_for) ;
311
292
}
312
293
}
313
294
@@ -334,45 +315,21 @@ impl InterchainToken {
334
315
}
335
316
}
336
317
337
- fn read_balance ( env : & Env , addr : Address ) -> i128 {
338
- let key = DataKey :: Balance ( addr) ;
339
- env. storage ( )
340
- . persistent ( )
341
- . get :: < _ , i128 > ( & key)
342
- . inspect ( |_| {
343
- // Extend the TTL of the balance entry when the balance is successfully retrieved.
344
- extend_persistent_ttl ( env, & key) ;
345
- } )
346
- . unwrap_or_default ( )
347
- }
348
-
349
318
fn receive_balance ( env : & Env , addr : Address , amount : i128 ) {
350
- let key = DataKey :: Balance ( addr) ;
319
+ let current_balance = storage :: try_balance ( env , addr. clone ( ) ) . unwrap_or_default ( ) ;
351
320
352
- env. storage ( )
353
- . persistent ( )
354
- . update ( & key, |balance : Option < i128 > | {
355
- balance. unwrap_or_default ( ) + amount
356
- } ) ;
321
+ storage:: set_balance ( env, addr, & ( current_balance + amount) ) ;
357
322
}
358
323
359
324
fn spend_balance ( env : & Env , addr : Address , amount : i128 ) {
360
- let balance = Self :: read_balance ( env, addr. clone ( ) ) ;
325
+ let balance = storage :: try_balance ( env, addr. clone ( ) ) . unwrap_or_default ( ) ;
361
326
362
327
assert_with_error ! ( env, balance >= amount, ContractError :: InsufficientBalance ) ;
363
328
364
- Self :: write_balance ( env, addr, balance - amount) ;
329
+ storage :: set_balance ( env, addr, & ( balance - amount) ) ;
365
330
}
366
331
367
332
fn write_metadata ( env : & Env , metadata : TokenMetadata ) {
368
333
TokenUtils :: new ( env) . metadata ( ) . set_metadata ( & metadata) ;
369
334
}
370
-
371
- fn write_balance ( env : & Env , addr : Address , amount : i128 ) {
372
- let key = DataKey :: Balance ( addr) ;
373
-
374
- env. storage ( ) . persistent ( ) . set ( & key, & amount) ;
375
-
376
- extend_persistent_ttl ( env, & key) ;
377
- }
378
335
}
0 commit comments