首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >IDO代币预售合约系统开发技术详细

IDO代币预售合约系统开发技术详细

原创
作者头像
DD_MrsFu123
发布于 2022-08-02 12:41:35
发布于 2022-08-02 12:41:35
79500
代码可运行
举报
文章被收录于专栏:IT软件开发IT软件开发
运行总次数:0
代码可运行
Uniswap代码结构

Uniswap智能合约代码由两个github项目组成。一个是core,一个是periphery。

core偏核心逻辑,单个swap的逻辑。periphery偏外围服务,一个个swap的基础上构建服务。单个swap,两种代币形成的交易对,俗称“池子”。每个交易对有一些基本属性:reserve0/reserve1以及total supply。reserve0/reserve1是交易对的两种代币的储存量。total supply是当前流动性代币的总量。每个交易对都对应一个流动性代币(LPT  - liquidity provider token)。简单的说,LPT记录了所有流动性提供者的贡献。所有流动性代币的总和就是total supply。Uniswap协议的思想是reserve0*reserve1的乘积不变。

Periphery逻辑

核心逻辑实现在UniswapV2Router02.sol中。称为Router,因为Periphery实现了“路由”,支持各个swap之间的连接。基本上实现了三个功能:1/ add liquidity(增加流动性)2/remove liqudity (抽取流动性) 3/ swap(交换)。

1. add liqudity  

增加流动性,就是同时提供两种代币。因为代币有可能是ETH,针对不同情况有不同的接口。逻辑类似。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    function addLiquidity(
        address tokenA,
        address tokenB,
        uint amountADesired,
        uint amountBDesired,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) external virtual override ensure(deadline) returns (uint amountA, uint amountB, uint liquidity)

add liqudity查看之前有没有创建相应的交易对。如果有相应的交易对,确定目前的兑换比例在希望的范围内(期望amountDesired和不低于amountMin)。如果兑换比例OK,将相应的代币转入对应的交易对池子,并调用其的mint函数。

2. remove liqudity  

提供流动性的相反的操作就是抽取流动性。也就是说,流动性提供者不再提供相应的流动性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    function removeLiquidity(
        address tokenA,
        address tokenB,
        uint liquidity,
        uint amountAMin,
        uint amountBMin,
        address to,
        uint deadline
    ) public virtual override ensure(deadline) returns (uint amountA, uint amountB) {

liquidity是抽取的流动性的量。amountMin是抽取代币的最小的个数。to是抽取代币的目标地址。deadline是个有意思的设计:抽取的操作有时效性。超过了一定的deadline(区块高度),这次抽取操作看成无效。

先收回需要抽取的Token,并且销毁:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); // send liquidity to pair
(uint amount0, uint amount1) = IUniswapV2Pair(pair).burn(to);
3. swap

swap是普通用户进行代币交易的操作。普通用户通过swap操作实现两种token之间的交易。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function swapExactTokensForTokens(
    uint amountIn,
    uint amountOutMin,
    address[] calldata path,
    address to,
    uint deadline
) external virtual override ensure(deadline) returns (uint[] memory amounts) {

Uniswap支持多种代币的交换。具体的含义是,Uniswap提供了多级交易池的路由功能。举个例子,已有两个交易对TokenA-TokenB,以及TokenB-TokenC,通过swap接口,可以实现TokenA-TokenC的交换,其中经过的TokenA-TokenB,TokenB-TokenC,称为路径(path)。amountIn是路径中的第一个代币的数量,amountOutMin是期望的交换后的最少的数量。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path);
require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT');

amounts是每个路径上的交换后的数量。amounts[amounts.length-1]也就是最后一条路径的输出数量。注意,UniswapV2Library.getAmountsOut的实现(在获取每个交易对的reserve信息后,调用getAmountOut函数):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) internal pure returns (uint amountOut) {
        require(amountIn > 0, 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT');
        require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY');
        uint amountInWithFee = amountIn.mul(997);
        uint numerator = amountInWithFee.mul(reserveOut);
        uint denominator = reserveIn.mul(1000).add(amountInWithFee);
        amountOut = numerator / denominator;
    }

注意,其中的997/1000的系数。在进入每个交易池之前,进入的金额先扣除了0.3%的本金。这个就是交易费。注意的是,路径上的交易池,每个池子都收。有点像高速收费站,一段段的收。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
TransferHelper.safeTransferFrom(
    path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]
);

