Skip to content

Commit

Permalink
Merge pull request #1300 from rainlanguage/2025-02-14-vault-id-fix
Browse files Browse the repository at this point in the history
Set vault id to None if given string is undefined or empty
  • Loading branch information
hardyjosh authored Feb 15, 2025
2 parents 1334ecc + 51e1812 commit 1428044
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 30 deletions.
2 changes: 1 addition & 1 deletion crates/js_api/src/gui/order_operations.rs
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,7 @@ impl DotrainOrderGui {
&mut self,
is_input: bool,
index: u8,
vault_id: String,
vault_id: Option<String>,
) -> Result<(), GuiError> {
let deployment = self.get_current_deployment()?;
self.dotrain_order
Expand Down
12 changes: 5 additions & 7 deletions crates/js_api/src/gui/state_management.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
52 changes: 42 additions & 10 deletions crates/settings/src/order.rs
Original file line number Diff line number Diff line change
Expand Up @@ -69,9 +69,32 @@ impl Order {
&mut self,
is_input: bool,
index: u8,
vault_id: String,
vault_id: Option<String>,
) -> Result<Self, YamlError> {
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
Expand All @@ -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 {
Expand Down Expand Up @@ -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),
}

Expand Down
12 changes: 8 additions & 4 deletions crates/settings/src/yaml/dotrain.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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)));
Expand All @@ -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)));
Expand Down
10 changes: 10 additions & 0 deletions packages/orderbook/test/js_api/gui.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 () => {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down

0 comments on commit 1428044

Please sign in to comment.