diff --git a/packages/wasm-utxo/js/coinName.ts b/packages/wasm-utxo/js/coinName.ts index 4a2957e4eca..148268b00ef 100644 --- a/packages/wasm-utxo/js/coinName.ts +++ b/packages/wasm-utxo/js/coinName.ts @@ -22,6 +22,8 @@ export const coinNames = [ "tltc", "zec", "tzec", + "pearl", + "tpearl", ] as const; export type CoinName = (typeof coinNames)[number]; @@ -50,6 +52,8 @@ export function getMainnet(name: CoinName): CoinName { return "ltc"; case "tzec": return "zec"; + case "tpearl": + return "pearl"; default: return name; } diff --git a/packages/wasm-utxo/js/testutils/AcidTest.ts b/packages/wasm-utxo/js/testutils/AcidTest.ts index a85900e7625..ce78487fe41 100644 --- a/packages/wasm-utxo/js/testutils/AcidTest.ts +++ b/packages/wasm-utxo/js/testutils/AcidTest.ts @@ -179,8 +179,8 @@ export class AcidTest { // Filter inputs based on network support const inputs: Input[] = inputScriptTypes .filter((scriptType) => { - // p2shP2pk is always supported (single-sig replay protection) - if (scriptType === "p2shP2pk") return true; + // p2shP2pk requires legacy (P2SH) support + if (scriptType === "p2shP2pk") return supportsScriptType(coin, "p2sh"); // Map input script types to output script types for support check if (scriptType === "p2trMusig2KeyPath" || scriptType === "p2trMusig2ScriptPath") { @@ -206,11 +206,15 @@ export class AcidTest { value: BigInt(900 + index * 100), // Deterministic amounts })); - // Test other wallet output (with derivation info) - outputs.push({ scriptType: "p2sh", value: BigInt(800), walletKeys: otherWalletKeys }); + // Test other wallet output (with derivation info) — only on legacy-supporting networks + if (supportsScriptType(coin, "p2sh")) { + outputs.push({ scriptType: "p2sh", value: BigInt(800), walletKeys: otherWalletKeys }); + } - // Test non-wallet output (no derivation info) - outputs.push({ scriptType: "p2sh", value: BigInt(700), walletKeys: null }); + // Test non-wallet output (no derivation info) — only on legacy-supporting networks + if (supportsScriptType(coin, "p2sh")) { + outputs.push({ scriptType: "p2sh", value: BigInt(700), walletKeys: null }); + } // Test OP_RETURN output outputs.push({ opReturn: "setec astronomy", value: BigInt(0) }); diff --git a/packages/wasm-utxo/src/address/mod.rs b/packages/wasm-utxo/src/address/mod.rs index 69c33f8ca20..893ef8a9ae9 100644 --- a/packages/wasm-utxo/src/address/mod.rs +++ b/packages/wasm-utxo/src/address/mod.rs @@ -175,6 +175,16 @@ pub const DASH_TEST: Base58CheckCodec = Base58CheckCodec::new(0x8c, 0x13); pub const ZCASH: Base58CheckCodec = Base58CheckCodec::new(0x1cb8, 0x1cbd); pub const ZCASH_TEST: Base58CheckCodec = Base58CheckCodec::new(0x1d25, 0x1cba); +// Pearl — Bech32m ONLY (no P2PKH/P2SH exist on this chain, Taproot-only) +// HRPs from: https://github.com/pearl-research-labs/pearl/blob/v1.1.6/node/chaincfg/params.go +// Verified on live regtest node (pearld 1.0.2, coins-sandbox PR #898). +// Bech32Codec handles v0 (bech32) and v1+ (bech32m / BIP-350) automatically. +pub const PEARL_BECH32: Bech32Codec = Bech32Codec::new("prl"); +pub const PEARL_TEST_BECH32: Bech32Codec = Bech32Codec::new("tprl"); +// Regtest HRP used only in test fixtures; not needed in production code. +#[cfg(test)] +pub const PEARL_REGTEST_BECH32: Bech32Codec = Bech32Codec::new("rprl"); + /// Convert output script to address string (convenience wrapper) pub fn from_output_script(script: &Script, codec: &dyn AddressCodec) -> Result { codec.encode(script) @@ -487,6 +497,8 @@ mod tests { "litecoinTest.json" => vec![&LITECOIN_TEST, &LITECOIN_TEST_BECH32], "zcash.json" => vec![&ZCASH], "zcashTest.json" => vec![&ZCASH_TEST], + // Pearl uses regtest HRP "rprl" in fixtures (captured from live regtest node) + "pearl.json" => vec![&PEARL_REGTEST_BECH32 as &dyn AddressCodec], _ => panic!("Unknown fixture file: {}", filename), } } diff --git a/packages/wasm-utxo/src/address/networks.rs b/packages/wasm-utxo/src/address/networks.rs index 2d1af83b350..fadb46b7aeb 100644 --- a/packages/wasm-utxo/src/address/networks.rs +++ b/packages/wasm-utxo/src/address/networks.rs @@ -10,8 +10,8 @@ use super::{ BITCOIN_CASH_TESTNET_CASHADDR, BITCOIN_GOLD, BITCOIN_GOLD_BECH32, BITCOIN_GOLD_TESTNET, BITCOIN_GOLD_TESTNET_BECH32, BITCOIN_SV, BITCOIN_SV_TESTNET, DASH, DASH_TEST, DOGECOIN, DOGECOIN_TEST, ECASH, ECASH_CASHADDR, ECASH_TEST, ECASH_TEST_CASHADDR, LITECOIN, - LITECOIN_BECH32, LITECOIN_TEST, LITECOIN_TEST_BECH32, REGTEST, REGTEST_BECH32, TESTNET, - TESTNET_BECH32, ZCASH, ZCASH_TEST, + LITECOIN_BECH32, LITECOIN_TEST, LITECOIN_TEST_BECH32, PEARL_BECH32, PEARL_TEST_BECH32, REGTEST, + REGTEST_BECH32, TESTNET, TESTNET_BECH32, ZCASH, ZCASH_TEST, }; use crate::bitcoin::Script; use crate::fixed_script_wallet::wallet_scripts::OutputScriptType; @@ -46,6 +46,9 @@ fn get_decode_codecs(network: Network) -> Vec<&'static dyn AddressCodec> { Network::LitecoinTestnet => vec![&LITECOIN_TEST, &LITECOIN_TEST_BECH32], Network::Zcash => vec![&ZCASH], Network::ZcashTestnet => vec![&ZCASH_TEST], + // Pearl is Taproot-only; bech32m addresses only, no legacy codecs. + Network::Pearl => vec![&PEARL_BECH32], + Network::PearlTestnet => vec![&PEARL_TEST_BECH32], } } @@ -76,6 +79,7 @@ impl AddressFormat { } pub struct OutputScriptSupport { + pub legacy: bool, pub segwit: bool, pub taproot: bool, pub p2mr: bool, @@ -83,7 +87,11 @@ pub struct OutputScriptSupport { impl OutputScriptSupport { pub(crate) fn assert_legacy(&self) -> Result<()> { - // all coins support legacy scripts + if !self.legacy { + return Err(AddressError::UnsupportedScriptType( + "Network does not support legacy scripts".to_string(), + )); + } Ok(()) } @@ -117,7 +125,7 @@ impl OutputScriptSupport { pub fn assert_support(&self, script: &Script) -> Result<()> { match script.witness_version() { None => { - // all coins support legacy scripts + self.assert_legacy()?; } Some(WitnessVersion::V0) => { self.assert_segwit()?; @@ -140,7 +148,7 @@ impl OutputScriptSupport { /// Check if the network supports a given fixed-script wallet script type pub fn supports_script_type(&self, script_type: OutputScriptType) -> bool { match script_type { - OutputScriptType::P2sh => true, // all networks support legacy scripts + OutputScriptType::P2sh => self.legacy, OutputScriptType::P2shP2wsh | OutputScriptType::P2wsh => self.segwit, OutputScriptType::P2trLegacy | OutputScriptType::P2trMusig2 => self.taproot, OutputScriptType::P2mr => self.p2mr, @@ -184,7 +192,14 @@ impl Network { // Litecoin: has apparent taproot support, but we have not enabled it in this library yet. // - https://github.com/litecoin-project/litecoin/blob/v0.21.4/src/chainparams.cpp#L89-L92 // - https://github.com/litecoin-project/litecoin/blob/v0.21.4/src/script/interpreter.h#L129-L131 - let taproot = segwit && matches!(self.mainnet(), Network::Bitcoin); + // + // Pearl: Taproot-only btcd fork (no segwit v0 on-chain). + // - https://github.com/pearl-research-labs/pearl/blob/v1.1.6/node/chaincfg/params.go + let taproot = matches!(self.mainnet(), Network::Bitcoin | Network::Pearl); + + // Legacy (P2PKH/P2SH) support: + // Pearl is taproot-only; no legacy script types exist on-chain. + let legacy = !matches!(self.mainnet(), Network::Pearl); // P2MR (BIP-360) support: // Enabled on all Bitcoin networks (mainnet + testnets) for address encoding. @@ -192,6 +207,7 @@ impl Network { let p2mr = matches!(self.mainnet(), Network::Bitcoin); OutputScriptSupport { + legacy, segwit, taproot, p2mr, @@ -295,6 +311,9 @@ fn get_encode_codec( } Network::Zcash => Ok(&ZCASH), Network::ZcashTestnet => Ok(&ZCASH_TEST), + // Pearl is Taproot-only; assert_support() already rejects non-P2TR scripts above. + Network::Pearl => Ok(&PEARL_BECH32), + Network::PearlTestnet => Ok(&PEARL_TEST_BECH32), } } @@ -302,7 +321,11 @@ fn get_encode_codec( /// Tries multiple address formats for the given network (Base58, Bech32, CashAddr, etc.) pub fn to_output_script_with_network(address: &str, network: Network) -> Result { let codecs = get_decode_codecs(network); - to_output_script_try_codecs(address, &codecs) + let script = to_output_script_try_codecs(address, &codecs)?; + // Validate the decoded script is supported by this network + // (e.g. reject v0 witness programs on taproot-only chains like Pearl) + network.output_script_support().assert_support(&script)?; + Ok(script) } /// Convert an output script to an address string using a Network. @@ -583,15 +606,31 @@ mod tests { #[test] fn test_output_script_support_assert_legacy() { - // Legacy should always succeed regardless of support flags - let support_none = OutputScriptSupport { + // assert_legacy succeeds when legacy=true + let support_legacy = OutputScriptSupport { + legacy: true, segwit: false, taproot: false, p2mr: false, }; - assert!(support_none.assert_legacy().is_ok()); + assert!(support_legacy.assert_legacy().is_ok()); + + // assert_legacy fails when legacy=false (e.g. Pearl) + let no_legacy = OutputScriptSupport { + legacy: false, + segwit: false, + taproot: true, + p2mr: false, + }; + let result = no_legacy.assert_legacy(); + assert!(result.is_err()); + assert!(result + .unwrap_err() + .to_string() + .contains("does not support legacy scripts")); let support_all = OutputScriptSupport { + legacy: true, segwit: true, taproot: true, p2mr: false, @@ -603,6 +642,7 @@ mod tests { fn test_output_script_support_assert_segwit() { // Should succeed when segwit is supported let support_segwit = OutputScriptSupport { + legacy: true, segwit: true, taproot: false, p2mr: false, @@ -611,6 +651,7 @@ mod tests { // Should fail when segwit is not supported let no_support = OutputScriptSupport { + legacy: true, segwit: false, taproot: false, p2mr: false, @@ -627,6 +668,7 @@ mod tests { fn test_output_script_support_assert_taproot() { // Should succeed when taproot is supported let support_taproot = OutputScriptSupport { + legacy: true, segwit: true, taproot: true, p2mr: false, @@ -635,6 +677,7 @@ mod tests { // Should fail when taproot is not supported let no_support = OutputScriptSupport { + legacy: true, segwit: true, taproot: false, p2mr: false, @@ -656,6 +699,7 @@ mod tests { // Legacy scripts should work even without segwit/taproot support let no_support = OutputScriptSupport { + legacy: true, segwit: false, taproot: false, p2mr: false, @@ -678,6 +722,7 @@ mod tests { // Should succeed with segwit support let support_segwit = OutputScriptSupport { + legacy: true, segwit: true, taproot: false, p2mr: false, @@ -686,6 +731,7 @@ mod tests { // Should fail without segwit support let no_support = OutputScriptSupport { + legacy: true, segwit: false, taproot: false, p2mr: false, @@ -725,6 +771,7 @@ mod tests { // Should succeed with taproot support let support_taproot = OutputScriptSupport { + legacy: true, segwit: true, taproot: true, p2mr: false, @@ -733,6 +780,7 @@ mod tests { // Should fail without taproot support (but with segwit) let no_taproot = OutputScriptSupport { + legacy: true, segwit: true, taproot: false, p2mr: false, @@ -746,6 +794,7 @@ mod tests { // Should also fail without segwit or taproot let no_support = OutputScriptSupport { + legacy: true, segwit: false, taproot: false, p2mr: false, @@ -822,4 +871,116 @@ mod tests { assert!(e.to_string().contains("Network does not support taproot")); } } + + #[test] + fn test_pearl_script_type_support() { + use crate::fixed_script_wallet::wallet_scripts::OutputScriptType::*; + + for network in [Network::Pearl, Network::PearlTestnet] { + let support = network.output_script_support(); + assert!(!support.legacy, "{network:?}: legacy should be false"); + assert!(!support.segwit, "{network:?}: segwit should be false"); + assert!(support.taproot, "{network:?}: taproot should be true"); + assert!(!support.p2mr, "{network:?}: p2mr should be false"); + + assert!(!support.supports_script_type(P2sh)); + assert!(!support.supports_script_type(P2shP2wsh)); + assert!(!support.supports_script_type(P2wsh)); + assert!(support.supports_script_type(P2trLegacy)); + assert!(support.supports_script_type(P2trMusig2)); + assert!(!support.supports_script_type(P2mr)); + } + } + + #[test] + fn test_pearl_address_encoding() { + use crate::address::bech32; + use crate::bitcoin::secp256k1::{Secp256k1, XOnlyPublicKey}; + + let secp = Secp256k1::verification_only(); + let xonly_pk = XOnlyPublicKey::from_slice( + &hex::decode("cc8a4bc64d897bddc5fbc2f670f7a8ba0b386779106cf1223c6fc5d7cd6fc115") + .unwrap(), + ) + .unwrap(); + let p2tr = ScriptBuf::new_p2tr(&secp, xonly_pk, None); + + // P2TR encodes to production HRPs prl1p… / tprl1p… + let mainnet_addr = from_output_script_with_network(&p2tr, Network::Pearl).unwrap(); + assert!( + mainnet_addr.starts_with("prl1p"), + "Expected prl1p… got {mainnet_addr}" + ); + let testnet_addr = from_output_script_with_network(&p2tr, Network::PearlTestnet).unwrap(); + assert!( + testnet_addr.starts_with("tprl1p"), + "Expected tprl1p… got {testnet_addr}" + ); + + // Round-trip: address → script + let decoded = to_output_script_with_network(&mainnet_addr, Network::Pearl).unwrap(); + assert_eq!(decoded, p2tr); + let decoded_test = + to_output_script_with_network(&testnet_addr, Network::PearlTestnet).unwrap(); + assert_eq!(decoded_test, p2tr); + + // P2WPKH (v0) → "does not support segwit" + let wpkh_hash = crate::bitcoin::WPubkeyHash::from_byte_array( + hex::decode("751e76e8199196d454941c45d1b3a323f1433bd6") + .unwrap() + .try_into() + .unwrap(), + ); + let p2wpkh = ScriptBuf::new_p2wpkh(&wpkh_hash); + let err = from_output_script_with_network(&p2wpkh, Network::Pearl).unwrap_err(); + assert!(err.to_string().contains("does not support segwit"), "{err}"); + + // P2PKH (legacy) → "does not support legacy scripts" + let pkh = PubkeyHash::from_byte_array( + hex::decode("62e907b15cbf27d5425399ebf6f0fb50ebb88f18") + .unwrap() + .try_into() + .unwrap(), + ); + let p2pkh = ScriptBuf::new_p2pkh(&pkh); + let err = from_output_script_with_network(&p2pkh, Network::Pearl).unwrap_err(); + assert!( + err.to_string().contains("does not support legacy scripts"), + "{err}" + ); + + // P2SH (legacy) → "does not support legacy scripts" + let sh = crate::bitcoin::ScriptHash::from_byte_array( + hex::decode("89abcdef89abcdef89abcdef89abcdef89abcdef") + .unwrap() + .try_into() + .unwrap(), + ); + let p2sh = ScriptBuf::new_p2sh(&sh); + let err = from_output_script_with_network(&p2sh, Network::Pearl).unwrap_err(); + assert!( + err.to_string().contains("does not support legacy scripts"), + "{err}" + ); + + // prl1q… (v0 address) → rejected on decode ("does not support segwit") + // The bech32 codec can decode any witness version, but post-decode validation rejects v0. + let wsh_hash = crate::bitcoin::WScriptHash::from_byte_array( + hex::decode("751e76e8199196d454941c45d1b3a323f1433bd6751e76e8199196d454941c45") + .unwrap() + .try_into() + .unwrap(), + ); + let p2wsh = ScriptBuf::new_p2wsh(&wsh_hash); + // Properly encode a v0 witness program with the prl HRP. + // Simple string substitution (bc1q → prl1q) would corrupt the bech32 checksum + // because the HRP is part of it, causing a decode error before support is checked. + let (v0_ver, v0_prog) = bech32::extract_witness_program(&p2wsh).unwrap(); + let valid_prl_v0 = bech32::encode_witness_with_custom_hrp(v0_prog, v0_ver, "prl").unwrap(); + let err = to_output_script_with_network(&valid_prl_v0, Network::Pearl).unwrap_err(); + assert!( + err.to_string().contains("does not support segwit"), + "Expected segwit rejection for v0 Pearl address, got: {err}" + ); + } } diff --git a/packages/wasm-utxo/src/address/utxolib_compat.rs b/packages/wasm-utxo/src/address/utxolib_compat.rs index 2d488c77734..8bafeb64b20 100644 --- a/packages/wasm-utxo/src/address/utxolib_compat.rs +++ b/packages/wasm-utxo/src/address/utxolib_compat.rs @@ -40,7 +40,9 @@ impl UtxolibNetwork { .is_some_and(|bech32| bech32 == "bc" || bech32 == "tb"); // P2MR not supported via utxolib compat layer (only via Network enum) + // All networks exposed via utxolib compat support legacy scripts OutputScriptSupport { + legacy: true, segwit, taproot, p2mr: false, diff --git a/packages/wasm-utxo/src/fixed_script_wallet/bitgo_psbt/mod.rs b/packages/wasm-utxo/src/fixed_script_wallet/bitgo_psbt/mod.rs index 3cd659b3a38..73fbd6322bd 100644 --- a/packages/wasm-utxo/src/fixed_script_wallet/bitgo_psbt/mod.rs +++ b/packages/wasm-utxo/src/fixed_script_wallet/bitgo_psbt/mod.rs @@ -412,7 +412,9 @@ impl BitGoPsbt { | Network::Dogecoin | Network::DogecoinTestnet | Network::Litecoin - | Network::LitecoinTestnet => Ok(BitGoPsbt::BitcoinLike( + | Network::LitecoinTestnet + | Network::Pearl + | Network::PearlTestnet => Ok(BitGoPsbt::BitcoinLike( Psbt::deserialize(psbt_bytes)?, network, )), @@ -1825,7 +1827,7 @@ impl BitGoPsbt { &'a mut self, input_index: usize, ) -> Result, String> { - if self.network().mainnet() != Network::Bitcoin { + if !matches!(self.network().mainnet(), Network::Bitcoin | Network::Pearl) { return Err("MuSig2 not supported for non-Bitcoin networks".to_string()); } diff --git a/packages/wasm-utxo/src/fixed_script_wallet/wallet_scripts/mod.rs b/packages/wasm-utxo/src/fixed_script_wallet/wallet_scripts/mod.rs index d977b7da5de..4974e4a184f 100644 --- a/packages/wasm-utxo/src/fixed_script_wallet/wallet_scripts/mod.rs +++ b/packages/wasm-utxo/src/fixed_script_wallet/wallet_scripts/mod.rs @@ -454,6 +454,7 @@ mod tests { // Test segwit rejection: try to create P2wsh on a network without segwit support let no_segwit_support = OutputScriptSupport { + legacy: true, segwit: false, taproot: false, p2mr: false, @@ -478,6 +479,7 @@ mod tests { // Test taproot rejection: try to create P2tr on a network without taproot support let no_taproot_support = OutputScriptSupport { + legacy: true, segwit: true, taproot: false, p2mr: false, diff --git a/packages/wasm-utxo/src/networks.rs b/packages/wasm-utxo/src/networks.rs index 9d15d1821b4..3f985f3c114 100644 --- a/packages/wasm-utxo/src/networks.rs +++ b/packages/wasm-utxo/src/networks.rs @@ -54,6 +54,12 @@ pub enum Network { // https://github.com/zcash/zcash/blob/master/src/chainparams.cpp Zcash, ZcashTestnet, + + // https://github.com/pearl-research-labs/pearl/blob/v1.1.6/node/chaincfg/params.go + // Taproot-only chain (btcd fork), ZK-PoW (Plonky2/STARK), P2TR script-path multisig. + // No legacy outputs (no P2PKH/P2SH/P2WPKH/P2WSH). Bech32m only. + Pearl, + PearlTestnet, } impl Network { @@ -81,6 +87,8 @@ impl Network { Network::LitecoinTestnet, Network::Zcash, Network::ZcashTestnet, + Network::Pearl, + Network::PearlTestnet, ]; /// Returns the canonical string name of this network @@ -108,6 +116,8 @@ impl Network { Network::LitecoinTestnet => "LitecoinTestnet", Network::Zcash => "Zcash", Network::ZcashTestnet => "ZcashTestnet", + Network::Pearl => "Pearl", + Network::PearlTestnet => "PearlTestnet", } } @@ -144,6 +154,9 @@ impl Network { "Zcash" => Some(Network::Zcash), "ZcashTestnet" => Some(Network::ZcashTestnet), + "Pearl" => Some(Network::Pearl), + "PearlTestnet" => Some(Network::PearlTestnet), + _ => None, } } @@ -203,6 +216,9 @@ impl Network { Network::LitecoinTestnet => "litecoinTest", Network::Zcash => "zcash", Network::ZcashTestnet => "zcashTest", + // Pearl is not yet in @bitgo/utxo-lib; names reserved for future wiring. + Network::Pearl => "pearl", + Network::PearlTestnet => "pearlTest", } } @@ -231,6 +247,8 @@ impl Network { "tltc" => Some(Network::LitecoinTestnet), "zec" => Some(Network::Zcash), "tzec" => Some(Network::ZcashTestnet), + "pearl" => Some(Network::Pearl), + "tpearl" => Some(Network::PearlTestnet), _ => None, } } @@ -260,6 +278,8 @@ impl Network { Network::LitecoinTestnet => "tltc", Network::Zcash => "zec", Network::ZcashTestnet => "tzec", + Network::Pearl => "pearl", + Network::PearlTestnet => "tpearl", } } @@ -295,6 +315,9 @@ impl Network { Network::Zcash => Network::Zcash, Network::ZcashTestnet => Network::Zcash, + + Network::Pearl => Network::Pearl, + Network::PearlTestnet => Network::Pearl, } } @@ -430,7 +453,7 @@ mod tests { #[test] fn test_all_networks() { // Verify ALL contains all networks - assert_eq!(Network::ALL.len(), 22); + assert_eq!(Network::ALL.len(), 24); // Verify no duplicates for (i, network1) in Network::ALL.iter().enumerate() { diff --git a/packages/wasm-utxo/src/test_utils.rs b/packages/wasm-utxo/src/test_utils.rs index e5697ee3685..555db03e635 100644 --- a/packages/wasm-utxo/src/test_utils.rs +++ b/packages/wasm-utxo/src/test_utils.rs @@ -30,6 +30,8 @@ macro_rules! test_all_networks { #[case::litecoin_testnet($crate::Network::LitecoinTestnet)] #[case::zcash($crate::Network::Zcash)] #[case::zcash_testnet($crate::Network::ZcashTestnet)] + #[case::pearl($crate::Network::Pearl)] + #[case::pearl_testnet($crate::Network::PearlTestnet)] fn $test_name(#[case] $network: $crate::Network) $body }; } diff --git a/packages/wasm-utxo/src/wasm/psbt.rs b/packages/wasm-utxo/src/wasm/psbt.rs index 399c148f75e..8e2d3e85270 100644 --- a/packages/wasm-utxo/src/wasm/psbt.rs +++ b/packages/wasm-utxo/src/wasm/psbt.rs @@ -1209,7 +1209,7 @@ mod tests { #[test] fn test_all_networks_macro_is_complete() { const _: () = assert!( - Network::ALL.len() == 22, + Network::ALL.len() == 24, "test_all_networks! macro is out of sync with Network::ALL" ); } diff --git a/packages/wasm-utxo/test/address/compatibility.ts b/packages/wasm-utxo/test/address/compatibility.ts index f5afcb6943a..07105a1c3d5 100644 --- a/packages/wasm-utxo/test/address/compatibility.ts +++ b/packages/wasm-utxo/test/address/compatibility.ts @@ -65,8 +65,10 @@ const segwitGroups: CoinName[][] = [ const taprootGroups: CoinName[][] = [ ["btc"], + ["pearl"], ["tbtc", "tbtc4", "tbtcbgsig", "tbtcsig"], ["tbtcreg"], + ["tpearl"], ]; describe("address compatibility", function () { diff --git a/packages/wasm-utxo/test/fixedScript/fromNetworkFormat.ts b/packages/wasm-utxo/test/fixedScript/fromNetworkFormat.ts index 45527dc9c78..eb43000b53e 100644 --- a/packages/wasm-utxo/test/fixedScript/fromNetworkFormat.ts +++ b/packages/wasm-utxo/test/fixedScript/fromNetworkFormat.ts @@ -110,6 +110,8 @@ describe("BitGoPsbt.fromNetworkFormat", function () { describe("half-signed input", function () { for (const coinName of coinNames.filter(isSupportedCoin)) { it(`${coinName}: user signature preserved`, function () { + // fromNetworkFormat only supports P2MS (p2sh/p2shP2wsh/p2wsh); skip taproot-only coins + if (!p2msScriptTypes.some((t) => supportsScriptType(coinName, t))) this.skip(); const rootWalletKeys = getDefaultWalletKeys(); const { txBytes, unspents } = createSignedP2msPsbt(coinName, 1); const reconstructed = fromNetworkFormat(txBytes, coinName, rootWalletKeys, unspents); @@ -122,6 +124,8 @@ describe("BitGoPsbt.fromNetworkFormat", function () { describe("full-signed input", function () { for (const coinName of coinNames.filter(isSupportedCoin)) { it(`${coinName}: both user and bitgo signatures preserved`, function () { + // fromNetworkFormat only supports P2MS (p2sh/p2shP2wsh/p2wsh); skip taproot-only coins + if (!p2msScriptTypes.some((t) => supportsScriptType(coinName, t))) this.skip(); const rootWalletKeys = getDefaultWalletKeys(); const { txBytes, unspents } = createSignedP2msPsbt(coinName, 2); const reconstructed = fromNetworkFormat(txBytes, coinName, rootWalletKeys, unspents); diff --git a/packages/wasm-utxo/test/fixedScript/parseTransactionWithWalletKeys.ts b/packages/wasm-utxo/test/fixedScript/parseTransactionWithWalletKeys.ts index ca9cf473a98..39ec0a2d68e 100644 --- a/packages/wasm-utxo/test/fixedScript/parseTransactionWithWalletKeys.ts +++ b/packages/wasm-utxo/test/fixedScript/parseTransactionWithWalletKeys.ts @@ -1,6 +1,10 @@ import assert from "node:assert"; import { fixedScriptWallet, isWasmUtxoError } from "../../js/index.js"; -import { BitGoPsbt, InputScriptType } from "../../js/fixedScriptWallet/index.js"; +import { + BitGoPsbt, + InputScriptType, + supportsScriptType, +} from "../../js/fixedScriptWallet/index.js"; import type { RootWalletKeys } from "../../js/fixedScriptWallet/RootWalletKeys.js"; import type { ECPair } from "../../js/index.js"; import { @@ -148,12 +152,13 @@ describe("parseTransactionWithWalletKeys", function () { expectedOpReturn.toString("hex"), ); - // Fixtures now have 3 external outputs + // Fixtures have 3 external outputs for legacy-supporting coins (other-wallet P2SH + null-wallet P2SH + OP_RETURN), + // or 1 external output for taproot-only coins like Pearl (OP_RETURN only) assert.ok(internalOutputs.length > 0, "Should have internal outputs (have scriptId)"); assert.strictEqual( externalOutputs.length, - 3, - "Should have 3 external outputs in test fixture", + supportsScriptType(networkName, "p2sh") ? 3 : 1, + "Should have correct number of external outputs in test fixture", ); // Verify all outputs have proper structure @@ -178,9 +183,12 @@ describe("parseTransactionWithWalletKeys", function () { } }); - // Verify spend amount (should be > 0 since there are external outputs) - // AcidTest uses other wallet (800) + null wallet (700) = 1500 - assert.strictEqual(parsed.spendAmount, 800n + 700n); + // Verify spend amount: AcidTest uses other wallet (800) + null wallet (700) = 1500 + // Taproot-only coins (e.g. Pearl) have no legacy outputs so spend amount is 0 + assert.strictEqual( + parsed.spendAmount, + supportsScriptType(networkName, "p2sh") ? 800n + 700n : 0n, + ); // Verify miner fee calculation const totalInputValue = parsed.inputs.reduce((sum, i) => sum + i.value, 0n); @@ -288,22 +296,26 @@ describe("parseTransactionWithWalletKeys", function () { // Find outputs that belong to the other wallet keys (scriptId !== null) const otherWalletOutputs = parsedOutputs.filter((o) => o.scriptId !== null); - // Should have exactly one output for the other wallet keys + // Legacy-supporting coins have one P2SH output for the other wallet keys; + // taproot-only coins (e.g. Pearl) have none assert.strictEqual( otherWalletOutputs.length, - 1, - "Should have exactly one output belonging to the other wallet keys", + supportsScriptType(networkName, "p2sh") ? 1 : 0, + "Should have correct number of outputs belonging to the other wallet keys", ); // Verify that this output is marked as external (scriptId === null) under regular wallet keys - const otherWalletOutputIndex = parsedOutputs.findIndex((o) => o.scriptId !== null); - const sameOutputWithRegularKeys = originalParsedOutputs[otherWalletOutputIndex]; + // (only applicable for legacy-supporting coins that have a P2SH other-wallet output) + if (supportsScriptType(networkName, "p2sh")) { + const otherWalletOutputIndex = parsedOutputs.findIndex((o) => o.scriptId !== null); + const sameOutputWithRegularKeys = originalParsedOutputs[otherWalletOutputIndex]; - assert.strictEqual( - sameOutputWithRegularKeys.scriptId, - null, - "The output belonging to other wallet keys should be marked as external (scriptId === null) when parsed with regular wallet keys", - ); + assert.strictEqual( + sameOutputWithRegularKeys.scriptId, + null, + "The output belonging to other wallet keys should be marked as external (scriptId === null) when parsed with regular wallet keys", + ); + } }); }); }); diff --git a/packages/wasm-utxo/test/fixtures/address/pearl.json b/packages/wasm-utxo/test/fixtures/address/pearl.json new file mode 100644 index 00000000000..1052a88458f --- /dev/null +++ b/packages/wasm-utxo/test/fixtures/address/pearl.json @@ -0,0 +1,12 @@ +[ + [ + "p2tr", + "5120ca4c6e0c33e27b9897807a300e023b85d5e1ddbde2872bc4fb4966dfdd3fb165", + "rprl1pefxxurpnufae39uq0gcquq3msh27rhdau2rjh38mf9ndlhflk9jsk5zncq" + ], + [ + "p2tr", + "51208e972a76a884de6a67fe7d6c97cd8dca6074fc17f2a64a5b8592f9376dda07b4", + "rprl1p36tj5a4gsn0x5el704kf0nvdefs8flqh72ny5ku9jtunwmw6q76qhq6549" + ] +] diff --git a/packages/wasm-utxo/test/fixtures/fixed-script/psbt-lite.pearl.fullsigned.json b/packages/wasm-utxo/test/fixtures/fixed-script/psbt-lite.pearl.fullsigned.json new file mode 100644 index 00000000000..fcb9b2cf795 --- /dev/null +++ b/packages/wasm-utxo/test/fixtures/fixed-script/psbt-lite.pearl.fullsigned.json @@ -0,0 +1,110 @@ +{ + "walletKeys": [ + "xprv9s21ZrQH143K45bDYc9c3aEaGiTK9aPtjgtHg6wBdkryBjix1KKXRCszxPcFPejLT9tdLgNe8E8AuQXK2fy8KhNPeLAZsGoX8w9KS2PkacL", + "xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g", + "xprv9s21ZrQH143K39N9shF9hAsTwh1FvQuBk8UVsZVwr4XtpqF7stCu2LH358NLuqkkK6pu1Af7TJHr5FZERQoLLtnC7wkoM9sdFo1HuP7dWuv" + ], + "psbtBase64": "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", + "psbtBase64Finalized": "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", + "inputs": [ + { + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "index": 0, + "sequence": 4294967294 + }, + { + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "index": 1, + "sequence": 4294967294 + } + ], + "psbtInputs": [ + { + "type": "p2tr", + "sighashType": 0, + "witnessUtxo": { + "value": "10000", + "script": "512090192f4b37a3c72468fe08217cf6427748be5e2b913cb222b057e0a93f02a29d" + }, + "tapBip32Derivation": [ + { + "pubkey": "c7f52e8600fe864d92e0670a941c28b728d54209ad962a8ad819b728dd5a2d11", + "path": "0/0/30/0" + }, + { + "pubkey": "feebbdfd5ca605ef275996313c9aee57ff8b918e054ae418ef6d2a7ed35c9b73", + "path": "0/0/30/0" + } + ] + }, + { + "type": "taprootKeyPathSpend", + "sighashType": 0, + "witnessUtxo": { + "value": "20000", + "script": "51208ff285241a6daad1e56cd87ca3e76b105d2c931631941098c07323a83fa39e9c" + }, + "tapBip32Derivation": [ + { + "pubkey": "494963aaa6161bffcb53acdbcc83b84bfecb1a2e41f414fda74a1ef10bd990d0", + "path": "0/0/40/1" + }, + { + "pubkey": "b8142e38b4f58028756d789b82cc9f72391f82c8d8e0500792cacb8dbdde9bb2", + "path": "0/0/40/1" + } + ] + } + ], + "psbtInputsFinalized": null, + "outputs": [ + { + "script": "512090192f4b37a3c72468fe08217cf6427748be5e2b913cb222b057e0a93f02a29d", + "value": "900" + }, + { + "script": "51208ff285241a6daad1e56cd87ca3e76b105d2c931631941098c07323a83fa39e9c", + "value": "1000" + }, + { + "script": "6a0f736574656320617374726f6e6f6d79", + "value": "0" + } + ], + "psbtOutputs": [ + { + "tapBip32Derivation": [ + { + "pubkey": "2d75dfb538f864d22829e4022e7b4d74f0735c5f5b9336cf0fbdafe19f8dcb12", + "path": "0/0/30/0" + }, + { + "pubkey": "c7f52e8600fe864d92e0670a941c28b728d54209ad962a8ad819b728dd5a2d11", + "path": "0/0/30/0" + }, + { + "pubkey": "feebbdfd5ca605ef275996313c9aee57ff8b918e054ae418ef6d2a7ed35c9b73", + "path": "0/0/30/0" + } + ] + }, + { + "tapBip32Derivation": [ + { + "pubkey": "175ff7ba9bc5159d844c806d2b52c507398b0bdc2d37208f8a7633c06eaa1b89", + "path": "0/0/40/1" + }, + { + "pubkey": "494963aaa6161bffcb53acdbcc83b84bfecb1a2e41f414fda74a1ef10bd990d0", + "path": "0/0/40/1" + }, + { + "pubkey": "b8142e38b4f58028756d789b82cc9f72391f82c8d8e0500792cacb8dbdde9bb2", + "path": "0/0/40/1" + } + ] + }, + {} + ], + "extractedTransaction": "0200000000010200000000000000000000000000000000000000000000000000000000000000000000000000feffffff00000000000000000000000000000000000000000000000000000000000000000100000000feffffff03840300000000000022512090192f4b37a3c72468fe08217cf6427748be5e2b913cb222b057e0a93f02a29de8030000000000002251208ff285241a6daad1e56cd87ca3e76b105d2c931631941098c07323a83fa39e9c0000000000000000116a0f736574656320617374726f6e6f6d790440879d90fe1fda3adff303d48c0e5b187abd3890b1d012c5b853b9070bdee702c15a7587c9cc559afa5931b3b42580a9603b7e6d1a8ec7ae273253412a3128cfb9409ba33fdbe06a1762bdc5d2f55b353dbcaddb51c19380e5b9bdb64077d899f5d79e44f77fab221475820348884a17699af7d350e0e9deb94ba6f1db992b64f65c4420feebbdfd5ca605ef275996313c9aee57ff8b918e054ae418ef6d2a7ed35c9b73ad20c7f52e8600fe864d92e0670a941c28b728d54209ad962a8ad819b728dd5a2d11ac41c13fdf506d0802c4536c3b61922fd4e4e1e8d4a47bc39a8cd71d81d540d499c5f540697d6a2c4c12d2cfd7c8a1e517b9b7e1d363e1884c916e5c7e574784addb4d01401a53e4a463f6ff1999b4833a4d880d65a0aae09fdb8f6012f6126fe7da2c3adbad1d12c5e5df85d1b6a826dfc997d24f07410be6c186fbb0c921cc448c9c956200000000" +} diff --git a/packages/wasm-utxo/test/fixtures/fixed-script/psbt-lite.pearl.halfsigned.json b/packages/wasm-utxo/test/fixtures/fixed-script/psbt-lite.pearl.halfsigned.json new file mode 100644 index 00000000000..a882567fc57 --- /dev/null +++ b/packages/wasm-utxo/test/fixtures/fixed-script/psbt-lite.pearl.halfsigned.json @@ -0,0 +1,110 @@ +{ + "walletKeys": [ + "xprv9s21ZrQH143K45bDYc9c3aEaGiTK9aPtjgtHg6wBdkryBjix1KKXRCszxPcFPejLT9tdLgNe8E8AuQXK2fy8KhNPeLAZsGoX8w9KS2PkacL", + "xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g", + "xprv9s21ZrQH143K39N9shF9hAsTwh1FvQuBk8UVsZVwr4XtpqF7stCu2LH358NLuqkkK6pu1Af7TJHr5FZERQoLLtnC7wkoM9sdFo1HuP7dWuv" + ], + "psbtBase64": "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", + "psbtBase64Finalized": null, + "inputs": [ + { + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "index": 0, + "sequence": 4294967294 + }, + { + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "index": 1, + "sequence": 4294967294 + } + ], + "psbtInputs": [ + { + "type": "p2tr", + "sighashType": 0, + "witnessUtxo": { + "value": "10000", + "script": "512090192f4b37a3c72468fe08217cf6427748be5e2b913cb222b057e0a93f02a29d" + }, + "tapBip32Derivation": [ + { + "pubkey": "c7f52e8600fe864d92e0670a941c28b728d54209ad962a8ad819b728dd5a2d11", + "path": "0/0/30/0" + }, + { + "pubkey": "feebbdfd5ca605ef275996313c9aee57ff8b918e054ae418ef6d2a7ed35c9b73", + "path": "0/0/30/0" + } + ] + }, + { + "type": "taprootKeyPathSpend", + "sighashType": 0, + "witnessUtxo": { + "value": "20000", + "script": "51208ff285241a6daad1e56cd87ca3e76b105d2c931631941098c07323a83fa39e9c" + }, + "tapBip32Derivation": [ + { + "pubkey": "494963aaa6161bffcb53acdbcc83b84bfecb1a2e41f414fda74a1ef10bd990d0", + "path": "0/0/40/1" + }, + { + "pubkey": "b8142e38b4f58028756d789b82cc9f72391f82c8d8e0500792cacb8dbdde9bb2", + "path": "0/0/40/1" + } + ] + } + ], + "psbtInputsFinalized": null, + "outputs": [ + { + "script": "512090192f4b37a3c72468fe08217cf6427748be5e2b913cb222b057e0a93f02a29d", + "value": "900" + }, + { + "script": "51208ff285241a6daad1e56cd87ca3e76b105d2c931631941098c07323a83fa39e9c", + "value": "1000" + }, + { + "script": "6a0f736574656320617374726f6e6f6d79", + "value": "0" + } + ], + "psbtOutputs": [ + { + "tapBip32Derivation": [ + { + "pubkey": "2d75dfb538f864d22829e4022e7b4d74f0735c5f5b9336cf0fbdafe19f8dcb12", + "path": "0/0/30/0" + }, + { + "pubkey": "c7f52e8600fe864d92e0670a941c28b728d54209ad962a8ad819b728dd5a2d11", + "path": "0/0/30/0" + }, + { + "pubkey": "feebbdfd5ca605ef275996313c9aee57ff8b918e054ae418ef6d2a7ed35c9b73", + "path": "0/0/30/0" + } + ] + }, + { + "tapBip32Derivation": [ + { + "pubkey": "175ff7ba9bc5159d844c806d2b52c507398b0bdc2d37208f8a7633c06eaa1b89", + "path": "0/0/40/1" + }, + { + "pubkey": "494963aaa6161bffcb53acdbcc83b84bfecb1a2e41f414fda74a1ef10bd990d0", + "path": "0/0/40/1" + }, + { + "pubkey": "b8142e38b4f58028756d789b82cc9f72391f82c8d8e0500792cacb8dbdde9bb2", + "path": "0/0/40/1" + } + ] + }, + {} + ], + "extractedTransaction": null +} diff --git a/packages/wasm-utxo/test/fixtures/fixed-script/psbt-lite.pearl.unsigned.json b/packages/wasm-utxo/test/fixtures/fixed-script/psbt-lite.pearl.unsigned.json new file mode 100644 index 00000000000..a8fca96a8d5 --- /dev/null +++ b/packages/wasm-utxo/test/fixtures/fixed-script/psbt-lite.pearl.unsigned.json @@ -0,0 +1,110 @@ +{ + "walletKeys": [ + "xprv9s21ZrQH143K45bDYc9c3aEaGiTK9aPtjgtHg6wBdkryBjix1KKXRCszxPcFPejLT9tdLgNe8E8AuQXK2fy8KhNPeLAZsGoX8w9KS2PkacL", + "xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g", + "xprv9s21ZrQH143K39N9shF9hAsTwh1FvQuBk8UVsZVwr4XtpqF7stCu2LH358NLuqkkK6pu1Af7TJHr5FZERQoLLtnC7wkoM9sdFo1HuP7dWuv" + ], + "psbtBase64": "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", + "psbtBase64Finalized": null, + "inputs": [ + { + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "index": 0, + "sequence": 4294967294 + }, + { + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "index": 1, + "sequence": 4294967294 + } + ], + "psbtInputs": [ + { + "type": "p2tr", + "sighashType": 0, + "witnessUtxo": { + "value": "10000", + "script": "512090192f4b37a3c72468fe08217cf6427748be5e2b913cb222b057e0a93f02a29d" + }, + "tapBip32Derivation": [ + { + "pubkey": "c7f52e8600fe864d92e0670a941c28b728d54209ad962a8ad819b728dd5a2d11", + "path": "0/0/30/0" + }, + { + "pubkey": "feebbdfd5ca605ef275996313c9aee57ff8b918e054ae418ef6d2a7ed35c9b73", + "path": "0/0/30/0" + } + ] + }, + { + "type": "taprootKeyPathSpend", + "sighashType": 0, + "witnessUtxo": { + "value": "20000", + "script": "51208ff285241a6daad1e56cd87ca3e76b105d2c931631941098c07323a83fa39e9c" + }, + "tapBip32Derivation": [ + { + "pubkey": "494963aaa6161bffcb53acdbcc83b84bfecb1a2e41f414fda74a1ef10bd990d0", + "path": "0/0/40/1" + }, + { + "pubkey": "b8142e38b4f58028756d789b82cc9f72391f82c8d8e0500792cacb8dbdde9bb2", + "path": "0/0/40/1" + } + ] + } + ], + "psbtInputsFinalized": null, + "outputs": [ + { + "script": "512090192f4b37a3c72468fe08217cf6427748be5e2b913cb222b057e0a93f02a29d", + "value": "900" + }, + { + "script": "51208ff285241a6daad1e56cd87ca3e76b105d2c931631941098c07323a83fa39e9c", + "value": "1000" + }, + { + "script": "6a0f736574656320617374726f6e6f6d79", + "value": "0" + } + ], + "psbtOutputs": [ + { + "tapBip32Derivation": [ + { + "pubkey": "2d75dfb538f864d22829e4022e7b4d74f0735c5f5b9336cf0fbdafe19f8dcb12", + "path": "0/0/30/0" + }, + { + "pubkey": "c7f52e8600fe864d92e0670a941c28b728d54209ad962a8ad819b728dd5a2d11", + "path": "0/0/30/0" + }, + { + "pubkey": "feebbdfd5ca605ef275996313c9aee57ff8b918e054ae418ef6d2a7ed35c9b73", + "path": "0/0/30/0" + } + ] + }, + { + "tapBip32Derivation": [ + { + "pubkey": "175ff7ba9bc5159d844c806d2b52c507398b0bdc2d37208f8a7633c06eaa1b89", + "path": "0/0/40/1" + }, + { + "pubkey": "494963aaa6161bffcb53acdbcc83b84bfecb1a2e41f414fda74a1ef10bd990d0", + "path": "0/0/40/1" + }, + { + "pubkey": "b8142e38b4f58028756d789b82cc9f72391f82c8d8e0500792cacb8dbdde9bb2", + "path": "0/0/40/1" + } + ] + }, + {} + ], + "extractedTransaction": null +} diff --git a/packages/wasm-utxo/test/fixtures/fixed-script/psbt.pearl.fullsigned.json b/packages/wasm-utxo/test/fixtures/fixed-script/psbt.pearl.fullsigned.json new file mode 100644 index 00000000000..028c5682a49 --- /dev/null +++ b/packages/wasm-utxo/test/fixtures/fixed-script/psbt.pearl.fullsigned.json @@ -0,0 +1,110 @@ +{ + "walletKeys": [ + "xprv9s21ZrQH143K45bDYc9c3aEaGiTK9aPtjgtHg6wBdkryBjix1KKXRCszxPcFPejLT9tdLgNe8E8AuQXK2fy8KhNPeLAZsGoX8w9KS2PkacL", + "xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g", + "xprv9s21ZrQH143K39N9shF9hAsTwh1FvQuBk8UVsZVwr4XtpqF7stCu2LH358NLuqkkK6pu1Af7TJHr5FZERQoLLtnC7wkoM9sdFo1HuP7dWuv" + ], + "psbtBase64": "cHNidP8BAMwCAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAP7///8DhAMAAAAAAAAiUSCQGS9LN6PHJGj+CCF89kJ3SL5eK5E8siKwV+CpPwKinegDAAAAAAAAIlEgj/KFJBptqtHlbNh8o+drEF0skxYxlBCYwHMjqD+jnpwAAAAAAAAAABFqD3NldGVjIGFzdHJvbm9teQAAAABPAQSIsh4AAAAAAAAAAAA6ki4p8MjrDbKmBITL3LYx9rEHycquP/3PPn0uwfa80AMSFIcV82HatoWmadQkMeXW0/lzQE2rnJ/RuVCyea12NATMGK4ITwEEiLIeAAAAAAAAAAAAywT9Y6s02Q/mRmuIDioCzPioYzdDEpka+JEbGqq0QzQDNu8ij/6bjv/7oFLDLTNGYN0fg2bPj+RK5apnK2tikJUE8u8DiU8BBIiyHgAAAAAAAAAAAG0dZW093ZHBlMBFZaNgNwKiEBbO0UomXziYLWJ15ntkA9O6wjE6fGshy7EbFLDRA0H5IsCkA6i9jIfw3IIPNa9uBPZc2GkAAQErECcAAAAAAAAiUSCQGS9LN6PHJGj+CCF89kJ3SL5eK5E8siKwV+CpPwKinQEDBAAAAABBFMf1LoYA/oZNkuBnCpQcKLco1UIJrZYqitgZtyjdWi0R/s6PKuptk8dAcnRVlkqfUEscKq6bd5iX6SNmu2H0RDlAh52Q/h/aOt/zA9SMDlsYer04kLHQEsW4U7kHC97nAsFadYfJzFWa+lkxs7QlgKlgO35tGo7HricyU0EqMSjPuUEU/uu9/VymBe8nWZYxPJruV/+LkY4FSuQY720qftNcm3P+zo8q6m2Tx0BydFWWSp9QSxwqrpt3mJfpI2a7YfREOUCboz/b4GoXYr3F0vVbNT28rdtRwZOA5bm9tkB32Jn1155E93+rIhR1ggNIiEoXaZr301Dg6d65S6bx25krZPZcQhXBP99QbQgCxFNsO2GSL9Tk4ejUpHvDmozXHYHVQNSZxfVAaX1qLEwS0s/XyKHlF7m34dNj4YhMkW5cfldHhK3bTUUg/uu9/VymBe8nWZYxPJruV/+LkY4FSuQY720qftNcm3OtIMf1LoYA/oZNkuBnCpQcKLco1UIJrZYqitgZtyjdWi0RrMAhFsf1LoYA/oZNkuBnCpQcKLco1UIJrZYqitgZtyjdWi0RNQH+zo8q6m2Tx0BydFWWSp9QSxwqrpt3mJfpI2a7YfREOfZc2GkAAAAAAAAAAB4AAAAAAAAAIRb+6739XKYF7ydZljE8mu5X/4uRjgVK5BjvbSp+01ybczUB/s6PKuptk8dAcnRVlkqfUEscKq6bd5iX6SNmu2H0RDny7wOJAAAAAAAAAAAeAAAAAAAAAAABASsgTgAAAAAAACJRII/yhSQabarR5WzYfKPnaxBdLJMWMZQQmMBzI6g/o56cAQMEAAAAACEWSUljqqYWG//LU6zbzIO4S/7LGi5B9BT9p0oe8QvZkNAVAPLvA4kAAAAAAAAAACgAAAABAAAAIRa4FC44tPWAKHVteJuCzJ9yOR+CyNjgUAeSysuNvd6bshUA9lzYaQAAAAAAAAAAKAAAAAEAAAABFyANBSDJnqRBIZfSmdn7qSUoxcIVWe+Bpx6k2WBWyUBQnwEYIGZl3ZIHg2y92JwWJHJyDcjoHgYVo/AxP2yaBvNeox9dSPwFQklUR08Bj/KFJBptqtHlbNh8o+drEF0skxYxlBCYwHMjqD+jnpwNBSDJnqRBIZfSmdn7qSUoxcIVWe+Bpx6k2WBWyUBQn0IDSUljqqYWG//LU6zbzIO4S/7LGi5B9BT9p0oe8QvZkNADuBQuOLT1gCh1bXibgsyfcjkfgsjY4FAHksrLjb3em7JJ/AVCSVRHTwIDSUljqqYWG//LU6zbzIO4S/7LGi5B9BT9p0oe8QvZkNCP8oUkGm2q0eVs2Hyj52sQXSyTFjGUEJjAcyOoP6OenEIDMDNUPWbvrmT5Okel493IKkovBWrxqeVtSz/X9I6lBV0D5BHUGzY4+B1ZbOUhElITCSey5qhjRtUkLNquv9akQ9RJ/AVCSVRHTwIDuBQuOLT1gCh1bXibgsyfcjkfgsjY4FAHksrLjb3em7KP8oUkGm2q0eVs2Hyj52sQXSyTFjGUEJjAcyOoP6OenEIDYGaTiNftChkhEoXRuOLtnxbahXQpla0gG59+OxuhaIcDMvtLK8OHlKpn8poGQv73b61CmF87//bpZQS2+kDRKV1J/AVCSVRHTwMDSUljqqYWG//LU6zbzIO4S/7LGi5B9BT9p0oe8QvZkNCP8oUkGm2q0eVs2Hyj52sQXSyTFjGUEJjAcyOoP6OenCDGgFoSkEmyb9DqqUuPIPN/YQTjY+UID+LnVfTECQAH/kn8BUJJVEdPAwO4FC44tPWAKHVteJuCzJ9yOR+CyNjgUAeSysuNvd6bso/yhSQabarR5WzYfKPnaxBdLJMWMZQQmMBzI6g/o56cIC6V/Svl7pgdFQbrKQt8JUNcOPDsBt7pDmHazgbooGCiAAEFID/fUG0IAsRTbDthki/U5OHo1KR7w5qM1x2B1UDUmcX1AQbVAsBEIP7rvf1cpgXvJ1mWMTya7lf/i5GOBUrkGO9tKn7TXJtzrSAtdd+1OPhk0igp5AIue0108HNcX1uTNs8Pva/hn43LEqwCwEQgLXXftTj4ZNIoKeQCLntNdPBzXF9bkzbPD72v4Z+NyxKtIMf1LoYA/oZNkuBnCpQcKLco1UIJrZYqitgZtyjdWi0RrAHARCD+6739XKYF7ydZljE8mu5X/4uRjgVK5BjvbSp+01ybc60gx/UuhgD+hk2S4GcKlBwotyjVQgmtliqK2Bm3KN1aLRGsIQctdd+1OPhk0igp5AIue0108HNcX1uTNs8Pva/hn43LElUCLM6/E6x5Z/2v7FMUFrNnORutAIcC2jjdUweMXf95wVtp5plUv9oR8bFSqkOyNc43jGGUxpPLSzWg/wZ78zTDYswYrggAAAAAAAAAAB4AAAAAAAAAIQfH9S6GAP6GTZLgZwqUHCi3KNVCCa2WKorYGbco3VotEVUC/s6PKuptk8dAcnRVlkqfUEscKq6bd5iX6SNmu2H0RDlp5plUv9oR8bFSqkOyNc43jGGUxpPLSzWg/wZ78zTDYvZc2GkAAAAAAAAAAB4AAAAAAAAAIQf+6739XKYF7ydZljE8mu5X/4uRjgVK5BjvbSp+01ybc1UC/s6PKuptk8dAcnRVlkqfUEscKq6bd5iX6SNmu2H0RDkszr8TrHln/a/sUxQWs2c5G60AhwLaON1TB4xd/3nBW/LvA4kAAAAAAAAAAB4AAAAAAAAAAAEFIA0FIMmepEEhl9KZ2fupJSjFwhVZ74GnHqTZYFbJQFCfAQaOAcBEIElJY6qmFhv/y1Os28yDuEv+yxouQfQU/adKHvEL2ZDQrSAXX/e6m8UVnYRMgG0rUsUHOYsL3C03II+KdjPAbqobiawBwEQgF1/3upvFFZ2ETIBtK1LFBzmLC9wtNyCPinYzwG6qG4mtILgULji09YAodW14m4LMn3I5H4LI2OBQB5LKy4293puyrCEHF1/3upvFFZ2ETIBtK1LFBzmLC9wtNyCPinYzwG6qG4lVAoppZCB2DDVkbJony724t7T0aSmK0tvTPlY/KX3Q05+f5nwMgHKsywQ1TB7U5yMOTH4TcOfpmkJV3ZP2VON7V1jMGK4IAAAAAAAAAAAoAAAAAQAAACEHSUljqqYWG//LU6zbzIO4S/7LGi5B9BT9p0oe8QvZkNA1AYppZCB2DDVkbJony724t7T0aSmK0tvTPlY/KX3Q05+f8u8DiQAAAAAAAAAAKAAAAAEAAAAhB7gULji09YAodW14m4LMn3I5H4LI2OBQB5LKy4293puyNQHmfAyAcqzLBDVMHtTnIw5MfhNw5+maQlXdk/ZU43tXWPZc2GkAAAAAAAAAACgAAAABAAAAAAA=", + "psbtBase64Finalized": "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", + "inputs": [ + { + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "index": 0, + "sequence": 4294967294 + }, + { + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "index": 1, + "sequence": 4294967294 + } + ], + "psbtInputs": [ + { + "type": "p2tr", + "sighashType": 0, + "witnessUtxo": { + "value": "10000", + "script": "512090192f4b37a3c72468fe08217cf6427748be5e2b913cb222b057e0a93f02a29d" + }, + "tapBip32Derivation": [ + { + "pubkey": "c7f52e8600fe864d92e0670a941c28b728d54209ad962a8ad819b728dd5a2d11", + "path": "0/0/30/0" + }, + { + "pubkey": "feebbdfd5ca605ef275996313c9aee57ff8b918e054ae418ef6d2a7ed35c9b73", + "path": "0/0/30/0" + } + ] + }, + { + "type": "taprootKeyPathSpend", + "sighashType": 0, + "witnessUtxo": { + "value": "20000", + "script": "51208ff285241a6daad1e56cd87ca3e76b105d2c931631941098c07323a83fa39e9c" + }, + "tapBip32Derivation": [ + { + "pubkey": "494963aaa6161bffcb53acdbcc83b84bfecb1a2e41f414fda74a1ef10bd990d0", + "path": "0/0/40/1" + }, + { + "pubkey": "b8142e38b4f58028756d789b82cc9f72391f82c8d8e0500792cacb8dbdde9bb2", + "path": "0/0/40/1" + } + ] + } + ], + "psbtInputsFinalized": null, + "outputs": [ + { + "script": "512090192f4b37a3c72468fe08217cf6427748be5e2b913cb222b057e0a93f02a29d", + "value": "900" + }, + { + "script": "51208ff285241a6daad1e56cd87ca3e76b105d2c931631941098c07323a83fa39e9c", + "value": "1000" + }, + { + "script": "6a0f736574656320617374726f6e6f6d79", + "value": "0" + } + ], + "psbtOutputs": [ + { + "tapBip32Derivation": [ + { + "pubkey": "2d75dfb538f864d22829e4022e7b4d74f0735c5f5b9336cf0fbdafe19f8dcb12", + "path": "0/0/30/0" + }, + { + "pubkey": "c7f52e8600fe864d92e0670a941c28b728d54209ad962a8ad819b728dd5a2d11", + "path": "0/0/30/0" + }, + { + "pubkey": "feebbdfd5ca605ef275996313c9aee57ff8b918e054ae418ef6d2a7ed35c9b73", + "path": "0/0/30/0" + } + ] + }, + { + "tapBip32Derivation": [ + { + "pubkey": "175ff7ba9bc5159d844c806d2b52c507398b0bdc2d37208f8a7633c06eaa1b89", + "path": "0/0/40/1" + }, + { + "pubkey": "494963aaa6161bffcb53acdbcc83b84bfecb1a2e41f414fda74a1ef10bd990d0", + "path": "0/0/40/1" + }, + { + "pubkey": "b8142e38b4f58028756d789b82cc9f72391f82c8d8e0500792cacb8dbdde9bb2", + "path": "0/0/40/1" + } + ] + }, + {} + ], + "extractedTransaction": "0200000000010200000000000000000000000000000000000000000000000000000000000000000000000000feffffff00000000000000000000000000000000000000000000000000000000000000000100000000feffffff03840300000000000022512090192f4b37a3c72468fe08217cf6427748be5e2b913cb222b057e0a93f02a29de8030000000000002251208ff285241a6daad1e56cd87ca3e76b105d2c931631941098c07323a83fa39e9c0000000000000000116a0f736574656320617374726f6e6f6d790440879d90fe1fda3adff303d48c0e5b187abd3890b1d012c5b853b9070bdee702c15a7587c9cc559afa5931b3b42580a9603b7e6d1a8ec7ae273253412a3128cfb9409ba33fdbe06a1762bdc5d2f55b353dbcaddb51c19380e5b9bdb64077d899f5d79e44f77fab221475820348884a17699af7d350e0e9deb94ba6f1db992b64f65c4420feebbdfd5ca605ef275996313c9aee57ff8b918e054ae418ef6d2a7ed35c9b73ad20c7f52e8600fe864d92e0670a941c28b728d54209ad962a8ad819b728dd5a2d11ac41c13fdf506d0802c4536c3b61922fd4e4e1e8d4a47bc39a8cd71d81d540d499c5f540697d6a2c4c12d2cfd7c8a1e517b9b7e1d363e1884c916e5c7e574784addb4d0140b86ab7f8f8b5667b5e72edd382844a84c5b44cd0dace8be1375765765b0bbd8b2849217a844a7a3ca10d17f1f3940219eda012959f16d15afe0eeb98dd6d10a900000000" +} diff --git a/packages/wasm-utxo/test/fixtures/fixed-script/psbt.pearl.halfsigned.json b/packages/wasm-utxo/test/fixtures/fixed-script/psbt.pearl.halfsigned.json new file mode 100644 index 00000000000..150ca9cd601 --- /dev/null +++ b/packages/wasm-utxo/test/fixtures/fixed-script/psbt.pearl.halfsigned.json @@ -0,0 +1,110 @@ +{ + "walletKeys": [ + "xprv9s21ZrQH143K45bDYc9c3aEaGiTK9aPtjgtHg6wBdkryBjix1KKXRCszxPcFPejLT9tdLgNe8E8AuQXK2fy8KhNPeLAZsGoX8w9KS2PkacL", + "xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g", + "xprv9s21ZrQH143K39N9shF9hAsTwh1FvQuBk8UVsZVwr4XtpqF7stCu2LH358NLuqkkK6pu1Af7TJHr5FZERQoLLtnC7wkoM9sdFo1HuP7dWuv" + ], + "psbtBase64": "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", + "psbtBase64Finalized": null, + "inputs": [ + { + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "index": 0, + "sequence": 4294967294 + }, + { + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "index": 1, + "sequence": 4294967294 + } + ], + "psbtInputs": [ + { + "type": "p2tr", + "sighashType": 0, + "witnessUtxo": { + "value": "10000", + "script": "512090192f4b37a3c72468fe08217cf6427748be5e2b913cb222b057e0a93f02a29d" + }, + "tapBip32Derivation": [ + { + "pubkey": "c7f52e8600fe864d92e0670a941c28b728d54209ad962a8ad819b728dd5a2d11", + "path": "0/0/30/0" + }, + { + "pubkey": "feebbdfd5ca605ef275996313c9aee57ff8b918e054ae418ef6d2a7ed35c9b73", + "path": "0/0/30/0" + } + ] + }, + { + "type": "taprootKeyPathSpend", + "sighashType": 0, + "witnessUtxo": { + "value": "20000", + "script": "51208ff285241a6daad1e56cd87ca3e76b105d2c931631941098c07323a83fa39e9c" + }, + "tapBip32Derivation": [ + { + "pubkey": "494963aaa6161bffcb53acdbcc83b84bfecb1a2e41f414fda74a1ef10bd990d0", + "path": "0/0/40/1" + }, + { + "pubkey": "b8142e38b4f58028756d789b82cc9f72391f82c8d8e0500792cacb8dbdde9bb2", + "path": "0/0/40/1" + } + ] + } + ], + "psbtInputsFinalized": null, + "outputs": [ + { + "script": "512090192f4b37a3c72468fe08217cf6427748be5e2b913cb222b057e0a93f02a29d", + "value": "900" + }, + { + "script": "51208ff285241a6daad1e56cd87ca3e76b105d2c931631941098c07323a83fa39e9c", + "value": "1000" + }, + { + "script": "6a0f736574656320617374726f6e6f6d79", + "value": "0" + } + ], + "psbtOutputs": [ + { + "tapBip32Derivation": [ + { + "pubkey": "2d75dfb538f864d22829e4022e7b4d74f0735c5f5b9336cf0fbdafe19f8dcb12", + "path": "0/0/30/0" + }, + { + "pubkey": "c7f52e8600fe864d92e0670a941c28b728d54209ad962a8ad819b728dd5a2d11", + "path": "0/0/30/0" + }, + { + "pubkey": "feebbdfd5ca605ef275996313c9aee57ff8b918e054ae418ef6d2a7ed35c9b73", + "path": "0/0/30/0" + } + ] + }, + { + "tapBip32Derivation": [ + { + "pubkey": "175ff7ba9bc5159d844c806d2b52c507398b0bdc2d37208f8a7633c06eaa1b89", + "path": "0/0/40/1" + }, + { + "pubkey": "494963aaa6161bffcb53acdbcc83b84bfecb1a2e41f414fda74a1ef10bd990d0", + "path": "0/0/40/1" + }, + { + "pubkey": "b8142e38b4f58028756d789b82cc9f72391f82c8d8e0500792cacb8dbdde9bb2", + "path": "0/0/40/1" + } + ] + }, + {} + ], + "extractedTransaction": null +} diff --git a/packages/wasm-utxo/test/fixtures/fixed-script/psbt.pearl.unsigned.json b/packages/wasm-utxo/test/fixtures/fixed-script/psbt.pearl.unsigned.json new file mode 100644 index 00000000000..a8fca96a8d5 --- /dev/null +++ b/packages/wasm-utxo/test/fixtures/fixed-script/psbt.pearl.unsigned.json @@ -0,0 +1,110 @@ +{ + "walletKeys": [ + "xprv9s21ZrQH143K45bDYc9c3aEaGiTK9aPtjgtHg6wBdkryBjix1KKXRCszxPcFPejLT9tdLgNe8E8AuQXK2fy8KhNPeLAZsGoX8w9KS2PkacL", + "xprv9s21ZrQH143K2eBLSVNk4zhjDzqzqM29aS9cjr4CcoNrKLYwLHtwgTURSk7RPV3cH9zNZQeR1zGw3MEwSjvARSfWEGpxfaBmduhW3TKsH5g", + "xprv9s21ZrQH143K39N9shF9hAsTwh1FvQuBk8UVsZVwr4XtpqF7stCu2LH358NLuqkkK6pu1Af7TJHr5FZERQoLLtnC7wkoM9sdFo1HuP7dWuv" + ], + "psbtBase64": "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", + "psbtBase64Finalized": null, + "inputs": [ + { + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "index": 0, + "sequence": 4294967294 + }, + { + "hash": "0000000000000000000000000000000000000000000000000000000000000000", + "index": 1, + "sequence": 4294967294 + } + ], + "psbtInputs": [ + { + "type": "p2tr", + "sighashType": 0, + "witnessUtxo": { + "value": "10000", + "script": "512090192f4b37a3c72468fe08217cf6427748be5e2b913cb222b057e0a93f02a29d" + }, + "tapBip32Derivation": [ + { + "pubkey": "c7f52e8600fe864d92e0670a941c28b728d54209ad962a8ad819b728dd5a2d11", + "path": "0/0/30/0" + }, + { + "pubkey": "feebbdfd5ca605ef275996313c9aee57ff8b918e054ae418ef6d2a7ed35c9b73", + "path": "0/0/30/0" + } + ] + }, + { + "type": "taprootKeyPathSpend", + "sighashType": 0, + "witnessUtxo": { + "value": "20000", + "script": "51208ff285241a6daad1e56cd87ca3e76b105d2c931631941098c07323a83fa39e9c" + }, + "tapBip32Derivation": [ + { + "pubkey": "494963aaa6161bffcb53acdbcc83b84bfecb1a2e41f414fda74a1ef10bd990d0", + "path": "0/0/40/1" + }, + { + "pubkey": "b8142e38b4f58028756d789b82cc9f72391f82c8d8e0500792cacb8dbdde9bb2", + "path": "0/0/40/1" + } + ] + } + ], + "psbtInputsFinalized": null, + "outputs": [ + { + "script": "512090192f4b37a3c72468fe08217cf6427748be5e2b913cb222b057e0a93f02a29d", + "value": "900" + }, + { + "script": "51208ff285241a6daad1e56cd87ca3e76b105d2c931631941098c07323a83fa39e9c", + "value": "1000" + }, + { + "script": "6a0f736574656320617374726f6e6f6d79", + "value": "0" + } + ], + "psbtOutputs": [ + { + "tapBip32Derivation": [ + { + "pubkey": "2d75dfb538f864d22829e4022e7b4d74f0735c5f5b9336cf0fbdafe19f8dcb12", + "path": "0/0/30/0" + }, + { + "pubkey": "c7f52e8600fe864d92e0670a941c28b728d54209ad962a8ad819b728dd5a2d11", + "path": "0/0/30/0" + }, + { + "pubkey": "feebbdfd5ca605ef275996313c9aee57ff8b918e054ae418ef6d2a7ed35c9b73", + "path": "0/0/30/0" + } + ] + }, + { + "tapBip32Derivation": [ + { + "pubkey": "175ff7ba9bc5159d844c806d2b52c507398b0bdc2d37208f8a7633c06eaa1b89", + "path": "0/0/40/1" + }, + { + "pubkey": "494963aaa6161bffcb53acdbcc83b84bfecb1a2e41f414fda74a1ef10bd990d0", + "path": "0/0/40/1" + }, + { + "pubkey": "b8142e38b4f58028756d789b82cc9f72391f82c8d8e0500792cacb8dbdde9bb2", + "path": "0/0/40/1" + } + ] + }, + {} + ], + "extractedTransaction": null +} diff --git a/packages/webui/src/wasm-utxo/addresses/index.ts b/packages/webui/src/wasm-utxo/addresses/index.ts index 2ffd936fcb4..c852fca9f3f 100644 --- a/packages/webui/src/wasm-utxo/addresses/index.ts +++ b/packages/webui/src/wasm-utxo/addresses/index.ts @@ -36,6 +36,8 @@ const ALL_COINS: CoinName[] = [ "tltc", "zec", "tzec", + "pearl", + "tpearl", ]; // Coins that support cashaddr format @@ -65,6 +67,8 @@ const COIN_NAMES: Record = { tltc: "Litecoin Testnet", zec: "Zcash", tzec: "Zcash Testnet", + pearl: "Pearl", + tpearl: "Pearl Testnet", }; interface ConversionResult { diff --git a/packages/webui/src/wasm-utxo/parser/index.ts b/packages/webui/src/wasm-utxo/parser/index.ts index 51bf891c014..00727cba7f2 100644 --- a/packages/webui/src/wasm-utxo/parser/index.ts +++ b/packages/webui/src/wasm-utxo/parser/index.ts @@ -53,6 +53,8 @@ const networkLabels: Record = { tdoge: "Dogecoin Testnet", zec: "Zcash", tzec: "Zcash Testnet", + pearl: "Pearl", + tpearl: "Pearl Testnet", }; /**