Skip to content

Commit

Permalink
prevent alloyed asset subdenom to contain extra parts (/)
Browse files Browse the repository at this point in the history
  • Loading branch information
iboss-ptk committed Jun 14, 2024
1 parent c296205 commit 848f344
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 10 deletions.
42 changes: 42 additions & 0 deletions contracts/transmuter/src/contract.rs
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,14 @@ impl Transmuter<'_> {
// set active status to true
self.active_status.save(deps.storage, &true)?;

// subdenom must not contain extra parts
ensure!(
!alloyed_asset_subdenom.contains('/'),
ContractError::SubDenomExtraPartsNotAllowed {
subdenom: alloyed_asset_subdenom
}
);

// create alloyed denom
let msg_create_alloyed_denom = SubMsg::reply_on_success(
MsgCreateDenom {
Expand Down Expand Up @@ -894,6 +902,40 @@ mod tests {
};
use osmosis_std::types::osmosis::tokenfactory::v1beta1::MsgBurn;

#[test]
fn test_invalid_subdenom() {
let mut deps = mock_dependencies();

// make denom has non-zero total supply
deps.querier
.update_balance("someone", vec![Coin::new(1, "tbtc"), Coin::new(1, "nbtc")]);

let admin = "admin";
let moderator = "moderator";
let init_msg = InstantiateMsg {
pool_asset_configs: vec![
AssetConfig::from_denom_str("tbtc"),
AssetConfig::from_denom_str("nbtc"),
],
alloyed_asset_subdenom: "all/btc".to_string(),
alloyed_asset_normalization_factor: Uint128::one(),
admin: Some(admin.to_string()),
moderator: moderator.to_string(),
};
let env = mock_env();
let info = mock_info(admin, &[]);

// Instantiate the contract.
let err = instantiate(deps.as_mut(), env.clone(), info.clone(), init_msg).unwrap_err();

assert_eq!(
err,
ContractError::SubDenomExtraPartsNotAllowed {
subdenom: "all/btc".to_string()
}
)
}

#[test]
fn test_add_new_assets() {
let mut deps = mock_dependencies();
Expand Down
3 changes: 3 additions & 0 deletions contracts/transmuter/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@ pub enum ContractError {
#[error("Denom has no supply, it might be an invalid denom: {denom}")]
DenomHasNoSupply { denom: String },

#[error("Subdenom must not contain extra parts (separated by '/'): {subdenom}")]
SubDenomExtraPartsNotAllowed { subdenom: String },

#[error("Unable to join pool with denom: {denom}: expected one of: {expected_denom:?}")]
InvalidJoinPoolDenom {
denom: String,
Expand Down
10 changes: 5 additions & 5 deletions contracts/transmuter/src/test/cases/units/join_and_exit.rs
Original file line number Diff line number Diff line change
Expand Up @@ -94,7 +94,7 @@ fn test_join_pool_with_single_lp_should_update_shares_and_liquidity_properly() {
AssetConfig::from_denom_str("denoma"),
AssetConfig::from_denom_str("denomb"),
],
alloyed_asset_subdenom: "transmuter/poolshare".to_string(),
alloyed_asset_subdenom: "all".to_string(),
alloyed_asset_normalization_factor: Uint128::one(),
admin: None,
moderator: "osmo1cyyzpxplxdzkeea7kwsydadg87357qnahakaks".to_string(),
Expand Down Expand Up @@ -237,7 +237,7 @@ fn test_join_pool_should_update_shares_and_liquidity_properly() {
AssetConfig::from_denom_str("denoma"),
AssetConfig::from_denom_str("denomb"),
],
alloyed_asset_subdenom: "transmuter/poolshare".to_string(),
alloyed_asset_subdenom: "all".to_string(),
alloyed_asset_normalization_factor: Uint128::one(),
admin: None,
moderator: "osmo1cyyzpxplxdzkeea7kwsydadg87357qnahakaks".to_string(),
Expand Down Expand Up @@ -360,7 +360,7 @@ fn test_exit_pool_less_than_their_shares_should_update_shares_and_liquidity_prop
AssetConfig::from_denom_str("denoma"),
AssetConfig::from_denom_str("denomb"),
],
alloyed_asset_subdenom: "transmuter/poolshare".to_string(),
alloyed_asset_subdenom: "all".to_string(),
alloyed_asset_normalization_factor: Uint128::one(),
admin: None,
moderator: "osmo1cyyzpxplxdzkeea7kwsydadg87357qnahakaks".to_string(),
Expand Down Expand Up @@ -560,7 +560,7 @@ fn test_exit_pool_greater_than_their_shares_should_fail() {
AssetConfig::from_denom_str("denoma"),
AssetConfig::from_denom_str("denomb"),
],
alloyed_asset_subdenom: "transmuter/poolshare".to_string(),
alloyed_asset_subdenom: "all".to_string(),
alloyed_asset_normalization_factor: Uint128::one(),
admin: None,
moderator: "osmo1cyyzpxplxdzkeea7kwsydadg87357qnahakaks".to_string(),
Expand Down Expand Up @@ -612,7 +612,7 @@ fn test_exit_pool_within_shares_but_over_joined_denom_amount() {
AssetConfig::from_denom_str("denoma"),
AssetConfig::from_denom_str("denomb"),
],
alloyed_asset_subdenom: "transmuter/poolshare".to_string(),
alloyed_asset_subdenom: "all".to_string(),
alloyed_asset_normalization_factor: Uint128::one(),
admin: None,
moderator: "osmo1cyyzpxplxdzkeea7kwsydadg87357qnahakaks".to_string(),
Expand Down
8 changes: 4 additions & 4 deletions contracts/transmuter/src/test/cases/units/spot_price.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ fn test_spot_price(liquidity: &[Coin]) {
AssetConfig::from_denom_str("denom0"),
AssetConfig::from_denom_str("denom1"),
],
"transmuter/poolshare".to_string(),
"all".to_string(),
Uint128::one(),
None,
"osmo1cyyzpxplxdzkeea7kwsydadg87357qnahakaks".to_string(),
Expand All @@ -50,7 +50,7 @@ fn test_spot_price(liquidity: &[Coin]) {
.alloyed_asset
.set_alloyed_denom(
&mut deps.storage,
&"factory/contract_address/transmuter/poolshare".to_string(),
&"factory/contract_address/all".to_string(),
)
.unwrap();

Expand Down Expand Up @@ -90,7 +90,7 @@ fn test_spot_price(liquidity: &[Coin]) {
)
.unwrap_err(),
ContractError::SpotPriceQueryFailed {
reason: "base_asset_denom is not in swappable assets: must be one of [\"denom0\", \"denom1\", \"factory/contract_address/transmuter/poolshare\"] but got random_denom".to_string()
reason: "base_asset_denom is not in swappable assets: must be one of [\"denom0\", \"denom1\", \"factory/contract_address/all\"] but got random_denom".to_string()
}
);

Expand All @@ -106,7 +106,7 @@ fn test_spot_price(liquidity: &[Coin]) {
)
.unwrap_err(),
ContractError::SpotPriceQueryFailed {
reason: "quote_asset_denom is not in swappable assets: must be one of [\"denom0\", \"denom1\", \"factory/contract_address/transmuter/poolshare\"] but got random_denom".to_string()
reason: "quote_asset_denom is not in swappable assets: must be one of [\"denom0\", \"denom1\", \"factory/contract_address/all\"] but got random_denom".to_string()
}
);

Expand Down
2 changes: 1 addition & 1 deletion contracts/transmuter/src/test/cases/units/swap/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -508,7 +508,7 @@ fn pool_with_single_lp(
.unwrap_or_else(|| AssetConfig::from_denom_str(c.denom.as_str()))
})
.collect(),
alloyed_asset_subdenom: "transmuter/poolshare".to_string(),
alloyed_asset_subdenom: "all".to_string(),
alloyed_asset_normalization_factor: Uint128::one(),
admin: None,
moderator: "osmo1cyyzpxplxdzkeea7kwsydadg87357qnahakaks".to_string(),
Expand Down

0 comments on commit 848f344

Please sign in to comment.