안녕하세요. 몇가지 질문이 있습니다.
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 예제코드 있으면 알려주시면 감사하겠습니다~
감사합니다.
안녕하세요, 클레이튼 포럼에 질문을 올려주셔서 감사드립니다.
-
Basic transaction은 대납 트랜잭션들과는 다르게 트랜잭션의 송신자가 트랜잭션 수수료를 부담하게 됩니다.
Paid by KAS는 KAS의 대납 계정에서 수수료를 부담하고, Paid by User는 사용자가 지정한 계정에서 수수료를 부담하게 됩니다.
-
네 현재는 KIP-7 API에서 유저 대납방식을 제공하지는 않습니다. 하지만 Wallet API의 /v2/tx/fd-user/contract/execute를 이용하여 유저 대납 기능을 이용하실 수 있을 것 같습니다.
-
예제에 대해서는 따로 공유드릴 수 있도록 하겠습니다.
감사합니다.
Kale
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,
현재 해당 내용에 대해서는 내부적으로 논의 진행중입니다.
관련해서 확정된게 있으면 추가로 댓글 남기겠습니다. 감사합니다.