@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.
Files changed (49) hide show
  1. package/README.md +224 -33
  2. package/dist/src/kaspa.d.ts +86 -18
  3. package/dist/src/kaspa.d.ts.map +1 -1
  4. package/dist/src/kaspa.js +119 -31
  5. package/dist/src/lib/constants.d.ts +38 -0
  6. package/dist/src/lib/constants.d.ts.map +1 -1
  7. package/dist/src/lib/constants.js +56 -5
  8. package/dist/src/lib/iface.d.ts +28 -17
  9. package/dist/src/lib/iface.d.ts.map +1 -1
  10. package/dist/src/lib/iface.js +1 -1
  11. package/dist/src/lib/index.d.ts +2 -0
  12. package/dist/src/lib/index.d.ts.map +1 -1
  13. package/dist/src/lib/index.js +4 -2
  14. package/dist/src/lib/keyPair.d.ts +6 -2
  15. package/dist/src/lib/keyPair.d.ts.map +1 -1
  16. package/dist/src/lib/keyPair.js +7 -4
  17. package/dist/src/lib/pskt.d.ts +257 -0
  18. package/dist/src/lib/pskt.d.ts.map +1 -0
  19. package/dist/src/lib/pskt.js +439 -0
  20. package/dist/src/lib/sighash.d.ts +34 -13
  21. package/dist/src/lib/sighash.d.ts.map +1 -1
  22. package/dist/src/lib/sighash.js +115 -56
  23. package/dist/src/lib/transaction.d.ts +94 -6
  24. package/dist/src/lib/transaction.d.ts.map +1 -1
  25. package/dist/src/lib/transaction.js +199 -21
  26. package/dist/src/lib/transactionBuilder.d.ts +22 -0
  27. package/dist/src/lib/transactionBuilder.d.ts.map +1 -1
  28. package/dist/src/lib/transactionBuilder.js +53 -5
  29. package/dist/src/lib/transactionBuilderFactory.d.ts +8 -3
  30. package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -1
  31. package/dist/src/lib/transactionBuilderFactory.js +14 -4
  32. package/dist/src/lib/utils.d.ts +17 -3
  33. package/dist/src/lib/utils.d.ts.map +1 -1
  34. package/dist/src/lib/utils.js +45 -11
  35. package/dist/src/register.js +2 -2
  36. package/dist/test/fixtures/kaspa.fixtures.d.ts +12 -0
  37. package/dist/test/fixtures/kaspa.fixtures.d.ts.map +1 -1
  38. package/dist/test/fixtures/kaspa.fixtures.js +76 -11
  39. package/dist/test/unit/coin.test.js +129 -9
  40. package/dist/test/unit/keyPair.test.js +35 -1
  41. package/dist/test/unit/pskt.test.d.ts +15 -0
  42. package/dist/test/unit/pskt.test.d.ts.map +1 -0
  43. package/dist/test/unit/pskt.test.js +383 -0
  44. package/dist/test/unit/transaction.test.js +291 -11
  45. package/dist/test/unit/transactionBuilder.test.js +16 -3
  46. package/dist/test/unit/transactionFlow.test.js +67 -2
  47. package/dist/test/unit/utils.test.js +63 -4
  48. package/dist/tsconfig.tsbuildinfo +1 -1
  49. 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
