Skip to content

Commit f3b727d

Browse files
authored
Merge pull request #45 from kanari-network/kari-server
Kari server
2 parents 05eeccd + 4562b0a commit f3b727d

19 files changed

Lines changed: 1757 additions & 1231 deletions

File tree

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ categories = ["development-tools"]
7878
keywords = ["blockchain", "sdk", "move", "monaOS", "monaVM", "rust", "ifps", "storage", "wallet", "framework"] # Keywords for crates.io search.
7979
homepage = "https://kanari.network" # Project homepage.
8080
documentation = "https://docs.kanari.network" # Link to project documentation.
81-
version = "0.1.2" # Current version of the SDK.
81+
version = "0.1.3" # Current version of the SDK.
8282
authors = ["Kanari Network"] # Authors of the SDK.
8383
license = "Apache-2.0" # License information.
8484
repository = "https://github.com/kanari-network/kanari-sdk" # Link to the code repository.
@@ -117,7 +117,7 @@ jsonrpc-core = "18.0"
117117
jsonrpc-http-server = "18.0"
118118
tokio = { version = "1", features = ["full"] }
119119
url = "2.5.4"
120-
reqwest = { version = "0.12.15"}
120+
reqwest = { version = "0.12.18"}
121121
base64 = "0.22.1"
122122
# Error Handling & Diagnostics
123123
anyhow = "1.0.98"
Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -3,47 +3,47 @@ use std::io::{self};
33
use serde_yaml::{Value, Mapping};
44
use common::{load_kanari_config, save_kanari_config};
55

