Skip to content

Commit

Permalink
Merge pull request #531 from eoscommunity/main
Browse files Browse the repository at this point in the history
EdenOS Release 0.2.12
  • Loading branch information
brandonfancher authored Sep 30, 2021
2 parents 89a2405 + c1095b5 commit 526fcd4
Show file tree
Hide file tree
Showing 110 changed files with 3,993 additions and 965 deletions.
10 changes: 10 additions & 0 deletions contracts/eden/include/accounts.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@

namespace eden
{
inline bool is_possible_deposit_account(eosio::name account,
eosio::name atomic_account = atomic_assets_account,
eosio::name market_account = atomic_market_account)
{
constexpr auto eosio_prefix = "eosio"_n;
constexpr auto eosio_mask = 0xFFFFFFFC00000000;
return account != market_account && account != atomic_account &&
(account.value & eosio_mask) != eosio_prefix.value;
}

struct migrate_account_v0
{
eosio::name last_visited;
Expand Down
83 changes: 82 additions & 1 deletion contracts/eden/include/events.hpp
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#pragma once

#include <eosio/asset.hpp>
#include <eosio/fixed_bytes.hpp>
#include <eosio/name.hpp>
#include <eosio/reflection.hpp>
Expand Down Expand Up @@ -133,6 +134,78 @@ namespace eden
};
EOSIO_REFLECT(election_event_end, election_time)

// Distribution event order:
// distribution_event_schedule
// distribution_event_reserve
// distribution_event_begin
// distribution_event_return_excess (optional)
// distribution_event_fund
// distribution_event_end
// No particular order:
// distribution_event_return
// set_pool_event

struct set_pool_event
{
eosio::name pool;
uint8_t monthly_distribution_pct;
};
EOSIO_REFLECT(set_pool_event, pool, monthly_distribution_pct)

struct distribution_event_schedule
{
eosio::block_timestamp distribution_time;
};
EOSIO_REFLECT(distribution_event_schedule, distribution_time)

struct distribution_event_reserve
{
eosio::block_timestamp distribution_time;
eosio::name pool;
eosio::asset target_amount;
};
EOSIO_REFLECT(distribution_event_reserve, distribution_time, pool, target_amount)

struct distribution_event_begin
{
eosio::block_timestamp distribution_time;
std::vector<eosio::asset> rank_distribution;
};
EOSIO_REFLECT(distribution_event_begin, distribution_time, rank_distribution)

struct distribution_event_return_excess
{
eosio::block_timestamp distribution_time;
eosio::name pool;
eosio::asset amount;
};
EOSIO_REFLECT(distribution_event_return_excess, distribution_time, pool, amount)

struct distribution_event_fund
{
eosio::name owner;
eosio::block_timestamp distribution_time;
uint8_t rank;
eosio::asset balance;
};
EOSIO_REFLECT(distribution_event_fund, owner, distribution_time, rank, balance)

struct distribution_event_end
{
eosio::block_timestamp distribution_time;
};
EOSIO_REFLECT(distribution_event_end, distribution_time)

struct distribution_event_return
{
eosio::name owner;
eosio::block_timestamp distribution_time;
uint8_t rank;
eosio::asset amount;
eosio::name pool;
};
EOSIO_REFLECT(distribution_event_return, owner, distribution_time, rank, amount, pool)

using event = std::variant<election_event_schedule,
election_event_begin,
election_event_seeding,
Expand All @@ -144,7 +217,15 @@ namespace eden
election_event_end_round_voting,
election_event_report_group,
election_event_end_round,
election_event_end>;
election_event_end,
set_pool_event,
distribution_event_schedule,
distribution_event_reserve,
distribution_event_begin,
distribution_event_return_excess,
distribution_event_fund,
distribution_event_end,
distribution_event_return>;

void push_event(const event& e, eosio::name self);
void send_events(eosio::name self);
Expand Down
8 changes: 0 additions & 8 deletions contracts/eden/src/actions/accounts.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,6 @@

namespace eden
{
static bool is_possible_deposit_account(eosio::name account)
{
constexpr auto eosio_prefix = "eosio"_n;
constexpr auto eosio_mask = 0xFFFFFFFC00000000;
return account != atomic_market_account && account != atomic_assets_account &&
(account.value & eosio_mask) != eosio_prefix.value;
}

void eden::notify_transfer(eosio::name from,
eosio::name to,
const eosio::asset& quantity,
Expand Down
86 changes: 83 additions & 3 deletions contracts/eden/src/distributions.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
#include <accounts.hpp>
#include <distributions.hpp>
#include <elections.hpp>
#include <events.hpp>
#include <members.hpp>
#include <numeric>

Expand All @@ -9,6 +10,12 @@ namespace eden
void init_pools(eosio::name contract)
{
pool_table_type pool_tb{contract, default_scope};
push_event(
set_pool_event{
.pool = "master"_n,
.monthly_distribution_pct = 5,
},
contract);
pool_tb.emplace(contract, [](auto& row) { row.value = pool_v0{"master"_n, 5}; });
}

Expand Down Expand Up @@ -54,7 +61,14 @@ namespace eden
auto amount = dist->amount;
auto old = amount;
distribution_tb.modify(iter, contract, [&](auto& row) {
row.value = make_distribution(contract, dist->distribution_time, amount);
auto d = make_distribution(contract, dist->distribution_time, amount);
push_event(
distribution_event_begin{
.distribution_time = d.distribution_time,
.rank_distribution = d.rank_distribution,
},
contract);
row.value = std::move(d);
});
eosio::check(
amount == old,
Expand All @@ -81,6 +95,7 @@ namespace eden
{
if (init != eosio::block_timestamp())
{
push_event(distribution_event_schedule{init}, contract);
distribution_tb.emplace(contract,
[&](auto& row) { row.value = next_distribution{init}; });
}
Expand Down Expand Up @@ -127,6 +142,12 @@ namespace eden
pool_table_type pool_tb{contract, default_scope};
if (pool_tb.begin() == pool_tb.end())
{
push_event(
set_pool_event{
.pool = "master"_n,
.monthly_distribution_pct = 5,
},
contract);
pool_tb.emplace(contract, [](auto& row) { row.value = pool_v0{"master"_n, 5}; });
}
eosio::asset total = {};
Expand All @@ -140,6 +161,8 @@ namespace eden
account->balance().amount / prorate_den,
account->balance().symbol)
: (pool.monthly_distribution_pct() * account->balance() / 100);
push_event(distribution_event_reserve{distribution_time, pool.name(), amount},
contract);
accounts.sub_balance(pool.name(), amount);
if (!total.amount)
{
Expand All @@ -157,7 +180,14 @@ namespace eden
distribution_tb.modify(iter, contract, [&](auto& row) {
if (next_election_time && *next_election_time > distribution_time)
{
row.value = make_distribution(contract, distribution_time, used);
auto d = make_distribution(contract, distribution_time, used);
push_event(
distribution_event_begin{
.distribution_time = d.distribution_time,
.rank_distribution = d.rank_distribution,
},
contract);
row.value = std::move(d);
}
else
{
Expand All @@ -166,6 +196,13 @@ namespace eden
});
if (used != total)
{
push_event(
distribution_event_return_excess{
.distribution_time = distribution_time,
.pool = "master"_n,
.amount = total - used,
},
contract);
accounts.add_balance("master"_n, total - used);
}
dist_accounts.emplace(contract, [&](auto& row) {
Expand All @@ -178,8 +215,16 @@ namespace eden
}
else
{
push_event(
distribution_event_begin{
.distribution_time = distribution_time,
.rank_distribution = {},
},
contract);
push_event(distribution_event_end{distribution_time}, contract);
distribution_tb.erase(iter);
}
push_event(distribution_event_schedule{next_time}, contract);
iter = distribution_tb.emplace(
contract, [&](auto& row) { row.value = next_distribution{next_time}; });
result = true;
Expand All @@ -203,11 +248,20 @@ namespace eden
{
auto amount = dist.rank_distribution[rank];
dist_accounts_tb.emplace(contract, [&](auto& row) {
row.value = distribution_account_v0{.id = dist_accounts_tb.available_primary_key(),
auto fund = distribution_account_v0{.id = dist_accounts_tb.available_primary_key(),
.owner = iter->account(),
.distribution_time = dist.distribution_time,
.rank = static_cast<uint8_t>(rank + 1),
.balance = amount};
push_event(
distribution_event_fund{
.owner = fund.owner,
.distribution_time = fund.distribution_time,
.rank = fund.rank,
.balance = fund.balance,
},
contract);
row.value = fund;
});
if (dist_iter != dist_idx.end())
{
Expand Down Expand Up @@ -251,6 +305,7 @@ namespace eden
max_steps = distribute_monthly(contract, max_steps, copy);
if (max_steps)
{
push_event(distribution_event_end{current->distribution_time}, contract);
iter = distribution_tb.erase(iter);
--max_steps;
}
Expand Down Expand Up @@ -308,6 +363,15 @@ namespace eden
end = member_idx.end();
max_steps > 0 && iter != end && iter->owner() == member; --max_steps)
{
push_event(
distribution_event_return{
.owner = iter->owner(),
.distribution_time = iter->distribution_time(),
.rank = iter->rank(),
.amount = iter->balance(),
.pool = "master"_n,
},
contract);
owned_accounts.add_balance("master"_n, iter->balance());
iter = member_idx.erase(iter);
}
Expand All @@ -323,6 +387,15 @@ namespace eden
end = member_idx.end();
iter != end && iter->owner() == member.account();)
{
push_event(
distribution_event_return{
.owner = iter->owner(),
.distribution_time = iter->distribution_time(),
.rank = iter->rank(),
.amount = iter->balance(),
.pool = "master"_n,
},
contract);
owned_accounts.add_balance("master"_n, iter->balance());
iter = member_idx.erase(iter);
}
Expand Down Expand Up @@ -359,6 +432,13 @@ namespace eden
{
eosio::check(amount.amount == 0, "insufficient balance");
}
push_event(
distribution_event_return_excess{
.distribution_time = dist->distribution_time,
.pool = "master"_n,
.amount = amount,
},
contract);
owned_accounts.add_balance("master"_n, amount);
}
}
Expand Down
Loading

0 comments on commit 526fcd4

Please sign in to comment.