IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 区块链 -> 一种查询代币买卖和转移燃烧率的方法 -> 正文阅读

[区块链]一种查询代币买卖和转移燃烧率的方法

我们知道,在UniswapV2交易所中,人们很容易计算出一种代币兑换另一种代币的数量,因为我们只要有交易对的存量和交易手续费就能计算出了。而在UniswapV3 交易所中,虽然交易对保存了两种代币之间的相互价格,但是由于滑点的存在,无法直接计算用户可以兑换的另一种代币的数量。为此,UniswapV3有一个辅助合约Quoter.sol,它介绍了一种模拟交易的方法来获取用户可兑换的数量。本文正是基于这一模拟交易来得到获取代币在买卖和转移时的燃烧率的方法。

一、原理

本文基于市场上应用的最多的UniswapV2 AMM交易所。

不管是UniswapV2还是UniswapV3,都是先借后还系统,也就是大名鼎鼎的闪电贷。既然我们可以通过模拟交易获取用户可以兑换的数量,那么我们和真实的余额比较一下(此时已经借给我们了),如果两者有差额,那么这个差额就是燃烧的代币数量了。差额除以借的数量,就可以计算出其交易或者转移燃烧率了。

二、实现合约

实现合约当前仅基于SafeMoon类代币,也就是固定损耗,不管买卖和转移都是一样的,例如10%。

我们基于UniswapV3的Quoter.sol合约写一个基于UniswapV2版的服务于我们特殊目的的合约CustomQuoter.sol

pragma solidity =0.6.6;

import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol';
import "./interfaces/IERC20Interface.sol";

contract CustomQuoter {

    /**
     * @param token 查询的代币
     * @param pair  包含查询代币的任意UniswapV2交易对。注意交易对要标准的支持闪电贷。
     * @return buyRate 交易(转移)过程中的燃烧率
     */
    function quoteBuyRate(address pair, address token) external returns (uint buyRate) {
        address token0 =  IUniswapV2Pair(pair).token0();
        (uint reserve00, uint reserve01, ) = IUniswapV2Pair(pair).getReserves();
        uint amountOut0 = token0 == token ?  reserve00 / 10 : 0;
        uint amountOut1 = token0 == token ? 0 : reserve01 /10;
        try 
            IUniswapV2Pair(pair).swap(amountOut0,amountOut1,address(this),bytes("amm"))
        {} catch (bytes memory reason) {
            return parseRevertReason(reason);
        }
    }

    /// @dev Parses a revert reason that should contain the numeric quote
    function parseRevertReason(bytes memory reason) private pure returns (uint256) {
        if (reason.length != 32) {
            if (reason.length < 68) revert('Unexpected error');
            assembly {
                reason := add(reason, 0x04)
            }
            revert(abi.decode(reason, (string)));
        }
        return abi.decode(reason, (uint256));
    }

    fallback () external payable virtual {
        bytes memory data = msg.data;
        uint amount0;
        uint amount1;
        assembly {
            amount0 := mload(add(data,68))
            amount1 := mload(add(data,100))
        }
        address token0 = IUniswapV2Pair(msg.sender).token0();
        address token1 = IUniswapV2Pair(msg.sender).token1();
        address token = amount0 > 0 ? token0 : token1;
        uint amount = amount0 > 0 ? amount0 : amount1;
        uint bal =  IERC20Interface(token).balanceOf(address(this));
        require(amount >= bal,"inner error");
        uint rate = 1000 * (amount - bal) / amount;
        assembly {
            let ptr := mload(0x40)
            mstore(ptr, rate)
            revert(ptr, 32)
        }
    }
}

其中parseRevertReason 函数是直接照搬的UniswapV3的Quoter.sol的。 由于除法截断的原因,我们将燃烧率放大了10倍。最后得到的burnRate除以10再上取整就是SafeMoon的燃烧率了。

另外,这里和交易对中另一种代币没有关系 ,任意代币任意数量均可都行。对交易对里查询代币的数量也没有要求。

三、优点

本合约的优点是只要有查询代币的交易对,不管是和什么代币组成的交易对,也不管是什么交易所,Sushi也好,Uniswap也好都行,也不需要知道交易手续费,同时对交易对里两种代币的数量也没有要求。
只要交易对是标准的UniswapV2类型并支持闪电贷(当前在不同的链上有成百上千个这样的AMM交易所),就可以进行查询。

四、合约调用

至于怎么调用该合约,大家一个方法是可以看一下UniswapV3的前端代码,这个模拟交易的过程,文章 Uniswap v3 详解(三):交易过程 中有详细的介绍,并且文章中给出了相关前端代码链接。

另一个调用该合约的方法是看一下我相关的CSDN上的区块链进阶文章,聪明的读者是可以总结出来该方法的。

PS. 调用合约的quoteBuyRate 方法是不需要花钱的哟。

五、未完成的功能

这里的这个合约适用范围有限,代币只能是SafeMoon类在转移时有损耗的代币。有的特定代币指定了买卖池,只有在买卖的时候有损耗,在交易的时候没有损耗或者损耗不同。如果是这种特定代币,我们的合约也是适用的。不过当前我们这个合约只是得到了特定代币买入时的损耗。其卖出时和转移时的损耗需要稍微添加一些代码,这里我就留下个尾巴,有兴趣的小伙伴可以自己动手完成一下。。

  区块链 最新文章
盘点具备盈利潜力的几大加密板块,以及潜在
阅读笔记|让区块空间成为商品,打造Web3云
区块链1.0-比特币的数据结构
Team Finance被黑分析|黑客自建Token“瞒天
区块链≠绿色?波卡或成 Web3“生态环保”标
期货从入门到高深之手动交易系列D1课
以太坊基础---区块验证
进入以太坊合并的五个数字
经典同态加密算法Paillier解读 - 原理、实现
IPFS/Filecoin学习知识科普(四)
上一篇文章      下一篇文章      查看所有文章
加:2022-03-04 15:38:48  更:2022-03-04 15:39:27 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/28 19:53:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计