@@ -56,41 +56,57 @@ pub enum SatPosition {
56
56
Fee ( u64 ) ,
57
57
}
58
58
59
+ pub fn resolve_absolute_pointer (
60
+ inputs : & Vec < u64 > ,
61
+ absolute_pointer_value : u64 ,
62
+ ) -> ( usize , u64 ) {
63
+ let mut selected_index = 0 ;
64
+ let mut cumulated_input_value = 0 ;
65
+ for ( index, input_value) in inputs. iter ( ) . enumerate ( ) {
66
+ if ( cumulated_input_value + input_value) > absolute_pointer_value {
67
+ selected_index = index;
68
+ break ;
69
+ }
70
+ cumulated_input_value += input_value;
71
+ }
72
+ let relative_pointer_value = absolute_pointer_value - cumulated_input_value;
73
+ ( selected_index, relative_pointer_value)
74
+ }
75
+
59
76
pub fn compute_next_satpoint_data (
60
77
input_index : usize ,
61
- offset_intra_input : u64 ,
62
78
inputs : & Vec < u64 > ,
63
79
outputs : & Vec < u64 > ,
64
- pointer_from_inscription : u64 ,
80
+ relative_pointer_value : u64 ,
65
81
) -> SatPosition {
66
- let mut offset_cross_inputs = 0 ;
82
+ let mut absolute_offset_in_inputs = 0 ;
67
83
for ( index, input_value) in inputs. iter ( ) . enumerate ( ) {
68
84
if index == input_index {
69
85
break ;
70
86
}
71
- offset_cross_inputs += input_value;
72
- }
73
- offset_cross_inputs += offset_intra_input;
74
- offset_cross_inputs += pointer_from_inscription;
87
+ absolute_offset_in_inputs += input_value;
88
+ }
89
+ absolute_offset_in_inputs += relative_pointer_value;
75
90
76
- let mut offset_intra_outputs = 0 ;
77
- let mut output_index = 0 ;
91
+ let mut absolute_offset_of_first_satoshi_in_selected_output = 0 ;
92
+ let mut selected_output_index = 0 ;
78
93
let mut floating_bound = 0 ;
79
94
80
95
for ( index, output_value) in outputs. iter ( ) . enumerate ( ) {
81
96
floating_bound += output_value;
82
- output_index = index;
83
- if floating_bound > offset_cross_inputs {
97
+ selected_output_index = index;
98
+ if floating_bound > absolute_offset_in_inputs {
84
99
break ;
85
100
}
86
- offset_intra_outputs += output_value;
101
+ absolute_offset_of_first_satoshi_in_selected_output += output_value;
87
102
}
88
103
89
- if output_index == ( outputs. len ( ) - 1 ) && offset_cross_inputs >= floating_bound {
104
+ if selected_output_index == ( outputs. len ( ) - 1 ) && absolute_offset_in_inputs >= floating_bound {
90
105
// Satoshi spent in fees
91
- return SatPosition :: Fee ( offset_cross_inputs - floating_bound) ;
106
+ return SatPosition :: Fee ( absolute_offset_in_inputs - floating_bound) ;
92
107
}
93
- SatPosition :: Output ( ( output_index, ( offset_cross_inputs - offset_intra_outputs) ) )
108
+ let relative_offset_in_selected_output = absolute_offset_in_inputs - absolute_offset_of_first_satoshi_in_selected_output;
109
+ SatPosition :: Output ( ( selected_output_index, relative_offset_in_selected_output) )
94
110
}
95
111
96
112
pub fn should_sync_rocks_db ( config : & Config , ctx : & Context ) -> Result < Option < ( u64 , u64 ) > , String > {
@@ -196,54 +212,52 @@ pub fn should_sync_ordhook_db(
196
212
#[ test]
197
213
fn test_identify_next_output_index_destination ( ) {
198
214
assert_eq ! (
199
- compute_next_satpoint_data( 0 , 10 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 30 , 45 ] , 0 ) ,
215
+ compute_next_satpoint_data( 0 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 30 , 45 ] , 10 ) ,
200
216
SatPosition :: Output ( ( 0 , 10 ) )
201
217
) ;
202
218
assert_eq ! (
203
- compute_next_satpoint_data( 0 , 20 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 30 , 45 ] , 0 ) ,
219
+ compute_next_satpoint_data( 0 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 30 , 45 ] , 20 ) ,
204
220
SatPosition :: Output ( ( 1 , 0 ) )
205
221
) ;
206
222
assert_eq ! (
207
- compute_next_satpoint_data( 1 , 5 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 30 , 45 ] , 0 ) ,
223
+ compute_next_satpoint_data( 1 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 30 , 45 ] , 25 ) ,
208
224
SatPosition :: Output ( ( 1 , 5 ) )
209
225
) ;
210
226
assert_eq ! (
211
- compute_next_satpoint_data( 1 , 6 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 5 , 45 ] , 0 ) ,
227
+ compute_next_satpoint_data( 1 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 5 , 45 ] , 26 ) ,
212
228
SatPosition :: Output ( ( 2 , 1 ) )
213
229
) ;
214
230
assert_eq ! (
215
- compute_next_satpoint_data( 1 , 10 , & vec![ 10 , 10 , 10 ] , & vec![ 30 ] , 0 ) ,
231
+ compute_next_satpoint_data( 1 , & vec![ 10 , 10 , 10 ] , & vec![ 30 ] , 20 ) ,
216
232
SatPosition :: Output ( ( 0 , 20 ) )
217
233
) ;
218
234
assert_eq ! (
219
- compute_next_satpoint_data( 0 , 30 , & vec![ 10 , 10 , 10 ] , & vec![ 30 ] , 0 ) ,
235
+ compute_next_satpoint_data( 0 , & vec![ 10 , 10 , 10 ] , & vec![ 30 ] , 30 ) ,
220
236
SatPosition :: Fee ( 0 )
221
237
) ;
222
238
assert_eq ! (
223
- compute_next_satpoint_data( 0 , 0 , & vec![ 10 , 10 , 10 ] , & vec![ 30 ] , 0 ) ,
239
+ compute_next_satpoint_data( 0 , & vec![ 10 , 10 , 10 ] , & vec![ 30 ] , 0 ) ,
224
240
SatPosition :: Output ( ( 0 , 0 ) )
225
241
) ;
226
242
assert_eq ! (
227
- compute_next_satpoint_data( 2 , 45 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 30 , 45 ] , 0 ) ,
243
+ compute_next_satpoint_data( 2 , & vec![ 20 , 30 , 45 ] , & vec![ 20 , 30 , 45 ] , 95 ) ,
228
244
SatPosition :: Fee ( 0 )
229
245
) ;
230
246
assert_eq ! (
231
247
compute_next_satpoint_data(
232
248
2 ,
233
- 0 ,
234
249
& vec![ 1000 , 600 , 546 , 63034 ] ,
235
250
& vec![ 1600 , 10000 , 15000 ] ,
236
- 0
251
+ 1600
237
252
) ,
238
253
SatPosition :: Output ( ( 1 , 0 ) )
239
254
) ;
240
255
assert_eq ! (
241
256
compute_next_satpoint_data(
242
257
3 ,
243
- 0 ,
244
258
& vec![ 6100 , 148660 , 103143 , 7600 ] ,
245
259
& vec![ 81434 , 173995 ] ,
246
- 0
260
+ 257903
247
261
) ,
248
262
SatPosition :: Fee ( 2474 )
249
263
) ;
0 commit comments