@atomicfinance/bitcoin-utils 3.5.3 → 3.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -35,10 +35,82 @@ const bignumber_js_1 = __importDefault(require("bignumber.js"));
35
35
  const varuint = __importStar(require("bip174/src/lib/converter/varint"));
36
36
  const bitcoin_networks_1 = require("bitcoin-networks");
37
37
  const bitcoin = __importStar(require("bitcoinjs-lib"));
38
- const classify = __importStar(require("bitcoinjs-lib/src/classify"));
39
38
  const coinselect_1 = __importDefault(require("coinselect"));
40
39
  const accumulative_1 = __importDefault(require("coinselect/accumulative"));
41
40
  const lodash_1 = require("lodash");
41
+ // Script type constants (replacing the classify module)
42
+ const SCRIPT_TYPES = {
43
+ P2PKH: 'pubkeyhash',
44
+ P2SH: 'scripthash',
45
+ P2WPKH: 'witness_v0_keyhash',
46
+ P2WSH: 'witness_v0_scripthash',
47
+ P2TR: 'witness_v1_taproot',
48
+ NULLDATA: 'nulldata',
49
+ NONSTANDARD: 'nonstandard',
50
+ MULTISIG: 'multisig',
51
+ P2PK: 'pubkey',
52
+ };
53
+ // Custom script classification function
54
+ const classifyScript = (script) => {
55
+ if (script.length === 0)
56
+ return SCRIPT_TYPES.NONSTANDARD;
57
+ // P2PKH: OP_DUP OP_HASH160 <20 bytes> OP_EQUALVERIFY OP_CHECKSIG
58
+ if (script.length === 25 &&
59
+ script[0] === 0x76 && // OP_DUP
60
+ script[1] === 0xa9 && // OP_HASH160
61
+ script[2] === 0x14 && // 20 bytes
62
+ script[23] === 0x88 && // OP_EQUALVERIFY
63
+ script[24] === 0xac) {
64
+ // OP_CHECKSIG
65
+ return SCRIPT_TYPES.P2PKH;
66
+ }
67
+ // P2SH: OP_HASH160 <20 bytes> OP_EQUAL
68
+ if (script.length === 23 &&
69
+ script[0] === 0xa9 && // OP_HASH160
70
+ script[1] === 0x14 && // 20 bytes
71
+ script[22] === 0x87) {
72
+ // OP_EQUAL
73
+ return SCRIPT_TYPES.P2SH;
74
+ }
75
+ // P2WPKH: OP_0 <20 bytes>
76
+ if (script.length === 22 &&
77
+ script[0] === 0x00 && // OP_0
78
+ script[1] === 0x14) {
79
+ // 20 bytes
80
+ return SCRIPT_TYPES.P2WPKH;
81
+ }
82
+ // P2WSH: OP_0 <32 bytes>
83
+ if (script.length === 34 &&
84
+ script[0] === 0x00 && // OP_0
85
+ script[1] === 0x20) {
86
+ // 32 bytes
87
+ return SCRIPT_TYPES.P2WSH;
88
+ }
89
+ // P2TR: OP_1 <32 bytes>
90
+ if (script.length === 34 &&
91
+ script[0] === 0x51 && // OP_1
92
+ script[1] === 0x20) {
93
+ // 32 bytes
94
+ return SCRIPT_TYPES.P2TR;
95
+ }
96
+ // OP_RETURN (nulldata)
97
+ if (script.length >= 1 && script[0] === 0x6a) {
98
+ // OP_RETURN
99
+ return SCRIPT_TYPES.NULLDATA;
100
+ }
101
+ // P2PK: <33 or 65 bytes pubkey> OP_CHECKSIG
102
+ if ((script.length === 35 || script.length === 67) &&
103
+ script[script.length - 1] === 0xac) {
104
+ // OP_CHECKSIG
105
+ return SCRIPT_TYPES.P2PK;
106
+ }
107
+ // Basic multisig detection: OP_M <pubkeys> OP_N OP_CHECKMULTISIG
108
+ if (script.length >= 4 && script[script.length - 1] === 0xae) {
109
+ // OP_CHECKMULTISIG
110
+ return SCRIPT_TYPES.MULTISIG;
111
+ }
112
+ return SCRIPT_TYPES.NONSTANDARD;
113
+ };
42
114
  const AddressTypes = ['legacy', 'p2sh-segwit', 'bech32'];
