<<  >> (p.4)
    Author Topic: (гайд) создаем смарт контракт  (Read 424 times)
    serega199528 (OP)
    Newbie
    *
    Offline

    Activity: 14
    Merit: 11


    View Profile
    April 03, 2020, 12:02:52 PM
    Merited by xandry (7), Symmetrick (3), epidemia (1)
     #1

    Добрый день друзья.
    Нашел очеь интересную штуку. оказывается гайд по созданию токена на ERC20 есть, а гайда по созданию(или хотя-бы просто кода) смарт контракта нет.
    По этой причине решил разместить код смарт контракта и его краткое описание здесь.
    И так, будем с вами делать смарт контракт, из которого токены автоматически рассылаются на несколько кошельков.
    Для этого возьмем и скачаем расширение Metamask (скачать в интернете по одной из первых ссылок в поисковике) и сайт https://remix.ethereum.org/
    На сайте https://remix.ethereum.org/ нажимаем на кнопку solidity
    в левом углу у вас будет значок плюсика в кружочке. нажимаем его. У вас появится всплывающее окно, в котором нужно придумать название(на ваш вкус, т.к. это никак не повлияет на сам код и это название будете видеть только вы).
    после того, как вы нажмете кнопку ок, у вас появится пустой лист, в который вы просто копируете этот код:
    Code:
    pragma solidity 0.5.12;

    library SafeMath {
        function mul(uint256 a, uint256 b) internal pure returns (uint256) {
            if(a == 0) return 0;
            uint256 c = a * b;
            require(c a == b, "SafeMath: multiplication overflow");
            return c;
        }

        function div(uint256 a, uint256 b) internal pure returns (uint256) {
            require(b > 0, "SafeMath: division by zero");
            return a b;
        }

        function sub(uint256 a, uint256 b) internal pure returns (uint256) {
            require(b <= a, "SafeMath: subtraction overflow");
            return a - b;
        }

        function add(uint256 a, uint256 b) internal pure returns (uint256) {
            uint256 c = a + b;
            require(c >= a, "SafeMath: addition overflow");
            return c;
        }

        function mod(uint256 a, uint256 b) internal pure returns (uint256) {
            require(b != 0, "SafeMath: modulo by zero");
            return a % b;
        }
    }

    contract Ownable {
        address private _owner;

        event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

        constructor() internal {
            _owner = msg.sender;
            emit OwnershipTransferred(address(0), _owner);
        }

        function owner() public view returns (address) {
            return _owner;
        }

        modifier onlyOwner() {
            require(isOwner(), "Ownable: caller is not the owner");
            _;
        }

        function isOwner() public view returns (bool) {
            return msg.sender == _owner;
        }

        function renounceOwnership() public onlyOwner {
            emit OwnershipTransferred(_owner, address(0));
            _owner = address(0);
        }

        function transferOwnership(address newOwner) public onlyOwner {
            _transferOwnership(newOwner);
        }

        function _transferOwnership(address newOwner) internal {
            require(newOwner != address(0), "Ownable: new owner is the zero address");
            emit OwnershipTransferred(_owner, newOwner);
            _owner = newOwner;
        }
    }

    interface IERC20 {
        event Transfer(address indexed from, address indexed to, uint256 value);
        event Approval(address indexed owner, address indexed spender, uint256 value);

        function transfer(address to, uint256 value) external returns (bool);
        function approve(address spender, uint256 value) external returns (bool);
        function transferFrom(address from, address to, uint256 value) external returns (bool);
        function totalSupply() external view returns (uint256);
        function balanceOf(address who) external view returns (uint256);
        function allowance(address owner, address spender) external view returns (uint256);
    }

    contract IERC223Recipient {
        function tokenFallback(address from, uint value, bytes memory data) public;
    }

    contract Withdrawable is Ownable {
        event WithdrawEther(address indexed to, uint value);

        function withdrawEther(address payable _to, uint _value) onlyOwner public {
            require(_to != address(0));
            require(address(this).balance >= _value);

            address(_to).transfer(_value);

            emit WithdrawEther(_to, _value);
        }

        function withdrawTokensTransfer(IERC20 _token, address _to, uint256 _value) onlyOwner public {
            require(_token.transfer(_to, _value));
        }

        function withdrawTokensTransferFrom(IERC20 _token, address _from, address _to, uint256 _value) onlyOwner public {
            require(_token.transferFrom(_from, _to, _value));
        }

        function withdrawTokensApprove(IERC20 _token, address _spender, uint256 _value) onlyOwner public {
            require(_token.approve(_spender, _value));
        }
    }


    contract Wallet is Ownable {
        struct WalletItem {
            address payable addr;
            uint percent;
        }

        WalletItem[] public wallets;

        function setWallet(uint _index, address payable _addr, uint _percent) onlyOwner external {
            wallets[_index].addr = _addr;
            wallets[_index].percent = _percent;
        }

        function addWallet(address payable _addr, uint _percent) onlyOwner external {
            wallets.push(WalletItem({addr: _addr, percent: _percent}));
        }
    }

    contract PaymentSplitter is Wallet, Withdrawable {
        using SafeMath for uint;

        event Operation(address indexed addr, uint256 eth);

        function() payable external {
            for(uint i = 0; i < wallets.length; i++) {
                if(wallets[i].percent > 0) {
                    address(wallets[i].addr).transfer(msg.value.mul(wallets[i].percent).div(100));
                }
            }

            emit Operation(msg.sender, msg.value);
        }
    }


    как только вставили этот код, у вас слева есть значки в столбик, первый значок- два листа, второй значок - стрелочки вверх - вниз. нажимаем последний.
    после нажатия перед вами появится кнопка Compile чего-то там. нажимаем её.
    Все почти готово Smiley теперь колесом мыши листаем чуть вниз и там будет две кнопки : ABI и Bytecode
    они нам вскоре понадобятся.
    Теперь вам нужно открыть сайт https://www.myetherwallet.com/access-my-wallet
    и там выбрать пункт MEW CX далее поставьте галочку напротив пункта "я принимаю условия" и тыкайте на кнопку "доступ к кошельку".
    Ура. теперь у вас есть эфировский кошелек, с адреса которого мы и будем создавать наш смарт контракт( также с этого адреса мы будем управлять параметрами нашего смарт контракта в будущем). Теперь переходите на вкладку "контракт" (слева в списке) и там тыкайте на кнопку "развернуть контракт".
    теперь снова открываем сайт, на котором мы писали наш код (искренне надеюсь, что вы его не закрывалиSmileySmileySmiley) помните те кнопки "ABI" и "Bytecode" ?
    Отлично. Теперь тыкаем на кнопку ABI, переходим обратно на  вкладку развертывания смарт контракта, и там в поле Интерфейс ABI/JSON ставим курсор и нажимаем CTRL+V.
    Возвращаемся на вкладку с кодом, тыкаем кнопку "Bytecode", теперь обратно и курсор в поле "Байтовый код" и также CTRL+V. Готово.
    Теперь пишем название контракта в соответствующем поле ниже(опять таки, на ваш вкус) и нажимаем на кнопку "подписать транзакцию" . после этого у вас автоматически откроется метамаск с выставленным счетом, который вы должны будете оплатить. (предварительно желательно закинуть эфир на кошелек матамаска для удобства). теперь после того, как нажмете кнопку оплата у вас запустится процесс развертывания смарт контракта. Немного ждем и вуаля. вы становитесь обладателем смарт контракта, управление которым осуществляется прямо на сайте https://etherscan.io/.
    что делает, в частности, этот смарт контракт: вы перечисляете токены на адрес вашего смаарт контракта, после чего забиваете адреса кошельков, на которые должны прийти токены, потом выбираете сколько процентов на какой кошелек вы будете отправлять (ВАЖНО, чтобы количество % в итоге было равно 100%)
    после того, как вы выбрали кошельки( их может быть неограниченное количество) и выбрали % для каждого кошелька, вы вбиваете сумму, которую хотите разостлать этим кошелькам в соответствии тем %, которые вы указали раннее. и жмете кнопку окей. все!
    P.S. как только повышу ранг, обязательно к этому посту прикреплю видео инструкцию Smiley
    вам всего хорошего Smiley
Page 3
Viewing Page: 4