packages feed

base58address 0.1 → 0.2

raw patch · 3 files changed

+47/−10 lines, 3 filesdep +binaryPVP ok

version bump matches the API change (PVP)

Dependencies added: binary

API changes (from Hackage documentation)

- Data.Base58Address: Base58Address :: !Word8 -> !Integer -> Base58Address
- Data.Base58Address: BitcoinAddress :: Base58Address -> BitcoinAddress
- Data.Base58Address: RippleAddress :: Base58Address -> RippleAddress
- Data.Base58Address: bitcoinAlphabet :: Alphabet
- Data.Base58Address: data Base58Address
- Data.Base58Address: decodeB58 :: Alphabet -> String -> Maybe Base58Address
- Data.Base58Address: mkChk :: [Word8] -> [Word8]
- Data.Base58Address: newtype BitcoinAddress
- Data.Base58Address: newtype RippleAddress
- Data.Base58Address: rippleAlphabet :: Alphabet
- Data.Base58Address: showB58 :: Alphabet -> Base58Address -> String
- Data.Base58Address: splitChk :: [a] -> ([a], [a])
+ Data.Base58Address: data BitcoinAddress
+ Data.Base58Address: data RippleAddress
+ Data.Base58Address: instance Binary RippleAddress

Files

Data/Base58Address.hs view
@@ -1,9 +1,15 @@ {-# LANGUAGE CPP #-}---module Data.Base58Address (BitcoinAddress, RippleAddress) where-module Data.Base58Address where+#ifdef TESTS+module Data.Base58Address (BitcoinAddress, RippleAddress, RippleAddress0(..)) where+#else+module Data.Base58Address (BitcoinAddress, RippleAddress) where+#endif +import Control.Monad (when) import Control.Arrow ((***)) import Data.Word+import Data.Binary (Binary(..), getWord8, putWord8)+import Data.Binary.Get (getByteString) import qualified Crypto.Hash.SHA256 as SHA256 import qualified Data.ByteString as BS @@ -16,18 +22,22 @@ instance Arbitrary Base58Address where 	arbitrary = do 		ver <- arbitrary-		adr <- arbitrary `suchThat` (>0)+		adr <- arbitrary `suchThat` (>=0) 		return $ Base58Address ver adr  instance Arbitrary BitcoinAddress where-	arbitrary = do-		adr <- arbitrary-		return $ BitcoinAddress adr+	arbitrary = fmap BitcoinAddress arbitrary  instance Arbitrary RippleAddress where+	arbitrary = fmap RippleAddress arbitrary++newtype RippleAddress0 = RippleAddress0 RippleAddress+	deriving (Show)++instance Arbitrary RippleAddress0 where 	arbitrary = do-		adr <- arbitrary-		return $ RippleAddress adr+		adr <- arbitrary `suchThat` (>=0)+		return $ RippleAddress0 $ RippleAddress $ Base58Address 0 adr #endif  newtype BitcoinAddress = BitcoinAddress Base58Address@@ -57,6 +67,20 @@ 	readsPrec _ s = case decodeB58 rippleAlphabet s of 		Just x -> [(RippleAddress x,"")] 		Nothing -> []++instance Binary RippleAddress where+	get = do+		len <- getWord8+		when (len /= 20) $+			fail $ "RippleAddress is 160 bit encoding, len is " ++ show len+		value <- (fromBase 256 . BS.unpack) `fmap` getByteString 20+		return $ RippleAddress (Base58Address 0 value)++	put (RippleAddress (Base58Address 0 value)) = do+		putWord8 20+		let bytes = toBase 256 value+		mapM_ putWord8 (replicate (20 - length bytes) 0 ++ bytes)+	put _ = fail "RippleAddress version is always 0"  data Base58Address = Base58Address !Word8 !Integer 	deriving (Ord, Eq)
base58address.cabal view
@@ -1,5 +1,5 @@ name:            base58address-version:         0.1+version:         0.2 cabal-version:   >= 1.8 license:         OtherLicense license-file:    COPYING@@ -32,6 +32,7 @@                 base == 4.*,                 containers,                 bytestring,+                binary,                 cryptohash  test-suite tests@@ -44,6 +45,7 @@                 base == 4.*,                 containers,                 bytestring,+                binary,                 cryptohash,                 QuickCheck >= 2.4.1.1,                 test-framework,
tests/suite.hs view
@@ -1,5 +1,7 @@ module Main (main) where +import Data.Binary (encode, decode)+ import Test.Framework (defaultMain, testGroup, Test) import Test.Framework.Providers.QuickCheck2 @@ -17,12 +19,21 @@ 	str = show $! adr 	{-# NOINLINE str #-} +prop_encode_decode_ripple :: RippleAddress0 -> Bool+prop_encode_decode_ripple (RippleAddress0 adr) = (decode $! bytes) == adr+	where+	bytes = encode $! adr+	{-# NOINLINE bytes #-}+ tests :: [Test] tests = 	[-		testGroup "Encode/decode loop" [+		testGroup "read/show loop" [ 			testProperty "BitcoinAddress" prop_read_show_bitcoin, 			testProperty "RippleAddress" prop_read_show_ripple+		],+		testGroup "encode/decode loop" [+			testProperty "RippleAddress" prop_encode_decode_ripple 		] 	]