KAS Wallet REST API 명세에서 basic transaction 문의

안녕하세요. 몇가지 질문이 있습니다.

KAS Wallet REST API 명세서를 보면

Basic Transaction
Fee Delegated Transaction (Paid by KAS)
Fee Delegated Transaction (Paid by User)

가 있는데요. Paid by KAS 와 Paid by User 는 명확해서 차이를 알겠는데

Paid by KAS / Paid by User 들과 Basic Transaction 과의 차이는 무엇인지요?

그리고 KAS KIP-7 REST API 중 KIP-7 토큰 전송

https://kip7-api.klaytnapi.com/v1/contract/{contract-address-or-alias}/transfer

는 gas 는 자동으로 글로벌대납인가요? 그렇다면 KIP-7 REST API 로는 유저 대납 방식은 사용할 수 없는것인가요?

caver-java-ext-kas 에서는 아직 kip-7 이 구현안된걸로 알고 있습니다.

해서 아래와 같이

CaverExtKAS caver = new CaverExtKAS();
caver.initKASAPI(chainId, apiKey, apiSecret);
KIP7 kip7 = new KIP7(caver, contractAddress);
.
.
.
kip7.transfer(recipient, amount);

로 전송 테스트를 해보는데

java.io.IOException: gas required exceeds allowance or always failing transaction 에러가 발생합니다.

kip7 글로벌대납과 유저대납 java 예제코드 있으면 알려주시면 감사하겠습니다~

감사합니다.

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

  1. Basic transaction은 대납 트랜잭션들과는 다르게 트랜잭션의 송신자가 트랜잭션 수수료를 부담하게 됩니다.
    Paid by KAS는 KAS의 대납 계정에서 수수료를 부담하고, Paid by User는 사용자가 지정한 계정에서 수수료를 부담하게 됩니다.

  2. 네 현재는 KIP-7 API에서 유저 대납방식을 제공하지는 않습니다. 하지만 Wallet API의 /v2/tx/fd-user/contract/execute를 이용하여 유저 대납 기능을 이용하실 수 있을 것 같습니다.

  3. 예제에 대해서는 따로 공유드릴 수 있도록 하겠습니다.

감사합니다.

안녕하세요.
위 코드에서 에러가 나는 이유는 SendOptions가 정의되지 않았기 때문인데요.
이 함수를 통해 SendOptions instance를 정의하고 사용해보시길 바랍니다.

kip7 글로벌 대납과 유저대납 코드는 아래와 같습니다.

from의 address는 KAS의 account를 사용하셔야 하고, contract에서 발행된 token을 가지고 있어야합니다.

글로벌 대납

        String contractAddress = "0x{contractAddress}";
        String from = "";
        String recipient = "";
        String amount = "";

        KIP7 kip7 = new KIP7(caver);

        FDContractExecutionTransactionRequest globalRequest = new FDContractExecutionTransactionRequest();
        globalRequest.setFrom(from);
        globalRequest.setTo(contractAddress);
        globalRequest.setInput(kip7.encodeABI("transfer", recipient, amount));
        globalRequest.setSubmit(true);
        FDTransactionResult globalFdResult = caver.kas.wallet.requestFDSmartContractExecutionPaidByGlobalFeePayer(globalRequest);

유저 대납

        String contractAddress = "0x{contractAddress}";
        String from = "";
        String recipient = "";
        String amount = "";

        KIP7 kip7 = new KIP7(caver);

        FDContractExecutionTransactionRequest userRequest = new FDContractExecutionTransactionRequest();
        userRequest.setFrom(from);
        userRequest.setTo(contractAddress);
        userRequest.setInput(kip7.encodeABI("transfer", recipient, amount));
        userRequest.setSubmit(true);
        caver.kas.wallet.requestFDSmartContractExecutionPaidByUser(userRequest);

        TransactionReceipt userFDReceipt = caver.kas.wallet.getTransaction(globalFdResult.getTransactionHash());

