@com-chain/jsc3l 2.0.1-rc.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.
Files changed (84) hide show
  1. package/LICENSE +661 -0
  2. package/README.md +45 -0
  3. package/build/bcRead.d.ts +15 -0
  4. package/build/bcRead.js +123 -0
  5. package/build/bcRead.js.map +1 -0
  6. package/build/bcTransaction.d.ts +10 -0
  7. package/build/bcTransaction.js +135 -0
  8. package/build/bcTransaction.js.map +1 -0
  9. package/build/blockies.d.ts +1 -0
  10. package/build/blockies.js +91 -0
  11. package/build/blockies.js.map +1 -0
  12. package/build/config.d.ts +6 -0
  13. package/build/config.js +25 -0
  14. package/build/config.js.map +1 -0
  15. package/build/connection.d.ts +58 -0
  16. package/build/connection.js +204 -0
  17. package/build/connection.js.map +1 -0
  18. package/build/customization.d.ts +37 -0
  19. package/build/customization.js +129 -0
  20. package/build/customization.js.map +1 -0
  21. package/build/ethereum/cipher.d.ts +3 -0
  22. package/build/ethereum/cipher.js +94 -0
  23. package/build/ethereum/cipher.js.map +1 -0
  24. package/build/ethereum/ethFuncs.d.ts +12 -0
  25. package/build/ethereum/ethFuncs.js +70 -0
  26. package/build/ethereum/ethFuncs.js.map +1 -0
  27. package/build/ethereum/etherUnits.d.ts +5 -0
  28. package/build/ethereum/etherUnits.js +60 -0
  29. package/build/ethereum/etherUnits.js.map +1 -0
  30. package/build/ethereum/myetherwallet.d.ts +47 -0
  31. package/build/ethereum/myetherwallet.js +294 -0
  32. package/build/ethereum/myetherwallet.js.map +1 -0
  33. package/build/ethereum/uiFuncs.d.ts +3 -0
  34. package/build/ethereum/uiFuncs.js +51 -0
  35. package/build/ethereum/uiFuncs.js.map +1 -0
  36. package/build/index.d.ts +111 -0
  37. package/build/index.js +310 -0
  38. package/build/index.js.map +1 -0
  39. package/build/memo.d.ts +6 -0
  40. package/build/memo.js +24 -0
  41. package/build/memo.js.map +1 -0
  42. package/build/qr.d.ts +8 -0
  43. package/build/qr.js +35 -0
  44. package/build/qr.js.map +1 -0
  45. package/build/rest/ajaxReq.d.ts +31 -0
  46. package/build/rest/ajaxReq.js +127 -0
  47. package/build/rest/ajaxReq.js.map +1 -0
  48. package/build/rest/endpoint.d.ts +18 -0
  49. package/build/rest/endpoint.js +26 -0
  50. package/build/rest/endpoint.js.map +1 -0
  51. package/build/rest/http.d.ts +10 -0
  52. package/build/rest/http.js +60 -0
  53. package/build/rest/http.js.map +1 -0
  54. package/build/rest/serializer.d.ts +1 -0
  55. package/build/rest/serializer.js +94 -0
  56. package/build/rest/serializer.js.map +1 -0
  57. package/build/type.d.ts +24 -0
  58. package/build/type.js +9 -0
  59. package/build/type.js.map +1 -0
  60. package/build/wallet.d.ts +35 -0
  61. package/build/wallet.js +162 -0
  62. package/build/wallet.js.map +1 -0
  63. package/package.json +41 -0
  64. package/src/bcRead.ts +184 -0
  65. package/src/bcTransaction.ts +157 -0
  66. package/src/blockies.ts +113 -0
  67. package/src/config.ts +33 -0
  68. package/src/connection.ts +243 -0
  69. package/src/customization.ts +156 -0
  70. package/src/ethereum/cipher.ts +118 -0
  71. package/src/ethereum/ethFuncs.ts +73 -0
  72. package/src/ethereum/etherUnits.ts +66 -0
  73. package/src/ethereum/myetherwallet.ts +354 -0
  74. package/src/ethereum/uiFuncs.ts +55 -0
  75. package/src/index.ts +366 -0
  76. package/src/memo.ts +37 -0
  77. package/src/qr.ts +34 -0
  78. package/src/rest/ajaxReq.ts +160 -0
  79. package/src/rest/endpoint.ts +31 -0
  80. package/src/rest/http.ts +69 -0
  81. package/src/rest/serializer.ts +99 -0
  82. package/src/type.ts +37 -0
  83. package/src/wallet.ts +200 -0
  84. package/tsconfig.json +31 -0
