diff --git a/ethpub/pub.go b/ethpub/pub.go
index 431f173a090f478c8c3f1395458022f3d6d51657..4ec9877b2ffd1dbe5830f0afc3530f7944c745f4 100644
--- a/ethpub/pub.go
+++ b/ethpub/pub.go
@@ -103,13 +103,24 @@ func (lib *PEthereum) createTx(key, recipient, valueStr, gasStr, gasPriceStr, in
 	var tx *ethchain.Transaction
 	// Compile and assemble the given data
 	if contractCreation {
-		initScript, err := ethutil.Compile(initStr)
-		if err != nil {
-			return nil, err
+		var initScript, mainScript []byte
+		var err error
+		if ethutil.IsHex(initStr) {
+			initScript = ethutil.FromHex(initStr)
+		} else {
+			initScript, err = ethutil.Compile(initStr[2:])
+			if err != nil {
+				return nil, err
+			}
 		}
-		mainScript, err := ethutil.Compile(scriptStr)
-		if err != nil {
-			return nil, err
+
+		if ethutil.IsHex(scriptStr) {
+			mainScript = ethutil.FromHex(scriptStr[2:])
+		} else {
+			mainScript, err = ethutil.Compile(scriptStr)
+			if err != nil {
+				return nil, err
+			}
 		}
 
 		tx = ethchain.NewContractCreationTx(value, gas, gasPrice, mainScript, initScript)
diff --git a/ethutil/bytes.go b/ethutil/bytes.go
index 500368017be32bd213e33e646dad9d2e7e39c92b..b298675a290b3bf4476f41fb00afd56dbbefb66a 100644
--- a/ethutil/bytes.go
+++ b/ethutil/bytes.go
@@ -83,3 +83,8 @@ func CopyBytes(b []byte) (copiedBytes []byte) {
 
 	return
 }
+
+func IsHex(str string) bool {
+	l := len(str)
+	return l >= 4 && l%2 == 0 && str[0:2] == "0x"
+}