@scure/btc-signer 1.2.1 → 1.3.0

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.
Files changed (60) hide show
  1. package/README.md +25 -3
  2. package/lib/_type_test.d.ts +2 -0
  3. package/lib/_type_test.d.ts.map +1 -0
  4. package/lib/_type_test.js +59 -0
  5. package/lib/_type_test.js.map +1 -0
  6. package/lib/esm/_type_test.js +57 -0
  7. package/lib/esm/_type_test.js.map +1 -0
  8. package/lib/esm/index.js +14 -3007
  9. package/lib/esm/index.js.map +1 -0
  10. package/lib/esm/payment.js +681 -0
  11. package/lib/esm/payment.js.map +1 -0
  12. package/lib/esm/psbt.js +441 -0
  13. package/lib/esm/psbt.js.map +1 -0
  14. package/lib/esm/script.js +347 -0
  15. package/lib/esm/script.js.map +1 -0
  16. package/lib/esm/transaction.js +1013 -0
  17. package/lib/esm/transaction.js.map +1 -0
  18. package/lib/esm/utils.js +115 -0
  19. package/lib/esm/utils.js.map +1 -0
  20. package/lib/esm/utxo.js +491 -0
  21. package/lib/esm/utxo.js.map +1 -0
  22. package/lib/index.d.ts +18 -1439
  23. package/lib/index.d.ts.map +1 -1
  24. package/lib/index.js +54 -3042
  25. package/lib/index.js.map +1 -0
  26. package/lib/payment.d.ts +167 -0
  27. package/lib/payment.d.ts.map +1 -0
  28. package/lib/payment.js +704 -0
  29. package/lib/payment.js.map +1 -0
  30. package/lib/psbt.d.ts +834 -0
  31. package/lib/psbt.d.ts.map +1 -0
  32. package/lib/psbt.js +446 -0
  33. package/lib/psbt.js.map +1 -0
  34. package/lib/script.d.ts +154 -0
  35. package/lib/script.d.ts.map +1 -0
  36. package/lib/script.js +353 -0
  37. package/lib/script.js.map +1 -0
  38. package/lib/transaction.d.ts +223 -0
  39. package/lib/transaction.d.ts.map +1 -0
  40. package/lib/transaction.js +1022 -0
  41. package/lib/transaction.js.map +1 -0
  42. package/lib/utils.d.ts +30 -0
  43. package/lib/utils.d.ts.map +1 -0
  44. package/lib/utils.js +128 -0
  45. package/lib/utils.js.map +1 -0
  46. package/lib/utxo.d.ts +251 -0
  47. package/lib/utxo.d.ts.map +1 -0
  48. package/lib/utxo.js +501 -0
  49. package/lib/utxo.js.map +1 -0
  50. package/package.json +47 -17
  51. package/src/_type_test.ts +69 -0
  52. package/src/index.ts +28 -0
  53. package/src/package.json +3 -0
  54. package/src/payment.ts +749 -0
  55. package/src/psbt.ts +512 -0
  56. package/src/script.ts +236 -0
  57. package/src/transaction.ts +1065 -0
  58. package/src/utils.ts +118 -0
  59. package/src/utxo.ts +517 -0
  60. package/index.ts +0 -3067
package/README.md CHANGED
@@ -9,9 +9,16 @@ Audited & minimal library for creating, signing & decoding Bitcoin transactions.
9
9
  - 🎻 Classic & SegWit: P2PK, P2PKH, P2WPKH, P2SH, P2WSH, P2MS
10
10
  - 🧪 Schnorr & Taproot BIP340/BIP341: P2TR, P2TR-NS, P2TR-MS
11
11
  - 📨 BIP174 PSBT
12
- - 🪶 3000 lines
12
+ - 🗳️ Easy ordinals and inscriptions
13
+ - 🪶 3300 lines
13
14
 
