Exploring Uncollateralized DeFi Lending Protocol #1

하헌
Decipher Media |디사이퍼 미디어
30 min readAug 27, 2022

서울대학교 블록체인 학회 디사이퍼(Decipher)에서 DeFi 신용 대출 프로토콜에 대한 아티클을 연재합니다. 본 아티클에서는 TrueFi를 중심으로 DeFi 신용 대출 프로토콜의 구조와 작동 방식을 자세히 설명하고, Maple Finance와 Goldfinch의 구조와 특징을 다룹니다. 글을 작성하기 앞서, 본 아티클은 정보 제공을 목적으로 작성된 글이며 필자는 신용 대출 프로토콜과 아무런 연관이 없음을 밝힙니다.

Author
하헌, 황수진
Seoul Nat’l Univ. Blockchain Academy Decipher(@decipher-media)
Reviewed By 정재환

Series
1. Exploring Uncollateralized DeFi Lending Protocol #1
2. Exploring Uncollateralized DeFi Lending Protocol #2

목차

  1. 신용, 그리고 DeFi
  2. TrueFi 개요
  3. TrueFi 대출 프로세스
  4. TrueFi 대출 로직 : 코드 분석
  5. TrueFi 대출 이자율 결정 로직 : 코드 분석

1. 신용, 그리고 DeFi

고대 함무라비 법전의 모습 (Source: 한겨레)

상인이 곡물을 빌려 줄 때에는 곡물 1kur에 대하여 60qa의 이자를 받는다. 은을 빌려줄 때에는 은 1shekel에 대하여 1/6 she의 이자를 받는다.
함무라비 법전 88조

인류의 경제는 특정인에 대한 신뢰가 자본과 결합한 순간부터 본격적으로 발전하기 시작하였습니다. 세계에서 가장 오래된 성문 법전인 고대 바빌로니아 함무라비 법전에는 대출과 이자의 개념이 명시되어 있습니다. 상인이 일정 금액의 여유 자본 등을 빌려주는 ‘대출’과 그 대가로 ‘이자’를 받는 거래가 오래 전부터 활발하게 일어나고 있었다는 뜻이죠. 이러한 거래는 타인을 신뢰할 수 있기 때문에 발생할 수 있습니다. 고대 바빌로니아인들은 신용을 활용하여 여유 자본의 융통과 순환 과정을 촉진시킴으로써 경제의 회전 속도를 증가시키고 자본 배분의 효율성을 더해줄 수 있었습니다.

자본주의로 요약되는 인류 경제사의 급격한 발전에서도 신용은 중요한 역할을 수행하였습니다. 예금, 대출, 투자 등 우리가 실생활에서 마주하는 금융 거래는 기본적으로 특정인에 대한 신뢰를 기반으로 이루어집니다. 우리는 은행을 신뢰하기 때문에 자금을 맡길 수 있고, 은행은 특정 기업을 신뢰하기 때문에 대출이나 투자를 집행할 수 있습니다. ‘사피엔스(Sapiens: A Brief History of Humankind)’의 저자 Yuval Harari는 자신의 저서에서 자본주의의 핵심 요소 중 하나로 신용을 꼽기도 하였습니다. 상업 자본주의, 산업 자본주의를 거쳐 금융 자본주의로 일컬어 지는 현대 경제 체제에서 신용 평가 시장이 점차 커지고 있다는 사실은 Yuval Harari가 언급한 신용의 가치와 중요성이 커지고 있다는 것을 보여주는 사례입니다.

미국 신용 시장의 성장 (출처 : FRB NY, FRED)

신용을 기반으로 현대 금융 체제의 성장이 시작되었다면, 블록체인 금융이라고 불리는 DeFi에서는 어떨까요? DeFi는 Smart Contract를 활용하여 토큰 예치, 대출, 환전 및 자산 관리 등의 투명성을 확보하고 금융 서비스에 대한 접근성을 크게 향상 시켜 왔습니다. 이러한 DeFi에서도 현실에서만큼 다양한 신용 기반 금융 서비스가 존재할까요?

답은 NO 입니다. 아쉽게도 DeFi에서는 신용 기반 금융 서비스가 차지하는 비율이 높지 않습니다. 웹3 신용 평가 시스템을 구축하고자 하는 CreDa(Credit DeFi Alliance), DeFi 신용 Passport 를 만들고 있는 ARCx Sapphire, 최근 Vitalik Buterin이 제시한 SBT(Soul Bound Token)등 블록체인 상에서 신용을 활용하고자 하는 다양한 시도가 이어지고는 있습니다만, 여전히 신용 대출과 같은 금융 서비스를 제공 받기는 힘듭니다. 오히려 DeFi에서는 신용을 활용하지 않는 담보 대출 프로토콜이나 탈중앙화 교환소(Decentralized Exchange) 가 차지하는 비율이 훨씬 높습니다. 이러한 배경에는 신용 기반 금융 서비스를 구현하기에 세 가지 어려움이 있기 때문입니다.

