Caver-java-ext 사용하여 KIP7 잔액 조회

안녕하세요.

caver-java-ext 사용하여 KIP7 잔액 조회를 구현하다가 문의사항이 생겨 질문드립니다.

현재 KAS 에서는 아직 KIP7을 위한 인터페이스는 개발중이라고 알고 있어서 직접 토큰 조회를 구현중에 있습니다.
node(caver-js-ext)에서는 KIP7 토큰의 잔액 조회 구현이 간단했습니다.

let caver = new CaverExtKAS(chainId, accessKeyId, secretAccessKey);
let contract = new caver.klay.Contract(ABI, contractAddress);
let balance = await contract.methods.balanceOf(fromAddress).call();

위 코드와 같이 CaverExtKAS 객체를 만들어 주고 DefaultABI로 컨트랙트 객체 생성 후,
balanceOf method를 호출하면 토큰 잔액이 정상적으로 조회됩니다.

java에서는 caver-java-ext 라이브러리만 사용하기에는 여의치 않아 caver-core 라이브러리도 함께 사용했습니다만,
따로 클레이튼 메인넷 EN을 따로 운영하고 있지 않기에, RPC를 직접 사용하는 caver-core는 사용이 어려울 것 같고,
가능한 KAS와 caver-java-ext 라이브러리에서 제공되는 인터페이스만 이용하여 기본적인 기능을 구현해보는 것을 테스트해보고 있습니다.

일단 java에서의 KIP7에 대한 조회는 다음과 같이 구현하였습니다.

CaverExtKAS caver = CaverExtKAS.initKASAPI(chainId, accessKeyId, secretAccessKey);
// for 'balanceOf' function encode
Function function = StandardKIP7ContractFunctions.balanceOf(owner);

CallObject obj = CallObject.createCallObject();
obj.setTo(contractAddress);
obj.setData(FunctionEncoder.encode(function));

Response<String> response = caver.rpc.klay.call(obj).send();
List<Type> decoded = FunctionReturnDecoder.decode(response.getResult(), function.getOutputParameters());

CallObject obj는 다음과 같습니다.

obj = {com.klaytn.caver.methods.request.CallObject@12510} 
 from = null
 // contractAddress
 to = "0xf32..................................................." 
 gasLimit = null
 gasPrice = null
 value = null
 // 'balanceOf' + 0 pad + ownerAddress
 data = "0x70a08231000000000000000000000000bf.............................."

curl로도 baobab public EN으로 호출도 시도했습니다.

curl -X POST --data '{"jsonrpc":"2.0","method":"klay_call","params":[{"to": "0xf32...............", "data":"0x70a08231000000000000000000000000bf........................"}, "latest"],"id":67}' -H "Content-Type: application/json" https://api.baobab.klaytn.net:8651/

response 결과는 다음과 같이 0로 조회됩니다.

{"jsonrpc":"2.0","id":67,"result":"0x0000000000000000000000000000000000000000000000000000000000000000"}

제가 생각하기엔 encoded된 data hex가 문제 있어서 안되는 것일까 추측해보는데요…
그 외에는 무엇이 잘못되었는지 예상이 잘 안되는 상황입니다 ㅠ…
코드상의 문제인지 혹시 놓치거나 실수한 부분이 있는지 여쭤봅니다.

감사합니다.

안녕하세요.
죄송하지만 조회하시고자 하는 contract address와 account가 없어서 제공해주신 정보로는 어떤부분이 문제가 있는 것인지 확인하기가 어렵습니다.

caver-java-ext-kas는 caver-java의 기능을 기본으로 깔아두고, 추가로 KAS API의 기능을 제공해주는 것을 목표로 하고 있습니다.
그러므로 KAS 서비스에서 제공해주는 EN과 caver-java의 caver.kct.KIP7 class를 조합하여 사용하시면 쉽게 token의 balance를 조회하실 수 있습니다.

아래 코드는 caver-java-ext-kas v1.1.1-rc.2를 사용하였습니다.
참고 부탁드립니다.

package com.klaytn.caver.boilerplate;


import com.klaytn.caver.kct.kip7.KIP7;
import xyz.groundx.caver_ext_kas.CaverExtKAS;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;

public class BoilerPlateKAS {
    // Configuration Part
    // Set your KAS access key and secretAccessKey.
    static String accessKey = "";
    static String secretAccessKey = "";

    // static String CHAIN_ID_BAOBOB = "1001";
    // static String CHAIN_ID_CYPRESS = "8217";
    static String chainId = "1001";

    public static void main(String[] args) throws IOException, ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        CaverExtKAS caverExtKAS = setCaverExtKAS(accessKey, secretAccessKey, chainId);

        test(caverExtKAS);
    }

    public static void test(CaverExtKAS caver) throws IOException, ClassNotFoundException, InvocationTargetException, NoSuchMethodException, InstantiationException, IllegalAccessException {
        String contractAddress = "0x{contractAddress}";

        KIP7 kip7 = new KIP7(caver, contractAddress);
        System.out.println(kip7.balanceOf("0x{account address}"));

    }


    private static CaverExtKAS setCaverExtKAS(String accessKey, String secretAccessKey, String chainID) {
        CaverExtKAS caverExtKAS = new CaverExtKAS(chainID, accessKey, secretAccessKey);
        return caverExtKAS;
    }
}

친절한 답변 감사합니다.

사용되는 주소는 혹시 가려야 하나 해서 제가 일부러 가려서 올렸는데 죄송합니다.

contractAddress : 0xf32bdb6ebac0e0a80ed01fee5298d9f05338b85e
accountAddress : 0xBf1050F0b2a8e6D9f63Da323eB79B0F73CF4034e

일단 해당 오류의 원인은 제가 account address를 메인넷 주소로 잘못 입력한 것이 원인이었습니다 ㅠ

제가 가진 테스트넷과 주소가 비슷하게 생겨서 제가 혼란이 생겼던 것 같습니다…

그리고 caver-java-ext-kas 버전을 v1.1.0 → v1.1.1-rc.2 교체하였고

답변으로 가이드 주신 코드 확인하였고, 덕분에 기존 작성한 코드도 더 간결하게 되었습니다.

감사합니다.