@@ -19,6 +19,7 @@ use clarity_repl::clarity::util::hash::{hex_bytes, to_hex, Hash160};
1919use clarity_repl:: clarity:: vm:: types:: { CharType , SequenceData , Value as ClarityValue } ;
2020use reqwest:: { Client , Method } ;
2121use serde:: Serialize ;
22+ use serde_json:: Value as JsonValue ;
2223use std:: collections:: HashMap ;
2324use std:: io:: Cursor ;
2425use std:: iter:: Map ;
@@ -415,6 +416,7 @@ pub struct BitcoinChainhookOccurrencePayload {
415416
416417pub enum BitcoinChainhookOccurrence {
417418 Http ( RequestBuilder ) ,
419+ File ( String , Vec < u8 > ) ,
418420 Data ( BitcoinChainhookOccurrencePayload ) ,
419421}
420422
@@ -447,9 +449,37 @@ pub struct StacksChainhookOccurrencePayload {
447449}
448450pub enum StacksChainhookOccurrence {
449451 Http ( RequestBuilder ) ,
452+ File ( String , Vec < u8 > ) ,
450453 Data ( StacksChainhookOccurrencePayload ) ,
451454}
452455
456+ pub fn serialize_bitcoin_payload_to_json < ' a > (
457+ trigger : BitcoinTriggerChainhook < ' a > ,
458+ proofs : & HashMap < & ' a TransactionIdentifier , String > ,
459+ ) -> JsonValue {
460+ json ! ( {
461+ "apply" : trigger. apply. into_iter( ) . map( |( transaction, block_identifier) | {
462+ json!( {
463+ "transaction" : transaction,
464+ "block_identifier" : block_identifier,
465+ "confirmations" : 1 , // TODO(lgalabru)
466+ "proof" : proofs. get( & transaction. transaction_identifier) ,
467+ } )
468+ } ) . collect:: <Vec <_>>( ) ,
469+ "rollback" : trigger. rollback. into_iter( ) . map( |( transaction, block_identifier) | {
470+ json!( {
471+ "transaction" : transaction,
472+ "block_identifier" : block_identifier,
473+ "confirmations" : 1 , // TODO(lgalabru)
474+ } )
475+ } ) . collect:: <Vec <_>>( ) ,
476+ "chainhook" : {
477+ "uuid" : trigger. chainhook. uuid,
478+ "predicate" : trigger. chainhook. predicate,
479+ }
480+ } )
481+ }
482+
453483pub fn handle_bitcoin_hook_action < ' a > (
454484 trigger : BitcoinTriggerChainhook < ' a > ,
455485 proofs : & HashMap < & ' a TransactionIdentifier , String > ,
@@ -459,28 +489,8 @@ pub fn handle_bitcoin_hook_action<'a>(
459489 let client = Client :: builder ( ) . build ( ) . unwrap ( ) ;
460490 let host = format ! ( "{}" , http. url) ;
461491 let method = Method :: from_bytes ( http. method . as_bytes ( ) ) . unwrap ( ) ;
462- let payload = json ! ( {
463- "apply" : trigger. apply. into_iter( ) . map( |( transaction, block_identifier) | {
464- json!( {
465- "transaction" : transaction,
466- "block_identifier" : block_identifier,
467- "confirmations" : 1 , // TODO(lgalabru)
468- "proof" : proofs. get( & transaction. transaction_identifier) ,
469- } )
470- } ) . collect:: <Vec <_>>( ) ,
471- "rollback" : trigger. rollback. into_iter( ) . map( |( transaction, block_identifier) | {
472- json!( {
473- "transaction" : transaction,
474- "block_identifier" : block_identifier,
475- "confirmations" : 1 , // TODO(lgalabru)
476- } )
477- } ) . collect:: <Vec <_>>( ) ,
478- "chainhook" : {
479- "uuid" : trigger. chainhook. uuid,
480- "predicate" : trigger. chainhook. predicate,
481- }
482- } ) ;
483- let body = serde_json:: to_vec ( & payload) . unwrap ( ) ;
492+ let body =
493+ serde_json:: to_vec ( & serialize_bitcoin_payload_to_json ( trigger, proofs) ) . unwrap ( ) ;
484494 Some ( BitcoinChainhookOccurrence :: Http (
485495 client
486496 . request ( method, & host)
@@ -489,6 +499,14 @@ pub fn handle_bitcoin_hook_action<'a>(
489499 . body ( body) ,
490500 ) )
491501 }
502+ HookAction :: File ( disk) => {
503+ let bytes =
504+ serde_json:: to_vec ( & serialize_bitcoin_payload_to_json ( trigger, proofs) ) . unwrap ( ) ;
505+ Some ( BitcoinChainhookOccurrence :: File (
506+ disk. path . to_string ( ) ,
507+ bytes,
508+ ) )
509+ }
492510 HookAction :: Noop => Some ( BitcoinChainhookOccurrence :: Data (
493511 BitcoinChainhookOccurrencePayload {
494512 apply : trigger
@@ -757,49 +775,64 @@ pub fn serialize_to_json(value: &ClarityValue) -> serde_json::Value {
757775 }
758776}
759777
778+ pub fn serialize_stacks_payload_to_json < ' a > (
779+ trigger : StacksTriggerChainhook < ' a > ,
780+ proofs : & HashMap < & ' a TransactionIdentifier , String > ,
781+ ) -> JsonValue {
782+ let decode_clarity_values = trigger. should_decode_clarity_value ( ) ;
783+ json ! ( {
784+ "apply" : trigger. apply. into_iter( ) . map( |( transaction, block_identifier) | {
785+ json!( {
786+ "transaction" : if decode_clarity_values {
787+ encode_transaction_including_with_clarity_decoding( transaction)
788+ } else {
789+ json!( transaction)
790+ } ,
791+ "block_identifier" : block_identifier,
792+ "confirmations" : 1 , // TODO(lgalabru)
793+ "proof" : proofs. get( & transaction. transaction_identifier) ,
794+ } )
795+ } ) . collect:: <Vec <_>>( ) ,
796+ "rollback" : trigger. rollback. into_iter( ) . map( |( transaction, block_identifier) | {
797+ json!( {
798+ "transaction" : transaction,
799+ "block_identifier" : block_identifier,
800+ "confirmations" : 1 , // TODO(lgalabru)
801+ } )
802+ } ) . collect:: <Vec <_>>( ) ,
803+ "chainhook" : {
804+ "uuid" : trigger. chainhook. uuid,
805+ "predicate" : trigger. chainhook. predicate,
806+ }
807+ } )
808+ }
809+
760810pub fn handle_stacks_hook_action < ' a > (
761811 trigger : StacksTriggerChainhook < ' a > ,
762812 proofs : & HashMap < & ' a TransactionIdentifier , String > ,
763813) -> Option < StacksChainhookOccurrence > {
764- let decode_clarity_values = trigger. should_decode_clarity_value ( ) ;
765814 match & trigger. chainhook . action {
766815 HookAction :: Http ( http) => {
767816 let client = Client :: builder ( ) . build ( ) . unwrap ( ) ;
768817 let host = format ! ( "{}" , http. url) ;
769818 let method = Method :: from_bytes ( http. method . as_bytes ( ) ) . unwrap ( ) ;
770- let payload = json ! ( {
771- "apply" : trigger. apply. into_iter( ) . map( |( transaction, block_identifier) | {
772- json!( {
773- "transaction" : if decode_clarity_values {
774- encode_transaction_including_with_clarity_decoding( transaction)
775- } else {
776- json!( transaction)
777- } ,
778- "block_identifier" : block_identifier,
779- "confirmations" : 1 , // TODO(lgalabru)
780- "proof" : proofs. get( & transaction. transaction_identifier) ,
781- } )
782- } ) . collect:: <Vec <_>>( ) ,
783- "rollback" : trigger. rollback. into_iter( ) . map( |( transaction, block_identifier) | {
784- json!( {
785- "transaction" : transaction,
786- "block_identifier" : block_identifier,
787- "confirmations" : 1 , // TODO(lgalabru)
788- } )
789- } ) . collect:: <Vec <_>>( ) ,
790- "chainhook" : {
791- "uuid" : trigger. chainhook. uuid,
792- "predicate" : trigger. chainhook. predicate,
793- }
794- } ) ;
795- let body = serde_json:: to_vec ( & payload) . unwrap ( ) ;
819+ let body =
820+ serde_json:: to_vec ( & serialize_stacks_payload_to_json ( trigger, proofs) ) . unwrap ( ) ;
796821 Some ( StacksChainhookOccurrence :: Http (
797822 client
798823 . request ( method, & host)
799824 . header ( "Content-Type" , "application/json" )
800825 . body ( body) ,
801826 ) )
802827 }
828+ HookAction :: File ( disk) => {
829+ let bytes =
830+ serde_json:: to_vec ( & serialize_stacks_payload_to_json ( trigger, proofs) ) . unwrap ( ) ;
831+ Some ( StacksChainhookOccurrence :: File (
832+ disk. path . to_string ( ) ,
833+ bytes,
834+ ) )
835+ }
803836 HookAction :: Noop => Some ( StacksChainhookOccurrence :: Data (
804837 StacksChainhookOccurrencePayload {
805838 apply : trigger
0 commit comments