haskoin-core 0.9.2 → 0.9.3
raw patch · 5 files changed
+50/−12 lines, 5 files
Files
- CHANGELOG.md +4/−0
- haskoin-core.cabal +2/−2
- src/Network/Haskoin/Address.hs +7/−0
- src/Network/Haskoin/Keys/Extended.hs +6/−0
- test/Network/Haskoin/AddressSpec.hs +31/−10
CHANGELOG.md view
@@ -4,6 +4,10 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/) and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html). +## 0.9.3+### Added+- Some support for P2WPKH-over-P2SH addresses.+ ## 0.9.2 ### Removed - Disable unnecessary `-O2` optimisation added in previous version.
haskoin-core.cabal view
@@ -4,10 +4,10 @@ -- -- see: https://github.com/sol/hpack ----- hash: f8c182a15da9f3c4eb348dd84d0794720d0b89acf7981b7a317785f2e4196c96+-- hash: 02eeb8fb9ab57329c99198da0834bf37562983ad0cae7f6b3185fa6d95dc919b name: haskoin-core-version: 0.9.2+version: 0.9.3 synopsis: Bitcoin & Bitcoin Cash library for Haskell description: Haskoin Core is a complete Bitcoin and Bitcoin Cash library of functions and data types for Haskell developers. category: Bitcoin, Finance, Network
src/Network/Haskoin/Address.hs view
@@ -24,6 +24,7 @@ , addrFromJSON , pubKeyAddr , pubKeyWitnessAddr+ , pubKeyWitnessP2SHAddr , p2pkhAddr , p2wpkhAddr , p2shAddr@@ -196,6 +197,12 @@ -- | Obtain a P2WPKH address from a public key. Only on SegWit networks. pubKeyWitnessAddr :: PubKeyI -> Address pubKeyWitnessAddr = WitnessPubKeyAddress . addressHash . S.encode++-- | Obtain a W2WPKH P2SH address. Only on SegWit networks.+pubKeyWitnessP2SHAddr :: PubKeyI -> Address+pubKeyWitnessP2SHAddr =+ p2shAddr .+ addressHash . encodeOutputBS . PayWitnessPKHash . addressHash . S.encode -- | Obtain a P2WPKH address from a 'Hash160'. p2wpkhAddr :: Hash160 -> Address
src/Network/Haskoin/Keys/Extended.hs view
@@ -310,6 +310,12 @@ xPubAddr :: XPubKey -> Address xPubAddr xkey = pubKeyAddr (wrapPubKey True (xPubKey xkey)) +xPubWitnessAddr :: XPubKey -> Address+xPubWitnessAddr xkey = pubKeyWitnessAddr (wrapPubKey True (xPubKey xkey))++xPubWitnessP2SHAddr :: XPubKey -> Address+xPubWitnessP2SHAddr xkey = pubKeyWitnessP2SHAddr (wrapPubKey True (xPubKey xkey))+ -- | Exports an extended private key to the BIP32 key export format ('Base58'). xPrvExport :: Network -> XPrvKey -> Base58 xPrvExport net = encodeBase58Check . runPut . putXPrvKey net
test/Network/Haskoin/AddressSpec.hs view
@@ -5,27 +5,32 @@ import Data.Aeson.Types import Data.ByteString (ByteString) import qualified Data.ByteString as BS (append, empty, pack)+import Data.Either (isRight)+import Data.Maybe (isJust, fromJust)+import qualified Data.Serialize as S import Data.Text (Text) import Network.Haskoin.Address import Network.Haskoin.Address.Base58 import Network.Haskoin.Constants+import Network.Haskoin.Keys (derivePubKeyI) import Network.Haskoin.Test import Test.Hspec-import Test.HUnit (Assertion, assertBool)+import Test.HUnit (Assertion, assertBool,+ assertEqual) import Test.QuickCheck spec :: Spec spec = do let net = btc- describe "btc address" $- it "base58 encodings" $ mapM_ runVector vectors+ describe "btc address" . it "base58 encodings" $ mapM_ runVector vectors describe "btc-test address" $ props btcTest describe "bch address" $ props bch describe "bch-test address" $ props bchTest describe "bch-regtest address" $ props bchRegTest- describe "json serialization" $- it "encodes and decodes address" $- forAll arbitraryAddress (testCustom (addrFromJSON net) (addrToJSON net))+ describe "json serialization" . it "encodes and decodes address" $+ forAll arbitraryAddress (testCustom (addrFromJSON net) (addrToJSON net))+ describe "witness address vectors" . it "p2sh(pwpkh)" $+ mapM_ testCompatWitness compatWitnessVectors props :: Network -> Spec props net = do@@ -45,10 +50,10 @@ runVector :: (ByteString, Text, Text) -> Assertion runVector (bs, e, chk) = do- assertBool "encodeBase58" $ e == b58- assertBool "encodeBase58Check" $ chk == b58Chk- assertBool "decodeBase58" $ Just bs == decodeBase58 b58- assertBool "decodeBase58Check" $ Just bs == decodeBase58Check b58Chk+ assertEqual "encodeBase58" e b58+ assertEqual "encodeBase58Check" chk b58Chk+ assertEqual "decodeBase58" (Just bs) (decodeBase58 b58)+ assertEqual "decodeBase58Check" (Just bs) (decodeBase58Check b58Chk) where b58 = encodeBase58 bs b58Chk = encodeBase58Check bs@@ -68,3 +73,19 @@ testCustom :: Eq a => (Value -> Parser a) -> (a -> Value) -> a -> Bool testCustom f g x = parseMaybe f (g x) == Just x++compatWitnessVectors :: [(Network, Text, Text)]+compatWitnessVectors =+ [ ( btcTest+ , "cNUnpYpMsJXYCERYBciJnsWBpcYEFjdcbq6dxj4SskGhs7uHuJ7Q"+ , "2N6PDTueBHvXzW61B4oe5SW1D3v2Z3Vpbvw")+ ]++testCompatWitness :: (Network, Text, Text) -> Assertion+testCompatWitness (net, seckey, addr) = do+ let seckeyM = fromWif net seckey+ assertBool "decode seckey" (isJust seckeyM)+ let pubkey = derivePubKeyI (fromJust seckeyM)+ let addrM = addrToString btcTest (pubKeyWitnessP2SHAddr pubkey)+ assertBool "address can be encoded" (isJust addrM)+ assertEqual "witness address matches" addr (fromJust addrM)