ecash-lib 1.5.2-rc → 2.1.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 (106) hide show
  1. package/README.md +5 -40
  2. package/dist/address/legacyaddr.d.ts +1 -1
  3. package/dist/ecc.d.ts +9 -25
  4. package/dist/ecc.d.ts.map +1 -1
  5. package/dist/ecc.js +40 -56
  6. package/dist/ecc.js.map +1 -1
  7. package/dist/ffi/ecash_lib_wasm_bg_browser.d.ts +1 -0
  8. package/dist/ffi/ecash_lib_wasm_bg_browser.js +1707 -0
  9. package/dist/ffi/ecash_lib_wasm_bg_browser.wasm +0 -0
  10. package/dist/ffi/ecash_lib_wasm_bg_browser.wasm.d.ts +2 -0
  11. package/dist/ffi/ecash_lib_wasm_bg_nodejs.wasm +0 -0
  12. package/dist/ffi/ecash_lib_wasm_bg_nodejs.wasm.d.ts +2 -0
  13. package/dist/ffi/ecash_lib_wasm_browser.d.ts +24 -0
  14. package/dist/ffi/ecash_lib_wasm_browser.js +64 -0
  15. package/dist/ffi/ecash_lib_wasm_nodejs.d.ts +22 -0
  16. package/dist/ffi/ecash_lib_wasm_nodejs.js +64 -0
  17. package/dist/hash.d.ts +6 -16
  18. package/dist/hash.d.ts.map +1 -1
  19. package/dist/hash.js +18 -18
  20. package/dist/hash.js.map +1 -1
  21. package/dist/hdwallet.d.ts +2 -4
  22. package/dist/hdwallet.d.ts.map +1 -1
  23. package/dist/hdwallet.js +6 -7
  24. package/dist/hdwallet.js.map +1 -1
  25. package/dist/hmac.js +3 -3
  26. package/dist/hmac.js.map +1 -1
  27. package/dist/initBrowser.d.ts +1 -11
  28. package/dist/initBrowser.d.ts.map +1 -1
  29. package/dist/initBrowser.js +21 -41
  30. package/dist/initBrowser.js.map +1 -1
  31. package/dist/initNodeJs.d.ts +1 -2
  32. package/dist/initNodeJs.d.ts.map +1 -1
  33. package/dist/initNodeJs.js +16 -30
  34. package/dist/initNodeJs.js.map +1 -1
  35. package/dist/io/bytes.js +2 -2
  36. package/dist/io/bytes.js.map +1 -1
  37. package/dist/io/hex.js +5 -4
  38. package/dist/io/hex.js.map +1 -1
  39. package/dist/io/str.js +3 -2
  40. package/dist/io/str.js.map +1 -1
  41. package/dist/io/varsize.js +3 -2
  42. package/dist/io/varsize.js.map +1 -1
  43. package/dist/mnemonic.js +4 -3
  44. package/dist/mnemonic.js.map +1 -1
  45. package/dist/op.js +6 -5
  46. package/dist/op.js.map +1 -1
  47. package/dist/pbkdf2.js +2 -1
  48. package/dist/pbkdf2.js.map +1 -1
  49. package/dist/test/testRunner.d.ts +1 -2
  50. package/dist/test/testRunner.d.ts.map +1 -1
  51. package/dist/test/testRunner.js +10 -23
  52. package/dist/test/testRunner.js.map +1 -1
  53. package/dist/token/alp.d.ts +1 -1
  54. package/dist/token/alp.d.ts.map +1 -1
  55. package/dist/token/alp.js +5 -5
  56. package/dist/token/alp.js.map +1 -1
  57. package/dist/token/common.d.ts +4 -4
  58. package/dist/token/common.d.ts.map +1 -1
  59. package/dist/token/empp.js +2 -1
  60. package/dist/token/empp.js.map +1 -1
  61. package/dist/token/slp.d.ts +1 -1
  62. package/dist/token/slp.d.ts.map +1 -1
  63. package/dist/token/slp.js +7 -7
  64. package/dist/token/slp.js.map +1 -1
  65. package/dist/tx.js +7 -7
  66. package/dist/tx.js.map +1 -1
  67. package/dist/txBuilder.d.ts +5 -1
  68. package/dist/txBuilder.d.ts.map +1 -1
  69. package/dist/txBuilder.js +12 -11
  70. package/dist/txBuilder.js.map +1 -1
  71. package/package.json +1 -1
  72. package/src/ecc.ts +47 -59
  73. package/src/ffi/ecash_lib_wasm_bg_browser.d.ts +1 -0
  74. package/src/ffi/ecash_lib_wasm_bg_browser.js +1707 -0
  75. package/src/ffi/ecash_lib_wasm_bg_browser.wasm +0 -0
  76. package/src/ffi/ecash_lib_wasm_bg_browser.wasm.d.ts +2 -0
  77. package/src/ffi/ecash_lib_wasm_bg_nodejs.wasm +0 -0
  78. package/src/ffi/ecash_lib_wasm_bg_nodejs.wasm.d.ts +2 -0
  79. package/src/ffi/ecash_lib_wasm_browser.d.ts +24 -0
  80. package/src/ffi/ecash_lib_wasm_browser.js +64 -0
  81. package/src/ffi/ecash_lib_wasm_nodejs.d.ts +22 -0
  82. package/src/ffi/ecash_lib_wasm_nodejs.js +64 -0
  83. package/src/hash.ts +19 -38
  84. package/src/hdwallet.ts +4 -8
  85. package/src/initBrowser.ts +18 -25
  86. package/src/initNodeJs.ts +9 -12
  87. package/src/test/testRunner.ts +3 -11
  88. package/src/txBuilder.ts +12 -7
  89. package/.nyc_output/0fc40ca6-d52c-45eb-b31b-2601ce70b887.json +0 -1
  90. package/.nyc_output/ac5be6db-4e40-41f8-8b84-7598d4747e57.json +0 -1
  91. package/.nyc_output/b316d46f-5ea0-4e98-884a-bfbf9cc1d0f8.json +0 -1
  92. package/.nyc_output/f965566b-9422-4874-b45e-9eefda9c769c.json +0 -1
  93. package/.nyc_output/processinfo/0fc40ca6-d52c-45eb-b31b-2601ce70b887.json +0 -1
  94. package/.nyc_output/processinfo/ac5be6db-4e40-41f8-8b84-7598d4747e57.json +0 -1
  95. package/.nyc_output/processinfo/b316d46f-5ea0-4e98-884a-bfbf9cc1d0f8.json +0 -1
  96. package/.nyc_output/processinfo/f965566b-9422-4874-b45e-9eefda9c769c.json +0 -1
  97. package/.nyc_output/processinfo/index.json +0 -1
  98. package/dist/address/cashaddr.d.ts +0 -78
  99. package/dist/address/cashaddr.d.ts.map +0 -1
  100. package/dist/address/cashaddr.js +0 -543
  101. package/dist/address/cashaddr.js.map +0 -1
  102. package/dist/cashaddr/cashaddr.d.ts +0 -23
  103. package/dist/cashaddr/cashaddr.d.ts.map +0 -1
  104. package/dist/cashaddr/cashaddr.js +0 -325
  105. package/dist/cashaddr/cashaddr.js.map +0 -1
  106. package/test.log +0 -82
