跟我一起阅读并修复某知名DEX交易所源码(3:编译工程,源码分析)之五

本文详细解读了Solidity合约contractMdexPair,涉及数据结构扩展、库函数使用、初始化、储备量更新、LP操作与价格累积。核心内容围绕流动性操作与价格同步机制展开。

在上一章跟我一起阅读并修复源码(3:编译工程,源码分析)之四_lixiaodog的博客-优快云博客中我们分析了contract MdexERC20,在本章中我们将分析contract MdexPair,我们注意到本合约与MdexERC20合约非常相似,相同的函数我们将不再分析。

    using SafeMath  for uint;

    using UQ112x112 for uint224;

把SafeMath,UQ112x112附加到相应的数据结构上,这样只要数据类型为uint,uint224就可以以var.libfun()的形式直接调库函数。而libaray是一组逻辑代码。在库中只处理数据的逻辑,而不关心数据的存储。利用这种特性,在实际开发中可以把数据和逻辑分离。

为什么要赋予unit224类型新的方法?这是因为在Solidity里面没有非整型的类型,但是token的数量肯定会出现小数位,使用UQ112x112的库去模拟浮点数类型。将unit224中的112位当作浮点数的整数部分,另外112位当作浮点数的小数部分  , 剩余的32位主要是存放blockTimestampLast变量,该变量的作用以及更新会在后面讲到。

uint public override constant MINIMUM_LIQUIDITY = 10 ** 3;

定义了流动性的最小量

bytes4 private constant SELECTOR = bytes4(keccak256(bytes('transfer(address,uint256)')));

这个定义了一个函数索引,这个索引可以直接被CALL,DELEGATECALL,CALLCODE等函数直接调用,事实上在使用WEB3模块与智能合约交互时,在交易字段中,前4个字节就是所要调函数的索引。

在下面函数中直接使用了token.call来调用SELECTOR 定义的函数。 

   function _safeTransfer(address token, address to, uint value) private {

        (bool success, bytes memory data) = token.call(abi.encodeWithSelector(SELECTOR, to, value));

        require(success && (data.length == 0 || abi.decode(data, (bool))), 'MdexSwap: TRANSFER_FAILED');

    }
    address public override factory;
    address public override token0;
    address public override token1;

分别定义了工厂合约地址,交易对中的A,B两个TOKEN地址。

   uint112 private reserve0;           // uses single storage slot
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值