use std::path::PathBuf;
use anyhow::Result;
use clap::{Parser, Subcommand};
use hyli_registry::{program_id_hex_from_file, upload, UploadRequest};
#[derive(Debug, Parser)]
#[command(author, version, about = "Upload ZKVM binaries to the Hyli registry")]
struct Args {
#[command(subcommand)]
command: Command,
}
#[derive(Debug, Subcommand)]
enum Command {
Sp1(Sp1Args),
Risc0(Risc0Args),
}
#[derive(Debug, Parser)]
struct CommonArgs {
#[arg(
long,
env = "HYLI_REGISTRY_URL",
default_value = "http://localhost:9003"
)]
server_url: String,
#[arg(long, env = "HYLI_REGISTRY_API_KEY", default_value = "dev")]
api_key: String,
#[arg(long)]
contract: String,
#[arg(long)]
toolchain: String,
#[arg(long)]
commit: String,
}
#[derive(Debug, Parser)]
struct Sp1Args {
#[command(flatten)]
common: CommonArgs,
#[arg(long)]
elf: PathBuf,
#[arg(long)]
vk: PathBuf,
#[arg(long, default_value = "sp1")]
zkvm: String,
}
#[derive(Debug, Parser)]
struct Risc0Args {
#[command(flatten)]
common: CommonArgs,
#[arg(long)]
img: PathBuf,
#[arg(long)]
program_id: String,
#[arg(long, default_value = "risc0")]
zkvm: String,
}
#[tokio::main]
async fn main() -> Result<()> {
let args = Args::parse();
let response = match args.command {
Command::Sp1(args) => {
let program_id = program_id_hex_from_file(&args.vk)?;
upload(UploadRequest {
server_url: &args.common.server_url,
api_key: &args.common.api_key,
contract: &args.common.contract,
program_id: &program_id,
binary_path: &args.elf,
toolchain: &args.common.toolchain,
commit: &args.common.commit,
zkvm: &args.zkvm,
})
.await?
}
Command::Risc0(args) => {
upload(UploadRequest {
server_url: &args.common.server_url,
api_key: &args.common.api_key,
contract: &args.common.contract,
program_id: &args.program_id,
binary_path: &args.img,
toolchain: &args.common.toolchain,
commit: &args.common.commit,
zkvm: &args.zkvm,
})
.await?
}
};
println!("Uploaded program_id: {}", response.program_id);
println!("Response: {}", response.body);
Ok(())
}