Swapscanner

Klaytn bus 토큰 CPMM LP Overflow 문제점 보고서

March 9, 2022

개요

본 보고서는 Klaytn 네트워크의 bus 토큰 (0xf445e3...) 의 CPMM LP overflow issue에 관한 보고서입니다.

tl;dr

  1. bus 토큰을 포함하는 LP pair는, 최대 5,192,296,858,534,827.628530496329220096개의 bus만 담을 수 있습니다.
  2. bus와 같은 decimals를 가지는 다른 토큰들 (KLAY 등) 의 경우, 5,192,296,858,534,827개는 엄청난 가치를 띄나 (예를 들어 KLAY의 경우, 약 733경원), 이에 반해 bus의 경우, 약 7억원 정도 밖에 되지 않습니다.
  3. bus 토큰을 포함하는 LP pair의 경우, pair가 담을 수 있는 최대치를 도달하기 상대적으로 쉽습니다.
  4. 최대치에 도달하게 되면, 해당 pair는 더 이상 bus 토큰을 담을 수 없게 됩니다.
    (해당 pair를 상대로 bus 토큰을 매각할 수 없게 됩니다)

Uniswap V2 기반 CPMM LP Pair의 한계

Klaytn 네트워크 상의 CPMM (Constant Product Market Making) 기반 LP들은, 토큰 당 최대 5.192296858534828e+33 (uint112의 최대값) 개의 단위 토큰들을 보관할 수 있습니다. 이에 대한 자세한 이유는 Uniswap V2 white paper (2.2.1 Precision) 에서 확인 가능하며, 실제 구현은 Uniswap V2 Pair 컨트랙에서 확인 가능합니다.

contract UniswapV2Pair is IUniswapV2Pair, UniswapV2ERC20 {
  ...
  uint112 private reserve0;
  uint112 private reserve1;
  ...
}

단위 토큰, 그리고 Decimals란?

EVM (Ethereum Virtual Machine) 기반 smart contract에서는 부동소숫점 연산을 지원하지 않으며, 이에, 소숫점 이하의 토큰 단위를 표현하기 위하여, decimals 라는 개념과, 최대 256비트의 크기까지 담을 수 있는 정수형 타입을 이용합니다.

Decimals란, 해당 토큰이, 소수점 아래 최대 몇 자리수 까지 지원이 가능한지를 알려주는 숫자입니다.

예를 들어, decimals = 18 인 토큰의 경우: 1 (단위 토큰 갯수) => 0.000000000000000001 (실제 토큰 갯수) 1000000000000000000 (단위 토큰 갯수) => 1 (실제 토큰 갯수)

모든 토큰들 (KLAY, ETH 포함) 은, 이 decimals 를 가지게 되며, 이 보고서에서 서술하는 bus의 경우, 18의 decimals를 갖게 됩니다.

A = 실제 토큰 갯수, B = 단위 토큰 갯수, D = decimals

최대 토큰 갯수

상기된 내용에 의거, 한 개의 LP pair가 담을 수 있는 최대 토큰 갯수는 아래와 같습니다

M = 최대 실제 토큰 갯수, D = decimals

보고서에서 서술하는 bus 의 decimals의 경우 18이기에, bus를 포함하는 LP pair에 최대로 포함될 수 있는 bus 의 갯수는 5,192,296,858,534,827.628530496329220096 개 이며, 이는 보고서 작성 시점 기준, 약 7억 5808만 5243원 정도의 가치입니다.

문제점

Ethereum은 18의 decimals를 가지며, 이를 fork한 Klaytn 역시 18의 decimals를 가집니다. 이에 대부분의 토큰들은 18의 decimals를 가지도록 설계 되어 있습니다. Decimals가 18인 모든 토큰들을 포함하는 LP pair들은, 해당 토큰을, 상기 된 만큼, 최대 약 5경개 까지 담을 수 있습니다.

보통의 경우에선 이것은 문제가 되지 않습니다. 5경개의 토큰은, KLAY의 경우 약 733경원, ETH의 경우 약 9561경원을 넘어서는 가치이기 때문입니다. 더불어, 애초에 KLAY와 ETH의 최대 발행량은 각각 약 26억개, 1천만개 정도로, 최대치인 5경개를 훨씬 하회합니다.

