@@ -4,8 +4,7 @@ use super::types::{
4
4
} ;
5
5
use crate :: utils:: Context ;
6
6
7
- use bitcoincore_rpc:: bitcoin:: util:: address:: Payload ;
8
- use bitcoincore_rpc:: bitcoin:: Address ;
7
+ use bitcoincore_rpc_json:: bitcoin:: { address:: Payload , Address } ;
9
8
use chainhook_types:: {
10
9
BitcoinBlockData , BitcoinChainEvent , BitcoinTransactionData , BlockIdentifier , OrdinalOperation ,
11
10
StacksBaseChainOperation , TransactionIdentifier ,
@@ -18,8 +17,10 @@ use miniscript::Descriptor;
18
17
19
18
use reqwest:: { Client , Method } ;
20
19
use serde_json:: Value as JsonValue ;
21
- use std:: collections:: { BTreeMap , HashMap } ;
22
- use std:: str:: FromStr ;
20
+ use std:: {
21
+ collections:: { BTreeMap , HashMap } ,
22
+ str:: FromStr ,
23
+ } ;
23
24
24
25
use reqwest:: RequestBuilder ;
25
26
@@ -48,8 +49,44 @@ pub struct BitcoinChainhookOccurrencePayload {
48
49
pub chainhook : BitcoinChainhookPayload ,
49
50
}
50
51
52
+ impl BitcoinChainhookOccurrencePayload {
53
+ pub fn from_trigger < ' a > (
54
+ trigger : BitcoinTriggerChainhook < ' a > ,
55
+ ) -> BitcoinChainhookOccurrencePayload {
56
+ BitcoinChainhookOccurrencePayload {
57
+ apply : trigger
58
+ . apply
59
+ . into_iter ( )
60
+ . map ( |( transactions, block) | {
61
+ let mut block = block. clone ( ) ;
62
+ block. transactions = transactions
63
+ . into_iter ( )
64
+ . map ( |t| t. clone ( ) )
65
+ . collect :: < Vec < _ > > ( ) ;
66
+ BitcoinTransactionPayload { block }
67
+ } )
68
+ . collect :: < Vec < _ > > ( ) ,
69
+ rollback : trigger
70
+ . rollback
71
+ . into_iter ( )
72
+ . map ( |( transactions, block) | {
73
+ let mut block = block. clone ( ) ;
74
+ block. transactions = transactions
75
+ . into_iter ( )
76
+ . map ( |t| t. clone ( ) )
77
+ . collect :: < Vec < _ > > ( ) ;
78
+ BitcoinTransactionPayload { block }
79
+ } )
80
+ . collect :: < Vec < _ > > ( ) ,
81
+ chainhook : BitcoinChainhookPayload {
82
+ uuid : trigger. chainhook . uuid . clone ( ) ,
83
+ } ,
84
+ }
85
+ }
86
+ }
87
+
51
88
pub enum BitcoinChainhookOccurrence {
52
- Http ( RequestBuilder ) ,
89
+ Http ( RequestBuilder , BitcoinChainhookOccurrencePayload ) ,
53
90
File ( String , Vec < u8 > ) ,
54
91
Data ( BitcoinChainhookOccurrencePayload ) ,
55
92
}
@@ -155,12 +192,12 @@ pub fn evaluate_bitcoin_chainhooks_on_chain_event<'a>(
155
192
}
156
193
157
194
pub fn serialize_bitcoin_payload_to_json < ' a > (
158
- trigger : BitcoinTriggerChainhook < ' a > ,
195
+ trigger : & BitcoinTriggerChainhook < ' a > ,
159
196
proofs : & HashMap < & ' a TransactionIdentifier , String > ,
160
197
) -> JsonValue {
161
- let predicate_spec = & trigger. chainhook ;
198
+ let predicate_spec = trigger. chainhook ;
162
199
json ! ( {
163
- "apply" : trigger. apply. into_iter ( ) . map( |( transactions, block) | {
200
+ "apply" : trigger. apply. iter ( ) . map( |( transactions, block) | {
164
201
json!( {
165
202
"block_identifier" : block. block_identifier,
166
203
"parent_block_identifier" : block. parent_block_identifier,
@@ -169,7 +206,7 @@ pub fn serialize_bitcoin_payload_to_json<'a>(
169
206
"metadata" : block. metadata,
170
207
} )
171
208
} ) . collect:: <Vec <_>>( ) ,
172
- "rollback" : trigger. rollback. into_iter ( ) . map( |( transactions, block) | {
209
+ "rollback" : trigger. rollback. iter ( ) . map( |( transactions, block) | {
173
210
json!( {
174
211
"block_identifier" : block. block_identifier,
175
212
"parent_block_identifier" : block. parent_block_identifier,
@@ -251,54 +288,27 @@ pub fn handle_bitcoin_hook_action<'a>(
251
288
. map_err ( |e| format ! ( "unable to build http client: {}" , e. to_string( ) ) ) ?;
252
289
let host = format ! ( "{}" , http. url) ;
253
290
let method = Method :: POST ;
254
- let body = serde_json:: to_vec ( & serialize_bitcoin_payload_to_json ( trigger, proofs) )
291
+ let body = serde_json:: to_vec ( & serialize_bitcoin_payload_to_json ( & trigger, proofs) )
255
292
. map_err ( |e| format ! ( "unable to serialize payload {}" , e. to_string( ) ) ) ?;
256
- Ok ( BitcoinChainhookOccurrence :: Http (
257
- client
258
- . request ( method, & host)
259
- . header ( "Content-Type" , "application/json" )
260
- . header ( "Authorization" , http. authorization_header . clone ( ) )
261
- . body ( body) ,
262
- ) )
293
+ let request = client
294
+ . request ( method, & host)
295
+ . header ( "Content-Type" , "application/json" )
296
+ . header ( "Authorization" , http. authorization_header . clone ( ) )
297
+ . body ( body) ;
298
+
299
+ let data = BitcoinChainhookOccurrencePayload :: from_trigger ( trigger) ;
300
+ Ok ( BitcoinChainhookOccurrence :: Http ( request, data) )
263
301
}
264
302
HookAction :: FileAppend ( disk) => {
265
- let bytes = serde_json:: to_vec ( & serialize_bitcoin_payload_to_json ( trigger, proofs) )
303
+ let bytes = serde_json:: to_vec ( & serialize_bitcoin_payload_to_json ( & trigger, proofs) )
266
304
. map_err ( |e| format ! ( "unable to serialize payload {}" , e. to_string( ) ) ) ?;
267
305
Ok ( BitcoinChainhookOccurrence :: File (
268
306
disk. path . to_string ( ) ,
269
307
bytes,
270
308
) )
271
309
}
272
310
HookAction :: Noop => Ok ( BitcoinChainhookOccurrence :: Data (
273
- BitcoinChainhookOccurrencePayload {
274
- apply : trigger
275
- . apply
276
- . into_iter ( )
277
- . map ( |( transactions, block) | {
278
- let mut block = block. clone ( ) ;
279
- block. transactions = transactions
280
- . into_iter ( )
281
- . map ( |t| t. clone ( ) )
282
- . collect :: < Vec < _ > > ( ) ;
283
- BitcoinTransactionPayload { block }
284
- } )
285
- . collect :: < Vec < _ > > ( ) ,
286
- rollback : trigger
287
- . rollback
288
- . into_iter ( )
289
- . map ( |( transactions, block) | {
290
- let mut block = block. clone ( ) ;
291
- block. transactions = transactions
292
- . into_iter ( )
293
- . map ( |t| t. clone ( ) )
294
- . collect :: < Vec < _ > > ( ) ;
295
- BitcoinTransactionPayload { block }
296
- } )
297
- . collect :: < Vec < _ > > ( ) ,
298
- chainhook : BitcoinChainhookPayload {
299
- uuid : trigger. chainhook . uuid . clone ( ) ,
300
- } ,
301
- } ,
311
+ BitcoinChainhookOccurrencePayload :: from_trigger ( trigger) ,
302
312
) ) ,
303
313
}
304
314
}
@@ -387,7 +397,7 @@ impl BitcoinPredicateType {
387
397
encoded_address,
388
398
) ) ) => {
389
399
let address = match Address :: from_str ( encoded_address) {
390
- Ok ( address) => address,
400
+ Ok ( address) => address. assume_checked ( ) ,
391
401
Err ( _) => return false ,
392
402
} ;
393
403
let address_bytes = hex:: encode ( address. script_pubkey ( ) . as_bytes ( ) ) ;
@@ -405,13 +415,13 @@ impl BitcoinPredicateType {
405
415
encoded_address,
406
416
) ) ) => {
407
417
let address = match Address :: from_str ( encoded_address) {
408
- Ok ( address) => match address . payload {
409
- Payload :: WitnessProgram {
410
- version : _ ,
411
- program : _ ,
412
- } => address ,
413
- _ => return false ,
414
- } ,
418
+ Ok ( address) => {
419
+ let checked_address = address . assume_checked ( ) ;
420
+ match checked_address . payload ( ) {
421
+ Payload :: WitnessProgram ( _ ) => checked_address ,
422
+ _ => return false ,
423
+ }
424
+ }
415
425
Err ( _) => return false ,
416
426
} ;
417
427
let address_bytes = hex:: encode ( address. script_pubkey ( ) . as_bytes ( ) ) ;
0 commit comments