1) 익명성

  • 블록체인 산업의 익명성은 DeFi 신용 시장의 성장을 방해하는 가장 커다란 요인입니다. 암호화폐 지갑의 소유자를 특정 지을 수 없는 익명성이 존재하는 한 금융 기관은 거래 상대방의 정확한 신원을 알 수 없습니다. 금융 서비스를 제공하는 기관 입장에서 거래 상대방을 모른다는 것은 커다란 위험을 떠안게 되는 일입니다. 예를 들어 대출에 대한 채무 불이행이 발생하였을 때, 차입자의 신원을 특정 지을 수 없다면 대출 기관을 보호하기 위한 적절한 경제적, 법적 제재를 가하는 것이 불가능합니다.

2) Risk Management

  • Risk Management란 거래 위험을 일정 수준 이하로 유지하기 위한 일련의 과정을 말합니다. 일반적으로 신용 대출과 같은 금융 서비스를 제공할 때 Risk Management는 거래 상대방의 신용을 평가하는 과정을 포함하게 됩니다. 전통 금융권에서는 위험을 관리하기 위해 신용평가사의 신용 등급을 사용하거나, 공과금 납부 이력 등 각종 비금융 정보를 통해 신용을 평가하는 대안신용평가를 활용합니다.
    그러나 DeFi의 경우 전통 금융과 비교하여 위험을 관리하는 것이 매우 어렵습니다. DeFi에는 On-Chain 상의 데이터를 활용하여 위험을 측정할만한 신용 평가 모델이 부족할 뿐만 아니라 차입자의 신용을 평가할만한 데이터 자체도 매우 적기 때문입니다. 블록체인 상에서 신용 기반 금융 서비스를 제공하고자 하는 입장에서는 위험을 일정 수준 이하로 낮추기가 쉽지 않습니다.

3) Risk Pricing

  • Risk Pricing은 대출 위험도에 따라 대출 이자율을 결정하는 과정을 말합니다. Compound, Aave와 같은 DeFi 담보 대출 프로토콜에서 대출 금리는 시장 이자율 결정 매커니즘에 따라 자동으로 산정 됩니다. 대출 풀에 예치 되어 있는 금액이나 차입자가 대출 받고자 하는 금액 등을 고려하여 대출자의 차입 이자율을 산정하는 것입니다. 이 때, 차입자가 어떤 사람인지는 이자율에 전혀 영향을 미치지 않습니다.
    그러나 신용 대출에서는 차입자를 고려하여 Risk Pricing을 해야 합니다. 각 차입자의 신용도가 무차별하지 않기 때문에 대출 이자율을 산정하는데 신용이라는 요소를 고려해야 하는 것입니다. 따라서 신용 대출에서는 담보 대출과는 다른 방식의 Risk Pricing을 요구하게 됩니다.

앞서 언급한 세 가지 요소는 신용 기반 금융 서비스가 블록체인 상에서 많은 발전을 이루지 못한 이유입니다. 그러나 점차 많은 사람들이 자신의 암호화폐 지갑을 가지게 되고 다양한 기업들이 블록체인 산업으로 진출함에 따라 신용 기반 금융 서비스의 필요성이 대두 될 수 있습니다. 특히 신용을 기반으로 대출 서비스를 제공하는 신용 대출의 경우 기존 DeFi 가 유저에게 제공하지 못하였던 새로운 가치를 창출할 수 있습니다.

Source : gettyimages

먼저 담보 효율성과 관련된 부분입니다. 신용 대출은 담보가 필요 없기 때문에 자본 효율적인 대출이 이루어질 수 있습니다. 기관 투자자의 경우 큰 자금을 활용해야 한다는 것을 고려해 보았을 때, 향후 블록체인 산업에서 자본 비효율적인 담보 대출보다는 자본 효율적인 신용 대출의 필요성이 부각될 수 있을 것입니다. 다음으로 미래 현금 흐름을 기반으로 신용 대출을 받을 수 있습니다. 이는 개발도상국과 같이 당장의 경제 규모는 크진 않지만 성장 가능성이 높은 국가나 투자처에 필요한 금융 서비스입니다. 따라서 본 글에서는 추후 블록체인 내 금융 시장이 성숙함에 따라 주목받을 수 있는 신용 기반 금융 서비스, 그 중에서도 DeFi 신용 대출에 대해 다뤄보고자 합니다.

