📖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
创建智能合约部署脚本,用于部署
DecentralizedStableCoin
和 DSCEngine
合约。初始框架:
实例化DecentralizedStableCoin和DSCEngine
DecentralizedStableCoin的构造函数是这样,不需要其他参数:
而DSCEngine的构造函数是这样,除了dscAddress,还需要tokenAddresses[]和priceFeedAddresses[]:
所以为了提供这两个地址数组,需要新建HelperConfig.s.sol。
新建HelperConfig.s.sol
在本地部署Anvil测试环境,得到第一个私钥为默认私钥,用于本地开发时的部署者身份

得到
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
,成功:
抵押物测试
检查如果用户尝试存入 0 作为抵押品,DSCEngine 是否会正确地回退交易
forge test --mt testRevertsIfCollateralZero
,成功:
Fuzz test
foundry.toml添加配置:
新建文件test\fuzz\Handler.t.sol和test\fuzz\InvariantsTest..t.sol.
InvariantsTest..t.sol:
Handler.t.sol:
上一篇
Movement深圳线下交流会成功举办
下一篇
foundry-NFT
Loading...