[Aave Series]AAVE의 로직 분석 (예금, 인출)

YONG THUG
Decipher Media |디사이퍼 미디어
9 min readJan 8, 2022

Aave: Another Money Market Protocol

시작하며

본 게시글에서는 Aave의 로직을 컨트랙트 코드를 기반으로 분석합니다. AAVE는 디파이 대출 프로토콜로서, 사용자가 고정 및 변동 금리 등 다양한 옵션을 선택하여 암호자산을 빌릴 수 있습니다. 오늘 게시글에서는 대출과 상환의 동작 방법에 대하여 구체적인 내용을 정리하며, 이를 위해 각 로직에 대한 AAVE의 컨트랙트 코드를 분석합니다.

[Aave Series]

  1. Aave 로직 분석 (예금, 인출)
  2. Aave 로직 분석 (대출, 상환)
  3. Aave의 Key Value, 플래시 론

Author

Yong Suk Kim of Decipher Senior DeFi Researcher.
Seoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)

용어 정리

  • 사용자 : Aave 프로토콜에서 자산을 공급, 차입하는 모든 참여자. 공급자가 될 수도 있고 차입자가 될 수도 있다.
  • 공급자 : Aave에 자산을 예치만 한 사용자. ‘대출’ 이자를 수령할 수 있다.
  • 차입자 : Aave를 통해 자산을 예치 후 다른 자산을 빌려 가는 사용자. ‘차입’ 이자를 지불해야 한다.
  • 대출 서비스 : Aave 프로토콜 자체를 일컫는 말. Aave에서 제공되는 서비스를 일컬을 때는 ‘차입’ 서비스가 아닌 ‘대출’ 서비스라고 한다.
  • 대출금 : 공급자 입장에서 대출 서비스의 대상이 되는 자산. 예) 대출금 회수
  • 차입금 : 차입자 입장에서 대출 서비스의 대상이 되는 자산. 예) 차입금 상환
  • 기초 암호자산(underlying crypto asset): Aave에서 aToken으로 변환되기 전 암호자산을 의미

aToken

사용자는 Aave 에서 원하는 암호자산을 예치하고 이를 담보로 암호자산을 차입할 수 있습니다. Aave의 운용 로직은 총 6가지로 나눌 수 있으며 예금(deposit), 출금(withdraw), 대출(borrow), 상환(repay), 청산(liquidate), 스왑(swap)이 이에 해당됩니다. Aave는 이 과정에서 사용되는 모든 자산을 aToken으로 변환하여 운용합니다.

Aave는 과담보 대출을 지원하는 모든 기초 암호자산에 대한 aToken 컨트랙트를 가지고 있습니다. 즉, ETH에 대한 aETH 컨트랙트, USDC에 대한 aUSDC 컨트랙트가 각각 존재합니다. Aave의 6가지 운용 로직은 LendingPool 컨트랙트를 통해 이루어지며, 사용자의 거래 자산에 따라 각각의 aToken 컨트랙트에서 aToken이 발행(mint)되거나 소각(burn) 됩니다. 쉽게 말해, 사용자가 ETH를 예치한다면 LendingPool 컨트랙트의 예치 기능이 동작하고, aToken 컨트랙트에서 새로운 aToken 발행 기능이 동작하게 됩니다.

각 상황에 따른 LendingPool 컨트랙트의 동작 방법을 간단히 살펴봄으로써 aToken의 역할을 이해해보도록 하겠습니다.

상황 1. 공급자가 ETH를 Aave에 예치하는 경우

[deposit 함수 실행]1. 공급자의 월렛에서 USDC를 Aave의 LendingPool 컨트랙트에 전송2. Aave가 특정 교환 비율을 사용하여 전송한 USDC를 aToken인 aUSDC로 변환 후 사용자의 월렛에 전송

상황 2. 공급자가 예치한 ETH를 Aave에서 출금하는 경우

[withdraw 함수 실행]1. USDC 출금 요청2. Aave가 특정 교환 비율을 사용하여 사용자가 요청한 USDC를 받기 위해 지급해야 할 aUSDC의 개수 계산3. 사용자가 계산된 aUSDC를 Aave의 LendingPool 컨트랙트에 전송4. Aave가 1번에서 요청한 USDC를 공급자의 월렛에 전송

상황 3. 차입자가 예치한 ETH를 담보로 Aave에서 USDC를 대출 받는 경우

[borrow 함수 실행]1. 사용자가 ETH 차입 요청2. Aave가 사용자가 요청한 USDC가 해당 사용자에게 대출 가능한지 확인3. Aave가 사용자가 요청한 USDC를 사용자 월렛에 전송

상황 4. 차입자가 차입한 USDC를 Aave에 상환하는 경우

[repay 함수 실행]1. 차입자가 USDC 상환 요청2. Aave가 차입자의 USDC 상환 가능 여부 확인3. 차입자가 Aave의 LendingPool 컨트랙트에 차입한 USDC를 전송

