当前位置:网站首页>IDO预售代币合约系统开发技术说明及源码分析
IDO预售代币合约系统开发技术说明及源码分析
2022-08-02 21:56:00 【DD_MrsFu123】
Core逻辑
Core逻辑实现了单个交易对的逻辑。通过UniswapV2Factory可以创建一个个Pair(交易池)。每个具体实现逻辑在UniswapV2Pair中。
1. mint
每个交易对创建流动性。
function mint(address to) external lock returns (uint liquidity) {因为在调用mint函数之前,在addLiquidity函数已经完成了转账,所以,从这个函数的角度,两种代币数量的计算方式如下:
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加上注入的流动性的代币数量。
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逻辑类似。
function burn(address to) external lock returns (uint amount0, uint amount1) {3. swap
swap函数实现两种代币的兑换。
function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external lock {一个交易池的swap操作支持两个方向的兑换,可以从TokenA换到TokenB,或者TokenB换到TokenA。
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的差值,可以反推出输入的代币数量:
uint amount0In = balance0 > _reserve0 - amount0Out ? balance0 - (_reserve0 - amount0Out) : 0;
uint amount1In = balance1 > _reserve1 - amount1Out ? balance1 - (_reserve1 - amount1Out) : 0;确保反推的输入代币数量不小于零。
require(amount0In > 0 || amount1In > 0, 'UniswapV2: INSUFFICIENT_INPUT_AMOUNT');边栏推荐
- go exec 包
- Redis是如何轻松实现系统秒杀的?
- 目前为止 DAO靠什么盈利?
- word操作:单独调整英文字体
- wallys/new product/WiFi6 MiniPCIe Module 2T2R 2×2.4GHz 2x5GHz MT7915 MT7975
- H.265视频流媒体播放器EasyPlayer.js集成时出现“SourceBuffer ”报错,该如何解决?
- 了解 NFT 质押:Web3 中赚取被动收益的另一种方式
- Do you understand the factory pattern?
- TDengine 在中天钢铁 GPS、 AIS 调度中的落地
- 面试官居然问我:删库后,除了跑路还能干什么?
猜你喜欢

第十章 时序与延迟

【STM32学习3】DMA基础操作

从月薪10k到30k的必走之路:自动化测试

Byte's internal technical map is amazing and practical

You and I will meet the needs of: how to export the data in a MySQL simple ~!Practical!

增删改查这么多年,最后栽在MySQL的架构设计上!

Word operation: adjust the English font individually
![[TypeScript] Deep Learning of TypeScript Classes (Part 1)](/img/47/34954f1e01b844816d74f3ac556f9b.png)
[TypeScript] Deep Learning of TypeScript Classes (Part 1)

命令行启动常见问题及解决方案

Towards a General Purpose CNN for Long Range Dependencies in ND
随机推荐
目前为止 DAO靠什么盈利?
VS保存后Unity不刷新
同样月薪6K,为什么同事跳槽月薪翻倍,而你只涨了1000?
H5网页播放器EasyPlayer.js播放器界面的加载效果无法消失是什么原因?
[TypeScript] Deep Learning of TypeScript Classes (Part 1)
行业 SaaS 微服务稳定性保障实战
UDP (User Datagram Protocol)
用于中文文本分类的中文停用词
Unity WallFxPack使用
多租户的多种实现方案
【Unity】Unity开发进阶(六)UnityEvent使用与源码解析
JS Date 时间戳 getTune data.parse 倒计时小程序
增删改查这么多年,最后栽在MySQL的架构设计上!
一个很少见但很有用的SQL功能
第十章 时序与延迟
一群搞社区的人
Learn more TypeScript 】 【 TypeScript modular
辅助脚本开发之旅
软件测试到底自学还是报班?
浅读一下dotenv的主干逻辑的源码