[AAVE series] Aave 로직 분석 — 대출, 상환

Shin Woochul
Decipher Media |디사이퍼 미디어
10 min readJan 8, 2022

시작하며

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

[AAVE series]

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

Author

Shin Woochul of Decipher Junior 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 컨트랙트, DAI에 대한 aDAI 컨트랙트가 각각 존재합니다. Aave의 6가지 운용 로직은 LendingPool 컨트랙트를 통해 이루어지며, 사용자의 거래 자산에 따라 각각의 aToken 컨트랙트에서 aToken이 발행(mint)되거나 소각(burn) 됩니다. 쉽게 말해, 사용자가 ETH를 예치한다면 LendingPool 컨트랙트의 예치 기능이 동작하고, aToken 컨트랙트에서 새로운 aToken 발행 기능이 동작하게 됩니다.

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

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

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

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

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

상황 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가 청산자에 보상 지급

대출 [Borrow]

요약: 차입자가 차입하고자 요청한 기초 암호자산의 대출 가능 여부를 확인 후 차입자의 월렛에 전송

대출은 차입자가 Aave에 예치한 기초 암호자산을 담보로 다른 암호자산의 차입을 요청할 때 사용되는 기능입니다. 대출 기능의 핵심 로직은 LendingPool contract의 _executeBorrow 함수에 구현되어 있습니다.

  1. oracle에서 가격 정보 받음
_executeBorrow / LendingPool.sol

_executeBorrow 함수는 우선 oracle로부터 borrow를 진행할 때 필요한 가격 정보를 받아옵니다. 이 가격 정보를 이용하여 사용자가 차입을 요청한 기초 암호자산의 가치를 ETH 단위로 환산합니다.

2. ETH 대출 가능 여부

validateBorrow / ValidationLogic.sol

_executeBorrow 함수는 그 다음 ValidationLogic 라이브러리에 있는 validateBorrow 함수를 호출하여 사용자가 요청한 차입이 가능한지 확인합니다. validateBorrow 함수는 대표적으로 다음과 같은 조건들을 확인합니다.

1) reserve가 유효한지 확인

validateBorrow / ValidationLogic.sol

사용자가 차입하고자 하는 기초 암호자산이 담긴 reserve가 유효한지 확인합니다.

2) 사용자의 collateral balance를 확인

validateBorrow / ValidationLogic.sol

사용자가 Aave에 예금한 보증금이 차입금보다 큰지를 확인합니다.

3) reserve의 health factor 확인

validateBorrow / ValidationLogic.sol

reserve의 health factor를 확인해 해당 reserve가 청산 대상인지 아닌지를 확인합니다.

3. reserve 정보 업데이트

_executeBorrow / LendingPool.sol

reserve의 전체 대출금 규모, 유동성 규모 등 관련 정보를 업데이트 해줍니다.

4. 금리 정보에 맞는 DebtToken 업데이트

_executeBorrow / LendingPool.sol

사용자가 선택한 금리 종류에 맞는 DebtToken을 발행합니다. DebtToken은 Aave V2에 도입된 개념입니다. 기존의 Aave V1에서는 컨트랙트 내에 차입자의 차입금을 기록했다면, V2에서는 고정 금리/변동 금리로 나누어 각각의 컨트랙트로 차입금을 토큰화하여 기록합니다. DebtToken을 사용하면 1) 기존 토큰의 발행(mint), 소각(burn) 기능과 유사하게 코드를 사용할 수 있어 대출 기능의 코드를 단순화할 수 있고 2) 차입금의 토큰화로 사용자가 고정 금리와 변동 금리로 동시에 차입이 가능해지고 3) 신용을 열어주어(through credit line) 다른 주소가 사용자의 DebtToken을 관리할 수 있게 해줍니다.

5. 이자율 정보 업데이트

사용자의 차입에 따라 변한 이자율 정보를 업데이트합니다.

상환 [Repay]

요약: 차입한 금액을 Aave에 전송하여 차입금 상환

상환 기능은 차입자가 차입한 자금 중 원하는 기초 암호자산을 LendingPool 컨트랙트에 전송하여 상환할 때 사용되는 기능입니다. 상환 기능의 핵심 로직은 LendingPool contract의 repay 함수에 구현되어 있습니다.

  1. 사용자의 차입금 정보 가져옴
repay / LendingPool.sol

reserve에서 사용자의 현재 차입금 정보를 불러옵니다.

2. ETH 상환 가능 여부 확인

validateRepay / ValidationLogic.sol

repay 함수는 그 다음 ValidationLogic 라이브러리에 있는 validateRepay 함수를 호출하여 사용자가 요청한 상환이 가능한지 확인합니다. validateRepay 함수는 reserve가 유효한지, 상환하려는 ETH의 양이 양수인지 등을 확인합니다.

3. 금리 종류에 따라 이자 계산

repay / LendingPool.sol

사용자의 차입금의 금리 종류에 따라 상환해야할 총 이자를 계산합니다.

4. reserve 정보 업데이트

repay / LendingPool.sol

reserve의 전체 대출금 규모, 유동성 규모 등 관련 정보를 업데이트 해줍니다.

5. 금리 종류에 맞는 DebtToken 소각

사용자의 금리 종류에 따라 상환금에 해당하는 사용자의 DebtToken을 소각합니다.

6. 이자율 정보 업데이트

사용자의 상환에 따라 변한 이자율 정보를 업데이트합니다.

마치며

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

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

본 게시글에서는 [Aave Series] 1. Aave 로직 분석 — 예금, 출금편에 이어 대출과 상환 로직을 살펴보았으며, 다음 게시글에서는 Aave의 Flash Loan에 대해서 알아봅니다.

--

--

Shin Woochul
Decipher Media |디사이퍼 미디어

Junior Blockchain Researcher & Developer at Seoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)