refactored AddressFactory with Address companion object

This commit is contained in:
Tom McCabe 2016-04-18 14:12:23 -05:00
parent e857ad2085
commit 28c97a6772
2 changed files with 43 additions and 11 deletions

View file

@ -2,6 +2,7 @@ package org.scalacoin.protocol
import org.bitcoinj.core.{VersionedChecksummedBytes, Base58, Utils}
import org.scalacoin.config.{RegTest, TestNet3, MainNet}
import org.scalacoin.util.{Factory, BitcoinSUtil}
import scala.util.{Failure, Success, Try}
@ -28,6 +29,7 @@ object BitcoinAddress {
/**
* Converts a bitcoin address to an asset address
*
* @param address
* @return
*/
@ -42,6 +44,7 @@ object BitcoinAddress {
/**
* Checks if a address is a valid p2sh address
*
* @param address
* @return
*/
@ -59,6 +62,7 @@ object BitcoinAddress {
/**
* Checks if a address is a valid p2sh address
*
* @param address
* @return
*/
@ -66,6 +70,7 @@ object BitcoinAddress {
/**
* Checks if an address is a valid p2pkh address
*
* @param address
* @return
*/
@ -84,6 +89,7 @@ object BitcoinAddress {
/**
* Checks if an address is a valid p2pkh address
*
* @param address
* @return
*/
@ -105,6 +111,7 @@ object AssetAddress {
/**
* Converts an asset address into a bitcoin address
*
* @param assetAddress
* @return
*/
@ -118,3 +125,28 @@ object AssetAddress {
BitcoinAddress(new VersionedChecksummedBytes(base58decodeChecked(1), slice){}.toString())
}
}
object Address extends Factory[Address] {
/**
* Factory method for creating addresses
* Takes in a string to check if it is an address
* if it is it creates the address
* if not it throws a runtime exception
*
* @param str
* @return
*/
def factory(str : String) : Address = {
if (AssetAddress.validate(str)) AssetAddress(str)
else if (BitcoinAddress.validate(str)) BitcoinAddress(str)
else throw new RuntimeException("The address that you passed in is invalid")
}
def fromBytes(bytes : Seq[Byte]) : Address = factory(BitcoinSUtil.encodeBase58(bytes))
override def fromHex(hex : String) : Address = throw new RuntimeException("We cannot create a bitcoin address from hex - bitcoin addresses are base 58 encoded")
def apply(bytes : Seq[Byte]) : Address = fromBytes(bytes)
def apply(str : String) : Address = factory(str)
}

View file

@ -9,27 +9,27 @@ import org.scalatest.{FlatSpec, MustMatchers}
class AddressFactoryTest extends FlatSpec with MustMatchers {
"AddressFactory" must "create an address from a base58 encoded string" in {
AddressFactory.factory(TestUtil.bitcoinAddress.value) must be (TestUtil.bitcoinAddress)
Address(TestUtil.bitcoinAddress.value) must be (TestUtil.bitcoinAddress)
}
it must "create an address from a sequence of bytes" in {
AddressFactory.fromBytes(BitcoinSUtil.decodeBase58(TestUtil.bitcoinAddress.value)) must be (TestUtil.bitcoinAddress)
Address(BitcoinSUtil.decodeBase58(TestUtil.bitcoinAddress.value)) must be (TestUtil.bitcoinAddress)
}
it must "create an asset address from a base58 encoded string" in {
AddressFactory.fromBytes(BitcoinSUtil.decodeBase58(TestUtil.assetAddress.value)) must be (TestUtil.assetAddress)
Address(BitcoinSUtil.decodeBase58(TestUtil.assetAddress.value)) must be (TestUtil.assetAddress)
}
it must "throw an exception if the given string" in {
intercept[RuntimeException] {
AddressFactory.factory("01234567890abcdef")
Address("01234567890abcdef")
}
}
it must "throw an exception if we give a hex string to create a bitcoin address from" in {
intercept[RuntimeException] {
AddressFactory.fromHex("01234567890abcdef")
Address.fromHex("01234567890abcdef")
}
}
}