Solidity

如何在眾籌期間只允許所有者轉移 ERC20 代幣?

  • July 12, 2018

我最近遇到了一個使用臨時錢包的 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實現。

引用自:https://ethereum.stackexchange.com/questions/42673