digirails 0.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/LICENSE +21 -0
- package/README.md +102 -0
- package/dist/agent.d.ts +72 -0
- package/dist/agent.d.ts.map +1 -0
- package/dist/agent.js +176 -0
- package/dist/agent.js.map +1 -0
- package/dist/config.d.ts +24 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +46 -0
- package/dist/config.js.map +1 -0
- package/dist/crypto/base58.d.ts +9 -0
- package/dist/crypto/base58.d.ts.map +1 -0
- package/dist/crypto/base58.js +107 -0
- package/dist/crypto/base58.js.map +1 -0
- package/dist/crypto/bech32.d.ts +9 -0
- package/dist/crypto/bech32.d.ts.map +1 -0
- package/dist/crypto/bech32.js +141 -0
- package/dist/crypto/bech32.js.map +1 -0
- package/dist/crypto/index.d.ts +6 -0
- package/dist/crypto/index.d.ts.map +1 -0
- package/dist/crypto/index.js +22 -0
- package/dist/crypto/index.js.map +1 -0
- package/dist/crypto/keys.d.ts +25 -0
- package/dist/crypto/keys.d.ts.map +1 -0
- package/dist/crypto/keys.js +129 -0
- package/dist/crypto/keys.js.map +1 -0
- package/dist/crypto/script.d.ts +12 -0
- package/dist/crypto/script.d.ts.map +1 -0
- package/dist/crypto/script.js +105 -0
- package/dist/crypto/script.js.map +1 -0
- package/dist/crypto/transaction.d.ts +47 -0
- package/dist/crypto/transaction.d.ts.map +1 -0
- package/dist/crypto/transaction.js +227 -0
- package/dist/crypto/transaction.js.map +1 -0
- package/dist/discovery/index.d.ts +2 -0
- package/dist/discovery/index.d.ts.map +1 -0
- package/dist/discovery/index.js +6 -0
- package/dist/discovery/index.js.map +1 -0
- package/dist/discovery/manifest_client.d.ts +9 -0
- package/dist/discovery/manifest_client.d.ts.map +1 -0
- package/dist/discovery/manifest_client.js +29 -0
- package/dist/discovery/manifest_client.js.map +1 -0
- package/dist/exceptions.d.ts +32 -0
- package/dist/exceptions.d.ts.map +1 -0
- package/dist/exceptions.js +72 -0
- package/dist/exceptions.js.map +1 -0
- package/dist/index.d.ts +31 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +135 -0
- package/dist/index.js.map +1 -0
- package/dist/models/enums.d.ts +48 -0
- package/dist/models/enums.d.ts.map +1 -0
- package/dist/models/enums.js +84 -0
- package/dist/models/enums.js.map +1 -0
- package/dist/models/index.d.ts +4 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +20 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/manifest.d.ts +327 -0
- package/dist/models/manifest.d.ts.map +1 -0
- package/dist/models/manifest.js +47 -0
- package/dist/models/manifest.js.map +1 -0
- package/dist/models/messages.d.ts +336 -0
- package/dist/models/messages.d.ts.map +1 -0
- package/dist/models/messages.js +166 -0
- package/dist/models/messages.js.map +1 -0
- package/dist/network/constants.d.ts +51 -0
- package/dist/network/constants.d.ts.map +1 -0
- package/dist/network/constants.js +63 -0
- package/dist/network/constants.js.map +1 -0
- package/dist/network/index.d.ts +3 -0
- package/dist/network/index.d.ts.map +1 -0
- package/dist/network/index.js +19 -0
- package/dist/network/index.js.map +1 -0
- package/dist/network/params.d.ts +21 -0
- package/dist/network/params.d.ts.map +1 -0
- package/dist/network/params.js +57 -0
- package/dist/network/params.js.map +1 -0
- package/dist/opreturn.d.ts +25 -0
- package/dist/opreturn.d.ts.map +1 -0
- package/dist/opreturn.js +118 -0
- package/dist/opreturn.js.map +1 -0
- package/dist/payment/buyer.d.ts +29 -0
- package/dist/payment/buyer.d.ts.map +1 -0
- package/dist/payment/buyer.js +118 -0
- package/dist/payment/buyer.js.map +1 -0
- package/dist/payment/flow.d.ts +20 -0
- package/dist/payment/flow.d.ts.map +1 -0
- package/dist/payment/flow.js +29 -0
- package/dist/payment/flow.js.map +1 -0
- package/dist/payment/index.d.ts +5 -0
- package/dist/payment/index.d.ts.map +1 -0
- package/dist/payment/index.js +13 -0
- package/dist/payment/index.js.map +1 -0
- package/dist/payment/seller.d.ts +27 -0
- package/dist/payment/seller.d.ts.map +1 -0
- package/dist/payment/seller.js +193 -0
- package/dist/payment/seller.js.map +1 -0
- package/dist/payment/verification.d.ts +8 -0
- package/dist/payment/verification.d.ts.map +1 -0
- package/dist/payment/verification.js +89 -0
- package/dist/payment/verification.js.map +1 -0
- package/dist/rpc/client.d.ts +21 -0
- package/dist/rpc/client.d.ts.map +1 -0
- package/dist/rpc/client.js +131 -0
- package/dist/rpc/client.js.map +1 -0
- package/dist/rpc/index.d.ts +2 -0
- package/dist/rpc/index.d.ts.map +1 -0
- package/dist/rpc/index.js +6 -0
- package/dist/rpc/index.js.map +1 -0
- package/dist/server.d.ts +24 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +104 -0
- package/dist/server.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +5 -0
- package/dist/version.js.map +1 -0
- package/dist/wallet/index.d.ts +4 -0
- package/dist/wallet/index.d.ts.map +1 -0
- package/dist/wallet/index.js +14 -0
- package/dist/wallet/index.js.map +1 -0
- package/dist/wallet/keystore.d.ts +32 -0
- package/dist/wallet/keystore.d.ts.map +1 -0
- package/dist/wallet/keystore.js +111 -0
- package/dist/wallet/keystore.js.map +1 -0
- package/dist/wallet/utxo.d.ts +32 -0
- package/dist/wallet/utxo.d.ts.map +1 -0
- package/dist/wallet/utxo.js +88 -0
- package/dist/wallet/utxo.js.map +1 -0
- package/dist/wallet/wallet.d.ts +52 -0
- package/dist/wallet/wallet.d.ts.map +1 -0
- package/dist/wallet/wallet.js +249 -0
- package/dist/wallet/wallet.js.map +1 -0
- package/package.json +43 -0
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Bech32 / Bech32m encoding for SegWit addresses (BIP-173 / BIP-350).
|
|
4
|
+
* DigiByte uses "dgb" (mainnet), "dgbt" (testnet), "dgbrt" (regtest) HRPs.
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.encodeSegwitAddress = encodeSegwitAddress;
|
|
8
|
+
exports.decodeSegwitAddress = decodeSegwitAddress;
|
|
9
|
+
const CHARSET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l';
|
|
10
|
+
const BECH32_CONST = 1;
|
|
11
|
+
const BECH32M_CONST = 0x2bc830a3;
|
|
12
|
+
function polymod(values) {
|
|
13
|
+
const GEN = [0x3b6a57b2, 0x26508e6d, 0x1ea119fa, 0x3d4233dd, 0x2a1462b3];
|
|
14
|
+
let chk = 1;
|
|
15
|
+
for (const v of values) {
|
|
16
|
+
const b = chk >> 25;
|
|
17
|
+
chk = ((chk & 0x1ffffff) << 5) ^ v;
|
|
18
|
+
for (let i = 0; i < 5; i++) {
|
|
19
|
+
if ((b >> i) & 1) {
|
|
20
|
+
chk ^= GEN[i];
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
return chk;
|
|
25
|
+
}
|
|
26
|
+
function hrpExpand(hrp) {
|
|
27
|
+
const ret = [];
|
|
28
|
+
for (let i = 0; i < hrp.length; i++) {
|
|
29
|
+
ret.push(hrp.charCodeAt(i) >> 5);
|
|
30
|
+
}
|
|
31
|
+
ret.push(0);
|
|
32
|
+
for (let i = 0; i < hrp.length; i++) {
|
|
33
|
+
ret.push(hrp.charCodeAt(i) & 31);
|
|
34
|
+
}
|
|
35
|
+
return ret;
|
|
36
|
+
}
|
|
37
|
+
function verifyChecksum(hrp, data) {
|
|
38
|
+
const result = polymod(hrpExpand(hrp).concat(data));
|
|
39
|
+
if (result === BECH32_CONST)
|
|
40
|
+
return BECH32_CONST;
|
|
41
|
+
if (result === BECH32M_CONST)
|
|
42
|
+
return BECH32M_CONST;
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
function createChecksum(hrp, data, spec) {
|
|
46
|
+
const values = hrpExpand(hrp).concat(data).concat([0, 0, 0, 0, 0, 0]);
|
|
47
|
+
const mod = polymod(values) ^ spec;
|
|
48
|
+
const ret = [];
|
|
49
|
+
for (let i = 0; i < 6; i++) {
|
|
50
|
+
ret.push((mod >> (5 * (5 - i))) & 31);
|
|
51
|
+
}
|
|
52
|
+
return ret;
|
|
53
|
+
}
|
|
54
|
+
function convertBits(data, fromBits, toBits, pad) {
|
|
55
|
+
let acc = 0;
|
|
56
|
+
let bits = 0;
|
|
57
|
+
const ret = [];
|
|
58
|
+
const maxv = (1 << toBits) - 1;
|
|
59
|
+
for (const value of data) {
|
|
60
|
+
if (value < 0 || value >> fromBits)
|
|
61
|
+
return null;
|
|
62
|
+
acc = (acc << fromBits) | value;
|
|
63
|
+
bits += fromBits;
|
|
64
|
+
while (bits >= toBits) {
|
|
65
|
+
bits -= toBits;
|
|
66
|
+
ret.push((acc >> bits) & maxv);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (pad) {
|
|
70
|
+
if (bits > 0) {
|
|
71
|
+
ret.push((acc << (toBits - bits)) & maxv);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
else {
|
|
75
|
+
if (bits >= fromBits)
|
|
76
|
+
return null;
|
|
77
|
+
if ((acc << (toBits - bits)) & maxv)
|
|
78
|
+
return null;
|
|
79
|
+
}
|
|
80
|
+
return ret;
|
|
81
|
+
}
|
|
82
|
+
/** Encode a SegWit address */
|
|
83
|
+
function encodeSegwitAddress(hrp, witver, witprog) {
|
|
84
|
+
const converted = convertBits(witprog, 8, 5, true);
|
|
85
|
+
if (converted === null)
|
|
86
|
+
return null;
|
|
87
|
+
const data = [witver, ...converted];
|
|
88
|
+
const spec = witver === 0 ? BECH32_CONST : BECH32M_CONST;
|
|
89
|
+
const checksum = createChecksum(hrp, data, spec);
|
|
90
|
+
const combined = data.concat(checksum);
|
|
91
|
+
let result = hrp + '1';
|
|
92
|
+
for (const d of combined) {
|
|
93
|
+
result += CHARSET[d];
|
|
94
|
+
}
|
|
95
|
+
return result;
|
|
96
|
+
}
|
|
97
|
+
/** Decode a SegWit address. Returns [witnessVersion, witnessProgram] or [null, null]. */
|
|
98
|
+
function decodeSegwitAddress(hrp, addr) {
|
|
99
|
+
const addrLower = addr.toLowerCase();
|
|
100
|
+
if (addr !== addrLower && addr !== addr.toUpperCase()) {
|
|
101
|
+
return [null, null]; // Mixed case
|
|
102
|
+
}
|
|
103
|
+
const pos = addrLower.lastIndexOf('1');
|
|
104
|
+
if (pos < 1 || pos + 7 > addrLower.length || addrLower.length > 90) {
|
|
105
|
+
return [null, null];
|
|
106
|
+
}
|
|
107
|
+
const hrpPart = addrLower.slice(0, pos);
|
|
108
|
+
if (hrpPart !== hrp) {
|
|
109
|
+
return [null, null];
|
|
110
|
+
}
|
|
111
|
+
const data = [];
|
|
112
|
+
for (let i = pos + 1; i < addrLower.length; i++) {
|
|
113
|
+
const idx = CHARSET.indexOf(addrLower[i]);
|
|
114
|
+
if (idx === -1)
|
|
115
|
+
return [null, null];
|
|
116
|
+
data.push(idx);
|
|
117
|
+
}
|
|
118
|
+
const spec = verifyChecksum(hrpPart, data);
|
|
119
|
+
if (spec === null)
|
|
120
|
+
return [null, null];
|
|
121
|
+
const witver = data[0];
|
|
122
|
+
// Witness version 0 must use Bech32, v1+ must use Bech32m
|
|
123
|
+
if (witver === 0 && spec !== BECH32_CONST)
|
|
124
|
+
return [null, null];
|
|
125
|
+
if (witver > 0 && spec !== BECH32M_CONST)
|
|
126
|
+
return [null, null];
|
|
127
|
+
const witprogValues = data.slice(1, data.length - 6);
|
|
128
|
+
const decoded = convertBits(new Uint8Array(witprogValues), 5, 8, false);
|
|
129
|
+
if (decoded === null)
|
|
130
|
+
return [null, null];
|
|
131
|
+
const witprog = new Uint8Array(decoded);
|
|
132
|
+
if (witprog.length < 2 || witprog.length > 40)
|
|
133
|
+
return [null, null];
|
|
134
|
+
if (witver === 0 && witprog.length !== 20 && witprog.length !== 32) {
|
|
135
|
+
return [null, null];
|
|
136
|
+
}
|
|
137
|
+
if (witver > 16)
|
|
138
|
+
return [null, null];
|
|
139
|
+
return [witver, witprog];
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=bech32.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bech32.js","sourceRoot":"","sources":["../../src/crypto/bech32.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/crypto/index.ts"],"names":[],"mappings":"AAAA,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./base58"), exports);
|
|
18
|
+
__exportStar(require("./bech32"), exports);
|
|
19
|
+
__exportStar(require("./keys"), exports);
|
|
20
|
+
__exportStar(require("./script"), exports);
|
|
21
|
+
__exportStar(require("./transaction"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/crypto/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,2CAAyB;AACzB,yCAAuB;AACvB,2CAAyB;AACzB,gDAA8B"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { NetworkParams } from '../network/params';
|
|
2
|
+
/** RIPEMD160(SHA256(data)) — standard Bitcoin hash160 */
|
|
3
|
+
export declare function hash160(data: Uint8Array): Uint8Array;
|
|
4
|
+
/** Double SHA-256 */
|
|
5
|
+
export declare function doubleSha256(data: Uint8Array): Uint8Array;
|
|
6
|
+
/**
|
|
7
|
+
* Generate a new keypair.
|
|
8
|
+
* @returns [privateKey (32B), compressedPubkey (33B), bech32Address]
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateKeypair(network?: NetworkParams): [Buffer, Buffer, string];
|
|
11
|
+
/** Derive compressed public key from private key */
|
|
12
|
+
export declare function privkeyToPubkey(privateKey: Uint8Array, compressed?: boolean): Buffer;
|
|
13
|
+
/** Sign data with ECDSA (returns DER-encoded signature) */
|
|
14
|
+
export declare function signData(privateKey: Uint8Array, data: Uint8Array): Uint8Array;
|
|
15
|
+
/** Derive P2WPKH (bech32) address from compressed pubkey */
|
|
16
|
+
export declare function pubkeyToP2wpkhAddress(pubkey: Uint8Array, network?: NetworkParams): string;
|
|
17
|
+
/** Derive P2PKH (legacy Base58) address from compressed pubkey */
|
|
18
|
+
export declare function pubkeyToP2pkhAddress(pubkey: Uint8Array, network?: NetworkParams): string;
|
|
19
|
+
/** Encode private key as WIF (Wallet Import Format) */
|
|
20
|
+
export declare function privkeyToWif(privateKey: Uint8Array, network?: NetworkParams, compressed?: boolean): string;
|
|
21
|
+
/** Decode WIF to [privateKey, compressed, network] */
|
|
22
|
+
export declare function wifToPrivkey(wif: string): [Buffer, boolean, NetworkParams];
|
|
23
|
+
/** Validate a DigiByte address (bech32 or legacy). Returns true if valid. */
|
|
24
|
+
export declare function validateAddress(address: string, network?: NetworkParams): boolean;
|
|
25
|
+
//# sourceMappingURL=keys.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../src/crypto/keys.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,aAAa,EAA6B,MAAM,mBAAmB,CAAC;AAE7E,yDAAyD;AACzD,wBAAgB,OAAO,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAEpD;AAED,qBAAqB;AACrB,wBAAgB,YAAY,CAAC,IAAI,EAAE,UAAU,GAAG,UAAU,CAEzD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAAC,OAAO,GAAE,aAAuB,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAK1F;AAED,oDAAoD;AACpD,wBAAgB,eAAe,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,UAAO,GAAG,MAAM,CAEjF;AAED,2DAA2D;AAC3D,wBAAgB,QAAQ,CAAC,UAAU,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,CAG7E;AAED,4DAA4D;AAC5D,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,GAAE,aAAuB,GAAG,MAAM,CAKlG;AAED,kEAAkE;AAClE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,GAAE,aAAuB,GAAG,MAAM,CAMjG;AAED,uDAAuD;AACvD,wBAAgB,YAAY,CAC1B,UAAU,EAAE,UAAU,EACtB,OAAO,GAAE,aAAuB,EAChC,UAAU,UAAO,GAChB,MAAM,CAQR;AAED,sDAAsD;AACtD,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,aAAa,CAAC,CA4B1E;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,aAAa,GAAG,OAAO,CAsBjF"}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hash160 = hash160;
|
|
4
|
+
exports.doubleSha256 = doubleSha256;
|
|
5
|
+
exports.generateKeypair = generateKeypair;
|
|
6
|
+
exports.privkeyToPubkey = privkeyToPubkey;
|
|
7
|
+
exports.signData = signData;
|
|
8
|
+
exports.pubkeyToP2wpkhAddress = pubkeyToP2wpkhAddress;
|
|
9
|
+
exports.pubkeyToP2pkhAddress = pubkeyToP2pkhAddress;
|
|
10
|
+
exports.privkeyToWif = privkeyToWif;
|
|
11
|
+
exports.wifToPrivkey = wifToPrivkey;
|
|
12
|
+
exports.validateAddress = validateAddress;
|
|
13
|
+
/**
|
|
14
|
+
* Key generation, address derivation, and WIF encoding for DigiByte.
|
|
15
|
+
* Uses @noble/curves/secp256k1 for elliptic curve operations.
|
|
16
|
+
*/
|
|
17
|
+
const secp256k1_1 = require("@noble/curves/secp256k1");
|
|
18
|
+
const sha256_1 = require("@noble/hashes/sha256");
|
|
19
|
+
const ripemd160_1 = require("@noble/hashes/ripemd160");
|
|
20
|
+
const crypto_1 = require("crypto");
|
|
21
|
+
const bech32_1 = require("./bech32");
|
|
22
|
+
const base58_1 = require("./base58");
|
|
23
|
+
const params_1 = require("../network/params");
|
|
24
|
+
/** RIPEMD160(SHA256(data)) — standard Bitcoin hash160 */
|
|
25
|
+
function hash160(data) {
|
|
26
|
+
return (0, ripemd160_1.ripemd160)((0, sha256_1.sha256)(data));
|
|
27
|
+
}
|
|
28
|
+
/** Double SHA-256 */
|
|
29
|
+
function doubleSha256(data) {
|
|
30
|
+
return (0, sha256_1.sha256)((0, sha256_1.sha256)(data));
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Generate a new keypair.
|
|
34
|
+
* @returns [privateKey (32B), compressedPubkey (33B), bech32Address]
|
|
35
|
+
*/
|
|
36
|
+
function generateKeypair(network = params_1.MAINNET) {
|
|
37
|
+
const privkey = (0, crypto_1.randomBytes)(32);
|
|
38
|
+
const pubkey = Buffer.from(secp256k1_1.secp256k1.getPublicKey(privkey, true));
|
|
39
|
+
const address = pubkeyToP2wpkhAddress(pubkey, network);
|
|
40
|
+
return [privkey, pubkey, address];
|
|
41
|
+
}
|
|
42
|
+
/** Derive compressed public key from private key */
|
|
43
|
+
function privkeyToPubkey(privateKey, compressed = true) {
|
|
44
|
+
return Buffer.from(secp256k1_1.secp256k1.getPublicKey(privateKey, compressed));
|
|
45
|
+
}
|
|
46
|
+
/** Sign data with ECDSA (returns DER-encoded signature) */
|
|
47
|
+
function signData(privateKey, data) {
|
|
48
|
+
const sig = secp256k1_1.secp256k1.sign(data, privateKey, { lowS: true });
|
|
49
|
+
return sig.toDERRawBytes();
|
|
50
|
+
}
|
|
51
|
+
/** Derive P2WPKH (bech32) address from compressed pubkey */
|
|
52
|
+
function pubkeyToP2wpkhAddress(pubkey, network = params_1.MAINNET) {
|
|
53
|
+
const keyhash = hash160(pubkey);
|
|
54
|
+
const addr = (0, bech32_1.encodeSegwitAddress)(network.bech32Hrp, 0, keyhash);
|
|
55
|
+
if (!addr)
|
|
56
|
+
throw new Error('Failed to encode bech32 address');
|
|
57
|
+
return addr;
|
|
58
|
+
}
|
|
59
|
+
/** Derive P2PKH (legacy Base58) address from compressed pubkey */
|
|
60
|
+
function pubkeyToP2pkhAddress(pubkey, network = params_1.MAINNET) {
|
|
61
|
+
const keyhash = hash160(pubkey);
|
|
62
|
+
const payload = Buffer.alloc(21);
|
|
63
|
+
payload[0] = network.pubkeyVersion;
|
|
64
|
+
payload.set(keyhash, 1);
|
|
65
|
+
return (0, base58_1.b58encodeCheck)(payload);
|
|
66
|
+
}
|
|
67
|
+
/** Encode private key as WIF (Wallet Import Format) */
|
|
68
|
+
function privkeyToWif(privateKey, network = params_1.MAINNET, compressed = true) {
|
|
69
|
+
const payload = Buffer.alloc(compressed ? 34 : 33);
|
|
70
|
+
payload[0] = network.wifVersion;
|
|
71
|
+
payload.set(privateKey, 1);
|
|
72
|
+
if (compressed) {
|
|
73
|
+
payload[33] = 0x01;
|
|
74
|
+
}
|
|
75
|
+
return (0, base58_1.b58encodeCheck)(payload);
|
|
76
|
+
}
|
|
77
|
+
/** Decode WIF to [privateKey, compressed, network] */
|
|
78
|
+
function wifToPrivkey(wif) {
|
|
79
|
+
const payload = (0, base58_1.b58decodeCheck)(wif);
|
|
80
|
+
const version = payload[0];
|
|
81
|
+
let network;
|
|
82
|
+
if (version === params_1.MAINNET.wifVersion) {
|
|
83
|
+
network = params_1.MAINNET;
|
|
84
|
+
}
|
|
85
|
+
else if (version === params_1.TESTNET.wifVersion) {
|
|
86
|
+
// Testnet and regtest share the same WIF version
|
|
87
|
+
network = params_1.TESTNET;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
throw new Error(`Unknown WIF version: 0x${version.toString(16)}`);
|
|
91
|
+
}
|
|
92
|
+
let privateKey;
|
|
93
|
+
let compressed;
|
|
94
|
+
if (payload.length === 34 && payload[33] === 0x01) {
|
|
95
|
+
compressed = true;
|
|
96
|
+
privateKey = Buffer.from(payload.slice(1, 33));
|
|
97
|
+
}
|
|
98
|
+
else if (payload.length === 33) {
|
|
99
|
+
compressed = false;
|
|
100
|
+
privateKey = Buffer.from(payload.slice(1, 33));
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
throw new Error('Invalid WIF key length');
|
|
104
|
+
}
|
|
105
|
+
return [privateKey, compressed, network];
|
|
106
|
+
}
|
|
107
|
+
/** Validate a DigiByte address (bech32 or legacy). Returns true if valid. */
|
|
108
|
+
function validateAddress(address, network) {
|
|
109
|
+
const networks = network ? [network] : [params_1.MAINNET, params_1.TESTNET, params_1.REGTEST];
|
|
110
|
+
for (const net of networks) {
|
|
111
|
+
// Try bech32
|
|
112
|
+
const [witver, witprog] = (0, bech32_1.decodeSegwitAddress)(net.bech32Hrp, address);
|
|
113
|
+
if (witver !== null && witprog !== null) {
|
|
114
|
+
return true;
|
|
115
|
+
}
|
|
116
|
+
// Try legacy P2PKH
|
|
117
|
+
try {
|
|
118
|
+
const payload = (0, base58_1.b58decodeCheck)(address);
|
|
119
|
+
if (payload.length === 21 && payload[0] === net.pubkeyVersion) {
|
|
120
|
+
return true;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
catch {
|
|
124
|
+
// Not valid base58check
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
return false;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=keys.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"keys.js","sourceRoot":"","sources":["../../src/crypto/keys.ts"],"names":[],"mappings":";;AAaA,0BAEC;AAGD,oCAEC;AAMD,0CAKC;AAGD,0CAEC;AAGD,4BAGC;AAGD,sDAKC;AAGD,oDAMC;AAGD,oCAYC;AAGD,oCA4BC;AAGD,0CAsBC;AAlID;;;GAGG;AACH,uDAAoD;AACpD,iDAA8C;AAC9C,uDAAoD;AACpD,mCAAqC;AACrC,qCAAoE;AACpE,qCAA0D;AAC1D,8CAA6E;AAE7E,yDAAyD;AACzD,SAAgB,OAAO,CAAC,IAAgB;IACtC,OAAO,IAAA,qBAAS,EAAC,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,CAAC;AACjC,CAAC;AAED,qBAAqB;AACrB,SAAgB,YAAY,CAAC,IAAgB;IAC3C,OAAO,IAAA,eAAM,EAAC,IAAA,eAAM,EAAC,IAAI,CAAC,CAAC,CAAC;AAC9B,CAAC;AAED;;;GAGG;AACH,SAAgB,eAAe,CAAC,UAAyB,gBAAO;IAC9D,MAAM,OAAO,GAAG,IAAA,oBAAW,EAAC,EAAE,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,qBAAS,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAClE,MAAM,OAAO,GAAG,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvD,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AACpC,CAAC;AAED,oDAAoD;AACpD,SAAgB,eAAe,CAAC,UAAsB,EAAE,UAAU,GAAG,IAAI;IACvE,OAAO,MAAM,CAAC,IAAI,CAAC,qBAAS,CAAC,YAAY,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC,CAAC;AACrE,CAAC;AAED,2DAA2D;AAC3D,SAAgB,QAAQ,CAAC,UAAsB,EAAE,IAAgB;IAC/D,MAAM,GAAG,GAAG,qBAAS,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,OAAO,GAAG,CAAC,aAAa,EAAE,CAAC;AAC7B,CAAC;AAED,4DAA4D;AAC5D,SAAgB,qBAAqB,CAAC,MAAkB,EAAE,UAAyB,gBAAO;IACxF,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,IAAA,4BAAmB,EAAC,OAAO,CAAC,SAAS,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC;IAChE,IAAI,CAAC,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC9D,OAAO,IAAI,CAAC;AACd,CAAC;AAED,kEAAkE;AAClE,SAAgB,oBAAoB,CAAC,MAAkB,EAAE,UAAyB,gBAAO;IACvF,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACjC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,aAAa,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACxB,OAAO,IAAA,uBAAc,EAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,uDAAuD;AACvD,SAAgB,YAAY,CAC1B,UAAsB,EACtB,UAAyB,gBAAO,EAChC,UAAU,GAAG,IAAI;IAEjB,MAAM,OAAO,GAAG,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IACnD,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAChC,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;IAC3B,IAAI,UAAU,EAAE,CAAC;QACf,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACrB,CAAC;IACD,OAAO,IAAA,uBAAc,EAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,sDAAsD;AACtD,SAAgB,YAAY,CAAC,GAAW;IACtC,MAAM,OAAO,GAAG,IAAA,uBAAc,EAAC,GAAG,CAAC,CAAC;IAEpC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAC3B,IAAI,OAAsB,CAAC;IAC3B,IAAI,OAAO,KAAK,gBAAO,CAAC,UAAU,EAAE,CAAC;QACnC,OAAO,GAAG,gBAAO,CAAC;IACpB,CAAC;SAAM,IAAI,OAAO,KAAK,gBAAO,CAAC,UAAU,EAAE,CAAC;QAC1C,iDAAiD;QACjD,OAAO,GAAG,gBAAO,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,0BAA0B,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IACpE,CAAC;IAED,IAAI,UAAkB,CAAC;IACvB,IAAI,UAAmB,CAAC;IAExB,IAAI,OAAO,CAAC,MAAM,KAAK,EAAE,IAAI,OAAO,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC;QAClD,UAAU,GAAG,IAAI,CAAC;QAClB,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACjC,UAAU,GAAG,KAAK,CAAC;QACnB,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,KAAK,CAAC,wBAAwB,CAAC,CAAC;IAC5C,CAAC;IAED,OAAO,CAAC,UAAU,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;AAC3C,CAAC;AAED,6EAA6E;AAC7E,SAAgB,eAAe,CAAC,OAAe,EAAE,OAAuB;IACtE,MAAM,QAAQ,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,gBAAO,EAAE,gBAAO,EAAE,gBAAO,CAAC,CAAC;IAEnE,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;QAC3B,aAAa;QACb,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAA,4BAAmB,EAAC,GAAG,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QACtE,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;YACxC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAA,uBAAc,EAAC,OAAO,CAAC,CAAC;YACxC,IAAI,OAAO,CAAC,MAAM,KAAK,EAAE,IAAI,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,aAAa,EAAE,CAAC;gBAC9D,OAAO,IAAI,CAAC;YACd,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,wBAAwB;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { NetworkParams } from '../network/params';
|
|
2
|
+
/** Build P2WPKH scriptPubKey: OP_0 <20-byte-keyhash> */
|
|
3
|
+
export declare function p2wpkhScriptPubkey(keyhash: Uint8Array): Buffer;
|
|
4
|
+
/** Build P2PKH scriptPubKey: OP_DUP OP_HASH160 <20-byte-keyhash> OP_EQUALVERIFY OP_CHECKSIG */
|
|
5
|
+
export declare function p2pkhScriptPubkey(keyhash: Uint8Array): Buffer;
|
|
6
|
+
/** Build OP_RETURN script: OP_RETURN <data> */
|
|
7
|
+
export declare function opReturnScript(data: Uint8Array): Buffer;
|
|
8
|
+
/** Convert a DigiByte address to its scriptPubKey */
|
|
9
|
+
export declare function addressToScriptPubkey(address: string, network?: NetworkParams): Buffer;
|
|
10
|
+
/** Extract the keyhash from a P2WPKH or P2PKH scriptPubKey */
|
|
11
|
+
export declare function scriptPubkeyToKeyhash(scriptPubkey: Uint8Array): Uint8Array;
|
|
12
|
+
//# sourceMappingURL=script.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script.d.ts","sourceRoot":"","sources":["../../src/crypto/script.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAW,MAAM,mBAAmB,CAAC;AAU3D,wDAAwD;AACxD,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAS9D;AAED,+FAA+F;AAC/F,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,CAY7D;AAED,+CAA+C;AAC/C,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CAcvD;AAED,qDAAqD;AACrD,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,aAAuB,GAAG,MAAM,CA6B/F;AAED,8DAA8D;AAC9D,wBAAgB,qBAAqB,CAAC,YAAY,EAAE,UAAU,GAAG,UAAU,CAmB1E"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.p2wpkhScriptPubkey = p2wpkhScriptPubkey;
|
|
4
|
+
exports.p2pkhScriptPubkey = p2pkhScriptPubkey;
|
|
5
|
+
exports.opReturnScript = opReturnScript;
|
|
6
|
+
exports.addressToScriptPubkey = addressToScriptPubkey;
|
|
7
|
+
exports.scriptPubkeyToKeyhash = scriptPubkeyToKeyhash;
|
|
8
|
+
const bech32_1 = require("./bech32");
|
|
9
|
+
const base58_1 = require("./base58");
|
|
10
|
+
const params_1 = require("../network/params");
|
|
11
|
+
// Opcodes
|
|
12
|
+
const OP_0 = 0x00;
|
|
13
|
+
const OP_RETURN = 0x6a;
|
|
14
|
+
const OP_DUP = 0x76;
|
|
15
|
+
const OP_HASH160 = 0xa9;
|
|
16
|
+
const OP_EQUALVERIFY = 0x88;
|
|
17
|
+
const OP_CHECKSIG = 0xac;
|
|
18
|
+
/** Build P2WPKH scriptPubKey: OP_0 <20-byte-keyhash> */
|
|
19
|
+
function p2wpkhScriptPubkey(keyhash) {
|
|
20
|
+
if (keyhash.length !== 20) {
|
|
21
|
+
throw new Error('P2WPKH keyhash must be 20 bytes');
|
|
22
|
+
}
|
|
23
|
+
const script = Buffer.alloc(22);
|
|
24
|
+
script[0] = OP_0;
|
|
25
|
+
script[1] = 0x14; // push 20 bytes
|
|
26
|
+
script.set(keyhash, 2);
|
|
27
|
+
return script;
|
|
28
|
+
}
|
|
29
|
+
/** Build P2PKH scriptPubKey: OP_DUP OP_HASH160 <20-byte-keyhash> OP_EQUALVERIFY OP_CHECKSIG */
|
|
30
|
+
function p2pkhScriptPubkey(keyhash) {
|
|
31
|
+
if (keyhash.length !== 20) {
|
|
32
|
+
throw new Error('P2PKH keyhash must be 20 bytes');
|
|
33
|
+
}
|
|
34
|
+
const script = Buffer.alloc(25);
|
|
35
|
+
script[0] = OP_DUP;
|
|
36
|
+
script[1] = OP_HASH160;
|
|
37
|
+
script[2] = 0x14; // push 20 bytes
|
|
38
|
+
script.set(keyhash, 3);
|
|
39
|
+
script[23] = OP_EQUALVERIFY;
|
|
40
|
+
script[24] = OP_CHECKSIG;
|
|
41
|
+
return script;
|
|
42
|
+
}
|
|
43
|
+
/** Build OP_RETURN script: OP_RETURN <data> */
|
|
44
|
+
function opReturnScript(data) {
|
|
45
|
+
if (data.length > 80) {
|
|
46
|
+
throw new Error(`OP_RETURN data exceeds 80 bytes: ${data.length}`);
|
|
47
|
+
}
|
|
48
|
+
let pushLen;
|
|
49
|
+
if (data.length <= 75) {
|
|
50
|
+
pushLen = Buffer.from([data.length]);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
// OP_PUSHDATA1
|
|
54
|
+
pushLen = Buffer.from([0x4c, data.length]);
|
|
55
|
+
}
|
|
56
|
+
return Buffer.concat([Buffer.from([OP_RETURN]), pushLen, data]);
|
|
57
|
+
}
|
|
58
|
+
/** Convert a DigiByte address to its scriptPubKey */
|
|
59
|
+
function addressToScriptPubkey(address, network = params_1.MAINNET) {
|
|
60
|
+
// Try bech32 (P2WPKH)
|
|
61
|
+
const [witver, witprog] = (0, bech32_1.decodeSegwitAddress)(network.bech32Hrp, address);
|
|
62
|
+
if (witver !== null && witprog !== null) {
|
|
63
|
+
if (witver === 0 && witprog.length === 20) {
|
|
64
|
+
return p2wpkhScriptPubkey(witprog);
|
|
65
|
+
}
|
|
66
|
+
// Taproot (P2TR) — witness v1, 32-byte program
|
|
67
|
+
if (witver === 1 && witprog.length === 32) {
|
|
68
|
+
const script = Buffer.alloc(34);
|
|
69
|
+
script[0] = 0x51; // OP_1
|
|
70
|
+
script[1] = 0x20; // push 32 bytes
|
|
71
|
+
script.set(witprog, 2);
|
|
72
|
+
return script;
|
|
73
|
+
}
|
|
74
|
+
throw new Error(`Unsupported witness version ${witver}`);
|
|
75
|
+
}
|
|
76
|
+
// Try legacy P2PKH
|
|
77
|
+
try {
|
|
78
|
+
const payload = (0, base58_1.b58decodeCheck)(address);
|
|
79
|
+
if (payload.length === 21 && payload[0] === network.pubkeyVersion) {
|
|
80
|
+
return p2pkhScriptPubkey(payload.slice(1));
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// Not valid base58
|
|
85
|
+
}
|
|
86
|
+
throw new Error(`Cannot convert address to scriptPubKey: ${address}`);
|
|
87
|
+
}
|
|
88
|
+
/** Extract the keyhash from a P2WPKH or P2PKH scriptPubKey */
|
|
89
|
+
function scriptPubkeyToKeyhash(scriptPubkey) {
|
|
90
|
+
// P2WPKH: OP_0 0x14 <20 bytes>
|
|
91
|
+
if (scriptPubkey.length === 22 && scriptPubkey[0] === OP_0 && scriptPubkey[1] === 0x14) {
|
|
92
|
+
return scriptPubkey.slice(2);
|
|
93
|
+
}
|
|
94
|
+
// P2PKH: OP_DUP OP_HASH160 0x14 <20 bytes> OP_EQUALVERIFY OP_CHECKSIG
|
|
95
|
+
if (scriptPubkey.length === 25 &&
|
|
96
|
+
scriptPubkey[0] === OP_DUP &&
|
|
97
|
+
scriptPubkey[1] === OP_HASH160 &&
|
|
98
|
+
scriptPubkey[2] === 0x14 &&
|
|
99
|
+
scriptPubkey[23] === OP_EQUALVERIFY &&
|
|
100
|
+
scriptPubkey[24] === OP_CHECKSIG) {
|
|
101
|
+
return scriptPubkey.slice(3, 23);
|
|
102
|
+
}
|
|
103
|
+
throw new Error('Cannot extract keyhash from scriptPubKey');
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=script.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script.js","sourceRoot":"","sources":["../../src/crypto/script.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { NetworkParams } from '../network/params';
|
|
2
|
+
/** Transaction input */
|
|
3
|
+
export interface TxInput {
|
|
4
|
+
txid: string;
|
|
5
|
+
vout: number;
|
|
6
|
+
amountSat: bigint;
|
|
7
|
+
scriptPubkey: Buffer;
|
|
8
|
+
sequence: number;
|
|
9
|
+
}
|
|
10
|
+
/** Transaction output */
|
|
11
|
+
export interface TxOutput {
|
|
12
|
+
scriptPubkey: Buffer;
|
|
13
|
+
amountSat: bigint;
|
|
14
|
+
}
|
|
15
|
+
export declare class Transaction {
|
|
16
|
+
version: number;
|
|
17
|
+
locktime: number;
|
|
18
|
+
inputs: TxInput[];
|
|
19
|
+
outputs: TxOutput[];
|
|
20
|
+
private witnesses;
|
|
21
|
+
addInput(input: TxInput): void;
|
|
22
|
+
addOutput(output: TxOutput): void;
|
|
23
|
+
addOpReturn(data: Uint8Array): void;
|
|
24
|
+
/**
|
|
25
|
+
* Sign a P2WPKH input using BIP-143.
|
|
26
|
+
*/
|
|
27
|
+
signInput(inputIndex: number, privateKey: Uint8Array): void;
|
|
28
|
+
/** Serialize the transaction in SegWit format (BIP-144) */
|
|
29
|
+
serialize(): Buffer;
|
|
30
|
+
/** Compute the transaction ID (non-witness hash, reversed) */
|
|
31
|
+
txid(): string;
|
|
32
|
+
/** Return serialized transaction as hex string */
|
|
33
|
+
hex(): string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Build a payment transaction with automatic change calculation.
|
|
37
|
+
*/
|
|
38
|
+
export declare function buildPaymentTx(params: {
|
|
39
|
+
inputs: TxInput[];
|
|
40
|
+
toAddress: string;
|
|
41
|
+
amountSat: bigint;
|
|
42
|
+
changeAddress: string;
|
|
43
|
+
feeSat?: bigint;
|
|
44
|
+
opReturnData?: Uint8Array;
|
|
45
|
+
network?: NetworkParams;
|
|
46
|
+
}): Transaction;
|
|
47
|
+
//# sourceMappingURL=transaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transaction.d.ts","sourceRoot":"","sources":["../../src/crypto/transaction.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAW,MAAM,mBAAmB,CAAC;AAI3D,wBAAwB;AACxB,MAAM,WAAW,OAAO;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,yBAAyB;AACzB,MAAM,WAAW,QAAQ;IACvB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;CACnB;AA6CD,qBAAa,WAAW;IACtB,OAAO,SAAK;IACZ,QAAQ,SAAK;IACb,MAAM,EAAE,OAAO,EAAE,CAAM;IACvB,OAAO,EAAE,QAAQ,EAAE,CAAM;IACzB,OAAO,CAAC,SAAS,CAAkB;IAEnC,QAAQ,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAK9B,SAAS,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI;IAIjC,WAAW,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI;IAOnC;;OAEG;IACH,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,IAAI;IAoE3D,2DAA2D;IAC3D,SAAS,IAAI,MAAM;IAmDnB,8DAA8D;IAC9D,IAAI,IAAI,MAAM;IA4Bd,kDAAkD;IAClD,GAAG,IAAI,MAAM;CAGd;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,UAAU,CAAC;IAC1B,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB,GAAG,WAAW,CA+Cd"}
|