# Staking 合约（SC）

## Staking合约

Staking合约指的是Stafi链上记录和更新rToken和原生token映射关系的一组代码。后文我们用英文SC简称代替。

Stafi每支持一个PoS项目的Staking就会有一个SC，随着某个项目委托资产量的增加，Stafi会为此项目，创建多个SC，以分散管理资产，控制风险；与此同时，Stafi支持的PoS项目不止一个，严格来说我们应该用复数SCs，代表这是一个合约组，但为了简便，我们依旧用SC。在所有的SC中，支持XTZstaking操作的Staking Contracts称之为 XTZ\_SC,支持Atom staking操作的称之为Atom\_SC，通过SC ，Stafi为用户实现质押，赎回，派息，交易等操作。

### **质押过程**

当用委托人在Stafi上申请质押的时候，SC将用户委托的token放在一个多签账户，多签账户为SC在原链上创建的一个特殊账户，由Stafi链上的多个SSV控制，任何一个SSV都无法单独控制；然后SC将多签账户中的token委托给原链上值得信赖的验证者，参与到Stake当中；最后，SC生成对应数量的rToken，发放到用户的Stafi账户，质押过程完成。

### **赎回过程**

当用户在Stafi上申请赎回的时候，SC会先锁定用户Stafi账户中的rToken,并发起取消委托Staking，经过锁定期，取消委托完成后，SC将多签账户的token转移回用户在原链的账户（此过程需要SSV签名验证），然后销毁之前锁定的rToken，赎回过程完成。

由于PoS链Staking锁定期的存在，用户从申请赎回到赎回完成，需要等待一定的时间。

### **派息过程**

派息是指向用户派发Staking收益的过程，SC定期向用户结算一次收益，收益以rToken方式结算。这意味着收益是自动参与复利的。在派息时点，SC会和原链通讯，获取收益状况，并更新各账户rToken的数字。

SCs向用户结息的周期是统一且相对固定的。受委托的验证者向多签账户结算收益的频次，和出块的频次相同，根据不同的PoS链不同，大约在几秒钟到几分钟时间不等。但SCs会将结息周期均一化处理，统一为一个固定的，较长的结息周期，例如一天一次（可通过治理投票调整）。这样做可以减少和原链的交互次数，节约资源。

另外，Stafi对同一token类型的所有委托人的收益做均一化处理，以给用户更稳定的预期，这点和大多PoW的矿池的做法相似。

### **交易过程**

交易过程不需要和原链交互，用户A请求向用户B转移rToken时，SC只需要将A用户的Stafi账户中的rToken转移到B用户的Stafi账户即可，与此同时，rToken所代表的赎回权和收益权也从A用户转移到了用户B手里。交易完成后的下一个派息时点，Staking收益会结算给用户B。

### **最终确定性**

大多PoS链是出块即确定模型，只要交易被打包到区块里，这条交易就不能再篡改，也有一部分PoS链是概率确定型，类似于比特币，需要等到N个区块后，才能把交易被推翻的概率降到临界值以下。基于PoS链的这个特点，SCs在处理质押过程，赎回过程，包括派息过程时，都会有一定时间的延迟等待期。如果交易没有成功上链，SCs也会向用户做出操作失败的反馈。这样做避免Stafi和原链的数据产生不一致。
