Skip to content
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
995 changes: 493 additions & 502 deletions Cargo.lock

Large diffs are not rendered by default.

14 changes: 8 additions & 6 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -24,13 +24,14 @@ console_log = "1"
derive_more = { version = "1", features = ["from", "into"] }
fvm_ipld_encoding = "0.5"
fvm_shared = { version = "~4.5" }
getrandom = { version = "0.2", features = ["js"], optional = true }
hex = "0.4"
http = { version = "1", optional = true }
leptos = "0.6"
leptos-use = "0.13"
leptos_axum = { version = "0.6", default-features = false, optional = true }
leptos_meta = "0.6"
leptos_router = "0.6"
leptos = "0.7.3"
leptos-use = "0.15.3"
leptos_axum = { version = "0.7.3", default-features = false, optional = true }
leptos_meta = "0.7.3"
leptos_router = "0.7.3"
libsecp256k1 = "0.7"
log = "0.4"
multihash-codetable = { version = "0.1" }
Expand All @@ -47,7 +48,7 @@ worker = { version = "0.5", features = ['http', 'axum'], optional = true }
worker-macros = { version = "0.5", features = ['http'], optional = true }

[features]
hydrate = ["leptos/hydrate", "leptos_meta/hydrate", "leptos_router/hydrate"]
hydrate = ["leptos/hydrate"]
ssr = [
"dep:tower",
"dep:http",
Expand All @@ -58,6 +59,7 @@ ssr = [
"leptos_router/ssr",
"dep:worker",
"dep:worker-macros",
"dep:getrandom",
]

[profile.release]
Expand Down
73 changes: 48 additions & 25 deletions src/app.rs
Original file line number Diff line number Diff line change
@@ -1,26 +1,44 @@
use leptos::{component, create_local_resource, event_target_value, view, IntoView, SignalGet};
use crate::rpc_context::RpcContext;
use leptos::prelude::*;
use leptos::{component, leptos_dom::helpers::event_target_value, view, IntoView};
use leptos_meta::*;
use leptos_router::*;
use leptos_router::components::*;
use leptos_router::path;

use crate::rpc_context::RpcContext;
#[allow(dead_code)]
pub fn shell(options: LeptosOptions) -> impl IntoView {
view! {
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>

<AutoReload options=options.clone() />
<HydrationScripts options/>
<MetaTags/>
</head>
</html>
}
}

#[component]
pub fn Loader(loading: impl Fn() -> bool + 'static) -> impl IntoView {
pub fn Loader(loading: impl Fn() -> bool + 'static + Send) -> impl IntoView {
view! { <span class:loader=loading /> }
}

#[component]
pub fn BlockchainExplorer() -> impl IntoView {
let rpc_context = RpcContext::use_context();
let network_name = create_local_resource(
move || rpc_context.get(),
move |provider| async move { provider.network_name().await.ok() },
);
let network_name = LocalResource::new(move || {
let provider = rpc_context.get();
async move { provider.network_name().await.ok() }
});

let network_version = create_local_resource(
move || rpc_context.get(),
move |provider| async move { provider.network_version().await.ok() },
);
let network_version = LocalResource::new(move || {
let provider = rpc_context.get();
async move { provider.network_version().await.ok() }
});

view! {
<h1 class="mb-4 text-4xl font-extrabold leading-none tracking-tight text-gray-900 md:text-5xl lg:text-6xl">
Expand All @@ -31,15 +49,20 @@ pub fn BlockchainExplorer() -> impl IntoView {
<option value="https://api.node.glif.io/">Glif.io Mainnet</option>
</select>
<p>StateNetworkName</p>
<p class="px-8">
<span>{move || network_name.get()}</span>
<Loader loading=move || network_name.loading().get() />
</p>
<Suspense fallback={move || view!{ <p>Loading network name...</p> }}>
<p class="px-8">
<span>{move || network_name.get().as_deref().flatten().cloned()}</span>
<Loader loading={move || network_name.get().is_none()} />
</p>
</Suspense>

<p>StateNetworkVersion</p>
<p class="px-8">
<span>{move || network_version.get()}</span>
<Loader loading=move || network_name.loading().get() />
</p>
<Suspense fallback={move || view!{ <p>Loading network version...</p> }}>
<p class="px-8">
<span>{move || network_version.get().as_deref().flatten().cloned()}</span>
<Loader loading={move || network_version.get().is_none()} />
</p>
</Suspense>
}
}

Expand All @@ -61,11 +84,11 @@ pub fn App() -> impl IntoView {
<Stylesheet href="/style.css" />
<Link rel="icon" type_="image/x-icon" href="/favicon.ico" />
<Router>
<Routes>
<Route path="/" view=BlockchainExplorer />
<Route path="/faucet" view=crate::faucet::views::Faucets />
<Route path="/faucet/calibnet" view=crate::faucet::views::Faucet_Calibnet />
<Route path="/faucet/mainnet" view=crate::faucet::views::Faucet_Mainnet />
<Routes fallback=|| "Not found.">
<Route path=path!("/") view=BlockchainExplorer />
<Route path=path!("/faucet") view=crate::faucet::views::Faucets />
<Route path=path!("/faucet/calibnet") view=crate::faucet::views::Faucet_Calibnet />
<Route path=path!("/faucet/mainnet") view=crate::faucet::views::Faucet_Mainnet />
</Routes>
<Footer />
</Router>
Expand Down
74 changes: 40 additions & 34 deletions src/faucet/controller.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,8 @@
use super::{model::FaucetModel, utils::sign_with_secret_key};
use cid::Cid;
use fvm_shared::{address::Network, econ::TokenAmount};
use leptos::{
create_local_resource, create_local_resource_with_initial_value, create_rw_signal, spawn_local,
SignalGet as _, SignalSet as _, SignalUpdate as _,
};
use leptos::prelude::*;
use leptos::task::spawn_local;

use crate::{
address::parse_address, lotus_json::LotusJson, message::message_transfer,
Expand All @@ -21,11 +19,12 @@ pub(super) struct FaucetController {
impl FaucetController {
pub fn new(network: Network) -> Self {
let is_mainnet = network == Network::Mainnet;
let target_address = create_rw_signal(String::new());
let target_balance = create_local_resource_with_initial_value(
move || target_address.get(),
move |address| async move {
if let Ok(address) = parse_address(&address, network) {
let target_address = RwSignal::new(String::new());
let balance_trigger = Trigger::new();
let target_balance = LocalResource::new(move || {
let target_address = target_address.get();
async move {
if let Ok(address) = parse_address(&target_address, network) {
Provider::from_network(network)
.wallet_balance(address)
.await
Expand All @@ -34,22 +33,21 @@ impl FaucetController {
} else {
TokenAmount::from_atto(0)
}
},
Some(TokenAmount::from_atto(0)),
);
let sender_address = create_local_resource(
move || (),
move |()| async move {
}
});
let sender_address = LocalResource::new(move || {
balance_trigger.track();
async move {
faucet_address(is_mainnet)
.await
.map(|LotusJson(addr)| addr)
.ok()
},
);
let faucet_balance = create_local_resource_with_initial_value(
move || sender_address.get().flatten(),
move |addr| async move {
if let Some(addr) = addr {
}
});
let faucet_balance = LocalResource::new(move || {
balance_trigger.track();
async move {
if let Some(addr) = sender_address.await {
Provider::from_network(network)
.wallet_balance(addr)
.await
Expand All @@ -58,16 +56,15 @@ impl FaucetController {
} else {
TokenAmount::from_atto(0)
}
},
Some(TokenAmount::from_atto(0)),
);

}
});
let faucet = FaucetModel {
network,
send_disabled: create_rw_signal(false),
send_limited: create_rw_signal(0),
sent_messages: create_rw_signal(Vec::new()),
error_messages: create_rw_signal(Vec::new()),
send_disabled: RwSignal::new(false),
send_limited: RwSignal::new(0),
sent_messages: RwSignal::new(Vec::new()),
error_messages: RwSignal::new(Vec::new()),
balance_trigger,
target_balance,
faucet_balance,
target_address,
Expand All @@ -77,11 +74,10 @@ impl FaucetController {

#[allow(dead_code)]
pub fn refetch_balances(&self) {
use leptos::SignalGetUntracked;
use leptos::prelude::GetUntracked;

log::info!("Checking for new transactions");
self.faucet.target_balance.refetch();
self.faucet.faucet_balance.refetch();
self.faucet.balance_trigger.notify();
let pending = self
.faucet
.sent_messages
Expand Down Expand Up @@ -111,7 +107,12 @@ impl FaucetController {
}));
}
pub fn get_target_balance(&self) -> TokenAmount {
self.faucet.target_balance.get().unwrap_or_default()
self.faucet
.target_balance
.get()
.as_deref()
.cloned()
.unwrap_or_default()
}

pub fn get_target_address(&self) -> String {
Expand All @@ -131,7 +132,12 @@ impl FaucetController {
}

pub fn get_faucet_balance(&self) -> TokenAmount {
self.faucet.faucet_balance.get().unwrap_or_default()
self.faucet
.faucet_balance
.get()
.as_deref()
.cloned()
.unwrap_or_default()
}

pub fn get_error_messages(&self) -> Vec<String> {
Expand Down
12 changes: 5 additions & 7 deletions src/faucet/model.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
use cid::Cid;
use fvm_shared::{
address::{Address, Network},
econ::TokenAmount,
};
use leptos::{Resource, RwSignal};
use fvm_shared::{address::Network, econ::TokenAmount};
use leptos::prelude::{LocalResource, RwSignal, Trigger};

#[derive(Clone)]
pub(super) struct FaucetModel {
Expand All @@ -12,7 +9,8 @@ pub(super) struct FaucetModel {
pub send_limited: RwSignal<i32>,
pub sent_messages: RwSignal<Vec<(Cid, bool)>>,
pub error_messages: RwSignal<Vec<String>>,
pub faucet_balance: Resource<Option<Address>, TokenAmount>,
pub target_balance: Resource<String, TokenAmount>,
pub balance_trigger: Trigger,
pub faucet_balance: LocalResource<TokenAmount>,
pub target_balance: LocalResource<TokenAmount>,
pub target_address: RwSignal<String>,
}
2 changes: 1 addition & 1 deletion src/faucet/utils.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ use crate::{lotus_json::LotusJson, message::SignedMessage};
#[cfg(feature = "ssr")]
use fvm_shared::address::Network;
use fvm_shared::{address::Address, econ::TokenAmount, message::Message};
use leptos::{server, ServerFnError};
use leptos::{prelude::ServerFnError, server};

#[server]
pub async fn faucet_address(is_mainnet: bool) -> Result<LotusJson<Address>, ServerFnError> {
Expand Down
28 changes: 16 additions & 12 deletions src/faucet/views.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
use fvm_shared::address::Network;
use leptos::{component, event_target_value, view, IntoView, SignalGet};
use leptos::{component, leptos_dom::helpers::event_target_value, view, IntoView};

use leptos::*;
use leptos::prelude::*;
#[cfg(feature = "hydrate")]
use leptos_use::*;

Expand All @@ -10,7 +10,7 @@ use crate::faucet::utils::format_balance;

#[component]
pub fn Faucet(target_network: Network) -> impl IntoView {
let faucet = create_rw_signal(FaucetController::new(target_network));
let faucet = RwSignal::new(FaucetController::new(target_network));

#[cfg(feature = "hydrate")]
let _ = use_interval_fn(
Expand Down Expand Up @@ -67,9 +67,9 @@ pub fn Faucet(target_network: Network) -> impl IntoView {
.collect::<Vec<_>>()}
</div>
}
.into_view()
.into_any()
} else {
view! {}.into_view()
().into_any()
}
}}
<div class="max-w-2xl mx-auto">
Expand All @@ -92,14 +92,14 @@ pub fn Faucet(target_network: Network) -> impl IntoView {
<button class="bg-gray-400 text-white font-bold py-2 px-4 rounded-r" disabled=true>
"Sending..."
</button>
}
}.into_any()
} else if faucet.get().get_send_rate_limit_remaining() > 0 {
let duration = faucet.get().get_send_rate_limit_remaining();
view! {
<button class="bg-gray-400 text-white font-bold py-2 px-4 rounded-r" disabled=true>
{format!("Rate-limited! {duration}s")}
</button>
}
}.into_any()
} else {
view! {
<button
Expand All @@ -110,19 +110,23 @@ pub fn Faucet(target_network: Network) -> impl IntoView {
>
Send
</button>
}
}.into_any()
}
}}

</div>
<div class="flex justify-between my-4">
<div>
<h3 class="text-lg font-semibold">Faucet Balance:</h3>
<p class="text-xl">{ move || format_balance(&faucet.get().get_faucet_balance(), &faucet.get().get_fil_unit()) }</p>
<Suspense fallback={move || view!{ <p>Loading faucet balance...</p> }}>
<p class="text-xl">{ move || format_balance(&faucet.get().get_faucet_balance(), &faucet.get().get_fil_unit()) }</p>
</Suspense>
</div>
<div>
<h3 class="text-lg font-semibold">Target Balance:</h3>
<p class="text-xl">{ move || format_balance(&faucet.get().get_target_balance(), &faucet.get().get_fil_unit()) }</p>
<Suspense fallback={move || view!{ <p>Loading target balance...</p> }}>
<p class="text-xl">{ move || format_balance(&faucet.get().get_target_balance(), &faucet.get().get_fil_unit()) }</p>
</Suspense>
</div>
</div>
<hr class="my-4 border-t border-gray-300" />
Expand All @@ -147,9 +151,9 @@ pub fn Faucet(target_network: Network) -> impl IntoView {
</ul>
</div>
}
.into_view()
.into_any()
} else {
view! {}.into_view()
().into_any()
}
}}
</div>
Expand Down
Loading
Loading