본 글에서는 DeFi 신용 대출 서비스를 제공하는 세 개의 프로토콜 TrueFi, Maple Finance, 그리고 Goldfinch에 대해 소개할 것입니다. 각 프로토콜은 모두 유사한 신용 대출 서비스를 제공하지만 그 방식에는 차이가 있습니다. 그 중 TrueFi는 다른 DeFi 신용 대출 프르토콜과 비교하여 Risk Management와 Risk Pricing의 On-Chain화가 잘 구현되어 있는 프로토콜입니다. 따라서 1편에서는 TrueFi를 중심으로 프로토콜의 전체적인 구조와 대출, 이자율 결정 로직에 대해 알아보고, 다음 2편에서 TrueFi의 상환 로직, 청산, 그리고 Goldfinch와 Maple Finance의 구조와 특징에 대해 간략하게 다뤄보고자 합니다.

2. TrueFi 개요

TrueFi (출처 : portalcripto)

TrueFi는 차입자의 신용을 기반으로 대출 서비스를 제공하는 DeFi 신용 대출 프로토콜 입니다. TUSD 스테이블 코인을 만든 TrustToken에서 개발하였으며 2020년 11월에 출시되었습니다. TrueFi는 담보 대출 서비스가 대부분인 DeFi 에서 최초로 신용 대출 서비스를 제공하였다는 점에서 의미가 있습니다.

TrueFi는 TRU 토큰을 중심으로 대출자(Lender), TRU 토큰 스테이커(Staker), 차입자(Borrower) 3명의 이해관계자에 의해 운영됩니다.

TrueFi의 구조 (Source: TrueFi)

1) 대출자

먼저 대출자의 경우, TrueFi에 스테이블 코인을 제공하고 이자 수익을 얻는 것을 목적으로 대출 풀(Pool)에 자금을 예치합니다. 신용 대출은 특정인에 대한 신뢰를 기반으로 이루어지는 대출이므로 차입인이 대출 금액을 문제 없이 상환했을 때 대출 토큰의 가치를 보장할 수 있어야 합니다. 따라서 TrueFi의 자금 예치는 BUSD, USDC, USDT, TUSD 4가지 스테이블 코인으로만 이루어지며 대출자의 이자 수익 또한 스테이블 코인으로 지급 받습니다.

대출자들은 스테이블 코인 대출 시 토큰 종류에 따라 Lending Pool Token (대출 풀 토큰 — tfTUSD/tfUSDC/tfUSDT/tfBUSD)을 받습니다. Lending Pool Token이란 대출 풀에서 대출자의 예치 비율을 나타내는 ERC-20 토큰입니다. 대출자들은 자금을 예치할 때는 해당 풀의 자금 비율에 따라 Lending Pool Token을 지급받게 되고, 반대로 자신의 예치금을 인출할 때는 대출 풀이 발급한 Lending Pool Token의 비율에 따라 정산받습니다. 대출자는 지급 받은 Lending Pool Token을 TrueFi에 다시 스테이킹 함으로써 추가적인 TRU 토큰이자 보상을 받을 수도 있습니다.

TrueFi DAO Pool 대출 현황 (출처: TrueFi)

TrueFi 대출 풀에 예치된 자본은 기본적으로 기관들에게 신용 대출 서비스를 제공하는데 사용됩니다. 현재 DAO 대출 풀은 예치된 금액($263M)의 95% 이상의 금액이 대출 중이며 풀 이용률(Pool Utilization)은 대부분 90% 이상으로 높은 수치를 유지 중입니다. 만약 신용 대출 서비스를 제공한 이후에도 풀에 남아 있는 스테이블 코인 자금이 있다면 Aave나 Curve와 같은 DeFi 프로토콜에 유동성을 제공하는데 사용됩니다.

2) TRU 토큰 스테이커

TRU 토큰을 스테이킹한 스테이커(Staker)는 TrueFi를 운영하는 주체입니다. TRU 토큰을 TrueFi에 스테이킹하면 stkTRU를 받게 되며 스테이커들은 해당 토큰을 가지고 TrueFi DAO의 거버넌스에 참여할 수 있습니다. stkTRU 홀더들은 DAO 풀에 대한 기관들의 대출 요청을 승인하거나 거절할 수 있는데, 이를 통해 대출 프로세스에도 참여하게 됩니다. 기관들의 대출 신청이 승인되기 위해서는 stkTRU 홀더들의 1,500만표 이상의 투표와 80% 이상 찬성, 두 가지 조건이 모두 충족되어야 합니다.

TrueFi 신용 대출 프로세스의 핵심은 stkTRU의 올바른 대출 판단입니다. 만약 stkTRU 홀더들이 채무 불이행 가능성이 높은 차입자에게 신용대출을 제공하게 된다면 대출 풀의 이자 수익이 감소할 뿐만 아니라 예치자가 맡긴 원금 또한 손실될 가능성이 존재합니다.

