@@ -34,14 +34,21 @@ pub struct IdentityOracle;
3434
3535#[ contractimpl]
3636impl IdentityOracle {
37- pub fn initialize ( _env : Env , _admin : Address ) {
38- // TODO: store admin in instance storage
39- panic ! ( "not yet implemented" )
37+ pub fn initialize ( env : Env , admin : Address ) {
38+ if env. storage ( ) . instance ( ) . has ( & DataKey :: Admin ) {
39+ panic ! ( "already initialized" ) ;
40+ }
41+ admin. require_auth ( ) ;
42+ env. storage ( ) . instance ( ) . set ( & DataKey :: Admin , & admin) ;
4043 }
4144
42- pub fn register_issuer ( _env : Env , _admin : Address , _issuer : Address ) {
43- // TODO: require admin auth, store issuer as trusted
44- panic ! ( "not yet implemented" )
45+ pub fn register_issuer ( env : Env , admin : Address , issuer : Address ) {
46+ let stored_admin: Address = env. storage ( ) . instance ( ) . get ( & DataKey :: Admin ) . expect ( "not initialized" ) ;
47+ if admin != stored_admin {
48+ panic ! ( "not authorized" ) ;
49+ }
50+ admin. require_auth ( ) ;
51+ env. storage ( ) . persistent ( ) . set ( & DataKey :: TrustedIssuer ( issuer) , & true ) ;
4552 }
4653
4754 pub fn anchor_did ( _env : Env , _subject : Address , _did_doc_cid : String ) {
@@ -74,4 +81,20 @@ impl IdentityOracle {
7481}
7582
7683#[ cfg( test) ]
77- mod tests { }
84+ mod tests {
85+ use super :: * ;
86+ use soroban_sdk:: { testutils:: Address as _, Env } ;
87+
88+ #[ test]
89+ fn test_initialize_sets_admin ( ) {
90+ let env = Env :: default ( ) ;
91+ env. mock_all_auths ( ) ;
92+ let contract_id = env. register_contract ( None , IdentityOracle ) ;
93+ let client = IdentityOracleClient :: new ( & env, & contract_id) ;
94+ let admin = Address :: generate ( & env) ;
95+ client. initialize ( & admin) ;
96+ // verify by calling register_issuer as admin (should not panic)
97+ let issuer = Address :: generate ( & env) ;
98+ client. register_issuer ( & admin, & issuer) ;
99+ }
100+ }
0 commit comments