# 如何使用eosio-web-ide发布一个eidos代币

最近EIDOS很火，用户只需要向合约帐户eidos转账就可以挖取EIDOS代币，EIDOS甚至直接导致了eos主链上CPU的不足，下面就详细分析下EIDOS的代码，并尝试在eosio-web-ide上面部署下EIDOS的合约。

## EIDOS代码分析

eidos项目代码也是开源的，代码位置为：<https://github.com/enumivo/eidos.git>.仔细看了一下eidos的代码，eidos合约只是在原来eosio.token的代码基础上添加了claim的一个功能，下面就说一下claim实现了什么功能。

### claim的定义

```cpp
[[eosio::on_notify("eosio.token::transfer")]] void claim(name from, name to, eosio::asset quantity, std::string memo);
```

claim的定义是在token.hpp里面，这个函数是由eosio.token合约上面的transfer操作进行触发的一个函数。

### claim的实现

```cpp
if (to != get_self() || from == get_self()) return;

action{ 
    permission_level{get_self(), "active"_n}, 
    "eosio.token"_n, 
    "transfer"_n, 
    std::make_tuple(get_self(), from, quantity, std::string("Refund EOS")) 
}.send();
```

首先看下对转过来代币的处理，这里判断下是有人给我转发代币后，先调用eosio.token的transfer操作把别人的币原样转回去。

```cpp
int elapsed = current_time_point().sec_since_epoch();

   if (elapsed > 1572595200) {
      asset supply = eosio::token::get_supply(get_self(), symbol_code("EIDOS"));    
      int64_t expected = (elapsed - 1572595200) * 25;

      asset balance = eosio::token::get_balance(get_self(), get_self(), symbol_code("EIDOS"));

      if (expected > 1000000000)
         expected = 1000000000;

      asset expected_supply = asset(expected, symbol("EIDOS", 4));
      expected_supply *= 10000;
```

这段带是是获取当前时间的时间戳，并与1572595200进行比较（1572595200时间戳的时间是2019-11-01 16:00:00），也就是说值由2019-11-01 16：00：00 以后才开始空投，在这个时间之前的转帐不会获得空投。增发的规则是当前时间减去1572595200 然后乘以25，也就是根据时间来增发，也就是每秒增发25 EIDOS，代币总数量不能大于1000000000。&#x20;

**如果重新部署一个合约，1572595200可以修改为你想要开始挖矿的时间的时间戳。** **如果想要自己发自己的待币，可以修改代币名称EIDOS，把这个文件里面有EIDOS修改你自己想要的待币名称，如TEST，但是要所有地方都进行修改**。

```cpp
if (supply < expected_supply){
         asset claim = expected_supply-supply;

         action{
            permission_level{get_self(), "active"_n}, 
            get_self(),
            "issue"_n,
            std::make_tuple(get_self(), claim, std::string("Issue EIDOS"))
         }.send();

         balance += claim;

         claim = claim / 5;

         action{
            permission_level{get_self(), "active"_n},
            get_self(),
            "transfer"_n,
            std::make_tuple(get_self(), "eidosoneteam"_n, claim, std::string("Send to EIDOS Team."))
         }.send();              

         balance -= claim;

      }
```

如果当前的代币供应量小于当前时间应该有的供应量，则进行增发(issue)操作,并把此次增发的1/5发送给帐户eidosoneteam。 **如果想要把1/5发给自己的帐户，需要把eidosoneteam修改成自己团队帐户名。**

```cpp
if (balance > asset(0, symbol("EIDOS", 4))) {
     if (balance <= asset(10000, symbol("EIDOS", 4)))
        balance = asset(1, symbol("EIDOS", 4));
     else   
        balance /= 10000;

     action{
        permission_level{get_self(), "active"_n},
        get_self(),
        "transfer"_n,
        std::make_tuple(get_self(), from, balance, std::string("Airdrop EIDOS"))
     }.send();              
  }
```

然后把总供应量的万分之一（不够1 EIDOS的按1 EIDOS来算）的EIDOS发送给用&#x6237;**。**

## eosio-web-ide

