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.
- package/README.md +5 -40
- package/dist/address/legacyaddr.d.ts +1 -1
- package/dist/ecc.d.ts +9 -25
- package/dist/ecc.d.ts.map +1 -1
- package/dist/ecc.js +40 -56
- package/dist/ecc.js.map +1 -1
- package/dist/ffi/ecash_lib_wasm_bg_browser.d.ts +1 -0
- package/dist/ffi/ecash_lib_wasm_bg_browser.js +1707 -0
- package/dist/ffi/ecash_lib_wasm_bg_browser.wasm +0 -0
- package/dist/ffi/ecash_lib_wasm_bg_browser.wasm.d.ts +2 -0
- package/dist/ffi/ecash_lib_wasm_bg_nodejs.wasm +0 -0
- package/dist/ffi/ecash_lib_wasm_bg_nodejs.wasm.d.ts +2 -0
- package/dist/ffi/ecash_lib_wasm_browser.d.ts +24 -0
- package/dist/ffi/ecash_lib_wasm_browser.js +64 -0
- package/dist/ffi/ecash_lib_wasm_nodejs.d.ts +22 -0
- package/dist/ffi/ecash_lib_wasm_nodejs.js +64 -0
- package/dist/hash.d.ts +6 -16
- package/dist/hash.d.ts.map +1 -1
- package/dist/hash.js +18 -18
- package/dist/hash.js.map +1 -1
- package/dist/hdwallet.d.ts +2 -4
- package/dist/hdwallet.d.ts.map +1 -1
- package/dist/hdwallet.js +6 -7
- package/dist/hdwallet.js.map +1 -1
- package/dist/hmac.js +3 -3
- package/dist/hmac.js.map +1 -1
- package/dist/initBrowser.d.ts +1 -11
- package/dist/initBrowser.d.ts.map +1 -1
- package/dist/initBrowser.js +21 -41
- package/dist/initBrowser.js.map +1 -1
- package/dist/initNodeJs.d.ts +1 -2
- package/dist/initNodeJs.d.ts.map +1 -1
- package/dist/initNodeJs.js +16 -30
- package/dist/initNodeJs.js.map +1 -1
- package/dist/io/bytes.js +2 -2
- package/dist/io/bytes.js.map +1 -1
- package/dist/io/hex.js +5 -4
- package/dist/io/hex.js.map +1 -1
- package/dist/io/str.js +3 -2
- package/dist/io/str.js.map +1 -1
- package/dist/io/varsize.js +3 -2
- package/dist/io/varsize.js.map +1 -1
- package/dist/mnemonic.js +4 -3
- package/dist/mnemonic.js.map +1 -1
- package/dist/op.js +6 -5
- package/dist/op.js.map +1 -1
- package/dist/pbkdf2.js +2 -1
- package/dist/pbkdf2.js.map +1 -1
- package/dist/test/testRunner.d.ts +1 -2
- package/dist/test/testRunner.d.ts.map +1 -1
- package/dist/test/testRunner.js +10 -23
- package/dist/test/testRunner.js.map +1 -1
- package/dist/token/alp.d.ts +1 -1
- package/dist/token/alp.d.ts.map +1 -1
- package/dist/token/alp.js +5 -5
- package/dist/token/alp.js.map +1 -1
- package/dist/token/common.d.ts +4 -4
- package/dist/token/common.d.ts.map +1 -1
- package/dist/token/empp.js +2 -1
- package/dist/token/empp.js.map +1 -1
- package/dist/token/slp.d.ts +1 -1
- package/dist/token/slp.d.ts.map +1 -1
- package/dist/token/slp.js +7 -7
- package/dist/token/slp.js.map +1 -1
- package/dist/tx.js +7 -7
- package/dist/tx.js.map +1 -1
- package/dist/txBuilder.d.ts +5 -1
- package/dist/txBuilder.d.ts.map +1 -1
- package/dist/txBuilder.js +12 -11
- package/dist/txBuilder.js.map +1 -1
- package/package.json +1 -1
- package/src/ecc.ts +47 -59
- package/src/ffi/ecash_lib_wasm_bg_browser.d.ts +1 -0
- package/src/ffi/ecash_lib_wasm_bg_browser.js +1707 -0
- package/src/ffi/ecash_lib_wasm_bg_browser.wasm +0 -0
- package/src/ffi/ecash_lib_wasm_bg_browser.wasm.d.ts +2 -0
- package/src/ffi/ecash_lib_wasm_bg_nodejs.wasm +0 -0
- package/src/ffi/ecash_lib_wasm_bg_nodejs.wasm.d.ts +2 -0
- package/src/ffi/ecash_lib_wasm_browser.d.ts +24 -0
- package/src/ffi/ecash_lib_wasm_browser.js +64 -0
- package/src/ffi/ecash_lib_wasm_nodejs.d.ts +22 -0
- package/src/ffi/ecash_lib_wasm_nodejs.js +64 -0
- package/src/hash.ts +19 -38
- package/src/hdwallet.ts +4 -8
- package/src/initBrowser.ts +18 -25
- package/src/initNodeJs.ts +9 -12
- package/src/test/testRunner.ts +3 -11
- package/src/txBuilder.ts +12 -7
- package/.nyc_output/0fc40ca6-d52c-45eb-b31b-2601ce70b887.json +0 -1
- package/.nyc_output/ac5be6db-4e40-41f8-8b84-7598d4747e57.json +0 -1
- package/.nyc_output/b316d46f-5ea0-4e98-884a-bfbf9cc1d0f8.json +0 -1
- package/.nyc_output/f965566b-9422-4874-b45e-9eefda9c769c.json +0 -1
- package/.nyc_output/processinfo/0fc40ca6-d52c-45eb-b31b-2601ce70b887.json +0 -1
- package/.nyc_output/processinfo/ac5be6db-4e40-41f8-8b84-7598d4747e57.json +0 -1
- package/.nyc_output/processinfo/b316d46f-5ea0-4e98-884a-bfbf9cc1d0f8.json +0 -1
- package/.nyc_output/processinfo/f965566b-9422-4874-b45e-9eefda9c769c.json +0 -1
- package/.nyc_output/processinfo/index.json +0 -1
- package/dist/address/cashaddr.d.ts +0 -78
- package/dist/address/cashaddr.d.ts.map +0 -1
- package/dist/address/cashaddr.js +0 -543
- package/dist/address/cashaddr.js.map +0 -1
- package/dist/cashaddr/cashaddr.d.ts +0 -23
- package/dist/cashaddr/cashaddr.d.ts.map +0 -1
- package/dist/cashaddr/cashaddr.js +0 -325
- package/dist/cashaddr/cashaddr.js.map +0 -1
- package/test.log +0 -82
|
Binary file
|
|
@@ -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;
|
|
Binary file
|
|
@@ -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
|
|
18
|
-
sha256d
|
|
19
|
-
shaRmd160
|
|
20
|
-
sha512
|
|
21
|
-
Sha256H
|
|
22
|
-
Sha512H
|
|
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
|
-
|
|
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
|
|
38
|
-
data,
|
|
39
|
-
);
|
|
26
|
+
return HASHES.sha256!(data);
|
|
40
27
|
}
|
|
41
28
|
export function sha256d(data: Uint8Array): Uint8Array {
|
|
42
|
-
return
|
|
43
|
-
data,
|
|
44
|
-
);
|
|
29
|
+
return HASHES.sha256d!(data);
|
|
45
30
|
}
|
|
46
31
|
export function shaRmd160(data: Uint8Array): Uint8Array {
|
|
47
|
-
return
|
|
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
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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 =
|
|
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:
|
|
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(
|
|
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(
|
|
175
|
+
return HdNode.fromPrivateKey(hashedLeft, hashedRight);
|
|
180
176
|
}
|
|
181
177
|
}
|
package/src/initBrowser.ts
CHANGED
|
@@ -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
|
|
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
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
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
|
+
});
|
package/src/test/testRunner.ts
CHANGED
|
@@ -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(
|
|
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(
|
|
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(
|
|
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
|
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{}
|