@@ -54,10 +54,11 @@ static void swap_inputs(struct bitcoin_tx_input *inputs,
54
54
}
55
55
}
56
56
57
- void permute_inputs (struct bitcoin_tx_input * inputs , size_t num_inputs ,
57
+ void permute_inputs (struct bitcoin_tx_input * inputs ,
58
58
const void * * map )
59
59
{
60
60
size_t i ;
61
+ size_t num_inputs = tal_count (inputs );
61
62
62
63
/* We can't permute nothing! */
63
64
if (num_inputs == 0 )
@@ -73,10 +74,10 @@ void permute_inputs(struct bitcoin_tx_input *inputs, size_t num_inputs,
73
74
74
75
static void swap_outputs (struct bitcoin_tx_output * outputs ,
75
76
const void * * map ,
77
+ u32 * cltvs ,
76
78
size_t i1 , size_t i2 )
77
79
{
78
80
struct bitcoin_tx_output tmpoutput ;
79
- const void * tmp ;
80
81
81
82
if (i1 == i2 )
82
83
return ;
@@ -86,49 +87,74 @@ static void swap_outputs(struct bitcoin_tx_output *outputs,
86
87
outputs [i2 ] = tmpoutput ;
87
88
88
89
if (map ) {
89
- tmp = map [i1 ];
90
+ const void * tmp = map [i1 ];
90
91
map [i1 ] = map [i2 ];
91
92
map [i2 ] = tmp ;
92
93
}
94
+
95
+ if (cltvs ) {
96
+ u32 tmp = cltvs [i1 ];
97
+ cltvs [i1 ] = cltvs [i2 ];
98
+ cltvs [i2 ] = tmp ;
99
+ }
93
100
}
94
101
95
102
static bool output_better (const struct bitcoin_tx_output * a ,
96
- const struct bitcoin_tx_output * b )
103
+ u32 cltv_a ,
104
+ const struct bitcoin_tx_output * b ,
105
+ u32 cltv_b )
97
106
{
98
- size_t len ;
107
+ size_t len , lena , lenb ;
99
108
int ret ;
100
109
101
110
if (a -> amount != b -> amount )
102
111
return a -> amount < b -> amount ;
103
112
104
113
/* Lexicographical sort. */
105
- if (tal_count (a -> script ) < tal_count (b -> script ))
106
- len = tal_count (a -> script );
114
+ lena = tal_count (a -> script );
115
+ lenb = tal_count (b -> script );
116
+ if (lena < lenb )
117
+ len = lena ;
107
118
else
108
- len = tal_count ( b -> script ) ;
119
+ len = lenb ;
109
120
110
121
ret = memcmp (a -> script , b -> script , len );
111
122
if (ret != 0 )
112
123
return ret < 0 ;
113
124
114
- return tal_count (a -> script ) < tal_count (b -> script );
125
+ if (lena != lenb )
126
+ return lena < lenb ;
127
+
128
+ return cltv_a < cltv_b ;
129
+ }
130
+
131
+ static u32 cltv_of (const u32 * cltvs , size_t idx )
132
+ {
133
+ if (!cltvs )
134
+ return 0 ;
135
+ return cltvs [idx ];
115
136
}
116
137
117
- static size_t find_best_out (struct bitcoin_tx_output * outputs , size_t num )
138
+ static size_t find_best_out (struct bitcoin_tx_output * outputs ,
139
+ const u32 * cltvs ,
140
+ size_t num )
118
141
{
119
142
size_t i , best = 0 ;
120
143
121
144
for (i = 1 ; i < num ; i ++ ) {
122
- if (output_better (& outputs [i ], & outputs [best ]))
145
+ if (output_better (& outputs [i ], cltv_of (cltvs , i ),
146
+ & outputs [best ], cltv_of (cltvs , best )))
123
147
best = i ;
124
148
}
125
149
return best ;
126
150
}
127
151
128
- void permute_outputs (struct bitcoin_tx_output * outputs , size_t num_outputs ,
152
+ void permute_outputs (struct bitcoin_tx_output * outputs ,
153
+ u32 * cltvs ,
129
154
const void * * map )
130
155
{
131
156
size_t i ;
157
+ size_t num_outputs = tal_count (outputs );
132
158
133
159
/* We can't permute nothing! */
134
160
if (num_outputs == 0 )
@@ -137,7 +163,9 @@ void permute_outputs(struct bitcoin_tx_output *outputs, size_t num_outputs,
137
163
/* Now do a dumb sort (num_outputs is small). */
138
164
for (i = 0 ; i < num_outputs - 1 ; i ++ ) {
139
165
/* Swap best into first place. */
140
- swap_outputs (outputs , map ,
141
- i , i + find_best_out (outputs + i , num_outputs - i ));
166
+ swap_outputs (outputs , map , cltvs ,
167
+ i , i + find_best_out (outputs + i ,
168
+ cltvs ? cltvs + i : NULL ,
169
+ num_outputs - i ));
142
170
}
143
171
}
0 commit comments