mainnet-js 0.4.27 → 0.4.31
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.html +1 -1
- package/dist/main/constant.d.ts +1 -0
- package/dist/main/constant.js +17 -1
- package/dist/main/constant.js.map +1 -1
- package/dist/main/util/balanceObjectFromSatoshi.js +2 -1
- package/dist/main/util/balanceObjectFromSatoshi.js.map +1 -1
- package/dist/main/util/floor.d.ts +1 -0
- package/dist/main/util/floor.js +9 -0
- package/dist/main/util/floor.js.map +1 -0
- package/dist/main/util/getAddrsByXpubKey.d.ts +22 -0
- package/dist/main/util/getAddrsByXpubKey.js +79 -0
- package/dist/main/util/getAddrsByXpubKey.js.map +1 -0
- package/dist/main/util/getXPubKey.d.ts +1 -0
- package/dist/main/util/getXPubKey.js +26 -0
- package/dist/main/util/getXPubKey.js.map +1 -0
- package/dist/main/util/index.d.ts +5 -3
- package/dist/main/util/index.js +13 -6
- package/dist/main/util/index.js.map +1 -1
- package/dist/main/wallet/Base.d.ts +3 -1
- package/dist/main/wallet/Base.js +3 -1
- package/dist/main/wallet/Base.js.map +1 -1
- package/dist/main/wallet/Wif.d.ts +6 -0
- package/dist/main/wallet/Wif.js +92 -7
- package/dist/main/wallet/Wif.js.map +1 -1
- package/dist/main/wallet/interface.d.ts +5 -0
- package/dist/main/wallet/model.d.ts +16 -0
- package/dist/main/wallet/model.js +18 -1
- package/dist/main/wallet/model.js.map +1 -1
- package/dist/mainnet-0.4.31.js +2 -0
- package/dist/{mainnet-0.4.27.js.LICENSE.txt → mainnet-0.4.31.js.LICENSE.txt} +0 -0
- package/dist/module/constant.d.ts +1 -0
- package/dist/module/constant.js +16 -0
- package/dist/module/constant.js.map +1 -1
- package/dist/module/util/balanceObjectFromSatoshi.js +2 -1
- package/dist/module/util/balanceObjectFromSatoshi.js.map +1 -1
- package/dist/module/util/floor.d.ts +1 -0
- package/dist/module/util/floor.js +5 -0
- package/dist/module/util/floor.js.map +1 -0
- package/dist/module/util/getAddrsByXpubKey.d.ts +22 -0
- package/dist/module/util/getAddrsByXpubKey.js +71 -0
- package/dist/module/util/getAddrsByXpubKey.js.map +1 -0
- package/dist/module/util/getXPubKey.d.ts +1 -0
- package/dist/module/util/getXPubKey.js +22 -0
- package/dist/module/util/getXPubKey.js.map +1 -0
- package/dist/module/util/index.d.ts +5 -3
- package/dist/module/util/index.js +5 -3
- package/dist/module/util/index.js.map +1 -1
- package/dist/module/wallet/Base.d.ts +3 -1
- package/dist/module/wallet/Base.js +3 -1
- package/dist/module/wallet/Base.js.map +1 -1
- package/dist/module/wallet/Wif.d.ts +6 -0
- package/dist/module/wallet/Wif.js +95 -10
- package/dist/module/wallet/Wif.js.map +1 -1
- package/dist/module/wallet/interface.d.ts +5 -0
- package/dist/module/wallet/model.d.ts +16 -0
- package/dist/module/wallet/model.js +16 -0
- package/dist/module/wallet/model.js.map +1 -1
- package/dist/tsconfig.browser.tsbuildinfo +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +1 -1
- package/src/constant.ts +17 -0
- package/src/util/balanceObjectFromSatoshi.ts +2 -1
- package/src/util/floor.test.ts +21 -0
- package/src/util/floor.ts +4 -0
- package/src/util/getAddrsByXpubKey.test.ts +115 -0
- package/src/util/getAddrsByXpubKey.ts +98 -0
- package/src/util/getXPubKey.ts +36 -0
- package/src/util/index.ts +10 -3
- package/src/wallet/Base.ts +4 -1
- package/src/wallet/Wif.test.ts +197 -2
- package/src/wallet/Wif.ts +123 -18
- package/src/wallet/createWallet.test.ts +2 -0
- package/src/wallet/interface.ts +6 -1
- package/src/wallet/model.ts +22 -0
- package/dist/mainnet-0.4.27.js +0 -2
|
File without changes
|
package/dist/module/constant.js
CHANGED
|
@@ -5,4 +5,20 @@ export const DUST_UTXO_THRESHOLD = 546;
|
|
|
5
5
|
export const MEMPOOL_CHAIN_LIMIT = 50;
|
|
6
6
|
// time in milliseconds to cache the usd exchange rate
|
|
7
7
|
export const EXCHANGE_RATE_TTL = 250000;
|
|
8
|
+
// list of common derivation paths
|
|
9
|
+
// a la: https://github.com/Electron-Cash/Electron-Cash/blob/1de24c509992cfebc22217a2a77c862c2b02bc54/electroncash_gui/qt/installwizard.py#L624
|
|
10
|
+
export const DERIVATION_PATHS = [
|
|
11
|
+
"m/0",
|
|
12
|
+
"m/0'",
|
|
13
|
+
"m/0'/0",
|
|
14
|
+
"m/0'/0'",
|
|
15
|
+
"m/0'/0'/0'",
|
|
16
|
+
"m/44'/0'/0'",
|
|
17
|
+
"m/44'/0'/0'/0",
|
|
18
|
+
"m/44'/145'/0'",
|
|
19
|
+
"m/44'/145'/0'/0",
|
|
20
|
+
"m/44'/245'/0",
|
|
21
|
+
"m/44'/245'/0'",
|
|
22
|
+
"m/44'/245'/0'/0",
|
|
23
|
+
];
|
|
8
24
|
//# sourceMappingURL=constant.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"constant.js","sourceRoot":"","sources":["../../src/constant.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAE7B,uDAAuD;AACvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEvC,2BAA2B;AAC3B,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAEtC,sDAAsD;AACtD,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC"}
|
|
1
|
+
{"version":3,"file":"constant.js","sourceRoot":"","sources":["../../src/constant.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,GAAG,CAAC;AAE7B,uDAAuD;AACvD,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEvC,2BAA2B;AAC3B,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAC;AAEtC,sDAAsD;AACtD,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,CAAC;AAExC,kCAAkC;AAClC,+IAA+I;AAC/I,MAAM,CAAC,MAAM,gBAAgB,GAAG;IAC9B,KAAK;IACL,MAAM;IACN,QAAQ;IACR,SAAS;IACT,YAAY;IACZ,aAAa;IACb,eAAe;IACf,eAAe;IACf,iBAAiB;IACjB,cAAc;IACd,eAAe;IACf,iBAAiB;CAClB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { bchParam } from "../chain";
|
|
2
2
|
import { UnitEnum } from "../enum";
|
|
3
|
+
import { floor } from "./floor";
|
|
3
4
|
import { ExchangeRate } from "../rate/ExchangeRate";
|
|
4
5
|
import { sanitizeUnit } from "./sanitizeUnit";
|
|
5
6
|
export class BalanceResponse {
|
|
@@ -23,7 +24,7 @@ export async function balanceResponseFromSatoshi(value, usdPriceCache = true) {
|
|
|
23
24
|
case UnitEnum.USD:
|
|
24
25
|
let usd = (value / bchParam.subUnits) *
|
|
25
26
|
(await ExchangeRate.get("usd", usdPriceCache));
|
|
26
|
-
response.usd =
|
|
27
|
+
response.usd = floor(usd, 2);
|
|
27
28
|
break;
|
|
28
29
|
default:
|
|
29
30
|
throw Error(`Balance response type ${JSON.stringify(u)} not understood`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"balanceObjectFromSatoshi.js","sourceRoot":"","sources":["../../../src/util/balanceObjectFromSatoshi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,OAAO,eAAe;IAI1B,YAAY,GAAY,EAAE,GAAY,EAAE,GAAY;QAClD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,KAAa,EACb,gBAAyB,IAAI;IAE7B,IAAI,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,IAAI,WAAW,GAAe,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAEpD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE;QAC3B,QAAQ,CAAC,EAAE;YACT,KAAK,QAAQ,CAAC,GAAG;gBACf,QAAQ,CAAC,GAAG,GAAG,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBACzC,MAAM;YACR,KAAK,QAAQ,CAAC,GAAG;gBACf,QAAQ,CAAC,GAAG,GAAG,KAAK,CAAC;gBACrB,MAAM;YACR,KAAK,QAAQ,CAAC,GAAG;gBACf,IAAI,GAAG,GACL,CAAC,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;oBAC3B,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;gBACjD,QAAQ,CAAC,GAAG,GAAG,
|
|
1
|
+
{"version":3,"file":"balanceObjectFromSatoshi.js","sourceRoot":"","sources":["../../../src/util/balanceObjectFromSatoshi.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACpC,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAE9C,MAAM,OAAO,eAAe;IAI1B,YAAY,GAAY,EAAE,GAAY,EAAE,GAAY;QAClD,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IACjB,CAAC;CACF;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,KAAa,EACb,gBAAyB,IAAI;IAE7B,IAAI,QAAQ,GAAG,IAAI,eAAe,EAAE,CAAC;IACrC,IAAI,WAAW,GAAe,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;IAEpD,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE;QAC3B,QAAQ,CAAC,EAAE;YACT,KAAK,QAAQ,CAAC,GAAG;gBACf,QAAQ,CAAC,GAAG,GAAG,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBACzC,MAAM;YACR,KAAK,QAAQ,CAAC,GAAG;gBACf,QAAQ,CAAC,GAAG,GAAG,KAAK,CAAC;gBACrB,MAAM;YACR,KAAK,QAAQ,CAAC,GAAG;gBACf,IAAI,GAAG,GACL,CAAC,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;oBAC3B,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;gBACjD,QAAQ,CAAC,GAAG,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBAC7B,MAAM;YACR;gBACE,MAAM,KAAK,CACT,yBAAyB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,iBAAiB,CAC5D,CAAC;SACL;KACF;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,KAAa,EACb,OAAe,EACf,gBAAyB,IAAI;IAE7B,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACnC,QAAQ,IAAI,EAAE;QACZ,KAAK,QAAQ,CAAC,GAAG;YACf,OAAO,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;QACnC,KAAK,QAAQ,CAAC,GAAG;YACf,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ,CAAC,IAAI;YAChB,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ,CAAC,OAAO;YACnB,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ,CAAC,QAAQ;YACpB,OAAO,KAAK,CAAC;QACf,KAAK,QAAQ,CAAC,GAAG;YACf,IAAI,GAAG,GACL,CAAC,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC;gBAC3B,CAAC,MAAM,YAAY,CAAC,GAAG,CAAC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC;YACjD,OAAO,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;QAChC;YACE,MAAM,KAAK,CACT,yBAAyB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAiB,CAC/D,CAAC;KACL;AACH,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function floor(value: any, precision: any): number;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"floor.js","sourceRoot":"","sources":["../../../src/util/floor.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,KAAK,CAAC,KAAK,EAAE,SAAS;IACpC,IAAI,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,SAAS,IAAI,CAAC,CAAC,CAAC;IAC9C,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { HdKeyNetwork } from "@bitauth/libauth";
|
|
2
|
+
export declare function getAddrsByXpubKey(xpub: string, path: string, count: number): Promise<[unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown]>;
|
|
3
|
+
export declare function getAddrsByXpubKeyObject(obj: any): Promise<[unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown, unknown]>;
|
|
4
|
+
export declare function derivePublicNodeCashaddr(xpub: any, index: number, path?: string): Promise<any>;
|
|
5
|
+
export declare function getXpubKeyInfo(hdPublicKey: any): Promise<{
|
|
6
|
+
version: HdKeyNetwork;
|
|
7
|
+
depth: number;
|
|
8
|
+
parentFingerprint: string;
|
|
9
|
+
childNumber: number;
|
|
10
|
+
chain: string;
|
|
11
|
+
data: string;
|
|
12
|
+
fingerprint: string;
|
|
13
|
+
}>;
|
|
14
|
+
export declare function getXpubKeyInfoObject(obj: any): Promise<{
|
|
15
|
+
version: HdKeyNetwork;
|
|
16
|
+
depth: number;
|
|
17
|
+
parentFingerprint: string;
|
|
18
|
+
childNumber: number;
|
|
19
|
+
chain: string;
|
|
20
|
+
data: string;
|
|
21
|
+
fingerprint: string;
|
|
22
|
+
}>;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { deriveHdPublicNodeChild, decodeHdPublicKey, encodeCashAddress, instantiateBIP32Crypto, deriveHdPath, binToHex, } from "@bitauth/libauth";
|
|
2
|
+
import { hash160 } from "./hash160";
|
|
3
|
+
export async function getAddrsByXpubKey(xpub, path, count) {
|
|
4
|
+
let pathComponents = path.split("/");
|
|
5
|
+
let rootStr = pathComponents.shift();
|
|
6
|
+
let root;
|
|
7
|
+
if (rootStr === "M" || rootStr === "m") {
|
|
8
|
+
rootStr = pathComponents.shift();
|
|
9
|
+
}
|
|
10
|
+
root = parseInt(rootStr);
|
|
11
|
+
let result = [];
|
|
12
|
+
const start = parseInt(pathComponents.pop());
|
|
13
|
+
const end = start + count;
|
|
14
|
+
for (let curr = start; curr < end; curr++) {
|
|
15
|
+
let childPath = ["M", root, ...pathComponents, curr].join("/");
|
|
16
|
+
result.push(derivePublicNodeCashaddr(xpub, root, childPath));
|
|
17
|
+
}
|
|
18
|
+
return await Promise.all(result).then((result) => {
|
|
19
|
+
return result;
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
export async function getAddrsByXpubKeyObject(obj) {
|
|
23
|
+
return await getAddrsByXpubKey(obj.xpubkey, obj.path, obj.count);
|
|
24
|
+
}
|
|
25
|
+
export async function derivePublicNodeCashaddr(xpub, index, path) {
|
|
26
|
+
const crypto = await instantiateBIP32Crypto();
|
|
27
|
+
const publicParent = await decodeHdPublicKey(crypto, xpub);
|
|
28
|
+
if (typeof publicParent === "string") {
|
|
29
|
+
throw new Error(publicParent);
|
|
30
|
+
}
|
|
31
|
+
let prefix = publicParent.network === "mainnet" ? "bitcoincash" : "bchtest";
|
|
32
|
+
let node = await deriveHdPublicNodeChild(crypto, publicParent.node, index);
|
|
33
|
+
if (typeof node === "string") {
|
|
34
|
+
throw new Error(node);
|
|
35
|
+
}
|
|
36
|
+
let cashaddr;
|
|
37
|
+
if (typeof path === "string") {
|
|
38
|
+
if (path[0] !== "M") {
|
|
39
|
+
throw Error("use M for public path derivation");
|
|
40
|
+
}
|
|
41
|
+
let childNode = deriveHdPath(crypto, publicParent.node, path);
|
|
42
|
+
if (typeof childNode === "string") {
|
|
43
|
+
throw new Error(childNode);
|
|
44
|
+
}
|
|
45
|
+
else {
|
|
46
|
+
let childPkh = await hash160(childNode.publicKey);
|
|
47
|
+
cashaddr = encodeCashAddress(prefix, 0, childPkh);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return cashaddr;
|
|
51
|
+
}
|
|
52
|
+
export async function getXpubKeyInfo(hdPublicKey) {
|
|
53
|
+
const crypto = await instantiateBIP32Crypto();
|
|
54
|
+
let node = decodeHdPublicKey(crypto, hdPublicKey);
|
|
55
|
+
if (typeof node === "string") {
|
|
56
|
+
throw new Error(node);
|
|
57
|
+
}
|
|
58
|
+
return {
|
|
59
|
+
version: node.network,
|
|
60
|
+
depth: node.node.depth,
|
|
61
|
+
parentFingerprint: binToHex(node.node.parentFingerprint),
|
|
62
|
+
childNumber: node.node.childIndex,
|
|
63
|
+
chain: binToHex(node.node.chainCode),
|
|
64
|
+
data: binToHex(node.node.publicKey),
|
|
65
|
+
fingerprint: binToHex((await hash160(node.node.publicKey)).slice(0, 4)),
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
export async function getXpubKeyInfoObject(obj) {
|
|
69
|
+
return await getXpubKeyInfo(obj.xpubkey);
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=getAddrsByXpubKey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getAddrsByXpubKey.js","sourceRoot":"","sources":["../../../src/util/getAddrsByXpubKey.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,uBAAuB,EACvB,iBAAiB,EAEjB,iBAAiB,EACjB,sBAAsB,EACtB,YAAY,EAGZ,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,IAAY,EACZ,IAAY,EACZ,KAAa;IAEb,IAAI,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACrC,IAAI,OAAO,GAAG,cAAc,CAAC,KAAK,EAAG,CAAC;IACtC,IAAI,IAAY,CAAC;IACjB,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,GAAG,EAAE;QACtC,OAAO,GAAG,cAAc,CAAC,KAAK,EAAG,CAAC;KACnC;IACD,IAAI,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;IACzB,IAAI,MAAM,GAAQ,EAAE,CAAC;IAErB,MAAM,KAAK,GAAG,QAAQ,CAAC,cAAc,CAAC,GAAG,EAAG,CAAC,CAAC;IAC9C,MAAM,GAAG,GAAG,KAAK,GAAG,KAAK,CAAC;IAC1B,KAAK,IAAI,IAAI,GAAG,KAAK,EAAE,IAAI,GAAG,GAAG,EAAE,IAAI,EAAE,EAAE;QACzC,IAAI,SAAS,GAAG,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,cAAc,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/D,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC;KAC9D;IACD,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QAC/C,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,GAAG;IAC/C,OAAO,MAAM,iBAAiB,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,IAAI,EACJ,KAAa,EACb,IAAa;IAEb,MAAM,MAAM,GAAG,MAAM,sBAAsB,EAAE,CAAC;IAC9C,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAE3D,IAAI,OAAO,YAAY,KAAK,QAAQ,EAAE;QACpC,MAAM,IAAI,KAAK,CAAC,YAAY,CAAC,CAAC;KAC/B;IACD,IAAI,MAAM,GAAG,YAAY,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC;IAE5E,IAAI,IAAI,GAAG,MAAM,uBAAuB,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC3E,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC5B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;KACvB;IAED,IAAI,QAAQ,CAAC;IACb,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC5B,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;YACnB,MAAM,KAAK,CAAC,kCAAkC,CAAC,CAAC;SACjD;QACD,IAAI,SAAS,GAAG,YAAY,CAAC,MAAM,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9D,IAAI,OAAO,SAAS,KAAK,QAAQ,EAAE;YACjC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC;SAC5B;aAAM;YACL,IAAI,QAAQ,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YAClD,QAAQ,GAAG,iBAAiB,CAAC,MAAM,EAAE,CAAC,EAAE,QAAQ,CAAC,CAAC;SACnD;KACF;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,WAAW;IAC9C,MAAM,MAAM,GAAG,MAAM,sBAAsB,EAAE,CAAC;IAC9C,IAAI,IAAI,GAAG,iBAAiB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAClD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC5B,MAAM,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC;KACvB;IACD,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK;QACtB,iBAAiB,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC;QACxD,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU;QACjC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACpC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;QACnC,WAAW,EAAE,QAAQ,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KACxE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,GAAG;IAC5C,OAAO,MAAM,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getXPubKey(seed: Uint8Array | string, derivationPath: string, network: string): Promise<string>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { deriveHdPrivateNodeFromSeed, deriveHdPath, deriveHdPublicNode, encodeHdPublicKey, instantiateBIP32Crypto, hexToBin, } from "@bitauth/libauth";
|
|
2
|
+
export async function getXPubKey(seed, derivationPath, network) {
|
|
3
|
+
if (typeof seed === "string") {
|
|
4
|
+
seed = hexToBin(seed);
|
|
5
|
+
}
|
|
6
|
+
const crypto = await instantiateBIP32Crypto();
|
|
7
|
+
let hdNode = deriveHdPrivateNodeFromSeed(crypto, seed);
|
|
8
|
+
if (!hdNode.valid) {
|
|
9
|
+
throw Error("Invalid private key derived from mnemonic seed");
|
|
10
|
+
}
|
|
11
|
+
let node = deriveHdPath(crypto, hdNode, derivationPath);
|
|
12
|
+
if (typeof node === "string") {
|
|
13
|
+
throw node;
|
|
14
|
+
}
|
|
15
|
+
let parentPublicNode = deriveHdPublicNode(crypto, node);
|
|
16
|
+
let xPubKey = encodeHdPublicKey(crypto, {
|
|
17
|
+
network: network,
|
|
18
|
+
node: parentPublicNode,
|
|
19
|
+
});
|
|
20
|
+
return xPubKey;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=getXPubKey.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getXPubKey.js","sourceRoot":"","sources":["../../../src/util/getXPubKey.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,2BAA2B,EAC3B,YAAY,EACZ,kBAAkB,EAClB,iBAAiB,EAEjB,sBAAsB,EACtB,QAAQ,GACT,MAAM,kBAAkB,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,IAAyB,EACzB,cAAsB,EACtB,OAAe;IAEf,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC5B,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;KACvB;IACD,MAAM,MAAM,GAAG,MAAM,sBAAsB,EAAE,CAAC;IAC9C,IAAI,MAAM,GAAG,2BAA2B,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IACvD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE;QACjB,MAAM,KAAK,CAAC,gDAAgD,CAAC,CAAC;KAC/D;IAED,IAAI,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;IACxD,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QAC5B,MAAM,IAAI,CAAC;KACZ;IACD,IAAI,gBAAgB,GAAG,kBAAkB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAExD,IAAI,OAAO,GAAG,iBAAiB,CAAC,MAAM,EAAE;QACtC,OAAO,EAAE,OAAuB;QAChC,IAAI,EAAE,gBAAgB;KACvB,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
export { amountInSatoshi } from "./amountInSatoshi";
|
|
2
2
|
export { asSendRequestObject } from "./asSendRequestObject";
|
|
3
|
-
export {
|
|
3
|
+
export { atob, btoa } from "./base64";
|
|
4
4
|
export { convert, convertObject } from "./convert";
|
|
5
5
|
export { delay } from "./delay";
|
|
6
|
+
export { derivedNetwork } from "./deriveNetwork";
|
|
7
|
+
export { derivePublicKeyHash } from "./derivePublicKeyHash";
|
|
8
|
+
export { getAddrsByXpubKey, getAddrsByXpubKeyObject, getXpubKeyInfo, getXpubKeyInfoObject, } from "../util/getAddrsByXpubKey";
|
|
6
9
|
export { getRuntimePlatform, RuntimePlatform } from "./getRuntimePlatform";
|
|
7
10
|
export { getUsdRate } from "./getUsdRate";
|
|
8
11
|
export { ExchangeRate } from "../rate/ExchangeRate";
|
|
9
|
-
export { derivedNetwork } from "./deriveNetwork";
|
|
10
|
-
export { derivePublicKeyHash } from "./derivePublicKeyHash";
|
|
11
12
|
export { sanitizeAddress } from "./sanitizeAddress";
|
|
12
13
|
export { sanitizeUnit } from "./sanitizeUnit";
|
|
13
14
|
export { getRandomInt } from "./randomInt";
|
|
15
|
+
export { getXPubKey } from "../util/getXPubKey";
|
|
14
16
|
import * as randomValues from "./randomValues";
|
|
15
17
|
export { randomValues };
|
|
16
18
|
export { sumUtxoValue } from "./sumUtxoValue";
|
|
@@ -1,16 +1,18 @@
|
|
|
1
1
|
export { amountInSatoshi } from "./amountInSatoshi";
|
|
2
2
|
export { asSendRequestObject } from "./asSendRequestObject";
|
|
3
|
-
export {
|
|
3
|
+
export { atob, btoa } from "./base64";
|
|
4
4
|
export { convert, convertObject } from "./convert";
|
|
5
5
|
export { delay } from "./delay";
|
|
6
|
+
export { derivedNetwork } from "./deriveNetwork";
|
|
7
|
+
export { derivePublicKeyHash } from "./derivePublicKeyHash";
|
|
8
|
+
export { getAddrsByXpubKey, getAddrsByXpubKeyObject, getXpubKeyInfo, getXpubKeyInfoObject, } from "../util/getAddrsByXpubKey";
|
|
6
9
|
export { getRuntimePlatform, RuntimePlatform } from "./getRuntimePlatform";
|
|
7
10
|
export { getUsdRate } from "./getUsdRate";
|
|
8
11
|
export { ExchangeRate } from "../rate/ExchangeRate";
|
|
9
|
-
export { derivedNetwork } from "./deriveNetwork";
|
|
10
|
-
export { derivePublicKeyHash } from "./derivePublicKeyHash";
|
|
11
12
|
export { sanitizeAddress } from "./sanitizeAddress";
|
|
12
13
|
export { sanitizeUnit } from "./sanitizeUnit";
|
|
13
14
|
export { getRandomInt } from "./randomInt";
|
|
15
|
+
export { getXPubKey } from "../util/getXPubKey";
|
|
14
16
|
import * as randomValues from "./randomValues";
|
|
15
17
|
export { randomValues };
|
|
16
18
|
export { sumUtxoValue } from "./sumUtxoValue";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/util/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/util/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,EACL,iBAAiB,EACjB,uBAAuB,EACvB,cAAc,EACd,oBAAoB,GACrB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,KAAK,YAAY,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,CAAC;AACxB,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,0BAA0B,GAC3B,MAAM,4BAA4B,CAAC"}
|
|
@@ -10,6 +10,8 @@ import { WalletTypeEnum } from "./enum";
|
|
|
10
10
|
export declare class BaseWallet implements WalletI {
|
|
11
11
|
provider?: any;
|
|
12
12
|
derivationPath: string;
|
|
13
|
+
parentDerivationPath: string;
|
|
14
|
+
parentXPubKey?: string;
|
|
13
15
|
mnemonic?: string;
|
|
14
16
|
address?: string;
|
|
15
17
|
privateKey?: any;
|
|
@@ -104,7 +106,7 @@ export declare class BaseWallet implements WalletI {
|
|
|
104
106
|
/**
|
|
105
107
|
* replaceNamed - replace (recover) named wallet with a new walletId
|
|
106
108
|
*
|
|
107
|
-
* If wallet with a provided name does not exist yet, it will be
|
|
109
|
+
* If wallet with a provided name does not exist yet, it will be created with a `walletId` supplied
|
|
108
110
|
* If wallet exists it will be overwritten without exception
|
|
109
111
|
*
|
|
110
112
|
* @param name user friendly wallet alias
|
|
@@ -19,6 +19,7 @@ export class BaseWallet {
|
|
|
19
19
|
*/
|
|
20
20
|
constructor(name = "", network = NetworkType.Mainnet, walletType = WalletTypeEnum.Seed) {
|
|
21
21
|
this.derivationPath = "m/44'/0'/0'/0/0";
|
|
22
|
+
this.parentDerivationPath = "m/44'/0'/0'";
|
|
22
23
|
this.name = name;
|
|
23
24
|
this.network = network;
|
|
24
25
|
this.walletType = walletType;
|
|
@@ -66,6 +67,7 @@ export class BaseWallet {
|
|
|
66
67
|
return {
|
|
67
68
|
seed: this.mnemonic,
|
|
68
69
|
derivationPath: this.derivationPath,
|
|
70
|
+
parentDerivationPath: this.parentDerivationPath,
|
|
69
71
|
};
|
|
70
72
|
}
|
|
71
73
|
/**
|
|
@@ -133,7 +135,7 @@ export class BaseWallet {
|
|
|
133
135
|
/**
|
|
134
136
|
* replaceNamed - replace (recover) named wallet with a new walletId
|
|
135
137
|
*
|
|
136
|
-
* If wallet with a provided name does not exist yet, it will be
|
|
138
|
+
* If wallet with a provided name does not exist yet, it will be created with a `walletId` supplied
|
|
137
139
|
* If wallet exists it will be overwritten without exception
|
|
138
140
|
*
|
|
139
141
|
* @param name user friendly wallet alias
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Base.js","sourceRoot":"","sources":["../../../src/wallet/Base.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,OAAO,EAAE,cAAc,EAAE,MAAM,QAAQ,CAAC;AAExC;;;GAGG;AACH,MAAM,OAAO,UAAU;
|
|
1
|
+
{"version":3,"file":"Base.js","sourceRoot":"","sources":["../../../src/wallet/Base.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,8 @@ import { SignedMessageI } from "../message";
|
|
|
18
18
|
export declare class Wallet extends BaseWallet {
|
|
19
19
|
cashaddr?: string;
|
|
20
20
|
derivationPath: string;
|
|
21
|
+
parentDerivationPath: string;
|
|
22
|
+
parentXPubKey?: string;
|
|
21
23
|
privateKey?: Uint8Array;
|
|
22
24
|
publicKeyCompressed?: Uint8Array;
|
|
23
25
|
privateKeyWif?: string;
|
|
@@ -26,6 +28,7 @@ export declare class Wallet extends BaseWallet {
|
|
|
26
28
|
networkPrefix: CashAddressNetworkPrefix;
|
|
27
29
|
_slp?: Slp;
|
|
28
30
|
_slpAware: boolean;
|
|
31
|
+
_slpSemiAware: boolean;
|
|
29
32
|
_util?: Util;
|
|
30
33
|
static signedMessage: SignedMessageI;
|
|
31
34
|
get slp(): Slp;
|
|
@@ -33,6 +36,7 @@ export declare class Wallet extends BaseWallet {
|
|
|
33
36
|
get util(): Util;
|
|
34
37
|
static get util(): typeof Util;
|
|
35
38
|
slpAware(value?: boolean): Wallet;
|
|
39
|
+
slpSemiAware(value?: boolean): Wallet;
|
|
36
40
|
getNetworkProvider(network?: Network): import("../network/NetworkProvider").default;
|
|
37
41
|
/**
|
|
38
42
|
* explorerUrl Web url to a transaction on a block explorer
|
|
@@ -80,7 +84,9 @@ export declare class Wallet extends BaseWallet {
|
|
|
80
84
|
private _generateWif;
|
|
81
85
|
private _generateMnemonic;
|
|
82
86
|
protected fromId: (walletId: string) => Promise<this>;
|
|
87
|
+
getXPubKeys(paths?: any): Promise<any[]>;
|
|
83
88
|
protected fromSeed(mnemonic: string, derivationPath?: string): Promise<this>;
|
|
89
|
+
deriveHdPaths(hdPaths: string[]): Promise<any[]>;
|
|
84
90
|
protected watchOnly(address: string): Promise<this>;
|
|
85
91
|
protected fromWIF(secret: string): Promise<this>;
|
|
86
92
|
protected newRandom(name: string, dbName?: string): Promise<this>;
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
//#region Imports
|
|
2
2
|
// Stable
|
|
3
|
-
import { instantiateSecp256k1, instantiateSha256 } from "@bitauth/libauth";
|
|
3
|
+
import { encodeHdPublicKey, instantiateSecp256k1, instantiateSha256, } from "@bitauth/libauth";
|
|
4
4
|
// Unstable?
|
|
5
|
-
import { binToHex, CashAddressNetworkPrefix, decodePrivateKeyWif, encodePrivateKeyWif, deriveHdPrivateNodeFromSeed, deriveHdPath, generatePrivateKey, instantiateBIP32Crypto, } from "@bitauth/libauth";
|
|
5
|
+
import { binToHex, CashAddressNetworkPrefix, deriveHdPublicNode, decodePrivateKeyWif, encodePrivateKeyWif, deriveHdPrivateNodeFromSeed, deriveHdPath, generatePrivateKey, instantiateBIP32Crypto, } from "@bitauth/libauth";
|
|
6
6
|
import { mnemonicToSeedSync, generateMnemonic } from "bip39";
|
|
7
7
|
import { NetworkType, prefixFromNetworkMap, UnitEnum } from "../enum";
|
|
8
8
|
import { Network } from "../interface";
|
|
9
9
|
import { networkPrefixMap } from "../enum";
|
|
10
10
|
import { BaseWallet } from "./Base";
|
|
11
11
|
import { WalletTypeEnum } from "./enum";
|
|
12
|
-
import { SendRequest, SendResponse, UtxoItem, UtxoResponse, } from "./model";
|
|
12
|
+
import { SendRequest, SendResponse, UtxoItem, UtxoResponse, XPubKey, } from "./model";
|
|
13
13
|
import { buildEncodedTransaction, getSuitableUtxos, getFeeAmount, } from "../transaction/Wif";
|
|
14
14
|
import { asSendRequestObject } from "../util/asSendRequestObject";
|
|
15
15
|
import { balanceFromSatoshi, balanceResponseFromSatoshi, } from "../util/balanceObjectFromSatoshi";
|
|
@@ -28,6 +28,8 @@ import { getNetworkProvider } from "../network/index";
|
|
|
28
28
|
import { generateRandomBytes } from "../util/randomBytes";
|
|
29
29
|
import { SignedMessage } from "../message";
|
|
30
30
|
import { amountInSatoshi } from "../util/amountInSatoshi";
|
|
31
|
+
import { getXPubKey } from "../util/getXPubKey";
|
|
32
|
+
import { DERIVATION_PATHS, DUST_UTXO_THRESHOLD } from "../constant";
|
|
31
33
|
//#endregion Imports
|
|
32
34
|
const secp256k1Promise = instantiateSecp256k1();
|
|
33
35
|
const sha256Promise = instantiateSha256();
|
|
@@ -40,7 +42,9 @@ export class Wallet extends BaseWallet {
|
|
|
40
42
|
constructor(name = "", network = NetworkType.Mainnet, walletType = WalletTypeEnum.Seed) {
|
|
41
43
|
super(name, network, walletType);
|
|
42
44
|
this.derivationPath = "m/44'/0'/0'/0/0";
|
|
43
|
-
this.
|
|
45
|
+
this.parentDerivationPath = "m/44'/0'/0'";
|
|
46
|
+
this._slpAware = false; // a flag which activates utxo checking against an external slp indexer
|
|
47
|
+
this._slpSemiAware = false; // a flag which requires an utxo to have more than 546 sats to be spendable and counted in the balance
|
|
44
48
|
this.fromId = async (walletId) => {
|
|
45
49
|
let [walletType, networkGiven, arg1] = walletId.split(":");
|
|
46
50
|
if (this.network != networkGiven) {
|
|
@@ -82,6 +86,10 @@ export class Wallet extends BaseWallet {
|
|
|
82
86
|
this._slpAware = value;
|
|
83
87
|
return this;
|
|
84
88
|
}
|
|
89
|
+
slpSemiAware(value = true) {
|
|
90
|
+
this._slpSemiAware = value;
|
|
91
|
+
return this;
|
|
92
|
+
}
|
|
85
93
|
getNetworkProvider(network = Network.MAINNET) {
|
|
86
94
|
return getNetworkProvider(network);
|
|
87
95
|
}
|
|
@@ -93,8 +101,8 @@ export class Wallet extends BaseWallet {
|
|
|
93
101
|
*/
|
|
94
102
|
explorerUrl(txId) {
|
|
95
103
|
const explorerUrlMap = {
|
|
96
|
-
mainnet: "https://
|
|
97
|
-
testnet: "https://
|
|
104
|
+
mainnet: "https://blockchair.com/bitcoin-cash/transaction/",
|
|
105
|
+
testnet: "https://www.blockchain.com/bch-testnet/tx/",
|
|
98
106
|
regtest: "",
|
|
99
107
|
};
|
|
100
108
|
return explorerUrlMap[this.network] + txId;
|
|
@@ -108,6 +116,10 @@ export class Wallet extends BaseWallet {
|
|
|
108
116
|
network: this.network,
|
|
109
117
|
seed: this.mnemonic ? this.getSeed().seed : undefined,
|
|
110
118
|
derivationPath: this.mnemonic ? this.getSeed().derivationPath : undefined,
|
|
119
|
+
parentDerivationPath: this.mnemonic
|
|
120
|
+
? this.getSeed().parentDerivationPath
|
|
121
|
+
: undefined,
|
|
122
|
+
parentXPubKey: this.parentXPubKey ? this.parentXPubKey : undefined,
|
|
111
123
|
publicKey: this.publicKey ? binToHex(this.publicKey) : undefined,
|
|
112
124
|
publicKeyHash: binToHex(this.publicKeyHash),
|
|
113
125
|
privateKey: this.privateKey ? binToHex(this.privateKey) : undefined,
|
|
@@ -210,18 +222,37 @@ export class Wallet extends BaseWallet {
|
|
|
210
222
|
return this.deriveInfo();
|
|
211
223
|
}
|
|
212
224
|
async _generateMnemonic() {
|
|
213
|
-
const crypto = await instantiateBIP32Crypto();
|
|
214
225
|
this.mnemonic = generateMnemonic();
|
|
215
226
|
let seed = mnemonicToSeedSync(this.mnemonic);
|
|
227
|
+
let network = this.isTestnet ? "testnet" : "mainnet";
|
|
228
|
+
this.parentXPubKey = await getXPubKey(seed, this.parentDerivationPath, network);
|
|
229
|
+
const crypto = await instantiateBIP32Crypto();
|
|
216
230
|
let hdNode = deriveHdPrivateNodeFromSeed(crypto, seed);
|
|
217
231
|
if (!hdNode.valid) {
|
|
218
232
|
throw Error("Invalid private key derived from mnemonic seed");
|
|
219
233
|
}
|
|
220
234
|
let zerothChild = deriveHdPath(crypto, hdNode, this.derivationPath);
|
|
235
|
+
if (typeof zerothChild === "string") {
|
|
236
|
+
throw Error(zerothChild);
|
|
237
|
+
}
|
|
221
238
|
this.privateKey = zerothChild.privateKey;
|
|
222
239
|
this.walletType = WalletTypeEnum.Seed;
|
|
223
240
|
return await this.deriveInfo();
|
|
224
241
|
}
|
|
242
|
+
async getXPubKeys(paths) {
|
|
243
|
+
if (this.mnemonic) {
|
|
244
|
+
if (paths) {
|
|
245
|
+
let xPubKeys = await this.deriveHdPaths(paths);
|
|
246
|
+
return [xPubKeys];
|
|
247
|
+
}
|
|
248
|
+
else {
|
|
249
|
+
return await this.deriveHdPaths(DERIVATION_PATHS);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
else {
|
|
253
|
+
throw Error("xpubkeys can only be derived from seed type wallets.");
|
|
254
|
+
}
|
|
255
|
+
}
|
|
225
256
|
// Initialize wallet from a mnemonic phrase
|
|
226
257
|
async fromSeed(mnemonic, derivationPath) {
|
|
227
258
|
this.mnemonic = mnemonic;
|
|
@@ -233,13 +264,58 @@ export class Wallet extends BaseWallet {
|
|
|
233
264
|
}
|
|
234
265
|
if (derivationPath) {
|
|
235
266
|
this.derivationPath = derivationPath;
|
|
267
|
+
// If the derivation path is for the first account child, set the parent derivation path
|
|
268
|
+
let path = derivationPath.split("/");
|
|
269
|
+
if (path.slice(-2).join("/") == "0/0") {
|
|
270
|
+
this.parentDerivationPath = path.slice(0, -2).join("/");
|
|
271
|
+
}
|
|
236
272
|
}
|
|
237
273
|
let zerothChild = deriveHdPath(crypto, hdNode, this.derivationPath);
|
|
274
|
+
if (typeof zerothChild === "string") {
|
|
275
|
+
throw Error(zerothChild);
|
|
276
|
+
}
|
|
238
277
|
this.privateKey = zerothChild.privateKey;
|
|
278
|
+
let network = this.isTestnet ? "testnet" : "mainnet";
|
|
279
|
+
this.parentXPubKey = await getXPubKey(seed, this.parentDerivationPath, network);
|
|
239
280
|
this.walletType = WalletTypeEnum.Seed;
|
|
240
281
|
await this.deriveInfo();
|
|
241
282
|
return this;
|
|
242
283
|
}
|
|
284
|
+
// Get common xpub paths from zerothChild privateKey
|
|
285
|
+
async deriveHdPaths(hdPaths) {
|
|
286
|
+
const crypto = await instantiateBIP32Crypto();
|
|
287
|
+
let seed = mnemonicToSeedSync(this.mnemonic);
|
|
288
|
+
let hdNode = deriveHdPrivateNodeFromSeed(crypto, seed);
|
|
289
|
+
if (!hdNode.valid) {
|
|
290
|
+
throw Error("Invalid private key derived from mnemonic seed");
|
|
291
|
+
}
|
|
292
|
+
let result = [];
|
|
293
|
+
for (const path of hdPaths) {
|
|
294
|
+
if (path === "m") {
|
|
295
|
+
throw Error("Storing or sharing of parent public key may lead to loss of funds. Storing or sharing *root* parent public keys is strongly discouraged, although all parent keys have risk. See: https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki#implications");
|
|
296
|
+
}
|
|
297
|
+
let childNode = deriveHdPath(crypto, hdNode, path);
|
|
298
|
+
if (typeof childNode === "string") {
|
|
299
|
+
throw Error(childNode);
|
|
300
|
+
}
|
|
301
|
+
let node = deriveHdPublicNode(crypto, childNode);
|
|
302
|
+
if (typeof node === "string") {
|
|
303
|
+
throw Error(node);
|
|
304
|
+
}
|
|
305
|
+
let xPubKey = encodeHdPublicKey(crypto, {
|
|
306
|
+
network: this.network,
|
|
307
|
+
node: node,
|
|
308
|
+
});
|
|
309
|
+
let key = new XPubKey({
|
|
310
|
+
path: path,
|
|
311
|
+
xPubKey: xPubKey,
|
|
312
|
+
});
|
|
313
|
+
result.push(await key.ready());
|
|
314
|
+
}
|
|
315
|
+
return await Promise.all(result).then((result) => {
|
|
316
|
+
return result;
|
|
317
|
+
});
|
|
318
|
+
}
|
|
243
319
|
// Initialize a watch only wallet from a cash addr
|
|
244
320
|
async watchOnly(address) {
|
|
245
321
|
this.walletType = WalletTypeEnum.Watch;
|
|
@@ -268,8 +344,7 @@ export class Wallet extends BaseWallet {
|
|
|
268
344
|
checkWifNetwork(secret, this.network);
|
|
269
345
|
const sha256 = await sha256Promise;
|
|
270
346
|
let wifResult = decodePrivateKeyWif(sha256, secret);
|
|
271
|
-
|
|
272
|
-
if (hasError) {
|
|
347
|
+
if (typeof wifResult === "string") {
|
|
273
348
|
throw Error(wifResult);
|
|
274
349
|
}
|
|
275
350
|
let resultData = wifResult;
|
|
@@ -334,6 +409,10 @@ export class Wallet extends BaseWallet {
|
|
|
334
409
|
]);
|
|
335
410
|
return bchUtxos.filter((bchutxo) => slpOutpoints.findIndex((slpOutpoint) => `${bchutxo.txid}:${bchutxo.vout}` === slpOutpoint) === -1);
|
|
336
411
|
}
|
|
412
|
+
else if (this._slpSemiAware) {
|
|
413
|
+
const bchUtxos = await this.provider.getUtxos(address);
|
|
414
|
+
return bchUtxos.filter((bchutxo) => bchutxo.satoshis > DUST_UTXO_THRESHOLD);
|
|
415
|
+
}
|
|
337
416
|
else {
|
|
338
417
|
return await this.provider.getUtxos(address);
|
|
339
418
|
}
|
|
@@ -371,7 +450,7 @@ export class Wallet extends BaseWallet {
|
|
|
371
450
|
// Gets balance from fulcrum
|
|
372
451
|
async getBalanceFromProvider() {
|
|
373
452
|
// TODO not sure why getting the balance from a provider doesn't work
|
|
374
|
-
if (this._slpAware) {
|
|
453
|
+
if (this._slpAware || this._slpSemiAware) {
|
|
375
454
|
return await this.getBalanceFromUtxos();
|
|
376
455
|
}
|
|
377
456
|
else {
|
|
@@ -451,6 +530,9 @@ export class Wallet extends BaseWallet {
|
|
|
451
530
|
if (params.options && params.options.slpAware) {
|
|
452
531
|
this._slpAware = true;
|
|
453
532
|
}
|
|
533
|
+
if (params.options && params.options.slpSemiAware) {
|
|
534
|
+
this._slpSemiAware = true;
|
|
535
|
+
}
|
|
454
536
|
// get inputs
|
|
455
537
|
let utxos;
|
|
456
538
|
if (params.options && params.options.utxoIds) {
|
|
@@ -643,6 +725,9 @@ export class Wallet extends BaseWallet {
|
|
|
643
725
|
if (options && options.slpAware) {
|
|
644
726
|
this._slpAware = true;
|
|
645
727
|
}
|
|
728
|
+
if (options && options.slpSemiAware) {
|
|
729
|
+
this._slpSemiAware = true;
|
|
730
|
+
}
|
|
646
731
|
// get inputs from options or query all inputs
|
|
647
732
|
let utxos;
|
|
648
733
|
if (options && options.utxoIds) {
|