Презентация: SheikhFiDApp.pdf
Видео: 20250720 Алексей Цветков Шейх-fi Singularity x БАШНЯ
Демо: Шейх-Fi DApp в сети Base Sepolia
SheikhFi реализует принципы исламского финансирования (Islamic Finance) в децентрализованной среде. Основные принципы исламского финансирования воплощены в следующих механизмах:
- Инвесторы объединяют свои средства в общий фонд
- Каждый инвестор имеет право голоса при принятии решений об использовании общих средств
- Прибыль и убытки распределяются пропорционально вложенным средствам
- Управляющие (менеджеры) получают средства от инвесторов для реализации инвестиционных проектов
- Управляющие несут ответственность за эффективное использование средств
- Прибыль от проектов распределяется между инвесторами и управляющими по заранее установленным ставкам
- Все инвестиционные сделки должны быть обеспечены реальными активами
- Управляющие должны предоставить описание проекта и требуемую сумму финансирования
- Проекты проходят процедуру одобрения инвесторами перед финансированием
- Для финансирования проекта необходимо получить одобрение от инвесторов, владеющих определённой долей от общего фонда
- Порог одобрения (approval threshold) устанавливается при создании контракта
- Только после достижения порога одобрения средства зачисляются на счёт управляющего — он может получить их через функцию
withdraw()
- При получении дохода от проекта, управляющий переводит средства в контракт
- Владелец контракта запускает распределение прибыли
- Прибыль распределяется между:
- Управляющим (по установленной ставке)
- Инвесторами (по их доле в общем фонде)
- Владельцем контракта (операционные расходы)
- Средства не отправляются автоматически — каждый участник вызывает
withdraw()для получения своей доли. Доля инвестора фиксируется в момент вызоваwithdraw()или явного вызоваsettle()
- Запрет на ростовщичество (риба) - нет гарантии возврата инвестиций с фиксированной надбавкой
- Запрет на спекуляцию (гарар) - все сделки основаны на реальных активах
- Запрет на азартные игры (майсир) - прибыль основана на реальной экономической деятельности
- Прозрачность и справедливость в распределении рисков и прибыли
Консольный многоэкранный интерфейс (sidebar + main column), пять экранов:
| Экран | Содержимое |
|---|---|
| Overview | KPI-полоса (Total / Free / Revenue / Threshold), топ-3 предложения, панель принципов Musharaka/Mudaraba |
| Desk (роль-зависимый) | Council — онбординг партнёров и операторов · Operator — подача предложения и доставка выручки · Partner — депозит, моя позиция, предложения на голосование · Guest — приглашение подключить кошелёк |
| Proposals | Карточки предложений с фильтрами (All / Pending / Secured / Settled), прогресс-бар с отметкой порога одобрения, кнопка Approve |
| Treasury | Deployed / Free / Settled KPI, ссылка на контракт в обозревателе сети, история выручки, панель «Distribute revenue» (только для Council) |
| Members | Партнёры (Musharaka) и операторы (Mudaraba) с аватарами и статистикой |
| Activity | Хронологический фид всех событий контракта (InvestorAdded, ManagerAdded, FundsDeposited, ProposalSubmitted, ProposalFunded, RevenueReceived, RevenueDistributed, Withdrawn) с ссылками на транзакции в обозревателе |
Роль (Council / Operator / Partner / Guest) определяется по адресу подключённого MetaMask через isManager, isInvestor и сравнение с owner(). Адресу owner соответствует Council-роль; одобрение проектов доступно Council и Partner.
Метаданные сети (имя, обозреватель, RPC, native-токен) описаны в webapp/src/networks.js. При подключении кошелька веб-приложение автоматически переключает MetaMask на нужный chainId (или добавляет сеть, если её нет).
Поле deployBlock в webapp/src/abi/deployment.json — номер блока, в котором был размещён контракт. Экран Activity опирается на него, чтобы не сканировать всю историю сети: он перебирает блоки от deployBlock до latest чанками по 800 (лимит публичного RPC eth_getLogs) и декодирует все события контракта одним фильтром по адресу. deploy.js записывает это поле автоматически.
Контракт развёрнут в Base Sepolia (chainId 84532, RPC https://sepolia.base.org, обозреватель https://sepolia.basescan.org). Это рекомендация из ~/papers/cryptosarf/TESTNETS.md: единственный публичный testnet в 2026 году с программным faucet без mainnet-gate — Coinbase Developer Platform.
Текущий деплой:
| Поле | Значение |
|---|---|
| Адрес контракта | 0x3743aCa3d2ED36744703C36c6AfB27B8E3A444Db |
| Владелец | 0xb853A9B863886F421204DcA86CB56dc3416Fc807 (Ali) |
| Approval threshold | 60% |
Архивный деплой в Polygon Amoy (0x408f311ff021e4bba7a3088b6a1c4af1a9c23994) больше не используется веб-приложением, но сохранён в webapp/src/networks.js как известная сеть для обратной совместимости.
nvm use v20.19.0
npm install
npx hardhat compile
npx hardhat test
# локальный демо-режим: hardhat node + посев Bob+Charlie
npx hardhat node # в другом терминале
npx hardhat run deploy.js --network localhost
cd webapp && npm run devВ режиме localhost deploy.js использует второй и третий signer hardhat-а как Bob (инвестор) и Charlie (управляющий) — демо-поток готов сразу.
# 1. Создать кошелёк-деплойер (один раз) и положить ключ в .env
cp .env.example .env
# заполнить DEPLOYER_PRIVATE_KEY и DEPLOYER_ADDRESS
# (можно сгенерировать: node -e 'const {ethers}=require("ethers"); const w=ethers.Wallet.createRandom(); console.log(w.address, w.privateKey)')
# 2. Получить API-ключ CDP (Coinbase Developer Platform) и положить
# CDP_API_KEY_ID / CDP_API_KEY_SECRET / CDP_WALLET_SECRET в .env
# https://portal.cdp.coinbase.com/
# 3. Пополнить деплойер 0.0001 ETH через программный faucet
node scripts/faucet.mjs
# тот же скрипт принимает произвольные адреса и пополняет каждый:
# node scripts/faucet.mjs 0xPartner... 0xOperator...
# 4. Скомпилировать и развернуть контракт
npx hardhat compile
npx hardhat run deploy.js --network baseSepolia
# обновится webapp/src/abi/deployment.json: contractAddress, abi, owner, chainId, network
# 5. Собрать веб-приложение и положить артефакты в корень gh-pages
cd webapp && npm run build && cd - && rm -rf assets && cp -r webapp/dist/* .
# 6. Зафиксировать и запушить ветку gh-pages (стиль коммитов — одно слово)
git add -A && git commit -m "deploy" && git push origin gh-pagesdeploy.js понимает обе ситуации:
- если у сети несколько signer-ов (
hardhat/localhost) — посев Bob + Charlie выполняется автоматически; - если signer один (любой реальный testnet, включая
baseSepolia) — посев пропускается, и онбординг участников делается отдельно через UI (Council desk) или через скрипт ниже.
В реальной сети развёрнутый контракт не знает ни про Bob-а, ни про Charlie-я. Council (владелец) добавляет адреса MetaMask пользователей через метод addInvestor или addManager. Два способа:
Через UI. Импортировать DEPLOYER_PRIVATE_KEY в MetaMask (или подключить уже существующий кошелёк, который является owner-ом контракта), открыть демо, переключиться на Base Sepolia — сайдбар покажет «Council desk», в нём поля «Onboard partner / operator».
Через скрипт. Деплойер остаётся серверным (ключ не уходит в MetaMask). Council вызывает контракт из CLI:
# партнёр (инвестор) с долей в прибыли 50%
node scripts/onboard.mjs investor 0xYour... "Имя" 50
# оператор (управляющий) с долей в выручке 20%
node scripts/onboard.mjs manager 0xYour... "Имя" 20После подтверждения транзакции пользователь открывает демо, подключает свой MetaMask — роль определяется автоматически.
profitRate — это процент:
- для инвестора: доля валовой прибыли, которую он сохраняет до отчисления владельцу;
- для управляющего: доля выручки проекта, которую он удерживает до распределения между инвесторами.
scripts/monitor.mjs — фоновый «tail» состояния контракта. Опрашивает Base Sepolia каждые 5 секунд и пишет дифф к предыдущему снимку: новые предложения, новые голоса, флип secured, revenueReceived / revenuePayed, изменения балансов и withdrawable всех зарегистрированных участников.
node scripts/monitor.mjs # отслеживать всех инвесторов + менеджеров + владельца
node scripts/monitor.mjs 0xExtra... # плюс произвольные адреса по CLIСписок отслеживаемых читается из контракта на старте (getInvestorCount / getManagerCount), так что после онбординга нового участника достаточно перезапустить скрипт — никаких правок кода.
contracts/
SheikhFi.sol смарт-контракт пула + предложений + распределения
BadReceiver.sol тестовый «злой получатель»: контракт-инвестор, который реверт-ит при получении ETH
test/
*.js hardhat-тесты (59 passing)
deploy.js скрипт деплоя (поддерживает localhost и baseSepolia)
hardhat.config.js сети: hardhat / localhost / baseSepolia / amoy; ключ из .env
scripts/
faucet.mjs CDP-faucet → деплойер или указанные адреса на Base Sepolia (0.0001 ETH каждому)
onboard.mjs addInvestor / addManager от имени Council
monitor.mjs фоновый tail контракта: предложения, голоса, ревенью, балансы (5-секундный опрос)
webapp/
src/
ui.jsx примитивы интерфейса + formatEther/parseEther/shortAddr
state.jsx StoreProvider: подключение через ethers, чтение статуса контракта, обёртки мутаций
networks.js метаданные сетей (имя, обозреватель, RPC, native-токен)
main.jsx ReactDOM.createRoot + StoreProvider + App
App.jsx маршрутизатор экранов
components/Sidebar.jsx
screens/
PageHead.jsx заголовок страницы + WithdrawPill
Overview.jsx обзор
Desk.jsx Council / Operator / Partner / Guest
Proposals.jsx список + карточка предложения
Treasury.jsx состояние казны + Distribute (Council)
Members.jsx партнёры + операторы
Activity.jsx фид всех on-chain событий с timestamp и ссылками на tx
hooks/
useWallet.js подключение MetaMask + auto-switch chain
useContractStatus.js
useDetails.js
useRole.js
useEvents.js чтение и декодирование всех событий контракта от deployBlock (чанками по 800)
abi/deployment.json адрес контракта, ABI, owner, chainId, network (пишется deploy.js)
bg.webp фон, бандлируется vite-ом как хешированный asset
assets/, index.html артефакты сборки, опубликованные на gh-pages
.env.example шаблон переменных окружения
.envнаходится в.gitignore. Содержит приватный ключ деплойера и секреты CDP.- Веб-приложение не имеет доступа к
DEPLOYER_PRIVATE_KEY— оно подписывает транзакции через MetaMask пользователя. - Серверные операции (faucet, onboarding) выполняются Node-скриптами в
scripts/, которые читают ключ только из.env. - Для продакшна рекомендуется заменить plaintext-ключ в
.envна encrypted keystore (cast wallet import) или KMS (см.~/papers/cryptosarf/TESTNETS.md §3.7).
- Etherscan-верификация контракта в Base Sepolia: добавить
@nomicfoundation/hardhat-verifyиETHERSCAN_API_KEY(V2-ключ покрывает все сети, включая Base). - Multi-chain UI:
webapp/src/networks.jsуже структурирован под N сетей; добавить селектор сети и хранитьdeployments/<chainId>.jsonотдельно. - Объединённый seed-скрипт для демо: завернуть
faucet.mjs+onboard.mjsв одинseed.mjs, чтобы новый тестовый участник пополнялся и регистрировался одной командой. - Доступ для регулятора: read-only маршрут с
viem.createPublicClientбез wagmi/MetaMask, индексатор событий (Ponder) — паттерн изcryptosarf/TESTNETS.md §2.7.