EOSIO Quickstart Web IDE是一种一键式基于Web的IDE，可在浏览器中运行，旨在从根本上简化开发人员的体验。 eosio-web-ide的代码地址是：<https://github.com/EOSIO/eosio-web-ide.git>,我们可以先fork到自己的目录下面然后进行操作。

### 启动eosio-web-ide

只需要在我们fork以后的代码目录上面添加gitpod.io/#/如（<https://gitpod.io/#/github.com/>\*\*\*/eosio-web-ide），便可以自动在浏览器上面启动一个eosio的测试网。

### 下载eidos合约和eosio.token合约

启动测试网以后，上面是集成VSCODE的代码编辑部分，下面的terminal显示了测试网的出块过程，我们这里这里先把eidos和eosio.token的合约代码下载下来。

* 通过Terminal->New Terminal 重新打开一个Terminal，然后cd contract/ 进入contract目录

```cpp
cd contract/
```

* 通过git clone <https://github.com/enumivo/eidos.git> 下载eidos的代码，并编译代码

```cpp
cd /workspace/eosio-web-ide/contract                   
git clone https://github.com/enumivo/eidos.git 
cd eidos/ 
mkdir token 
eosio-cpp token.cpp -o token/token.wasm
```

* 通过git clone <https://github.com/EOSIO/eosio.contracts.git> 下载eosio.contracts的代码并编译

```cpp
cd /workspace/eosio-web-ide/contract                   
git clone https://github.com/EOSIO/eosio.contracts.git 
cd eosio.contracts/ 
./build.sh
```

通过上面操作，我们已经下载并编译了eidos和eosio.contract的合约代码，下面就是在链上的操作。

### 链上加载对应的合约

* 创建帐户 eidos,eosio.token,测试帐户eosforce,eidos合约上面的开发团队帐户eidosoneteam

```cpp
cleos create account eosio eosio.token EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV 
cleos create account eosio eidos EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV 
cleos create account eosio eosforce EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV 
cleos create account eosio eidosoneteam EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV
```

* 加载对应的合约，加载eidos合约

```cpp
cd /workspace/eosio-web-ide/contract/eidos 
cleos set contract eidos ./token/
```

* 加载eosio.token合约

```cpp
cd /workspace/eosio-web-ide/contract/eosio.contracts/build/contracts 
cleos set contract eosio.token ./eosio.token/
```

### eosio.token 合约上面创建并增发TEST代币

```cpp
cleos push action eosio.token create '["eosforce","100000000.0000 TEST"]' -p eosio.token cleos push action eosio.token issue '["eosforce","100.0000 TEST","test"]' -p eosforce
```

### eidos合约创建EIDOS代币，增发代币并将eidos帐户权限赋予eidos合约

```cpp
cleos push action eidos create '["eidos","10000000000.0000 EIDOS"]' -p eidos 
cleos push action eidos issue '["eidos","1.0000 EIDOS","test"]' -p eidos 
cleos set account permission eidos active '{ "threshold": 1, "keys": [ {"key":"EOS6MRyAjQq8ud7hVNYcfnVPJqcVpscN5So8BhtHuGYqET5GDW5CV","weight":1} ], "accounts":[ { "permission": { "actor": "eidos", "permission": "eosio.code" }, "weight": 1 } ] }' owner
```

### 使用eosforce帐户通过eosio.token合约向eidos帐户转帐

```cpp
cleos push action eosio.token transfer '["eosforce","eidos","0.0001 TEST","get eidos"]' -p eosforce
```

### 查看eosforce在eosio.token和eidos上面的代币

```cpp
cleos get table eosio.token eosforce accounts
{
  "rows": [{
      "balance": "100.0000 TEST"
    }
  ],
  "more": false
}
```

```cpp
cleos get table eidos eosforce accounts
{
  "rows": [{
      "balance": "3108.4440 EIDOS"
    }
  ],
  "more": false
}
```

## 结束语

本文简单介绍了eidos合约的内容，以及如何通过eosio-web-ide部署eidos合约以及通过转帐在eidos合约上面进行挖矿的相关操作。eosio-web-ide是和方便的测试合约的工具，后续会对合约开发者有很大的帮助，EIDOS合约作为目前比较火的EOS链上的合约，有兴趣的可以读一下源码并在测试网上部署一下。