14
- Initial development has been funded by [Ryan Shea](https://shea.io). Check out [the demo](https://signerdemo.micro-btc.dev/) & [its github](https://github.com/shea256/micro-btc-web-demo).
15
+ Initial development has been funded by [Ryan Shea](https://shea.io).
16
+
17
+ For discussions, questions and support, visit
18
+ [GitHub Discussions](https://github.com/paulmillr/scure-btc-signer/discussions)
19
+ section of the repository.
20
+
21
+ _Check out all web3 utility libraries:_ [ETH](https://github.com/paulmillr/micro-eth-signer), [BTC](https://github.com/paulmillr/scure-btc-signer), [SOL](https://github.com/paulmillr/micro-sol-signer)
15
22
 
16
23
  ### This library belongs to _scure_
17
24
 
@@ -59,6 +66,7 @@ import * as btc from '@scure/btc-signer';
59
66
  - [Basic transaction sign](#basic-transaction-sign)
60
67
  - [BIP174 PSBT multi-sig example](#bip174-psbt-multi-sig-example)
61
68
  - [UTXO selection](#utxo-selection)
69
+ - [Ordinals and custom scripts](#ordinals-and-custom-scripts)
62
70
  - [Utils](#utils)
63
71
  - [getAddress](#getaddress)
64
72
  - [WIF](#wif)
@@ -870,6 +878,19 @@ deepStrictEqual(tx.id, 'b702078d65edd65a84b2a97a669df5631b06f42a67b0d7090e540b02
870
878
  deepStrictEqual(tx.fee, 394n);
871
879
  ```
872
880
 
881
+ ## Ordinals and custom scripts
882
+
883
+ We support custom scripts. You can pass it as last argument to `p2tr`.
884
+
885
+ Ordinals, inscriptions, runes and others are handled by a separate package for now:
886
+ [micro-ordinals](https://github.com/paulmillr/micro-ordinals).
887
+
888
+ The package contains:
889
+
890
+ - Real code for ordinals / inscriptions
891
+ - CLI tool that allows to upload files as inscriptions
892
+ - Example usage of custom scripts
893
+
873
894
  ## Utils
874
895
 
875
896
  ### getAddress
@@ -980,7 +1001,8 @@ The library has been independently audited:
980
1001
  - [Changes since audit](https://github.com/paulmillr/scure-btc-signer/compare/0.3.0..main).
981
1002
  - The audit has been funded by [Ryan Shea](https://shea.io)
982
1003
 
983
- UTXO selection functionality has not been audited yet.
1004
+ UTXO selection functionality has not been audited yet. Commit [58d4554](58d455480919e968aabff132503560effb2f8eaf)
1005
+ split the library from one into several files to ease future maintainability.
984
1006
 
985
1007
  ### Supply chain security
986
1008
 
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=_type_test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_type_test.d.ts","sourceRoot":"","sources":["../src/_type_test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const btc = require("./index.js");
4
+ const base_1 = require("@scure/base");
5
+ const secp256k1_1 = require("@noble/curves/secp256k1");
6
+ const privKey1 = base_1.hex.decode('0101010101010101010101010101010101010101010101010101010101010101');
7
+ const P1 = secp256k1_1.secp256k1.getPublicKey(privKey1, true);
8
+ const wpkh = btc.p2wpkh(P1);
9
+ const tx = new btc.Transaction();
10
+ // Basic input test
11
+ tx.addInput({
12
+ txid: base_1.hex.decode('0af50a00a22f74ece24c12cd667c290d3a35d48124a69f4082700589172a3aa2'),
13
+ index: 0,
14
+ ...wpkh,
15
+ finalScriptSig: new Uint8Array(),
16
+ sequence: 1,
17
+ });
18
+ // Doesn't force any fields on input addition (only on sign)
19
+ tx.addInput({
20
+ sequence: 1,
21
+ });
22
+ tx.updateInput(0, {
23
+ sequence: 1,
24
+ });
25
+ const nonWitnessUtxo = '0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000';
26
+ const nonWitnessUtxoB = base_1.hex.decode(nonWitnessUtxo);
27
+ tx.updateInput(0, { nonWitnessUtxo: nonWitnessUtxo });
28
+ tx.updateInput(0, { nonWitnessUtxo: nonWitnessUtxoB });
29
+ tx.addInput({
30
+ txid: base_1.hex.decode('0af50a00a22f74ece24c12cd667c290d3a35d48124a69f4082700589172a3aa2'),
31
+ index: 0,
32
+ nonWitnessUtxo: nonWitnessUtxo,
33
+ });
34
+ tx.addInput({
35
+ txid: base_1.hex.decode('0af50a00a22f74ece24c12cd667c290d3a35d48124a69f4082700589172a3aa2'),
36
+ index: 0,
37
+ nonWitnessUtxo: nonWitnessUtxoB,
38
+ });
39
+ // Should fail!
40
+ // tx.updateInput(0, {
41
+ // nonWitnessUtxo: 1,
42
+ // });
43
+ // Outputs
44
+ tx.addOutput({ amount: 123n });
45
+ // should fail
46
+ // tx.updateOutput(0, { amount: '1' });
47
+ // tx.updateOutput(0, { amount: 1 });
48
+ // should fail
49
+ // tx.addOutput({ amount: '123' });
50
+ // tx.addOutput({ amount: 123 });
51
+ for (let i = 0; i < tx.inputsLength; i++) {
52
+ // @ts-ignore
53
+ console.log('I', tx.getInput(i));
54
+ }
55
+ for (let i = 0; i < tx.outputsLength; i++) {
56
+ // @ts-ignore
57
+ console.log('O', tx.getOutput(i));
58
+ }
59
+ //# sourceMappingURL=_type_test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_type_test.js","sourceRoot":"","sources":["../src/_type_test.ts"],"names":[],"mappings":";;AAAA,kCAAkC;AAClC,sCAAkC;AAClC,uDAA4D;AAE5D,MAAM,QAAQ,GAAG,UAAG,CAAC,MAAM,CAAC,kEAAkE,CAAC,CAAC;AAChG,MAAM,EAAE,GAAG,qBAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAE7C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE5B,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;AAEjC,mBAAmB;AACnB,EAAE,CAAC,QAAQ,CAAC;IACV,IAAI,EAAE,UAAG,CAAC,MAAM,CAAC,kEAAkE,CAAC;IACpF,KAAK,EAAE,CAAC;IACR,GAAG,IAAI;IACP,cAAc,EAAE,IAAI,UAAU,EAAE;IAChC,QAAQ,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,4DAA4D;AAC5D,EAAE,CAAC,QAAQ,CAAC;IACV,QAAQ,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE;IAChB,QAAQ,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,MAAM,cAAc,GAClB,wXAAwX,CAAC;AAC3X,MAAM,eAAe,GAAG,UAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AAEnD,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;AACtD,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC,CAAC;AACvD,EAAE,CAAC,QAAQ,CAAC;IACV,IAAI,EAAE,UAAG,CAAC,MAAM,CAAC,kEAAkE,CAAC;IACpF,KAAK,EAAE,CAAC;IACR,cAAc,EAAE,cAAc;CAC/B,CAAC,CAAC;AAEH,EAAE,CAAC,QAAQ,CAAC;IACV,IAAI,EAAE,UAAG,CAAC,MAAM,CAAC,kEAAkE,CAAC;IACpF,KAAK,EAAE,CAAC;IACR,cAAc,EAAE,eAAe;CAChC,CAAC,CAAC;AAEH,eAAe;AACf,sBAAsB;AACtB,uBAAuB;AACvB,MAAM;AACN,UAAU;AACV,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/B,cAAc;AACd,uCAAuC;AACvC,qCAAqC;AACrC,cAAc;AACd,mCAAmC;AACnC,iCAAiC;AAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;IACzC,aAAa;IACb,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;IAC1C,aAAa;IACb,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,57 @@
1
+ import * as btc from './index.js';
2
+ import { hex } from '@scure/base';
3
+ import { secp256k1 as secp } from '@noble/curves/secp256k1';
4
+ const privKey1 = hex.decode('0101010101010101010101010101010101010101010101010101010101010101');
5
+ const P1 = secp.getPublicKey(privKey1, true);
6
+ const wpkh = btc.p2wpkh(P1);
7
+ const tx = new btc.Transaction();
8
+ // Basic input test
9
+ tx.addInput({
10
+ txid: hex.decode('0af50a00a22f74ece24c12cd667c290d3a35d48124a69f4082700589172a3aa2'),
11
+ index: 0,
12
+ ...wpkh,
13
+ finalScriptSig: new Uint8Array(),
14
+ sequence: 1,
15
+ });
16
+ // Doesn't force any fields on input addition (only on sign)
17
+ tx.addInput({
18
+ sequence: 1,
19
+ });
20
+ tx.updateInput(0, {
21
+ sequence: 1,
22
+ });
23
+ const nonWitnessUtxo = '0200000001aad73931018bd25f84ae400b68848be09db706eac2ac18298babee71ab656f8b0000000048473044022058f6fc7c6a33e1b31548d481c826c015bd30135aad42cd67790dab66d2ad243b02204a1ced2604c6735b6393e5b41691dd78b00f0c5942fb9f751856faa938157dba01feffffff0280f0fa020000000017a9140fb9463421696b82c833af241c78c17ddbde493487d0f20a270100000017a91429ca74f8a08f81999428185c97b5d852e4063f618765000000';
24
+ const nonWitnessUtxoB = hex.decode(nonWitnessUtxo);
25
+ tx.updateInput(0, { nonWitnessUtxo: nonWitnessUtxo });
26
+ tx.updateInput(0, { nonWitnessUtxo: nonWitnessUtxoB });
27
+ tx.addInput({
28
+ txid: hex.decode('0af50a00a22f74ece24c12cd667c290d3a35d48124a69f4082700589172a3aa2'),
29
+ index: 0,
30
+ nonWitnessUtxo: nonWitnessUtxo,
31
+ });
32
+ tx.addInput({
33
+ txid: hex.decode('0af50a00a22f74ece24c12cd667c290d3a35d48124a69f4082700589172a3aa2'),
34
+ index: 0,
35
+ nonWitnessUtxo: nonWitnessUtxoB,
36
+ });
37
+ // Should fail!
38
+ // tx.updateInput(0, {
39
+ // nonWitnessUtxo: 1,
40
+ // });
41
+ // Outputs
42
+ tx.addOutput({ amount: 123n });
43
+ // should fail
44
+ // tx.updateOutput(0, { amount: '1' });
45
+ // tx.updateOutput(0, { amount: 1 });
46
+ // should fail
47
+ // tx.addOutput({ amount: '123' });
48
+ // tx.addOutput({ amount: 123 });
49
+ for (let i = 0; i < tx.inputsLength; i++) {
50
+ // @ts-ignore
51
+ console.log('I', tx.getInput(i));
52
+ }
53
+ for (let i = 0; i < tx.outputsLength; i++) {
54
+ // @ts-ignore
55
+ console.log('O', tx.getOutput(i));
56
+ }
57
+ //# sourceMappingURL=_type_test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"_type_test.js","sourceRoot":"","sources":["../../src/_type_test.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,YAAY,CAAC;AAClC,OAAO,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,EAAE,SAAS,IAAI,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAE5D,MAAM,QAAQ,GAAG,GAAG,CAAC,MAAM,CAAC,kEAAkE,CAAC,CAAC;AAChG,MAAM,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;AAE7C,MAAM,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAE5B,MAAM,EAAE,GAAG,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;AAEjC,mBAAmB;AACnB,EAAE,CAAC,QAAQ,CAAC;IACV,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,kEAAkE,CAAC;IACpF,KAAK,EAAE,CAAC;IACR,GAAG,IAAI;IACP,cAAc,EAAE,IAAI,UAAU,EAAE;IAChC,QAAQ,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,4DAA4D;AAC5D,EAAE,CAAC,QAAQ,CAAC;IACV,QAAQ,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE;IAChB,QAAQ,EAAE,CAAC;CACZ,CAAC,CAAC;AAEH,MAAM,cAAc,GAClB,wXAAwX,CAAC;AAC3X,MAAM,eAAe,GAAG,GAAG,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;AAEnD,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,cAAc,EAAE,cAAc,EAAE,CAAC,CAAC;AACtD,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,EAAE,cAAc,EAAE,eAAe,EAAE,CAAC,CAAC;AACvD,EAAE,CAAC,QAAQ,CAAC;IACV,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,kEAAkE,CAAC;IACpF,KAAK,EAAE,CAAC;IACR,cAAc,EAAE,cAAc;CAC/B,CAAC,CAAC;AAEH,EAAE,CAAC,QAAQ,CAAC;IACV,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,kEAAkE,CAAC;IACpF,KAAK,EAAE,CAAC;IACR,cAAc,EAAE,eAAe;CAChC,CAAC,CAAC;AAEH,eAAe;AACf,sBAAsB;AACtB,uBAAuB;AACvB,MAAM;AACN,UAAU;AACV,EAAE,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;AAC/B,cAAc;AACd,uCAAuC;AACvC,qCAAqC;AACrC,cAAc;AACd,mCAAmC;AACnC,iCAAiC;AAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,YAAY,EAAE,CAAC,EAAE,EAAE,CAAC;IACzC,aAAa;IACb,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE,CAAC;IAC1C,aAAa;IACb,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC"}