Ethereumのlockdropを自力で実装する、substrateのink!で試す前に


Substrateでlockdropを実装してみようと思ったが・・・

  • 自信がないので、まずはEthereumで試してからにしようと思った
  • solidityで実装出来てから、substrateのink!でやろうと思った

実現すること

  • lockしてくれたEtherと同量のTokenをunlock時に発行する。
  • こんなデザインです。

実装してみた

  • 自力で実装しました。
  • 他のlockdropのソースは一切見ていないです。だからこそ、ダメな部分がありそうです。
pragma solidity ^0.4.23;

import "https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-solidity/v1.6.0/contracts/token/ERC20/StandardToken.sol";
import "https://raw.githubusercontent.com/OpenZeppelin/openzeppelin-solidity/v1.6.0/contracts/ownership/Ownable.sol";

contract SEI is StandardToken,Ownable{
    string public name = "My Token v0.2";
    string public symbol = "My0.2";
    uint public decimals = 18;

    struct Pesonal_data{
        uint256 amount;
        uint term;
        uint256 locktime;
        uint256 tokenAmount;
    }

    uint256 public remaining_token = 0;

    mapping(address=>Pesonal_data) public memolized_data;

    constructor(uint _initial_supply) public {
        totalSupply_ = _initial_supply;
        remaining_token = _initial_supply;
    }

    function lockDrop(uint _term) public payable checkAmount {
        //Pesonal_data data = Pesonal_data(msg.value,_term,blocktime.add(_term days));
        Pesonal_data memory data = Pesonal_data(msg.value,_term,block.timestamp.add(5 minutes),msg.value);
        memolized_data[msg.sender] = data;

    }

    function unlockDrop() public checkTime {
        msg.sender.transfer(memolized_data[msg.sender].amount);
        balances[msg.sender] = memolized_data[msg.sender].tokenAmount;
        remaining_token = remaining_token - memolized_data[msg.sender].tokenAmount;
    }

    modifier checkTime(){
        require(memolized_data[msg.sender].locktime < block.timestamp);
        _;
    }

    modifier checkAmount(){
        require(msg.value > 0);
        _;
    }
}

動作確認

  • Rimixでこのソースをコンパイルして、Metamaskを使って、Ethereumのテストネットにデプロイします。
  • Tokenの初期発行量を決めて、コンストラクトを実行します。
  • 次に、lockdrop関数を動かします。※送信するEhterを忘れずに設定して下さい。
  • Contractが実行されてから、MetamaskのEtherの残高を見ると確かに減っています。
  • ※このソースはテスト用として5分のlockとしています。
  • 5分以内にunlockDropを実行しても動きません。
  • 5分後に実行すると、トークンを獲得出来て、lockしたEhterが戻ってきたことを確認出来ました。

次はSubstrateで

  • やってみます!