将代币path[0],转入到交易对,数量为amounts[0]。转入代币后,进行真正的swap操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    function _swap(uint[] memory amounts, address[] memory path, address _to) internal virtual {
        for (uint i; i < path.length - 1; i++) {
            (address input, address output) = (path[i], path[i + 1]);
            (address token0,) = UniswapV2Library.sortTokens(input, output);
            uint amountOut = amounts[i + 1];
            (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOut) : (amountOut, uint(0));
            address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to;
            IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)).swap(
                amount0Out, amount1Out, to, new bytes(0)
            );
        }
    }

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
UniswapV2协议解析
本篇文章主要对Uniswap V2协议的工作原理、项目构成、源码实现等部分进行详细解读。
Al1ex
2021/07/21
3.6K2
UniswapV2协议解析
Uniswap V2 学习笔记2. 交易算法
大家好, 今天继续分享 Uniswap V2 的学习心得, 今天的内容是 Uniswap[2]的交易算法
Tiny熊
2022/05/25
1.9K0
IDO预售代币合约系统开发技术说明及源码分析
Core逻辑实现了单个交易对的逻辑。通过UniswapV2Factory可以创建一个个Pair(交易池)。每个具体实现逻辑在UniswapV2Pair中。
DD_MrsFu123
2022/08/02
7970
Uniswap V2 源码学习 (三). 手续费和交易池估值
前面我们已经大致了解了 uniswap 的交易算法[2], 今天我们一起看看 Uniswap 手续费是怎么计算的
Tiny熊
2022/05/25
1.5K0
Uniswap V2 源码学习 (三). 手续费和交易池估值
SushiSwap协议分析
SushiSwap是一个分叉自Uniswap的去中心化交易协议,它在交易模式上延续了Uniswap的核心设计——AMM(自动做市商)模型,但与Uniswap不同之处在于SushiSwap增加了经济奖励模型,SushiSwap交易手续费为0.3%,其中0.25%直接分给发给流动性提供,0.05%买成SUSHI并分配给Sushi代币持有者(Uniswap是通过开关模式决定是否将0.05%的手续费给开发者团队),Sushi在每次分发时会预留10%给项目未来开发迭代及安全审计等。
Al1ex
2021/07/21
2.3K0
SushiSwap协议分析
BSC智能链挖矿dapp系统开发智能合约技术指南
币安智能链(Binance Smart Chain,简称 BSC )是一条以太坊虚拟机兼容,与币安链并行的区块链,是加密资产行业顶尖项目的测试和前沿探索。
开发v_hkkf5566
2022/10/25
1.4K0
价格预言机的使用总结(二):UniswapV2篇
该系列的前一篇文章介绍了 Chainlink 价格预言机的使用,其目前也被大部分 DeFi 应用所使用,但依然存在局限性。首先是所支持的 Token 的覆盖率还不全,尤其是长尾资产,大多还未支持,比如 SHIB,目前只在 BSC 主网有 SHIB/USD 的 Price Feed,而其它网络的都还没有,连 Ethereum 的都还没支持。其次,有些资产的偏差阈值较大,价格更新也比较慢,可能长达十几二十个小时才会更新价格,比如 BNT。
Keegan小钢
2022/06/07
1.7K0
价格预言机的使用总结(二):UniswapV2篇
剖析DeFi交易产品之Uniswap:V2上篇
在 DeFi 赛道中,DEX 无疑是最核心的一块,而 Uniswap 又是整个 DEX 领域中的龙头,如 SushiSwap、PancakeSwap 等都是 Fork 了 Uniswap 的。虽然网上关于 Uniswap 的文章已经挺多,但大多都只是从机制上进行介绍,很少谈及具体实现,也存在一些问题没能解答,比如:手续费分配是如何实现的?最优路径是如何得出的?TWAP 怎么用?注入流动性时返回多少 LP Token 是如何计算的?因此,我从代码层面去剖析 Uniswap,搞清楚这些问题,同时也对 Uniswap 从整体到细节都有所理解。
Keegan小钢
2021/08/20
1.8K0
pancakeSwapV2交易手续费实现原理
在 Uniswap V2 中,会对每次交易收取手续费。具体来说,Uniswap V2 对每笔交易收取 0.3% 的手续费。这些手续费的分配如下:
终有链响
2024/12/11
2040
这几天我写了一个DEX交易聚合器
目前,DeFi 赛道中,专门做 DEX 交易聚合的产品挺多的,以下是其中一些平台:
Keegan小钢
2021/07/23
1.7K0
这几天我写了一个DEX交易聚合器
UniSwap学习笔记1: 概览以及交易对地址计算
hello everyone, 我是 tony, 今天开始为大家分享我最近学习 Uniswap[2] 的小小心得, 希望各位看官多多提意见, 大家一起进步.
Tiny熊
2022/05/25
2K1
LP流动性挖矿系统开发(详细讲解)丨LP流动性质押开发(逻辑分析)
core偏核心逻辑,单个swap的逻辑。periphery偏外围服务,一个个swap的基础上构建服务。单个swap,两种代币形成的交易对,俗称“池子”。每个交易对有一些基本属性:reserve0/reserve1以及total supply。reserve0/reserve1是交易对的两种代币的储存量。total supply是当前流动性代币的总量。每个交易对都对应一个流动性代币(LPT-liquidity provider token)。简单的说,LPT记录了所有流动性提供者的贡献。所有流动性代币的总和就是total supply。Uniswap协议的思想是reserve0*reserve1的乘积不变。
系统_I8O28578624
2022/12/09
1.1K0
剖析DeFi交易产品之UniswapV4:Swap
Swap 可分为两种场景:单池交易和跨池交易。在 PoolManager 合约里,要完成交易流程,会涉及到 lock()、swap()、settle()、take() 四个函数。单池交易时只需要调一次 swap() 函数,而跨池交易时则需要多次调用 swap() 函数来完成。
Keegan小钢
2023/12/11
3740
剖析DeFi交易产品之UniswapV4:Swap
DAPP代币合约流动性质押分红挖矿系统开发丨技术分析
在开发过程当中,最常用的是浏览器插件钱包。浏览器插件钱包配置简单,插件钱包的安装和使用都很便捷。此外,由于目前大多数区块链应用都是网页的,因此通过浏览器钱包可以轻松访问目前主流的所有 Defi 和 NFT 应用。
l8l259l3365
2022/11/07
5950
交易所开发成品丨交易所系统开发(演示版)丨交易所APP源码设计
An exchange is an information platform for trading certain information and goods. A fixed place is called an exchange. The exchange, with the help of information platform, realizes the sharing of property rights information, long-distance trading, unified coordination, and balance of property rights trading market and various terms.
系统_I8O28578624
2023/02/21
4660
如何在合约中集成 Uniswap v3
如果你还不熟悉Uniswap[4],它是一个去中心化的交易所(DEX),依靠外部流动性提供者将代币添加到流动池配对中,用户可以直接交易这些代币。
Tiny熊
2021/06/10
2.4K0
如何在合约中集成 Uniswap v3
剖析DeFi交易产品之UniswapV3:头寸管理合约
实现用户层面的流动性头寸管理的合约是 NonfungiblePositionManager 合约,其实现比较复杂,还继承了很多子合约,限于篇幅,我们无法全都一一讲解,就只能挑一些重点的来讲。
Keegan小钢
2023/11/08
5380
剖析DeFi交易产品之UniswapV3:头寸管理合约
剖析DeFi交易产品之Uniswap:V2中篇
上篇我们主要讲了 UniswapV2 整体分为了哪些项目,并重点讲解了 uniswap-v2-core 的核心代码实现。这篇我们来看看 uniswap-v2-periphery。
Keegan小钢
2021/10/08
2.8K0
UniSwap V3协议浅析(下)
NoDelegateCall合约的主要功能是提供一个修饰器来阻止对使用修饰器修饰过的函数进行delegatecall调用,合约代码如下:
Al1ex
2021/07/21
2.5K0
UniSwap V3协议浅析(下)
如何在Uniswap上执行闪电兑换(Flash Swaps)
在这篇文章中,我们将通过探讨闪电兑换(Flash Swaps)来向前推进一个层次。
Tiny熊
2022/11/07
2.1K0
如何在Uniswap上执行闪电兑换(Flash Swaps)
相关推荐
UniswapV2协议解析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档