29个版本 (7个重大更新)

0.11.1 2021年12月28日
0.10.3 2021年11月16日
0.8.0-rc12021年7月29日
0.6.0-alpha12021年3月12日
0.4.0 2020年12月22日

#13 in #cw20

Download history 4/week @ 2024-03-08 2/week @ 2024-03-15 17/week @ 2024-03-29 4/week @ 2024-04-05

每月下载量90

Apache-2.0GPL-3.0-or-later

215KB
4.5K SLoC

CW20债券曲线

这基于在cw20-base中实现的基本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) = kF(x) = kx 以及 F^-1(x) = x/k

价格线性:f(x) = kxF(x) = kx^2/2 以及 F^-1(x) = (2x/k)^(0.5)

价格平方根:f(x) = x^0.5F(x) = x^1.5/1.5 以及 F^-1(x) = (1.5*x)^(2/3)

我们最初只实现这些曲线,并将更复杂的曲线(如对数)的导入留给他人。

依赖项

~4.5–6MB
~131K SLoC