43
115
  exports.AddressTypes = AddressTypes;
44
116
  const calculateFee = (numInputs, numOutputs, feePerByte) => {
@@ -103,8 +175,8 @@ const selectCoins = (utxos, targets, feePerByte, fixedInputs = []) => {
103
175
  };
104
176
  exports.selectCoins = selectCoins;
105
177
  const OUTPUT_TYPES_MAP = {
106
- [classify.types.P2WPKH]: 'witness_v0_keyhash',
107
- [classify.types.P2WSH]: 'witness_v0_scripthash',
178
+ [SCRIPT_TYPES.P2WPKH]: 'witness_v0_keyhash',
179
+ [SCRIPT_TYPES.P2WSH]: 'witness_v0_scripthash',
108
180
  };
109
181
  const decodeRawTransaction = (hex, network) => {
110
182
  const bjsTx = bitcoin.Transaction.fromHex(hex);
@@ -121,7 +193,7 @@ const decodeRawTransaction = (hex, network) => {
121
193
  };
122
194
  });
123
195
  const vout = bjsTx.outs.map((output, n) => {
124
- const type = classify.output(output.script);
196
+ const type = classifyScript(output.script);
125
197
  const vout = {
126
198
  value: output.value / 1e8,
127
199
  n,
@@ -209,8 +281,8 @@ const witnessStackToScriptWitness = (witness) => {
209
281
  exports.witnessStackToScriptWitness = witnessStackToScriptWitness;
210
282
  const getPubKeyHash = (address, network) => {
211
283
  const outputScript = bitcoin.address.toOutputScript(address, network);
212
- const type = classify.output(outputScript);
213
- if (![classify.types.P2PKH, classify.types.P2WPKH].includes(type)) {
284
+ const type = classifyScript(outputScript);
285
+ if (type !== SCRIPT_TYPES.P2PKH && type !== SCRIPT_TYPES.P2WPKH) {
214
286
  throw new Error(`Bitcoin swap doesn't support the address ${address} type of ${type}. Not possible to derive public key hash.`);
215
287
  }
216
288
  try {
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kDAA4D;AAC5D,kDAA4D;AAC5D,gDAK8B;AAC9B,gDAAuD;AACvD,gEAAqC;AACrC,yEAA2D;AAC3D,uDAAmE;AACnE,uDAAyC;AACzC,qEAAuD;AACvD,4DAAoC;AACpC,2EAA6D;AAC7D,mCAAiC;AAEjC,MAAM,YAAY,GAAG,CAAC,QAAQ,EAAE,aAAa,EAAE,QAAQ,CAAC,CAAC;AAiSvD,oCAAY;AA/Rd,MAAM,YAAY,GAAG,CACnB,SAAiB,EACjB,UAAkB,EAClB,UAAkB,EACV,EAAE;IACV,OAAO,CAAC,SAAS,GAAG,GAAG,GAAG,UAAU,GAAG,EAAE,GAAG,EAAE,CAAC,GAAG,UAAU,CAAC;AAC/D,CAAC,CAAC;AAiRA,oCAAY;AA/Qd;;;;GAIG;AACH,MAAM,cAAc,GAAG,CAAC,MAAc,EAAU,EAAE;IAChD,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IAClC,MAAM,CAAC,GAAG,MAAM,CAAC,SAAS,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;IACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzD,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAElC,OAAO,MAAM,GAAG,CAAC,CAAC;AACpB,CAAC,CAAC;AAoQA,wCAAc;AAlQhB;;;;GAIG;AACH,MAAM,iBAAiB,GAAG,CAAC,OAAe,EAAkB,EAAE;IAC5D,0DAA0D;IAC1D,IAAI,UAAU,CAAC;IACf,SAAS;IACT,UAAU,GAAG,IAAA,gBAAO,EAAC,kCAAe,EAAE,CAAC,OAAO,EAAE,EAAE,CAChD,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,CACnC,CAAC;IACF,SAAS;IACT,IAAI,CAAC,UAAU,EAAE;QACf,MAAM,MAAM,GAAG,eAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtE,UAAU,GAAG,IAAA,gBAAO,EAAC,kCAAe,EAAE,CAAC,OAAO,EAAE,EAAE;YAChD,MAAM,gBAAgB,GAAG,IAAA,oBAAW,EAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACzE,MAAM,gBAAgB,GAAG,IAAA,oBAAW,EAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;YACzE,OAAO,CAAC,gBAAgB,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/D,CAAC,CAAC,CAAC;KACJ;IACD,OAAQ,kCAAqD,CAAC,UAAU,CAAC,CAAC;AAC5E,CAAC,CAAC;AA6OA,8CAAiB;AAxNnB,MAAM,WAAW,GAAG,CAClB,KAAgB,EAChB,OAA2B,EAC3B,UAAkB,EAClB,cAAyB,EAAE,EACP,EAAE;IACtB,IAAI,WAAW,GAAG,KAAK,CAAC;IAExB,kDAAkD;IAClD,6EAA6E;IAC7E,MAAM,eAAe,GAAuB,WAAW,CAAC,MAAM;QAC5D,CAAC,CAAC,sBAAsB;QACxB,CAAC,CAAC,oBAAU,CAAC;IACf,IAAI,WAAW,CAAC,MAAM,EAAE;QACtB,WAAW,GAAG;YACZ,+DAA+D;YAC/D,GAAG,WAAW;YACd,GAAG,KAAK,CAAC,MAAM,CACb,CAAC,IAAI,EAAE,EAAE,CACP,CAAC,WAAW,CAAC,IAAI,CACf,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAChE,CACJ;SACF,CAAC;KACH;IAED,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,eAAe,CAC9C,WAAW,EACX,OAAO,EACP,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CACtB,CAAC;IAEF,IAAI,MAAM,CAAC;IACX,IAAI,MAAM,IAAI,OAAO,EAAE;QACrB,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;KACzD;IAED,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;AAC1C,CAAC,CAAC;AAoLA,kCAAW;AAlLb,MAAM,gBAAgB,GAAG;IACvB,CAAC,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,oBAAoB;IAC7C,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,uBAAuB;CAChD,CAAC;AAEF,MAAM,oBAAoB,GAAG,CAC3B,GAAW,EACX,OAAuB,EACP,EAAE;IAClB,MAAM,KAAK,GAAG,OAAO,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAE/C,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAClC,OAAiB;YACf,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;YACvD,IAAI,EAAE,KAAK,CAAC,KAAK;YACjB,SAAS,EAAE;gBACT,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC;gBACvC,GAAG,EAAE,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;aAClC;YACD,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YACxD,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACxC,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAE5C,MAAM,IAAI,GAAc;YACtB,KAAK,EAAE,MAAM,CAAC,KAAK,GAAG,GAAG;YACzB,CAAC;YACD,YAAY,EAAE;gBACZ,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC;gBACxC,GAAG,EAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAClC,OAAO,EAAE,CAAC;gBACV,IAAI,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,IAAI;gBACpC,SAAS,EAAE,EAAE;aACd;SACF,CAAC;QAEF,IAAI;YACF,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACzE,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SAC3C;QAAC,OAAO,CAAC,EAAE;YACV,yDAAyD;SAC1D;QAED,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpD,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;QACnD,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,QAAQ,EAAE,KAAK,CAAC,QAAQ;QACxB,IAAI,EAAE,KAAK,CAAC,UAAU,EAAE;QACxB,KAAK,EAAE,KAAK,CAAC,WAAW,EAAE;QAC1B,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE;QACtB,GAAG;QACH,IAAI;QACJ,GAAG;KACJ,CAAC;AACJ,CAAC,CAAC;AAsHA,oDAAoB;AApHtB,MAAM,0BAA0B,GAAG,CACjC,EAAkB,EAClB,GAAW,EACX,KAAwC,EACX,EAAE;IAC/B,MAAM,KAAK,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,CAC1B,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,sBAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EACnD,IAAI,sBAAS,CAAC,CAAC,CAAC,CACjB,CAAC;IACF,MAAM,MAAM,GAAG;QACb,IAAI,EAAE,EAAE,CAAC,IAAI;QACb,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;QACvB,IAAI,EAAE,EAAE;QACR,aAAa,EAAE,CAAC;QAChB,MAAM,EAAE,EAAE,CAAC,aAAa,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAQ,CAAC,OAAO;KACnE,CAAC;IAEF,IAAI,GAAG,EAAE;QACP,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;QAC5C,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;YACpB,GAAG;YACH,QAAQ;SACT,CAAC,CAAC;KACJ;IAED,IAAI,KAAK,EAAE;QACT,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;YACpB,SAAS,EAAE,KAAK,CAAC,IAAI;YACrB,WAAW,EAAE,KAAK,CAAC,MAAM;YACzB,aAAa,EAAE,EAAE,CAAC,aAAa;SAChC,CAAC,CAAC;KACJ;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAmFA,gEAA0B;AAjF5B,wEAAwE;AACxE,2FAA2F;AAC3F,MAAM,2BAA2B,GAAG,CAAC,OAAiB,EAAU,EAAE;IAChE,IAAI,MAAM,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAEnC,SAAS,UAAU,CAAC,KAAa;QAC/B,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACvD,CAAC;IAED,SAAS,WAAW,CAAC,CAAS;QAC5B,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;QACjC,MAAM,SAAS,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC;QAE5C,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAChE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC,CAAC;IACxC,CAAC;IAED,SAAS,aAAa,CAAC,KAAa;QAClC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,UAAU,CAAC,KAAK,CAAC,CAAC;IACpB,CAAC;IAED,SAAS,WAAW,CAAC,MAAgB;QACnC,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC3B,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC,CAAC;IAED,WAAW,CAAC,OAAO,CAAC,CAAC;IAErB,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAoDA,kEAA2B;AAlD7B,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,OAAuB,EAAU,EAAE;IACzE,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,QAAQ,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC3C,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;QACjE,MAAM,IAAI,KAAK,CACb,4CAA4C,OAAO,YAAY,IAAI,2CAA2C,CAC/G,CAAC;KACH;IAED,IAAI;QACF,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QACnD,OAAO,MAAM,CAAC,IAAI,CAAC;KACpB;IAAC,OAAO,CAAC,EAAE;QACV,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;QACxD,OAAO,MAAM,CAAC,IAAI,CAAC;KACpB;AACH,CAAC,CAAC;AAoCA,sCAAa;AAlCf,MAAM,eAAe,GAAG,CACtB,QAA0B,EAC1B,OAAuB,EACjB,EAAE;IACR,MAAM,OAAO,GAAG,IAAA,uBAAe,EAAC,QAAQ,CAAC,CAAC;IAE1C,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE;QAC/B,MAAM,IAAI,4BAAmB,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;KAC9D;IAED,IAAI,UAAU,CAAC;IACf,IAAI;QACF,UAAU,GAAG,aAAa,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;KAC9C;IAAC,OAAO,CAAC,EAAE;QACV,MAAM,IAAI,4BAAmB,CAC3B,qCAAqC,OAAO,EAAE,CAC/C,CAAC;KACH;IAED,IAAI,CAAC,UAAU,EAAE;QACf,MAAM,IAAI,4BAAmB,CAAC,oBAAoB,OAAO,EAAE,CAAC,CAAC;KAC9D;AACH,CAAC,CAAC;AAaA,0CAAe"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"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"}
package/lib/index.ts CHANGED
@@ -11,11 +11,105 @@ import BigNumber from 'bignumber.js';
11
11
  import * as varuint from 'bip174/src/lib/converter/varint';
12
12
  import { BitcoinNetwork, BitcoinNetworks } from 'bitcoin-networks';
13
13
  import * as bitcoin from 'bitcoinjs-lib';
14
- import * as classify from 'bitcoinjs-lib/src/classify';
15
14
  import coinselect from 'coinselect';
16
15
  import coinselectAccumulative from 'coinselect/accumulative';
17
16
  import { findKey } from 'lodash';
18
17
 
18
+ // Script type constants (replacing the classify module)
19
+ const SCRIPT_TYPES = {
20
+ P2PKH: 'pubkeyhash',
21
+ P2SH: 'scripthash',
22
+ P2WPKH: 'witness_v0_keyhash',
23
+ P2WSH: 'witness_v0_scripthash',
24
+ P2TR: 'witness_v1_taproot',
25
+ NULLDATA: 'nulldata',
26
+ NONSTANDARD: 'nonstandard',
27
+ MULTISIG: 'multisig',
28
+ P2PK: 'pubkey',
29
+ } as const;
30
+
31
+ // Custom script classification function
32
+ const classifyScript = (script: Buffer): string => {
33
+ if (script.length === 0) return SCRIPT_TYPES.NONSTANDARD;
34
+
35
+ // P2PKH: OP_DUP OP_HASH160 <20 bytes> OP_EQUALVERIFY OP_CHECKSIG
36
+ if (
37
+ script.length === 25 &&
38
+ script[0] === 0x76 && // OP_DUP
39
+ script[1] === 0xa9 && // OP_HASH160
40
+ script[2] === 0x14 && // 20 bytes
41
+ script[23] === 0x88 && // OP_EQUALVERIFY
42
+ script[24] === 0xac
43
+ ) {
44
+ // OP_CHECKSIG
45
+ return SCRIPT_TYPES.P2PKH;
46
+ }
47
+
48
+ // P2SH: OP_HASH160 <20 bytes> OP_EQUAL
49
+ if (
50
+ script.length === 23 &&
51
+ script[0] === 0xa9 && // OP_HASH160
52
+ script[1] === 0x14 && // 20 bytes
53
+ script[22] === 0x87
54
+ ) {
55
+ // OP_EQUAL
56
+ return SCRIPT_TYPES.P2SH;
57
+ }
58
+
59
+ // P2WPKH: OP_0 <20 bytes>
60
+ if (
61
+ script.length === 22 &&
62
+ script[0] === 0x00 && // OP_0
63
+ script[1] === 0x14
64
+ ) {
65
+ // 20 bytes
66
+ return SCRIPT_TYPES.P2WPKH;
67
+ }
68
+
69
+ // P2WSH: OP_0 <32 bytes>
70
+ if (
71
+ script.length === 34 &&
72
+ script[0] === 0x00 && // OP_0
73
+ script[1] === 0x20
74
+ ) {
75
+ // 32 bytes
76
+ return SCRIPT_TYPES.P2WSH;
77
+ }
78
+
79
+ // P2TR: OP_1 <32 bytes>
80
+ if (
81
+ script.length === 34 &&
82
+ script[0] === 0x51 && // OP_1
83
+ script[1] === 0x20
84
+ ) {
85
+ // 32 bytes
86
+ return SCRIPT_TYPES.P2TR;
87
+ }
88
+
89
+ // OP_RETURN (nulldata)
90
+ if (script.length >= 1 && script[0] === 0x6a) {
91
+ // OP_RETURN
92
+ return SCRIPT_TYPES.NULLDATA;
93
+ }
94
+
95
+ // P2PK: <33 or 65 bytes pubkey> OP_CHECKSIG
96
+ if (
97
+ (script.length === 35 || script.length === 67) &&
98
+ script[script.length - 1] === 0xac
99
+ ) {
100
+ // OP_CHECKSIG
101
+ return SCRIPT_TYPES.P2PK;
102
+ }
103
+
104
+ // Basic multisig detection: OP_M <pubkeys> OP_N OP_CHECKMULTISIG
105
+ if (script.length >= 4 && script[script.length - 1] === 0xae) {
106
+ // OP_CHECKMULTISIG
107
+ return SCRIPT_TYPES.MULTISIG;
108
+ }
109
+
110
+ return SCRIPT_TYPES.NONSTANDARD;
111
+ };
112
+
19
113
  const AddressTypes = ['legacy', 'p2sh-segwit', 'bech32'];
20
114
 
21
115
  const calculateFee = (
@@ -124,8 +218,8 @@ const selectCoins = (
124
218
  };
125
219
 
126
220
  const OUTPUT_TYPES_MAP = {
127
- [classify.types.P2WPKH]: 'witness_v0_keyhash',
128
- [classify.types.P2WSH]: 'witness_v0_scripthash',
221
+ [SCRIPT_TYPES.P2WPKH]: 'witness_v0_keyhash',
222
+ [SCRIPT_TYPES.P2WSH]: 'witness_v0_scripthash',
129
223
  };
130
224
 
131
225
  const decodeRawTransaction = (
@@ -148,7 +242,7 @@ const decodeRawTransaction = (
148
242
  });
149
243
 
150
244
  const vout = bjsTx.outs.map((output, n) => {
151
- const type = classify.output(output.script);
245
+ const type = classifyScript(output.script);
152
246
 
153
247
  const vout: bT.Output = {
154
248
  value: output.value / 1e8,
@@ -256,8 +350,8 @@ const witnessStackToScriptWitness = (witness: Buffer[]): Buffer => {
256
350
 
257
351
  const getPubKeyHash = (address: string, network: BitcoinNetwork): Buffer => {
258
352
  const outputScript = bitcoin.address.toOutputScript(address, network);
259
- const type = classify.output(outputScript);
260
- if (![classify.types.P2PKH, classify.types.P2WPKH].includes(type)) {
353
+ const type = classifyScript(outputScript);
354
+ if (type !== SCRIPT_TYPES.P2PKH && type !== SCRIPT_TYPES.P2WPKH) {
261
355
  throw new Error(
262
356
  `Bitcoin swap doesn't support the address ${address} type of ${type}. Not possible to derive public key hash.`,
263
357
  );
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atomicfinance/bitcoin-utils",
3
- "version": "3.5.3",
3
+ "version": "3.6.1",
4
4
  "description": "",
5
5
  "module": "dist/index.js",
6
6
  "main": "dist/index.js",
@@ -24,15 +24,15 @@
24
24
  "node": ">=14"
25
25
  },
26
26
  "dependencies": {
27
- "@atomicfinance/crypto": "^3.5.3",
28
- "@atomicfinance/errors": "^3.5.3",
29
- "@atomicfinance/types": "^3.5.3",
30
- "@atomicfinance/utils": "^3.5.3",
27
+ "@atomicfinance/crypto": "^3.6.1",
28
+ "@atomicfinance/errors": "^3.6.1",
29
+ "@atomicfinance/types": "^3.6.1",
30
+ "@atomicfinance/utils": "^3.6.1",
31
31
  "@babel/runtime": "^7.12.1",
32
32
  "bignumber.js": "^9.0.0",
33
33
  "bip174": "^2.0.1",
34
34
  "bitcoin-networks": "^1.0.0",
35
- "bitcoinjs-lib": "5.2.0",
35
+ "bitcoinjs-lib": "6.1.7",
36
36
  "coinselect": "^3.1.11",
37
37
  "lodash": "^4.17.20"
38
38
  },
@@ -40,7 +40,6 @@
40
40
  "access": "public"
41
41
  },
42
42
  "devDependencies": {
43
- "@types/bitcoinjs-lib": "^5.0.0",
44
43
  "@types/lodash": "^4.14.168",
45
44
  "@types/node": "16.10.3"
46
45
  },
@@ -1 +0,0 @@
1
- declare module 'bitcoinjs-lib/src/classify'
package/lib/index.js DELETED
@@ -1,243 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- var __importDefault = (this && this.__importDefault) || function (mod) {
26
- return (mod && mod.__esModule) ? mod : { "default": mod };
27
- };
28
- Object.defineProperty(exports, "__esModule", { value: true });
29
- exports.validateAddress = exports.getPubKeyHash = exports.AddressTypes = exports.witnessStackToScriptWitness = exports.normalizeTransactionObject = exports.decodeRawTransaction = exports.selectCoins = exports.getAddressNetwork = exports.compressPubKey = exports.calculateFee = void 0;
30
- const crypto_1 = require("@atomicfinance/crypto");
31
- const errors_1 = require("@atomicfinance/errors");
32
- const types_1 = require("@atomicfinance/types");
33
- const utils_1 = require("@atomicfinance/utils");
34
- const bignumber_js_1 = __importDefault(require("bignumber.js"));
35
- const varuint = __importStar(require("bip174/src/lib/converter/varint"));
36
- const bitcoin_networks_1 = require("bitcoin-networks");
37
- const bitcoin = __importStar(require("bitcoinjs-lib"));
38
- const classify = __importStar(require("bitcoinjs-lib/src/classify"));
39
- const coinselect_1 = __importDefault(require("coinselect"));
40
- const accumulative_1 = __importDefault(require("coinselect/accumulative"));
41
- const lodash_1 = require("lodash");
42
- const AddressTypes = ['legacy', 'p2sh-segwit', 'bech32'];
43
- exports.AddressTypes = AddressTypes;
44
- const calculateFee = (numInputs, numOutputs, feePerByte) => {
45
- return (numInputs * 148 + numOutputs * 34 + 10) * feePerByte;
46
- };
47
- exports.calculateFee = calculateFee;
48
- /**
49
- * Get compressed pubKey from pubKey.
50
- * @param {!string} pubKey - 65 byte string with prefix, x, y.
51
- * @return {string} Returns the compressed pubKey of uncompressed pubKey.
52
- */
53
- const compressPubKey = (pubKey) => {
54
- const x = pubKey.substring(2, 66);
55
- const y = pubKey.substring(66, 130);
56
- const even = parseInt(y.substring(62, 64), 16) % 2 === 0;
57
- const prefix = even ? '02' : '03';
58
- return prefix + x;
59
- };
60
- exports.compressPubKey = compressPubKey;
61
- /**
62
- * Get a network object from an address
63
- * @param {string} address The bitcoin address
64
- * @return {Network}
65
- */
66
- const getAddressNetwork = (address) => {
67
- // TODO: can this be simplified using just bitcoinjs-lib??
68
- let networkKey;
69
- // bech32
70
- networkKey = (0, lodash_1.findKey)(bitcoin_networks_1.BitcoinNetworks, (network) => address.startsWith(network.bech32));
71
- // base58
72
- if (!networkKey) {
73
- const prefix = crypto_1.base58.decode(address).toString('hex').substring(0, 2);
74
- networkKey = (0, lodash_1.findKey)(bitcoin_networks_1.BitcoinNetworks, (network) => {
75
- const pubKeyHashPrefix = (0, crypto_1.padHexStart)(network.pubKeyHash.toString(16), 1);
76
- const scriptHashPrefix = (0, crypto_1.padHexStart)(network.scriptHash.toString(16), 1);
77
- return [pubKeyHashPrefix, scriptHashPrefix].includes(prefix);
78
- });
79
- }
80
- return bitcoin_networks_1.BitcoinNetworks[networkKey];
81
- };
82
- exports.getAddressNetwork = getAddressNetwork;
83
- const selectCoins = (utxos, targets, feePerByte, fixedInputs = []) => {
84
- let selectUtxos = utxos;
85
- // Default coinselect won't accumulate some inputs
86
- // TODO: does coinselect need to be modified to ABSOLUTELY not skip an input?
87
- const coinselectStrat = fixedInputs.length
88
- ? accumulative_1.default
89
- : coinselect_1.default;
90
- if (fixedInputs.length) {
91
- selectUtxos = [
92
- // Order fixed inputs to the start of the list so they are used
93
- ...fixedInputs,
94
- ...utxos.filter((utxo) => !fixedInputs.find((input) => input.vout === utxo.vout && input.txid === utxo.txid)),
95
- ];
96
- }
97
- const { inputs, outputs, fee } = coinselectStrat(selectUtxos, targets, Math.ceil(feePerByte));
98
- let change;
99
- if (inputs && outputs) {
100
- change = outputs.find((output) => output.id !== 'main');
101
- }
102
- return { inputs, outputs, fee, change };
103
- };
104
- exports.selectCoins = selectCoins;
105
- const OUTPUT_TYPES_MAP = {
106
- [classify.types.P2WPKH]: 'witness_v0_keyhash',
107
- [classify.types.P2WSH]: 'witness_v0_scripthash',
108
- };
109
- const decodeRawTransaction = (hex, network) => {
110
- const bjsTx = bitcoin.Transaction.fromHex(hex);
111
- const vin = bjsTx.ins.map((input) => {
112
- return {
113
- txid: Buffer.from(input.hash).reverse().toString('hex'),
114
- vout: input.index,
115
- scriptSig: {
116
- asm: bitcoin.script.toASM(input.script),
117
- hex: input.script.toString('hex'),
118
- },
119
- txinwitness: input.witness.map((w) => w.toString('hex')),
120
- sequence: input.sequence,
121
- };
122
- });
123
- const vout = bjsTx.outs.map((output, n) => {
124
- const type = classify.output(output.script);
125
- const vout = {
126
- value: output.value / 1e8,
127
- n,
128
- scriptPubKey: {
129
- asm: bitcoin.script.toASM(output.script),
130
- hex: output.script.toString('hex'),
131
- reqSigs: 1,
132
- type: OUTPUT_TYPES_MAP[type] || type,
133
- addresses: [],
134
- },
135
- };
136
- try {
137
- const address = bitcoin.address.fromOutputScript(output.script, network);
138
- vout.scriptPubKey.addresses.push(address);
139
- }
140
- catch (e) {
141
- /** If output script is not parasable, we just skip it */
142
- }
143
- return vout;
144
- });
145
- return {
146
- txid: bjsTx.getHash(false).reverse().toString('hex'),
147
- hash: bjsTx.getHash(true).reverse().toString('hex'),
148
- version: bjsTx.version,
149
- locktime: bjsTx.locktime,
150
- size: bjsTx.byteLength(),
151
- vsize: bjsTx.virtualSize(),
152
- weight: bjsTx.weight(),
153
- vin,
154
- vout,
155
- hex,
156
- };
157
- };
158
- exports.decodeRawTransaction = decodeRawTransaction;
159
- const normalizeTransactionObject = (tx, fee, block) => {
160
- const value = tx.vout.reduce((p, n) => p.plus(new bignumber_js_1.default(n.value).times(1e8)), new bignumber_js_1.default(0));
161
- const result = {
162
- hash: tx.txid,
163
- value: value.toNumber(),
164
- _raw: tx,
165
- confirmations: 0,
166
- status: tx.confirmations > 0 ? types_1.TxStatus.Success : types_1.TxStatus.Pending,
167
- };
168
- if (fee) {
169
- const feePrice = Math.round(fee / tx.vsize);
170
- Object.assign(result, {
171
- fee,
172
- feePrice,
173
- });
174
- }
175
- if (block) {
176
- Object.assign(result, {
177
- blockHash: block.hash,
178
- blockNumber: block.number,
179
- confirmations: tx.confirmations,
180
- });
181
- }
182
- return result;
183
- };
184
- exports.normalizeTransactionObject = normalizeTransactionObject;
185
- // TODO: This is copy pasta because it's not exported from bitcoinjs-lib
186
- // https://github.com/bitcoinjs/bitcoinjs-lib/blob/master/test/integration/csv.spec.ts#L477
187
- const witnessStackToScriptWitness = (witness) => {
188
- let buffer = Buffer.allocUnsafe(0);
189
- function writeSlice(slice) {
190
- buffer = Buffer.concat([buffer, Buffer.from(slice)]);
191
- }
192
- function writeVarInt(i) {
193
- const currentLen = buffer.length;
194
- const varintLen = varuint.encodingLength(i);
195
- buffer = Buffer.concat([buffer, Buffer.allocUnsafe(varintLen)]);
196
- varuint.encode(i, buffer, currentLen);
197
- }
198
- function writeVarSlice(slice) {
199
- writeVarInt(slice.length);
200
- writeSlice(slice);
201
- }
202
- function writeVector(vector) {
203
- writeVarInt(vector.length);
204
- vector.forEach(writeVarSlice);
205
- }
206
- writeVector(witness);
207
- return buffer;
208
- };
209
- exports.witnessStackToScriptWitness = witnessStackToScriptWitness;
210
- const getPubKeyHash = (address, network) => {
211
- const outputScript = bitcoin.address.toOutputScript(address, network);
212
- const type = classify.output(outputScript);
213
- if (![classify.types.P2PKH, classify.types.P2WPKH].includes(type)) {
214
- throw new Error(`Bitcoin swap doesn't support the address ${address} type of ${type}. Not possible to derive public key hash.`);
215
- }
216
- try {
217
- const bech32 = bitcoin.address.fromBech32(address);
218
- return bech32.data;
219
- }
220
- catch (e) {
221
- const base58 = bitcoin.address.fromBase58Check(address);
222
- return base58.hash;
223
- }
224
- };
225
- exports.getPubKeyHash = getPubKeyHash;
226
- const validateAddress = (_address, network) => {
227
- const address = (0, utils_1.addressToString)(_address);
228
- if (typeof address !== 'string') {
229
- throw new errors_1.InvalidAddressError(`Invalid address: ${address}`);
230
- }
231
- let pubKeyHash;
232
- try {
233
- pubKeyHash = getPubKeyHash(address, network);
234
- }
235
- catch (e) {
236
- throw new errors_1.InvalidAddressError(`Invalid Address. Failed to parse: ${address}`);
237
- }
238
- if (!pubKeyHash) {
239
- throw new errors_1.InvalidAddressError(`Invalid Address: ${address}`);
240
- }
241
- };
242
- exports.validateAddress = validateAddress;
243
- //# sourceMappingURL=index.js.map