Как создать DeFi приложение?

Эта статья посвящена пошаговому подходу к разработке приложения Defi с использованием Solidity
С помощью этого приложения Defi пользователи могут внести токен ERC20 в смарт-контракт, и он будет выпускать и передавать им токены Farm в замен. Когда пользователи захотят вывести свои токены ERC20, они могут сжечь свои токены Farm, а затем токены ERC 20 будут переданы им обратно.

Что такое приложения Defi?

Приложения Defi, созданные в сети Blockchain, предоставляют все финансовые услуги децентрализованным образом без границ, что позволяет каждому получить доступ ко всем финансовым услугам и пользоваться ими. Приложения Defi позволяют кредитовать и заимствовать средства, торговать криптовалютами, спекулировать на движении цен, зарабатывать проценты и обеспечивать страхование рисков. Транзакции, совершаемые через централизованных посредников, теперь выполняются напрямую между участниками при посредничестве смарт-контрактов.

Как создавать приложения Defi?

Приложения Defi, созданные в сети Blockchain, предоставляют все финансовые услуги децентрализованным образом без границ, что позволяет каждому получить доступ ко всем финансовым услугам и пользоваться ими. Приложения Defi позволяют кредитовать и заимствовать средства, торговать криптовалютами, спекулировать на движении цен, зарабатывать проценты и обеспечивать страхование рисков. Транзакции, совершаемые через централизованных посредников, теперь выполняются напрямую между участниками при посредничестве смарт-контрактов.
Для начала работы над разработкой приложения требуется настройка среды. Два инструмента, Truffle и Ganache, требуют установки.

1. Установите Truffle и Ganache

Truffle - это среда тестирования и разработки для создания смарт-контрактов для Ethereum. Он обеспечивает простой способ создания и развертывания смарт-контрактов в блокчейне. Другой инструмент, Ganache, позволяет создавать локальный блокчейн Ethereum для тестирования смарт-контрактов. Ganache моделирует основные сетевые функции и финансирует первые десять аккаунтов с помощью 100 тестовых эфиров. Таким образом, это делает развертывание смарт-контрактов бесплатным и простым. Его можно использовать как настольное приложение или инструмент командной строки. Здесь используется настольное приложение UI.

Создание проекта предполагает выполнение следующих команд:

mkdir YourProjectName

cd YourProjectName

truffle init

Будет создан пустой проект, и его структура будет такой, как показано ниже:

  • контракты: Папка для смарт-контрактов Solidity
  • миграции: папка для сценариев развертывания
  • test: Папка для тестирования наших смарт-контрактов
  • truffle-config.js: файл конфигурации Truffle

2. Создайте токен ERC20

ERC20 - это взаимозаменяемый токен, который используется для ставок на смарт-контракт. Для создания этого токена необходимо установить библиотеку OpenZeppelin. Эта библиотека состоит из стандартов реализации ERC20 и ERC721. Для его установки необходимо выполнить следующую команду:

npm install @openzeppelin/contracts


Используя библиотеку OpenZeppelin, создается токен ERC20 под названием MyToken с реализацией следующего кода:

pragma solidity ^0.6.2;

import @openzeppelin/contracts/token/ERC20/ERC20.sol;

contract MyToken is ERC20 {

constructor() public ERC20(MyToken, MTKN)

{

_mint(msg.sender, 1000000000000000000000000);

}

}

В этом коде:

  • Строка 3 импортирует контракт ERC20.sol из установленной библиотеки.
  • Строка 6 вызывает конструктор ERC20.sol и передает параметры имени и символа как «MyToken» и «MTKN» соответственно.
  • Строка 7 - это чеканка и передача 1 миллиона токенов для учетной записи, которая развертывает смарт-контракт.

Реализация конструктора ERC20.sol, в которой поле «_decimals» имеет значение 18, показана ниже:

string private _name;

string private _symbol;

uint8 private _decimals;

constructor (string memory name_, string memory symbol_) public {

_name = name_;

_symbol = symbol_;

_decimals = 18;

}

3. Разверните токен ERC20

Создайте файл с именем 2_deploy_Tokens.js в папке миграции. Он развернет как токен ERC20, так и смарт-контракт FarmToken. Чтобы развернуть контракт MyToken.sol:
const MyToken = artifacts.require(MyToken)

module.exports = async function(deployer, network, accounts) {

await deployer.deploy(MyToken)

const myToken = await MyToken.deployed()

}

