stellar-veritas/bundled/Stellar/Simple.hs

73 lines
2.2 KiB
Haskell
Raw Permalink Normal View History

2026-01-25 02:27:22 +01:00
{-# LANGUAGE BlockArguments #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE NamedFieldPuns #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE TypeOperators #-}
module Stellar.Simple where
-- prelude
import Prelude hiding (id)
import Prelude qualified
-- global
import Control.Exception (SomeException (SomeException), catchJust, throwIO)
import Crypto.Sign.Ed25519 qualified as Ed25519
import Data.ByteString.Base64 qualified as Base64
import Data.Foldable (toList)
import Data.Int (Int32, Int64)
import Data.Map.Strict (Map)
import Data.Map.Strict qualified as Map
import Data.Maybe (fromMaybe)
import Data.Monoid (Endo (Endo), appEndo)
import Data.Ratio (Ratio, denominator, numerator)
import Data.Sequence (Seq, (|>))
import Data.Text (Text)
import Data.Text qualified as Text
import Data.Text.Encoding (encodeUtf8, decodeUtf8', encodeUtf8)
import Data.Typeable (cast)
import Data.Word (Word32, Word8)
import GHC.Stack (HasCallStack)
import Text.Read (readEither, readMaybe)
-- stellar-sdk
import Network.ONCRPC.XDR (XDR, xdrSerialize)
import Network.ONCRPC.XDR qualified as XDR
import Network.Stellar.Keypair qualified as StellarKey
import Network.Stellar.Network (Network, publicNetwork)
import Network.Stellar.Signature qualified as StellarSignature
import Network.Stellar.TransactionXdr (Uint256)
import Network.Stellar.TransactionXdr qualified as XDR
-- component
import Stellar.Simple.Types (Asset (..), DecoratedSignature (..), Memo (..))
identity :: a -> a
identity = Prelude.id
-- | Make asset from the canonical pair of code and issuer
mkAsset :: Text -> Text -> Asset
mkAsset code issuer = Asset{code, issuer = Just issuer}
data Guess a = Already a | Guess
deriving (Show)
signWithSecret ::
HasCallStack =>
-- | "S..." textual secret key
Text ->
XDR.TransactionEnvelope ->
XDR.TransactionEnvelope
signWithSecret secret tx =
either (error . show) identity $
StellarSignature.signTx publicNetwork tx [StellarKey.fromPrivateKey' secret]
xdrSerializeBase64T :: XDR a => a -> Text
xdrSerializeBase64T = decodeUtf8Throw . Base64.encode . xdrSerialize
decodeUtf8Throw = either (error . show) identity . decodeUtf8'