diff --git a/crates/js_api/src/gui/order_operations.rs b/crates/js_api/src/gui/order_operations.rs index bbe4fbcf0..22f8b7122 100644 --- a/crates/js_api/src/gui/order_operations.rs +++ b/crates/js_api/src/gui/order_operations.rs @@ -310,7 +310,7 @@ impl DotrainOrderGui { &mut self, is_input: bool, index: u8, - vault_id: String, + vault_id: Option, ) -> Result<(), GuiError> { let deployment = self.get_current_deployment()?; self.dotrain_order diff --git a/crates/js_api/src/gui/state_management.rs b/crates/js_api/src/gui/state_management.rs index e1293c5a4..4bd12feca 100644 --- a/crates/js_api/src/gui/state_management.rs +++ b/crates/js_api/src/gui/state_management.rs @@ -220,13 +220,11 @@ impl DotrainOrderGui { &state.selected_deployment, )?; for ((is_input, index), vault_id) in state.vault_ids { - if let Some(vault_id) = vault_id { - dotrain_order_gui - .dotrain_order - .dotrain_yaml() - .get_order(&order_key) - .and_then(|mut order| order.update_vault_id(is_input, index, vault_id))?; - } + dotrain_order_gui + .dotrain_order + .dotrain_yaml() + .get_order(&order_key) + .and_then(|mut order| order.update_vault_id(is_input, index, vault_id))?; } Ok(dotrain_order_gui) diff --git a/crates/settings/src/order.rs b/crates/settings/src/order.rs index 767e2344f..aa8832a65 100644 --- a/crates/settings/src/order.rs +++ b/crates/settings/src/order.rs @@ -69,9 +69,32 @@ impl Order { &mut self, is_input: bool, index: u8, - vault_id: String, + vault_id: Option, ) -> Result { - let new_vault_id = Order::validate_vault_id(&vault_id)?; + let new_vault_id = if let Some(ref v) = vault_id { + if v.is_empty() { + None + } else { + match Order::validate_vault_id(v) { + Ok(id) => Some(id), + Err(e) => { + return Err(YamlError::Field { + kind: FieldErrorKind::InvalidValue { + field: "vault-id".to_string(), + reason: e.to_string(), + }, + location: format!( + "index '{index}' of {} in order '{}'", + if is_input { "inputs" } else { "outputs" }, + self.key + ), + }); + } + } + } + } else { + None + }; let mut document = self .document @@ -91,14 +114,23 @@ impl Order { { if let Some(item) = vec.get_mut(index as usize) { if let StrictYaml::Hash(ref mut item_hash) = item { - item_hash.insert( - StrictYaml::String("vault-id".to_string()), - StrictYaml::String(vault_id.to_string()), - ); - if is_input { - self.inputs[index as usize].vault_id = Some(new_vault_id); + if let Some(vault_id) = new_vault_id { + item_hash.insert( + StrictYaml::String("vault-id".to_string()), + StrictYaml::String(vault_id.to_string()), + ); + if is_input { + self.inputs[index as usize].vault_id = Some(vault_id); + } else { + self.outputs[index as usize].vault_id = Some(vault_id); + } } else { - self.outputs[index as usize].vault_id = Some(new_vault_id); + item_hash.remove(&StrictYaml::String("vault-id".to_string())); + if is_input { + self.inputs[index as usize].vault_id = None; + } else { + self.outputs[index as usize].vault_id = None; + } } } else { return Err(YamlError::Field { @@ -767,7 +799,7 @@ pub enum ParseOrderConfigSourceError { expected: String, found: String, }, - #[error("Failed to parse vault {}", 0)] + #[error("Failed to parse vault id")] VaultParseError(#[from] alloy::primitives::ruint::ParseError), } diff --git a/crates/settings/src/yaml/dotrain.rs b/crates/settings/src/yaml/dotrain.rs index 80ced18f6..89404ec08 100644 --- a/crates/settings/src/yaml/dotrain.rs +++ b/crates/settings/src/yaml/dotrain.rs @@ -549,9 +549,11 @@ mod tests { assert!(order.inputs[0].vault_id.is_none()); assert!(order.outputs[0].vault_id.is_none()); - let mut updated_order = order.update_vault_id(true, 0, "1".to_string()).unwrap(); + let mut updated_order = order + .update_vault_id(true, 0, Some("1".to_string())) + .unwrap(); let updated_order = updated_order - .update_vault_id(false, 0, "11".to_string()) + .update_vault_id(false, 0, Some("11".to_string())) .unwrap(); assert_eq!(updated_order.inputs[0].vault_id, Some(U256::from(1))); @@ -561,9 +563,11 @@ mod tests { assert_eq!(order.inputs[0].vault_id, Some(U256::from(1))); assert_eq!(order.outputs[0].vault_id, Some(U256::from(11))); - let mut updated_order = order.update_vault_id(true, 0, "3".to_string()).unwrap(); + let mut updated_order = order + .update_vault_id(true, 0, Some("3".to_string())) + .unwrap(); let updated_order = updated_order - .update_vault_id(false, 0, "33".to_string()) + .update_vault_id(false, 0, Some("33".to_string())) .unwrap(); assert_eq!(updated_order.inputs[0].vault_id, Some(U256::from(3))); assert_eq!(updated_order.outputs[0].vault_id, Some(U256::from(33))); diff --git a/packages/orderbook/test/js_api/gui.test.ts b/packages/orderbook/test/js_api/gui.test.ts index 46ea81b42..4401a26bb 100644 --- a/packages/orderbook/test/js_api/gui.test.ts +++ b/packages/orderbook/test/js_api/gui.test.ts @@ -1212,6 +1212,16 @@ ${dotrainWithoutVaultIds}`; const vaultIds: IOVaultIds = gui.getVaultIds(); assert.equal(vaultIds.get('input')?.[0], '0x123'); assert.equal(vaultIds.get('output')?.[0], '0x234'); + + gui.setVaultId(true, 0, undefined); + assert.equal(gui.getVaultIds().get('input')?.[0], undefined); + + gui.setVaultId(false, 0, ''); + assert.equal(gui.getVaultIds().get('output')?.[0], undefined); + + expect(() => gui.setVaultId(true, 0, 'test')).toThrow( + "Invalid value for field 'vault-id': Failed to parse vault id in index '0' of inputs in order 'some-order'" + ); }); it('should skip deposits with zero amount for deposit calldata', async () => { diff --git a/packages/ui-components/src/lib/components/deployment/DeploymentSteps.svelte b/packages/ui-components/src/lib/components/deployment/DeploymentSteps.svelte index 2e8a80f10..124d917a7 100644 --- a/packages/ui-components/src/lib/components/deployment/DeploymentSteps.svelte +++ b/packages/ui-components/src/lib/components/deployment/DeploymentSteps.svelte @@ -230,15 +230,19 @@ const areAllTokensSelected = async () => { if (gui) { try { - allTokensSelected = gui?.areAllTokensSelected(); + allTokensSelected = gui.areAllTokensSelected(); if (!allTokensSelected) return; - const vaultIds = gui?.getVaultIds(); - const inputVaultIds = vaultIds?.get('input'); - const outputVaultIds = vaultIds?.get('output'); // if we have deposits or vault ids set, show advanced options - const deposits = gui?.getDeposits(); - if (deposits || inputVaultIds || outputVaultIds) { + const vaultIds = gui.getVaultIds(); + const inputVaultIds = vaultIds.get('input'); + const outputVaultIds = vaultIds.get('output'); + const deposits = gui.getDeposits(); + if ( + deposits.length > 0 || + (inputVaultIds && inputVaultIds.some((v) => v)) || + (outputVaultIds && outputVaultIds.some((v) => v)) + ) { showAdvancedOptions = true; } } catch (e) { diff --git a/packages/ui-components/src/lib/components/deployment/TokenIOInput.svelte b/packages/ui-components/src/lib/components/deployment/TokenIOInput.svelte index 886ccbc6e..55280ee78 100644 --- a/packages/ui-components/src/lib/components/deployment/TokenIOInput.svelte +++ b/packages/ui-components/src/lib/components/deployment/TokenIOInput.svelte @@ -42,8 +42,14 @@ const handleInput = async () => { const isInput = label === 'Input'; - gui?.setVaultId(isInput, i, inputValue); - handleUpdateGuiState(gui); + error = ''; + try { + gui?.setVaultId(isInput, i, inputValue); + handleUpdateGuiState(gui); + } catch (e) { + const errorMessage = (e as Error).message ? (e as Error).message : 'Error setting vault ID.'; + error = errorMessage; + } }; $: if (vault.token?.key) {