#pool #amount #assets #swap #pair #constant #astroport

astroport-pair-xyk-sale-tax

Astroport 恒定乘积池合约实现

3 个稳定版本

2.0.2 2024 年 8 月 21 日
2.0.1 2024 年 6 月 21 日
2.0.0 2024 年 6 月 20 日

#15 in 神奇豆子

Apache-2.0GPL-3.0-only

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有两种方法来保护交易者在交换过程中的滑点风险

  1. 提供 max_spread 收益率是交换操作前后的询价金额(使用恒定池价格)之间的差异。一旦设置了max_spread,它将与实际的交换收益率进行比较。如果交换收益率超过提供的最大限制,则交换将失败。

请注意,收益率是在扣除佣金之前计算的,以便正确表示池的比率变化。

  1. 提供 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

通过将用户的原生或代币资产发送到池中提供流动性。

注意:在提供流动性之前,您应增加对池的代币允许量!

  1. 在不指定滑点容忍度的情况下提供流动性
{
  "provide_liquidity": {
    "assets": [
      {
        "info": {
          "token": {
            "contract_addr": "terra..."
          }
        },
        "amount": "1000000"
      },
      {
        "info": {
          "native_token": {
            "denom": "uusd"
          }
        },
        "amount": "1000000"
      }
    ],
    "auto_stake": false,
    "receiver": "terra..."
  }
}
  1. 在滑点容忍度下提供流动性
{
  "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