packages feed

cardano-addresses-4.0.0: test/Command/Address/DelegationSpec.hs

{-# LANGUAGE FlexibleContexts #-}

module Command.Address.DelegationSpec
    ( spec
    ) where

import Prelude

import Test.Hspec
    ( Spec, SpecWith, it, shouldBe, shouldContain )
import Test.Utils
    ( cli, describeCmd )

spec :: Spec
spec = describeCmd [ "address", "delegation" ] $ do
    specFromExtendedKey defaultPhrase "1852H/1815H/0H/2/0"
        defaultAddrMainnet
        "addr1q9therz8fgux9ywdysrcpaclznyyvl23l2zfcery3f4m9qwvxwdrt\
        \70qlcpeeagscasafhffqsxy36t90ldv06wqrk2qdqhgvu"

    specFromExtendedKey defaultPhrase "1852H/1815H/0H/2/0"
        defaultAddrTestnet
        "addr_test1qptherz8fgux9ywdysrcpaclznyyvl23l2zfcery3f4m9qwv\
        \xwdrt70qlcpeeagscasafhffqsxy36t90ldv06wqrk2qwk2gqr"

    specFromNonextendedKey defaultPhrase "1852H/1815H/0H/2/0"
        defaultAddrMainnet
        "addr1q9therz8fgux9ywdysrcpaclznyyvl23l2zfcery3f4m9qwvxwdrt\
        \70qlcpeeagscasafhffqsxy36t90ldv06wqrk2qdqhgvu"

    specFromNonextendedKey defaultPhrase "1852H/1815H/0H/2/0"
        defaultAddrTestnet
        "addr_test1qptherz8fgux9ywdysrcpaclznyyvl23l2zfcery3f4m9qwv\
        \xwdrt70qlcpeeagscasafhffqsxy36t90ldv06wqrk2qwk2gqr"

    specFromKeyHash defaultPhrase "1852H/1815H/0H/2/0"
        defaultAddrMainnet
        "addr1q9therz8fgux9ywdysrcpaclznyyvl23l2zfcery3f4m9qwvxwdrt\
        \70qlcpeeagscasafhffqsxy36t90ldv06wqrk2qdqhgvu"

    specFromKeyHash defaultPhrase "1852H/1815H/0H/2/0"
        defaultAddrTestnet
        "addr_test1qptherz8fgux9ywdysrcpaclznyyvl23l2zfcery3f4m9qwv\
        \xwdrt70qlcpeeagscasafhffqsxy36t90ldv06wqrk2qwk2gqr"

    specFromScript
        defaultAddrMainnet
        "all [stake_shared_vkh1nqc00hvlc6cq0sfhretk0rmzw8dywmusp8retuqnnxzajtzhjg5]"
        "addr1y9therz8fgux9ywdysrcpaclznyyvl23l2zfcery3f4m9qfe5nnvf2a5vzmvdfhda0yw08qrj32kn4ytx2l7xpd08l7q0xlqfx"

    specMalformedAddress "💩"

    specMalformedAddress "\NUL"

    specMalformedAddress
        "Ae2tdPwUPEYz6ExfbWubiXPB6daUuhJxikMEb4eXRp5oKZBKZwrbJ2k7EZe"

    specMalformedAddress
        "DdzFFzCqrhsf6hiTYkK5gBAhVDwg3SiaHiEL9wZLYU3WqLUpx6DP\
        \5ZRJr4rtNRXbVNfk89FCHCDR365647os9AEJ8MKZNvG7UKTpythG"

    specInvalidAddress
        "addr1qdu5vlrf4xkxv2qpwngf6cjhtw542ayty80v8dyr49rf5ewvxwdrt\
        \70qlcpeeagscasafhffqsxy36t90ldv06wqrk2q5ggg4z"

    specMalformedXPub "💩"

    specInvalidXPub
        "stake_xvk1qfqcf4tp4ensj5qypqs640rt06pe5x7v2eul00c7rakzzvsakw3caelfuh6cg6nrkdv9y2ctkeu"

specFromExtendedKey :: [String] -> String -> String -> String -> SpecWith ()
specFromExtendedKey phrase path addr want = it ("delegation from key " <> want) $ do
    stakeKey <- cli [ "key", "from-recovery-phrase", "shelley" ] (unwords phrase)
       >>= cli [ "key", "child", path ]
       >>= cli [ "key", "public", "--with-chain-code" ]
    out <- cli [ "address", "delegation", stakeKey ] addr
    out `shouldBe` want

specFromNonextendedKey :: [String] -> String -> String -> String -> SpecWith ()
specFromNonextendedKey phrase path addr want = it ("delegation from key " <> want) $ do
    stakeKey <- cli [ "key", "from-recovery-phrase", "shelley" ] (unwords phrase)
       >>= cli [ "key", "child", path ]
       >>= cli [ "key", "public", "--without-chain-code" ]
    out <- cli [ "address", "delegation", stakeKey ] addr
    out `shouldBe` want

specFromKeyHash :: [String] -> String -> String -> String -> SpecWith ()
specFromKeyHash phrase path addr want = it ("delegation from key " <> want) $ do
    stakeKeyHash <- cli [ "key", "from-recovery-phrase", "shelley" ] (unwords phrase)
       >>= cli [ "key", "child", path ]
       >>= cli [ "key", "public", "--with-chain-code" ]
       >>= cli [ "key", "hash" ]
    out <- cli [ "address", "delegation", stakeKeyHash ] addr
    out `shouldBe` want

specFromScript :: String -> String -> String -> SpecWith ()
specFromScript addr script want = it ("delegation from script " <> want) $ do
    scriptHash <- cli [ "script", "hash", script ] ""
    out <- cli [ "address", "delegation", scriptHash ] addr
    out `shouldBe` want

specMalformedAddress :: String -> SpecWith ()
specMalformedAddress addr = it ("malformed address " <> addr) $ do
    (out, err) <- cli [ "address", "delegation", defaultXPub ] addr
    out `shouldBe` ""
    err `shouldContain` "Bech32 error"

specInvalidAddress :: String -> SpecWith ()
specInvalidAddress addr = it ("invalid address " <> addr) $ do
    (out, err) <- cli [ "address", "delegation", defaultXPub ] addr
    out `shouldBe` ""
    err `shouldContain` "Only payment addresses can be extended"

specMalformedXPub :: String -> SpecWith ()
specMalformedXPub xpub = it ("malformed xpub " <> xpub) $ do
    (out, err) <- cli [ "address", "delegation", xpub ] defaultAddrMainnet
    out `shouldBe` ""
    err `shouldContain` "Couldn't parse delegation credentials."

specInvalidXPub :: String -> SpecWith ()
specInvalidXPub xpub = it ("invalid xpub " <> xpub) $ do
    (out, err) <- cli [ "address", "delegation", xpub ] defaultAddrMainnet
    out `shouldBe` ""
    err `shouldContain` "Couldn't parse delegation credentials."

defaultPhrase :: [String]
defaultPhrase =
    [ "art", "forum", "devote", "street", "sure"
    , "rather", "head", "chuckle", "guard", "poverty"
    , "release", "quote", "oak", "craft", "enemy"
    ]

defaultXPub :: String
defaultXPub =
    "stake_xvk1z0lq4d73l4xtk42s3364s2fpn4m5xtuacfkfj4dxxt9uhccvl\
    \g6pamdykgvcna3w4jf6zr3yqenuasug3gp22peqm6vduzrzw8uj6asu49xvf"

defaultAddrMainnet :: String
defaultAddrMainnet =
    "addr1v9therz8fgux9ywdysrcpaclznyyvl23l2zfcery3f4m9qgx2curq"

defaultAddrTestnet :: String
defaultAddrTestnet =
    "addr_test1vptherz8fgux9ywdysrcpaclznyyvl23l2zfcery3f4m9qgazvqv9"