uia_tests.cpp: Implement transfer_restricted_test

This commit is contained in:
theoreticalbts 2015-07-17 20:27:18 -04:00
parent 5655d47a6f
commit c67acc0cf5
3 changed files with 83 additions and 5 deletions

View file

@ -84,6 +84,7 @@ namespace graphene { namespace chain {
GRAPHENE_DECLARE_OP_EVALUATE_EXCEPTION( from_account_not_whitelisted, transfer, 1, "owner mismatch" )
GRAPHENE_DECLARE_OP_EVALUATE_EXCEPTION( to_account_not_whitelisted, transfer, 2, "owner mismatch" )
GRAPHENE_DECLARE_OP_EVALUATE_EXCEPTION( restricted_transfer_asset, transfer, 3, "restricted transfer asset" )
//GRAPHENE_DECLARE_OP_BASE_EXCEPTIONS( limit_order_create );
//GRAPHENE_DECLARE_OP_BASE_EXCEPTIONS( limit_order_cancel );

View file

@ -54,7 +54,14 @@ void_result transfer_evaluator::do_evaluate( const transfer_operation& op )
FC_ASSERT( from_account.is_authorized_asset( asset_type ) );
if( asset_type.is_transfer_restricted() )
FC_ASSERT( from_account.id == asset_type.issuer || to_account.id == asset_type.issuer );
{
GRAPHENE_ASSERT(
from_account.id == asset_type.issuer || to_account.id == asset_type.issuer,
transfer_restricted_transfer_asset,
"Asset {asset} has transfer_restricted flag enabled",
("asset", op.amount.asset_id)
);
}
bool insufficient_balance = d.get_balance( from_account, asset_type ).amount >= op.amount.amount;
FC_ASSERT( insufficient_balance,

View file

@ -286,14 +286,84 @@ BOOST_AUTO_TEST_CASE( transfer_whitelist_uia )
}
}
/**
* verify that issuers can halt transfers
*/
BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES( unimp_halt_transfers_flag_test, 1 )
BOOST_AUTO_TEST_CASE( unimp_halt_transfers_flag_test )
BOOST_AUTO_TEST_CASE( transfer_restricted_test )
{
BOOST_FAIL( "not implemented" );
try
{
ACTORS( (sam)(alice)(bob) );
BOOST_TEST_MESSAGE( "Issuing 1000 UIA to Alice" );
auto _issue_uia = [&]( const account_object& recipient, asset amount )
{
asset_issue_operation op;
op.issuer = amount.asset_id(db).issuer;
op.asset_to_issue = amount;
op.issue_to_account = recipient.id;
transaction tx;
tx.operations.push_back( op );
tx.set_expiration( db.head_block_time() + fc::minutes(5) );
PUSH_TX( db, tx, database::skip_authority_check | database::skip_tapos_check | database::skip_transaction_signatures );
} ;
asset fee;
account_id_type issuer;
asset_id_type asset_to_update;
/// If the asset is to be given a new issuer, specify his ID here.
optional<account_id_type> new_issuer;
asset_options new_options;
extensions_type extensions;
const asset_object& uia = create_user_issued_asset( "TXRX", sam, transfer_restricted );
_issue_uia( alice, uia.amount( 1000 ) );
auto _restrict_xfer = [&]( bool xfer_flag )
{
asset_update_operation op;
op.issuer = sam_id;
op.asset_to_update = uia.id;
op.new_options = uia.options;
if( xfer_flag )
op.new_options.flags |= transfer_restricted;
else
op.new_options.flags &= ~transfer_restricted;
transaction tx;
tx.operations.push_back( op );
tx.set_expiration( db.head_block_time() + fc::minutes(5) );
PUSH_TX( db, tx, database::skip_authority_check | database::skip_tapos_check | database::skip_transaction_signatures );
} ;
BOOST_TEST_MESSAGE( "Enable transfer_restricted, send fails" );
transfer_operation xfer_op;
xfer_op.from = alice_id;
xfer_op.to = bob_id;
xfer_op.amount = uia.amount(100);
signed_transaction xfer_tx;
xfer_tx.operations.push_back( xfer_op );
xfer_tx.set_expiration( db.head_block_time() + fc::minutes(5) );
sign( xfer_tx, alice_private_key );
_restrict_xfer( true );
GRAPHENE_REQUIRE_THROW( PUSH_TX( db, xfer_tx ), transfer_restricted_transfer_asset );
BOOST_TEST_MESSAGE( "Disable transfer_restricted, send succeeds" );
_restrict_xfer( false );
PUSH_TX( db, xfer_tx );
xfer_op.amount = uia.amount(101);
}
catch(fc::exception& e)
{
edump((e.to_detail_string()));
throw;
}
}