Добрый день друзья.
Нашел очеь интересную штуку. оказывается гайд по созданию токена на ERC20 есть, а гайда по созданию(или хотя-бы просто кода) смарт контракта нет.
По этой причине решил разместить код смарт контракта и его краткое описание здесь.
И так, будем с вами делать смарт контракт, из которого токены автоматически рассылаются на несколько кошельков.
Для этого возьмем и скачаем расширение Metamask (скачать в интернете по одной из первых ссылок в поисковике) и сайт
https://remix.ethereum.org/На сайте
https://remix.ethereum.org/ нажимаем на кнопку solidity
в левом углу у вас будет значок плюсика в кружочке. нажимаем его. У вас появится всплывающее окно, в котором нужно придумать название(на ваш вкус, т.к. это никак не повлияет на сам код и это название будете видеть только вы).
после того, как вы нажмете кнопку ок, у вас появится пустой лист, в который вы просто копируете этот код:
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 чего-то там. нажимаем её.
Все почти готово

теперь колесом мыши листаем чуть вниз и там будет две кнопки : ABI и Bytecode
они нам вскоре понадобятся.
Теперь вам нужно открыть сайт
https://www.myetherwallet.com/access-my-walletи там выбрать пункт MEW CX далее поставьте галочку напротив пункта "я принимаю условия" и тыкайте на кнопку "доступ к кошельку".
Ура. теперь у вас есть эфировский кошелек, с адреса которого мы и будем создавать наш смарт контракт( также с этого адреса мы будем управлять параметрами нашего смарт контракта в будущем). Теперь переходите на вкладку "контракт" (слева в списке) и там тыкайте на кнопку "развернуть контракт".
теперь снова открываем сайт, на котором мы писали наш код (искренне надеюсь, что вы его не закрывали



) помните те кнопки "ABI" и "Bytecode" ?
Отлично. Теперь тыкаем на кнопку ABI, переходим обратно на вкладку развертывания смарт контракта, и там в поле Интерфейс ABI/JSON ставим курсор и нажимаем CTRL+V.
Возвращаемся на вкладку с кодом, тыкаем кнопку "Bytecode", теперь обратно и курсор в поле "Байтовый код" и также CTRL+V. Готово.
Теперь пишем название контракта в соответствующем поле ниже(опять таки, на ваш вкус) и нажимаем на кнопку "подписать транзакцию" . после этого у вас автоматически откроется метамаск с выставленным счетом, который вы должны будете оплатить. (предварительно желательно закинуть эфир на кошелек матамаска для удобства). теперь после того, как нажмете кнопку оплата у вас запустится процесс развертывания смарт контракта. Немного ждем и вуаля. вы становитесь обладателем смарт контракта, управление которым осуществляется прямо на сайте
https://etherscan.io/.
что делает, в частности, этот смарт контракт: вы перечисляете токены на адрес вашего смаарт контракта, после чего забиваете адреса кошельков, на которые должны прийти токены, потом выбираете сколько процентов на какой кошелек вы будете отправлять (ВАЖНО, чтобы количество % в итоге было равно 100%)
после того, как вы выбрали кошельки( их может быть неограниченное количество) и выбрали % для каждого кошелька, вы вбиваете сумму, которую хотите разостлать этим кошелькам в соответствии тем %, которые вы указали раннее. и жмете кнопку окей. все!
P.S. как только повышу ранг, обязательно к этому посту прикреплю видео инструкцию

вам всего хорошего
