一、说明
目前市场上出现了比较新颖的模式是:用户通过dapp前端页面触发铭文、符文、代币的mint或者空投后支付指定数量的WETH,其中WETH进入指定的归集钱包地址,支付WETH的钱包地址收到对应数量的铭文、符文、代币空投或者之间mint到钱包地址。同时,绑定三代上下级关系,直推和间推上级获取一定比例的奖励。
整个程序设计没有后端,前端通过js直接调用链端功能接口。合约端主要实现的功能如下:
- 可以指定用户转账WETH后mint的铭文,符文,代币合约地址
- 可以指定请求用户需要支付的WETH数量
- 可以指定用户支付WETH后归集的钱包地址
- 可以设置一代直推和二代间接推奖励比例,同时绑定上下级关系
- 可以根据实际的业务需要,灵活设置用户的上下级推荐关系
二、核心功能合约代码实现
- 多用户同时触发dapp向合约地址转账时的并行进程锁
function _nonReentrantBefore() private {
// On the first call to nonReentrant, _status will be _NOT_ENTERED
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
// Any calls to nonReentrant after this point will fail
_status = _ENTERED;
}
function _nonReentrantAfter() private {
// By storing the original value once again, a refund is triggered (see
// https://eips.ethereum.org/EIPS/eip-2200)
_status = _NOT_ENTERED;
}
/**
* @dev Returns true if the reentrancy guard is currently set to "entered", which indicates there is a
* `nonReentrant` function in the call stack.
*/
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
2. 设置多权限角色功能的访问控制合约代码。可以根据实际的需要设置管理员权限,操作员权限,角色管理员等。授权和取消授权的操作需要对应角色的管理员才能执行。合约参数的配置仅需要操作管理员即可完成
/**
* @dev Revert with a standard message if `account` is missing `role`.
*
* The format of the revert reason is given by the following regular expression:
*
* /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
*/
function _checkRole(bytes32 role, address account) internal view virtual {
if (!hasRole(role, account)) {
revert(
string(
abi.encodePacked(
"AccessControl: account ",
Strings.toHexString(account),
" is missing role ",
Strings.toHexString(uint256(role), 32)
)
)
);
}
}
3. strings和uint256数量类型之间的转换工具函数代码如下:
/**
* @dev Converts a `uint256` to its ASCII `string` decimal representation.
*/
function toString(uint256 value) internal pure returns (string memory) {
unchecked {
uint256 length = Math.log10(value) + 1;
string memory buffer = new string(length);
uint256 ptr;
/// @solidity memory-safe-assembly
assembly {
ptr := add(buffer, add(32, length))
}
while (true) {
ptr--;
/// @solidity memory-safe-assembly
assembly {
mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
}
value /= 10;
if (value == 0) break;
}
return buffer;
}
}
/**
* @dev Converts a `int256` to its ASCII `string` decimal representation.
*/
function toString(int256 value) internal pure returns (string memory) {
return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value))));
}
/**
* @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
*/
function toHexString(uint256 value) internal pure returns (string memory) {
unchecked {
return toHexString(value, Math.log256(value) + 1);
}
}
4. 请求用户支付WETH并归集到指定钱包地址,同时绑定上下级关系,支付mint的铭文,符文核心功能代码:
/**
* @dev Manager Modify Inviters
*/
function managerModifyInviters(
address[] calldata users,
address[] calldata inviters
) external onlyRole(MANAGER_ROLE) {
for (uint256 i = 0; i < users.length; i++) {
userInviter[users[i]] = inviters[i];
if (userInviter[inviters[i]] != address(0)) {
BEBE.safeTransfer(userInviter[inviters[i]], ratio[2]);
}
BEBE.safeTransfer(inviters[i], ratio[1]);
BEBE.safeTransfer(users[i], ratio[0]);
emit BindInviter(users[i], inviters[i]);
}
}
5. 直接在区块链浏览器上调用合约接口,完整请求用户支付WETH,绑定上下级关系,同时归集所有WETH到指定钱包地址操作如下:
至此,完成dapp中用户触发领取铭文/符文/代币空投后要求用户支付指定数量的WETH进入归集钱包地址代码实现所有操作流程。
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
币安智能链BSC发币(合约部署、开源、锁仓、LP、参数配置、开发、故障处理、工具使用)教程下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册