8 个稳定版本

2.0.2 2024年8月21日
2.0.1 2024年6月21日
2.0.0-rc.1-tokenfactory2024年5月13日
1.5.1 2024年3月26日
1.3.1 2023年7月20日

#89 in 魔法豆

Download history 43/week @ 2024-05-04 175/week @ 2024-05-11 47/week @ 2024-05-18 47/week @ 2024-05-25 272/week @ 2024-06-01 193/week @ 2024-06-08 405/week @ 2024-06-15 242/week @ 2024-06-22 146/week @ 2024-06-29 79/week @ 2024-07-06 75/week @ 2024-07-13 91/week @ 2024-07-20 94/week @ 2024-07-27 69/week @ 2024-08-03 137/week @ 2024-08-10 501/week @ 2024-08-17

807 每月下载
用于 9 个crate(6 个直接使用)

GPL-3.0-only

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有两种选项来保护交易者免受交换过程中的滑点影响

  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": {}
}

返回池中所有资产的代币数量以及发行的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