diff --git a/packages/wasm-utxo/js/bip322/index.ts b/packages/wasm-utxo/js/bip322/index.ts
index efe29756..802625d7 100644
--- a/packages/wasm-utxo/js/bip322/index.ts
+++ b/packages/wasm-utxo/js/bip322/index.ts
@@ -133,6 +133,14 @@ export function addBip322Input(psbt: BitGoPsbt, params: AddBip322InputParams): n
);
}
+/**
+ * Get the BIP322 message stored at a PSBT input index.
+ * Returns null if no message is stored.
+ */
+export function getBip322Message(psbt: BitGoPsbt, inputIndex: number): string | null {
+ return Bip322Namespace.get_bip322_message(psbt.wasm, inputIndex) ?? null;
+}
+
/**
* Verify a single input of a BIP-0322 transaction proof
*
diff --git a/packages/wasm-utxo/src/bip322/bitgo_psbt.rs b/packages/wasm-utxo/src/bip322/bitgo_psbt.rs
index d9855645..b1f69d1c 100644
--- a/packages/wasm-utxo/src/bip322/bitgo_psbt.rs
+++ b/packages/wasm-utxo/src/bip322/bitgo_psbt.rs
@@ -4,7 +4,8 @@
//! with BitGo fixed-script wallets.
use crate::fixed_script_wallet::bitgo_psbt::{
- create_bip32_derivation, create_tap_bip32_derivation, BitGoPsbt,
+ create_bip32_derivation, create_tap_bip32_derivation, find_kv, BitGoKeyValue, BitGoPsbt,
+ ProprietaryKeySubtype,
};
use crate::fixed_script_wallet::wallet_scripts::{
build_multisig_script_2_of_3, build_p2tr_ns_script, ScriptP2tr,
@@ -194,9 +195,38 @@ pub fn add_bip322_input(
}
}
+ // Store the BIP322 message as a proprietary field for later extraction
+ let (prop_key, prop_value) = BitGoKeyValue::new(
+ ProprietaryKeySubtype::Bip322Message,
+ vec![],
+ message.as_bytes().to_vec(),
+ )
+ .to_key_value();
+ inner_psbt.inputs[input_index]
+ .proprietary
+ .insert(prop_key, prop_value);
+
Ok(input_index)
}
+/// Extract the BIP322 message stored in a PSBT input's proprietary fields.
+/// Returns None if no message is stored at that index.
+pub fn get_bip322_message(psbt: &BitGoPsbt, input_index: usize) -> Result