DApp質押借貸挖礦系統開發|流動性質押分紅模式定製(原始碼搭建)

nice1022發表於2023-03-09

區塊鏈賬戶不需要使用者到銀行機構或者其他部門申請,因為整個系統中沒有這樣的中心化部門來管理賬戶資訊,使用者只需要根據一種非對稱加密演算法來生成一個金鑰對,其公鑰作為賬戶地址,也就是常說的區塊鏈錢包地址,這個地址可以在網路中廣播,允許網路中所有的賬戶獲取和使用。


該賬戶是公開的。系統I34-開發I633-原始碼53I9,私鑰作為轉賬交易的簽名和密碼,由使用者私人保管,每次轉賬時,需要透過私鑰簽名來證明交易的合法性。在現實使用中,區塊鏈錢包會將私鑰進行對稱加密,透過使用者輸入人類能夠理解的密碼作為私鑰加密的金鑰,將區塊鏈金鑰以密文的形式儲存到磁碟空間中。需要注意的是,如果忘記解密金鑰的密碼,就失去了對賬戶的操作許可權。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
 
import "./IERC20.sol";
import "./IERC20Metadata.sol";
contract ERC20 is IERC20, IERC20Metadata {
    // 地址餘額
    mapping(address => uint256) private _balances;
    // 授權地址餘額
    mapping(address => mapping(address => uint256)) private _allowances;
 
    uint256 private _totalSupply;
 
    string private _name;
    string private _symbol;
 
    // 設定代幣名稱符號,並初始化鑄造了10000000000代幣在釋出者帳號下。
    constructor() {
        _name = "HarryToken";
        _symbol = "HYT";
        _mint(msg.sender, 10000000000);
    }
 
    function name() public view virtual override returns (string memory) {
        return _name;
    }
 
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }
 
    /// 小數點位數一般為 18
    function decimals() public view virtual override returns (uint8) {
        return 18;
    }
 
    // 返回當前流通代幣的總量
    function totalSupply() public view virtual  override returns (uint256) {
        return _totalSupply;
    }
 
    // 查詢指定帳號地址餘額
    function balanceOf(address account) public view virtual override returns (uint256) {
        return _balances[account];
    }
 
    // 轉帳功能
    function transfer(address to, uint256 amount) public virtual override returns (bool) {
        address owner = msg.sender;
        _transfer(owner, to, amount);
        return true;
    }
 
    // 獲取被授權者可使用授權帳號的可使用餘額
    function allowance(address owner, address spender) public view virtual override returns (uint256) {
        return _allowances[owner][spender];
    }
 
    // 授權指定帳事情可使用自己一定額度的帳戶餘額。
    // 授權spender, 可將自己餘額。使用可使用的餘額的總量為amount
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = msg.sender;
        _approve(owner, spender, amount);
        return true;
    }
 
    //approve函式中的spender呼叫,將授權人 from 帳戶中的代幣轉入to 帳戶中
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = msg.sender;
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }
 
    function increaseAllowance(address spender, uint256 addedValue) public virtual returns (bool) {
        address owner = msg.sender;
        _approve(owner, spender, _allowances[owner][spender] + addedValue);
        return true;
    }
 
    function decreaseAllowance(address spender, uint256 substractedValue) public virtual returns (bool) {
        address owner = msg.sender;
        uint256 currentAllowance = _allowances[owner][spender];
        require(currentAllowance >= substractedValue, "ERC20: decreased allowance below zero");
        unchecked {
            _approve(owner, spender, currentAllowance - substractedValue);
        }
        return true;
    }
 
    function _transfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC20: transfer from the zero address");
        require(to != address(0), "ERC20: transfer to the zero address");
 
        _beforeTokenTransfer(from, to, amount);
 
        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;
 
        emit Transfer(from, to, amount);
 
        _afterTokenTransfer(from, to, amount);
    }
 
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");
 
        _beforeTokenTransfer(address(0), account, amount);
 
        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);
 
        _afterTokenTransfer(address(0), account, amount);
    }
 
    function _burn(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: burn from the zero address");
 
        _beforeTokenTransfer(account, address(0), amount);
 
        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;
        emit Transfer(account, address(0), amount);
        _afterTokenTransfer(account, address(0), amount);
    }
 
    function _approve(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        require(owner != address(0), "ERC20: approve from the zero address");
        require(spender != address(0), "ERC20: approve  to the zero address");
 
        _allowances[owner][spender] = amount;
        emit Approval(owner, spender, amount);
    }
 
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }
 
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
 
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70011332/viewspace-2938834/,如需轉載,請註明出處,否則將追究法律責任。

相關文章