Skip to content

Commit

Permalink
refactor: update pox helpers to match api
Browse files Browse the repository at this point in the history
  • Loading branch information
janniks committed Nov 23, 2022
1 parent 6b2e9b1 commit a12d58d
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 25 deletions.
14 changes: 14 additions & 0 deletions packages/stacking/src/constants.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,11 @@ export const BitcoinNetworkVersion = {
P2PKH: 0x6f, // 111
P2SH: 0xc4, // 196
},
regtest: {
// equivalent to testnet for our purposes
P2PKH: 0x6f, // 111
P2SH: 0xc4, // 196
},
} as const;

/**
Expand All @@ -38,6 +43,14 @@ export const BitcoinNetworkVersion = {
*/
export const B58_ADDR_PREFIXES = /^(1|3|m|n|2)/;

/**
* Valid prefixes for supported segwit address, structure is:
* HRP PREFIX + SEPARATOR (always '1') + C32_ENCODED SEGWIT_VERSION_BYTE ('q' for 0, 'p' for 1) + HASHDATA
* @ignore
*/
export const SEGWIT_V0_ADDR_PREFIX = /^(bc1q|tb1q|bcrt1q)/i;
export const SEGWIT_V1_ADDR_PREFIX = /^(bc1p|tb1p|bcrt1p)/i;

/**
* Segwit Human-Readable Parts
* Valid prefixs for mainnet and testnet bech32/segwit addresses
Expand All @@ -46,6 +59,7 @@ export const B58_ADDR_PREFIXES = /^(1|3|m|n|2)/;
export const SegwitPrefix = {
mainnet: 'bc',
testnet: 'tb',
regtest: 'bcrt',
} as const;
/** @ignore */
export const SEGWIT_ADDR_PREFIXES = /^(bc|tb)/i;
Expand Down
43 changes: 18 additions & 25 deletions packages/stacking/src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,12 @@ import {
SegwitPrefix,
SEGWIT_ADDR_PREFIXES,
SEGWIT_V0,
SEGWIT_V0_ADDR_PREFIX,
SEGWIT_V1,
SEGWIT_V1_ADDR_PREFIX,
StackingErrors,
} from './constants';

// Valid prefixes for supported segwit address, structure is:
// HRP PREFIX + SEPARATOR (always '1') + C32_ENCODED SEGWIT_VERSION_BYTE ('q' for 0, 'p' for 1) + HASHDATA
const SEGWIT_V0_ADDR_PREFIX = /^(bc1q|tb1q|bcrt1q)/i;
const SEGWIT_V1_ADDR_PREFIX = /^(bc1p|tb1p|bcrt1p)/i;

export class InvalidAddressError extends Error {
innerError?: Error;
constructor(address: string, innerError?: Error) {
Expand Down Expand Up @@ -225,30 +222,26 @@ export function poxAddressToTuple(poxAddress: string) {

function legacyHashModeToBtcAddressVersion(
hashMode: PoXAddressVersion,
network: 'mainnet' | 'testnet'
network: 'mainnet' | 'testnet' | 'regtest'
): number {
if (hashMode === PoXAddressVersion.P2SHP2WPKH || hashMode === PoXAddressVersion.P2SHP2WSH) {
// P2SHP2WPKH and P2SHP2WSH are treated as P2SH for the sender
hashMode = PoXAddressVersion.P2SH;
}
if (hashMode === PoXAddressVersion.P2PKH && network === 'mainnet') {
return BitcoinNetworkVersion.mainnet.P2PKH;
} else if (hashMode === PoXAddressVersion.P2PKH && network === 'testnet') {
return BitcoinNetworkVersion.testnet.P2PKH;
} else if (hashMode === PoXAddressVersion.P2SH && network === 'mainnet') {
return BitcoinNetworkVersion.mainnet.P2SH;
} else if (hashMode === PoXAddressVersion.P2SH && network === 'testnet') {
return BitcoinNetworkVersion.testnet.P2SH;
switch (hashMode) {
case PoXAddressVersion.P2PKH:
return BitcoinNetworkVersion[network].P2PKH;
case PoXAddressVersion.P2SH:
case PoXAddressVersion.P2SHP2WPKH:
case PoXAddressVersion.P2SHP2WSH:
// P2SHP2WPKH and P2SHP2WSH are treated as P2SH for the sender
return BitcoinNetworkVersion[network].P2SH;
default:
throw new Error('Invalid pox address version');
}
throw new Error('Invalid pox address version');
}

function _poxAddressToBtcAddress_Values(
version: number,
hashBytes: Uint8Array,
network: 'mainnet' | 'testnet'
network: 'mainnet' | 'testnet' | 'regtest'
): string {
if (!['mainnet', 'testnet'].includes(network)) throw new Error('Invalid network.');
if (!['mainnet', 'testnet', 'regtest'].includes(network)) throw new Error('Invalid network.');

switch (version) {
case PoXAddressVersion.P2PKH:
Expand All @@ -273,7 +266,7 @@ function _poxAddressToBtcAddress_Values(

function _poxAddressToBtcAddress_ClarityValue(
poxAddrClarityValue: ClarityValue,
network: 'mainnet' | 'testnet'
network: 'mainnet' | 'testnet' | 'regtest'
): string {
const poxAddr = extractPoxAddressFromClarityValue(poxAddrClarityValue);
return _poxAddressToBtcAddress_Values(poxAddr.version, poxAddr.hashBytes, network);
Expand All @@ -282,11 +275,11 @@ function _poxAddressToBtcAddress_ClarityValue(
export function poxAddressToBtcAddress(
version: number,
hashBytes: Uint8Array,
network: 'mainnet' | 'testnet'
network: 'mainnet' | 'testnet' | 'regtest'
): string;
export function poxAddressToBtcAddress(
poxAddrClarityValue: ClarityValue,
network: 'mainnet' | 'testnet'
network: 'mainnet' | 'testnet' | 'regtest'
): string;
export function poxAddressToBtcAddress(...args: any[]): string {
if (typeof args[0] === 'number') return _poxAddressToBtcAddress_Values(args[0], args[1], args[2]);
Expand Down

0 comments on commit a12d58d

Please sign in to comment.