{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module BitcoinSpec where
import Bitcoin.Signature
import PaymentChannel.Test ()
import Test.QuickCheck
import Test.Hspec
import Network.Haskoin.Test
import Data.Monoid ((<>))
-- HELLO
import qualified Network.Haskoin.Crypto as HC
import qualified Network.Haskoin.Test as HC
newtype ArbitrarySpendCond = ArbitrarySpendCond ArbitraryScript
deriving (Eq, Show, Arbitrary)
newtype ArbitrarySpendFulfill = ArbitrarySpendFulfill ArbitraryScript
deriving (Eq, Show, Arbitrary)
instance SpendCondition ArbitrarySpendCond where
conditionScript (ArbitrarySpendCond (ArbitraryScript s)) = s
instance SpendFulfillment ArbitrarySpendFulfill ArbitrarySpendCond where
signatureScript (ArbitrarySpendFulfill (ArbitraryScript ss)) sc =
ss <> conditionScript sc
rawSigs = undefined
main :: IO ()
main = hspec spec
spec :: Spec
spec =
keySpec
keySpec :: Spec
keySpec = do
describe "External ChildPub/ChildPair" $
it "derive same pubkeys & created signatures verify" $ do
rootKey <- generate arbitrary
HC.ArbitrarySoftPath derivPath <- generate arbitrary
let pair :: External ChildPair
pair = mkChild (rootKey :: RootPrv) derivPath
pub :: External ChildPub
pub = mkChild (fromRootPrv rootKey) derivPath
(getKey pair :: HC.XPubKey) `shouldBe` (getKey pub :: HC.XPubKey)
HC.ArbitraryHash256 h256 <- generate arbitrary
-- External pair/pub compare
HC.signMsg h256 (getKey pair :: HC.PrvKeyC) `shouldSatisfy`
(\sig -> HC.verifySig h256 sig (getKey pub :: HC.PubKeyC))
-- External pair/pair compare
HC.signMsg h256 (getKey pair :: HC.PrvKeyC) `shouldSatisfy`
(\sig -> HC.verifySig h256 sig (getKey pair :: HC.PubKeyC))
describe "Internal ChildPair" $
it "created signatures verify" $ do
rootKey <- generate arbitrary
HC.ArbitraryHardPath derivPath <- generate arbitrary
let pair :: Internal ChildPair
pair = mkChild (rootKey :: RootPrv) derivPath
HC.ArbitraryHash256 h256 <- generate arbitrary
-- Internal pair/pair compare
HC.signMsg h256 (getKey pair :: HC.PrvKeyC) `shouldSatisfy`
(\sig -> HC.verifySig h256 sig (getKey pair :: HC.PubKeyC))
--btcSpec :: Spec
--btcSpec =
-- describe "Bitcoin" $
-- it "signed transaction verifies" $ undefined
--serTest :: (Arbitrary a, Bin.Serialize a)
-- => Gen (Either String a)
--serTest = Bin.decode . Bin.encode <$> arbitrary