Skip to content

Commit 2198edc

Browse files
Rebase
2 parents 16be933 + e500bd0 commit 2198edc

File tree

9 files changed

+2089
-662
lines changed

9 files changed

+2089
-662
lines changed

Cargo.lock

Lines changed: 1485 additions & 439 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,23 +28,25 @@ ed25519-bip32 = "0.4.1"
2828
futures = "0.3.31"
2929
hex = { version = "0.4.3", features = ["serde"] }
3030
inquire = "0.7.4"
31+
jsonrpsee = { version = "0", features = ["client"] }
3132
miette = { version = "7.2.0", features = ["fancy"] }
32-
pallas = { version = "0.32.0", features = ["unstable", "pallas-wallet"] }
33-
pallas-wallet = "0.32.0"
33+
pallas = { version = "1.0.0-alpha.1", features = ["hardano"] }
3434
prost = "0.13.5"
3535
rand = "0.8.5"
3636
rand_core = {version = "0.6.4"}
3737
ratatui = "0.29.0"
3838
serde = { version = "1.0.217", features = ["derive"] }
3939
serde_with = "3.12.0"
40-
serde_json = "1.0.138"
40+
serde_json = "1.0.140"
4141
slug = "0.1.5"
4242
strum = { version = "0.27.1", features = ["derive"] }
4343
tokio = { version = "1.43.0", features = ["full"] }
4444
tokio-stream = "0.1.17"
4545
toml = "0.8.20"
4646
tracing = "0.1.41"
4747
tracing-subscriber = "0.3.19"
48+
tx3-lang = "0.2.0"
49+
tx3-cardano = "0.2.0"
4850
url = { version = "2.5.0", features = ["serde"] }
4951
utxorpc = "0.10.0"
5052

src/explorer/event.rs

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use ratatui::crossterm::event::Event as CrosstermEvent;
66
use tokio::sync::mpsc;
77
use utxorpc::{CardanoSyncClient, TipEvent};
88

9-
use crate::{provider::types::Provider, types::DetailedBalance, wallet::types::Wallet};
9+
use crate::{types::DetailedBalance, wallet::types::Wallet};
1010

1111
use super::{ChainBlock, ExplorerContext};
1212

@@ -128,12 +128,6 @@ impl EventTask {
128128
}
129129