@@ -21,6 +21,8 @@ export function ecc_schnorrSign(a: number, b: number, c: number, d: number, e: n
21
21
  export function ecc_isValidSeckey(a: number, b: number, c: number): number;
22
22
  export function ecc_seckeyAdd(a: number, b: number, c: number, d: number, e: number, f: number): void;
23
23
  export function ecc_pubkeyAdd(a: number, b: number, c: number, d: number, e: number, f: number): void;
24
+ export function ecc_signRecoverable(a: number, b: number, c: number, d: number, e: number, f: number): void;
25
+ export function ecc_recoverSig(a: number, b: number, c: number, d: number, e: number, f: number): void;
24
26
  export function __wbg_ecc_free(a: number): void;
25
27
  export function ecash_secp256k1_context_create(a: number): number;
26
28
  export function ecash_secp256k1_context_destroy(a: number): void;
@@ -21,6 +21,8 @@ export function ecc_schnorrSign(a: number, b: number, c: number, d: number, e: n
21
21
  export function ecc_isValidSeckey(a: number, b: number, c: number): number;
22
22
  export function ecc_seckeyAdd(a: number, b: number, c: number, d: number, e: number, f: number): void;
23
23
  export function ecc_pubkeyAdd(a: number, b: number, c: number, d: number, e: number, f: number): void;
24
+ export function ecc_signRecoverable(a: number, b: number, c: number, d: number, e: number, f: number): void;
25
+ export function ecc_recoverSig(a: number, b: number, c: number, d: number, e: number, f: number): void;
24
26
  export function __wbg_ecc_free(a: number): void;
25
27
  export function ecash_secp256k1_context_create(a: number): number;
26
28
  export function ecash_secp256k1_context_destroy(a: number): void;
@@ -74,6 +74,28 @@ export class Ecc {
74
74
  * @returns {Uint8Array}
75
75
  */
76
76
  pubkeyAdd(a: Uint8Array, b: Uint8Array): Uint8Array;
77
+ /**
78
+ * Create a compact ECDSA signature (65 bytes), which allows reconstructing
79
+ * the used public key.
80
+ * The format is one header byte, followed by two times 32 bytes for the
81
+ * serialized r and s values.
82
+ * The header byte: 0x1B = first key with even y,
83
+ * 0x1C = first key with odd y,
84
+ * 0x1D = second key with even y,
85
+ * 0x1E = second key with odd y,
86
+ * add 0x04 for compressed keys.
87
+ * @param {Uint8Array} seckey
88
+ * @param {Uint8Array} msg
89
+ * @returns {Uint8Array}
90
+ */
91
+ signRecoverable(seckey: Uint8Array, msg: Uint8Array): Uint8Array;
92
+ /**
93
+ * Recover the public key of a signature signed by signRecoverable.
94
+ * @param {Uint8Array} sig
95
+ * @param {Uint8Array} msg
96
+ * @returns {Uint8Array}
97
+ */
98
+ recoverSig(sig: Uint8Array, msg: Uint8Array): Uint8Array;
77
99
  }
78
100
  /**
79
101
  * Instance to calculate SHA256 in a streaming fashion
@@ -150,6 +172,8 @@ export interface InitOutput {
150
172
  readonly ecc_isValidSeckey: (a: number, b: number, c: number) => number;
151
173
  readonly ecc_seckeyAdd: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
152
174
  readonly ecc_pubkeyAdd: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
175
+ readonly ecc_signRecoverable: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
176
+ readonly ecc_recoverSig: (a: number, b: number, c: number, d: number, e: number, f: number) => void;
153
177
  readonly __wbg_ecc_free: (a: number) => void;
154
178
  readonly ecash_secp256k1_context_create: (a: number) => number;
155
179
  readonly ecash_secp256k1_context_destroy: (a: number) => void;
@@ -329,6 +329,70 @@ export class Ecc {
329
329
  wasm.__wbindgen_add_to_stack_pointer(16);
330
330
  }
331
331
  }
332
+ /**
333
+ * Create a compact ECDSA signature (65 bytes), which allows reconstructing
334
+ * the used public key.
335
+ * The format is one header byte, followed by two times 32 bytes for the
336
+ * serialized r and s values.
337
+ * The header byte: 0x1B = first key with even y,
338
+ * 0x1C = first key with odd y,
339
+ * 0x1D = second key with even y,
340
+ * 0x1E = second key with odd y,
341
+ * add 0x04 for compressed keys.
342
+ * @param {Uint8Array} seckey
343
+ * @param {Uint8Array} msg
344
+ * @returns {Uint8Array}
345
+ */
346
+ signRecoverable(seckey, msg) {
347
+ try {
348
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
349
+ const ptr0 = passArray8ToWasm0(seckey, wasm.__wbindgen_export_0);
350
+ const len0 = WASM_VECTOR_LEN;
351
+ const ptr1 = passArray8ToWasm0(msg, wasm.__wbindgen_export_0);
352
+ const len1 = WASM_VECTOR_LEN;
353
+ wasm.ecc_signRecoverable(retptr, this.__wbg_ptr, ptr0, len0, ptr1, len1);
354
+ var r0 = getInt32Memory0()[retptr / 4 + 0];
355
+ var r1 = getInt32Memory0()[retptr / 4 + 1];
356
+ var r2 = getInt32Memory0()[retptr / 4 + 2];
357
+ var r3 = getInt32Memory0()[retptr / 4 + 3];
358
+ if (r3) {
359
+ throw takeObject(r2);
360
+ }
361
+ var v3 = getArrayU8FromWasm0(r0, r1).slice();
362
+ wasm.__wbindgen_export_1(r0, r1 * 1, 1);
363
+ return v3;
364
+ } finally {
365
+ wasm.__wbindgen_add_to_stack_pointer(16);
366
+ }
367
+ }
368
+ /**
369
+ * Recover the public key of a signature signed by signRecoverable.
370
+ * @param {Uint8Array} sig
371
+ * @param {Uint8Array} msg
372
+ * @returns {Uint8Array}
373
+ */
374
+ recoverSig(sig, msg) {
375
+ try {
376
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
377
+ const ptr0 = passArray8ToWasm0(sig, wasm.__wbindgen_export_0);
378
+ const len0 = WASM_VECTOR_LEN;
379
+ const ptr1 = passArray8ToWasm0(msg, wasm.__wbindgen_export_0);
380
+ const len1 = WASM_VECTOR_LEN;
381
+ wasm.ecc_recoverSig(retptr, this.__wbg_ptr, ptr0, len0, ptr1, len1);
382
+ var r0 = getInt32Memory0()[retptr / 4 + 0];
383
+ var r1 = getInt32Memory0()[retptr / 4 + 1];
384
+ var r2 = getInt32Memory0()[retptr / 4 + 2];
385
+ var r3 = getInt32Memory0()[retptr / 4 + 3];
386
+ if (r3) {
387
+ throw takeObject(r2);
388
+ }
389
+ var v3 = getArrayU8FromWasm0(r0, r1).slice();
390
+ wasm.__wbindgen_export_1(r0, r1 * 1, 1);
391
+ return v3;
392
+ } finally {
393
+ wasm.__wbindgen_add_to_stack_pointer(16);
394
+ }
395
+ }
332
396
  }
333
397
 
334
398
  const Sha256HFinalization = (typeof FinalizationRegistry === 'undefined')
@@ -74,6 +74,28 @@ export class Ecc {
74
74
  * @returns {Uint8Array}
75
75
  */
76
76
  pubkeyAdd(a: Uint8Array, b: Uint8Array): Uint8Array;
77
+ /**
78
+ * Create a compact ECDSA signature (65 bytes), which allows reconstructing
79
+ * the used public key.
80
+ * The format is one header byte, followed by two times 32 bytes for the
81
+ * serialized r and s values.
82
+ * The header byte: 0x1B = first key with even y,
83
+ * 0x1C = first key with odd y,
84
+ * 0x1D = second key with even y,
85
+ * 0x1E = second key with odd y,
86
+ * add 0x04 for compressed keys.
87
+ * @param {Uint8Array} seckey
88
+ * @param {Uint8Array} msg
89
+ * @returns {Uint8Array}
90
+ */
91
+ signRecoverable(seckey: Uint8Array, msg: Uint8Array): Uint8Array;
92
+ /**
93
+ * Recover the public key of a signature signed by signRecoverable.
94
+ * @param {Uint8Array} sig
95
+ * @param {Uint8Array} msg
96
+ * @returns {Uint8Array}
97
+ */
98
+ recoverSig(sig: Uint8Array, msg: Uint8Array): Uint8Array;
77
99
  }
78
100
  /**
79
101
  * Instance to calculate SHA256 in a streaming fashion
@@ -332,6 +332,70 @@ class Ecc {
332
332
  wasm.__wbindgen_add_to_stack_pointer(16);
333
333
  }
334
334
  }
335
+ /**
336
+ * Create a compact ECDSA signature (65 bytes), which allows reconstructing
337
+ * the used public key.
338
+ * The format is one header byte, followed by two times 32 bytes for the
339
+ * serialized r and s values.
340
+ * The header byte: 0x1B = first key with even y,
341
+ * 0x1C = first key with odd y,
342
+ * 0x1D = second key with even y,
343
+ * 0x1E = second key with odd y,
344
+ * add 0x04 for compressed keys.
345
+ * @param {Uint8Array} seckey
346
+ * @param {Uint8Array} msg
347
+ * @returns {Uint8Array}
348
+ */
349
+ signRecoverable(seckey, msg) {
350
+ try {
351
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
352
+ const ptr0 = passArray8ToWasm0(seckey, wasm.__wbindgen_export_0);
353
+ const len0 = WASM_VECTOR_LEN;
354
+ const ptr1 = passArray8ToWasm0(msg, wasm.__wbindgen_export_0);
355
+ const len1 = WASM_VECTOR_LEN;
356
+ wasm.ecc_signRecoverable(retptr, this.__wbg_ptr, ptr0, len0, ptr1, len1);
357
+ var r0 = getInt32Memory0()[retptr / 4 + 0];
358
+ var r1 = getInt32Memory0()[retptr / 4 + 1];
359
+ var r2 = getInt32Memory0()[retptr / 4 + 2];
360
+ var r3 = getInt32Memory0()[retptr / 4 + 3];
361
+ if (r3) {
362
+ throw takeObject(r2);
363
+ }
364
+ var v3 = getArrayU8FromWasm0(r0, r1).slice();
365
+ wasm.__wbindgen_export_1(r0, r1 * 1, 1);
366
+ return v3;
367
+ } finally {
368
+ wasm.__wbindgen_add_to_stack_pointer(16);
369
+ }
370
+ }
371
+ /**
372
+ * Recover the public key of a signature signed by signRecoverable.
373
+ * @param {Uint8Array} sig
374
+ * @param {Uint8Array} msg
375
+ * @returns {Uint8Array}
376
+ */
377
+ recoverSig(sig, msg) {
378
+ try {
379
+ const retptr = wasm.__wbindgen_add_to_stack_pointer(-16);
380
+ const ptr0 = passArray8ToWasm0(sig, wasm.__wbindgen_export_0);
381
+ const len0 = WASM_VECTOR_LEN;
382
+ const ptr1 = passArray8ToWasm0(msg, wasm.__wbindgen_export_0);
383
+ const len1 = WASM_VECTOR_LEN;
384
+ wasm.ecc_recoverSig(retptr, this.__wbg_ptr, ptr0, len0, ptr1, len1);
385
+ var r0 = getInt32Memory0()[retptr / 4 + 0];
386
+ var r1 = getInt32Memory0()[retptr / 4 + 1];
387
+ var r2 = getInt32Memory0()[retptr / 4 + 2];
388
+ var r3 = getInt32Memory0()[retptr / 4 + 3];
389
+ if (r3) {
390
+ throw takeObject(r2);
391
+ }
392
+ var v3 = getArrayU8FromWasm0(r0, r1).slice();
393
+ wasm.__wbindgen_export_1(r0, r1 * 1, 1);
394
+ return v3;
395
+ } finally {
396
+ wasm.__wbindgen_add_to_stack_pointer(16);
397
+ }
398
+ }
335
399
  }
