Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add view functions to dex to allow query by denoms #12

Merged
merged 2 commits into from
Mar 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file modified precompile/binaries/minlib/dex.mv
Binary file not shown.
Binary file modified precompile/binaries/stdlib/dex.mv
Binary file not shown.
107 changes: 100 additions & 7 deletions precompile/modules/initia_stdlib/sources/dex.move
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,14 @@ module initia_std::dex {
swap_fee_rate: Decimal128,
}

struct PairByDenomResponse has copy, drop, store {
coin_a: String,
coin_b: String,
liquidity_token: String,
weights: Weights,
swap_fee_rate: Decimal128,
}

/// Coin capabilities
struct CoinCapabilities has key {
burn_cap: coin::BurnCapability,
Expand Down Expand Up @@ -263,11 +271,12 @@ module initia_std::dex {

#[view]
public fun get_spot_price_by_denom(
pair: Object<Config>,
pair_denom: String,
base_coin: String,
): Decimal128 acquires Config, Pool {
let base_coin = coin::denom_to_metadata(base_coin);
get_spot_price(pair, base_coin)
let pair_metadata = coin::denom_to_metadata(pair_denom);
let base_metadata = coin::denom_to_metadata(base_coin);
get_spot_price(object::convert(pair_metadata), base_metadata)
}

#[view]
Expand Down Expand Up @@ -304,12 +313,13 @@ module initia_std::dex {

#[view]
public fun get_swap_simulation_by_denom(
pair: Object<Config>,
pair_denom: String,
offer_denom: String,
offer_amount: u64,
): u64 acquires Config, Pool {
let pair_metadata = coin::denom_to_metadata(pair_denom);
let offer_metadata = coin::denom_to_metadata(offer_denom);
get_swap_simulation(pair, offer_metadata, offer_amount)
get_swap_simulation(object::convert(pair_metadata), offer_metadata, offer_amount)
}

#[view]
Expand Down Expand Up @@ -346,12 +356,13 @@ module initia_std::dex {

#[view]
public fun get_swap_simulation_given_out_by_denom(
pair: Object<Config>,
pair_denom: String,
offer_denom: String,
return_amount: u64,
): u64 acquires Config, Pool {
let pair_metadata = coin::denom_to_metadata(pair_denom);
let offer_metadata = coin::denom_to_metadata(offer_denom);
get_swap_simulation_given_out(pair, offer_metadata, return_amount)
get_swap_simulation_given_out(object::convert(pair_metadata), offer_metadata, return_amount)
}

#[view]
Expand All @@ -366,6 +377,13 @@ module initia_std::dex {
}
}

#[view]
/// get pool info
public fun get_pool_info_by_denom(pair_denom: String): PoolInfoResponse acquires Pool {
let pair_metadata = coin::denom_to_metadata(pair_denom);
get_pool_info(object::convert(pair_metadata))
}

#[view]
/// get config
public fun get_config(pair: Object<Config>): ConfigResponse acquires Config {
Expand All @@ -378,6 +396,13 @@ module initia_std::dex {
}
}

#[view]
/// get config
public fun get_config_by_denom(pair_denom: String): ConfigResponse acquires Config {
let pair_metadata = coin::denom_to_metadata(pair_denom);
get_config(object::convert(pair_metadata))
}

#[view]
public fun get_current_weight(pair: Object<Config>): CurrentWeightResponse acquires Config {
let pair_addr = object::object_address(pair);
Expand All @@ -389,6 +414,12 @@ module initia_std::dex {
}
}

#[view]
public fun get_current_weight_by_denom(pair_denom: String): CurrentWeightResponse acquires Config {
let pair_metadata = coin::denom_to_metadata(pair_denom);
get_current_weight(object::convert(pair_metadata))
}

#[view]
// get all kinds of pair
// return vector of PairResponse
Expand Down Expand Up @@ -442,6 +473,68 @@ module initia_std::dex {
res
}

#[view]
// get all kinds of pair
// return vector of PairResponse
public fun get_all_pairs_by_denom(
coin_a_start_after: Option<String>,
coin_b_start_after: Option<String>,
liquidity_token_start_after: Option<String>,
limit: u8,
): vector<PairByDenomResponse> acquires ModuleStore {
if (limit > MAX_LIMIT) {
limit = MAX_LIMIT;
};

assert!(
option::is_some(&coin_a_start_after) == option::is_some(&coin_b_start_after)
&& option::is_some(&coin_b_start_after) == option::is_some(&liquidity_token_start_after),
ESTART_AFTER
);

let module_store = borrow_global<ModuleStore>(@initia_std);

let start_after = if (option::is_some(&coin_a_start_after)) {
let coin_a_start_after = coin::denom_to_metadata(option::extract(&mut coin_a_start_after));
let coin_b_start_after = coin::denom_to_metadata(option::extract(&mut coin_b_start_after));
let liquidity_token_start_after = coin::denom_to_metadata(option::extract(&mut liquidity_token_start_after));
option::some(PairKey {
coin_a: object::object_address(coin_a_start_after),
coin_b: object::object_address(coin_b_start_after),
liquidity_token: object::object_address(liquidity_token_start_after),
})
} else {
option::some(PairKey {
coin_a: @0x0,
coin_b: @0x0,
liquidity_token: @0x0,
})
};

let res = vector[];
let pairs_iter = table::iter(
&module_store.pairs,
start_after,
option::none(),
1,
);

while (vector::length(&res) < (limit as u64) && table::prepare<PairKey, PairResponse>(&mut pairs_iter)) {
let (key, value) = table::next<PairKey, PairResponse>(&mut pairs_iter);
if (&key != option::borrow(&start_after)) {
vector::push_back(&mut res, PairByDenomResponse {
coin_a: coin::metadata_to_denom(object::address_to_object(value.coin_a)),
coin_b: coin::metadata_to_denom(object::address_to_object(value.coin_b)),
liquidity_token: coin::metadata_to_denom(object::address_to_object(value.liquidity_token)),
weights: value.weights,
swap_fee_rate: value.swap_fee_rate,
})
}
};

res
}

#[view]
// get pairs by coin types
// return vector of PairResponse
Expand Down
107 changes: 100 additions & 7 deletions precompile/modules/minitia_stdlib/sources/dex.move
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,14 @@ module minitia_std::dex {
swap_fee_rate: Decimal128,
}

struct PairByDenomResponse has copy, drop, store {
coin_a: String,
coin_b: String,
liquidity_token: String,
weights: Weights,
swap_fee_rate: Decimal128,
}

/// Coin capabilities
struct CoinCapabilities has key {
burn_cap: coin::BurnCapability,
Expand Down Expand Up @@ -263,11 +271,12 @@ module minitia_std::dex {

#[view]
public fun get_spot_price_by_denom(
pair: Object<Config>,
pair_denom: String,
base_coin: String,
): Decimal128 acquires Config, Pool {
let base_coin = coin::denom_to_metadata(base_coin);
get_spot_price(pair, base_coin)
let pair_metadata = coin::denom_to_metadata(pair_denom);
let base_metadata = coin::denom_to_metadata(base_coin);
get_spot_price(object::convert(pair_metadata), base_metadata)
}

#[view]
Expand Down Expand Up @@ -304,12 +313,13 @@ module minitia_std::dex {

#[view]
public fun get_swap_simulation_by_denom(
pair: Object<Config>,
pair_denom: String,
offer_denom: String,
offer_amount: u64,
): u64 acquires Config, Pool {
let pair_metadata = coin::denom_to_metadata(pair_denom);
let offer_metadata = coin::denom_to_metadata(offer_denom);
get_swap_simulation(pair, offer_metadata, offer_amount)
get_swap_simulation(object::convert(pair_metadata), offer_metadata, offer_amount)
}

#[view]
Expand Down Expand Up @@ -346,12 +356,13 @@ module minitia_std::dex {

#[view]
public fun get_swap_simulation_given_out_by_denom(
pair: Object<Config>,
pair_denom: String,
offer_denom: String,
return_amount: u64,
): u64 acquires Config, Pool {
let pair_metadata = coin::denom_to_metadata(pair_denom);
let offer_metadata = coin::denom_to_metadata(offer_denom);
get_swap_simulation_given_out(pair, offer_metadata, return_amount)
get_swap_simulation_given_out(object::convert(pair_metadata), offer_metadata, return_amount)
}

#[view]
Expand All @@ -366,6 +377,13 @@ module minitia_std::dex {
}
}

#[view]
/// get pool info
public fun get_pool_info_by_denom(pair_denom: String): PoolInfoResponse acquires Pool {
let pair_metadata = coin::denom_to_metadata(pair_denom);
get_pool_info(object::convert(pair_metadata))
}

#[view]
/// get config
public fun get_config(pair: Object<Config>): ConfigResponse acquires Config {
Expand All @@ -378,6 +396,13 @@ module minitia_std::dex {
}
}

#[view]
/// get config
public fun get_config_by_denom(pair_denom: String): ConfigResponse acquires Config {
let pair_metadata = coin::denom_to_metadata(pair_denom);
get_config(object::convert(pair_metadata))
}

#[view]
public fun get_current_weight(pair: Object<Config>): CurrentWeightResponse acquires Config {
let pair_addr = object::object_address(pair);
Expand All @@ -389,6 +414,12 @@ module minitia_std::dex {
}
}

#[view]
public fun get_current_weight_by_denom(pair_denom: String): CurrentWeightResponse acquires Config {
let pair_metadata = coin::denom_to_metadata(pair_denom);
get_current_weight(object::convert(pair_metadata))
}

#[view]
// get all kinds of pair
// return vector of PairResponse
Expand Down Expand Up @@ -442,6 +473,68 @@ module minitia_std::dex {
res
}

#[view]
// get all kinds of pair
// return vector of PairResponse
public fun get_all_pairs_by_denom(
coin_a_start_after: Option<String>,
coin_b_start_after: Option<String>,
liquidity_token_start_after: Option<String>,
limit: u8,
): vector<PairByDenomResponse> acquires ModuleStore {
if (limit > MAX_LIMIT) {
limit = MAX_LIMIT;
};

assert!(
option::is_some(&coin_a_start_after) == option::is_some(&coin_b_start_after)
&& option::is_some(&coin_b_start_after) == option::is_some(&liquidity_token_start_after),
ESTART_AFTER
);

let module_store = borrow_global<ModuleStore>(@minitia_std);

let start_after = if (option::is_some(&coin_a_start_after)) {
let coin_a_start_after = coin::denom_to_metadata(option::extract(&mut coin_a_start_after));
let coin_b_start_after = coin::denom_to_metadata(option::extract(&mut coin_b_start_after));
let liquidity_token_start_after = coin::denom_to_metadata(option::extract(&mut liquidity_token_start_after));
option::some(PairKey {
coin_a: object::object_address(coin_a_start_after),
coin_b: object::object_address(coin_b_start_after),
liquidity_token: object::object_address(liquidity_token_start_after),
})
} else {
option::some(PairKey {
coin_a: @0x0,
coin_b: @0x0,
liquidity_token: @0x0,
})
};

let res = vector[];
let pairs_iter = table::iter(
&module_store.pairs,
start_after,
option::none(),
1,
);

while (vector::length(&res) < (limit as u64) && table::prepare<PairKey, PairResponse>(&mut pairs_iter)) {
let (key, value) = table::next<PairKey, PairResponse>(&mut pairs_iter);
if (&key != option::borrow(&start_after)) {
vector::push_back(&mut res, PairByDenomResponse {
coin_a: coin::metadata_to_denom(object::address_to_object(value.coin_a)),
coin_b: coin::metadata_to_denom(object::address_to_object(value.coin_b)),
liquidity_token: coin::metadata_to_denom(object::address_to_object(value.liquidity_token)),
weights: value.weights,
swap_fee_rate: value.swap_fee_rate,
})
}
};

res
}

#[view]
// get pairs by coin types
// return vector of PairResponse
Expand Down
Loading