@@ -5038,3 +5038,63 @@ fn test_all_or_nothing_group_still_requires_all_funded() {
50385038 c. pay ( & payer, & id1, & 100_i128 , & 0_u64 , & false , & false ) ;
50395039 c. release ( & id1) ; // should panic
50405040}
5041+
5042+ // ---------------------------------------------------------------------------
5043+ // Escrow migration
5044+ // ---------------------------------------------------------------------------
5045+
5046+ #[ test]
5047+ fn test_migrate_escrow_transfers_balance ( ) {
5048+ let ( env, contract_id, token_id) = setup ( ) ;
5049+ let c = client ( & env, & contract_id) ;
5050+ let tk = token_client ( & env, & token_id) ;
5051+
5052+ let admin = Address :: generate ( & env) ;
5053+ let creator = Address :: generate ( & env) ;
5054+ let payer = Address :: generate ( & env) ;
5055+ let recipient = Address :: generate ( & env) ;
5056+ let new_contract = Address :: generate ( & env) ;
5057+
5058+ StellarAssetClient :: new ( & env, & token_id) . mint ( & payer, & 500 ) ;
5059+ env. ledger ( ) . set_timestamp ( 1_000 ) ;
5060+
5061+ // Initialize with admin
5062+ let treasury = Address :: generate ( & env) ;
5063+ c. initialize ( & admin, & 0_i128 , & treasury, & token_id, & 0_u32 , & None , & 0_u32 , & 0_u32 , & 0_u64 ) ;
5064+
5065+ // Create a pending invoice with partial funds
5066+ let id = make_invoice ( & env, & c, & creator, & recipient, 200 , & token_id, 9_999 ) ;
5067+ c. pay ( & payer, & id, & 100_i128 , & 0_u64 , & false , & false ) ;
5068+ assert_eq ! ( c. get_invoice( & id) . status, InvoiceStatus :: Pending ) ;
5069+ assert_eq ! ( c. get_invoice( & id) . funded, 100 ) ;
5070+
5071+ // Check contract token balance before migration
5072+ let contract_balance_before = tk. balance ( & contract_id) ;
5073+ assert_eq ! ( contract_balance_before, 100 ) ;
5074+
5075+ // Migrate escrow
5076+ c. migrate_escrow ( & admin, & new_contract) ;
5077+
5078+ // Verify new contract received the funds
5079+ assert_eq ! ( tk. balance( & new_contract) , 100 ) ;
5080+ assert_eq ! ( tk. balance( & contract_id) , 0 ) ;
5081+ }
5082+
5083+ #[ test]
5084+ fn test_migrate_escrow_zero_balance ( ) {
5085+ let ( env, contract_id, token_id) = setup ( ) ;
5086+ let c = client ( & env, & contract_id) ;
5087+
5088+ let admin = Address :: generate ( & env) ;
5089+ let new_contract = Address :: generate ( & env) ;
5090+
5091+ // Initialize with admin
5092+ let treasury = Address :: generate ( & env) ;
5093+ c. initialize ( & admin, & 0_i128 , & treasury, & token_id, & 0_u32 , & None , & 0_u32 , & 0_u32 , & 0_u64 ) ;
5094+
5095+ // No invoices with funds - migration should succeed with zero transfer
5096+ c. migrate_escrow ( & admin, & new_contract) ;
5097+
5098+ let tk = token_client ( & env, & token_id) ;
5099+ assert_eq ! ( tk. balance( & new_contract) , 0 ) ;
5100+ }
0 commit comments