bitcoin-payment-channel-1.2.0.0: src/PaymentChannel/Internal/Refund.hs
module PaymentChannel.Internal.Refund where
import PaymentChannel.Internal.Settlement.Types
import PaymentChannel.Internal.Payment.Create
import Bitcoin.Signature
import qualified Network.Haskoin.Transaction as HT
import qualified Network.Haskoin.Script as HS
import qualified Network.Haskoin.Crypto as HC
type RefundTx = BtcTx P2SH ChanParams RefundScriptSig
type UnsignedRefundTx = UnsignedBtcTx P2SH ChanParams
-- | Returns Nothing if there's not enough value available to cover paying the specified fee
-- without producing a dust output.
mkBaseRefundTx :: ChanParams -> FundingTxInfo -> UnsignedRefundTx
mkBaseRefundTx cp CFundingTxInfo{..} =
let
baseIn = setSignFlag (HS.SigAll False) $ mkNoSigTxIn
(HT.OutPoint ftiHash ftiOutIndex)
(nonDusty ftiOutValue)
cp
-- If the sequence field equals maxBound (0xffffffff),
-- lockTime features are disabled. so we subtract one
refundIn = setSequence (maxBound-1) baseIn
baseTx = mkBtcTx (refundIn :| []) []
in
setLockTime (cpLockTime cp) baseTx
mkRefundTx
:: Monad m
=> HC.PrvKeyC
-> ChanParams
-> FundingTxInfo
-> HC.Address -- ^Refund address
-> SatoshisPerByte -- ^Refund transaction fee
-> m (Either BtcError RefundTx) -- ^Refund Bitcoin transaction
mkRefundTx prvKey cp fti refundAddr txFee = return $
runSimple prvKey $ signChangeTx refundTx changeOut
where
refundTx = mkBaseRefundTx cp fti
changeOut = mkChangeOut refundAddr txFee KeepDust
-- signFunc _ = return prvKey