提交 31cf5f73 编写于 作者: W Wang Zhi

update system contract

上级 6d15e2a6
......@@ -307,6 +307,7 @@
"fields": [
{"name":"owner", "type":"account_name"},
{"name":"seq_num", "type":"uint16"},
{"name":"level", "type":"uint8"},
{"name":"out_votes", "type":"int64"},
{"name":"deposit_votes", "type":"int64"},
{"name":"unpaid_base_cnt", "type":"uint32"},
......@@ -352,13 +353,6 @@
"name": "testnewelec",
"base": "",
"fields": []
},{
"name": "tmpvotennn",
"base": "",
"fields": [
{"name":"producer", "type":"account_name"},
{"name":"tickets", "type":"int64"}
]
},{
"name": "setram",
"base": "",
......@@ -575,10 +569,6 @@
"name": "testnewelec",
"type": "testnewelec",
"ricardian_contract": ""
},{
"name": "tmpvotennn",
"type": "tmpvotennn",
"ricardian_contract": ""
},{
"name": "regproxy",
"type": "regproxy",
......
......@@ -96,8 +96,7 @@ namespace eosiosystem {
_producers.modify( prod, 0, [&](auto& p) {
p.deactivate();
});
change_producer_seq_info(producer, public_key(), false, false , "");
change_producer_yta_info(producer, public_key(), false, false , "");
}
void system_contract::bidname( account_name bidder, account_name newname, asset bid ) {
......
......@@ -101,13 +101,14 @@ namespace eosiosystem {
struct producer_info_ext {
account_name owner;
uint16_t seq_num = 1; // from 1 to 21
uint8_t level = 3;
int64_t out_votes = 0;
int64_t deposit_votes = 0;
uint32_t unpaid_base_cnt = 0;
account_name shadow = 0;
uint64_t primary_key()const { return owner; }
EOSLIB_SERIALIZE( producer_info_ext, (owner)(seq_num)(out_votes)(deposit_votes)(unpaid_base_cnt)(shadow))
EOSLIB_SERIALIZE( producer_info_ext, (owner)(seq_num)(level)(out_votes)(deposit_votes)(unpaid_base_cnt)(shadow))
};
//##YTA-Change end:
......@@ -117,7 +118,7 @@ namespace eosiosystem {
account_name owner;
double total_votes = 0; // total votes
eosio::public_key producer_key; /// a packed public key object
int64_t all_stake = 0; // total original votes (buy yta amount)
int64_t all_stake = 0; // total original votes (buy yta amount) -- depracated
bool is_active = true;
std::string url;
uint16_t location = 0;
......@@ -276,8 +277,6 @@ namespace eosiosystem {
void seqproducer( const account_name producer, const account_name shadow, uint16_t seq , uint8_t level );
void tmpvotennn( const account_name producer, int64_t tickets );
void testnewelec();
void changevotes( const account_name voter_name );
......@@ -306,13 +305,13 @@ namespace eosiosystem {
//##YTA-Change start:
void update_elected_producers_yta( block_timestamp timestamp );
void rm_producer_seq( const account_name producer, uint16_t seq );
void rm_producer_yta( const account_name producer );
void add_producer_seq( const account_name producer, uint16_t seq , uint8_t level );
void add_producer_yta( const account_name producer, uint8_t level );
void change_producer_seq_info( const account_name producer, const eosio::public_key& producer_key, bool isactive, bool seturl, const std::string& url);
void change_producer_yta_info( const account_name producer, const eosio::public_key& producer_key, bool isactive, bool seturl, const std::string& url);
void update_producers_seq_totalvotes( uint16_t seq_num, account_name owner, double total_votes);
void update_producers_yta_totalvotes( account_name owner, double total_votes);
void delproducer( const account_name producer );
//##YTA-Change end:
......
......@@ -107,109 +107,14 @@ namespace eosiosystem {
using namespace eosio;
void system_contract::claimrewards( const account_name& owner ) {
require_auth(_self);
//require_auth(owner);
//@@@@@@@@@@@@@@@@@@@@
const auto& prod = _producers.get( owner );
eosio_assert( prod.active(), "producer does not have an active key" );
eosio_assert( _gstate.total_activated_stake >= min_activated_stake,
"cannot claim rewards until the chain is activated (at least 15% of all tokens participate in voting)" );
auto ct = current_time();
eosio_assert( ct - prod.last_claim_time > useconds_per_day, "already claimed rewards within past day" );
const asset token_supply = token( N(eosio.token)).get_supply(symbol_type(system_token_symbol).name() );
const auto usecs_since_last_fill = ct - _gstate.last_pervote_bucket_fill;
print("usecs_since_last_fill: ", usecs_since_last_fill, "\n");
print("_gstate.last_pervote_bucket_fill: ", _gstate.last_pervote_bucket_fill, "\n");
print("now(): ", now(), "\n");
int idx_year = (int)((now()- block_initial_timestamp) / seconds_per_year);
auto seo_token = yta_seo_year[idx_year] * YTA_SEO_BASE;
print("idx_year: ", idx_year, "\n");
print("yta_seo_year[idx_year]: ", yta_seo_year[idx_year], "\n");
print( "token_supply: ", token_supply, "\n");
print("seo_token: ", seo_token, "\n");
if( usecs_since_last_fill > 0 && _gstate.last_pervote_bucket_fill > 0 ) {
auto new_tokens = static_cast<int64_t>(seo_token * YTA_PRECISION * double(usecs_since_last_fill)/double(useconds_per_year));
print("new_token: ", new_tokens, "\n");
auto to_per_base_pay = static_cast<int64_t>((new_tokens * 3) / 5);
auto to_producers = new_tokens - to_per_base_pay;
auto to_per_block_pay = to_producers / 2;
auto to_per_vote_pay = to_producers - to_per_block_pay;
INLINE_ACTION_SENDER(eosio::token, issue)( N(eosio.token), {{N(eosio),N(active)}},
{N(eosio), asset(new_tokens), std::string("issue tokens for producer pay")} );
INLINE_ACTION_SENDER(eosio::token, transfer)( N(eosio.token), {N(eosio),N(active)},
{ N(eosio), N(hddbasefound), asset(to_per_base_pay), "fund per-base bucket" } );
INLINE_ACTION_SENDER(eosio::token, transfer)( N(eosio.token), {N(eosio),N(active)},
{ N(eosio), N(eosio.bpay), asset(to_per_block_pay), "fund per-block bucket" } );
INLINE_ACTION_SENDER(eosio::token, transfer)( N(eosio.token), {N(eosio),N(active)},
{ N(eosio), N(eosio.vpay), asset(to_per_vote_pay), "fund per-vote bucket" } );
_gstateex.perbase_bucket += to_per_base_pay;
_gstate.pervote_bucket += to_per_vote_pay;
_gstate.perblock_bucket += to_per_block_pay;
_gstate.last_pervote_bucket_fill = ct;
}
const auto& prodext = _producersext.get( owner );
int64_t producer_per_base_pay = 0;
if( _gstateex.total_unpaid_base_cnt > 0 ) {
producer_per_base_pay = (_gstateex.perbase_bucket * prodext.unpaid_base_cnt) / _gstateex.total_unpaid_base_cnt;
}
int64_t producer_per_block_pay = 0;
if( _gstate.total_unpaid_blocks > 0 ) {
producer_per_block_pay = (_gstate.perblock_bucket * prod.unpaid_blocks) / _gstate.total_unpaid_blocks;
}
int64_t producer_per_vote_pay = 0;
if( _gstate.total_producer_vote_weight > 0 ) {
producer_per_vote_pay = int64_t((_gstate.pervote_bucket * prod.total_votes ) / _gstate.total_producer_vote_weight);
}
if( producer_per_vote_pay < min_pervote_daily_pay ) {
producer_per_vote_pay = 0;
}
_gstateex.perbase_bucket -= producer_per_base_pay;
_gstate.pervote_bucket -= producer_per_vote_pay;
_gstate.perblock_bucket -= producer_per_block_pay;
_gstate.total_unpaid_blocks -= prod.unpaid_blocks;
_gstateex.total_unpaid_base_cnt -= prodext.unpaid_base_cnt;
_producers.modify( prod, 0, [&](auto& p) {
p.last_claim_time = ct;
p.unpaid_blocks = 0;
});
_producersext.modify( prodext, 0, [&](auto& p) {
p.unpaid_base_cnt = 0;
});
eosio_assert(1 == 2, "can not claimrewards by self");
return;
((void)owner);
if( producer_per_base_pay > 0 ) {
INLINE_ACTION_SENDER(eosio::token, transfer)( N(eosio.token), {N(hddbasefound),N(active)},
{ N(hddbasefound), owner, asset(producer_per_base_pay), std::string("producer base pay") } );
}
if( producer_per_block_pay > 0 ) {
INLINE_ACTION_SENDER(eosio::token, transfer)( N(eosio.token), {N(eosio.bpay),N(active)},
{ N(eosio.bpay), owner, asset(producer_per_block_pay), std::string("producer block pay") } );
}
if( producer_per_vote_pay > 0 ) {
INLINE_ACTION_SENDER(eosio::token, transfer)( N(eosio.token), {N(eosio.vpay),N(active)},
{ N(eosio.vpay), owner, asset(producer_per_vote_pay), std::string("producer vote pay") } );
}
require_auth(_self);
//require_auth(owner);
}
......
......@@ -54,7 +54,7 @@ namespace eosiosystem {
info.location = location;
});
change_producer_seq_info(producer, producer_key, true, true, url);
change_producer_yta_info(producer, producer_key, true, true, url);
} else {
_producers.emplace( producer, [&]( producer_info& info ){
info.owner = producer;
......@@ -79,7 +79,7 @@ namespace eosiosystem {
info.location = location;
});
change_producer_seq_info(producer, producer_key, true, true, url);
change_producer_yta_info(producer, producer_key, true, true, url);
} else {
_producers.emplace( _self, [&]( producer_info& info ){
info.owner = producer;
......@@ -94,18 +94,16 @@ namespace eosiosystem {
}
void system_contract::unregprod( const account_name producer ) {
require_auth( producer );
///@@@@@@@@@@@@@@@@@@@@@
eosio_assert(1 == 2, "unregprod is disabled");
return;
require_auth( producer );
const auto& prod = _producers.get( producer, "producer not found" );
_producers.modify( prod, 0, [&]( producer_info& info ){
info.deactivate();
});
change_producer_seq_info(producer, public_key(), false, false, "");
change_producer_yta_info(producer, public_key(), false, false, "");
}
//##YTA-Change start:
void system_contract::clsprods2() {
......@@ -146,17 +144,13 @@ namespace eosiosystem {
}
auto itpex = _producersext.find(producer);
uint16_t seq_num = 0;
if( itpex != _producersext.end() ) {
_gstateex.total_unpaid_base_cnt -= itpex->unpaid_base_cnt;
seq_num = itpex->seq_num;
_producersext.erase(itpex);
} else {
return;
}
rm_producer_seq(producer, seq_num);
rm_producer_yta(producer);
}
void system_contract::seqproducer( const account_name producer, const account_name shadow, uint16_t seq , uint8_t level ) {
......@@ -175,23 +169,22 @@ namespace eosiosystem {
_producersext.emplace(_self, [&](auto &row) {
row.owner = producer;
row.seq_num = seq;
row.level = level;
row.shadow = shadow;
});
add_producer_seq(producer, seq, level);
add_producer_yta(producer, level);
} else {
uint16_t old_seq = it->seq_num;
_producersext.modify(it, _self, [&](auto &row) {
row.seq_num = seq;
row.level = level;
row.shadow = shadow;
});
rm_producer_seq(producer, old_seq);
add_producer_seq(producer, seq, level);
rm_producer_yta(producer);
add_producer_yta(producer, level);
}
}
void system_contract::rm_producer_seq(const account_name producer, uint16_t seq) {
void system_contract::rm_producer_yta(const account_name producer) {
all_prods_singleton _all_prods(_self, _self);
all_prods_level _all_prods_state;
if (_all_prods.exists()) {
......@@ -219,7 +212,7 @@ namespace eosiosystem {
}
void system_contract::add_producer_seq( const account_name producer, uint16_t seq , uint8_t level ) {
void system_contract::add_producer_yta( const account_name producer, uint8_t level ) {
//need retrive from system producers table
const auto& prod = _producers.get( producer, "producer not found" );
......@@ -242,8 +235,10 @@ namespace eosiosystem {
prodyta.total_votes = prod.total_votes;
prodyta.url = prod.url;
if(level == 1) {
eosio_assert( _all_prods_state.prods_l1.size() < 21, "too many level one bp");
_all_prods_state.prods_l1.push_back(prodyta);
} else if(level == 2) {
eosio_assert( _all_prods_state.prods_l2.size() < 105, "too many level two bp");
_all_prods_state.prods_l2.push_back(prodyta);
} else {
_all_prods_state.prods_l3.push_back(prodyta);
......@@ -252,7 +247,7 @@ namespace eosiosystem {
}
void system_contract::change_producer_seq_info( const account_name producer, const eosio::public_key& producer_key, bool isactive, bool seturl, const std::string& url) {
void system_contract::change_producer_yta_info( const account_name producer, const eosio::public_key& producer_key, bool isactive, bool seturl, const std::string& url) {
if(!isactive) {
delproducer(producer);
......@@ -295,7 +290,7 @@ namespace eosiosystem {
}
void system_contract::update_producers_seq_totalvotes( uint16_t seq_num, account_name owner, double total_votes) {
void system_contract::update_producers_yta_totalvotes( account_name owner, double total_votes) {
all_prods_singleton _all_prods(_self, _self);
all_prods_level _all_prods_state;
......@@ -333,29 +328,6 @@ namespace eosiosystem {
update_elected_producers_yta( block_time );
}
void system_contract::tmpvotennn( const account_name producer, int64_t tickets ) {
require_auth( _self );
const auto& prod = _producers.get( producer, "producer not found" );
//auto it = _producers.find(producer);
//eosio_assert( it != _producers.end() , "producer not found");
int64_t vote_delta = 0;
_producers.modify( prod, 0, [&]( producer_info& info ){
auto pitr2 = _producersext.find( producer);
if( pitr2 != _producersext.end() ) {
vote_delta = tickets - pitr2->out_votes;
info.total_votes += vote_delta;
_producersext.modify( pitr2, 0, [&]( producer_info_ext& info2){
info2.out_votes = tickets;
});
update_producers_seq_totalvotes(pitr2->seq_num, producer, info.total_votes);
}
});
_gstate.total_producer_vote_weight += vote_delta;
}
void system_contract::update_elected_producers_yta( block_timestamp block_time ) {
all_prods_singleton _all_prods(_self, _self);
......@@ -808,7 +780,7 @@ namespace eosiosystem {
auto pitr2 = _producersext.find( pd.first );
if( pitr2 != _producersext.end() ) {
//pitr2->seq_num
update_producers_seq_totalvotes(pitr2->seq_num, pd.first, total_votes);
update_producers_yta_totalvotes(pd.first, total_votes);
} else {
if(voting) {
eosio_assert( !pd.second.second /* not from new set */, "producer is not registered" ); //data corruption
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册