Skip to content

Commit

Permalink
port pact4 miner key injection test to pact5
Browse files Browse the repository at this point in the history
Change-Id: I073a658c91f39cb34a6ff3369c5ed701655e916d
  • Loading branch information
chessai committed Jan 15, 2025
1 parent 1dd47a1 commit 750d8c5
Showing 1 changed file with 42 additions and 16 deletions.
58 changes: 42 additions & 16 deletions test/unit/Chainweb/Test/Pact5/TransactionTests.hs
Original file line number Diff line number Diff line change
@@ -1,33 +1,42 @@
{-# LANGUAGE CPP #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE QuasiQuotes #-}
{-# LANGUAGE ScopedTypeVariables #-}

module Chainweb.Test.Pact5.TransactionTests (tests) where

import Test.Tasty
import Test.Tasty.HUnit

import Chainweb.Pact5.Templates
import Chainweb.Miner.Pact
import Control.Lens hiding ((.=))

import Data.Foldable
import Data.Text (unpack)
import qualified Data.Map.Strict as Map

-- internal pact modules

import Pact.Core.Repl
import Pact.Core.Pretty
import Pact.Core.Environment
import Pact.Core.Errors
import Pact.Core.Info
import Pact.Core.Pretty
import Pact.Core.Repl
import Pact.Core.Repl.Utils
import Control.Monad (when)
import Data.Text qualified as Text
import Pact.Types.KeySet qualified as Pact4
import Test.Tasty
import Test.Tasty.HUnit
import Data.Map.Strict qualified as Map

-- ---------------------------------------------------------------------- --
-- Global settings

tests :: TestTree
tests = testGroup "Chainweb.Test.Pact5.TransactionTests"
[ testCase "coin contract v6" $ runReplTest coinReplV6
, testCase "namespace v1" $ runReplTest nsReplV1
, testCase "namespace v2" $ runReplTest nsReplV2
, testCase "miner key injection" injectionTest
]

coinReplV6 :: FilePath
coinReplV6 = "pact/pact5/coin-contract/coin.repl"

Expand Down Expand Up @@ -57,9 +66,26 @@ runReplTest file = do
ReplTestFailed msg ->
failWithErr rstate (PEExecutionError (EvalError msg) [] _loc)

tests :: TestTree
tests = testGroup "Chainweb.Test.Pact5.TransactionTests"
[ testCase "coin contract v6" $ runReplTest coinReplV6
, testCase "namespace v1" $ runReplTest nsReplV1
, testCase "namespace v2" $ runReplTest nsReplV2
]
injectionTest :: Assertion
injectionTest = do
let (expr, pv) = mkCoinbaseTerm badMinerId minerKeys0 1.0

assertEqual "Precompiled exploit yields correct code" (renderText expr) $
"(coin.coinbase \"alpha\" (read-keyset \"miner-keyset\") 9999999.99)"
<> "(coin.coinbase \"alpha\" (read-keyset \"miner-keyset\") (read-decimal \"reward\"))"

let stmt = renderText pv

when ("coinbase" `Text.isInfixOf` stmt) $
assertFailure "Precompiled statement contains exploitable code"

when ("read-keyset" `Text.isInfixOf` stmt) $
assertFailure "Precompiled statement contains exploitable code"

badMinerId :: MinerId
badMinerId = MinerId "alpha\" (read-keyset \"miner-keyset\") 9999999.99)(coin.coinbase \"alpha"

minerKeys0 :: MinerKeys
minerKeys0 = MinerKeys $ Pact4.mkKeySet
["f880a433d6e2a13a32b6169030f56245efdd8c1b8a5027e9ce98a88e886bef27"]
"default"

0 comments on commit 750d8c5

Please sign in to comment.