subcoin_service/
transaction_adapter.rs1use bitcoin::Transaction;
2use sp_core::{Decode, Encode};
3use sp_runtime::traits::Block as BlockT;
4use subcoin_primitives::BitcoinTransactionAdapter;
5
6pub struct TransactionAdapter;
21
22impl<Block: BlockT> BitcoinTransactionAdapter<Block> for TransactionAdapter {
23 fn extrinsic_to_bitcoin_transaction(extrinsic: &Block::Extrinsic) -> Transaction {
24 let unchecked_extrinsic: subcoin_runtime::UncheckedExtrinsic =
25 Decode::decode(&mut extrinsic.encode().as_slice()).unwrap();
26
27 match unchecked_extrinsic.function {
28 subcoin_runtime::RuntimeCall::Bitcoin(pallet_bitcoin::Call::<
29 subcoin_runtime::Runtime,
30 >::transact {
31 btc_tx,
32 }) => btc_tx.into(),
33 _ => unreachable!("Transactions only exist in pallet-bitcoin; qed"),
34 }
35 }
36
37 fn bitcoin_transaction_into_extrinsic(btc_tx: bitcoin::Transaction) -> Block::Extrinsic {
38 Decode::decode(
39 &mut subcoin_runtime::UncheckedExtrinsic::new_bare(
40 pallet_bitcoin::Call::<subcoin_runtime::Runtime>::transact {
41 btc_tx: btc_tx.into(),
42 }
43 .into(),
44 )
45 .encode()
46 .as_slice(),
47 )
48 .expect("Extrinsic constructed internally must not fail; qed")
49 }
50}