androidkotlinweb3-javaerc721

How to call tokenURI() function in ERC721 using Web3j library?


I need to view NFT-image with all metadata. I decide to call tokenURI() function like it, but it's ain't working

private fun getNFTMetadata() = viewModelScope.launch(Dispatchers.IO){
    //tokenURI  -- by token ID
    val web3j: Web3j = createWeb3j() ?: return@launch

    var ids = listOf<Uint256>(Uint256.DEFAULT)

    val function: org.web3j.abi.datatypes.Function = org.web3j.abi.datatypes.Function(
        "tokenURI",
        ids,
        listOf()
    )

    val encodedFunction = FunctionEncoder.encode(function)
    val response: EthCall = web3j.ethCall(
        Transaction.createEthCallTransaction(WALLET_ADDRESS, CONTRACT_ADDRESS, encodedFunction),
        LATEST
    ).sendAsync().get()

    if (response.value != null){
        state.value = response.value
    } else {
        state.value = "NAN"
    }
}

private fun createWeb3j(): Web3j? {
    val webSocketService = WebSocketService(WEB_SOCKET_URL, true)
    try {
        webSocketService.connect()
    } catch (e: ConnectException) {
        e.printStackTrace()
    }
    return Web3j.build(webSocketService)
}

I really don't know how to call that function rightly. Help me please!)


Solution

  • I found my mistake. I had change received parameters.

        private fun getNFTMetadata() = viewModelScope.launch(Dispatchers.IO){
        //tokenURI  -- by token ID
        val web3j: Web3j = createWeb3j() ?: return@launch
    
        val big: Uint256 = Uint256(1)
    
        val function: org.web3j.abi.datatypes.Function = org.web3j.abi.datatypes.Function(
            "tokenURI",
            listOf(big),
            listOf(object : TypeReference<Utf8String>() {})
        )
    
        val encodedFunction = FunctionEncoder.encode(function)
        val response: EthCall = web3j.ethCall(
            Transaction.createEthCallTransaction(WALLET_ADDRESS, CONTRACT_ADDRESS, encodedFunction),
            LATEST
        ).sendAsync().get()
    
        if (response.value != null){
    
            state.value = response.value
        } else {
            state.value = "NAN"
        }
    }