fee_tests.cpp: Implement asset_claim_fees_test #413
This commit is contained in:
parent
966b3edf0c
commit
ef1c721690
1 changed files with 133 additions and 0 deletions
|
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
#include <fc/smart_ref_impl.hpp>
|
#include <fc/smart_ref_impl.hpp>
|
||||||
#include <fc/uint128.hpp>
|
#include <fc/uint128.hpp>
|
||||||
|
#include <graphene/chain/hardfork.hpp>
|
||||||
#include <graphene/chain/vesting_balance_object.hpp>
|
#include <graphene/chain/vesting_balance_object.hpp>
|
||||||
|
|
||||||
#include <boost/test/unit_test.hpp>
|
#include <boost/test/unit_test.hpp>
|
||||||
|
|
@ -67,6 +68,138 @@ BOOST_AUTO_TEST_CASE( nonzero_fee_test )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(asset_claim_fees_test)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
ACTORS((alice)(bob)(izzy)(jill));
|
||||||
|
// Izzy issues asset to Alice
|
||||||
|
// Jill issues asset to Bob
|
||||||
|
// Alice and Bob trade in the market and pay fees
|
||||||
|
// Verify that Izzy and Jill can claim the fees
|
||||||
|
|
||||||
|
const share_type core_prec = asset::scaled_precision( asset_id_type()(db).precision );
|
||||||
|
|
||||||
|
// Return number of core shares (times precision)
|
||||||
|
auto _core = [&]( int64_t x ) -> asset
|
||||||
|
{ return asset( x*core_prec ); };
|
||||||
|
|
||||||
|
transfer( committee_account, alice_id, _core(1000000) );
|
||||||
|
transfer( committee_account, bob_id, _core(1000000) );
|
||||||
|
transfer( committee_account, izzy_id, _core(1000000) );
|
||||||
|
transfer( committee_account, jill_id, _core(1000000) );
|
||||||
|
|
||||||
|
asset_id_type izzycoin_id = create_bitasset( "IZZYCOIN", izzy_id, GRAPHENE_1_PERCENT, charge_market_fee ).id;
|
||||||
|
asset_id_type jillcoin_id = create_bitasset( "JILLCOIN", jill_id, 2*GRAPHENE_1_PERCENT, charge_market_fee ).id;
|
||||||
|
|
||||||
|
const share_type izzy_prec = asset::scaled_precision( asset_id_type(izzycoin_id)(db).precision );
|
||||||
|
const share_type jill_prec = asset::scaled_precision( asset_id_type(jillcoin_id)(db).precision );
|
||||||
|
|
||||||
|
auto _izzy = [&]( int64_t x ) -> asset
|
||||||
|
{ return asset( x*izzy_prec, izzycoin_id ); };
|
||||||
|
auto _jill = [&]( int64_t x ) -> asset
|
||||||
|
{ return asset( x*jill_prec, jillcoin_id ); };
|
||||||
|
|
||||||
|
update_feed_producers( izzycoin_id(db), { izzy_id } );
|
||||||
|
update_feed_producers( jillcoin_id(db), { jill_id } );
|
||||||
|
|
||||||
|
const asset izzy_satoshi = asset(1, izzycoin_id);
|
||||||
|
const asset jill_satoshi = asset(1, jillcoin_id);
|
||||||
|
|
||||||
|
// Izzycoin is worth 100 BTS
|
||||||
|
price_feed feed;
|
||||||
|
feed.settlement_price = price( _izzy(1), _core(100) );
|
||||||
|
feed.maintenance_collateral_ratio = 175 * GRAPHENE_COLLATERAL_RATIO_DENOM / 100;
|
||||||
|
feed.maximum_short_squeeze_ratio = 150 * GRAPHENE_COLLATERAL_RATIO_DENOM / 100;
|
||||||
|
publish_feed( izzycoin_id(db), izzy, feed );
|
||||||
|
|
||||||
|
// Jillcoin is worth 30 BTS
|
||||||
|
feed.settlement_price = price( _jill(1), _core(30) );
|
||||||
|
feed.maintenance_collateral_ratio = 175 * GRAPHENE_COLLATERAL_RATIO_DENOM / 100;
|
||||||
|
feed.maximum_short_squeeze_ratio = 150 * GRAPHENE_COLLATERAL_RATIO_DENOM / 100;
|
||||||
|
publish_feed( jillcoin_id(db), jill, feed );
|
||||||
|
|
||||||
|
enable_fees();
|
||||||
|
|
||||||
|
// Alice and Bob create some coins
|
||||||
|
borrow( alice_id, _izzy( 200), _core( 60000) );
|
||||||
|
borrow( bob_id, _jill(2000), _core(180000) );
|
||||||
|
|
||||||
|
// Alice and Bob place orders which match
|
||||||
|
create_sell_order( alice_id, _izzy(100), _jill(300) ); // Alice is willing to sell her Izzy's for 3 Jill
|
||||||
|
create_sell_order( bob_id, _jill(700), _izzy(200) ); // Bob is buying up to 200 Izzy's for up to 3.5 Jill
|
||||||
|
|
||||||
|
// 100 Izzys and 300 Jills are matched, so the fees should be
|
||||||
|
// 1 Izzy (1%) and 6 Jill (2%).
|
||||||
|
|
||||||
|
auto claim_fees = [&]( account_id_type issuer, asset amount_to_claim )
|
||||||
|
{
|
||||||
|
asset_claim_fees_operation claim_op;
|
||||||
|
claim_op.issuer = issuer;
|
||||||
|
claim_op.amount_to_claim = amount_to_claim;
|
||||||
|
signed_transaction tx;
|
||||||
|
tx.operations.push_back( claim_op );
|
||||||
|
db.current_fee_schedule().set_fee( tx.operations.back() );
|
||||||
|
set_expiration( db, tx );
|
||||||
|
fc::ecc::private_key my_pk = (issuer == izzy_id) ? izzy_private_key : jill_private_key;
|
||||||
|
fc::ecc::private_key your_pk = (issuer == izzy_id) ? jill_private_key : izzy_private_key;
|
||||||
|
sign( tx, your_pk );
|
||||||
|
GRAPHENE_REQUIRE_THROW( PUSH_TX( db, tx ), fc::exception );
|
||||||
|
tx.signatures.clear();
|
||||||
|
sign( tx, my_pk );
|
||||||
|
PUSH_TX( db, tx );
|
||||||
|
};
|
||||||
|
|
||||||
|
{
|
||||||
|
const asset_object& izzycoin = izzycoin_id(db);
|
||||||
|
const asset_object& jillcoin = jillcoin_id(db);
|
||||||
|
|
||||||
|
//wdump( (izzycoin)(izzycoin.dynamic_asset_data_id(db))((*izzycoin.bitasset_data_id)(db)) );
|
||||||
|
//wdump( (jillcoin)(jillcoin.dynamic_asset_data_id(db))((*jillcoin.bitasset_data_id)(db)) );
|
||||||
|
|
||||||
|
// check the correct amount of fees has been awarded
|
||||||
|
BOOST_CHECK( izzycoin.dynamic_asset_data_id(db).accumulated_fees == _izzy(1).amount );
|
||||||
|
BOOST_CHECK( jillcoin.dynamic_asset_data_id(db).accumulated_fees == _jill(6).amount );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// can't claim before hardfork
|
||||||
|
GRAPHENE_REQUIRE_THROW( claim_fees( izzy_id, _izzy(1) ), fc::exception );
|
||||||
|
generate_blocks( HARDFORK_413_TIME );
|
||||||
|
while( db.head_block_time() <= HARDFORK_413_TIME )
|
||||||
|
{
|
||||||
|
generate_block();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
const asset_object& izzycoin = izzycoin_id(db);
|
||||||
|
const asset_object& jillcoin = jillcoin_id(db);
|
||||||
|
|
||||||
|
// can't claim more than balance
|
||||||
|
GRAPHENE_REQUIRE_THROW( claim_fees( izzy_id, _izzy(1) + izzy_satoshi ), fc::exception );
|
||||||
|
GRAPHENE_REQUIRE_THROW( claim_fees( jill_id, _jill(6) + jill_satoshi ), fc::exception );
|
||||||
|
|
||||||
|
// can't claim asset that doesn't belong to you
|
||||||
|
GRAPHENE_REQUIRE_THROW( claim_fees( jill_id, izzy_satoshi ), fc::exception );
|
||||||
|
GRAPHENE_REQUIRE_THROW( claim_fees( izzy_id, jill_satoshi ), fc::exception );
|
||||||
|
|
||||||
|
// can claim asset in one go
|
||||||
|
claim_fees( izzy_id, _izzy(1) );
|
||||||
|
GRAPHENE_REQUIRE_THROW( claim_fees( izzy_id, izzy_satoshi ), fc::exception );
|
||||||
|
BOOST_CHECK( izzycoin.dynamic_asset_data_id(db).accumulated_fees == _izzy(0).amount );
|
||||||
|
|
||||||
|
// can claim in multiple goes
|
||||||
|
claim_fees( jill_id, _jill(4) );
|
||||||
|
BOOST_CHECK( jillcoin.dynamic_asset_data_id(db).accumulated_fees == _jill(2).amount );
|
||||||
|
GRAPHENE_REQUIRE_THROW( claim_fees( jill_id, _jill(2) + jill_satoshi ), fc::exception );
|
||||||
|
claim_fees( jill_id, _jill(2) );
|
||||||
|
BOOST_CHECK( jillcoin.dynamic_asset_data_id(db).accumulated_fees == _jill(0).amount );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
FC_LOG_AND_RETHROW()
|
||||||
|
}
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////
|
||||||
// cashback_test infrastructure //
|
// cashback_test infrastructure //
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue