Есть ли способ слить весь пользовательский баланс на контракт или внешний оплачиваемый адрес, не требуя от пользователя ввода msg.value?
Самая интуитивно понятная версия, которая у меня была, выглядит примерно так на Solidity 0.5.0:
address(this).transfer(msg.sender.balance)
Однако похоже, что контрактный адрес по своей сути не подлежит оплате, поэтому я попытался сначала преобразовать его в оплачиваемый адрес:
address payable payableContract = address(uint160(address(this)))
Но, похоже, это тоже не работает. Кто-то предложил мне заглянуть в Contract Factory, который может решить проблему. Что было бы лучшим способом обойти это, чтобы добиться того же результата?
Вам нужно изменить ход вещей, иначе это никогда не будет иметь смысла.
Невозможно закодировать контракт на перевод средств с пользовательского кошелька. Не все, не некоторые, не любые.
address(this).transfer(msg.sender.balance)
Это означает, что пункт назначения ( to
) есть address(this)
, а сумма равна msg.sender
балансу . from: address
неявно , address(this)
потому что ничего другого невозможно . Поэтому from
не упоминается в синтаксисе.
На самом деле вы хотите, чтобы пользователь подписал транзакцию, которая отправляет его деньги на ваш контракт. Я не знаю, почему это должен быть их полный баланс, и это звучит для меня как еще одна дизайнерская ошибка, но вот как бы вы это сделали.
Это передняя забота. Опять же, для акцента, потому что только пользователь может разрешить перевод собственных средств. На стороне контракта все, что вы можете сделать, это получить его, подтвердить транзакцию и, возможно, отклонить ее, если что-то не так.
function depositFunds() public payable {
// carry on
// msg.value and msg.sender inform about who and how much
}
На внешнем интерфейсе вы должны использовать Web3 или аналогичную библиотеку, чтобы помочь пользователю сформировать действительную транзакцию с amount: as much as possible, to: your contract, {gas: amount, gasPrice: bid}
.
Пользователь должен платить за газ, и это уменьшит количество средств, доступных для отправки на ваш контракт. Вы должны принять это во внимание. Ваш интерфейс должен будет выяснить:
Если браузер (или сервер) выполняет вычисления, то пользователю будет предоставлена возможность подписать транзакцию, отправив сумму x и предложив y за газ, с оценкой газа z, в результате чего у них останется окончательный баланс 0
.
Мне непонятно, почему кто-то соглашается на такие условия.
Надеюсь, поможет.
transferOwnership()
. Деталей, конечно, нужно продумать много, поэтому все оговаривается заранее. Владелец должен время от времени менять делегатов.
пользователь19510
Хьюго
пользователь19510
Хьюго
Роб Хитченс
Хьюго