部署ERC315协议标准通证流程以及功能说明

一、什么是ERC315协议标准

ERC315协议标准是在ERC314协议标准基础上衍生而来,仍然支持ERC314协议标准的所有功能模块和操作流程。基于ERC314协议标准从安全性层面,用户体验层面,技术健壮性和运维层面做了进一步的优化升级。ERC315协议标准主要有如下功能特点:

  1.  向合约地址转账WETH即视为买入,合约会根据当前资金池中的价格核算买入的代币数量,然后实时的从合约地址中转出对于代币到msg.sender中。

  2. 向合约地址中转入相应代币即视为卖出行为,根据当前资金池中的代币价格计算应该获取的WETH,向msg.sender payable对应数量的WETH。

  3. 限制只有合约管理员地址才能添加流动性和撤销流动性。一旦完成流动性的初始化init即开发ERC315协议代币的swap交易。

  4. 可以在ERC315协议代币的买卖交易过程中扣除指定的WETH税率和代币税费自动兑换为指定币种用于其他机制模式。

  5. 所有ERC315协议的持币者都可以获取相应的WETH分红。这是ERC315区别于ERC314协议的主要特点。持币者获取WETH分红的方式可以是按照用户持币权重直接分红,也可以是对于代币持币数量mint tricker,按照tricker比例加权实时分红,也可以平均分红。具体的分红方式根据实际的业务需求确定。

二、ERC315协议核心功能源代码实现

  1.  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);
}

2. 合约管理权限控制模块功能代码如下:

/**
     * @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协议标准通证流程已经功能说明所有操流程。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值