Skip to content

Commit 9315a82

Browse files
authored
Merge pull request #50 from mlabs-haskell/gergely/raw-bytestring-tokennames
Decoding raw ByteString TokenNames
2 parents ec22060 + 9958c8a commit 9315a82

File tree

2 files changed

+23
-13
lines changed

2 files changed

+23
-13
lines changed

src/BotPlutusInterface/UtxoParser.hs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ module BotPlutusInterface.UtxoParser (
33
feeParser,
44
utxoParser,
55
utxoMapParser,
6+
tokenNameParser,
67
) where
78

8-
import Control.Applicative (many)
9+
import Control.Applicative (many, optional)
910
import Control.Monad (mzero, void)
1011
import Data.Aeson.Extras (tryDecode)
12+
import Data.Attoparsec.ByteString.Char8 (isSpace)
1113
import Data.Attoparsec.Text (
1214
Parser,
1315
char,
@@ -21,12 +23,11 @@ import Data.Attoparsec.Text (
2123
signed,
2224
skipSpace,
2325
skipWhile,
26+
string,
2427
takeWhile,
2528
(<?>),
2629
)
27-
import Data.Hex (unhex)
2830
import Data.Text (Text)
29-
import Data.Text.Encoding (decodeUtf8, encodeUtf8)
3031
import Ledger (Address (addressCredential))
3132
import Ledger.Ada qualified as Ada
3233
import Ledger.Scripts (DatumHash (..))
@@ -35,12 +36,13 @@ import Ledger.Tx (
3536
TxOutRef (..),
3637
)
3738
import Ledger.TxId (TxId (..))
38-
import Ledger.Value (AssetClass, TokenName, Value)
39+
import Ledger.Value (AssetClass, Value)
3940
import Ledger.Value qualified as Value
4041
import Plutus.V1.Ledger.Api (
4142
BuiltinByteString,
4243
Credential (PubKeyCredential, ScriptCredential),
4344
CurrencySymbol (..),
45+
TokenName (..),
4446
)
4547
import PlutusTx.Builtins (toBuiltin)
4648
import Prelude hiding (takeWhile)
@@ -106,7 +108,8 @@ tokenNameParser = do
106108
where
107109
tokenName = do
108110
void $ char '.'
109-
Value.tokenName . encodeUtf8 <$> decodeHex (takeWhile (/= ' '))
111+
void $ optional $ string "0x"
112+
TokenName <$> decodeHash (takeWhile (not . isSpace))
110113

111114
datumHashNoneParser :: Parser ()
112115
datumHashNoneParser = "TxOutDatumNone" >> pure ()
@@ -123,10 +126,6 @@ decodeHash :: Parser Text -> Parser BuiltinByteString
123126
decodeHash rawParser =
124127
rawParser >>= \parsed -> either (const mzero) (pure . toBuiltin) (tryDecode parsed)
125128

126-
decodeHex :: Parser Text -> Parser Text
127-
decodeHex rawParser =
128-
rawParser >>= \parsed -> either (const mzero) (pure . decodeUtf8) ((unhex . encodeUtf8) parsed)
129-
130129
feeParser :: Parser Integer
131130
feeParser =
132131
choice [prefixed, suffixed]

test/Spec/BotPlutusInterface/UtxoParser.hs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ module Spec.BotPlutusInterface.UtxoParser (tests) where
66

77
import BotPlutusInterface.UtxoParser qualified as UtxoParser
88
import Data.Attoparsec.Text (parseOnly)
9+
import Data.ByteString qualified as ByteString
910
import Data.Text (Text)
1011
import Ledger qualified
1112
import Ledger.Ada qualified as Ada
@@ -14,8 +15,10 @@ import Ledger.Tx (
1415
ChainIndexTxOut (PublicKeyChainIndexTxOut, ScriptChainIndexTxOut),
1516
TxOutRef (TxOutRef),
1617
)
18+
import Ledger.Value (TokenName (TokenName))
1719
import Ledger.Value qualified as Value
1820
import NeatInterpolation (text)
21+
import PlutusTx.Builtins (toBuiltin)
1922
import Test.Tasty (TestTree, testGroup)
2023
import Test.Tasty.HUnit (Assertion, testCase, (@?=))
2124
import Prelude
@@ -91,20 +94,28 @@ multiAdaOnly = do
9194
singleWithNativeTokens :: Assertion
9295
singleWithNativeTokens = do
9396
let addr = pubKeyHashAddress "0000"
97+
token =
98+
Value.assetClass "057910a2c93551443cb2c0544d1d65da3fb033deaa79452bd431ee08" "testToken"
99+
tokenWithRawByteString =
100+
Value.assetClass
101+
"7c6de14062b27c3dc3ba9f232ade32efe22fb8e2ae76b24f33212fdb"
102+
(TokenName (toBuiltin (ByteString.pack [1, 35, 69, 103, 137, 171, 205, 239])))
103+
tokenWithEmptyName =
104+
Value.assetClass "98a759ed2e20f6d83aa4d37d028d4bbb547a696fc345d54126188614" ""
94105
testUtxoParser
95106
addr
96107
[text| TxHash TxIx Amount
97108
--------------------------------------------------------------------------------------
98-
384de3f29396fdf687551e3f9e05bd400adcd277720c71f1d2b61f17f5183e51 0 1234 lovelace + 2345 057910a2c93551443cb2c0544d1d65da3fb033deaa79452bd431ee08.74657374546f6b656e + 3456 7c6de14062b27c3dc3ba9f232ade32efe22fb8e2ae76b24f33212fdb.74657374546f6b656e32 + 4567 98a759ed2e20f6d83aa4d37d028d4bbb547a696fc345d54126188614 + TxOutDatumNone
109+
384de3f29396fdf687551e3f9e05bd400adcd277720c71f1d2b61f17f5183e51 0 1234 lovelace + 2345 057910a2c93551443cb2c0544d1d65da3fb033deaa79452bd431ee08.74657374546f6b656e + 3456 7c6de14062b27c3dc3ba9f232ade32efe22fb8e2ae76b24f33212fdb.0x0123456789abcdef + 4567 98a759ed2e20f6d83aa4d37d028d4bbb547a696fc345d54126188614 + TxOutDatumNone
99110
|]
100111
[
101112
( TxOutRef "384de3f29396fdf687551e3f9e05bd400adcd277720c71f1d2b61f17f5183e51" 0
102113
, PublicKeyChainIndexTxOut
103114
addr
104115
( Ada.lovelaceValueOf 1234
105-
<> Value.singleton "057910a2c93551443cb2c0544d1d65da3fb033deaa79452bd431ee08" "testToken" 2345
106-
<> Value.singleton "7c6de14062b27c3dc3ba9f232ade32efe22fb8e2ae76b24f33212fdb" "testToken2" 3456
107-
<> Value.singleton "98a759ed2e20f6d83aa4d37d028d4bbb547a696fc345d54126188614" "" 4567
116+
<> Value.assetClassValue token 2345
117+
<> Value.assetClassValue tokenWithRawByteString 3456
118+
<> Value.assetClassValue tokenWithEmptyName 4567
108119
)
109120
)
110121
]

0 commit comments

Comments
 (0)