KAS로 Transfer할 때

안녕하세요 caver-js로 코드 구현을 하고 있는데 어려움이 생겨 질문 남깁니다.

1. IDE로 Deploy한 스마트 컨트랙으로 1000 토큰을 초기 발행하고, A와 B 계정에 각각 토큰을 보내주려면 transfer함수를 쓰는거잖아요?
그때 caver.kas.에서 어떤 함수를 써야 되나요? 예시를 들어 주시면 감사합니다.

2. 받은 토큰을 A 지갑에서 B지갑으로 보낼 때도 위에서 썼던 동일한 transfer함수를 쓰나요?

3. 보유한 토큰을 원화나 달러로 출금하려면 어떤 함수가 필요할까요?

4. caver-js에서 caver.kas.wallet.~과 caver.klay.~과는 사용이 전혀 다른가요?
알기로는 kas에서 생성한 계정만 kas API에 이용할 수 있다고 하는데, caver.klay.sendTransaction()과 같은 함수에는 사용이 가능하더라고요.

답변 부탁드립니다^^

안녕하세요 :slight_smile:
KAS에 대한 문의를 주셨기 때문에 caver-js-ext-kas를 사용한다고 가정하고 답변드리겠습니다.

KAS Wallet API를 사용하고 계신 경우, caver.kas.wallet.requestSmartContractExecution을 사용하실 수 있습니다.
KAS를 통해 caver.kct.kip7을 사용하고 싶으신 경우, caver-js-ext-kas에서 제공되는 caver.kct.kip7기존의 caver-js의 kip7.transfer의 사용성 그대로 사용하면 내부적으로 KAS Wallet API 서비스에서 관리되는 계정을 사용하여 트랜잭션을 실행합니다.
또한 KAS를 통해 caver.contract를 사용하여 실행하고 싶으신 경우에도 기존의 caver-js의 caver.contract 사용성과 동일하게 해주시면 됩니다.

어떤 스마트 컨트랙트를 배포하셨는지 제가 질문상으로 정확히 알기 어려우므로 정확한 답변은 드릴 수 없습니다. 하지만 KIP-7 표준을 준수하는 스마트 컨트랙트를 배포하신 경우 transfer 함수를 사용하여 토큰을 전송할 수 있습니다.

KIP-7에서 해당 기능과 관련된 표준은 제공되지 않습니다.

caver-js-ext-kas의 caver.kas.wallet은 KAS Wallet API를 사용할 수 있도록 제공되는 기능입니다. 그리고 caver.klay는 Node API를 사용할 수 있는 기능으로 caver.rpc.klay와 동일합니다. 제공되는 기능이 전혀 다릅니다. KAS에서도 일부 Node API가 사용될 수 있도록 제공됩니다.

답변 감사합니다.

caver-js-ext-kas를 사용하고 IDE에서 KIP7으로 스마트 컨트랙 발행했습니다.

  1. 아래 부분에서 from은 스마트컨트랙 지갑 주소를 쓰는게 맞나요?
    지갑 주소를 쓰든 계정 주소를 쓰든 아래와 같은 에러가 나옵니다.
    왜그런걸까요?

image


async function requestValueTransfer(){
	const tx = {
		from : '스마트컨트랙지갑주소',
		to: receiver.address,
		value : 100000000000000000,
		gas: 250000,
		memo: 'requestValueTransfer(tx) Test',
		submit: true
	}

	try{
		const result = await caver.kas.wallet.requestValueTransfer(tx)
		console.log(result)	

	}catch(err){
		console.log('error',err)
	}
}
  1. "지갑에 있는 토큰 → A계정으로 보내는 함수"랑 "A계정 → B계정으로 토큰 보내는 함수"가 다른가요?

  2. kip7.transfer를 이용해보는데요. 아래 transfer함수에 들어갈 인자에 배포할 때 연결한 계정 주소가 from에 들어가야 되고 (KAS가 아닌 wallet.com에서 만든겁니다), 중간에 들어간 숫자(1)는 Klay가 아닌 Token이고 싶은데 저렇게 해도 되나요?


