pallet asset-conversion additional quote tests (#1371)

* added identity quote test (only possible if fees are not included in quote)
* add tests that compare quoted price to actual execution
This commit is contained in:
Squirrel
2023-09-06 15:00:53 +01:00
committed by GitHub
parent 68ab943c65
commit 4c077b209b
@@ -569,6 +569,16 @@ fn can_quote_price() {
),
Some(60)
);
// including fee so should get less out...
assert_eq!(
AssetConversion::quote_price_exact_tokens_for_tokens(
NativeOrAssetId::Native,
NativeOrAssetId::Asset(2),
3000,
true,
),
Some(46)
);
// Check it still gives same price:
// (if the above accidentally exchanged then it would not give same quote as before)
assert_eq!(
@@ -580,6 +590,16 @@ fn can_quote_price() {
),
Some(60)
);
// including fee so should get less out...
assert_eq!(
AssetConversion::quote_price_exact_tokens_for_tokens(
NativeOrAssetId::Native,
NativeOrAssetId::Asset(2),
3000,
true,
),
Some(46)
);
// Check inverse:
assert_eq!(
@@ -591,6 +611,247 @@ fn can_quote_price() {
),
Some(3000)
);
// including fee so should get less out...
assert_eq!(
AssetConversion::quote_price_exact_tokens_for_tokens(
NativeOrAssetId::Asset(2),
NativeOrAssetId::Native,
60,
true,
),
Some(2302)
);
//
// same tests as above but for quote_price_tokens_for_exact_tokens:
//
assert_eq!(
AssetConversion::quote_price_tokens_for_exact_tokens(
NativeOrAssetId::Native,
NativeOrAssetId::Asset(2),
60,
false,
),
Some(3000)
);
// including fee so should need to put more in...
assert_eq!(
AssetConversion::quote_price_tokens_for_exact_tokens(
NativeOrAssetId::Native,
NativeOrAssetId::Asset(2),
60,
true,
),
Some(4299)
);
// Check it still gives same price:
// (if the above accidentally exchanged then it would not give same quote as before)
assert_eq!(
AssetConversion::quote_price_tokens_for_exact_tokens(
NativeOrAssetId::Native,
NativeOrAssetId::Asset(2),
60,
false,
),
Some(3000)
);
// including fee so should need to put more in...
assert_eq!(
AssetConversion::quote_price_tokens_for_exact_tokens(
NativeOrAssetId::Native,
NativeOrAssetId::Asset(2),
60,
true,
),
Some(4299)
);
// Check inverse:
assert_eq!(
AssetConversion::quote_price_tokens_for_exact_tokens(
NativeOrAssetId::Asset(2),
NativeOrAssetId::Native,
3000,
false,
),
Some(60)
);
// including fee so should need to put more in...
assert_eq!(
AssetConversion::quote_price_tokens_for_exact_tokens(
NativeOrAssetId::Asset(2),
NativeOrAssetId::Native,
3000,
true,
),
Some(86)
);
//
// roundtrip: Without fees one should get the original number
//
let amount_in = 100;
assert_eq!(
AssetConversion::quote_price_exact_tokens_for_tokens(
NativeOrAssetId::Asset(2),
NativeOrAssetId::Native,
amount_in,
false,
)
.and_then(|amount| AssetConversion::quote_price_exact_tokens_for_tokens(
NativeOrAssetId::Native,
NativeOrAssetId::Asset(2),
amount,
false,
)),
Some(amount_in)
);
assert_eq!(
AssetConversion::quote_price_exact_tokens_for_tokens(
NativeOrAssetId::Native,
NativeOrAssetId::Asset(2),
amount_in,
false,
)
.and_then(|amount| AssetConversion::quote_price_exact_tokens_for_tokens(
NativeOrAssetId::Asset(2),
NativeOrAssetId::Native,
amount,
false,
)),
Some(amount_in)
);
assert_eq!(
AssetConversion::quote_price_tokens_for_exact_tokens(
NativeOrAssetId::Asset(2),
NativeOrAssetId::Native,
amount_in,
false,
)
.and_then(|amount| AssetConversion::quote_price_tokens_for_exact_tokens(
NativeOrAssetId::Native,
NativeOrAssetId::Asset(2),
amount,
false,
)),
Some(amount_in)
);
assert_eq!(
AssetConversion::quote_price_tokens_for_exact_tokens(
NativeOrAssetId::Native,
NativeOrAssetId::Asset(2),
amount_in,
false,
)
.and_then(|amount| AssetConversion::quote_price_tokens_for_exact_tokens(
NativeOrAssetId::Asset(2),
NativeOrAssetId::Native,
amount,
false,
)),
Some(amount_in)
);
});
}
#[test]
fn quote_price_exact_tokens_for_tokens_matches_execution() {
new_test_ext().execute_with(|| {
let user = 1;
let user2 = 2;
let token_1 = NativeOrAssetId::Native;
let token_2 = NativeOrAssetId::Asset(2);
create_tokens(user, vec![token_2]);
assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2));
assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 100000));
assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000));
assert_ok!(AssetConversion::add_liquidity(
RuntimeOrigin::signed(user),
token_1,
token_2,
10000,
200,
1,
1,
user,
));
let amount = 1;
let quoted_price = 49;
assert_eq!(
AssetConversion::quote_price_exact_tokens_for_tokens(token_2, token_1, amount, true,),
Some(quoted_price)
);
assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user2, amount));
let prior_dot_balance = 20000;
assert_eq!(prior_dot_balance, balance(user2, token_1));
assert_ok!(AssetConversion::swap_exact_tokens_for_tokens(
RuntimeOrigin::signed(user2),
bvec![token_2, token_1],
amount,
1,
user2,
false,
));
assert_eq!(prior_dot_balance + quoted_price, balance(user2, token_1));
});
}
#[test]
fn quote_price_tokens_for_exact_tokens_matches_execution() {
new_test_ext().execute_with(|| {
let user = 1;
let user2 = 2;
let token_1 = NativeOrAssetId::Native;
let token_2 = NativeOrAssetId::Asset(2);
create_tokens(user, vec![token_2]);
assert_ok!(AssetConversion::create_pool(RuntimeOrigin::signed(user), token_1, token_2));
assert_ok!(Balances::force_set_balance(RuntimeOrigin::root(), user, 100000));
assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user, 1000));
assert_ok!(AssetConversion::add_liquidity(
RuntimeOrigin::signed(user),
token_1,
token_2,
10000,
200,
1,
1,
user,
));
let amount = 49;
let quoted_price = 1;
assert_eq!(
AssetConversion::quote_price_tokens_for_exact_tokens(token_2, token_1, amount, true,),
Some(quoted_price)
);
assert_ok!(Assets::mint(RuntimeOrigin::signed(user), 2, user2, amount));
let prior_dot_balance = 20000;
assert_eq!(prior_dot_balance, balance(user2, token_1));
let prior_asset_balance = 49;
assert_eq!(prior_asset_balance, balance(user2, token_2));
assert_ok!(AssetConversion::swap_tokens_for_exact_tokens(
RuntimeOrigin::signed(user2),
bvec![token_2, token_1],
amount,
1,
user2,
false,
));
assert_eq!(prior_dot_balance + amount, balance(user2, token_1));
assert_eq!(prior_asset_balance - quoted_price, balance(user2, token_2));
});
}