일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- chainlink 설명
- ethers v6
- ambiguous function description
- Vue
- 스마트 컨트렉트 함수이름 중복
- SBT표준
- 스마트컨트렉트프록시
- 러스트 기초 학습
- ethers type
- git rebase
- 티스토리챌린지
- 스마트컨트렉트 함수이름 중복 호출
- ethers websocket
- 컨트렉트 배포 자동화
- vue기초
- 프록시배포구조
- 머신러닝기초
- 체인의정석
- 오블완
- 스마트컨트렉트테스트
- 러스트 기초
- 러스트기초
- rust 기초
- nest.js설명
- 컨트렉트 동일한 함수이름 호출
- Vue.js
- ethers typescript
- ethers
- 스마트컨트렉트 예약어 함수이름 중복
- multicall
Archives
- Today
- Total
체인의정석
Bignumber.js 사용하여 데이터 처리하기 본문
728x90
반응형
예전에 컨트렉트 테스트를 할 때는 web3나 ethers의 단위 변환 특히 parseUnits(amount,decimal) 을 많이 썼었는데
사실 백엔드에서 소수점 계산등을 하려고 하면 잘 안된다. 따라서 예전부터 많이 쓰이는 bignumber.js를 사용해서 계산하는 것이 좋다. 물론 web3나 ethers의 최신 버전에서는 bignumber 없이도 bigint 형태로 모두 처리가 되지만 기존 코드들을 모두 업데이트 하는 것은 쉬운 일이 아니므로 bignumber.js를 사용할 경우가 더 많다.
일단 먼저 계산하기에 앞서서 10진수 숫자형으로 바꾸는 작업부터 해주고
const price0 = parseInt(data.price0, 10);
const price1 = parseInt(data.price1, 10);
이를 bignumber 형태로 바꾸어 준다.
const price0Big = new BigNumber(price0);
const price1Big = new BigNumber(price1);
그 다음 다음과 같이 bignumber끼리의 연산을 해준다.
volumePerTick = amount0Big.times(price0Big)
.dividedBy(tickCountBig.dividedBy(tickSpaceBig))
.dividedBy(new BigNumber(10).pow(decimal0Big));
times는 곱하기, dividedBy는 나누기, pow는 제곱을 해주는 기능을 하며 다음과 같이 연산 순서에 맞게 잘 조합을 해주면 된다.
덧셈의 경우는 다음과 같이 plus를 사용하면 된다.
oldVolBig.plus(newVolBig).toString();
이렇게 하면 소수점이나 큰 단위의 숫자도 문제없이 연산에 성공할 수 있다.
계산을 다 하고 난 후 하나 주의할 점은 bignumber로 모든 연산을 마무리하고 난 후에는 string으로 바꾸어 주어야 한다는 것이다.
안그럼 지수부, 가수부 형태가 아니라 1e16 이런식으로 다른 숫자가 나오게 된다.
tickData.volume = volumePerTick.toString();
그래서 이런식으로 넘긴 후에 사용해야 한다.
728x90
반응형
'개발 > backend' 카테고리의 다른 글
ethers & websocket 참고 예제 (0) | 2023.11.27 |
---|---|
Nest.js 기본 구조 공부(기본 구조, Controller, Provider, Moudule) (1) | 2023.11.24 |
UniswapV3 백엔드 구축하며, 틱 단위 계산에 사용한 다시 볼 것 같은 함수들 정리 (tickSpace 맞추기, 데이터 쌓는 지점 체크 & 동일 블록에서의 값 합산, Promise.all의 중첩 사용) (0) | 2023.08.24 |
javascript) 한 객체에 다수의 배열이 있을때 some 함수로 모두 검색하는 방법 (find vs indexOf vs some) (0) | 2023.08.07 |
map으로 객체안의 값 null 일 경우 0으로 바꾸기 (0) | 2023.07.24 |
Comments