상황 5. 차입자가 차입한 USDC의 금리 종류(변동/고정)를 변경하는 경우

[swapBorrowRateMode 함수 실행]1. 차입자가 금리 종류 변경 요청2. Aave가 차입자의 금리 종류의 변경 가능 여부 확인3. Aave가 차입자의 금리 종류 변경

상황 6. 청산자가 차입자가 예치한 ETH를 청산하는 경우

[liquidationCall 함수 실행]1. 청산자가 차입자가 예치한 ETH의 청산 요청2. Aave가 차입자가 예치한 ETH의 청산 가능여부 확인3. Aave가 차입자가 예치한 ETH를 청산4. Aave가 청산자에 보상 지급

예금[Deposit]

상황 1. 공급자가 ETH를 Aave에 예치하는 경우

[deposit 함수 실행]1. 공급자의 월렛에서 USDC를 Aave의 LendingPool 컨트랙트에 전송2. Aave가 특정 교환 비율을 사용하여 전송한 USDC를 aToken인 aUSDC로 변환 후 
사용자의 월렛에 전송
lendingpool.sol

요약. 공급자가 예치한 기초 암호자산을 aToken으로 변환하여 공급자 월렛에 전송

공급자가 100USDC를 입금할 경우에 공급자는 100 aUSDC를 돌려받게 됩니다.

lendingpool.sol

컨트랙트를 살펴보면, DataTypes를 통해서 asset 토큰풀에 대한 정보를 알 수 있습니다. ValidationLogic을 통해서 사용자가 요청한 값이 유효한 요청인지 확인할 수 있습니다.

lendingpool.sol

asset에 해당하는 aToken입니다. 여기서는 USDC에 해당하는 aUSDC가 됩니다. 예를 들어 100 USDC를 입금했다고 가정한다면 100 aUSDC로 변환되어 사용자의 월렛에 들어가게 되는 것입니다.

lendingpool.sol

UpdateState을 통해서 현재 상태를 업데이트하게 됩니다. asset의 종류와 양 등을 업데이트 하는 과정입니다.

lendingpool.sol

사용자의 asset을 aToken으로 전송시키는 과정입니다. aToken을 사용자에게 발행하게 됩니다.

lendingpool.sol

첫 예치인 경우에는 reserve의 ID를 담보로 사용하겠다고 설정하는 과정이 필요합니다. 그 이후에는 처음 설정한대로 사용하게 됩니다.

출금[Withdraw]

상황 2. 공급자가 예치한 ETH를 Aave에서 출금하는 경우

[withdraw 함수 실행]1. USDC 출금 요청2. Aave가 특정 교환 비율을 사용하여 사용자가 요청한 USDC를 받기 위해 지급해야 할 aUSDC의 개수 계산3. 사용자가 계산된 aUSDC를 Aave의 LendingPool 컨트랙트에 전송4. Aave가 1번에서 요청한 USDC를 공급자의 월렛에 전송
lendingpool.sol

요약. aToken을 공급자가 예치한 기초 암호자산으로 변환하여 공급자 월렛에 전송

이번에는 공급자가 예치한 USDC를 출금하는 과정을 살펴보도록 하겠습니다.

lendingpool.sol

asset 토큰을 해당 amount 만큼 to에게 출금하게 됩니다. 여기서 보통 to는 msg.sender에 해당하게 됩니다.

lendingpool.sol

출금할 asset에 해당하는 a Token입니다. 예를 들어 100 USDC를 출금하고자 하면 100 aUSDC가 100 USDC로 변환되어 사용자의 월렛으로 전송되는 것입니다.

lendingpool.sol

사용자가 가지고 있는 aToken의 balance를 뜻합니다.

lendingpool.sol

사용자의 balance까지 최대로 출금 가능합니다. 유효한 출금 요청인지 확인하는 과정이 진행됩니다.

lendingpool.sol

상태 및 이자율에 대한 업데이트가 이루어집니다.

lendingpool.sol

만약 모든 잔고를 출금하게 되면 사용자는 더이상 asset을 담보로 가지고 있지 않게 됩니다.

lendingpool.sol

aToken을 소각하고 해당하는 만큼의 asset을 사용자에게 전송합니다. 이로써 출금 과정이 마무리됩니다.

마치며

[Aave series] 1. Aave로직 분석 — 예금, 출금은 Aave 서비스의 주요 로직 중 예치, 출금, 차입, 상환 시 실행되는 함수의 기능과 동작을 LendingPool 컨트랙트를 기반으로 자세하게 분석하였습니다.

Aave는 다양한 암호자산들을 예치하고, 이를 담보로 다른 암호자산을 차입할 수 있는 과담보 대출 서비스를 제공합니다. 그 과정에서 예치한 암호자산들은 Aave에서 운용되는 자산인 aToken으로 변환되며 Aave에서 지정된 로직에 의해 그 양과 금리가 결정됩니다.

다음 게시글에서는 Aave의 대출과 상환에 대해서 알아봅니다.

--

--