diff --git a/lib/web/rgb.ts b/lib/web/rgb.ts index 1b915656..1033b48c 100644 --- a/lib/web/rgb.ts +++ b/lib/web/rgb.ts @@ -5,7 +5,7 @@ import * as BMC from "./bitmask_core"; export const issueContract = async ( nostrHexSk: string, - request: IssueRequest + request: IssuePreRequest ): Promise => JSON.parse(await BMC.issue_contract(nostrHexSk, request)); @@ -250,7 +250,7 @@ export interface IssueMetadata { collectible?: NewCollectible[]; } -export interface IssueRequest { +export interface IssuePreRequest { /// The ticker of the asset ticker: string; /// Name of the asset @@ -266,7 +266,7 @@ export interface IssueRequest { /// The name of the iface (ex: RGB20) iface: string; /// contract metadata (only RGB21/UDA) - meta?: IssueMediaRequest; + meta?: MediaRequest; } export interface NewCollectible { diff --git a/src/structs.rs b/src/structs.rs index f4842e19..b1a880d0 100644 --- a/src/structs.rs +++ b/src/structs.rs @@ -112,6 +112,41 @@ pub struct IssueAssetRequest { pub request: IssueRequest, } +#[derive(Serialize, Deserialize, Debug, Clone, Default)] +#[serde(rename_all = "camelCase")] +#[derive(Validate)] +#[garde(context(RGBContext))] +pub struct IssuePreRequest { + /// The ticker of the asset + #[garde(ascii)] + #[garde(length(min = 1, max = 8))] + pub ticker: String, + /// Name of the asset + #[garde(ascii)] + #[garde(length(min = 1, max = 40))] + pub name: String, + /// Description of the asset + #[garde(ascii)] + #[garde(length(min = u8::MIN.into(), max = u8::MAX.into()))] + pub description: String, + /// Amount of the asset + #[garde(range(min = u64::MIN, max = u64::MAX))] + pub supply: u64, + /// Precision of the asset + #[garde(range(min = u8::MIN, max = u8::MAX))] + pub precision: u8, + /// Seal of the initial owner + #[garde(ascii)] + #[garde(custom(verify_tapret_seal))] + pub seal: String, + /// The name of the iface (ex: RGB20) + #[garde(alphanumeric)] + pub iface: String, + /// contract metadata (only RGB21/UDA) + #[garde(skip)] + pub meta: Option, +} + #[derive(Serialize, Deserialize, Debug, Clone, Default)] #[serde(rename_all = "camelCase")] #[derive(Validate)] diff --git a/src/web.rs b/src/web.rs index ecea196e..606dbaf3 100644 --- a/src/web.rs +++ b/src/web.rs @@ -7,10 +7,10 @@ use wasm_bindgen_futures::{future_to_promise, JsFuture}; use crate::rgb::structs::ContractAmount; use crate::structs::{ - AcceptRequest, FullRgbTransferRequest, ImportRequest, InvoiceRequest, IssueRequest, - MediaRequest, PsbtRequest, PublishPsbtRequest, ReIssueRequest, RgbBidRequest, RgbOfferRequest, - RgbRemoveTransferRequest, RgbSaveTransferRequest, RgbSwapRequest, RgbTransferRequest, - SecretString, SignPsbtRequest, WatcherRequest, + AcceptRequest, FullRgbTransferRequest, ImportRequest, InvoiceRequest, IssueMediaRequest, + IssuePreRequest, IssueRequest, MediaRequest, PsbtRequest, PublishPsbtRequest, ReIssueRequest, + RgbBidRequest, RgbOfferRequest, RgbRemoveTransferRequest, RgbSaveTransferRequest, + RgbSwapRequest, RgbTransferRequest, SecretString, SignPsbtRequest, WatcherRequest, }; pub fn set_panic_hook() { @@ -381,7 +381,25 @@ pub mod rgb { set_panic_hook(); future_to_promise(async move { - let req: IssueRequest = serde_wasm_bindgen::from_value(request).unwrap(); + let pre_req: IssuePreRequest = serde_wasm_bindgen::from_value(request).unwrap(); + let media = match pre_req.meta { + Some(media) => { + let media = serde_wasm_bindgen::to_value(&media).expect(""); + let media = resolve(import_uda_data(media)).await; + Some(IssueMediaRequest::from(media)) + } + None => None, + }; + let req = IssueRequest { + ticker: pre_req.ticker, + name: pre_req.name, + description: pre_req.description, + supply: pre_req.supply, + precision: pre_req.precision, + seal: pre_req.seal, + iface: pre_req.iface, + meta: Some(media), + }; match crate::rgb::issue_contract(&nostr_hex_sk, req).await { Ok(result) => Ok(JsValue::from_string( serde_json::to_string(&result).unwrap(),