따라서 TrueFi는 프로토콜의 성장과 stkTRU 홀더들의 올바른 행동의 인센티브가 Align 될 수 있는 구조를 만들기 위해 노력하였습니다. 만약 차입자가 TrueFi로부터 신용 대출한 금액을 정상적으로 상환한다면 해당 대출 승인 투표에 참여한 stkTRU 홀더들은 TRU 토큰을 추가로 획득할 수 있습니다. 하지만 차입자가 대출한 금액을 갚지 못하는 채무 불이행이 발생한다면 stkTRU 홀더들이 스테이킹 한 TRU 토큰이 일정 부분 Slashing 됩니다.

지속적으로 증가하는 TRU 스테이킹 양 (Source: Dune Analytics)

채무 불이행에 따라 TRU 토큰이 Slashing 되는 프로세스는 2편 청산 파트에서 더욱 자세히 설명하겠습니다.

3) 차입자

마지막으로 차입자(Borrower)는 빌린 자금을 활용하여 일정 수익을 얻고 대출금을 상환하고자 하는 사람들로, TrueFi에서 담보 없이 신용 대출 서비스를 제공 받을 수 있습니다.

사실 TrueFi에서 대출을 받고자 하는 모든 사람들이 신용 대출 서비스를 받을 수 있는 것은 아닙니다. TrueFi는 일정 프로세스를 거쳐 화이트리스트에 등록된 사람들에 대해서만 신용 대출 서비스를 제공해줍니다. 아직 개인은 화이트리스트 등록이 불가능하고 기관들만 가능한데, 기관 중에서도 순자산이 $10M 이상인 기관의 지갑으로만 등록을 제한하여 사실상 현실에서 대출 상환 능력이 보장된 기관에만 신용 대출 서비스를 제공합니다.

차입자는 정해진 상환 기일 내에 언제든지 대출금을 갚을 수 있습니다. 만약 차입자가 대출 기간 내에 지속적으로 상환을 완료하게 되면 해당 상환 기록들로 인해 신용 점수가 오르게 됩니다. 이를 기반으로 차입자는 나중에 더 낮은 이자율로 자금을 빌리는 것이 가능해집니다. 즉, 차입자의 올바른 행동이 자신의 신용도를 높임으로써 대출 리스크를 낮추어 주는 효과를 가져오게 되는 것입니다. 이러한 제도는 신용 점수와 신용 등급을 기반으로 차입자를 평가하고 이자율을 계산하는 전통 금융의 방식과 유사합니다.

차입자는 추가적으로 TRU 토큰을 스테이킹하여 낮은 거래 수수료나 대출 이자율을 적용 받을 수 있는데, 이에 대한 상세한 설명은 TrueFi 대출 이자율 결정 파트에서 하겠습니다.

3. TrueFi 대출 프로세스

TrueFi 대출 프로세스 요약

TrueFi의 대출 서비스는 LineOfCredit(LOC)와 FixedTermLoan(FTL) 두 가지가 존재합니다.

먼저 LineOfCredit 서비스란 차입자가 변동 금리로 차입자가 언제든지 자금을 인출하고 상환할 수 있도록 하는 서비스입니다. TrueFi 신용 점수가 충분히 높은 차입자에 한해서만 개설됩니다. 이러한 LineOfCredit 신용 대출은 전통 금융에서 제공하는 유동성 신용 한도 대출, 흔히 말하는 마이너스 통장 대출과 유사합니다.

다음으로 FixedTermLoan 서비스가 있습니다. FixedTermLoan 서비스란 차입자가 특정 기간 내에 자금을 빌리고 갚을 수 있는 서비스로서, stkTRU 가 관리하는 TrueFi DAO 풀 대출과 Portfolio Manager 관리 풀 대출로 나눠집니다. 그런데 Portfolio Manager가 제공하는 대출 서비스의 경우 Maple Finance 측에서 유사한 서비스를 먼저 제공하였으므로 이는 Maple Finance 편에서 설명하겠습니다. 본 글은 TrueFi의 특성이자 고유한 대출 프로세스를 전반적으로 살펴볼 수 있는 TrueFi DAO 풀의 FixedTermLoan 대출 로직 중심으로 소개할 것입니다.

TrueFi DAO 풀에서 FixedTermLoan 신용 대출을 받기 위해서는 우선 TrueFi 측에 화이트리스트가 되어야 합니다. TrueFi가 설정한 최소 요건을 충족하는 기관들(순자산 $10M 이상)은 자신들의 지갑을 화이트리스트에 등록하기 위해 TrustToken에 KYC/AML 서류를 제출합니다.

