本项目实现了带分红的ShareToken,并实现ShareToken的去中心化交易所,解决了分红型凭据在以太坊的发行和流通的技术问题。
2023年8月20日更新 BY he.d.d.shan@hotmail.com
1, ShareToken,份额Token,在本文是带分红的Token,也称分红型Token,类似于股票。 2, DivToken,被分红的Token(有时也简称分红Token),用于ShareToken的分红,类似于被派发股息的币种,例如美元或人民币。 3, Pair,交易对,和UniswapV2的Pair一样(也类似于UniswapV3的Pool),一个交易对负责一对Token的交易。
实现了带分红的ShareToken,并实现ShareToken的去中心化交易所,解决了分红型凭据在以太坊的发行和流通的技术问题。
1, 有人尝试定义分带红型的Token(参见: https://github.com/ethereum/EIPs/issues/1726),我也尽量使用他的术语,以此向这同行致敬。 2, 质押分红很流行,典型应用包括寿司(Sushi),但质押分红无法解决持有即分红的需求。Eip-4626(https://eips.ethereum.org/EIPS/eip-4626)也能实现质押分红。 3, 带分红的ShareToken有巨大的市场(股票,定期存款,国库券等凭据都可以看作分红型凭据),要方便流通必然需要有去中心化交易所的支持。像乌克兰这样的国家,其企业在当前战争期间可能难于融资,使用这种方式融资可能有用。一些交易所和银行也在尝试STO(和分红型ShareToken有交集,绝大部分属于分红型ShareToken),这是一个潜在的巨大市场。2023年4月5日新闻:德国将批准“加密股票”发行条例。
1, 带分红的ShareToken的设计,有人尝试。对照 https://github.com/ethereum/EIPs/issues/1726 来说明: a) 继承于ERC20Token,一般使用ShareToken称呼;ShareToken有分红Token(DivToken,类似于EIP-4626的资产)用于分红。 b) 对于每次分红,无法处理的余额,可以留作下一次分红,也可以忽略,这两种模式都可以。如果选择每次都分红完所有金额(忽略分不完的金额),则需要设置Magnitude值,来大大减少分不完的金额数量。 c) Magnitude值的定义,我提供了一个算法,来估计Magnitude的合适值,不需要写死指定某个值。可以参见合约中 “function getPairRecommendedPowerM(address shareToken) public view returns (uint8 PowerM)”。 d) 提出了分红高度的概念。每次分红后,高度都会递增。可以用分红次数表示高度,也可以用累加分红金额表示高度。Demo中使用每股分红金额累加表示高度。对于每个Owner来说,如果份额变化,高度需要更新到当前(最高)。 e) 如果扩股(或缩股),方法很多,比较简单的方法就是:选择重新发布ShareToken,原来的ShareToken质押进入新的ShareToken获得固定比例的新ShareToken。本系统暂时没实现这个功能,这个功能比较简单,以后有需要可以做个Demo。 详细的请参阅:IDivShareToken,DivShareToken和 BasicBusShareToken 等合约。 2, ShareToken的去中心化交易所的设计,流动性算法参照UniswapV1和UniswapV2,需要增加特殊功能:流动性提供者要能得到应有的分红。对照Uniswap各个版本的相同和不同部分来说明: a) ShareToken只有一个交易对(Pair),ShareToken 对应其DivToken。 b) 采用Uniswap的恒定乘积流动性算法,没采用UniswapV2使用Erc20Token表示流动性的方法,也没采用UniswapV3使用多个价格区间并发行NFT表示流动性的方法,更类似于UniswapV1的做法和V2的做法的结合体。以后可以改成UniswapV3的做法,这会极大的提高资金效率。 c) 交易对(Pair)里面实现分红功能,所有的流动性提供者按照流动性值的比例分取红利,且分红操作不影响交易(交易不中断)。 d) Uniswap中的其他功能,例如FlashLoan,Oracle,Permit,WETH(会简化合约),Fee,等辅助功能都没提供。核心点在于展示逻辑;如果以后有必要可以增加类似功能。 3, 和传统证券联系,可能会有这些场景: a) 某资产管理公司存管了1000股特斯拉股票,以此发行1000个ShareToken。如果有人持有这种ShareToken,可以向资管公司要求赎回真实的股票。类似于USDT的运营,但多了股票分红功能。 b) 乌克兰某高科技公司,希望融资生产轮船,承诺分发红利,向乌克兰金融管理局申请发行股票,金融管理局审核并通过了该申请,允许在以太坊上发行对应的ShareToken。此公司把融资需求、分发红利、财务报表、公司事件等都在以太坊上公布或操作。 c) 某银行的大额存单,通过ShareToken证券化,并在链上发利息。 不仅仅这些场景,ShareToken可以和很多已有的其他金融产品对接,这类ShareToken一般是STO,在大部分国家和地区需要当地法律和金融监管部门的支持与审计。
1, 满足所有ERC20接口。 2, IShareToken特有的接口: a) DivToken,用于分红的币种,可以是ETH,也可以是ERC20Token。 b) 当前已分红高度。采用每股累加分红。 c) 当前待分红金额(其内部实现可以记录已分红总金额A、已领取总金额B、当前拥有总金额C,由C+B-A得到)。 d) 当前待分红高度(当前高度+当前待分红金额对应的高度),也可叫做未执行高度。由当前高度加上带分红金额除以当前股份得到。在份额发生变化、份额转让、等情况前,要把待分红高度更新到当前高度。 e) 执行分红。把待分红高度更新到当前高度。当未执行高度大于当前高度才能执行分红。 f) 用户分红高度更新。在用户的份额发生变化前、或者领取分红后,都需要更新用户的分红高度。可以是内部function(如果是外部function,则任何人可以调用)。 g) 用户领取分红。从合约领取分红,需要定义对方接口!只有自己可以调用(以前是任何人可调用)。用户领取自己的分红金额,其流程是:执行分红,更新分红高度到当前高度,计算得到所有分红金额并领取出来。 h) 用户的当前分红高度。 i) 用户待领取的分红金额。这个要从未执行高度计算。 j) Magnitude值,用于每次的分红金额都分完,如果不用分完就不要。创建ShareToken的时候要求其decimals比DivToken的decimals少3位以上。ShareToken的交易所,需要这个Magnitude值。所以有一个“分红保留分不尽金额下次再分”的标识,当Magnitude等于0的时候就是“Yes”,Magnitude不为0就是每次分完“NO”。理论上来说,如果是从不受限制的地方接受分红金额的ShareToken,不应该有这个值,其中一个原因就是可能存在恶意的极小分红金额打入(例如打入最小单位Token),导致不停计算! 要注意:利润方可以直接打款,而没有触发执行分红!所以就有未执行高度。所以每次执行分红等操作的时候,都要重新计算当前未执行高度。相关的概念和计算公式如下: 1, 已分红总额。每次执行分红的时候累加。 2, 当前余额。balanceOf(this) 或 address(this).balance 获得。不管哪种方式向ShareToken打钱,都会导致余额发生变化。 3, 已领取总额。每次提现的时候累加。 总分红金额 = 当前余额 + 已领取总额。 待分红金额 = 当前余额 + 已领取总额 - 已分红总额。 这种方式计算待分红金额是最准确最全面的!
3.3.1,交易处理流程: 1, 执行Sharetoken的分红功能,领取分红。 2, 分红金额大于0,处理交易所(Pair)分红Token的价格,和流动性提供者的分红。注意:这里的分红金额要处理完(使用Magnitude)。 3, 记录在ShareToken中的分红高度和总分红金额: a) 更新用户(交易者)的在ShareToken的分红高度(这一步应该可以省略,只是我自己没有测试省掉的这个路径,所以暂时这么处理。),要求其高度和Pair在ShareToken中的高度一样。 b) 记录ShareToken当前的总分红金额。 4, 开始交易。 5, 检查ShareToken的分红高度和总分红金额: a) 检查用户(交易者))在ShareToken的分红高度,以及交易所在ShareToken中的分红高度,要求没有改变,而且一样(参加第三步),都和分红Token当前的未执行高度(也等于当前高度)一样。原则是不能在交易过程中发生分红操作! b) 检查总分红金额,不能变。 3.3.2,相关接口:
2023年3月1日增加说明:程序和合约有修改,有些界面有微调,但总体思路没改变,为了偷懒我继续使用了原来的截图。
两部分,包括合约和一个客户端。核心逻辑在合约,是开源的,采用和UniswapV3一样的版权保护“BUSL-1.1(https://spdx.github.io/license-list-data/BUSL-1.1.html)”。但分红Token接口定义是“MIT”版权保护,以后可以提交EIP申请。 客户端是一个APP,不是网页,实现了所有重要功能,有改善的余地。 以特斯拉股份上链为例子,分两部分展示客户端的部分截图: 第一部分,分红Token的详细情况: 1,创建特斯拉股份Token(分红型Token):
2,特斯拉股份Token被指派给指定人员(挖矿)
3,特斯拉股份Token执行分红
4,领取特斯拉股份Token的分红
5,特斯拉股份Token的分红历史列表
6,特斯拉股份Token发布公告(链上公告) 创建Token时候有说明信息录入,挖矿的时候也有说明信息录入,这些说明信息都是公告。还可以单独发出公告:
7,特斯拉股份Token的公告列表
8,设置特斯拉股份Token的图标(链上图标,锦上添花的功能)
第二部分,分红Token在去中心化交易所的不中断交易(分红过程也不中断) 1,创建特斯拉股份Token的交易对:
2,添加和删除流动性:
其中,图上红色部分是可以领取的分红金额和存储金额,在提取流动性时候也一并提出。
3,交易
4,流动性提供者领取分红
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!