@@ -70,7 +70,7 @@ impl PredictifyTest {
7070 // Initialize contract
7171 let contract_id = env. register ( PredictifyHybrid , ( ) ) ;
7272 let client = PredictifyHybridClient :: new ( & env, & contract_id) ;
73- client. initialize ( & admin) ;
73+ client. initialize ( & admin, & None ) ;
7474
7575 // Set token for staking
7676 env. as_contract ( & contract_id, || {
@@ -740,3 +740,178 @@ fn test_error_recovery_scenarios() {
740740 assert ! ( validation_result) ;
741741 } ) ;
742742}
743+
744+ // ===== INITIALIZATION TESTS =====
745+
746+ #[ test]
747+ fn test_initialize_with_default_fee ( ) {
748+ let env = Env :: default ( ) ;
749+ env. mock_all_auths ( ) ;
750+
751+ let admin = Address :: generate ( & env) ;
752+ let contract_id = env. register ( PredictifyHybrid , ( ) ) ;
753+ let client = PredictifyHybridClient :: new ( & env, & contract_id) ;
754+
755+ // Initialize with None (default 2% fee)
756+ client. initialize ( & admin, & None ) ;
757+
758+ // Verify admin is set
759+ let stored_admin: Address = env. as_contract ( & contract_id, || {
760+ env. storage ( )
761+ . persistent ( )
762+ . get ( & Symbol :: new ( & env, "Admin" ) )
763+ . unwrap ( )
764+ } ) ;
765+ assert_eq ! ( stored_admin, admin) ;
766+
767+ // Verify platform fee is default 2%
768+ let stored_fee: i128 = env. as_contract ( & contract_id, || {
769+ env. storage ( )
770+ . persistent ( )
771+ . get ( & Symbol :: new ( & env, "platform_fee" ) )
772+ . unwrap ( )
773+ } ) ;
774+ assert_eq ! ( stored_fee, 2 ) ;
775+ }
776+
777+ #[ test]
778+ fn test_initialize_with_custom_fee ( ) {
779+ let env = Env :: default ( ) ;
780+ env. mock_all_auths ( ) ;
781+
782+ let admin = Address :: generate ( & env) ;
783+ let contract_id = env. register ( PredictifyHybrid , ( ) ) ;
784+ let client = PredictifyHybridClient :: new ( & env, & contract_id) ;
785+
786+ // Initialize with custom 5% fee
787+ client. initialize ( & admin, & Some ( 5 ) ) ;
788+
789+ // Verify platform fee is 5%
790+ let stored_fee: i128 = env. as_contract ( & contract_id, || {
791+ env. storage ( )
792+ . persistent ( )
793+ . get ( & Symbol :: new ( & env, "platform_fee" ) )
794+ . unwrap ( )
795+ } ) ;
796+ assert_eq ! ( stored_fee, 5 ) ;
797+ }
798+
799+ #[ test]
800+ #[ should_panic( expected = "Error(Contract, #504)" ) ] // AlreadyInitialized = 504
801+ fn test_reinitialize_prevention ( ) {
802+ let env = Env :: default ( ) ;
803+ env. mock_all_auths ( ) ;
804+
805+ let admin = Address :: generate ( & env) ;
806+ let contract_id = env. register ( PredictifyHybrid , ( ) ) ;
807+ let client = PredictifyHybridClient :: new ( & env, & contract_id) ;
808+
809+ // First initialization - should succeed
810+ client. initialize ( & admin, & None ) ;
811+
812+ // Second initialization - should panic with AlreadyInitialized
813+ client. initialize ( & admin, & Some ( 3 ) ) ;
814+ }
815+
816+ #[ test]
817+ #[ should_panic( expected = "Error(Contract, #402)" ) ] // InvalidFeeConfig = 402
818+ fn test_initialize_invalid_fee_negative ( ) {
819+ let env = Env :: default ( ) ;
820+ env. mock_all_auths ( ) ;
821+
822+ let admin = Address :: generate ( & env) ;
823+ let contract_id = env. register ( PredictifyHybrid , ( ) ) ;
824+ let client = PredictifyHybridClient :: new ( & env, & contract_id) ;
825+
826+ // Initialize with negative fee - should panic
827+ client. initialize ( & admin, & Some ( -1 ) ) ;
828+ }
829+
830+ #[ test]
831+ #[ should_panic( expected = "Error(Contract, #402)" ) ] // InvalidFeeConfig = 402
832+ fn test_initialize_invalid_fee_too_high ( ) {
833+ let env = Env :: default ( ) ;
834+ env. mock_all_auths ( ) ;
835+
836+ let admin = Address :: generate ( & env) ;
837+ let contract_id = env. register ( PredictifyHybrid , ( ) ) ;
838+ let client = PredictifyHybridClient :: new ( & env, & contract_id) ;
839+
840+ // Initialize with fee exceeding max 10% - should panic
841+ client. initialize ( & admin, & Some ( 11 ) ) ;
842+ }
843+
844+ #[ test]
845+ fn test_initialize_valid_fee_bounds ( ) {
846+ // Test minimum fee (0%)
847+ {
848+ let env = Env :: default ( ) ;
849+ env. mock_all_auths ( ) ;
850+ let admin = Address :: generate ( & env) ;
851+ let contract_id = env. register ( PredictifyHybrid , ( ) ) ;
852+ let client = PredictifyHybridClient :: new ( & env, & contract_id) ;
853+
854+ client. initialize ( & admin, & Some ( 0 ) ) ;
855+
856+ let stored_fee: i128 = env. as_contract ( & contract_id, || {
857+ env. storage ( )
858+ . persistent ( )
859+ . get ( & Symbol :: new ( & env, "platform_fee" ) )
860+ . unwrap ( )
861+ } ) ;
862+ assert_eq ! ( stored_fee, 0 ) ;
863+ }
864+
865+ // Test maximum fee (10%)
866+ {
867+ let env = Env :: default ( ) ;
868+ env. mock_all_auths ( ) ;
869+ let admin = Address :: generate ( & env) ;
870+ let contract_id = env. register ( PredictifyHybrid , ( ) ) ;
871+ let client = PredictifyHybridClient :: new ( & env, & contract_id) ;
872+
873+ client. initialize ( & admin, & Some ( 10 ) ) ;
874+
875+ let stored_fee: i128 = env. as_contract ( & contract_id, || {
876+ env. storage ( )
877+ . persistent ( )
878+ . get ( & Symbol :: new ( & env, "platform_fee" ) )
879+ . unwrap ( )
880+ } ) ;
881+ assert_eq ! ( stored_fee, 10 ) ;
882+ }
883+ }
884+
885+ #[ test]
886+ fn test_initialize_storage_verification ( ) {
887+ let env = Env :: default ( ) ;
888+ env. mock_all_auths ( ) ;
889+
890+ let admin = Address :: generate ( & env) ;
891+ let contract_id = env. register ( PredictifyHybrid , ( ) ) ;
892+ let client = PredictifyHybridClient :: new ( & env, & contract_id) ;
893+
894+ client. initialize ( & admin, & Some ( 3 ) ) ;
895+
896+ // Verify admin address is in persistent storage
897+ env. as_contract ( & contract_id, || {
898+ let has_admin = env. storage ( ) . persistent ( ) . has ( & Symbol :: new ( & env, "Admin" ) ) ;
899+ assert ! ( has_admin) ;
900+ } ) ;
901+
902+ // Verify platform fee is in persistent storage
903+ env. as_contract ( & contract_id, || {
904+ let has_fee = env
905+ . storage ( )
906+ . persistent ( )
907+ . has ( & Symbol :: new ( & env, "platform_fee" ) ) ;
908+ assert ! ( has_fee) ;
909+ } ) ;
910+
911+ // Verify initialization flag (admin existence serves as initialization flag)
912+ env. as_contract ( & contract_id, || {
913+ let admin_result: Option < Address > =
914+ env. storage ( ) . persistent ( ) . get ( & Symbol :: new ( & env, "Admin" ) ) ;
915+ assert ! ( admin_result. is_some( ) ) ;
916+ } ) ;
917+ }
0 commit comments