TrustToken은 자체 Know Your Business(KYB) 프로세스를 기반으로 대출 기관의 서류를 분석합니다. 이는 TrueFi 대출자 입장에서 채무 불이행 확률을 낮추고 미래 현금 흐름을 수취할 수 있는 가능성을 높여줍니다. KYB 프로세스 자체는 차입자의 프라이버시를 보호하기 위해 Off-Chain에서 비공개로 진행되지만, 현재까지 제공한 신용 대출에 대해 높은 상환율을 달성한 것을 보았을 때 성공적인 KYB 분석이 이루어졌음을 알 수 있습니다.

신용 대출 프로세스의 핵심은 신용 평가라고 할 수 있습니다. 기존 금융권에서는 신용을 평가하는 기관을 따로 만들어 차입자의 원리금 상환능력을 평가하는데 TrustToken이 바로 이러한 신용평가사와 같은 기능을 수행합니다. TrustToken은 0에서 255까지 자체 신용도 점수를 생성하기 위한 자체 신용 모델을 개발하였습니다. 거래 내역, 관리 중인 자산 유형 및 보관 등 다양한 양적, 질적 요소들에 대한 분석 등을 기반으로 신용도 점수를 계산하게 됩니다. 이렇게 계산된 신용도 점수는 TrueFi 대출 풀에서 대출이 발생할 때 자동 이자율 산정에 사용됩니다.

folkbank 의 대출 신청서 (Source: TrueFi Forum)

TrueFi에서 대출을 받고자 하는 기관들은 자신의 지갑이 화이트리스트 된 이후 대출 신청서를 작성해야 합니다. 이 때, 대출 신청서는 TrustToken이 아닌 stkTRU 홀더들의 투표에 따라 승인되거나 거절될 수 있습니다. 만약 차입자의 대출 신청이 stkTRU 홀더들에 의해 승인이 되면 차입자는 스테이블 코인을 지급 받음으로써 대출 프로세스가 끝나게 됩니다.

이 때, DAO 대출 풀에서는 대출한 금액에 대한 Loan Token(대출 토큰)이 생성되어 관리가 됩니다. Loan Token에는 대출 주소, 원금, 기간, APR 등이 기록되는 거래 불가능 토큰으로서 원금과 이자를 합친 수만큼 발행이 됩니다. 예를 들어 1M의 스테이블 코인을 12% 이자율로 30일 간 빌려갔다면(1년을 360일로 가정), 원금 1M개와 이자 10,000개(=1M*12%*30일/360일)를 포함하여 1,010,000개의 Loan Token이 발행됩니다. 따라서 처음에 1 Loan Token은 대출한 1 스테이블 코인에 비하여 1% 할인되어 발행이 되지만, 시간이 지남에 따라 만기 때는 1 Loan Token과 1 스테이블 코인이 동일한 가치를 가지게 되어 1:1 교환이 이루어지는 구조입니다.

https://cdn-images-1.medium.com/max/1600/1*-TEoIv3-QYFC_w3YMdFo8Q.png
시간에 따른 Loan Token 과 Stable 코인의 교환비 변화 (Source: TrueFi Docs)

4. TrueFi 대출 로직 : 코드 분석

지금부터는 대출 프로세스가 어떻게 로직 상에서 구현이 되는지 알아봅시다.이번 글에서 분석한 소스 코드는 2022. 07. 08 contracts-pre22 레포지토리 기준으로 작성되었습니다.

TrueFi의 대출 로직 (Truefi github 코드 참고)

TrueFi의 대출에 관여하는 주요 컨트랙트는 크게 4가지로 볼 수 있습니다.

  • FixedTermLoanAgency (FTLA): 사용자와 직접적으로 상호작용하는 컨트랙트로 대출, 상환 실행
  • LoanFactory : 대출 토큰을 발행하는 factory 컨트랙트
  • FixedTermLoan (FTL) : 대출 토큰 컨트랙트로 대출이 발생할 풀, 이자, 원금 등 대출 관련 정보를 담고 있는 ecr20 컨트랙트
  • TrueFiPoolV2 : 트루파이의 렌딩 풀

요약

차입자가 대출을 실행하면 대출 유효성 검토가 이루어 집니다. 이후 대출 정보가 담긴 Loan Token을 발행함과 동시에 trueFi 풀로부터 BUSD/ USDT /USDC/ TUSD 를 전송합니다.

1) 대출 유효성 검사

FixedTermLoanAgency.sol

