@bitgo-beta/sdk-coin-kaspa 0.0.1-beta.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 +191 -0
- package/README.md +126 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +44 -0
- package/dist/src/kaspa.d.ts +64 -0
- package/dist/src/kaspa.d.ts.map +1 -0
- package/dist/src/kaspa.js +246 -0
- package/dist/src/lib/constants.d.ts +12 -0
- package/dist/src/lib/constants.d.ts.map +1 -0
- package/dist/src/lib/constants.js +18 -0
- package/dist/src/lib/iface.d.ts +109 -0
- package/dist/src/lib/iface.d.ts.map +1 -0
- package/dist/src/lib/iface.js +3 -0
- package/dist/src/lib/index.d.ts +10 -0
- package/dist/src/lib/index.d.ts.map +1 -0
- package/dist/src/lib/index.js +36 -0
- package/dist/src/lib/keyPair.d.ts +22 -0
- package/dist/src/lib/keyPair.d.ts.map +1 -0
- package/dist/src/lib/keyPair.js +61 -0
- package/dist/src/lib/sighash.d.ts +25 -0
- package/dist/src/lib/sighash.d.ts.map +1 -0
- package/dist/src/lib/sighash.js +191 -0
- package/dist/src/lib/transaction.d.ts +53 -0
- package/dist/src/lib/transaction.d.ts.map +1 -0
- package/dist/src/lib/transaction.js +133 -0
- package/dist/src/lib/transactionBuilder.d.ts +58 -0
- package/dist/src/lib/transactionBuilder.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilder.js +139 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts +15 -0
- package/dist/src/lib/transactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/lib/transactionBuilderFactory.js +25 -0
- package/dist/src/lib/utils.d.ts +43 -0
- package/dist/src/lib/utils.d.ts.map +1 -0
- package/dist/src/lib/utils.js +236 -0
- package/dist/src/register.d.ts +3 -0
- package/dist/src/register.d.ts.map +1 -0
- package/dist/src/register.js +10 -0
- package/dist/test/fixtures/kaspa.fixtures.d.ts +29 -0
- package/dist/test/fixtures/kaspa.fixtures.d.ts.map +1 -0
- package/dist/test/fixtures/kaspa.fixtures.js +90 -0
- package/dist/test/unit/coin.test.d.ts +2 -0
- package/dist/test/unit/coin.test.d.ts.map +1 -0
- package/dist/test/unit/coin.test.js +225 -0
- package/dist/test/unit/keyPair.test.d.ts +2 -0
- package/dist/test/unit/keyPair.test.d.ts.map +1 -0
- package/dist/test/unit/keyPair.test.js +90 -0
- package/dist/test/unit/transaction.test.d.ts +2 -0
- package/dist/test/unit/transaction.test.d.ts.map +1 -0
- package/dist/test/unit/transaction.test.js +206 -0
- package/dist/test/unit/transactionBuilder.test.d.ts +2 -0
- package/dist/test/unit/transactionBuilder.test.d.ts.map +1 -0
- package/dist/test/unit/transactionBuilder.test.js +220 -0
- package/dist/test/unit/transactionFlow.test.d.ts +8 -0
- package/dist/test/unit/transactionFlow.test.d.ts.map +1 -0
- package/dist/test/unit/transactionFlow.test.js +105 -0
- package/dist/test/unit/utils.test.d.ts +2 -0
- package/dist/test/unit/utils.test.d.ts.map +1 -0
- package/dist/test/unit/utils.test.js +159 -0
- package/dist/tsconfig.tsbuildinfo +1 -0
- package/package.json +53 -0
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TransactionBuilder = void 0;
|
|
4
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
5
|
+
const transaction_1 = require("./transaction");
|
|
6
|
+
const utils_1 = require("./utils");
|
|
7
|
+
const keyPair_1 = require("./keyPair");
|
|
8
|
+
const constants_1 = require("./constants");
|
|
9
|
+
class TransactionBuilder extends sdk_core_1.BaseTransactionBuilder {
|
|
10
|
+
constructor(coinConfig) {
|
|
11
|
+
super(coinConfig);
|
|
12
|
+
this._inputs = [];
|
|
13
|
+
this._outputs = [];
|
|
14
|
+
this._fee = constants_1.DEFAULT_FEE;
|
|
15
|
+
this._fromAddress = '';
|
|
16
|
+
this._transaction = new transaction_1.Transaction(coinConfig.name);
|
|
17
|
+
}
|
|
18
|
+
/** @inheritDoc */
|
|
19
|
+
get transaction() {
|
|
20
|
+
return this._transaction;
|
|
21
|
+
}
|
|
22
|
+
/** @inheritDoc */
|
|
23
|
+
set transaction(tx) {
|
|
24
|
+
this._transaction = tx;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Set the sender address.
|
|
28
|
+
*/
|
|
29
|
+
sender(address) {
|
|
30
|
+
if (!(0, utils_1.isValidKaspaAddress)(address)) {
|
|
31
|
+
throw new Error(`Invalid Kaspa address: ${address}`);
|
|
32
|
+
}
|
|
33
|
+
this._fromAddress = address;
|
|
34
|
+
return this;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Add a recipient output.
|
|
38
|
+
*/
|
|
39
|
+
to(address, amount) {
|
|
40
|
+
if (!(0, utils_1.isValidKaspaAddress)(address)) {
|
|
41
|
+
throw new Error(`Invalid Kaspa recipient address: ${address}`);
|
|
42
|
+
}
|
|
43
|
+
this._outputs.push({ address, amount });
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Set transaction fee in sompi.
|
|
48
|
+
*/
|
|
49
|
+
fee(fee) {
|
|
50
|
+
this._fee = fee;
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Add a UTXO input.
|
|
55
|
+
*/
|
|
56
|
+
addInput(utxo) {
|
|
57
|
+
if (!utxo.transactionId || utxo.transactionIndex === undefined) {
|
|
58
|
+
throw new Error('Invalid UTXO: missing transactionId or transactionIndex');
|
|
59
|
+
}
|
|
60
|
+
this._inputs.push(utxo);
|
|
61
|
+
return this;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Add multiple UTXO inputs.
|
|
65
|
+
*/
|
|
66
|
+
addInputs(utxos) {
|
|
67
|
+
utxos.forEach((u) => this.addInput(u));
|
|
68
|
+
return this;
|
|
69
|
+
}
|
|
70
|
+
/** @inheritDoc */
|
|
71
|
+
fromImplementation(rawTransaction) {
|
|
72
|
+
const tx = transaction_1.Transaction.fromHex(this._coinConfig?.name || 'kaspa', rawTransaction);
|
|
73
|
+
this._transaction = tx;
|
|
74
|
+
this._inputs = tx.txData.inputs || [];
|
|
75
|
+
this._outputs = tx.txData.outputs || [];
|
|
76
|
+
this._fee = tx.txData.fee || constants_1.DEFAULT_FEE;
|
|
77
|
+
return tx;
|
|
78
|
+
}
|
|
79
|
+
/** @inheritDoc */
|
|
80
|
+
async buildImplementation() {
|
|
81
|
+
const txData = {
|
|
82
|
+
version: constants_1.TX_VERSION,
|
|
83
|
+
inputs: this._inputs,
|
|
84
|
+
outputs: this._outputs,
|
|
85
|
+
fee: this._fee,
|
|
86
|
+
lockTime: '0',
|
|
87
|
+
subnetworkId: '0000000000000000000000000000000000000000',
|
|
88
|
+
payload: '',
|
|
89
|
+
};
|
|
90
|
+
this._transaction = new transaction_1.Transaction(this._coinConfig?.name || 'kaspa', txData);
|
|
91
|
+
return this._transaction;
|
|
92
|
+
}
|
|
93
|
+
/** @inheritDoc */
|
|
94
|
+
signImplementation({ key }) {
|
|
95
|
+
const keyPair = new keyPair_1.KeyPair({ prv: key });
|
|
96
|
+
const privateKey = keyPair.getKeys().prv;
|
|
97
|
+
if (!privateKey) {
|
|
98
|
+
throw new sdk_core_1.SigningError('Missing private key');
|
|
99
|
+
}
|
|
100
|
+
this._transaction.sign(Buffer.from(privateKey, 'hex'));
|
|
101
|
+
return this._transaction;
|
|
102
|
+
}
|
|
103
|
+
/** @inheritDoc */
|
|
104
|
+
validateTransaction(_transaction) {
|
|
105
|
+
if (this._inputs.length === 0) {
|
|
106
|
+
throw new Error('At least one UTXO input is required');
|
|
107
|
+
}
|
|
108
|
+
if (this._outputs.length === 0) {
|
|
109
|
+
throw new Error('At least one output is required');
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** @inheritDoc */
|
|
113
|
+
validateKey(key) {
|
|
114
|
+
// Key validation handled in KeyPair
|
|
115
|
+
}
|
|
116
|
+
/** @inheritDoc */
|
|
117
|
+
validateAddress(address) {
|
|
118
|
+
if (!(0, utils_1.isValidKaspaAddress)(address.address)) {
|
|
119
|
+
throw new Error(`Invalid Kaspa address: ${address.address}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** @inheritDoc */
|
|
123
|
+
validateRawTransaction(rawTransaction) {
|
|
124
|
+
try {
|
|
125
|
+
transaction_1.Transaction.fromHex(this._coinConfig?.name || 'kaspa', rawTransaction);
|
|
126
|
+
}
|
|
127
|
+
catch {
|
|
128
|
+
throw new Error('Invalid raw Kaspa transaction');
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
/** @inheritDoc */
|
|
132
|
+
validateValue(value) {
|
|
133
|
+
if (value.isLessThan(0)) {
|
|
134
|
+
throw new Error('Transaction value cannot be negative');
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
exports.TransactionBuilder = TransactionBuilder;
|
|
139
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2xpYi90cmFuc2FjdGlvbkJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsbURBQXNHO0FBR3RHLCtDQUE0QztBQUU1QyxtQ0FBOEM7QUFDOUMsdUNBQW9DO0FBQ3BDLDJDQUFzRDtBQUV0RCxNQUFhLGtCQUFtQixTQUFRLGlDQUFzQjtJQU81RCxZQUFZLFVBQWdDO1FBQzFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztRQU5WLFlBQU8sR0FBcUIsRUFBRSxDQUFDO1FBQy9CLGFBQVEsR0FBNkIsRUFBRSxDQUFDO1FBQ3hDLFNBQUksR0FBVyx1QkFBVyxDQUFDO1FBQzNCLGlCQUFZLEdBQUcsRUFBRSxDQUFDO1FBSTFCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSx5QkFBVyxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsa0JBQWtCO0lBQ2xCLElBQWMsV0FBVztRQUN2QixPQUFPLElBQUksQ0FBQyxZQUFZLENBQUM7SUFDM0IsQ0FBQztJQUVELGtCQUFrQjtJQUNsQixJQUFjLFdBQVcsQ0FBQyxFQUFtQjtRQUMzQyxJQUFJLENBQUMsWUFBWSxHQUFHLEVBQWlCLENBQUM7SUFDeEMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsTUFBTSxDQUFDLE9BQWU7UUFDcEIsSUFBSSxDQUFDLElBQUEsMkJBQW1CLEVBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxNQUFNLElBQUksS0FBSyxDQUFDLDBCQUEwQixPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ3ZELENBQUM7UUFDRCxJQUFJLENBQUMsWUFBWSxHQUFHLE9BQU8sQ0FBQztRQUM1QixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7T0FFRztJQUNILEVBQUUsQ0FBQyxPQUFlLEVBQUUsTUFBYztRQUNoQyxJQUFJLENBQUMsSUFBQSwy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LENBQUM7UUFDMUQsQ0FBQztJQUNILENBQUM7Q0FDRjtBQWpKRCxnREFpSkMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyLCBCYXNlVHJhbnNhY3Rpb24sIEJhc2VLZXksIFNpZ25pbmdFcnJvciB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IEJhc2VDb2luIGFzIENvaW5Db25maWcgfSBmcm9tICdAYml0Z28tYmV0YS9zdGF0aWNzJztcbmltcG9ydCBCaWdOdW1iZXIgZnJvbSAnYmlnbnVtYmVyLmpzJztcbmltcG9ydCB7IFRyYW5zYWN0aW9uIH0gZnJvbSAnLi90cmFuc2FjdGlvbic7XG5pbXBvcnQgeyBLYXNwYVRyYW5zYWN0aW9uRGF0YSwgS2FzcGFVdHhvSW5wdXQsIEthc3BhVHJhbnNhY3Rpb25PdXRwdXQgfSBmcm9tICcuL2lmYWNlJztcbmltcG9ydCB7IGlzVmFsaWRLYXNwYUFkZHJlc3MgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IEtleVBhaXIgfSBmcm9tICcuL2tleVBhaXInO1xuaW1wb3J0IHsgREVGQVVMVF9GRUUsIFRYX1ZFUlNJT04gfSBmcm9tICcuL2NvbnN0YW50cyc7XG5cbmV4cG9ydCBjbGFzcyBUcmFuc2FjdGlvbkJ1aWxkZXIgZXh0ZW5kcyBCYXNlVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgcHJvdGVjdGVkIF90cmFuc2FjdGlvbjogVHJhbnNhY3Rpb247XG4gIHByb3RlY3RlZCBfaW5wdXRzOiBLYXNwYVV0eG9JbnB1dFtdID0gW107XG4gIHByb3RlY3RlZCBfb3V0cHV0czogS2FzcGFUcmFuc2FjdGlvbk91dHB1dFtdID0gW107XG4gIHByb3RlY3RlZCBfZmVlOiBzdHJpbmcgPSBERUZBVUxUX0ZFRTtcbiAgcHJvdGVjdGVkIF9mcm9tQWRkcmVzcyA9ICcnO1xuXG4gIGNvbnN0cnVjdG9yKGNvaW5Db25maWc6IFJlYWRvbmx5PENvaW5Db25maWc+KSB7XG4gICAgc3VwZXIoY29pbkNvbmZpZyk7XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24gPSBuZXcgVHJhbnNhY3Rpb24oY29pbkNvbmZpZy5uYW1lKTtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICBwcm90ZWN0ZWQgZ2V0IHRyYW5zYWN0aW9uKCk6IEJhc2VUcmFuc2FjdGlvbiB7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHByb3RlY3RlZCBzZXQgdHJhbnNhY3Rpb24odHg6IEJhc2VUcmFuc2FjdGlvbikge1xuICAgIHRoaXMuX3RyYW5zYWN0aW9uID0gdHggYXMgVHJhbnNhY3Rpb247XG4gIH1cblxuICAvKipcbiAgICogU2V0IHRoZSBzZW5kZXIgYWRkcmVzcy5cbiAgICovXG4gIHNlbmRlcihhZGRyZXNzOiBzdHJpbmcpOiB0aGlzIHtcbiAgICBpZiAoIWlzVmFsaWRLYXNwYUFkZHJlc3MoYWRkcmVzcykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBLYXNwYSBhZGRyZXNzOiAke2FkZHJlc3N9YCk7XG4gICAgfVxuICAgIHRoaXMuX2Zyb21BZGRyZXNzID0gYWRkcmVzcztcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBBZGQgYSByZWNpcGllbnQgb3V0cHV0LlxuICAgKi9cbiAgdG8oYWRkcmVzczogc3RyaW5nLCBhbW91bnQ6IHN0cmluZyk6IHRoaXMge1xuICAgIGlmICghaXNWYWxpZEthc3BhQWRkcmVzcyhhZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEthc3BhIHJlY2lwaWVudCBhZGRyZXNzOiAke2FkZHJlc3N9YCk7XG4gICAgfVxuICAgIHRoaXMuX291dHB1dHMucHVzaCh7IGFkZHJlc3MsIGFtb3VudCB9KTtcbiAgICByZXR1cm4gdGhpcztcbiAgfVxuXG4gIC8qKlxuICAgKiBTZXQgdHJhbnNhY3Rpb24gZmVlIGluIHNvbXBpLlxuICAgKi9cbiAgZmVlKGZlZTogc3RyaW5nKTogdGhpcyB7XG4gICAgdGhpcy5fZmVlID0gZmVlO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBhIFVUWE8gaW5wdXQuXG4gICAqL1xuICBhZGRJbnB1dCh1dHhvOiBLYXNwYVV0eG9JbnB1dCk6IHRoaXMge1xuICAgIGlmICghdXR4by50cmFuc2FjdGlvbklkIHx8IHV0eG8udHJhbnNhY3Rpb25JbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgVVRYTzogbWlzc2luZyB0cmFuc2FjdGlvbklkIG9yIHRyYW5zYWN0aW9uSW5kZXgnKTtcbiAgICB9XG4gICAgdGhpcy5faW5wdXRzLnB1c2godXR4byk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKipcbiAgICogQWRkIG11bHRpcGxlIFVUWE8gaW5wdXRzLlxuICAgKi9cbiAgYWRkSW5wdXRzKHV0eG9zOiBLYXNwYVV0eG9JbnB1dFtdKTogdGhpcyB7XG4gICAgdXR4b3MuZm9yRWFjaCgodSkgPT4gdGhpcy5hZGRJbnB1dCh1KSk7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgcHJvdGVjdGVkIGZyb21JbXBsZW1lbnRhdGlvbihyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb24ge1xuICAgIGNvbnN0IHR4ID0gVHJhbnNhY3Rpb24uZnJvbUhleCgodGhpcyBhcyBhbnkpLl9jb2luQ29uZmlnPy5uYW1lIHx8ICdrYXNwYScsIHJhd1RyYW5zYWN0aW9uKTtcbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IHR4O1xuICAgIHRoaXMuX2lucHV0cyA9IHR4LnR4RGF0YS5pbnB1dHMgfHwgW107XG4gICAgdGhpcy5fb3V0cHV0cyA9IHR4LnR4RGF0YS5vdXRwdXRzIHx8IFtdO1xuICAgIHRoaXMuX2ZlZSA9IHR4LnR4RGF0YS5mZWUgfHwgREVGQVVMVF9GRUU7XG4gICAgcmV0dXJuIHR4O1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHByb3RlY3RlZCBhc3luYyBidWlsZEltcGxlbWVudGF0aW9uKCk6IFByb21pc2U8QmFzZVRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgdHhEYXRhOiBLYXNwYVRyYW5zYWN0aW9uRGF0YSA9IHtcbiAgICAgIHZlcnNpb246IFRYX1ZFUlNJT04sXG4gICAgICBpbnB1dHM6IHRoaXMuX2lucHV0cyxcbiAgICAgIG91dHB1dHM6IHRoaXMuX291dHB1dHMsXG4gICAgICBmZWU6IHRoaXMuX2ZlZSxcbiAgICAgIGxvY2tUaW1lOiAnMCcsXG4gICAgICBzdWJuZXR3b3JrSWQ6ICcwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwJyxcbiAgICAgIHBheWxvYWQ6ICcnLFxuICAgIH07XG5cbiAgICB0aGlzLl90cmFuc2FjdGlvbiA9IG5ldyBUcmFuc2FjdGlvbigodGhpcyBhcyBhbnkpLl9jb2luQ29uZmlnPy5uYW1lIHx8ICdrYXNwYScsIHR4RGF0YSk7XG4gICAgcmV0dXJuIHRoaXMuX3RyYW5zYWN0aW9uO1xuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHByb3RlY3RlZCBzaWduSW1wbGVtZW50YXRpb24oeyBrZXkgfTogQmFzZUtleSk6IEJhc2VUcmFuc2FjdGlvbiB7XG4gICAgY29uc3Qga2V5UGFpciA9IG5ldyBLZXlQYWlyKHsgcHJ2OiBrZXkgfSk7XG4gICAgY29uc3QgcHJpdmF0ZUtleSA9IGtleVBhaXIuZ2V0S2V5cygpLnBydjtcbiAgICBpZiAoIXByaXZhdGVLZXkpIHtcbiAgICAgIHRocm93IG5ldyBTaWduaW5nRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICB9XG4gICAgdGhpcy5fdHJhbnNhY3Rpb24uc2lnbihCdWZmZXIuZnJvbShwcml2YXRlS2V5LCAnaGV4JykpO1xuICAgIHJldHVybiB0aGlzLl90cmFuc2FjdGlvbjtcbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICB2YWxpZGF0ZVRyYW5zYWN0aW9uKF90cmFuc2FjdGlvbj86IEJhc2VUcmFuc2FjdGlvbik6IHZvaWQge1xuICAgIGlmICh0aGlzLl9pbnB1dHMubGVuZ3RoID09PSAwKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0F0IGxlYXN0IG9uZSBVVFhPIGlucHV0IGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICAgIGlmICh0aGlzLl9vdXRwdXRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBdCBsZWFzdCBvbmUgb3V0cHV0IGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqIEBpbmhlcml0RG9jICovXG4gIHZhbGlkYXRlS2V5KGtleTogeyBrZXk6IHN0cmluZyB9KTogdm9pZCB7XG4gICAgLy8gS2V5IHZhbGlkYXRpb24gaGFuZGxlZCBpbiBLZXlQYWlyXG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgdmFsaWRhdGVBZGRyZXNzKGFkZHJlc3M6IHsgYWRkcmVzczogc3RyaW5nIH0pOiB2b2lkIHtcbiAgICBpZiAoIWlzVmFsaWRLYXNwYUFkZHJlc3MoYWRkcmVzcy5hZGRyZXNzKSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIEthc3BhIGFkZHJlc3M6ICR7YWRkcmVzcy5hZGRyZXNzfWApO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdERvYyAqL1xuICB2YWxpZGF0ZVJhd1RyYW5zYWN0aW9uKHJhd1RyYW5zYWN0aW9uOiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0cnkge1xuICAgICAgVHJhbnNhY3Rpb24uZnJvbUhleCgodGhpcyBhcyBhbnkpLl9jb2luQ29uZmlnPy5uYW1lIHx8ICdrYXNwYScsIHJhd1RyYW5zYWN0aW9uKTtcbiAgICB9IGNhdGNoIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCByYXcgS2FzcGEgdHJhbnNhY3Rpb24nKTtcbiAgICB9XG4gIH1cblxuICAvKiogQGluaGVyaXREb2MgKi9cbiAgdmFsaWRhdGVWYWx1ZSh2YWx1ZTogQmlnTnVtYmVyKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlLmlzTGVzc1RoYW4oMCkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignVHJhbnNhY3Rpb24gdmFsdWUgY2Fubm90IGJlIG5lZ2F0aXZlJyk7XG4gICAgfVxuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { BaseCoin as StaticsBaseCoin } from '@bitgo-beta/statics';
|
|
2
|
+
import { TransactionBuilder } from './transactionBuilder';
|
|
3
|
+
export declare class TransactionBuilderFactory {
|
|
4
|
+
protected _coinConfig: Readonly<StaticsBaseCoin>;
|
|
5
|
+
constructor(coinConfig: Readonly<StaticsBaseCoin>);
|
|
6
|
+
/**
|
|
7
|
+
* Get a base transaction builder for Kaspa transfers.
|
|
8
|
+
*/
|
|
9
|
+
getBuilder(): TransactionBuilder;
|
|
10
|
+
/**
|
|
11
|
+
* Reconstruct a transaction builder from a raw transaction hex.
|
|
12
|
+
*/
|
|
13
|
+
from(rawTransaction: string): TransactionBuilder;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=transactionBuilderFactory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transactionBuilderFactory.d.ts","sourceRoot":"","sources":["../../../src/lib/transactionBuilderFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,IAAI,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D,qBAAa,yBAAyB;IACpC,SAAS,CAAC,WAAW,EAAE,QAAQ,CAAC,eAAe,CAAC,CAAC;gBAErC,UAAU,EAAE,QAAQ,CAAC,eAAe,CAAC;IAIjD;;OAEG;IACH,UAAU,IAAI,kBAAkB;IAIhC;;OAEG;IACH,IAAI,CAAC,cAAc,EAAE,MAAM,GAAG,kBAAkB;CAKjD"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TransactionBuilderFactory = void 0;
|
|
4
|
+
const transactionBuilder_1 = require("./transactionBuilder");
|
|
5
|
+
class TransactionBuilderFactory {
|
|
6
|
+
constructor(coinConfig) {
|
|
7
|
+
this._coinConfig = coinConfig;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Get a base transaction builder for Kaspa transfers.
|
|
11
|
+
*/
|
|
12
|
+
getBuilder() {
|
|
13
|
+
return new transactionBuilder_1.TransactionBuilder(this._coinConfig);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Reconstruct a transaction builder from a raw transaction hex.
|
|
17
|
+
*/
|
|
18
|
+
from(rawTransaction) {
|
|
19
|
+
const builder = this.getBuilder();
|
|
20
|
+
builder.from(rawTransaction);
|
|
21
|
+
return builder;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.TransactionBuilderFactory = TransactionBuilderFactory;
|
|
25
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9saWIvdHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFDQSw2REFBMEQ7QUFFMUQsTUFBYSx5QkFBeUI7SUFHcEMsWUFBWSxVQUFxQztRQUMvQyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBRUQ7O09BRUc7SUFDSCxVQUFVO1FBQ1IsT0FBTyxJQUFJLHVDQUFrQixDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFJLENBQUMsY0FBc0I7UUFDekIsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQ2xDLE9BQU8sQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDN0IsT0FBTyxPQUFPLENBQUM7SUFDakIsQ0FBQztDQUNGO0FBdEJELDhEQXNCQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEJhc2VDb2luIGFzIFN0YXRpY3NCYXNlQ29pbiB9IGZyb20gJ0BiaXRnby1iZXRhL3N0YXRpY3MnO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25CdWlsZGVyIH0gZnJvbSAnLi90cmFuc2FjdGlvbkJ1aWxkZXInO1xuXG5leHBvcnQgY2xhc3MgVHJhbnNhY3Rpb25CdWlsZGVyRmFjdG9yeSB7XG4gIHByb3RlY3RlZCBfY29pbkNvbmZpZzogUmVhZG9ubHk8U3RhdGljc0Jhc2VDb2luPjtcblxuICBjb25zdHJ1Y3Rvcihjb2luQ29uZmlnOiBSZWFkb25seTxTdGF0aWNzQmFzZUNvaW4+KSB7XG4gICAgdGhpcy5fY29pbkNvbmZpZyA9IGNvaW5Db25maWc7XG4gIH1cblxuICAvKipcbiAgICogR2V0IGEgYmFzZSB0cmFuc2FjdGlvbiBidWlsZGVyIGZvciBLYXNwYSB0cmFuc2ZlcnMuXG4gICAqL1xuICBnZXRCdWlsZGVyKCk6IFRyYW5zYWN0aW9uQnVpbGRlciB7XG4gICAgcmV0dXJuIG5ldyBUcmFuc2FjdGlvbkJ1aWxkZXIodGhpcy5fY29pbkNvbmZpZyk7XG4gIH1cblxuICAvKipcbiAgICogUmVjb25zdHJ1Y3QgYSB0cmFuc2FjdGlvbiBidWlsZGVyIGZyb20gYSByYXcgdHJhbnNhY3Rpb24gaGV4LlxuICAgKi9cbiAgZnJvbShyYXdUcmFuc2FjdGlvbjogc3RyaW5nKTogVHJhbnNhY3Rpb25CdWlsZGVyIHtcbiAgICBjb25zdCBidWlsZGVyID0gdGhpcy5nZXRCdWlsZGVyKCk7XG4gICAgYnVpbGRlci5mcm9tKHJhd1RyYW5zYWN0aW9uKTtcbiAgICByZXR1cm4gYnVpbGRlcjtcbiAgfVxufVxuIl19
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { BaseUtils } from '@bitgo-beta/sdk-core';
|
|
2
|
+
/**
|
|
3
|
+
* Validates a Kaspa address (mainnet or testnet)
|
|
4
|
+
*/
|
|
5
|
+
export declare function isValidKaspaAddress(address: string): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Validates a Kaspa mainnet address
|
|
8
|
+
*/
|
|
9
|
+
export declare function isValidMainnetAddress(address: string): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Validates a Kaspa testnet address
|
|
12
|
+
*/
|
|
13
|
+
export declare function isValidTestnetAddress(address: string): boolean;
|
|
14
|
+
/**
|
|
15
|
+
* Derive a Kaspa P2PK (Schnorr) address from a compressed secp256k1 public key.
|
|
16
|
+
*
|
|
17
|
+
* @param compressedPubKey - 33-byte compressed secp256k1 public key (hex string or Buffer)
|
|
18
|
+
* @param hrp - human-readable part ('kaspa' or 'kaspatest')
|
|
19
|
+
*/
|
|
20
|
+
export declare function pubKeyToKaspaAddress(compressedPubKey: string | Buffer, hrp: string): string;
|
|
21
|
+
/**
|
|
22
|
+
* Validates a secp256k1 public key (compressed or uncompressed)
|
|
23
|
+
*/
|
|
24
|
+
export declare function isValidPublicKey(pub: string): boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Validates a secp256k1 private key (32-byte hex)
|
|
27
|
+
*/
|
|
28
|
+
export declare function isValidPrivateKey(prv: string): boolean;
|
|
29
|
+
/**
|
|
30
|
+
* Validates a transaction ID (64-char hex)
|
|
31
|
+
*/
|
|
32
|
+
export declare function isValidTransactionId(txId: string): boolean;
|
|
33
|
+
export declare class Utils implements BaseUtils {
|
|
34
|
+
isValidAddress(address: string): boolean;
|
|
35
|
+
isValidBlockId(hash: string): boolean;
|
|
36
|
+
isValidPrivateKey(key: string): boolean;
|
|
37
|
+
isValidPublicKey(key: string): boolean;
|
|
38
|
+
isValidSignature(signature: string): boolean;
|
|
39
|
+
isValidTransactionId(txId: string): boolean;
|
|
40
|
+
}
|
|
41
|
+
declare const utils: Utils;
|
|
42
|
+
export default utils;
|
|
43
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../../src/lib/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAA4B,MAAM,sBAAsB,CAAC;AAmH3E;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAqB5D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE9D;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,CAAC,gBAAgB,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAoB3F;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAgBrD;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAatD;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAE1D;AAED,qBAAa,KAAM,YAAW,SAAS;IACrC,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO;IAIxC,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIrC,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAIvC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAItC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO;IAI5C,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;CAG5C;AAED,QAAA,MAAM,KAAK,OAAc,CAAC;AAC1B,eAAe,KAAK,CAAC"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Utils = void 0;
|
|
4
|
+
exports.isValidKaspaAddress = isValidKaspaAddress;
|
|
5
|
+
exports.isValidMainnetAddress = isValidMainnetAddress;
|
|
6
|
+
exports.isValidTestnetAddress = isValidTestnetAddress;
|
|
7
|
+
exports.pubKeyToKaspaAddress = pubKeyToKaspaAddress;
|
|
8
|
+
exports.isValidPublicKey = isValidPublicKey;
|
|
9
|
+
exports.isValidPrivateKey = isValidPrivateKey;
|
|
10
|
+
exports.isValidTransactionId = isValidTransactionId;
|
|
11
|
+
const sdk_core_1 = require("@bitgo-beta/sdk-core");
|
|
12
|
+
const constants_1 = require("./constants");
|
|
13
|
+
// Kaspa address encoding uses a bech32-like scheme with ':' as separator
|
|
14
|
+
// and a custom checksum polynomial (same as Bitcoin Cash cashaddr).
|
|
15
|
+
const CHARSET = 'qpzry9x8gf2tvdw0s3jn54khce6mua7l';
|
|
16
|
+
const CHARSET_REVERSE = {};
|
|
17
|
+
for (let i = 0; i < CHARSET.length; i++) {
|
|
18
|
+
CHARSET_REVERSE[CHARSET[i]] = i;
|
|
19
|
+
}
|
|
20
|
+
const GENERATOR = [
|
|
21
|
+
BigInt('0x98f2bc8e61'),
|
|
22
|
+
BigInt('0x79b76d99e2'),
|
|
23
|
+
BigInt('0xf33e5fb3c4'),
|
|
24
|
+
BigInt('0xae2eabe2a8'),
|
|
25
|
+
BigInt('0x1e4f43e470'),
|
|
26
|
+
];
|
|
27
|
+
function polymod(values) {
|
|
28
|
+
let c = 1n;
|
|
29
|
+
for (const d of values) {
|
|
30
|
+
const c0 = c >> 35n;
|
|
31
|
+
c = ((c & BigInt('0x07ffffffff')) << 5n) ^ BigInt(d);
|
|
32
|
+
for (let i = 0; i < 5; i++) {
|
|
33
|
+
if ((c0 >> BigInt(i)) & 1n) {
|
|
34
|
+
c ^= GENERATOR[i];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return c ^ 1n;
|
|
39
|
+
}
|
|
40
|
+
function prefixExpand(prefix) {
|
|
41
|
+
return [...prefix].map((c) => c.charCodeAt(0) & 0x1f).concat([0]);
|
|
42
|
+
}
|
|
43
|
+
function createChecksum(prefix, data) {
|
|
44
|
+
const values = prefixExpand(prefix).concat(data).concat([0, 0, 0, 0, 0, 0, 0, 0]);
|
|
45
|
+
const mod = polymod(values);
|
|
46
|
+
const ret = [];
|
|
47
|
+
for (let i = 7; i >= 0; i--) {
|
|
48
|
+
ret.push(Number((mod >> BigInt(5 * i)) & 31n));
|
|
49
|
+
}
|
|
50
|
+
return ret;
|
|
51
|
+
}
|
|
52
|
+
function verifyChecksum(prefix, data) {
|
|
53
|
+
const values = prefixExpand(prefix).concat(data);
|
|
54
|
+
return polymod(values) === 0n;
|
|
55
|
+
}
|
|
56
|
+
function convertBits(data, from, to, pad) {
|
|
57
|
+
let acc = 0;
|
|
58
|
+
let bits = 0;
|
|
59
|
+
const ret = [];
|
|
60
|
+
const maxv = (1 << to) - 1;
|
|
61
|
+
for (const value of data) {
|
|
62
|
+
acc = (acc << from) | value;
|
|
63
|
+
bits += from;
|
|
64
|
+
while (bits >= to) {
|
|
65
|
+
bits -= to;
|
|
66
|
+
ret.push((acc >> bits) & maxv);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (pad && bits > 0) {
|
|
70
|
+
ret.push((acc << (to - bits)) & maxv);
|
|
71
|
+
}
|
|
72
|
+
return ret;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Encode data into a Kaspa bech32-like address.
|
|
76
|
+
*/
|
|
77
|
+
function kaspaEncode(prefix, data) {
|
|
78
|
+
const checksum = createChecksum(prefix, data);
|
|
79
|
+
return (prefix +
|
|
80
|
+
':' +
|
|
81
|
+
data
|
|
82
|
+
.concat(checksum)
|
|
83
|
+
.map((d) => CHARSET[d])
|
|
84
|
+
.join(''));
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Decode a Kaspa bech32-like address.
|
|
88
|
+
* Returns { prefix, data } or throws on error.
|
|
89
|
+
*/
|
|
90
|
+
function kaspacDecode(address) {
|
|
91
|
+
const colonIdx = address.lastIndexOf(':');
|
|
92
|
+
if (colonIdx < 1) {
|
|
93
|
+
throw new Error('Missing prefix separator');
|
|
94
|
+
}
|
|
95
|
+
const prefix = address.slice(0, colonIdx).toLowerCase();
|
|
96
|
+
const encoded = address.slice(colonIdx + 1).toLowerCase();
|
|
97
|
+
const data = [];
|
|
98
|
+
for (const c of encoded) {
|
|
99
|
+
const val = CHARSET_REVERSE[c];
|
|
100
|
+
if (val === undefined) {
|
|
101
|
+
throw new Error(`Invalid character: ${c}`);
|
|
102
|
+
}
|
|
103
|
+
data.push(val);
|
|
104
|
+
}
|
|
105
|
+
if (!verifyChecksum(prefix, data)) {
|
|
106
|
+
throw new Error('Invalid checksum');
|
|
107
|
+
}
|
|
108
|
+
return { prefix, data: data.slice(0, -8) };
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Validates a Kaspa address (mainnet or testnet)
|
|
112
|
+
*/
|
|
113
|
+
function isValidKaspaAddress(address) {
|
|
114
|
+
if (!address || typeof address !== 'string') {
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
const colonIdx = address.lastIndexOf(':');
|
|
118
|
+
if (colonIdx < 1) {
|
|
119
|
+
return false;
|
|
120
|
+
}
|
|
121
|
+
const prefix = address.slice(0, colonIdx).toLowerCase();
|
|
122
|
+
if (prefix !== constants_1.MAINNET_PREFIX && prefix !== constants_1.TESTNET_PREFIX) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
try {
|
|
126
|
+
const decoded = kaspacDecode(address);
|
|
127
|
+
return decoded.data.length > 0;
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Validates a Kaspa mainnet address
|
|
135
|
+
*/
|
|
136
|
+
function isValidMainnetAddress(address) {
|
|
137
|
+
return isValidKaspaAddress(address) && address.toLowerCase().startsWith(constants_1.MAINNET_PREFIX + ':');
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Validates a Kaspa testnet address
|
|
141
|
+
*/
|
|
142
|
+
function isValidTestnetAddress(address) {
|
|
143
|
+
return isValidKaspaAddress(address) && address.toLowerCase().startsWith(constants_1.TESTNET_PREFIX + ':');
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Derive a Kaspa P2PK (Schnorr) address from a compressed secp256k1 public key.
|
|
147
|
+
*
|
|
148
|
+
* @param compressedPubKey - 33-byte compressed secp256k1 public key (hex string or Buffer)
|
|
149
|
+
* @param hrp - human-readable part ('kaspa' or 'kaspatest')
|
|
150
|
+
*/
|
|
151
|
+
function pubKeyToKaspaAddress(compressedPubKey, hrp) {
|
|
152
|
+
const pubKeyBytes = Buffer.isBuffer(compressedPubKey)
|
|
153
|
+
? compressedPubKey
|
|
154
|
+
: Buffer.from(compressedPubKey, 'hex');
|
|
155
|
+
if (pubKeyBytes.length !== 33) {
|
|
156
|
+
throw new Error(`Expected 33-byte compressed public key, got ${pubKeyBytes.length}`);
|
|
157
|
+
}
|
|
158
|
+
// X-only public key: drop the prefix byte (02 or 03), keep 32-byte x-coordinate
|
|
159
|
+
const xOnlyPubKey = pubKeyBytes.slice(1);
|
|
160
|
+
// Kaspa P2PK address:
|
|
161
|
+
// - version nibble: 0 (Schnorr secp256k1 P2PK)
|
|
162
|
+
// - payload: x-only public key (32 bytes)
|
|
163
|
+
const versionByte = 0;
|
|
164
|
+
const payload = Buffer.concat([Buffer.from([versionByte]), xOnlyPubKey]);
|
|
165
|
+
const words = convertBits(payload, 8, 5, true);
|
|
166
|
+
return kaspaEncode(hrp, words);
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Validates a secp256k1 public key (compressed or uncompressed)
|
|
170
|
+
*/
|
|
171
|
+
function isValidPublicKey(pub) {
|
|
172
|
+
if (!pub || typeof pub !== 'string') {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
try {
|
|
176
|
+
const buf = Buffer.from(pub, 'hex');
|
|
177
|
+
if (buf.length === 33) {
|
|
178
|
+
return buf[0] === 0x02 || buf[0] === 0x03;
|
|
179
|
+
}
|
|
180
|
+
if (buf.length === 65) {
|
|
181
|
+
return buf[0] === 0x04;
|
|
182
|
+
}
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
185
|
+
catch {
|
|
186
|
+
return false;
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Validates a secp256k1 private key (32-byte hex)
|
|
191
|
+
*/
|
|
192
|
+
function isValidPrivateKey(prv) {
|
|
193
|
+
if (!prv || typeof prv !== 'string') {
|
|
194
|
+
return false;
|
|
195
|
+
}
|
|
196
|
+
if ((0, sdk_core_1.isValidXprv)(prv) || (0, sdk_core_1.isValidXpub)(prv)) {
|
|
197
|
+
return true;
|
|
198
|
+
}
|
|
199
|
+
try {
|
|
200
|
+
const buf = Buffer.from(prv.slice(0, 64), 'hex');
|
|
201
|
+
return buf.length === 32;
|
|
202
|
+
}
|
|
203
|
+
catch {
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Validates a transaction ID (64-char hex)
|
|
209
|
+
*/
|
|
210
|
+
function isValidTransactionId(txId) {
|
|
211
|
+
return /^[0-9a-fA-F]{64}$/.test(txId);
|
|
212
|
+
}
|
|
213
|
+
class Utils {
|
|
214
|
+
isValidAddress(address) {
|
|
215
|
+
return isValidKaspaAddress(address);
|
|
216
|
+
}
|
|
217
|
+
isValidBlockId(hash) {
|
|
218
|
+
return /^[0-9a-fA-F]{64}$/.test(hash);
|
|
219
|
+
}
|
|
220
|
+
isValidPrivateKey(key) {
|
|
221
|
+
return isValidPrivateKey(key);
|
|
222
|
+
}
|
|
223
|
+
isValidPublicKey(key) {
|
|
224
|
+
return isValidPublicKey(key);
|
|
225
|
+
}
|
|
226
|
+
isValidSignature(signature) {
|
|
227
|
+
return /^[0-9a-fA-F]{128,130}$/.test(signature);
|
|
228
|
+
}
|
|
229
|
+
isValidTransactionId(txId) {
|
|
230
|
+
return isValidTransactionId(txId);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
exports.Utils = Utils;
|
|
234
|
+
const utils = new Utils();
|
|
235
|
+
exports.default = utils;
|
|
236
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbGliL3V0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXNIQSxrREFxQkM7QUFLRCxzREFFQztBQUtELHNEQUVDO0FBUUQsb0RBb0JDO0FBS0QsNENBZ0JDO0FBS0QsOENBYUM7QUFLRCxvREFFQztBQW5PRCxtREFBMkU7QUFDM0UsMkNBQTZEO0FBRTdELHlFQUF5RTtBQUN6RSxvRUFBb0U7QUFFcEUsTUFBTSxPQUFPLEdBQUcsa0NBQWtDLENBQUM7QUFDbkQsTUFBTSxlQUFlLEdBQTJCLEVBQUUsQ0FBQztBQUNuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBQ3hDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDbEMsQ0FBQztBQUVELE1BQU0sU0FBUyxHQUFHO0lBQ2hCLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDdEIsTUFBTSxDQUFDLGNBQWMsQ0FBQztJQUN0QixNQUFNLENBQUMsY0FBYyxDQUFDO0lBQ3RCLE1BQU0sQ0FBQyxjQUFjLENBQUM7SUFDdEIsTUFBTSxDQUFDLGNBQWMsQ0FBQztDQUN2QixDQUFDO0FBRUYsU0FBUyxPQUFPLENBQUMsTUFBZ0I7SUFDL0IsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO0lBQ1gsS0FBSyxNQUFNLENBQUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztRQUN2QixNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksR0FBRyxDQUFDO1FBQ3BCLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMs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Q1AsT0FBTyxLQUFLLENBQUM7SUFDZixDQUFDO0FBQ0gsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBZ0Isb0JBQW9CLENBQUMsSUFBWTtJQUMvQyxPQUFPLG1CQUFtQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQsTUFBYSxLQUFLO0lBQ2hCLGNBQWMsQ0FBQyxPQUFlO1FBQzVCLE9BQU8sbUJBQW1CLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDdEMsQ0FBQztJQUVELGNBQWMsQ0FBQyxJQUFZO1FBQ3pCLE9BQU8sbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3hDLENBQUM7SUFFRCxpQkFBaUIsQ0FBQyxHQUFXO1FBQzNCLE9BQU8saUJBQWlCLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsQ0FBQztJQUVELGdCQUFnQixDQUFDLEdBQVc7UUFDMUIsT0FBTyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUMvQixDQUFDO0lBRUQsZ0JBQWdCLENBQUMsU0FBaUI7UUFDaEMsT0FBTyx3QkFBd0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELG9CQUFvQixDQUFDLElBQVk7UUFDL0IsT0FBTyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQyxDQUFDO0NBQ0Y7QUF4QkQsc0JBd0JDO0FBRUQsTUFBTSxLQUFLLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztBQUMxQixrQkFBZSxLQUFLLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlVXRpbHMsIGlzVmFsaWRYcHJ2LCBpc1ZhbGlkWHB1YiB9IGZyb20gJ0BiaXRnby1iZXRhL3Nkay1jb3JlJztcbmltcG9ydCB7IE1BSU5ORVRfUFJFRklYLCBURVNUTkVUX1BSRUZJWCB9IGZyb20gJy4vY29uc3RhbnRzJztcblxuLy8gS2FzcGEgYWRkcmVzcyBlbmNvZGluZyB1c2VzIGEgYmVjaDMyLWxpa2Ugc2NoZW1lIHdpdGggJzonIGFzIHNlcGFyYXRvclxuLy8gYW5kIGEgY3VzdG9tIGNoZWNrc3VtIHBvbHlub21pYWwgKHNhbWUgYXMgQml0Y29pbiBDYXNoIGNhc2hhZGRyKS5cblxuY29uc3QgQ0hBUlNFVCA9ICdxcHpyeTl4OGdmMnR2ZHcwczNqbjU0a2hjZTZtdWE3bCc7XG5jb25zdCBDSEFSU0VUX1JFVkVSU0U6IFJlY29yZDxzdHJpbmcsIG51bWJlcj4gPSB7fTtcbmZvciAobGV0IGkgPSAwOyBpIDwgQ0hBUlNFVC5sZW5ndGg7IGkrKykge1xuICBDSEFSU0VUX1JFVkVSU0VbQ0hBUlNFVFtpXV0gPSBpO1xufVxuXG5jb25zdCBHRU5FUkFUT1IgPSBbXG4gIEJpZ0ludCgnMHg5OGYyYmM4ZTYxJyksXG4gIEJpZ0ludCgnMHg3OWI3NmQ5OWUyJyksXG4gIEJpZ0ludCgnMHhmMzNlNWZiM2M0JyksXG4gIEJpZ0ludCgnMHhhZTJlYWJlMmE4JyksXG4gIEJpZ0ludCgnMHgxZTRmNDNlNDcwJyksXG5dO1xuXG5mdW5jdGlvbiBwb2x5bW9kKHZhbHVlczogbnVtYmVyW10pOiBiaWdpbnQge1xuICBsZXQgYyA9IDFuO1xuICBmb3IgKGNvbnN0IGQgb2YgdmFsdWVzKSB7XG4gICAgY29uc3QgYzAgPSBjID4+IDM1bjtcbiAgICBjID0gKChjICYgQmlnSW50KCcweDA3ZmZmZmZmZmYnKSkgPDwgNW4pIF4gQmlnSW50KGQpO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgNTsgaSsrKSB7XG4gICAgICBpZiAoKGMwID4+IEJpZ0ludChpKSkgJiAxbikge1xuICAgICAgICBjIF49IEdFTkVSQVRPUltpXTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIGMgXiAxbjtcbn1cblxuZnVuY3Rpb24gcHJlZml4RXhwYW5kKHByZWZpeDogc3RyaW5nKTogbnVtYmVyW10ge1xuICByZXR1cm4gWy4uLnByZWZpeF0ubWFwKChjKSA9PiBjLmNoYXJDb2RlQXQoMCkgJiAweDFmKS5jb25jYXQoWzBdKTtcbn1cblxuZnVuY3Rpb24gY3JlYXRlQ2hlY2tzdW0ocHJlZml4OiBzdHJpbmcsIGRhdGE6IG51bWJlcltdKTogbnVtYmVyW10ge1xuICBjb25zdCB2YWx1ZXMgPSBwcmVmaXhFeHBhbmQocHJlZml4KS5jb25jYXQoZGF0YSkuY29uY2F0KFswLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSk7XG4gIGNvbnN0IG1vZCA9IHBvbHltb2QodmFsdWVzKTtcbiAgY29uc3QgcmV0OiBudW1iZXJbXSA9IFtdO1xuICBmb3IgKGxldCBpID0gNzsgaSA+PSAwOyBpLS0pIHtcbiAgICByZXQucHVzaChOdW1iZXIoKG1vZCA+PiBCaWdJbnQoNSAqIGkpKSAmIDMxbikpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIHZlcmlmeUNoZWNrc3VtKHByZWZpeDogc3RyaW5nLCBkYXRhOiBudW1iZXJbXSk6IGJvb2xlYW4ge1xuICBjb25zdCB2YWx1ZXMgPSBwcmVmaXhFeHBhbmQocHJlZml4KS5jb25jYXQoZGF0YSk7XG4gIHJldHVybiBwb2x5bW9kKHZhbHVlcykgPT09IDBuO1xufVxuXG5mdW5jdGlvbiBjb252ZXJ0Qml0cyhkYXRhOiBCdWZmZXIgfCBVaW50OEFycmF5LCBmcm9tOiBudW1iZXIsIHRvOiBudW1iZXIsIHBhZDogYm9vbGVhbik6IG51bWJlcltdIHtcbiAgbGV0IGFjYyA9IDA7XG4gIGxldCBiaXRzID0gMDtcbiAgY29uc3QgcmV0OiBudW1iZXJbXSA9IFtdO1xuICBjb25zdCBtYXh2ID0gKDEgPDwgdG8pIC0gMTtcbiAgZm9yIChjb25zdCB2YWx1ZSBvZiBkYXRhKSB7XG4gICAgYWNjID0gKGFjYyA8PCBmcm9tKSB8IHZhbHVlO1xuICAgIGJpdHMgKz0gZnJvbTtcbiAgICB3aGlsZSAoYml0cyA+PSB0bykge1xuICAgICAgYml0cyAtPSB0bztcbiAgICAgIHJldC5wdXNoKChhY2MgPj4gYml0cykgJiBtYXh2KTtcbiAgICB9XG4gIH1cbiAgaWYgKHBhZCAmJiBiaXRzID4gMCkge1xuICAgIHJldC5wdXNoKChhY2MgPDwgKHRvIC0gYml0cykpICYgbWF4dik7XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxuLyoqXG4gKiBFbmNvZGUgZGF0YSBpbnRvIGEgS2FzcGEgYmVjaDMyLWxpa2UgYWRkcmVzcy5cbiAqL1xuZnVuY3Rpb24ga2FzcGFFbmNvZGUocHJlZml4OiBzdHJpbmcsIGRhdGE6IG51bWJlcltdKTogc3RyaW5nIHtcbiAgY29uc3QgY2hlY2tzdW0gPSBjcmVhdGVDaGVja3N1bShwcmVmaXgsIGRhdGEpO1xuICByZXR1cm4gKFxuICAgIHByZWZpeCArXG4gICAgJzonICtcbiAgICBkYXRhXG4gICAgICAuY29uY2F0KGNoZWNrc3VtKVxuICAgICAgLm1hcCgoZCkgPT4gQ0hBUlNFVFtkXSlcbiAgICAgIC5qb2luKCcnKVxuICApO1xufVxuXG4vKipcbiAqIERlY29kZSBhIEthc3BhIGJlY2gzMi1saWtlIGFkZHJlc3MuXG4gKiBSZXR1cm5zIHsgcHJlZml4LCBkYXRhIH0gb3IgdGhyb3dzIG9uIGVycm9yLlxuICovXG5mdW5jdGlvbiBrYXNwYWNEZWNvZGUoYWRkcmVzczogc3RyaW5nKTogeyBwcmVmaXg6IHN0cmluZzsgZGF0YTogbnVtYmVyW10gfSB7XG4gIGNvbnN0IGNvbG9uSWR4ID0gYWRkcmVzcy5sYXN0SW5kZXhPZignOicpO1xuICBpZiAoY29sb25JZHggPCAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHByZWZpeCBzZXBhcmF0b3InKTtcbiAgfVxuICBjb25zdCBwcmVmaXggPSBhZGRyZXNzLnNsaWNlKDAsIGNvbG9uSWR4KS50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBlbmNvZGVkID0gYWRkcmVzcy5zbGljZShjb2xvbklkeCArIDEpLnRvTG93ZXJDYXNlKCk7XG5cbiAgY29uc3QgZGF0YTogbnVtYmVyW10gPSBbXTtcbiAgZm9yIChjb25zdCBjIG9mIGVuY29kZWQpIHtcbiAgICBjb25zdCB2YWwgPSBDSEFSU0VUX1JFVkVSU0VbY107XG4gICAgaWYgKHZhbCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFsaWQgY2hhcmFjdGVyOiAke2N9YCk7XG4gICAgfVxuICAgIGRhdGEucHVzaCh2YWwpO1xuICB9XG5cbiAgaWYgKCF2ZXJpZnlDaGVja3N1bShwcmVmaXgsIGRhdGEpKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNoZWNrc3VtJyk7XG4gIH1cblxuICByZXR1cm4geyBwcmVmaXgsIGRhdGE6IGRhdGEuc2xpY2UoMCwgLTgpIH07XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgS2FzcGEgYWRkcmVzcyAobWFpbm5ldCBvciB0ZXN0bmV0KVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZEthc3BhQWRkcmVzcyhhZGRyZXNzOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFhZGRyZXNzIHx8IHR5cGVvZiBhZGRyZXNzICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IGNvbG9uSWR4ID0gYWRkcmVzcy5sYXN0SW5kZXhPZignOicpO1xuICBpZiAoY29sb25JZHggPCAxKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgY29uc3QgcHJlZml4ID0gYWRkcmVzcy5zbGljZSgwLCBjb2xvbklkeCkudG9Mb3dlckNhc2UoKTtcbiAgaWYgKHByZWZpeCAhPT0gTUFJTk5FVF9QUkVGSVggJiYgcHJlZml4ICE9PSBURVNUTkVUX1BSRUZJWCkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHRyeSB7XG4gICAgY29uc3QgZGVjb2RlZCA9IGthc3BhY0RlY29kZShhZGRyZXNzKTtcbiAgICByZXR1cm4gZGVjb2RlZC5kYXRhLmxlbmd0aCA+IDA7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIFZhbGlkYXRlcyBhIEthc3BhIG1haW5uZXQgYWRkcmVzc1xuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZE1haW5uZXRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gaXNWYWxpZEthc3BhQWRkcmVzcyhhZGRyZXNzKSAmJiBhZGRyZXNzLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aChNQUlOTkVUX1BSRUZJWCArICc6Jyk7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgS2FzcGEgdGVzdG5ldCBhZGRyZXNzXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc1ZhbGlkVGVzdG5ldEFkZHJlc3MoYWRkcmVzczogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiBpc1ZhbGlkS2FzcGFBZGRyZXNzKGFkZHJlc3MpICYmIGFkZHJlc3MudG9Mb3dlckNhc2UoKS5zdGFydHNXaXRoKFRFU1RORVRfUFJFRklYICsgJzonKTtcbn1cblxuLyoqXG4gKiBEZXJpdmUgYSBLYXNwYSBQMlBLIChTY2hub3JyKSBhZGRyZXNzIGZyb20gYSBjb21wcmVzc2VkIHNlY3AyNTZrMSBwdWJsaWMga2V5LlxuICpcbiAqIEBwYXJhbSBjb21wcmVzc2VkUHViS2V5IC0gMzMtYnl0ZSBjb21wcmVzc2VkIHNlY3AyNTZrMSBwdWJsaWMga2V5IChoZXggc3RyaW5nIG9yIEJ1ZmZlcilcbiAqIEBwYXJhbSBocnAgLSBodW1hbi1yZWFkYWJsZSBwYXJ0ICgna2FzcGEnIG9yICdrYXNwYXRlc3QnKVxuICovXG5leHBvcnQgZnVuY3Rpb24gcHViS2V5VG9LYXNwYUFkZHJlc3MoY29tcHJlc3NlZFB1YktleTogc3RyaW5nIHwgQnVmZmVyLCBocnA6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IHB1YktleUJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKGNvbXByZXNzZWRQdWJLZXkpXG4gICAgPyBjb21wcmVzc2VkUHViS2V5XG4gICAgOiBCdWZmZXIuZnJvbShjb21wcmVzc2VkUHViS2V5IGFzIHN0cmluZywgJ2hleCcpO1xuXG4gIGlmIChwdWJLZXlCeXRlcy5sZW5ndGggIT09IDMzKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAzMy1ieXRlIGNvbXByZXNzZWQgcHVibGljIGtleSwgZ290ICR7cHViS2V5Qnl0ZXMubGVuZ3RofWApO1xuICB9XG5cbiAgLy8gWC1vbmx5IHB1YmxpYyBrZXk6IGRyb3AgdGhlIHByZWZpeCBieXRlICgwMiBvciAwMyksIGtlZXAgMzItYnl0ZSB4LWNvb3JkaW5hdGVcbiAgY29uc3QgeE9ubHlQdWJLZXkgPSBwdWJLZXlCeXRlcy5zbGljZSgxKTtcblxuICAvLyBLYXNwYSBQMlBLIGFkZHJlc3M6XG4gIC8vIC0gdmVyc2lvbiBuaWJibGU6IDAgKFNjaG5vcnIgc2VjcDI1NmsxIFAyUEspXG4gIC8vIC0gcGF5bG9hZDogeC1vbmx5IHB1YmxpYyBrZXkgKDMyIGJ5dGVzKVxuICBjb25zdCB2ZXJzaW9uQnl0ZSA9IDA7XG4gIGNvbnN0IHBheWxvYWQgPSBCdWZmZXIuY29uY2F0KFtCdWZmZXIuZnJvbShbdmVyc2lvbkJ5dGVdKSwgeE9ubHlQdWJLZXldKTtcbiAgY29uc3Qgd29yZHMgPSBjb252ZXJ0Qml0cyhwYXlsb2FkLCA4LCA1LCB0cnVlKTtcblxuICByZXR1cm4ga2FzcGFFbmNvZGUoaHJwLCB3b3Jkcyk7XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgc2VjcDI1NmsxIHB1YmxpYyBrZXkgKGNvbXByZXNzZWQgb3IgdW5jb21wcmVzc2VkKVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFB1YmxpY0tleShwdWI6IHN0cmluZyk6IGJvb2xlYW4ge1xuICBpZiAoIXB1YiB8fCB0eXBlb2YgcHViICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB0cnkge1xuICAgIGNvbnN0IGJ1ZiA9IEJ1ZmZlci5mcm9tKHB1YiwgJ2hleCcpO1xuICAgIGlmIChidWYubGVuZ3RoID09PSAzMykge1xuICAgICAgcmV0dXJuIGJ1ZlswXSA9PT0gMHgwMiB8fCBidWZbMF0gPT09IDB4MDM7XG4gICAgfVxuICAgIGlmIChidWYubGVuZ3RoID09PSA2NSkge1xuICAgICAgcmV0dXJuIGJ1ZlswXSA9PT0gMHgwNDtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuLyoqXG4gKiBWYWxpZGF0ZXMgYSBzZWNwMjU2azEgcHJpdmF0ZSBrZXkgKDMyLWJ5dGUgaGV4KVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFByaXZhdGVLZXkocHJ2OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKCFwcnYgfHwgdHlwZW9mIHBydiAhPT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgaWYgKGlzVmFsaWRYcHJ2KHBydikgfHwgaXNWYWxpZFhwdWIocHJ2KSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHRyeSB7XG4gICAgY29uc3QgYnVmID0gQnVmZmVyLmZyb20ocHJ2LnNsaWNlKDAsIDY0KSwgJ2hleCcpO1xuICAgIHJldHVybiBidWYubGVuZ3RoID09PSAzMjtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIGEgdHJhbnNhY3Rpb24gSUQgKDY0LWNoYXIgaGV4KVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNWYWxpZFRyYW5zYWN0aW9uSWQodHhJZDogc3RyaW5nKTogYm9vbGVhbiB7XG4gIHJldHVybiAvXlswLTlhLWZBLUZdezY0fSQvLnRlc3QodHhJZCk7XG59XG5cbmV4cG9ydCBjbGFzcyBVdGlscyBpbXBsZW1lbnRzIEJhc2VVdGlscyB7XG4gIGlzVmFsaWRBZGRyZXNzKGFkZHJlc3M6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ZhbGlkS2FzcGFBZGRyZXNzKGFkZHJlc3MpO1xuICB9XG5cbiAgaXNWYWxpZEJsb2NrSWQoaGFzaDogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIC9eWzAtOWEtZkEtRl17NjR9JC8udGVzdChoYXNoKTtcbiAgfVxuXG4gIGlzVmFsaWRQcml2YXRlS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVmFsaWRQcml2YXRlS2V5KGtleSk7XG4gIH1cblxuICBpc1ZhbGlkUHVibGljS2V5KGtleTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIGlzVmFsaWRQdWJsaWNLZXkoa2V5KTtcbiAgfVxuXG4gIGlzVmFsaWRTaWduYXR1cmUoc2lnbmF0dXJlOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gL15bMC05YS1mQS1GXXsxMjgsMTMwfSQvLnRlc3Qoc2lnbmF0dXJlKTtcbiAgfVxuXG4gIGlzVmFsaWRUcmFuc2FjdGlvbklkKHR4SWQ6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpc1ZhbGlkVHJhbnNhY3Rpb25JZCh0eElkKTtcbiAgfVxufVxuXG5jb25zdCB1dGlscyA9IG5ldyBVdGlscygpO1xuZXhwb3J0IGRlZmF1bHQgdXRpbHM7XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAGjD,eAAO,MAAM,QAAQ,QAAS,SAAS,KAAG,IAGzC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.register = void 0;
|
|
4
|
+
const kaspa_1 = require("./kaspa");
|
|
5
|
+
const register = (sdk) => {
|
|
6
|
+
sdk.register('kaspa', kaspa_1.Kaspa.createInstance);
|
|
7
|
+
sdk.register('tkaspa', kaspa_1.Kaspa.createInstance);
|
|
8
|
+
};
|
|
9
|
+
exports.register = register;
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVnaXN0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVnaXN0ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsbUNBQWdDO0FBRXpCLE1BQU0sUUFBUSxHQUFHLENBQUMsR0FBYyxFQUFRLEVBQUU7SUFDL0MsR0FBRyxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsYUFBSyxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzVDLEdBQUcsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLGFBQUssQ0FBQyxjQUFjLENBQUMsQ0FBQztBQUMvQyxDQUFDLENBQUM7QUFIVyxRQUFBLFFBQVEsWUFHbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCaXRHb0Jhc2UgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBLYXNwYSB9IGZyb20gJy4va2FzcGEnO1xuXG5leHBvcnQgY29uc3QgcmVnaXN0ZXIgPSAoc2RrOiBCaXRHb0Jhc2UpOiB2b2lkID0+IHtcbiAgc2RrLnJlZ2lzdGVyKCdrYXNwYScsIEthc3BhLmNyZWF0ZUluc3RhbmNlKTtcbiAgc2RrLnJlZ2lzdGVyKCd0a2FzcGEnLCBLYXNwYS5jcmVhdGVJbnN0YW5jZSk7XG59O1xuIl19
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kaspa (KASPA) Test Fixtures
|
|
3
|
+
*
|
|
4
|
+
* Deterministic test data derived from a fixed private key.
|
|
5
|
+
* Do NOT use these keys in production.
|
|
6
|
+
*/
|
|
7
|
+
import { KaspaTransactionData, KaspaUtxoInput } from '../../src/lib/iface';
|
|
8
|
+
export declare const TEST_PRV_KEY = "b94f5374fce5edbc8e2a8697c15331677e6ebf0b000000000000000000000001";
|
|
9
|
+
export declare const KEYS: {
|
|
10
|
+
prv: string;
|
|
11
|
+
pub: string;
|
|
12
|
+
};
|
|
13
|
+
export declare const ADDRESSES: {
|
|
14
|
+
valid: string;
|
|
15
|
+
testnet: string;
|
|
16
|
+
invalid: string;
|
|
17
|
+
sender: string;
|
|
18
|
+
recipient: string;
|
|
19
|
+
};
|
|
20
|
+
export declare const SCRIPT_PUBLIC_KEY: string;
|
|
21
|
+
export declare const UTXOS: {
|
|
22
|
+
readonly simple: KaspaUtxoInput;
|
|
23
|
+
readonly second: KaspaUtxoInput;
|
|
24
|
+
};
|
|
25
|
+
export declare const TRANSACTIONS: {
|
|
26
|
+
readonly simple: KaspaTransactionData;
|
|
27
|
+
readonly multiInput: KaspaTransactionData;
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=kaspa.fixtures.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"kaspa.fixtures.d.ts","sourceRoot":"","sources":["../../../test/fixtures/kaspa.fixtures.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH,OAAO,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG3E,eAAO,MAAM,YAAY,qEAAqE,CAAC;AAO/F,eAAO,MAAM,IAAI;;;CAGhB,CAAC;AAEF,eAAO,MAAM,SAAS;;;;;;CAMrB,CAAC;AAEF,eAAO,MAAM,iBAAiB,QAAmB,CAAC;AAGlD,eAAO,MAAM,KAAK;qBACF,cAAc;qBAUd,cAAc;CAU7B,CAAC;AAGF,eAAO,MAAM,YAAY;qBACT,oBAAoB;yBAmBhB,oBAAoB;CAmBvC,CAAC"}
|