Перед компиляцией смарт-контракта сначала проверьте версию компилятора Solidity.

truffle version

Версия по умолчанию для Solidity - v0.5.16. Здесь токен написан в версии 0.6.2. Если для компиляции контракта выполняются команды, это приведет к ошибке компилятора. Следовательно, необходимо проверить версию. Чтобы указать версию компилятора Solidity, перейдите в файл truffleconfig.js и установите желаемую версию компилятора, как показано ниже:

compilers: {

solc: {

version: 0.6.2,

}

}

Скомпилируйте смарт-контракт с помощью следующей команды:


truffle compile


Теперь, после компиляции, переходите к развертыванию токена. Откройте Ganache и перейдите к опции «Быстрый запуск». Он запустит локальный блокчейн Ethereum. Чтобы развернуть контракт, выполните следующие действия:


truffle migrate


Консоль Truffle проверяет, что 1 миллион токенов MyToken был отправлен на адрес разработчика. Для взаимодействия со смарт-контрактом запустите:


truffle console


Теперь напишите следующую команду:

Для смарт-контракта:

myToken = await MyToken.deployed()


Из Ganache получите массив счетов:

accounts = await web3.eth. getAccounts()


Чтобы проверить баланс:

balance = await myToken.balanceOf(accounts [0])


Чтобы отформатировать баланс с 18 знаков после запятой:

web3.utils.fromWei(balance.toString())

4. Создание смарт-контракта Farm Token Смарт-контракт

FarmToken выполняет три основные функции:

  1. deposit (uint256 _amount): от имени пользователя передать MyToken в смарт-контракт FarmToken. Затем создайте монетный двор и передайте FarmToken пользователю.
  2. remove (uint256 _amount): сжигает FarmToken пользователя и передает MyToken на его адрес.
  3. balance (): получить баланс MyToken на смарт-контракте FarmToken.

Для конструктора FarmToken:

pragma solidity ^0.6.2;

import @openzeppelin/contracts/token/ERC20/IERC20.sol;

import @openzeppelin/contracts/utils/Address.sol;

import @openzeppelin/contracts/token/ERC20/SafeERC20.sol;

import @openzeppelin/contracts/token/ERC20/ERC20.sol

