diff --git a/docs b/docs index 97435c1a..66a8825f 160000 --- a/docs +++ b/docs @@ -1 +1 @@ -Subproject commit 97435c1a622e41e0a5fc1be72aaadea62e1b7adb +Subproject commit 66a8825f937af9b810b63a3015521e29027ac5d4 diff --git a/libraries/chain/db_init.cpp b/libraries/chain/db_init.cpp index 3cbd7dcc..f02a7daf 100644 --- a/libraries/chain/db_init.cpp +++ b/libraries/chain/db_init.cpp @@ -286,7 +286,7 @@ void database::init_genesis(const genesis_state_type& genesis_state) const asset_object& core_asset = create( [&]( asset_object& a ) { a.symbol = GRAPHENE_SYMBOL; - a.options.max_supply = GRAPHENE_MAX_SHARE_SUPPLY; + a.options.max_supply = genesis_state.max_core_supply; a.precision = GRAPHENE_BLOCKCHAIN_PRECISION_DIGITS; a.options.flags = 0; a.options.issuer_permissions = 0; @@ -356,7 +356,7 @@ void database::init_genesis(const genesis_state_type& genesis_state) // Helper function to get asset ID by symbol const auto& assets_by_symbol = get_index_type().indices().get(); - auto get_asset_id = [&assets_by_symbol](const string& symbol) { + const auto get_asset_id = [&assets_by_symbol](const string& symbol) { auto itr = assets_by_symbol.find(symbol); FC_ASSERT(itr != assets_by_symbol.end(), "Unable to find asset '${sym}'. Did you forget to add a record for it to initial_assets?", @@ -364,19 +364,18 @@ void database::init_genesis(const genesis_state_type& genesis_state) return itr->get_id(); }; + map total_supplies; + // Create initial assets for( const genesis_state_type::initial_asset_type& asset : genesis_state.initial_assets ) { + asset_id_type new_asset_id = get_index_type().get_next_id(); asset_dynamic_data_id_type dynamic_data_id; optional bitasset_data_id; - if( asset.bitasset_opts.valid() ) + if( asset.is_bitasset ) { - share_type total_allocated; - asset_id_type new_asset_id = get_index_type().get_next_id(); - asset_id_type collateral_asset_id = get_asset_id(asset.bitasset_opts->backing_asset_symbol); - int collateral_holder_number = 0; - for( const auto& collateral_rec : asset.bitasset_opts->collateral_records ) + for( const auto& collateral_rec : asset.collateral_records ) { account_create_operation cop; cop.name = asset.symbol + "-collateral-holder-" + std::to_string(collateral_holder_number); @@ -391,30 +390,23 @@ void database::init_genesis(const genesis_state_type& genesis_state) c.collateral = collateral_rec.collateral; c.debt = collateral_rec.debt; c.call_price = price::call_price(chain::asset(c.debt, new_asset_id), - chain::asset(c.collateral, collateral_asset_id), - asset.bitasset_opts->maintenance_collateral_ratio); + chain::asset(c.collateral, core_asset.id), + GRAPHENE_DEFAULT_MAINTENANCE_COLLATERAL_RATIO); }); - total_allocated += collateral_rec.debt; + total_supplies[ 0 ] += collateral_rec.collateral; } bitasset_data_id = create([&](asset_bitasset_data_object& b) { - b.options.feed_lifetime_sec = asset.bitasset_opts->feed_lifetime_sec; - b.options.minimum_feeds = asset.bitasset_opts->minimum_feeds; - b.options.force_settlement_delay_sec = asset.bitasset_opts->force_settlement_delay_sec; - b.options.force_settlement_offset_percent = asset.bitasset_opts->force_settlement_offset_percent; - b.options.maximum_force_settlement_volume = asset.bitasset_opts->maximum_force_settlement_volume; - b.options.short_backing_asset = get_asset_id(asset.bitasset_opts->backing_asset_symbol); + b.options.short_backing_asset = core_asset.id; }).id; + } - dynamic_data_id = create([&](asset_dynamic_data_object& d) { - d.current_supply = total_allocated; - d.accumulated_fees = asset.initial_accumulated_fees; - }).id; - } else - dynamic_data_id = create([&](asset_dynamic_data_object& d) { - d.accumulated_fees = asset.initial_accumulated_fees; - }).id; + dynamic_data_id = create([&](asset_dynamic_data_object& d) { + d.accumulated_fees = asset.accumulated_fees; + }).id; + + total_supplies[ new_asset_id ] += asset.accumulated_fees; create([&](asset_object& a) { a.symbol = asset.symbol; @@ -422,10 +414,6 @@ void database::init_genesis(const genesis_state_type& genesis_state) a.precision = asset.precision; a.issuer = get_account_id(asset.issuer_name); a.options.max_supply = asset.max_supply; - a.options.market_fee_percent = asset.market_fee_percent; - a.options.max_market_fee = asset.max_market_fee; - a.options.issuer_permissions = asset.issuer_permissions; - a.options.flags = asset.flags; a.dynamic_asset_data_id = dynamic_data_id; a.bitasset_data_id = bitasset_data_id; @@ -436,19 +424,22 @@ void database::init_genesis(const genesis_state_type& genesis_state) share_type total_allocation; for( const auto& handout : genesis_state.initial_balances ) { - create([&handout,&assets_by_symbol,total_allocation](balance_object& b) { - b.balance = asset(handout.amount, assets_by_symbol.find(handout.asset_symbol)->get_id()); + const auto asset_id = get_asset_id(handout.asset_symbol); + create([&handout,&get_asset_id,total_allocation,asset_id](balance_object& b) { + b.balance = asset(handout.amount, asset_id); b.owner = handout.owner; }); - total_allocation += handout.amount; + + total_supplies[ asset_id ] += handout.amount; } // Create initial vesting balances for( const genesis_state_type::initial_vesting_balance_type& vest : genesis_state.initial_vesting_balances ) { + const auto asset_id = get_asset_id(vest.asset_symbol); create([&](balance_object& b) { b.owner = vest.owner; - b.balance = asset(vest.amount, assets_by_symbol.find(vest.asset_symbol)->get_id()); + b.balance = asset(vest.amount, asset_id); linear_vesting_policy policy; policy.begin_timestamp = vest.begin_timestamp; @@ -458,17 +449,33 @@ void database::init_genesis(const genesis_state_type& genesis_state) b.vesting_policy = std::move(policy); }); - total_allocation += vest.amount; + + total_supplies[ asset_id ] += vest.amount; } - // Set current supply based on allocations, if they happened - if( total_allocation > 0 ) + if( total_supplies[ 0 ] > 0 ) { - modify(dyn_asset, [total_allocation](asset_dynamic_data_object& d) { - d.current_supply = total_allocation; - }); - adjust_balance(GRAPHENE_COMMITTEE_ACCOUNT, -get_balance(GRAPHENE_COMMITTEE_ACCOUNT,{})); + adjust_balance(GRAPHENE_COMMITTEE_ACCOUNT, -get_balance(GRAPHENE_COMMITTEE_ACCOUNT,{})); } + else + { + total_supplies[ 0 ] = GRAPHENE_MAX_SHARE_SUPPLY; + } + + // Save tallied supplies + for( const auto& item : total_supplies ) + { + const auto asset_id = item.first; + const auto total_supply = item.second; + + modify( get( asset_id ), [ & ]( asset_object& asset ) { + modify( get( asset.dynamic_asset_data_id ), [ & ]( asset_dynamic_data_object& asset_data ) { + asset_data.current_supply = total_supply; + } ); + } ); + } + + // TODO: Assert that bitasset debt = supply // Create initial witnesses std::for_each(genesis_state.initial_witness_candidates.begin(), genesis_state.initial_witness_candidates.end(), diff --git a/libraries/chain/include/graphene/chain/asset_object.hpp b/libraries/chain/include/graphene/chain/asset_object.hpp index 1e763ff4..f34fa849 100644 --- a/libraries/chain/include/graphene/chain/asset_object.hpp +++ b/libraries/chain/include/graphene/chain/asset_object.hpp @@ -114,7 +114,7 @@ namespace graphene { namespace chain { /// Ticker symbol for this asset, i.e. "USD" string symbol; /// Maximum number of digits after the decimal point (must be <= 12) - uint8_t precision; + uint8_t precision = 0; /// ID of the account which issued this asset. account_id_type issuer; diff --git a/libraries/chain/include/graphene/chain/genesis_state.hpp b/libraries/chain/include/graphene/chain/genesis_state.hpp index 40cef3d6..3e325681 100644 --- a/libraries/chain/include/graphene/chain/genesis_state.hpp +++ b/libraries/chain/include/graphene/chain/genesis_state.hpp @@ -26,36 +26,23 @@ struct genesis_state_type { bool is_lifetime_member = false; }; struct initial_asset_type { + struct initial_collateral_position { + address owner; + share_type collateral; + share_type debt; + }; + string symbol; + string issuer_name; + string description; uint8_t precision; - string issuer_name; + share_type max_supply; - uint16_t market_fee_percent; - share_type max_market_fee; - uint16_t issuer_permissions; - uint16_t flags; + share_type accumulated_fees; - struct initial_bitasset_options { - uint32_t feed_lifetime_sec; - uint8_t minimum_feeds; - uint32_t force_settlement_delay_sec; - uint16_t force_settlement_offset_percent; - uint16_t maximum_force_settlement_volume; - string backing_asset_symbol; - - struct initial_collateral_position { - address owner; - share_type collateral; - share_type debt; - }; - - uint16_t maintenance_collateral_ratio; - vector collateral_records; - }; - optional bitasset_opts; - - share_type initial_accumulated_fees; + bool is_bitasset = false; + vector collateral_records; }; struct initial_balance_type { address owner; @@ -86,6 +73,7 @@ struct genesis_state_type { }; time_point_sec initial_timestamp; + share_type max_core_supply = GRAPHENE_MAX_SHARE_SUPPLY; chain_parameters initial_parameters; vector initial_accounts; vector initial_assets; @@ -101,15 +89,10 @@ struct genesis_state_type { FC_REFLECT(graphene::chain::genesis_state_type::initial_account_type, (name)(owner_key)(active_key)(is_lifetime_member)) FC_REFLECT(graphene::chain::genesis_state_type::initial_asset_type, - (symbol)(description)(precision)(issuer_name)(max_supply)(market_fee_percent) - (issuer_permissions)(flags)(bitasset_opts)(initial_accumulated_fees)) + (symbol)(issuer_name)(description)(precision)(max_supply)(accumulated_fees)(is_bitasset)(collateral_records)) -FC_REFLECT(graphene::chain::genesis_state_type::initial_asset_type::initial_bitasset_options, - (feed_lifetime_sec)(minimum_feeds)(force_settlement_delay_sec)(force_settlement_offset_percent) - (maximum_force_settlement_volume)(backing_asset_symbol)(maintenance_collateral_ratio)(collateral_records)) - -FC_REFLECT(graphene::chain::genesis_state_type::initial_asset_type::initial_bitasset_options::initial_collateral_position, - (collateral)(debt)) +FC_REFLECT(graphene::chain::genesis_state_type::initial_asset_type::initial_collateral_position, + (owner)(collateral)(debt)) FC_REFLECT(graphene::chain::genesis_state_type::initial_balance_type, (owner)(asset_symbol)(amount)) @@ -124,6 +107,6 @@ FC_REFLECT(graphene::chain::genesis_state_type::initial_committee_member_type, ( FC_REFLECT(graphene::chain::genesis_state_type::initial_worker_type, (owner_name)(daily_pay)) FC_REFLECT(graphene::chain::genesis_state_type, - (initial_timestamp)(initial_parameters)(initial_accounts)(initial_assets)(initial_balances) + (initial_timestamp)(max_core_supply)(initial_parameters)(initial_accounts)(initial_assets)(initial_balances) (initial_vesting_balances)(initial_active_witnesses)(initial_witness_candidates) (initial_committee_candidates)(initial_worker_candidates)) diff --git a/tests/intense/block_tests.cpp b/tests/intense/block_tests.cpp index 7f3e6386..37e61672 100644 --- a/tests/intense/block_tests.cpp +++ b/tests/intense/block_tests.cpp @@ -407,7 +407,6 @@ BOOST_FIXTURE_TEST_CASE( tapos_rollover, database_fixture ) try { ACTORS((alice)(bob)); - const auto& core = asset_id_type()(db); BOOST_TEST_MESSAGE( "Give Alice some money" ); transfer(committee_account, alice_id, asset(10000));