Uniswap V2 核心

  • UniswapV2Factory

  • UniswapV2Pair

  • UniswapV2ERC20

  • IUniswapV2Router02

1. UniswapV2Factory 合约

UniswapV2Factory 是工厂合约,主要负责创建和管理交易对。它是 Uniswap V2 系统的核心管理部分。

主要功能:

  • 创建交易对:工厂合约可以创建新的交易对(流动性池),每个交易对都有一个对应的 UniswapV2Pair 合约。
  • 管理交易对:工厂合约维护一个映射,存储所有创建的交易对的地址,确保每个交易对的唯一性。
  • 设置费用接收地址:工厂合约可以设置和更改接收交易费用的地址。

重要方法:

  • createPair(address tokenA, address tokenB): 创建一个新的交易对,并返回其地址。
  • getPair(address tokenA, address tokenB): 获取现有交易对的地址。
  • setFeeTo(address): 设置交易费用的接收地址。
  • setFeeToSetter(address): 设置能够更改费用接收地址的权限地址。

类比:

生活中的例子:餐厅经理

  • 餐厅经理负责开设新的自助餐台(交易对)并记录这些餐台的位置(地址)。他还可以设置餐厅的收益接收人(费用接收地址)。

2. UniswapV2Pair 合约

UniswapV2Pair 是每个交易对对应的合约,负责管理流动性池和处理代币交换。每个交易对都会有一个独立的 UniswapV2Pair 合约实例。

主要功能:

  • 管理流动性池:存储流动性提供者(LP)存入的两种代币,并管理这些代币的交换。
  • 处理代币交换:按照恒定乘积公式进行代币的交换,并在每次交易时收取一定的交易费用。
  • 发放流动性代币:向流动性提供者发放流动性代币,代表他们在流动性池中的份额。

重要方法:

  • mint(address to): 向流动性提供者发放流动性代币。
  • burn(address to): 燃烧流动性代币并返回相应份额的基础代币。
  • swap(uint amount0Out, uint amount1Out, address to, bytes calldata data): 执行代币交换。
  • sync(): 更新流动性池中的代币余额。

类比:

生活中的例子:自助餐台

  • 自助餐台管理顾客(用户)存放和取用的食物(代币),并记录每个顾客在餐台上的份额(流动性代币)。餐台还处理不同食物之间的交换,并收取服务费(交易费)。

3. UniswapV2ERC20 合约

UniswapV2ERC20 实现了流动性代币的 ERC-20 标准。流动性代币用于表示流动性提供者在流动性池中的份额。

主要功能:

  • 实现 ERC-20 标准:支持代币的转账、授权和查询功能。
  • 流动性提供者的份额管理:流动性代币代表了流动性提供者在特定交易对池中的持有份额。

重要方法:

  • totalSupply(): 返回流动性代币的总供应量。
  • balanceOf(address account): 返回指定地址持有的流动性代币数量。
  • transfer(address recipient, uint amount): 将流动性代币从调用者地址转移到指定地址。
  • approve(address spender, uint amount): 授权第三方地址可以使用调用者的流动性代币。
  • transferFrom(address sender, address recipient, uint amount): 从授权地址转移流动性代币到指定地址。

类比:

生活中的例子:餐券

  • 餐券代表顾客在自助餐台上的用餐份额(流动性份额)。顾客可以转让餐券(流动性代币),餐券的总量和每个顾客持有的数量可以随时查询。

4.IUniswapV2Router02

Uniswap V2 的 IUniswapV2Router02 是一个关键的智能合约接口,它提供了一系列方法,用于在 Uniswap 协议上执行代币交换、增加和移除流动性等操作。IUniswapV2Router02 继承自 IUniswapV2Router01,并在其基础上增加了一些额外功能。下面详细介绍 IUniswapV2Router02 的作用及其包含的方法。

作用

IUniswapV2Router02 主要用于以下操作:

  1. 代币交换:在 Uniswap 上进行代币与代币之间的交换。
  2. 增加流动性:向 Uniswap 池中添加代币对以提供流动性,并获得流动性提供者 (LP) 代币。
  3. 移除流动性:从 Uniswap 池中移除代币对,赎回 LP 代币。
  4. 支持复杂的代币转换路径:支持通过多跳交易实现复杂的代币交换路径。

方法详细讲解

以下是 IUniswapV2Router02 包含的一些主要方法及其详细说明:

1. addLiquidity

