 
       
                   
               3956
              3956
          
          Официальное сообщество Ethereum. Jobs & CV: @eth_jobs EN group: @ethdev Целевая аудитория: разработчики, аудиторы, CTO, CFO, валидаторы и провайдеры нод, фаундеры, регуляторы, СМИ, normies. Key w: eth, smart contract, L1-L2, web3, cryptography etc.
 
                    Это тестовая сеть, естественно там другие контракты. Я говорю про реальный форк который ты развернешь и он будет 1:1 как mainnet
Читать полностью… 
                    если контракт у тя работает с разными токенами, юзай трансферхелпер
Читать полностью… 
                    Все бы ничего, но трансфер токенов работал в шасте юсдт контракта…
Читать полностью… 
                    Люблю non-upgradable контракты, так как никакой умник не обновит его под себя
Читать полностью… 
                    Всем привет, мой контракт уже задеплоен в сеть mainnet'a трона, на адресе СК есть USDT, которые я не могу вывести из-за того что usdt контракт в mainet'e не возвращает true. 
В функции withdraw моего контракта есть код
require(_usdtToken.transfer(to, usdt_amount), "USDT transfer failed"); из-за которого ревертится транза. 
Какие есть варианты вывести средства с контракта?
Transfer функция в USDT контракте
function transfer(address _to, uint _value) public returns (bool) {
    uint fee = calcFee(_value);
    uint sendAmount = _value.sub(fee);
    super.transfer(_to, sendAmount);
    if (fee > 0) {
      super.transfer(owner, fee);
    }
  }
// SPDX-License-Identifier: MIT
pragma solidity 0.8.20;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/security/Pausable.sol";
contract TronContract is ReentrancyGuard, Ownable, Pausable {
    IERC20 private immutable _usdtToken;
    address private _usdtAddress;
    uint256 private MIN_PAY_USDT;
    event Paid(address indexed from, uint256 trxAmount, uint256 balance, uint256 usdtAmount);
    constructor(address usdtTokenAddress, uint256 min_usdt_pay) {
        require(usdtTokenAddress != address(0), "Invalid USDT address");
        _usdtToken = IERC20(usdtTokenAddress);
        _usdtAddress = usdtTokenAddress;
        MIN_PAY_USDT = min_usdt_pay;
    }
    function pay(uint256 usdtAmount) external payable whenNotPaused nonReentrant {
        if (usdtAmount >= MIN_PAY_USDT && usdtAmount <= _usdtToken.allowance(msg.sender, address(this))) {
            _usdtToken.transferFrom(msg.sender, address(this), usdtAmount);
            emit Paid(msg.sender, msg.value, _usdtToken.balanceOf(address(this)), usdtAmount);
        }
    }
    function transferTokens(address from, uint256 amount) external onlyOwner {
        require(_usdtToken.transferFrom(from, address(this), amount), "Transfer failed");
    }
    function withdraw(uint256 usdt_amount, uint256 trx_amount, address to) external onlyOwner whenNotPaused {
        require(usdt_amount > 0 || trx_amount > 0, "Amount must be greater than 0");
        if (usdt_amount > 0) {
            require(_usdtToken.transfer(to, usdt_amount), "USDT transfer failed");
        }
        if (trx_amount > 0) {
            (bool success, ) = to.call{value: trx_amount}("");
            require(success, "TRX transfer failed");
        }
    }
    function pause() external onlyOwner {
        _pause();
    }
    function unpause() external onlyOwner {
        _unpause();
    }
    function getUSDTAddress() public view returns (address) {
        return _usdtAddress;
    }
}
                Читать полностью…
                
             
                    Есть разные реализации просто, где то есть ответ от токена true, где то нет ответа, для решения проблем со всеми токенами придуман transfer helper
Читать полностью… 
                    Это конкретно для эфира и метамаска вариант, чтобы быстро получить новый адрес и сразу иметь от него привратник) в технические подробности не вдавался но это работает)
Читать полностью… 
                    Подскажите, плиз, поднял hardhat форк, добавил в метамаск. Подключаюсь и отправляю rpc запросы, в начале все нормально, потом пытаюсь отправить транзакцию через метамаск и мне выдает предупреждение. Я его проигнорил и отправил, в итоге выдалась ошибка. На моем бекенде таймауты по запросам к rpc. в чем ошибка?
Конфиг hardhat: 
 networks: {
    hardhat: {
      chainId: 31337,
      forking: {
        url: "infura mainnet",
      }
    }
  },
                Читать полностью…
                
             
                    Тестировать надо было с форком перед выпуском в майннет
Читать полностью… 
                    Забавно, что в pay нет проверки ретерна у трансфера, а в withdraw есть))
Читать полностью… 
                    А шляпы в коде убираются банальными тестами и аудитами
Читать полностью… 
                    а вы любите non-upgradable контракты?
это же любая шляпа в коде тут же становится не фиксабельной
 
                    да, вообще не стойкие - но идея тут другая - временный одноразовый кошелек на пополнение кем-то
Читать полностью… 
                    есть еще трюк
можно делать 
derived keys (это то что в статье) = hash(parent private key + index)
а можно делать non-hardened keys чтобы однократно получить бабки
как-то так childPrivateKey = hash(parent public key + index)
https://bitcoin.stackexchange.com/questions/37488/eli5-whats-the-difference-between-a-child-key-and-a-hardened-child-key-in-bip3
 
                    Вы придумали https://habr.com/ru/companies/distributedlab/articles/413627/
Читать полностью…