@bitgo/sdk-core 1.0.1 → 1.1.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +27 -0
- package/dist/src/account-lib/baseCoin/baseKeyPair.d.ts +27 -0
- package/dist/src/account-lib/baseCoin/baseKeyPair.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/baseKeyPair.js +3 -0
- package/dist/src/account-lib/baseCoin/baseTransaction.d.ts +71 -0
- package/dist/src/account-lib/baseCoin/baseTransaction.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/baseTransaction.js +69 -0
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts +128 -0
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/baseTransactionBuilder.js +138 -0
- package/dist/src/account-lib/baseCoin/baseTransactionBuilderFactory.d.ts +29 -0
- package/dist/src/account-lib/baseCoin/baseTransactionBuilderFactory.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/baseTransactionBuilderFactory.js +19 -0
- package/dist/src/account-lib/baseCoin/baseUtils.d.ts +45 -0
- package/dist/src/account-lib/baseCoin/baseUtils.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/baseUtils.js +3 -0
- package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts +75 -0
- package/dist/src/account-lib/baseCoin/blsKeyPair.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/blsKeyPair.js +179 -0
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts +50 -0
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/ed25519KeyPair.js +145 -0
- package/dist/src/account-lib/baseCoin/enum.d.ts +43 -0
- package/dist/src/account-lib/baseCoin/enum.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/enum.js +70 -0
- package/dist/src/account-lib/baseCoin/errors.d.ts +65 -0
- package/dist/src/account-lib/baseCoin/errors.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/errors.js +114 -0
- package/dist/src/account-lib/baseCoin/iface.d.ts +162 -0
- package/dist/src/account-lib/baseCoin/iface.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/iface.js +38 -0
- package/dist/src/account-lib/baseCoin/index.d.ts +12 -0
- package/dist/src/account-lib/baseCoin/index.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/index.js +31 -0
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts +55 -0
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.d.ts.map +1 -0
- package/dist/src/account-lib/baseCoin/secp256k1ExtendedKeyPair.js +124 -0
- package/dist/src/account-lib/index.d.ts +4 -0
- package/dist/src/account-lib/index.d.ts.map +1 -0
- package/dist/src/account-lib/index.js +16 -0
- package/dist/src/account-lib/util/crypto.d.ts +106 -0
- package/dist/src/account-lib/util/crypto.d.ts.map +1 -0
- package/dist/src/account-lib/util/crypto.js +269 -0
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts +49 -0
- package/dist/src/account-lib/util/ed25519KeyDeriver.d.ts.map +1 -0
- package/dist/src/account-lib/util/ed25519KeyDeriver.js +87 -0
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +2 -1
- package/dist/src/v2/environments.d.ts.map +1 -1
- package/dist/src/v2/environments.js +2 -2
- package/dist/tsconfig.tsbuildinfo +1679 -118
- package/package.json +23 -12
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
import { BaseKeyPair } from './baseKeyPair';
|
|
3
|
+
import { AddressFormat } from './enum';
|
|
4
|
+
import { BlsKeys, KeyPairOptions } from './iface';
|
|
5
|
+
/**
|
|
6
|
+
* Base class for BLS keypairs.
|
|
7
|
+
*/
|
|
8
|
+
export declare abstract class BlsKeyPair implements BaseKeyPair {
|
|
9
|
+
protected keyPair: BlsKeys;
|
|
10
|
+
/**
|
|
11
|
+
* Public constructor. By default, creates a key pair with a random polynomial.
|
|
12
|
+
*
|
|
13
|
+
* @param {KeyPairOptions} source Either a dkg options, a public and secret shares, or a private key
|
|
14
|
+
*/
|
|
15
|
+
protected constructor(source?: KeyPairOptions);
|
|
16
|
+
createShares(threshold: number, participants: number): void;
|
|
17
|
+
/**
|
|
18
|
+
* Note - this is not possible using BLS. BLS does not support prvkey derived key gen
|
|
19
|
+
*
|
|
20
|
+
* @param {string[]} prv a hexadecimal private key
|
|
21
|
+
*/
|
|
22
|
+
recordKeysFromPrivateKey(prv: string): void;
|
|
23
|
+
/**
|
|
24
|
+
* Note - this is not possible using BLS. BLS does not support pubkey derived key gen
|
|
25
|
+
*
|
|
26
|
+
* @param {string} pub - An extended, compressed, or uncompressed public key
|
|
27
|
+
*/
|
|
28
|
+
recordKeysFromPublicKey(pub: string): void;
|
|
29
|
+
getAddress(format?: AddressFormat): string;
|
|
30
|
+
getKeys(): any;
|
|
31
|
+
/**
|
|
32
|
+
* Signs bytes using the key pair
|
|
33
|
+
*
|
|
34
|
+
* @param msg The message bytes to sign
|
|
35
|
+
* @return signature of the bytes using this keypair
|
|
36
|
+
*/
|
|
37
|
+
sign(msg: Buffer): Promise<string>;
|
|
38
|
+
/**
|
|
39
|
+
* Aggregates the secret shares of different key pairs into one private key
|
|
40
|
+
*
|
|
41
|
+
* @param prvKeys an array of secret shares
|
|
42
|
+
* @returns a private key
|
|
43
|
+
*/
|
|
44
|
+
static aggregatePrvkeys(prvKeys: string[]): string;
|
|
45
|
+
/**
|
|
46
|
+
* Aggregates the public shares of different key pairs into a common public key
|
|
47
|
+
*
|
|
48
|
+
* @param pubKeys an array of public shares
|
|
49
|
+
* @returns a common public key
|
|
50
|
+
*/
|
|
51
|
+
static aggregatePubkeys(pubKeys: string[]): string;
|
|
52
|
+
/**
|
|
53
|
+
* Aggregates the message signed by different key pairs into one sign
|
|
54
|
+
*
|
|
55
|
+
* @param signatures the message signed by different key pairs. The signer id is relevant to ensure a valid signature.
|
|
56
|
+
* @example <caption> E.g., the message is signed by user and wallet, then signatures would be:</caption>
|
|
57
|
+
* {
|
|
58
|
+
* 1: BigInt(messageSignedWithUserPrv),
|
|
59
|
+
* 3: BigInt(messageSignedWithWalletPrv),
|
|
60
|
+
* }
|
|
61
|
+
* @returns a signature combining all the provided signed messages
|
|
62
|
+
*/
|
|
63
|
+
static aggregateSignatures(signatures: {
|
|
64
|
+
[n: number]: bigint;
|
|
65
|
+
}): string;
|
|
66
|
+
/**
|
|
67
|
+
* Verifies the signature for this key pair
|
|
68
|
+
* @param pub The public key with which to verify the signature
|
|
69
|
+
* @param msg The message to verify the signature with
|
|
70
|
+
* @param signature the signature to verify
|
|
71
|
+
* @return true if the signature is valid, else false
|
|
72
|
+
*/
|
|
73
|
+
static verifySignature(pub: string, msg: Buffer, signature: string): Promise<boolean>;
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=blsKeyPair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blsKeyPair.d.ts","sourceRoot":"","sources":["../../../../src/account-lib/baseCoin/blsKeyPair.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEvC,OAAO,EAAE,OAAO,EAAE,cAAc,EAAiC,MAAM,SAAS,CAAC;AAMjF;;GAEG;AACH,8BAAsB,UAAW,YAAW,WAAW;IACrD,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC;IAE3B;;;;OAIG;IACH,SAAS,aAAa,MAAM,CAAC,EAAE,cAAc;IAoB7C,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,GAAG,IAAI;IAa3D;;;;OAIG;IACH,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI3C;;;;OAIG;IACH,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAI1C,UAAU,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,MAAM;IAI1C,OAAO,IAAI,GAAG;IAId;;;;;OAKG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAQxC;;;;;OAKG;WACW,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM;IAWzD;;;;;OAKG;WACW,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM;IAUzD;;;;;;;;;;OAUG;WACW,mBAAmB,CAAC,UAAU,EAAE;QAAE,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;KAAE,GAAG,MAAM;IAS9E;;;;;;OAMG;WACiB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAInG"}
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
22
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
23
|
+
};
|
|
24
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
25
|
+
exports.BlsKeyPair = void 0;
|
|
26
|
+
const assert_1 = __importDefault(require("assert"));
|
|
27
|
+
const BLS = __importStar(require("@bitgo/bls-dkg"));
|
|
28
|
+
const errors_1 = require("./errors");
|
|
29
|
+
const iface_1 = require("./iface");
|
|
30
|
+
const crypto_1 = require("../util/crypto");
|
|
31
|
+
const DEFAULT_SIGNATURE_THRESHOLD = 2;
|
|
32
|
+
const DEFAULT_SIGNATURE_PARTICIPANTS = 3;
|
|
33
|
+
/**
|
|
34
|
+
* Base class for BLS keypairs.
|
|
35
|
+
*/
|
|
36
|
+
class BlsKeyPair {
|
|
37
|
+
/**
|
|
38
|
+
* Public constructor. By default, creates a key pair with a random polynomial.
|
|
39
|
+
*
|
|
40
|
+
* @param {KeyPairOptions} source Either a dkg options, a public and secret shares, or a private key
|
|
41
|
+
*/
|
|
42
|
+
constructor(source) {
|
|
43
|
+
if (!source) {
|
|
44
|
+
this.createShares(DEFAULT_SIGNATURE_THRESHOLD, DEFAULT_SIGNATURE_PARTICIPANTS);
|
|
45
|
+
}
|
|
46
|
+
else if (iface_1.isDkg(source)) {
|
|
47
|
+
this.createShares(source.threshold, source.participants);
|
|
48
|
+
}
|
|
49
|
+
else if (iface_1.isBlsKey(source)) {
|
|
50
|
+
assert_1.default(source.secretShares.every(crypto_1.isValidBLSPrivateKey), 'Invalid private keys');
|
|
51
|
+
assert_1.default(crypto_1.isValidBLSPublicKey(source.publicShare), 'Invalid public key');
|
|
52
|
+
this.keyPair = source;
|
|
53
|
+
}
|
|
54
|
+
else if (iface_1.isPrivateKey(source)) {
|
|
55
|
+
this.keyPair = {
|
|
56
|
+
prv: source.prv,
|
|
57
|
+
publicShare: '',
|
|
58
|
+
secretShares: [],
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
throw new Error('Invalid key pair options');
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
createShares(threshold, participants) {
|
|
66
|
+
if (participants < threshold) {
|
|
67
|
+
throw new Error('Participants should be greater than threshold');
|
|
68
|
+
}
|
|
69
|
+
const polynomial = BLS.generatePolynomial(threshold);
|
|
70
|
+
const keySecretShares = BLS.secretShares(polynomial, participants);
|
|
71
|
+
const keyPublicShare = BLS.publicShare(polynomial);
|
|
72
|
+
this.keyPair = {
|
|
73
|
+
secretShares: keySecretShares.map((secretShare) => crypto_1.bigIntToHex(secretShare)),
|
|
74
|
+
publicShare: crypto_1.bigIntToHex(keyPublicShare),
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Note - this is not possible using BLS. BLS does not support prvkey derived key gen
|
|
79
|
+
*
|
|
80
|
+
* @param {string[]} prv a hexadecimal private key
|
|
81
|
+
*/
|
|
82
|
+
recordKeysFromPrivateKey(prv) {
|
|
83
|
+
throw new errors_1.NotImplementedError('Private key derivation is not supported in bls');
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Note - this is not possible using BLS. BLS does not support pubkey derived key gen
|
|
87
|
+
*
|
|
88
|
+
* @param {string} pub - An extended, compressed, or uncompressed public key
|
|
89
|
+
*/
|
|
90
|
+
recordKeysFromPublicKey(pub) {
|
|
91
|
+
throw new errors_1.NotImplementedError('Public key derivation is not supported in bls');
|
|
92
|
+
}
|
|
93
|
+
getAddress(format) {
|
|
94
|
+
throw new errors_1.NotImplementedError('getAddress not implemented');
|
|
95
|
+
}
|
|
96
|
+
getKeys() {
|
|
97
|
+
throw new errors_1.NotImplementedError('getKeys not implemented');
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Signs bytes using the key pair
|
|
101
|
+
*
|
|
102
|
+
* @param msg The message bytes to sign
|
|
103
|
+
* @return signature of the bytes using this keypair
|
|
104
|
+
*/
|
|
105
|
+
async sign(msg) {
|
|
106
|
+
var _a;
|
|
107
|
+
if ((_a = this.keyPair) === null || _a === void 0 ? void 0 : _a.prv) {
|
|
108
|
+
const signedMessage = await BLS.sign(msg, BigInt(this.keyPair.prv));
|
|
109
|
+
return crypto_1.bigIntToHex(signedMessage);
|
|
110
|
+
}
|
|
111
|
+
throw new Error('Missing private key');
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Aggregates the secret shares of different key pairs into one private key
|
|
115
|
+
*
|
|
116
|
+
* @param prvKeys an array of secret shares
|
|
117
|
+
* @returns a private key
|
|
118
|
+
*/
|
|
119
|
+
static aggregatePrvkeys(prvKeys) {
|
|
120
|
+
assert_1.default(prvKeys.every(crypto_1.isValidBLSPrivateKey), 'Invalid private keys');
|
|
121
|
+
try {
|
|
122
|
+
const secretShares = prvKeys.map((secretShare) => BigInt(secretShare));
|
|
123
|
+
const prv = BLS.mergeSecretShares(secretShares);
|
|
124
|
+
return crypto_1.bigIntToHex(prv);
|
|
125
|
+
}
|
|
126
|
+
catch (e) {
|
|
127
|
+
throw new Error('Error aggregating prvkeys: ' + e);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Aggregates the public shares of different key pairs into a common public key
|
|
132
|
+
*
|
|
133
|
+
* @param pubKeys an array of public shares
|
|
134
|
+
* @returns a common public key
|
|
135
|
+
*/
|
|
136
|
+
static aggregatePubkeys(pubKeys) {
|
|
137
|
+
try {
|
|
138
|
+
const secretShares = pubKeys.map((secretShare) => BigInt(secretShare));
|
|
139
|
+
const commonPubKey = BLS.mergePublicShares(secretShares);
|
|
140
|
+
return crypto_1.bigIntToHex(commonPubKey);
|
|
141
|
+
}
|
|
142
|
+
catch (e) {
|
|
143
|
+
throw new Error('Error aggregating pubkeys: ' + e);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Aggregates the message signed by different key pairs into one sign
|
|
148
|
+
*
|
|
149
|
+
* @param signatures the message signed by different key pairs. The signer id is relevant to ensure a valid signature.
|
|
150
|
+
* @example <caption> E.g., the message is signed by user and wallet, then signatures would be:</caption>
|
|
151
|
+
* {
|
|
152
|
+
* 1: BigInt(messageSignedWithUserPrv),
|
|
153
|
+
* 3: BigInt(messageSignedWithWalletPrv),
|
|
154
|
+
* }
|
|
155
|
+
* @returns a signature combining all the provided signed messages
|
|
156
|
+
*/
|
|
157
|
+
static aggregateSignatures(signatures) {
|
|
158
|
+
try {
|
|
159
|
+
const signature = BLS.mergeSignatures(signatures);
|
|
160
|
+
return crypto_1.bigIntToHex(signature);
|
|
161
|
+
}
|
|
162
|
+
catch (e) {
|
|
163
|
+
throw new Error('Error aggregating signatures: ' + e);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Verifies the signature for this key pair
|
|
168
|
+
* @param pub The public key with which to verify the signature
|
|
169
|
+
* @param msg The message to verify the signature with
|
|
170
|
+
* @param signature the signature to verify
|
|
171
|
+
* @return true if the signature is valid, else false
|
|
172
|
+
*/
|
|
173
|
+
static async verifySignature(pub, msg, signature) {
|
|
174
|
+
assert_1.default(crypto_1.isValidBLSPublicKey(pub), `Invalid public key: ${pub}`);
|
|
175
|
+
return await BLS.verify(BigInt(signature), msg, BigInt(pub));
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
exports.BlsKeyPair = BlsKeyPair;
|
|
179
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxzS2V5UGFpci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hY2NvdW50LWxpYi9iYXNlQ29pbi9ibHNLZXlQYWlyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxvREFBNEI7QUFDNUIsb0RBQXNDO0FBR3RDLHFDQUErQztBQUMvQyxtQ0FBaUY7QUFDakYsMkNBQXdGO0FBRXhGLE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxDQUFDO0FBQ3RDLE1BQU0sOEJBQThCLEdBQUcsQ0FBQyxDQUFDO0FBRXpDOztHQUVHO0FBQ0gsTUFBc0IsVUFBVTtJQUc5Qjs7OztPQUlHO0lBQ0gsWUFBc0IsTUFBdUI7UUFDM0MsSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNYLElBQUksQ0FBQyxZQUFZLENBQUMsMkJBQTJCLEVBQUUsOEJBQThCLENBQUMsQ0FBQztTQUNoRjthQUFNLElBQUksYUFBSyxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3hCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDMUQ7YUFBTSxJQUFJLGdCQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDM0IsZ0JBQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssQ0FBQyw2QkFBb0IsQ0FBQyxFQUFFLHNCQUFzQixDQUFDLENBQUM7WUFDaEYsZ0JBQU0sQ0FBQyw0QkFBbUIsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztZQUN0RSxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQztTQUN2QjthQUFNLElBQUksb0JBQVksQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMvQixJQUFJLENBQUMsT0FBTyxHQUFHO2dCQUNiLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRztnQkFDZixXQUFXLEVBQUUsRUFBRTtnQkFD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QUN6RCxPQUFPLG9CQUFXLENBQUMsWUFBWSxDQUFDLENBQUM7U0FDbEM7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsNkJBQTZCLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDcEQ7SUFDSCxDQUFDO0lBRUQ7Ozs7Ozs7Ozs7T0FVRztJQUNJLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQyxVQUFtQztRQUNuRSxJQUFJO1lBQ0YsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLGVBQWUsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNsRCxPQUFPLG9CQUFXLENBQUMsU0FBUyxDQUFDLENBQUM7U0FDL0I7UUFBQyxPQUFPLENBQUMsRUFBRTtZQUNWLE1BQU0sSUFBSSxLQUFLLENBQUMsZ0NBQWdDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDdkQ7SUFDSCxDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxlQUFlLENBQUMsR0FBVyxFQUFFLEdBQVcsRUFBRSxTQUFpQjtRQUM3RSxnQkFBTSxDQUFDLDRCQUFtQixDQUFDLEdBQUcsQ0FBQyxFQUFFLHVCQUF1QixHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sTUFBTSxHQUFHLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRSxHQUFHLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDL0QsQ0FBQztDQUNGO0FBakpELGdDQWlKQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBhc3NlcnQgZnJvbSAnYXNzZXJ0JztcbmltcG9ydCAqIGFzIEJMUyBmcm9tICdAYml0Z28vYmxzLWRrZyc7XG5pbXBvcnQgeyBCYXNlS2V5UGFpciB9IGZyb20gJy4vYmFzZUtleVBhaXInO1xuaW1wb3J0IHsgQWRkcmVzc0Zvcm1hdCB9IGZyb20gJy4vZW51bSc7XG5pbXBvcnQgeyBOb3RJbXBsZW1lbnRlZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuaW1wb3J0IHsgQmxzS2V5cywgS2V5UGFpck9wdGlvbnMsIGlzRGtnLCBpc0Jsc0tleSwgaXNQcml2YXRlS2V5IH0gZnJvbSAnLi9pZmFjZSc7XG5pbXBvcnQgeyBpc1ZhbGlkQkxTUHVibGljS2V5LCBpc1ZhbGlkQkxTUHJpdmF0ZUtleSwgYmlnSW50VG9IZXggfSBmcm9tICcuLi91dGlsL2NyeXB0byc7XG5cbmNvbnN0IERFRkFVTFRfU0lHTkFUVVJFX1RIUkVTSE9MRCA9IDI7XG5jb25zdCBERUZBVUxUX1NJR05BVFVSRV9QQVJUSUNJUEFOVFMgPSAzO1xuXG4vKipcbiAqIEJhc2UgY2xhc3MgZm9yIEJMUyBrZXlwYWlycy5cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJsc0tleVBhaXIgaW1wbGVtZW50cyBCYXNlS2V5UGFpciB7XG4gIHByb3RlY3RlZCBrZXlQYWlyOiBCbHNLZXlzO1xuXG4gIC8qKlxuICAgKiBQdWJsaWMgY29uc3RydWN0b3IuIEJ5IGRlZmF1bHQsIGNyZWF0ZXMgYSBrZXkgcGFpciB3aXRoIGEgcmFuZG9tIHBvbHlub21pYWwuXG4gICAqXG4gICAqIEBwYXJhbSB7S2V5UGFpck9wdGlvbnN9IHNvdXJjZSBFaXRoZXIgYSBka2cgb3B0aW9ucywgYSBwdWJsaWMgYW5kIHNlY3JldCBzaGFyZXMsIG9yIGEgcHJpdmF0ZSBrZXlcbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihzb3VyY2U/OiBLZXlQYWlyT3B0aW9ucykge1xuICAgIGlmICghc291cmNlKSB7XG4gICAgICB0aGlzLmNyZWF0ZVNoYXJlcyhERUZBVUxUX1NJR05BVFVSRV9USFJFU0hPTEQsIERFRkFVTFRfU0lHTkFUVVJFX1BBUlRJQ0lQQU5UUyk7XG4gICAgfSBlbHNlIGlmIChpc0RrZyhzb3VyY2UpKSB7XG4gICAgICB0aGlzLmNyZWF0ZVNoYXJlcyhzb3VyY2UudGhyZXNob2xkLCBzb3VyY2UucGFydGljaXBhbnRzKTtcbiAgICB9IGVsc2UgaWYgKGlzQmxzS2V5KHNvdXJjZSkpIHtcbiAgICAgIGFzc2VydChzb3VyY2Uuc2VjcmV0U2hhcmVzLmV2ZXJ5KGlzVmFsaWRCTFNQcml2YXRlS2V5KSwgJ0ludmFsaWQgcHJpdmF0ZSBrZXlzJyk7XG4gICAgICBhc3NlcnQoaXNWYWxpZEJMU1B1YmxpY0tleShzb3VyY2UucHVibGljU2hhcmUpLCAnSW52YWxpZCBwdWJsaWMga2V5Jyk7XG4gICAgICB0aGlzLmtleVBhaXIgPSBzb3VyY2U7XG4gICAgfSBlbHNlIGlmIChpc1ByaXZhdGVLZXkoc291cmNlKSkge1xuICAgICAgdGhpcy5rZXlQYWlyID0ge1xuICAgICAgICBwcnY6IHNvdXJjZS5wcnYsXG4gICAgICAgIHB1YmxpY1NoYXJlOiAnJyxcbiAgICAgICAgc2VjcmV0U2hhcmVzOiBbXSxcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBrZXkgcGFpciBvcHRpb25zJyk7XG4gICAgfVxuICB9XG5cbiAgY3JlYXRlU2hhcmVzKHRocmVzaG9sZDogbnVtYmVyLCBwYXJ0aWNpcGFudHM6IG51bWJlcik6IHZvaWQge1xuICAgIGlmIChwYXJ0aWNpcGFudHMgPCB0aHJlc2hvbGQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignUGFydGljaXBhbnRzIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gdGhyZXNob2xkJyk7XG4gICAgfVxuICAgIGNvbnN0IHBvbHlub21pYWwgPSBCTFMuZ2VuZXJhdGVQb2x5bm9taWFsKHRocmVzaG9sZCk7XG4gICAgY29uc3Qga2V5U2VjcmV0U2hhcmVzID0gQkxTLnNlY3JldFNoYXJlcyhwb2x5bm9taWFsLCBwYXJ0aWNpcGFudHMpO1xuICAgIGNvbnN0IGtleVB1YmxpY1NoYXJlID0gQkxTLnB1YmxpY1NoYXJlKHBvbHlub21pYWwpO1xuICAgIHRoaXMua2V5UGFpciA9IHtcbiAgICAgIHNlY3JldFNoYXJlczoga2V5U2VjcmV0U2hhcmVzLm1hcCgoc2VjcmV0U2hhcmUpID0+IGJpZ0ludFRvSGV4KHNlY3JldFNoYXJlKSksXG4gICAgICBwdWJsaWNTaGFyZTogYmlnSW50VG9IZXgoa2V5UHVibGljU2hhcmUpLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogTm90ZSAtIHRoaXMgaXMgbm90IHBvc3NpYmxlIHVzaW5nIEJMUy4gQkxTIGRvZXMgbm90IHN1cHBvcnQgcHJ2a2V5IGRlcml2ZWQga2V5IGdlblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwcnYgYSBoZXhhZGVjaW1hbCBwcml2YXRlIGtleVxuICAgKi9cbiAgcmVjb3JkS2V5c0Zyb21Qcml2YXRlS2V5KHBydjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ1ByaXZhdGUga2V5IGRlcml2YXRpb24gaXMgbm90IHN1cHBvcnRlZCBpbiBibHMnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBOb3RlIC0gdGhpcyBpcyBub3QgcG9zc2libGUgdXNpbmcgQkxTLiBCTFMgZG9lcyBub3Qgc3VwcG9ydCBwdWJrZXkgZGVyaXZlZCBrZXkgZ2VuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwdWIgLSBBbiBleHRlbmRlZCwgY29tcHJlc3NlZCwgb3IgdW5jb21wcmVzc2VkIHB1YmxpYyBrZXlcbiAgICovXG4gIHJlY29yZEtleXNGcm9tUHVibGljS2V5KHB1Yjogc3RyaW5nKTogdm9pZCB7XG4gICAgdGhyb3cgbmV3IE5vdEltcGxlbWVudGVkRXJyb3IoJ1B1YmxpYyBrZXkgZGVyaXZhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGluIGJscycpO1xuICB9XG5cbiAgZ2V0QWRkcmVzcyhmb3JtYXQ/OiBBZGRyZXNzRm9ybWF0KTogc3RyaW5nIHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignZ2V0QWRkcmVzcyBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIGdldEtleXMoKTogYW55IHtcbiAgICB0aHJvdyBuZXcgTm90SW1wbGVtZW50ZWRFcnJvcignZ2V0S2V5cyBub3QgaW1wbGVtZW50ZWQnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaWducyBieXRlcyB1c2luZyB0aGUga2V5IHBhaXJcbiAgICpcbiAgICogQHBhcmFtIG1zZyBUaGUgbWVzc2FnZSBieXRlcyB0byBzaWduXG4gICAqIEByZXR1cm4gc2lnbmF0dXJlIG9mIHRoZSBieXRlcyB1c2luZyB0aGlzIGtleXBhaXJcbiAgICovXG4gIGFzeW5jIHNpZ24obXNnOiBCdWZmZXIpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGlmICh0aGlzLmtleVBhaXI/LnBydikge1xuICAgICAgY29uc3Qgc2lnbmVkTWVzc2FnZSA9IGF3YWl0IEJMUy5zaWduKG1zZywgQmlnSW50KHRoaXMua2V5UGFpci5wcnYpKTtcbiAgICAgIHJldHVybiBiaWdJbnRUb0hleChzaWduZWRNZXNzYWdlKTtcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHByaXZhdGUga2V5Jyk7XG4gIH1cblxuICAvKipcbiAgICogQWdncmVnYXRlcyB0aGUgc2VjcmV0IHNoYXJlcyBvZiBkaWZmZXJlbnQga2V5IHBhaXJzIGludG8gb25lIHByaXZhdGUga2V5XG4gICAqXG4gICAqIEBwYXJhbSBwcnZLZXlzIGFuIGFycmF5IG9mIHNlY3JldCBzaGFyZXNcbiAgICogQHJldHVybnMgYSBwcml2YXRlIGtleVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBhZ2dyZWdhdGVQcnZrZXlzKHBydktleXM6IHN0cmluZ1tdKTogc3RyaW5nIHtcbiAgICBhc3NlcnQocHJ2S2V5cy5ldmVyeShpc1ZhbGlkQkxTUHJpdmF0ZUtleSksICdJbnZhbGlkIHByaXZhdGUga2V5cycpO1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzZWNyZXRTaGFyZXMgPSBwcnZLZXlzLm1hcCgoc2VjcmV0U2hhcmUpID0+IEJpZ0ludChzZWNyZXRTaGFyZSkpO1xuICAgICAgY29uc3QgcHJ2ID0gQkxTLm1lcmdlU2VjcmV0U2hhcmVzKHNlY3JldFNoYXJlcyk7XG4gICAgICByZXR1cm4gYmlnSW50VG9IZXgocHJ2KTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Vycm9yIGFnZ3JlZ2F0aW5nIHBydmtleXM6ICcgKyBlKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQWdncmVnYXRlcyB0aGUgcHVibGljIHNoYXJlcyBvZiBkaWZmZXJlbnQga2V5IHBhaXJzIGludG8gYSBjb21tb24gcHVibGljIGtleVxuICAgKlxuICAgKiBAcGFyYW0gcHViS2V5cyBhbiBhcnJheSBvZiBwdWJsaWMgc2hhcmVzXG4gICAqIEByZXR1cm5zIGEgY29tbW9uIHB1YmxpYyBrZXlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgYWdncmVnYXRlUHVia2V5cyhwdWJLZXlzOiBzdHJpbmdbXSk6IHN0cmluZyB7XG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHNlY3JldFNoYXJlcyA9IHB1YktleXMubWFwKChzZWNyZXRTaGFyZSkgPT4gQmlnSW50KHNlY3JldFNoYXJlKSk7XG4gICAgICBjb25zdCBjb21tb25QdWJLZXkgPSBCTFMubWVyZ2VQdWJsaWNTaGFyZXMoc2VjcmV0U2hhcmVzKTtcbiAgICAgIHJldHVybiBiaWdJbnRUb0hleChjb21tb25QdWJLZXkpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignRXJyb3IgYWdncmVnYXRpbmcgcHVia2V5czogJyArIGUpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBBZ2dyZWdhdGVzIHRoZSBtZXNzYWdlIHNpZ25lZCBieSBkaWZmZXJlbnQga2V5IHBhaXJzIGludG8gb25lIHNpZ25cbiAgICpcbiAgICogQHBhcmFtIHNpZ25hdHVyZXMgdGhlIG1lc3NhZ2Ugc2lnbmVkIGJ5IGRpZmZlcmVudCBrZXkgcGFpcnMuIFRoZSBzaWduZXIgaWQgaXMgcmVsZXZhbnQgdG8gZW5zdXJlIGEgdmFsaWQgc2lnbmF0dXJlLlxuICAgKiBAZXhhbXBsZSA8Y2FwdGlvbj4gRS5nLiwgdGhlIG1lc3NhZ2UgaXMgc2lnbmVkIGJ5IHVzZXIgYW5kIHdhbGxldCwgdGhlbiBzaWduYXR1cmVzIHdvdWxkIGJlOjwvY2FwdGlvbj5cbiAgICoge1xuICAgKiAgIDE6IEJpZ0ludChtZXNzYWdlU2lnbmVkV2l0aFVzZXJQcnYpLFxuICAgKiAgIDM6IEJpZ0ludChtZXNzYWdlU2lnbmVkV2l0aFdhbGxldFBydiksXG4gICAqIH1cbiAgICogQHJldHVybnMgYSBzaWduYXR1cmUgY29tYmluaW5nIGFsbCB0aGUgcHJvdmlkZWQgc2lnbmVkIG1lc3NhZ2VzXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFnZ3JlZ2F0ZVNpZ25hdHVyZXMoc2lnbmF0dXJlczogeyBbbjogbnVtYmVyXTogYmlnaW50IH0pOiBzdHJpbmcge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBzaWduYXR1cmUgPSBCTFMubWVyZ2VTaWduYXR1cmVzKHNpZ25hdHVyZXMpO1xuICAgICAgcmV0dXJuIGJpZ0ludFRvSGV4KHNpZ25hdHVyZSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdFcnJvciBhZ2dyZWdhdGluZyBzaWduYXR1cmVzOiAnICsgZSk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIFZlcmlmaWVzIHRoZSBzaWduYXR1cmUgZm9yIHRoaXMga2V5IHBhaXJcbiAgICogQHBhcmFtIHB1YiBUaGUgcHVibGljIGtleSB3aXRoIHdoaWNoIHRvIHZlcmlmeSB0aGUgc2lnbmF0dXJlXG4gICAqIEBwYXJhbSBtc2cgVGhlIG1lc3NhZ2UgdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUgd2l0aFxuICAgKiBAcGFyYW0gc2lnbmF0dXJlIHRoZSBzaWduYXR1cmUgdG8gdmVyaWZ5XG4gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc2lnbmF0dXJlIGlzIHZhbGlkLCBlbHNlIGZhbHNlXG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGFzeW5jIHZlcmlmeVNpZ25hdHVyZShwdWI6IHN0cmluZywgbXNnOiBCdWZmZXIsIHNpZ25hdHVyZTogc3RyaW5nKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgYXNzZXJ0KGlzVmFsaWRCTFNQdWJsaWNLZXkocHViKSwgYEludmFsaWQgcHVibGljIGtleTogJHtwdWJ9YCk7XG4gICAgcmV0dXJuIGF3YWl0IEJMUy52ZXJpZnkoQmlnSW50KHNpZ25hdHVyZSksIG1zZywgQmlnSW50KHB1YikpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { BaseKeyPair } from './baseKeyPair';
|
|
2
|
+
import { AddressFormat } from './enum';
|
|
3
|
+
import { DefaultKeys, KeyPairOptions } from './iface';
|
|
4
|
+
export declare abstract class Ed25519KeyPair implements BaseKeyPair {
|
|
5
|
+
protected keyPair: DefaultKeys;
|
|
6
|
+
protected source?: KeyPairOptions;
|
|
7
|
+
/**
|
|
8
|
+
* Public constructor. By default, creates a key pair with a random master seed.
|
|
9
|
+
*
|
|
10
|
+
* @param {KeyPairOptions} source Either a master seed, a private key, or a public key
|
|
11
|
+
*/
|
|
12
|
+
protected constructor(source?: KeyPairOptions);
|
|
13
|
+
private getKeyPair;
|
|
14
|
+
private setKeyPair;
|
|
15
|
+
/** @inheritdoc */
|
|
16
|
+
recordKeysFromPrivateKey(prv: string): void;
|
|
17
|
+
/** @inheritdoc */
|
|
18
|
+
recordKeysFromPublicKey(pub: string): void;
|
|
19
|
+
abstract recordKeysFromPrivateKeyInProtocolFormat(prv: string): DefaultKeys;
|
|
20
|
+
abstract recordKeysFromPublicKeyInProtocolFormat(pub: string): DefaultKeys;
|
|
21
|
+
/** @inheritdoc */
|
|
22
|
+
abstract getAddress(format?: AddressFormat): string;
|
|
23
|
+
/** @inheritdoc */
|
|
24
|
+
abstract getKeys(): any;
|
|
25
|
+
/**
|
|
26
|
+
* Generates a signature for an arbitrary string with the current private key using the ed25519 public-key signature
|
|
27
|
+
* system.
|
|
28
|
+
*
|
|
29
|
+
* @param {string} message to produce a signature for
|
|
30
|
+
* @returns {Uint8Array} The signature produced for the message
|
|
31
|
+
* @throws if there is no private key
|
|
32
|
+
*/
|
|
33
|
+
signMessage(message: string): Uint8Array;
|
|
34
|
+
/**
|
|
35
|
+
* Verifies a message signature using the current public key.
|
|
36
|
+
*
|
|
37
|
+
* @param {string} message signed
|
|
38
|
+
* @param {Uint8Array} signature to verify
|
|
39
|
+
* @returns {boolean} True if the message was signed with the current key pair
|
|
40
|
+
*/
|
|
41
|
+
verifySignature(message: Uint8Array | string, signature: Uint8Array): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Derives a hardened child key pair using this key pair's secret key
|
|
44
|
+
* as the seed.
|
|
45
|
+
*
|
|
46
|
+
* @param path derivation path
|
|
47
|
+
*/
|
|
48
|
+
deriveHardened(path: string): DefaultKeys;
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=ed25519KeyPair.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ed25519KeyPair.d.ts","sourceRoot":"","sources":["../../../../src/account-lib/baseCoin/ed25519KeyPair.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAqC,WAAW,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAIzF,8BAAsB,cAAe,YAAW,WAAW;IACzD,SAAS,CAAC,OAAO,EAAE,WAAW,CAAC;IAC/B,SAAS,CAAC,MAAM,CAAC,EAAE,cAAc,CAAC;IAElC;;;;OAIG;IACH,SAAS,aAAa,MAAM,CAAC,EAAE,cAAc;IAkB7C,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,UAAU;IAIlB,kBAAkB;IAClB,wBAAwB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAc3C,kBAAkB;IAClB,uBAAuB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQ1C,QAAQ,CAAC,wCAAwC,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW;IAE3E,QAAQ,CAAC,uCAAuC,CAAC,GAAG,EAAE,MAAM,GAAG,WAAW;IAE1E,kBAAkB;IAClB,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,aAAa,GAAG,MAAM;IAEnD,kBAAkB;IAClB,QAAQ,CAAC,OAAO,IAAI,GAAG;IAEvB;;;;;;;OAOG;IACH,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU;IASxC;;;;;;OAMG;IACH,eAAe,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM,EAAE,SAAS,EAAE,UAAU,GAAG,OAAO;IAc7E;;;;;OAKG;IACH,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW;CAU1C"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
|
|
5
|
+
}) : (function(o, m, k, k2) {
|
|
6
|
+
if (k2 === undefined) k2 = k;
|
|
7
|
+
o[k2] = m[k];
|
|
8
|
+
}));
|
|
9
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
10
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
11
|
+
}) : function(o, v) {
|
|
12
|
+
o["default"] = v;
|
|
13
|
+
});
|
|
14
|
+
var __importStar = (this && this.__importStar) || function (mod) {
|
|
15
|
+
if (mod && mod.__esModule) return mod;
|
|
16
|
+
var result = {};
|
|
17
|
+
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
18
|
+
__setModuleDefault(result, mod);
|
|
19
|
+
return result;
|
|
20
|
+
};
|
|
21
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
22
|
+
exports.Ed25519KeyPair = void 0;
|
|
23
|
+
const nacl = __importStar(require("tweetnacl"));
|
|
24
|
+
const crypto_1 = require("../util/crypto");
|
|
25
|
+
const ed25519KeyDeriver_1 = require("../util/ed25519KeyDeriver");
|
|
26
|
+
const iface_1 = require("./iface");
|
|
27
|
+
const DEFAULT_SEED_SIZE_BYTES = 32;
|
|
28
|
+
class Ed25519KeyPair {
|
|
29
|
+
/**
|
|
30
|
+
* Public constructor. By default, creates a key pair with a random master seed.
|
|
31
|
+
*
|
|
32
|
+
* @param {KeyPairOptions} source Either a master seed, a private key, or a public key
|
|
33
|
+
*/
|
|
34
|
+
constructor(source) {
|
|
35
|
+
let naclKeyPair;
|
|
36
|
+
if (!source) {
|
|
37
|
+
const seed = nacl.randomBytes(DEFAULT_SEED_SIZE_BYTES);
|
|
38
|
+
naclKeyPair = nacl.sign.keyPair.fromSeed(seed);
|
|
39
|
+
this.setKeyPair(naclKeyPair);
|
|
40
|
+
}
|
|
41
|
+
else if (iface_1.isSeed(source)) {
|
|
42
|
+
naclKeyPair = nacl.sign.keyPair.fromSeed(source.seed);
|
|
43
|
+
this.setKeyPair(naclKeyPair);
|
|
44
|
+
}
|
|
45
|
+
else if (iface_1.isPrivateKey(source)) {
|
|
46
|
+
this.recordKeysFromPrivateKey(source.prv);
|
|
47
|
+
}
|
|
48
|
+
else if (iface_1.isPublicKey(source)) {
|
|
49
|
+
this.recordKeysFromPublicKey(source.pub);
|
|
50
|
+
}
|
|
51
|
+
else {
|
|
52
|
+
throw new Error('Invalid key pair options');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
getKeyPair(naclKeyPair) {
|
|
56
|
+
return {
|
|
57
|
+
prv: crypto_1.toHex(naclKeyPair.secretKey.slice(0, 32)),
|
|
58
|
+
pub: crypto_1.toHex(naclKeyPair.publicKey),
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
setKeyPair(naclKeyPair) {
|
|
62
|
+
this.keyPair = this.getKeyPair(naclKeyPair);
|
|
63
|
+
}
|
|
64
|
+
/** @inheritdoc */
|
|
65
|
+
recordKeysFromPrivateKey(prv) {
|
|
66
|
+
if (crypto_1.isValidEd25519Seed(prv)) {
|
|
67
|
+
const decodedPrv = crypto_1.toUint8Array(prv);
|
|
68
|
+
const naclKeyPair = nacl.sign.keyPair.fromSeed(decodedPrv);
|
|
69
|
+
this.setKeyPair(naclKeyPair);
|
|
70
|
+
}
|
|
71
|
+
else if (crypto_1.isValidEd25519SecretKey(prv)) {
|
|
72
|
+
const decodedPrv = crypto_1.toUint8Array(prv);
|
|
73
|
+
const naclKeyPair = nacl.sign.keyPair.fromSecretKey(decodedPrv);
|
|
74
|
+
this.setKeyPair(naclKeyPair);
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
this.keyPair = this.recordKeysFromPrivateKeyInProtocolFormat(prv);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** @inheritdoc */
|
|
81
|
+
recordKeysFromPublicKey(pub) {
|
|
82
|
+
if (crypto_1.isValidEd25519PublicKey(pub)) {
|
|
83
|
+
this.keyPair = { pub };
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
this.keyPair = this.recordKeysFromPublicKeyInProtocolFormat(pub);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Generates a signature for an arbitrary string with the current private key using the ed25519 public-key signature
|
|
91
|
+
* system.
|
|
92
|
+
*
|
|
93
|
+
* @param {string} message to produce a signature for
|
|
94
|
+
* @returns {Uint8Array} The signature produced for the message
|
|
95
|
+
* @throws if there is no private key
|
|
96
|
+
*/
|
|
97
|
+
signMessage(message) {
|
|
98
|
+
var _a;
|
|
99
|
+
const messageToSign = crypto_1.toUint8Array(Buffer.from(message).toString('hex'));
|
|
100
|
+
const prv = (_a = this.keyPair) === null || _a === void 0 ? void 0 : _a.prv;
|
|
101
|
+
if (!prv) {
|
|
102
|
+
throw new Error('Missing private key');
|
|
103
|
+
}
|
|
104
|
+
return nacl.sign.detached(messageToSign, nacl.sign.keyPair.fromSeed(crypto_1.toUint8Array(prv)).secretKey);
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Verifies a message signature using the current public key.
|
|
108
|
+
*
|
|
109
|
+
* @param {string} message signed
|
|
110
|
+
* @param {Uint8Array} signature to verify
|
|
111
|
+
* @returns {boolean} True if the message was signed with the current key pair
|
|
112
|
+
*/
|
|
113
|
+
verifySignature(message, signature) {
|
|
114
|
+
var _a;
|
|
115
|
+
let messageToVerify;
|
|
116
|
+
if (typeof message === 'string') {
|
|
117
|
+
messageToVerify = crypto_1.toUint8Array(Buffer.from(message).toString('hex'));
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
messageToVerify = message;
|
|
121
|
+
}
|
|
122
|
+
if (!((_a = this.keyPair) === null || _a === void 0 ? void 0 : _a.pub)) {
|
|
123
|
+
return false;
|
|
124
|
+
}
|
|
125
|
+
const publicKey = crypto_1.toUint8Array(this.keyPair.pub);
|
|
126
|
+
return nacl.sign.detached.verify(messageToVerify, signature, publicKey);
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Derives a hardened child key pair using this key pair's secret key
|
|
130
|
+
* as the seed.
|
|
131
|
+
*
|
|
132
|
+
* @param path derivation path
|
|
133
|
+
*/
|
|
134
|
+
deriveHardened(path) {
|
|
135
|
+
var _a;
|
|
136
|
+
if (!((_a = this.keyPair) === null || _a === void 0 ? void 0 : _a.prv)) {
|
|
137
|
+
throw new Error('need private key to derive hardened keypair');
|
|
138
|
+
}
|
|
139
|
+
const seed = ed25519KeyDeriver_1.Ed25519KeyDeriver.derivePath(path, this.keyPair.prv).key;
|
|
140
|
+
const derivedKeyPair = nacl.sign.keyPair.fromSeed(seed);
|
|
141
|
+
return this.getKeyPair(derivedKeyPair);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
exports.Ed25519KeyPair = Ed25519KeyPair;
|
|
145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWQyNTUxOUtleVBhaXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvYWNjb3VudC1saWIvYmFzZUNvaW4vZWQyNTUxOUtleVBhaXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBLGdEQUFrQztBQUNsQywyQ0FNd0I7QUFDeEIsaUVBQThEO0FBRzlELG1DQUF5RjtBQUV6RixNQUFNLHVCQUF1QixHQUFHLEVBQUUsQ0FBQztBQUVuQyxNQUFzQixjQUFjO0lBSWxDOzs7O09BSUc7SUFDSCxZQUFzQixNQUF1QjtRQUMzQyxJQUFJLFdBQVcsQ0FBQztRQUNoQixJQUFJLENBQUMsTUFBTSxFQUFFO1lBQ1gsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO1lBQ3ZELFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLFVBQVUsQ0FBQyxXQUFXLENBQUMsQ0FBQztTQUM5QjthQUFNLElBQUksY0FBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQ3pCLFdBQVcsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQ3RELElBQUksQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7U0FDOUI7YUFBTSxJQUFJLG9CQUFZLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDL0IsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUMzQzthQUFNLElBQUksbUJBQVcsQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM5QixJQUFJLENBQUMsdUJBQXVCLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQzFDO2FBQU07WUFDTCxNQUFNLElBQUksS0FB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LFNBQVMsR0FBRyxxQkFBWSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDakQsT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsQ0FBQztJQUMxRSxDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxjQUFjLENBQUMsSUFBWTs7UUFDekIsSUFBSSxDQUFDLENBQUEsTUFBQSxJQUFJLENBQUMsT0FBTywwQ0FBRSxHQUFHLENBQUEsRUFBRTtZQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLDZDQUE2QyxDQUFDLENBQUM7U0FDaEU7UUFFRCxNQUFNLElBQUksR0FBRyxxQ0FBaUIsQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDO1FBQ3RFLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV4RCxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsY0FBYyxDQUFDLENBQUM7SUFDekMsQ0FBQztDQUNGO0FBOUhELHdDQThIQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIG5hY2wgZnJvbSAndHdlZXRuYWNsJztcbmltcG9ydCB7XG4gIGlzVmFsaWRFZDI1NTE5UHVibGljS2V5LFxuICBpc1ZhbGlkRWQyNTUxOVNlY3JldEtleSxcbiAgaXNWYWxpZEVkMjU1MTlTZWVkLFxuICB0b0hleCxcbiAgdG9VaW50OEFycmF5LFxufSBmcm9tICcuLi91dGlsL2NyeXB0byc7XG5pbXBvcnQgeyBFZDI1NTE5S2V5RGVyaXZlciB9IGZyb20gJy4uL3V0aWwvZWQyNTUxOUtleURlcml2ZXInO1xuaW1wb3J0IHsgQmFzZUtleVBhaXIgfSBmcm9tICcuL2Jhc2VLZXlQYWlyJztcbmltcG9ydCB7IEFkZHJlc3NGb3JtYXQgfSBmcm9tICcuL2VudW0nO1xuaW1wb3J0IHsgaXNQcml2YXRlS2V5LCBpc1B1YmxpY0tleSwgaXNTZWVkLCBEZWZhdWx0S2V5cywgS2V5UGFpck9wdGlvbnMgfSBmcm9tICcuL2lmYWNlJztcblxuY29uc3QgREVGQVVMVF9TRUVEX1NJWkVfQllURVMgPSAzMjtcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEVkMjU1MTlLZXlQYWlyIGltcGxlbWVudHMgQmFzZUtleVBhaXIge1xuICBwcm90ZWN0ZWQga2V5UGFpcjogRGVmYXVsdEtleXM7XG4gIHByb3RlY3RlZCBzb3VyY2U/OiBLZXlQYWlyT3B0aW9ucztcblxuICAvKipcbiAgICogUHVibGljIGNvbnN0cnVjdG9yLiBCeSBkZWZhdWx0LCBjcmVhdGVzIGEga2V5IHBhaXIgd2l0aCBhIHJhbmRvbSBtYXN0ZXIgc2VlZC5cbiAgICpcbiAgICogQHBhcmFtIHtLZXlQYWlyT3B0aW9uc30gc291cmNlIEVpdGhlciBhIG1hc3RlciBzZWVkLCBhIHByaXZhdGUga2V5LCBvciBhIHB1YmxpYyBrZXlcbiAgICovXG4gIHByb3RlY3RlZCBjb25zdHJ1Y3Rvcihzb3VyY2U/OiBLZXlQYWlyT3B0aW9ucykge1xuICAgIGxldCBuYWNsS2V5UGFpcjtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgY29uc3Qgc2VlZCA9IG5hY2wucmFuZG9tQnl0ZXMoREVGQVVMVF9TRUVEX1NJWkVfQllURVMpO1xuICAgICAgbmFjbEtleVBhaXIgPSBuYWNsLnNpZ24ua2V5UGFpci5mcm9tU2VlZChzZWVkKTtcbiAgICAgIHRoaXMuc2V0S2V5UGFpcihuYWNsS2V5UGFpcik7XG4gICAgfSBlbHNlIGlmIChpc1NlZWQoc291cmNlKSkge1xuICAgICAgbmFjbEtleVBhaXIgPSBuYWNsLnNpZ24ua2V5UGFpci5mcm9tU2VlZChzb3VyY2Uuc2VlZCk7XG4gICAgICB0aGlzLnNldEtleVBhaXIobmFjbEtleVBhaXIpO1xuICAgIH0gZWxzZSBpZiAoaXNQcml2YXRlS2V5KHNvdXJjZSkpIHtcbiAgICAgIHRoaXMucmVjb3JkS2V5c0Zyb21Qcml2YXRlS2V5KHNvdXJjZS5wcnYpO1xuICAgIH0gZWxzZSBpZiAoaXNQdWJsaWNLZXkoc291cmNlKSkge1xuICAgICAgdGhpcy5yZWNvcmRLZXlzRnJvbVB1YmxpY0tleShzb3VyY2UucHViKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGtleSBwYWlyIG9wdGlvbnMnKTtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIGdldEtleVBhaXIobmFjbEtleVBhaXI6IG5hY2wuU2lnbktleVBhaXIpOiBEZWZhdWx0S2V5cyB7XG4gICAgcmV0dXJuIHtcbiAgICAgIHBydjogdG9IZXgobmFjbEtleVBhaXIuc2VjcmV0S2V5LnNsaWNlKDAsIDMyKSksXG4gICAgICBwdWI6IHRvSGV4KG5hY2xLZXlQYWlyLnB1YmxpY0tleSksXG4gICAgfTtcbiAgfVxuXG4gIHByaXZhdGUgc2V0S2V5UGFpcihuYWNsS2V5UGFpcjogbmFjbC5TaWduS2V5UGFpcik6IHZvaWQge1xuICAgIHRoaXMua2V5UGFpciA9IHRoaXMuZ2V0S2V5UGFpcihuYWNsS2V5UGFpcik7XG4gIH1cblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgcmVjb3JkS2V5c0Zyb21Qcml2YXRlS2V5KHBydjogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKGlzVmFsaWRFZDI1NTE5U2VlZChwcnYpKSB7XG4gICAgICBjb25zdCBkZWNvZGVkUHJ2ID0gdG9VaW50OEFycmF5KHBydik7XG4gICAgICBjb25zdCBuYWNsS2V5UGFpciA9IG5hY2wuc2lnbi5rZXlQYWlyLmZyb21TZWVkKGRlY29kZWRQcnYpO1xuICAgICAgdGhpcy5zZXRLZXlQYWlyKG5hY2xLZXlQYWlyKTtcbiAgICB9IGVsc2UgaWYgKGlzVmFsaWRFZDI1NTE5U2VjcmV0S2V5KHBydikpIHtcbiAgICAgIGNvbnN0IGRlY29kZWRQcnYgPSB0b1VpbnQ4QXJyYXkocHJ2KTtcbiAgICAgIGNvbnN0IG5hY2xLZXlQYWlyID0gbmFjbC5zaWduLmtleVBhaXIuZnJvbVNlY3JldEtleShkZWNvZGVkUHJ2KTtcbiAgICAgIHRoaXMuc2V0S2V5UGFpcihuYWNsS2V5UGFpcik7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMua2V5UGFpciA9IHRoaXMucmVjb3JkS2V5c0Zyb21Qcml2YXRlS2V5SW5Qcm90b2NvbEZvcm1hdChwcnYpO1xuICAgIH1cbiAgfVxuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICByZWNvcmRLZXlzRnJvbVB1YmxpY0tleShwdWI6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChpc1ZhbGlkRWQyNTUxOVB1YmxpY0tleShwdWIpKSB7XG4gICAgICB0aGlzLmtleVBhaXIgPSB7IHB1YiB9O1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmtleVBhaXIgPSB0aGlzLnJlY29yZEtleXNGcm9tUHVibGljS2V5SW5Qcm90b2NvbEZvcm1hdChwdWIpO1xuICAgIH1cbiAgfVxuXG4gIGFic3RyYWN0IHJlY29yZEtleXNGcm9tUHJpdmF0ZUtleUluUHJvdG9jb2xGb3JtYXQocHJ2OiBzdHJpbmcpOiBEZWZhdWx0S2V5cztcblxuICBhYnN0cmFjdCByZWNvcmRLZXlzRnJvbVB1YmxpY0tleUluUHJvdG9jb2xGb3JtYXQocHViOiBzdHJpbmcpOiBEZWZhdWx0S2V5cztcblxuICAvKiogQGluaGVyaXRkb2MgKi9cbiAgYWJzdHJhY3QgZ2V0QWRkcmVzcyhmb3JtYXQ/OiBBZGRyZXNzRm9ybWF0KTogc3RyaW5nO1xuXG4gIC8qKiBAaW5oZXJpdGRvYyAqL1xuICBhYnN0cmFjdCBnZXRLZXlzKCk6IGFueTtcblxuICAvKipcbiAgICogR2VuZXJhdGVzIGEgc2lnbmF0dXJlIGZvciBhbiBhcmJpdHJhcnkgc3RyaW5nIHdpdGggdGhlIGN1cnJlbnQgcHJpdmF0ZSBrZXkgdXNpbmcgdGhlIGVkMjU1MTkgcHVibGljLWtleSBzaWduYXR1cmVcbiAgICogc3lzdGVtLlxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSB0byBwcm9kdWNlIGEgc2lnbmF0dXJlIGZvclxuICAgKiBAcmV0dXJucyB7VWludDhBcnJheX0gVGhlIHNpZ25hdHVyZSBwcm9kdWNlZCBmb3IgdGhlIG1lc3NhZ2VcbiAgICogQHRocm93cyBpZiB0aGVyZSBpcyBubyBwcml2YXRlIGtleVxuICAgKi9cbiAgc2lnbk1lc3NhZ2UobWVzc2FnZTogc3RyaW5nKTogVWludDhBcnJheSB7XG4gICAgY29uc3QgbWVzc2FnZVRvU2lnbiA9IHRvVWludDhBcnJheShCdWZmZXIuZnJvbShtZXNzYWdlKS50b1N0cmluZygnaGV4JykpO1xuICAgIGNvbnN0IHBydiA9IHRoaXMua2V5UGFpcj8ucHJ2O1xuICAgIGlmICghcHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01pc3NpbmcgcHJpdmF0ZSBrZXknKTtcbiAgICB9XG4gICAgcmV0dXJuIG5hY2wuc2lnbi5kZXRhY2hlZChtZXNzYWdlVG9TaWduLCBuYWNsLnNpZ24ua2V5UGFpci5mcm9tU2VlZCh0b1VpbnQ4QXJyYXkocHJ2KSkuc2VjcmV0S2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBWZXJpZmllcyBhIG1lc3NhZ2Ugc2lnbmF0dXJlIHVzaW5nIHRoZSBjdXJyZW50IHB1YmxpYyBrZXkuXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIHNpZ25lZFxuICAgKiBAcGFyYW0ge1VpbnQ4QXJyYXl9IHNpZ25hdHVyZSB0byB2ZXJpZnlcbiAgICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIG1lc3NhZ2Ugd2FzIHNpZ25lZCB3aXRoIHRoZSBjdXJyZW50IGtleSBwYWlyXG4gICAqL1xuICB2ZXJpZnlTaWduYXR1cmUobWVzc2FnZTogVWludDhBcnJheSB8IHN0cmluZywgc2lnbmF0dXJlOiBVaW50OEFycmF5KTogYm9vbGVhbiB7XG4gICAgbGV0IG1lc3NhZ2VUb1ZlcmlmeTtcbiAgICBpZiAodHlwZW9mIG1lc3NhZ2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICBtZXNzYWdlVG9WZXJpZnkgPSB0b1VpbnQ4QXJyYXkoQnVmZmVyLmZyb20obWVzc2FnZSkudG9TdHJpbmcoJ2hleCcpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbWVzc2FnZVRvVmVyaWZ5ID0gbWVzc2FnZTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmtleVBhaXI/LnB1Yikge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBjb25zdCBwdWJsaWNLZXkgPSB0b1VpbnQ4QXJyYXkodGhpcy5rZXlQYWlyLnB1Yik7XG4gICAgcmV0dXJuIG5hY2wuc2lnbi5kZXRhY2hlZC52ZXJpZnkobWVzc2FnZVRvVmVyaWZ5LCBzaWduYXR1cmUsIHB1YmxpY0tleSk7XG4gIH1cblxuICAvKipcbiAgICogRGVyaXZlcyBhIGhhcmRlbmVkIGNoaWxkIGtleSBwYWlyIHVzaW5nIHRoaXMga2V5IHBhaXIncyBzZWNyZXQga2V5XG4gICAqIGFzIHRoZSBzZWVkLlxuICAgKlxuICAgKiBAcGFyYW0gcGF0aCBkZXJpdmF0aW9uIHBhdGhcbiAgICovXG4gIGRlcml2ZUhhcmRlbmVkKHBhdGg6IHN0cmluZyk6IERlZmF1bHRLZXlzIHtcbiAgICBpZiAoIXRoaXMua2V5UGFpcj8ucHJ2KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ25lZWQgcHJpdmF0ZSBrZXkgdG8gZGVyaXZlIGhhcmRlbmVkIGtleXBhaXInKTtcbiAgICB9XG5cbiAgICBjb25zdCBzZWVkID0gRWQyNTUxOUtleURlcml2ZXIuZGVyaXZlUGF0aChwYXRoLCB0aGlzLmtleVBhaXIucHJ2KS5rZXk7XG4gICAgY29uc3QgZGVyaXZlZEtleVBhaXIgPSBuYWNsLnNpZ24ua2V5UGFpci5mcm9tU2VlZChzZWVkKTtcblxuICAgIHJldHVybiB0aGlzLmdldEtleVBhaXIoZGVyaXZlZEtleVBhaXIpO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Internal metadata. Defines the type of transaction.
|
|
3
|
+
*/
|
|
4
|
+
export declare enum TransactionType {
|
|
5
|
+
Send = 0,
|
|
6
|
+
SendERC721 = 1,
|
|
7
|
+
SendERC1155 = 2,
|
|
8
|
+
WalletInitialization = 3,
|
|
9
|
+
AddressInitialization = 4,
|
|
10
|
+
AssociatedTokenAccountInitialization = 5,
|
|
11
|
+
FlushTokens = 6,
|
|
12
|
+
FlushCoins = 7,
|
|
13
|
+
SingleSigSend = 8,
|
|
14
|
+
AccountUpdate = 9,
|
|
15
|
+
StakingLock = 10,
|
|
16
|
+
StakingVote = 11,
|
|
17
|
+
StakingUnvote = 12,
|
|
18
|
+
StakingActivate = 13,
|
|
19
|
+
StakingUnlock = 14,
|
|
20
|
+
StakingWithdraw = 15,
|
|
21
|
+
ContractCall = 16,
|
|
22
|
+
StakingDeactivate = 17,
|
|
23
|
+
Batch = 18,
|
|
24
|
+
StakingClaim = 19
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Generic list of encoding formats. Can be used as arguments for methods inputs.
|
|
28
|
+
*/
|
|
29
|
+
export declare enum AddressFormat {
|
|
30
|
+
hex = "hex",
|
|
31
|
+
base58 = "base58",
|
|
32
|
+
substrate = "substrate",
|
|
33
|
+
polkadot = "polkadot"
|
|
34
|
+
}
|
|
35
|
+
export declare enum StakingOperationTypes {
|
|
36
|
+
LOCK = 0,
|
|
37
|
+
VOTE = 1,
|
|
38
|
+
UNVOTE = 2,
|
|
39
|
+
ACTIVATE = 3,
|
|
40
|
+
UNLOCK = 4,
|
|
41
|
+
WITHDRAW = 5
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=enum.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enum.d.ts","sourceRoot":"","sources":["../../../../src/account-lib/baseCoin/enum.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,eAAe;IACzB,IAAI,IAAA;IAEJ,UAAU,IAAA;IAEV,WAAW,IAAA;IAEX,oBAAoB,IAAA;IAEpB,qBAAqB,IAAA;IAErB,oCAAoC,IAAA;IAEpC,WAAW,IAAA;IAEX,UAAU,IAAA;IAEV,aAAa,IAAA;IAEb,aAAa,IAAA;IAEb,WAAW,KAAA;IAEX,WAAW,KAAA;IAEX,aAAa,KAAA;IAEb,eAAe,KAAA;IAEf,aAAa,KAAA;IAEb,eAAe,KAAA;IAEf,YAAY,KAAA;IAEZ,iBAAiB,KAAA;IAEjB,KAAK,KAAA;IAEL,YAAY,KAAA;CACb;AAED;;GAEG;AACH,oBAAY,aAAa;IACvB,GAAG,QAAQ;IACX,MAAM,WAAW;IAEjB,SAAS,cAAc;IAEvB,QAAQ,aAAa;CACtB;AAED,oBAAY,qBAAqB;IAC/B,IAAI,IAAA;IACJ,IAAI,IAAA;IACJ,MAAM,IAAA;IACN,QAAQ,IAAA;IACR,MAAM,IAAA;IACN,QAAQ,IAAA;CACT"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.StakingOperationTypes = exports.AddressFormat = exports.TransactionType = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Internal metadata. Defines the type of transaction.
|
|
6
|
+
*/
|
|
7
|
+
var TransactionType;
|
|
8
|
+
(function (TransactionType) {
|
|
9
|
+
TransactionType[TransactionType["Send"] = 0] = "Send";
|
|
10
|
+
// Send ERC721 compliant tokens
|
|
11
|
+
TransactionType[TransactionType["SendERC721"] = 1] = "SendERC721";
|
|
12
|
+
// Send ERC1155 compliant tokens
|
|
13
|
+
TransactionType[TransactionType["SendERC1155"] = 2] = "SendERC1155";
|
|
14
|
+
// Initialize a wallet on-chain (e.g. Multi-sig contract deployment)
|
|
15
|
+
TransactionType[TransactionType["WalletInitialization"] = 3] = "WalletInitialization";
|
|
16
|
+
// Initialize an address on-chain(e.g. Forwarder contract deployment)
|
|
17
|
+
TransactionType[TransactionType["AddressInitialization"] = 4] = "AddressInitialization";
|
|
18
|
+
// Initialized an associated token account
|
|
19
|
+
TransactionType[TransactionType["AssociatedTokenAccountInitialization"] = 5] = "AssociatedTokenAccountInitialization";
|
|
20
|
+
// Flush tokens from a forwarder address to its base address
|
|
21
|
+
TransactionType[TransactionType["FlushTokens"] = 6] = "FlushTokens";
|
|
22
|
+
// Flush native coins (eg. ETH) from a forwarder address to base address
|
|
23
|
+
TransactionType[TransactionType["FlushCoins"] = 7] = "FlushCoins";
|
|
24
|
+
// Send a raw single-sig transaction
|
|
25
|
+
TransactionType[TransactionType["SingleSigSend"] = 8] = "SingleSigSend";
|
|
26
|
+
// Update an account on-chain (e.g. Public key revelation operation for Tezos)
|
|
27
|
+
TransactionType[TransactionType["AccountUpdate"] = 9] = "AccountUpdate";
|
|
28
|
+
// Lock
|
|
29
|
+
TransactionType[TransactionType["StakingLock"] = 10] = "StakingLock";
|
|
30
|
+
// Vote
|
|
31
|
+
TransactionType[TransactionType["StakingVote"] = 11] = "StakingVote";
|
|
32
|
+
// Unvote
|
|
33
|
+
TransactionType[TransactionType["StakingUnvote"] = 12] = "StakingUnvote";
|
|
34
|
+
// Activate
|
|
35
|
+
TransactionType[TransactionType["StakingActivate"] = 13] = "StakingActivate";
|
|
36
|
+
// Unlock
|
|
37
|
+
TransactionType[TransactionType["StakingUnlock"] = 14] = "StakingUnlock";
|
|
38
|
+
// Withdraw
|
|
39
|
+
TransactionType[TransactionType["StakingWithdraw"] = 15] = "StakingWithdraw";
|
|
40
|
+
// Handle smart contract calls
|
|
41
|
+
TransactionType[TransactionType["ContractCall"] = 16] = "ContractCall";
|
|
42
|
+
// Deactivate
|
|
43
|
+
TransactionType[TransactionType["StakingDeactivate"] = 17] = "StakingDeactivate";
|
|
44
|
+
// Batch of multiple transactions broadcast as a single transaction
|
|
45
|
+
TransactionType[TransactionType["Batch"] = 18] = "Batch";
|
|
46
|
+
// Claim the staking rewards
|
|
47
|
+
TransactionType[TransactionType["StakingClaim"] = 19] = "StakingClaim";
|
|
48
|
+
})(TransactionType = exports.TransactionType || (exports.TransactionType = {}));
|
|
49
|
+
/**
|
|
50
|
+
* Generic list of encoding formats. Can be used as arguments for methods inputs.
|
|
51
|
+
*/
|
|
52
|
+
var AddressFormat;
|
|
53
|
+
(function (AddressFormat) {
|
|
54
|
+
AddressFormat["hex"] = "hex";
|
|
55
|
+
AddressFormat["base58"] = "base58";
|
|
56
|
+
// format for westend addresses
|
|
57
|
+
AddressFormat["substrate"] = "substrate";
|
|
58
|
+
// format for polkadot mainnet addresses
|
|
59
|
+
AddressFormat["polkadot"] = "polkadot";
|
|
60
|
+
})(AddressFormat = exports.AddressFormat || (exports.AddressFormat = {}));
|
|
61
|
+
var StakingOperationTypes;
|
|
62
|
+
(function (StakingOperationTypes) {
|
|
63
|
+
StakingOperationTypes[StakingOperationTypes["LOCK"] = 0] = "LOCK";
|
|
64
|
+
StakingOperationTypes[StakingOperationTypes["VOTE"] = 1] = "VOTE";
|
|
65
|
+
StakingOperationTypes[StakingOperationTypes["UNVOTE"] = 2] = "UNVOTE";
|
|
66
|
+
StakingOperationTypes[StakingOperationTypes["ACTIVATE"] = 3] = "ACTIVATE";
|
|
67
|
+
StakingOperationTypes[StakingOperationTypes["UNLOCK"] = 4] = "UNLOCK";
|
|
68
|
+
StakingOperationTypes[StakingOperationTypes["WITHDRAW"] = 5] = "WITHDRAW";
|
|
69
|
+
})(StakingOperationTypes = exports.StakingOperationTypes || (exports.StakingOperationTypes = {}));
|
|
70
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW51bS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9hY2NvdW50LWxpYi9iYXNlQ29pbi9lbnVtLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBOztHQUVHO0FBQ0gsSUFBWSxlQXdDWDtBQXhDRCxXQUFZLGVBQWU7SUFDekIscURBQUksQ0FBQTtJQUNKLCtCQUErQjtJQUMvQixpRUFBVSxDQUFBO0lBQ1YsZ0NBQWdDO0lBQ2hDLG1FQUFXLENBQUE7SUFDWCxvRUFBb0U7SUFDcEUscUZBQW9CLENBQUE7SUFDcEIscUVBQXFFO0lBQ3JFLHVGQUFxQixDQUFBO0lBQ3JCLDBDQUEwQztJQUMxQyxxSEFBb0MsQ0FBQTtJQUNwQyw0REFBNEQ7SUFDNUQsbUVBQVcsQ0FBQTtJQUNYLHdFQUF3RTtJQUN4RSxpRUFBVSxDQUFBO0lBQ1Ysb0NBQW9DO0lBQ3BDLHVFQUFhLENBQUE7SUFDYiw4RUFBOEU7SUFDOUUsdUVBQWEsQ0FBQTtJQUNiLE9BQU87SUFDUCxvRUFBVyxDQUFBO0lBQ1gsT0FBTztJQUNQLG9FQUFXLENBQUE7SUFDWCxTQUFTO0lBQ1Qsd0VBQWEsQ0FBQTtJQUNiLFdBQVc7SUFDWCw0RUFBZSxDQUFBO0lBQ2YsU0FBUztJQUNULHdFQUFhLENBQUE7SUFDYixXQUFXO0lBQ1gsNEVBQWUsQ0FBQTtJQUNmLDhCQUE4QjtJQUM5QixzRUFBWSxDQUFBO0lBQ1osYUFBYTtJQUNiLGdGQUFpQixDQUFBO0lBQ2pCLG1FQUFtRTtJQUNuRSx3REFBSyxDQUFBO0lBQ0wsNEJBQTRCO0lBQzVCLHNFQUFZLENBQUE7QUFDZCxDQUFDLEVBeENXLGVBQWUsR0FBZix1QkFBZSxLQUFmLHVCQUFlLFFBd0MxQjtBQUVEOztHQUVHO0FBQ0gsSUFBWSxhQU9YO0FBUEQsV0FBWSxhQUFhO0lBQ3ZCLDRCQUFXLENBQUE7SUFDWCxrQ0FBaUIsQ0FBQTtJQUNqQiwrQkFBK0I7SUFDL0Isd0NBQXVCLENBQUE7SUFDdkIsd0NBQXdDO0lBQ3hDLHNDQUFxQixDQUFBO0FBQ3ZCLENBQUMsRUFQVyxhQUFhLEdBQWIscUJBQWEsS0FBYixxQkFBYSxRQU94QjtBQUVELElBQVkscUJBT1g7QUFQRCxXQUFZLHFCQUFxQjtJQUMvQixpRUFBSSxDQUFBO0lBQ0osaUVBQUksQ0FBQTtJQUNKLHFFQUFNLENBQUE7SUFDTix5RUFBUSxDQUFBO0lBQ1IscUVBQU0sQ0FBQTtJQUNOLHlFQUFRLENBQUE7QUFDVixDQUFDLEVBUFcscUJBQXFCLEdBQXJCLDZCQUFxQixLQUFyQiw2QkFBcUIsUUFPaEMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEludGVybmFsIG1ldGFkYXRhLiBEZWZpbmVzIHRoZSB0eXBlIG9mIHRyYW5zYWN0aW9uLlxuICovXG5leHBvcnQgZW51bSBUcmFuc2FjdGlvblR5cGUge1xuICBTZW5kLFxuICAvLyBTZW5kIEVSQzcyMSBjb21wbGlhbnQgdG9rZW5zXG4gIFNlbmRFUkM3MjEsXG4gIC8vIFNlbmQgRVJDMTE1NSBjb21wbGlhbnQgdG9rZW5zXG4gIFNlbmRFUkMxMTU1LFxuICAvLyBJbml0aWFsaXplIGEgd2FsbGV0IG9uLWNoYWluIChlLmcuIE11bHRpLXNpZyBjb250cmFjdCBkZXBsb3ltZW50KVxuICBXYWxsZXRJbml0aWFsaXphdGlvbixcbiAgLy8gSW5pdGlhbGl6ZSBhbiBhZGRyZXNzIG9uLWNoYWluKGUuZy4gRm9yd2FyZGVyIGNvbnRyYWN0IGRlcGxveW1lbnQpXG4gIEFkZHJlc3NJbml0aWFsaXphdGlvbixcbiAgLy8gSW5pdGlhbGl6ZWQgYW4gYXNzb2NpYXRlZCB0b2tlbiBhY2NvdW50XG4gIEFzc29jaWF0ZWRUb2tlbkFjY291bnRJbml0aWFsaXphdGlvbixcbiAgLy8gRmx1c2ggdG9rZW5zIGZyb20gYSBmb3J3YXJkZXIgYWRkcmVzcyB0byBpdHMgYmFzZSBhZGRyZXNzXG4gIEZsdXNoVG9rZW5zLFxuICAvLyBGbHVzaCBuYXRpdmUgY29pbnMgKGVnLiBFVEgpIGZyb20gYSBmb3J3YXJkZXIgYWRkcmVzcyB0byBiYXNlIGFkZHJlc3NcbiAgRmx1c2hDb2lucyxcbiAgLy8gU2VuZCBhIHJhdyBzaW5nbGUtc2lnIHRyYW5zYWN0aW9uXG4gIFNpbmdsZVNpZ1NlbmQsXG4gIC8vIFVwZGF0ZSBhbiBhY2NvdW50IG9uLWNoYWluIChlLmcuIFB1YmxpYyBrZXkgcmV2ZWxhdGlvbiBvcGVyYXRpb24gZm9yIFRlem9zKVxuICBBY2NvdW50VXBkYXRlLFxuICAvLyBMb2NrXG4gIFN0YWtpbmdMb2NrLFxuICAvLyBWb3RlXG4gIFN0YWtpbmdWb3RlLFxuICAvLyBVbnZvdGVcbiAgU3Rha2luZ1Vudm90ZSxcbiAgLy8gQWN0aXZhdGVcbiAgU3Rha2luZ0FjdGl2YXRlLFxuICAvLyBVbmxvY2tcbiAgU3Rha2luZ1VubG9jayxcbiAgLy8gV2l0aGRyYXdcbiAgU3Rha2luZ1dpdGhkcmF3LFxuICAvLyBIYW5kbGUgc21hcnQgY29udHJhY3QgY2FsbHNcbiAgQ29udHJhY3RDYWxsLFxuICAvLyBEZWFjdGl2YXRlXG4gIFN0YWtpbmdEZWFjdGl2YXRlLFxuICAvLyBCYXRjaCBvZiBtdWx0aXBsZSB0cmFuc2FjdGlvbnMgYnJvYWRjYXN0IGFzIGEgc2luZ2xlIHRyYW5zYWN0aW9uXG4gIEJhdGNoLFxuICAvLyBDbGFpbSB0aGUgc3Rha2luZyByZXdhcmRzXG4gIFN0YWtpbmdDbGFpbSxcbn1cblxuLyoqXG4gKiBHZW5lcmljIGxpc3Qgb2YgZW5jb2RpbmcgZm9ybWF0cy4gQ2FuIGJlIHVzZWQgYXMgYXJndW1lbnRzIGZvciBtZXRob2RzIGlucHV0cy5cbiAqL1xuZXhwb3J0IGVudW0gQWRkcmVzc0Zvcm1hdCB7XG4gIGhleCA9ICdoZXgnLFxuICBiYXNlNTggPSAnYmFzZTU4JyxcbiAgLy8gZm9ybWF0IGZvciB3ZXN0ZW5kIGFkZHJlc3Nlc1xuICBzdWJzdHJhdGUgPSAnc3Vic3RyYXRlJyxcbiAgLy8gZm9ybWF0IGZvciBwb2xrYWRvdCBtYWlubmV0IGFkZHJlc3Nlc1xuICBwb2xrYWRvdCA9ICdwb2xrYWRvdCcsXG59XG5cbmV4cG9ydCBlbnVtIFN0YWtpbmdPcGVyYXRpb25UeXBlcyB7XG4gIExPQ0ssXG4gIFZPVEUsXG4gIFVOVk9URSxcbiAgQUNUSVZBVEUsXG4gIFVOTE9DSyxcbiAgV0lUSERSQVcsXG59XG4iXX0=
|