안녕하세요. 아래와 같이 해보았는데요. Bad Request 가 발생합니다. 에러코드는 아래와 같습니다.

{“code”:1065100,“message”:“failed to get an account; data don’t exist”,“requestId”:“67d25fd8-b47c-4b76-93e8-1c75aa3a6cf4”}

계정관련 에러인데 계정은 전부 유효하다 생각되서 뭐가 문제 인지 모르겠습니다. 도움 부탁드려요~

참고로 토큰컨트랙트는 KAS Console 에서 생성했고, 계정 또한 KAS Console 에서 Account-Pools, Fee-payer Pools 에서 생성했습니다.

from 계정은 토큰컨트랙트를 KAS Console 에서 생성하면 자동으로 생긴 컨트랙트 배포 기본 계정입니다.

recipient 는 Account-Pools 에서 생성한것이구요. Account-Pools 에서 생성한 계정끼리의 전송은 사용자대납사용하여 정상적으로 됩니다.

요약하면 컨트랙트 배포 기본 계정에서 사용자대납하여 전송시 에러가 발생하는 케이스에요. 아래 방식으로는 글로벌 대납도 안되는거 같습니다. 컨트랙트 배포 기본 계정을 인식못하네요.

/v1/contract/{contract-address-or-alias}/transfer REST API 로는 컨트랙트 배포 기본 계정으로 토큰전송 확인했구요.

CaverExtKAS caver = new CaverExtKAS();
caver.initKASAPI("1001", apikey, secret);

String contractAddress = "0x8b97bfdef6c210301414a2e18eb0077aa1b6ae61";
String from = "0xd8158fdf0350007662beaab05c139b2a23399764";
String recipient = "0x6d3BB710E8807aEDdE363176729f638ACB56EB9a";
String feepayerAddress = "0x92173876B12916d698cC4629ad2990123A13a1f7";
BigInteger amount = BigInteger.valueOf(100).multiply(BigInteger.TEN.pow(10));;

KIP7 kip7 = new KIP7(caver, contractAddress);

FDUserContractExecutionTransactionRequest request = new FDUserContractExecutionTransactionRequest();
request.setFrom(from);
request.setTo(contractAddress);
request.setInput(kip7.encodeABI("transfer", recipient, "0x" + amount.toString(16)));
request.setGas(1000000L);
request.setSubmit(true);
request.setFeePayer(feepayerAddress);

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

안녕하세요 KAS 개발팀입니다.

현재 KAS KIP-7 API를 통해서 컨트랙트를 배포할 경우 문의하신 대로 배포 기본 계정(Deployer) 계정을 이용합니다.
해당 Deployer 계정으로 KAS Wallet API의 트랜잭션 서명 및 전송 요청은 현재 지원하지 않습니다.

Caver SDK에 미리 컴파일 된 바이트코드와 KAS Wallet Account-Pools의 EOA 계정으로 KIP-7 컨트랙트 배포 후
@Kale이 주신 예제를 실행하시면 될 것 같습니다.

추가 질문이 있으시면 댓글로 질문 부탁드립니다. 감사합니다.

빠른 답변 감사합니다~

KAS KIP-7 API 에서 대납 전송 기능은 앞으로도 지원하지 않는 기능일까요? 지원예정이라면 일정을 알고 싶습니다.

앞으로도 지원불가라면 가이드주신데로 KAS Wallet Account-Pools의 EOA 계정으로 KIP-7 컨트랙트를 배포해야겠네요.

그리고 KAS Wallet Account-Pools의 EOA 계정으로 KIP-7 컨트랙트를 배포하더라도 추후 대납지원된다면 KAS KIP-7 API 를 통해서 전송도 가능한게 맞겠지요?

안녕하세요 @seungbaek.lee,
현재 해당 내용에 대해서는 내부적으로 논의 진행중입니다.
관련해서 확정된게 있으면 추가로 댓글 남기겠습니다. 감사합니다.