function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
  • 功能:向指定的代币对池中添加流动性。
  • 参数
    • tokenAtokenB:要添加流动性的代币对。
    • amountADesiredamountBDesired:希望添加的代币数量。
    • amountAMinamountBMin:希望添加的代币的最小数量(滑点保护)。
    • to:接收流动性代币的地址。
    • deadline:交易必须完成的时间(时间戳)。
  • 返回值:实际添加的代币数量和获得的流动性代币数量。

2. removeLiquidity

function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
  • 功能:从指定的代币对池中移除流动性。
  • 参数
    • tokenAtokenB:要移除流动性的代币对。
    • liquidity:要移除的流动性代币数量。
    • amountAMinamountBMin:最小可接受的代币数量(滑点保护)。
    • to:接收代币的地址。
    • deadline:交易必须完成的时间(时间戳)。
  • 返回值:实际接收的代币数量。

3. swapExactTokensForTokens

function swapExactTokensForTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
  • 功能:用指定数量的输入代币交换尽可能多的输出代币。
  • 参数
    • amountIn:输入代币数量。
    • amountOutMin:最小可接受的输出代币数量(滑点保护)。
    • path:代币交换路径。
    • to:接收输出代币的地址。
    • deadline:交易必须完成的时间(时间戳)。
  • 返回值:每个路径节点的代币数量。

4. swapTokensForExactTokens

