dai_code
dai结构及源码解析
结构图如上所示,vat左边的主要是管理控制修改vat及vat右边各合约各参数的合约,红线file为调用各合约中file方法,也就是修改各合约中相应参数。如vat中file为P427L-9Y552-5433E-8DSR3-58Z68
1 | function file(bytes32 what, uint data) external note auth { |
vat是CDP的主要逻辑合约。
cat为清算触发合约,通过调用cat.bite方法,当满足清算条件就会触发清算。具体逻辑稍后提及。
vow为结算合约,通过vow的结算条件可触发flop和flap。
flip为抵押物拍卖合约,拍卖由cat触发,拍卖逻辑稍后提及。
flop和flap分别为债务拍卖和盈余拍卖,由vow触发。
vat
变量
1 | //抵押物id对应的参数 |
主要讲讲frob方法吧,这个方法可谓是精短又强悍!
1 | //bytes32 i ilk标识, address u cdp所有者,v 抵押物所有者,w 获得dai的所有者,dink 参与的抵押物,dart参与的债务 |
在以上这个方法中,包含了很多种用法,包括新增cdp、偿还等等,例如当dart>0的时候,就是借贷,当dart<0的时候,偿还。
首先,当借贷/增加抵押物时,抵押物为dink >=0, 贷款dart >0。贷款价值为dart * rate,抵押物价值为dink * spot。借贷需要满足的条件如下
贷款价值 < 债务上限line, 且该抵押物的总贷款价值<Line上限
贷款价值 <= 抵押物价值,这里理解一下rate,当rate > 1,其实就是说可贷的dart其实是小于真正抵押物价值的,用来调控风险。
u为调用者,或者调用者是u的下层授权管理(u授权x以操作其cdp)
贷款价值 > 债务下限 dust
当条件判断完毕后,进行扣除/赎回抵押物(gem),借出/偿还dai。
cat
1 | function bite(bytes32 ilk, address urn) external returns (uint id) { |
example
补充,借贷的第一步,会有一个join合约,就是帮忙保管币/代币。调用join方法,会将币/代币转移到本合约地址下,然后本合约会调用vat.slip方法,如
1 | function join(address usr, uint wad) external note { |
测试参数
1 | vat.init("gold"); |
1 | address urn = address(this); |