Сьогодні став доступний тестнет WhiteBIT і ось коротка інструкція:
Додаємо тестову мережу
1. Відкриваємо розширення MetaMask;
2. У списку мереж натискаємо «Add network»;
3. На сторінці додавання мережі натисни «Add network manually»;
Дані для заповнення:
- Network name: WB Network;
- New RPC URL: https://rpc-testnet.whitebit.network;
- Chain ID: 2625;
- Currency symbol: WBT;
- Block explorer URL: https://explorer.whitebit.network/testnet;
Наступний крок – це отримання тестових токенів та здійснення транзакцій
- Копіюємо адресу свого гаманця у MetaMask. Переходимо на сторінку Faucet | WB Explorer, вставляємо адресу гаманця у текстове поле, підтверджуємо та натискаємо «Claim» і отримуємо 10 тестових WBT. Отримати знову можна через 24 години.
Токени можна надсилати своїм друзям, які також виконують тестнет або зайти у чат і попросити у когось здійснити декілька тестових транзакцій.
Створюємо смарт контракт
- Переходимо у remix.ethereum
- Переходимо у розділ «Contracts» і створюємо два файли:
- У файлі «IWRC20.sol» прописуємо наступний код:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
interface IWRC20 {
function name() external view returns(string memory);
function symbol() external view returns(string memory);
function decimals() external pure returns(uint);
function totalSupply() external view returns(uint);
function balanceOf(address account) external view returns(uint);
function transfer(address to, uint amount) external;
function allowance(address _owner, address spender) external view returns(uint);
function approve(address spender, uint amount) external;
function transferFrom(address sender, address recipient, uint amount) external;
event Transfer(address indexed from, address indexed to, uint amount);
event Approve(address indexed owner, address indexed to, uint amount);
}
- У файлі «YournameToken.sol» прописуємо наступний код:
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import “./IWRC20.sol”;
contract WRC20 is IWRC20 {
uint totalTokens;
address owner;
mapping(address => uint) balances;
mapping(address => mapping(address => uint)) allowances;
string _name;
string _symbol;
function name() external view returns(string memory) {
return _name;
}
function symbol() external view returns(string memory) {
return _symbol;
}
function decimals() external pure returns(uint) {
return 18;
}
function totalSupply() external view returns(uint) {
return totalTokens;
}
modifier enoughTokens(address _from, uint _amount) {
require(balanceOf(_from) >= _amount, “not enough tokens!”);
_;
}
modifier onlyOwner() {
require(msg.sender == owner, “not an owner!”);
_;
}
constructor(string memory name_, string memory symbol_, uint initialSupply) {
_name = name_;
_symbol = symbol_;
owner = msg.sender;
mint(initialSupply, msg.sender);
}
function balanceOf(address account) public view returns(uint) {
return balances[account];
}
function transfer(address to, uint amount) external enoughTokens(msg.sender, amount) {
_beforeTokenTransfer(msg.sender, to, amount);
balances[msg.sender] -= amount;
balances[to] += amount;
emit Transfer(msg.sender, to, amount);
}
function mint(uint amount, address mint_to) public onlyOwner {
_beforeTokenTransfer(address(0), mint_to, amount);
balances[mint_to] += amount;
totalTokens += amount;
emit Transfer(address(0), mint_to, amount);
}
function burn(address _from, uint amount) public onlyOwner {
_beforeTokenTransfer(_from, address(0), amount);
balances[_from] -= amount;
totalTokens -= amount;
}
function allowance(address _owner, address spender) public view returns(uint) {
return allowances[_owner][spender];
}
function approve(address spender, uint amount) public {
_approve(msg.sender, spender, amount);
}
function _approve(address sender, address spender, uint amount) internal virtual {
allowances[sender][spender] = amount;
emit Approve(sender, spender, amount);
}
function transferFrom(address sender, address recipient, uint amount) public enoughTokens(sender, amount) {
_beforeTokenTransfer(sender, recipient, amount);
require(allowances[sender][msg.sender] >= amount, “check allowance!”);
allowances[sender][msg.sender] -= amount;
balances[sender] -= amount;
balances[recipient] += amount;
emit Transfer(sender, recipient, amount);
}
function _beforeTokenTransfer(
address from,
address to,
uint amount
) internal virtual {}
}
contract TestToken is WRC20 {
constructor(address owner) WRC20(“YOUR NAME”, “YOUR TICKER”, YOUR-TOTAL-SUPPLY*10**18) {}
}
«YOUR NAME» змінюємо на назву токена, наприклад: Nosov Token.
«YOUR TICKER» змінюємо на тікер токену, напрклад: NSV.
«YOUR-TOTAL-SUPPLY» змінюємо на бажану максимальну кількість токенів у оберті, наприклад: 100500.
- Далі обираємо «Injected Provider Metamask» та підключаємося до сайту у мережі WB Network:
Далі робимо так:
Якщо все добре, то відобразиться ось так:
Розгортаємо смарт контракт
- Обираємо наш файл там, де показано стрілочкою;
- Вставляємо адресу нашого гаманця метамаск там, де показано стрілочкою;
Натискаємо «Deploy” та підтверджуємо транзакцію в MetaMask».
Вставляємо свою адресу і підписуємо транзакцію.
Якщо наш контракт успішно розгорнувcя, то буде показано наступне:
Додаємо «Deployed Contracts» сюди:
Готово. Тепер залишилося лишень верифікувати контракт за посиланням
Продовження у чаті телеграм каналу Євреї Знають.