토큰 전송시 amount 소수점 16진수 처리

php로 웹페이지에서 토큰을 전송 할 수 있는 페이지를 만들고 있습니다.

https://refs.klaytnapi.com/ko/kip7/latest#operation/TransferToken

여기보면 amount는 16진수로 입력하라고해서 dechex를 이용해 변환시켜주고 있습니다.

그런데 amount에 정수 10이나 100이 아닌 10.234 같은 소수는 어떻게 변환시켜서 넣어줘야 되나요?

@kujira.no.12

안녕하세요.
우선 decimal 이라는 개념을 먼저 확인해보셔야 합니다.

일반적으로 KIP-7을 따르는 토큰이라면 decimal이 18로 설정이 되어있는데요, 이 말인 즉슨 우리가 토큰 2개를 전송한다고 했을 때 실제 값으로는 2 * 10 ^ 18 을 값으로 입력해주셔야 한다는 뜻입니다.

FT 전송시 Decimal 처리 질문입니다 - Denver님의 글 #2 글을 참고하셔서 decimal 을 고려한 수식을 코드에 넣으시면 될 거 같습니다 :slight_smile:

수량은 매우 중요한 값이니 충분히 테스트하고 적용하시길 바랍니다.

답변 감사합니다…
알려주신대로 토큰 발행시 설정한 demicals대로 0을 붙혀 16진수로 변환하였습니다…
제가 발행한 토큰은 demicals를 8로 설정하여 1개를 전송할때 100000000의 16진수인
0x5f5e100 이 입력되도록 하였습니다…
그런데 리턴은 수량이 부족하다는 리턴이 오네요;;;;;;

@kujira.no.12

해당 에러는 트랜잭션 실행을 위해 필요한 KLAY 잔고가 없을 때 발생하는 에러입니다.

CypressBaobab 에 from에 기재된 0x64AD6e32a1EF4B355E85Ca7a12BC2139dFE0BF8a 를 확인해보니 둘 다 Balance 가 0 KLAY 네요.

블록체인에서 트랜잭션(상태변경)을 발생시키려면 KLAY 가 필요합니다.


amount를 demicals를 적용하지 않은채로 위와 같이 0x10을 전송시키니
정상적으로 전송이 됩니다…10이 아닌 10.123같은 소수를 전송하는 방법은
10.234 X 10 ^ 8 을 16진수로 변경하면 되는건가요??

@kujira.no.12

아 정정드립니다.
수수료 대납 트랜잭션을 사용하신다면, from 에 기재된 주소에 KLAY 가 없어도 됩니다.
다만, 수수료를 대신 지불해주는 계정에 KLAY 가 있어야 합니다.

말씀하신 것처럼 이 부분에 대한 문제는 아니네요.
아래와 같이 확인해보니 가지고 계신 토큰의 잔고가 0xc5 인데 전송하려는 수량은 이것보다 많아서 발생한 문제입니다.

 curl https://kip7-api.klaytnapi.com/v1/contract/0x28bd75b096981b49ea1fd95ce3b242a945f822c3/account/0x64AD6e32a1EF4B355E85Ca7a12BC2139dFE0BF8a/balance \
--header "x-chain-id: 8217" \
-u <BASIC_AUTH>
{"balance":"0xc5","decimals":8}

네…위에 설명해주신대로 만일 1개의 토큰을 전송하고자 하면 발행한 토큰의 demicals를
적용하여(제가 발행한 코인은 8) 100000000의 16진수 0x5f5e100를 입력해라 라는 것으로
저는 이해를 했습니다. 해서 amount에 0x5f5e100를 입력해서 api를 호출하니 insufficient balance 를
리턴받았습니다…제가 잘못 이해한것인가요??

@kujira.no.12

토큰을 전송하고자 하는 주소의 토큰 잔고가 0xc5 인데, 훨씬 더 큰 수인 0x5f5e100 를 전송하려고 해서 발생하는 에러입니다.

입력값은 잘 입력하신 거 맞는데, 가지고 계신 토큰이 전송하려고 하는 양보다 월등히 적으신 상황입니다.

아…그렇다면 처음 토큰을 발행할때부터 demicals를 생각해서 demicals를 8로 정하고 1000개의 토큰을 발행한다고 하면 100000000000개를 발행해야 하는것이 맞습니까?? 그리고 모든 전송에는 demicals를 적용하고 만약 10.234같은 소수를 전송한다면 1023400000의 16진수 0x3cffd840를 입력해야 하는것이 맞습니까??

@kujira.no.12

네 맞습니다.
decimal 을 항상 고려해주셔야 합니다.