6-
pub fn handle_network_command() -> io::Result<()> {
6+
pub fn handle_env_command() -> io::Result<()> {
77
let args: Vec<String> = std::env::args().collect();
88

99
if args.len() < 3 {
10-
display_network_help();
10+
display_env_help();
1111
return Ok(());
1212
}
1313

1414
match args[2].as_str() {
15-
"list" => list_networks()?,
16-
"switch" if args.len() >= 4 => switch_network(&args[3])?,
17-
"add" if args.len() >= 4 => add_network(&args[3], args.get(4).map(|s| s.as_str()).unwrap_or("http://127.0.0.1:30030"))?,
18-
"remove" if args.len() >= 4 => remove_network(&args[3])?,
19-
_ => display_network_help(),
15+
"list" => list_envs()?,
16+
"switch" if args.len() >= 4 => switch_env(&args[3])?,
17+
"add" if args.len() >= 4 => add_env(&args[3], args.get(4).map(|s| s.as_str()).unwrap_or("http://127.0.0.1:30030"))?,
18+
"remove" if args.len() >= 4 => remove_env(&args[3])?,
19+
_ => display_env_help(),
2020
}
2121

2222
Ok(())
2323
}
2424

25-
fn display_network_help() {
26-
println!("\n{}", "KARI NETWORK MANAGEMENT".bright_yellow().bold());
25+
fn display_env_help() {
26+
println!("\n{}", "KARI ENVIRONMENT MANAGEMENT".bright_yellow().bold());
2727
println!("{}", "Available commands:".bright_white());
28-
println!(" {:<20} {}", "list".green(), "List all available networks");
29-
println!(" {:<20} {}", "switch <name>".green(), "Switch to the specified network");
30-
println!(" {:<20} {}", "add <name> [url]".green(), "Add a new network with optional URL");
31-
println!(" {:<20} {}", "remove <name>".green(), "Remove a network configuration");
28+
println!(" {:<20} {}", "list".green(), "List all available environments");
29+
println!(" {:<20} {}", "switch <name>".green(), "Switch to the specified environment");
30+
println!(" {:<20} {}", "add <name> [url]".green(), "Add a new environment with optional URL");
31+
println!(" {:<20} {}", "remove <name>".green(), "Remove an environment configuration");
3232
println!("\n{}", "Examples:".bright_yellow());
33-
println!(" kari network list");
34-
println!(" kari network switch dev");
35-
println!(" kari network add local_test http://127.0.0.1:30035");
36-
println!(" kari network remove local_test");
33+
println!(" kari env list");
34+
println!(" kari env switch dev");
35+
println!(" kari env add local_test http://127.0.0.1:30035");
36+
println!(" kari env remove local_test");
3737
}
3838

39-
fn list_networks() -> io::Result<()> {
39+
fn list_envs() -> io::Result<()> {
4040
let kanari_config = load_kanari_config()?;
4141

4242
let active_env = kanari_config.get("active_env")
4343
.and_then(|v| v.as_str())
4444
.unwrap_or("local");
4545

46-
println!("\n{}", "AVAILABLE NETWORKS".bright_yellow().bold());
46+
println!("\n{}", "AVAILABLE ENVIRONMENTS".bright_yellow().bold());
4747
println!("{:<15} {:<40} {}", "NAME".bright_white(), "RPC URL".bright_white(), "STATUS".bright_white());
4848

4949
if let Some(envs) = kanari_config.get("envs").and_then(|v| v.as_sequence()) {
@@ -65,24 +65,24 @@ fn list_networks() -> io::Result<()> {
6565
Ok(())
6666
}
6767

68-
fn switch_network(name: &str) -> io::Result<()> {
68+
fn switch_env(name: &str) -> io::Result<()> {
6969
let mut kanari_config = load_kanari_config()?;
7070

71-
// Verify the network exists
72-
let mut network_exists = false;
71+
// Verify the environment exists
72+
let mut env_exists = false;
7373
if let Some(envs) = kanari_config.get("envs").and_then(|v| v.as_sequence()) {
7474
for env in envs {
7575
if let Some(alias) = env.get("alias").and_then(|v| v.as_str()) {
7676
if alias == name {
77-
network_exists = true;
77+
env_exists = true;
7878
break;
7979
}
8080
}
8181
}
8282
}
83-
84-
if !network_exists {
85-
println!("{}", format!("Network '{}' not found.", name).red());
83+
84+
if !env_exists {
85+
println!("{}", format!("Environment '{}' not found.", name).red());
8686
return Ok(());
8787
}
8888

@@ -106,28 +106,28 @@ fn switch_network(name: &str) -> io::Result<()> {
106106
Ok(())
107107
}
108108

109-
fn add_network(name: &str, rpc_url: &str) -> io::Result<()> {
109+
fn add_env(name: &str, rpc_url: &str) -> io::Result<()> {
110110
let mut kanari_config = load_kanari_config()?;
111111

112-
// Check if network already exists
113-
let mut network_exists = false;
112+
// Check if environment already exists
113+
let mut env_exists = false;
114114
if let Some(envs) = kanari_config.get("envs").and_then(|v| v.as_sequence()) {
115115
for env in envs {
116116
if let Some(alias) = env.get("alias").and_then(|v| v.as_str()) {
117117
if alias == name {
118-
network_exists = true;
118+
env_exists = true;
119119
break;
120120
}
121121
}
122122
}
123123
}
124-
125-
if network_exists {
126-
println!("{}", format!("Network '{}' already exists. Use a different name.", name).red());
124+
125+
if env_exists {
126+
println!("{}", format!("Environment '{}' already exists. Use a different name.", name).red());
127127
return Ok(());
128128
}
129-
130-
// Create new network entry
129+
130+
// Create new environment entry
131131
let mut new_env = Mapping::new();
132132
new_env.insert(Value::String("alias".to_string()), Value::String(name.to_string()));
133133
new_env.insert(Value::String("rpc".to_string()), Value::String(rpc_url.to_string()));
@@ -163,10 +163,10 @@ fn add_network(name: &str, rpc_url: &str) -> io::Result<()> {
163163
Ok(())
164164
}
165165

166-
fn remove_network(name: &str) -> io::Result<()> {
167-
// Don't allow removing primary networks
166+
fn remove_env(name: &str) -> io::Result<()> {
167+
// Don't allow removing primary environments
168168
if name == "local" || name == "dev" || name == "test" || name == "main" {
169-
println!("{}", format!("Cannot remove built-in network '{}'.", name).red());
169+
println!("{}", format!("Cannot remove built-in environment '{}'.", name).red());
170170
return Ok(());
171171
}
172172

@@ -175,24 +175,24 @@ fn remove_network(name: &str) -> io::Result<()> {
175175
let active_env = kanari_config.get("active_env")
176176
.and_then(|v| v.as_str())
177177
.unwrap_or("local");
178-
179-
// Check if trying to remove active network
178+
179+
// Check if trying to remove active environment
180180
if active_env == name {
181-
println!("{}", "Cannot remove currently active network.".red());
182-
println!("Switch to another network first with: kari network switch <name>");
181+
println!("{}", "Cannot remove currently active environment.".red());
182+
println!("Switch to another environment first with: kari env switch <name>");
183183
return Ok(());
184184
}
185-
186-
// Remove the network
187-
let mut network_found = false;
185+
186+
// Remove the environment
187+
let mut env_found = false;
188188
if let Some(mapping) = kanari_config.as_mapping_mut() {
189189
if let Some(envs) = mapping.get_mut("envs").and_then(|v| v.as_sequence_mut()) {
190190
let mut index_to_remove = None;
191191
for (i, env) in envs.iter().enumerate() {
192192
if let Some(alias) = env.get("alias").and_then(|v| v.as_str()) {
193193
if alias == name {
194194
index_to_remove = Some(i);
195-
network_found = true;
195+
env_found = true;
196196
break;
197197
}
198198
}
@@ -203,16 +203,16 @@ fn remove_network(name: &str) -> io::Result<()> {
203203
}
204204
}
205205
}
206-
207-
if !network_found {
208-
println!("{}", format!("Network '{}' not found.", name).red());
206+
207+
if !env_found {
208+
println!("{}", format!("Environment '{}' not found.", name).red());
209209
return Ok(());
210210
}
211211

212212
// Save updated config
213213
save_kanari_config(&kanari_config)?;
214-
215-
println!("{}", format!("Removed network: {}", name).green());
216-
214+
215+
println!("{}", format!("Removed environment: {}", name).green());
216+
217217
Ok(())
218218
}

crates/command/src/keytool_cli/mod.rs

Lines changed: 45 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ use std::process::Command;
1515
// Add the required import for CurveType and key-related functions
1616
use key::keys::{import_from_private_key, import_from_seed_phrase, generate_karix_address};
1717
use key::keys::CurveType;
18+
use common::{load_config, load_kanari_config};
1819

1920
struct CommandInfo {
2021
name: &'static str,
@@ -235,6 +236,9 @@ pub fn handle_keytool_command() -> Option<String> {
235236
// Load blockchain first
236237
match load_blockchain_with_retry() {
237238
Ok(_) => {
239+
// Get RPC endpoint from configuration
240+
let rpc_endpoint = get_rpc_endpoint();
241+
238242
// Get sender address (current wallet)
239243
let wallets = match list_wallet_files() {
240244
Ok(w) => w,
@@ -378,9 +382,6 @@ pub fn handle_keytool_command() -> Option<String> {
378382

379383
println!("Sending transaction...");
380384

381-
// Use a simple command-line tool for making HTTP requests
382-
// Instead of using reqwest blocking client
383-
384385
// Create the JSON payload
385386
let json_payload = json!({
386387
"jsonrpc": "2.0",
@@ -404,12 +405,12 @@ pub fn handle_keytool_command() -> Option<String> {
404405
"curl"
405406
};
406407

407-
// Execute curl command to send the request
408+
// Execute curl command to send the request with dynamic endpoint
408409
let output = Command::new(curl_cmd)
409410
.arg("-s")
410411
.arg("-X")
411412
.arg("POST")
412-
.arg("http://127.0.0.1:30031")
413+
.arg(&rpc_endpoint) // Use dynamic endpoint instead of hardcoded
413414
.arg("-H")
414415
.arg("Content-Type: application/json")
415416
.arg("-d")
@@ -448,14 +449,14 @@ pub fn handle_keytool_command() -> Option<String> {
448449
}
449450
}
450451
} else {
451-
println!("{}", "HTTP request failed".red());
452+
println!("{}", format!("HTTP request failed to {}", rpc_endpoint).red());
452453
println!("Error: {}", String::from_utf8_lossy(&output.stderr));
453454
return None;
454455
}
455456
},
456457
Err(e) => {
457-
println!("{}", format!("Failed to execute HTTP request: {}", e).red());
458-
println!("Make sure curl is installed on your system");
458+
println!("{}", format!("Failed to execute HTTP request to {}: {}", rpc_endpoint, e).red());
459+
println!("Make sure curl is installed and the node is running at {}", rpc_endpoint);
459460
return None;
460461
}
461462
}
@@ -1165,4 +1166,40 @@ fn prompt_password(confirm: bool) -> String {
11651166
}
11661167
}
11671168
password
1169+
}
1170+
1171+
// Add helper function to get RPC endpoint from configuration
1172+
fn get_rpc_endpoint() -> String {
1173+
// Try to get RPC endpoint from kanari config first
1174+
if let Ok(kanari_config) = load_kanari_config() {
1175+
if let Some(active_env) = kanari_config.get("active_env").and_then(|v| v.as_str()) {
1176+
if let Some(envs) = kanari_config.get("envs").and_then(|v| v.as_sequence()) {
1177+
for env in envs {
1178+
if let Some(alias) = env.get("alias").and_then(|v| v.as_str()) {
1179+
if alias == active_env {
1180+
if let Some(rpc_url) = env.get("rpc").and_then(|v| v.as_str()) {
1181+
println!("Using RPC endpoint from kanari config: {}", rpc_url.green());
1182+
return rpc_url.to_string();
1183+
}
1184+
}
1185+
}
1186+
}
1187+
}
1188+
}
1189+
}
1190+
1191+
// Fallback to load_config (legacy support)
1192+
if let Ok(config) = load_config() {
1193+
if let Some(port) = config.get("rpc_port").and_then(|v| v.as_u64()) {
1194+
let endpoint = format!("http://127.0.0.1:{}", port);
1195+
println!("Using RPC endpoint from config: {}", endpoint.green());
1196+
return endpoint;
1197+
}
1198+
}
1199+
1200+
// Final fallback to default
1201+
let default_endpoint = "http://127.0.0.1:30030".to_string();
1202+
println!("{}", format!("Warning: Could not determine RPC endpoint from config, using default: {}", default_endpoint).yellow());
1203+
println!("Make sure your node is running on the default port or check your configuration.");
1204+
default_endpoint
11681205
}

crates/command/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ pub mod move_cli;
44

55
pub mod public_cli;
66

7-
pub mod network_cli;
7+
pub mod env_cli;
88

99
pub mod server_cli;

crates/command/src/server_cli/init_server.rs

Lines changed: 3 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,7 @@
1-
use common::{get_kanari_config_path, save_kanari_config, get_kari_dir};
2-
use serde_yaml::{Value, Mapping};
1+
use common::{init_default_config, get_kanari_config_path};
32
use std::io;
43
use colored::Colorize;
54

6-
fn default_keystore_path() -> String {
7-
let mut path = get_kari_dir();
8-
path.push("kanari_config");
9-
path.push("kanari.keystore");
10-
path.to_string_lossy().into_owned()
11-
}
12-
13-
fn create_env_config(alias: &str, rpc: &str, ws: &str) -> Value {
14-
let mut env_map = Mapping::new();
15-
env_map.insert(Value::String("alias".to_string()), Value::String(alias.to_string()));
16-
env_map.insert(Value::String("rpc".to_string()), Value::String(rpc.to_string()));
17-
env_map.insert(Value::String("ws".to_string()), Value::String(ws.to_string()));
18-
Value::Mapping(env_map)
19-
}
20-
215
pub fn init_server_config() -> io::Result<()> {
226
let config_path = get_kanari_config_path();
237

@@ -26,28 +10,8 @@ pub fn init_server_config() -> io::Result<()> {
2610
return Ok(());
2711
}
2812

29-
let mut config = Mapping::new();
30-
config.insert(
31-
Value::String("keystore_path".to_string()),
32-
Value::String(default_keystore_path()),
33-
);
34-
config.insert(
35-
Value::String("active_address".to_string()),
36-
Value::Null,
37-
);
38-
39-
let envs = vec![
40-
create_env_config("local", "http://127.0.0.1:30030", "ws://127.0.0.1:30031"),
41-
create_env_config("dev", "https://dev-seed.kanari.site", "wss://dev-seed.kanari.site/websocket"),
42-
create_env_config("test", "https://test-seed.kanari.site", "wss://test-seed.kanari.site/websocket"),
43-
create_env_config("main", "https://main-seed.kanari.site", "wss://main-seed.kanari.site/websocket"),
44-
];
45-
46-
config.insert(Value::String("envs".to_string()), Value::Sequence(envs));
47-
config.insert(Value::String("active_env".to_string()), Value::String("local".to_string()));
48-
49-
let yaml_value = Value::Mapping(config);
50-
save_kanari_config(&yaml_value)?;
13+
// Use the centralized initialization function
14+
init_default_config()?;
5115

5216
println!("{} {}", "Default kanari.yaml created at:".green(), config_path.display().to_string().bright_white());
5317
Ok(())

0 commit comments

Comments
 (0)