diff --git a/modules/abstract-utxo/src/abstractUtxoCoin.ts b/modules/abstract-utxo/src/abstractUtxoCoin.ts index 29203be6a3..485667728f 100644 --- a/modules/abstract-utxo/src/abstractUtxoCoin.ts +++ b/modules/abstract-utxo/src/abstractUtxoCoin.ts @@ -76,7 +76,13 @@ import { ErrorImplicitExternalOutputs, } from './transaction/descriptor/verifyTransaction'; import { assertDescriptorWalletAddress, getDescriptorMapFromWallet, isDescriptorWallet } from './descriptor'; -import { getChainFromNetwork, getFamilyFromNetwork, getFullNameFromNetwork } from './names'; +import { + getFullNameFromCoinName, + getMainnetCoinName, + getNetworkFromCoinName, + UtxoCoinName, + UtxoCoinNameMainnet, +} from './names'; import { assertFixedScriptWalletAddress } from './address/fixedScript'; import { isSdkBackend, ParsedTransaction, SdkBackend } from './transaction/types'; import { decodePsbtWith, encodeTransaction, stringToBufferTryFormats } from './transaction/decode'; @@ -369,42 +375,37 @@ export abstract class AbstractUtxoCoin extends BaseCoin implements Musig2Participant, Musig2Participant { + abstract name: UtxoCoinName; + public altScriptHash?: number; public supportAltScriptDestination?: boolean; public defaultSdkBackend: SdkBackend = 'utxolib'; public readonly amountType: 'number' | 'bigint'; - private readonly _network: utxolib.Network; - protected constructor(bitgo: BitGoBase, network: utxolib.Network, amountType: 'number' | 'bigint' = 'number') { + protected constructor(bitgo: BitGoBase, amountType: 'number' | 'bigint' = 'number') { super(bitgo); - if (!utxolib.isValidNetwork(network)) { - throw new Error( - 'invalid network: please make sure to use the same version of ' + - '@bitgo/utxo-lib as this library when initializing an instance of this class' - ); - } this.amountType = amountType; - this._network = network; } - get network() { - return this._network; + /** @deprecated - will be removed when we drop support for utxolib */ + get network(): utxolib.Network { + return getNetworkFromCoinName(this.name); } - getChain() { - return getChainFromNetwork(this.network); + getChain(): UtxoCoinName { + return this.name; } - getFamily() { - return getFamilyFromNetwork(this.network); + getFamily(): UtxoCoinNameMainnet { + return getMainnetCoinName(this.name); } - getFullName() { - return getFullNameFromNetwork(this.network); + getFullName(): string { + return getFullNameFromCoinName(this.name); } /** Indicates whether the coin supports a block target */ - supportsBlockTarget() { + supportsBlockTarget(): boolean { // FIXME: the SDK does not seem to use this anywhere so it is unclear what the purpose of this method is switch (getMainnet(this.network)) { case utxolib.networks.bitcoin: @@ -428,7 +429,7 @@ export abstract class AbstractUtxoCoin * Returns the factor between the base unit and its smallest subdivison * @return {number} */ - getBaseFactor() { + getBaseFactor(): number { return 1e8; } @@ -466,7 +467,7 @@ export abstract class AbstractUtxoCoin * @param {String} pub the pub to be checked * @returns {Boolean} is it valid? */ - isValidPub(pub: string) { + isValidPub(pub: string): boolean { try { return bip32.fromBase58(pub).isNeutered(); } catch (e) { @@ -1056,7 +1057,15 @@ export abstract class AbstractUtxoCoin } /** @inheritDoc */ - auditDecryptedKey({ multiSigType, publicKey, prv }) { + auditDecryptedKey({ + multiSigType, + publicKey, + prv, + }: { + multiSigType: MultisigType; + publicKey: string; + prv: string; + }): void { if (multiSigType === 'tss') { throw new Error('tss auditing is not supported for this coin'); } diff --git a/modules/abstract-utxo/src/impl/bch/bch.ts b/modules/abstract-utxo/src/impl/bch/bch.ts index f46faf875c..c7be138619 100644 --- a/modules/abstract-utxo/src/impl/bch/bch.ts +++ b/modules/abstract-utxo/src/impl/bch/bch.ts @@ -1,12 +1,15 @@ import { BitGoBase } from '@bitgo/sdk-core'; import * as utxolib from '@bitgo/utxo-lib'; -import { AbstractUtxoCoin, UtxoNetwork } from '../../abstractUtxoCoin'; +import { AbstractUtxoCoin } from '../../abstractUtxoCoin'; +import { UtxoCoinName } from '../../names'; import { isScriptRecipient } from '../../transaction'; export class Bch extends AbstractUtxoCoin { - protected constructor(bitgo: BitGoBase, network?: UtxoNetwork) { - super(bitgo, network || utxolib.networks.bitcoincash); + readonly name: UtxoCoinName = 'bch'; + + protected constructor(bitgo: BitGoBase) { + super(bitgo); } static createInstance(bitgo: BitGoBase): Bch { diff --git a/modules/abstract-utxo/src/impl/bch/tbch.ts b/modules/abstract-utxo/src/impl/bch/tbch.ts index ca10b5f380..a5988c4c41 100644 --- a/modules/abstract-utxo/src/impl/bch/tbch.ts +++ b/modules/abstract-utxo/src/impl/bch/tbch.ts @@ -2,13 +2,16 @@ * @prettier */ import { BitGoBase } from '@bitgo/sdk-core'; -import * as bitcoin from '@bitgo/utxo-lib'; + +import { UtxoCoinName } from '../../names'; import { Bch } from './bch'; export class Tbch extends Bch { + readonly name: UtxoCoinName = 'tbch'; + constructor(bitgo: BitGoBase) { - super(bitgo, bitcoin.networks.bitcoincashTestnet); + super(bitgo); } static createInstance(bitgo: BitGoBase): Tbch { diff --git a/modules/abstract-utxo/src/impl/bcha/bcha.ts b/modules/abstract-utxo/src/impl/bcha/bcha.ts index 98defc0798..7acb6c422c 100644 --- a/modules/abstract-utxo/src/impl/bcha/bcha.ts +++ b/modules/abstract-utxo/src/impl/bcha/bcha.ts @@ -1,12 +1,13 @@ import { BitGoBase } from '@bitgo/sdk-core'; -import * as utxolib from '@bitgo/utxo-lib'; import { Bch } from '../bch/bch'; -import { UtxoNetwork } from '../../abstractUtxoCoin'; +import { UtxoCoinName } from '../../names'; export class Bcha extends Bch { - constructor(bitgo: BitGoBase, network?: UtxoNetwork) { - super(bitgo, network || utxolib.networks.ecash); + readonly name: UtxoCoinName = 'bcha'; + + constructor(bitgo: BitGoBase) { + super(bitgo); } static createInstance(bitgo: BitGoBase): Bcha { diff --git a/modules/abstract-utxo/src/impl/bcha/tbcha.ts b/modules/abstract-utxo/src/impl/bcha/tbcha.ts index 3403631159..4df0bd1096 100644 --- a/modules/abstract-utxo/src/impl/bcha/tbcha.ts +++ b/modules/abstract-utxo/src/impl/bcha/tbcha.ts @@ -2,13 +2,16 @@ * @prettier */ import { BitGoBase } from '@bitgo/sdk-core'; -import * as utxolib from '@bitgo/utxo-lib'; + +import { UtxoCoinName } from '../../names'; import { Bcha } from './bcha'; export class Tbcha extends Bcha { + readonly name: UtxoCoinName = 'tbcha'; + constructor(bitgo: BitGoBase) { - super(bitgo, utxolib.networks.ecashTest); + super(bitgo); } static createInstance(bitgo: BitGoBase): Tbcha { diff --git a/modules/abstract-utxo/src/impl/bsv/bsv.ts b/modules/abstract-utxo/src/impl/bsv/bsv.ts index 2570c6b73d..c2e9210e6d 100644 --- a/modules/abstract-utxo/src/impl/bsv/bsv.ts +++ b/modules/abstract-utxo/src/impl/bsv/bsv.ts @@ -1,12 +1,13 @@ import { BitGoBase } from '@bitgo/sdk-core'; -import * as utxolib from '@bitgo/utxo-lib'; -import { UtxoNetwork } from '../../abstractUtxoCoin'; import { Bch } from '../bch/bch'; +import { UtxoCoinName } from '../../names'; export class Bsv extends Bch { - constructor(bitgo: BitGoBase, network?: UtxoNetwork) { - super(bitgo, network || utxolib.networks.bitcoinsv); + readonly name: UtxoCoinName = 'bsv'; + + constructor(bitgo: BitGoBase) { + super(bitgo); } static createInstance(bitgo: BitGoBase): Bsv { diff --git a/modules/abstract-utxo/src/impl/bsv/tbsv.ts b/modules/abstract-utxo/src/impl/bsv/tbsv.ts index d3cfac98bf..49b3533204 100644 --- a/modules/abstract-utxo/src/impl/bsv/tbsv.ts +++ b/modules/abstract-utxo/src/impl/bsv/tbsv.ts @@ -2,13 +2,16 @@ * @prettier */ import { BitGoBase } from '@bitgo/sdk-core'; -import * as utxolib from '@bitgo/utxo-lib'; + +import { UtxoCoinName } from '../../names'; import { Bsv } from './bsv'; export class Tbsv extends Bsv { + readonly name: UtxoCoinName = 'tbsv'; + constructor(bitgo: BitGoBase) { - super(bitgo, utxolib.networks.bitcoinsvTestnet); + super(bitgo); } static createInstance(bitgo: BitGoBase): Tbsv { diff --git a/modules/abstract-utxo/src/impl/btc/btc.ts b/modules/abstract-utxo/src/impl/btc/btc.ts index 26bb29edb7..d1f5f2c574 100644 --- a/modules/abstract-utxo/src/impl/btc/btc.ts +++ b/modules/abstract-utxo/src/impl/btc/btc.ts @@ -3,9 +3,9 @@ import { VerifyRecoveryTransactionOptions as BaseVerifyRecoveryTransactionOptions, Wallet, } from '@bitgo/sdk-core'; -import * as utxolib from '@bitgo/utxo-lib'; -import { AbstractUtxoCoin, UtxoNetwork } from '../../abstractUtxoCoin'; +import { AbstractUtxoCoin } from '../../abstractUtxoCoin'; +import { UtxoCoinName } from '../../names'; import { InscriptionBuilder } from './inscriptionBuilder'; @@ -14,8 +14,10 @@ export interface VerifyRecoveryTransactionOptions extends BaseVerifyRecoveryTran } export class Btc extends AbstractUtxoCoin { - constructor(bitgo: BitGoBase, network?: UtxoNetwork) { - super(bitgo, network || utxolib.networks.bitcoin); + readonly name: UtxoCoinName = 'btc'; + + constructor(bitgo: BitGoBase) { + super(bitgo); } static createInstance(bitgo: BitGoBase): Btc { diff --git a/modules/abstract-utxo/src/impl/btc/tbtc.ts b/modules/abstract-utxo/src/impl/btc/tbtc.ts index 7d8c84bcaa..93bb881376 100644 --- a/modules/abstract-utxo/src/impl/btc/tbtc.ts +++ b/modules/abstract-utxo/src/impl/btc/tbtc.ts @@ -2,13 +2,16 @@ * @prettier */ import { BitGoBase } from '@bitgo/sdk-core'; -import * as utxolib from '@bitgo/utxo-lib'; + +import { UtxoCoinName } from '../../names'; import { Btc } from './btc'; export class Tbtc extends Btc { + readonly name: UtxoCoinName = 'tbtc'; + constructor(bitgo: BitGoBase) { - super(bitgo, utxolib.networks.testnet); + super(bitgo); } static createInstance(bitgo: BitGoBase): Tbtc { diff --git a/modules/abstract-utxo/src/impl/btc/tbtc4.ts b/modules/abstract-utxo/src/impl/btc/tbtc4.ts index c4052c9e54..25407452b8 100644 --- a/modules/abstract-utxo/src/impl/btc/tbtc4.ts +++ b/modules/abstract-utxo/src/impl/btc/tbtc4.ts @@ -2,13 +2,16 @@ * @prettier */ import { BitGoBase } from '@bitgo/sdk-core'; -import * as utxolib from '@bitgo/utxo-lib'; + +import { UtxoCoinName } from '../../names'; import { Btc } from './btc'; export class Tbtc4 extends Btc { + readonly name: UtxoCoinName = 'tbtc4'; + constructor(bitgo: BitGoBase) { - super(bitgo, utxolib.networks.bitcoinTestnet4); + super(bitgo); } static createInstance(bitgo: BitGoBase): Tbtc4 { diff --git a/modules/abstract-utxo/src/impl/btc/tbtcbgsig.ts b/modules/abstract-utxo/src/impl/btc/tbtcbgsig.ts index 20927abff1..e1d8810a9c 100644 --- a/modules/abstract-utxo/src/impl/btc/tbtcbgsig.ts +++ b/modules/abstract-utxo/src/impl/btc/tbtcbgsig.ts @@ -2,13 +2,16 @@ * @prettier */ import { BitGoBase } from '@bitgo/sdk-core'; -import * as utxolib from '@bitgo/utxo-lib'; + +import { UtxoCoinName } from '../../names'; import { Btc } from './btc'; export class Tbtcbgsig extends Btc { + readonly name: UtxoCoinName = 'tbtcbgsig'; + constructor(bitgo: BitGoBase) { - super(bitgo, utxolib.networks.bitcoinBitGoSignet); + super(bitgo); } static createInstance(bitgo: BitGoBase): Tbtcbgsig { diff --git a/modules/abstract-utxo/src/impl/btc/tbtcsig.ts b/modules/abstract-utxo/src/impl/btc/tbtcsig.ts index 5e886497c6..2f1e466a88 100644 --- a/modules/abstract-utxo/src/impl/btc/tbtcsig.ts +++ b/modules/abstract-utxo/src/impl/btc/tbtcsig.ts @@ -2,13 +2,16 @@ * @prettier */ import { BitGoBase } from '@bitgo/sdk-core'; -import * as utxolib from '@bitgo/utxo-lib'; + +import { UtxoCoinName } from '../../names'; import { Btc } from './btc'; export class Tbtcsig extends Btc { + readonly name: UtxoCoinName = 'tbtcsig'; + constructor(bitgo: BitGoBase) { - super(bitgo, utxolib.networks.bitcoinPublicSignet); + super(bitgo); } static createInstance(bitgo: BitGoBase): Tbtcsig { diff --git a/modules/abstract-utxo/src/impl/btg/btg.ts b/modules/abstract-utxo/src/impl/btg/btg.ts index 3fdbba425e..9b552ce023 100644 --- a/modules/abstract-utxo/src/impl/btg/btg.ts +++ b/modules/abstract-utxo/src/impl/btg/btg.ts @@ -1,11 +1,13 @@ import { BitGoBase } from '@bitgo/sdk-core'; -import * as utxolib from '@bitgo/utxo-lib'; -import { AbstractUtxoCoin, UtxoNetwork } from '../../abstractUtxoCoin'; +import { AbstractUtxoCoin } from '../../abstractUtxoCoin'; +import { UtxoCoinName } from '../../names'; export class Btg extends AbstractUtxoCoin { - constructor(bitgo: BitGoBase, network?: UtxoNetwork) { - super(bitgo, network || utxolib.networks.bitcoingold); + readonly name: UtxoCoinName = 'btg'; + + constructor(bitgo: BitGoBase) { + super(bitgo); } static createInstance(bitgo: BitGoBase): Btg { diff --git a/modules/abstract-utxo/src/impl/dash/dash.ts b/modules/abstract-utxo/src/impl/dash/dash.ts index 0fb80f5242..f1b374f9f0 100644 --- a/modules/abstract-utxo/src/impl/dash/dash.ts +++ b/modules/abstract-utxo/src/impl/dash/dash.ts @@ -1,11 +1,13 @@ import { BitGoBase } from '@bitgo/sdk-core'; -import * as utxolib from '@bitgo/utxo-lib'; -import { AbstractUtxoCoin, UtxoNetwork } from '../../abstractUtxoCoin'; +import { AbstractUtxoCoin } from '../../abstractUtxoCoin'; +import { UtxoCoinName } from '../../names'; export class Dash extends AbstractUtxoCoin { - constructor(bitgo: BitGoBase, network?: UtxoNetwork) { - super(bitgo, network || utxolib.networks.dash); + readonly name: UtxoCoinName = 'dash'; + + constructor(bitgo: BitGoBase) { + super(bitgo); } static createInstance(bitgo: BitGoBase): Dash { diff --git a/modules/abstract-utxo/src/impl/dash/tdash.ts b/modules/abstract-utxo/src/impl/dash/tdash.ts index e908d4efd3..93a379436a 100644 --- a/modules/abstract-utxo/src/impl/dash/tdash.ts +++ b/modules/abstract-utxo/src/impl/dash/tdash.ts @@ -2,13 +2,16 @@ * @prettier */ import { BitGoBase } from '@bitgo/sdk-core'; -import * as utxolib from '@bitgo/utxo-lib'; + +import { UtxoCoinName } from '../../names'; import { Dash } from './dash'; export class Tdash extends Dash { + readonly name: UtxoCoinName = 'tdash'; + constructor(bitgo: BitGoBase) { - super(bitgo, utxolib.networks.dashTest); + super(bitgo); } static createInstance(bitgo: BitGoBase): Tdash { return new Tdash(bitgo); diff --git a/modules/abstract-utxo/src/impl/doge/doge.ts b/modules/abstract-utxo/src/impl/doge/doge.ts index 26eaae5f4f..547935711f 100644 --- a/modules/abstract-utxo/src/impl/doge/doge.ts +++ b/modules/abstract-utxo/src/impl/doge/doge.ts @@ -1,9 +1,8 @@ import { BitGoBase, HalfSignedUtxoTransaction, SignedTransaction } from '@bitgo/sdk-core'; -import { bitgo, networks } from '@bitgo/utxo-lib'; +import { bitgo } from '@bitgo/utxo-lib'; import { AbstractUtxoCoin, - UtxoNetwork, SignTransactionOptions, ExplainTransactionOptions, ParseTransactionOptions, @@ -12,6 +11,7 @@ import { TransactionInfo, TransactionPrebuild, } from '../../abstractUtxoCoin'; +import { UtxoCoinName } from '../../names'; import { ParsedTransaction } from '../../transaction/types'; import type { TransactionExplanation } from '../../transaction/fixedScript/explainTransaction'; import type { CrossChainRecoverySigned, CrossChainRecoveryUnsigned } from '../../recovery/crossChainRecovery'; @@ -56,8 +56,10 @@ function parseTransactionPrebuild( } export class Doge extends AbstractUtxoCoin { - constructor(bitgo: BitGoBase, network?: UtxoNetwork) { - super(bitgo, network || networks.dogecoin, 'bigint'); + readonly name: UtxoCoinName = 'doge'; + + constructor(bitgo: BitGoBase) { + super(bitgo, 'bigint'); } static createInstance(bitgo: BitGoBase): Doge { diff --git a/modules/abstract-utxo/src/impl/doge/tdoge.ts b/modules/abstract-utxo/src/impl/doge/tdoge.ts index d85afa97d4..5fbb8d223c 100644 --- a/modules/abstract-utxo/src/impl/doge/tdoge.ts +++ b/modules/abstract-utxo/src/impl/doge/tdoge.ts @@ -2,13 +2,16 @@ * @prettier */ import { BitGoBase } from '@bitgo/sdk-core'; -import * as utxolib from '@bitgo/utxo-lib'; + +import { UtxoCoinName } from '../../names'; import { Doge } from './doge'; export class Tdoge extends Doge { + readonly name: UtxoCoinName = 'tdoge'; + constructor(bitgo: BitGoBase) { - super(bitgo, utxolib.networks.dogecoinTest); + super(bitgo); } static createInstance(bitgo: BitGoBase): Tdoge { return new Tdoge(bitgo); diff --git a/modules/abstract-utxo/src/impl/ltc/ltc.ts b/modules/abstract-utxo/src/impl/ltc/ltc.ts index 68229bf8d9..ce4a2a6ac9 100644 --- a/modules/abstract-utxo/src/impl/ltc/ltc.ts +++ b/modules/abstract-utxo/src/impl/ltc/ltc.ts @@ -1,11 +1,14 @@ import { BitGoBase } from '@bitgo/sdk-core'; import * as utxolib from '@bitgo/utxo-lib'; -import { AbstractUtxoCoin, UtxoNetwork } from '../../abstractUtxoCoin'; +import { AbstractUtxoCoin } from '../../abstractUtxoCoin'; +import { UtxoCoinName } from '../../names'; export class Ltc extends AbstractUtxoCoin { - constructor(bitgo: BitGoBase, network?: UtxoNetwork) { - super(bitgo, network || utxolib.networks.litecoin); + readonly name: UtxoCoinName = 'ltc'; + + constructor(bitgo: BitGoBase) { + super(bitgo); // use legacy script hash version, which is the current Bitcoin one this.altScriptHash = utxolib.networks.bitcoin.scriptHash; // do not support alt destinations in prod diff --git a/modules/abstract-utxo/src/impl/ltc/tltc.ts b/modules/abstract-utxo/src/impl/ltc/tltc.ts index 055228bda6..a6832d74e9 100644 --- a/modules/abstract-utxo/src/impl/ltc/tltc.ts +++ b/modules/abstract-utxo/src/impl/ltc/tltc.ts @@ -1,11 +1,15 @@ import { BitGoBase } from '@bitgo/sdk-core'; import * as utxolib from '@bitgo/utxo-lib'; +import { UtxoCoinName } from '../../names'; + import { Ltc } from './ltc'; export class Tltc extends Ltc { + readonly name: UtxoCoinName = 'tltc'; + constructor(bitgo: BitGoBase) { - super(bitgo, utxolib.networks.litecoinTest); + super(bitgo); this.altScriptHash = utxolib.networks.testnet.scriptHash; // support alt destinations on test this.supportAltScriptDestination = false; diff --git a/modules/abstract-utxo/src/impl/zec/tzec.ts b/modules/abstract-utxo/src/impl/zec/tzec.ts index 4cf80e0fc0..dfc18d56b8 100644 --- a/modules/abstract-utxo/src/impl/zec/tzec.ts +++ b/modules/abstract-utxo/src/impl/zec/tzec.ts @@ -1,11 +1,14 @@ import { BitGoBase } from '@bitgo/sdk-core'; -import * as utxolib from '@bitgo/utxo-lib'; + +import { UtxoCoinName } from '../../names'; import { Zec } from './zec'; export class Tzec extends Zec { + readonly name: UtxoCoinName = 'tzec'; + constructor(bitgo: BitGoBase) { - super(bitgo, utxolib.networks.zcashTest); + super(bitgo); } static createInstance(bitgo: BitGoBase): Tzec { diff --git a/modules/abstract-utxo/src/impl/zec/zec.ts b/modules/abstract-utxo/src/impl/zec/zec.ts index 9254e320da..0ee1df3081 100644 --- a/modules/abstract-utxo/src/impl/zec/zec.ts +++ b/modules/abstract-utxo/src/impl/zec/zec.ts @@ -2,13 +2,15 @@ * @prettier */ import { BitGoBase } from '@bitgo/sdk-core'; -import * as utxolib from '@bitgo/utxo-lib'; -import { AbstractUtxoCoin, UtxoNetwork } from '../../abstractUtxoCoin'; +import { AbstractUtxoCoin } from '../../abstractUtxoCoin'; +import { UtxoCoinName } from '../../names'; export class Zec extends AbstractUtxoCoin { - constructor(bitgo: BitGoBase, network?: UtxoNetwork) { - super(bitgo, network || utxolib.networks.zcash); + readonly name: UtxoCoinName = 'zec'; + + constructor(bitgo: BitGoBase) { + super(bitgo); } static createInstance(bitgo: BitGoBase): Zec { diff --git a/modules/abstract-utxo/src/names.ts b/modules/abstract-utxo/src/names.ts index 346fe99a4b..0c3c158d68 100644 --- a/modules/abstract-utxo/src/names.ts +++ b/modules/abstract-utxo/src/names.ts @@ -3,19 +3,21 @@ import * as utxolib from '@bitgo/utxo-lib'; export const utxoCoinsMainnet = ['btc', 'bch', 'bcha', 'bsv', 'btg', 'dash', 'doge', 'ltc', 'zec'] as const; export const utxoCoinsTestnet = [ 'tbtc', + 'tbtc4', + 'tbtcsig', + 'tbtcbgsig', 'tbch', + 'tbcha', 'tbsv', + 'tbtg', 'tdash', 'tdoge', 'tltc', 'tzec', - 'tbtcsig', - 'tbtc4', - 'tbtcbgsig', ] as const; export type UtxoCoinNameMainnet = (typeof utxoCoinsMainnet)[number]; -export type UtxoCoinNameTestnet = (typeof utxoCoinsTestnet)[number]; +export type UtxoCoinNameTestnet = `t${UtxoCoinNameMainnet}` | 'tbtcsig' | 'tbtc4' | 'tbtcbgsig'; export type UtxoCoinName = UtxoCoinNameMainnet | UtxoCoinNameTestnet; export function isUtxoCoinNameMainnet(coinName: string): coinName is UtxoCoinNameMainnet { @@ -30,6 +32,20 @@ export function isUtxoCoinName(coinName: string): coinName is UtxoCoinName { return isUtxoCoinNameMainnet(coinName) || isUtxoCoinNameTestnet(coinName); } +export function getMainnetCoinName(coinName: UtxoCoinName): UtxoCoinNameMainnet { + if (isUtxoCoinNameMainnet(coinName)) { + return coinName; + } + switch (coinName) { + case 'tbtc4': + case 'tbtcsig': + case 'tbtcbgsig': + return 'btc'; + default: + return coinName.slice(1) as UtxoCoinNameMainnet; + } +} + function getNetworkName(n: utxolib.Network): utxolib.NetworkName { const name = utxolib.getNetworkName(n); if (!name) { @@ -39,6 +55,7 @@ function getNetworkName(n: utxolib.Network): utxolib.NetworkName { } /** + * @deprecated - will be removed when we drop support for utxolib * @param n * @returns the family name for a network. Testnets and mainnets of the same coin share the same family name. */ @@ -78,10 +95,11 @@ export function getFamilyFromNetwork(n: utxolib.Network): UtxoCoinNameMainnet { } /** + * @deprecated - will be removed when we drop support for utxolib * Get the chain name for a network. * The chain is different for every network. */ -export function getChainFromNetwork(n: utxolib.Network): string { +export function getCoinName(n: utxolib.Network): UtxoCoinName { switch (getNetworkName(n)) { case 'bitcoinPublicSignet': return 'tbtcsig'; @@ -113,72 +131,65 @@ export function getChainFromNetwork(n: utxolib.Network): string { } /** + * @deprecated - will be removed when we drop support for utxolib * @param coinName - the name of the coin (e.g. 'btc', 'bch', 'ltc'). Also called 'chain' in some contexts. * @returns the network for a coin. This is the mainnet network for the coin. */ -export function getNetworkFromChain(coinName: string): utxolib.Network { +export function getNetworkFromCoinName(coinName: string): utxolib.Network { for (const network of utxolib.getNetworkList()) { - if (getChainFromNetwork(network) === coinName) { + if (getCoinName(network) === coinName) { return network; } } - throw new Error(`Unknown chain ${coinName}`); + throw new Error(`Unknown coin name ${coinName}`); } -export function getFullNameFromNetwork(n: utxolib.Network): string { - const name = getNetworkName(n); +/** @deprecated - use getNetworkFromCoinName instead */ +export const getNetworkFromChain = getNetworkFromCoinName; + +function getBaseNameFromMainnet(coinName: UtxoCoinNameMainnet): string { + switch (coinName) { + case 'btc': + return 'Bitcoin'; + case 'bch': + return 'Bitcoin Cash'; + case 'bcha': + return 'Bitcoin ABC'; + case 'btg': + return 'Bitcoin Gold'; + case 'bsv': + return 'Bitcoin SV'; + case 'dash': + return 'Dash'; + case 'doge': + return 'Dogecoin'; + case 'ltc': + return 'Litecoin'; + case 'zec': + return 'ZCash'; + } +} +export function getFullNameFromCoinName(coinName: UtxoCoinName): string { let prefix: string; - switch (name) { - case 'bitcoinTestnet4': + switch (coinName) { + case 'tbtc4': prefix = 'Testnet4 '; break; - case 'bitcoinPublicSignet': + case 'tbtcsig': prefix = 'Public Signet '; break; - case 'bitcoinBitGoSignet': + case 'tbtcbgsig': prefix = 'BitGo Signet '; break; default: - if (utxolib.isTestnet(n)) { - prefix = 'Testnet '; - } else { - prefix = ''; - } + prefix = isUtxoCoinNameTestnet(coinName) ? 'Testnet ' : ''; } - switch (name) { - case 'bitcoin': - case 'testnet': - case 'bitcoinTestnet4': - case 'bitcoinPublicSignet': - case 'bitcoinBitGoSignet': - return prefix + 'Bitcoin'; - case 'bitcoincash': - case 'bitcoincashTestnet': - return prefix + 'Bitcoin Cash'; - case 'ecash': - case 'ecashTest': - return prefix + 'Bitcoin ABC'; - case 'bitcoingold': - case 'bitcoingoldTestnet': - return prefix + 'Bitcoin Gold'; - case 'bitcoinsv': - case 'bitcoinsvTestnet': - return prefix + 'Bitcoin SV'; - case 'dash': - case 'dashTest': - return prefix + 'Dash'; - case 'dogecoin': - case 'dogecoinTest': - return prefix + 'Dogecoin'; - case 'litecoin': - case 'litecoinTest': - return prefix + 'Litecoin'; - case 'zcash': - case 'zcashTest': - return prefix + 'ZCash'; - default: - throw new Error('Unknown network'); - } + return prefix + getBaseNameFromMainnet(getMainnetCoinName(coinName)); +} + +/** @deprecated - use getFullNameFromCoinName instead */ +export function getFullNameFromNetwork(n: utxolib.Network): string { + return getFullNameFromCoinName(getCoinName(n)); } diff --git a/modules/abstract-utxo/src/wallet.ts b/modules/abstract-utxo/src/wallet.ts index bdb1b49b57..604f5acb9d 100644 --- a/modules/abstract-utxo/src/wallet.ts +++ b/modules/abstract-utxo/src/wallet.ts @@ -13,7 +13,7 @@ export interface UtxoWalletData extends WalletData { } export function isUtxoWalletData(obj: WalletData): obj is UtxoWalletData { - return isUtxoCoinName(obj.coin); + return typeof obj.coin === 'string' && isUtxoCoinName(obj.coin); } export interface UtxoWallet extends Wallet { diff --git a/modules/abstract-utxo/test/unit/coins.ts b/modules/abstract-utxo/test/unit/coins.ts index 449edbc157..2e52f88134 100644 --- a/modules/abstract-utxo/test/unit/coins.ts +++ b/modules/abstract-utxo/test/unit/coins.ts @@ -2,6 +2,8 @@ import * as assert from 'assert'; import * as utxolib from '@bitgo/utxo-lib'; +import { getMainnetCoinName, utxoCoinsMainnet, utxoCoinsTestnet } from '../../src/names'; + import { getUtxoCoinForNetwork, utxoCoins } from './util'; describe('utxoCoins', function () { @@ -68,4 +70,23 @@ describe('utxoCoins', function () { ] ); }); + + it('getMainnetCoinName returns correct mainnet coin name', function () { + // Mainnet coins return themselves + for (const coin of utxoCoinsMainnet) { + assert.strictEqual(getMainnetCoinName(coin), coin); + } + + // Testnet coins return their mainnet counterpart + for (const coin of utxoCoinsTestnet) { + const mainnet = getMainnetCoinName(coin); + assert.ok(utxoCoinsMainnet.includes(mainnet), `${coin} -> ${mainnet} should be a mainnet coin`); + } + + // Verify specific mappings for special Bitcoin testnet variants + assert.strictEqual(getMainnetCoinName('tbtc'), 'btc'); + assert.strictEqual(getMainnetCoinName('tbtc4'), 'btc'); + assert.strictEqual(getMainnetCoinName('tbtcsig'), 'btc'); + assert.strictEqual(getMainnetCoinName('tbtcbgsig'), 'btc'); + }); }); diff --git a/modules/abstract-utxo/test/unit/transaction/fixedScript/parsePsbt.ts b/modules/abstract-utxo/test/unit/transaction/fixedScript/parsePsbt.ts index f5db82dccd..b9993306bb 100644 --- a/modules/abstract-utxo/test/unit/transaction/fixedScript/parsePsbt.ts +++ b/modules/abstract-utxo/test/unit/transaction/fixedScript/parsePsbt.ts @@ -14,7 +14,7 @@ import type { TransactionExplanation, ChangeAddressInfo, } from '../../../../src/transaction/fixedScript/explainTransaction'; -import { getChainFromNetwork } from '../../../../src/names'; +import { getCoinName } from '../../../../src/names'; import { TransactionPrebuild } from '../../../../src/abstractUtxoCoin'; import { hasWasmUtxoSupport } from './util'; @@ -110,7 +110,7 @@ function describeParseTransactionWith( let stubExplainTransaction: sinon.SinonStub; before('prepare', async function () { - const coinName = getChainFromNetwork(acidTest.network); + const coinName = getCoinName(acidTest.network); coin = getUtxoCoin(coinName); // Create PSBT and explanation