前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >IDO预售代币合约系统开发技术说明及源码分析

IDO预售代币合约系统开发技术说明及源码分析

原创
作者头像
DD_MrsFu123
发布2022-08-02 20:46:53
6730
发布2022-08-02 20:46:53
举报
文章被收录于专栏:IT软件开发IT软件开发
Core逻辑

Core逻辑实现了单个交易对的逻辑。通过UniswapV2Factory可以创建一个个Pair(交易池)。每个具体实现逻辑在UniswapV2Pair中。

1. mint

每个交易对创建流动性。

代码语言:javascript
复制
function mint(address to) external lock returns (uint liquidity) {

因为在调用mint函数之前,在addLiquidity函数已经完成了转账,所以,从这个函数的角度,两种代币数量的计算方式如下:

代码语言:javascript
复制
        uint balance0 = IERC20(token0).balanceOf(address(this));
        uint balance1 = IERC20(token1).balanceOf(address(this));
        uint amount0 = balance0.sub(_reserve0);
        uint amount1 = balance1.sub(_reserve1);

当前的balance是当前的reserve加上注入的流动性的代币数量。

代码语言:javascript
复制
        uint _totalSupply = totalSupply; // gas savings, must be defined here since totalSupply can update in _mintFee
        if (_totalSupply == 0) {
            liquidity = Math.sqrt(amount0.mul(amount1)).sub(MINIMUM_LIQUIDITY);
          _mint(address(0), MINIMUM_LIQUIDITY); // permanently lock the first MINIMUM_LIQUIDITY tokens
        } else {
            liquidity = Math.min(amount0.mul(_totalSupply) / _reserve0, amount1.mul(_totalSupply) / _reserve1);
        }
        _mint(to, liquidity);

流动性liquidity的计算方式在第一次提供流动性时和其他时候稍稍不同。第一次提供流动性的计算公式如下:

liquidity = sqrt(x0*y0) - min

其中min是10^3。也就是说,第一次提供流动性是有最小流动性要求的。其他提供流动性的计算公式如下:

liquidity = min((x0/reserve0*totalsupply), (y0/reserve1*totalsupply))

也就说,按照注入的流动性和当前的reserve的占比一致。

2. burn

burn函数用在抽取流动性。burn逻辑和mint逻辑类似。

代码语言:javascript
复制
function burn(address to) external lock returns (uint amount0, uint amount1) {
3. swap

swap函数实现两种代币的兑换。

代码语言:javascript
复制
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock {

一个交易池的swap操作支持两个方向的兑换,可以从TokenA换到TokenB,或者TokenB换到TokenA。

代码语言:javascript
复制
if (amount0Out > 0) _safeTransfer(_token0, to, amount0Out); // optimistically transfer tokens
if (amount1Out > 0) _safeTransfer(_token1, to, amount1Out); // optimistically transfer tokens

因为在swapExactTokensForTokens的getAmountOut函数已经确定兑换处的金额。所以,先直接转账。

在不做swap之前,balance应该和reserve相等的。通过balance和reserve的差值,可以反推出输入的代币数量:

代码语言:javascript
复制
uint amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;
uint amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;

确保反推的输入代币数量不小于零。

代码语言:javascript
复制
require(amount0In > 0 || amount1In > 0, 'UniswapV2: INSUFFICIENT_INPUT_AMOUNT');

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Core逻辑
    • 1. mint
      • 2. burn
        • 3. swap
        相关产品与服务
        网站建设
        网站建设(Website Design Service,WDS),是帮助您快速搭建企业网站的服务。通过自助模板建站工具及专业设计服务,无需了解代码技术,即可自由拖拽模块,可视化完成网站管理。全功能管理后台操作方便,一次更新,数据多端同步,省时省心。使用网站建设服务,您无需维持技术和设计师团队,即可快速实现网站上线,达到企业数字化转型的目的。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档