lnd-client-0.1.0.1: src/LndClient/Data/OpenChannel.hs
{-# LANGUAGE FlexibleContexts #-}
module LndClient.Data.OpenChannel
( OpenChannelRequest (..),
OpenStatusUpdate (..),
OpenStatusUpdate' (..),
ReadyForPsbtFunding (..),
ChannelOpenUpdate (..)
)
where
import Data.ProtoLens.Message
import LndClient.Data.Channel
import LndClient.Data.ChannelPoint
import LndClient.Import
import qualified Proto.Lightning as LnGRPC
import qualified Proto.Lightning_Fields as LnGRPC
import LndClient.Data.PsbtShim
data OpenChannelRequest = OpenChannelRequest
{ nodePubkey :: NodePubKey,
localFundingAmount :: MSat,
pushMSat :: Maybe MSat,
targetConf :: Maybe Int32,
mSatPerByte :: Maybe MSat,
private :: Maybe Bool,
minHtlcMsat :: Maybe MSat,
remoteCsvDelay :: Maybe Word32,
minConfs :: Maybe Int32,
spendUnconfirmed :: Maybe Bool,
closeAddress :: Maybe Text,
fundingShim :: Maybe PsbtShim
}
deriving stock (Eq, Show, Generic)
instance Out OpenChannelRequest
data OpenStatusUpdate = OpenStatusUpdate
{ pendingChanId :: ByteString,
update :: Maybe OpenStatusUpdate'
}
deriving stock (Eq, Show, Generic)
instance Out OpenStatusUpdate
data OpenStatusUpdate'
= OpenStatusUpdateChanPending (PendingUpdate 'Funding)
| OpenStatusUpdateChanOpen ChannelOpenUpdate
| OpenStatusUpdatePsbtFund ReadyForPsbtFunding
deriving stock (Eq, Show, Generic)
instance Out OpenStatusUpdate'
newtype ChannelOpenUpdate = ChannelOpenUpdate ChannelPoint
deriving newtype (Eq, Show)
deriving stock (Generic)
instance Out ChannelOpenUpdate
data ReadyForPsbtFunding = ReadyForPsbtFunding
{ fundingAddress :: Text,
fundingAmount :: MSat,
psbt :: Psbt
}
deriving stock (Eq, Show, Generic)
instance Out ReadyForPsbtFunding
instance FromGrpc OpenStatusUpdate LnGRPC.OpenStatusUpdate where
fromGrpc x =
OpenStatusUpdate
<$> fromGrpc (x ^. LnGRPC.pendingChanId)
<*> case x ^. LnGRPC.maybe'update of
Just upd -> Just <$> fromGrpc upd
Nothing -> Right Nothing
instance FromGrpc OpenStatusUpdate' LnGRPC.OpenStatusUpdate'Update where
fromGrpc x =
case x of
LnGRPC.OpenStatusUpdate'ChanPending pu -> OpenStatusUpdateChanPending <$> fromGrpc pu
LnGRPC.OpenStatusUpdate'ChanOpen cou -> OpenStatusUpdateChanOpen <$> fromGrpc cou
LnGRPC.OpenStatusUpdate'PsbtFund pf -> OpenStatusUpdatePsbtFund <$> fromGrpc pf
instance FromGrpc ChannelOpenUpdate LnGRPC.ChannelOpenUpdate where
fromGrpc x = ChannelOpenUpdate <$> fromGrpc (x ^. LnGRPC.channelPoint)
instance FromGrpc ReadyForPsbtFunding LnGRPC.ReadyForPsbtFunding where
fromGrpc x =
ReadyForPsbtFunding
<$> fromGrpc (x ^. LnGRPC.fundingAddress)
<*> fromGrpcSat (x ^. LnGRPC.fundingAmount)
<*> fromGrpc (x ^. LnGRPC.psbt)
instance ToGrpc OpenChannelRequest LnGRPC.OpenChannelRequest where
toGrpc x =
msg
<$> toGrpc (nodePubkey x)
<*> toGrpcSat (localFundingAmount x)
<*> maybe (Right fieldDefault) toGrpcSat (pushMSat x)
<*> toGrpc (targetConf x)
<*> maybe (Right fieldDefault) toGrpcSat (mSatPerByte x)
<*> toGrpc (private x)
<*> maybe (Right fieldDefault) toGrpcMSat (minHtlcMsat x)
<*> toGrpc (remoteCsvDelay x)
<*> toGrpc (minConfs x)
<*> toGrpc (spendUnconfirmed x)
<*> toGrpc (closeAddress x)
<*> toGrpcMaybe (fundingShim x)
where
msg gNodePubKey gLocalFindingAmount gPushSat gTargetConf gSatPerByte gPrivate gMinHtlcMsat gRemoteCsvDelay gMinConfs gSpendUnconfirmed gCloseAddress gFundingShim=
defMessage
& LnGRPC.nodePubkey .~ gNodePubKey
& LnGRPC.localFundingAmount .~ gLocalFindingAmount
& LnGRPC.pushSat .~ gPushSat
& LnGRPC.targetConf .~ gTargetConf
& LnGRPC.satPerByte .~ gSatPerByte
& LnGRPC.private .~ gPrivate
& LnGRPC.minHtlcMsat .~ gMinHtlcMsat
& LnGRPC.remoteCsvDelay .~ gRemoteCsvDelay
& LnGRPC.minConfs .~ gMinConfs
& LnGRPC.spendUnconfirmed .~ gSpendUnconfirmed
& LnGRPC.closeAddress .~ gCloseAddress
& LnGRPC.maybe'fundingShim .~ gFundingShim