From f7d79d43df7b2abae440e65fdf6bfe04c8b8e689 Mon Sep 17 00:00:00 2001 From: t4ccer Date: Mon, 14 Feb 2022 21:39:01 +0000 Subject: [PATCH 1/5] Fix token name parsing --- src/BotPlutusInterface/UtxoParser.hs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/BotPlutusInterface/UtxoParser.hs b/src/BotPlutusInterface/UtxoParser.hs index aaab2c0a..35a9ccc0 100644 --- a/src/BotPlutusInterface/UtxoParser.hs +++ b/src/BotPlutusInterface/UtxoParser.hs @@ -3,9 +3,10 @@ module BotPlutusInterface.UtxoParser ( feeParser, utxoParser, utxoMapParser, + tokenNameParser, ) where -import Control.Applicative (many) +import Control.Applicative (many, (<|>)) import Control.Monad (mzero, void) import Data.Aeson.Extras (tryDecode) import Data.Attoparsec.Text ( @@ -22,11 +23,10 @@ import Data.Attoparsec.Text ( skipSpace, skipWhile, takeWhile, + string, (), ) -import Data.Hex (unhex) import Data.Text (Text) -import Data.Text.Encoding (decodeUtf8, encodeUtf8) import Ledger (Address (addressCredential)) import Ledger.Ada qualified as Ada import Ledger.Scripts (DatumHash (..)) @@ -35,12 +35,13 @@ import Ledger.Tx ( TxOutRef (..), ) import Ledger.TxId (TxId (..)) -import Ledger.Value (AssetClass, TokenName, Value) +import Ledger.Value (AssetClass, Value) import Ledger.Value qualified as Value import Plutus.V1.Ledger.Api ( BuiltinByteString, Credential (PubKeyCredential, ScriptCredential), CurrencySymbol (..), + TokenName(..), ) import PlutusTx.Builtins (toBuiltin) import Prelude hiding (takeWhile) @@ -106,7 +107,8 @@ tokenNameParser = do where tokenName = do void $ char '.' - Value.tokenName . encodeUtf8 <$> decodeHex (takeWhile (/= ' ')) + void $ (string "0x" <|> string "") + TokenName <$> decodeHash (takeWhile (not . inClass " ")) datumHashNoneParser :: Parser () datumHashNoneParser = "TxOutDatumNone" >> pure () @@ -123,10 +125,6 @@ decodeHash :: Parser Text -> Parser BuiltinByteString decodeHash rawParser = rawParser >>= \parsed -> either (const mzero) (pure . toBuiltin) (tryDecode parsed) -decodeHex :: Parser Text -> Parser Text -decodeHex rawParser = - rawParser >>= \parsed -> either (const mzero) (pure . decodeUtf8) ((unhex . encodeUtf8) parsed) - feeParser :: Parser Integer feeParser = choice [prefixed, suffixed] From 4046d1f508c11e366e1fcea11ad98c096dc46124 Mon Sep 17 00:00:00 2001 From: gege251 Date: Tue, 15 Feb 2022 17:51:16 +0100 Subject: [PATCH 2/5] Add tests --- test/Spec/BotPlutusInterface/UtxoParser.hs | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/test/Spec/BotPlutusInterface/UtxoParser.hs b/test/Spec/BotPlutusInterface/UtxoParser.hs index e23270d3..9a255d30 100644 --- a/test/Spec/BotPlutusInterface/UtxoParser.hs +++ b/test/Spec/BotPlutusInterface/UtxoParser.hs @@ -6,6 +6,7 @@ module Spec.BotPlutusInterface.UtxoParser (tests) where import BotPlutusInterface.UtxoParser qualified as UtxoParser import Data.Attoparsec.Text (parseOnly) +import Data.ByteString qualified as ByteString import Data.Text (Text) import Ledger qualified import Ledger.Ada qualified as Ada @@ -14,8 +15,10 @@ import Ledger.Tx ( ChainIndexTxOut (PublicKeyChainIndexTxOut, ScriptChainIndexTxOut), TxOutRef (TxOutRef), ) +import Ledger.Value (TokenName (TokenName)) import Ledger.Value qualified as Value import NeatInterpolation (text) +import PlutusTx.Builtins (toBuiltin) import Test.Tasty (TestTree, testGroup) import Test.Tasty.HUnit (Assertion, testCase, (@?=)) import Prelude @@ -91,20 +94,28 @@ multiAdaOnly = do singleWithNativeTokens :: Assertion singleWithNativeTokens = do let addr = pubKeyHashAddress "0000" + token = + Value.assetClass "057910a2c93551443cb2c0544d1d65da3fb033deaa79452bd431ee08" "testToken" + tokenWithRawByteString = + Value.assetClass + "7c6de14062b27c3dc3ba9f232ade32efe22fb8e2ae76b24f33212fdb" + (TokenName (toBuiltin (ByteString.pack [1, 35, 69, 103, 137, 171, 205, 239]))) + tokenWithEmptyName = + Value.assetClass "98a759ed2e20f6d83aa4d37d028d4bbb547a696fc345d54126188614" "" testUtxoParser addr [text| TxHash TxIx Amount -------------------------------------------------------------------------------------- - 384de3f29396fdf687551e3f9e05bd400adcd277720c71f1d2b61f17f5183e51 0 1234 lovelace + 2345 057910a2c93551443cb2c0544d1d65da3fb033deaa79452bd431ee08.74657374546f6b656e + 3456 7c6de14062b27c3dc3ba9f232ade32efe22fb8e2ae76b24f33212fdb.74657374546f6b656e32 + 4567 98a759ed2e20f6d83aa4d37d028d4bbb547a696fc345d54126188614 + TxOutDatumNone + 384de3f29396fdf687551e3f9e05bd400adcd277720c71f1d2b61f17f5183e51 0 1234 lovelace + 2345 057910a2c93551443cb2c0544d1d65da3fb033deaa79452bd431ee08.74657374546f6b656e + 3456 7c6de14062b27c3dc3ba9f232ade32efe22fb8e2ae76b24f33212fdb.0x0123456789abcdef + 4567 98a759ed2e20f6d83aa4d37d028d4bbb547a696fc345d54126188614 + TxOutDatumNone |] [ ( TxOutRef "384de3f29396fdf687551e3f9e05bd400adcd277720c71f1d2b61f17f5183e51" 0 , PublicKeyChainIndexTxOut addr ( Ada.lovelaceValueOf 1234 - <> Value.singleton "057910a2c93551443cb2c0544d1d65da3fb033deaa79452bd431ee08" "testToken" 2345 - <> Value.singleton "7c6de14062b27c3dc3ba9f232ade32efe22fb8e2ae76b24f33212fdb" "testToken2" 3456 - <> Value.singleton "98a759ed2e20f6d83aa4d37d028d4bbb547a696fc345d54126188614" "" 4567 + <> Value.assetClassValue token 2345 + <> Value.assetClassValue tokenWithRawByteString 3456 + <> Value.assetClassValue tokenWithEmptyName 4567 ) ) ] From c8b66022dbc13bbf0c0732ad70aaa666377ab88d Mon Sep 17 00:00:00 2001 From: gege251 Date: Tue, 15 Feb 2022 17:51:28 +0100 Subject: [PATCH 3/5] Refactor --- src/BotPlutusInterface/UtxoParser.hs | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/BotPlutusInterface/UtxoParser.hs b/src/BotPlutusInterface/UtxoParser.hs index 35a9ccc0..f8844274 100644 --- a/src/BotPlutusInterface/UtxoParser.hs +++ b/src/BotPlutusInterface/UtxoParser.hs @@ -9,6 +9,7 @@ module BotPlutusInterface.UtxoParser ( import Control.Applicative (many, (<|>)) import Control.Monad (mzero, void) import Data.Aeson.Extras (tryDecode) +import Data.Attoparsec.ByteString.Char8 (isSpace) import Data.Attoparsec.Text ( Parser, char, @@ -22,8 +23,8 @@ import Data.Attoparsec.Text ( signed, skipSpace, skipWhile, - takeWhile, string, + takeWhile, (), ) import Data.Text (Text) @@ -41,7 +42,7 @@ import Plutus.V1.Ledger.Api ( BuiltinByteString, Credential (PubKeyCredential, ScriptCredential), CurrencySymbol (..), - TokenName(..), + TokenName (..), ) import PlutusTx.Builtins (toBuiltin) import Prelude hiding (takeWhile) @@ -107,8 +108,8 @@ tokenNameParser = do where tokenName = do void $ char '.' - void $ (string "0x" <|> string "") - TokenName <$> decodeHash (takeWhile (not . inClass " ")) + void (string "0x") <|> pure () + TokenName <$> decodeHash (takeWhile (not . isSpace)) datumHashNoneParser :: Parser () datumHashNoneParser = "TxOutDatumNone" >> pure () From 9621433466308e099c9516f7050a1c614ae8ec17 Mon Sep 17 00:00:00 2001 From: Szabo Gergely Date: Wed, 16 Feb 2022 12:46:57 +0100 Subject: [PATCH 4/5] Update src/BotPlutusInterface/UtxoParser.hs Co-authored-by: Samuel Williams <33094920+samuelWilliams99@users.noreply.github.com> --- src/BotPlutusInterface/UtxoParser.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BotPlutusInterface/UtxoParser.hs b/src/BotPlutusInterface/UtxoParser.hs index f8844274..afe72707 100644 --- a/src/BotPlutusInterface/UtxoParser.hs +++ b/src/BotPlutusInterface/UtxoParser.hs @@ -108,7 +108,7 @@ tokenNameParser = do where tokenName = do void $ char '.' - void (string "0x") <|> pure () + void $ optional $ string "0x" TokenName <$> decodeHash (takeWhile (not . isSpace)) datumHashNoneParser :: Parser () From 1e784d1995577941f3e5746d146a4692c861853f Mon Sep 17 00:00:00 2001 From: gege251 Date: Wed, 16 Feb 2022 13:36:12 +0100 Subject: [PATCH 5/5] Fix imports --- src/BotPlutusInterface/UtxoParser.hs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/BotPlutusInterface/UtxoParser.hs b/src/BotPlutusInterface/UtxoParser.hs index afe72707..7375239e 100644 --- a/src/BotPlutusInterface/UtxoParser.hs +++ b/src/BotPlutusInterface/UtxoParser.hs @@ -6,7 +6,7 @@ module BotPlutusInterface.UtxoParser ( tokenNameParser, ) where -import Control.Applicative (many, (<|>)) +import Control.Applicative (many, optional) import Control.Monad (mzero, void) import Data.Aeson.Extras (tryDecode) import Data.Attoparsec.ByteString.Char8 (isSpace)