Простой пример  стейблкоина с корректировкой эквивалента собственным оракулом

Bark
12.01.2025 13:59
 

Делаем токен в Эфире, который отличается от обычных тем, что в каждой операции по переводу токена с одного адреса на другой записывалась дополнительная информация получаемая из оракула (например сумму по текущему курсу токена к доллару)

Создание токена с интеграцией оракула требует разработки смарт-контракта на языке Solidity, который использует данные оракула (например, Chainlink) для получения курса токена к доллару и записи этой информации в события транзакции.

Шаги для реализации токена:

Разработка токена:Используйте стандарт ERC-20 в качестве основы, чтобы обеспечить совместимость с экосистемой Ethereum. Для добавления функциональности записи данных от оракула потребуется расширение стандартного контракта.

Интеграция с оракулом:Используйте Chainlink, один из самых популярных и надежных оракулов в Ethereum. Chainlink предоставляет фиды данных, которые могут быть использованы для получения текущего курса токена к доллару.

Изменение логики перевода: Переопределите функцию transfer (и transferFrom, если нужно), чтобы записывать дополнительные данные о стоимости перевода в лог (событие).

Запись информации: Добавьте событие для логирования стоимости перевода. В событии укажите отправителя, получателя, количество токенов и стоимость перевода в долларах.

Пример кода

Вот пример смарт-контракта:

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

import "@chainlink/contracts/src/v0.8/interfaces/AggregatorV3Interface.sol";

contract OracleToken is ERC20 {

AggregatorV3Interface internal priceFeed;

// Событие для записи деталей транзакции

event TransferWithPrice(

address indexed from,

address indexed to,

uint256 value,

uint256 priceInUSD

);

constructor(address _oracleAddress) ERC20("OracleToken", "ORT") {

// Chainlink Oracle для получения курса токена к USD

priceFeed = AggregatorV3Interface(_oracleAddress);

// Можем заложить начальную эмиссию

_mint(msg.sender, 1000000 * 10 ** decimals());

}

// Получение курса из оракула

function getLatestPrice() public view returns (uint256) {

(, int256 price, , , ) = priceFeed.latestRoundData();

// Возвращаем цену в виде uint256

return uint256(price);

}

// Переопределяем transfer

function transfer(address recipient, uint256 amount)

public

override

returns (bool)

{

// Получаем цену токена

uint256 priceInUSD = getLatestPrice();

// Вызываем стандартный метод transfer

bool success = super.transfer(recipient, amount);

// Логируем транзакцию с ценой

if (success) {

emit TransferWithPrice(msg.sender, recipient, amount, priceInUSD);

}

return success;

}

}


Разъяснение:

ERC-20 токен:

Основной функционал (эмиссия, передача) обеспечивается базовым контрактом OpenZeppelin ERC-20.

Оракул:

подключили Chainlink оракул, который предоставляет курс токена к USD. Контракт ожидает адрес оракула (_oracleAddress) при развертывании.

Событие TransferWithPrice:

В событии сохраняется отправитель, получатель, сумма перевода и цена токена в долларах.

Деплой контракта:

Разверните контракт с использованием адреса Chainlink-оракула для вашего токена (например, ETH/USD или другого).

Убедитесь, что адрес оракула соответствует сети (Mainnet, Testnet, etc.).

Ограничения:

Затраты на газ: Интеграция оракула увеличивает стоимость операций. Это может быть существенным для пользователей.

Обновление данных: Chainlink обновляет данные с определенной частотой, поэтому курсы могут быть не идеальными для мгновенных операций.

Тестирование: Необходимо тщательно протестировать контракт, чтобы исключить ошибки и злоупотребления.

Дополнительная информация будет видна через события (events), которые записываются в логах транзакций и доступны всем пользователям через блокчейн-эксплореры, API или прямое взаимодействие с нодой.


Как это работает:

События в Ethereum:

События — это механизмы, встроенные в Ethereum, которые позволяют контракту записывать данные в лог транзакции. Эти данные становятся частью истории транзакций и сохраняются в блокчейне.

Пример события в нашем контракте:

В приведённом ранее примере событие TransferWithPrice логирует следующую информацию:

Адрес отправителя (from).

Адрес получателя (to).

Количество токенов (value).

Стоимость перевода в долларах (priceInUSD).

Где искать данные события:

Блокчейн-эксплореры (Etherscan): На платформе вроде Etherscan вы можете найти транзакцию и увидеть данные логов в разделе Logs.

API Web3: Разработчики могут использовать библиотеки, такие как Web3.js или ethers.js, для получения данных о событиях.

Прямое взаимодействие с нодой: С помощью RPC-запросов можно извлечь данные из логов транзакции.

Как пользователи видят данные?

Блокчейн-эксплореры:

Например, на Etherscan:

Зайдите в нужную транзакцию.

Перейдите в раздел Logs (логи).

Вы увидите сырые данные события, где будут адреса и значения, включая priceInUSD.

Пример на Etherscan:

Event: TransferWithPrice

from: 0xSenderAddress

to: 0xRecipientAddress

value: 100 ORT

priceInUSD: 1.23 USD

Программы и кошельки:

Если ваш токен используется в децентрализованных приложениях (DApps), эти приложения могут обрабатывать события и показывать данные напрямую пользователям.

Кастомные интерфейсы:

можно разработать свой интерфейс, который будет отображать данные о цене из событий. Используя Web3.js или ethers.js, можно настроить обработку событий.


Пример кода для чтения событий (Web3.js):

Если разработчик хочет получить логи событий через Web3.js:


const Web3 = require('web3');

const web3 = new Web3('https://mainnet.infura.io/v3/YOUR_INFURA_KEY');


// ABI события

const abi = [

{

"anonymous": false,

"inputs": [

{ "indexed": true, "name": "from", "type": "address" },

{ "indexed": true, "name": "to", "type": "address" },

{ "indexed": false, "name": "value", "type": "uint256" },

{ "indexed": false, "name": "priceInUSD", "type": "uint256" }

],

"name": "TransferWithPrice",

"type": "event"

}

];


// Адрес контракта

const contractAddress = '0xYourContractAddress';

const contract = new web3.eth.Contract(abi, contractAddress);


// Получение событий

async function getEvents() {

const events = await contract.getPastEvents('TransferWithPrice', {

fromBlock: 0,

toBlock: 'latest',

});

console.log(events);

}


getEvents();


Плюсы использования событий:

Прозрачность: Информация видна всем пользователям, кто имеет доступ к блокчейну.

Оптимизация газа: События записываются в логи, что дешевле, чем хранение данных в самом контракте.

Доступность: Любой пользователь или приложение может легко получить информацию через API.

Минусы:

Невозможность модификации: Данные, записанные в события, неизменны.

Сложность для обычных пользователей: Данные событий могут быть сложны для понимания без подходящего интерфейса.

Если важно, чтобы информация была понятна даже неподготовленным пользователям, можно разработать удобный пользовательский интерфейс (например, через DApp).

0
0
0
Опубликовано:
Комментариев:0
Репостов:0
Просмотров: 0