본문 바로가기

카테고리 없음

[ wagmi ] useBalance의 value(volume)가 bigint로 나오는 이유와 기준 정리

wagmi의 useBalance()를 쓰다 보면 result.data.value(질문에서 말한 volume이 사실상 이 값인 경우가 많다)가 bigint로 찍히는 걸 보게 된다. 처음 보면 "왜 숫자가 이렇게 길지?" 싶지만, 기준이 명확하다.

결론부터 말하면 useBalance().data.value해당 체인의 네이티브 코인을 "최소 단위(가장 작은 단위)"로 표현한 정수값이고, 그래서 bigint로 나온다.

최소 단위

Ethereum의 네이티브 코인은 ETH다.
ETH의 최소 단위는 wei다.

  • 1 ETH = 10^18 wei
  • ETH는 소수점 18자리까지 다룰 수 있는 구조다

그래서 라이브러리는 잔고를 소수(float)가 아니라 정수(wei)로 변환해서 반환한다. 이 정수는 자릿수가 커질 수 있으니 bigint로 다루는 게 안전하다.

예시

지금 잔고가 0.048 ETH라고 하자.
이걸 wei로 바꾸면 아래 계산이 된다.

  • 0.048 × 10^18
    = 48,000,000,000,000,000 wei
    = 48000000000000000n

useBalance().data.value는 대략 아래처럼 나오는 게 정상이다.

  • 48000000000000000n

여기서 끝에 붙는 n은 JS에서 bigint 리터럴이라는 표시다.

왜 굳이 bigint로 줄까

자바스크립트의 number는 부동소수점이라서 큰 정수나 소수 정밀도가 필요한 값에서 오차가 발생할 수 있다.
특히 ETH처럼 18자리 소수를 다루는 경우엔 전송/계산에서 오차가 나면 바로 돈이 꼬인다.

그래서 대부분의 웹3 라이브러리는 아래 원칙을 따른다.

  • 내부 계산/전송은 최소 단위 정수(bigint)
  • 화면 표시는 사람이 읽는 단위(string)로 변환

이게 가장 안전한 패턴이다.