在上一章跟我一起阅读并修复源码(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

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

被折叠的 条评论
为什么被折叠?



