Skip to content

Commit 04ff616

Browse files
committed
add ability to enable/disbale zero liquid pool tokens in swap
1 parent 5b11f9a commit 04ff616

4 files changed

Lines changed: 95 additions & 52 deletions

File tree

frontend/src/vanillaswap/swap_v2.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use dioxus::prelude::*;
22
use wasm_bindgen_futures::spawn_local;
33
use alloy::primitives::{utils::parse_units,U256};
4+
use crate::components::switch::{Switch, SwitchThumb};
45
use crate::metamask::{
56
get_token_balance,
67
uniswap_v2::uniswap_v2_swap_tokens
@@ -13,8 +14,8 @@ use super::v2::{approx_amount_out, unique_pool_tokens, use_v2_pools};
1314
pub fn PoolV2Swap() -> Element {
1415
let pools = use_v2_pools();
1516

17+
let mut show_zero_liq = use_signal(|| false);
1618
let tx_status = use_signal(|| "".to_string());
17-
1819
let mut token_a = use_signal(|| None as Option<TokenInfo>);
1920
let mut token_b = use_signal(|| None as Option<TokenInfo>);
2021
let balance = use_signal(|| "0.0".to_string());
@@ -122,14 +123,23 @@ pub fn PoolV2Swap() -> Element {
122123
}
123124
};
124125

125-
let from_options = unique_pool_tokens(&None, &pools.pairs.read());
126-
let to_options = unique_pool_tokens(&token_a.read(), &pools.pairs.read());
126+
let from_options = unique_pool_tokens(&None, &pools.pairs.read(), &show_zero_liq.read());
127+
let to_options = unique_pool_tokens(&token_a.read(), &pools.pairs.read(), &show_zero_liq.read());
127128
let from_selected = token_a.read().as_ref().map(|t| t.address.clone()).unwrap_or_default();
128129
let to_selected = token_b.read().as_ref().map(|t| t.address.clone()).unwrap_or_default();
129130
// UI rendering
130131
rsx! {
131132
div { class: "p-8 mt-12 glass w-full max-w-4xl flex flex-col gap-6 items-stretch flex-col-sm",
132133
h2 { class: "text-3xl font-bold text-center mb-6", "V2 PoolSwap" }
134+
div { class: "flex items-center gap-2",
135+
span { class: "text-gray-200 text-sm", "Show zero liquidity pools" }
136+
Switch {
137+
checked: show_zero_liq(),
138+
on_checked_change: move |new_state| show_zero_liq.set(new_state),
139+
SwitchThumb {}
140+
}
141+
}
142+
133143
if (pools.is_loading)() {
134144
div { class: "text-gray-300", "Loading..." }
135145
}

frontend/src/vanillaswap/swap_v3.rs

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use dioxus::prelude::*;
22
use wasm_bindgen_futures::spawn_local;
33
use alloy::primitives::{utils::parse_units,U256};
4+
use crate::components::switch::{Switch, SwitchThumb};
45
use crate::metamask::{
56
get_token_balance,
67
uniswap_v3::uniswap_v3_swap_tokens
@@ -13,6 +14,7 @@ use super::v3::{approx_amount_out, unique_pool_tokens, use_v3_pools};
1314
pub fn PoolV3Swap() -> Element {
1415
let pools = use_v3_pools();
1516

17+
let mut show_zero_liq = use_signal(|| false);
1618
let tx_status = use_signal(|| "".to_string());
1719

1820
let mut token_a = use_signal(|| None as Option<TokenInfo>);
@@ -125,14 +127,23 @@ pub fn PoolV3Swap() -> Element {
125127
}
126128
};
127129

128-
let from_options = unique_pool_tokens(&None, &pools.pairs.read());
129-
let to_options = unique_pool_tokens(&token_a.read(), &pools.pairs.read());
130+
let from_options = unique_pool_tokens(&None, &pools.pairs.read(), &pools.pool_state.read(), &show_zero_liq.read());
131+
let to_options = unique_pool_tokens(&token_a.read(), &pools.pairs.read(), &pools.pool_state.read(), &show_zero_liq.read());
130132
let from_selected = token_a.read().as_ref().map(|t| t.address.clone()).unwrap_or_default();
131133
let to_selected = token_b.read().as_ref().map(|t| t.address.clone()).unwrap_or_default();
132134
// UI rendering
133135
rsx! {
134136
div { class: "p-8 mt-12 glass w-full max-w-4xl flex flex-col gap-6 items-stretch flex-col-sm",
135137
h2 { class: "text-3xl font-bold text-center mb-6", "V3 PoolSwap" }
138+
div { class: "flex items-center gap-2",
139+
span { class: "text-gray-200 text-sm", "Show zero liquidity pools" }
140+
Switch {
141+
checked: show_zero_liq(),
142+
on_checked_change: move |new_state| show_zero_liq.set(new_state),
143+
SwitchThumb {}
144+
}
145+
}
146+
136147
if (pools.is_loading)() {
137148
div { class: "text-gray-300", "Loading..." }
138149
}

frontend/src/vanillaswap/v2.rs

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,23 @@ pub fn use_sync_v2_pools() {
5050
});
5151
}
5252

53+
pub fn is_zero_or_empty(v: &Option<String>) -> bool {
54+
match v.as_deref() {
55+
None => true,
56+
Some("") => true,
57+
Some("0") => true,
58+
Some("0.0") => true,
59+
Some(s) => {
60+
// also handle cases like "0.0000"
61+
s.trim().parse::<f64>().map(|n| n == 0.0).unwrap_or(false)
62+
}
63+
}
64+
}
5365

5466
pub fn unique_pool_tokens(
5567
selected_a: &Option<TokenInfo>,
5668
pairs: &Vec<V2PairInfo>,
69+
zero_liquid: &bool,
5770
) -> Vec<TokenInfo> {
5871
let address = if let Some(a) = selected_a{
5972
a.address.clone()
@@ -64,31 +77,33 @@ pub fn unique_pool_tokens(
6477
let mut out = vec![];
6578

6679
for p in pairs {
67-
// Check if Token A is token0
68-
if p.token0 == address || address.is_empty() {
69-
let token_b = TokenInfo {
70-
symbol: p.symbol1.clone().unwrap_or("???".into()),
71-
address: p.token1.clone(),
72-
decimals: p.decimals1.unwrap_or(18),
73-
token_type: TokenType::CAsset,
74-
75-
};
76-
if seen.insert(token_b.address.clone()) {
77-
out.push(token_b);
80+
if *zero_liquid || (!is_zero_or_empty(&p.reserve0) && !is_zero_or_empty(&p.reserve1)){
81+
// Check if Token A is token0
82+
if p.token0 == address || address.is_empty() {
83+
let token_b = TokenInfo {
84+
symbol: p.symbol1.clone().unwrap_or("???".into()),
85+
address: p.token1.clone(),
86+
decimals: p.decimals1.unwrap_or(18),
87+
token_type: TokenType::CAsset,
88+
89+
};
90+
if seen.insert(token_b.address.clone()) {
91+
out.push(token_b);
92+
}
7893
}
79-
}
8094

81-
// Check if Token A is token1
82-
if p.token1 == address || address.is_empty(){
83-
let token_b = TokenInfo {
84-
symbol: p.symbol0.clone().unwrap_or("???".into()),
85-
address: p.token0.clone(),
86-
decimals: p.decimals0.unwrap_or(18),
87-
token_type: TokenType::CAsset,
88-
89-
};
90-
if seen.insert(token_b.address.clone()) {
91-
out.push(token_b);
95+
// Check if Token A is token1
96+
if p.token1 == address || address.is_empty(){
97+
let token_b = TokenInfo {
98+
symbol: p.symbol0.clone().unwrap_or("???".into()),
99+
address: p.token0.clone(),
100+
decimals: p.decimals0.unwrap_or(18),
101+
token_type: TokenType::CAsset,
102+
103+
};
104+
if seen.insert(token_b.address.clone()) {
105+
out.push(token_b);
106+
}
92107
}
93108
}
94109
}

frontend/src/vanillaswap/v3.rs

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,8 @@ pub fn use_sync_v3_pools() {
6666
pub fn unique_pool_tokens(
6767
selected_a: &Option<TokenInfo>,
6868
pairs: &Vec<V3PoolInfo>,
69+
state: &BTreeMap<String, V3PoolState>,
70+
zero_liquid: &bool
6971
) -> Vec<TokenInfo> {
7072
let address = if let Some(a) = selected_a{
7173
a.address.clone()
@@ -76,31 +78,36 @@ pub fn unique_pool_tokens(
7678
let mut out = vec![];
7779

7880
for p in pairs {
79-
// Check if Token A is token0
80-
if p.token0 == address || address.is_empty() {
81-
let token_b = TokenInfo {
82-
symbol: p.symbol1.clone(),
83-
address: p.token1.clone(),
84-
decimals: p.decimals1,
85-
token_type: TokenType::CAsset,
86-
87-
};
88-
if seen.insert(token_b.address.clone()) {
89-
out.push(token_b);
90-
}
91-
}
81+
if let Some(state) = state.get(&p.pair_address){
82+
if *zero_liquid || state.liquidity > 0_u128{
83+
84+
// Check if Token A is token0
85+
if p.token0 == address || address.is_empty() {
86+
let token_b = TokenInfo {
87+
symbol: p.symbol1.clone(),
88+
address: p.token1.clone(),
89+
decimals: p.decimals1,
90+
token_type: TokenType::CAsset,
91+
92+
};
93+
if seen.insert(token_b.address.clone()) {
94+
out.push(token_b);
95+
}
96+
}
9297

93-
// Check if Token A is token1
94-
if p.token1 == address || address.is_empty(){
95-
let token_b = TokenInfo {
96-
symbol: p.symbol0.clone(),
97-
address: p.token0.clone(),
98-
decimals: p.decimals0,
99-
token_type: TokenType::CAsset,
100-
101-
};
102-
if seen.insert(token_b.address.clone()) {
103-
out.push(token_b);
98+
// Check if Token A is token1
99+
if p.token1 == address || address.is_empty(){
100+
let token_b = TokenInfo {
101+
symbol: p.symbol0.clone(),
102+
address: p.token0.clone(),
103+
decimals: p.decimals0,
104+
token_type: TokenType::CAsset,
105+
106+
};
107+
if seen.insert(token_b.address.clone()) {
108+
out.push(token_b);
109+
}
110+
}
104111
}
105112
}
106113
}

0 commit comments

Comments
 (0)