CFITTOKEN — это усовершенствованный смарт-контракт на платформе Ethereum, реализующий стандарт ERC-20 с дополнительными возможностями стейкинга и механизмами автоматического начисления вознаграждений при блокировке токенов. Проект ориентирован на пользователей, стремящихся к пассивному доходу через долгосрочные инвестиции и участие в стейкинге.
- ERC-20 токен под названием CFITTOKEN с символом CFIT 🪙
- Стейкинг токенов на период от 1 дня до 365 дней с автоматическим начислением вознаграждений 📅
- Механизмы награждения, основанные на продолжительности блокировки и количестве стейканных токенов 💎
- Полный функционал для перевода токенов между аккаунтами и вывода средств после завершения периода блокировки 🔄
- ERC-20 стандартизация: обеспечивает совместимость токена с экосистемой Ethereum и поддерживает базовые операции, такие как переводы, проверка баланса и управление одобрениями 🔗
- Механизм стейкинга: позволяет пользователям блокировать свои токены на заданный срок и получать вознаграждения пропорционально времени и объему блокировки 📈
- Безопасные транзакции: все операции защищены проверками и механизмами предотвращения ошибок, обеспечивая надежность и безопасность 🔒
- Оптимизация газовых затрат: контракт спроектирован для минимизации расходов на газ, что делает его использование экономически выгодным 💰
- Solidity 0.8.28: современный язык программирования для разработки смарт-контрактов на платформе Ethereum 💻
- Hardhat: мощный фреймворк для разработки, тестирования и деплоя смарт-контрактов в локальной Ethereum-сети 🛠️
- OpenZeppelin: проверенная временем библиотека стандартных контрактов, включая ERC-20 и Ownable, обеспечивающая безопасность и стандартизацию 🏰
- Ethers.js: лёгкая и функциональная JavaScript библиотека для взаимодействия с Ethereum 🌐
- @openzeppelin/contracts (v4.9.3): предоставляет стандартизированные реализации ERC-20 и механизмов управления доступом через Ownable 📦
- ethers (v6.13.4): используется для взаимодействия с контрактами на блокчейне Ethereum ⚡
- hardhat (v2.22.17): служит основным инструментом для разработки, тестирования и деплоя смарт-контрактов 🔨
- Hardhat Network: локальная сеть для тестирования и разработки, обеспечивающая быстрый цикл разработки 🌐
- Ethereum Mainnet: основная сеть Ethereum для развертывания контракта после успешного тестирования 🌍
- contracts/CFITTOKEN.sol: основной смарт-контракт, реализующий токен и логику стейкинга 📝
- scripts/deploy.js: скрипт для деплоя контракта в выбранную сеть 🚀
- scripts/interact.js: скрипт для взаимодействия с контрактом — переводы, стейкинг и вывод средств 🔄
- test/CFITTOKEN.js: набор тестов для проверки корректности работы контракта 🧪
- hardhat.config.js: конфигурационный файл Hardhat для настройки Solidity и сетевых параметров ⚙️
- package.json: файл зависимостей проекта 📋
Контракт CFITTOKEN наследует стандарты ERC-20 и Ownable из библиотеки OpenZeppelin, обеспечивая базовую функциональность токена и управление доступом.
Stake: структура, представляющая отдельный стейк пользователя, содержащая:
- amount: количество заблокированных токенов 💰
- timestamp: время создания стейка ⏰
- lockDuration: продолжительность блокировки в секундах 🔒
- Позволяет пользователям переводить токены другим адресам 🔄
- Использует внутреннюю функцию transfer стандарта ERC-20 💫
- Позволяет пользователям блокировать свои токены на определённый срок 🔒
- Проверяет достаточность баланса пользователя и корректность срока блокировки (от 1 до 365 дней) ✅
- Переводит токены в контракт и сохраняет информацию о стейке 📝
- Генерирует событие Staked 🎉
- Позволяет пользователям выводить свои стейки после завершения срока блокировки 💸
- Проверяет валидность индекса стейка и завершение срока блокировки ✅
- Рассчитывает вознаграждение по формуле: reward = (amount _ 10 _ lockDuration) / (365 days * 100) 🧮
- Переводит обратно пользователю сумму стейка и вознаграждение 💰
- Генерирует событие Withdrawn 🎉
- Удаляет стейк из массива пользователя для оптимизации хранения данных 🗑️
- Возвращает количество стейков у указанного пользователя 📊
- Возвращает детали конкретного стейка пользователя по индексу 📋
- Использование проверок require для обеспечения корректности операций и предотвращения ошибок 🛡️
- Наследование от Ownable позволяет ограничить доступ к определённым функциям владельцем контракта 🔐
- Поддержка множественных стейков для одного пользователя 📈
- Эффективное управление стейками через замену удаляемого стейка последним элементом массива, что минимизирует затраты на газ ⚡
- Минимизация операций хранения и обновления данных для снижения расходов на газ 💰
- Использование эффективных структур данных и алгоритмов для обработки стейков 🔧
Для начала работы с проектом выполните команду для установки всех зависимостей:
npm install
Для деплоя и тестирования контракта используется локальная сеть, запущенная через Hardhat Network. Для старта локальной сети выполните:
npx hardhat node
После этого локальная сеть будет доступна на порту 8545.
Для деплоя контракта на локальную сеть используйте следующий скрипт:
npx hardhat run scripts/deploy.js --network localhost
Скрипт deploy.js отвечает за деплой контракта CFITTOKEN. Он выполняет следующие шаги:
- Инициализация:
- Получает аккаунт деплойера 👤
- Выводит адрес деплойера 📝
- Развертывание контракта:
- Создаёт фабрику контракта CFITTOKEN 🏭
- Устанавливает начальное предложение токенов (initialSupply), например, 2000 CFI 💰
- Деплоит контракт и ожидает завершения транзакции ✅
- Сохранение адреса контракта:
- После успешного деплоя сохраняет адрес контракта в файл contract-address.json для последующего взаимодействия 💾
- Обработка ошибок:
- В случае ошибки выводит сообщение и завершает процесс ❌
Пример параметров:
- initialSupply: 2000 CFI (с учётом 18 десятичных знаков) 💎
Для запуска тестов и проверки корректности работы функций выполните:
npx hardhat test
Тесты написаны с использованием библиотеки Chai и фреймворка Mocha для обеспечения корректности работы функций контракта.
- Проверка владельца контракта: Убедиться, что контракт инициализируется с правильным владельцем
- Проверка начального баланса: Убедиться, что владелец получает правильное количество начальных токенов
- Перевод токенов между аккаунтами: Проверить, что токены корректно переводятся от одного пользователя к другому
- Отказ при недостаточном балансе: Убедиться, что транзакции отклоняются, если у отправителя недостаточно токенов
- Возможность стейкинга токенов: Проверить, что пользователи могут успешно стейкать токены при соблюдении условий
- Расчёт наград: Убедиться, что вознаграждения рассчитываются корректно при выводе стейка
- Невозможность вывода до завершения блокировки: Проверить, что попытки вывода стейка до окончания срока блокировки отклоняются
- Корректность работы с несколькими стейками: Убедиться, что контракт корректно обрабатывает несколько стейков от одного пользователя
- Обработка пустых стейков: Проверить, что попытки вывода несуществующих стейков корректно обрабатываются
- Вывод до завершения блокировки: Проверить, что контракт отклоняет вывод стейка до окончания срока блокировки
- Неправильный индекс стейка: Убедиться, что контракт корректно обрабатывает попытки вывода стейков по несуществующим индексам
it("Should allow users to stake tokens", async function () {
await cfiToken.transfer(addr1.address, ethers.parseUnits("100", 18));
await cfiToken.connect(addr1).stake(ethers.parseUnits("50", 18), 30 * 24 * 60 * 60);
const stakeCount = await cfiToken.getStakeCount(addr1.address);
expect(stakeCount).to.equal(1);
const stake = await cfiToken.getStake(addr1.address, 0);
expect(stake.amount).to.equal(ethers.parseUnits("50", 18));
expect(stake.lockDuration).to.equal(30 * 24 * 60 * 60);
});С помощью interact.js вы можете выполнять различные действия с контрактом:
- Переводить токены между пользователями 🔄
- Стейкать токены и проверять баланс стейков 📊
- Выводить свои токены и получать вознаграждения после окончания срока блокировки 💰
Для взаимодействия выполните следующий скрипт:
node scripts/interact.js
Скрипт interact.js обеспечивает взаимодействие с развернутым контрактом CFITTOKEN. Основные шаги скрипта:
Инициализация:
- Получает аккаунты (owner, addr1, addr2) 👥
- Подключается к контракту по сохранённому адресу из contract-address.json 🔗
Проверка балансов:
- Выводит текущие балансы владельца и других аккаунтов 💰
Переводы токенов:
- Переводит 100 CFI от владельца к addr1 💸
- Переводит 1000 CFI от владельца к контракту для покрытия наград 🎁
Стейкинг:
- addr1 стейкает 50 CFI на 30 дней 📈
- Выводит информацию о стейке 📋
Увеличение времени:
- Имитирует прохождение времени на 30 дней для тестирования вывода стейка ⏳
Вывод стейка:
- addr1 выводит стейк и получает вознаграждение 💎
- Проверяет обновлённые балансы 📊
Обработка ошибок:
- Выводит ошибки при возникновении исключений ❌
Перевод токенов:
- Используйте функцию transferTokens для отправки токенов другому адресу
- Пример: await cfiToken.transferTokens("адрес_получателя", количество);
Стейкинг токенов:
- Используйте функцию stake для блокировки токенов на определённый срок
- Пример: await cfiToken.stake(количество, длительностьблокировкив_секундах);
Вывод стейка:
- Используйте функцию withdrawStake для вывода заблокированных токенов и вознаграждений после окончания срока блокировки
- Пример: await cfiToken.withdrawStake(индекс_стейка);
Если в будущем планируется разработка пользовательского интерфейса, пользователи смогут взаимодействовать с контрактом через веб-приложение, предоставляющее удобные формы для переводов, стейкинга и вывода средств.
Используя ethers.js или другие библиотеки, пользователи могут писать собственные скрипты для взаимодействия с контрактом, интегрируя его в свои приложения или автоматизируя процессы.
Проект CFITTOKEN представляет собой надёжный и функциональный смарт-контракт, объединяющий стандарт ERC-20 и продвинутую систему стейкинга. Контракт предоставляет пользователям возможность не только управлять токенами, но и получать вознаграждения за их долгосрочное хранение, стимулируя устойчивые и выгодные инвестиции.
Проект тщательно протестирован, деплоится и используется на платформе Ethereum с помощью Hardhat и OpenZeppelin, обеспечивая безопасность и эффективность.
- Безопасность: Надежные проверки и стандартизированные контракты обеспечивают защиту средств пользователей
- Гибкость: Возможность выбора срока стейкинга и соответствующих вознаграждений
- Прозрачность: Все операции и состояния стейков доступны для проверки, обеспечивая доверие пользователей
- Экономическая эффективность: Оптимизация газовых затрат делает использование контракта доступным и выгодным
🚀 Удачи в стейкинге! Пусть ваши инвестиции растут вместе с CFITTOKEN! 🌱💰
Если у вас возникли вопросы или предложения, пожалуйста, свяжитесь с нами через GitHub Issues или напишите на [email protected].
Этот проект лицензирован под лицензией MIT. См. LICENSE для подробностей.
Спасибо за использование CFITTOKEN! Мы постоянно работаем над улучшением нашего продукта и ценим вашу поддержку. 🙏✨