module SpendCondSpec
( main
, spec
)
where
import Bitcoin.SpendCond.Cond
import Bitcoin.Util
import Bitcoin.Internal.Util
import Test.Hspec
import Network.Haskoin.Script
import qualified Network.Haskoin.Script as HS
data TestCond = TestCond -- ^ Test condition script
deriving Show
data TestFulfill = TestFulfill -- ^ Test fulfillment/signature script
instance SpendCondition TestCond where
conditionScript _ = Script [ opPushData "TEST_SCRIPT" ]
instance SpendFulfillment TestFulfill TestCond where
signatureScript _ _ = Script [ opPushData "TEST_SIG" ]
rawSigs = undefined
testPubKey = mkDummyPubkey "0323dcd0a7481cb90e3583923701b14d0b6757ebd76bf5b49e696c61f193d7a489"
testSig = mkDummySig "304402204202cdb61cb702aa62de312a8e5eada817d90c4e26c8b696780b14d1576f204f02203c134d0acb057d917508ca9baab241a4f66ebea32f7acceeaf621a334927e17701"
testBtcSig = BtcSig testSig (HS.SigAll False)
fulfill = TestFulfill
testPKHSig = SpendPKH testBtcSig
-- | For regular P2PKH we're using an actual condition/script,
-- but for P2WPKH it's just a template that's
-- handled as a special case by the script interpreter.
--p2pkh = Pay2 $ Cond $ PubkeyHash testPubKey
pkh = PubkeyHash testPubKey
--p2wpkh = Pay2 $ Witness $ PubkeyHash testPubKey
--p2wpkhINp2sh = Pay2 $ ScriptHash $ Witness $ PubkeyHash testPubKey
--p2sh = Pay2 $ ScriptHash $ Cond TestCond
--p2wsh = Pay2 $ Witness $ Cond TestCond
--p2wshINp2sh = Pay2 $ ScriptHash $ Witness $ Cond TestCond
main :: IO ()
main = hspec spec
spec = spendCondSpec
spendCondSpec :: Spec
spendCondSpec =
describe "Transaction script & witness" $ do
describe "P2PKH has correct" $ do
it "scriptPubKey" $ (scriptPubKey pkh :: TxOutputScript P2S) `shouldBe`
TxOutputScript [ OP_DUP
, OP_HASH160
, opPush (hash160 testPubKey)
, OP_EQUALVERIFY
, OP_CHECKSIG
]
it "scriptSig" $ (inputScript testPKHSig pkh :: TxInputScript P2S ) `shouldBe`
TxInputScript [ opPush testBtcSig, opPush testPubKey ]
it "witness" $ (witnessScript testPKHSig pkh :: WitnessScript P2S) `shouldBe`
WitnessScript mempty
describe "P2SH has correct" $ do
it "scriptPubKey" $ (scriptPubKey TestCond :: TxOutputScript P2SH) `shouldBe`
TxOutputScript [ OP_HASH160
, opPush $ hash160 (conditionScript TestCond)
, OP_EQUAL
]
it "scriptSig" $ (inputScript fulfill TestCond :: TxInputScript P2SH) `shouldBe`
TxInputScript [ OP_PUSHDATA "TEST_SIG" OPCODE
, OP_PUSHDATA "\vTEST_SCRIPT" OPCODE
]
it "witness" $ (witnessScript fulfill TestCond :: WitnessScript P2SH) `shouldBe`
WitnessScript mempty
{-
describe "P2WPKH has correct" $ do
it "scriptPubKey" $ scriptPubKey p2wpkh `shouldBe`
TxOutputScript [ OP_0
, opPush (hash160 testPubKey)
]
it "scriptSig" $ inputScript testPKHSig p2wpkh `shouldBe`
TxInputScript mempty
it "witness" $ witnessScript testPKHSig p2wpkh `shouldBe`
WitnessScript [ opPush testBtcSig, opPush testPubKey ]
describe "P2WPKH in P2SH has correct" $ do
it "scriptPubKey" $ scriptPubKey p2wpkhINp2sh `shouldBe`
TxOutputScript [ OP_HASH160
, OP_PUSHDATA "sA\SOH\aR\166\&1\196\182\178%\US\183[\177g^\158E\177" OPCODE
, OP_EQUAL
]
it "scriptSig" $ inputScript testPKHSig p2wpkhINp2sh `shouldBe`
TxInputScript [ OP_PUSHDATA (serialize $ Script [ OP_0, opPush (hash160 testPubKey) ]) OPCODE ]
it "witness" $ witnessScript testPKHSig p2wpkhINp2sh `shouldBe`
WitnessScript [ opPush testBtcSig, opPush testPubKey ]
describe "P2WSH has correct" $ do
it "scriptPubKey" $ scriptPubKey p2wsh `shouldBe`
TxOutputScript [ OP_0
, opPush (hash256 $ conditionScript TestCond)
]
it "scriptSig" $ inputScript fulfill p2wsh `shouldBe`
TxInputScript mempty
it "witness" $ witnessScript fulfill p2wsh `shouldBe`
WitnessScript [ OP_PUSHDATA "TEST_SIG" OPCODE
, OP_PUSHDATA "\vTEST_SCRIPT" OPCODE
]
describe "P2WSH in P2SH has correct" $ do
it "scriptPubKey" $ scriptPubKey p2wshINp2sh `shouldBe`
TxOutputScript [ OP_HASH160
, OP_PUSHDATA "tq\233\219J\199\255\192C\177n\"\156U\171\233\151\206\188O" OPCODE
, OP_EQUAL
]
it "scriptSig" $ inputScript fulfill p2wshINp2sh `shouldBe`
TxInputScript [ OP_PUSHDATA (serialize $ Script [ OP_0, opPush (hash256 $ conditionScript TestCond) ]) OPCODE ]
it "witness" $ witnessScript fulfill p2wshINp2sh `shouldBe`
WitnessScript [ OP_PUSHDATA "TEST_SIG" OPCODE
, OP_PUSHDATA "\vTEST_SCRIPT" OPCODE
]
-}