@@ -54,10 +54,11 @@ static void swap_inputs(struct bitcoin_tx_input *inputs,
5454 }
5555}
5656
57- void permute_inputs (struct bitcoin_tx_input * inputs , size_t num_inputs ,
57+ void permute_inputs (struct bitcoin_tx_input * inputs ,
5858 const void * * map )
5959{
6060 size_t i ;
61+ size_t num_inputs = tal_count (inputs );
6162
6263 /* We can't permute nothing! */
6364 if (num_inputs == 0 )
@@ -73,10 +74,10 @@ void permute_inputs(struct bitcoin_tx_input *inputs, size_t num_inputs,
7374
7475static void swap_outputs (struct bitcoin_tx_output * outputs ,
7576 const void * * map ,
77+ u32 * cltvs ,
7678 size_t i1 , size_t i2 )
7779{
7880 struct bitcoin_tx_output tmpoutput ;
79- const void * tmp ;
8081
8182 if (i1 == i2 )
8283 return ;
@@ -86,49 +87,74 @@ static void swap_outputs(struct bitcoin_tx_output *outputs,
8687 outputs [i2 ] = tmpoutput ;
8788
8889 if (map ) {
89- tmp = map [i1 ];
90+ const void * tmp = map [i1 ];
9091 map [i1 ] = map [i2 ];
9192 map [i2 ] = tmp ;
9293 }
94+
95+ if (cltvs ) {
96+ u32 tmp = cltvs [i1 ];
97+ cltvs [i1 ] = cltvs [i2 ];
98+ cltvs [i2 ] = tmp ;
99+ }
93100}
94101
95102static 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 )
97106{
98- size_t len ;
107+ size_t len , lena , lenb ;
99108 int ret ;
100109
101110 if (a -> amount != b -> amount )
102111 return a -> amount < b -> amount ;
103112
104113 /* 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 ;
107118 else
108- len = tal_count ( b -> script ) ;
119+ len = lenb ;
109120
110121 ret = memcmp (a -> script , b -> script , len );
111122 if (ret != 0 )
112123 return ret < 0 ;
113124
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 ];
115136}
116137
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 )
118141{
119142 size_t i , best = 0 ;
120143
121144 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 )))
123147 best = i ;
124148 }
125149 return best ;
126150}
127151
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 ,
129154 const void * * map )
130155{
131156 size_t i ;
157+ size_t num_outputs = tal_count (outputs );
132158
133159 /* We can't permute nothing! */
134160 if (num_outputs == 0 )
@@ -137,7 +163,9 @@ void permute_outputs(struct bitcoin_tx_output *outputs, size_t num_outputs,
137163 /* Now do a dumb sort (num_outputs is small). */
138164 for (i = 0 ; i < num_outputs - 1 ; i ++ ) {
139165 /* 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 ));
142170 }
143171}
0 commit comments