UNPKG

@btc-vision/transaction

Version:

OPNet transaction library allows you to create and sign transactions for the OPNet network.

124 lines (123 loc) 4.35 kB
import { address, initEccLib } from '@btc-vision/bitcoin'; import * as ecc from '@bitcoinerlab/secp256k1'; import { EcKeyPair } from './EcKeyPair.js'; import { BitcoinUtils } from '../utils/BitcoinUtils.js'; initEccLib(ecc); export var AddressTypes; (function (AddressTypes) { AddressTypes["P2PKH"] = "P2PKH"; AddressTypes["P2OP"] = "P2OP"; AddressTypes["P2SH_OR_P2SH_P2WPKH"] = "P2SH_OR_P2SH-P2WPKH"; AddressTypes["P2PK"] = "P2PK"; AddressTypes["P2TR"] = "P2TR"; AddressTypes["P2WPKH"] = "P2WPKH"; })(AddressTypes || (AddressTypes = {})); export class AddressVerificator { static isValidP2TRAddress(inAddress, network) { if (!inAddress || inAddress.length < 50) return false; let isValidTapRootAddress = false; try { address.toOutputScript(inAddress, network); const decodedAddress = address.fromBech32(inAddress); isValidTapRootAddress = decodedAddress.version === 1; } catch { } return isValidTapRootAddress; } static isP2WPKHAddress(inAddress, network) { if (!inAddress || inAddress.length < 20 || inAddress.length > 50) return false; let isValidSegWitAddress = false; try { const decodedAddress = address.fromBech32(inAddress); address.toOutputScript(inAddress, network); isValidSegWitAddress = decodedAddress.version === 0 && decodedAddress.data.length === 20; } catch { } return isValidSegWitAddress; } static isP2PKHOrP2SH(addy, network) { try { const decodedBase58 = address.fromBase58Check(addy); if (decodedBase58.version === network.pubKeyHash) { return true; } return decodedBase58.version === network.scriptHash; } catch (error) { return false; } } static isValidPublicKey(input, network) { try { if (input.startsWith('0x')) { input = input.slice(2); } if (!BitcoinUtils.isValidHex(input)) { return false; } if (input.length === 64) { return true; } const pubKeyBuffer = Buffer.from(input, 'hex'); if ((input.length === 130 && pubKeyBuffer[0] === 0x06) || pubKeyBuffer[0] === 0x07) { return true; } if (input.length === 66 || input.length === 130) { EcKeyPair.fromPublicKey(pubKeyBuffer, network); return true; } } catch (e) { return false; } return false; } static requireRedeemScript(addy, network) { try { const decodedBase58 = address.fromBase58Check(addy); if (decodedBase58.version === network.pubKeyHash) { return false; } return decodedBase58.version === network.scriptHash; } catch { return false; } } static detectAddressType(addy, network) { if (AddressVerificator.isValidPublicKey(addy, network)) { return AddressTypes.P2PK; } try { const decodedBase58 = address.fromBase58Check(addy); if (decodedBase58.version === network.pubKeyHash) { return AddressTypes.P2PKH; } if (decodedBase58.version === network.scriptHash) { return AddressTypes.P2SH_OR_P2SH_P2WPKH; } } catch { } try { const decodedBech32 = address.fromBech32(addy); if ((decodedBech32.prefix === network.bech32Opnet || decodedBech32.prefix === network.bech32) && decodedBech32.version === 16) { return AddressTypes.P2OP; } if (decodedBech32.prefix === network.bech32) { if (decodedBech32.version === 0 && decodedBech32.data.length === 20) { return AddressTypes.P2WPKH; } if (decodedBech32.version === 1 && decodedBech32.data.length === 32) { return AddressTypes.P2TR; } } } catch { } return null; } }