packages feed

bitcoin-payment-channel-1.2.0.0: src/Bitcoin/Fee.hs

{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Bitcoin.Fee where

-- import Bitcoin.Types
import Bitcoin.Amount
import PaymentChannel.Internal.Util
import qualified Data.Serialize     as Bin
import qualified Data.Aeson.Types   as JSON

-- |Objects from which a Bitcoin fee can be calculated,
--   given a transaction
class HasFee a where
    absoluteFee :: BtcAmount -> TxByteSize -> a -> BtcAmount

-- |Constant fee
instance HasFee BtcAmount where
    absoluteFee _ _ = id    -- Same as constant fee

newtype Constant = Constant BtcAmount
    deriving (Eq, Generic, NFData)
instance HasFee Constant where
    absoluteFee _ _ (Constant amt) = amt

type TxByteSize = Word
-- |Specify a fee as satoshis per byte
newtype SatoshisPerByte = SatoshisPerByte BtcAmount -- ^Fee in satoshis per byte
    deriving (Eq, Show, Ord, Num, Enum, Real, Integral, Bin.Serialize, JSON.ToJSON, JSON.FromJSON, NFData)
instance HasFee SatoshisPerByte where
    absoluteFee _ txByteSize (SatoshisPerByte satoshisPerByte) =
        fromIntegral txByteSize * satoshisPerByte

{-
mkRelativeFeeTx
    :: HasFee fee
    => fee                          -- ^Desired (per-byte) transaction fee
    -> (BtcAmount -> HT.Tx)     -- ^Produces desired Bitcoin tx with given fee
    -> HT.Tx
mkRelativeFeeTx fee mkTxFunc =
    mkTxSizeFee pass2Tx
    where
        pass2Tx = mkTxSizeFee pass1Tx
        pass1Tx = mkTxFunc (0 :: BtcAmount)
        mkTxSizeFee tx = mkTxFunc $ absoluteFee (calcTxSize tx) fee
-}