module Bitcoin.Conversion ( module Bitcoin.Conversion , module Bitcoin.Types , module Bitcoin.SpendCond.Cond ) where import Bitcoin.SpendCond.Cond import Bitcoin.Types import qualified Data.List.NonEmpty as NE import qualified Data.ByteString as B import qualified Data.Serialize as Bin import qualified Network.Haskoin.Transaction as HT import qualified Network.Haskoin.Crypto as HC toTxOut :: ScriptPubKey outType => OutputG outType -> HT.TxOut toTxOut MkOutputG{..} = HT.TxOut (fromIntegral . toInteger $ btcOutAmount) (Bin.encode $ asScript $ scriptPubKey btcOutType) toInRaw :: B.ByteString -> InputG inType sigData -> HT.TxIn toInRaw inpScr MkInputG{..} = HT.TxIn btcPrevOut inpScr btcSequence toUnsigTxIn :: InputG inType sigData -> HT.TxIn toUnsigTxIn = toInRaw B.empty toSigTxIn :: SignatureScript t sigData => InputG t sigData -> HT.TxIn toSigTxIn btcIn@MkInputG{..} = toInRaw (Bin.encode $ asScript $ inputScript btcSigData btcInType) btcIn toTxOut' :: BtcOut -> HT.TxOut toTxOut' (BtcOut adr val) = toTxOutRaw (adr, nonDusty val) toTxOutRaw :: (HC.Address, BtcAmount) -> HT.TxOut toTxOutRaw (adr, val) = HT.TxOut (fromIntegral . toInteger $ val) (addressToScriptPubKeyBS adr) toChangeTxOut :: BtcAmount -> ChangeOut -> HT.TxOut toChangeTxOut val ChangeOut{..} = toTxOutRaw (btcChangeAddr, val) getAllOuts :: BtcTx r a -> [HT.TxOut] getAllOuts BtcTx{..} = map toTxOut' finalOuts ++ maybe [] mkChgOut btcChgOut where -- | Remove zero-value outputs finalOuts = filter ((/= nullAmount) . btcAmount) btcOuts inVal = sum . NE.toList $ NE.map btcInValue btcIns outVal = sum $ map (nonDusty . btcAmount) btcOuts mkChgOut co = [ toChangeTxOut (inVal - outVal - btcAbsFee_ co) co ] toUnsignedTx :: BtcTx r a -> HT.Tx toUnsignedTx tx@BtcTx{..} = toTxWithIns (NE.map toUnsigTxIn btcIns) tx toTxWithIns :: NE.NonEmpty HT.TxIn -> BtcTx r a -> HT.Tx toTxWithIns binL tx@BtcTx{..} = HT.createTx btcVer (NE.toList binL) (getAllOuts tx) (maybe 0 toWord32 btcLock) toHaskoinTx :: SignatureScript t ss => BtcTx t ss -> HT.Tx toHaskoinTx tx@BtcTx{..} = toTxWithIns (NE.map toSigTxIn btcIns) tx