1 | var bs58check = require('bs58check')
|
2 | var bscript = require('./script')
|
3 | var networks = require('./networks')
|
4 | var typeforce = require('typeforce')
|
5 | var types = require('./types')
|
6 |
|
7 | function fromBase58Check (address) {
|
8 | var payload = bs58check.decode(address)
|
9 | if (payload.length < 21) throw new TypeError(address + ' is too short')
|
10 | if (payload.length > 22) throw new TypeError(address + ' is too long')
|
11 |
|
12 | var multibyte = payload.length === 22
|
13 | var offset = multibyte ? 2 : 1
|
14 |
|
15 | var version = multibyte ? payload.readUInt16BE(0) : payload[0]
|
16 | var hash = payload.slice(offset)
|
17 |
|
18 | return { hash: hash, version: version }
|
19 | }
|
20 |
|
21 | function toBase58Check (hash, version) {
|
22 | typeforce(types.tuple(types.Hash160bit, types.UInt16), arguments)
|
23 |
|
24 | var multibyte = version > 0xff
|
25 | var size = multibyte ? 22 : 21
|
26 | var offset = multibyte ? 2 : 1
|
27 |
|
28 | var payload = new Buffer(size)
|
29 | multibyte ? payload.writeUInt16BE(version, 0) : payload.writeUInt8(version, 0)
|
30 | hash.copy(payload, offset)
|
31 |
|
32 | return bs58check.encode(payload)
|
33 | }
|
34 |
|
35 | function fromOutputScript (scriptPubKey, network) {
|
36 | network = network || networks.bitcoin
|
37 |
|
38 | if (bscript.isPubKeyHashOutput(scriptPubKey)) return toBase58Check(bscript.compile(scriptPubKey).slice(3, 23), network.pubKeyHash)
|
39 | if (bscript.isScriptHashOutput(scriptPubKey)) return toBase58Check(bscript.compile(scriptPubKey).slice(2, 22), network.scriptHash)
|
40 |
|
41 | throw new Error(bscript.toASM(scriptPubKey) + ' has no matching Address')
|
42 | }
|
43 |
|
44 | function toOutputScript (address, network) {
|
45 | network = network || networks.bitcoin
|
46 |
|
47 | var decode = fromBase58Check(address)
|
48 | if (decode.version === network.pubKeyHash) return bscript.pubKeyHashOutput(decode.hash)
|
49 | if (decode.version === network.scriptHash) return bscript.scriptHashOutput(decode.hash)
|
50 |
|
51 | throw new Error(address + ' has no matching Script')
|
52 | }
|
53 |
|
54 | module.exports = {
|
55 | fromBase58Check: fromBase58Check,
|
56 | fromOutputScript: fromOutputScript,
|
57 | toBase58Check: toBase58Check,
|
58 | toOutputScript: toOutputScript
|
59 | }
|