Skip to content

Commit 7ad3564

Browse files
Merge pull request #253 from BitGo/BTC-0.delete-kvpair
feat(wasm-utxo): add PSBT key-value deletion methods
2 parents 3f59e99 + ef51480 commit 7ad3564

5 files changed

Lines changed: 139 additions & 0 deletions

File tree

packages/wasm-utxo/js/psbt.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@ export interface IPsbt extends ITransactionCommon<PsbtInputData, PsbtOutputData>
2020
removeOutput(index: number): void;
2121
setKV(key: PsbtKvKey, value: Uint8Array): void;
2222
getKV(key: PsbtKvKey): Uint8Array | undefined;
23+
deleteKV(key: PsbtKvKey): void;
2324
setInputKV(index: number, key: PsbtKvKey, value: Uint8Array): void;
2425
getInputKV(index: number, key: PsbtKvKey): Uint8Array | undefined;
26+
deleteInputKV(index: number, key: PsbtKvKey): void;
2527
setOutputKV(index: number, key: PsbtKvKey, value: Uint8Array): void;
2628
getOutputKV(index: number, key: PsbtKvKey): Uint8Array | undefined;
29+
deleteOutputKV(index: number, key: PsbtKvKey): void;
2730
}
2831

2932
/** Extended PSBT with address resolution (no coin parameter needed) */

packages/wasm-utxo/js/psbtBase.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,13 @@ interface WasmPsbtBase {
1616
remove_output(index: number): void;
1717
set_kv(key: unknown, value: Uint8Array): void;
1818
get_kv(key: unknown): Uint8Array | null | undefined;
19+
delete_kv(key: unknown): void;
1920
set_input_kv(index: number, key: unknown, value: Uint8Array): void;
2021
get_input_kv(index: number, key: unknown): Uint8Array | null | undefined;
22+
delete_input_kv(index: number, key: unknown): void;
2123
set_output_kv(index: number, key: unknown, value: Uint8Array): void;
2224
get_output_kv(index: number, key: unknown): Uint8Array | null | undefined;
25+
delete_output_kv(index: number, key: unknown): void;
2326
}
2427

