分红型Token(ShareToken)及其去中心化交易所的设计与实现(2.0)

本项目实现了带分红的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日新闻:德国将批准“加密股票”发行条例。

三,设计思路:

3.1,思路核心点:

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,在大部分国家和地区需要当地法律和金融监管部门的支持与审计。

3.2,份额Token(IShareToken)接口:

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,ShareToken的交易所(Pair)接口:

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,相关接口:

  1. Pair的分红高度。这个高度用于流动性提供者使用。这个高度是流动性值和分红现金之间的高度。
  2. 流动性提供者的分红高度。
  3. 增加流动性。领取ShareToken的分红,更新Pair高度,增加流动性。
  4. 减少流动性。领取ShareToken的分红,更新Pair高度,再领取减少的ShareToken和所有DivToken。
  5. 流动性提供者提取分红。领取ShareToken的分红,更新Pair高度,计算流动性提供者的分红并领取,更新流动性提供者的Pair高度。注意:这里是按照流动性值的比例提取分红,而不是提供的分红Token数量的比例提取分红(参看“Pair的分红高度”)。
  6. 领取交易所拥有的ShareToken的分红DivToken。这个在交易和流动性改变的时候自动执行,可以不单独拿出来做一个接口function。
  7. 计算交易价格。先得到交易所的待分红DivToken,再更新当前价格。
  8. Magnitude值,处理流动性值和分红资产之间的数据倍数。这里需要的,因为每次分红都要分干净!
  9. 自动停止交易。极端情况当执行分红后导致ShareToken的价格小于等于0的时候,自动停止交易。例如当前ShareToken的价格是1ETH,结果分红分了1.2ETH(当然这是不合逻辑的),这种情况这个交易对就自动永久的停止交易,流动性提供方只能领取SareToken和对应DivToken。

四,程序:

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):

38gbMCly62f0b449ecc0e[1].png

2,特斯拉股份Token被指派给指定人员(挖矿)

DPim46RG62f0b4714d15a[1].png

3,特斯拉股份Token执行分红

GgcMgNmU62f0b48771d4a[1].png

4,领取特斯拉股份Token的分红

tG802jv962f0b49b39c7c[1].png

5,特斯拉股份Token的分红历史列表

XL6ZSptA62f0b4afd8496[1].png

6,特斯拉股份Token发布公告(链上公告) 创建Token时候有说明信息录入,挖矿的时候也有说明信息录入,这些说明信息都是公告。还可以单独发出公告:

wL10x87w62f0b4c479c7a[1].png

7,特斯拉股份Token的公告列表

kZueVIie62f0b4d90bd3b[1].png

8,设置特斯拉股份Token的图标(链上图标,锦上添花的功能)

QetuNiyp62f0b4ec2aebd[1].png

第二部分,分红Token在去中心化交易所的不中断交易(分红过程也不中断) 1,创建特斯拉股份Token的交易对:

N6Unqntk62f0b503754fd[1].png

2,添加和删除流动性:

MpK37aqA62f0b524db97a[1].png

c6mIdThR62f0b52cdede6[1].png

其中,图上红色部分是可以领取的分红金额和存储金额,在提取流动性时候也一并提出。

3,交易

uMu4Sbto62f0b54014a55[1].png

4,流动性提供者领取分红

5WyNszrr62f0b554acdee[1].png

五,常见问题公示和答疑:

  1. ShareToken(分红型Token)和对应的去中心化交易所的主要意义有哪些?在我们链下金融市场,大部分金融凭据都是持有即受益,例如:股票有分红,存款有利息,大部分理财也有回报,等等;如果这些高价值链下金融产品(STO)进入链上,是巨大市场。在链上这些xSushi类质押挖矿的项目,也类似ShareToken,链上还会出现更多红型ShareToken。现在缺的是统一的分红型ShareToken的接口定义和对应的去中心化交易所,把这个短板补上,就可以方便分红型ShareToken的链上流通。链下分红可能需要暂停交易,但是链上流通不需要暂停,这是链上交易的优势之一。
  2. 看这份文档需要哪些基础知识?建议要理解分红的算法(可以参见https://github.com/ethereum/EIPs/issues/1726);了解Uniswap的恒定乘积原理;会一点Solidity语言;了解ERC20标准,等。
  3. ShareToken可以质押吗?可以,但怎么处理红利是另外一个问题,或许需要处理二次分红的问题,就如本文的交易对(Pair)一样。
  4. 分红型ShareToken和STO的关系是咋样的?STO可以是分红型ShareToken,也可以不是。分红型ShareToken是一种功能,而STO是一种业务标准。绝大部分STO应该可以做成分红型ShareToken。
  5. 质押挖矿型分红的ShareToken可以上本文交易所吗?可以的,但需要满足接口(IDivShareToken)要求。
  6. 客户端和合约可以改进吗?可以。2022年6月是第一版;2023年2月是第二版,也是当前版本,这个版本的合约我认为是稳定版本,客户端改善空间较大。至于以后我是否继续改善,要看情况;其他爱好者也可以参与改进。对于Pair合约部分,相比于UniswapV2&V3,有一些小细节可以改进(某些小细节可以减少很少的Gas开销),也可以增加一些有用的辅助功能(例如MultiCall等);最好能够采用UniswapV3的价格分段计算方式,以提高流动性资金效率。当前版本的重点是保证安全和准确,达到商用级别。如果要采用UniswapV3的计算方式,推荐Uniswap团队做,或者等我们团队处理完了排期的任务后再处理。
  7. 合约部署在哪儿?在测试网(https://sepolia.etherscan.io/)上,ShareToken合约工厂:0xaaa640a1e75b167e8fd5f32b98af7fde8a5d7778;交易对合约工厂:0x684e47e8f4c41abd96d65be15f1828985a613d4b;拍卖合约:0x48418623fd7079a6a6e607402d526d1d12b10619
  8. 源代码存放在哪里?在github上,具体网址是:https://github.com/heddhshan/ThisShareToken/tree/master。源代码包括合约,数据库,客户端C#代码,等
  9. 其他人可以使用这些合约用于商业用途吗?可以的,但我不承担任何风险。2022年6月版本企图收费,但实际上没人会缴费使用;现在的2023年2月版本全部免费,这么做的目的是希望有人使用;但正是因为做这个没有收入,我改进和推广的动力并不强,早就完成了2.0版本到目前才开源出来。如果没有大的bug(计算错误或安全类BUG才是大的BUG),这个版本可能是我公布出来的最终版本。
点赞 0
收藏 2
分享

1 条评论

请先 登录 后评论
Phi·Wallet
Phi·Wallet
做各类基于以太坊的DAPP和数字资产交易所