Solidity
如何在眾籌期間只允許所有者轉移 ERC20 代幣?
我最近遇到了一個使用臨時錢包的 ICO。代幣是手動發送給投資者的,這意味著不是每個人都同時收到他們的代幣。在每個人都收到他們的代幣之前,他們被鎖定以進行轉移。然而,所有者能夠將代幣轉移給投資者。出於學習目的,我試圖重現這個邏輯,我想知道我的嘗試是否真的可以用於效率和安全性方面。transferFrom 函式具有相同的邏輯。
感謝您的回饋意見。
function transfer(address _to, uint256 _value) public returns (bool success) { require( balances[msg.sender] >= _value && _value > 0 ); if(locked == true){ if(msg.sender == owner){ balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); emit Transfer(msg.sender, _to, _value); return true; }else{ revert(); } }else{ balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); emit Transfer(msg.sender, _to, _value); return true; } }
為避免重複邏輯:
function transfer(address _to, uint256 _value) public returns (bool success) { require(balances[msg.sender] >= _value); require(!locked || (msg.sender == owner)); balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); emit Transfer(msg.sender, _to, _value); return true; }
(我放棄了這樣的要求,
_value >= 0
因為 ERC20 實際上期望 0 的傳輸成功。)
另一種方法是使用白名單和修飾符
mapping (address => bool) allowTransfer; modifier canTransfer(address user) { require(!locked || allowTransfer[user]); _; } function enableTransfer(address user, bool enable) onlyOwner { allowTransfer[user] = enable; }
你必須稍微修改一下傳遞函式
function transfer(address _to, uint256 _value) canTransfer(msg.sender) public returns (bool success) { require(balances[msg.sender] >= _value); balances[msg.sender] = balances[msg.sender].sub(_value); balances[_to] = balances[_to].add(_value); emit Transfer(msg.sender, _to, _value); return true; }
歸功於TokenMarket repos 中 ReleseableToken的實現。