packages feed

lnd-client-0.1.0.1: src/LndClient/Data/SignMessage.hs

{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}

module LndClient.Data.SignMessage
  ( SignMessageRequest (..),
    SignMessageResponse (..),
    KeyLocator (..),
  )
where

import Data.ProtoLens.Message
import LndClient.Import
import qualified Proto.Signrpc.Signer as LnGRPC
import qualified Proto.Signrpc.Signer_Fields as LnGRPC
import qualified Proto.Lnrpc.Ln0 as L
import qualified Proto.Lnrpc.Ln0_Fields as L

data SignMessageRequest = SignMessageRequest
  { message :: ByteString,
    keyLoc :: KeyLocator,
    doubleHash :: Bool,
    compactSig :: Bool
  }
  deriving stock (Eq, Show, Generic)

instance Out SignMessageRequest

newtype SignMessageResponse = SignMessageResponse ByteString
  deriving newtype (Eq, Show)
  deriving stock (Generic)

instance Out SignMessageResponse

instance ToGrpc SignMessageRequest LnGRPC.SignMessageReq where
  toGrpc x =
    msg
      <$> toGrpc (message x)
      <*> toGrpc (keyLoc x)
      <*> toGrpc (doubleHash x)
      <*> toGrpc (compactSig x)
    where
      msg gMsg gKeyLoc gDoubleHash gCompactSig =
        defMessage
          & LnGRPC.msg .~ gMsg
          & LnGRPC.keyLoc .~ gKeyLoc
          & LnGRPC.doubleHash .~ gDoubleHash
          & LnGRPC.compactSig .~ gCompactSig

instance FromGrpc SignMessageResponse LnGRPC.SignMessageResp where
  fromGrpc x = SignMessageResponse <$> fromGrpc (x ^. LnGRPC.signature)

data KeyLocator = KeyLocator
  { keyFamily :: Int32,
    keyIndex :: Int32
  }
  deriving stock (Eq, Show, Ord, Generic)

instance Out KeyLocator

instance ToGrpc KeyLocator LnGRPC.KeyLocator where
  toGrpc x =
    msg
      <$> toGrpc (keyFamily x)
      <*> toGrpc (keyIndex x)
    where
      msg gKeyFamily gKeyIndex =
        defMessage
          & LnGRPC.keyFamily .~ gKeyFamily
          & LnGRPC.keyIndex .~ gKeyIndex

instance ToGrpc KeyLocator L.KeyLocator where
  toGrpc x = pure $ msg (keyFamily x) (keyIndex x)
    where
      msg f i = defMessage & L.keyFamily .~ f & L.keyIndex .~ i