在合约中直接增加代币交易的接口,代币买入,卖出,添加和撤销流动性接口功能。这样就可以直接通过区块链浏览器或者dapp调用合约直接实现代币的交易功能,不用用户在pancakeswap,uniswap等dex上直接交易,这也是大部分dapp中集成pancakeswap,uniswap支持在dapp中直接交易的功能实现方式。
直接调用区块链浏览器中的接口,可以绕开dex中50%的最大滑点限制,随意交易任意数量的代币,而不用分批次,限制滑点方式逐笔交易。
在合约中增加如下代码,添加买入,卖出,撤销和添加流动性功能。
function getToken0Price() view public returns(uint){ //代币价格
address[] memory routePath = new address[](2);
routePath[0] = token0;
routePath[1] = token1;
return router.getAmountsOut(1 ether,routePath)[1];
}
function getToken1Price() view public returns(uint){ //代币价格
address[] memory routePath = new address[](2);
routePath[0] = token1;
routePath[1] = token0;
return router.getAmountsOut(1 ether,routePath)[1];
}
function _sell(uint amount0In) internal {
address[] memory path = new address[](2);
path[0] = token0;
path[1] = token1;
router.swapExactTokensForTokensSupportingFeeOnTransferTokens(amount0In,0,path,address(this),block.timestamp);
}
function _buy(uint amount0Out) internal {
address[] memory path = new address[](2);
path[0] = token1;
path[1] = token0;
router.swapTokensForExactTokens(amount0Out,IERC20(token1).balanceOf(address(this)),path,address(this),block.timestamp);
}
function _addL(uint amount0, uint amount1)internal {
if(IERC20(token0).balanceOf(address(this))<amount0 || IERC20(token1).balanceOf(address(this))<amount1 ) return;
router.addLiquidity(token0,token1,amount0,amount1,0,0,ceo,block.timestamp);
}
modifier canSwap(uint t){
if(t!=2 || !autoSell.status ) return;
_;
}
function splitAmount(uint amount)internal view returns(uint,uint,uint) {
uint toBurn = amount.mul(allot.burn).div(allot.total);
uint toAddL = amount.mul(allot.addL).div(allot.total).div(2);
uint toSell = amount.sub(toAddL).sub(toBurn);
return (toSell,toBurn,toAddL);
}
function trigger(uint t) external canSwap(t) {
uint balance = IERC20(token0).balanceOf(address(this));
if(balance < IERC20(token0).totalSupply().mul(autoSell.minPart).div(autoSell.parts))return;
uint maxSell = IERC20(token0).totalSupply().mul(autoSell.maxPart).div(autoSell.parts);
if(balance > maxSell)balance = maxSell;
(uint toSell,uint toBurn,uint toAddL)=splitAmount(balance);
if(toBurn>0)ERC20Burnable(token0).burn(toBurn);
if(toSell>0)_sell(toSell);
uint256 amount2 =IERC20(token1).balanceOf(address(this));
uint256 total2Fee = allot.total.sub(allot.addL.div(2)).sub(allot.burn);
uint256 amount2AddL = amount2.mul(allot.addL).div(total2Fee).div(2);
uint256 amount2Marketing = amount2.sub(amount2AddL);
if(amount2Marketing>0){
uint256 cake;
for (uint256 i = 0; i < marketingAddress.length; i++) {
cake=amount2Marketing.mul(marketingShare[i]).div(sharetotal);
IERC20(token1).transfer(marketingAddress[i],cake);
}
}
if(toAddL > 0) _addL(toAddL,amount2AddL);
}
function send(address token,uint256 amount) public{
if(token==address(0))payable(ceo).transfer(amount);
else IERC20(token).transfer(ceo,amount);
}
在dapp开发过程中,如下需要用户直接在dapp交易代币,可以通过以上方式,dapp调用合约中的交易接口将pancakeswap,uniswap,sushiswap集成到dapp中。
至此,完成合约中增加直接买入卖出添加和撤销流动性的功能,避免在dex直接操作,可以绕开50%的最大滑点限制的所有操作流程。
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
币安智能链BSC发币(合约部署、开源、锁仓、LP、参数配置、开发、故障处理、工具使用)教程下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册