- * @returns {string} The bech32-encoded Kaspa address
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;AAQ9B,qBAAa,OAAQ,SAAQ,wBAAwB;IACnD;;;;OAIG;gBACS,MAAM,CAAC,EAAE,cAAc;IAoBnC;;;;OAIG;IACH,OAAO,IAAI,WAAW;IAOtB;;;;OAIG;IACH,UAAU,CAAC,OAAO,SAAY,GAAG,MAAM;CAKxC"}
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"}
@@ -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
- * @returns {string} The bech32-encoded Kaspa address
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia2V5UGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIva2V5UGFpci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxtREFPOEI7QUFDOUIscURBQThDO0FBQzlDLG1DQUFxQztBQUNyQyxtQ0FBK0M7QUFDL0MsMkNBQTZEO0FBRTdELE1BQU0sdUJBQXVCLEdBQUcsRUFBRSxDQUFDO0FBRW5DLE1BQWEsT0FBUSxTQUFRLG1DQUF3QjtJQUNuRDs7OztPQUlHO0lBQ0gsWUFBWSxNQUF1QjtRQUNqQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDZCxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDWixNQUFNLElBQUksR0FBRyxJQUFBLG9CQUFXLEVBQUMsdUJBQXVCLENBQUMsQ0FBQztZQUNsRCxJQUFJLENBQUMsTUFBTSxHQUFHLGlCQUFLLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3JDLENBQUM7YUFBTSxJQUFJLElBQUEsaUJBQU0sRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQyxNQUFNLEdBQUcsaUJBQUssQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVDLENBQUM7YUFBTSxJQUFJLElBQUEsdUJBQVksRUFBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQ2hDLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUMsQ0FBQzthQUFNLElBQUksSUFBQSxzQkFBVyxFQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDL0IsSUFBSSxDQUFDLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUMzQyxDQUFDO2FBQU0sQ0FBQztZQUNOLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUM5QyxDQUFDO1FBRUQsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDaEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxtQ0FBd0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNILE9BQU87UUFDTCxPQUFPO1lBQ0wsR0FBRyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsRUFBRSxVQUFVLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDO1lBQzVELEdBQUcsRUFBRSxJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsUUFBUSxDQUFDLEtBQUssQ0FBQztTQUMzQyxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSCxVQUFVLENBQUMsT0FBTyxHQUFHLFNBQVM7UUFDNUIsTUFBTSxHQUFHLEdBQUcsT0FBTyxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUMsMEJBQWMsQ0FBQyxDQUFDLENBQUMsMEJBQWMsQ0FBQztRQUNwRSxNQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUM7UUFDOUQsT0FBTyxJQUFBLDRCQUFvQixFQUFDLGFBQWEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNsRCxDQUFDO0NBQ0Y7QUFoREQsMEJBZ0RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgRGVmYXVsdEtleXMsXG4gIGlzUHJpdmF0ZUtleSxcbiAgaXNQdWJsaWNLZXksXG4gIGlzU2VlZCxcbiAgS2V5UGFpck9wdGlvbnMsXG4gIFNlY3AyNTZrMUV4dGVuZGVkS2V5UGFpcixcbn0gZnJvbSAnQGJpdGdvLWJldGEvc2RrLWNvcmUnO1xuaW1wb3J0IHsgYmlwMzIgfSBmcm9tICdAYml0Z28tYmV0YS9zZWNwMjU2azEnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0IHsgcHViS2V5VG9LYXNwYUFkZHJlc3MgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IE1BSU5ORVRfUFJFRklYLCBURVNUTkVUX1BSRUZJWCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuY29uc3QgREVGQVVMVF9TRUVEX1NJWkVfQllURVMgPSAxNjtcblxuZXhwb3J0IGNsYXNzIEtleVBhaXIgZXh0ZW5kcyBTZWNwMjU2azFFeHRlbmRlZEtleVBhaXIge1xuICAvKipcbiAgICogUHVibGljIGNvbnN0cnVjdG9yLiBCeSBkZWZhdWx0LCBjcmVhdGVzIGEga2V5IHBhaXIgd2l0aCBhIHJhbmRvbSBtYXN0ZXIgc2VlZC5cbiAgICpcbiAgICogQHBhcmFtIHsgS2V5UGFpck9wdGlvbnMgfSBzb3VyY2UgRWl0aGVyIGEgbWFzdGVyIHNlZWQsIGEgcHJpdmF0ZSBrZXksIG9yIGEgcHVibGljIGtleVxuICAgKi9cbiAgY29uc3RydWN0b3Ioc291cmNlPzogS2V5UGFpck9wdGlvbnMpIHtcbiAgICBzdXBlcihzb3VyY2UpO1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICBjb25zdCBzZWVkID0gcmFuZG9tQnl0ZXMoREVGQVVMVF9TRUVEX1NJWkVfQllURVMpO1xuICAgICAgdGhpcy5oZE5vZGUgPSBiaXAzMi5mcm9tU2VlZChzZWVkKTtcbiAgICB9IGVsc2UgaWYgKGlzU2VlZChzb3VyY2UpKSB7XG4gICAgICB0aGlzLmhkTm9kZSA9IGJpcDMyLmZyb21TZWVkKHNvdXJjZS5zZWVkKTtcbiAgICB9IGVsc2UgaWYgKGlzUHJpdmF0ZUtleShzb3VyY2UpKSB7XG4gICAgICB0aGlzLnJlY29yZEtleXNGcm9tUHJpdmF0ZUtleShzb3VyY2UucHJ2KTtcbiAgICB9IGVsc2UgaWYgKGlzUHVibGljS2V5KHNvdXJjZSkpIHtcbiAgICAgIHRoaXMucmVjb3JkS2V5c0Zyb21QdWJsaWNLZXkoc291cmNlLnB1Yik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBrZXkgcGFpciBvcHRpb25zJyk7XG4gICAgfVxuXG4gICAgaWYgKHRoaXMuaGROb2RlKSB7XG4gICAgICB0aGlzLmtleVBhaXIgPSBTZWNwMjU2azFFeHRlbmRlZEtleVBhaXIudG9LZXlQYWlyKHRoaXMuaGROb2RlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGVmYXVsdCBrZXlzIGZvcm1hdCBpcyBhIHBhaXIgb2YgaGV4IGtleXMuXG4gICAqXG4gICAqIEByZXR1cm5zIHsgRGVmYXVsdEtleXMgfSBUaGUga2V5cyBpbiB0aGUgZGVmaW5lZCBmb3JtYXRcbiAgICovXG4gIGdldEtleXMoKTogRGVmYXVsdEtleXMge1xuICAgIHJldHVybiB7XG4gICAgICBwdWI6IHRoaXMuZ2V0UHVibGljS2V5KHsgY29tcHJlc3NlZDogdHJ1ZSB9KS50b1N0cmluZygnaGV4JyksXG4gICAgICBwcnY6IHRoaXMuZ2V0UHJpdmF0ZUtleSgpPy50b1N0cmluZygnaGV4JyksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBLYXNwYSBhZGRyZXNzIGZyb20gdGhpcyBrZXkgcGFpci5cbiAgICpcbiAgICogQHJldHVybnMge3N0cmluZ30gVGhlIGJlY2gzMi1lbmNvZGVkIEthc3BhIGFkZHJlc3NcbiAgICovXG4gIGdldEFkZHJlc3MobmV0d29yayA9ICdtYWlubmV0Jyk6IHN0cmluZyB7XG4gICAgY29uc3QgaHJwID0gbmV0d29yayA9PT0gJ3Rlc3RuZXQnID8gVEVTVE5FVF9QUkVGSVggOiBNQUlOTkVUX1BSRUZJWDtcbiAgICBjb25zdCBjb21wcmVzc2VkUHViID0gdGhpcy5nZXRQdWJsaWNLZXkoeyBjb21wcmVzc2VkOiB0cnVlIH0pO1xuICAgIHJldHVybiBwdWJLZXlUb0thc3BhQWRkcmVzcyhjb21wcmVzc2VkUHViLCBocnApO1xuICB9XG59XG4iXX0=
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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"}