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

**URL:** <https://devforum.kaia.io/t/caver-java-ext-kip7/1077>\
**Category:** KAS (아카이브)\
**Tags:** caver-java\
**Created:** [4월 30, 2021, 1:48오후 UTC](https://devforum.kaia.io/t/caver-java-ext-kip7/1077 "2021-04-30T13:48:45Z")\
**Posts on this page:** 3\
**Page:** 1

<div class="post-metadata">

**Author:** ![Bong\_Kim](https://yyz1.discourse-cdn.com/flex035/user_avatar/devforum.kaia.io/bong_kim/32/445_2.png) [@Bong\_Kim](https://devforum.kaia.io/u/Bong_Kim)\
**Post date:** [4월 30, 2021, 1:48오후 UTC](https://devforum.kaia.io/t/caver-java-ext-kip7/1077/1 "2021-04-30T13:48:45Z")

</div>

안녕하세요.

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가 문제 있어서 안되는 것일까 추측해보는데요…  
그 외에는 무엇이 잘못되었는지 예상이 잘 안되는 상황입니다 ㅠ…  
코드상의 문제인지 혹시 놓치거나 실수한 부분이 있는지 여쭤봅니다.

감사합니다.

---

<div class="post-metadata">

**Author:** ![Kale](https://yyz1.discourse-cdn.com/flex035/user_avatar/devforum.kaia.io/kale/32/148_2.png) [@Kale](https://devforum.kaia.io/u/Kale)\
**Post date:** [5월 3, 2021, 12:34오전 UTC](https://devforum.kaia.io/t/caver-java-ext-kip7/1077/2 "2021-05-03T00:34:44Z")

</div>

안녕하세요.  
죄송하지만 조회하시고자 하는 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;
    }
}
```

---

<div class="post-metadata">

**Author:** ![Bong\_Kim](https://yyz1.discourse-cdn.com/flex035/user_avatar/devforum.kaia.io/bong_kim/32/445_2.png) [@Bong\_Kim](https://devforum.kaia.io/u/Bong_Kim)\
**Post date:** [5월 3, 2021, 8:29오전 UTC](https://devforum.kaia.io/t/caver-java-ext-kip7/1077/3 "2021-05-03T08:29:06Z")

</div>

> [@Kale](#):
>
> caver-java-ext-kas

친절한 답변 감사합니다.

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

contractAddress : 0xf32bdb6ebac0e0a80ed01fee5298d9f05338b85e  
accountAddress : 0xBf1050F0b2a8e6D9f63Da323eB79B0F73CF4034e

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

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

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

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

감사합니다.
