@bitgo-beta/sdk-coin-kaspa 0.0.1-beta.21 → 0.0.1-beta.210
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 +224 -33
- package/dist/src/kaspa.d.ts +86 -18
- package/dist/src/kaspa.d.ts.map +1 -1
- package/dist/src/kaspa.js +119 -31
- package/dist/src/lib/constants.d.ts +38 -0
- package/dist/src/lib/constants.d.ts.map +1 -1
- package/dist/src/lib/constants.js +56 -5
- package/dist/src/lib/iface.d.ts +28 -17
- package/dist/src/lib/iface.d.ts.map +1 -1
- package/dist/src/lib/iface.js +1 -1
- package/dist/src/lib/index.d.ts +2 -0
- package/dist/src/lib/index.d.ts.map +1 -1
- package/dist/src/lib/index.js +4 -2
- package/dist/src/lib/keyPair.d.ts +6 -2
- package/dist/src/lib/keyPair.d.ts.map +1 -1
- package/dist/src/lib/keyPair.js +7 -4
- package/dist/src/lib/pskt.d.ts +257 -0
- package/dist/src/lib/pskt.d.ts.map +1 -0
- package/dist/src/lib/pskt.js +439 -0
- package/dist/src/lib/sighash.d.ts +34 -13
- package/dist/src/lib/sighash.d.ts.map +1 -1
- package/dist/src/lib/sighash.js +115 -56
- package/dist/src/lib/transaction.d.ts +94 -6
- package/dist/src/lib/transaction.d.ts.map +1 -1
- package/dist/src/lib/transaction.js +199 -21
- package/dist/src/lib/transactionBuilder.d.ts +22 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilder.js +53 -5
- package/dist/src/lib/transactionBuilderFactory.d.ts +8 -3
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
- package/dist/src/lib/transactionBuilderFactory.js +14 -4
- package/dist/src/lib/utils.d.ts +17 -3
- package/dist/src/lib/utils.d.ts.map +1 -1
- package/dist/src/lib/utils.js +45 -11
- package/dist/src/register.js +2 -2
- package/dist/test/fixtures/kaspa.fixtures.d.ts +12 -0
- package/dist/test/fixtures/kaspa.fixtures.d.ts.map +1 -1
- package/dist/test/fixtures/kaspa.fixtures.js +76 -11
- package/dist/test/unit/coin.test.js +129 -9
- package/dist/test/unit/keyPair.test.js +35 -1
- package/dist/test/unit/pskt.test.d.ts +15 -0
- package/dist/test/unit/pskt.test.d.ts.map +1 -0
- package/dist/test/unit/pskt.test.js +383 -0
- package/dist/test/unit/transaction.test.js +291 -11
- package/dist/test/unit/transactionBuilder.test.js +16 -3
- package/dist/test/unit/transactionFlow.test.js +67 -2
- package/dist/test/unit/utils.test.js +63 -4
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +6 -5
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { DefaultKeys, KeyPairOptions, Secp256k1ExtendedKeyPair } from '@bitgo-beta/sdk-core';
|
|
2
|
+
import { KaspaAddressType } from './constants';
|
|
2
3
|
export declare class KeyPair extends Secp256k1ExtendedKeyPair {
|
|
3
4
|
/**
|
|
4
5
|
* Public constructor. By default, creates a key pair with a random master seed.
|
|
@@ -15,8 +16,11 @@ export declare class KeyPair extends Secp256k1ExtendedKeyPair {
|
|
|
15
16
|
/**
|
|
16
17
|
* Get a Kaspa address from this key pair.
|
|
17
18
|
*
|
|
18
|
-
* @
|
|
19
|
+
* @param network - 'mainnet' or 'testnet' (default: 'mainnet')
|
|
20
|
+
* @param type - address type (default: SCHNORR / v0 for hot-wallet;
|
|
21
|
+
* use KaspaAddressType.ECDSA / v1 for MPC/DKLS wallets)
|
|
22
|
+
* @returns bech32-encoded Kaspa address
|
|
19
23
|
*/
|
|
20
|
-
getAddress(network?: string): string;
|
|
24
|
+
getAddress(network?: string, type?: KaspaAddressType): string;
|
|
21
25
|
}
|
|
22
26
|
//# sourceMappingURL=keyPair.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyPair.d.ts","sourceRoot":"","sources":["../../../src/lib/keyPair.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAIX,cAAc,EACd,wBAAwB,EACzB,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"keyPair.d.ts","sourceRoot":"","sources":["../../../src/lib/keyPair.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EAIX,cAAc,EACd,wBAAwB,EACzB,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAkC,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI/E,qBAAa,OAAQ,SAAQ,wBAAwB;IACnD;;;;OAIG;gBACS,MAAM,CAAC,EAAE,cAAc;IAoBnC;;;;OAIG;IACH,OAAO,IAAI,WAAW;IAOtB;;;;;;;OAOG;IACH,UAAU,CAAC,OAAO,SAAY,EAAE,IAAI,GAAE,gBAA2C,GAAG,MAAM;CAK3F"}
|
package/dist/src/lib/keyPair.js
CHANGED
|
@@ -49,13 +49,16 @@ class KeyPair extends sdk_core_1.Secp256k1ExtendedKeyPair {
|
|
|
49
49
|
/**
|
|
50
50
|
* Get a Kaspa address from this key pair.
|
|
51
51
|
*
|
|
52
|
-
* @
|
|
52
|
+
* @param network - 'mainnet' or 'testnet' (default: 'mainnet')
|
|
53
|
+
* @param type - address type (default: SCHNORR / v0 for hot-wallet;
|
|
54
|
+
* use KaspaAddressType.ECDSA / v1 for MPC/DKLS wallets)
|
|
55
|
+
* @returns bech32-encoded Kaspa address
|
|
53
56
|
*/
|
|
54
|
-
getAddress(network = 'mainnet') {
|
|
57
|
+
getAddress(network = 'mainnet', type = constants_1.KaspaAddressType.SCHNORR) {
|
|
55
58
|
const hrp = network === 'testnet' ? constants_1.TESTNET_PREFIX : constants_1.MAINNET_PREFIX;
|
|
56
59
|
const compressedPub = this.getPublicKey({ compressed: true });
|
|
57
|
-
return (0, utils_1.pubKeyToKaspaAddress)(compressedPub, hrp);
|
|
60
|
+
return (0, utils_1.pubKeyToKaspaAddress)(compressedPub, hrp, type);
|
|
58
61
|
}
|
|
59
62
|
}
|
|
60
63
|
exports.KeyPair = KeyPair;
|
|
61
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
64
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIva2V5UGFpci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFPOEI7QUFDOUIscURBQThDO0FBQzlDLG1DQUFxQztBQUNyQyxtQ0FBK0M7QUFDL0MsMkNBQStFO0FBRS9FLE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0FBRW5DLE1BQWEsT0FBUSxTQUFRLG1DQUF3QjtJQUNuRDs7OztPQUlHO0lBQ0gsWUFBWSxNQUF1QjtRQUNqQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksR0FBRyxJQUFBLG9CQUFXLEVBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsTUFBTSxHQUFHLGlCQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQUM7YUFBTSxJQUFJLElBQUEsaUJBQU0sRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsaUJBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLENBQUM7YUFBTSxJQUFJLElBQUEsdUJBQVksRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsQ0FBQzthQUFNLElBQUksSUFBQSxzQkFBVyxFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxtQ0FBd0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU87UUFDTCxPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzVELEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSCxVQUFVLENBQUMsT0FBTyxHQUFHLFNBQVMsRUFBRSxPQUF5Qiw0QkFBZ0IsQ0FBQyxPQUFPO1FBQy9FLE1BQU0sR0FBRyxHQUFHLE9BQU8sS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDLDBCQUFjLENBQUMsQ0FBQyxDQUFDLDBCQUFjLENBQUM7UUFDcEUsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxFQUFFLFVBQVUsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQzlELE9BQU8sSUFBQSw0QkFBb0IsRUFBQyxhQUFhLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0lBQ3hELENBQUM7Q0FDRjtBQW5ERCwwQkFtREMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBEZWZhdWx0S2V5cyxcbiAgaXNQcml2YXRlS2V5LFxuICBpc1B1YmxpY0tleSxcbiAgaXNTZWVkLFxuICBLZXlQYWlyT3B0aW9ucyxcbiAgU2VjcDI1NmsxRXh0ZW5kZWRLZXlQYWlyLFxufSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBiaXAzMiB9IGZyb20gJ0BiaXRnby1iZXRhL3NlY3AyNTZrMSc7XG5pbXBvcnQgeyByYW5kb21CeXRlcyB9IGZyb20gJ2NyeXB0byc7XG5pbXBvcnQgeyBwdWJLZXlUb0thc3BhQWRkcmVzcyB9IGZyb20gJy4vdXRpbHMnO1xuaW1wb3J0IHsgTUFJTk5FVF9QUkVGSVgsIFRFU1RORVRfUFJFRklYLCBLYXNwYUFkZHJlc3NUeXBlIH0gZnJvbSAnLi9jb25zdGFudHMnO1xuXG5jb25zdCBERUZBVUxUX1NFRURfU0laRV9CWVRFUyA9IDE2O1xuXG5leHBvcnQgY2xhc3MgS2V5UGFpciBleHRlbmRzIFNlY3AyNTZrMUV4dGVuZGVkS2V5UGFpciB7XG4gIC8qKlxuICAgKiBQdWJsaWMgY29uc3RydWN0b3IuIEJ5IGRlZmF1bHQsIGNyZWF0ZXMgYSBrZXkgcGFpciB3aXRoIGEgcmFuZG9tIG1hc3RlciBzZWVkLlxuICAgKlxuICAgKiBAcGFyYW0geyBLZXlQYWlyT3B0aW9ucyB9IHNvdXJjZSBFaXRoZXIgYSBtYXN0ZXIgc2VlZCwgYSBwcml2YXRlIGtleSwgb3IgYSBwdWJsaWMga2V5XG4gICAqL1xuICBjb25zdHJ1Y3Rvcihzb3VyY2U/OiBLZXlQYWlyT3B0aW9ucykge1xuICAgIHN1cGVyKHNvdXJjZSk7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgIGNvbnN0IHNlZWQgPSByYW5kb21CeXRlcyhERUZBVUxUX1NFRURfU0laRV9CWVRFUyk7XG4gICAgICB0aGlzLmhkTm9kZSA9IGJpcDMyLmZyb21TZWVkKHNlZWQpO1xuICAgIH0gZWxzZSBpZiAoaXNTZWVkKHNvdXJjZSkpIHtcbiAgICAgIHRoaXMuaGROb2RlID0gYmlwMzIuZnJvbVNlZWQoc291cmNlLnNlZWQpO1xuICAgIH0gZWxzZSBpZiAoaXNQcml2YXRlS2V5KHNvdXJjZSkpIHtcbiAgICAgIHRoaXMucmVjb3JkS2V5c0Zyb21Qcml2YXRlS2V5KHNvdXJjZS5wcnYpO1xuICAgIH0gZWxzZSBpZiAoaXNQdWJsaWNLZXkoc291cmNlKSkge1xuICAgICAgdGhpcy5yZWNvcmRLZXlzRnJvbVB1YmxpY0tleShzb3VyY2UucHViKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleSBwYWlyIG9wdGlvbnMnKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5oZE5vZGUpIHtcbiAgICAgIHRoaXMua2V5UGFpciA9IFNlY3AyNTZrMUV4dGVuZGVkS2V5UGFpci50b0tleVBhaXIodGhpcy5oZE5vZGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBEZWZhdWx0IGtleXMgZm9ybWF0IGlzIGEgcGFpciBvZiBoZXgga2V5cy5cbiAgICpcbiAgICogQHJldHVybnMgeyBEZWZhdWx0S2V5cyB9IFRoZSBrZXlzIGluIHRoZSBkZWZpbmVkIGZvcm1hdFxuICAgKi9cbiAgZ2V0S2V5cygpOiBEZWZhdWx0S2V5cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHB1YjogdGhpcy5nZXRQdWJsaWNLZXkoeyBjb21wcmVzc2VkOiB0cnVlIH0pLnRvU3RyaW5nKCdoZXgnKSxcbiAgICAgIHBydjogdGhpcy5nZXRQcml2YXRlS2V5KCk/LnRvU3RyaW5nKCdoZXgnKSxcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIEdldCBhIEthc3BhIGFkZHJlc3MgZnJvbSB0aGlzIGtleSBwYWlyLlxuICAgKlxuICAgKiBAcGFyYW0gbmV0d29yayAtICdtYWlubmV0JyBvciAndGVzdG5ldCcgKGRlZmF1bHQ6ICdtYWlubmV0JylcbiAgICogQHBhcmFtIHR5cGUgICAgLSBhZGRyZXNzIHR5cGUgKGRlZmF1bHQ6IFNDSE5PUlIgLyB2MCBmb3IgaG90LXdhbGxldDtcbiAgICogICAgICAgICAgICAgICAgICB1c2UgS2FzcGFBZGRyZXNzVHlwZS5FQ0RTQSAvIHYxIGZvciBNUEMvREtMUyB3YWxsZXRzKVxuICAgKiBAcmV0dXJucyBiZWNoMzItZW5jb2RlZCBLYXNwYSBhZGRyZXNzXG4gICAqL1xuICBnZXRBZGRyZXNzKG5ldHdvcmsgPSAnbWFpbm5ldCcsIHR5cGU6IEthc3BhQWRkcmVzc1R5cGUgPSBLYXNwYUFkZHJlc3NUeXBlLlNDSE5PUlIpOiBzdHJpbmcge1xuICAgIGNvbnN0IGhycCA9IG5ldHdvcmsgPT09ICd0ZXN0bmV0JyA/IFRFU1RORVRfUFJFRklYIDogTUFJTk5FVF9QUkVGSVg7XG4gICAgY29uc3QgY29tcHJlc3NlZFB1YiA9IHRoaXMuZ2V0UHVibGljS2V5KHsgY29tcHJlc3NlZDogdHJ1ZSB9KTtcbiAgICByZXR1cm4gcHViS2V5VG9LYXNwYUFkZHJlc3MoY29tcHJlc3NlZFB1YiwgaHJwLCB0eXBlKTtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PSKT — Partially Signed Kaspa Transaction
|
|
3
|
+
*
|
|
4
|
+
* Kaspa's native analogue of Bitcoin's PSBT (BIP-174), implemented in
|
|
5
|
+
* TypeScript with zero external dependencies. Wire format is plain camelCase
|
|
6
|
+
* JSON, matching the serde serialisation of rusty-kaspa's wallet/pskt crate.
|
|
7
|
+
*
|
|
8
|
+
* Reference: https://github.com/kaspanet/rusty-kaspa/tree/master/wallet/pskt
|
|
9
|
+
*
|
|
10
|
+
* Role state machine:
|
|
11
|
+
* CREATOR → UPDATER → SIGNER ─┬→ COMBINER → FINALIZER → EXTRACTOR
|
|
12
|
+
* └──────────→ FINALIZER → EXTRACTOR
|
|
13
|
+
*
|
|
14
|
+
* Key difference from the current JSON-hex flow:
|
|
15
|
+
* Signatures are stored in `partialSigs` per input until the FINALIZER
|
|
16
|
+
* role promotes them into the push-only `finalScriptSig`. This lets an
|
|
17
|
+
* external HSM or a second party receive the serialised PSKT, call
|
|
18
|
+
* `addSignature()`, and return it — identical to how PSBT works for BTC.
|
|
19
|
+
*/
|
|
20
|
+
import { KaspaTransactionData } from './iface';
|
|
21
|
+
export type PsktRole = 'CREATOR' | 'UPDATER' | 'SIGNER' | 'COMBINER' | 'FINALIZER' | 'EXTRACTOR';
|
|
22
|
+
export interface PsktKeySource {
|
|
23
|
+
/** 4-byte master fingerprint, hex-encoded */
|
|
24
|
+
keyFingerprint: string;
|
|
25
|
+
/** BIP-32 derivation path string, e.g. "m/44'/111111'/0'/0/0" */
|
|
26
|
+
derivationPath: string;
|
|
27
|
+
}
|
|
28
|
+
export interface PsktGlobal {
|
|
29
|
+
/** PSKT version (0 = no payload, 1 = payload allowed) */
|
|
30
|
+
version: 0 | 1;
|
|
31
|
+
/** Kaspa transaction version (currently 0) */
|
|
32
|
+
txVersion: number;
|
|
33
|
+
/** Fallback lock time (block or timestamp), as decimal string for JSON safety */
|
|
34
|
+
fallbackLockTime?: string;
|
|
35
|
+
/** Whether inputs can still be added */
|
|
36
|
+
inputsModifiable: boolean;
|
|
37
|
+
/** Whether outputs can still be added */
|
|
38
|
+
outputsModifiable: boolean;
|
|
39
|
+
/** Number of inputs in this PSKT */
|
|
40
|
+
inputCount: number;
|
|
41
|
+
/** Number of outputs in this PSKT */
|
|
42
|
+
outputCount: number;
|
|
43
|
+
/** Extended public keys and their derivation info */
|
|
44
|
+
xpubs: Record<string, PsktKeySource>;
|
|
45
|
+
/** Transaction ID once known */
|
|
46
|
+
id?: string;
|
|
47
|
+
/** Proprietary key-value pairs */
|
|
48
|
+
proprietaries: Record<string, unknown>;
|
|
49
|
+
/** Hex-encoded transaction payload (requires version >= 1) */
|
|
50
|
+
payload?: string;
|
|
51
|
+
}
|
|
52
|
+
export interface PsktUtxoEntry {
|
|
53
|
+
/** Amount in sompi (decimal string for JSON bigint safety) */
|
|
54
|
+
amount: string;
|
|
55
|
+
/** Hex-encoded scriptPublicKey bytes */
|
|
56
|
+
scriptPublicKey: string;
|
|
57
|
+
blockDaaScore?: string;
|
|
58
|
+
isCoinbase?: boolean;
|
|
59
|
+
}
|
|
60
|
+
export interface PsktInput {
|
|
61
|
+
/** The outpoint being spent */
|
|
62
|
+
previousOutpoint: {
|
|
63
|
+
transactionId: string;
|
|
64
|
+
index: number;
|
|
65
|
+
};
|
|
66
|
+
/**
|
|
67
|
+
* UTXO data required for sighash computation.
|
|
68
|
+
* Must be present before signing.
|
|
69
|
+
*/
|
|
70
|
+
utxoEntry?: PsktUtxoEntry;
|
|
71
|
+
/** Sequence number (u64 as decimal string; absent = u64::MAX / finality) */
|
|
72
|
+
sequence?: string;
|
|
73
|
+
/**
|
|
74
|
+
* Partial Schnorr signatures collected so far.
|
|
75
|
+
* Key: 33-byte compressed secp256k1 pubKey hex.
|
|
76
|
+
* Value: 64-byte raw Schnorr signature hex.
|
|
77
|
+
*/
|
|
78
|
+
partialSigs: Record<string, string>;
|
|
79
|
+
/** SigHash type for this input (default: SIGHASH_ALL = 0x01) */
|
|
80
|
+
sighashType: number;
|
|
81
|
+
/** Signature operation count */
|
|
82
|
+
sigOpCount?: number;
|
|
83
|
+
/**
|
|
84
|
+
* Finalized scriptSig (set by the FINALIZER role).
|
|
85
|
+
* Layout: 0x41 (OP_DATA_65) + 64-byte sig + 1-byte sighash type = 66 bytes hex.
|
|
86
|
+
*/
|
|
87
|
+
finalScriptSig?: string;
|
|
88
|
+
/** BIP-32 derivation info for keys used in this input */
|
|
89
|
+
bip32Derivations: Record<string, PsktKeySource>;
|
|
90
|
+
/** Proprietary key-value pairs */
|
|
91
|
+
proprietaries: Record<string, unknown>;
|
|
92
|
+
}
|
|
93
|
+
export interface PsktOutput {
|
|
94
|
+
/** Amount in sompi (decimal string for JSON bigint safety) */
|
|
95
|
+
amount: string;
|
|
96
|
+
/** Script public key */
|
|
97
|
+
scriptPublicKey: {
|
|
98
|
+
version: number;
|
|
99
|
+
scriptPublicKey: string;
|
|
100
|
+
};
|
|
101
|
+
/** BIP-32 derivation info for keys used in this output */
|
|
102
|
+
bip32Derivations: Record<string, PsktKeySource>;
|
|
103
|
+
/** Proprietary key-value pairs */
|
|
104
|
+
proprietaries: Record<string, unknown>;
|
|
105
|
+
}
|
|
106
|
+
/** Wire format — what `serialize()` produces and `deserialize()` consumes. */
|
|
107
|
+
export interface SerializedPskt {
|
|
108
|
+
role: PsktRole;
|
|
109
|
+
global: PsktGlobal;
|
|
110
|
+
inputs: PsktInput[];
|
|
111
|
+
outputs: PsktOutput[];
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* PSKT (Partially Signed Kaspa Transaction).
|
|
115
|
+
*
|
|
116
|
+
* Mirrors the role-based workflow of Bitcoin's PSBT but uses Kaspa's wire
|
|
117
|
+
* format (camelCase JSON), Blake2b sighash, and Schnorr signatures.
|
|
118
|
+
*
|
|
119
|
+
* Typical single-signer flow:
|
|
120
|
+
* ```ts
|
|
121
|
+
* const pskt = Pskt.creator()
|
|
122
|
+
* .toUpdater()
|
|
123
|
+
* .input({ ... })
|
|
124
|
+
* .output({ ... })
|
|
125
|
+
* .toSigner()
|
|
126
|
+
* .sign(privateKeyBuffer)
|
|
127
|
+
* .toFinalizer()
|
|
128
|
+
* .finalize()
|
|
129
|
+
* .toExtractor();
|
|
130
|
+
*
|
|
131
|
+
* const broadcastJson = pskt.extract();
|
|
132
|
+
* ```
|
|
133
|
+
*
|
|
134
|
+
* HSM / external signing flow:
|
|
135
|
+
* ```ts
|
|
136
|
+
* const unsigned = pskt.serialize(); // send to HSM
|
|
137
|
+
* const signed = Pskt.deserialize(signed); // receive back
|
|
138
|
+
* const tx = signed.toFinalizer().finalize().toExtractor().extract();
|
|
139
|
+
* ```
|
|
140
|
+
*/
|
|
141
|
+
export declare class Pskt {
|
|
142
|
+
private _global;
|
|
143
|
+
private _inputs;
|
|
144
|
+
private _outputs;
|
|
145
|
+
private _role;
|
|
146
|
+
private constructor();
|
|
147
|
+
get role(): PsktRole;
|
|
148
|
+
get global(): Readonly<PsktGlobal>;
|
|
149
|
+
get inputs(): ReadonlyArray<Readonly<PsktInput>>;
|
|
150
|
+
get outputs(): ReadonlyArray<Readonly<PsktOutput>>;
|
|
151
|
+
/**
|
|
152
|
+
* Create a new PSKT in CREATOR role.
|
|
153
|
+
*
|
|
154
|
+
* @param txVersion Kaspa transaction version (currently 0)
|
|
155
|
+
* @param fallbackLockTime Optional lock time as decimal string
|
|
156
|
+
*/
|
|
157
|
+
static creator(txVersion?: number, fallbackLockTime?: string): Pskt;
|
|
158
|
+
/**
|
|
159
|
+
* Reconstruct a PSKT from a `KaspaTransactionData` object.
|
|
160
|
+
*
|
|
161
|
+
* The returned PSKT is placed in SIGNER role (inputs are locked, UTXO data
|
|
162
|
+
* is populated, any existing `signatureScript` is carried as `finalScriptSig`).
|
|
163
|
+
* Used by `Transaction.toPskt()`.
|
|
164
|
+
*/
|
|
165
|
+
static fromTxData(txData: KaspaTransactionData): Pskt;
|
|
166
|
+
/**
|
|
167
|
+
* Deserialise a PSKT from the JSON string produced by `serialize()`.
|
|
168
|
+
*/
|
|
169
|
+
static deserialize(json: string): Pskt;
|
|
170
|
+
toUpdater(): Pskt;
|
|
171
|
+
toSigner(): Pskt;
|
|
172
|
+
toCombiner(): Pskt;
|
|
173
|
+
/**
|
|
174
|
+
* Transition to FINALIZER role.
|
|
175
|
+
* Allowed from both SIGNER (single-party shortcut) and COMBINER.
|
|
176
|
+
*/
|
|
177
|
+
toFinalizer(): Pskt;
|
|
178
|
+
/**
|
|
179
|
+
* Transition to EXTRACTOR role.
|
|
180
|
+
* All inputs must have a `finalScriptSig` (call `finalize()` first).
|
|
181
|
+
*/
|
|
182
|
+
toExtractor(): Pskt;
|
|
183
|
+
/**
|
|
184
|
+
* Add an input. Only allowed in CREATOR or UPDATER role.
|
|
185
|
+
*/
|
|
186
|
+
input(inp: PsktInput): this;
|
|
187
|
+
/**
|
|
188
|
+
* Add an output. Only allowed in CREATOR or UPDATER role.
|
|
189
|
+
*/
|
|
190
|
+
output(out: PsktOutput): this;
|
|
191
|
+
/**
|
|
192
|
+
* Sign all inputs with a private key (single-key / non-HSM path).
|
|
193
|
+
*
|
|
194
|
+
* Computes a distinct keyed Blake2b-256 sighash per input (Kaspa's
|
|
195
|
+
* BIP-143-like scheme) and writes the 64-byte Schnorr signature into
|
|
196
|
+
* `partialSigs[compressedPubKeyHex]` for each input.
|
|
197
|
+
*
|
|
198
|
+
* @param privateKey 32-byte private key buffer
|
|
199
|
+
* @param sigHashType SigHash type (default: SIGHASH_ALL = 0x01)
|
|
200
|
+
*/
|
|
201
|
+
sign(privateKey: Buffer, sigHashType?: number): this;
|
|
202
|
+
/**
|
|
203
|
+
* Record an externally-produced Schnorr signature for one specific input.
|
|
204
|
+
*
|
|
205
|
+
* HSM / MPCv2 flow:
|
|
206
|
+
* ```ts
|
|
207
|
+
* const json = pskt.serialize(); // → HSM
|
|
208
|
+
* // HSM signs each input's sighash and returns signatures
|
|
209
|
+
* pskt.addSignature(0, pubKeyHex, sig0Hex)
|
|
210
|
+
* .addSignature(1, pubKeyHex, sig1Hex);
|
|
211
|
+
* ```
|
|
212
|
+
*
|
|
213
|
+
* @param inputIndex 0-based index of the input being signed
|
|
214
|
+
* @param pubKeyHex 33-byte compressed secp256k1 pubKey, hex-encoded
|
|
215
|
+
* @param sigHex 64-byte Schnorr signature, hex-encoded
|
|
216
|
+
* @param sigHashType SigHash type used when producing the signature
|
|
217
|
+
*/
|
|
218
|
+
addSignature(inputIndex: number, pubKeyHex: string, sigHex: string, sigHashType?: number): this;
|
|
219
|
+
/**
|
|
220
|
+
* Merge `partialSigs` from another PSKT into this one.
|
|
221
|
+
*
|
|
222
|
+
* Both PSKTs must represent the same transaction (same number of inputs and
|
|
223
|
+
* outputs). Conflicting signatures for the same pubKey raise an error.
|
|
224
|
+
*/
|
|
225
|
+
combine(other: Pskt): this;
|
|
226
|
+
/**
|
|
227
|
+
* Finalise all inputs: promote the first `partialSig` on each input into
|
|
228
|
+
* `finalScriptSig` using Kaspa's push-only script layout:
|
|
229
|
+
* `0x41` (OP_DATA_65) + 64-byte sig + 1-byte sighash type = 66 bytes
|
|
230
|
+
*
|
|
231
|
+
* Works for both Schnorr (v0) and ECDSA (v1) inputs since both produce a
|
|
232
|
+
* 64-byte compact signature stored in `partialSigs`.
|
|
233
|
+
* Inputs that already have a `finalScriptSig` are left unchanged.
|
|
234
|
+
*/
|
|
235
|
+
finalize(): this;
|
|
236
|
+
/**
|
|
237
|
+
* Extract the broadcast-ready transaction as a JSON string.
|
|
238
|
+
*
|
|
239
|
+
* Produces the same wire format as `Transaction.toBroadcastFormat()`.
|
|
240
|
+
* Must be in EXTRACTOR role (call `.toFinalizer().finalize().toExtractor()` first).
|
|
241
|
+
*/
|
|
242
|
+
extract(): string;
|
|
243
|
+
/**
|
|
244
|
+
* Serialise the PSKT to a JSON string for transmission (e.g. to an HSM).
|
|
245
|
+
* The `role` is included so `Pskt.deserialize()` can reconstruct the state.
|
|
246
|
+
*/
|
|
247
|
+
serialize(): string;
|
|
248
|
+
/**
|
|
249
|
+
* Convert the PSKT's internal data back to a `KaspaTransactionData` object.
|
|
250
|
+
*
|
|
251
|
+
* `finalScriptSig` (if present) is mapped to `signatureScript` so that the
|
|
252
|
+
* resulting `Transaction` is fully signed and ready to broadcast.
|
|
253
|
+
* Used by `Transaction.fromPskt()`.
|
|
254
|
+
*/
|
|
255
|
+
toTxData(): KaspaTransactionData;
|
|
256
|
+
}
|
|
257
|
+
//# sourceMappingURL=pskt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pskt.d.ts","sourceRoot":"","sources":["../../../src/lib/pskt.ts"],"names":[],"mappings":"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"}
|