# \[KAS\] CaverExtKAS JAVA 스마트 컨트랙트 함수 Call 문의

**URL:** <https://devforum.kaia.io/t/kas-caverextkas-java-call/710>\
**Category:** KAS (아카이브)\
**Tags:** caver-java\
**Created:** [2월 25, 2021, 6:59오전 UTC](https://devforum.kaia.io/t/kas-caverextkas-java-call/710 "2021-02-25T06:59:14Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![keonlee93](https://avatars.discourse-cdn.com/v4/letter/k/e47774/32.png) [@keonlee93](https://devforum.kaia.io/u/keonlee93)\
**Post date:** [2월 25, 2021, 6:59오전 UTC](https://devforum.kaia.io/t/kas-caverextkas-java-call/710/1 "2021-02-25T06:59:14Z")

</div>

안녕하세요.  
CaverExtKAS JAVA 를 사용하여 배포 된 스마트 컨트랙트의 함수를 Call 하는방법을 문의드리려 합니다.

문의 드리고 싶은 내용은 총 세가지 입니다.

1. [caver-java-ext-kas 1.9.0-android javadoc (xyz.groundx.caver)](https://www.javadoc.io/doc/xyz.groundx.caver/caver-java-ext-kas/latest/index.html) 위의 CaverExtKAS JAVA 문서를 확인해 보면 “requestFDSmartContractExecutionPaidByUser” 를 사용해 스마트 컨트랙트에 요청을 보내게 되어있는데요. 해당 메소드 사용시 인자로 받는 “FDUserContractExecutionTransactionRequest” 의 클래스 내 Input 변수값으로 어떤값을 사용해야 되는지, 현재는 우선 Web3J 의 Function 객체를 FunctionEncoder로 인코딩 하여 변수값으로 사용 하고 있는데 이 사용법이 맞는지 궁금합니다.

2. “FDUserContractExecutionTransactionRequest” 의 파라미터 중 To 변수를 콜하고자 하는 Contract의 Address 로 설정하시면 되는지 궁금합니다.

3. 아래의 코드와 같이 “FDUserContractExecutionTransactionRequest” 의 To 변수를 Contract의 Address로, Feepayer 는 FeePayer 의 Address 값으로, Input 은 FunctionEncoder 를 사용한 인코딩 된 값으로, From 은 전송자의 Address로 서명하여 전송 한 결과 ApiEcxeption : Bad Request 를 받았습니다. 에러의 발생 원인을 알고 싶습니다. 코드는 아래 첨부하겠습니다.

CaverExtKAS caver = new CaverExtKAS();  
caver.initKASAPI(ChainId, “KASId”, “KasSecret”);

Function function = new Function(  
“testFunction”,  
Arrays.asList(  
new Uint256(1),  
new Utf8String(“1”),  
new Address(userAddress),  
),  
Collections.emptyList()  
);

String inputData = FunctionEncoder.encode(function);  
System.out.println(String.format("]-----] Function Encoder %s [-----[", inputData));

FDUserContractExecutionTransactionRequest request = new FDUserContractExecutionTransactionRequest();

request.setInput(inputData);  
request.setFeePayer(feeAddress);  
request.setFrom(userAddress);  
request.setTo(smartContractAddress);  
request.setFeeRatio(100L);  
request.setSubmit(true);

FDTransactionResult result = caver.kas.wallet.requestFDSmartContractExecutionPaidByUser(request);

감사합니다 😀

---

<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:** [2월 26, 2021, 12:43오전 UTC](https://devforum.kaia.io/t/kas-caverextkas-java-call/710/2 "2021-02-26T00:43:52Z")

</div>

안녕하세요. 클레이트 포럼에 질문을 주셔서 감사드립니다.

KAS를 통해 스마트 컨트랙트에 요청을 보내는 방법은 수수료 대납의 유무와 수수료 대납을 지원하는 종류에 따라 분류가 됩니다.

- 트랜잭션 수수료를 사용자가 직접 부담.
- 트랜잭션 수수료를 사용자가 설정한 Fee Payer가 부담.(PaidByUserFeePayer)
- 트랜잭션 수수료를 KAS에서 부담.(PaidByGlobalFeePayer)

[KAS tutorial](https://docs.klaytnapi.com/v/ko/tutorial/wallet-transaction-api/wallet-transaction-contract-execute)를 참고부탁드립니다.

1. Input값은 [Solidity ABI Specification - Function Selector And Argument Encoding](https://docs.soliditylang.org/en/v0.5.6/abi-spec.html#function-selector-and-argument-encoding)에 기반한 값을 넣으시면 됩니다. Web3J의 Function객체를 FunctionEncoder로 인코딩한 값을 사용하셔도 무관하나,  
Caver-java에서 제공되는 `com.klaytn.caver.contract 패키지`의 `Contract class`의 `encodeABI()` 활용하시면 편하게 Smart contract의 Input 값을 가지고 올 수 있습니다. 아래 이슈가 있는 코드를 예시로 들자면 아래와 같이 코드를 작성하시면 됩니다. CaverExtKAS는 Caver-java 라이브러리를 사용할 수 있습니다.

2. To 변수는 Contract address로 설정하시면 됩니다.

3. 알려주신 Error message만으로는 원인 분석을 하기가 어렵습니다. API 호출 시 error가 발생하는 부분을 try-catch문으로 감싸서 ApiException instance의 getResponseBody로 보다 자세한 error원인을 확인해주셔서 다시 댓글로 문의 부탁드리겠습니다.

감사합니다.

---

<div class="post-metadata">

**Author:** ![keonlee93](https://avatars.discourse-cdn.com/v4/letter/k/e47774/32.png) [@keonlee93](https://devforum.kaia.io/u/keonlee93)\
**Post date:** [2월 26, 2021, 1:44오전 UTC](https://devforum.kaia.io/t/kas-caverextkas-java-call/710/3 "2021-02-26T01:44:18Z")

</div>

답변 감사합니다 🙂 해당 코드로 진행해 보도록 하겠습니다.

---

<div class="post-metadata">

**Author:** ![keonlee93](https://avatars.discourse-cdn.com/v4/letter/k/e47774/32.png) [@keonlee93](https://devforum.kaia.io/u/keonlee93)\
**Post date:** [2월 26, 2021, 5:36오전 UTC](https://devforum.kaia.io/t/kas-caverextkas-java-call/710/4 "2021-02-26T05:36:50Z")

</div>

테스트가 늦어져 늦게 피드백 드리게 된 점 죄송하며,  
코드 테스트 도중 의문이 추가적으로 생겨 다시금 여쭈어보겠습니다.

ApiException으로 예외 처리 한 후 스마트컨트랙에 콜을 한 결과 총 두가지 에러를 확인하였습니다.

1. Request의 FeeRatio 변수의 값을 1~99 사이에서 지정해야 한다는 에러 메시지를 받았습니다. Delegation 계정이 99%가 아니라 100%로 Delegation을 할 수 있는 방법이 있는지 궁금합니다.

2. FeeRatio를 99L(Long Type 99)로 설정한 후 “1065100” 에러를 확인했습니다. Delegation 계정이 AMS에 등록되지 않아 발생하는 에러로 보이는데 Delegation 기능을 사용하기 위해서는 KAS에 계정을 등록한 후 등록된 계정으로 대납을 진행해야만 하는지 궁금합니다. 추가적으로 그래야 한다면 기존 Private Key나 KeyStore로 생성된 계정을 KAS에 Migration 하는 방법이 궁금합니다.

많은 질문 드려 번거롭게 해드려 죄송하며  
답변 기다리도록 하겠습니다.

감사합니다.

---

<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:** [2월 26, 2021, 6:46오전 UTC](https://devforum.kaia.io/t/kas-caverextkas-java-call/710/5 "2021-02-26T06:46:40Z")

</div>

안녕하세요.

KAS SDK는 기본적으로 KAS에서 제공해주는 REST API를 각 Programming Language SDK형태로 가공하여 제공하고 있습니다. 그러므로 KAS에서 제공해주는 각 API Reference 문서를 참고하시면 많은 도움이 되실거라고 생각합니다. 🙂

1. FeeRatio 필드를 셋팅하지않거나 0으로 셋팅하면 100%의 fee delegation을 할 수 있습니다. [Wallet API의 문서](https://refs.klaytnapi.com/ko/wallet/latest#operation/UFDContractExecutionTransaction)를 참고 부탁드립니다.

2. Account Migration하실 필요없이, [KAS Docs - Getting started : 클레이튼 계정 생성](https://docs.klaytnapi.com/v/ko/getting-started/account#getting-started-account-createfp)의 문서를 참고하시어 수수료 대납 계정을 생성하신 후, 생성된 수수료 대납 계정의 address로 Klay를 전송한 뒤(수수료 대납을 위한) 사용해주시면 됩니다.

감사합니다.

---

<div class="post-metadata">

**Author:** ![keonlee93](https://avatars.discourse-cdn.com/v4/letter/k/e47774/32.png) [@keonlee93](https://devforum.kaia.io/u/keonlee93)\
**Post date:** [2월 26, 2021, 7:41오전 UTC](https://devforum.kaia.io/t/kas-caverextkas-java-call/710/6 "2021-02-26T07:41:57Z")

</div>

이슈 해결하였습니다.

답변주셔 감사합니다. 🙂
