@@ -7,7 +7,7 @@ use spaces_client::{
77 } ,
88 wallets:: { AddressKind , WalletResponse } ,
99} ;
10- use spaces_client:: rpc:: { CommitParams , CreatePtrParams , DelegateParams , TransferPtrParams , TransferSpacesParams } ;
10+ use spaces_client:: rpc:: { CommitParams , CreatePtrParams , DelegateParams , SetPtrDataParams , TransferPtrParams , TransferSpacesParams } ;
1111use spaces_client:: store:: Sha256 ;
1212use spaces_protocol:: { bitcoin, bitcoin:: { FeeRate } } ;
1313use spaces_protocol:: bitcoin:: hashes:: { sha256, Hash } ;
@@ -184,7 +184,7 @@ async fn it_should_commit_and_rollback(rig: &TestRig) -> anyhow::Result<()> {
184184 mine_and_sync ( rig, 1 ) . await ?;
185185
186186 // Verify delegation is set up
187- let sptr = rig. spaced . client . get_delegation ( space_name. clone ( ) ) . await ?
187+ rig. spaced . client . get_delegation ( space_name. clone ( ) ) . await ?
188188 . expect ( "delegation should be established" ) ;
189189
190190 // Test 1: Make initial commitment [1u8;32]
@@ -633,6 +633,122 @@ async fn it_should_reject_duplicate_sptr_delegations(rig: &TestRig) -> anyhow::R
633633 Ok ( ( ) )
634634}
635635
636+ // ============== Test: PTR Data ==============
637+
638+ async fn it_should_set_and_persist_ptr_data ( rig : & TestRig ) -> anyhow:: Result < ( ) > {
639+ sync_all ( rig) . await ?;
640+
641+ // Test 1: Create a PTR
642+ println ! ( "Test 1: Create PTR" ) ;
643+ let addr0 = rig. spaced . client . wallet_get_new_address ( ALICE , AddressKind :: Coin ) . await ?;
644+ let addr0_spk = bitcoin:: address:: Address :: from_str ( & addr0) ?
645+ . assume_checked ( )
646+ . script_pubkey ( ) ;
647+ let addr0_spk_string = hex:: encode ( addr0_spk. as_bytes ( ) ) ;
648+
649+ wallet_do (
650+ rig,
651+ ALICE ,
652+ vec ! [ RpcWalletRequest :: CreatePtr ( CreatePtrParams {
653+ spk: addr0_spk_string,
654+ } ) ] ,
655+ false ,
656+ ) . await ?;
657+ mine_and_sync ( rig, 1 ) . await ?;
658+
659+ let sptr = Sptr :: from_spk :: < Sha256 > ( addr0_spk. clone ( ) ) ;
660+ println ! ( "SPTR created: {}" , sptr) ;
661+
662+ // Verify PTR exists with no data
663+ let ptr_initial = rig. spaced . client . get_ptr ( sptr) . await ?
664+ . expect ( "ptr should exist" ) ;
665+ assert_eq ! ( ptr_initial. ptrout. sptr. as_ref( ) . unwrap( ) . data, None , "PTR should have no data initially" ) ;
666+
667+ // Test 2: Set data on the PTR
668+ println ! ( "\n Test 2: Set data on PTR" ) ;
669+ let test_data = b"Hello, PTR data!" . to_vec ( ) ;
670+ let set_data = wallet_do (
671+ rig,
672+ ALICE ,
673+ vec ! [ RpcWalletRequest :: SetPtrData ( SetPtrDataParams {
674+ sptr,
675+ data: test_data. clone( ) ,
676+ } ) ] ,
677+ false ,
678+ ) . await ?;
679+ assert ! ( wallet_res_err( & set_data) . is_ok( ) , "SetPtrData should succeed" ) ;
680+ mine_and_sync ( rig, 1 ) . await ?;
681+
682+ // Verify data was set
683+ let ptr_with_data = rig. spaced . client . get_ptr ( sptr) . await ?
684+ . expect ( "ptr should exist" ) ;
685+ assert_eq ! ( ptr_with_data. ptrout. sptr. as_ref( ) . unwrap( ) . data, Some ( test_data. clone( ) ) , "PTR data should be set" ) ;
686+ println ! ( "✓ PTR data set successfully: {:?}" , String :: from_utf8_lossy( & test_data) ) ;
687+
688+ // Test 3: Transfer PTR without data - data should persist
689+ println ! ( "\n Test 3: Transfer PTR without setting new data - data should persist" ) ;
690+ let bob_addr = rig. spaced . client . wallet_get_new_address ( BOB , AddressKind :: Space ) . await ?;
691+ let transfer = wallet_do (
692+ rig,
693+ ALICE ,
694+ vec ! [ RpcWalletRequest :: TransferPtr ( TransferPtrParams {
695+ ptrs: vec![ sptr] ,
696+ to: bob_addr. clone( ) ,
697+ } ) ] ,
698+ false ,
699+ ) . await ?;
700+ assert ! ( wallet_res_err( & transfer) . is_ok( ) , "TransferPtr should succeed" ) ;
701+ mine_and_sync ( rig, 1 ) . await ?;
702+
703+ let ptr_after_transfer = rig. spaced . client . get_ptr ( sptr) . await ?
704+ . expect ( "ptr should exist after transfer" ) ;
705+ assert_eq ! ( ptr_after_transfer. ptrout. sptr. as_ref( ) . unwrap( ) . data, Some ( test_data. clone( ) ) ,
706+ "PTR data should persist after transfer without new data" ) ;
707+ println ! ( "✓ PTR data persisted after transfer" ) ;
708+
709+ // Test 4: Update data with new value
710+ println ! ( "\n Test 4: Update PTR data with new value" ) ;
711+ let new_data = b"Updated data!" . to_vec ( ) ;
712+ let update_data = wallet_do (
713+ rig,
714+ BOB ,
715+ vec ! [ RpcWalletRequest :: SetPtrData ( SetPtrDataParams {
716+ sptr,
717+ data: new_data. clone( ) ,
718+ } ) ] ,
719+ false ,
720+ ) . await ?;
721+ assert ! ( wallet_res_err( & update_data) . is_ok( ) , "SetPtrData should succeed" ) ;
722+ mine_and_sync ( rig, 1 ) . await ?;
723+
724+ let ptr_updated = rig. spaced . client . get_ptr ( sptr) . await ?
725+ . expect ( "ptr should exist" ) ;
726+ assert_eq ! ( ptr_updated. ptrout. sptr. as_ref( ) . unwrap( ) . data, Some ( new_data. clone( ) ) , "PTR data should be updated" ) ;
727+ println ! ( "✓ PTR data updated successfully: {:?}" , String :: from_utf8_lossy( & new_data) ) ;
728+
729+ // Test 5: Set empty data
730+ println ! ( "\n Test 5: Set empty data" ) ;
731+ let empty_data = Vec :: new ( ) ;
732+ let set_empty = wallet_do (
733+ rig,
734+ BOB ,
735+ vec ! [ RpcWalletRequest :: SetPtrData ( SetPtrDataParams {
736+ sptr,
737+ data: empty_data. clone( ) ,
738+ } ) ] ,
739+ false ,
740+ ) . await ?;
741+ assert ! ( wallet_res_err( & set_empty) . is_ok( ) , "SetPtrData with empty data should succeed" ) ;
742+ mine_and_sync ( rig, 1 ) . await ?;
743+
744+ let ptr_empty = rig. spaced . client . get_ptr ( sptr) . await ?
745+ . expect ( "ptr should exist" ) ;
746+ assert_eq ! ( ptr_empty. ptrout. sptr. as_ref( ) . unwrap( ) . data, Some ( empty_data) , "PTR data should be set to empty" ) ;
747+ println ! ( "✓ PTR data set to empty successfully" ) ;
748+
749+ Ok ( ( ) )
750+ }
751+
636752// ============== Main Test Runner ==============
637753
638754#[ tokio:: test]
@@ -666,6 +782,9 @@ async fn run_ptr_tests() -> anyhow::Result<()> {
666782 println ! ( "\n === Running PTR n→n Transfer Rule Tests ===" ) ;
667783 it_should_transfer_ptr_with_n_to_n_rule ( & rig) . await ?;
668784
785+ println ! ( "\n === Running PTR Data Tests ===" ) ;
786+ it_should_set_and_persist_ptr_data ( & rig) . await ?;
787+
669788 println ! ( "\n === All tests passed! ===" ) ;
670789 Ok ( ( ) )
671790}
0 commit comments