29个版本 (7个重大更新)
0.11.1 | 2021年12月28日 |
---|---|
0.10.3 | 2021年11月16日 |
0.8.0-rc1 | 2021年7月29日 |
0.6.0-alpha1 | 2021年3月12日 |
0.4.0 | 2020年12月22日 |
#13 in #cw20
每月下载量90
215KB
4.5K SLoC
CW20债券曲线
这有三个用途
- 用于任意债券曲线的可用和可扩展的合约
- 展示如何扩展
cw20-base
以添加额外功能 - 展示[接收器接口](基本CW20接口)
设计
有两种变体 - 接受原生代币和接受作为储备代币的cw20代币(这是输入到债券曲线的代币)。
铸造:当输入被发送到合约时(无论是通过使用原生代币的ExecuteMsg::Buy{}
,还是通过使用cw20代币的ExecuteMsg::Receive{}
),这些代币将留在合约上,并为发送者的账户发行自己的代币(称为供应代币)。
燃烧:我们覆盖了burn函数,不仅烧毁请求的代币,还向烧毁自定义代币的账户释放适当数量的输入代币
曲线:handle
指定了一个债券函数,该函数被发送到参数化handle_fn
(它执行所有工作)。曲线在编译合约时设置。实际上,许多合约可以简单地包装cw20-bonding
并指定自定义曲线参数。
在此处了解更多关于债券曲线数学的信息。
注意:第一个版本仅接受原生代币作为
数学
给定价格曲线 f(x)
= 第 x
个代币的价格,我们想了解如何通过债券曲线进行买入和卖出。实际上,我们可以查看已发行的总供应量。令 F(x)
为 f(x)
的积分。我们向合约发送了 x
个代币以换取 F(x)
。或者相反,如果我们向合约发送 x
个代币,它将铸造 F^-1(x)
个代币。
基于此,我们可以创建一些公式。假设我们目前已经发行了 S
个代币,以换取 N = F(S)
个输入代币。如果有人给我们发送 x
个代币,我们将发行多少代币?
F^-1(N+x) - F^-1(N)
= F^-1(N+x) - S
如果我们卖出 x
个代币,我们将获得多少
F(S) - F(S-x)
= N - F(S-x)
每边只需进行一次计算。为了安全起见,使用 F^-1(S)
来估计应该发行多少时,务必向下取整,并始终检查与 F(S)
的对比。这将安全地给出我们需要返回的代币数量。
存在内置支持,可以安全地将 i128 升到整数的幂。还有一个 crate 可以 为所有整数提供 n 次根。有了这两个,我们可以处理除对数/指数以外的几乎所有数学问题。
将其与全部用 Solidity 编写进行比较
示例
价格常数:f(x) = k
和 F(x) = kx
以及 F^-1(x) = x/k
价格线性:f(x) = kx
和 F(x) = kx^2/2
以及 F^-1(x) = (2x/k)^(0.5)
价格平方根:f(x) = x^0.5
和 F(x) = x^1.5/1.5
以及 F^-1(x) = (1.5*x)^(2/3)
我们最初只实现这些曲线,并将更复杂的曲线(如对数)的导入留给他人。
依赖项
~4.5–6MB
~131K SLoC