一、准备
1、该合约模式如下:
a. 可以实现分红任何币种,即所谓的万能分红合约,并且分红给的代币合约地址是通过构造函数传入的。
b. 实现自动筑池,添加流动性的 LP 属于黑洞地址 address(0)
c. 手续费回流营销钱包,并且回流的是指定的分红币种,非本币
d. 每笔交易都会有部分手续费销毁掉,转入黑洞地址 0x000000000000000000000000000000000000dEaD ,但是代币的总发行量不会减少。严格来说这不是销毁,是每笔交易都有部分代币作为手续费被永久锁定到BSC公认黑洞地址。
e. 该合约可以实现买入卖出配置不同的交易手续费,对应的分红,自动筑池,营销钱包,销毁的手续费可以灵活配置买入卖出时不同的比例。对应的手续费设置为0相当于关闭了该功能。这个功能是非常灵活和强大的,已经包含的功能基本上涵盖了目前市面上绝大部分的主流模式。
2、该合约的部署过程比较复杂,需要先部署 IterableMapping 类库合约,然后再部署 BABYTOKENDividendTracker 合约,并且 BABYTOKENDividendTracker 合约的开源需要依赖IterableMapping 类库,最后才能部署Token合约,在部署Token合约时将 BABYTOKENDividendTracker 的合约地址作为构造函数的参数传入Token合约中。
3、该合约部署完成后,不需要做任何的配置即可实现目标的合约模式。
4、该合约模板是平台自动生成的模板,对应的服务费通过 serviceFeeReceiver_ 和 serviceFee_ 参数来控制。在部署合约时为了实现取消服务费的目的通过设置serviceFeeReceiver_为自己的其他钱包地址,serviceFee_为0的方式来实现,同时避免改动代码。
二、合约部署步骤
1、所有sol文件(包括token文件)全部编译完成后,执行合约的部署。
2、在remix编译器中先部署 BABYTOKENDividendTracker 合约,该合约部署时会同时自动部署 IterableMapping 合约
执行分红任意币种的处理代码如下:
function process(uint256 gas) public returns ( uint256, uint256, uint256 ) { uint256 numberOfTokenHolders = tokenHoldersMap.keys.length; if (numberOfTokenHolders == 0) { return (0, 0, lastProcessedIndex); } uint256 _lastProcessedIndex = lastProcessedIndex; uint256 gasUsed = 0; uint256 gasLeft = gasleft(); uint256 iterations = 0; uint256 claims = 0; while (gasUsed < gas && iterations < numberOfTokenHolders) { _lastProcessedIndex++; if (_lastProcessedIndex >= tokenHoldersMap.keys.length) { _lastProcessedIndex = 0; } address account = tokenHoldersMap.keys[_lastProcessedIndex]; if (canAutoClaim(lastClaimTimes[account])) { if (processAccount(payable(account), true)) { claims++; } } iterations++; uint256 newGasLeft = gasleft(); if (gasLeft > newGasLeft) { gasUsed = gasUsed.add(gasLeft.sub(newGasLeft)); } gasLeft = newGasLeft; } lastProcessedIndex = _lastProcessedIndex; return (iterations, claims, lastProcessedIndex); }
3、部署完成后先开源 IterableMapping 合约,再开源 BABYTOKENDividendTracker 合约
IterableMapping合约地址: 0xd847f9a614c89ac3d33ea4caf636181daf5a108b
再开源 BABYTOKENDividendTracker 合约,该合约开源需要如下sol文件:
SafeMath.sol,SafeMathInt.sol,OwnableUpgradeable.sol,DividendPayingToken.sol,Initializable.sol, ContextUpgradeable.sol,IERC20.sol,SafeMathUint.sol,ERC20Upgradeable.sol,DividendPayingTokenInterface.sol, DividendPayingTokenOptionalInterface.sol,IERC20Upgradeable.sol,IERC20MetadataUpgradeable.sol,BABYTOKENDividendTracker.sol,IterableMapping.sol
共计需要15个合约文件。
并且开源合约时需要附加必需的IterableMapping类库
BABYTOKENDividendTracker合约地址:0xxxxbe1205xxxxxca8cxxxa8b3932272xxxx09
4、部署Token合约
合约需要输入相关的构造函数参数。其中包括三个数组,数组作为构造函数参数时的输入格式如下:
本次合约部署输入的构造函数参数如下:
输入参数解析:
a. 分红的代币为USDT
b. uniswapV2Router地址即PancakeSwapV2Router
c. 营销钱包地址
开源后的构造函数输入参数显示如下:
5、开源Token合约
开源合约时使用所有sol文件,不需要附加任何类库。
不需要附加 IterableMapping 和 BABYTOKENDividendTracker 类库即可开源成功。
BABYTOKENDividendTracker 合约需要依赖 IterableMapping 类库,开源 BABYTOKENDividendTracker 合约时必须附加 IterableMapping 类库。
Token合约中是clone了一个BABYTOKENDividendTracker 类似合约,不是直接调用的 BABYTOKENDividendTracker 合约。
Token中合约克隆BABYTOKENDividendTracker 类似合约的代码如下:
IterableMapping类代码如下:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library IterableMapping { // Iterable mapping from address to uint; struct Map { address[] keys; mapping(address => uint256) values; mapping(address => uint256) indexOf; mapping(address => bool) inserted; } function get(Map storage map, address key) public view returns (uint256) { return map.values[key]; } function getIndexOfKey(Map storage map, address key) public view returns (int256) { if (!map.inserted[key]) { return -1; } return int256(map.indexOf[key]); } function getKeyAtIndex(Map storage map, uint256 index) public view returns (address) { return map.keys[index]; } function size(Map storage map) public view returns (uint256) { return map.keys.length; } function set( Map storage map, address key, uint256 val ) public { if (map.inserted[key]) { map.values[key] = val; } else { map.inserted[key] = true; map.values[key] = val; map.indexOf[key] = map.keys.length; map.keys.push(key); } } function remove(Map storage map, address key) public { if (!map.inserted[key]) { return; } delete map.inserted[key]; delete map.values[key]; uint256 index = map.indexOf[key]; uint256 lastIndex = map.keys.length - 1; address lastKey = map.keys[lastIndex]; map.indexOf[lastKey] = index; delete map.indexOf[key]; map.keys[index] = lastKey; map.keys.pop(); } }
执行合约克隆代码如下:
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; library Clones { /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create opcode, which should never revert. */ function clone(address implementation) internal returns (address instance) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create(0, ptr, 0x37) } require(instance != address(0), "ERC1167: create failed"); } /** * @dev Deploys and returns the address of a clone that mimics the behaviour of `implementation`. * * This function uses the create2 opcode and a `salt` to deterministically deploy * the clone. Using the same `implementation` and `salt` multiple time will revert, since * the clones cannot be deployed twice at the same address. */ function cloneDeterministic(address implementation, bytes32 salt) internal returns (address instance) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000) instance := create2(0, ptr, 0x37, salt) } require(instance != address(0), "ERC1167: create2 failed"); } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress( address implementation, bytes32 salt, address deployer ) internal pure returns (address predicted) { assembly { let ptr := mload(0x40) mstore(ptr, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000) mstore(add(ptr, 0x14), shl(0x60, implementation)) mstore(add(ptr, 0x28), 0x5af43d82803e903d91602b57fd5bf3ff00000000000000000000000000000000) mstore(add(ptr, 0x38), shl(0x60, deployer)) mstore(add(ptr, 0x4c), salt) mstore(add(ptr, 0x6c), keccak256(ptr, 0x37)) predicted := keccak256(add(ptr, 0x37), 0x55) } } /** * @dev Computes the address of a clone deployed using {Clones-cloneDeterministic}. */ function predictDeterministicAddress(address implementation, bytes32 salt) internal view returns (address predicted) { return predictDeterministicAddress(implementation, salt, address(this)); } }
至此,完成万能分红任何币种+自动筑池+营销钱包+消耗+买卖不同手续费合约代码部署所有操作流程。
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
此内容仅供注册用户可见,请登录!
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册