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.bitcoinj.core.{VersionedChecksummedBytes, Base58, Utils}
import org.scalacoin.config.{RegTest, TestNet3, MainNet} import org.scalacoin.config.{RegTest, TestNet3, MainNet}
import org.scalacoin.util.{Factory, BitcoinSUtil}
import scala.util.{Failure, Success, Try} import scala.util.{Failure, Success, Try}
@ -28,7 +29,8 @@ object BitcoinAddress {
/** /**
* Converts a bitcoin address to an asset address * Converts a bitcoin address to an asset address
* @param address *
* @param address
* @return * @return
*/ */
def convertToAssetAddress(address : BitcoinAddress) : AssetAddress = { def convertToAssetAddress(address : BitcoinAddress) : AssetAddress = {
@ -42,7 +44,8 @@ object BitcoinAddress {
/** /**
* Checks if a address is a valid p2sh address * Checks if a address is a valid p2sh address
* @param address *
* @param address
* @return * @return
*/ */
def p2shAddress(address : String) : Boolean = { def p2shAddress(address : String) : Boolean = {
@ -59,14 +62,16 @@ object BitcoinAddress {
/** /**
* Checks if a address is a valid p2sh address * Checks if a address is a valid p2sh address
* @param address *
* @param address
* @return * @return
*/ */
def p2shAddress(address : BitcoinAddress) : Boolean = p2shAddress(address.value) def p2shAddress(address : BitcoinAddress) : Boolean = p2shAddress(address.value)
/** /**
* Checks if an address is a valid p2pkh address * Checks if an address is a valid p2pkh address
* @param address *
* @param address
* @return * @return
*/ */
def p2pkh(address : String) : Boolean = { def p2pkh(address : String) : Boolean = {
@ -84,7 +89,8 @@ object BitcoinAddress {
/** /**
* Checks if an address is a valid p2pkh address * Checks if an address is a valid p2pkh address
* @param address *
* @param address
* @return * @return
*/ */
def p2pkh(address : BitcoinAddress) : Boolean = p2pkh(address.value) def p2pkh(address : BitcoinAddress) : Boolean = p2pkh(address.value)
@ -105,7 +111,8 @@ object AssetAddress {
/** /**
* Converts an asset address into a bitcoin address * Converts an asset address into a bitcoin address
* @param assetAddress *
* @param assetAddress
* @return * @return
*/ */
def convertToBitcoinAddress(assetAddress : AssetAddress) = { def convertToBitcoinAddress(assetAddress : AssetAddress) = {
@ -118,3 +125,28 @@ object AssetAddress {
BitcoinAddress(new VersionedChecksummedBytes(base58decodeChecked(1), slice){}.toString()) 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 { class AddressFactoryTest extends FlatSpec with MustMatchers {
"AddressFactory" must "create an address from a base58 encoded string" in { "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 { 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 { 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 { it must "throw an exception if the given string" in {
intercept[RuntimeException] { 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 { it must "throw an exception if we give a hex string to create a bitcoin address from" in {
intercept[RuntimeException] { intercept[RuntimeException] {
AddressFactory.fromHex("01234567890abcdef") Address.fromHex("01234567890abcdef")
} }
} }
} }