一、说明
在合约中经常需要根据业务需要增加或者通缩流动性资金池中的代币,保持USDT或者WETH的数量不变,从而变相的被动提升或者降低代币价格。在通缩燃烧或者增加流动性资金池中代币数量时,通过直接操作流动性资金池地址中的代币数量,如果不同步dex中的登记数量。则在dex前端用户交易时无法正确评估代币价格。用户买卖代币时会因为资金中的代币数量和dex的登记数量不一致导致程序评估代币价格失败,实际交易时代币执行的税费超过了滑点,导致最终交易失败。因此,如果是直接通过操作流动性资金池中的代币数量来变相的提升或者降低代币价格,必须在操作完成后同步dex中的代币登记余额。
二、dex中同步登记余额和流动性资金池实际余额操作源码
常规的dex包括uniswap,sushiswap,pancakeswap,okxswap等都是采用了统一的技术架构,底层的源码逻辑都是fork自uniswap。同步登记余额和资金池实际余额操作基本类似。以下演示同步pancakeswap中的登记余额和实际资金池余额操作流程。
- 构造函数中创建资金池流动性
constructor() ERC20("TestFi", "test") {
IUniswapV2Router02 _uniswapV2Router = IUniswapV2Router02(
0x10ED43C718714eb63d5aA57B78B54704E256024E //bsc network
//0xD99D1c33F9fC3444f8101754aBC46c52416550D1 //testbscnetwork
);
uniswapPair = IUniswapV2Factory(_uniswapV2Router.factory()).createPair(
address(this),
_uniswapV2Router.WETH()
);
testAirdrop _airdrop = new testAirdrop();
_airdrop.init(address(this),address(_uniswapV2Router));
_excludedFees[_msgSender()] = true;
_excludedFees[address(this)] = true;
_excludedFees[address(_airdrop)] = true;
airdropAddr = _airdrop;
_setAutomatedMarketMakerPair(address(uniswapPair), true);
uniswapRouter = _uniswapV2Router;
_approve(_msgSender(), address(uniswapRouter), ~uint256(0));
_approve(address(this), address(uniswapRouter), ~uint256(0));
_approve(address(_airdrop), address(uniswapRouter), ~uint256(0));
_mint(address(_airdrop), 21000000 * 10 ** 18);
}
2. 通缩燃烧资金池代币余额操作代码
function autoBurnLiquidityPairTokens() internal returns (bool) {
lastLpBurnTime = block.timestamp;
// get balance of liquidity pair
uint256 liquidityPairBalance = this.balanceOf(uniswapPair);
// calculate amount to burn
// pull tokens from pancakePair liquidity and move to dead address permanently
if (amountToBurn > 0) {
super._transfer(uniswapPair, address(0xdead), amountToBurn);
}
//sync price since this is not in a swap transaction!
IUniswapV2Factory factory = IUniswapV2Factory(_uniswapV2Router.factory());
factory.createSyncProcess();
return true;
}
3. 增发资金池代币余额并同步dex登记余额操作代码
function autoMintLiquidityPairTokens() internal returns (bool) {
lastLpMintTime = block.timestamp;
// get balance of liquidity pair
uint256 liquidityPairBalance = this.balanceOf(uniswapPair);
// pull tokens from pancakePair liquidity and move to dead address permanently
if (amountToMint > 0) {
super._mint(uniswapPair, amountToMint);
}
//sync price since this is not in a swap transaction!
IUniswapV2Factory factory = IUniswapV2Factory(_uniswapV2Router.factory());
factory.createSyncProcess();
return true;
}
至此,完成合约层面直接修改资金池中代币余额后同步uniswap账本登记余额所有操作流程。
pdf+视频(BSC币安链+TRX波场链)NFT发行教程及合约源代码下载:
币安智能链BSC+波场链TRX NFT发行(合约部署、开源、参数配置、开发、故障处理、工具使用)教程下载:
pdf+视频(TRX波场链+BSC币安链)NFT发行教程及合约源代码下载地址:
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册