[Code Review] Silo Finance (2)
두 번째에서는 청산에 대해서 알아보고자 한다.
Health factor는 대출 포지션의 상태를 명확하게 나타내는 지표다. 초록색(100%)에서 빨간색(0%)까지 변화한다. HealthFactor가 0%에 도달하면 대출 포지션이 청산될 위험에 있음을 알려주는 것이다.
예시로 내가 지금 ARB사일로에 ETH를 예치하고 USDC.e를 15개 빌렸을 때 HealthFactor는 29%이다.
대출자의 HealthFactor 0%에 도달하면 청산 이벤트가 발생한다. 이를 통해 청산자는 대출자의 담보를 압류하여 판매하고, 미지급된 부채를 상환하는 동시에 청산 수수료를 벌 수 있다. 현재 Silo는 전액 담보 청산을 사용하고 있다. 포지션이 청산되도록 신호가 발생하면, 청산자는 대출자의 모든 담보를 압류해서 그들의 대출 포지션을 상환한다. 청산 이벤트가 완료되면, 청산된 대출자는 자신이 빌린 것만 남게 된다. 이런 청산 방법은 유동성이 제한되어 있고 청산될 때 높은 슬리피지가 발생할 수 있는 장기 자산에 적합하다.
위 사이트에 들어가면 HealthFactor를 확인할 수 있고 HealthFactor가 1 이하인 애들에 대해서는 청산될 수 또 있다.
그리고 스캔사이트에 들어가서 컨트랙트로 직접 executeLiquidation()를 날려야 한다.
코드를 한번 살펴보자.
SwapInput0x 구조체를 받는데 저기서 즉 0x에서 제공하는 swapAPI사용하는 것이다.
그리고 결국 실행되는 건 flashLiquidate()이다.
그리고 이어서 _userLiquidation()
여기서 보면 nonReeentrant 안 쓴 이유가 _repay할때 reentered해야해서 그렇다고 했다.
이후에 siloLiquidationCallback실행
중간에 있는 _siloLiquidationCallbackExection()을 보면
여기서 return해줄때 _runInternalScenario ~ 를 실행하는데 여기서 위에서 말한 _repay reentrancy부분이 나온다.