diff --git a/packages/wasm-utxo/js/coinName.ts b/packages/wasm-utxo/js/coinName.ts index aae222bb6d3..4a2957e4eca 100644 --- a/packages/wasm-utxo/js/coinName.ts +++ b/packages/wasm-utxo/js/coinName.ts @@ -5,6 +5,7 @@ export const coinNames = [ "tbtc4", "tbtcsig", "tbtcbgsig", + "tbtcreg", "bch", "tbch", "bcha", @@ -31,6 +32,7 @@ export function getMainnet(name: CoinName): CoinName { case "tbtc4": case "tbtcsig": case "tbtcbgsig": + case "tbtcreg": return "btc"; case "tbch": return "bch"; @@ -80,6 +82,8 @@ export function toCoinName(name: CoinName | UtxolibName): CoinName { return "tbtcsig"; case "bitcoinBitGoSignet": return "tbtcbgsig"; + case "bitcoinRegtest": + return "tbtcreg"; case "bitcoincash": return "bch"; case "bitcoincashTestnet": diff --git a/packages/wasm-utxo/js/utxolibCompat.ts b/packages/wasm-utxo/js/utxolibCompat.ts index eb1bbbe8951..deb67d0bdcb 100644 --- a/packages/wasm-utxo/js/utxolibCompat.ts +++ b/packages/wasm-utxo/js/utxolibCompat.ts @@ -7,6 +7,7 @@ export type UtxolibName = | "bitcoinTestnet4" | "bitcoinPublicSignet" | "bitcoinBitGoSignet" + | "bitcoinRegtest" | "bitcoincash" | "bitcoincashTestnet" | "ecash" diff --git a/packages/wasm-utxo/src/address/mod.rs b/packages/wasm-utxo/src/address/mod.rs index 5007dabbd86..0c287ef202a 100644 --- a/packages/wasm-utxo/src/address/mod.rs +++ b/packages/wasm-utxo/src/address/mod.rs @@ -107,6 +107,8 @@ pub const BITCOIN_BECH32: Bech32Codec = Bech32Codec::new("bc"); pub const TESTNET: Base58CheckCodec = Base58CheckCodec::new(0x6f, 0xc4); pub const TESTNET_BECH32: Bech32Codec = Bech32Codec::new("tb"); +pub const REGTEST: Base58CheckCodec = Base58CheckCodec::new(0x6f, 0xc4); +pub const REGTEST_BECH32: Bech32Codec = Bech32Codec::new("bcrt"); // Bitcoin Cash (Base58Check) // https://github.com/bitcoin-cash-node/bitcoin-cash-node/blob/master/src/validation.cpp diff --git a/packages/wasm-utxo/src/address/networks.rs b/packages/wasm-utxo/src/address/networks.rs index e5856793ae2..2d1af83b350 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, TESTNET, TESTNET_BECH32, ZCASH, - ZCASH_TEST, + LITECOIN_BECH32, LITECOIN_TEST, LITECOIN_TEST_BECH32, REGTEST, REGTEST_BECH32, TESTNET, + TESTNET_BECH32, ZCASH, ZCASH_TEST, }; use crate::bitcoin::Script; use crate::fixed_script_wallet::wallet_scripts::OutputScriptType; @@ -29,6 +29,7 @@ fn get_decode_codecs(network: Network) -> Vec<&'static dyn AddressCodec> { | Network::BitcoinBitGoSignet => { vec![&TESTNET, &TESTNET_BECH32] } + Network::BitcoinRegtest => vec![®TEST, ®TEST_BECH32], Network::BitcoinCash => vec![&BITCOIN_CASH, &BITCOIN_CASH_CASHADDR], Network::BitcoinCashTestnet => vec![&BITCOIN_CASH_TESTNET, &BITCOIN_CASH_TESTNET_CASHADDR], Network::Ecash => vec![&ECASH, &ECASH_CASHADDR], @@ -247,6 +248,13 @@ fn get_encode_codec( Ok(&TESTNET) } } + Network::BitcoinRegtest => { + if is_witness { + Ok(®TEST_BECH32) + } else { + Ok(®TEST) + } + } Network::BitcoinCash => Ok(&BITCOIN_CASH), Network::BitcoinCashTestnet => Ok(&BITCOIN_CASH_TESTNET), Network::Ecash => Ok(&ECASH), 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 b25bc4bac02..04fc6f1391a 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 @@ -340,6 +340,7 @@ impl BitGoPsbt { | Network::BitcoinTestnet4 | Network::BitcoinPublicSignet | Network::BitcoinBitGoSignet + | Network::BitcoinRegtest | Network::BitcoinCash | Network::BitcoinCashTestnet | Network::Ecash diff --git a/packages/wasm-utxo/src/networks.rs b/packages/wasm-utxo/src/networks.rs index 11ff3afc74c..dfe1f98a5b8 100644 --- a/packages/wasm-utxo/src/networks.rs +++ b/packages/wasm-utxo/src/networks.rs @@ -13,6 +13,7 @@ pub enum Network { BitcoinTestnet4, BitcoinPublicSignet, BitcoinBitGoSignet, + BitcoinRegtest, // https://github.com/bitcoin-cash-node/bitcoin-cash-node/blob/master/src/validation.cpp // https://github.com/bitcoin-cash-node/bitcoin-cash-node/blob/master/src/chainparams.cpp @@ -63,6 +64,7 @@ impl Network { Network::BitcoinTestnet4, Network::BitcoinPublicSignet, Network::BitcoinBitGoSignet, + Network::BitcoinRegtest, Network::BitcoinCash, Network::BitcoinCashTestnet, Network::Ecash, @@ -89,6 +91,7 @@ impl Network { Network::BitcoinTestnet4 => "BitcoinTestnet4", Network::BitcoinPublicSignet => "BitcoinPublicSignet", Network::BitcoinBitGoSignet => "BitcoinBitGoSignet", + Network::BitcoinRegtest => "BitcoinRegtest", Network::BitcoinCash => "BitcoinCash", Network::BitcoinCashTestnet => "BitcoinCashTestnet", Network::Ecash => "Ecash", @@ -115,6 +118,7 @@ impl Network { "BitcoinTestnet4" => Some(Network::BitcoinTestnet4), "BitcoinPublicSignet" => Some(Network::BitcoinPublicSignet), "BitcoinBitGoSignet" => Some(Network::BitcoinBitGoSignet), + "BitcoinRegtest" => Some(Network::BitcoinRegtest), "BitcoinCash" => Some(Network::BitcoinCash), "BitcoinCashTestnet" => Some(Network::BitcoinCashTestnet), @@ -154,6 +158,7 @@ impl Network { "bitcoinPublicSignet" => Some(Network::BitcoinPublicSignet), "bitcoinTestnet4" => Some(Network::BitcoinTestnet4), "bitcoinBitGoSignet" => Some(Network::BitcoinBitGoSignet), + "bitcoinRegtest" => Some(Network::BitcoinRegtest), "bitcoincash" => Some(Network::BitcoinCash), "bitcoincashTestnet" => Some(Network::BitcoinCashTestnet), "ecash" => Some(Network::Ecash), @@ -181,6 +186,7 @@ impl Network { Network::BitcoinTestnet4 => "bitcoinTestnet4", Network::BitcoinPublicSignet => "bitcoinPublicSignet", Network::BitcoinBitGoSignet => "bitcoinBitGoSignet", + Network::BitcoinRegtest => "bitcoinRegtest", Network::BitcoinCash => "bitcoincash", Network::BitcoinCashTestnet => "bitcoincashTestnet", Network::Ecash => "ecash", @@ -208,6 +214,7 @@ impl Network { "tbtc4" => Some(Network::BitcoinTestnet4), "tbtcsig" => Some(Network::BitcoinPublicSignet), "tbtcbgsig" => Some(Network::BitcoinBitGoSignet), + "tbtcreg" => Some(Network::BitcoinRegtest), "bch" => Some(Network::BitcoinCash), "tbch" => Some(Network::BitcoinCashTestnet), "bcha" => Some(Network::Ecash), @@ -236,6 +243,7 @@ impl Network { Network::BitcoinTestnet4 => "tbtc4", Network::BitcoinPublicSignet => "tbtcsig", Network::BitcoinBitGoSignet => "tbtcbgsig", + Network::BitcoinRegtest => "tbtcreg", Network::BitcoinCash => "bch", Network::BitcoinCashTestnet => "tbch", Network::Ecash => "bcha", @@ -261,7 +269,8 @@ impl Network { | Network::BitcoinTestnet3 | Network::BitcoinTestnet4 | Network::BitcoinPublicSignet - | Network::BitcoinBitGoSignet => Network::Bitcoin, + | Network::BitcoinBitGoSignet + | Network::BitcoinRegtest => Network::Bitcoin, Network::BitcoinCash => Network::BitcoinCash, Network::BitcoinCashTestnet => Network::BitcoinCash, @@ -306,6 +315,7 @@ impl Network { Network::BitcoinTestnet4 => BitcoinNetwork::Testnet, Network::BitcoinPublicSignet => BitcoinNetwork::Signet, Network::BitcoinBitGoSignet => BitcoinNetwork::Signet, + Network::BitcoinRegtest => BitcoinNetwork::Regtest, // Non-Bitcoin networks - use Bitcoin mainnet/testnet based on whether they're mainnet _ => { if self.is_mainnet() { @@ -381,7 +391,7 @@ mod tests { #[test] fn test_all_networks() { // Verify ALL contains all networks - assert_eq!(Network::ALL.len(), 21); + assert_eq!(Network::ALL.len(), 22); // Verify no duplicates for (i, network1) in Network::ALL.iter().enumerate() { diff --git a/packages/wasm-utxo/src/wasm/psbt.rs b/packages/wasm-utxo/src/wasm/psbt.rs index 5d95126cd50..f957c98e4d9 100644 --- a/packages/wasm-utxo/src/wasm/psbt.rs +++ b/packages/wasm-utxo/src/wasm/psbt.rs @@ -1037,7 +1037,7 @@ mod tests { #[test] fn test_all_networks_macro_is_complete() { const _: () = assert!( - Network::ALL.len() == 21, + Network::ALL.len() == 22, "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 4a94ba997dc..f5afcb6943a 100644 --- a/packages/wasm-utxo/test/address/compatibility.ts +++ b/packages/wasm-utxo/test/address/compatibility.ts @@ -46,7 +46,7 @@ const legacyGroups: CoinName[][] = [ ["dash"], ["doge"], ["ltc"], - ["tbch", "tbcha", "tbsv", "tbtc", "tbtc4", "tbtcbgsig", "tbtcsig", "tbtg", "tdoge"], + ["tbch", "tbcha", "tbsv", "tbtc", "tbtc4", "tbtcbgsig", "tbtcreg", "tbtcsig", "tbtg", "tdoge"], ["tdash"], ["tltc"], ["tzec"], @@ -58,11 +58,16 @@ const segwitGroups: CoinName[][] = [ ["btg"], ["ltc"], ["tbtc", "tbtc4", "tbtcbgsig", "tbtcsig"], + ["tbtcreg"], ["tbtg"], ["tltc"], ]; -const taprootGroups: CoinName[][] = [["btc"], ["tbtc", "tbtc4", "tbtcbgsig", "tbtcsig"]]; +const taprootGroups: CoinName[][] = [ + ["btc"], + ["tbtc", "tbtc4", "tbtcbgsig", "tbtcsig"], + ["tbtcreg"], +]; describe("address compatibility", function () { it("p2sh: btc/bch/bcha/bsv share mainnet format, most testnets share testnet format", function () { diff --git a/packages/webui/src/wasm-utxo/addresses/index.ts b/packages/webui/src/wasm-utxo/addresses/index.ts index 2e952d05f38..2ffd936fcb4 100644 --- a/packages/webui/src/wasm-utxo/addresses/index.ts +++ b/packages/webui/src/wasm-utxo/addresses/index.ts @@ -19,6 +19,7 @@ const ALL_COINS: CoinName[] = [ "tbtc4", "tbtcsig", "tbtcbgsig", + "tbtcreg", "bch", "tbch", "bcha", @@ -47,6 +48,7 @@ const COIN_NAMES: Record = { tbtc4: "Bitcoin Testnet4", tbtcsig: "Bitcoin Signet", tbtcbgsig: "Bitcoin BitGo Signet", + tbtcreg: "Bitcoin Regtest", bch: "Bitcoin Cash", tbch: "Bitcoin Cash Testnet", bcha: "eCash", diff --git a/packages/webui/src/wasm-utxo/parser/index.ts b/packages/webui/src/wasm-utxo/parser/index.ts index b44e93bc199..51bf891c014 100644 --- a/packages/webui/src/wasm-utxo/parser/index.ts +++ b/packages/webui/src/wasm-utxo/parser/index.ts @@ -36,6 +36,7 @@ const networkLabels: Record = { tbtc4: "Bitcoin Testnet4", tbtcsig: "Bitcoin Signet", tbtcbgsig: "Bitcoin BitGo Signet", + tbtcreg: "Bitcoin Regtest", ltc: "Litecoin", tltc: "Litecoin Testnet", bch: "Bitcoin Cash",