一、什么是ERC315协议标准
ERC315协议标准是在ERC314协议标准基础上衍生而来,仍然支持ERC314协议标准的所有功能模块和操作流程。基于ERC314协议标准从安全性层面,用户体验层面,技术健壮性和运维层面做了进一步的优化升级。ERC315协议标准主要有如下功能特点:
- 向合约地址转账WETH即视为买入,合约会根据当前资金池中的价格核算买入的代币数量,然后实时的从合约地址中转出对于代币到msg.sender中。
- 向合约地址中转入相应代币即视为卖出行为,根据当前资金池中的代币价格计算应该获取的WETH,向msg.sender payable对应数量的WETH。
- 限制只有合约管理员地址才能添加流动性和撤销流动性。一旦完成流动性的初始化init即开发ERC315协议代币的swap交易。
- 可以在ERC315协议代币的买卖交易过程中扣除指定的WETH税率和代币税费自动兑换为指定币种用于其他机制模式。
- 所有ERC315协议的持币者都可以获取相应的WETH分红。这是ERC315区别于ERC314协议的主要特点。持币者获取WETH分红的方式可以是按照用户持币权重直接分红,也可以是对于代币持币数量mint tricker,按照tricker比例加权实时分红,也可以平均分红。具体的分红方式根据实际的业务需求确定。
二、ERC315协议核心功能源代码实现
- ERC315协议接口标准如下:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
interface IERC315 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
event AddLiquidity(uint32 blockToUnlockLiquidity, uint256 ethAmount, uint256 tokenAmount);
event RemoveLiquidity(uint256 ethAmount, uint256 tokenAmount);
event Swap(address indexed sender, uint amountEthIn, uint amountTokenIn, uint amountEthOut, uint amountTokenOut);
function name() external view returns (string memory);
function symbol() external view returns (string memory);
function decimals() external view returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 value) external returns (bool);
function addLiquidity(uint32 blockToUnlockLiquidity) external payable;
function removeLiquidity() external;
function getAmountOut(uint256 amountIn, bool isBuy) external view returns (uint256);
function liquidityProvider() external view returns(address);
function tradingEnable() external view returns(bool);
function liquidityAdded() external view returns(bool);
function blockToUnlockLiquidity() external view returns(uint32);
function getReserves() external view returns (uint256 reserveEth, uint256 reserveToken);
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
_checkOwner();
_;
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view virtual returns (address) {
return _owner;
}
/**
* @dev Throws if the sender is not the owner.
*/
function _checkOwner() internal view virtual {
if (owner() != _msgSender()) {
revert OwnableUnauthorizedAccount(_msgSender());
}
}
3. 外部extental合约接口ABI码底层调用函数接口
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but also transferring `value` wei to `target`.
*
* Requirements:
*
* - the calling contract must have an ETH balance of at least `value`.
* - the called Solidity function must be `payable`.
*/
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
if (address(this).balance < value) {
revert AddressInsufficientBalance(address(this));
}
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata);
}
4. ERC315协议标准兼容ERC20协议标准的transfer函数接口
function _transfer(address from, address to, uint256 value) internal {
if (from == address(0)) {
revert ERC315InvalidSender(address(0));
}
if (to == address(0)) {
revert ERC315InvalidReceiver(address(0));
}
if (tradingEnable && to == address(this) && (startTime > 0 && startTime < block.timestamp)) {
_sell(value);
} else if (tradingEnable && to == address(this)) {
revert ERC315TransferError();
} else {
_update(from, to, value);
}
_holderDividend();
}
5. 向合约地址转入WETH即可实现ERC315协议的买入功能
function _buy() internal virtual onlyOnceSwapInSameBlock {
if (!tradingEnable || ((startTime == 0 || startTime > block.timestamp) && !excluded[_msgSender()])) {
revert ERC315TradingNotEnable();
}
address sender = msg.sender;
uint256 ethAmount = msg.value;
uint256 swapEthAmount = ethAmount;
if (!excluded[_msgSender()]) {
uint256 marketFee = ethAmount * marketFeeRate / feeDenominator;
if (marketFee > 0) {
payable(marketFeeAddress).transfer(marketFee);
swapEthAmount = ethAmount - marketFee;
}
}
uint256 tokenAmount = swapEthAmount * _balances[address(this)] / address(this).balance;
if (tokenAmount == 0) {
revert ERC315InvalidAmountOut();
}
_update(address(this), sender, tokenAmount);
if (!excluded[sender]) {
payable(holderDividendManager).transfer(ethAmount * holderDividendFeeRate / feeDenominator);
}
emit Swap(sender, swapEthAmount, 0, 0, tokenAmount);
}
6. 向合约地址转入ERC315协议标准代币即被视为卖出操作
function _sell(uint256 tokenAmount) internal virtual onlyOnceSwapInSameBlock {
if (!tradingEnable || startTime == 0 || startTime > block.timestamp) {
revert ERC315TradingNotEnable();
}
address sender = msg.sender;
uint256 swapTokenAmount = tokenAmount;
if (startTime + 5 minutes > block.timestamp && !excluded[_msgSender()]) {
uint256 burnTokenAmount = tokenAmount * 20 / 100;
_update(sender, dead, burnTokenAmount);
swapTokenAmount = tokenAmount - burnTokenAmount;
}
uint256 ethAmount = swapTokenAmount * address(this).balance / (swapTokenAmount + _balances[address(this)]);
if (ethAmount == 0) {
revert ERC315InvalidAmountOut();
}
_update(sender, address(this), swapTokenAmount);
uint256 marketFee;
if (!excluded[_msgSender()]) {
marketFee = ethAmount * marketFeeRate / feeDenominator;
if (marketFee > 0) {
payable(marketFeeAddress).transfer(marketFee);
}
}
payable(sender).transfer(ethAmount - marketFee);
emit Swap(sender, 0, swapTokenAmount, ethAmount, 0);
}
至此,完成部署ERC315协议标准通证流程已经功能说明所有操流程。
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载:
币安智能链BSC发币(合约部署、开源、锁仓、LP、参数配置、开发、故障处理、工具使用)教程下载:
多模式(燃烧、回流指定营销地址、分红本币及任意币种,邀请推广八代收益,LP加池分红、交易分红、复利分红、NFT分红、自动筑池、动态手续费、定时开盘、回购)组合合约源代码下载:
pdf+视频币安智能链BSC发币教程及多模式组合合约源代码下载地址:
此内容仅供注册用户可见,请登录!
添加VX或者telegram获取全程线上免费指导
评论前必须登录!
注册