@@ -6,13 +6,17 @@ pub mod external_calls;
66mod fuzz_math;
77pub mod permissions;
88pub mod strategy;
9+ pub mod upgrade;
10+ #[ cfg( test) ]
11+ pub mod proxy_tests;
912mod test;
1013
1114use crate :: strategy:: StrategyClient ;
1215use soroban_sdk:: {
1316 contract, contractclient, contracterror, contractimpl, contracttype, symbol_short, token,
14- Address , Env , Vec ,
17+ Address , Env , Vec , BytesN ,
1518} ;
19+ use crate :: upgrade:: { get_admin, set_admin, is_initialized, set_initialized} ;
1620
1721const MAX_PAGE_SIZE : u32 = 50 ;
1822
@@ -99,21 +103,32 @@ impl YieldVault {
99103 /// ### Errors
100104 /// * `VaultError::AlreadyInitialized` - If the admin key is already set.
101105 pub fn initialize ( env : Env , admin : Address , token : Address ) -> Result < ( ) , VaultError > {
102- if env . storage ( ) . instance ( ) . has ( & DataKey :: Admin ) {
106+ if is_initialized ( & env ) {
103107 return Err ( VaultError :: AlreadyInitialized ) ;
104108 }
105109
106- env. storage ( ) . instance ( ) . set ( & DataKey :: Admin , & admin) ;
110+ set_admin ( & env, & admin) ;
111+ set_initialized ( & env) ;
112+
107113 env. storage ( ) . instance ( ) . set ( & DataKey :: TokenAsset , & token) ;
108114 env. storage ( ) . instance ( ) . set ( & DataKey :: TotalAssets , & 0i128 ) ;
109115 env. storage ( ) . instance ( ) . set ( & DataKey :: DaoThreshold , & 1i128 ) ;
110116 env. storage ( ) . instance ( ) . set ( & DataKey :: ProposalNonce , & 0u32 ) ;
111117 Ok ( ( ) )
112118 }
113119
120+ /// Upgrades the contract code to a new WASM hash.
121+ /// Only the Admin can call this.
122+ pub fn upgrade ( env : Env , new_wasm_hash : BytesN < 32 > ) {
123+ let admin = get_admin ( & env) . expect ( "Admin not set" ) ;
124+ admin. require_auth ( ) ;
125+
126+ env. deployer ( ) . update_current_contract_wasm ( new_wasm_hash) ;
127+ }
128+
114129 /// Set or update the active strategy connector.
115130 pub fn set_strategy ( env : Env , strategy : Address ) {
116- let admin: Address = env . storage ( ) . instance ( ) . get ( & DataKey :: Admin ) . unwrap ( ) ;
131+ let admin: Address = get_admin ( & env ) . expect ( "Admin not set" ) ;
117132 admin. require_auth ( ) ;
118133 env. storage ( ) . instance ( ) . set ( & DataKey :: Strategy , & strategy) ;
119134 }
@@ -124,7 +139,7 @@ impl YieldVault {
124139 }
125140
126141 pub fn set_pause ( env : Env , paused : bool ) {
127- let admin: Address = env . storage ( ) . instance ( ) . get ( & DataKey :: Admin ) . unwrap ( ) ;
142+ let admin: Address = get_admin ( & env ) . expect ( "Admin not set" ) ;
128143 admin. require_auth ( ) ;
129144
130145 let mut state = Self :: get_state ( & env) ;
@@ -195,15 +210,15 @@ impl YieldVault {
195210 }
196211
197212 pub fn configure_korean_strategy ( env : Env , strategy : Address ) {
198- let admin: Address = env . storage ( ) . instance ( ) . get ( & DataKey :: Admin ) . unwrap ( ) ;
213+ let admin: Address = get_admin ( & env ) . expect ( "Admin not set" ) ;
199214 admin. require_auth ( ) ;
200215 env. storage ( )
201216 . instance ( )
202217 . set ( & DataKey :: KoreanDebtStrategy , & strategy) ;
203218 }
204219
205220 pub fn accrue_korean_debt_yield ( env : Env ) -> i128 {
206- let admin: Address = env . storage ( ) . instance ( ) . get ( & DataKey :: Admin ) . unwrap ( ) ;
221+ let admin: Address = get_admin ( & env ) . expect ( "Admin not set" ) ;
207222 admin. require_auth ( ) ;
208223
209224 let strategy: Address = env
@@ -226,7 +241,7 @@ impl YieldVault {
226241 }
227242
228243 pub fn set_dao_threshold ( env : Env , threshold : i128 ) {
229- let admin: Address = env . storage ( ) . instance ( ) . get ( & DataKey :: Admin ) . unwrap ( ) ;
244+ let admin: Address = get_admin ( & env ) . expect ( "Admin not set" ) ;
230245 admin. require_auth ( ) ;
231246 if threshold <= 0 {
232247 panic ! ( "threshold must be > 0" ) ;
@@ -342,7 +357,7 @@ impl YieldVault {
342357 /// ### Authority
343358 /// Requires `Admin` signature.
344359 pub fn add_shipment ( env : Env , shipment_id : u64 , status : ShipmentStatus ) {
345- let admin: Address = env . storage ( ) . instance ( ) . get ( & DataKey :: Admin ) . unwrap ( ) ;
360+ let admin: Address = get_admin ( & env ) . expect ( "Admin not set" ) ;
346361 admin. require_auth ( ) ;
347362
348363 if env
@@ -368,7 +383,7 @@ impl YieldVault {
368383 }
369384
370385 pub fn update_shipment_status ( env : Env , shipment_id : u64 , new_status : ShipmentStatus ) {
371- let admin: Address = env . storage ( ) . instance ( ) . get ( & DataKey :: Admin ) . unwrap ( ) ;
386+ let admin: Address = get_admin ( & env ) . expect ( "Admin not set" ) ;
372387 admin. require_auth ( ) ;
373388
374389 let old_status: ShipmentStatus = env
@@ -625,7 +640,7 @@ impl YieldVault {
625640
626641 /// Move idle funds to the strategy.
627642 pub fn invest ( env : Env , amount : i128 ) {
628- let admin: Address = env . storage ( ) . instance ( ) . get ( & DataKey :: Admin ) . unwrap ( ) ;
643+ let admin: Address = get_admin ( & env ) . expect ( "Admin not set" ) ;
629644 admin. require_auth ( ) ;
630645
631646 let strategy_addr = Self :: strategy ( env. clone ( ) ) . expect ( "no strategy set" ) ;
@@ -679,7 +694,7 @@ impl YieldVault {
679694
680695 /// Admin function to artificially accrue yield (legacy, but updated for strategy).
681696 pub fn accrue_yield ( env : Env , amount : i128 ) {
682- let admin: Address = env . storage ( ) . instance ( ) . get ( & DataKey :: Admin ) . unwrap ( ) ;
697+ let admin: Address = get_admin ( & env ) . expect ( "Admin not set" ) ;
683698 admin. require_auth ( ) ;
684699
685700 let token_addr = Self :: token ( env. clone ( ) ) ;
0 commit comments