130130
async fn follow_tip(&self) -> miette::Result<()> {
131-
let provider = match &self.context.provider {
132-
Provider::UTxORPC(provider) => provider,
133-
#[allow(unreachable_patterns)]
134-
_ => return Ok(()),
135-
};
136-
137131
let mut balances = HashMap::new();
138132
for wallet in self.context.store.wallets() {
139133
let key = wallet
@@ -148,7 +142,7 @@ impl EventTask {
148142
}
149143

150144
loop {
151-
let mut client: CardanoSyncClient = provider.client().await?;
145+
let mut client: CardanoSyncClient = self.context.provider.client().await?;
152146
let mut tip = client.follow_tip(vec![]).await.unwrap();
153147

154148
while let Ok(event) = tip.event().await {

src/provider/create.rs

Lines changed: 96 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,12 @@ use serde::{Deserialize, Serialize};
22
use std::collections::HashMap;
33

44
use clap::Parser;
5-
use miette::{bail, Context, IntoDiagnostic};
5+
use miette::{bail, IntoDiagnostic};
66
use tracing::instrument;
77

88
use crate::{output::OutputFormatter, utils::Name};
99

10-
use super::{types::Provider, utxorpc::UTxORPCProvider};
11-
12-
#[derive(clap::ValueEnum, Clone)]
13-
enum ProviderKind {
14-
Utxorpc,
15-
}
10+
use super::types::Provider;
1611

1712
#[derive(clap::ValueEnum, Clone, PartialEq)]
1813
enum NetworkKind {
@@ -32,10 +27,6 @@ pub struct Args {
3227
#[arg(long)]
3328
name: Option<String>,
3429

35-
/// Provider kind.
36-
#[arg(long)]
37-
kind: Option<ProviderKind>,
38-
3930
/// Whether to set as default provider.
4031
#[arg(long)]
4132
is_default: Option<bool>,
@@ -44,9 +35,21 @@ pub struct Args {
4435
#[arg(long)]
4536
network_kind: Option<NetworkKind>,
4637

47-
/// JSON encoded parameters particular to the provider type.
38+
// UTxORPC url
39+
#[arg(long)]
40+
utxorpc_url: Option<String>,
41+
42+
/// JSON encoded UTxORPC headers
43+
#[arg(long)]
44+
utxorpc_headers: Option<String>,
45+
46+
// TRP url
47+
#[arg(long)]
48+
trp_url: Option<String>,
49+
50+
/// JSON encoded TRP headers
4851
#[arg(long)]
49-
parameters: Option<String>,
52+
trp_headers: Option<String>,
5053
}
5154

5255
#[instrument("create", skip_all)]
@@ -71,17 +74,6 @@ pub async fn run(args: Args, ctx: &mut crate::Context) -> miette::Result<()> {
7174
)
7275
}
7376

74-
let kind = match args.kind {
75-
Some(kind) => kind,
76-
None => match inquire::Select::new("Kind of provider:", vec!["UTxORPC"])
77-
.prompt()
78-
.into_diagnostic()?
79-
{
80-
"UTxORPC" => ProviderKind::Utxorpc,
81-
_ => bail!("Invalid kind."),
82-
},
83-
};
84-
8577
let newtork_kind = match args.network_kind {
8678
Some(network_kind) => network_kind,
8779
None => match inquire::Select::new("Network kind:", vec!["mainnet", "testnet"])
@@ -95,55 +87,88 @@ pub async fn run(args: Args, ctx: &mut crate::Context) -> miette::Result<()> {
9587
};
9688
let is_testnet = newtork_kind == NetworkKind::Testnet;
9789

98-
// Provider specific inquires.
99-
let provider = match kind {
100-
ProviderKind::Utxorpc => {
101-
let (url, headers) = match args.parameters {
102-
Some(parameters) => {
103-
let parameters: UTxORPCParameters = serde_json::from_str(&parameters)
104-
.into_diagnostic()
105-
.context("Invalid parameters")?;
106-
(parameters.url, parameters.headers)
107-
}
108-
None => {
109-
let url = inquire::Text::new("URL:").prompt().into_diagnostic()?;
110-
let headers: HashMap<String, String> = inquire::Text::new(
111-
"Add request headers? Example: 'dmtr-api-key:dmtr_jdndajs,other:other-value'",
112-
)
113-
.prompt()
114-
.into_diagnostic()?
115-
.split(",")
116-
.flat_map(|keyval| {
117-
if keyval.is_empty() {
118-
return None
119-
}
120-
let mut parts = keyval.split(":");
121-
let key = match parts.next() {
122-
Some(s) => s,
123-
None => return Some(Err(miette::Error::msg("Invalid header"))),
124-
};
125-
let val = match parts.next() {
126-
Some(s) => s,
127-
None => return Some(Err(miette::Error::msg("Invalid header"))),
128-
};
129-
Some( Ok((key.to_string(), val.to_string())) )
130-
})
131-
.collect::<Result<_, miette::Error>>()?;
132-
(url, headers)
133-
}
90+
let url = match args.utxorpc_url {
91+
Some(url) => url,
92+
None => inquire::Text::new("URL:").prompt().into_diagnostic()?,
93+
};
94+
let headers: HashMap<String, String> = inquire::Text::new(
95+
"Add request headers? Example: 'dmtr-api-key:dmtr_jdndajs,other:other-value'",
96+
)
97+
.prompt()
98+
.into_diagnostic()?
99+
.split(",")
100+
.flat_map(|keyval| {
101+
if keyval.is_empty() {
102+
return None;
103+
}
104+
let mut parts = keyval.split(":");
105+
let key = match parts.next() {
106+
Some(s) => s,
107+
None => return Some(Err(miette::Error::msg("Invalid header"))),
108+
};
109+
let val = match parts.next() {
110+
Some(s) => s,
111+
None => return Some(Err(miette::Error::msg("Invalid header"))),
112+
};
113+
Some(Ok((key.to_string(), val.to_string())))
114+
})
115+
.collect::<Result<_, miette::Error>>()?;
116+
117+
let trp_url = match args.trp_url {
118+
Some(url) => Some(url),
119+
None => {
120+
let response = inquire::Text::new("TRP URL (leave empty for undefined):")
121+
.prompt()
122+
.into_diagnostic()?;
123+
if response.is_empty() {
124+
None
125+
} else {
126+
Some(response)
127+
}
128+
}
129+
};
130+
let mut trp_headers = None;
131+
if trp_url.is_some() {
132+
let aux: HashMap<String, String> = inquire::Text::new(
133+
"Add request headers? Example: 'dmtr-api-key:dmtr_jdndajs,other:other-value'",
134+
)
135+
.prompt()
136+
.into_diagnostic()?
137+
.split(",")
138+
.flat_map(|keyval| {
139+
if keyval.is_empty() {
140+
return None;
141+
}
142+
let mut parts = keyval.split(":");
143+
let key = match parts.next() {
144+
Some(s) => s,
145+
None => return Some(Err(miette::Error::msg("Invalid header"))),
134146
};
135-
Provider::UTxORPC(UTxORPCProvider {
136-
name,
137-
is_default: Some(ctx.store.providers().is_empty()),
138-
is_testnet: Some(is_testnet),
139-
url,
140-
headers: if headers.is_empty() {
141-
None
142-
} else {
143-
Some(headers)
144-
},
145-
})
147+
let val = match parts.next() {
148+
Some(s) => s,
149+
None => return Some(Err(miette::Error::msg("Invalid header"))),
150+
};
151+
Some(Ok((key.to_string(), val.to_string())))
152+
})
153+
.collect::<Result<_, miette::Error>>()?;
154+
155+
if !aux.is_empty() {
156+
trp_headers = Some(aux);
146157
}
158+
}
159+
160+
let provider = Provider {
161+
name,
162+
is_default: Some(ctx.store.providers().is_empty()),
163+
is_testnet: Some(is_testnet),
164+
url,
165+
headers: if headers.is_empty() {
166+
None
167+
} else {
168+
Some(headers)
169+
},
170+
trp_url,
171+
trp_headers,
147172
};
148173

149174
ctx.store.add_provider(&provider)?;

0 commit comments

Comments
 (0)