UNPKG

@vbyte/btc-dev

Version:

Batteries-included toolset for plebian bitcoin development

52 lines (51 loc) 2.09 kB
import { Buff } from '@vbyte/buff'; import { Assert } from '@vbyte/micro-lib'; import { hash160 } from '@vbyte/micro-lib/hash'; import { encode_address } from './encode.js'; import { is_p2wpkh_script } from '../../lib/script/lock.js'; import { LOCK_SCRIPT_TYPE } from '../../const.js'; import { get_address_config, get_address_info } from './util.js'; const ADDRESS_TYPE = LOCK_SCRIPT_TYPE.P2WPKH; export var P2WPKH; (function (P2WPKH) { P2WPKH.create_address = create_p2wpkh_address; P2WPKH.create_script = create_p2wpkh_script; P2WPKH.encode_address = encode_p2wpkh_address; P2WPKH.encode_script = encode_p2wpkh_script; P2WPKH.decode_address = decode_p2wpkh_address; P2WPKH.decode_script = decode_p2wpkh_script; })(P2WPKH || (P2WPKH = {})); function create_p2wpkh_address(pubkey, network = 'main') { const script = create_p2wpkh_script(pubkey); return encode_p2wpkh_address(script, network); } function create_p2wpkh_script(pubkey) { const bytes = Buff.bytes(pubkey); Assert.size(bytes, 33, 'invalid pubkey size'); const hash = hash160(bytes); return encode_p2wpkh_script(hash); } function encode_p2wpkh_script(pk_hash) { return Buff.join(['0014', pk_hash]); } function encode_p2wpkh_address(script_pk, network = 'main') { const pk_hash = decode_p2wpkh_script(script_pk); const config = get_address_config(network, ADDRESS_TYPE); Assert.exists(config, `unrecognized address config: ${ADDRESS_TYPE} on ${network}`); Assert.size(pk_hash, config.size, `invalid payload size: ${pk_hash.length} !== ${config.size}`); return encode_address({ data: pk_hash, format: 'bech32', prefix: config.prefix }); } function decode_p2wpkh_address(address) { const parsed = get_address_info(address); Assert.ok(parsed.type === 'p2wpkh', `address type mismatch: ${parsed.type} !== ${ADDRESS_TYPE}`); return parsed; } function decode_p2wpkh_script(script) { Assert.ok(is_p2wpkh_script(script), `invalid p2wpkh script`); const bytes = Buff.bytes(script); return bytes.slice(2, 22); }