Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
115 changes: 9 additions & 106 deletions src/main/java/org/fisco/bcos/sdk/abi/ABICodec.java
Original file line number Diff line number Diff line change
Expand Up @@ -199,107 +199,6 @@ public String encodeMethodByInterfaceFromString(
return encodeMethodByIdFromString(ABI, methodId, params);
}

public String encodeEvent(String ABI, String eventName, List<Object> params)
throws ABICodecException {
ContractABIDefinition contractABIDefinition = abiDefinitionFactory.loadABI(ABI);
List<ABIDefinition> 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<Object> 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<Object> params)
throws ABICodecException {
return null;
}

public String encodeEventFromString(String ABI, String eventName, List<String> params)
throws ABICodecException {
ContractABIDefinition contractABIDefinition = abiDefinitionFactory.loadABI(ABI);
List<ABIDefinition> 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<String> 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<String> params)
throws ABICodecException {
return null;
}

public List<Object> decodeMethod(ABIDefinition abiDefinition, String output)
throws ABICodecException {
ABIObject outputABIObject = abiObjectFactory.createOutputObject(abiDefinition);
Expand Down Expand Up @@ -463,9 +362,11 @@ public List<Object> decodeEventByTopic(String ABI, String eventTopic, String out
throw new ABICodecException(errorMsg);
}

public List<Object> decodeEventByInterface(String eventSignature, String output)
public List<Object> 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<String> decodeEventToString(String ABI, String eventName, String output)
Expand Down Expand Up @@ -513,8 +414,10 @@ public List<String> decodeEventByTopicToString(String ABI, String eventTopic, St
throw new ABICodecException(errorMsg);
}

public List<String> decodeEventByInterfaceToString(String eventSignature, String output)
throws ABICodecException {
return null;
public List<String> decodeEventByInterfaceToString(
String ABI, String eventSignature, String output) throws ABICodecException {
FunctionEncoder functionEncoder = new FunctionEncoder(cryptoInterface);
String methodId = functionEncoder.buildMethodId(eventSignature);
return decodeEventByTopicToString(ABI, methodId, output);
}
}
30 changes: 30 additions & 0 deletions src/test/java/org/fisco/bcos/sdk/test/abi/ABIEventTest.java
Original file line number Diff line number Diff line change
@@ -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<Object> 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());
}
}
}