Wallet-Transfer

如何將新代幣轉讓給所有擁有舊代幣的人?

  • August 9, 2020

我是舊智能合約的所有者:

https://etherscan.io/token/0x73de68dxxxxxxx

現在我創建了一個新的智能合約:

https://etherscan.io/address/0xd4c04exxxxxxx

如何將新代幣轉讓給所有擁有舊代幣的人?

願大家幫助我。

  1. 通知您的代幣持有者您將在哪個區塊拍攝快照。
  2. 在該處刮取 eth 區塊鏈,阻止您的所有代幣轉移,以建立一個本地地址及其數量的數據庫。
  3. 執行本地測試以確保您的地址與餘額的總和等於您的totalSupply
  4. 執行像https://rstormsf.github.io/multisender/#/這樣的工具來分發你的新令牌
  5. 通知所有交易所將您的舊代幣合約下架,或者如果您可以控制它,則禁用轉移或銷毀所有代幣。

您可以使用@rstormsf 的方法,也可以使用智能合約。

// -------------------------------------------------------------------------            ---
// ERC Token Standard #20 Interface
// https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md
// ----------------------------------------------------------------------------
contract ERC20Interface {
   function totalSupply() public constant returns (uint);
   function balanceOf(address tokenOwner) public constant returns (uint     balance);
   function allowance(address tokenOwner, address spender) public constant     returns (uint remaining);
   function transfer(address to, uint tokens) public returns (bool success);
   function approve(address spender, uint tokens) public returns (bool success);
   function transferFrom(address from, address to, uint tokens) public returns (bool success);

   event Transfer(address indexed from, address indexed to, uint tokens);
   event Approval(address indexed tokenOwner, address indexed spender, uint tokens);
}

// You can get a standard ownable contract here: https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/ownership/Ownable.sol
contract ClaimTokens is Ownable {
   ERC20Interface old;
   ERC20Interface new;

   mapping (address -> bool) hasRegistered;
   address[] registeredParticipants;

   function ClaimTokens() Ownable() {
       old = new ERC20Interface(0x73de68d64b5d9b2108fdf76a394f76e16a88ceb3);
       new = new ERC20Interface(0xd4c04e5099f62632a0861ec68fd9f58e6cd0cb74);
   }

   function registerForAirdrop() public {
       require(!hasRegistered[msg.sender])
       hasRegistered[msg.sender] = true;
       registeredParticipants.push(msg.sender)
   }

   function airdrop() onlyOwner {
       for(uint i = 0; i < registeredParticipants.length; i++) {
           uint balance = old.balanceOf(registedParticipants[i])
           new.transfer(registeredParticipants[i], balance)
       }
       // Add burn here?
   }
}

這將創建舊令牌和新令牌的介面,並創建地址是否已註冊和已註冊地址數組的映射(具有兩個資料結構可節省計算時間和氣體)。

它是在 ClaimTokens() 下啟動的,它只是將介面設置為正確的合約。

然後,使用者可以通過呼叫 registerForAirdrop() 來註冊空投。

然後,當空投發生時(僅由所有者呼叫 airdrop()),它會遍歷所有註冊的參與者,檢查他們的餘額,並轉移新的代幣。如果新的 ERC20 代幣具有 burn() 函式,那麼您應該讓智能合約燒掉所有未在空投中註冊的代幣。

這種方法的好處是它更加去中心化並且不需要你花費那麼多的gas

希望這可以幫助!

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