8 个稳定版本
新 2.0.2 | 2024年8月21日 |
---|---|
2.0.1 | 2024年6月21日 |
2.0.0-rc.1-tokenfactory | 2024年5月13日 |
1.5.1 | 2024年3月26日 |
1.3.1 | 2023年7月20日 |
#89 in 魔法豆
807 每月下载
用于 9 个crate(6 个直接使用)
330KB
7K SLoC
Astroport 恒定乘积对
恒定乘积池使用广为人知的 xy=k 公式。更多关于池如何工作的详细信息可以在这里找到。
流动性提供者
用户可以通过调用 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比例下LP(流动性提供者)进入x:y的Astroport池。当Astroport池被套利到全球比例时,LP可以提取的x和y代币数量会改变,因为池中x和y代币的总数量也会改变。
注意,在执行
provide_liqudity
操作之前,用户必须允许池合约从他们的钱包中提取代币
提供流动性时的滑点容忍度
如果用户在恒定产品池中提供流动性时指定了滑点容忍度,池合约将确保只有在池价格变化不超过容忍度的情况下,交易才会成功执行。
例如,假设有人LP进入一个池并指定了1%的滑点容忍度。用户LP了200 UST和1 ASSET
。在1%的滑点容忍度下,amountUSTMin
(LP所需的最小UST数量)应设置为198 UST,而amountASSETMin
(LP所需的最小ASSET
数量)应设置为.99 ASSET
。这意味着在最坏的情况下,流动性将以198 ASSET
/1 UST或202.02 UST/1 ASSET
(200 UST + .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": {}
}
池
返回池中所有资产的代币数量以及发行的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": {}
}
在指定区块高度创建之前的资产余额
返回在指定区块高度创建之前池中指定资产的余额。如果余额未追踪到指定区块高度,将返回None(空)。
{
"asset_balance_at": {
"asset_info": {
"native_token": {
"denom": "stake"
}
},
"block_height": "12345678"
}
}
依赖项
~15MB
~330K SLoC