TGViewer
Из Solidity в AI и дальше Из Solidity в AI и дальше @solidityset · 2.49K subscribers
Post #1492 790
- Внедрение временных блокировок: для любых конфиденциальных административных действий, особенно тех, которые связаны с перемещением средств или изменением критических параметров, требуется временная блокировка. Эта задержка дает пользователям и системам мониторинга важную возможность обнаружить потенциально вредоносные транзакции и отреагировать (например, вывести свои средства или поднять тревогу) до того, как действие будет завершено. Это могло бы стать важным смягчающим фактором в случае Zunami, обеспечив защиту от немедленного опустошения счетов.

Вот пересмотренная версия контракта, в которой уязвимость устранена за счет введения внутреннего отслеживания комиссий и ограничения вывода средств администратором только на сумму начисленных комиссий:

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;


contract SecuredVault {
address public admin;
// Maps user addresses to their deposited balances
mapping(address => uint256) public userBalances;
// This variable *only* accounts for fees that the admin can withdraw.
// It's explicitly separated from user balances.
uint256 public totalAccruedFees;


constructor() {
// The deployer of the contract becomes the admin
admin = msg.sender;
}


/// @notice Allows users to deposit Ether into the vault.
/// A 1% fee is applied to the deposit and sent to a fee pool.
function deposit() public payable {
require(msg.value > 0, "Deposit must be greater than zero");


// Calculate 1% fee
uint256 fee = msg.value / 100; // 1% of deposited amount
uint256 amountToDeposit = msg.value - fee;


userBalances[msg.sender] += amountToDeposit; // User's principal
totalAccruedFees += fee; // Accrue the fee for the protocol
}


/// @notice Allows users to withdraw their deposited funds.
/// @param amount The amount to withdraw.
function withdraw(uint256 amount) public {
require(userBalances[msg.sender] >= amount, "Insufficient balance");


userBalances[msg.sender] -= amount;
payable(msg.sender).transfer(amount);
}


/// @notice Admin can only withdraw the total accrued fees.
/// This prevents the rug pull as admin cannot touch user principal.
/// @param amount The amount of fees the admin wishes to withdraw.
function adminWithdrawFees(uint256 amount) public {
require(msg.sender == admin, "Admin control required");
// Crucial check: Ensure admin only withdraws what's available in fees,
// as tracked separately from user principal.
require(totalAccruedFees >= amount, "Insufficient accrued fees for withdrawal");


totalAccruedFees -= amount; // Deduct the withdrawn amount from available fees
payable(admin).transfer(amount); // Transfer only the requested fee amount to admin
}
}


В этой улучшенной версии SecuredVault функция adminWithdrawFees больше не взаимодействует напрямую с балансами пользователей. Средства пользователей защищены, поскольку они хранятся отдельно от переменной totalAccruedFees. Это снижает риск злоупотребления правами администратора в отношении пользователя, устраняя основную проблему, наблюдавшуюся при атаке Zunami.

#rugpull
  • 👍 7
More from @solidityset
  1. Sep 22, 2026Какой язык программирования учить сейчас? На днях в Твиттере увидел небольшой пост о разви…
  2. Sep 18, 2026Интересная модель Jev Буквально пару дней назад в Твиттере многие начали обсуждение новой…
  3. Sep 14, 2026Графы повсюду Если вы также следите за новостями в мире ИИ, то наверняка уже все чаще встр…
  4. Sep 10, 2026GTA6, Cyberleek, блокчейн и безопасность Увидел несколько постов (тут и тут) про Cyberleek…
  5. Sep 9, 2026Работа с чистой энергией Дисклеймер Сегодня ава и название канала, наконец, поменялись. Я…
  6. Sep 9, 2026Channel name was changed to «Из Solidity в AI и дальше»
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →