diff --git a/src/main/java/org/fisco/bcos/sdk/abi/ABICodec.java b/src/main/java/org/fisco/bcos/sdk/abi/ABICodec.java index fb1b977a6..8b2dd5b40 100644 --- a/src/main/java/org/fisco/bcos/sdk/abi/ABICodec.java +++ b/src/main/java/org/fisco/bcos/sdk/abi/ABICodec.java @@ -199,107 +199,6 @@ public String encodeMethodByInterfaceFromString( return encodeMethodByIdFromString(ABI, methodId, params); } - public String encodeEvent(String ABI, String eventName, List params) - throws ABICodecException { - ContractABIDefinition contractABIDefinition = abiDefinitionFactory.loadABI(ABI); - List events = contractABIDefinition.getEvents().get(eventName); - for (ABIDefinition abiDefinition : events) { - if (abiDefinition.getInputs().size() == params.size()) { - ABIObject inputABIObject = abiObjectFactory.createInputObject(abiDefinition); - ABICodecObject abiCodecObject = new ABICodecObject(); - try { - return abiCodecObject.encodeValue(inputABIObject, params).encode(); - } catch (Exception e) { - logger.error(" exception in encodeEventFromObject : {}", e.getMessage()); - } - } - } - - String errorMsg = " cannot encode in encodeEventFromObject with appropriate interface ABI"; - logger.error(errorMsg); - throw new ABICodecException(errorMsg); - } - - public String encodeEventByTopic(String ABI, String eventTopic, List params) - throws ABICodecException { - ContractABIDefinition contractABIDefinition = abiDefinitionFactory.loadABI(ABI); - ABIDefinition abiDefinition = - contractABIDefinition.getABIDefinitionByEventTopic(eventTopic); - ABIObject inputABIObject = abiObjectFactory.createInputObject(abiDefinition); - ABICodecObject abiCodecObject = new ABICodecObject(); - try { - return abiCodecObject.encodeValue(inputABIObject, params).encode(); - } catch (Exception e) { - logger.error(" exception in encodeEventByTopicFromObject : {}", e.getMessage()); - } - - String errorMsg = - " cannot encode in encodeEventByTopicFromObject with appropriate interface ABI"; - logger.error(errorMsg); - throw new ABICodecException(errorMsg); - } - - public String encodeEventByInterface(String eventSignature, List params) - throws ABICodecException { - return null; - } - - public String encodeEventFromString(String ABI, String eventName, List params) - throws ABICodecException { - ContractABIDefinition contractABIDefinition = abiDefinitionFactory.loadABI(ABI); - List methods = contractABIDefinition.getEvents().get(eventName); - if (methods == null) { - logger.debug( - "Invalid eventName: {}, current supported events are: {}", - eventName, - contractABIDefinition.getEvents().keySet()); - throw new ABICodecException( - "Invalid event " - + eventName - + ", supported events are: " - + contractABIDefinition.getEvents().keySet()); - } - for (ABIDefinition abiDefinition : methods) { - if (abiDefinition.getInputs().size() == params.size()) { - ABIObject inputABIObject = abiObjectFactory.createInputObject(abiDefinition); - ABICodecJsonWrapper abiCodecJsonWrapper = new ABICodecJsonWrapper(); - try { - return abiCodecJsonWrapper.encode(inputABIObject, params).encode(); - } catch (Exception e) { - logger.error(" exception in encodeEventFromString : {}", e.getMessage()); - } - } - } - - String errorMsg = " cannot encode in encodeEventFromString with appropriate interface ABI"; - logger.error(errorMsg); - throw new ABICodecException(errorMsg); - } - - public String encodeEventByTopicFromString(String ABI, String eventTopic, List params) - throws ABICodecException { - ContractABIDefinition contractABIDefinition = abiDefinitionFactory.loadABI(ABI); - ABIDefinition abiDefinition = - contractABIDefinition.getABIDefinitionByEventTopic(eventTopic); - ABIObject inputABIObject = abiObjectFactory.createInputObject(abiDefinition); - ABICodecJsonWrapper abiCodecJsonWrapper = new ABICodecJsonWrapper(); - try { - return abiCodecJsonWrapper.encode(inputABIObject, params).encode(); - } catch (Exception e) { - logger.error(" exception in encodeEventByTopicFromString : {}", e.getMessage()); - } - - String errorMsg = - " cannot encode in encodeEventByTopicFromString with appropriate interface ABI"; - logger.error(errorMsg); - throw new ABICodecException(errorMsg); - } - - public String encodeEventByInterfaceFromString(String eventSignature, List params) - throws ABICodecException { - return null; - } - public List decodeMethod(ABIDefinition abiDefinition, String output) throws ABICodecException { ABIObject outputABIObject = abiObjectFactory.createOutputObject(abiDefinition); @@ -463,9 +362,11 @@ public List decodeEventByTopic(String ABI, String eventTopic, String out throw new ABICodecException(errorMsg); } - public List decodeEventByInterface(String eventSignature, String output) + public List decodeEventByInterface(String ABI, String eventSignature, String output) throws ABICodecException { - return null; + FunctionEncoder functionEncoder = new FunctionEncoder(cryptoInterface); + String methodId = functionEncoder.buildMethodId(eventSignature); + return decodeEventByTopic(ABI, methodId, output); } public List decodeEventToString(String ABI, String eventName, String output) @@ -513,8 +414,10 @@ public List decodeEventByTopicToString(String ABI, String eventTopic, St throw new ABICodecException(errorMsg); } - public List decodeEventByInterfaceToString(String eventSignature, String output) - throws ABICodecException { - return null; + public List decodeEventByInterfaceToString( + String ABI, String eventSignature, String output) throws ABICodecException { + FunctionEncoder functionEncoder = new FunctionEncoder(cryptoInterface); + String methodId = functionEncoder.buildMethodId(eventSignature); + return decodeEventByTopicToString(ABI, methodId, output); } } diff --git a/src/test/java/org/fisco/bcos/sdk/test/abi/ABIEventTest.java b/src/test/java/org/fisco/bcos/sdk/test/abi/ABIEventTest.java new file mode 100644 index 000000000..fdb5392bf --- /dev/null +++ b/src/test/java/org/fisco/bcos/sdk/test/abi/ABIEventTest.java @@ -0,0 +1,30 @@ +package org.fisco.bcos.sdk.test.abi; + +import java.util.List; +import org.fisco.bcos.sdk.abi.ABICodec; +import org.fisco.bcos.sdk.abi.ABICodecException; +import org.junit.Assert; +import org.junit.Test; + +public class ABIEventTest { + private static final String abi = + "[{\"constant\":true,\"inputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"_addrDArray\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_addr\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"getUint256\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"v\",\"type\":\"uint256\"}],\"name\":\"incrementUint256\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_bytesV\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_s\",\"outputs\":[{\"name\":\"\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"getSArray\",\"outputs\":[{\"name\":\"\",\"type\":\"uint256[2]\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"bytesArray\",\"type\":\"bytes1[]\"}],\"name\":\"setBytesMapping\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"b\",\"type\":\"bytes\"}],\"name\":\"setBytes\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"i\",\"type\":\"int256\"},{\"name\":\"a\",\"type\":\"address[]\"},{\"name\":\"s\",\"type\":\"string\"}],\"name\":\"setValues\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"b\",\"type\":\"bytes1\"}],\"name\":\"getByBytes\",\"outputs\":[{\"name\":\"\",\"type\":\"bytes1[]\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_intV\",\"outputs\":[{\"name\":\"\",\"type\":\"int256\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"emptyArgs\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"name\":\"i\",\"type\":\"int256\"},{\"name\":\"s\",\"type\":\"string\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"a\",\"type\":\"uint256\"}],\"name\":\"LogIncrement\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"s\",\"type\":\"string\"}],\"name\":\"LogInit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"i\",\"type\":\"int256\"},{\"indexed\":false,\"name\":\"a\",\"type\":\"address[]\"},{\"indexed\":false,\"name\":\"s\",\"type\":\"string\"}],\"name\":\"LogSetValues\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"o\",\"type\":\"bytes\"},{\"indexed\":false,\"name\":\"b\",\"type\":\"bytes\"}],\"name\":\"LogSetBytes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"name\":\"o\",\"type\":\"uint256[2]\"},{\"indexed\":false,\"name\":\"n\",\"type\":\"uint256[2]\"}],\"name\":\"LogSetSArray\",\"type\":\"event\"}]"; + private static final String encoded = + "0x0000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000000147365742076616c75657320e5ad97e7aca6e4b8b2000000000000000000000000"; + + @Test + public void testDecode() { + ABICodec abiCodec = new ABICodec(Utils.getCryptoInterface()); + try { + List list = abiCodec.decodeEvent(abi, "LogSetValues", encoded); + Assert.assertEquals(list.size(), 3); + Assert.assertEquals(list.get(0).toString(), "20"); + Assert.assertEquals( + list.get(1).toString(), + "[0x0000000000000000000000000000000000000001, 0x0000000000000000000000000000000000000002, 0x0000000000000000000000000000000000000003]"); + System.out.println("decode event log content, " + list); + } catch (ABICodecException e) { + Assert.fail(e.getMessage()); + } + } +}