8 个稳定版本
新 4.0.1 | 2024年8月21日 |
---|---|
4.0.0 | 2024年6月20日 |
4.0.0-rc.1-tokenfactory | 2024年5月13日 |
3.4.1 | 2024年3月26日 |
2.1.2 | 2023年7月20日 |
#58 in 神奇豆
702 次每月下载
用于 5 个crate(2 个直接使用)
360KB
8K SLoC
Astroport 基础稳定互换对
稳定互换池使用 4A(Rx+Ry) + D 公式,结果为恒定价格 ∆x / ∆y = 1。更多关于池如何运作的详细信息可以在 这里 找到。
流动性提供者
用户可以通过调用 provide_liquidity
为恒定产品池提供流动性。用户还可以通过调用 withdraw_liquidity
提取流动性。
每次将流动性存入池中时,都会根据其对池提供的流动性比例,向提供者地址发行一种特殊代币,称为“流动性代币”。这些代币代表流动性提供者对池的贡献。每次交易发生时,lp_commission
都会根据交易时的比例分配给池中的所有LP。为了获取基础流动性以及累积的LP费用,LP 必须烧毁他们的流动性代币。
当从智能合约提供流动性时,最重要的注意事项是,存入池中的代币数量和之后从池中取出的代币数量很可能会不同(即使稳定互换鼓励池中所有资产保持1:1的恒定比率)。
以一个例子来说明,假设两个代币x和y的全局比率是1.01:1(1 x = 0.99 y),但Astroport对中的代币比率是1:1.01(1 x = 1.01 y)。假设有人决定以当前的1:1.01比率在x:y Astroport池中提供流动性。随着Astroport池被对冲到全局比率,LP可以提取的x和y代币的数量会发生变化,因为池中x和y代币的总数也会变化。
请注意,在执行
provide_liqudity
操作之前,用户必须允许池合约从他们的钱包中提取代币。
提供流动性时的滑点容忍度
如果用户在恒定产品池中提供流动性时指定了滑点容忍度,则池合约确保只有在池价格变化不超过容忍度的情况下,交易才会执行。
以一个例子来说明,假设有人在一个池中提供流动性并指定了1%的滑点容忍度。用户提供了200 UST和200 ASSET
。在1%的滑点容忍度下,amountUSTMin
(LP所需的最小UST数量)应设置为198 UST,而amountASSETMin
(LP所需的最小ASSET
数量)应设置为0.99 ASSET
。这意味着在最坏的情况下,流动性将以198 ASSET
/1 UST或202.02 UST/1 ASSET
(200 UST + 0.99 ASSET
)的池率添加。如果合约无法在这些范围内添加流动性(因为池比率的变化超过了容忍度),则交易将回滚。
交易者
交换时的滑点容忍度
Astroport有两个选项来保护交易者在交换过程中的滑点风险
- 提供
max_spread
。差价计算为交换操作前后使用恒定池价格计算的卖出数量之间的差异。一旦设置了max_spread
,它将与此实际交换差价进行比较。如果交换差价超过了提供的最大限制,交换将失败。
请注意,差价是在扣除手续费之前计算的,以便正确表示池比率的变动。
- 提供
max_spread
+belief_price
如果与max_spread
一起提供了belief_price
,池将检查使用belief_price
计算返回金额和实际池价格之间的差异。
请注意,Astroport将默认的差价设置为0.5%,最大允许的差价设置为50%。
InstantiateMsg
初始化一个新的稳定swap对。
{
"token_code_id": 123,
"factory_addr": "terra...",
"asset_infos": [
{
"token": {
"contract_addr": "terra..."
}
},
{
"native_token": {
"denom": "uusd"
}
}
],
"init_params": "<base64_encoded_json_string: optional binary serialised parameters for custom pool types>"
}
ExecuteMsg
ExecuteMsg
receive
提取流动性或交换操作中交换到的资产(来自交换操作的卖出资产)。
{
"receive": {
"sender": "terra...",
"amount": "123",
"msg": "<base64_encoded_json_string>"
}
}
provide_liquidity
通过向池发送用户的原生或代币资产来提供流动性。
注意:在提供流动性之前,您应该增加对池的代币允许量!
- 不指定滑点容忍度提供流动性
{
"provide_liquidity": {
"assets": [
{
"info": {
"token": {
"contract_addr": "terra..."
}
},
"amount": "1000000"
},
{
"info": {
"native_token": {
"denom": "uusd"
}
},
"amount": "1000000"
}
],
"auto_stake": false,
"receiver": "terra..."
}
}
- 使用单个代币提供流动性。我们只能对非空池这样做。
{
"provide_liquidity": {
"assets": [
{
"info": {
"token": {
"contract_addr": "terra..."
}
},
"amount": "1000000"
}
],
"auto_stake": false,
"receiver": "terra..."
}
}
withdraw_liquidity
燃烧LP代币并从池中提取流动性。此调用必须发送到与您想要提取流动性的池关联的LP代币合约。
{
"withdraw_liquidity": {}
}
swap
执行交换。 offer_asset
是您的源资产,to
是将接收询问资产的地址。所有字段都是可选的,除了offer_asset
。
注意:在交换之前,您应该增加对池的代币允许量。
{
"swap": {
"offer_asset": {
"info": {
"native_token": {
"denom": "uluna"
}
},
"amount": "123"
},
"belief_price": "123",
"max_spread": "123",
"to": "terra..."
}
}
update_config
更新对的对配置。
{
"update_config": {
"params": "<base64_encoded_json_string>: binary serialised parameters for stable pool types; example: {'amp': 100} "
}
}
QueryMsg
下面描述了所有查询消息。为每个查询响应定义了一个自定义结构。
pair
检索对配置(类型、池中交易的资产等)。
{
"pair": {}
}
pool
返回所有资产的池中代币数量以及发行的LP代币数量。
{
"pool": {}
}
配置
获取对偶合约配置。
{
"config": {}
}
份额
如果某人烧毁一定数量的LP代币,返回他们可以从池中获得的资产数量。
{
"share": {
"amount": "123"
}
}
模拟
模拟交换并返回价差和佣金数量。
{
"simulation": {
"offer_asset": {
"info": {
"native_token": {
"denom": "uusd"
}
},
"amount": "1000000"
}
}
}
反向模拟
反向模拟交换(指定要价而不是出价)并返回出价金额、价差和佣金。
{
"reverse_simulation": {
"ask_asset": {
"info": {
"token": {
"contract_addr": "terra..."
}
},
"amount": "1000000"
}
}
}
累积价格
返回对偶中资产的累积价格。
{
"cumulative_prices": {}
}
查询计算d
返回池当前的D值。
{
"query_compute_d": {}
}
观察
查询存储观察中的价格。如果观察在精确时间未找到,则使用周围观察进行插值。
{
"observe": {
"seconds_ago": 3600
}
}
依赖项
~15MB
~312K SLoC