@@ -450,4 +450,255 @@ mod issue_tests {
450450 fn test_bonding_curve_step_5 ( ) {
451451 test_bonding_curve_step_helper ( 5 , 100 , 150 , 350 ) ;
452452 }
453+
454+ // =========================================================================
455+ // Storage key collision tests (#597)
456+ //
457+ // Confirm that two distinct inputs never produce the same storage key.
458+ // =========================================================================
459+
460+ #[ test]
461+ fn test_holder_balance_key_different_holders_differ_for_same_creator ( ) {
462+ let env = Env :: default ( ) ;
463+ let creator = Address :: generate ( & env) ;
464+ let holder_a = Address :: generate ( & env) ;
465+ let holder_b = Address :: generate ( & env) ;
466+
467+ let key_a = constants:: storage:: holder_balance_key ( & creator, & holder_a) ;
468+ let key_b = constants:: storage:: holder_balance_key ( & creator, & holder_b) ;
469+
470+ assert_ne ! (
471+ key_a, key_b,
472+ "different holders must produce different keys"
473+ ) ;
474+ }
475+
476+ #[ test]
477+ fn test_holder_balance_key_argument_order_matters ( ) {
478+ let env = Env :: default ( ) ;
479+ let addr_a = Address :: generate ( & env) ;
480+ let addr_b = Address :: generate ( & env) ;
481+
482+ let key_ab = constants:: storage:: holder_balance_key ( & addr_a, & addr_b) ;
483+ let key_ba = constants:: storage:: holder_balance_key ( & addr_b, & addr_a) ;
484+
485+ assert_ne ! (
486+ key_ab, key_ba,
487+ "swapping creator and holder must produce different keys"
488+ ) ;
489+ }
490+
491+ #[ test]
492+ fn test_holder_balance_key_never_equals_creator_key ( ) {
493+ let env = Env :: default ( ) ;
494+ let creator = Address :: generate ( & env) ;
495+ let holder = Address :: generate ( & env) ;
496+
497+ let balance_key = constants:: storage:: holder_balance_key ( & creator, & holder) ;
498+ let creator_key = constants:: storage:: creator ( & creator) ;
499+
500+ assert_ne ! (
501+ balance_key, creator_key,
502+ "holder balance key must not collide with creator profile key"
503+ ) ;
504+ }
505+
506+ #[ test]
507+ fn test_holder_balance_key_never_equals_dividend_accumulator_key ( ) {
508+ let env = Env :: default ( ) ;
509+ let creator = Address :: generate ( & env) ;
510+ let holder = Address :: generate ( & env) ;
511+
512+ let balance_key = constants:: storage:: holder_balance_key ( & creator, & holder) ;
513+ let dividend_key = constants:: storage:: dividend_accumulator ( & creator) ;
514+
515+ assert_ne ! (
516+ balance_key, dividend_key,
517+ "holder balance key must not collide with dividend accumulator key"
518+ ) ;
519+ }
520+
521+ #[ test]
522+ fn test_holder_dividend_checkpoint_different_holders_differ ( ) {
523+ let env = Env :: default ( ) ;
524+ let creator = Address :: generate ( & env) ;
525+ let holder_a = Address :: generate ( & env) ;
526+ let holder_b = Address :: generate ( & env) ;
527+
528+ let key_a = constants:: storage:: holder_dividend_checkpoint ( & creator, & holder_a) ;
529+ let key_b = constants:: storage:: holder_dividend_checkpoint ( & creator, & holder_b) ;
530+
531+ assert_ne ! (
532+ key_a, key_b,
533+ "different holders must produce different dividend checkpoint keys"
534+ ) ;
535+ }
536+
537+ #[ test]
538+ fn test_holder_dividend_pending_different_holders_differ ( ) {
539+ let env = Env :: default ( ) ;
540+ let creator = Address :: generate ( & env) ;
541+ let holder_a = Address :: generate ( & env) ;
542+ let holder_b = Address :: generate ( & env) ;
543+
544+ let key_a = constants:: storage:: holder_dividend_pending ( & creator, & holder_a) ;
545+ let key_b = constants:: storage:: holder_dividend_pending ( & creator, & holder_b) ;
546+
547+ assert_ne ! (
548+ key_a, key_b,
549+ "different holders must produce different dividend pending keys"
550+ ) ;
551+ }
552+
553+ #[ test]
554+ fn test_co_creator_fee_balance_different_pairs_differ ( ) {
555+ let env = Env :: default ( ) ;
556+ let creator = Address :: generate ( & env) ;
557+ let co_a = Address :: generate ( & env) ;
558+ let co_b = Address :: generate ( & env) ;
559+
560+ let key_a = constants:: storage:: co_creator_fee_balance ( & creator, & co_a) ;
561+ let key_b = constants:: storage:: co_creator_fee_balance ( & creator, & co_b) ;
562+
563+ assert_ne ! (
564+ key_a, key_b,
565+ "different co-creator addresses must produce different fee balance keys"
566+ ) ;
567+ }
568+
569+ #[ test]
570+ fn test_co_creator_fee_balance_different_creators_differ ( ) {
571+ let env = Env :: default ( ) ;
572+ let creator_a = Address :: generate ( & env) ;
573+ let creator_b = Address :: generate ( & env) ;
574+ let co_creator = Address :: generate ( & env) ;
575+
576+ let key_a = constants:: storage:: co_creator_fee_balance ( & creator_a, & co_creator) ;
577+ let key_b = constants:: storage:: co_creator_fee_balance ( & creator_b, & co_creator) ;
578+
579+ assert_ne ! (
580+ key_a, key_b,
581+ "different creators with same co-creator must produce different keys"
582+ ) ;
583+ }
584+
585+ #[ test]
586+ fn test_creator_fee_balance_different_creators_differ ( ) {
587+ let env = Env :: default ( ) ;
588+ let creator_a = Address :: generate ( & env) ;
589+ let creator_b = Address :: generate ( & env) ;
590+
591+ let key_a = constants:: storage:: creator_fee_balance ( & creator_a) ;
592+ let key_b = constants:: storage:: creator_fee_balance ( & creator_b) ;
593+
594+ assert_ne ! (
595+ key_a, key_b,
596+ "different creators must produce different fee balance keys"
597+ ) ;
598+ }
599+
600+ #[ test]
601+ fn test_holder_balance_key_never_equals_creator_fee_balance_key ( ) {
602+ let env = Env :: default ( ) ;
603+ let creator = Address :: generate ( & env) ;
604+ let holder = Address :: generate ( & env) ;
605+
606+ let balance_key = constants:: storage:: holder_balance_key ( & creator, & holder) ;
607+ let fee_key = constants:: storage:: creator_fee_balance ( & creator) ;
608+
609+ assert_ne ! (
610+ balance_key, fee_key,
611+ "holder balance key must not collide with creator fee balance key"
612+ ) ;
613+ }
614+
615+ #[ test]
616+ fn test_holder_dividend_checkpoint_never_equals_holder_balance_key ( ) {
617+ let env = Env :: default ( ) ;
618+ let creator = Address :: generate ( & env) ;
619+ let holder = Address :: generate ( & env) ;
620+
621+ let checkpoint_key = constants:: storage:: holder_dividend_checkpoint ( & creator, & holder) ;
622+ let balance_key = constants:: storage:: holder_balance_key ( & creator, & holder) ;
623+
624+ assert_ne ! (
625+ checkpoint_key, balance_key,
626+ "dividend checkpoint key must not collide with holder balance key"
627+ ) ;
628+ }
629+
630+ #[ test]
631+ fn test_holder_dividend_pending_never_equals_holder_balance_key ( ) {
632+ let env = Env :: default ( ) ;
633+ let creator = Address :: generate ( & env) ;
634+ let holder = Address :: generate ( & env) ;
635+
636+ let pending_key = constants:: storage:: holder_dividend_pending ( & creator, & holder) ;
637+ let balance_key = constants:: storage:: holder_balance_key ( & creator, & holder) ;
638+
639+ assert_ne ! (
640+ pending_key, balance_key,
641+ "dividend pending key must not collide with holder balance key"
642+ ) ;
643+ }
644+
645+ #[ test]
646+ fn test_curve_preset_different_creators_differ ( ) {
647+ let env = Env :: default ( ) ;
648+ let creator_a = Address :: generate ( & env) ;
649+ let creator_b = Address :: generate ( & env) ;
650+
651+ let key_a = constants:: storage:: curve_preset ( & creator_a) ;
652+ let key_b = constants:: storage:: curve_preset ( & creator_b) ;
653+
654+ assert_ne ! (
655+ key_a, key_b,
656+ "different creators must produce different curve preset keys"
657+ ) ;
658+ }
659+
660+ #[ test]
661+ fn test_max_supply_different_creators_differ ( ) {
662+ let env = Env :: default ( ) ;
663+ let creator_a = Address :: generate ( & env) ;
664+ let creator_b = Address :: generate ( & env) ;
665+
666+ let key_a = constants:: storage:: max_supply ( & creator_a) ;
667+ let key_b = constants:: storage:: max_supply ( & creator_b) ;
668+
669+ assert_ne ! (
670+ key_a, key_b,
671+ "different creators must produce different max supply keys"
672+ ) ;
673+ }
674+
675+ #[ test]
676+ fn test_max_keys_per_wallet_different_creators_differ ( ) {
677+ let env = Env :: default ( ) ;
678+ let creator_a = Address :: generate ( & env) ;
679+ let creator_b = Address :: generate ( & env) ;
680+
681+ let key_a = constants:: storage:: max_keys_per_wallet ( & creator_a) ;
682+ let key_b = constants:: storage:: max_keys_per_wallet ( & creator_b) ;
683+
684+ assert_ne ! (
685+ key_a, key_b,
686+ "different creators must produce different max keys per wallet keys"
687+ ) ;
688+ }
689+
690+ #[ test]
691+ fn test_locked_allocation_different_creators_differ ( ) {
692+ let env = Env :: default ( ) ;
693+ let creator_a = Address :: generate ( & env) ;
694+ let creator_b = Address :: generate ( & env) ;
695+
696+ let key_a = constants:: storage:: locked_allocation ( & creator_a) ;
697+ let key_b = constants:: storage:: locked_allocation ( & creator_b) ;
698+
699+ assert_ne ! (
700+ key_a, key_b,
701+ "different creators must produce different locked allocation keys"
702+ ) ;
703+ }
453704}
0 commit comments