2528
export abstract class PsbtBase<W extends WasmPsbtBase> {
@@ -80,4 +83,13 @@ export abstract class PsbtBase<W extends WasmPsbtBase> {
8083
getOutputKV(index: number, key: PsbtKvKey): Uint8Array | undefined {
8184
return this._wasm.get_output_kv(index, key) ?? undefined;
8285
}
86+
deleteKV(key: PsbtKvKey): void {
87+
this._wasm.delete_kv(key);
88+
}
89+
deleteInputKV(index: number, key: PsbtKvKey): void {
90+
this._wasm.delete_input_kv(index, key);
91+
}
92+
deleteOutputKV(index: number, key: PsbtKvKey): void {
93+
this._wasm.delete_output_kv(index, key);
94+
}
8395
}

packages/wasm-utxo/src/psbt_ops.rs

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,14 @@ pub trait PsbtAccess {
4848
self.psbt().proprietary.get(key).cloned()
4949
}
5050

51+
fn delete_global_unknown_kv(&mut self, key: raw::Key) {
52+
self.psbt_mut().unknown.remove(&key);
53+
}
54+
55+
fn delete_global_proprietary_kv(&mut self, key: raw::ProprietaryKey) {
56+
self.psbt_mut().proprietary.remove(&key);
57+
}
58+
5159
// -------------------------------------------------------------------------
5260
// Per-input KV accessors
5361
// -------------------------------------------------------------------------
@@ -112,6 +120,32 @@ pub trait PsbtAccess {
112120
Ok(self.psbt().inputs[index].proprietary.get(key).cloned())
113121
}
114122

123+
fn delete_input_unknown_kv(&mut self, index: usize, key: raw::Key) -> Result<(), String> {
124+
let len = self.psbt().inputs.len();
125+
if index >= len {
126+
return Err(format!(
127+
"input index {index} out of bounds (have {len} inputs)"
128+
));
129+
}
130+
self.psbt_mut().inputs[index].unknown.remove(&key);
131+
Ok(())
132+
}
133+
134+
fn delete_input_proprietary_kv(
135+
&mut self,
136+
index: usize,
137+
key: raw::ProprietaryKey,
138+
) -> Result<(), String> {
139+
let len = self.psbt().inputs.len();
140+
if index >= len {
141+
return Err(format!(
142+
"input index {index} out of bounds (have {len} inputs)"
143+
));
144+
}
145+
self.psbt_mut().inputs[index].proprietary.remove(&key);
146+
Ok(())
147+
}
148+
115149
// -------------------------------------------------------------------------
116150
// Per-output KV accessors
117151
// -------------------------------------------------------------------------
@@ -178,6 +212,32 @@ pub trait PsbtAccess {
178212
Ok(self.psbt().outputs[index].proprietary.get(key).cloned())
179213
}
180214

215+
fn delete_output_unknown_kv(&mut self, index: usize, key: raw::Key) -> Result<(), String> {
216+
let len = self.psbt().outputs.len();
217+
if index >= len {
218+
return Err(format!(
219+
"output index {index} out of bounds (have {len} outputs)"
220+
));
221+
}
222+
self.psbt_mut().outputs[index].unknown.remove(&key);
223+
Ok(())
224+
}
225+
226+
fn delete_output_proprietary_kv(
227+
&mut self,
228+
index: usize,
229+
key: raw::ProprietaryKey,
230+
) -> Result<(), String> {
231+
let len = self.psbt().outputs.len();
232+
if index >= len {
233+
return Err(format!(
234+
"output index {index} out of bounds (have {len} outputs)"
235+
));
236+
}
237+
self.psbt_mut().outputs[index].proprietary.remove(&key);
238+
Ok(())
239+
}
240+
181241
fn remove_input(&mut self, index: usize) -> Result<(), String> {
182242
let psbt = self.psbt_mut();
183243
if index >= psbt.inputs.len() {

packages/wasm-utxo/src/wasm/psbt.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -833,6 +833,26 @@ macro_rules! impl_wasm_psbt_ops {
833833
) -> Result<Option<Vec<u8>>, $crate::error::WasmUtxoError> {
834834
self.wasm_get_output_kv(index, key)
835835
}
836+
pub fn delete_kv(
837+
&mut self,
838+
key: ::wasm_bindgen::JsValue,
839+
) -> Result<(), $crate::error::WasmUtxoError> {
840+
self.wasm_delete_kv(key)
841+
}
842+
pub fn delete_input_kv(
843+
&mut self,
844+
index: usize,
845+
key: ::wasm_bindgen::JsValue,
846+
) -> Result<(), $crate::error::WasmUtxoError> {
847+
self.wasm_delete_input_kv(index, key)
848+
}
849+
pub fn delete_output_kv(
850+
&mut self,
851+
index: usize,
852+
key: ::wasm_bindgen::JsValue,
853+
) -> Result<(), $crate::error::WasmUtxoError> {
854+
self.wasm_delete_output_kv(index, key)
855+
}
836856
}
837857
};
838858
($type:ty, $field:ident) => {
@@ -921,6 +941,26 @@ macro_rules! impl_wasm_psbt_ops {
921941
) -> Result<Option<Vec<u8>>, $crate::error::WasmUtxoError> {
922942
self.$field.wasm_get_output_kv(index, key)
923943
}
944+
pub fn delete_kv(
945+
&mut self,
946+
key: ::wasm_bindgen::JsValue,
947+
) -> Result<(), $crate::error::WasmUtxoError> {
948+
self.$field.wasm_delete_kv(key)
949+
}
950+
pub fn delete_input_kv(
951+
&mut self,
952+
index: usize,
953+
key: ::wasm_bindgen::JsValue,
954+
) -> Result<(), $crate::error::WasmUtxoError> {
955+
self.$field.wasm_delete_input_kv(index, key)
956+
}
957+
pub fn delete_output_kv(
958+
&mut self,
959+
index: usize,
960+
key: ::wasm_bindgen::JsValue,
961+
) -> Result<(), $crate::error::WasmUtxoError> {
962+
self.$field.wasm_delete_output_kv(index, key)
963+
}
924964
}
925965
};
926966
}

packages/wasm-utxo/src/wasm/psbt_ops.rs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,30 @@ pub(crate) trait WasmPsbtOps: PsbtAccess {
114114
}
115115
.map_err(|e| WasmUtxoError::new(&e))
116116
}
117+
118+
fn wasm_delete_kv(&mut self, key: JsValue) -> Result<(), WasmUtxoError> {
119+
match PsbtKvKey::try_from_js_value(&key)? {
120+
PsbtKvKey::Unknown(k) => PsbtAccess::delete_global_unknown_kv(self, k),
121+
PsbtKvKey::Proprietary(k) => PsbtAccess::delete_global_proprietary_kv(self, k),
122+
}
123+
Ok(())
124+
}
125+
126+
fn wasm_delete_input_kv(&mut self, index: usize, key: JsValue) -> Result<(), WasmUtxoError> {
127+
match PsbtKvKey::try_from_js_value(&key)? {
128+
PsbtKvKey::Unknown(k) => PsbtAccess::delete_input_unknown_kv(self, index, k),
129+
PsbtKvKey::Proprietary(k) => PsbtAccess::delete_input_proprietary_kv(self, index, k),
130+
}
131+
.map_err(|e| WasmUtxoError::new(&e))
132+
}
133+
134+
fn wasm_delete_output_kv(&mut self, index: usize, key: JsValue) -> Result<(), WasmUtxoError> {
135+
match PsbtKvKey::try_from_js_value(&key)? {
136+
PsbtKvKey::Unknown(k) => PsbtAccess::delete_output_unknown_kv(self, index, k),
137+
PsbtKvKey::Proprietary(k) => PsbtAccess::delete_output_proprietary_kv(self, index, k),
138+
}
139+
.map_err(|e| WasmUtxoError::new(&e))
140+
}
117141
}
118142

119143
impl<T: PsbtAccess> WasmPsbtOps for T {}

0 commit comments

Comments
 (0)