{"author":{"address":null,"user":"https://learnblockchain.cn/people/24678"},"content":{"body":"上一篇文章我们讲了virtuals的整体业务流程, 这一篇我们讲讲看一下代码看看之前有没有讲的不多或者比较粗略的地方.\r\n\r\n# bonding.sol\r\n\r\n发行和管理ERC20合约\r\n\r\n```mermaid\r\ngraph TD\r\n    assetToken[assetToken]\r\n    bonding[Bonding 合约]\r\n    FERC20[FERC20 代币 ]\r\n    assetToken --\u003e|用于购买| bonding\r\n    bonding --\u003e|发行| FERC20\r\n    FERC20 --\u003e|支持流动性| bonding\r\n    bonding --\u003e|管理储备| assetToken\r\n```\r\n\r\n# 内盘阶段\r\n\r\n```mermaid\r\nsequenceDiagram  \r\n    participant 发币者  \r\n    participant 用户  \r\n    participant Bond合约  \r\n    participant Router合约  \r\n    participant FERC20 MEME Token  \r\n    participant VIRTUAL Token  \r\n    participant 外盘代理 Token  \r\n    participant Uniswap外盘  \r\n\r\n    发币者-\u003e\u003eBond合约: 调用 launch 函数  \r\n    Bond合约-\u003e\u003eRouter合约: 初始化流动性 (addInitialLiquidity)  \r\n    Router合约-\u003e\u003eFERC20 MEME Token: 初始化储备量 X  \r\n    Router合约-\u003e\u003eVIRTUAL Token: 初始化储备量 Y  \r\n    用户-\u003e\u003eBond合约: 调用 buy/sell 函数  \r\n    Bond合约-\u003e\u003eFERC20 MEME Token: 更新储备量  \r\n    Bond合约-\u003e\u003eVIRTUAL Token: 更新储备量  \r\n    Bond合约-\u003e\u003eUniswap外盘: 调用 _openTradingOnUniswap  \r\n    Uniswap外盘-\u003e\u003e外盘代理 Token: 初始化外盘流动性  \r\n    用户-\u003e\u003eBond合约: 调用 unwrapToken  \r\n    Bond合约-\u003e\u003eFERC20 MEME Token: 销毁内盘 Token  \r\n    Bond合约-\u003e\u003e外盘代理 Token: 发送外盘 Token\r\n```\r\n## 谁可以发布内盘代币?如何发布?发布需要支付费用吗?费用被谁收走了?\r\n1. 发币者调用bond.sol合约上的launch函数，发币. 从 `launch` 函数的代码和逻辑可以看出，调用方需要提供一些基本的 Token 信息，并支付一定数量的 VIRTUAL Token（`purchaseAmount`），其中一部分作为费用（`fee`），另一部分用于购买初始的 FERC20 MEME Token。`fee` 最终被转移到一个专门的费用接收地址 `feeTo`。在 `launch` 函数中，内盘的初始流动性通过 `router.addInitialLiquidity` 方法设置：\r\n该方法初始化了 MEME Token 和 VIRTUAL Token 的储备量（`X` 和 `Y`），并计算出初始的 `K` 值。这一步为 Bonding Curve 的交易逻辑提供了基础。这里的 FERC20合约 是内盘阶段交易的 MEME Token，仅在内盘阶段使用，当进入到外盘后，会变成另一个 Token。\r\n \r\n```mermaid\r\nsequenceDiagram  \r\n    participant 发币者  \r\n    participant Bond合约  \r\n    participant Router合约  \r\n    participant FERC20 MEME Token  \r\n    participant VIRTUAL Token  \r\n    participant Fee地址  \r\n\r\n    发币者-\u003e\u003eBond合约: 调用 launch 函数 (提供 Token 信息和 purchaseAmount)  \r\n    Bond合约-\u003e\u003eFee地址: 转移部分 purchaseAmount 作为 fee  \r\n    Bond合约-\u003e\u003eRouter合约: 调用 addInitialLiquidity  \r\n    Router合约-\u003e\u003eFERC20 MEME Token: 初始化储备量 X  \r\n    Router合约-\u003e\u003eVIRTUAL Token: 初始化储备量 Y  \r\n    Router合约-\u003e\u003eBond合约: 返回初始 K 值  \r\n    Bond合约-\u003e\u003e发币者: 返回交易成功\r\n```\r\n```mermaid\r\nsequenceDiagram  \r\n    participant 用户  \r\n    participant Bond合约  \r\n    participant FERC20 MEME Token  \r\n\r\n\r\n    用户-\u003e\u003eBond合约: 查询内盘阶段的 MEME Token 信息  \r\n    Bond合约-\u003e\u003eFERC20 MEME Token: 返回内盘阶段的 Token 类型 (FERC20)  \r\n    Note over Bond合约,FERC20 MEME Token: 内盘阶段仅使用 FERC20 MEME Token  \r\n    Bond合约-\u003e\u003e用户: 返回内盘 Token 信息\r\n```\r\n## 内盘买卖阶段,需要支付手续费吗?手续费被谁收走了?\r\n2. 内盘阶段`bond.sol`合约提供buy和sell函数给内盘交易者进行交易. 在 `buy` 函数中，用户购买 FERC20 MEME Token 时需要支付 **1% 的手续费**。手续费会被转移到一个专门的手续费地址（`feeTo`），由 `factory.taxVault()` 指定.\r\n```mermaid\r\nsequenceDiagram  \r\n    participant 用户  \r\n    participant Bond合约  \r\n    participant FERC20 MEME Token  \r\n    participant VIRTUAL Token  \r\n    participant Fee地址  \r\n\r\n    用户-\u003e\u003eBond合约: 调用 buy 函数 (支付 VIRTUAL Token)  \r\n    Bond合约-\u003e\u003eFee地址: 转移 1% 手续费  \r\n    Bond合约-\u003e\u003eFERC20 MEME Token: 增加用户的 MEME Token 数量  \r\n    Bond合约-\u003e\u003eVIRTUAL Token: 更新储备量 Y  \r\n    Bond合约-\u003e\u003e用户: 返回购买成功  \r\n\r\n    用户-\u003e\u003eBond合约: 调用 sell 函数 (出售 FERC20 MEME Token)  \r\n    Bond合约-\u003e\u003eVIRTUAL Token: 增加用户的 VIRTUAL Token 数量  \r\n    Bond合约-\u003e\u003eFERC20 MEME Token: 更新储备量 X  \r\n    Bond合约-\u003e\u003e用户: 返回出售成功\r\n```\r\n## 内盘交易阶段的价格由什么决定?这个价格机制是在智能合约上实现的吗?\r\n4. 内盘交易阶段, 内盘阶段的买卖交易基于 Bonding Curve 的恒定乘积公式 `X * Y = K`，* `X` 和 `Y` 分别代表内盘 MEME Token 和 VIRTUAL Token 的储备量。* * `K` 是一个恒定值，表示储备池的总流动性。用户支付 VIRTUAL Token，按照 Bonding Curve 的公式计算可以获得的 MEME Token 数量，同时更新储备量。\r\n```mermaid\r\nsequenceDiagram  \r\n    participant 用户  \r\n    participant Bond合约  \r\n    participant FERC20 MEME Token  \r\n    participant VIRTUAL Token  \r\n\r\n    用户-\u003e\u003eBond合约: 调用 buy 函数 (支付 VIRTUAL Token)  \r\n    Bond合约-\u003e\u003eBond合约: 计算恒定乘积公式 X * Y = K  \r\n    Bond合约-\u003e\u003eFERC20 MEME Token: 更新储备量 X  \r\n    Bond合约-\u003e\u003eVIRTUAL Token: 更新储备量 Y  \r\n    Bond合约-\u003e\u003e用户: 返回 MEME Token 数量  \r\n\r\n    用户-\u003e\u003eBond合约: 调用 sell 函数 (出售 FERC20 MEME Token)  \r\n    Bond合约-\u003e\u003eBond合约: 计算恒定乘积公式 X * Y = K  \r\n    Bond合约-\u003e\u003eFERC20 MEME Token: 更新储备量 X  \r\n    Bond合约-\u003e\u003eVIRTUAL Token: 更新储备量 Y  \r\n    Bond合约-\u003e\u003e用户: 返回 VIRTUAL Token 数量\r\n```\r\n## 什么时候内盘会发布到外盘?这个逻辑是在智能合约上实现的吗?\r\n6. 自动发布到外盘. 当内盘 Token 的储备量减少到 `gradThreshold` 以下，并且 Token 仍在内盘交易阶段时，`_openTradingOnUniswap` 会被调用。`_openTradingOnUniswap` 的主要功能是将 Token 从内盘阶段迁移到外盘阶段，具体包括以下步骤：** 停止内盘交易并开启外盘交易**, #### **获取内盘储备池的余额**, **调用 `graduate` 完成毕业**, **初始化外盘流动性和代理 Token**,  **销毁内盘 Token 并授权外盘交易**,   **触发毕业事件**\r\n\r\n```mermaid\r\nsequenceDiagram  \r\n    participant Bond合约  \r\n    participant Router合约  \r\n    participant Uniswap外盘  \r\n    participant FERC20 MEME Token  \r\n    participant 外盘代理 Token  \r\n\r\n    Bond合约-\u003e\u003eBond合约: 检查内盘储备量是否低于 gradThreshold  \r\n    Bond合约-\u003e\u003eBond合约: 调用 _openTradingOnUniswap  \r\n    Bond合约-\u003e\u003eRouter合约: 获取内盘储备池余额  \r\n    Bond合约-\u003e\u003eBond合约: 调用 graduate 完成毕业  \r\n    Bond合约-\u003e\u003eUniswap外盘: 初始化外盘流动性  \r\n    Bond合约-\u003e\u003eFERC20 MEME Token: 销毁内盘 Token  \r\n    Bond合约-\u003e\u003e外盘代理 Token: 授权外盘交易  \r\n    Bond合约-\u003e\u003eBond合约: 触发毕业事件\r\n```\r\n## 我买了内盘代币如何换成外盘代币?\r\n8. 用户可以调用`unwrapToken` 函数, 将内盘的 MEME Token 按照 1:1 的比例兑换成外盘的 MEME Token。整个函数的逻辑是: 用户将持有的内盘 MEME Token（FERC20）发送到合约中。合约按照 1:1 的比例，将等量的外盘 MEME Token（Agent Token）发送给用户。内盘的 MEME Token 在兑换过程中会被销毁，确保总供应量的一致性。\r\n```mermaid\r\nsequenceDiagram  \r\n    participant 用户  \r\n    participant Bond合约  \r\n    participant FERC20 MEME Token  \r\n    participant 外盘代理 Token  \r\n\r\n    用户-\u003e\u003eBond合约: 调用 unwrapToken 函数 (发送 FERC20 MEME Token)  \r\n    Bond合约-\u003e\u003eFERC20 MEME Token: 销毁内盘 MEME Token  \r\n    Bond合约-\u003e\u003e外盘代理 Token: 按 1:1 比例发送外盘代理 Token  \r\n    Bond合约-\u003e\u003e用户: 返回外盘代理 Token\r\n```","title":"virtuals协议的内外盘交易阶段分析"},"history":null,"timestamp":1735198374,"version":1}