2023-10-04 18:18:11 +02:00
// Copyright (c) 2014-2023 Zano Project
2023-03-09 19:49:40 +01:00
// Copyright (c) 2014-2018 The Louisdor Project
// Distributed under the MIT/X11 software license, see the accompanying
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
# include "chaingen.h"
# include "ionic_swap_tests.h"
# include "wallet_test_core_proxy.h"
# include "random_helper.h"
# include "tx_builder.h"
ionic_swap_basic_test : : ionic_swap_basic_test ( )
{
REGISTER_CALLBACK_METHOD ( ionic_swap_basic_test , configure_core ) ;
REGISTER_CALLBACK_METHOD ( ionic_swap_basic_test , c1 ) ;
m_hardforks . set_hardfork_height ( 1 , 1 ) ;
m_hardforks . set_hardfork_height ( 2 , 1 ) ;
m_hardforks . set_hardfork_height ( 3 , 1 ) ;
m_hardforks . set_hardfork_height ( 4 , 2 ) ;
}
2023-03-13 22:14:39 +01:00
bool ionic_swap_basic_test : : generate ( std : : vector < test_event_entry > & events ) const
2023-03-09 19:49:40 +01:00
{
2023-10-06 15:31:36 +02:00
uint64_t ts = test_core_time : : get_time ( ) ;
2023-03-09 19:49:40 +01:00
m_accounts . resize ( TOTAL_ACCS_COUNT ) ;
2023-04-18 16:55:00 +02:00
currency : : account_base & miner_acc = m_accounts [ MINER_ACC_IDX ] ; miner_acc . generate ( ) ; miner_acc . set_createtime ( ts ) ;
currency : : account_base & alice_acc = m_accounts [ ALICE_ACC_IDX ] ; alice_acc . generate ( ) ; alice_acc . set_createtime ( ts ) ;
currency : : account_base & bob_acc = m_accounts [ BOB_ACC_IDX ] ; bob_acc . generate ( ) ; bob_acc . set_createtime ( ts ) ;
2023-03-09 19:49:40 +01:00
//account_base& carol_acc = m_accounts[CAROL_ACC_IDX]; carol_acc.generate(); carol_acc.set_createtime(ts);
MAKE_GENESIS_BLOCK ( events , blk_0 , miner_acc , ts ) ;
DO_CALLBACK ( events , " configure_core " ) ; // default configure_core callback will initialize core runtime config with m_hardforks
REWIND_BLOCKS_N ( events , blk_0r , blk_0 , miner_acc , CURRENCY_MINED_MONEY_UNLOCK_WINDOW + 3 ) ;
DO_CALLBACK ( events , " c1 " ) ;
return true ;
}
2023-04-18 16:55:00 +02:00
bool ionic_swap_basic_test : : c1 ( currency : : core & c , size_t ev_index , const std : : vector < test_event_entry > & events )
2023-03-09 19:49:40 +01:00
{
bool r = false ;
std : : shared_ptr < tools : : wallet2 > miner_wlt = init_playtime_test_wallet ( events , c , MINER_ACC_IDX ) ;
2023-10-06 15:31:36 +02:00
std : : shared_ptr < tools : : wallet2 > alice_wlt = init_playtime_test_wallet ( events , c , ALICE_ACC_IDX ) ;
std : : shared_ptr < tools : : wallet2 > bob_wlt = init_playtime_test_wallet ( events , c , BOB_ACC_IDX ) ;
2023-03-09 19:49:40 +01:00
// check passing over the hardfork
2023-04-18 20:07:33 +02:00
CHECK_AND_ASSERT_MES ( c . get_blockchain_storage ( ) . is_hardfork_active ( ZANO_HARDFORK_04_ZARCANUM ) , false , " ZANO_HARDFORK_04_ZARCANUM is active " ) ;
2023-03-09 19:49:40 +01:00
2023-03-13 22:14:39 +01:00
miner_wlt - > refresh ( ) ;
2023-04-18 16:55:00 +02:00
currency : : asset_descriptor_base adb = AUTO_VAL_INIT ( adb ) ;
2023-10-06 15:31:36 +02:00
adb . total_max_supply = 1000000 * COIN ; //1M coins
2023-03-13 22:14:39 +01:00
adb . full_name = " Test coins " ;
adb . ticker = " TCT " ;
adb . decimal_point = 12 ;
2023-10-06 15:31:36 +02:00
uint64_t alice_amount = adb . total_max_supply / 2 ;
uint64_t bob_amount = adb . total_max_supply / 2 ;
std : : vector < currency : : tx_destination_entry > destinations ( 4 ) ;
destinations [ 0 ] . addr . push_back ( m_accounts [ ALICE_ACC_IDX ] . get_public_address ( ) ) ;
destinations [ 0 ] . amount = alice_amount ;
2023-04-18 16:55:00 +02:00
destinations [ 0 ] . asset_id = currency : : null_pkey ;
2023-10-06 15:31:36 +02:00
destinations [ 1 ] . addr . push_back ( m_accounts [ BOB_ACC_IDX ] . get_public_address ( ) ) ;
destinations [ 1 ] . amount = bob_amount ;
2023-04-18 16:55:00 +02:00
destinations [ 1 ] . asset_id = currency : : null_pkey ;
2023-03-13 22:14:39 +01:00
2023-10-06 15:31:36 +02:00
destinations [ 2 ] = currency : : tx_destination_entry ( COIN , m_accounts [ ALICE_ACC_IDX ] . get_public_address ( ) ) ;
destinations [ 3 ] = currency : : tx_destination_entry ( COIN , m_accounts [ BOB_ACC_IDX ] . get_public_address ( ) ) ;
2023-03-13 22:14:39 +01:00
LOG_PRINT_MAGENTA ( " destinations[0].asset_id: " < < destinations [ 0 ] . asset_id , LOG_LEVEL_0 ) ;
LOG_PRINT_MAGENTA ( " destinations[1].asset_id: " < < destinations [ 1 ] . asset_id , LOG_LEVEL_0 ) ;
2023-04-18 16:55:00 +02:00
LOG_PRINT_MAGENTA ( " currency::null_pkey: " < < currency : : null_pkey , LOG_LEVEL_0 ) ;
2023-03-13 22:14:39 +01:00
currency : : transaction tx = AUTO_VAL_INIT ( tx ) ;
2023-04-18 16:55:00 +02:00
crypto : : public_key asset_id = currency : : null_pkey ;
2023-05-29 22:28:13 +02:00
miner_wlt - > deploy_new_asset ( adb , destinations , tx , asset_id ) ;
LOG_PRINT_L0 ( " Deployed new asset: " < < asset_id < < " , tx_id: " < < currency : : get_transaction_hash ( tx ) ) ;
2023-03-13 22:14:39 +01:00
2023-10-06 15:31:36 +02:00
//currency::transaction res_tx = AUTO_VAL_INIT(res_tx);
//miner_wlt->transfer(COIN, alice_wlt->get_account().get_public_address(), res_tx);
//miner_wlt->transfer(COIN, bob_wlt->get_account().get_public_address(), res_tx);
2023-04-18 20:07:33 +02:00
2023-10-06 15:31:36 +02:00
r = mine_next_pow_blocks_in_playtime ( m_accounts [ MINER_ACC_IDX ] . get_public_address ( ) , c , CURRENCY_MINED_MONEY_UNLOCK_WINDOW ) ;
2023-03-13 22:14:39 +01:00
CHECK_AND_ASSERT_MES ( r , false , " mine_next_pow_blocks_in_playtime failed " ) ;
2023-04-25 00:16:13 +02:00
bob_wlt - > refresh ( ) ;
2023-03-13 22:14:39 +01:00
alice_wlt - > refresh ( ) ;
uint64_t mined = 0 ;
2023-04-18 16:55:00 +02:00
std : : unordered_map < crypto : : public_key , tools : : wallet_public : : asset_balance_entry_base > balances ;
2023-04-25 00:16:13 +02:00
bob_wlt - > balance ( balances , mined ) ;
2023-03-13 22:14:39 +01:00
auto it_asset = balances . find ( asset_id ) ;
2023-04-18 16:55:00 +02:00
auto it_native = balances . find ( currency : : native_coin_asset_id ) ;
2023-03-13 22:14:39 +01:00
CHECK_AND_ASSERT_MES ( it_asset ! = balances . end ( ) & & it_native ! = balances . end ( ) , false , " Failed to find needed asset in result balances " ) ;
2023-10-06 15:31:36 +02:00
CHECK_AND_ASSERT_MES ( it_asset - > second . total = = bob_amount , false , " Failed to find needed asset in result balances " ) ;
2023-04-25 00:16:13 +02:00
CHECK_AND_ASSERT_MES ( it_native - > second . total = = COIN , false , " Failed to find needed asset in result balances " ) ;
2023-03-13 22:14:39 +01:00
balances . clear ( ) ;
alice_wlt - > balance ( balances , mined ) ;
it_asset = balances . find ( asset_id ) ;
2023-04-18 16:55:00 +02:00
it_native = balances . find ( currency : : native_coin_asset_id ) ;
2023-03-13 22:14:39 +01:00
2023-04-18 20:07:33 +02:00
CHECK_AND_ASSERT_MES ( it_asset ! = balances . end ( ) & & it_native ! = balances . end ( ) , false , " Failed to find needed asset in result balances " ) ;
CHECK_AND_ASSERT_MES ( it_native - > second . total = = COIN , false , " Failed to find needed asset in result balances " ) ;
2023-10-06 15:31:36 +02:00
CHECK_AND_ASSERT_MES ( it_asset - > second . total = = alice_amount , false , " Failed to find needed asset in result balances " ) ;
2023-03-13 22:14:39 +01:00
2023-03-16 19:15:11 +01:00
const uint64_t assets_to_exchange = 10 * COIN ;
2023-10-06 15:31:36 +02:00
const uint64_t native_coins_to_exchange = COIN / 2 ;
2023-03-16 19:15:11 +01:00
{
2023-10-06 15:31:36 +02:00
// Alice wants to trade with Bob, to exchange 10.0 TCT to 0.5 ZANO
2023-09-08 19:32:50 +02:00
view : : ionic_swap_proposal_info proposal_details = AUTO_VAL_INIT ( proposal_details ) ;
proposal_details . fee_paid_by_a = TESTS_DEFAULT_FEE ;
proposal_details . mixins = 10 ;
2023-10-10 19:05:52 +02:00
proposal_details . to_finalizer . push_back ( view : : asset_funds { asset_id , assets_to_exchange } ) ;
proposal_details . to_initiator . push_back ( view : : asset_funds { currency : : native_coin_asset_id , native_coins_to_exchange } ) ;
2023-09-08 19:32:50 +02:00
tools : : wallet_public : : ionic_swap_proposal proposal = AUTO_VAL_INIT ( proposal ) ;
2023-10-06 15:31:36 +02:00
alice_wlt - > create_ionic_swap_proposal ( proposal_details , m_accounts [ BOB_ACC_IDX ] . get_public_address ( ) , proposal ) ;
2023-09-08 19:32:50 +02:00
view : : ionic_swap_proposal_info proposal_decoded_info = AUTO_VAL_INIT ( proposal_decoded_info ) ;
bob_wlt - > get_ionic_swap_proposal_info ( proposal , proposal_decoded_info ) ;
//Validate proposal
2023-10-10 19:05:52 +02:00
if ( proposal_decoded_info . to_finalizer ! = proposal_details . to_finalizer
| | proposal_decoded_info . to_initiator ! = proposal_details . to_initiator
2023-09-08 19:32:50 +02:00
| | proposal_decoded_info . fee_paid_by_a ! = proposal_details . fee_paid_by_a
| | proposal_decoded_info . mixins ! = proposal_details . mixins
)
{
CHECK_AND_ASSERT_MES ( false , false , " proposal actual and proposals decoded mismatch " ) ;
}
2023-10-06 15:31:36 +02:00
2023-09-08 19:32:50 +02:00
currency : : transaction res_tx2 = AUTO_VAL_INIT ( res_tx2 ) ;
r = bob_wlt - > accept_ionic_swap_proposal ( proposal , res_tx2 ) ;
CHECK_AND_ASSERT_MES ( r , false , " Failed to accept ionic proposal " ) ;
}
2023-03-16 19:15:11 +01:00
2023-10-06 15:31:36 +02:00
r = mine_next_pow_blocks_in_playtime ( m_accounts [ MINER_ACC_IDX ] . get_public_address ( ) , c , CURRENCY_MINED_MONEY_UNLOCK_WINDOW ) ;
2023-03-16 19:15:11 +01:00
CHECK_AND_ASSERT_MES ( r , false , " mine_next_pow_blocks_in_playtime failed " ) ;
2023-10-06 15:31:36 +02:00
alice_wlt - > refresh ( ) ;
2023-03-16 19:15:11 +01:00
balances . clear ( ) ;
alice_wlt - > balance ( balances , mined ) ;
it_asset = balances . find ( asset_id ) ;
2023-04-18 16:55:00 +02:00
it_native = balances . find ( currency : : native_coin_asset_id ) ;
2023-03-16 19:15:11 +01:00
CHECK_AND_ASSERT_MES ( it_asset ! = balances . end ( ) , false , " Failed to find needed asset in result balances " ) ;
2023-10-06 15:31:36 +02:00
CHECK_AND_ASSERT_MES ( it_native - > second . total = = native_coins_to_exchange + COIN - TESTS_DEFAULT_FEE , false , " Failed to find needed asset in result balances " ) ;
CHECK_AND_ASSERT_MES ( it_asset - > second . total = = alice_amount - assets_to_exchange , false , " Failed to find needed asset in result balances " ) ;
2023-03-16 19:15:11 +01:00
2023-10-06 15:31:36 +02:00
bob_wlt - > refresh ( ) ;
2023-03-16 19:15:11 +01:00
balances . clear ( ) ;
2023-04-25 00:16:13 +02:00
bob_wlt - > balance ( balances , mined ) ;
it_asset = balances . find ( asset_id ) ;
it_native = balances . find ( currency : : native_coin_asset_id ) ;
2023-03-16 19:15:11 +01:00
CHECK_AND_ASSERT_MES ( it_asset ! = balances . end ( ) , false , " Failed to find needed asset in result balances " ) ;
2023-10-06 15:31:36 +02:00
CHECK_AND_ASSERT_MES ( it_native - > second . total = = COIN - native_coins_to_exchange , false , " Failed to find needed asset in result balances " ) ;
CHECK_AND_ASSERT_MES ( it_asset - > second . total = = bob_amount + assets_to_exchange , false , " Failed to find needed asset in result balances " ) ;
2023-04-20 22:08:20 +02:00
2023-09-08 19:32:50 +02:00
{
2023-10-06 15:31:36 +02:00
//now Alice want to trade with Bob, to send 0.5 ZANO and get 10.0 TCT in exchange
2023-09-08 19:32:50 +02:00
view : : ionic_swap_proposal_info proposal_details = AUTO_VAL_INIT ( proposal_details ) ;
proposal_details . fee_paid_by_a = TESTS_DEFAULT_FEE ;
proposal_details . mixins = 10 ;
2023-10-10 19:05:52 +02:00
proposal_details . to_finalizer . push_back ( view : : asset_funds { currency : : native_coin_asset_id , native_coins_to_exchange } ) ;
proposal_details . to_initiator . push_back ( view : : asset_funds { asset_id , assets_to_exchange } ) ;
2023-09-08 19:32:50 +02:00
tools : : wallet_public : : ionic_swap_proposal proposal = AUTO_VAL_INIT ( proposal ) ;
2023-10-06 15:31:36 +02:00
alice_wlt - > create_ionic_swap_proposal ( proposal_details , m_accounts [ BOB_ACC_IDX ] . get_public_address ( ) , proposal ) ;
2023-09-08 19:32:50 +02:00
view : : ionic_swap_proposal_info proposal_decoded_info = AUTO_VAL_INIT ( proposal_decoded_info ) ;
bob_wlt - > get_ionic_swap_proposal_info ( proposal , proposal_decoded_info ) ;
//Validate proposal
2023-10-10 19:05:52 +02:00
if ( proposal_decoded_info . to_finalizer ! = proposal_details . to_finalizer
| | proposal_decoded_info . to_initiator ! = proposal_details . to_initiator
2023-09-08 19:32:50 +02:00
| | proposal_decoded_info . fee_paid_by_a ! = proposal_details . fee_paid_by_a
| | proposal_decoded_info . mixins ! = proposal_details . mixins
)
{
CHECK_AND_ASSERT_MES ( false , false , " proposal actual and proposals decoded mismatch " ) ;
}
2023-10-06 15:31:36 +02:00
2023-09-08 19:32:50 +02:00
currency : : transaction res_tx2 = AUTO_VAL_INIT ( res_tx2 ) ;
r = bob_wlt - > accept_ionic_swap_proposal ( proposal , res_tx2 ) ;
CHECK_AND_ASSERT_MES ( r , false , " Failed to accept ionic proposal " ) ;
}
2023-10-06 15:31:36 +02:00
r = mine_next_pow_blocks_in_playtime ( m_accounts [ MINER_ACC_IDX ] . get_public_address ( ) , c , CURRENCY_MINED_MONEY_UNLOCK_WINDOW ) ;
2023-09-08 19:32:50 +02:00
CHECK_AND_ASSERT_MES ( r , false , " mine_next_pow_blocks_in_playtime failed " ) ;
2023-10-06 15:31:36 +02:00
alice_wlt - > refresh ( ) ;
2023-09-08 19:32:50 +02:00
balances . clear ( ) ;
alice_wlt - > balance ( balances , mined ) ;
it_asset = balances . find ( asset_id ) ;
it_native = balances . find ( currency : : native_coin_asset_id ) ;
CHECK_AND_ASSERT_MES ( it_asset ! = balances . end ( ) , false , " Failed to find needed asset in result balances " ) ;
2023-10-06 15:31:36 +02:00
CHECK_AND_ASSERT_MES ( it_native - > second . total = = native_coins_to_exchange + COIN - TESTS_DEFAULT_FEE * 2 - native_coins_to_exchange , false , " Failed to find needed asset in result balances " ) ;
CHECK_AND_ASSERT_MES ( it_asset - > second . total = = alice_amount , false , " Failed to find needed asset in result balances " ) ;
2023-09-08 19:32:50 +02:00
2023-10-06 15:31:36 +02:00
bob_wlt - > refresh ( ) ;
2023-09-08 19:32:50 +02:00
balances . clear ( ) ;
bob_wlt - > balance ( balances , mined ) ;
it_asset = balances . find ( asset_id ) ;
it_native = balances . find ( currency : : native_coin_asset_id ) ;
CHECK_AND_ASSERT_MES ( it_asset ! = balances . end ( ) , false , " Failed to find needed asset in result balances " ) ;
2023-10-06 15:31:36 +02:00
CHECK_AND_ASSERT_MES ( it_native - > second . total = = COIN - native_coins_to_exchange + native_coins_to_exchange , false , " Failed to find needed asset in result balances " ) ;
CHECK_AND_ASSERT_MES ( it_asset - > second . total = = bob_amount , false , " Failed to find needed asset in result balances " ) ;
2023-09-08 19:32:50 +02:00
2023-04-20 22:08:20 +02:00
//TODO:
// add fee paid by bob scenario
// add transfer of tokens without native coins
// different fail combination
2023-03-09 19:49:40 +01:00
return true ;
}