그러나 bus의 경우, 5경개의 토큰이 고작 7억원 정도의 가치밖에 없으며, 현재 발행량은 약 1해개 (10^20) 입니다 (다행히도 smart contract code상 최대 발행량도 1해개 인 것으로 보여집니다).

KLAYswap에 상장되어있는 bus가 포함된 LP pair중에는 상기된 최대치에 거의 근접한 양의 bus를 담고 있는 LP들이 존재합니다. 보고서 작성 시점 기준으로 해당 LP pair에는, 이제 약 6천억개의 bus만을 추가로 담을 수 있으며, 이는 약 8만원 정도의 가치입니다. 따라서 8만원이 넘는 bus를 이 LP pair에 매도하려 할 경우, overflow 오류가 발생하여, 매도 주문이 불가능합니다.

DEX에서의 문제점

상기된 바와 같이, 보통의 상황에서는, 약 5경개의 토큰인 LP pair의 용량은 부족하지 않습니다. 따라서 스왑 경로 계산 로직에서 해당 부분을 염두하지 않아도, 아무런 문제가 되지 않습니다.

그러나 상기된 LP pair를 지나는 경로가 채택될 경우, 상기된 예외처리 로직이 존재하지 않는 한, 무조건 overflow 오류 발생으로 인하여 revert가 되게 됩니다. 현재 KLAYswap에서도 해당 예외 처리가 존재하지 않는 것으로 확인되며, Swapscanner에서 역시 같은 문제가 있습니다.

Swapscanner의 해결 방안 (Action Items)

현재 Swapscanner 팀은, 임시로 해당 문제가 되는 LP pair를 블랙리스트 처리하여 정상적인 이용이 가능합니다.

하지만 이는 향후의 bus 토큰의 유동성과 가격 변동 경향 따라서 언제 또 다시 터질 지 모르는 폭탄을 남겨놓은 것과 같습니다.

이에 Swapscanner 팀은, 경로 계산 로직에 상기된 예외 로직을 탑재하여, bus 토큰이 모든 LP pair에서 overflow 되는 한이 있더라도, 토큰 또는 LP 블랙리스팅 없이, 정상적인 경로 계산이 될 수 있도록 고도화 하도록 할 것입니다. 이는 Swapscanner 팀의 이념인 최대한의 탈중앙화와 공정성에 의거하였습니다.

고도화 작업이 끝난 이후에, 다시 경로에 해당 토큰을 포함 시킬 예정입니다.

번외: Swapscanner 토큰 (SCNR) 의 경우

Swapscanner 토큰은 25의 decimals를 가집니다. Decimals 자릿수 이하의 소숫점은 아예 지원하지 못하는 smart contract의 특성상, 과거 저희는 아무리 극소량의 이자나 스왑 보상이라도, 놓지지 않고 홀더분들께 돌려드리기 위하여, 하기와 같은 검증을 수 차례 수행 이후, 25개의 decimals를 채택하기로 결정하였었습니다.

  • SCNR토큰의 최대 발행량과 decimals = 25를 사용하였을 경우, 이자 지급 로직에 overflow 오류가 평생 발생하지 않음을 보장하는지.
  • DEX의 LP pair에 최대 발행량이 모두 예치된다고 하여도, overflow 오류가 평생 발생하지 않음을 보장하는지.
  • 기타 다른 내부 및 유명한 외부 smart contracts 들에 활용된다고 하여도 overflow 오류가 평생 발생하지 않음을 보장하는지.

맺음말

Swapscanner 팀은 Klaytn 생태계 내 최대 사용자를 확보한 서비스 중 하나로서 큰 책임감을 느낌과 동시에 탈중앙화 이념에 위배되지 않게 서비스를 운영하고 있습니다.

이번 Bus 토큰 LP Overflow에 대한 이슈는 Ethereum 등 다른 메인넷에서도 선례를 찾기 힘든 이슈였습니다. 이에 대해 Swapscanner 팀은 Klaytn 생태계의 다양한 DApp 개발자분들, 투자자분들 모두가 인지할 필요성이 있다고 내부적으로 판단, 리포트를 작성하고 공개하였습니다.

Swapscanner 팀은 생태계 내 최다 토큰을 지원하는 주체로서 다양한 토큰에 대해 항상 내부적으로 분석하고 있습니다.

Klaytn 생태계 발전을 위해 공개가 필요한 자료는 앞으로도 보고서로 작성, 공개하도록 하겠습니다. 감사합니다.


스왑스캐너 팀
contact@swapscanner.io