Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Generated Contract Error: Cannot cast from List to byte[] #1994

Open
0xPuddi opened this issue Jan 2, 2024 · 0 comments
Open

Generated Contract Error: Cannot cast from List to byte[] #1994

0xPuddi opened this issue Jan 2, 2024 · 0 comments
Labels
bug A bug in behaviour or functionality

Comments

@0xPuddi
Copy link

0xPuddi commented Jan 2, 2024

After generating a contract from the abi and bin the class has a casting error.

  • Web3j version: CLI 1.5.0, web3j 4.9.8
  • Java version: 17.0.9
  • Operating System: MacOS M2

The contract is probably trying to parse this solidity event:

event GameEnded(bytes32 indexed gameId, bytes32[] indexed winners, uint256 time);

And it is having an hard time to convert the array of bytes32.
This is the code where the error:

Cannot cast from List to byte[]Java(16777372)
List org.web3j.abi.datatypes.Array.getNativeValueCopy()

occurs at lines:

typedResponse.winners = (byte[]) ((Array) eventValues.getIndexedValues().get(1)).getNativeValueCopy();

and

typedResponse.winners = (byte[]) ((Array) eventValues.getIndexedValues().get(1)).getNativeValueCopy();
    public static List<GameEndedEventResponse> getGameEndedEvents(TransactionReceipt transactionReceipt) {
        List<Contract.EventValuesWithLog> valueList = staticExtractEventParametersWithLog(GAMEENDED_EVENT,
                transactionReceipt);
        ArrayList<GameEndedEventResponse> responses = new ArrayList<GameEndedEventResponse>(valueList.size());
        for (Contract.EventValuesWithLog eventValues : valueList) {
            GameEndedEventResponse typedResponse = new GameEndedEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.gameId = (byte[]) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.winners = (byte[]) ((Array) eventValues.getIndexedValues().get(1)).getNativeValueCopy();

            typedResponse.time = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }
    public static List<GameEndedEventResponse> getGameEndedEvents(TransactionReceipt transactionReceipt) {
        List<Contract.EventValuesWithLog> valueList = staticExtractEventParametersWithLog(GAMEENDED_EVENT,
                transactionReceipt);
        ArrayList<GameEndedEventResponse> responses = new ArrayList<GameEndedEventResponse>(valueList.size());
        for (Contract.EventValuesWithLog eventValues : valueList) {
            GameEndedEventResponse typedResponse = new GameEndedEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.gameId = (byte[]) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.winners = (byte[]) ((Array) eventValues.getIndexedValues().get(1)).getNativeValueCopy();

            typedResponse.time = (BigInteger) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

it can be solved by writing it like the byte32 gameId event but I think that it get only one value of the array.

typedResponse.winners = (byte[]) eventValues.getIndexedValues().get(1).getValue();

Hope this is just a quick simple error, thank you for your time.

@0xPuddi 0xPuddi added the bug A bug in behaviour or functionality label Jan 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug A bug in behaviour or functionality
Projects
None yet
Development

No branches or pull requests

1 participant