REX 之赚取收益篇( 一 )

January 7, 2020 · View on GitHub

支持我们,请投票给 rex.m

REX 赚取收益需 4 步:

  1. deposit
  2. buyrex or unstaketorex
  3. sellrex
  4. withdraw

1.deposit ( 存入基金 )

cleos -u http://mainnet.meet.one push action eosio deposit '["OWNER", "AMOUNT"]' -p OWNER@active
  • OWNER: 存入的账户
  • AMOUNT: 存入的( EOS )数量

deposit 会把 amount 数量的 EOS 存入 REX 基金(也就是主网的 eosio.rex 账户,所有与 REX 相关的收益和支出都会被添加到基金中或者从中取出)。首次存入的用户会在 rexfund 表中添加一条类似实例 1 的数据,非首次用户则会将 balance 数量加上 amount。

查询用户名为 OWENR 的存入数据:

cleos -u http://mainnet.meet.one get table eosio eosio rexfund -L OWNER -U OWNER
实例 1:

{
  "rows": [{
      "version": 0,             // 版本号
      "owner": "OWNER",         // 存入的账户
      "balance": "0.0000 EOS"   // 存储的数量
    }
  ],
  "more": true
}

2. buyrex or unstaketorex( 购买 REX )

通过 deposit 存入了 EOS,同时还必须投票给至少 21 个节点或者把投票权交给代理,才可以购买 REX 代币(也就是所谓的出租 EOS)赚取收益,。

1)buyrex (用 rexfund 资金中购买 REX)

cleos -u http://mainnet.meet.one push action eosio buyrex '["FROM", "AMOUNT"]' -p FROM@active
  • FROM: 购买 REX 的账户
  • AMOUNT: 购买数量(EOS)

2) unstaketorex (用抵押的 CPU 和 NET 购买 REX)

通过 unstaketorex 购买 REX 会解质押 CPU 和 NET 资源,在购买前计算好资源,以免 CPU 爆了

cleos -u http://mainnet.meet.one push action eosio unstaketorex '["OWNER", "RECEIVER","FROM_NET", "FROM_CPU"]' -p OWNER@active
  • OWNER: 购买 REX 的账户
  • RECEIVER: 抵押的接收账户
  • FROM_NET: 从抵押给 RECEIVER 的 net 中解质押 FROM_NET 数量的 EOS 购买 REX
  • FROM_CPU: 从抵押给 RECEIVER 的 CPU 中解质押 FROM_CPU 数量的 EOS 购买 REX

那么 1 个 EOS 可以购买多少的 REX 呢? 首先得获取实例 2 中的 rexpool 表数据:

cleos -u http://mainnet.meet.one get table eosio eosio rexpool
实例 2:

{
  "rows": [{
      "version": 0,                               // 版本号
      "total_lent": "81810435.8073 EOS",          // 已借出 EOS 的数量
      "total_unlent": "16386108.0605 EOS",        // 可以借出的 EOS 的数量
      "total_rent": "104111.1368 EOS",            // 借出 EOS 的收益
      "total_lendable": "98196543.8678 EOS",      // total_lent + total_unlent 的和
      "total_rex": "978991255932.6474 REX",       // 已售出的 REX 数量
      "namebid_proceeds": "0.0000 EOS",           
      "loan_num": 225095                          // 已借出的次数
    }
  ],
  "more": false
}

然后计算 total_rex / total_lendables = 9969.7119 REX 得到的值即是 1 EOS 大概可以购买的 REX 数量。 假如您是在 UTC 时间( 非北京时间 ) 2019-10-08T00:00:00.000 ~ 2019-10-09T00:00:00.000 之间的任意时间、任意多次买入 REX (会被合并到一起),那么都是在 2019-10-13T00.00.00.000 之后才可以出售这部分以及之前购买的 REX,也就是需要 4 天多的时间,所谓的等待 4 天是指从第二天 0 点开始。当然也可以通过 rexbal 中的 rex_maturities 成熟桶查看具体成熟时间,如实例 3 所示。

查询 OWNRE 的 rexbal 数据:

