@@ -32,7 +32,8 @@ pub fn router(app: App) -> Router {
3232 . route ( "/coins/block/{hash}" , get ( coins_by_block) )
3333 . route ( "/coins/children/{coin_id}" , get ( coins_by_parent) )
3434 . route ( "/coins/id/{coin_id}" , get ( coin_by_id) )
35- . route ( "/spend/{coin_id}" , get ( spend_by_coin_id) )
35+ . route ( "/spends/block/{hash}" , get ( spends_by_block) )
36+ . route ( "/spends/id/{coin_id}" , get ( spend_by_id) )
3637 . with_state ( app)
3738 . layer ( cors)
3839}
@@ -220,12 +221,52 @@ async fn coin_by_id(
220221 } ) )
221222}
222223
224+ #[ derive( Serialize ) ]
225+ pub struct SpendsResponse {
226+ pub spends : Vec < CoinSpendRecord > ,
227+ }
228+
229+ async fn spends_by_block (
230+ State ( app) : State < App > ,
231+ Path ( hash) : Path < Bytes32 > ,
232+ ) -> Result < Json < SpendsResponse > , StatusCode > {
233+ let Some ( height) = app. db . block_height ( hash) . unwrap ( ) else {
234+ return Err ( StatusCode :: NOT_FOUND ) ;
235+ } ;
236+
237+ let mut spends = IndexMap :: new ( ) ;
238+
239+ for coin_id in app. db . coins_by_height ( height) . unwrap ( ) {
240+ if spends. contains_key ( & coin_id) {
241+ continue ;
242+ }
243+
244+ let Some ( coin) = app. db . coin ( coin_id) . unwrap ( ) else {
245+ continue ;
246+ } ;
247+
248+ if coin. spent_height != Some ( height) {
249+ continue ;
250+ }
251+
252+ let Some ( spend) = app. db . coin_spend ( coin_id) . unwrap ( ) else {
253+ continue ;
254+ } ;
255+
256+ spends. insert ( coin_id, spend) ;
257+ }
258+
259+ Ok ( Json ( SpendsResponse {
260+ spends : spends. into_values ( ) . collect_vec ( ) ,
261+ } ) )
262+ }
263+
223264#[ derive( Serialize ) ]
224265pub struct SpendResponse {
225266 pub spend : CoinSpendRecord ,
226267}
227268
228- async fn spend_by_coin_id (
269+ async fn spend_by_id (
229270 State ( app) : State < App > ,
230271 Path ( coin_id) : Path < Bytes32 > ,
231272) -> Result < Json < SpendResponse > , StatusCode > {
0 commit comments