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 +32/−8
- base58address.cabal +3/−1
- tests/suite.hs +12/−1
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 ] ]