function swapTokensForExactTokens(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
  • 功能:用尽可能少的输入代币交换指定数量的输出代币。
  • 参数
    • amountOut:输出代币数量。
    • amountInMax:最大可接受的输入代币数量(滑点保护)。
    • path:代币交换路径。
    • to:接收输出代币的地址。
    • deadline:交易必须完成的时间(时间戳)。
  • 返回值:每个路径节点的代币数量。

5. swapExactETHForTokens

function swapExactETHForTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable returns (uint[] memory amounts);
  • 功能:用指定数量的 ETH 交换尽可能多的输出代币。
  • 参数
    • amountOutMin:最小可接受的输出代币数量(滑点保护)。
    • path:代币交换路径(第一个地址必须是 WETH)。
    • to:接收输出代币的地址。
    • deadline:交易必须完成的时间(时间戳)。
  • 返回值:每个路径节点的代币数量。

6. swapTokensForExactETH

function swapTokensForExactETH(
uint amountOut,
uint amountInMax,
address[] calldata path,
address to,
uint deadline
) external returns (uint[] memory amounts);
  • 功能:用尽可能少的输入代币交换指定数量的 ETH。
  • 参数
    • amountOut:输出 ETH 数量。
    • amountInMax:最大可接受的输入代币数量(滑点保护)。
    • path:代币交换路径(最后一个地址必须是 WETH)。
    • to:接收 ETH 的地址。
    • deadline:交易必须完成的时间(时间戳)。
  • 返回值:每个路径节点的代币数量。

总结

  • UniswapV2Factory 合约类似于餐厅经理,负责创建和管理所有的交易对(自助餐台)。
  • UniswapV2Pair 合约类似于具体的自助餐台,管理存放和交换的代币(食物),并发放流动性代币(餐券)。
  • UniswapV2ERC20 合约实现了流动性代币的 ERC-20 标准,用于表示和管理流动性提供者在池中的份额(餐券的管理)。
  • IUniswapV2Router02 提供了一系列用于代币交换和流动性管理的功能,使得用户能够在去中心化交易所 Uniswap 上方便地进行交易和流动性操作。了解这些方法及其参数和返回值,有助于更好地利用 Uniswap 协议进行 DeFi 操作。

Uniswap V2 核心 合约代码的更多相关文章

  1. Uniswap V2 — 从代码解释 DeFi 协议

    Uniswap V2 - 从代码解释 DeFi 协议 为了理解我们在分析代码时将要经历的不同组件,首先了解哪些是主要概念以及它们的作用是很重要的.所以,和我一起裸露吧,因为这是值得的. 我在 5 个段 ...

  2. 用Java实现MVPtree——MVPtree核心算法代码的搭建

    项目需要,需要把MVPtree这种冷门的数据结构写入Java,然网上没有成形的Java实现,虽说C++看惯了不过对C++实现复杂结构也是看得蒙蔽,幸好客户给了个github上job什么的人用Java写 ...

  3. 【CSS】329- 非常强!3行核心css代码的rate评分组件

    像rate评分组件一般都用javascript写,所以这次将是一个全新的尝试,用css实现一个rate评分 ❗ 核心代码也就三行? 01 效果图 02 原理 主要是借助radio单选框,梳理如下: 去 ...

  4. BootLoader(2440)核心初始化代码

    1.gboot.lds OUTPUT_ARCH(arm)ENTRY(_start)SECTIONS {    . = 0x30008000; //起始地址        . = ALIGN(4);// ...

  5. C#实现发送邮件——核心部分代码

    在KS系统中有个发送邮件的功能需要做上网查阅资料以后,通过自己的部分修改实现了发送邮件的功能话不多说先来个界面: 邮件发送分一下步骤: 1.smtp服务信息设置 2.验证发件人信息 3.添加附件 4. ...

  6. CVE-2018-7600 Drupal核心远程代码执行漏洞分析

    0x01 漏洞介绍 Drupal是一个开源内容管理系统(CMS),全球超过100万个网站(包括政府,电子零售,企业组织,金融机构等)使用.两周前,Drupal安全团队披露了一个非常关键的漏洞,编号CV ...

  7. 预计阅读时间核心jS代码

    <script type="text/javascript"> jq(document).ready(function() { var read_time=jq(&qu ...

  8. Delphi_OD_代码_调试_Delphi反调试技术(以OD为例附核心原代码) (转)

    1.程序窗口[chuang kou]句柄[ju bing]检测原理:用FindWindow函数[han shu]查找[cha zhao]具有相同窗口[chuang kou]类名和标题的窗口[chuan ...

  9. Delphi_OD_代码_调试_Delphi反调试技术(以OD为例附核心原代码)

    1.程序窗口[chuang kou]句柄[ju bing]检测原理:用FindWindow函数[han shu]查找[cha zhao]具有相同窗口[chuang kou]类名和标题的窗口[chuan ...

  10. autojs websocket 核心示例代码,云控技术

    //初始化方法 function recordInit(scriptName){ //let ipInfoJson = getIP() // let ip = ipInfoJson.cip // le ...

随机推荐

  1. MPTCP(三) : 在内核中启用MPTCP相关模块

    在内核中启用MPTCPv1相关的模块 1. 简介 本文所涉及的均为MPTCPv1版本的MPTCP,采用的内核版本为5.18.19 需要注意的是 虽然MPTCP官方文档中提到在5.6之后的linux内核 ...

  2. JavaScript设计模式样例六 —— 抽象工厂模式

    抽象工厂模式(Abstract Factory Pattern) 定义:抽象工厂模式提供了一种方式,可以将一组具有同一主题的单独的工厂封装起来.或者说,是其他工厂的工厂.目的:提供一个创建一系列相关或 ...

  3. Blazor开发框架Known-V2.0.9

    V2.0.9 Known是基于Blazor的企业级快速开发框架,低代码,跨平台,开箱即用,一处代码,多处运行.本次版本主要是修复一些BUG和表格页面功能增强. 官网:http://known.puma ...

  4. lamada 表达式

    语法篇 -- \(lamada\) 表达式 函数内定义的函数,看起来能使代码更加美观. 具体定义方法: 前面挂个 auto ,不管他返不返回值 后面是函数名(表达式名) 例: Cekas 先是中括号表 ...

  5. Maven 设置 JDK 版本

    Maven 设置 JDK 版本是通过 Apache Maven Compiler Plugin 插件实现的.它用于编译项目的源代码. 方法一 有时候你可能需要将某个项目编译到与当前使用的 JDK 版本 ...

  6. 检测 NAT 类型

    使用 pystun3 pystun3 是一个用于获取 NAT 类型和外部 IP 的 Python STUN 客户端 安装: pip install pystun3 使用: pystun3 结果: NA ...

  7. JavaScript – Set and Map

    参考 Set 和 Map 数据结构 Set 介绍和使用 Set 很像 Array, 但其实它是一个 Iteralbe 对象. 用于保存多个值, 而且具有 unique 特性 (1 个 set 里面不会 ...

  8. C++面试题整理 2

    8. C++11新特性又哪些 自动类型推导auto,智能指指针(share_ptr,unique_ptr等),for循环简化,线程相关的(std::thread/std::mutex),空指针null ...

  9. ubuntu22.04安装DBeaver

    要在 Ubuntu22.04 上安装 DBeaver,可以选择使用 Ubuntu 软件中心的图形界面方法或使用命令行方法通过官方 DBeaver 仓库或 Snap 包安装. 方法一:从官方仓库安装 D ...

  10. QT数据可视化框架编程实战之三维散点图从入门到精通_补天云QT技术培训专家

    简介 本文将介绍支持GPU图形硬件加速的QT数据可视化框架编程实战之三维散点图从入门到精通_补天云QT技术培训专家.本文将创建一个含有三个序列的三维散点图,同时设定了坐标轴的标题和标签,使得用户点击表 ...