3 个稳定版本
新 2.0.2 | 2024 年 8 月 21 日 |
---|---|
2.0.1 | 2024 年 6 月 21 日 |
2.0.0 | 2024 年 6 月 20 日 |
#15 in 神奇豆子
460KB
10K SLoC
Astroport 恒定乘积带销售税的配对
该恒定乘积池使用广为人知的 xy=k 公式。有关池如何工作的更多详细信息,请参阅 此处。
这是标准 Astroport XYK 配对的修改版本,增加了可配置的销售税。该税可以加在配对中的每种资产上,并在计算回报金额之前从提供的资产中扣除。
流动性提供者
用户可以通过调用 provide_liquidity
向恒定乘积池提供流动性。用户还可以通过调用 withdraw_liquidity
撤回流动性。
每次向池中存入流动性时,都会按照向池中提供的流动性比例,在提供者的地址上铸造称为“流动性代币”的特殊代币。这些代币代表流动性提供者对池的贡献。每当发生交易时,lp_commission
将按照交易时的比例分配给池中的所有 LP。为了获得底层流动性加上累积的 LP 费用,LP 必须燃烧其流动性代币。
当从智能合约提供流动性时,最重要的是要记住,存入池中的代币数量和以后从池中撤回的代币数量很可能会不同。这是因为恒定乘积池的工作方式,其中,随着池中代币价格的变化,LP 可以撤回的相应代币数量也会发生变化。
例如,假设两个代币x和y之间的全球比例为10:2(即1x等于0.2y),但Astroport对中代币之间的当前比例为5:2(1x等于0.4y)。假设有人可能会决定以当前的5:2比例在x:y Astroport池中提供流动性。当Astroport池被套利到全球比例时,LP可以提取的x和y代币的数量会发生变化,因为池中x和y代币的总数量也会发生变化。
注意,在执行
provide_liqudity
操作之前,用户必须允许池合同从他们的钱包中提取代币
提供流动性的滑点容忍度
如果用户在恒定产品池中提供流动性时指定了滑点容忍度,池合同会确保只有在池价格变化不超过容忍度的情况下,交易才会进行。
例如,假设有人在一个池中提供流动性并指定了1%的滑点容忍度。用户提供了200 UST和1 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
初始化一个新的x*y=k对。
{
"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
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"
},
{
"info": {
"native_token": {
"denom": "uusd"
}
},
"amount": "1000000"
}
],
"slippage_tolerance": "0.01",
"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>"
}
}
QueryMsg
以下描述了所有查询消息。每个查询响应都定义了一个自定义的结构。
pair
检索一对的配置(类型、在其内交易的资产等)
{
"pair": {}
}
pool
返回所有资产在池中的代币数量以及发行的LP代币数量。
{
"pool": {}
}
config
获取对合同配置。
{
"config": {}
}
share
返回某人通过烧毁一定数量的LP代币从池中获得的资产数量。
{
"share": {
"amount": "123"
}
}
simulation
模拟一次交易并返回价差和佣金金额。
{
"simulation": {
"offer_asset": {
"info": {
"native_token": {
"denom": "uusd"
}
},
"amount": "1000000"
}
}
}
reverse_simulation
逆向模拟一次交易(指定要价而不是出价)并返回出价金额、价差和佣金。
{
"reverse_simulation": {
"ask_asset": {
"info": {
"token": {
"contract_addr": "terra..."
}
},
"amount": "1000000"
}
}
}
cumulative_prices
返回对中资产的总价。
{
"cumulative_prices": {}
}
asset_balance_at
返回在指定区块高度创建之前,池中特定资产的余额。如果余额未追踪到指定区块高度,则返回None(null)。
{
"asset_balance_at": {
"asset_info": {
"native_token": {
"denom": "stake"
}
},
"block_height": "12345678"
}
}
依赖关系
~15MB
~330K SLoC