허용된 차입자가 FTLA 컨트랙트의 borrow 함수를 호출하게 되면, 다음 4가지 사항을 검토함으로써 대출의 유효성을 검사하게 됩니다.

  • 차입자 unlock 여부
    대출이 일어나면 차입자의 주소는 lock 되고, 대출을 상환하면 차입자는 unlock 됩니다. unlock 여부 확인을 통해 트루파이 내 중복 대출을 제한합니다.
  • 차입자의 상태 확인
    TrueFi에서는 “Eligible” 한 차입자만 대출을 받을 수 있습니다. TrueFi 는 기본적으 로 신용 업데이트 기간(신용 유효 기간)을 31일, 채무 불이행에 대한 유예기간을 3일로 두고 있습니다. 사용자가 대출을 한 시점이 신용 유효 기간 이내면 Eligible 한 상태로 간주합니다. 유예기간에 있는 사용자면 OnHold, 대출을 못갚은 상태면 Ineligible 로 설정합니다.
FixedTermLoanAgency.sol
  • 대출 금액 확인
    차입자의 신용 점수와 풀의 상태에 기반하여 최대 대출 가능 금액과 비교합니다.
  • 대출 기간
    최대 대출 기간인 180일보다는 반드시 작아야 하며, 세부적인 기간은 신용 점수에 따라 달라집니다. 신용점수가 200점 이상이면 최대 대출 기간인 180일, 200점 미만이면 최대 90일 동안 대출이 가능합니다.

2) APY 계산

FixedTermLoanAgency.sol

이자율 계산은 TrueFi 신용 대출 프로세스의 핵심으로 TrueFi 대출 이자율 결정 파트에서 더 자세하게 설명하도록 하겠습니다.

3) 대출 토큰 발행

FixedTermLoanAgency.sol

입력 값에대한 대출 유효성 검사를 통과한다면 loanFactory 에서 대출 토큰을 발행합니다. 이 때, 새로운 대출이 발생할 때마다 다른 정보를 넣어 대출 토큰 컨트랙트를 발행하며, 토큰 발행시 대출 토큰의 상태는 Withdrawn이 됩니다. 토큰이 발행되면 차입자의 주소를 lock 시켜 또 다른 대출을 막고, 해당 풀에 대출 토큰 정보를 입력해 풀이 가지고 있는 대출 토큰들을 보관합니다.

4) 대출 풀로부터 자금을 가져와 차입자에게 전송

FixedTermLoanAgency.sol

위의 과정에서 발행된 대출 토큰들은 아래와 같이 트루파이 홈페이지 Analytics 란에서 볼 수 있습니다.

트루파이의 대출 토큰 목록 (Source: TrueFi )

5. TrueFi 대출 이자율 결정 로직 : 코드분석

TrueFi 의 특징은 Risk Pricing, 즉 대출 이자율이 온체인에서 자동으로 산정된다는 점입니다. TrueFi DAO 풀에서 차입자의 대출 신청서가 통과되면 TrustToken에서 산정한 신용 점수, 차입자의 TRU 토큰 스테이킹 양, 대출 풀에 남아있는 금액 등을 고려하여 자동으로 대출 이자율을 설정하고 이를 기록합니다. 해당 과정에 대해 자세히 알아보도록 하겠습니다.

요약

TrueFi 의 APY 계산 공식은 다음과 같습니다.

대출 APY = 기본 이자율 +풀 이용률 이자율 +신용 이자율 +기간 이자율

해당 APY 계산은 다시 세 단계로 나뉩니다.

  1. TrueFi는 기본 이자율과 풀 이용률 이자율, 신용 이자율을 구하고 이를 모두 합쳐 final_rate를 구합니다.
  2. final_rate 과 MAX_RATE_CAP인 500%를 비교하여 작은 값을 선택합니다.
  3. 해당 값을 기간 이자율과 더해줌으로써 최종 대출 이자율을 구하게 됩니다.

final_rate

https://cdn-images-1.medium.com/max/1600/1*K0AlR1Fj4st-kLs74VkjVg.png
RateModel.sol
https://cdn-images-1.medium.com/max/1600/1*c338W_ca3a_Z_U3Istv-oA.png
RateModel.sol

먼저 final_rate 을 구하는 과정부터 살펴봅니다. final_rate 은 base_rate, utilization_adjustment, credit_adjustment 세 요소를 합친 값입니다.

final_rate = base_rate + utilization_adjustment + credit_adjustment

1) 기본 이자율 (base_rate)

base_rate 는 secured_rate 과 risk_premium 의 합으로 표현됩니다. 여기서 secured_rate 는 Aave USDC 마켓의 7일 평균 차입 이자율을 의미합니다. risk_premium 은 유휴 자산 정도를 파악하여 거버넌스에 의해 결정됩니다. secured_rate 와 risk_premium 모두 차입자에 따라 변하는 값이 아니므로 base_rate 입니다.

2) 풀 이용률 이자율 (utilization_adjustment)

utilization_adjustment = utilization_adjustment_coefficient * (1/(pool_liquid_ratio)^utilization_adjustment_power — 1)

utilization_adjustment_coefficient = 0.50%
utilization_adjustment_power = 2

