Skip to content

Commit 40c5909

Browse files
committed
Fix: collapsible-if warnings
1 parent c551fba commit 40c5909

6 files changed

Lines changed: 140 additions & 150 deletions

File tree

.dockerignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,6 @@ config/
99
.vscode/
1010
.git/
1111
combicode.txt
12+
.opencode/
1213
.agents/
1314
skills-lock.json

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,4 +11,5 @@ config/
1111
.idea/
1212
.vscode/
1313
.agents/
14+
.opencode/
1415
skills-lock.json

src/btc.rs

Lines changed: 43 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -38,11 +38,11 @@ impl BtcScanner {
3838
});
3939
let res = execute_rpc(client, rpc_urls, &payload).await?;
4040

41-
if let Some(error) = res.get("error") {
42-
if !error.is_null() {
43-
let msg = error["message"].as_str().unwrap_or("Unknown RPC error");
44-
anyhow::bail!("RPC error in getblockcount: {}", msg);
45-
}
41+
if let Some(error) = res.get("error")
42+
&& !error.is_null()
43+
{
44+
let msg = error["message"].as_str().unwrap_or("Unknown RPC error");
45+
anyhow::bail!("RPC error in getblockcount: {}", msg);
4646
}
4747

4848
res["result"]
@@ -160,45 +160,43 @@ async fn process_transaction_static(
160160
let tx_hash = txn["txid"].as_str().unwrap_or("unknown").to_string();
161161

162162
let mut from_address = "unknown".to_string();
163-
if let Some(vins) = txn["vin"].as_array() {
164-
if let Some(first_vin) = vins.first() {
165-
if let Some(prevout) = first_vin.get("prevout") {
166-
if let Some(addr) = extract_btc_address(prevout) {
167-
from_address = addr;
168-
}
169-
}
170-
}
163+
if let Some(vins) = txn["vin"].as_array()
164+
&& let Some(first_vin) = vins.first()
165+
&& let Some(prevout) = first_vin.get("prevout")
166+
&& let Some(addr) = extract_btc_address(prevout)
167+
{
168+
from_address = addr;
171169
}
172170

173171
for vout in vouts {
174-
if let Some(to_address) = extract_btc_address(vout) {
175-
if targets.contains(&to_address) {
176-
// 2026 Best Practice: Extract the exact string representation from
177-
// serde_json (with arbitrary_precision enabled), completely bypassing
178-
// IEEE-754 floating-point math. This prevents precision loss for
179-
// high-value Bitcoin transactions.
180-
let exact_val_str = vout["value"]
181-
.as_number()
182-
.map(|n| n.to_string())
183-
.unwrap_or_else(|| "0".to_string());
184-
185-
let decimal_val = Decimal::from_str(&exact_val_str).unwrap_or_default();
186-
let sats_decimal = decimal_val * Decimal::new(100_000_000, 0);
187-
let raw_amount = sats_decimal.trunc().to_string();
188-
189-
let _ = tx
190-
.send(DepositResult {
191-
chain: name.to_string(),
192-
asset: "Native".to_string(),
193-
from_address: from_address.clone(),
194-
to_address,
195-
amount_raw: raw_amount.clone(),
196-
amount_clean: format_to_human(&raw_amount, BTC_DECIMALS),
197-
block_number: block_num,
198-
tx_hash: tx_hash.clone(),
199-
})
200-
.await;
201-
}
172+
if let Some(to_address) = extract_btc_address(vout)
173+
&& targets.contains(&to_address)
174+
{
175+
// 2026 Best Practice: Extract the exact string representation from
176+
// serde_json (with arbitrary_precision enabled), completely bypassing
177+
// IEEE-754 floating-point math. This prevents precision loss for
178+
// high-value Bitcoin transactions.
179+
let exact_val_str = vout["value"]
180+
.as_number()
181+
.map(|n| n.to_string())
182+
.unwrap_or_else(|| "0".to_string());
183+
184+
let decimal_val = Decimal::from_str(&exact_val_str).unwrap_or_default();
185+
let sats_decimal = decimal_val * Decimal::new(100_000_000, 0);
186+
let raw_amount = sats_decimal.trunc().to_string();
187+
188+
let _ = tx
189+
.send(DepositResult {
190+
chain: name.to_string(),
191+
asset: "Native".to_string(),
192+
from_address: from_address.clone(),
193+
to_address,
194+
amount_raw: raw_amount.clone(),
195+
amount_clean: format_to_human(&raw_amount, BTC_DECIMALS),
196+
block_number: block_num,
197+
tx_hash: tx_hash.clone(),
198+
})
199+
.await;
202200
}
203201
}
204202
}
@@ -208,10 +206,10 @@ fn extract_btc_address(out: &serde_json::Value) -> Option<String> {
208206
if let Some(addr) = spk.get("address").and_then(|a| a.as_str()) {
209207
return Some(addr.to_string());
210208
}
211-
if let Some(addrs) = spk.get("addresses").and_then(|a| a.as_array()) {
212-
if let Some(addr) = addrs.first().and_then(|a| a.as_str()) {
213-
return Some(addr.to_string());
214-
}
209+
if let Some(addrs) = spk.get("addresses").and_then(|a| a.as_array())
210+
&& let Some(addr) = addrs.first().and_then(|a| a.as_str())
211+
{
212+
return Some(addr.to_string());
215213
}
216214
None
217215
}

src/evm.rs

Lines changed: 29 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -39,11 +39,11 @@ impl EvmScanner {
3939
});
4040
let res = execute_rpc(client, rpc_urls, &payload).await?;
4141

42-
if let Some(error) = res.get("error") {
43-
if !error.is_null() {
44-
let msg = error["message"].as_str().unwrap_or("Unknown RPC error");
45-
anyhow::bail!("RPC error in eth_blockNumber: {}", msg);
46-
}
42+
if let Some(error) = res.get("error")
43+
&& !error.is_null()
44+
{
45+
let msg = error["message"].as_str().unwrap_or("Unknown RPC error");
46+
anyhow::bail!("RPC error in eth_blockNumber: {}", msg);
4747
}
4848

4949
let hex = res["result"]
@@ -138,32 +138,30 @@ impl EvmScanner {
138138
for log in logs {
139139
let log_addr = log["address"].as_str().unwrap_or("").to_lowercase();
140140

141-
if let Some((token_name, decimals)) = addr_to_token.get(&log_addr) {
142-
if let Some(topics) = log["topics"].as_array() {
143-
if topics.len() >= 3 {
144-
let clean_from = extract_address(&topics[1]);
145-
let clean_to = extract_address(&topics[2]);
146-
147-
if targets.contains(&clean_to) {
148-
let raw_amount = log["data"].as_str().unwrap_or("0x0");
149-
let block_number = parse_hex_block(&log["blockNumber"]);
150-
let tx_hash =
151-
log["transactionHash"].as_str().unwrap_or("").to_string();
152-
153-
let _ = tx
154-
.send(DepositResult {
155-
chain: self.name.clone(),
156-
asset: token_name.clone(),
157-
from_address: clean_from,
158-
to_address: clean_to,
159-
amount_raw: raw_amount.to_string(),
160-
amount_clean: format_to_human(raw_amount, *decimals),
161-
block_number,
162-
tx_hash,
163-
})
164-
.await;
165-
}
166-
}
141+
if let Some((token_name, decimals)) = addr_to_token.get(&log_addr)
142+
&& let Some(topics) = log["topics"].as_array()
143+
&& topics.len() >= 3
144+
{
145+
let clean_from = extract_address(&topics[1]);
146+
let clean_to = extract_address(&topics[2]);
147+
148+
if targets.contains(&clean_to) {
149+
let raw_amount = log["data"].as_str().unwrap_or("0x0");
150+
let block_number = parse_hex_block(&log["blockNumber"]);
151+
let tx_hash = log["transactionHash"].as_str().unwrap_or("").to_string();
152+
153+
let _ = tx
154+
.send(DepositResult {
155+
chain: self.name.clone(),
156+
asset: token_name.clone(),
157+
from_address: clean_from,
158+
to_address: clean_to,
159+
amount_raw: raw_amount.to_string(),
160+
amount_clean: format_to_human(raw_amount, *decimals),
161+
block_number,
162+
tx_hash,
163+
})
164+
.await;
167165
}
168166
}
169167
}

src/main.rs

Lines changed: 55 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -469,10 +469,10 @@ async fn run_single(args: CliArgs) -> Result<()> {
469469

470470
fn apply_overrides(config: &mut AppConfig, args: &CliArgs) {
471471
for chain in config.chains.values_mut() {
472-
if let Some(ref target_net) = args.network {
473-
if chain.caip2 != *target_net {
474-
continue;
475-
}
472+
if let Some(ref target_net) = args.network
473+
&& chain.caip2 != *target_net
474+
{
475+
continue;
476476
}
477477

478478
if let Some(sb) = args.start_block {
@@ -702,30 +702,26 @@ fn manage_assets_cli(path: &PathBuf, input: &str, add: bool) -> Result<()> {
702702
}
703703
let (chain_name, asset_name) = (parts[0], parts[1]);
704704

705-
if let Some(chains_table) = doc.get_mut("chains").and_then(|i| i.as_table_mut()) {
706-
if let Some(chain_table) = chains_table
705+
if let Some(chains_table) = doc.get_mut("chains").and_then(|i| i.as_table_mut())
706+
&& let Some(chain_table) = chains_table
707707
.get_mut(chain_name)
708708
.and_then(|i| i.as_table_mut())
709-
{
710-
if let Some(assets_table) =
711-
chain_table.get_mut("assets").and_then(|i| i.as_table_mut())
712-
{
713-
if assets_table.remove(asset_name).is_some() {
714-
tracing::info!(
715-
"Removed asset '{}' from chain '{}' in {:?}",
716-
asset_name,
717-
chain_name,
718-
path
719-
);
720-
} else {
721-
tracing::warn!(
722-
"Asset '{}' not found in chain '{}' in {:?}",
723-
asset_name,
724-
chain_name,
725-
path
726-
);
727-
}
728-
}
709+
&& let Some(assets_table) = chain_table.get_mut("assets").and_then(|i| i.as_table_mut())
710+
{
711+
if assets_table.remove(asset_name).is_some() {
712+
tracing::info!(
713+
"Removed asset '{}' from chain '{}' in {:?}",
714+
asset_name,
715+
chain_name,
716+
path
717+
);
718+
} else {
719+
tracing::warn!(
720+
"Asset '{}' not found in chain '{}' in {:?}",
721+
asset_name,
722+
chain_name,
723+
path
724+
);
729725
}
730726
}
731727
}
@@ -842,13 +838,13 @@ async fn api_add_chain(
842838
};
843839

844840
// Check if chain already exists
845-
if let Some(chains) = doc.get("chains").and_then(|i| i.as_table()) {
846-
if chains.contains_key(&payload.name) {
847-
return Err(ApiErrors::conflict(format!(
848-
"chain already exists: {}",
849-
payload.name
850-
)));
851-
}
841+
if let Some(chains) = doc.get("chains").and_then(|i| i.as_table())
842+
&& chains.contains_key(&payload.name)
843+
{
844+
return Err(ApiErrors::conflict(format!(
845+
"chain already exists: {}",
846+
payload.name
847+
)));
852848
}
853849

854850
let mut new_chain = Table::new();
@@ -905,16 +901,16 @@ async fn api_remove_chain(
905901
}
906902
};
907903

908-
if let Some(chains) = doc.get_mut("chains").and_then(|i| i.as_table_mut()) {
909-
if chains.remove(&name).is_some() {
910-
let remaining: Vec<String> = chains.iter().map(|(k, _)| k.to_string()).collect();
911-
let _ = std::fs::write(&state.config_path, doc.to_string());
904+
if let Some(chains) = doc.get_mut("chains").and_then(|i| i.as_table_mut())
905+
&& chains.remove(&name).is_some()
906+
{
907+
let remaining: Vec<String> = chains.iter().map(|(k, _)| k.to_string()).collect();
908+
let _ = std::fs::write(&state.config_path, doc.to_string());
912909

913-
return Ok(axum::Json(ApiResponse::with_meta(
914-
serde_json::json!({ "removed": name }),
915-
serde_json::json!({ "remaining_chains": remaining }),
916-
)));
917-
}
910+
return Ok(axum::Json(ApiResponse::with_meta(
911+
serde_json::json!({ "removed": name }),
912+
serde_json::json!({ "remaining_chains": remaining }),
913+
)));
918914
}
919915

920916
Err(ApiErrors::not_found(format!("chain not found: {}", name)))
@@ -1015,26 +1011,23 @@ async fn api_remove_asset(
10151011
}
10161012
};
10171013

1018-
if let Some(chains_table) = doc.get_mut("chains").and_then(|i| i.as_table_mut()) {
1019-
if let Some(chain_table) = chains_table.get_mut(&chain).and_then(|i| i.as_table_mut()) {
1020-
if let Some(assets_table) = chain_table.get_mut("assets").and_then(|i| i.as_table_mut())
1021-
{
1022-
if assets_table.remove(&asset).is_some() {
1023-
let remaining: Vec<String> =
1024-
assets_table.iter().map(|(k, _)| k.to_string()).collect();
1025-
let _ = std::fs::write(&state.config_path, doc.to_string());
1026-
1027-
return Ok(axum::Json(ApiResponse::with_meta(
1028-
serde_json::json!({ "removed": { "chain": chain, "name": asset } }),
1029-
serde_json::json!({ "remaining_assets_on_chain": remaining }),
1030-
)));
1031-
} else {
1032-
return Err(ApiErrors::not_found(format!(
1033-
"asset not found on chain {}: {}",
1034-
chain, asset
1035-
)));
1036-
}
1037-
}
1014+
if let Some(chains_table) = doc.get_mut("chains").and_then(|i| i.as_table_mut())
1015+
&& let Some(chain_table) = chains_table.get_mut(&chain).and_then(|i| i.as_table_mut())
1016+
&& let Some(assets_table) = chain_table.get_mut("assets").and_then(|i| i.as_table_mut())
1017+
{
1018+
if assets_table.remove(&asset).is_some() {
1019+
let remaining: Vec<String> = assets_table.iter().map(|(k, _)| k.to_string()).collect();
1020+
let _ = std::fs::write(&state.config_path, doc.to_string());
1021+
1022+
return Ok(axum::Json(ApiResponse::with_meta(
1023+
serde_json::json!({ "removed": { "chain": chain, "name": asset } }),
1024+
serde_json::json!({ "remaining_assets_on_chain": remaining }),
1025+
)));
1026+
} else {
1027+
return Err(ApiErrors::not_found(format!(
1028+
"asset not found on chain {}: {}",
1029+
chain, asset
1030+
)));
10381031
}
10391032
}
10401033

src/solana.rs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,11 +36,11 @@ impl SolanaScanner {
3636
});
3737
let res = execute_rpc(client, rpc_urls, &payload).await?;
3838

39-
if let Some(error) = res.get("error") {
40-
if !error.is_null() {
41-
let msg = error["message"].as_str().unwrap_or("Unknown RPC error");
42-
anyhow::bail!("RPC error in getSlot: {}", msg);
43-
}
39+
if let Some(error) = res.get("error")
40+
&& !error.is_null()
41+
{
42+
let msg = error["message"].as_str().unwrap_or("Unknown RPC error");
43+
anyhow::bail!("RPC error in getSlot: {}", msg);
4444
}
4545

4646
res["result"]
@@ -244,13 +244,12 @@ async fn scan_spl_static(
244244
let mut from_addr = "unknown".to_string();
245245
if let Some(pre_arr) = pre_token {
246246
for pre_log in pre_arr {
247-
if pre_log["mint"].as_str().unwrap_or("") == mint {
248-
if let Some(pre_owner) = pre_log["owner"].as_str() {
249-
if pre_owner != owner {
250-
from_addr = pre_owner.to_string();
251-
break;
252-
}
253-
}
247+
if pre_log["mint"].as_str().unwrap_or("") == mint
248+
&& let Some(pre_owner) = pre_log["owner"].as_str()
249+
&& pre_owner != owner
250+
{
251+
from_addr = pre_owner.to_string();
252+
break;
254253
}
255254
}
256255
}

0 commit comments

Comments
 (0)