336
400
  module.exports.Ecc = Ecc;
337
401
 
package/src/hash.ts CHANGED
@@ -2,8 +2,6 @@
2
2
  // Distributed under the MIT software license, see the accompanying
3
3
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
4
 
5
- import type { Ecc } from './ecc';
6
-
7
5
  export interface Hasher {
8
6
  update: (data: Uint8Array) => void;
9
7
  finalize: () => Uint8Array;
@@ -14,57 +12,40 @@ export interface Hasher {
14
12
  type HasherClass = { new (): Hasher };
15
13
 
16
14
  interface EcashLibHashes {
17
- sha256: (data: Uint8Array) => Uint8Array;
18
- sha256d: (data: Uint8Array) => Uint8Array;
19
- shaRmd160: (data: Uint8Array) => Uint8Array;
20
- sha512: (data: Uint8Array) => Uint8Array;
21
- Sha256H: HasherClass;
22
- Sha512H: HasherClass;
15
+ sha256?: (data: Uint8Array) => Uint8Array;
16
+ sha256d?: (data: Uint8Array) => Uint8Array;
17
+ shaRmd160?: (data: Uint8Array) => Uint8Array;
18
+ sha512?: (data: Uint8Array) => Uint8Array;
19
+ Sha256H?: HasherClass;
20
+ Sha512H?: HasherClass;
23
21
  }
24
22
 
25
- let HASHES: EcashLibHashes;
26
-
27
- type GlobalThis = typeof globalThis;
28
-
29
- export interface GlobalThisExt extends GlobalThis {
30
- ecashlib: {
31
- HASHES: EcashLibHashes;
32
- Ecc: { new (): Ecc };
33
- };
34
- }
23
+ const HASHES: EcashLibHashes = {};
35
24
 
36
25
  export function sha256(data: Uint8Array): Uint8Array {
37
- return (globalThis as unknown as GlobalThisExt).ecashlib.HASHES.sha256(
38
- data,
39
- );
26
+ return HASHES.sha256!(data);
40
27
  }
41
28
  export function sha256d(data: Uint8Array): Uint8Array {
42
- return (globalThis as unknown as GlobalThisExt).ecashlib.HASHES.sha256d(
43
- data,
44
- );
29
+ return HASHES.sha256d!(data);
45
30
  }
46
31
  export function shaRmd160(data: Uint8Array): Uint8Array {
47
- return (globalThis as unknown as GlobalThisExt).ecashlib.HASHES.shaRmd160(
48
- data,
49
- );
32
+ return HASHES.shaRmd160!(data);
50
33
  }
51
34
  export function sha512(data: Uint8Array): Uint8Array {
52
- return HASHES.sha512(data);
35
+ return HASHES.sha512!(data);
53
36
  }
54
37
  export function sha256Hasher(): Hasher {
55
- return new HASHES.Sha256H();
38
+ return new HASHES.Sha256H!();
56
39
  }
57
40
  export function sha512Hasher(): Hasher {
58
- return new HASHES.Sha512H();
41
+ return new HASHES.Sha512H!();
59
42
  }
60
43
 
61
44
  export function __setHashes(hashes: EcashLibHashes) {
62
- HASHES = hashes;
63
-
64
- Object.assign(globalThis, {
65
- ecashlib: {
66
- ...((globalThis as Record<string, any>).ecashlib || {}),
67
- HASHES: hashes,
68
- },
69
- } as Partial<GlobalThisExt>);
45
+ HASHES.sha256 = hashes.sha256;
46
+ HASHES.sha256d = hashes.sha256d;
47
+ HASHES.shaRmd160 = hashes.shaRmd160;
48
+ HASHES.sha512 = hashes.sha512;
49
+ HASHES.Sha256H = hashes.Sha256H;
50
+ HASHES.Sha512H = hashes.Sha512H;
70
51
  }
package/src/hdwallet.ts CHANGED
@@ -21,7 +21,6 @@ export class HdNode {
21
21
  private _parentFingerprint: number;
22
22
 
23
23
  public constructor(params: {
24
- ecc: Ecc;
25
24
  seckey: Uint8Array | undefined;
26
25
  pubkey: Uint8Array;
27
26
  chainCode: Uint8Array;
@@ -29,7 +28,7 @@ export class HdNode {
29
28
  index: number;
30
29
  parentFingerprint: number;
31
30
  }) {
32
- this._ecc = params.ecc;
31
+ this._ecc = new Ecc();
33
32
  this._seckey = params.seckey;
34
33
  this._pubkey = params.pubkey;
35
34
  this._chainCode = params.chainCode;
@@ -113,7 +112,6 @@ export class HdNode {
113
112
  seckey = undefined;
114
113
  }
115
114
  return new HdNode({
116
- ecc: this._ecc,
117
115
  seckey: seckey,
118
116
  pubkey: pubkey,
119
117
  chainCode: hashedRight,
@@ -154,14 +152,12 @@ export class HdNode {
154
152
  }
155
153
 
156
154
  public static fromPrivateKey(
157
- ecc: Ecc,
158
155
  seckey: Uint8Array,
159
156
  chainCode: Uint8Array,
160
157
  ): HdNode {
161
158
  return new HdNode({
162
- ecc,
163
159
  seckey: seckey,
164
- pubkey: ecc.derivePubkey(seckey),
160
+ pubkey: new Ecc().derivePubkey(seckey),
165
161
  chainCode,
166
162
  depth: 0,
167
163
  index: 0,
@@ -169,13 +165,13 @@ export class HdNode {
169
165
  });
170
166
  }
171
167
 
172
- public static fromSeed(ecc: Ecc, seed: Uint8Array): HdNode {
168
+ public static fromSeed(seed: Uint8Array): HdNode {
173
169
  if (seed.length < 16 || seed.length > 64) {
174
170
  throw new TypeError('Seed must be between 16 and 64 bytes long');
175
171
  }
176
172
  const hashed = hmacSha512(strToBytes('Bitcoin seed'), seed);
177
173
  const hashedLeft = hashed.slice(0, 32);
178
174
  const hashedRight = hashed.slice(32);
179
- return HdNode.fromPrivateKey(ecc, hashedLeft, hashedRight);
175
+ return HdNode.fromPrivateKey(hashedLeft, hashedRight);
180
176
  }
181
177
  }
@@ -2,30 +2,23 @@
2
2
  // Distributed under the MIT software license, see the accompanying
3
3
  // file COPYING or http://www.opensource.org/licenses/mit-license.php.
4
4
 
5
- import { __setEcc } from './ecc.js';
6
- import __wbg_init, * as ffi from './ffi/ecash_lib_wasm_browser.js';
5
+ import * as ffi from './ffi/ecash_lib_wasm_browser.js';
7
6
  import { __setHashes } from './hash.js';
7
+ import { __setEcc } from './ecc.js';
8
+
9
+ import { ECASH_LIB_WASM_BASE64 } from './ffi/ecash_lib_wasm_bg_browser.js';
10
+
11
+ const wasmRaw = Uint8Array.from(atob(ECASH_LIB_WASM_BASE64), c =>
12
+ c.charCodeAt(0),
13
+ );
14
+ ffi.initSync(wasmRaw);
8
15
 
9
- /**
10
- * Load and initialize the WASM module for Web.
11
- *
12
- * Some bundlers can't handle WebAssembly yet (at the time of writing, vite).
13
- * If you run into "CompileError: expected magic word 00 61 73 6d", you can
14
- * provide a custom WASM URL or module:
15
- * import ecashLibWasmUrl from 'ecash-lib/dist/ffi/ecash_lib_wasm_bg_browser.wasm?url';
16
- * await initWasm(ecashLibWasmUrl);
17
- **/
18
- export async function initWasm(
19
- module_or_path?: ffi.InitInput | Promise<ffi.InitInput>,
20
- ) {
21
- await __wbg_init(module_or_path);
22
- __setEcc(ffi.Ecc);
23
- __setHashes({
24
- sha256: ffi.sha256,
25
- sha256d: ffi.sha256d,
26
- shaRmd160: ffi.shaRmd160,
27
- sha512: ffi.sha512,
28
- Sha256H: ffi.Sha256H,
29
- Sha512H: ffi.Sha512H,
30
- });
31
- }
16
+ __setEcc(new ffi.Ecc());
17
+ __setHashes({
18
+ sha256: ffi.sha256,
19
+ sha256d: ffi.sha256d,
20
+ shaRmd160: ffi.shaRmd160,
21
+ sha512: ffi.sha512,
22
+ Sha256H: ffi.Sha256H,
23
+ Sha512H: ffi.Sha512H,
24
+ });
package/src/initNodeJs.ts CHANGED
@@ -6,15 +6,12 @@ import { __setEcc } from './ecc.js';
6
6
  import * as ffi from './ffi/ecash_lib_wasm_nodejs.js';
7
7
  import { __setHashes } from './hash.js';
8
8
 
9
- /** Load and initialize the WASM module for NodeJS */
10
- export async function initWasm(_dummy?: any) {
11
- __setEcc(ffi.Ecc);
12
- __setHashes({
13
- sha256: ffi.sha256,
14
- sha256d: ffi.sha256d,
15
- shaRmd160: ffi.shaRmd160,
16
- sha512: ffi.sha512,
17
- Sha256H: ffi.Sha256H,
18
- Sha512H: ffi.Sha512H,
19
- });
20
- }
9
+ __setEcc(new ffi.Ecc());
10
+ __setHashes({
11
+ sha256: ffi.sha256,
12
+ sha256d: ffi.sha256d,
13
+ shaRmd160: ffi.shaRmd160,
14
+ sha512: ffi.sha512,
15
+ Sha256H: ffi.Sha256H,
16
+ Sha512H: ffi.Sha512H,
17
+ });
@@ -23,19 +23,13 @@ const ANYONE_SCRIPT = Script.fromOps([pushBytesOp(fromHex('01'.repeat(100)))]);
23
23
  const ANYONE_SCRIPT_SIG = Script.fromOps([pushBytesOp(ANYONE_SCRIPT.bytecode)]);
24
24
 
25
25
  export class TestRunner {
26
- public ecc: Ecc;
27
26
  public runner: ChildProcess;
28
27
  public chronik: ChronikClient;
29
28
  private coinsTxid: string | undefined;
30
29
  private coinValue: number | undefined;
31
30
  private lastUsedOutIdx: number;
32
31
 
33
- private constructor(
34
- ecc: Ecc,
35
- runner: ChildProcess,
36
- chronik: ChronikClient,
37
- ) {
38
- this.ecc = ecc;
32
+ private constructor(runner: ChildProcess, chronik: ChronikClient) {
39
33
  this.runner = runner;
40
34
  this.chronik = chronik;
41
35
  this.coinsTxid = undefined;
@@ -114,8 +108,6 @@ export class TestRunner {
114
108
  }
115
109
  });
116
110
 
117
- const ecc = new Ecc();
118
-
119
111
  // We got the coins, can fan out now
120
112
  await (events as any).once(statusEvent, 'ready');
121
113
 
@@ -123,7 +115,7 @@ export class TestRunner {
123
115
  throw new Event('Chronik is undefined');
124
116
  }
125
117
 
126
- return new TestRunner(ecc, runner, chronik);
118
+ return new TestRunner(runner, chronik);
127
119
  }
128
120
 
129
121
  public async setupCoins(
@@ -195,7 +187,7 @@ export class TestRunner {
195
187
  Script.fromOps([OP_RETURN]), // burn leftover
196
188
  ],
197
189
  });
198
- const setupTx = setupTxBuilder.sign(this.ecc, 1000, 546);
190
+ const setupTx = setupTxBuilder.sign({ feePerKb: 1000, dustLimit: 546 });
199
191
  return (await this.chronik.broadcastTx(setupTx.ser())).txid;
200
192
  }
201
193
 
package/src/txBuilder.ts CHANGED
@@ -120,7 +120,12 @@ export class TxBuilder {
120
120
  }
121
121
 
122
122
  /** Sign the tx built by this builder and return a Tx */
123
- public sign(ecc: Ecc, feePerKb?: number, dustLimit?: number): Tx {
123
+ public sign(params?: {
124
+ ecc?: Ecc;
125
+ feePerKb?: number;
126
+ dustLimit?: number;
127
+ }): Tx {
128
+ const ecc = params?.ecc ?? new Ecc();
124
129
  const { fixedOutputSum, leftoverIdx, outputs } = this.prepareOutputs();
125
130
  const inputs = this.inputs.map(input => copyTxInput(input.input));
126
131
  const updateSignatories = (ecc: Ecc, unsignedTx: UnsignedTx) => {
@@ -145,15 +150,15 @@ export class TxBuilder {
145
150
  'Using a leftover output requires setting SignData.value for all inputs',
146
151
  );
147
152
  }
148
- if (feePerKb === undefined) {
153
+ if (params?.feePerKb === undefined) {
149
154
  throw new Error(
150
155
  'Using a leftover output requires setting feePerKb',
151
156
  );
152
157
  }
153
- if (!Number.isInteger(feePerKb)) {
158
+ if (!Number.isInteger(params.feePerKb)) {
154
159
  throw new Error('feePerKb must be an integer');
155
160
  }
156
- if (dustLimit === undefined) {
161
+ if (params?.dustLimit === undefined) {
157
162
  throw new Error(
158
163
  'Using a leftover output requires setting dustLimit',
159
164
  );
@@ -169,16 +174,16 @@ export class TxBuilder {
169
174
  // Must use dummy here because ECDSA sigs could be too small for fee calc
170
175
  updateSignatories(new EccDummy(), dummyUnsignedTx);
171
176
  let txSize = dummyUnsignedTx.tx.serSize();
172
- let txFee = calcTxFee(txSize, feePerKb);
177
+ let txFee = calcTxFee(txSize, params.feePerKb);
173
178
  const leftoverValue = inputSum - (fixedOutputSum + txFee);
174
- if (leftoverValue < dustLimit) {
179
+ if (leftoverValue < params.dustLimit) {
175
180
  // inputs cannot pay for a dust leftover -> remove & recalc
176
181
  outputs.splice(leftoverIdx, 1);
177
182
  dummyUnsignedTx.tx.outputs = outputs;
178
183
  // Must update signatories again as they might depend on outputs
179
184
  updateSignatories(new EccDummy(), dummyUnsignedTx);
180
185
  txSize = dummyUnsignedTx.tx.serSize();
181
- txFee = calcTxFee(txSize, feePerKb);
186
+ txFee = calcTxFee(txSize, params.feePerKb);
182
187
  } else {
183
188
  outputs[leftoverIdx].value = leftoverValue;
184
189
  }