contract FarmToken is ERC20 {

using Address for address;

using SafeMath for uint256;

using SafeERC20 for IERC20;

IERC20 public token;

constructor(address _token)

public

ERC20(FarmToken, FRM)

{

token = IERC20(_token);

}


Строки 3-6 импортируют следующий контракт из OpenZeppelin

IERC20.sol, Address.sol, SafeERC20.sol и ERC20.sol.

Строка 8 представляет наследование FarmToken от контракта ERC20.

Строка 14-19 позволяет конструктору FarmToken получить адрес контракта MyToken в качестве параметра и назначить его общедоступной переменной, называемой токеном.


Реализуйте функцию balance ():

function balance() public view returns (uint256) {
return token.balanceOf(address(this));
}
Для функции deposit ():
function deposit(uint256 _amount) public {
require(_amount > 0, amount cannot be 0);
token.safeTransferFrom(msg.sender, address(this), _amount);
_mint(msg.sender, _amount);
}
Чтобы реализовать функцию remove ():
function withdraw(uint256 _amount) public {
_burn(msg.sender, _amount);
token.safeTransfer(msg.sender, _amount);
}
Теперь разверните смарт-контракт:
const MyToken = artifacts.require(MyToken)
const FarmToken = artifacts.require(FarmToken)
module.exports = async function(deployer, network, accounts) {
await deployer.deploy(MyToken)
const myToken = await MyToken.deployed()
await deployer.deploy(FarmToken, myToken.address)
const farmToken = await FarmToken.deployed()
}

Помните, что при развертывании FarmToken адрес смарт-контракта MyToken передается в качестве параметра. Запустите truffle migrate и truffle compiler, чтобы развернуть контракты. Вместо того, чтобы использовать консоль трюфеля для взаимодействия со смарт-контрактом, создайте сценарий для автоматизации процесса.

Создайте папку «scripts» и добавьте файл «getMyTokenBalance.js».
Он проверит баланс MyToken в смарт-контракте FarmToken.

const MyToken = artifacts.require(MyToken);
const FarmToken = artifacts.require(FarmToken);
module.exports = async function(callback) {
myToken = await MyToken.deployed()
farmToken = await FarmToken.deployed()
balance = await myToken.balanceOf(farmToken.address)
console.log(web3.utils.fromWei(balance.toString()))
callback();
}

Выполните следующую команду CLI, чтобы выполнить этот сценарий:

truffle exec .\scripts\getMyTokenBalance.js

Здесь ожидаемый результат - 0. Теперь MyToken нужно поставить на смарт-контракт.

Пользователь должен сначала одобрить смарт-контракт для передачи MyToken, поскольку функция deposit (uint256 _amount) вызывает функцию safeTransfer ().

Для подтверждения запроса вызовите функцию:
const MyToken = artifacts.require(MyToken);
const FarmToken = artifacts.require(FarmToken);
module.exports = async function(callback) {
const accounts = await new web3.eth.getAccounts();
const myToken = await MyToken.deployed();
const farmToken = await FarmToken.deployed();
const allowanceBefore = await myToken.allowance(accounts[0],
farmToken.address);
console.log(Amount of MyToken FarmToken is allowed to transfer
on our behalf Before: + allowanceBefore.toString());
await myToken.approve(farmToken.address, web3.utils.toWei
(100, ether));
const allowanceAfter = await myToken.allowance(accounts[0],
farmToken.address);
console.log(Amount of MyToken FarmToken is allowed to transfer
on our behalf After: + allowanceAfter.toString());
balanceMyTokenBeforeAccounts0 = await myToken.balanceOf(accounts [0]);
balanceMyTokenBeforeFarmToken = await myToken.balanceOf
(farmToken.address);
console.log(*** My Token ***)
console.log('Balance MyToken Before accounts[0] ' + web3.utils.
fromWei(balanceMyTokenBeforeAccounts0.toString()))
console.log(Balance MyToken Before TokenFarm + web3.utils.
fromWei(balanceMyTokenBeforeFarmToken.toString()))
console.log(*** Farm Token ***)
balanceFarmTokenBeforeAccounts0 = await farmToken.balanceOf<br />(accounts[0]);
balanceFarmTokenBeforeFarmToken = await farmToken.balanceOf
(farmToken.address);
console.log(Balance FarmToken Before accounts[0] + web3.
utils.fromWei(balanceFarmTokenBeforeAccounts0.toString()))
console.log(Balance FarmToken Before TokenFarm + web3.utils.
fromWei(balanceFarmTokenBeforeFarmToken.toString()))
console.log(Call Deposit Function)
await farmToken.deposit(web3.utils.toWei(100, ether));
console.log(*** My Token ***)
balanceMyTokenAfterAccounts0 = await myToken.balanceOf(accounts [0]);
balanceMyTokenAfterFarmToken = await myToken.balanceOf
(farmToken.address);
console.log('Balance MyToken After accounts[0] + web3.utils.
fromWei(balanceMyTokenAfterAccounts0.toString()))
console.log(Balance MyToken After TokenFarm + web3.utils.
fromWei(balanceMyTokenAfterFarmToken.toString()))
console.log(*** Farm Token ***)
balanceFarmTokenAfterAccounts0 = await farmToken.balanceOf
(accounts[0]);
balanceFarmTokenAfterFarmToken = await farmToken.balanceOf
(farmToken.address);
console.log(Balance FarmToken After accounts[0] + web3.utils.
fromWei(balanceFarmTokenAfterAccounts0.toString()))
console.log(Balance FarmToken After TokenFarm + web3.utils.
fromWei(balanceFarmTokenAfterFarmToken.toString()))
callback();
}

Запустите этот сценарий с помощью:
truffle exec .\scripts\transferMyTokenToFarmToken.js

Теперь работа по успешному созданию и развертыванию приложения defi завершена.

Вывод

В статье рассказывается, как настроить среду разработки проекта с Truffle и Ganache и создать приложение Defi, которое может вносить MyTokens, получать FarmTokens и снимать MyTokens путем сжигания FarmTokens.


Если вы заинтересованы и ищете компанию, которая разработала бы приложение Defi для вашего бизнеса, мы готовы сделать это за вас. Запишитесь на консультацию с нашей командой экспертов и обсудите ваши требования.

Поддержите блог, перечислив небольшие чаевые

Если у вас нет кошелька MetaMask, вы можете получить его здесь
Made on
Tilda