utilization_adjustment는 특정 풀 이용율에 따라 이자율을 증가시키는 공식으로 inverse power model에 따라 달라집니다. inverse power model은 풀에 남은 자금을 뜻하는 pool_liquid_ratio 의 역수를 활용합니다. 만약 대출 풀에 자금이 풍부한 경우 대출을 촉진시키기 위해 차입자에게 낮은 이자율을 제시합니다. 반면 대출 풀에 자금이 풍부하지 않은 경우 대출을 억제시키기 위해 차입자에게 높은 이자율을 제시합니다. 해당 기준은 50%로, 풀 이용률(utilization rate)이 50%를 초과하는 풀인 경우 금리를 증가시키고 풀 이용률이 50% 미만이면 금리에 최소한의 영향을 미치도록 설계하였습니다. 풀 이용률이 80%를 초과하는 풀의 경우에는 더욱 높은 대출 금리를 형성하는데, 현재 대출 풀 이용률은 95% 가량이므로 대출 신청 시 높은 이자율을 적용받게 됩니다.

3) 신용 이자율 (credit_adjustment)

신용 이자율 credit_adjustment은 effectiveScore로부터 산정됩니다.

https://cdn-images-1.medium.com/max/1600/1*mU0pGukZ1LUj1_Lt9mXLlQ.png
FixedTermLoanAgency.sol
rateModel.rate(pool,effectiveScore,amount).add(fixedTermLoanAdjustment); 

(1) effectiveScore

TrueFi 는 차입자의 신용한도를 높이고 차입금리를 낮추기 위해 신용 점수와 별개로 TRU 스테이킹 양에 따른 effectiveSocre 를 계산하여 대출 금리에 반영하고 있습니다. TRU 토큰의 핵심 유틸리티 중 하나는 TrueFi에서 거래자의 낮은 신용도를 보완할 수 있는 담보로서 작용하는 것입니다. 즉, 차용인이 TRU를 구입하고 스테이킹할 수 있는 인센티브를 부여했습니다.

uint256 _effectiveScore = min(creditScoreAdjustment.add(score), MAX_CREDIT_SCORE);

effectiveScore을 산출하기 위한 방법은 다음과 같습니다. 먼저 scorecreditScoreAdjustment 을 합친 값을 구하고, 해당 값을 MAX_CREDIT_SCORE(255)와 비교하여 작은 값을 선택합니다.

(1.1) score

score는 TrustToken에 의해 오프체인에서 계산된 신용 점수로 오라클로부터 가져오게 됩니다. 신용 점수는 0점에서 255점 사이의 값으로 평가 되며, 해당 점수가 높을 수록 차입자의 신용도가 좋다는 것을 의미합니다. 신용 점수는 30일마다 자동으로 스마트 컨트랙트 관리자가 업데이트 하고 기록합니다. 점수가 업데이트 되지 않거나 대출금을 갚지 못한 차입자에 대해서는 onHold 상태가 되며 onHold 상태인 차입자는 대출이 일시적으로 중지됩니다.

(1.2) creditScoreAdjustment

https://cdn-images-1.medium.com/max/1600/1*Z13Op1DEXvpJHFN9FE8Gzw.png
RateModel.sol

Δ(255-score) *conservativeStakedRatio / 10000(100%, BASE_POINT)

creditScoreAdjustment는 차입자의 스테이킹 양에 따른 비율을 나타내는 값입니다. 255에서 차입자의 신용 점수을 차감한 후 conservativeStakedRatio 를 곱한 값으로 계산됩니다.

(1.3) conservativeStakeValue

conservative_stake_ratio = min(100%, conservative_stake_value / borrow_amount)

conservativeStakedRatio를 구하기 위해서는 먼저 conservativeStakeValue를 구해야 합니다.

RateModel.sol

conservative_stake_value = ltv_ratio * oracle_price * staked_TRU

conservativeStakeValue는 staked_credit_limit 으로, 스테이킹 된 TRU 토큰 금액을 계산하여 신용 한도를 조절합니다. 우선 oracle_price는 TRU 체인링크에서 가져온 TRU 토큰 오라클 가격의 7일 평균 현물 이자율(spot rate) 입니다. TrueFi는 해당 오라클에 차입자의 스테이킹 된 TRU의 개수를 곱하여 해당 금액을 달러 금액으로 환산하며, ltv(Loan to Value)를 적용하여 다시 달러 기준 conservative_stake_value을 구합니다. 초기 ltv는 4000(40%) 로 설정되어 있습니다. 만약 차입자가 스테이킹 한 TRU가 없을 경우 0을 반환합니다.

(1.4) conservativeStakedRatio

https://cdn-images-1.medium.com/max/1600/1*YiTz4caG6PZPFP2dIXc6hA.png
conservativeStakedRatio

