stellar-veritas/bundled/Network/Stellar/Asset.hs
2026-01-25 02:27:22 +01:00

43 lines
1.5 KiB
Haskell

module Network.Stellar.Asset
( Asset(..)
, toXdrAsset
, toXdrAsset'
)
where
import Control.Monad ((<=<))
import qualified Data.Text as T
import Data.Text.Encoding (encodeUtf8)
import Network.ONCRPC.XDR
import Network.Stellar.Keypair
import qualified Network.Stellar.TransactionXdr as X
data Asset = AssetNative
| AssetAlphaNum4 { assetCode :: T.Text, assetIssuer :: T.Text }
| AssetAlphaNum12 { assetCode :: T.Text, assetIssuer :: T.Text }
toXdrAsset :: Asset -> Maybe X.Asset
toXdrAsset AssetNative = Just X.Asset'ASSET_TYPE_NATIVE
toXdrAsset (AssetAlphaNum4 code issuer) =
X.Asset'ASSET_TYPE_CREDIT_ALPHANUM4
<$> (X.AlphaNum4 <$> lengthArray (encodeUtf8 code) <*> toXdrAccount issuer)
toXdrAsset (AssetAlphaNum12 code issuer) =
X.Asset'ASSET_TYPE_CREDIT_ALPHANUM12
<$> (X.AlphaNum12 <$> lengthArray (encodeUtf8 code) <*> toXdrAccount issuer)
toXdrAsset' :: Asset -> X.Asset
toXdrAsset' AssetNative = X.Asset'ASSET_TYPE_NATIVE
toXdrAsset' (AssetAlphaNum4 code issuer) =
X.Asset'ASSET_TYPE_CREDIT_ALPHANUM4 $
X.AlphaNum4 (lengthArray' $ encodeUtf8 code) (toXdrAccount' issuer)
toXdrAsset' (AssetAlphaNum12 code issuer) =
X.Asset'ASSET_TYPE_CREDIT_ALPHANUM12 $
X.AlphaNum12 (lengthArray' $ encodeUtf8 code) (toXdrAccount' issuer)
toXdrAccount :: T.Text -> Maybe X.AccountID
toXdrAccount =
fmap X.PublicKey'PUBLIC_KEY_TYPE_ED25519 . lengthArray <=< decodePublic
toXdrAccount' :: T.Text -> X.AccountID
toXdrAccount' =
X.PublicKey'PUBLIC_KEY_TYPE_ED25519 . lengthArray' . decodePublic'