📖DeFi-StableCoin

type
status
date
slug
summary
tags
category
icon
password

初始化项目

老样子,
forge init
②删三个原文件、
forge install openzeppelin/openzeppelin-contracts@v4.8.3 --no-commit
并在foundry.toml中添加:

新建src\DecentralizedStableCoin.sol:

本项目导入ERC20Burnable:
记得用is继承,
这里ERC20Burnable又继承了ERC20,所以只用is ERC20Burnable
但是ERC20又有构造函数,Ownable也有,所以本合约构造函数还需要这样写:
最后DecentralizedStableCoin.sol文件如下:

新建DSCEngine.sol:

文档注解:

导入AggregatorV3Interface

为了得到抵押品的实时价格,导入chainlink预言机
需要安装
并在foundry.toml的remapping中添加:

HealthFactor

healthFactor 是一个比率,衡量用户的抵押品价值和他们铸造的稳定币数量之间的关系:
通过公式计算:healthFactor = (collateralAdjustedForThreshold * PRECISION) / totalDscMinted。如果这个值低于1,意味着用户借出了过多的DSC,系统可能会强制清算用户的抵押品。 如果用户有价值 $1000 的抵押品,而系统的 LIQUIDATION_THRESHOLD 是 50%,那么该用户实际上只能够借出不超过 $500 的价值。

DSCEngine.sol代码

新建script/DeployDSC.s.sol

创建智能合约部署脚本,用于部署 DecentralizedStableCoinDSCEngine 合约。

初始框架:

实例化DecentralizedStableCoin和DSCEngine

DecentralizedStableCoin的构造函数是这样,不需要其他参数:
而DSCEngine的构造函数是这样,除了dscAddress,还需要tokenAddresses[]和priceFeedAddresses[]:
所以为了提供这两个地址数组,需要新建HelperConfig.s.sol。

新建HelperConfig.s.sol

在本地部署Anvil测试环境,得到第一个私钥为默认私钥,用于本地开发时的部署者身份
notion image
得到0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80
HelperConfig.s.sol代码:

新建MockV3Aggregator.sol

用于测试与价格预言机交互的智能合约。
MockV3Aggregator 模拟了实际的 Chainlink 预言机,允许开发者在本地或测试环境中手动设置价格数据,而不依赖真实的价格来源。
可以直接复制粘贴使用:

depositCollateralAndMintDsc

用于存入抵押物和铸造DSC。
tokenCollateralAddress 作为抵押物的代币地址 amountCollateral 存入的抵押物数量 amountDscToMint 要铸造的DSC数量
记得把depositCollateral和mintDsc改为public。

redeemCollateralForDsc

允许用户销毁一部分 DSC 代币以赎回部分抵押品。
销毁DSC:
赎回抵押物:

liquidation

collateral:用户用于抵押的ERC20代币的地址。 user:被清算的用户地址。其健康因子低于预设值,说明该用户资不抵债。 debtToCover:清算者希望销毁的DSC(去中心化稳定币)的数量,用以覆盖用户的部分债务。 当用户的健康因子(抵押品价值与债务的比率)低于设定的最小值时,清算该用户并给予清算者奖励。 清算者可以销毁一定数量的DSC来清算用户部分或全部的抵押品。清算者将获得清算奖励,奖励额为用户被清算的抵押品价值的10%。 一个已知的问题是,如果协议的抵押率低于或等于100%,我们将无法激励清算者。例如,如果抵押品的价格在清算之前暴跌,我们将无法及时清算用户

DeployDSC.s.sol代码:

新建test/uint/DSCEngineTest.t.sol

初始框架:

调整DeployDSC.s.sol:

价格测试

检查 DSCEngine 合约的 getUsdValue 函数是否正确计算出 WETH 的美元价值
forge test --mt testGetUsdValue,成功:
notion image

抵押物测试

检查如果用户尝试存入 0 作为抵押品,DSCEngine 是否会正确地回退交易
forge test --mt testRevertsIfCollateralZero,成功:
notion image

Fuzz test

foundry.toml添加配置:
新建文件test\fuzz\Handler.t.sol和test\fuzz\InvariantsTest..t.sol.
InvariantsTest..t.sol:
Handler.t.sol:
上一篇
Movement深圳线下交流会成功举办
下一篇
foundry-NFT
Loading...