У меня есть смарт-контракт с типом оплаты конструктора. Насколько я понимаю, объявление оплачиваемого конструктора означает, что смарт-контракт может получать платежи. Я опубликовал его через метамаску в тестовой сети Binance smart chain. Но как только я отправлю средства прямо на адрес смарт-контракта. Появляется ошибка цены на газ, даже при самой маленькой сумме транзакции, которую я отправляю, она не работает,
Контракт развернут по адресу: https://testnet.bscscan.com/address/0x75d0b70f597fd23e73c5f193af45023bc65471d7
Ошибка транзакции: https://testnet.bscscan.com/tx/0x1258efe59c2fd2d074858082d3b20c6742256c231ecbfa9c48eee4d81a73153a Код прочности:
// SPDX-License-Identifier: Unlicensed
pragma solidity ^0.8.0;
import "hardhat/console.sol";
contract BurgerShop {
uint256 public cost = 0.2 * (10**18);
event BurgerBought(address indexed _from, uint256 cost);
constructor() payable{
emit BurgerBought(msg.sender, cost);
}
}
Во-вторых, я хочу знать, как лучше всего получать средства напрямую через адрес смарт-контракта. Например, если у меня есть смарт-контракт A с адресом 0xaaa...zzzz, как пользователь может напрямую вносить средства на адрес смарт-контракта из КОШЕЛЬКА?
Когда constructor
использует модификатор payable
, контракт может принимать ETH во время развертывания. т.е. транзакция развертывания может иметь ненулевое значение value
.
Но это не означает, что контракт сможет принимать ETH позже.
Чтобы принимать ETH точно так же, как адрес конечного пользователя, в контракте должна быть реализована специальная функция fallback()
или receive()
.
Документы: https://docs.soliditylang.org/en/v0.8.13/contracts.html#специальные функции
Пример:
pragma solidity ^0.8;
contract MyContract {
receive() external payable {
// executed when the `data` field is empty and `value` is > 0
}
}