@@ -41,8 +41,9 @@ use crate::{
41
41
use self :: db:: {
42
42
find_inscription_with_id, find_latest_cursed_inscription_number_at_block_height,
43
43
find_latest_inscription_number_at_block_height, format_satpoint_to_watch,
44
- parse_satpoint_to_watch, remove_entry_from_blocks, remove_entry_from_inscriptions, LazyBlock ,
45
- LazyBlockTransaction , TraversalResult , WatchedSatpoint , insert_transfer_in_locations, parse_outpoint_to_watch,
44
+ insert_transfer_in_locations, parse_outpoint_to_watch, parse_satpoint_to_watch,
45
+ remove_entry_from_blocks, remove_entry_from_inscriptions, LazyBlock , LazyBlockTransaction ,
46
+ TraversalResult , WatchedSatpoint ,
46
47
} ;
47
48
use self :: inscription:: InscriptionParser ;
48
49
use self :: ord:: inscription_id:: InscriptionId ;
@@ -651,17 +652,32 @@ pub fn update_storage_and_augment_bitcoin_block_with_inscription_transfer_data(
651
652
652
653
// For each satpoint inscribed retrieved, we need to compute the next
653
654
// outpoint to watch
654
- for mut watched_satpoint in entries. into_iter ( ) {
655
+ for mut watched_satpoint in entries. into_iter ( ) {
655
656
let satpoint_pre_transfer =
656
657
format ! ( "{}:{}" , outpoint_pre_transfer, watched_satpoint. offset) ;
657
658
658
659
// Question is: are inscriptions moving to a new output,
659
660
// burnt or lost in fees and transfered to the miner?
660
661
661
662
let ( _, input_index) = parse_outpoint_to_watch ( & outpoint_pre_transfer) ;
662
- let inputs = new_tx. metadata . inputs . iter ( ) . map ( |o| o. previous_output . value ) . collect :: < _ > ( ) ;
663
- let outputs = new_tx. metadata . outputs . iter ( ) . map ( |o| o. value ) . collect :: < _ > ( ) ;
664
- let post_transfer_data = compute_next_satpoint_data ( input_index, watched_satpoint. offset , & inputs, & outputs) ;
663
+ let inputs = new_tx
664
+ . metadata
665
+ . inputs
666
+ . iter ( )
667
+ . map ( |o| o. previous_output . value )
668
+ . collect :: < _ > ( ) ;
669
+ let outputs = new_tx
670
+ . metadata
671
+ . outputs
672
+ . iter ( )
673
+ . map ( |o| o. value )
674
+ . collect :: < _ > ( ) ;
675
+ let post_transfer_data = compute_next_satpoint_data (
676
+ input_index,
677
+ watched_satpoint. offset ,
678
+ & inputs,
679
+ & outputs,
680
+ ) ;
665
681
666
682
let (
667
683
outpoint_post_transfer,
@@ -707,8 +723,7 @@ pub fn update_storage_and_augment_bitcoin_block_with_inscription_transfer_data(
707
723
}
708
724
SatPosition :: Fee ( offset) => {
709
725
// Get Coinbase TX
710
- let offset =
711
- first_sat_post_subsidy + cumulated_fees + offset;
726
+ let offset = first_sat_post_subsidy + cumulated_fees + offset;
712
727
let outpoint = format_outpoint_to_watch ( & coinbase_txid, 0 ) ;
713
728
( outpoint, offset, None , None )
714
729
}
@@ -726,7 +741,6 @@ pub fn update_storage_and_augment_bitcoin_block_with_inscription_transfer_data(
726
741
)
727
742
} ) ;
728
743
729
-
730
744
let satpoint_post_transfer =
731
745
format ! ( "{}:{}" , outpoint_post_transfer, offset_post_transfer) ;
732
746
@@ -776,8 +790,12 @@ pub enum SatPosition {
776
790
Fee ( u64 ) ,
777
791
}
778
792
779
-
780
- pub fn compute_next_satpoint_data ( input_index : usize , offset_intra_input : u64 , inputs : & Vec < u64 > , outputs : & Vec < u64 > ) -> SatPosition {
793
+ pub fn compute_next_satpoint_data (
794
+ input_index : usize ,
795
+ offset_intra_input : u64 ,
796
+ inputs : & Vec < u64 > ,
797
+ outputs : & Vec < u64 > ,
798
+ ) -> SatPosition {
781
799
let mut offset_cross_inputs = 0 ;
782
800
for ( index, input_value) in inputs. iter ( ) . enumerate ( ) {
783
801
if index == input_index {
@@ -794,31 +812,54 @@ pub fn compute_next_satpoint_data(input_index: usize, offset_intra_input: u64, i
794
812
for ( index, output_value) in outputs. iter ( ) . enumerate ( ) {
795
813
floating_bound += output_value;
796
814
output_index = index;
797
- if floating_bound > offset_cross_inputs {
815
+ if floating_bound > offset_cross_inputs {
798
816
break ;
799
817
}
800
818
offset_intra_outputs += output_value;
801
819
}
802
820
803
821
if output_index == ( outputs. len ( ) - 1 ) && offset_cross_inputs >= floating_bound {
804
822
// Satoshi spent in fees
805
- return SatPosition :: Fee ( offset_cross_inputs- floating_bound) ;
823
+ return SatPosition :: Fee ( offset_cross_inputs - floating_bound) ;
806
824
}
807
825
SatPosition :: Output ( ( output_index, ( offset_cross_inputs - offset_intra_outputs) ) )
808
826
}
809
827
810
828
#[ cfg( test) ]
811
829
pub mod tests;
812
830
813
-
814
831
#[ test]
815
832
fn test_identify_next_output_index_destination ( ) {
816
- assert_eq ! ( compute_next_satpoint_data( 0 , 10 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 30 , 45 ] ) , SatPosition :: Output ( ( 0 , 10 ) ) ) ;
817
- assert_eq ! ( compute_next_satpoint_data( 0 , 20 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 30 , 45 ] ) , SatPosition :: Output ( ( 1 , 0 ) ) ) ;
818
- assert_eq ! ( compute_next_satpoint_data( 1 , 5 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 30 , 45 ] ) , SatPosition :: Output ( ( 1 , 5 ) ) ) ;
819
- assert_eq ! ( compute_next_satpoint_data( 1 , 6 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 5 , 45 ] ) , SatPosition :: Output ( ( 2 , 1 ) ) ) ;
820
- assert_eq ! ( compute_next_satpoint_data( 1 , 10 , & vec![ 10 , 10 , 10 ] , & vec![ 30 ] ) , SatPosition :: Output ( ( 0 , 20 ) ) ) ;
821
- assert_eq ! ( compute_next_satpoint_data( 0 , 30 , & vec![ 10 , 10 , 10 ] , & vec![ 30 ] ) , SatPosition :: Fee ( 0 ) ) ;
822
- assert_eq ! ( compute_next_satpoint_data( 0 , 0 , & vec![ 10 , 10 , 10 ] , & vec![ 30 ] ) , SatPosition :: Output ( ( 0 , 0 ) ) ) ;
823
- assert_eq ! ( compute_next_satpoint_data( 2 , 45 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 30 , 45 ] ) , SatPosition :: Fee ( 0 ) ) ;
833
+ assert_eq ! (
834
+ compute_next_satpoint_data( 0 , 10 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 30 , 45 ] ) ,
835
+ SatPosition :: Output ( ( 0 , 10 ) )
836
+ ) ;
837
+ assert_eq ! (
838
+ compute_next_satpoint_data( 0 , 20 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 30 , 45 ] ) ,
839
+ SatPosition :: Output ( ( 1 , 0 ) )
840
+ ) ;
841
+ assert_eq ! (
842
+ compute_next_satpoint_data( 1 , 5 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 30 , 45 ] ) ,
843
+ SatPosition :: Output ( ( 1 , 5 ) )
844
+ ) ;
845
+ assert_eq ! (
846
+ compute_next_satpoint_data( 1 , 6 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 5 , 45 ] ) ,
847
+ SatPosition :: Output ( ( 2 , 1 ) )
848
+ ) ;
849
+ assert_eq ! (
850
+ compute_next_satpoint_data( 1 , 10 , & vec![ 10 , 10 , 10 ] , & vec![ 30 ] ) ,
851
+ SatPosition :: Output ( ( 0 , 20 ) )
852
+ ) ;
853
+ assert_eq ! (
854
+ compute_next_satpoint_data( 0 , 30 , & vec![ 10 , 10 , 10 ] , & vec![ 30 ] ) ,
855
+ SatPosition :: Fee ( 0 )
856
+ ) ;
857
+ assert_eq ! (
858
+ compute_next_satpoint_data( 0 , 0 , & vec![ 10 , 10 , 10 ] , & vec![ 30 ] ) ,
859
+ SatPosition :: Output ( ( 0 , 0 ) )
860
+ ) ;
861
+ assert_eq ! (
862
+ compute_next_satpoint_data( 2 , 45 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 30 , 45 ] ) ,
863
+ SatPosition :: Fee ( 0 )
864
+ ) ;
824
865
}
0 commit comments