diff --git a/deploy/compile/solgo/main.go b/deploy/compile/solgo/main.go
index 0229cd5d4b3dcaf0ec0f8557a093b3a63f66ec61..6611daad095b5ea1cdff34f1a58cad0722b4d4b1 100644
--- a/deploy/compile/solgo/main.go
+++ b/deploy/compile/solgo/main.go
@@ -39,7 +39,7 @@ func main() {
 		for _, c := range resp.Objects {
 			f.WriteString(fmt.Sprintf("var Bytecode_%s = hex.MustDecodeString(\"%s\")\n",
 				c.Objectname, c.Binary.Evm.Bytecode.Object))
-			f.WriteString(fmt.Sprintf("var Abi_%s = `%s`\n",
+			f.WriteString(fmt.Sprintf("var Abi_%s = []byte(`%s`)\n",
 				c.Objectname, c.Binary.Abi))
 		}
 	}
diff --git a/execution/evm/abi/abi.go b/execution/evm/abi/abi.go
index 037be30447d7e16216036323e80d67939914e6c2..3879bb8a89b292e3a45f0be857181c6b597121a0 100644
--- a/execution/evm/abi/abi.go
+++ b/execution/evm/abi/abi.go
@@ -12,6 +12,7 @@ import (
 	"strings"
 	"unsafe" // just for Sizeof
 
+	burrow_binary "github.com/hyperledger/burrow/binary"
 	"github.com/hyperledger/burrow/crypto"
 	"github.com/hyperledger/burrow/execution/evm/sha3"
 )
@@ -867,6 +868,12 @@ func ReadAbiSpec(specBytes []byte) (*AbiSpec, error) {
 			if err != nil {
 				return nil, err
 			}
+			for i := range inputs {
+				if inputs[i].Indexed && inputs[i].EVM.isDynamic() {
+					// For Dynamic types, the hash is stored in stead
+					inputs[i].EVM = EVMBytes{M: 32}
+				}
+			}
 			abiSpec.Events[s.Name] = Event{Inputs: inputs}
 		case "function":
 			inputs, err := readArgSpec(s.Inputs)
@@ -1007,6 +1014,81 @@ func GetFunctionID(signature string) (id FunctionID) {
 	return
 }
 
+func UnpackRevert(data []byte) (message string, err error) {
+	err = RevertAbi.UnpackWithID(data, &message)
+	return
+}
+
+/*
+ * Given a eventSpec, get all the fields (topic fields or not)
+ */
+func UnpackEvent(eventSpec Event, topics []burrow_binary.Word256, data []byte, args ...interface{}) error {
+	// First unpack the topic fields
+	topicIndex := 0
+	if !eventSpec.Anonymous {
+		topicIndex++
+	}
+
+	for i, a := range eventSpec.Inputs {
+		if a.Indexed {
+			_, err := a.EVM.unpack(topics[topicIndex].Bytes(), 0, args[i])
+			if err != nil {
+				return err
+			}
+			topicIndex++
+		}
+	}
+
+	// Now unpack the other fields. unpack will step over any indexed fields
+	return unpack(eventSpec.Inputs, data, func(i int) interface{} {
+		return args[i]
+	})
+}
+
+func (abiSpec *AbiSpec) Unpack(data []byte, fname string, args ...interface{}) error {
+	var funcSpec FunctionSpec
+	var argSpec []Argument
+	if fname != "" {
+		if _, ok := abiSpec.Functions[fname]; ok {
+			funcSpec = abiSpec.Functions[fname]
+		} else {
+			funcSpec = abiSpec.Fallback
+		}
+	} else {
+		funcSpec = abiSpec.Constructor
+	}
+
+	argSpec = funcSpec.Outputs
+
+	if argSpec == nil {
+		return fmt.Errorf("Unknown function %s", fname)
+	}
+
+	return unpack(argSpec, data, func(i int) interface{} {
+		return args[i]
+	})
+}
+
+func (abiSpec *AbiSpec) UnpackWithID(data []byte, args ...interface{}) error {
+	var argSpec []Argument
+
+	var id FunctionID
+	copy(id[:], data)
+	for _, fspec := range abiSpec.Functions {
+		if id == fspec.FunctionID {
+			argSpec = fspec.Outputs
+		}
+	}
+
+	if argSpec == nil {
+		return fmt.Errorf("Unknown function %x", id)
+	}
+
+	return unpack(argSpec, data[4:], func(i int) interface{} {
+		return args[i]
+	})
+}
+
 func (abiSpec *AbiSpec) Pack(fname string, args ...interface{}) ([]byte, error) {
 	var funcSpec FunctionSpec
 	var argSpec []Argument
@@ -1213,6 +1295,10 @@ func unpack(argSpec []Argument, data []byte, getArg func(int) interface{}) error
 	}
 
 	for i, a := range argSpec {
+		if a.Indexed {
+			continue
+		}
+
 		arg := getArg(i)
 		if a.IsArray {
 			var array *[]interface{}
diff --git a/execution/evm/abi/core.go b/execution/evm/abi/core.go
index 617665b98efe86e78902e93cc9c845b599bbf12d..c68b367de7f169a4dd876bdbf856e688a0ff1adf 100644
--- a/execution/evm/abi/core.go
+++ b/execution/evm/abi/core.go
@@ -16,6 +16,16 @@ type Variable struct {
 	Value string
 }
 
+func init() {
+	var err error
+	RevertAbi, err = ReadAbiSpec([]byte(`[{"name":"Error","type":"function","outputs":[{"type":"string"}],"inputs":[{"type":"string"}]}]`))
+	if err != nil {
+		panic(fmt.Sprintf("internal error: failed to build revert abi: %v", err))
+	}
+}
+
+var RevertAbi *AbiSpec
+
 func ReadAbiFormulateCallFile(abiLocation, binPath, funcName string, args []string) ([]byte, error) {
 	abiSpecBytes, err := readAbi(binPath, abiLocation)
 	if err != nil {
diff --git a/execution/solidity/revert.sol.go b/execution/solidity/revert.sol.go
index 0298b821afdf4eb6b0d80d428430993c6c961164..2d618b950405fcee6b7bb92564677431bbb4ec65 100644
--- a/execution/solidity/revert.sol.go
+++ b/execution/solidity/revert.sol.go
@@ -3,4 +3,4 @@ package solidity
 import "github.com/tmthrgd/go-hex"
 
 var Bytecode_Revert = hex.MustDecodeString("608060405234801561001057600080fd5b506101f4806100206000396000f300608060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680635b202afb14610046575b600080fd5b34801561005257600080fd5b50610077600480360381019080803563ffffffff169060200190929190505050610079565b005b60008163ffffffff1614156100f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252600f8152602001807f492068617665207265766572746564000000000000000000000000000000000081525060200191505060405180910390fd5b8080600190039150508063ffffffff167ff7f0feb5b4ac5276c55faa8936d962de931ebe8333a2efdc0506878de3979ba960405160405180910390a23073ffffffffffffffffffffffffffffffffffffffff16635b202afb826040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808263ffffffff1663ffffffff168152602001915050600060405180830381600087803b1580156101ad57600080fd5b505af11580156101c1573d6000803e3d6000fd5b50505050505600a165627a7a7230582024a36efd1abf70d00acdeea9b7cebd6e23cb5739c56ac17f65054c1d5711e9bf0029")
-var Abi_Revert = `[{"constant":false,"inputs":[{"name":"i","type":"uint32"}],"name":"RevertAt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"i","type":"uint32"}],"name":"NotReverting","type":"event"}]`
+var Abi_Revert = []byte(`[{"constant":false,"inputs":[{"name":"i","type":"uint32"}],"name":"RevertAt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"i","type":"uint32"}],"name":"NotReverting","type":"event"}]`)
diff --git a/execution/solidity/strange_loop.sol.go b/execution/solidity/strange_loop.sol.go
index 018ac53cd07b3ff2a83ef709358a5e269b4ba8cd..5f85f9321db2f3f8d5930fd32d44fbb0ce4ae52f 100644
--- a/execution/solidity/strange_loop.sol.go
+++ b/execution/solidity/strange_loop.sol.go
@@ -3,4 +3,4 @@ package solidity
 import "github.com/tmthrgd/go-hex"
 
 var Bytecode_StrangeLoop = hex.MustDecodeString("60806040526017600055602260015560116002556001600360006101000a81548160ff02191690831515021790555034801561003a57600080fd5b506103da8061004a6000396000f300608060405260043610610041576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff168063ebb384dd14610046575b600080fd5b34801561005257600080fd5b5061005b610071565b6040518082815260200191505060405180910390f35b60006002549050600360009054906101000a900460ff161561026b5760015460025412156101a5576002600081548092919060010191905055506002547f55707369652100000000000000000000000000000000000000000000000000007f3ff0b1eac80ecf8e93d1a2d7982a9230f8ea7693439fd548687b08a5e292b09760405160405180910390a360025490503073ffffffffffffffffffffffffffffffffffffffff1663ebb384dd6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561016457600080fd5b505af1158015610178573d6000803e3d6000fd5b505050506040513d602081101561018e57600080fd5b810190808051906020019092919050505050610266565b6000600360006101000a81548160ff02191690831515021790555060025490503073ffffffffffffffffffffffffffffffffffffffff1663ebb384dd6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561022957600080fd5b505af115801561023d573d6000803e3d6000fd5b505050506040513d602081101561025357600080fd5b8101908080519060200190929190505050505b6103aa565b600054600254131561038457600260008154809291906001900391905055506002547f446f776e736965210000000000000000000000000000000000000000000000007f3ff0b1eac80ecf8e93d1a2d7982a9230f8ea7693439fd548687b08a5e292b09760405160405180910390a360025490503073ffffffffffffffffffffffffffffffffffffffff1663ebb384dd6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801561034357600080fd5b505af1158015610357573d6000803e3d6000fd5b505050506040513d602081101561036d57600080fd5b8101908080519060200190929190505050506103a9565b6001600360006101000a81548160ff02191690831515021790555060025490506103ab565b5b5b905600a165627a7a723058208a36392c4111612b78f5e50934eb54c073f518a40cb7424d0b06303cdfdd93440029")
-var Abi_StrangeLoop = `[{"constant":false,"inputs":[],"name":"UpsieDownsie","outputs":[{"name":"i","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"direction","type":"bytes32"},{"indexed":true,"name":"newDepth","type":"int256"}],"name":"ChangeLevel","type":"event"}]`
+var Abi_StrangeLoop = []byte(`[{"constant":false,"inputs":[],"name":"UpsieDownsie","outputs":[{"name":"i","type":"int256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"anonymous":false,"inputs":[{"indexed":true,"name":"direction","type":"bytes32"},{"indexed":true,"name":"newDepth","type":"int256"}],"name":"ChangeLevel","type":"event"}]`)
diff --git a/execution/solidity/zero_reset.sol.go b/execution/solidity/zero_reset.sol.go
index cf034e0cf622e581350a5689abfae3dc28388e52..858122389b861be6b085afeb563964559e71ae68 100644
--- a/execution/solidity/zero_reset.sol.go
+++ b/execution/solidity/zero_reset.sol.go
@@ -3,4 +3,4 @@ package solidity
 import "github.com/tmthrgd/go-hex"
 
 var Bytecode_ZeroReset = hex.MustDecodeString("608060405234801561001057600080fd5b506101c0806100206000396000f300608060405260043610610077576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680620267a41461007c5780634ef65c3b146100a757806362738998146100d4578063747586b8146100ff578063987dc8201461012c578063b15a0d5f14610143575b600080fd5b34801561008857600080fd5b5061009161015a565b6040518082815260200191505060405180910390f35b3480156100b357600080fd5b506100d260048036038101908080359060200190929190505050610164565b005b3480156100e057600080fd5b506100e961016e565b6040518082815260200191505060405180910390f35b34801561010b57600080fd5b5061012a60048036038101908080359060200190929190505050610177565b005b34801561013857600080fd5b50610141610181565b005b34801561014f57600080fd5b5061015861018a565b005b6000600154905090565b8060018190555050565b60008054905090565b8060008190555050565b60008081905550565b60006001819055505600a165627a7a72305820c19c71b6113c0b546a6cf9c093b61a1e9c9f42f62811bb4ebaff2f02b860a43e0029")
-var Abi_ZeroReset = `[{"constant":true,"inputs":[],"name":"getUint","outputs":[{"name":"retUint","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"setUint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getInt","outputs":[{"name":"retInt","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256"}],"name":"setInt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setIntToZero","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setUintToZero","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]`
+var Abi_ZeroReset = []byte(`[{"constant":true,"inputs":[],"name":"getUint","outputs":[{"name":"retUint","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"uint256"}],"name":"setUint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getInt","outputs":[{"name":"retInt","type":"int256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"x","type":"int256"}],"name":"setInt","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setIntToZero","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"setUintToZero","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]`)
diff --git a/integration/core/kernel_test.go b/integration/core/kernel_test.go
index 374cf4b9913bee6beb4d23acc4e3ecd5ed5c9fbc..420c468af6478ddd04c2e8eb9350f5dcaba89813 100644
--- a/integration/core/kernel_test.go
+++ b/integration/core/kernel_test.go
@@ -17,6 +17,7 @@ import (
 	"github.com/hyperledger/burrow/core"
 	"github.com/hyperledger/burrow/event"
 	"github.com/hyperledger/burrow/execution/exec"
+	"github.com/hyperledger/burrow/execution/solidity"
 	"github.com/hyperledger/burrow/genesis"
 	"github.com/hyperledger/burrow/integration"
 	"github.com/hyperledger/burrow/integration/rpctest"
@@ -142,7 +143,7 @@ func bootWaitBlocksShutdown(t testing.TB, privValidator tmTypes.PrivValidator, t
 	tcli := rpctest.NewTransactClient(t, testConfig.RPC.GRPC.ListenAddress)
 	// Generate a few transactions
 	for i := 0; i < 3; i++ {
-		rpctest.CreateContract(t, tcli, inputAddress, solidity.Bytecode_Strangeloop)
+		rpctest.CreateContract(t, tcli, inputAddress, solidity.Bytecode_StrangeLoop)
 	}
 
 	subID := event.GenSubID()
diff --git a/integration/rpcevents/execution_events_server_test.go b/integration/rpcevents/execution_events_server_test.go
index bc867e339f31828391969e4fdb611ad9a947f46b..7d1bccd69570c55516bfe3667fcc00c1ad660df0 100644
--- a/integration/rpcevents/execution_events_server_test.go
+++ b/integration/rpcevents/execution_events_server_test.go
@@ -24,13 +24,12 @@ import (
 	"testing"
 	"time"
 
-	"github.com/hyperledger/burrow/binary"
 	"github.com/hyperledger/burrow/event"
 	"github.com/hyperledger/burrow/event/query"
 	"github.com/hyperledger/burrow/execution/errors"
 	"github.com/hyperledger/burrow/execution/evm/abi"
-	"github.com/hyperledger/burrow/execution/evm/asm/bc"
 	"github.com/hyperledger/burrow/execution/exec"
+	"github.com/hyperledger/burrow/execution/solidity"
 	"github.com/hyperledger/burrow/integration/rpctest"
 	"github.com/hyperledger/burrow/rpc/rpcevents"
 	"github.com/hyperledger/burrow/rpc/rpctransact"
@@ -131,11 +130,13 @@ func TestGetEventsSendFiltered(t *testing.T) {
 
 func TestRevert(t *testing.T) {
 	tcli := rpctest.NewTransactClient(t, testConfig.RPC.GRPC.ListenAddress)
-	txe := rpctest.CreateContract(t, tcli, inputAddress, rpctest.Bytecode_Revert)
-	functionID := abi.GetFunctionID("RevertAt(uint32)")
+	txe := rpctest.CreateContract(t, tcli, inputAddress, solidity.Bytecode_Revert)
+	spec, err := abi.ReadAbiSpec(solidity.Abi_Revert)
+	require.NoError(t, err)
+	data, err := spec.Pack("RevertAt", 4)
+	require.NoError(t, err)
 	contractAddress := txe.Receipt.ContractAddress
-	txe = rpctest.CallContract(t, tcli, inputAddress, contractAddress,
-		bc.MustSplice(functionID, binary.Int64ToWord256(4)))
+	txe = rpctest.CallContract(t, tcli, inputAddress, contractAddress, data)
 	assert.Equal(t, errors.ErrorCodeExecutionReverted, txe.Exception.Code)
 
 	request := &rpcevents.BlocksRequest{
diff --git a/execution/solidity/helpers.go b/integration/rpctest/helpers.go
similarity index 100%
rename from execution/solidity/helpers.go
rename to integration/rpctest/helpers.go
diff --git a/integration/rpctransact/call_test.go b/integration/rpctransact/call_test.go
index 4628b110c9471c830d766f334ecb81806407123a..4937943ffb0e7f2f6bfcf6f29bab3bd095da068b 100644
--- a/integration/rpctransact/call_test.go
+++ b/integration/rpctransact/call_test.go
@@ -5,7 +5,6 @@ package rpctransact
 import (
 	"context"
 	"fmt"
-	"strings"
 	"sync"
 	"testing"
 
@@ -66,7 +65,7 @@ func TestCreateContract(t *testing.T) {
 						Amount:  2,
 					},
 					Address:  nil,
-					Data:     solidity.Bytecode_Strangeloop,
+					Data:     solidity.Bytecode_StrangeLoop,
 					Fee:      2,
 					GasLimit: 10000,
 				})
@@ -91,7 +90,7 @@ func BenchmarkCreateContract(b *testing.B) {
 				Amount:  2,
 			},
 			Address:  nil,
-			Data:     solidity.Bytecode_Strangeloop,
+			Data:     solidity.Bytecode_StrangeLoop,
 			Fee:      2,
 			GasLimit: 10000,
 		})
@@ -104,15 +103,20 @@ func TestCallTxSync(t *testing.T) {
 	cli := rpctest.NewTransactClient(t, testConfig.RPC.GRPC.ListenAddress)
 	numGoroutines := 40
 	numRuns := 5
-	functionID := abi.GetFunctionID("UpsieDownsie()")
+	spec, err := abi.ReadAbiSpec(solidity.Abi_StrangeLoop)
+	require.NoError(t, err)
+	data, err := spec.Pack("UpsieDownsie")
+	require.NoError(t, err)
 	countCh := rpctest.CommittedTxCount(t, kern.Emitter)
 	for i := 0; i < numGoroutines; i++ {
 		go func() {
 			for j := 0; j < numRuns; j++ {
-				createTxe := rpctest.CreateContract(t, cli, inputAddress, solidity.Bytecode_Strangeloop)
+				createTxe := rpctest.CreateContract(t, cli, inputAddress, solidity.Bytecode_StrangeLoop)
 				callTxe := rpctest.CallContract(t, cli, inputAddress, lastCall(createTxe.Events).CallData.Callee,
-					functionID[:])
-				depth := binary.Uint64FromWord256(binary.LeftPadWord256(lastCall(callTxe.Events).Return))
+					data)
+				var depth int64
+				err = spec.Unpack(lastCall(callTxe.Events).Return, "UpsieDownsie", &depth)
+				require.NoError(t, err)
 				// Would give 23 if taken from wrong frame (i.e. not the outer stackdepth == 0 one)
 				assert.Equal(t, 18, int(depth))
 			}
@@ -248,10 +252,13 @@ func TestNestedCall(t *testing.T) {
 
 func TestCallEvents(t *testing.T) {
 	cli := rpctest.NewTransactClient(t, testConfig.RPC.GRPC.ListenAddress)
-	createTxe := rpctest.CreateContract(t, cli, inputAddress, solidity.Bytecode_Strangeloop)
+	createTxe := rpctest.CreateContract(t, cli, inputAddress, solidity.Bytecode_StrangeLoop)
 	address := lastCall(createTxe.Events).CallData.Callee
-	functionID := abi.GetFunctionID("UpsieDownsie()")
-	callTxe := rpctest.CallContract(t, cli, inputAddress, address, functionID[:])
+	spec, err := abi.ReadAbiSpec(solidity.Abi_StrangeLoop)
+	require.NoError(t, err)
+	data, err := spec.Pack("UpsieDownsie")
+	require.NoError(t, err)
+	callTxe := rpctest.CallContract(t, cli, inputAddress, address, data)
 	callEvents := filterCalls(callTxe.Events)
 	require.Len(t, callEvents, rpctest.UpsieDownsieCallCount, "should see 30 recursive call events")
 	for i, ev := range callEvents {
@@ -261,15 +268,20 @@ func TestCallEvents(t *testing.T) {
 
 func TestLogEvents(t *testing.T) {
 	cli := rpctest.NewTransactClient(t, testConfig.RPC.GRPC.ListenAddress)
-	createTxe := rpctest.CreateContract(t, cli, inputAddress, solidity.Bytecode_Strangeloop)
+	createTxe := rpctest.CreateContract(t, cli, inputAddress, solidity.Bytecode_StrangeLoop)
 	address := lastCall(createTxe.Events).CallData.Callee
-	functionID := abi.GetFunctionID("UpsieDownsie()")
-	callTxe := rpctest.CallContract(t, cli, inputAddress, address, functionID[:])
+	spec, err := abi.ReadAbiSpec(solidity.Abi_StrangeLoop)
+	require.NoError(t, err)
+	data, err := spec.Pack("UpsieDownsie")
+	require.NoError(t, err)
+	callTxe := rpctest.CallContract(t, cli, inputAddress, address, data)
 	evs := filterLogs(callTxe.Events)
 	require.Len(t, evs, rpctest.UpsieDownsieCallCount-2)
 	log := evs[0]
-	depth := binary.Int64FromWord256(log.Topics[2])
-	direction := strings.TrimRight(string(log.Topics[1][:]), "\x00")
+	var direction string
+	var depth int64
+	err = abi.UnpackEvent(spec.Events["ChangeLevel"], log.Topics, log.Data, &direction, &depth)
+	require.NoError(t, err)
 	assert.Equal(t, int64(18), depth)
 	assert.Equal(t, "Upsie!", direction)
 }
@@ -277,15 +289,15 @@ func TestLogEvents(t *testing.T) {
 func TestRevert(t *testing.T) {
 	cli := rpctest.NewTransactClient(t, testConfig.RPC.GRPC.ListenAddress)
 	txe := rpctest.CreateContract(t, cli, inputAddress, solidity.Bytecode_Revert)
-	functionID := abi.GetFunctionID("RevertAt(uint32)")
-	txe = rpctest.CallContract(t, cli, inputAddress, txe.Receipt.ContractAddress,
-		bc.MustSplice(functionID, binary.Int64ToWord256(4)))
+	spec, err := abi.ReadAbiSpec(solidity.Abi_Revert)
+	require.NoError(t, err)
+	data, err := spec.Pack("RevertAt", 4)
+	require.NoError(t, err)
+	txe = rpctest.CallContract(t, cli, inputAddress, txe.Receipt.ContractAddress, data)
 	assert.Equal(t, errors.ErrorCodeExecutionReverted, txe.Exception.Code)
-
-	revertReason := "I have reverted"
-	expectedReturn := bc.MustSplice(abi.GetFunctionID("Error(string)"), binary.Int64ToWord256(binary.Word256Length),
-		binary.Int64ToWord256(int64(len(revertReason))), binary.RightPadWord256([]byte(revertReason)))
-	assert.Equal(t, expectedReturn, txe.Result.Return)
+	revertReason, err := abi.UnpackRevert(txe.Result.Return)
+	require.NoError(t, err)
+	assert.Equal(t, revertReason, "I have reverted")
 }
 
 func filterCalls(evs []*exec.Event) []*exec.CallEvent {
diff --git a/integration/rpctransact/transact_server_test.go b/integration/rpctransact/transact_server_test.go
index e452d398654419f6eba1f82375e38a1ad29b1e53..6d52bd3ea5b801373364997e8413678a1770578f 100644
--- a/integration/rpctransact/transact_server_test.go
+++ b/integration/rpctransact/transact_server_test.go
@@ -49,7 +49,7 @@ func TestInputAccountPublicKeySet(t *testing.T) {
 	assert.False(t, acc.PublicKey.IsSet())
 
 	// Sign with this account - should set public key
-	rpctest.CreateContract(t, tcli, input.Address(), solidity.Bytecode_Strangeloop)
+	rpctest.CreateContract(t, tcli, input.Address(), solidity.Bytecode_StrangeLoop)
 	acc, err = qcli.GetAccount(context.Background(), &rpcquery.GetAccountParam{Address: input.Address()})
 
 	// Check public key set