Если кто-то создает смарт-контракт (и является владельцем этого контракта), может ли этот человек собирать ETH и другие токены, которые отправляются на адрес смарт-контракта?
Это возможно только в том случае, если создатель смарт-контракта сделает это возможным. Если в контракте не реализована какая-либо функция снятия(), то владелец может потерять средства безвозвратно.
Это фича, а не баг. Хотели бы вы, чтобы создатель смарт-контракта дельты эфира выводил весь эфир и токены из контракта по прихоти? Нет.
У смарт-контракта нет механизмов владельца или вывода средств, если только они не были закодированы в контракте. Это дает смарт-контрактам возможность быть ненадежными: можно использовать контракты, не доверяя владельцу, тщательно разбираясь в коде контракта.
Если вы являетесь автором смарт-контракта и хотите иметь возможность выводить токены ERC-20, вам необходимо выполнить 2 шага.
Шаг 1: Добавьте этот интерфейс (подмножество ERC-20) выше вашего контракта.
contract Token {
function transfer(address _to, uint _value) returns (bool success);
function balanceOf(address _owner) constant returns (uint balance);
}
Шаг 2: Вот функция, которую вы можете добавить в свой контракт.
function withdrawTokens(address tokenContract) external onlyOwner {
Token tc = Token(tokenContract);
tc.transfer(owner, tc.balanceOf(this));
}
Это предполагает, что вы правильно написали и настроили себя как owner
. Так как ваш контракт может получать много разных типов токенов, вам необходимо withdrawTokens
от каждого tokenContract
. Если owner
это другой контракт, он также должен иметь withdrawTokens
функцию предотвращения застревания токенов в owner
контракте.
Код проще:
function withdrawEther() external onlyOwner {
owner.transfer(this.balance);
}
Опять же, если owner
это другой контракт, он также должен иметь withdrawEther
функцию предотвращения застревания эфира в owner
контракте.
Еще одна ссылка: Как вывести эфир с контракта
Ричард Хоррокс
эт