> For the complete documentation index, see [llms.txt](https://thrupenny.gitbook.io/cnwhitepaper/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://thrupenny.gitbook.io/cnwhitepaper/guan-yu-tpy/zhu-yao-te-dian/jie-dai/gui-ge.md).

# 规格

## 架构规格

<figure><img src="https://2250260283-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FXEZx20xoOh76RKtAiLNJ%2Fuploads%2F5VSD93qVcdS8vIDnYVJy%2F57.jpg?alt=media&amp;token=8525e19e-2d58-4e0c-b72e-4deec34b597c" alt=""><figcaption><p>Thrupenny借贷规格的高级架构图</p></figcaption></figure>

1. 资金存储在每个特定的aToken中。这使得协议在资产之间有更好的隔离，有利于实现对流动性挖矿敏感的aTokens。&#x20;
2. 库减少了所有行为的Gas消耗，同时优化了代码的复杂度和冗长度。&#x20;
3. 所有操作都通过`LendingPool`进行。&#x20;
4. 债务代币追踪用户的债务。

## 特性规格

### aTokens

* 支持EIP-2612&#x20;
* 基础的aToken实现中没有利率重定向

以下定义为真：

* `LRasset t`，**当前的流动性率。**\
  总借款率和利用率的函数 `LRt = RtUt`
* `LIt`，**累计流动性指数。**\
  在时间间隔∆T中，储备累积的利息，当借款、存款、偿还、赎回、交换、清算事件发生时更新。

`LIt = (LRt∆Tyear + 1)LIt−1 LI0 = 1 × 1027 = 1 ray`

* `N It`，**储备的归一化收入。**\
  储备累积的持续利息 `N It = (LRt∆Tyear + 1)LIt−1`

用户索引事实上消失为一个存储变量，并与主要余额一起存储为一个被称为"**缩放余额**"的比率，*ScB*。用户的余额计算导致每个操作都增加或减少，导致aTokens的铸造或销毁：

* **存款。**&#x5F53;用户在协议中存入数量m时，他的缩放余额按如下方式更新：

`ScBt(x) = ScBt−1(x) + m N It`&#x20;

* **提款。**&#x5F53;用户从协议中提取数量m时，他的缩放余额按如下方式更新：

`ScBt(x) = ScBt−1(x) − m N It`

在任何时候，用户的aToken余额可以写为：`aBt(x) = ScBt(x)N It`

***

### 债务代币化

债务代币的总供应量，包括每秒累积的债务，定义如下：

`dSt = ∑ i∈users ScBt(i) 其中ScBt(i)`为每个用户i

借入的金额 在时间t时，资产的总债务定义为：&#x20;

`Dasset t = SDt + V Dt 其中SD`为稳定的债务代币供应量，V D为可变的

***

### 可变债务

以下定义为真：

* `V Iasset t`，**累计的可变借款指数**\
  可变借款V B在时间∆T内，以可变利率V R积累的利息，每当借款、存款、偿还、赎回、交换、清算事件发生时更新。

`V It = (1 + V Rt Tyear )∆T V It−1`

* `V I(x)`，**用户累计的可变借款指数**\
  当用户开启可变借款位置时存储的特定用户的可变借款指数。//

`V I(x) = V It(x)`

* `P B(x)`，**用户的主要借款余额**\
  当用户开启借款位置时存储的余额。在多次借款的情况下，复合利息每次都会积累，它成为新的主要借款余额。

可变债务代币遵循缩放余额的方法。一个正规化的可变（累积）债务的概念：

`V Nt = (1 + V Rt Tyear )∆T V It−1`

`ScV Bt(x)`是用户x在时间t时的缩放余额，m是交易金额，`V Nt`是正规化的可变债务：

* **借款。**&#x5F53;用户x从协议中借入金额m时，缩放余额更新

`ScV Bt(x) = ScV Bt−1(x) + m V Nt`

* **偿还/清算。**&#x5F53;用户x偿还或被清算金额m时，缩放余额更新

`ScV Bt(x) = ScV Bt−1(x) − m V Nt`

在任何时候，用户的总可变债务余额可以写为：

`V D(x) = ScV B(x)Dt`

***

### 稳定债务

对于稳定利率债务，以下为真：

`SRasset t`，整体稳定利率

* 当以利率 `SRt` 发布稳定借款金额 `SBnew` 时：`SRt = SDtSRt−1+SBnew SRt SDt+SBnew`&#x20;
* 当用户 `x` 以稳定利率 `SRi(x)` 还清稳定借款 `i` 以及金额 `SBi(x)` 时：

`SRt = { 0，如果 SDt - SB(x) = 0 SDtSRt−1−SB(x)SR(x) SDt−SBx，如果 SDt - SBx > 0`

`SRt` 存储在每种特定货币的稳定利率代币中。用户 x 的**稳定债务代币** `SD(x)` **余额**如下定义：

`SD(x) = SB(x)(1 + SRt Tyear) )∆T`

每个资产储备的稳定利率 `SR(x)` 是跨越 `i` 个稳定贷款计算的：

`SR(x) = ∑ i SRi(x)SDi(x) SDi(x)`

***

### 抵押品交易

Thrupenny 提供了一种交换已存款资产（无论是否用作抵押品）的方法。这通过以下方式实现：

* 用户调用 `flashLoan()` 函数，作为参数传递接收合同的地址，该地址实现了 `IFlashLoanReceiver` 接口，这是一个**不受信任的合约**，用户应提前进行验证；要交换的底层资产列表，这些资产的金额列表以及包含要交换的资产和用户选择的最大滑动的一个额外参数，两者都进行编码。&#x20;
* 接收合同将使用收到的资金将其交换为目标资产，再次代表用户存款，并提取用户在 Flashed-货帐户中的存款以偿还 Flash Loan。

***

### 用抵押品偿还

此功能允许用户使用存放在协议中作为抵押品的一个或多个资产，部分或全部偿还他的债务/位置。与 `Swap Liquidity` 以及基于 Flash Loans 的所有功能一样，抵押品偿还使用 `flashLoan()` 函数和接收合同，该合同实现 `IFlashLoanReceiver` 接口。给这个接收器传递了一个用于闪烁和使用交换和偿还的抵押资产列表，这些资产的金额列表，以及编码的偿还债务的资产列表，偿还的债务金额列表，以及每个债务资产的借款模式（稳定或可变）列表。需要注意的是，在这种情况下，接收合同将期望接收到**需要偿还的确切金额**，与 `Swap Liquidity` 不同，那里期望的金额是确切的要交换的抵押品。此功能的流程将是：

1. 用户在协议中存了100 TPY，并有200 USDC 的变动率债务。由于他目前没有可用的 USDC 资金来偿还他的贷款，他希望将他的 TPY 抵押品的一部分换成 USDC 并用它来偿还。&#x20;
2. 用户调用 `flashLoan()` 函数，作为参数传递：包含进行操作的逻辑的接收合同的地址，TPY 的地址，7 作为要交换的抵押品金额（估计需要 TPY 来覆盖200 USDC 的债务），200 作为要偿还的债务金额以及用作借款模式的变量。&#x20;
3. 接收合同将通过使用交易所将7 TPY换为 USDC。&#x20;
4. 接收合同将使用交换得来的 USDC 代表用户偿还协议中的 USDC 债务。
5. 一旦债务偿还，接收者将转移需要从用户那里取回闪存 TPY 的 aTPY 金额，将其赎回为 TPY，并批准池在 Flash Loan 交易结束时拉取这些资金。&#x20;
6. 如果最后交换得的7 TPY有剩余，这些资金将代表用户存回协议中，或直接发送到他的钱包。

***

### 信用授权&#x20;

`borrow()` 函数支持向不同地址提供信用额度，无需抵押品，只要已经授予了呼叫者地址额度。&#x20;

此功能是通过每个债务代币上的 `approveDelegation()` 函数实现的。用户将能够按照特定的债务模式（稳定或可变）提取高达其额度的资金。`borrow()` 函数有一个 `onBehalfOf` 参数，供呼叫者指定用于提取信用的地址。&#x20;

信用授权的实施需要一些权衡：&#x20;

* 委托人可以向多个实体授权信用，但受托人一次只能从单个委托人处提取信用。人们不能在单一的 `borrow()` 中汇总委托人的债务。&#x20;
* 委托人可以同时向一个实体授权稳定和可变的信用，但受托人不能从单一的 `single borrow()` 中提取可变和稳定的信用。
