@btc-vision/transaction 1.7.31 → 1.8.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AUDIT/README.md +9 -0
- package/CHANGELOG.md +5 -0
- package/README.md +62 -18
- package/SECURITY.md +71 -0
- package/browser/deterministic/ExtendedAddressMap.d.ts +17 -0
- package/browser/index.js +448 -362
- package/browser/keypair/Address.d.ts +3 -1
- package/browser/mnemonic/Mnemonic.d.ts +1 -1
- package/browser/noble-curves.js +1087 -1116
- package/browser/noble-hashes.js +25 -25
- package/browser/opnet.d.ts +1 -0
- package/browser/transaction/browser/WalletNetworks.d.ts +3 -3
- package/browser/transaction/browser/types/Unisat.d.ts +2 -2
- package/browser/vendors.js +950 -911
- package/build/deterministic/ExtendedAddressMap.d.ts +17 -0
- package/build/deterministic/ExtendedAddressMap.js +60 -0
- package/build/keypair/Address.d.ts +3 -1
- package/build/keypair/Address.js +30 -10
- package/build/mnemonic/Mnemonic.d.ts +1 -1
- package/build/mnemonic/Mnemonic.js +2 -2
- package/build/opnet.d.ts +1 -0
- package/build/opnet.js +1 -0
- package/build/transaction/browser/WalletNetworks.d.ts +3 -3
- package/build/transaction/browser/WalletNetworks.js +3 -3
- package/build/transaction/browser/extensions/UnisatSigner.js +3 -3
- package/build/transaction/browser/types/Unisat.d.ts +2 -2
- package/build/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +13 -13
- package/src/deterministic/ExtendedAddressMap.ts +83 -0
- package/src/keypair/Address.ts +53 -9
- package/src/mnemonic/Mnemonic.ts +2 -2
- package/src/opnet.ts +1 -0
- package/src/transaction/browser/WalletNetworks.ts +3 -3
- package/src/transaction/browser/extensions/UnisatSigner.ts +3 -3
- package/src/transaction/browser/types/Unisat.ts +2 -2
- package/test/derivePath.test.ts +30 -29
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Address } from '../keypair/Address.js';
|
|
2
|
+
export declare class ExtendedAddressMap<V> {
|
|
3
|
+
private items;
|
|
4
|
+
constructor(iterable?: ReadonlyArray<readonly [Address, V]> | null);
|
|
5
|
+
get size(): number;
|
|
6
|
+
set(key: Address, value: V): this;
|
|
7
|
+
get(key: Address): V | undefined;
|
|
8
|
+
has(key: Address): boolean;
|
|
9
|
+
delete(key: Address): boolean;
|
|
10
|
+
clear(): void;
|
|
11
|
+
indexOf(address: Address): number;
|
|
12
|
+
entries(): IterableIterator<[Address, V]>;
|
|
13
|
+
keys(): IterableIterator<Address>;
|
|
14
|
+
values(): IterableIterator<V>;
|
|
15
|
+
forEach(callback: (value: V, key: Address, map: ExtendedAddressMap<V>) => void, thisArg?: unknown): void;
|
|
16
|
+
[Symbol.iterator](): IterableIterator<[Address, V]>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { Address } from '../keypair/Address.js';
|
|
2
|
+
import { FastMap } from './FastMap.js';
|
|
3
|
+
export class ExtendedAddressMap {
|
|
4
|
+
constructor(iterable) {
|
|
5
|
+
this.items = new FastMap();
|
|
6
|
+
if (iterable) {
|
|
7
|
+
for (const [key, value] of iterable) {
|
|
8
|
+
this.set(key, value);
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
get size() {
|
|
13
|
+
return this.items.size;
|
|
14
|
+
}
|
|
15
|
+
set(key, value) {
|
|
16
|
+
const keyBigInt = key.tweakedToBigInt();
|
|
17
|
+
this.items.set(keyBigInt, value);
|
|
18
|
+
return this;
|
|
19
|
+
}
|
|
20
|
+
get(key) {
|
|
21
|
+
return this.items.get(key.tweakedToBigInt());
|
|
22
|
+
}
|
|
23
|
+
has(key) {
|
|
24
|
+
return this.items.has(key.tweakedToBigInt());
|
|
25
|
+
}
|
|
26
|
+
delete(key) {
|
|
27
|
+
const keyBigInt = key.tweakedToBigInt();
|
|
28
|
+
return this.items.delete(keyBigInt);
|
|
29
|
+
}
|
|
30
|
+
clear() {
|
|
31
|
+
this.items.clear();
|
|
32
|
+
}
|
|
33
|
+
indexOf(address) {
|
|
34
|
+
return this.items.indexOf(address.tweakedToBigInt());
|
|
35
|
+
}
|
|
36
|
+
*entries() {
|
|
37
|
+
for (const [keyBigInt, value] of this.items.entries()) {
|
|
38
|
+
yield [Address.fromBigInt(keyBigInt), value];
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
*keys() {
|
|
42
|
+
for (const keyBigInt of this.items.keys()) {
|
|
43
|
+
yield Address.fromBigInt(keyBigInt);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
*values() {
|
|
47
|
+
for (const value of this.items.values()) {
|
|
48
|
+
yield value;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
forEach(callback, thisArg) {
|
|
52
|
+
for (const [keyBigInt, value] of this.items.entries()) {
|
|
53
|
+
const key = Address.fromBigInt(0n, keyBigInt);
|
|
54
|
+
callback.call(thisArg, value, key, this);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
*[Symbol.iterator]() {
|
|
58
|
+
yield* this.entries();
|
|
59
|
+
}
|
|
60
|
+
}
|
|
@@ -16,8 +16,9 @@ export declare class Address extends Uint8Array {
|
|
|
16
16
|
static fromString(mldsaPublicKey: string, legacyPublicKey?: string): Address;
|
|
17
17
|
static wrap(bytes: ArrayLike<number>): Address;
|
|
18
18
|
static uncompressedToCompressed(publicKey: ArrayLike<number>): Buffer;
|
|
19
|
-
static fromBigInt(value: bigint): Address;
|
|
19
|
+
static fromBigInt(value: bigint, tweakedValue?: bigint): Address;
|
|
20
20
|
static fromUint64Array(w0: bigint, w1: bigint, w2: bigint, w3: bigint): Address;
|
|
21
|
+
private static bigintToUint8Array;
|
|
21
22
|
toUint64Array(): [bigint, bigint, bigint, bigint];
|
|
22
23
|
isDead(): boolean;
|
|
23
24
|
toHex(): string;
|
|
@@ -30,6 +31,7 @@ export declare class Address extends Uint8Array {
|
|
|
30
31
|
toHybridPublicKeyBuffer(): Buffer;
|
|
31
32
|
originalPublicKeyBuffer(): Buffer;
|
|
32
33
|
toBigInt(): bigint;
|
|
34
|
+
tweakedToBigInt(): bigint;
|
|
33
35
|
equals(a: Address): boolean;
|
|
34
36
|
lessThan(a: Address): boolean;
|
|
35
37
|
greaterThan(a: Address): boolean;
|
package/build/keypair/Address.js
CHANGED
|
@@ -9,7 +9,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (
|
|
|
9
9
|
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
10
10
|
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
11
11
|
};
|
|
12
|
-
var _Address_p2tr, _Address_p2op, _Address_network, _Address_originalPublicKey, _Address_keyPair, _Address_uncompressed, _Address_tweakedUncompressed, _Address_p2wda, _Address_mldsaPublicKey, _Address_cachedBigInt, _Address_cachedUint64Array, _Address_originalMDLSAPublicKey, _Address_mldsaLevel, _Address_pendingLegacyKey, _Address_legacyProcessed, _Address_legacyPublicKey;
|
|
12
|
+
var _Address_p2tr, _Address_p2op, _Address_network, _Address_originalPublicKey, _Address_keyPair, _Address_uncompressed, _Address_tweakedUncompressed, _Address_p2wda, _Address_mldsaPublicKey, _Address_cachedBigInt, _Address_cachedBigIntTweaked, _Address_cachedUint64Array, _Address_originalMDLSAPublicKey, _Address_mldsaLevel, _Address_pendingLegacyKey, _Address_legacyProcessed, _Address_legacyPublicKey;
|
|
13
13
|
import { decompressPublicKey, toXOnly } from '@btc-vision/bitcoin';
|
|
14
14
|
import { ADDRESS_BYTE_LENGTH } from '../utils/lengths.js';
|
|
15
15
|
import { AddressVerificator } from './AddressVerificator.js';
|
|
@@ -32,6 +32,7 @@ export class Address extends Uint8Array {
|
|
|
32
32
|
_Address_p2wda.set(this, void 0);
|
|
33
33
|
_Address_mldsaPublicKey.set(this, void 0);
|
|
34
34
|
_Address_cachedBigInt.set(this, void 0);
|
|
35
|
+
_Address_cachedBigIntTweaked.set(this, void 0);
|
|
35
36
|
_Address_cachedUint64Array.set(this, void 0);
|
|
36
37
|
_Address_originalMDLSAPublicKey.set(this, void 0);
|
|
37
38
|
_Address_mldsaLevel.set(this, void 0);
|
|
@@ -118,14 +119,10 @@ export class Address extends Uint8Array {
|
|
|
118
119
|
compressed.set(x, 1);
|
|
119
120
|
return compressed;
|
|
120
121
|
}
|
|
121
|
-
static fromBigInt(value) {
|
|
122
|
-
const
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
view.setBigUint64(8, (value >> 128n) & 0xffffffffffffffffn, false);
|
|
126
|
-
view.setBigUint64(16, (value >> 64n) & 0xffffffffffffffffn, false);
|
|
127
|
-
view.setBigUint64(24, value & 0xffffffffffffffffn, false);
|
|
128
|
-
return new Address(buffer);
|
|
122
|
+
static fromBigInt(value, tweakedValue) {
|
|
123
|
+
const address = Address.bigintToUint8Array(value);
|
|
124
|
+
const legacyAddress = tweakedValue ? Address.bigintToUint8Array(tweakedValue) : undefined;
|
|
125
|
+
return new Address(address, legacyAddress);
|
|
129
126
|
}
|
|
130
127
|
static fromUint64Array(w0, w1, w2, w3) {
|
|
131
128
|
const buffer = new Uint8Array(32);
|
|
@@ -136,6 +133,15 @@ export class Address extends Uint8Array {
|
|
|
136
133
|
view.setBigUint64(24, w3, false);
|
|
137
134
|
return new Address(buffer);
|
|
138
135
|
}
|
|
136
|
+
static bigintToUint8Array(value) {
|
|
137
|
+
const buffer = new Uint8Array(32);
|
|
138
|
+
const view = new DataView(buffer.buffer);
|
|
139
|
+
view.setBigUint64(0, (value >> 192n) & 0xffffffffffffffffn, false);
|
|
140
|
+
view.setBigUint64(8, (value >> 128n) & 0xffffffffffffffffn, false);
|
|
141
|
+
view.setBigUint64(16, (value >> 64n) & 0xffffffffffffffffn, false);
|
|
142
|
+
view.setBigUint64(24, value & 0xffffffffffffffffn, false);
|
|
143
|
+
return buffer;
|
|
144
|
+
}
|
|
139
145
|
toUint64Array() {
|
|
140
146
|
if (__classPrivateFieldGet(this, _Address_cachedUint64Array, "f") !== undefined) {
|
|
141
147
|
return __classPrivateFieldGet(this, _Address_cachedUint64Array, "f");
|
|
@@ -223,6 +229,20 @@ export class Address extends Uint8Array {
|
|
|
223
229
|
view.getBigUint64(24, false), "f");
|
|
224
230
|
return __classPrivateFieldGet(this, _Address_cachedBigInt, "f");
|
|
225
231
|
}
|
|
232
|
+
tweakedToBigInt() {
|
|
233
|
+
if (!this.legacyPublicKey) {
|
|
234
|
+
throw new Error('Legacy public key not set');
|
|
235
|
+
}
|
|
236
|
+
if (__classPrivateFieldGet(this, _Address_cachedBigIntTweaked, "f") !== undefined) {
|
|
237
|
+
return __classPrivateFieldGet(this, _Address_cachedBigIntTweaked, "f");
|
|
238
|
+
}
|
|
239
|
+
const view = new DataView(this.legacyPublicKey.buffer, this.byteOffset, 32);
|
|
240
|
+
__classPrivateFieldSet(this, _Address_cachedBigIntTweaked, (view.getBigUint64(0, false) << 192n) |
|
|
241
|
+
(view.getBigUint64(8, false) << 128n) |
|
|
242
|
+
(view.getBigUint64(16, false) << 64n) |
|
|
243
|
+
view.getBigUint64(24, false), "f");
|
|
244
|
+
return __classPrivateFieldGet(this, _Address_cachedBigIntTweaked, "f");
|
|
245
|
+
}
|
|
226
246
|
equals(a) {
|
|
227
247
|
const b = this;
|
|
228
248
|
if (a.length !== b.length) {
|
|
@@ -434,4 +454,4 @@ export class Address extends Uint8Array {
|
|
|
434
454
|
__classPrivateFieldGet(this, _Address_legacyPublicKey, "f").set(tweakedBytes);
|
|
435
455
|
}
|
|
436
456
|
}
|
|
437
|
-
_Address_p2tr = new WeakMap(), _Address_p2op = new WeakMap(), _Address_network = new WeakMap(), _Address_originalPublicKey = new WeakMap(), _Address_keyPair = new WeakMap(), _Address_uncompressed = new WeakMap(), _Address_tweakedUncompressed = new WeakMap(), _Address_p2wda = new WeakMap(), _Address_mldsaPublicKey = new WeakMap(), _Address_cachedBigInt = new WeakMap(), _Address_cachedUint64Array = new WeakMap(), _Address_originalMDLSAPublicKey = new WeakMap(), _Address_mldsaLevel = new WeakMap(), _Address_pendingLegacyKey = new WeakMap(), _Address_legacyProcessed = new WeakMap(), _Address_legacyPublicKey = new WeakMap();
|
|
457
|
+
_Address_p2tr = new WeakMap(), _Address_p2op = new WeakMap(), _Address_network = new WeakMap(), _Address_originalPublicKey = new WeakMap(), _Address_keyPair = new WeakMap(), _Address_uncompressed = new WeakMap(), _Address_tweakedUncompressed = new WeakMap(), _Address_p2wda = new WeakMap(), _Address_mldsaPublicKey = new WeakMap(), _Address_cachedBigInt = new WeakMap(), _Address_cachedBigIntTweaked = new WeakMap(), _Address_cachedUint64Array = new WeakMap(), _Address_originalMDLSAPublicKey = new WeakMap(), _Address_mldsaLevel = new WeakMap(), _Address_pendingLegacyKey = new WeakMap(), _Address_legacyProcessed = new WeakMap(), _Address_legacyPublicKey = new WeakMap();
|
|
@@ -22,7 +22,7 @@ export declare class Mnemonic {
|
|
|
22
22
|
static generate(strength?: MnemonicStrength, passphrase?: string, network?: Network, securityLevel?: MLDSASecurityLevel): Mnemonic;
|
|
23
23
|
static validate(phrase: string): boolean;
|
|
24
24
|
derive(index?: number, account?: number, isChange?: boolean, bipStandard?: BIPStandard): Wallet;
|
|
25
|
-
|
|
25
|
+
deriveOPWallet(addressType?: AddressTypes, index?: number, account?: number, isChange?: boolean): Wallet;
|
|
26
26
|
deriveMultipleUnisat(addressType?: AddressTypes, count?: number, startIndex?: number, account?: number, isChange?: boolean): Wallet[];
|
|
27
27
|
deriveMultiple(count: number, startIndex?: number, account?: number, isChange?: boolean, bipStandard?: BIPStandard): Wallet[];
|
|
28
28
|
deriveCustomPath(classicalPath: string, quantumPath: string): Wallet;
|
|
@@ -57,7 +57,7 @@ export class Mnemonic {
|
|
|
57
57
|
}
|
|
58
58
|
return new Wallet(Buffer.from(classicalChild.privateKey).toString('hex'), Buffer.from(quantumChild.privateKey).toString('hex'), this._network, this._securityLevel, Buffer.from(this._quantumRoot.chainCode));
|
|
59
59
|
}
|
|
60
|
-
|
|
60
|
+
deriveOPWallet(addressType = AddressTypes.P2TR, index = 0, account = 0, isChange = false) {
|
|
61
61
|
let purpose;
|
|
62
62
|
switch (addressType) {
|
|
63
63
|
case AddressTypes.P2PKH:
|
|
@@ -92,7 +92,7 @@ export class Mnemonic {
|
|
|
92
92
|
deriveMultipleUnisat(addressType = AddressTypes.P2TR, count = 5, startIndex = 0, account = 0, isChange = false) {
|
|
93
93
|
const wallets = [];
|
|
94
94
|
for (let i = 0; i < count; i++) {
|
|
95
|
-
wallets.push(this.
|
|
95
|
+
wallets.push(this.deriveOPWallet(addressType, startIndex + i, account, isChange));
|
|
96
96
|
}
|
|
97
97
|
return wallets;
|
|
98
98
|
}
|
package/build/opnet.d.ts
CHANGED
|
@@ -79,6 +79,7 @@ export * from './abi/ABICoder.js';
|
|
|
79
79
|
export * from './buffer/BinaryReader.js';
|
|
80
80
|
export * from './buffer/BinaryWriter.js';
|
|
81
81
|
export * from './deterministic/AddressMap.js';
|
|
82
|
+
export * from './deterministic/ExtendedAddressMap.js';
|
|
82
83
|
export * from './deterministic/AddressSet.js';
|
|
83
84
|
export * from './deterministic/DeterministicMap.js';
|
|
84
85
|
export * from './deterministic/DeterministicSet.js';
|
package/build/opnet.js
CHANGED
|
@@ -74,6 +74,7 @@ export * from './abi/ABICoder.js';
|
|
|
74
74
|
export * from './buffer/BinaryReader.js';
|
|
75
75
|
export * from './buffer/BinaryWriter.js';
|
|
76
76
|
export * from './deterministic/AddressMap.js';
|
|
77
|
+
export * from './deterministic/ExtendedAddressMap.js';
|
|
77
78
|
export * from './deterministic/AddressSet.js';
|
|
78
79
|
export * from './deterministic/DeterministicMap.js';
|
|
79
80
|
export * from './deterministic/DeterministicSet.js';
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
export var WalletNetworks;
|
|
2
2
|
(function (WalletNetworks) {
|
|
3
|
-
WalletNetworks["
|
|
4
|
-
WalletNetworks["
|
|
5
|
-
WalletNetworks["
|
|
3
|
+
WalletNetworks["Mainnet"] = "mainnet";
|
|
4
|
+
WalletNetworks["Testnet"] = "testnet";
|
|
5
|
+
WalletNetworks["Regtest"] = "regtest";
|
|
6
6
|
})(WalletNetworks || (WalletNetworks = {}));
|
|
7
7
|
export var UnisatChainType;
|
|
8
8
|
(function (UnisatChainType) {
|
|
@@ -61,13 +61,13 @@ export class UnisatSigner extends CustomKeypair {
|
|
|
61
61
|
}
|
|
62
62
|
const network = await this.unisat.getNetwork();
|
|
63
63
|
switch (network) {
|
|
64
|
-
case WalletNetworks.
|
|
64
|
+
case WalletNetworks.Mainnet:
|
|
65
65
|
this._network = networks.bitcoin;
|
|
66
66
|
break;
|
|
67
|
-
case WalletNetworks.
|
|
67
|
+
case WalletNetworks.Testnet:
|
|
68
68
|
this._network = networks.testnet;
|
|
69
69
|
break;
|
|
70
|
-
case WalletNetworks.
|
|
70
|
+
case WalletNetworks.Regtest:
|
|
71
71
|
this._network = networks.regtest;
|
|
72
72
|
break;
|
|
73
73
|
default:
|
|
@@ -39,8 +39,8 @@ export interface PsbtSignatureOptions {
|
|
|
39
39
|
}
|
|
40
40
|
export interface Unisat {
|
|
41
41
|
web3?: Web3Provider;
|
|
42
|
-
disconnect: () => void
|
|
43
|
-
connect: () => void
|
|
42
|
+
disconnect: () => Promise<void>;
|
|
43
|
+
connect: () => Promise<void>;
|
|
44
44
|
sendBitcoin(toAddress: string, satoshis: number, options: {
|
|
45
45
|
feeRate: number;
|
|
46
46
|
memo?: string;
|