cleos -u http://mainnet.meet.one get table eosio eosio rexbal -L OWNER -U OWNER
实例 3:
{
  "rows": [{
      "version": 0,
      "owner": "OWNER",                       
      "vote_stake": "5792.5005 EOS",          // 购买的 REX 的 EOS 数量用于加入到投票数中
      "rex_balance": "57749594.1290 REX",     // 持有的 REX 总量(matured_rex + rex_maturities)
      "matured_rex": 2256,                    // 已成熟的 REX (即可以用于出售的 REX)
      "rex_maturities": [{                    // 成熟桶
          "first": "2019-11-09T00:00:00",     // 成熟时间,若 first 小于当前时间则说明已成熟
          "second": 99697191                  // 成熟后会将 second 的值加入到 matured_rex 同时删除这条记录
        },{
          "first": "2019-11-10T00:00:00",
          "second": "577346341843"
        },{
          "first": "2106-02-07T06:28:15",     // 储蓄桶,永远不会成熟,如果需要出售,需要移出,重新进入成熟桶,等待至少 4 天成熟后才可以出售(后续会介绍)
          "second": 49900000
        }
      ]
    }
  ],
  "more": true
}

3. sellrex ( 出售 REX )

经过 4 天多的等待,便可以出售 REX 来领取收益了。

cleos -u http://mainnet.meet.one push action eosio sellrex '["FROM", "AMOUNT"]' -p FROM@active
  • FROM: 出售 REX 的账户
  • AMOUNT: 出售 REX 的数量

AMOUNT * total_lendable / total_rex 计算的结果(本金 + 利息)会增加到用户 rexfund 表的 balance 中。

上述是在流动性不紧缩的情况下。如果出现流动性紧缩,那么出售 REX 的时候这笔卖单会被加入到队列中等待处理,队列表名为 rexqueue,如实例 4 所示,如果同一个人有正在进行的卖单,再次出售会合并这两个单子。

获取 requeue 表数据,按未处理以及卖单先后时间排序:

cleos -u http://mainnet.meet.one get table eosio eosio rexqueue --index 2 --key-type i64   
{
  "rows": [{
      "version": 0,
      "owner": "OWNER1",
      "rex_requested": "9240422036.3346 REX",     // 出售的 REX 总数
      "proceeds": "0.0000 EOS",                   // 本金 + 利息,未处理时为 0 
      "stake_change": "0.0000 EOS",               // 抵押票数的变化
      "order_time": "2019-11-04T12:58:12.000",    // 卖出 rex 的时间
      "is_open": 1                                // 1 表示未处理, 0 表示已处理
    },
    ....
    {
      "version": 0,
      "owner": "OWNERN",
      "rex_requested": "100737686.7695 REX",
      "proceeds": "10104.3776 EOS",
      "stake_change": "-10104.3700 EOS",
      "order_time": "2019-11-05T11:55:31.500",
      "is_open": 0
    }
  ],
    "more": false
}

如果觉得等待队列太久,可以通过以下指令取消:

cleos -u http://mainnet.meet.one push action eosio cnclrexorder '["OWNER"]' -p OWNER@active

如果你想早点出售,可是队列中前面存在大额卖单交易,那么怎么处理?

小技巧来了: 可以根据 rexpool 表中的数据来计算当前允许出售的最大数量的 REX:

(total_unlent - 0.2 * total_lent)* total_rex / total_lendable(v1.8.2之前版本计算方式)

(total_unlent - 0.1 * total_lent)* total_rex / total_lendable (v1.8.3 计算方式)

也可以运行本文的源码查看目前主网详情。根据计算结果选择低于该值出售 REX,这样就可以插队提前出售一部分 REX,不需要等待。

4. withdraw ( 提现 )

出售 REX 的本金和利息并不会自动从 REX 基金中转到用户账户中,而是会被加入到用户 rexfund 表中,还需要自己手动取回。

cleos -u http://mainnet.meet.one push action eosio withdraw '["OWNER", "AMOUNT"]' -p OWNER@active

当然也可以继续选择购买 REX (出租 EOS) 赚取收益。