create_realistic_atom_usdt_sell_orders_from_spreadsheet, create_realistic_eth_usdt_buy_orders_from_spreadsheet,
create_realistic_eth_usdt_sell_orders_from_spreadsheet, create_realistic_inj_usdt_buy_orders_from_spreadsheet,
create_realistic_inj_usdt_sell_orders_from_spreadsheet, create_realistic_limit_order, create_realistic_usdt_usdc_both_side_orders,
human_to_dec, init_rich_account, init_self_relaying_contract_and_get_address, initial_coin, launch_realistic_atom_usdt_spot_market,
launch_realistic_inj_usdt_spot_market, launch_realistic_ninja_inj_spot_market, launch_realistic_usdt_usdc_spot_market,
launch_realistic_weth_usdt_spot_market, must_init_account_with_funds_and_setting_denoms, query_all_bank_balances, query_bank_balance,
set_route_and_assert_success, str_coin, Decimals, OrderSide, ATOM, ETH, INJ, INJ_2, NINJA, USDC, USDT,
focuses on swaps requesting exact amount. This works as expected apart, when we are converting very
https://docs.google.com/spreadsheets/d/1-0epjX580nDO_P2mm1tSjhvjJVppsvrO1BC4_wsBeyA/edit?usp=sharing
exact_two_hop_eth_atom_swap_test_template(human_to_dec("0.01", Decimals::Six), Percent("2200"))
let _signer = must_init_account_with_funds_and_setting_denoms(&app, &validator, &[initial_coin("1", INJ, Decimals::Eighteen)]);
let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]);
create_realistic_eth_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2);
create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3);
let expected_difference = human_to_dec(eth_to_swap, Decimals::Eighteen) - query_result.result_quantity;
assert_eq!(swapper_eth_balance_after, expected_difference, "wrong amount of ETH was exchanged");
are_fpdecimals_approximately_equal(swapper_atom_balance_after, exact_quantity_to_receive, one_percent_diff,),
"swapper did not receive expected exact amount +/- 1% -> expected: {} ATOM, actual: {} ATOM, max diff: {} ATOM",
let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str());
let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str());
"Contract lost some money after swap. Actual balance: {contract_usdt_balance_after}, previous balance: {contract_usdt_balance_before}",
are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,),
exact_two_hop_inj_atom_swap_test_template(human_to_dec("612", Decimals::Six), Percent("0.01"))
let _signer = must_init_account_with_funds_and_setting_denoms(&app, &validator, &[initial_coin("1", INJ, Decimals::Eighteen)]);
let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]);
create_realistic_inj_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2);
create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3);
let expected_difference = human_to_dec(inj_to_swap, Decimals::Eighteen) - query_result.result_quantity;
assert_eq!(swapper_inj_balance_after, expected_difference, "wrong amount of INJ was exchanged");
let one_percent_diff = exact_quantity_to_receive * (FPDecimal::must_from_str(max_diff_percentage.0) / FPDecimal::from(100u128));
are_fpdecimals_approximately_equal(swapper_atom_balance_after, exact_quantity_to_receive, one_percent_diff,),
"swapper did not receive expected exact ATOM amount +/- {}% -> expected: {} ATOM, actual: {} ATOM, max diff: {} ATOM",
let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str());
let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str());
"Contract lost some money after swap. Actual balance: {contract_usdt_balance_after}, previous balance: {contract_usdt_balance_before}",
are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,),
"Contract balance changed too much. Actual balance: {} USDT, previous balance: {} USDT. Max diff: {} USDT",
exact_two_hop_inj_eth_swap_test_template(human_to_dec("0.001", Decimals::Eighteen), Percent("0"))
exact_two_hop_inj_eth_swap_test_template(human_to_dec("0.012", Decimals::Eighteen), Percent("0"))
exact_two_hop_inj_eth_swap_test_template(human_to_dec("0.1", Decimals::Eighteen), Percent("0"))
exact_two_hop_inj_eth_swap_test_template(human_to_dec("3.1", Decimals::Eighteen), Percent("0"))
let _signer = must_init_account_with_funds_and_setting_denoms(&app, &validator, &[initial_coin("1", INJ, Decimals::Eighteen)]);
let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]);
create_realistic_inj_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2);
create_realistic_eth_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3);
let expected_difference = human_to_dec(inj_to_swap, Decimals::Eighteen) - query_result.result_quantity;
assert_eq!(swapper_inj_balance_after, expected_difference, "wrong amount of INJ was exchanged");
let one_percent_diff = exact_quantity_to_receive * (FPDecimal::must_from_str(max_diff_percent.0) / FPDecimal::from(100u128));
are_fpdecimals_approximately_equal(swapper_atom_balance_after, exact_quantity_to_receive, one_percent_diff,),
"swapper did not receive expected exact ETH amount +/- {}% -> expected: {} ETH, actual: {} ETH, max diff: {} ETH",
let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str());
let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str());
"Contract lost some money after swap. Actual balance: {contract_usdt_balance_after}, previous balance: {contract_usdt_balance_before}",
are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,),
"Contract balance changed too much. Actual balance: {} USDT, previous balance: {} USDT. Max diff: {} USDT",
let _signer = must_init_account_with_funds_and_setting_denoms(&app, &validator, &[initial_coin("1", INJ, Decimals::Eighteen)]);
create_realistic_inj_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2);
are_fpdecimals_approximately_equal(expected_input_quantity, query_result.result_quantity, max_diff),
"incorrect swap result estimate returned by query. Expected: {} INJ, actual: {} INJ, max diff: {} INJ",
assert_fee_is_as_expected(&mut query_result.expected_fees, &mut expected_fees, human_to_dec("0.1", Decimals::Six));
let expected_inj_leftover = human_to_dec(inj_to_swap, Decimals::Eighteen) - expected_input_quantity;
assert_eq!(from_balance, expected_inj_leftover, "incorrect original amount was left after swap");
let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str());
let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str());
are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,),
"Contract balance changed too much. Actual balance: {} USDT, previous balance: {} USDT. Max diff: {} USDT",
let contract_usdc_balance_before = FPDecimal::must_from_str(contract_balances_before[1].amount.as_str());
let contract_usdc_balance_after = FPDecimal::must_from_str(contract_balances_after[1].amount.as_str());
are_fpdecimals_approximately_equal(contract_usdc_balance_after, contract_usdc_balance_before, max_diff,),
"Contract balance changed too much. Actual balance: {} USDC, previous balance: {} USDC. Max diff: {} USDC",
let _signer = must_init_account_with_funds_and_setting_denoms(&app, &validator, &[initial_coin("1", INJ, Decimals::Eighteen)]);
assert_eq!(to_balance_before, expected_to_balance_before, "incorrect target amount after swap");
assert_eq!(to_balance_after, expected_to_balance_after, "incorrect target amount after swap");
let _signer = must_init_account_with_funds_and_setting_denoms(&app, &validator, &[initial_coin("1", INJ, Decimals::Eighteen)]);
let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]);
create_realistic_eth_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2);
create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3);
let contract_balance_usdt_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str());
let contract_balance_usdt_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str());
"Contract lost some money after swap. Starting balance: {contract_balance_usdt_after}, Current balance: {contract_balance_usdt_before}",
// single swap with the same values results in < 0.7 USDT earning, so we expected that 100 same swaps
are_fpdecimals_approximately_equal(contract_balance_usdt_after, contract_balance_usdt_before, max_diff,),
let _signer = must_init_account_with_funds_and_setting_denoms(&app, &validator, &[initial_coin("1", INJ, Decimals::Eighteen)]);
let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]);
create_realistic_inj_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2);
create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3);
let swapper_inj_balance_before = query_bank_balance(&bank, INJ_2, swapper.address().as_str());
.contains("Provided amount of 608000000000000000000 is below required amount of 609714000000000000000"),
let swapper_inj_balance_after = query_bank_balance(&bank, INJ_2, swapper.address().as_str());
let swapper_atom_balance_after = query_bank_balance(&bank, ATOM, swapper.address().as_str());
assert_eq!(swapper_inj_balance_before, swapper_inj_balance_after, "some amount of INJ was exchanged");
let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str());
let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str());
fn exact_two_hop_eth_atom_swap_test_template(exact_quantity_to_receive: FPDecimal, max_diff_percentage: Percent) {
let _signer = must_init_account_with_funds_and_setting_denoms(&app, &validator, &[initial_coin("1", INJ, Decimals::Eighteen)]);
let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]);
create_realistic_eth_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2);
create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3);
assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances");
let expected_difference = human_to_dec(eth_to_swap, Decimals::Eighteen) - query_result.result_quantity;
let swapper_atom_balance_after = query_bank_balance(&bank, ATOM, swapper.address().as_str());
assert_eq!(swapper_eth_balance_after, expected_difference, "wrong amount of ETH was exchanged");
let one_percent_diff = exact_quantity_to_receive * (FPDecimal::must_from_str(max_diff_percentage.0) / FPDecimal::from(100u128));
are_fpdecimals_approximately_equal(swapper_atom_balance_after, exact_quantity_to_receive, one_percent_diff,),
"swapper did not receive expected exact amount +/- {}% -> expected: {} ATOM, actual: {} ATOM, max diff: {} ATOM",
assert_eq!(contract_balances_after.len(), 1, "wrong number of denoms in contract balances");
let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str());
let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str());
"Contract lost some money after swap. Actual balance: {contract_usdt_balance_after}, previous balance: {contract_usdt_balance_before}",
are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,),
"Contract balance changed too much. Actual balance: {} USDT, previous balance: {} USDT. Max diff: {} USDT",
fn exact_two_hop_inj_atom_swap_test_template(exact_quantity_to_receive: FPDecimal, max_diff_percentage: Percent) {
let _signer = must_init_account_with_funds_and_setting_denoms(&app, &validator, &[initial_coin("1", INJ, Decimals::Eighteen)]);
let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]);
create_realistic_inj_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2);
create_realistic_atom_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3);
assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances");
let expected_difference = human_to_dec(inj_to_swap, Decimals::Eighteen) - query_result.result_quantity;
let swapper_inj_balance_after = query_bank_balance(&bank, INJ_2, swapper.address().as_str());
let swapper_atom_balance_after = query_bank_balance(&bank, ATOM, swapper.address().as_str());
assert_eq!(swapper_inj_balance_after, expected_difference, "wrong amount of INJ was exchanged");
let one_percent_diff = exact_quantity_to_receive * (FPDecimal::must_from_str(max_diff_percentage.0) / FPDecimal::from(100u128));
are_fpdecimals_approximately_equal(swapper_atom_balance_after, exact_quantity_to_receive, one_percent_diff,),
"swapper did not receive expected exact ATOM amount +/- {}% -> expected: {} ATOM, actual: {} ATOM, max diff: {} ATOM",
assert_eq!(contract_balances_after.len(), 1, "wrong number of denoms in contract balances");
let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str());
let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str());
"Contract lost some money after swap. Actual balance: {contract_usdt_balance_after}, previous balance: {contract_usdt_balance_before}",
are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,),
"Contract balance changed too much. Actual balance: {} USDT, previous balance: {} USDT. Max diff: {} USDT",
fn exact_two_hop_inj_eth_swap_test_template(exact_quantity_to_receive: FPDecimal, max_diff_percentage: Percent) {
let _signer = must_init_account_with_funds_and_setting_denoms(&app, &validator, &[initial_coin("1", INJ, Decimals::Eighteen)]);
let contr_addr = init_self_relaying_contract_and_get_address(&wasm, &owner, &[str_coin("1_000", USDT, Decimals::Six)]);
create_realistic_inj_usdt_buy_orders_from_spreadsheet(&app, &spot_market_1_id, &trader1, &trader2);
create_realistic_eth_usdt_sell_orders_from_spreadsheet(&app, &spot_market_2_id, &trader1, &trader2, &trader3);
assert_eq!(contract_balances_before.len(), 1, "wrong number of denoms in contract balances");
let expected_difference = human_to_dec(inj_to_swap, Decimals::Eighteen) - query_result.result_quantity;
let swapper_inj_balance_after = query_bank_balance(&bank, INJ_2, swapper.address().as_str());
assert_eq!(swapper_inj_balance_after, expected_difference, "wrong amount of INJ was exchanged");
let one_percent_diff = exact_quantity_to_receive * (FPDecimal::must_from_str(max_diff_percentage.0) / FPDecimal::from(100u128));
are_fpdecimals_approximately_equal(swapper_atom_balance_after, exact_quantity_to_receive, one_percent_diff,),
"swapper did not receive expected exact ETH amount +/- {}% -> expected: {} ETH, actual: {} ETH, max diff: {} ETH",
let contract_usdt_balance_before = FPDecimal::must_from_str(contract_balances_before[0].amount.as_str());
let contract_usdt_balance_after = FPDecimal::must_from_str(contract_balances_after[0].amount.as_str());
"Contract lost some money after swap. Actual balance: {contract_usdt_balance_after}, previous balance: {contract_usdt_balance_before}",
are_fpdecimals_approximately_equal(contract_usdt_balance_after, contract_usdt_balance_before, max_diff,),
"Contract balance changed too much. Actual balance: {} USDT, previous balance: {} USDT. Max diff: {} USDT",