Solidity Uniswap V2 factory contract

 factory contract

        工厂合约是所有已部署pair合约的注册表。我们不希望出现相同的pair,这样流动性就不会被分割成多个。factory合约还简化了pair合约的部署:无需手动部署pair合约,只需调用factory合约中的方法即可。

        https://github.com/XuHugo/solidityproject/tree/master/uniswapv2xq

        Uniswap 只部署了一个factory合约,该合约是 Uniswap 的官方注册机构。这对发现pair也很有用:人们可以通过token地址查询合约,找到pair。此外,还可以通过扫描合约的历史事件来查找所有已部署的pair。当然,我们也可以手动部署pair,而不在factory合约中注册。

contract ZuniswapV2Factory {error IdenticalAddresses();error PairExists();error ZeroAddress();event PairCreated(address indexed token0,address indexed token1,address pair,uint256);mapping(address => mapping(address => address)) public pairs;address[] public allPairs;...

        工厂合约非常简洁明了:它只在创建pair时发出 PairCreated 事件,并存储所有已创建pair的列表和映射。

不过,创建pair很麻烦:

function createPair(address tokenA, address tokenB)publicreturns (address pair){if (tokenA == tokenB) revert IdenticalAddresses();(address token0, address token1) = tokenA < tokenB? (tokenA, tokenB): (tokenB, tokenA);if (token0 == address(0)) revert ZeroAddress();if (pairs[token0][token1] != address(0)) revert PairExists();bytes memory bytecode = type(ZuniswapV2Pair).creationCode;bytes32 salt = keccak256(abi.encodePacked(token0, token1));assembly {pair := create2(0, add(bytecode, 32), mload(bytecode), salt)}IZuniswapV2Pair(pair).initialize(token0, token1);pairs[token0][token1] = pair;pairs[token1][token0] = pair;allPairs.push(pair);emit PairCreated(token0, token1, pair, allPairs.length);}

        首先,我们不允许pair使用相同的Token。请注意,我们并不检查Token合约是否真的存在,我们并不关心,因为这取决于用户是否提供有效的 ERC20Token地址。

        接下来,我们对Token地址进行排序,这对于避免重复很重要(pair合约允许双向交换)。此外,token地址还用于生成pair地址,我们将在下一节中讨论。

使用create2 创建合约

        在以太坊中,合约可以部署合约。人们可以调用已部署合约的函数,该函数将部署另一个合约,这使得部署合约变得更加容易。你不需要从电脑上编译和部署一个合同,你可以通过现有的合同来完成。

在 EVM 中,有两个操作码可以部署合约:

        1、CREATE,从一开始就存在于 EVM 中。此操作码创建一个新账户,并在此地址部署合约代码。新地址是根据部署者合约的 nonce 计算出来的,这与手动部署合约时确定合约地址的方式相同。Nonce 是地址成功交易的计数器:发送交易时,nonce 会增加。生成新账户地址时对 nonce 的依赖使得 CREATE 具有非确定性:地址取决于部署者合约的 nonce,而这是无法控制的。你可以知道它,但当你部署你的合约时,nonce 可能已经不同了。

        2、CREATE2 在 EIP-1014 中添加。该操作码的作用与 CREATE 完全相同,但它允许确定性地生成新合约地址。CREATE2 不使用外部状态(如其他合约的 nonce)来生成合约地址,并允许我们完全控制地址的生成方式。你不需要知道 nonce,只需要知道已部署的合约字节码(它是静态的)和盐(它是由你选择的字节序列)。

...bytes memory bytecode = type(ZuniswapV2Pair).creationCode;bytes32 salt = keccak256(abi.encodePacked(token0, token1));assembly {pair := create2(0, add(bytecode, 32), mload(bytecode), salt)}...

        第一行是 ZuniswapV2Pair 合约的创建字节码。创建字节码是实际的智能合约字节码。它包括

        1、构造逻辑。这部分负责智能合约的初始化和部署。它不存储在区块链上。

        2、运行时字节码,即合约的实际业务逻辑。正是这些字节码存储在以太坊区块链上。

        我们希望在此使用完整的字节码。

        下一行创建salt,这是一个字节序列,用于确定性地生成新合约的地址。我们通过散列一对token的地址来创建salt,这意味着每一对独一无二的token都会产生一个独一无二的salt,每一对令牌都会有独一无二的salt和地址。

        最后一行是我们调用 create2 的地方:

        1、使用字节码 + 盐,确定性地创建一个新地址。

        2、部署一个新的 ZuniswapV2Pair 合约。

        3、获取该pair的地址。

// ZuniswapV2Pair.solfunction initialize(address token0_, address token1_) public {if (token0 != address(0) || token1 != address(0))revert AlreadyInitialized();token0 = token0_;token1 = token1_;}

        createPair 的其余部分应该很清楚:

        1、部署配对后,我们需要对其进行初始化,简单地说就是设置其标记:

        2、然后,新的pair将存储在pairs和 allPairs 数组中。

        3、最后,我们就可以发出 PairCreated 事件了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/739146.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

马斯克将在本周,开源类ChatGPT产品Grok

3月11日晚&#xff0c;马斯克在社交平台宣布&#xff0c;将在本周开源生成式AI产品——Grok。 Grok是马斯克旗下公司xAI在去年11月发布的&#xff0c;一款类ChatGPT产品&#xff0c;可以提供生成文本、代码、邮件、信息检索等功能。其测试性能超过GPT-3.5、LLaMA 2 70B&#x…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的铁轨缺陷检测系统(Python+PySide6界面+训练代码)

摘要&#xff1a;开发铁轨缺陷检测系统对于物流行业、制造业具有重要作用。本篇博客详细介绍了如何运用深度学习构建一个铁轨缺陷检测系统&#xff0c;并提供了完整的实现代码。该系统基于强大的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YOLOv5&#xff0c;展示了不同模…

Linux运维:深入了解 Linux 目录结构

Linux运维&#xff1a;深入了解 Linux 目录结构 一、 Linux 目录结构与 Windows之间的主要区别二、Linux根目录结构三、常见目录及其作用 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 一、 Linux 目录结构与 Windows之间的主要区别 1、根…

2024年备考软考,别犯这些常见错误!

距离2024年上半年软考正式考试还剩不到八十天的时间&#xff0c;留给考生的备考时间越来越少&#xff0c;因此大家在学习时要避免犯一些常见错误&#xff0c;尽量不浪费宝贵的学习时间&#xff0c;科学备考。 误区一&#xff1a;不制定学习计划 不制定学习计划意味着缺乏系统…

Kafka常见使用问题

消息丢失 生产者方&#xff1a;设置ack为1或-1/all可以防止生产的消息丢失&#xff0c;如果要做到生产消息成功率提高到最高&#xff0c;ack设置成all&#xff0c;把min.insync.replicas配置成分区备份数&#xff0c;把ack设置成1或者-1/all&#xff0c;这样生产者生产的消息发…

vivado clock ip核的使用

clock 偶数倍分频就是进行计数器计数&#xff0c;奇数倍分频如果不要求占空比的话也是进行计数&#xff0c;如果要求0.5的占空比的话&#xff0c;则需要进行两个计数器&#xff0c; 对于实现占空比为50%的N倍奇数分频&#xff0c;我们可以分解为两个通道&#xff1a; 上升沿触…

数据拯救指南:解决文件或目录损坏且无法读取的终极策略

在日常的计算机使用中&#xff0c;我们经常会遇到文件或目录损坏且无法读取的困扰。当这类问题发生时&#xff0c;无论是重要的文档、照片还是视频文件&#xff0c;都可能会变得无法访问&#xff0c;给我们的工作和生活带来极大的不便。面对这种情况&#xff0c;我们首先需要了…

落地灯哪个牌子好?五款品质可靠的落地灯,各具亮点

近年来&#xff0c;落地灯作为最适合目前用眼人群使用的照明电器&#xff0c;以显著的照明效果获得了广泛认可&#xff0c;并成为众多学生党、上班族用眼时的必备工具。其受欢迎的程度不断攀升&#xff0c;促使越来越多的人都选择入手落地灯。然而&#xff0c;我发现市场上也有…

关于JSP的打印调试,再来一篇巩固巩固

JSP实质上就是html混入了Java&#xff0c;或者说是HTMLJavaScriptCSSJava的混合⽂件&#xff0c;那么就会牵扯到各种语言之间的变量引用问题&#xff0c;既然基础是html&#xff0c;那么就先看看html怎么引用其他内容&#xff0c;以及其他内容间值的互引用。 1、Html获取JavaS…

数据结构之栈详解(C语言手撕)

&#x1f389;个人名片&#xff1a; &#x1f43c;作者简介&#xff1a;一名乐于分享在学习道路上收获的大二在校生 &#x1f648;个人主页&#x1f389;&#xff1a;GOTXX &#x1f43c;个人WeChat&#xff1a;ILXOXVJE &#x1f43c;本文由GOTXX原创&#xff0c;首发CSDN&…

HYBBS 表白墙网站PHP程序源码,支持封装成APP

PHP表白墙网站源码&#xff0c;适用于校园内或校区间使用&#xff0c;同时支持封装成APP。告别使用QQ空间的表白墙。 简单安装&#xff0c;只需PHP版本5.6以上即可。 通过上传程序进行安装&#xff0c;并设置账号密码&#xff0c;登录后台后切换模板&#xff0c;适配手机和PC…

如何在Linux本地搭建Tale网站并实现无公网ip远程访问

文章目录 前言1. Tale网站搭建1.1 检查本地环境1.2 部署Tale个人博客系统1.3 启动Tale服务1.4 访问博客地址 2. Linux安装Cpolar内网穿透3. 创建Tale博客公网地址4. 使用公网地址访问Tale 前言 今天给大家带来一款基于 Java 语言的轻量级博客开源项目——Tale&#xff0c;Tale…

java 解压gzip json报文

import java.io.*; import java.util.zip.GZIPInputStream;public class GzipJsonParser {public static void main(String[] args) {try {// 读取GZIP压缩的JSON报文FileInputStream fis new FileInputStream("compressed.json.gz");GZIPInputStream gzipInputStre…

人工智能与挖矿 为什么要用显卡而不是CPU

人工智能&#xff08;AI&#xff09;和加密货币挖矿都是对计算资源要求很高的应用。在这两种情况下&#xff0c;使用显卡&#xff08;GPU&#xff09;而不是中央处理器&#xff08;CPU&#xff09;的原因主要是因为显卡在处理特定类型的计算任务时具有显著的优势。 1、并行处理…

JMeter 二次开发之环境准备

通过JMeter二次开发&#xff0c;可以充分发挥JMeter的潜力&#xff0c;定制化和扩展工具的能力以满足具体需求。无论是开发自定义插件、函数二次开发还是定制UI&#xff0c;深入学习和掌握JMeter的二次开发技术&#xff0c;将为接口功能测试/接口性能测试工作带来更多的便利和效…

【Linux/OS学习】基础文件控制/IO——内存文件

文章目录 一、 基础文件控制1.1 系统接口open函数1.2 Linux中文件描述符1.2 C语言FILE中的文件描述符 二、重定向1. 输出重定向2. 追加重定向3. 输入重定向 tips:fd的分配规则 一个文件要有一个唯一的文件标识&#xff0c;以便用户识别和引用。 文件名包含3部分&#xff1a;文件…

进电子厂了,感触颇多...

作者&#xff1a;三哥 个人网站&#xff1a;https://j3code.cn 本文已收录到语雀&#xff1a;https://www.yuque.com/j3code/me-public-note/lpgzm6y2nv9iw8ec 是的&#xff0c;真进电子厂了&#xff0c;但主人公不是我。 虽然我不是主人公&#xff0c;但是我经历的过程是和主…

画图--添加了两条水平直线,分别在y=0.092和y=-0.092处。并在水平直线上添加文本

import matplotlib.pyplot as plt import pandas as pd plt.rcParams[font.sans-serif]=[SimHei] #用来正常显示中文标签 plt.rcParams[axes.unicode_minus]=False #用来正常显示负号import matplotlib.pyplot as plt import pandas as pd# 示例函数,绘制曲率变化率图 def dra…

jdk1.8下载与安装 图文版

JDK下载 首先在Oracle官网上下载jdk1.8.https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html,如下图所示&#xff0c;找到jdk1.8,选择对应的版本 或者 链接&#xff1a;https://pan.baidu.com/s/13lZy7JKE1xn-dXx_VG1QFA?pwd29wl 提取码&#xff1a;…

谷歌承认“窃取”OpenAI模型关键信息

什么&#xff1f;谷歌成功偷家OpenAI&#xff0c;还窃取到了gpt-3.5-turbo关键信息&#xff1f;&#xff1f;&#xff1f; 是的&#xff0c;你没看错。 根据谷歌自己的说法&#xff0c;它不仅还原了OpenAI大模型的整个投影矩阵&#xff08;projection matrix&#xff09;&…