@@ -0,0 +1,47 @@
1
+ /// <reference types="node" />
2
+ export default class Wallet {
3
+ privKey: any;
4
+ constructor(priv?: any);
5
+ static generate(icapDirect: any): Wallet;
6
+ static fromPrivateKey(priv: any): Wallet;
7
+ getPrivateKey(): any;
8
+ getPrivateKeyString(): any;
9
+ getPublicKey(): any;
10
+ getPublicKeyString(): string;
11
+ getAddress(): any;
12
+ getAddressString(): string;
13
+ getChecksumAddressString(): any;
14
+ toV3(password: any, opts: any): {
15
+ [k: string]: any;
16
+ };
17
+ cipher(password: any, data: any, kdfparams: any): {
18
+ crypto: {
19
+ ciphertext: string;
20
+ cipherparams: {
21
+ iv: string;
22
+ };
23
+ cipher: string;
24
+ kdf: string;
25
+ kdfparams: any;
26
+ mac: any;
27
+ };
28
+ };
29
+ decifer(input: any, password: any): Buffer;
30
+ toJSON(): {
31
+ address: string;
32
+ checksumAddress: any;
33
+ privKey: any;
34
+ pubKey: string;
35
+ publisher: string;
36
+ encrypted: boolean;
37
+ version: number;
38
+ };
39
+ static fromMyEtherWallet(input: any, password: any): Wallet;
40
+ static fromMyEtherWalletV2(input: any): Wallet;
41
+ static fromEthSale(input: any, password: any): Wallet;
42
+ static fromMyEtherWalletKey(input: any, password: any): Wallet;
43
+ static fromV3(input: any, password: any, nonStrict: any): Wallet;
44
+ toV3String(password: any, opts: any): string;
45
+ getV3Filename(timestamp: any): string;
46
+ signMessage(msg: any): any;
47
+ }
@@ -0,0 +1,294 @@
1
+ import crypto from 'crypto';
2
+ import { v4 as uuidv4 } from 'uuid';
3
+ import ethUtil from 'ethereumjs-util';
4
+ import scrypt from 'scryptsy';
5
+ function decipherBuffer(decipher, data) {
6
+ return Buffer.concat([decipher.update(data), decipher.final()]);
7
+ }
8
+ function decodeCryptojsSalt(input) {
9
+ const ciphertext = Buffer.from(input, 'base64');
10
+ if (ciphertext.slice(0, 8).toString() === 'Salted__') {
11
+ return {
12
+ salt: ciphertext.slice(8, 16),
13
+ ciphertext: ciphertext.slice(16)
14
+ };
15
+ }
16
+ else {
17
+ return {
18
+ ciphertext: ciphertext
19
+ };
20
+ }
21
+ }
22
+ function evpKdf(data, salt, opts) {
23
+ // A single EVP iteration, returns `D_i`, where block equlas to `D_(i-1)`
24
+ function iter(block) {
25
+ let hash = crypto.createHash(opts.digest || 'md5');
26
+ hash.update(block);
27
+ hash.update(data);
28
+ hash.update(salt);
29
+ block = hash.digest();
30
+ for (let i = 1; i < (opts.count || 1); i++) {
31
+ hash = crypto.createHash(opts.digest || 'md5');
32
+ hash.update(block);
33
+ block = hash.digest();
34
+ }
35
+ return block;
36
+ }
37
+ const keysize = opts.keysize || 16;
38
+ const ivsize = opts.ivsize || 16;
39
+ const ret = [];
40
+ let i = 0;
41
+ while (Buffer.concat(ret).length < (keysize + ivsize)) {
42
+ ret[i] = iter((i === 0) ? Buffer.alloc(0) : ret[i - 1]);
43
+ i++;
44
+ }
45
+ const tmp = Buffer.concat(ret);
46
+ return {
47
+ key: tmp.slice(0, keysize),
48
+ iv: tmp.slice(keysize, keysize + ivsize)
49
+ };
50
+ }
51
+ export default class Wallet {
52
+ constructor(priv) {
53
+ if (!priv) {
54
+ priv = crypto.randomBytes(32);
55
+ }
56
+ this.privKey = priv.length === 32 ? priv : Buffer.from(priv, 'hex');
57
+ }
58
+ static generate(icapDirect) {
59
+ if (!icapDirect) {
60
+ return new this();
61
+ }
62
+ while (true) {
63
+ const privKey = crypto.randomBytes(32);
64
+ if (ethUtil.privateToAddress(privKey)[0] === 0) {
65
+ return new this(privKey);
66
+ }
67
+ }
68
+ }
69
+ static fromPrivateKey(priv) {
70
+ return new this(priv);
71
+ }
72
+ getPrivateKey() { return this.privKey; }
73
+ getPrivateKeyString() { return this.getPrivateKey().toString('hex'); }
74
+ getPublicKey() { return ethUtil.privateToPublic(this.privKey); }
75
+ getPublicKeyString() { return '0x' + this.getPublicKey().toString('hex'); }
76
+ getAddress() { return ethUtil.privateToAddress(this.privKey); }
77
+ getAddressString() { return '0x' + this.getAddress().toString('hex'); }
78
+ getChecksumAddressString() {
79
+ return ethUtil.toChecksumAddress(this.getAddressString());
80
+ }
81
+ toV3(password, opts) {
82
+ opts = opts || {};
83
+ const salt = opts.salt || crypto.randomBytes(32);
84
+ const iv = opts.iv || crypto.randomBytes(16);
85
+ let derivedKey;
86
+ const kdf = opts.kdf || 'scrypt';
87
+ const kdfparams = {
88
+ dklen: opts.dklen || 32,
89
+ salt: salt.toString('hex')
90
+ };
91
+ if (kdf === 'pbkdf2') {
92
+ kdfparams.c = opts.c || 262144;
93
+ kdfparams.prf = 'hmac-sha256';
94
+ derivedKey = crypto.pbkdf2Sync(Buffer.from(password), salt, kdfparams.c, kdfparams.dklen, 'sha256');
95
+ }
96
+ else if (kdf === 'scrypt') {
97
+ // FIXME: support progress reporting callback
98
+ kdfparams.n = opts.n || 262144;
99
+ kdfparams.r = opts.r || 8;
100
+ kdfparams.p = opts.p || 1;
101
+ derivedKey = scrypt(Buffer.from(password), salt, kdfparams.n, kdfparams.r, kdfparams.p, kdfparams.dklen);
102
+ }
103
+ else {
104
+ throw new Error('Unsupported kdf');
105
+ }
106
+ const cipher = crypto.createCipheriv(opts.cipher || 'aes-128-ctr', derivedKey.slice(0, 16), iv);
107
+ if (!cipher) {
108
+ throw new Error('Unsupported cipher');
109
+ }
110
+ const ciphertext = Buffer.concat([cipher.update(this.privKey), cipher.final()]);
111
+ const mac = ethUtil.keccak(Buffer.concat([derivedKey.slice(16, 32), ciphertext]));
112
+ const obj = {
113
+ version: 3,
114
+ id: uuidv4({
115
+ random: opts.uuid || crypto.randomBytes(16)
116
+ }),
117
+ address: this.getAddress().toString('hex'),
118
+ Crypto: {
119
+ ciphertext: ciphertext.toString('hex'),
120
+ cipherparams: {
121
+ iv: iv.toString('hex')
122
+ },
123
+ cipher: opts.cipher || 'aes-128-ctr',
124
+ kdf: kdf,
125
+ kdfparams: kdfparams,
126
+ mac: mac.toString('hex')
127
+ },
128
+ // ComChain addition:
129
+ server: { name: opts.server_name }
130
+ };
131
+ if (typeof opts.message_key !== 'undefined') {
132
+ obj.message_key = opts.message_key;
133
+ }
134
+ return obj;
135
+ }
136
+ cipher(password, data, kdfparams) {
137
+ if (!kdfparams) {
138
+ throw new Error('Wallet.cipher(..) requires a 3rd parameter kdfparams.');
139
+ }
140
+ const iv = crypto.randomBytes(16);
141
+ const derivedKey = scrypt(Buffer.from(password), Buffer.from(kdfparams.salt, 'hex'), kdfparams.n, kdfparams.r, kdfparams.p, kdfparams.dklen);
142
+ const cipher = crypto.createCipheriv('aes-128-ctr', derivedKey.slice(0, 16), iv);
143
+ const ciphertext = Buffer.concat([cipher.update(data), cipher.final()]);
144
+ const mac = ethUtil.keccak(Buffer.concat([derivedKey.slice(16, 32), ciphertext]));
145
+ return {
146
+ crypto: {
147
+ ciphertext: ciphertext.toString('hex'),
148
+ cipherparams: {
149
+ iv: iv.toString('hex')
150
+ },
151
+ cipher: 'aes-128-ctr',
152
+ kdf: 'scrypt',
153
+ kdfparams: kdfparams,
154
+ mac: mac.toString('hex')
155
+ }
156
+ };
157
+ }
158
+ decifer(input, password) {
159
+ const json = (typeof input === 'object')
160
+ ? input
161
+ : JSON.parse(input.toLowerCase());
162
+ const kdfparams = json.crypto.kdfparams;
163
+ const derivedKey = scrypt(Buffer.from(password), Buffer.from(kdfparams.salt, 'hex'), kdfparams.n, kdfparams.r, kdfparams.p, kdfparams.dklen);
164
+ const ciphertext = Buffer.from(json.crypto.ciphertext, 'hex');
165
+ const mac = ethUtil.keccak(Buffer.concat([derivedKey.slice(16, 32), ciphertext]));
166
+ if (mac.toString('hex') !== json.crypto.mac) {
167
+ throw new Error('Key derivation failed - possibly wrong passphrase');
168
+ }
169
+ const decipher = crypto.createDecipheriv(json.crypto.cipher, derivedKey.slice(0, 16), Buffer.from(json.crypto.cipherparams.iv, 'hex'));
170
+ return decipherBuffer(decipher, ciphertext);
171
+ }
172
+ toJSON() {
173
+ return {
174
+ address: this.getAddressString(),
175
+ checksumAddress: this.getChecksumAddressString(),
176
+ privKey: this.getPrivateKeyString(),
177
+ pubKey: this.getPublicKeyString(),
178
+ publisher: 'MyEtherWallet',
179
+ encrypted: false,
180
+ version: 2
181
+ };
182
+ }
183
+ static fromMyEtherWallet(input, password) {
184
+ const json = (typeof input === 'object') ? input : JSON.parse(input);
185
+ let privKey;
186
+ if (!json.locked) {
187
+ if (json.private.length !== 64) {
188
+ throw new Error('Invalid private key length');
189
+ }
190
+ privKey = Buffer.from(json.private, 'hex');
191
+ }
192
+ else {
193
+ if (typeof password !== 'string') {
194
+ throw new Error('Password required');
195
+ }
196
+ if (password.length < 7) {
197
+ throw new Error('Password must be at least 7 characters');
198
+ }
199
+ let cipher = json.encrypted ? json.private.slice(0, 128) : json.private;
200
+ cipher = decodeCryptojsSalt(cipher);
201
+ const evp = evpKdf(Buffer.from(password), cipher.salt, {
202
+ keysize: 32,
203
+ ivsize: 16
204
+ });
205
+ const decipher = crypto.createDecipheriv('aes-256-cbc', evp.key, evp.iv);
206
+ privKey = decipherBuffer(decipher, Buffer.from(cipher.ciphertext));
207
+ privKey = Buffer.from((privKey.toString()), 'hex');
208
+ }
209
+ const wallet = new this(privKey);
210
+ if (wallet.getAddressString() !== json.address) {
211
+ throw new Error('Invalid private key or address');
212
+ }
213
+ return wallet;
214
+ }
215
+ static fromMyEtherWalletV2(input) {
216
+ const json = (typeof input === 'object') ? input : JSON.parse(input);
217
+ if (json.privKey.length !== 64) {
218
+ throw new Error('Invalid private key length');
219
+ }
220
+ ;
221
+ const privKey = Buffer.from(json.privKey, 'hex');
222
+ return new this(privKey);
223
+ }
224
+ static fromEthSale(input, password) {
225
+ const json = (typeof input === 'object') ? input : JSON.parse(input);
226
+ const encseed = Buffer.from(json.encseed, 'hex');
227
+ const derivedKey = crypto.pbkdf2Sync(Buffer.from(password), Buffer.from(password), 2000, 32, 'sha256')
228
+ .slice(0, 16);
229
+ const decipher = crypto.createDecipheriv('aes-128-cbc', derivedKey, encseed.slice(0, 16));
230
+ const seed = decipherBuffer(decipher, encseed.slice(16));
231
+ const wallet = new this(ethUtil.keccak(seed));
232
+ if (wallet.getAddress().toString('hex') !== json.ethaddr) {
233
+ throw new Error('Decoded key mismatch - possibly wrong passphrase');
234
+ }
235
+ return wallet;
236
+ }
237
+ static fromMyEtherWalletKey(input, password) {
238
+ let cipher = input.slice(0, 128);
239
+ cipher = decodeCryptojsSalt(cipher);
240
+ const evp = evpKdf(Buffer.from(password), cipher.salt, {
241
+ keysize: 32,
242
+ ivsize: 16
243
+ });
244
+ const decipher = crypto.createDecipheriv('aes-256-cbc', evp.key, evp.iv);
245
+ let privKey = decipherBuffer(decipher, Buffer.from(cipher.ciphertext));
246
+ privKey = Buffer.from((privKey.toString()), 'hex');
247
+ return new this(privKey);
248
+ }
249
+ static fromV3(input, password, nonStrict) {
250
+ const json = (typeof input === 'object')
251
+ ? input
252
+ : JSON.parse(nonStrict ? input.toLowerCase() : input);
253
+ if (json.version !== 3) {
254
+ throw new Error('Not a V3 wallet');
255
+ }
256
+ let derivedKey;
257
+ let kdfparams;
258
+ if (json.crypto.kdf === 'scrypt') {
259
+ kdfparams = json.crypto.kdfparams;
260
+ derivedKey = scrypt(Buffer.from(password), Buffer.from(kdfparams.salt, 'hex'), kdfparams.n, kdfparams.r, kdfparams.p, kdfparams.dklen);
261
+ }
262
+ else if (json.crypto.kdf === 'pbkdf2') {
263
+ kdfparams = json.crypto.kdfparams;
264
+ if (kdfparams.prf !== 'hmac-sha256') {
265
+ throw new Error('Unsupported parameters to PBKDF2');
266
+ }
267
+ derivedKey = crypto.pbkdf2Sync(Buffer.from(password), Buffer.from(kdfparams.salt, 'hex'), kdfparams.c, kdfparams.dklen, 'sha256');
268
+ }
269
+ else {
270
+ throw new Error('Unsupported key derivation scheme');
271
+ }
272
+ const ciphertext = Buffer.from(json.crypto.ciphertext, 'hex');
273
+ const mac = ethUtil.keccak(Buffer.concat([derivedKey.slice(16, 32), ciphertext]));
274
+ if (mac.toString('hex') !== json.crypto.mac) {
275
+ throw new Error('Key derivation failed - possibly wrong passphrase');
276
+ }
277
+ const decipher = crypto.createDecipheriv(json.crypto.cipher, derivedKey.slice(0, 16), Buffer.from(json.crypto.cipherparams.iv, 'hex'));
278
+ const seed = decipherBuffer(decipher, ciphertext);
279
+ return new this(seed);
280
+ }
281
+ toV3String(password, opts) {
282
+ return JSON.stringify(this.toV3(password, opts));
283
+ }
284
+ getV3Filename(timestamp) {
285
+ const ts = timestamp ? new Date(timestamp) : new Date();
286
+ return `UTC--${ts.toJSON().replace(/:/g, '-')}--${this.getAddress().toString('hex')}`;
287
+ }
288
+ signMessage(msg) {
289
+ const msgHash = ethUtil.hashPersonalMessage(ethUtil.toBuffer(msg));
290
+ const signature = ethUtil.ecsign(msgHash, this.privKey);
291
+ return ethUtil.bufferToHex(Buffer.concat([signature.r, signature.s, ethUtil.toBuffer(signature.v)]));
292
+ }
293
+ }
294
+ //# sourceMappingURL=myetherwallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"myetherwallet.js","sourceRoot":"","sources":["../../src/ethereum/myetherwallet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function generateTx(txData: any, data: any): {
2
+ [k: string]: any;
3
+ };
@@ -0,0 +1,51 @@
1
+ import Tx from 'ethereumjs-tx';
2
+ import * as ethFuncs from './ethFuncs';
3
+ import * as etherUnits from './etherUnits';
4
+ function isNumeric(n) {
5
+ return !isNaN(parseFloat(n)) && isFinite(n);
6
+ }
7
+ function isTxDataValid(txData) {
8
+ if (txData.to !== '0xCONTRACT' &&
9
+ !ethFuncs.validateEtherAddress(txData.to)) {
10
+ throw new Error('ERROR_6');
11
+ }
12
+ else if (!isNumeric(txData.value) ||
13
+ parseFloat(txData.value) < 0) {
14
+ throw new Error('ERROR_8');
15
+ }
16
+ else if (!isNumeric(txData.gasLimit) ||
17
+ parseFloat(txData.gasLimit) <= 0) {
18
+ throw new Error('ERROR_9');
19
+ }
20
+ else if (!ethFuncs.validateHexString(txData.data)) {
21
+ throw new Error('ERROR_10');
22
+ }
23
+ if (txData.to === '0xCONTRACT')
24
+ txData.to = '';
25
+ }
26
+ export function generateTx(txData, data) {
27
+ try {
28
+ isTxDataValid(txData);
29
+ const rawTx = {
30
+ nonce: ethFuncs.sanitizeHex(data.nonce),
31
+ gasPrice: ethFuncs.sanitizeHex(ethFuncs.addTinyMoreToGas(data.gasprice)),
32
+ gasLimit: ethFuncs.sanitizeHex(ethFuncs.decimalToHex(txData.gasLimit)),
33
+ to: ethFuncs.sanitizeHex(txData.to),
34
+ value: ethFuncs.sanitizeHex(ethFuncs.decimalToHex(etherUnits.toWei(txData.value, txData.unit))),
35
+ data: ethFuncs.sanitizeHex(txData.data)
36
+ };
37
+ const eTx = new Tx(rawTx);
38
+ eTx.sign(Buffer.from(txData.key, 'hex'));
39
+ rawTx.rawTx = JSON.stringify(rawTx);
40
+ rawTx.signedTx = '0x' + eTx.serialize().toString('hex');
41
+ rawTx.isError = false;
42
+ return rawTx;
43
+ }
44
+ catch (e) {
45
+ return {
46
+ isError: true,
47
+ error: e
48
+ };
49
+ }
50
+ }
51
+ //# sourceMappingURL=uiFuncs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uiFuncs.js","sourceRoot":"","sources":["../../src/ethereum/uiFuncs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,eAAe,CAAA;AAC9B,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAA;AACtC,OAAO,KAAK,UAAU,MAAM,cAAc,CAAA;AAG1C,SAAS,SAAS,CAAE,CAAC;IACnB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAA;AAC7C,CAAC;AAED,SAAS,aAAa,CAAE,MAAM;IAC5B,IAAI,MAAM,CAAC,EAAE,KAAK,YAAY;QAC1B,CAAC,QAAQ,CAAC,oBAAoB,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE;QAC7C,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAA;KAC3B;SAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC;QACxB,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;QACvC,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAA;KAC3B;SAAM,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC;QAC3B,UAAU,CAAC,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE;QAC3C,MAAM,IAAI,KAAK,CAAC,SAAS,CAAC,CAAA;KAC3B;SAAM,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE;QACnD,MAAM,IAAI,KAAK,CAAC,UAAU,CAAC,CAAA;KAC5B;IACD,IAAI,MAAM,CAAC,EAAE,KAAK,YAAY;QAAE,MAAM,CAAC,EAAE,GAAG,EAAE,CAAA;AAChD,CAAC;AAED,MAAM,UAAU,UAAU,CAAE,MAAM,EAAE,IAAI;IACtC,IAAI;QACF,aAAa,CAAC,MAAM,CAAC,CAAA;QAErB,MAAM,KAAK,GAAuB;YAChC,KAAK,EAAE,QAAQ,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC;YACvC,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAC5B,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3C,QAAQ,EAAE,QAAQ,CAAC,WAAW,CAC5B,QAAQ,CAAC,YAAY,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;YACzC,EAAE,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,EAAE,CAAC;YACnC,KAAK,EAAE,QAAQ,CAAC,WAAW,CACzB,QAAQ,CAAC,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;YACrE,IAAI,EAAE,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;SACxC,CAAA;QACD,MAAM,GAAG,GAAG,IAAI,EAAE,CAAC,KAAK,CAAC,CAAA;QAEzB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAA;QACxC,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QACnC,KAAK,CAAC,QAAQ,GAAG,IAAI,GAAG,GAAG,CAAC,SAAS,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;QACvD,KAAK,CAAC,OAAO,GAAG,KAAK,CAAA;QACrB,OAAO,KAAK,CAAA;KACb;IAAC,OAAO,CAAC,EAAE;QACV,OAAO;YACL,OAAO,EAAE,IAAI;YACb,KAAK,EAAE,CAAC;SACT,CAAA;KACF;AACH,CAAC"}
@@ -0,0 +1,111 @@
1
+ import * as t from './type';
2
+ import HttpAbstract from './rest/http';
3
+ import EndpointAbstract from './rest/endpoint';
4
+ import AjaxReqAbstract from './rest/ajaxReq';
5
+ import ConnectionMgrAbstract from './connection';
6
+ import CustomizationAbstract from './customization';
7
+ import MessagingWalletAbstract from './wallet';
8
+ import BcReadAbstract from './bcRead';
9
+ import BcTransactionAbstract from './bcTransaction';
10
+ declare abstract class AbstractJsc3l {
11
+ protected abstract httpRequest: t.HttpRequest;
12
+ protected abstract persistentStore: t.IPersistentStore;
13
+ localDefaultConf: {};
14
+ endpoint: string;
15
+ _Endpoint: new (baseUrl: any) => EndpointAbstract;
16
+ _connection: null | ConnectionMgrAbstract;
17
+ _http: null | HttpAbstract;
18
+ constructor(localDefaultConf?: any);
19
+ /**
20
+ * `connection` facility needs to be lazy loaded as `this` and
21
+ * abstract `httpRequest` is not available in constructor.
22
+ */
23
+ get connection(): ConnectionMgrAbstract;
24
+ /**
25
+ * `Endpoint` class is a facility that needs to be lazy loaded as
26
+ * `this` and abstract `httpRequest` is not available in
27
+ * constructor.
28
+ */
29
+ get Endpoint(): new (baseUrl: any) => EndpointAbstract;
30
+ /**
31
+ * 'http' facility needs to be lazy loaded as 'this' and abstract
32
+ * httpRequest is not available in constructor.
33
+ */
34
+ get http(): HttpAbstract;
35
+ getAjaxReq(endpointUrl: string): AjaxReqAbstract;
36
+ /**
37
+ * `getConfJson` check persistent storage for configuration for
38
+ * given currency, otherwise will use the given repo to fetch
39
+ * it (and save it in persistent storage).
40
+ */
41
+ getConfig(repo: string, currencyName: string): Promise<any>;
42
+ /**
43
+ * `getConfJson` check persistent storage for configuration for
44
+ * given currency, otherwise will use the given repo to fetch
45
+ * it (and save it in persistent storage).
46
+ */
47
+ getCustomization(config: any): CustomizationAbstract;
48
+ getWallet(endpointUrl: string, currencyName: string, unlockUrl: string): new () => MessagingWalletAbstract;
49
+ getBcRead(endpointUrl: any, contracts: any): BcReadAbstract;
50
+ getBcTransaction(endpointUrl: any, contracts: any): BcTransactionAbstract;
51
+ _currencyMgrPromises: {};
52
+ getCurrencyMgr(currencyName: string, endpointUrl?: string, repoUrl?: string): Promise<any>;
53
+ _getCurrencyMgr(currencyName: string, endpointUrl?: string, repoUrl?: string): Promise<any>;
54
+ }
55
+ declare abstract class IntegratedJsc3lAbstract extends AbstractJsc3l {
56
+ /**
57
+ * `ajaxReq` depends on a loaded endpoint in
58
+ * `this.connection.endpoint` obtained through
59
+ * `this.endpoint.acquireEndPoint(..)`. XXXvlab: We could cache the
60
+ * result with endpoint being a key.
61
+ */
62
+ get ajaxReq(): AjaxReqAbstract;
63
+ /**
64
+ * `customization` depends on a local configuration being available
65
+ * through a previous call to `this.connection.getConfJSON(..)`
66
+ *
67
+ * XXXvlab: We could cache the result with result of
68
+ * `connection.getLocalConf()` being the key.
69
+ */
70
+ get customization(): CustomizationAbstract;
71
+ /**
72
+ * `wallet` depends on both:
73
+ * - a local configuration (only for the `currencyName`) being
74
+ * available through a previous call to
75
+ * `this.connection.getConfJSON(..)`
76
+ * - a loaded endpoint in `this.connection.endpoint` obtained
77
+ * through `this.endpoint.acquireEndPoint(..)`.
78
+ *
79
+ * XXXvlab: We could cache the result with result of
80
+ * `connection.getLocalConf()` and `this.connection.endpoint` being
81
+ * the keys.
82
+ */
83
+ get wallet(): MessagingWalletAbstract["constructor"];
84
+ /**
85
+ * `bcRead` access depends on both:
86
+ * - a local configuration (only for contracts information) being
87
+ * available through a previous call to
88
+ * `this.connection.getConfJSON(..)`
89
+ * - a loaded endpoint in `this.connection.endpoint` obtained through
90
+ * `this.endpoint.acquireEndPoint(..)`.
91
+ *
92
+ * XXXvlab: We could cache the result with result of
93
+ * `connection.getLocalConf()` and `this.connection.endpoint` being
94
+ * the keys.
95
+ */
96
+ get bcRead(): BcReadAbstract;
97
+ /**
98
+ * `bcTransaction` access depends on both:
99
+ * - a local configuration (only for contracts information) being
100
+ * available through a previous call to
101
+ * `this.connection.getConfJSON(..)`
102
+ * - a loaded endpoint in `this.connection.endpoint` obtained through
103
+ * `this.endpoint.acquireEndPoint(..)`.
104
+ *
105
+ * XXXvlab: We could cache the result with result of
106
+ * `connection.getLocalConf()` and `this.connection.endpoint` being
107
+ * the keys.
108
+ */
109
+ get bcTransaction(): BcTransactionAbstract;
110
+ }
111
+ export default IntegratedJsc3lAbstract;