async function transferContract(){
	const smartContractAddress = 'IDE에서배포한주소';
	const kip7 = new caver.kct.kip7(smartContractAddress)

	const receipt = await kip7.transfer(receiver.address, 1, { from : sender.address})
	console.log('receipt: ',receipt)	
}

transferContract();
  1. kip7.transfer의 from에 들어가는 계정을 KAS에서 만든거로 했더니 gas error가 뜨네요.

스마트 컨트랙트를 실행하시려면 위에 말씀드렸다시피 caver.kas.wallet.requestValueTransfer가 아니라 caver.kas.wallet.requestSmartContractExecution를 사용하셔야 합니다. requestValueTransfer는 KLAY를 전송할 때에 사용되는 트랜잭션입니다. 스마트 컨트랙트로 배포된 KIP-7 토큰을 전송하기 위해서는 requestSmartContractExecution를 사용해야 합니다.

또한 해당 트랜잭션 input에 들어가는 스트링은 caver.abi.encodeFunctionCall을 사용하여 따로 구하셔야 합니다. 이 부분이 번거롭다면 kip7.transfer를 사용할 수 있습니다.

위에 올려주신 예제는 처음 트랜잭션 타입부터 사용하는 함수까지 다 잘못되었습니다.
위에 말씀드린 문서 참고해 주세요.

그리고 두 번째 질문에서는 지갑에 있는 토큰과 A계정이 어떤 차이점이 있는 건지 설명 부탁드립니다.
지갑에 계정이 있고 이를 다른 계정으로 토큰을 보내는 함수는 동일합니다.

KAS wallet에 있는 계정이 아닐 경우에는 따로 키링을 보관하는 KeyringContainer 인스턴스를 생성해서 사용해야 합니다. 방법은 여기를 참고해 주세요.

from 계정이 전송할 수 있는 토큰을 소유하고 있는지 확인 부탁드립니다.

답변을 보다 보니 제가 잘못 이해한 부분이 있었네요.

이렇게 질문한 이유는… KIP7Token.sol로 초기 발행을 하면 totalSupply : 100만 DTK가 스마트 컨트랙에 생긴다고 생각을 했어요.
그게 아니라 Smart Contract을 발행한 Account Address(Owner) 에 Token Balance로 잡히게 되는거죠?
그래서 토큰을 다른 A, B, C와 같은 지갑에 뿌려주려면 Owner가 Smart Contract에 구현한 transfer함수를 갖고 보내주게 되는거고요?

하나 더 질문있습니다.
from계정이 token을 소유하고 있는데도 gas required exceeds allowance or always failed가 나오는데요. 스마트 컨트랙을 만들 때 연결했던 계정이 아니면 다 저렇게 나오는건가요?

네네 말씀해 주신대로 Smart Contract를 발행한 계정이 처음 발행한 개수를 소유하고 있으며, 해당 계정을 사용하여 다른 A, B, C 계정으로 전송하시면 됩니다.

해당 에러는 실행하다가 실패하게 되면 플랫폼에서 던져주는 에러 메세지입니다. 토큰을 소유하고 있으며 트랜잭션 전송에 필요한 KLAY도 소유하고 있어야 합니다.

그럼 답변주신대로 스마트 컨트랙의 오너가 아니더라도 클레이와 토큰 모두 있다면 전송이 가능해야 된다는건데, 제가 사용하는 계정들이 다 Klay, 토큰을 보유하고 있는데도 안되는 이유는 뭘까요??

저 에러메세지만 봐서는 이유를 특정해서 말씀드리기가 어렵습니다.

혹시 { from: '0x{address in hex}', gas: 3000000 } 이런식으로 gas limit을 높게 세팅해서 실행하셔도 그럴까요?
만약 가스값을 올려도 계속 동일한 에러가 난다면 debug api를 사용해서 디버깅해 보셔야 합니다.