packages feed

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