Это тестовая сеть, естественно там другие контракты. Я говорю про реальный форк который ты развернешь и он будет 1:1 как mainnet
Читать полностью…Всем привет, мой контракт уже задеплоен в сеть 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",
}
}
},
а вы любите 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