conservative_stake_ratio = min(100%, conservative_stake_value / borrow_amount)

이 때, conservative_stake_ratio를 구하기 위해 conservative_stake_value에서 borrow_amount를 나눈 값을 비교하게 됩니다. 스테이킹 한 TRU 의 40% 보다 빌리려는 금액이 작으면 (stake_value > borrow_amount) 100% 가, 스테이킹 한 TRU 의 40% 보다 빌리려는 금액이 더 크면 (stake_value < borrow_amount) conservative_stake_value / borrow_amount의 비율 n% 가 반환됩니다. 이렇게 계산된 conservativeStakedRatio는 부족한 신용점수에 (255-score)를 곱하여 creditScoreAdjustment 를 계산합니다.

creditScoreAdjustment = Δ(255-score) *conservativeStakedRatio / 10000(100%, BASE_POINT)

이후 creditScoreAdjustment 는 원래의 신용 점수에 더해지고, 신용 점수가 최대 점수인 255 점(MAX_CREDIT_SCORE)인 경우를 제외하고는 creditScoreAdjustment 점수가 더해진 값이 effectiveScore가 됩니다.

uint256 _effectiveScore = min(creditScoreAdjustment.add(score), MAX_CREDIT_SCORE);

요약하자면 effectiveScore 은 대출자의 금리 및 한도를 구하는 데 사용되는 입력값으로 차입자는 TRU 토큰을 스테이킹 하여 effectiveScore에 영향을 미칠 수 있습니다. 즉, 차입자는 TRU 토큰을 스테이킹함으로써 신용 대출 금리를 감소시키고 차입 한도를 높일 수 있습니다. 신용도가 좋지 않은 차입자의 입장에서는 TRU 토큰을 추가 스테이킹 함으로써 일종의 담보의 역할로 대체하고, 이를 통해 대출 금리를 감소시킬 수 있는 것입니다.

effectiveScore 는 신용 이자율 계산을 위해 rate 함수의 인자(score)로 들어갑니다.

(2) credit_adjustment

min(coefficient.mul(uint256(MAX_CREDIT_SCORE)**power).div(uint256(score)**power).sub(coefficient), MAX_RATE_CAP)

credit_adjustment = credit_adjustment_coefficient * ((MAX_CREDIT_SCORE/borrower_score)^credit_adjustment_power — 1)

MAX_CREDIT_SCORE = 255
creditAdjustment_coefficient = 10.00%
credit_adjustment_power = 1

credit_adjustment 는 신용도가 낮은 대출자들의 이자율을 증가시키는 공식입니다. 이 부분이 신용 점수가 대출금리에 영향을 미치는 부분이라고 할 수 있습니다. 신용점수(255점)가 가장 높으면 금리가 0% 인상되고, 255점 이하일 때마다 금리가 조금씩 상승합니다. 차입자의 신용점수가 160점 이하이면 금리는 급격하게 증가합니다.

https://cdn-images-1.medium.com/max/1600/1*gWAUB1HZ3Y2Gi1I2kntgkQ.png
신용 점수에 따른 신용 이자율 값

위의 공식을 그래프를 그려보면 다음과 같습니다. 신용점수가 작을 수록 y 값인 credit_adjustment 가 증가하며, 이 때문에 차입자는 TrustToken이 평가한 신용점수가 낮을수록, 스테이킹된 TRU토큰의 양이 적을 수록 높은 대출 이자율을 적용 받게 됩니다.

4) 기간 이자율 (fixedTermLoanAdjustment)

term.div(30 days).mul(fixedTermLoanAdjustmentCoefficient);

fixedTermLoanAdjustment란 대출 기간에 따른 이자율로서 최종 이자율에 더해지는 값입니다. 이는 대출기간을 설정할 때 30일 마다 기간 이자율을 증가시켜 대출자들이 위험이 큰 장기 대출보다는 위험이 작은 단기 대출을 받도록 유도하기 위함입니다. 초기값은 25로 설정되어 있지만 TrueFi 거버넌스에 의해 달라질 수 있습니다.

최종적으로 TrueFi의 대출 금리는 기본 이자율, 풀 이용률 이자율, 신용 이자율 그리고 기간 이자율의 합으로 산정되며, 이러한 Risk Pricing이 On-Chain에서 이루어지고 있다는 점은 타 신용대출 프로토콜과는 다른 TrueFi의 특징이라고 할 수 있습니다.

지금까지 TrueFi의 전체적인 구조와 대출, 이자율 결정 로직에 대해 알아 보았습니다. 다음 2편에서는 TrueFi의 상환, 청산 과정을 분석하고, TrueFi와 유사한 신용 대출 서비스를 제공하는 Maple Finance와 Goldfinch의 구조와 특징에 대해 다뤄보겠습니다.

--

--