From d42a56afc53cf1d12dc1b9089f0ddce2c9155d72 Mon Sep 17 00:00:00 2001
From: Felix Lange <fjl@twurst.com>
Date: Thu, 2 Mar 2017 14:03:20 +0100
Subject: [PATCH] common: add UnprefixedHash, UnprefixedAddress

---
 common/types.go | 44 ++++++++++++++++++++++++++++++--------------
 1 file changed, 30 insertions(+), 14 deletions(-)

diff --git a/common/types.go b/common/types.go
index 9c50beb13..05288bf46 100644
--- a/common/types.go
+++ b/common/types.go
@@ -17,6 +17,7 @@
 package common
 
 import (
+	"encoding/hex"
 	"fmt"
 	"math/big"
 	"math/rand"
@@ -30,13 +31,8 @@ const (
 	AddressLength = 20
 )
 
-type (
-	// Hash represents the 32 byte Keccak256 hash of arbitrary data.
-	Hash [HashLength]byte
-
-	// Address represents the 20 byte address of an Ethereum account.
-	Address [AddressLength]byte
-)
+// Hash represents the 32 byte Keccak256 hash of arbitrary data.
+type Hash [HashLength]byte
 
 func BytesToHash(b []byte) Hash {
 	var h Hash
@@ -113,7 +109,24 @@ func EmptyHash(h Hash) bool {
 	return h == Hash{}
 }
 
+// UnprefixedHash allows marshaling a Hash without 0x prefix.
+type UnprefixedHash Hash
+
+// UnmarshalText decodes the hash from hex. The 0x prefix is optional.
+func (h *UnprefixedHash) UnmarshalText(input []byte) error {
+	return hexutil.UnmarshalFixedUnprefixedText("UnprefixedHash", input, h[:])
+}
+
+// MarshalText encodes the hash as hex.
+func (h UnprefixedHash) MarshalText() ([]byte, error) {
+	return []byte(hex.EncodeToString(h[:])), nil
+}
+
 /////////// Address
+
+// Address represents the 20 byte address of an Ethereum account.
+type Address [AddressLength]byte
+
 func BytesToAddress(b []byte) Address {
 	var a Address
 	a.SetBytes(b)
@@ -181,12 +194,15 @@ func (a *Address) UnmarshalText(input []byte) error {
 	return hexutil.UnmarshalFixedText("Address", input, a[:])
 }
 
-// PP Pretty Prints a byte slice in the following format:
-// 	hex(value[:4])...(hex[len(value)-4:])
-func PP(value []byte) string {
-	if len(value) <= 8 {
-		return Bytes2Hex(value)
-	}
+// UnprefixedHash allows marshaling an Address without 0x prefix.
+type UnprefixedAddress Address
+
+// UnmarshalText decodes the address from hex. The 0x prefix is optional.
+func (a *UnprefixedAddress) UnmarshalText(input []byte) error {
+	return hexutil.UnmarshalFixedUnprefixedText("UnprefixedAddress", input, a[:])
+}
 
-	return fmt.Sprintf("%x...%x", value[:4], value[len(value)-4])
+// MarshalText encodes the address as hex.
+func (a UnprefixedAddress) MarshalText() ([]byte, error) {
+	return []byte(hex.EncodeToString(a[:])), nil
 }
-- 
GitLab