@leofcoin/chain 1.5.31 → 1.5.32

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.
@@ -4958,11 +4958,27 @@ var index$2 = {
4958
4958
  };
4959
4959
 
4960
4960
  class BasicInterface {
4961
- encoded;
4962
- decoded;
4961
+ #encoded;
4962
+ #decoded;
4963
4963
  keys;
4964
4964
  name;
4965
4965
  #proto;
4966
+ get encoded() {
4967
+ if (!this.#encoded)
4968
+ this.#encoded = this.encode();
4969
+ return this.#encoded;
4970
+ }
4971
+ set encoded(value) {
4972
+ this.#encoded = value;
4973
+ }
4974
+ get decoded() {
4975
+ if (!this.#decoded)
4976
+ this.#decoded = this.decode();
4977
+ return this.#decoded;
4978
+ }
4979
+ set decoded(value) {
4980
+ this.#decoded = value;
4981
+ }
4966
4982
  set proto(value) {
4967
4983
  this.#proto = value;
4968
4984
  this.keys = Object.keys(value);
@@ -5031,7 +5047,7 @@ class BasicInterface {
5031
5047
  toHex() {
5032
5048
  if (!this.encoded)
5033
5049
  this.encode();
5034
- return toHex$2(this.encoded);
5050
+ return toHex$2(this.encoded.toString().split(',').map(number => Number(number)));
5035
5051
  }
5036
5052
  /**
5037
5053
  * @return {String} encoded
@@ -5051,1732 +5067,1209 @@ class BasicInterface {
5051
5067
  }
5052
5068
  }
5053
5069
 
5054
- /*!
5055
- * hash-wasm (https://www.npmjs.com/package/hash-wasm)
5056
- * (c) Dani Biro
5057
- * @license MIT
5058
- */
5059
-
5060
- /******************************************************************************
5061
- Copyright (c) Microsoft Corporation.
5062
-
5063
- Permission to use, copy, modify, and/or distribute this software for any
5064
- purpose with or without fee is hereby granted.
5065
-
5066
- THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
5067
- REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
5068
- AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
5069
- INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
5070
- LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
5071
- OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
5072
- PERFORMANCE OF THIS SOFTWARE.
5073
- ***************************************************************************** */
5074
- /* global Reflect, Promise, SuppressedError, Symbol */
5075
-
5076
-
5077
- function __awaiter(thisArg, _arguments, P, generator) {
5078
- function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
5079
- return new (P || (P = Promise))(function (resolve, reject) {
5080
- function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5081
- function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
5082
- function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
5083
- step((generator = generator.apply(thisArg, _arguments || [])).next());
5084
- });
5085
- }
5086
-
5087
- typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
5088
- var e = new Error(message);
5089
- return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
5090
- };
5091
-
5092
- class Mutex {
5093
- constructor() {
5094
- this.mutex = Promise.resolve();
5095
- }
5096
- lock() {
5097
- let begin = () => { };
5098
- this.mutex = this.mutex.then(() => new Promise(begin));
5099
- return new Promise((res) => {
5100
- begin = res;
5101
- });
5070
+ const blockchainCodecs = [
5071
+ {
5072
+ name: 'leofcoin-block',
5073
+ codec: '0x6c62',
5074
+ hashAlg: 'dbl-keccak-512',
5075
+ },
5076
+ {
5077
+ name: 'leofcoin-tx',
5078
+ codec: '0x6c74',
5079
+ hashAlg: 'dbl-keccak-512',
5080
+ },
5081
+ {
5082
+ name: 'leofcoin-itx',
5083
+ codec: '0x6c69',
5084
+ hashAlg: 'keccak-512',
5085
+ },
5086
+ {
5087
+ name: 'leofcoin-pr',
5088
+ codec: '0x6c70',
5089
+ hashAlg: 'keccak-256',
5090
+ },
5091
+ {
5092
+ name: 'contract-message',
5093
+ codec: '0x63636d',
5094
+ hashAlg: 'keccak-256'
5095
+ },
5096
+ {
5097
+ name: 'transaction-message',
5098
+ codec: '0x746d',
5099
+ hashAlg: 'keccak-256'
5100
+ },
5101
+ {
5102
+ name: 'raw-transaction-message',
5103
+ codec: '0x772746d',
5104
+ hashAlg: 'keccak-256'
5105
+ },
5106
+ {
5107
+ name: 'block-message',
5108
+ codec: '0x626d',
5109
+ hashAlg: 'keccak-256'
5110
+ },
5111
+ {
5112
+ name: 'bw-message',
5113
+ codec: '0x62776d',
5114
+ hashAlg: 'keccak-256'
5115
+ },
5116
+ {
5117
+ name: 'bw-request-message',
5118
+ codec: '0x6277726d',
5119
+ hashAlg: 'keccak-256'
5120
+ },
5121
+ {
5122
+ name: 'validator-message',
5123
+ codec: '0x766d',
5124
+ hashAlg: 'keccak-256'
5102
5125
  }
5103
- dispatch(fn) {
5104
- return __awaiter(this, void 0, void 0, function* () {
5105
- const unlock = yield this.lock();
5106
- try {
5107
- return yield Promise.resolve(fn());
5108
- }
5109
- finally {
5110
- unlock();
5111
- }
5112
- });
5126
+ ];
5127
+
5128
+ const internalCodecs = [
5129
+ {
5130
+ name: 'disco-hash',
5131
+ codec: '0x30',
5132
+ hashAlg: 'dbl-keccak-256',
5133
+ },
5134
+ {
5135
+ name: 'peernet-peer-response',
5136
+ codec: '0x707072',
5137
+ hashAlg: 'keccak-256',
5138
+ },
5139
+ {
5140
+ name: 'peernet-peer',
5141
+ codec: '0x7070',
5142
+ hashAlg: 'keccak-256',
5143
+ },
5144
+ {
5145
+ name: 'peernet-dht',
5146
+ codec: '0x706468',
5147
+ hashAlg: 'keccak-256',
5148
+ },
5149
+ {
5150
+ name: 'peernet-dht-response',
5151
+ codec: '0x706472',
5152
+ hashAlg: 'keccak-256',
5153
+ },
5154
+ {
5155
+ name: 'peernet-data',
5156
+ codec: '0x706461',
5157
+ hashAlg: 'keccak-256',
5158
+ },
5159
+ {
5160
+ name: 'peernet-data-response',
5161
+ codec: '0x70646172',
5162
+ hashAlg: 'keccak-256',
5163
+ },
5164
+ {
5165
+ name: 'peernet-message',
5166
+ codec: '0x706d65',
5167
+ hashAlg: 'keccak-256',
5168
+ },
5169
+ {
5170
+ name: 'peernet-ps',
5171
+ codec: '707073',
5172
+ hashAlg: 'keccak-256',
5173
+ },
5174
+ {
5175
+ name: 'peernet-response',
5176
+ codec: '0x7072',
5177
+ hashAlg: 'keccak-256',
5178
+ },
5179
+ {
5180
+ name: 'peernet-request',
5181
+ codec: '0x707271',
5182
+ hashAlg: 'keccak-256',
5183
+ },
5184
+ {
5185
+ name: 'peernet-file',
5186
+ codec: '0x7066',
5187
+ hashAlg: 'keccak-256',
5188
+ },
5189
+ {
5190
+ name: 'peernet-file-response',
5191
+ codec: '0x706672',
5192
+ hashAlg: 'keccak-256',
5113
5193
  }
5114
- }
5194
+ ];
5115
5195
 
5116
- /* eslint-disable import/prefer-default-export */
5117
- /* eslint-disable no-bitwise */
5118
- var _a;
5119
- function getGlobal() {
5120
- if (typeof globalThis !== 'undefined')
5121
- return globalThis;
5122
- // eslint-disable-next-line no-restricted-globals
5123
- if (typeof self !== 'undefined')
5124
- return self;
5125
- if (typeof window !== 'undefined')
5126
- return window;
5127
- return global;
5196
+ var social = [{
5197
+ name: 'chat-message',
5198
+ codec: '0x70636d',
5199
+ hashAlg: 'dbl-keccak-256',
5200
+ }];
5201
+
5202
+ const codecs = [
5203
+ ...internalCodecs,
5204
+ ...blockchainCodecs,
5205
+ ...social
5206
+ ];
5207
+
5208
+ globalThis.peernetCodecs = globalThis.peernetCodecs || {};
5209
+ const addCodec = (codecInput) => {
5210
+ let { hashAlg, codec, name } = codecInput;
5211
+ if (!globalThis.peernetCodecs[name])
5212
+ globalThis.peernetCodecs[name] = {
5213
+ hashAlg,
5214
+ codec: typeof codec === 'string' ? parseInt(codec, 16) : codec
5215
+ };
5216
+ };
5217
+ const getCodec = (name) => {
5218
+ if (typeof name === 'number')
5219
+ return name;
5220
+ return getCodecByName(name).codec;
5221
+ };
5222
+ const getCodecName = (codec) => {
5223
+ return Object.keys(globalThis.peernetCodecs).reduce((p, c) => {
5224
+ const item = globalThis.peernetCodecs[c];
5225
+ if (item.codec === codec)
5226
+ return c;
5227
+ else
5228
+ return p;
5229
+ }, undefined);
5230
+ };
5231
+ const getCodecByName = (name) => globalThis.peernetCodecs[name];
5232
+ const getHashAlg = (name) => {
5233
+ if (typeof name === 'number')
5234
+ return getCodecByName(getCodecName(name)).hashAlg;
5235
+ return getCodecByName(name).hashAlg;
5236
+ };
5237
+ const isCodec = (codec) => {
5238
+ if (codec.codec !== undefined && codec.hashAlg)
5239
+ return true;
5240
+ return false;
5241
+ };
5242
+ const validateCodec = (codec) => {
5243
+ if (codec.codec === undefined ||
5244
+ codec.hashAlg === undefined ||
5245
+ codec.name === undefined)
5246
+ throw new Error(`invalid codecInput: ${codec}`);
5247
+ };
5248
+ for (const codec of codecs) {
5249
+ addCodec(codec);
5128
5250
  }
5129
- const globalObject = getGlobal();
5130
- const nodeBuffer = (_a = globalObject.Buffer) !== null && _a !== void 0 ? _a : null;
5131
- const textEncoder = globalObject.TextEncoder ? new globalObject.TextEncoder() : null;
5132
- function hexCharCodesToInt(a, b) {
5133
- return (((a & 0xF) + ((a >> 6) | ((a >> 3) & 0x8))) << 4) | ((b & 0xF) + ((b >> 6) | ((b >> 3) & 0x8)));
5134
- }
5135
- function writeHexToUInt8(buf, str) {
5136
- const size = str.length >> 1;
5137
- for (let i = 0; i < size; i++) {
5138
- const index = i << 1;
5139
- buf[i] = hexCharCodesToInt(str.charCodeAt(index), str.charCodeAt(index + 1));
5251
+ var utils$p = {
5252
+ isCodec,
5253
+ addCodec,
5254
+ getCodec,
5255
+ getHashAlg,
5256
+ getCodecName,
5257
+ validateCodec,
5258
+ codecs: globalThis.peernetCodecs
5259
+ };
5260
+
5261
+ let Codec$1 = class Codec extends BasicInterface {
5262
+ codecBuffer;
5263
+ codec;
5264
+ hashAlg;
5265
+ constructor(buffer) {
5266
+ super();
5267
+ if (buffer) {
5268
+ if (buffer instanceof Uint8Array) {
5269
+ const codec = index$8.decode(buffer);
5270
+ const name = this.getCodecName(codec);
5271
+ if (name) {
5272
+ this.name = name;
5273
+ this.encoded = buffer;
5274
+ this.decode(buffer);
5275
+ }
5276
+ else {
5277
+ this.encode(Number(new TextDecoder().decode(buffer)));
5278
+ }
5279
+ }
5280
+ else if (buffer instanceof ArrayBuffer) {
5281
+ const codec = index$8.decode(buffer);
5282
+ const name = this.getCodecName(codec);
5283
+ if (name) {
5284
+ this.name = name;
5285
+ this.decode(buffer);
5286
+ }
5287
+ else {
5288
+ this.encode(Number(new TextDecoder().decode(new Uint8Array(buffer))));
5289
+ }
5290
+ }
5291
+ else if (typeof buffer === 'string') {
5292
+ if (utils$p.getCodec(buffer))
5293
+ this.fromName(buffer);
5294
+ else if (this.isHex(buffer))
5295
+ this.fromHex(buffer);
5296
+ else if (this.isBase32(buffer))
5297
+ this.fromBs32(buffer);
5298
+ else if (this.isBase58(buffer))
5299
+ this.fromBs58(buffer);
5300
+ else
5301
+ this.fromString(buffer);
5302
+ }
5303
+ if (!isNaN(buffer))
5304
+ if (utils$p.getCodec(buffer))
5305
+ this.fromCodec(buffer);
5306
+ }
5140
5307
  }
5141
- }
5142
- function hexStringEqualsUInt8(str, buf) {
5143
- if (str.length !== buf.length * 2) {
5144
- return false;
5308
+ fromEncoded(encoded) {
5309
+ const codec = index$8.decode(encoded);
5310
+ const name = this.getCodecName(codec);
5311
+ this.name = name;
5312
+ this.encoded = encoded;
5313
+ return this.decode(encoded);
5145
5314
  }
5146
- for (let i = 0; i < buf.length; i++) {
5147
- const strIndex = i << 1;
5148
- if (buf[i] !== hexCharCodesToInt(str.charCodeAt(strIndex), str.charCodeAt(strIndex + 1))) {
5149
- return false;
5150
- }
5315
+ getCodec(name) {
5316
+ return utils$p.getCodec(name);
5151
5317
  }
5152
- return true;
5153
- }
5154
- const alpha = 'a'.charCodeAt(0) - 10;
5155
- const digit = '0'.charCodeAt(0);
5156
- function getDigestHex(tmpBuffer, input, hashLength) {
5157
- let p = 0;
5158
- /* eslint-disable no-plusplus */
5159
- for (let i = 0; i < hashLength; i++) {
5160
- let nibble = input[i] >>> 4;
5161
- tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
5162
- nibble = input[i] & 0xF;
5163
- tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
5318
+ getCodecName(codec) {
5319
+ return utils$p.getCodecName(codec);
5164
5320
  }
5165
- /* eslint-enable no-plusplus */
5166
- return String.fromCharCode.apply(null, tmpBuffer);
5167
- }
5168
- const getUInt8Buffer = nodeBuffer !== null
5169
- ? (data) => {
5170
- if (typeof data === 'string') {
5171
- const buf = nodeBuffer.from(data, 'utf8');
5172
- return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
5321
+ getHashAlg(name) {
5322
+ return utils$p.getHashAlg(name);
5323
+ }
5324
+ fromCodec(codec) {
5325
+ this.name = this.getCodecName(codec);
5326
+ this.hashAlg = this.getHashAlg(this.name);
5327
+ this.codec = this.getCodec(this.name);
5328
+ this.codecBuffer = index$8.encode(this.codec);
5329
+ this.decoded = {
5330
+ name: this.name,
5331
+ hashAlg: this.hashAlg,
5332
+ codec: this.codec,
5333
+ codecBuffer: this.codecBuffer
5334
+ };
5335
+ }
5336
+ fromName(name) {
5337
+ const codec = this.getCodec(name);
5338
+ this.name = name;
5339
+ this.codec = codec;
5340
+ this.hashAlg = this.getHashAlg(name);
5341
+ this.codecBuffer = index$8.encode(this.codec);
5342
+ this.decoded = {
5343
+ name: this.name,
5344
+ hashAlg: this.hashAlg,
5345
+ codec: this.codec,
5346
+ codecBuffer: this.codecBuffer
5347
+ };
5348
+ }
5349
+ decode(encoded) {
5350
+ encoded = encoded || this.encoded;
5351
+ const codec = index$8.decode(encoded);
5352
+ this.fromCodec(codec);
5353
+ return this.decoded;
5354
+ }
5355
+ encode(codec) {
5356
+ codec = codec || this.codec;
5357
+ this.encoded = index$8.encode(codec);
5358
+ return this.encoded;
5359
+ }
5360
+ };
5361
+
5362
+ class CodecHash extends BasicInterface {
5363
+ codec;
5364
+ discoCodec;
5365
+ constructor(buffer, options = {}) {
5366
+ super();
5367
+ if (options.name)
5368
+ this.name = options.name;
5369
+ else
5370
+ this.name = 'disco-hash';
5371
+ if (options.codecs)
5372
+ this.codecs = options.codecs;
5373
+ return this.init(buffer);
5374
+ }
5375
+ async init(uint8Array) {
5376
+ if (uint8Array) {
5377
+ if (uint8Array instanceof Uint8Array) {
5378
+ this.discoCodec = new Codec$1(uint8Array, this.codecs);
5379
+ const name = this.discoCodec.name;
5380
+ if (name) {
5381
+ this.name = name;
5382
+ this.decode(uint8Array);
5383
+ }
5384
+ else {
5385
+ await this.encode(uint8Array);
5386
+ }
5387
+ }
5388
+ if (typeof uint8Array === 'string') {
5389
+ if (this.isHex(uint8Array))
5390
+ await this.fromHex(uint8Array);
5391
+ if (this.isBase32(uint8Array))
5392
+ await this.fromBs32(uint8Array);
5393
+ else if (this.isBase58(uint8Array))
5394
+ await this.fromBs58(uint8Array);
5395
+ else
5396
+ throw new Error(`unsupported string ${uint8Array}`);
5397
+ }
5398
+ else if (typeof uint8Array === 'object')
5399
+ await this.fromJSON(uint8Array);
5173
5400
  }
5174
- if (nodeBuffer.isBuffer(data)) {
5175
- return new Uint8Array(data.buffer, data.byteOffset, data.length);
5401
+ return this;
5402
+ }
5403
+ get prefix() {
5404
+ const length = this.length;
5405
+ const uint8Array = new Uint8Array(length.length + this.discoCodec.codecBuffer.length);
5406
+ uint8Array.set(length);
5407
+ uint8Array.set(this.discoCodec.codecBuffer, length.length);
5408
+ return uint8Array;
5409
+ }
5410
+ get length() {
5411
+ return index$8.encode(this.size);
5412
+ }
5413
+ get buffer() {
5414
+ return this.encoded;
5415
+ }
5416
+ get hash() {
5417
+ return this.encoded;
5418
+ }
5419
+ fromJSON(json) {
5420
+ return this.encode(new TextEncoder().encode(JSON.stringify(json)));
5421
+ }
5422
+ async encode(buffer, name) {
5423
+ if (!this.name && name)
5424
+ this.name = name;
5425
+ if (!buffer)
5426
+ buffer = this.buffer;
5427
+ this.discoCodec = new Codec$1(this.name);
5428
+ this.discoCodec.fromName(this.name);
5429
+ let hashAlg = this.discoCodec.hashAlg;
5430
+ const hashVariant = Number(hashAlg.split('-')[hashAlg.split('-').length - 1]);
5431
+ if (hashAlg.includes('dbl')) {
5432
+ hashAlg = hashAlg.replace('dbl-', '');
5433
+ // const hasher = await createKeccak(hashVariant)
5434
+ // await hasher.init()
5435
+ // hasher.update(buffer)
5436
+ // buffer = hasher.digest('binary')
5437
+ buffer = await crypto.subtle.digest(`SHA-${hashVariant}`, buffer);
5176
5438
  }
5177
- if (ArrayBuffer.isView(data)) {
5178
- return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
5439
+ // const hasher = await createKeccak(hashVariant)
5440
+ // await hasher.init()
5441
+ // hasher.update(buffer)
5442
+ // this.digest = hasher.digest('binary')
5443
+ this.digest = await crypto.subtle.digest(`SHA-${hashVariant}`, buffer);
5444
+ if (this.digest instanceof ArrayBuffer) {
5445
+ this.digest = new Uint8Array(this.digest);
5179
5446
  }
5180
- throw new Error('Invalid data type!');
5447
+ this.size = this.digest.length;
5448
+ this.codec = this.discoCodec.encode();
5449
+ this.codec = this.discoCodec.codecBuffer;
5450
+ const uint8Array = new Uint8Array(this.digest.length + this.prefix.length);
5451
+ uint8Array.set(this.prefix);
5452
+ uint8Array.set(this.digest, this.prefix.length);
5453
+ this.encoded = uint8Array;
5454
+ return this.encoded;
5181
5455
  }
5182
- : (data) => {
5183
- if (typeof data === 'string') {
5184
- return textEncoder.encode(data);
5185
- }
5186
- if (ArrayBuffer.isView(data)) {
5187
- return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
5456
+ async validate(buffer) {
5457
+ if (Buffer.isBuffer(buffer)) {
5458
+ const codec = index$8.decode(buffer);
5459
+ if (this.codecs[codec]) {
5460
+ this.decode(buffer);
5461
+ }
5462
+ else {
5463
+ await this.encode(buffer);
5464
+ }
5188
5465
  }
5189
- throw new Error('Invalid data type!');
5190
- };
5191
- const base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
5192
- const base64Lookup = new Uint8Array(256);
5193
- for (let i = 0; i < base64Chars.length; i++) {
5194
- base64Lookup[base64Chars.charCodeAt(i)] = i;
5195
- }
5196
- function getDecodeBase64Length(data) {
5197
- let bufferLength = Math.floor(data.length * 0.75);
5198
- const len = data.length;
5199
- if (data[len - 1] === '=') {
5200
- bufferLength -= 1;
5201
- if (data[len - 2] === '=') {
5202
- bufferLength -= 1;
5466
+ if (typeof buffer === 'string') {
5467
+ if (this.isHex(buffer))
5468
+ this.fromHex(buffer);
5469
+ if (this.isBase32(buffer))
5470
+ this.fromBs32(buffer);
5203
5471
  }
5472
+ if (typeof buffer === 'object')
5473
+ this.fromJSON(buffer);
5204
5474
  }
5205
- return bufferLength;
5206
- }
5207
- function decodeBase64(data) {
5208
- const bufferLength = getDecodeBase64Length(data);
5209
- const len = data.length;
5210
- const bytes = new Uint8Array(bufferLength);
5211
- let p = 0;
5212
- for (let i = 0; i < len; i += 4) {
5213
- const encoded1 = base64Lookup[data.charCodeAt(i)];
5214
- const encoded2 = base64Lookup[data.charCodeAt(i + 1)];
5215
- const encoded3 = base64Lookup[data.charCodeAt(i + 2)];
5216
- const encoded4 = base64Lookup[data.charCodeAt(i + 3)];
5217
- bytes[p] = (encoded1 << 2) | (encoded2 >> 4);
5218
- p += 1;
5219
- bytes[p] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
5220
- p += 1;
5221
- bytes[p] = ((encoded3 & 3) << 6) | (encoded4 & 63);
5222
- p += 1;
5223
- }
5224
- return bytes;
5225
- }
5226
-
5227
- const MAX_HEAP = 16 * 1024;
5228
- const WASM_FUNC_HASH_LENGTH = 4;
5229
- const wasmMutex = new Mutex();
5230
- const wasmModuleCache = new Map();
5231
- function WASMInterface(binary, hashLength) {
5232
- return __awaiter(this, void 0, void 0, function* () {
5233
- let wasmInstance = null;
5234
- let memoryView = null;
5235
- let initialized = false;
5236
- if (typeof WebAssembly === 'undefined') {
5237
- throw new Error('WebAssembly is not supported in this environment!');
5238
- }
5239
- const writeMemory = (data, offset = 0) => {
5240
- memoryView.set(data, offset);
5241
- };
5242
- const getMemory = () => memoryView;
5243
- const getExports = () => wasmInstance.exports;
5244
- const setMemorySize = (totalSize) => {
5245
- wasmInstance.exports.Hash_SetMemorySize(totalSize);
5246
- const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
5247
- const memoryBuffer = wasmInstance.exports.memory.buffer;
5248
- memoryView = new Uint8Array(memoryBuffer, arrayOffset, totalSize);
5249
- };
5250
- const getStateSize = () => {
5251
- const view = new DataView(wasmInstance.exports.memory.buffer);
5252
- const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);
5253
- return stateSize;
5254
- };
5255
- const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, void 0, void 0, function* () {
5256
- if (!wasmModuleCache.has(binary.name)) {
5257
- const asm = decodeBase64(binary.data);
5258
- const promise = WebAssembly.compile(asm);
5259
- wasmModuleCache.set(binary.name, promise);
5260
- }
5261
- const module = yield wasmModuleCache.get(binary.name);
5262
- wasmInstance = yield WebAssembly.instantiate(module, {
5263
- // env: {
5264
- // emscripten_memcpy_big: (dest, src, num) => {
5265
- // const memoryBuffer = wasmInstance.exports.memory.buffer;
5266
- // const memView = new Uint8Array(memoryBuffer, 0);
5267
- // memView.set(memView.subarray(src, src + num), dest);
5268
- // },
5269
- // print_memory: (offset, len) => {
5270
- // const memoryBuffer = wasmInstance.exports.memory.buffer;
5271
- // const memView = new Uint8Array(memoryBuffer, 0);
5272
- // console.log('print_int32', memView.subarray(offset, offset + len));
5273
- // },
5274
- // },
5275
- });
5276
- // wasmInstance.exports._start();
5277
- }));
5278
- const setupInterface = () => __awaiter(this, void 0, void 0, function* () {
5279
- if (!wasmInstance) {
5280
- yield loadWASMPromise;
5281
- }
5282
- const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
5283
- const memoryBuffer = wasmInstance.exports.memory.buffer;
5284
- memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);
5285
- });
5286
- const init = (bits = null) => {
5287
- initialized = true;
5288
- wasmInstance.exports.Hash_Init(bits);
5289
- };
5290
- const updateUInt8Array = (data) => {
5291
- let read = 0;
5292
- while (read < data.length) {
5293
- const chunk = data.subarray(read, read + MAX_HEAP);
5294
- read += chunk.length;
5295
- memoryView.set(chunk);
5296
- wasmInstance.exports.Hash_Update(chunk.length);
5297
- }
5298
- };
5299
- const update = (data) => {
5300
- if (!initialized) {
5301
- throw new Error('update() called before init()');
5302
- }
5303
- const Uint8Buffer = getUInt8Buffer(data);
5304
- updateUInt8Array(Uint8Buffer);
5305
- };
5306
- const digestChars = new Uint8Array(hashLength * 2);
5307
- const digest = (outputType, padding = null) => {
5308
- if (!initialized) {
5309
- throw new Error('digest() called before init()');
5310
- }
5311
- initialized = false;
5312
- wasmInstance.exports.Hash_Final(padding);
5313
- if (outputType === 'binary') {
5314
- // the data is copied to allow GC of the original memory object
5315
- return memoryView.slice(0, hashLength);
5316
- }
5317
- return getDigestHex(digestChars, memoryView, hashLength);
5318
- };
5319
- const save = () => {
5320
- if (!initialized) {
5321
- throw new Error('save() can only be called after init() and before digest()');
5322
- }
5323
- const stateOffset = wasmInstance.exports.Hash_GetState();
5324
- const stateLength = getStateSize();
5325
- const memoryBuffer = wasmInstance.exports.memory.buffer;
5326
- const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);
5327
- // prefix is 4 bytes from SHA1 hash of the WASM binary
5328
- // it is used to detect incompatible internal states between different versions of hash-wasm
5329
- const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);
5330
- writeHexToUInt8(prefixedState, binary.hash);
5331
- prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);
5332
- return prefixedState;
5333
- };
5334
- const load = (state) => {
5335
- if (!(state instanceof Uint8Array)) {
5336
- throw new Error('load() expects an Uint8Array generated by save()');
5337
- }
5338
- const stateOffset = wasmInstance.exports.Hash_GetState();
5339
- const stateLength = getStateSize();
5340
- const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;
5341
- const memoryBuffer = wasmInstance.exports.memory.buffer;
5342
- if (state.length !== overallLength) {
5343
- throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);
5344
- }
5345
- if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {
5346
- throw new Error('This state was written by an incompatible hash implementation');
5347
- }
5348
- const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);
5349
- new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);
5350
- initialized = true;
5351
- };
5352
- const isDataShort = (data) => {
5353
- if (typeof data === 'string') {
5354
- // worst case is 4 bytes / char
5355
- return data.length < MAX_HEAP / 4;
5356
- }
5357
- return data.byteLength < MAX_HEAP;
5358
- };
5359
- let canSimplify = isDataShort;
5360
- switch (binary.name) {
5361
- case 'argon2':
5362
- case 'scrypt':
5363
- canSimplify = () => true;
5364
- break;
5365
- case 'blake2b':
5366
- case 'blake2s':
5367
- // if there is a key at blake2 then cannot simplify
5368
- canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);
5369
- break;
5370
- case 'blake3':
5371
- // if there is a key at blake3 then cannot simplify
5372
- canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);
5373
- break;
5374
- case 'xxhash64': // cannot simplify
5375
- case 'xxhash3':
5376
- case 'xxhash128':
5377
- canSimplify = () => false;
5378
- break;
5475
+ decode(buffer) {
5476
+ this.encoded = buffer;
5477
+ const codec = index$8.decode(buffer);
5478
+ this.discoCodec = new Codec$1(codec, this.codecs);
5479
+ // TODO: validate codec
5480
+ buffer = buffer.slice(index$8.decode.bytes);
5481
+ this.size = index$8.decode(buffer);
5482
+ this.digest = buffer.slice(index$8.decode.bytes);
5483
+ if (this.digest.length !== this.size) {
5484
+ throw new Error(`hash length inconsistent: 0x${this.encoded.toString('hex')}`);
5379
5485
  }
5380
- // shorthand for (init + update + digest) for better performance
5381
- const calculate = (data, initParam = null, digestParam = null) => {
5382
- if (!canSimplify(data, initParam)) {
5383
- init(initParam);
5384
- update(data);
5385
- return digest('hex', digestParam);
5386
- }
5387
- const buffer = getUInt8Buffer(data);
5388
- memoryView.set(buffer);
5389
- wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);
5390
- return getDigestHex(digestChars, memoryView, hashLength);
5391
- };
5392
- yield setupInterface();
5486
+ // const discoCodec = new Codec(codec, this.codecs)
5487
+ this.name = this.discoCodec.name;
5488
+ this.size = this.digest.length;
5393
5489
  return {
5394
- getMemory,
5395
- writeMemory,
5396
- getExports,
5397
- setMemorySize,
5398
- init,
5399
- update,
5400
- digest,
5401
- save,
5402
- load,
5403
- calculate,
5404
- hashLength,
5490
+ codec: this.codec,
5491
+ name: this.name,
5492
+ size: this.size,
5493
+ length: this.length,
5494
+ digest: this.digest,
5405
5495
  };
5406
- });
5496
+ }
5407
5497
  }
5408
5498
 
5409
- new Mutex();
5410
-
5411
- new Mutex();
5412
-
5413
- new Mutex();
5414
-
5415
- new Mutex();
5416
-
5417
- new Mutex();
5418
-
5419
- new Mutex();
5420
-
5421
- new Mutex();
5422
-
5423
- new Mutex();
5424
-
5425
- new Mutex();
5426
-
5427
- var name$b = "sha3";
5428
- var data$b = "AGFzbQEAAAABFARgAAF/YAF/AGACf38AYAN/f38AAwgHAAEBAgEAAwUEAQECAgYOAn8BQZCNBQt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAQtIYXNoX1VwZGF0ZQACCkhhc2hfRmluYWwABA1IYXNoX0dldFN0YXRlAAUOSGFzaF9DYWxjdWxhdGUABgpTVEFURV9TSVpFAwEKqBwHBQBBgAoL1wMAQQBCADcDgI0BQQBCADcD+IwBQQBCADcD8IwBQQBCADcD6IwBQQBCADcD4IwBQQBCADcD2IwBQQBCADcD0IwBQQBCADcDyIwBQQBCADcDwIwBQQBCADcDuIwBQQBCADcDsIwBQQBCADcDqIwBQQBCADcDoIwBQQBCADcDmIwBQQBCADcDkIwBQQBCADcDiIwBQQBCADcDgIwBQQBCADcD+IsBQQBCADcD8IsBQQBCADcD6IsBQQBCADcD4IsBQQBCADcD2IsBQQBCADcD0IsBQQBCADcDyIsBQQBCADcDwIsBQQBCADcDuIsBQQBCADcDsIsBQQBCADcDqIsBQQBCADcDoIsBQQBCADcDmIsBQQBCADcDkIsBQQBCADcDiIsBQQBCADcDgIsBQQBCADcD+IoBQQBCADcD8IoBQQBCADcD6IoBQQBCADcD4IoBQQBCADcD2IoBQQBCADcD0IoBQQBCADcDyIoBQQBCADcDwIoBQQBCADcDuIoBQQBCADcDsIoBQQBCADcDqIoBQQBCADcDoIoBQQBCADcDmIoBQQBCADcDkIoBQQBCADcDiIoBQQBCADcDgIoBQQBBwAwgAEEBdGtBA3Y2AoyNAUEAQQA2AoiNAQuMAwEIfwJAQQAoAoiNASIBQQBIDQBBACABIABqQQAoAoyNASICcDYCiI0BAkACQCABDQBBgAohAwwBCwJAIAIgAWsiBCAAIAQgAEkbIgNFDQAgA0EDcSEFQQAhBgJAIANBBEkNACABQYCKAWohByADQXxxIQhBACEGA0AgByAGaiIDQcgBaiAGQYAKai0AADoAACADQckBaiAGQYEKai0AADoAACADQcoBaiAGQYIKai0AADoAACADQcsBaiAGQYMKai0AADoAACAIIAZBBGoiBkcNAAsLIAVFDQAgAUHIiwFqIQMDQCADIAZqIAZBgApqLQAAOgAAIAZBAWohBiAFQX9qIgUNAAsLIAQgAEsNAUHIiwEgAhADIAAgBGshACAEQYAKaiEDCwJAIAAgAkkNAANAIAMgAhADIAMgAmohAyAAIAJrIgAgAk8NAAsLIABFDQBBACECQcgBIQYDQCAGQYCKAWogAyAGakG4fmotAAA6AAAgBkEBaiEGIAAgAkEBaiICQf8BcUsNAAsLC+QLAS1+IAApA0AhAkEAKQPAigEhAyAAKQM4IQRBACkDuIoBIQUgACkDMCEGQQApA7CKASEHIAApAyghCEEAKQOoigEhCSAAKQMgIQpBACkDoIoBIQsgACkDGCEMQQApA5iKASENIAApAxAhDkEAKQOQigEhDyAAKQMIIRBBACkDiIoBIREgACkDACESQQApA4CKASETQQApA8iKASEUAkACQCABQcgASw0AQQApA9CKASEVQQApA+CKASEWQQApA9iKASEXDAELQQApA+CKASAAKQNghSEWQQApA9iKASAAKQNYhSEXQQApA9CKASAAKQNQhSEVIBQgACkDSIUhFCABQekASQ0AQQBBACkD6IoBIAApA2iFNwPoigFBAEEAKQPwigEgACkDcIU3A/CKAUEAQQApA/iKASAAKQN4hTcD+IoBQQBBACkDgIsBIAApA4ABhTcDgIsBIAFBiQFJDQBBAEEAKQOIiwEgACkDiAGFNwOIiwELIAMgAoUhGCAFIASFIRkgByAGhSEHIAkgCIUhCCALIAqFIRogDSAMhSEJIA8gDoUhCiARIBCFIQsgEyAShSEMQQApA7iLASESQQApA5CLASETQQApA+iKASEbQQApA6CLASEcQQApA/iKASENQQApA7CLASEdQQApA4iLASEOQQApA8CLASEPQQApA5iLASEeQQApA/CKASEQQQApA6iLASERQQApA4CLASEfQcB+IQADQCAaIAcgC4UgF4UgH4UgEYVCAYmFIBSFIBCFIB6FIA+FIQIgDCAZIAqFIBaFIA6FIB2FQgGJhSAIhSAVhSANhSAchSIDIAeFISAgCSAIIAyFIBWFIA2FIByFQgGJhSAYhSAbhSAThSAShSIEIA+FISEgGCAKIBQgGoUgEIUgHoUgD4VCAYmFIBmFIBaFIA6FIB2FIgWFQjeJIiIgCyAYIAmFIBuFIBOFIBKFQgGJhSAHhSAXhSAfhSARhSIGIAqFQj6JIiNCf4WDIAMgEYVCAokiJIUhDyANIAKFQimJIiUgBCAQhUIniSImQn+FgyAihSERIBIgBYVCOIkiEiAGIA6FQg+JIidCf4WDIAMgF4VCCokiKIUhDiAEIBqFQhuJIikgKCAIIAKFQiSJIipCf4WDhSENIAYgGYVCBokiKyADIAuFQgGJIixCf4WDIBwgAoVCEokiLYUhECArIAQgHoVCCIkiLiAbIAWFQhmJIhtCf4WDhSEXIAYgHYVCPYkiGSAEIBSFQhSJIgQgCSAFhUIciSIIQn+Fg4UhFCAIIBlCf4WDIAMgH4VCLYkiA4UhGCAZIANCf4WDIBUgAoVCA4kiCYUhGSAEIAMgCUJ/hYOFIQcgCSAEQn+FgyAIhSEIIAwgAoUiAiAhQg6JIgNCf4WDIBMgBYVCFYkiBIUhCSAGIBaFQiuJIgUgAyAEQn+Fg4UhCiAEIAVCf4WDICBCLIkiBIUhCyAAQdAJaikDACAFIARCf4WDhSAChSEMICcgKEJ/hYMgKoUiBSEfIAMgBCACQn+Fg4UiAiEaICogKUJ/hYMgEoUiAyEeIC0gLkJ/hYMgG4UiBCEWICYgJCAlQn+Fg4UiBiEdIBsgK0J/hYMgLIUiKCEVICMgJiAiQn+Fg4UiIiEcIC4gLCAtQn+Fg4UiJiEbICcgKSASQn+Fg4UiJyETICMgJEJ/hYMgJYUiIyESIABBCGoiAA0AC0EAIBE3A6iLAUEAIAU3A4CLAUEAIBc3A9iKAUEAIAc3A7CKAUEAIAs3A4iKAUEAIA83A8CLAUEAIAM3A5iLAUEAIBA3A/CKAUEAIBQ3A8iKAUEAIAI3A6CKAUEAIAY3A7CLAUEAIA43A4iLAUEAIAQ3A+CKAUEAIBk3A7iKAUEAIAo3A5CKAUEAICI3A6CLAUEAIA03A/iKAUEAICg3A9CKAUEAIAg3A6iKAUEAIAw3A4CKAUEAICM3A7iLAUEAICc3A5CLAUEAICY3A+iKAUEAIBg3A8CKAUEAIAk3A5iKAQv4AgEFf0HkAEEAKAKMjQEiAUEBdmshAgJAQQAoAoiNASIDQQBIDQAgASEEAkAgASADRg0AIANByIsBaiEFQQAhAwNAIAUgA2pBADoAACADQQFqIgMgAUEAKAKIjQEiBGtJDQALCyAEQciLAWoiAyADLQAAIAByOgAAIAFBx4sBaiIDIAMtAABBgAFyOgAAQciLASABEANBAEGAgICAeDYCiI0BCwJAIAJBBEkNACACQQJ2IgNBA3EhBUEAIQQCQCADQX9qQQNJDQAgA0H8////A3EhAUEAIQNBACEEA0AgA0GACmogA0GAigFqKAIANgIAIANBhApqIANBhIoBaigCADYCACADQYgKaiADQYiKAWooAgA2AgAgA0GMCmogA0GMigFqKAIANgIAIANBEGohAyABIARBBGoiBEcNAAsLIAVFDQAgBUECdCEBIARBAnQhAwNAIANBgApqIANBgIoBaigCADYCACADQQRqIQMgAUF8aiIBDQALCwsGAEGAigEL0QYBA39BAEIANwOAjQFBAEIANwP4jAFBAEIANwPwjAFBAEIANwPojAFBAEIANwPgjAFBAEIANwPYjAFBAEIANwPQjAFBAEIANwPIjAFBAEIANwPAjAFBAEIANwO4jAFBAEIANwOwjAFBAEIANwOojAFBAEIANwOgjAFBAEIANwOYjAFBAEIANwOQjAFBAEIANwOIjAFBAEIANwOAjAFBAEIANwP4iwFBAEIANwPwiwFBAEIANwPoiwFBAEIANwPgiwFBAEIANwPYiwFBAEIANwPQiwFBAEIANwPIiwFBAEIANwPAiwFBAEIANwO4iwFBAEIANwOwiwFBAEIANwOoiwFBAEIANwOgiwFBAEIANwOYiwFBAEIANwOQiwFBAEIANwOIiwFBAEIANwOAiwFBAEIANwP4igFBAEIANwPwigFBAEIANwPoigFBAEIANwPgigFBAEIANwPYigFBAEIANwPQigFBAEIANwPIigFBAEIANwPAigFBAEIANwO4igFBAEIANwOwigFBAEIANwOoigFBAEIANwOgigFBAEIANwOYigFBAEIANwOQigFBAEIANwOIigFBAEIANwOAigFBAEHADCABQQF0a0EDdjYCjI0BQQBBADYCiI0BIAAQAkHkAEEAKAKMjQEiAEEBdmshAwJAQQAoAoiNASIBQQBIDQAgACEEAkAgACABRg0AIAFByIsBaiEFQQAhAQNAIAUgAWpBADoAACABQQFqIgEgAEEAKAKIjQEiBGtJDQALCyAEQciLAWoiASABLQAAIAJyOgAAIABBx4sBaiIBIAEtAABBgAFyOgAAQciLASAAEANBAEGAgICAeDYCiI0BCwJAIANBBEkNACADQQJ2IgFBA3EhBUEAIQQCQCABQX9qQQNJDQAgAUH8////A3EhAEEAIQFBACEEA0AgAUGACmogAUGAigFqKAIANgIAIAFBhApqIAFBhIoBaigCADYCACABQYgKaiABQYiKAWooAgA2AgAgAUGMCmogAUGMigFqKAIANgIAIAFBEGohASAAIARBBGoiBEcNAAsLIAVFDQAgBUECdCEAIARBAnQhAQNAIAFBgApqIAFBgIoBaigCADYCACABQQRqIQEgAEF8aiIADQALCwsL2AEBAEGACAvQAZABAAAAAAAAAAAAAAAAAAABAAAAAAAAAIKAAAAAAAAAioAAAAAAAIAAgACAAAAAgIuAAAAAAAAAAQAAgAAAAACBgACAAAAAgAmAAAAAAACAigAAAAAAAACIAAAAAAAAAAmAAIAAAAAACgAAgAAAAACLgACAAAAAAIsAAAAAAACAiYAAAAAAAIADgAAAAAAAgAKAAAAAAACAgAAAAAAAAIAKgAAAAAAAAAoAAIAAAACAgYAAgAAAAICAgAAAAAAAgAEAAIAAAAAACIAAgAAAAIA=";
5429
- var hash$b = "f2f6f5b2";
5430
- var wasmJson$b = {
5431
- name: name$b,
5432
- data: data$b,
5433
- hash: hash$b
5434
- };
5435
-
5436
- new Mutex();
5437
-
5438
- new Mutex();
5439
- function validateBits(bits) {
5440
- if (![224, 256, 384, 512].includes(bits)) {
5441
- return new Error('Invalid variant! Valid values: 224, 256, 384, 512');
5499
+ let FormatInterface$1 = class FormatInterface extends BasicInterface {
5500
+ hashFormat;
5501
+ #hash;
5502
+ init(buffer) {
5503
+ if (buffer instanceof Uint8Array)
5504
+ this.fromUint8Array(buffer);
5505
+ else if (buffer instanceof ArrayBuffer)
5506
+ this.fromArrayBuffer(buffer);
5507
+ else if (buffer instanceof FormatInterface && buffer?.name === this.name)
5508
+ return buffer;
5509
+ else if (typeof buffer === 'string') {
5510
+ if (this.isHex(buffer))
5511
+ this.fromHex(buffer);
5512
+ else if (this.isBase58(buffer))
5513
+ this.fromBs58(buffer);
5514
+ else if (this.isBase32(buffer))
5515
+ this.fromBs32(buffer);
5516
+ else
5517
+ this.fromString(buffer);
5518
+ }
5519
+ else {
5520
+ this.create(buffer);
5521
+ }
5522
+ return this;
5442
5523
  }
5443
- return null;
5444
- }
5445
- /**
5446
- * Creates a new Keccak hash instance
5447
- * @param bits Number of output bits. Valid values: 224, 256, 384, 512
5448
- */
5449
- function createKeccak(bits = 512) {
5450
- if (validateBits(bits)) {
5451
- return Promise.reject(validateBits(bits));
5524
+ hasCodec() {
5525
+ if (!this.encoded)
5526
+ return false;
5527
+ const codec = new Codec$1(this.encoded);
5528
+ if (codec.name)
5529
+ return true;
5452
5530
  }
5453
- const outputSize = bits / 8;
5454
- return WASMInterface(wasmJson$b, outputSize).then((wasm) => {
5455
- wasm.init(bits);
5456
- const obj = {
5457
- init: () => { wasm.init(bits); return obj; },
5458
- update: (data) => { wasm.update(data); return obj; },
5459
- digest: (outputType) => wasm.digest(outputType, 0x01),
5460
- save: () => wasm.save(),
5461
- load: (data) => { wasm.load(data); return obj; },
5462
- blockSize: 200 - 2 * outputSize,
5463
- digestSize: outputSize,
5464
- };
5465
- return obj;
5466
- });
5467
- }
5468
-
5469
- new Mutex();
5531
+ decode(encoded) {
5532
+ encoded = encoded || this.encoded;
5533
+ const codec = new Codec$1(encoded);
5534
+ if (codec.codecBuffer) {
5535
+ encoded = encoded.slice(codec.codecBuffer.length);
5536
+ this.name = codec.name;
5537
+ this.decoded = this.protoDecode(encoded);
5538
+ // try {
5539
+ // this.decoded = JSON.parse(this.decoded)
5540
+ // } catch {
5541
+ // }
5542
+ }
5543
+ else {
5544
+ throw new Error(`no codec found`);
5545
+ }
5546
+ return this.decoded;
5547
+ }
5548
+ encode(decoded) {
5549
+ let encoded;
5550
+ decoded = decoded || this.decoded;
5551
+ const codec = new Codec$1(this.name);
5552
+ if (decoded instanceof Uint8Array)
5553
+ encoded = decoded;
5554
+ else
5555
+ encoded = this.protoEncode(decoded);
5556
+ if (codec.codecBuffer) {
5557
+ const uint8Array = new Uint8Array(encoded.length + codec.codecBuffer.length);
5558
+ uint8Array.set(codec.codecBuffer);
5559
+ uint8Array.set(encoded, codec.codecBuffer.length);
5560
+ this.encoded = uint8Array;
5561
+ }
5562
+ else {
5563
+ throw new Error(`invalid codec`);
5564
+ }
5565
+ return this.encoded;
5566
+ }
5567
+ /**
5568
+ * @param {Buffer|String|Object} buffer - data - The data needed to create the desired message
5569
+ * @param {Object} proto - {protoObject}
5570
+ * @param {Object} options - {hashFormat, name}
5571
+ */
5572
+ constructor(buffer, proto, options) {
5573
+ super();
5574
+ this.proto = proto;
5575
+ this.hashFormat = options?.hashFormat ? options.hashFormat : 'bs32';
5576
+ if (options?.name)
5577
+ this.name = options.name;
5578
+ this.init(buffer);
5579
+ }
5580
+ get format() {
5581
+ const upper = this.hashFormat.charAt(0).toUpperCase();
5582
+ return `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`;
5583
+ }
5584
+ /**
5585
+ * @return {PeernetHash}
5586
+ */
5587
+ get peernetHash() {
5588
+ const decoded = this.decoded;
5589
+ // @ts-ignore
5590
+ delete decoded.hash;
5591
+ return new CodecHash(decoded, { name: this.name });
5592
+ }
5593
+ /**
5594
+ * @return {peernetHash}
5595
+ */
5596
+ async hash() {
5597
+ if (this.#hash)
5598
+ return this.#hash;
5599
+ const upper = this.hashFormat.charAt(0).toUpperCase();
5600
+ const format = `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`;
5601
+ this.#hash = (await this.peernetHash)[`to${format}`]();
5602
+ return this.#hash;
5603
+ }
5604
+ fromUint8Array(buffer) {
5605
+ this.encoded = buffer;
5606
+ return this.hasCodec() ? this.decode() : this.create(JSON.parse(new TextDecoder().decode(this.encoded)));
5607
+ }
5608
+ fromArrayBuffer(buffer) {
5609
+ this.encoded = new Uint8Array(buffer, buffer.byteOffset, buffer.byteLength);
5610
+ return this.hasCodec() ? this.decode() : this.create(JSON.parse(new TextDecoder().decode(this.encoded)));
5611
+ }
5612
+ /**
5613
+ * @param {Object} data
5614
+ */
5615
+ create(data) {
5616
+ const decoded = {};
5617
+ if (data.hash)
5618
+ this.#hash = data.hash;
5619
+ if (this.keys?.length > 0) {
5620
+ for (const key of this.keys) {
5621
+ decoded[key] = data[key];
5622
+ }
5623
+ this.decoded = decoded;
5624
+ // return this.encode(decoded)
5625
+ }
5626
+ }
5627
+ };
5470
5628
 
5471
- new Mutex();
5629
+ const FormatInterface = FormatInterface$1;
5630
+ const Codec = Codec$1;
5472
5631
 
5473
- var name$9 = "sha512";
5474
- var data$9 = "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";
5475
- var hash$9 = "cdd57f6a";
5476
- var wasmJson$9 = {
5477
- name: name$9,
5478
- data: data$9,
5479
- hash: hash$9
5632
+ const BufferToUint8Array = data => {
5633
+ if (data.type === 'Buffer') {
5634
+ data = new Uint8Array(data.data);
5635
+ }
5636
+ return data
5637
+ };
5638
+
5639
+ const protoFor = (message) => {
5640
+ const codec = new Codec(message);
5641
+ if (!codec.name) throw new Error('proto not found')
5642
+ const Proto = globalThis.peernet.protos[codec.name];
5643
+ if (!Proto) throw (new Error(`No proto defined for ${codec.name}`))
5644
+ return new Proto(message)
5645
+ };
5646
+
5647
+ /**
5648
+ * wether or not a peernet daemon is active
5649
+ * @return {Boolean}
5650
+ */
5651
+ const hasDaemon = async () => {
5652
+ try {
5653
+ let response = await fetch('http://127.0.0.1:1000/api/version');
5654
+ response = await response.json();
5655
+ return Boolean(response.client === '@peernet/api/http')
5656
+ } catch (e) {
5657
+ return false
5658
+ }
5659
+ };
5660
+
5661
+ const https = () => {
5662
+ if (!globalThis.location) return false;
5663
+ return Boolean(globalThis.location.protocol === 'https:')
5664
+ };
5665
+
5666
+ /**
5667
+ * Get current environment
5668
+ * @return {String} current environment [node, electron, browser]
5669
+ */
5670
+ const environment = () => {
5671
+ const _navigator = globalThis.navigator;
5672
+ if (!_navigator) {
5673
+ return 'node'
5674
+ } else if (_navigator && /electron/i.test(_navigator.userAgent)) {
5675
+ return 'electron'
5676
+ } else {
5677
+ return 'browser'
5678
+ }
5679
+ };
5680
+
5681
+ /**
5682
+ * * Get current environment
5683
+ * @return {Object} result
5684
+ * @property {Boolean} reult.daemon whether or not daemon is running
5685
+ * @property {Boolean} reult.environment Current environment
5686
+ */
5687
+ const target = async () => {
5688
+ let daemon = false;
5689
+ if (!https()) daemon = await hasDaemon();
5690
+
5691
+ return {daemon, environment: environment()}
5480
5692
  };
5481
5693
 
5482
- new Mutex();
5483
-
5484
- new Mutex();
5485
- /**
5486
- * Creates a new SHA-2 (SHA-512) hash instance
5487
- */
5488
- function createSHA512() {
5489
- return WASMInterface(wasmJson$9, 64).then((wasm) => {
5490
- wasm.init(512);
5491
- const obj = {
5492
- init: () => { wasm.init(512); return obj; },
5493
- update: (data) => { wasm.update(data); return obj; },
5494
- digest: (outputType) => wasm.digest(outputType),
5495
- save: () => wasm.save(),
5496
- load: (data) => { wasm.load(data); return obj; },
5497
- blockSize: 128,
5498
- digestSize: 64,
5499
- };
5500
- return obj;
5501
- });
5694
+ class PeerDiscovery {
5695
+ constructor(id) {
5696
+ this.id = id;
5697
+ }
5698
+
5699
+ _getPeerId(id) {
5700
+ if (!peernet.peerMap || peernet.peerMap && peernet.peerMap.size === 0) return false
5701
+
5702
+ for (const entry of [...peernet.peerMap.entries()]) {
5703
+ for (const _id of entry[1]) {
5704
+ if (_id === id) return entry[0]
5705
+ }
5706
+ }
5707
+ }
5708
+
5709
+ async discover(peer) {
5710
+ let id = this._getPeerId(peer.id);
5711
+ if (id) return id
5712
+ const data = await new peernet.protos['peernet-peer']({id: this.id});
5713
+ const node = await peernet.prepareMessage(peer.id, data.encoded);
5714
+
5715
+ let response = await peer.request(node.encoded);
5716
+ response = await protoFor(response);
5717
+ response = await new peernet.protos['peernet-peer-response'](response.decoded.data);
5718
+
5719
+ id = response.decoded.id;
5720
+ if (id === this.id) return;
5721
+
5722
+ if (!peernet.peerMap.has(id)) peernet.peerMap.set(id, [peer.id]);
5723
+ else {
5724
+ const connections = peernet.peerMap.get(id);
5725
+ if (connections.indexOf(peer.id) === -1) {
5726
+ connections.push(peer.id);
5727
+ peernet.peerMap.set(peer.id, connections);
5728
+ }
5729
+ }
5730
+ return id
5731
+ }
5732
+
5733
+ async discoverHandler(message, peer) {
5734
+ const {id, proto} = message;
5735
+ // if (typeof message.data === 'string') message.data = Buffer.from(message.data)
5736
+ if (proto.name === 'peernet-peer') {
5737
+ const from = proto.decoded.id;
5738
+ if (from === this.id) return;
5739
+
5740
+ if (!peernet.peerMap.has(from)) peernet.peerMap.set(from, [peer.id]);
5741
+ else {
5742
+ const connections = peernet.peerMap.get(from);
5743
+ if (connections.indexOf(peer.id) === -1) {
5744
+ connections.push(peer.id);
5745
+ peernet.peerMap.set(from, connections);
5746
+ }
5747
+ }
5748
+ const data = await new peernet.protos['peernet-peer-response']({id: this.id});
5749
+ const node = await peernet.prepareMessage(from, data.encoded);
5750
+
5751
+ peer.write(Buffer.from(JSON.stringify({id, data: node.encoded})));
5752
+ } else if (proto.name === 'peernet-peer-response') {
5753
+ const from = proto.decoded.id;
5754
+ if (from === this.id) return;
5755
+
5756
+ if (!peernet.peerMap.has(from)) peernet.peerMap.set(from, [peer.id]);
5757
+ else {
5758
+ const connections = peernet.peerMap.get(from);
5759
+ if (connections.indexOf(peer.id) === -1) {
5760
+ connections.push(peer.id);
5761
+ peernet.peerMap.set(from, connections);
5762
+ }
5763
+ }
5764
+ }
5765
+ }
5502
5766
  }
5503
5767
 
5504
- new Mutex();
5505
-
5506
- new Mutex();
5507
-
5508
- new Mutex();
5509
-
5510
- new Mutex();
5511
-
5512
- var name$4 = "ripemd160";
5513
- var data$4 = "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";
5514
- var hash$4 = "c089a7ca";
5515
- var wasmJson$4 = {
5516
- name: name$4,
5517
- data: data$4,
5518
- hash: hash$4
5519
- };
5520
-
5521
- new Mutex();
5522
5768
  /**
5523
- * Creates a new RIPEMD-160 hash instance
5769
+ * Keep history of fetched address and ptr
5770
+ * @property {Object} address
5771
+ * @property {Object} ptr
5524
5772
  */
5525
- function createRIPEMD160() {
5526
- return WASMInterface(wasmJson$4, 20).then((wasm) => {
5527
- wasm.init();
5528
- const obj = {
5529
- init: () => { wasm.init(); return obj; },
5530
- update: (data) => { wasm.update(data); return obj; },
5531
- digest: (outputType) => wasm.digest(outputType),
5532
- save: () => wasm.save(),
5533
- load: (data) => { wasm.load(data); return obj; },
5534
- blockSize: 64,
5535
- digestSize: 20,
5536
- };
5537
- return obj;
5538
- });
5539
- }
5540
-
5541
- function calculateKeyBuffer(hasher, key) {
5542
- const { blockSize } = hasher;
5543
- const buf = getUInt8Buffer(key);
5544
- if (buf.length > blockSize) {
5545
- hasher.update(buf);
5546
- const uintArr = hasher.digest('binary');
5547
- hasher.init();
5548
- return uintArr;
5773
+ const lastFetched = {
5774
+ address: {
5775
+ value: undefined,
5776
+ timestamp: 0,
5777
+ },
5778
+ ptr: {
5779
+ value: undefined,
5780
+ timestamp: 0,
5781
+ },
5782
+ };
5783
+ const fetchedCoordinates = {};
5784
+ const getAddress = async () => {
5785
+ const { address } = lastFetched;
5786
+ if (address) {
5787
+ address.value = await fetch('https://icanhazip.com/');
5788
+ address.value = await address.value.text();
5789
+ address.timestamp = Math.round(new Date().getTime() / 1000);
5790
+ lastFetched.address = address;
5549
5791
  }
5550
- return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
5551
- }
5552
- function calculateHmac(hasher, key) {
5553
- hasher.init();
5554
- const { blockSize } = hasher;
5555
- const keyBuf = calculateKeyBuffer(hasher, key);
5556
- const keyBuffer = new Uint8Array(blockSize);
5557
- keyBuffer.set(keyBuf);
5558
- const opad = new Uint8Array(blockSize);
5559
- for (let i = 0; i < blockSize; i++) {
5560
- const v = keyBuffer[i];
5561
- opad[i] = v ^ 0x5C;
5562
- keyBuffer[i] = v ^ 0x36;
5792
+ return address.value;
5793
+ };
5794
+ const degreesToRadians = (degrees) => {
5795
+ return degrees * Math.PI / 180;
5796
+ };
5797
+ const distanceInKmBetweenEarthCoordinates = (lat1, lon1, lat2, lon2) => {
5798
+ const earthRadiusKm = 6371;
5799
+ const dLat = degreesToRadians(lat2 - lat1);
5800
+ const dLon = degreesToRadians(lon2 - lon1);
5801
+ lat1 = degreesToRadians(lat1);
5802
+ lat2 = degreesToRadians(lat2);
5803
+ const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
5804
+ Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
5805
+ const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
5806
+ return earthRadiusKm * c;
5807
+ };
5808
+ class DhtEarth {
5809
+ providerMap = new Map;
5810
+ /**
5811
+ *
5812
+ */
5813
+ constructor() {
5814
+ this.providerMap = new Map();
5563
5815
  }
5564
- hasher.update(keyBuffer);
5565
- const obj = {
5566
- init: () => {
5567
- hasher.init();
5568
- hasher.update(keyBuffer);
5569
- return obj;
5570
- },
5571
- update: (data) => {
5572
- hasher.update(data);
5573
- return obj;
5574
- },
5575
- digest: ((outputType) => {
5576
- const uintArr = hasher.digest('binary');
5577
- hasher.init();
5578
- hasher.update(opad);
5579
- hasher.update(uintArr);
5580
- return hasher.digest(outputType);
5581
- }),
5582
- save: () => {
5583
- throw new Error('save() not supported');
5584
- },
5585
- load: () => {
5586
- throw new Error('load() not supported');
5587
- },
5588
- blockSize: hasher.blockSize,
5589
- digestSize: hasher.digestSize,
5590
- };
5591
- return obj;
5592
- }
5593
- /**
5594
- * Calculates HMAC hash
5595
- * @param hash Hash algorithm to use. It has to be the return value of a function like createSHA1()
5596
- * @param key Key (string, Buffer or TypedArray)
5597
- */
5598
- function createHMAC(hash, key) {
5599
- if (!hash || !hash.then) {
5600
- throw new Error('Invalid hash function is provided! Usage: createHMAC(createMD5(), "key").');
5816
+ async getCoordinates(address) {
5817
+ if (!fetchedCoordinates[address]) {
5818
+ const request = `https://whereis.leofcoin.org/?ip=${address}`;
5819
+ let response = await fetch(request);
5820
+ const { lat, lon } = await response.json();
5821
+ fetchedCoordinates[address] = { latitude: lat, longitude: lon };
5822
+ }
5823
+ return fetchedCoordinates[address];
5824
+ }
5825
+ /**
5826
+ * @param {Object} peer
5827
+ * @param {Object} provider
5828
+ * @return {Object} {provider, distance}
5829
+ */
5830
+ async getDistance(peer, provider) {
5831
+ const { latitude, longitude } = await this.getCoordinates(provider.address);
5832
+ return { provider, distance: distanceInKmBetweenEarthCoordinates(peer.latitude, peer.longitude, latitude, longitude) };
5833
+ }
5834
+ async closestPeer(providers) {
5835
+ let all = [];
5836
+ const address = await getAddress();
5837
+ const peerLoc = await this.getCoordinates(address);
5838
+ for (const provider of providers) {
5839
+ if (provider.address === '127.0.0.1' || provider.address === '::1')
5840
+ all.push({ provider, distance: 0 });
5841
+ else
5842
+ all.push(this.getDistance(peerLoc, provider));
5843
+ }
5844
+ // todo queue
5845
+ all = await Promise.all(all);
5846
+ all = all.sort((previous, current) => previous.distance - current.distance);
5847
+ return all[0].provider;
5848
+ }
5849
+ hasProvider(hash) {
5850
+ return this.providerMap.has(hash);
5851
+ }
5852
+ providersFor(hash) {
5853
+ let providers;
5854
+ if (this.providerMap.has(hash))
5855
+ providers = this.providerMap.get(hash);
5856
+ return providers;
5857
+ }
5858
+ addProvider(provider, hash) {
5859
+ let providers = {};
5860
+ if (this.providerMap.has(hash)) {
5861
+ providers = this.providerMap.get(hash);
5862
+ }
5863
+ providers[provider.address] = provider;
5864
+ this.providerMap.set(hash, providers);
5865
+ }
5866
+ removeProvider(address, hash) {
5867
+ if (this.providerMap.has(hash)) {
5868
+ const providers = this.providerMap.get(hash);
5869
+ delete providers[address];
5870
+ this.providerMap.set(hash, providers);
5871
+ }
5601
5872
  }
5602
- return hash.then((hasher) => calculateHmac(hasher, key));
5603
5873
  }
5604
5874
 
5605
- new Mutex();
5875
+ class MessageHandler {
5876
+ constructor(network) {
5877
+ this.network = network;
5878
+ }
5879
+ /**
5880
+ * hash and sign message
5881
+ *
5882
+ * @param {object} message
5883
+ * @param {Buffer} message.from peer id
5884
+ * @param {Buffer} message.to peer id
5885
+ * @param {string} message.data Peernet message
5886
+ * (PeernetMessage excluded) encoded as a string
5887
+ * @return message
5888
+ */
5889
+ async hashAndSignMessage(message) {
5890
+ const hash = await message.peernetHash;
5891
+ message.decoded.signature = globalThis.identity.sign(hash.buffer);
5892
+ return message
5893
+ }
5894
+
5895
+ /**
5896
+ * @param {String} from - peer id
5897
+ * @param {String} to - peer id
5898
+ * @param {String|PeernetMessage} data - data encoded message string
5899
+ * or the messageNode itself
5900
+ */
5901
+ async prepareMessage(message) {
5902
+ if (message.keys.includes('signature')) {
5903
+ message = await this.hashAndSignMessage(message);
5904
+ }
5905
+
5906
+ return message
5907
+ }
5908
+ }
5606
5909
 
5607
- new Mutex();
5910
+ const dataHandler = async message => {
5911
+ if (!message) return
5912
+
5913
+ const {data, id, from, peer} = message;
5914
+ const proto = await protoFor(data);
5915
+ peernet._protoHandler({id, proto}, peernet.connections[from] || peer, from);
5916
+ };
5608
5917
 
5609
- const blockchainCodecs = [
5610
- {
5611
- name: 'leofcoin-block',
5612
- codec: '0x6c62',
5613
- hashAlg: 'dbl-keccak-512',
5614
- },
5615
- {
5616
- name: 'leofcoin-tx',
5617
- codec: '0x6c74',
5618
- hashAlg: 'dbl-keccak-512',
5619
- },
5620
- {
5621
- name: 'leofcoin-itx',
5622
- codec: '0x6c69',
5623
- hashAlg: 'keccak-512',
5624
- },
5625
- {
5626
- name: 'leofcoin-pr',
5627
- codec: '0x6c70',
5628
- hashAlg: 'keccak-256',
5629
- },
5630
- {
5631
- name: 'contract-message',
5632
- codec: '0x63636d',
5633
- hashAlg: 'keccak-256'
5634
- },
5635
- {
5636
- name: 'transaction-message',
5637
- codec: '0x746d',
5638
- hashAlg: 'keccak-256'
5639
- },
5640
- {
5641
- name: 'raw-transaction-message',
5642
- codec: '0x772746d',
5643
- hashAlg: 'keccak-256'
5644
- },
5645
- {
5646
- name: 'block-message',
5647
- codec: '0x626d',
5648
- hashAlg: 'keccak-256'
5649
- },
5650
- {
5651
- name: 'bw-message',
5652
- codec: '0x62776d',
5653
- hashAlg: 'keccak-256'
5654
- },
5655
- {
5656
- name: 'bw-request-message',
5657
- codec: '0x6277726d',
5658
- hashAlg: 'keccak-256'
5659
- },
5660
- {
5661
- name: 'validator-message',
5662
- codec: '0x766d',
5663
- hashAlg: 'keccak-256'
5664
- }
5665
- ];
5918
+ const dhtError = (proto) => {
5919
+ const text = `Received proto ${proto.name} expected peernet-dht-response`;
5920
+ return new Error(`Routing error: ${text}`)
5921
+ };
5922
+
5923
+ const nothingFoundError = (hash) => {
5924
+ return new Error(`nothing found for ${hash}`)
5925
+ };
5666
5926
 
5667
- const internalCodecs = [
5668
- {
5669
- name: 'disco-hash',
5670
- codec: '0x30',
5671
- hashAlg: 'dbl-keccak-256',
5672
- },
5673
- {
5674
- name: 'peernet-peer-response',
5675
- codec: '0x707072',
5676
- hashAlg: 'keccak-256',
5677
- },
5678
- {
5679
- name: 'peernet-peer',
5680
- codec: '0x7070',
5681
- hashAlg: 'keccak-256',
5682
- },
5683
- {
5684
- name: 'peernet-dht',
5685
- codec: '0x706468',
5686
- hashAlg: 'keccak-256',
5687
- },
5688
- {
5689
- name: 'peernet-dht-response',
5690
- codec: '0x706472',
5691
- hashAlg: 'keccak-256',
5692
- },
5693
- {
5694
- name: 'peernet-data',
5695
- codec: '0x706461',
5696
- hashAlg: 'keccak-256',
5697
- },
5698
- {
5699
- name: 'peernet-data-response',
5700
- codec: '0x70646172',
5701
- hashAlg: 'keccak-256',
5702
- },
5703
- {
5704
- name: 'peernet-message',
5705
- codec: '0x706d65',
5706
- hashAlg: 'keccak-256',
5707
- },
5708
- {
5709
- name: 'peernet-ps',
5710
- codec: '707073',
5711
- hashAlg: 'keccak-256',
5712
- },
5713
- {
5714
- name: 'peernet-response',
5715
- codec: '0x7072',
5716
- hashAlg: 'keccak-256',
5717
- },
5718
- {
5719
- name: 'peernet-request',
5720
- codec: '0x707271',
5721
- hashAlg: 'keccak-256',
5722
- },
5723
- {
5724
- name: 'peernet-file',
5725
- codec: '0x7066',
5726
- hashAlg: 'keccak-256',
5727
- },
5728
- {
5729
- name: 'peernet-file-response',
5730
- codec: '0x706672',
5731
- hashAlg: 'keccak-256',
5927
+ const isBrowser = globalThis.navigator ? true : false;
5928
+ let LeofcoinStorage$1 = class LeofcoinStorage {
5929
+ name;
5930
+ root;
5931
+ db;
5932
+ constructor(name = 'storage', root = '.leofcoin') {
5933
+ this.name = name;
5934
+ this.root = root;
5732
5935
  }
5733
- ];
5734
-
5735
- var social = [{
5736
- name: 'chat-message',
5737
- codec: '0x70636d',
5738
- hashAlg: 'dbl-keccak-256',
5739
- }];
5740
-
5741
- const codecs = [
5742
- ...internalCodecs,
5743
- ...blockchainCodecs,
5744
- ...social
5745
- ];
5746
-
5747
- globalThis.peernetCodecs = globalThis.peernetCodecs || {};
5748
- const addCodec = (codecInput) => {
5749
- let { hashAlg, codec, name } = codecInput;
5750
- if (!globalThis.peernetCodecs[name])
5751
- globalThis.peernetCodecs[name] = {
5752
- hashAlg,
5753
- codec: typeof codec === 'string' ? parseInt(codec, 16) : codec
5754
- };
5755
- };
5756
- const getCodec = (name) => {
5757
- if (typeof name === 'number')
5758
- return name;
5759
- return getCodecByName(name).codec;
5760
- };
5761
- const getCodecName = (codec) => {
5762
- return Object.keys(globalThis.peernetCodecs).reduce((p, c) => {
5763
- const item = globalThis.peernetCodecs[c];
5764
- if (item.codec === codec)
5765
- return c;
5766
- else
5767
- return p;
5768
- }, undefined);
5769
- };
5770
- const getCodecByName = (name) => globalThis.peernetCodecs[name];
5771
- const getHashAlg = (name) => {
5772
- if (typeof name === 'number')
5773
- return getCodecByName(getCodecName(name)).hashAlg;
5774
- return getCodecByName(name).hashAlg;
5775
- };
5776
- const isCodec = (codec) => {
5777
- if (codec.codec !== undefined && codec.hashAlg)
5778
- return true;
5779
- return false;
5780
- };
5781
- const validateCodec = (codec) => {
5782
- if (codec.codec === undefined ||
5783
- codec.hashAlg === undefined ||
5784
- codec.name === undefined)
5785
- throw new Error(`invalid codecInput: ${codec}`);
5786
- };
5787
- for (const codec of codecs) {
5788
- addCodec(codec);
5789
- }
5790
- var utils$p = {
5791
- isCodec,
5792
- addCodec,
5793
- getCodec,
5794
- getHashAlg,
5795
- getCodecName,
5796
- validateCodec,
5797
- codecs: globalThis.peernetCodecs
5798
- };
5799
-
5800
- let Codec$1 = class Codec extends BasicInterface {
5801
- codecBuffer;
5802
- codec;
5803
- hashAlg;
5804
- constructor(buffer) {
5805
- super();
5806
- if (buffer) {
5807
- if (buffer instanceof Uint8Array) {
5808
- const codec = index$8.decode(buffer);
5809
- const name = this.getCodecName(codec);
5810
- if (name) {
5811
- this.name = name;
5812
- this.encoded = buffer;
5813
- this.decode(buffer);
5814
- }
5815
- else {
5816
- this.encode(Number(new TextDecoder().decode(buffer)));
5817
- }
5818
- }
5819
- else if (buffer instanceof ArrayBuffer) {
5820
- const codec = index$8.decode(new Uint8Array(buffer));
5821
- const name = this.getCodecName(codec);
5822
- if (name) {
5823
- this.name = name;
5824
- this.decode(buffer);
5825
- }
5826
- else {
5827
- this.encode(Number(new TextDecoder().decode(new Uint8Array(buffer))));
5828
- }
5829
- }
5830
- else if (typeof buffer === 'string') {
5831
- if (utils$p.getCodec(buffer))
5832
- this.fromName(buffer);
5833
- else if (this.isHex(buffer))
5834
- this.fromHex(buffer);
5835
- else if (this.isBase32(buffer))
5836
- this.fromBs32(buffer);
5837
- else if (this.isBase58(buffer))
5838
- this.fromBs58(buffer);
5839
- else
5840
- this.fromString(buffer);
5841
- }
5842
- if (!isNaN(buffer))
5843
- if (utils$p.getCodec(buffer))
5844
- this.fromCodec(buffer);
5936
+ async init() {
5937
+ const importee = await import(isBrowser ? './browser-store.js' : './store.js');
5938
+ this.db = new importee.default();
5939
+ if (!isBrowser) {
5940
+ // @ts-ignore
5941
+ await this.db.init(this.name, this.root);
5845
5942
  }
5846
5943
  }
5847
- fromEncoded(encoded) {
5848
- const codec = index$8.decode(encoded);
5849
- const name = this.getCodecName(codec);
5850
- this.name = name;
5851
- this.encoded = encoded;
5852
- return this.decode(encoded);
5853
- }
5854
- getCodec(name) {
5855
- return utils$p.getCodec(name);
5944
+ async get(key) {
5945
+ if (typeof key === 'object')
5946
+ return this.many('get', key);
5947
+ return this.db.get(new KeyPath(key));
5856
5948
  }
5857
- getCodecName(codec) {
5858
- return utils$p.getCodecName(codec);
5949
+ /**
5950
+ *
5951
+ * @param {*} key
5952
+ * @param {*} value
5953
+ * @returns Promise
5954
+ */
5955
+ put(key, value) {
5956
+ if (typeof key === 'object')
5957
+ return this.many('put', key);
5958
+ return this.db.put(new KeyPath(key), new KeyValue(value));
5859
5959
  }
5860
- getHashAlg(name) {
5861
- return utils$p.getHashAlg(name);
5960
+ async has(key) {
5961
+ if (typeof key === 'object')
5962
+ return this.many('has', key);
5963
+ try {
5964
+ const has = await this.db.get(new KeyPath(key));
5965
+ return Boolean(has);
5966
+ }
5967
+ catch (e) {
5968
+ return false;
5969
+ }
5862
5970
  }
5863
- fromCodec(codec) {
5864
- this.name = this.getCodecName(codec);
5865
- this.hashAlg = this.getHashAlg(this.name);
5866
- this.codec = this.getCodec(this.name);
5867
- this.codecBuffer = index$8.encode(this.codec);
5971
+ async delete(key) {
5972
+ return this.db.delete(new KeyPath(key));
5868
5973
  }
5869
- fromName(name) {
5870
- const codec = this.getCodec(name);
5871
- this.name = name;
5872
- this.codec = codec;
5873
- this.hashAlg = this.getHashAlg(name);
5874
- this.codecBuffer = index$8.encode(this.codec);
5974
+ keys(limit = -1) {
5975
+ return this.db.keys(limit);
5875
5976
  }
5876
- decode(encoded) {
5877
- encoded = encoded || this.encoded;
5878
- const codec = index$8.decode(encoded);
5879
- this.fromCodec(codec);
5880
- return this.decoded;
5977
+ async values(limit = -1) {
5978
+ return this.db.values(limit);
5881
5979
  }
5882
- encode(codec) {
5883
- codec = codec || this.codec;
5884
- this.encoded = index$8.encode(codec);
5885
- return this.encoded;
5980
+ async many(type, _value) {
5981
+ const jobs = [];
5982
+ for (const key of Object.keys(_value)) {
5983
+ jobs.push(this[type](key, _value[key]));
5984
+ }
5985
+ return Promise.all(jobs);
5886
5986
  }
5887
- };
5888
-
5889
- class CodecHash extends BasicInterface {
5890
- codec;
5891
- codecs;
5892
- digest;
5893
- size;
5894
- constructor(buffer, options) {
5895
- super();
5896
- if (options.name)
5897
- this.name = options.name;
5898
- else
5899
- this.name = 'disco-hash';
5900
- if (options.codecs)
5901
- this.codecs = options.codecs;
5902
- // @ts-ignore
5903
- return this.init(buffer);
5987
+ async length() {
5988
+ const keys = await this.keys();
5989
+ return keys.length;
5904
5990
  }
5905
- async init(uint8Array) {
5906
- if (uint8Array) {
5907
- if (uint8Array instanceof Uint8Array) {
5908
- this.codec = new Codec$1(uint8Array);
5909
- const name = this.codec.name;
5910
- if (name) {
5911
- this.name = name;
5912
- this.decode(uint8Array);
5913
- }
5914
- else {
5915
- await this.encode(uint8Array);
5916
- }
5917
- }
5918
- if (typeof uint8Array === 'string') {
5919
- if (this.isHex(uint8Array))
5920
- await this.fromHex(uint8Array);
5921
- if (this.isBase32(uint8Array))
5922
- await this.fromBs32(uint8Array);
5923
- else if (this.isBase58(uint8Array))
5924
- await this.fromBs58(uint8Array);
5925
- else
5926
- throw new Error(`unsupported string ${uint8Array}`);
5927
- }
5928
- else if (typeof uint8Array === 'object')
5929
- await this.fromJSON(uint8Array);
5991
+ async size() {
5992
+ let size = 0;
5993
+ const query = await this.db.iterate();
5994
+ for await (const item of query) {
5995
+ // @ts-ignore
5996
+ size += item.value ? item.value.length : item[1].length;
5930
5997
  }
5931
- return this;
5932
- }
5933
- get prefix() {
5934
- const length = this.length;
5935
- const uint8Array = new Uint8Array(length.length + this.codec.codecBuffer.length);
5936
- uint8Array.set(length);
5937
- uint8Array.set(this.codec.codecBuffer, length.length);
5938
- return uint8Array;
5998
+ return size;
5939
5999
  }
5940
- get length() {
5941
- return index$8.encode(this.size);
6000
+ async clear() {
6001
+ return this.db.clear();
5942
6002
  }
5943
- get buffer() {
5944
- return this.encoded;
6003
+ async iterate() {
6004
+ return this.db.iterate();
5945
6005
  }
5946
- get hash() {
5947
- return this.encoded;
5948
- }
5949
- fromJSON(json) {
5950
- return this.encode(new TextEncoder().encode(JSON.stringify(json)));
5951
- }
5952
- async encode(buffer, name) {
5953
- if (!this.name && name)
5954
- this.name = name;
5955
- if (!buffer)
5956
- buffer = this.buffer;
5957
- this.codec = new Codec$1(this.name);
5958
- this.codec.fromName(this.name);
5959
- let hashAlg = this.codec.hashAlg;
5960
- const hashVariant = Number(hashAlg.split('-')[hashAlg.split('-').length - 1]);
5961
- if (hashAlg.includes('dbl')) {
5962
- hashAlg = hashAlg.replace('dbl-', '');
5963
- const hasher = await createKeccak(hashVariant);
5964
- await hasher.init();
5965
- hasher.update(buffer);
5966
- buffer = hasher.digest('binary');
5967
- }
5968
- const hasher = await createKeccak(hashVariant);
5969
- await hasher.init();
5970
- hasher.update(buffer);
5971
- this.digest = hasher.digest('binary');
5972
- this.size = this.digest.length;
5973
- const uint8Array = new Uint8Array(this.digest.length + this.prefix.length);
5974
- uint8Array.set(this.prefix);
5975
- uint8Array.set(this.digest, this.prefix.length);
5976
- this.encoded = uint8Array;
5977
- return this.encoded;
5978
- }
5979
- async validate(buffer) {
5980
- if (Buffer.isBuffer(buffer)) {
5981
- const codec = index$8.decode(buffer);
5982
- if (this.codecs[codec]) {
5983
- this.decode(buffer);
5984
- }
5985
- else {
5986
- await this.encode(buffer);
5987
- }
5988
- }
5989
- if (typeof buffer === 'string') {
5990
- if (this.isHex(buffer))
5991
- this.fromHex(buffer);
5992
- if (this.isBase32(buffer))
5993
- this.fromBs32(buffer);
5994
- }
5995
- if (typeof buffer === 'object')
5996
- this.fromJSON(buffer);
5997
- }
5998
- decode(encoded) {
5999
- this.encoded = encoded;
6000
- const codec = index$8.decode(encoded);
6001
- this.codec = new Codec$1(codec);
6002
- // TODO: validate codec
6003
- encoded = encoded.slice(index$8.decode.bytes);
6004
- this.size = index$8.decode(encoded);
6005
- this.digest = encoded.slice(index$8.decode.bytes);
6006
- if (this.digest.length !== this.size) {
6007
- throw new Error(`hash length inconsistent: ${this.encoded.toString()}`);
6008
- }
6009
- // const codec = new Codec(codec, this.codecs)
6010
- this.name = this.codec.name;
6011
- this.size = this.digest.length;
6012
- return {
6013
- codec: this.codec,
6014
- name: this.name,
6015
- size: this.size,
6016
- length: this.length,
6017
- digest: this.digest,
6018
- };
6019
- }
6020
- }
6021
-
6022
- let FormatInterface$1 = class FormatInterface extends BasicInterface {
6023
- hashFormat;
6024
- init(buffer) {
6025
- if (buffer instanceof Uint8Array)
6026
- this.fromUint8Array(buffer);
6027
- else if (buffer instanceof ArrayBuffer)
6028
- this.fromArrayBuffer(buffer);
6029
- else if (buffer instanceof FormatInterface && buffer?.name === this.name)
6030
- return buffer;
6031
- else if (typeof buffer === 'string') {
6032
- if (this.isHex(buffer))
6033
- this.fromHex(buffer);
6034
- else if (this.isBase58(buffer))
6035
- this.fromBs58(buffer);
6036
- else if (this.isBase32(buffer))
6037
- this.fromBs32(buffer);
6038
- else
6039
- this.fromString(buffer);
6040
- }
6041
- else {
6042
- this.create(buffer);
6043
- }
6044
- return this;
6045
- }
6046
- hasCodec() {
6047
- if (!this.encoded)
6048
- return false;
6049
- const codec = new Codec$1(this.encoded);
6050
- if (codec.name)
6051
- return true;
6052
- }
6053
- decode(encoded) {
6054
- encoded = encoded || this.encoded;
6055
- const codec = new Codec$1(this.encoded);
6056
- if (codec.codecBuffer) {
6057
- encoded = encoded.slice(codec.codecBuffer.length);
6058
- this.name = codec.name;
6059
- this.decoded = this.protoDecode(encoded);
6060
- // try {
6061
- // this.decoded = JSON.parse(this.decoded)
6062
- // } catch {
6063
- // }
6064
- }
6065
- else {
6066
- throw new Error(`no codec found`);
6067
- }
6068
- return this.decoded;
6069
- }
6070
- encode(decoded) {
6071
- let encoded;
6072
- if (!decoded)
6073
- decoded = this.decoded;
6074
- const codec = new Codec$1(this.name);
6075
- if (decoded instanceof Uint8Array)
6076
- encoded = decoded;
6077
- else
6078
- encoded = this.protoEncode(decoded);
6079
- if (codec.codecBuffer) {
6080
- const uint8Array = new Uint8Array(encoded.length + codec.codecBuffer.length);
6081
- uint8Array.set(codec.codecBuffer);
6082
- uint8Array.set(encoded, codec.codecBuffer.length);
6083
- this.encoded = uint8Array;
6084
- }
6085
- else {
6086
- throw new Error(`invalid codec`);
6087
- }
6088
- return this.encoded;
6089
- }
6090
- /**
6091
- * @param {Buffer|String|Object} buffer - data - The data needed to create the desired message
6092
- * @param {Object} proto - {protoObject}
6093
- * @param {Object} options - {hashFormat, name}
6094
- */
6095
- constructor(buffer, proto, options) {
6096
- super();
6097
- this.proto = proto;
6098
- this.hashFormat = options?.hashFormat ? options.hashFormat : 'bs32';
6099
- if (options?.name)
6100
- this.name = options.name;
6101
- this.init(buffer);
6102
- }
6103
- /**
6104
- * @return {PeernetHash}
6105
- */
6106
- get peernetHash() {
6107
- return new CodecHash(this.decoded, { name: this.name });
6108
- }
6109
- /**
6110
- * @return {peernetHash}
6111
- */
6112
- async hash() {
6113
- const upper = this.hashFormat.charAt(0).toUpperCase();
6114
- const format = `${upper}${this.hashFormat.substring(1, this.hashFormat.length)}`;
6115
- return (await this.peernetHash)[`to${format}`]();
6116
- }
6117
- fromUint8Array(buffer) {
6118
- this.encoded = buffer;
6119
- return this.hasCodec() ? this.decode() : this.create(JSON.parse(new TextDecoder().decode(this.encoded)));
6120
- }
6121
- fromArrayBuffer(buffer) {
6122
- this.encoded = new Uint8Array(buffer, buffer.byteOffset, buffer.byteLength);
6123
- return this.hasCodec() ? this.decode() : this.create(JSON.parse(new TextDecoder().decode(this.encoded)));
6124
- }
6125
- /**
6126
- * @param {Object} data
6127
- */
6128
- create(data) {
6129
- const decoded = {};
6130
- if (this.keys?.length > 0) {
6131
- for (const key of this.keys) {
6132
- decoded[key] = data[key];
6133
- }
6134
- this.decoded = decoded;
6135
- return this.encode(decoded);
6136
- }
6137
- }
6138
- };
6139
-
6140
- const FormatInterface = FormatInterface$1;
6141
- const Codec = Codec$1;
6142
-
6143
- const BufferToUint8Array = data => {
6144
- if (data.type === 'Buffer') {
6145
- data = new Uint8Array(data.data);
6146
- }
6147
- return data
6148
- };
6149
-
6150
- const protoFor = (message) => {
6151
- const codec = new Codec(message);
6152
- if (!codec.name) throw new Error('proto not found')
6153
- const Proto = globalThis.peernet.protos[codec.name];
6154
- if (!Proto) throw (new Error(`No proto defined for ${codec.name}`))
6155
- return new Proto(message)
6156
6006
  };
6157
6007
 
6158
- /**
6159
- * wether or not a peernet daemon is active
6160
- * @return {Boolean}
6161
- */
6162
- const hasDaemon = async () => {
6163
- try {
6164
- let response = await fetch('http://127.0.0.1:1000/api/version');
6165
- response = await response.json();
6166
- return Boolean(response.client === '@peernet/api/http')
6167
- } catch (e) {
6168
- return false
6169
- }
6170
- };
6008
+ const randombytes = strength => crypto.getRandomValues(new Uint8Array(strength));
6171
6009
 
6172
- const https = () => {
6173
- if (!globalThis.location) return false;
6174
- return Boolean(globalThis.location.protocol === 'https:')
6175
- };
6010
+ const {subtle} = crypto;
6176
6011
 
6177
6012
  /**
6178
- * Get current environment
6179
- * @return {String} current environment [node, electron, browser]
6013
+ * ```js
6014
+ * const {createHash} = await import('@leofcoin/crypto')
6015
+ * createHash(data, algorithm)
6016
+ * ```
6017
+ * @param {Uint8Array} data
6018
+ * @param {string} algorithm
6019
+ * @returns Uint8Array
6180
6020
  */
6181
- const environment = () => {
6182
- const _navigator = globalThis.navigator;
6183
- if (!_navigator) {
6184
- return 'node'
6185
- } else if (_navigator && /electron/i.test(_navigator.userAgent)) {
6186
- return 'electron'
6187
- } else {
6188
- return 'browser'
6189
- }
6190
- };
6021
+ const createHash = (data, algorithm = 'SHA-512') => subtle.digest(algorithm, data);
6191
6022
 
6192
6023
  /**
6193
- * * Get current environment
6194
- * @return {Object} result
6195
- * @property {Boolean} reult.daemon whether or not daemon is running
6196
- * @property {Boolean} reult.environment Current environment
6024
+ * Hashes the created hash again
6025
+ * ```js
6026
+ * const {createDoubleHash} = await import('@leofcoin/crypto')
6027
+ * createDoubleHash(data, algorithm)
6028
+ * ```
6029
+ * @param {Uint8Array} data
6030
+ * @param {string} algorithm
6031
+ * @returns Uint8Array
6197
6032
  */
6198
- const target = async () => {
6199
- let daemon = false;
6200
- if (!https()) daemon = await hasDaemon();
6033
+ const createDoubleHash = async (data, algorithm = 'SHA-512') =>
6034
+ subtle.digest(algorithm, await subtle.digest(algorithm, data));
6201
6035
 
6202
- return {daemon, environment: environment()}
6036
+ const generatePbkdf2 = async (password) => {
6037
+ return subtle.importKey(
6038
+ 'raw',
6039
+ password,
6040
+ 'PBKDF2',
6041
+ false,
6042
+ ['deriveBits']
6043
+ )
6203
6044
  };
6204
6045
 
6205
- class PeerDiscovery {
6206
- constructor(id) {
6207
- this.id = id;
6208
- }
6046
+ const pbkdf2 = async (password, salt, iterations = 4096, length = 64, hash = 'SHA-512') => {
6047
+ const key = await generatePbkdf2(password);
6048
+ return subtle.deriveBits({
6049
+ name: 'PBKDF2',
6050
+ hash,
6051
+ salt,
6052
+ iterations,
6053
+ }, key, length)
6054
+ };
6209
6055
 
6210
- _getPeerId(id) {
6211
- if (!peernet.peerMap || peernet.peerMap && peernet.peerMap.size === 0) return false
6056
+ var typedArrayConcat = (input, options = {length: undefined, seperator: undefined}) => {
6057
+ if (!options) options = {};
6058
+
6059
+ if (typeof options.seperator === 'string')
6060
+ options.seperator = new TextEncoder().encode(options.seperator);
6061
+
6062
+ const length = options.length || input.reduce((total, current, i) => {
6063
+ total += current.length;
6064
+ if (options.seperator && input.length - 1 > i) total+= options.seperator.length;
6065
+ return total
6066
+ }, 0);
6067
+
6068
+ const typedArray = new Uint8Array(length);
6069
+
6070
+ let currentIndex = 0;
6071
+ let index = 0;
6072
+ for (const source of input) {
6073
+ typedArray.set(source, currentIndex);
6074
+ if (options.seperator && input.length - 1 > index) {
6075
+ typedArray.set(options.seperator, currentIndex + source.length);
6076
+ currentIndex+= options.seperator.length;
6077
+ }
6078
+ currentIndex += source.length;
6079
+ index += 1;
6080
+ }
6081
+
6082
+ return typedArray
6083
+ };
6212
6084
 
6213
- for (const entry of [...peernet.peerMap.entries()]) {
6214
- for (const _id of entry[1]) {
6215
- if (_id === id) return entry[0]
6216
- }
6217
- }
6218
- }
6219
-
6220
- async discover(peer) {
6221
- let id = this._getPeerId(peer.id);
6222
- if (id) return id
6223
- const data = await new peernet.protos['peernet-peer']({id: this.id});
6224
- const node = await peernet.prepareMessage(peer.id, data.encoded);
6225
-
6226
- let response = await peer.request(node.encoded);
6227
- response = await protoFor(response);
6228
- response = await new peernet.protos['peernet-peer-response'](response.decoded.data);
6229
-
6230
- id = response.decoded.id;
6231
- if (id === this.id) return;
6232
-
6233
- if (!peernet.peerMap.has(id)) peernet.peerMap.set(id, [peer.id]);
6234
- else {
6235
- const connections = peernet.peerMap.get(id);
6236
- if (connections.indexOf(peer.id) === -1) {
6237
- connections.push(peer.id);
6238
- peernet.peerMap.set(peer.id, connections);
6239
- }
6240
- }
6241
- return id
6242
- }
6243
-
6244
- async discoverHandler(message, peer) {
6245
- const {id, proto} = message;
6246
- // if (typeof message.data === 'string') message.data = Buffer.from(message.data)
6247
- if (proto.name === 'peernet-peer') {
6248
- const from = proto.decoded.id;
6249
- if (from === this.id) return;
6250
-
6251
- if (!peernet.peerMap.has(from)) peernet.peerMap.set(from, [peer.id]);
6252
- else {
6253
- const connections = peernet.peerMap.get(from);
6254
- if (connections.indexOf(peer.id) === -1) {
6255
- connections.push(peer.id);
6256
- peernet.peerMap.set(from, connections);
6257
- }
6258
- }
6259
- const data = await new peernet.protos['peernet-peer-response']({id: this.id});
6260
- const node = await peernet.prepareMessage(from, data.encoded);
6261
-
6262
- peer.write(Buffer.from(JSON.stringify({id, data: node.encoded})));
6263
- } else if (proto.name === 'peernet-peer-response') {
6264
- const from = proto.decoded.id;
6265
- if (from === this.id) return;
6266
-
6267
- if (!peernet.peerMap.has(from)) peernet.peerMap.set(from, [peer.id]);
6268
- else {
6269
- const connections = peernet.peerMap.get(from);
6270
- if (connections.indexOf(peer.id) === -1) {
6271
- connections.push(peer.id);
6272
- peernet.peerMap.set(from, connections);
6273
- }
6274
- }
6275
- }
6276
- }
6277
- }
6085
+ const concatAndDoubleHash = async (input) => {
6086
+ return new Uint8Array(await createDoubleHash(typedArrayConcat(input), 'SHA-256'));
6087
+ };
6088
+
6089
+ const encode$2 = async (source, prefix = new TextEncoder().encode('00'), hex) => {
6090
+ if (!(source instanceof Uint8Array) || !(prefix instanceof Uint8Array)) {
6091
+ throw new TypeError('Expected Uint8Array');
6092
+ }
6093
+ const hash = await concatAndDoubleHash([
6094
+ prefix,
6095
+ source
6096
+ ]);
6097
+ const uint8Array = typedArrayConcat([
6098
+ prefix,
6099
+ source,
6100
+ hash.subarray(0, 4)
6101
+ ]);
6102
+ if (hex)
6103
+ return base58$1.encodeHex(uint8Array);
6104
+ return base58$1.encode(uint8Array);
6105
+ };
6106
+ const decode$3 = async (string, hex) => {
6107
+ let uint8Array = hex ? base58$1.decodeHex(string) : base58$1.decode(string);
6108
+ const prefix = uint8Array.subarray(0, 2);
6109
+ const source = uint8Array.subarray(2, -4);
6110
+ const hash = await concatAndDoubleHash([
6111
+ prefix,
6112
+ source
6113
+ ]);
6114
+ let index = 0;
6115
+ const slice = uint8Array.subarray(-4);
6116
+ for (const check of slice) {
6117
+ if (check !== hash[index]) {
6118
+ throw new Error('Invalid checksum');
6119
+ }
6120
+ index++;
6121
+ }
6122
+ return { prefix, data: source };
6123
+ };
6124
+ const isBase58check = (string, hex) => {
6125
+ try {
6126
+ hex ? decode$3(string, true) : decode$3(string);
6127
+ return true;
6128
+ }
6129
+ catch (e) {
6130
+ return false;
6131
+ }
6132
+ };
6133
+ const encodeHex = (uint8Array, prefix = new TextEncoder().encode('00')) => encode$2(uint8Array, prefix, true);
6134
+ const decodeHex = (string) => decode$3(string, true);
6135
+ const isBase58checkHex = (string) => isBase58check(string, true);
6136
+ var base58check = { encode: encode$2, decode: decode$3, encodeHex, decodeHex, isBase58check, isBase58checkHex };
6278
6137
 
6279
- /**
6280
- * Keep history of fetched address and ptr
6281
- * @property {Object} address
6282
- * @property {Object} ptr
6283
- */
6284
- const lastFetched = {
6285
- address: {
6286
- value: undefined,
6287
- timestamp: 0,
6288
- },
6289
- ptr: {
6290
- value: undefined,
6291
- timestamp: 0,
6292
- },
6293
- };
6294
- const fetchedCoordinates = {};
6295
- const getAddress = async () => {
6296
- const { address } = lastFetched;
6297
- if (address) {
6298
- address.value = await fetch('https://icanhazip.com/');
6299
- address.value = await address.value.text();
6300
- address.timestamp = Math.round(new Date().getTime() / 1000);
6301
- lastFetched.address = address;
6302
- }
6303
- return address.value;
6304
- };
6305
- const degreesToRadians = (degrees) => {
6306
- return degrees * Math.PI / 180;
6138
+ const decode$2 = (multiWif, expectedVersion, expectedCodec) => {
6139
+ const decoded = base58$1.decode(multiWif);
6140
+ let [version, codec, privateKey] = index$6(decoded);
6141
+ version = Number(new TextDecoder().decode(version));
6142
+ codec = Number(new TextDecoder().decode(codec));
6143
+ if (expectedVersion && version !== expectedVersion)
6144
+ throw new Error(`invalid version: expected ${expectedVersion} but got ${version}`);
6145
+ if (expectedCodec && codec !== expectedCodec)
6146
+ throw new Error(`invalid codec: expected ${expectedCodec} but got ${codec}`);
6147
+ return { version, codec, privateKey };
6148
+ };
6149
+ var index$1 = {
6150
+ encode: (version, codec, privateKey) => {
6151
+ return base58$1.encode(index$7([
6152
+ new TextEncoder().encode(version.toString()),
6153
+ new TextEncoder().encode(codec.toString()),
6154
+ privateKey
6155
+ ]));
6156
+ },
6157
+ decode: decode$2,
6158
+ isMultiWif: (multiWif) => {
6159
+ try {
6160
+ const { version, codec, privateKey } = decode$2(multiWif);
6161
+ if (version === undefined)
6162
+ return false;
6163
+ if (codec === undefined)
6164
+ return false;
6165
+ if (privateKey === undefined)
6166
+ return false;
6167
+ if (privateKey && privateKey.length !== 32)
6168
+ return false;
6169
+ }
6170
+ catch {
6171
+ return false;
6172
+ }
6173
+ return true;
6174
+ }
6307
6175
  };
6308
- const distanceInKmBetweenEarthCoordinates = (lat1, lon1, lat2, lon2) => {
6309
- const earthRadiusKm = 6371;
6310
- const dLat = degreesToRadians(lat2 - lat1);
6311
- const dLon = degreesToRadians(lon2 - lon1);
6312
- lat1 = degreesToRadians(lat1);
6313
- lat2 = degreesToRadians(lat2);
6314
- const a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
6315
- Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
6316
- const c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
6317
- return earthRadiusKm * c;
6176
+
6177
+ const errors = {
6178
+ IMPOSSIBLE_CASE: 'Impossible case. Please create issue.',
6179
+ TWEAK_ADD:
6180
+ 'The tweak was out of range or the resulted private key is invalid',
6181
+ TWEAK_MUL: 'The tweak was out of range or equal to zero',
6182
+ CONTEXT_RANDOMIZE_UNKNOW: 'Unknow error on context randomization',
6183
+ SECKEY_INVALID: 'Private Key is invalid',
6184
+ PUBKEY_PARSE: 'Public Key could not be parsed',
6185
+ PUBKEY_SERIALIZE: 'Public Key serialization error',
6186
+ PUBKEY_COMBINE: 'The sum of the public keys is not valid',
6187
+ SIG_PARSE: 'Signature could not be parsed',
6188
+ SIGN: 'The nonce generation function failed, or the private key was invalid',
6189
+ RECOVER: 'Public key could not be recover',
6190
+ ECDH: 'Scalar was invalid (zero or overflow)'
6318
6191
  };
6319
- class DhtEarth {
6320
- providerMap = new Map;
6321
- /**
6322
- *
6323
- */
6324
- constructor() {
6325
- this.providerMap = new Map();
6326
- }
6327
- async getCoordinates(address) {
6328
- if (!fetchedCoordinates[address]) {
6329
- const request = `https://whereis.leofcoin.org/?ip=${address}`;
6330
- let response = await fetch(request);
6331
- const { lat, lon } = await response.json();
6332
- fetchedCoordinates[address] = { latitude: lat, longitude: lon };
6333
- }
6334
- return fetchedCoordinates[address];
6335
- }
6336
- /**
6337
- * @param {Object} peer
6338
- * @param {Object} provider
6339
- * @return {Object} {provider, distance}
6340
- */
6341
- async getDistance(peer, provider) {
6342
- const { latitude, longitude } = await this.getCoordinates(provider.address);
6343
- return { provider, distance: distanceInKmBetweenEarthCoordinates(peer.latitude, peer.longitude, latitude, longitude) };
6344
- }
6345
- async closestPeer(providers) {
6346
- let all = [];
6347
- const address = await getAddress();
6348
- const peerLoc = await this.getCoordinates(address);
6349
- for (const provider of providers) {
6350
- if (provider.address === '127.0.0.1' || provider.address === '::1')
6351
- all.push({ provider, distance: 0 });
6352
- else
6353
- all.push(this.getDistance(peerLoc, provider));
6354
- }
6355
- // todo queue
6356
- all = await Promise.all(all);
6357
- all = all.sort((previous, current) => previous.distance - current.distance);
6358
- return all[0].provider;
6359
- }
6360
- hasProvider(hash) {
6361
- return this.providerMap.has(hash);
6362
- }
6363
- providersFor(hash) {
6364
- let providers;
6365
- if (this.providerMap.has(hash))
6366
- providers = this.providerMap.get(hash);
6367
- return providers;
6368
- }
6369
- addProvider(provider, hash) {
6370
- let providers = {};
6371
- if (this.providerMap.has(hash)) {
6372
- providers = this.providerMap.get(hash);
6373
- }
6374
- providers[provider.address] = provider;
6375
- this.providerMap.set(hash, providers);
6376
- }
6377
- removeProvider(address, hash) {
6378
- if (this.providerMap.has(hash)) {
6379
- const providers = this.providerMap.get(hash);
6380
- delete providers[address];
6381
- this.providerMap.set(hash, providers);
6382
- }
6383
- }
6192
+
6193
+ function assert$g (cond, msg) {
6194
+ if (!cond) throw new Error(msg)
6384
6195
  }
6385
6196
 
6386
- class MessageHandler {
6387
- constructor(network) {
6388
- this.network = network;
6389
- }
6390
- /**
6391
- * hash and sign message
6392
- *
6393
- * @param {object} message
6394
- * @param {Buffer} message.from peer id
6395
- * @param {Buffer} message.to peer id
6396
- * @param {string} message.data Peernet message
6397
- * (PeernetMessage excluded) encoded as a string
6398
- * @return message
6399
- */
6400
- async hashAndSignMessage(message) {
6401
- const hash = await message.peernetHash;
6402
- message.decoded.signature = globalThis.identity.sign(hash.buffer);
6403
- return message
6404
- }
6197
+ function isUint8Array (name, value, length) {
6198
+ assert$g(value instanceof Uint8Array, `Expected ${name} to be an Uint8Array`);
6405
6199
 
6406
- /**
6407
- * @param {String} from - peer id
6408
- * @param {String} to - peer id
6409
- * @param {String|PeernetMessage} data - data encoded message string
6410
- * or the messageNode itself
6411
- */
6412
- async prepareMessage(message) {
6413
- if (message.keys.includes('signature')) {
6414
- message = await this.hashAndSignMessage(message);
6200
+ if (length !== undefined) {
6201
+ if (Array.isArray(length)) {
6202
+ const numbers = length.join(', ');
6203
+ const msg = `Expected ${name} to be an Uint8Array with length [${numbers}]`;
6204
+ assert$g(length.includes(value.length), msg);
6205
+ } else {
6206
+ const msg = `Expected ${name} to be an Uint8Array with length ${length}`;
6207
+ assert$g(value.length === length, msg);
6415
6208
  }
6416
-
6417
- return message
6418
6209
  }
6419
6210
  }
6420
6211
 
6421
- const dataHandler = async message => {
6422
- if (!message) return
6423
-
6424
- const {data, id, from, peer} = message;
6425
- const proto = await protoFor(data);
6426
- peernet._protoHandler({id, proto}, peernet.connections[from] || peer, from);
6427
- };
6212
+ function isCompressed (value) {
6213
+ assert$g(toTypeString(value) === 'Boolean', 'Expected compressed to be a Boolean');
6214
+ }
6428
6215
 
6429
- const dhtError = (proto) => {
6430
- const text = `Received proto ${proto.name} expected peernet-dht-response`;
6431
- return new Error(`Routing error: ${text}`)
6432
- };
6216
+ function getAssertedOutput (output = (len) => new Uint8Array(len), length) {
6217
+ if (typeof output === 'function') output = output(length);
6218
+ isUint8Array('output', output, length);
6219
+ return output
6220
+ }
6433
6221
 
6434
- const nothingFoundError = (hash) => {
6435
- return new Error(`nothing found for ${hash}`)
6436
- };
6222
+ function toTypeString (value) {
6223
+ return Object.prototype.toString.call(value).slice(8, -1)
6224
+ }
6437
6225
 
6438
- let LeofcoinStorage$1 = class LeofcoinStorage {
6439
- name;
6440
- root;
6441
- db;
6442
- constructor(name = 'storage', root = '.leofcoin') {
6443
- this.name = name;
6444
- this.root = root;
6445
- }
6446
- async init() {
6447
- const importee = await import(globalThis.navigator ? './browser-store.js' : './store.js');
6448
- const Store = importee.default;
6449
- this.db = new Store(this.name, this.root);
6450
- }
6451
- async get(key) {
6452
- if (typeof key === 'object')
6453
- return this.many('get', key);
6454
- return this.db.get(new KeyPath(key));
6455
- }
6456
- /**
6457
- *
6458
- * @param {*} key
6459
- * @param {*} value
6460
- * @returns Promise
6461
- */
6462
- put(key, value) {
6463
- if (typeof key === 'object')
6464
- return this.many('put', key);
6465
- return this.db.put(new KeyPath(key), new KeyValue(value));
6466
- }
6467
- async has(key) {
6468
- if (typeof key === 'object')
6469
- return this.many('has', key);
6470
- try {
6471
- const has = await this.db.get(new KeyPath(key));
6472
- return Boolean(has);
6473
- }
6474
- catch (e) {
6475
- return false;
6476
- }
6477
- }
6478
- async delete(key) {
6479
- return this.db.delete(new KeyPath(key));
6480
- }
6481
- keys(limit = -1) {
6482
- return this.db.keys(limit);
6483
- }
6484
- async values(limit = -1) {
6485
- return this.db.values(limit);
6486
- }
6487
- async many(type, _value) {
6488
- const jobs = [];
6489
- for (const key of Object.keys(_value)) {
6490
- jobs.push(this[type](key, _value[key]));
6491
- }
6492
- return Promise.all(jobs);
6493
- }
6494
- async length() {
6495
- const keys = await this.keys();
6496
- return keys.length;
6497
- }
6498
- async size() {
6499
- let size = 0;
6500
- const query = await this.db.iterate();
6501
- for await (const item of query) {
6502
- // @ts-ignore
6503
- size += item.value ? item.value.length : item[1].length;
6504
- }
6505
- return size;
6506
- }
6507
- async clear() {
6508
- return this.db.clear();
6509
- }
6510
- async iterate() {
6511
- return this.db.iterate();
6512
- }
6513
- };
6226
+ var lib = (secp256k1) => {
6227
+ return {
6228
+ contextRandomize (seed) {
6229
+ assert$g(
6230
+ seed === null || seed instanceof Uint8Array,
6231
+ 'Expected seed to be an Uint8Array or null'
6232
+ );
6233
+ if (seed !== null) isUint8Array('seed', seed, 32);
6514
6234
 
6515
- const randombytes = strength => crypto.getRandomValues(new Uint8Array(strength));
6235
+ switch (secp256k1.contextRandomize(seed)) {
6236
+ case 1:
6237
+ throw new Error(errors.CONTEXT_RANDOMIZE_UNKNOW)
6238
+ }
6239
+ },
6516
6240
 
6517
- const {subtle} = crypto;
6241
+ privateKeyVerify (seckey) {
6242
+ isUint8Array('private key', seckey, 32);
6518
6243
 
6519
- /**
6520
- * ```js
6521
- * const {createHash} = await import('@leofcoin/crypto')
6522
- * createHash(data, algorithm)
6523
- * ```
6524
- * @param {Uint8Array} data
6525
- * @param {string} algorithm
6526
- * @returns Uint8Array
6527
- */
6528
- const createHash = (data, algorithm = 'SHA-512') => subtle.digest(algorithm, data);
6244
+ return secp256k1.privateKeyVerify(seckey) === 0
6245
+ },
6529
6246
 
6530
- /**
6531
- * Hashes the created hash again
6532
- * ```js
6533
- * const {createDoubleHash} = await import('@leofcoin/crypto')
6534
- * createDoubleHash(data, algorithm)
6535
- * ```
6536
- * @param {Uint8Array} data
6537
- * @param {string} algorithm
6538
- * @returns Uint8Array
6539
- */
6540
- const createDoubleHash = async (data, algorithm = 'SHA-512') =>
6541
- subtle.digest(algorithm, await subtle.digest(algorithm, data));
6247
+ privateKeyNegate (seckey) {
6248
+ isUint8Array('private key', seckey, 32);
6542
6249
 
6543
- const generatePbkdf2 = async (password) => {
6544
- return subtle.importKey(
6545
- 'raw',
6546
- password,
6547
- 'PBKDF2',
6548
- false,
6549
- ['deriveBits']
6550
- )
6551
- };
6250
+ switch (secp256k1.privateKeyNegate(seckey)) {
6251
+ case 0:
6252
+ return seckey
6253
+ case 1:
6254
+ throw new Error(errors.IMPOSSIBLE_CASE)
6255
+ }
6256
+ },
6552
6257
 
6553
- const pbkdf2 = async (password, salt, iterations = 4096, length = 64, hash = 'SHA-512') => {
6554
- const key = await generatePbkdf2(password);
6555
- return subtle.deriveBits({
6556
- name: 'PBKDF2',
6557
- hash,
6558
- salt,
6559
- iterations,
6560
- }, key, length)
6561
- };
6258
+ privateKeyTweakAdd (seckey, tweak) {
6259
+ isUint8Array('private key', seckey, 32);
6260
+ isUint8Array('tweak', tweak, 32);
6562
6261
 
6563
- var typedArrayConcat = (input, options = {length: undefined, seperator: undefined}) => {
6564
- if (!options) options = {};
6565
-
6566
- if (typeof options.seperator === 'string')
6567
- options.seperator = new TextEncoder().encode(options.seperator);
6568
-
6569
- const length = options.length || input.reduce((total, current, i) => {
6570
- total += current.length;
6571
- if (options.seperator && input.length - 1 > i) total+= options.seperator.length;
6572
- return total
6573
- }, 0);
6574
-
6575
- const typedArray = new Uint8Array(length);
6576
-
6577
- let currentIndex = 0;
6578
- let index = 0;
6579
- for (const source of input) {
6580
- typedArray.set(source, currentIndex);
6581
- if (options.seperator && input.length - 1 > index) {
6582
- typedArray.set(options.seperator, currentIndex + source.length);
6583
- currentIndex+= options.seperator.length;
6584
- }
6585
- currentIndex += source.length;
6586
- index += 1;
6587
- }
6588
-
6589
- return typedArray
6590
- };
6262
+ switch (secp256k1.privateKeyTweakAdd(seckey, tweak)) {
6263
+ case 0:
6264
+ return seckey
6265
+ case 1:
6266
+ throw new Error(errors.TWEAK_ADD)
6267
+ }
6268
+ },
6591
6269
 
6592
- const concatAndDoubleHash = async (input) => {
6593
- return new Uint8Array(await createDoubleHash(typedArrayConcat(input), 'SHA-256'));
6594
- };
6595
-
6596
- const encode$2 = async (source, prefix = new TextEncoder().encode('00'), hex) => {
6597
- if (!(source instanceof Uint8Array) || !(prefix instanceof Uint8Array)) {
6598
- throw new TypeError('Expected Uint8Array');
6599
- }
6600
- const hash = await concatAndDoubleHash([
6601
- prefix,
6602
- source
6603
- ]);
6604
- const uint8Array = typedArrayConcat([
6605
- prefix,
6606
- source,
6607
- hash.subarray(0, 4)
6608
- ]);
6609
- if (hex)
6610
- return base58$1.encodeHex(uint8Array);
6611
- return base58$1.encode(uint8Array);
6612
- };
6613
- const decode$3 = async (string, hex) => {
6614
- let uint8Array = hex ? base58$1.decodeHex(string) : base58$1.decode(string);
6615
- const prefix = uint8Array.subarray(0, 2);
6616
- const source = uint8Array.subarray(2, -4);
6617
- const hash = await concatAndDoubleHash([
6618
- prefix,
6619
- source
6620
- ]);
6621
- let index = 0;
6622
- const slice = uint8Array.subarray(-4);
6623
- for (const check of slice) {
6624
- if (check !== hash[index]) {
6625
- throw new Error('Invalid checksum');
6626
- }
6627
- index++;
6628
- }
6629
- return { prefix, data: source };
6630
- };
6631
- const isBase58check = (string, hex) => {
6632
- try {
6633
- hex ? decode$3(string, true) : decode$3(string);
6634
- return true;
6635
- }
6636
- catch (e) {
6637
- return false;
6638
- }
6639
- };
6640
- const encodeHex = (uint8Array, prefix = new TextEncoder().encode('00')) => encode$2(uint8Array, prefix, true);
6641
- const decodeHex = (string) => decode$3(string, true);
6642
- const isBase58checkHex = (string) => isBase58check(string, true);
6643
- var base58check = { encode: encode$2, decode: decode$3, encodeHex, decodeHex, isBase58check, isBase58checkHex };
6644
-
6645
- const decode$2 = (multiWif, expectedVersion, expectedCodec) => {
6646
- const decoded = base58$1.decode(multiWif);
6647
- let [version, codec, privateKey] = index$6(decoded);
6648
- version = Number(new TextDecoder().decode(version));
6649
- codec = Number(new TextDecoder().decode(codec));
6650
- if (expectedVersion && version !== expectedVersion)
6651
- throw new Error(`invalid version: expected ${expectedVersion} but got ${version}`);
6652
- if (expectedCodec && codec !== expectedCodec)
6653
- throw new Error(`invalid codec: expected ${expectedCodec} but got ${codec}`);
6654
- return { version, codec, privateKey };
6655
- };
6656
- var index$1 = {
6657
- encode: (version, codec, privateKey) => {
6658
- return base58$1.encode(index$7([
6659
- new TextEncoder().encode(version.toString()),
6660
- new TextEncoder().encode(codec.toString()),
6661
- privateKey
6662
- ]));
6663
- },
6664
- decode: decode$2,
6665
- isMultiWif: (multiWif) => {
6666
- try {
6667
- const { version, codec, privateKey } = decode$2(multiWif);
6668
- if (version === undefined)
6669
- return false;
6670
- if (codec === undefined)
6671
- return false;
6672
- if (privateKey === undefined)
6673
- return false;
6674
- if (privateKey && privateKey.length !== 32)
6675
- return false;
6676
- }
6677
- catch {
6678
- return false;
6679
- }
6680
- return true;
6681
- }
6682
- };
6683
-
6684
- const errors = {
6685
- IMPOSSIBLE_CASE: 'Impossible case. Please create issue.',
6686
- TWEAK_ADD:
6687
- 'The tweak was out of range or the resulted private key is invalid',
6688
- TWEAK_MUL: 'The tweak was out of range or equal to zero',
6689
- CONTEXT_RANDOMIZE_UNKNOW: 'Unknow error on context randomization',
6690
- SECKEY_INVALID: 'Private Key is invalid',
6691
- PUBKEY_PARSE: 'Public Key could not be parsed',
6692
- PUBKEY_SERIALIZE: 'Public Key serialization error',
6693
- PUBKEY_COMBINE: 'The sum of the public keys is not valid',
6694
- SIG_PARSE: 'Signature could not be parsed',
6695
- SIGN: 'The nonce generation function failed, or the private key was invalid',
6696
- RECOVER: 'Public key could not be recover',
6697
- ECDH: 'Scalar was invalid (zero or overflow)'
6698
- };
6699
-
6700
- function assert$g (cond, msg) {
6701
- if (!cond) throw new Error(msg)
6702
- }
6703
-
6704
- function isUint8Array (name, value, length) {
6705
- assert$g(value instanceof Uint8Array, `Expected ${name} to be an Uint8Array`);
6706
-
6707
- if (length !== undefined) {
6708
- if (Array.isArray(length)) {
6709
- const numbers = length.join(', ');
6710
- const msg = `Expected ${name} to be an Uint8Array with length [${numbers}]`;
6711
- assert$g(length.includes(value.length), msg);
6712
- } else {
6713
- const msg = `Expected ${name} to be an Uint8Array with length ${length}`;
6714
- assert$g(value.length === length, msg);
6715
- }
6716
- }
6717
- }
6718
-
6719
- function isCompressed (value) {
6720
- assert$g(toTypeString(value) === 'Boolean', 'Expected compressed to be a Boolean');
6721
- }
6722
-
6723
- function getAssertedOutput (output = (len) => new Uint8Array(len), length) {
6724
- if (typeof output === 'function') output = output(length);
6725
- isUint8Array('output', output, length);
6726
- return output
6727
- }
6728
-
6729
- function toTypeString (value) {
6730
- return Object.prototype.toString.call(value).slice(8, -1)
6731
- }
6732
-
6733
- var lib = (secp256k1) => {
6734
- return {
6735
- contextRandomize (seed) {
6736
- assert$g(
6737
- seed === null || seed instanceof Uint8Array,
6738
- 'Expected seed to be an Uint8Array or null'
6739
- );
6740
- if (seed !== null) isUint8Array('seed', seed, 32);
6741
-
6742
- switch (secp256k1.contextRandomize(seed)) {
6743
- case 1:
6744
- throw new Error(errors.CONTEXT_RANDOMIZE_UNKNOW)
6745
- }
6746
- },
6747
-
6748
- privateKeyVerify (seckey) {
6749
- isUint8Array('private key', seckey, 32);
6750
-
6751
- return secp256k1.privateKeyVerify(seckey) === 0
6752
- },
6753
-
6754
- privateKeyNegate (seckey) {
6755
- isUint8Array('private key', seckey, 32);
6756
-
6757
- switch (secp256k1.privateKeyNegate(seckey)) {
6758
- case 0:
6759
- return seckey
6760
- case 1:
6761
- throw new Error(errors.IMPOSSIBLE_CASE)
6762
- }
6763
- },
6764
-
6765
- privateKeyTweakAdd (seckey, tweak) {
6766
- isUint8Array('private key', seckey, 32);
6767
- isUint8Array('tweak', tweak, 32);
6768
-
6769
- switch (secp256k1.privateKeyTweakAdd(seckey, tweak)) {
6770
- case 0:
6771
- return seckey
6772
- case 1:
6773
- throw new Error(errors.TWEAK_ADD)
6774
- }
6775
- },
6776
-
6777
- privateKeyTweakMul (seckey, tweak) {
6778
- isUint8Array('private key', seckey, 32);
6779
- isUint8Array('tweak', tweak, 32);
6270
+ privateKeyTweakMul (seckey, tweak) {
6271
+ isUint8Array('private key', seckey, 32);
6272
+ isUint8Array('tweak', tweak, 32);
6780
6273
 
6781
6274
  switch (secp256k1.privateKeyTweakMul(seckey, tweak)) {
6782
6275
  case 0:
@@ -16195,240 +15688,795 @@ var elliptic$1 = {
16195
15688
  if (sig[4] & 0x80) return 1
16196
15689
  if (lenR > 1 && (sig[4] === 0x00) && !(sig[5] & 0x80)) return 1
16197
15690
 
16198
- if (sig[lenR + 6] & 0x80) return 1
16199
- if (lenS > 1 && (sig[lenR + 6] === 0x00) && !(sig[lenR + 7] & 0x80)) return 1
15691
+ if (sig[lenR + 6] & 0x80) return 1
15692
+ if (lenS > 1 && (sig[lenR + 6] === 0x00) && !(sig[lenR + 7] & 0x80)) return 1
15693
+
15694
+ let sigR = sig.subarray(4, 4 + lenR);
15695
+ if (sigR.length === 33 && sigR[0] === 0x00) sigR = sigR.subarray(1);
15696
+ if (sigR.length > 32) return 1
15697
+
15698
+ let sigS = sig.subarray(6 + lenR);
15699
+ if (sigS.length === 33 && sigS[0] === 0x00) sigS = sigS.slice(1);
15700
+ if (sigS.length > 32) throw new Error('S length is too long')
15701
+
15702
+ let r = new BN(sigR);
15703
+ if (r.cmp(ecparams.n) >= 0) r = new BN(0);
15704
+
15705
+ let s = new BN(sig.subarray(6 + lenR));
15706
+ if (s.cmp(ecparams.n) >= 0) s = new BN(0);
15707
+
15708
+ output.set(r.toArrayLike(Uint8Array, 'be', 32), 0);
15709
+ output.set(s.toArrayLike(Uint8Array, 'be', 32), 32);
15710
+
15711
+ return 0
15712
+ },
15713
+
15714
+ ecdsaSign (obj, message, seckey, data, noncefn) {
15715
+ if (noncefn) {
15716
+ const _noncefn = noncefn;
15717
+ noncefn = (counter) => {
15718
+ const nonce = _noncefn(message, seckey, null, data, counter);
15719
+
15720
+ const isValid = nonce instanceof Uint8Array && nonce.length === 32;
15721
+ if (!isValid) throw new Error('This is the way')
15722
+
15723
+ return new BN(nonce)
15724
+ };
15725
+ }
15726
+
15727
+ const d = new BN(seckey);
15728
+ if (d.cmp(ecparams.n) >= 0 || d.isZero()) return 1
15729
+
15730
+ let sig;
15731
+ try {
15732
+ sig = ec.sign(message, seckey, { canonical: true, k: noncefn, pers: data });
15733
+ } catch (err) {
15734
+ return 1
15735
+ }
15736
+
15737
+ obj.signature.set(sig.r.toArrayLike(Uint8Array, 'be', 32), 0);
15738
+ obj.signature.set(sig.s.toArrayLike(Uint8Array, 'be', 32), 32);
15739
+ obj.recid = sig.recoveryParam;
15740
+
15741
+ return 0
15742
+ },
15743
+
15744
+ ecdsaVerify (sig, msg32, pubkey) {
15745
+ const sigObj = { r: sig.subarray(0, 32), s: sig.subarray(32, 64) };
15746
+
15747
+ const sigr = new BN(sigObj.r);
15748
+ const sigs = new BN(sigObj.s);
15749
+ if (sigr.cmp(ecparams.n) >= 0 || sigs.cmp(ecparams.n) >= 0) return 1
15750
+ if (sigs.cmp(ec.nh) === 1 || sigr.isZero() || sigs.isZero()) return 3
15751
+
15752
+ const pair = loadPublicKey(pubkey);
15753
+ if (pair === null) return 2
15754
+
15755
+ const point = pair.getPublic();
15756
+ const isValid = ec.verify(msg32, sigObj, point);
15757
+ return isValid ? 0 : 3
15758
+ },
15759
+
15760
+ ecdsaRecover (output, sig, recid, msg32) {
15761
+ const sigObj = { r: sig.slice(0, 32), s: sig.slice(32, 64) };
15762
+
15763
+ const sigr = new BN(sigObj.r);
15764
+ const sigs = new BN(sigObj.s);
15765
+ if (sigr.cmp(ecparams.n) >= 0 || sigs.cmp(ecparams.n) >= 0) return 1
15766
+
15767
+ if (sigr.isZero() || sigs.isZero()) return 2
15768
+
15769
+ // Can throw `throw new Error('Unable to find sencond key candinate');`
15770
+ let point;
15771
+ try {
15772
+ point = ec.recoverPubKey(msg32, sigObj, recid);
15773
+ } catch (err) {
15774
+ return 2
15775
+ }
15776
+
15777
+ savePublicKey(output, point);
15778
+
15779
+ return 0
15780
+ },
15781
+
15782
+ ecdh (output, pubkey, seckey, data, hashfn, xbuf, ybuf) {
15783
+ const pair = loadPublicKey(pubkey);
15784
+ if (pair === null) return 1
15785
+
15786
+ const scalar = new BN(seckey);
15787
+ if (scalar.cmp(ecparams.n) >= 0 || scalar.isZero()) return 2
15788
+
15789
+ const point = pair.getPublic().mul(scalar);
15790
+
15791
+ if (hashfn === undefined) {
15792
+ const data = point.encode(null, true);
15793
+ const sha256 = ec.hash().update(data).digest();
15794
+ for (let i = 0; i < 32; ++i) output[i] = sha256[i];
15795
+ } else {
15796
+ if (!xbuf) xbuf = new Uint8Array(32);
15797
+ const x = point.getX().toArray('be', 32);
15798
+ for (let i = 0; i < 32; ++i) xbuf[i] = x[i];
15799
+
15800
+ if (!ybuf) ybuf = new Uint8Array(32);
15801
+ const y = point.getY().toArray('be', 32);
15802
+ for (let i = 0; i < 32; ++i) ybuf[i] = y[i];
15803
+
15804
+ const hash = hashfn(xbuf, ybuf, data);
15805
+
15806
+ const isValid = hash instanceof Uint8Array && hash.length === output.length;
15807
+ if (!isValid) return 2
15808
+
15809
+ output.set(hash);
15810
+ }
15811
+
15812
+ return 0
15813
+ }
15814
+ };
15815
+
15816
+ var elliptic = lib(elliptic$1);
15817
+
15818
+ var secp256k1 = /*@__PURE__*/getDefaultExportFromCjs(elliptic);
15819
+
15820
+ const leofcoinOlivia = {
15821
+ messagePrefix: '\u0019Leofcoin Signed Message:',
15822
+ version: 1,
15823
+ pubKeyHash: 0x73,
15824
+ scriptHash: 0x76,
15825
+ multiTxHash: 0x8b4125,
15826
+ payments: {
15827
+ version: 0,
15828
+ unspent: 0x1fa443d7 // ounsp
15829
+ },
15830
+ wif: 0x7D,
15831
+ multiCodec: 0x7c4,
15832
+ bip32: { public: 0x13BBF2D5, private: 0x13BBCBC5 }
15833
+ };
15834
+ const bitcoinTestnet = {
15835
+ messagePrefix: '\x18Bitcoin Signed Message:\n',
15836
+ version: 1,
15837
+ bech32: 'tb',
15838
+ pubKeyHash: 0x6f,
15839
+ scriptHash: 0xc4,
15840
+ wif: 0xef,
15841
+ bip32: {
15842
+ public: 0x043587cf,
15843
+ private: 0x04358394
15844
+ },
15845
+ multiCodec: 0
15846
+ };
15847
+ var testnets = {
15848
+ 'leofcoin:olivia': leofcoinOlivia,
15849
+ 'bitcoin:testnet': bitcoinTestnet
15850
+ };
15851
+
15852
+ // https://en.bitcoin.it/wiki/List_of_address_prefixes
15853
+ // usage:
15854
+ // networks['bitcoin']['testnet']
15855
+ // networks.bitcoin.testnet
15856
+ /**
15857
+ * Main network
15858
+ * @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
15859
+ */
15860
+ const leofcoin = {
15861
+ messagePrefix: '\u0019Leofcoin Signed Message:',
15862
+ version: 1,
15863
+ pubKeyHash: 0x30,
15864
+ scriptHash: 0x37,
15865
+ multiTxHash: 0x3adeed,
15866
+ payments: {
15867
+ version: 0,
15868
+ unspent: 0x0d6e0327 // Lunsp
15869
+ },
15870
+ coin_type: 640,
15871
+ wif: 0x3F,
15872
+ multiCodec: 0x3c4,
15873
+ bip32: { public: 0x13BBF2D4, private: 0x13BBCBC4 },
15874
+ testnet: testnets['leofcoin:olivia']
15875
+ };
15876
+ const bitcoin = {
15877
+ messagePrefix: '\x18Bitcoin Signed Message:\n',
15878
+ version: 1,
15879
+ bech32: 'bc',
15880
+ pubKeyHash: 0x00,
15881
+ multiCodec: 0x00,
15882
+ scriptHash: 0x05,
15883
+ wif: 0x80,
15884
+ coin_type: 0,
15885
+ bip32: {
15886
+ public: 0x0488b21e, private: 0x0488ade4
15887
+ },
15888
+ testnet: testnets['bitcoin:testnet']
15889
+ };
15890
+ const litecoin = {
15891
+ messagePrefix: '\x19Litecoin Signed Message:\n',
15892
+ version: 1,
15893
+ pubKeyHash: 0x30,
15894
+ scriptHash: 0x32,
15895
+ wif: 0xb0,
15896
+ bip32: {
15897
+ public: 0x019da462,
15898
+ private: 0x019d9cfe
15899
+ },
15900
+ bech32: '',
15901
+ multiCodec: 0
15902
+ };
15903
+ const ethereum = {
15904
+ messagePrefix: '\x19Ethereum Signed Message:\n',
15905
+ version: 1,
15906
+ pubKeyHash: 0x30,
15907
+ scriptHash: 0x32,
15908
+ bip32: {
15909
+ private: 0x0488ADE4, public: 0x0488B21E
15910
+ },
15911
+ coin_type: 60,
15912
+ wif: 0x45,
15913
+ multiCodec: 0x3c5
15914
+ };
15915
+ /**
15916
+ * Our & supported networks
15917
+ * @return {leofcoin, olivia}
15918
+ */
15919
+ var networks$1 = {
15920
+ leofcoin,
15921
+ bitcoin,
15922
+ litecoin,
15923
+ ethereum
15924
+ };
15925
+
15926
+ /*!
15927
+ * hash-wasm (https://www.npmjs.com/package/hash-wasm)
15928
+ * (c) Dani Biro
15929
+ * @license MIT
15930
+ */
15931
+
15932
+ /******************************************************************************
15933
+ Copyright (c) Microsoft Corporation.
15934
+
15935
+ Permission to use, copy, modify, and/or distribute this software for any
15936
+ purpose with or without fee is hereby granted.
15937
+
15938
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
15939
+ REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
15940
+ AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
15941
+ INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
15942
+ LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
15943
+ OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
15944
+ PERFORMANCE OF THIS SOFTWARE.
15945
+ ***************************************************************************** */
15946
+ /* global Reflect, Promise, SuppressedError, Symbol */
15947
+
15948
+
15949
+ function __awaiter(thisArg, _arguments, P, generator) {
15950
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15951
+ return new (P || (P = Promise))(function (resolve, reject) {
15952
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
15953
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
15954
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
15955
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
15956
+ });
15957
+ }
15958
+
15959
+ typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
15960
+ var e = new Error(message);
15961
+ return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
15962
+ };
15963
+
15964
+ class Mutex {
15965
+ constructor() {
15966
+ this.mutex = Promise.resolve();
15967
+ }
15968
+ lock() {
15969
+ let begin = () => { };
15970
+ this.mutex = this.mutex.then(() => new Promise(begin));
15971
+ return new Promise((res) => {
15972
+ begin = res;
15973
+ });
15974
+ }
15975
+ dispatch(fn) {
15976
+ return __awaiter(this, void 0, void 0, function* () {
15977
+ const unlock = yield this.lock();
15978
+ try {
15979
+ return yield Promise.resolve(fn());
15980
+ }
15981
+ finally {
15982
+ unlock();
15983
+ }
15984
+ });
15985
+ }
15986
+ }
15987
+
15988
+ /* eslint-disable import/prefer-default-export */
15989
+ /* eslint-disable no-bitwise */
15990
+ var _a;
15991
+ function getGlobal() {
15992
+ if (typeof globalThis !== 'undefined')
15993
+ return globalThis;
15994
+ // eslint-disable-next-line no-restricted-globals
15995
+ if (typeof self !== 'undefined')
15996
+ return self;
15997
+ if (typeof window !== 'undefined')
15998
+ return window;
15999
+ return global;
16000
+ }
16001
+ const globalObject = getGlobal();
16002
+ const nodeBuffer = (_a = globalObject.Buffer) !== null && _a !== void 0 ? _a : null;
16003
+ const textEncoder = globalObject.TextEncoder ? new globalObject.TextEncoder() : null;
16004
+ function hexCharCodesToInt(a, b) {
16005
+ return (((a & 0xF) + ((a >> 6) | ((a >> 3) & 0x8))) << 4) | ((b & 0xF) + ((b >> 6) | ((b >> 3) & 0x8)));
16006
+ }
16007
+ function writeHexToUInt8(buf, str) {
16008
+ const size = str.length >> 1;
16009
+ for (let i = 0; i < size; i++) {
16010
+ const index = i << 1;
16011
+ buf[i] = hexCharCodesToInt(str.charCodeAt(index), str.charCodeAt(index + 1));
16012
+ }
16013
+ }
16014
+ function hexStringEqualsUInt8(str, buf) {
16015
+ if (str.length !== buf.length * 2) {
16016
+ return false;
16017
+ }
16018
+ for (let i = 0; i < buf.length; i++) {
16019
+ const strIndex = i << 1;
16020
+ if (buf[i] !== hexCharCodesToInt(str.charCodeAt(strIndex), str.charCodeAt(strIndex + 1))) {
16021
+ return false;
16022
+ }
16023
+ }
16024
+ return true;
16025
+ }
16026
+ const alpha = 'a'.charCodeAt(0) - 10;
16027
+ const digit = '0'.charCodeAt(0);
16028
+ function getDigestHex(tmpBuffer, input, hashLength) {
16029
+ let p = 0;
16030
+ /* eslint-disable no-plusplus */
16031
+ for (let i = 0; i < hashLength; i++) {
16032
+ let nibble = input[i] >>> 4;
16033
+ tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
16034
+ nibble = input[i] & 0xF;
16035
+ tmpBuffer[p++] = nibble > 9 ? nibble + alpha : nibble + digit;
16036
+ }
16037
+ /* eslint-enable no-plusplus */
16038
+ return String.fromCharCode.apply(null, tmpBuffer);
16039
+ }
16040
+ const getUInt8Buffer = nodeBuffer !== null
16041
+ ? (data) => {
16042
+ if (typeof data === 'string') {
16043
+ const buf = nodeBuffer.from(data, 'utf8');
16044
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
16045
+ }
16046
+ if (nodeBuffer.isBuffer(data)) {
16047
+ return new Uint8Array(data.buffer, data.byteOffset, data.length);
16048
+ }
16049
+ if (ArrayBuffer.isView(data)) {
16050
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
16051
+ }
16052
+ throw new Error('Invalid data type!');
16053
+ }
16054
+ : (data) => {
16055
+ if (typeof data === 'string') {
16056
+ return textEncoder.encode(data);
16057
+ }
16058
+ if (ArrayBuffer.isView(data)) {
16059
+ return new Uint8Array(data.buffer, data.byteOffset, data.byteLength);
16060
+ }
16061
+ throw new Error('Invalid data type!');
16062
+ };
16063
+ const base64Chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
16064
+ const base64Lookup = new Uint8Array(256);
16065
+ for (let i = 0; i < base64Chars.length; i++) {
16066
+ base64Lookup[base64Chars.charCodeAt(i)] = i;
16067
+ }
16068
+ function getDecodeBase64Length(data) {
16069
+ let bufferLength = Math.floor(data.length * 0.75);
16070
+ const len = data.length;
16071
+ if (data[len - 1] === '=') {
16072
+ bufferLength -= 1;
16073
+ if (data[len - 2] === '=') {
16074
+ bufferLength -= 1;
16075
+ }
16076
+ }
16077
+ return bufferLength;
16078
+ }
16079
+ function decodeBase64(data) {
16080
+ const bufferLength = getDecodeBase64Length(data);
16081
+ const len = data.length;
16082
+ const bytes = new Uint8Array(bufferLength);
16083
+ let p = 0;
16084
+ for (let i = 0; i < len; i += 4) {
16085
+ const encoded1 = base64Lookup[data.charCodeAt(i)];
16086
+ const encoded2 = base64Lookup[data.charCodeAt(i + 1)];
16087
+ const encoded3 = base64Lookup[data.charCodeAt(i + 2)];
16088
+ const encoded4 = base64Lookup[data.charCodeAt(i + 3)];
16089
+ bytes[p] = (encoded1 << 2) | (encoded2 >> 4);
16090
+ p += 1;
16091
+ bytes[p] = ((encoded2 & 15) << 4) | (encoded3 >> 2);
16092
+ p += 1;
16093
+ bytes[p] = ((encoded3 & 3) << 6) | (encoded4 & 63);
16094
+ p += 1;
16095
+ }
16096
+ return bytes;
16097
+ }
16098
+
16099
+ const MAX_HEAP = 16 * 1024;
16100
+ const WASM_FUNC_HASH_LENGTH = 4;
16101
+ const wasmMutex = new Mutex();
16102
+ const wasmModuleCache = new Map();
16103
+ function WASMInterface(binary, hashLength) {
16104
+ return __awaiter(this, void 0, void 0, function* () {
16105
+ let wasmInstance = null;
16106
+ let memoryView = null;
16107
+ let initialized = false;
16108
+ if (typeof WebAssembly === 'undefined') {
16109
+ throw new Error('WebAssembly is not supported in this environment!');
16110
+ }
16111
+ const writeMemory = (data, offset = 0) => {
16112
+ memoryView.set(data, offset);
16113
+ };
16114
+ const getMemory = () => memoryView;
16115
+ const getExports = () => wasmInstance.exports;
16116
+ const setMemorySize = (totalSize) => {
16117
+ wasmInstance.exports.Hash_SetMemorySize(totalSize);
16118
+ const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
16119
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
16120
+ memoryView = new Uint8Array(memoryBuffer, arrayOffset, totalSize);
16121
+ };
16122
+ const getStateSize = () => {
16123
+ const view = new DataView(wasmInstance.exports.memory.buffer);
16124
+ const stateSize = view.getUint32(wasmInstance.exports.STATE_SIZE, true);
16125
+ return stateSize;
16126
+ };
16127
+ const loadWASMPromise = wasmMutex.dispatch(() => __awaiter(this, void 0, void 0, function* () {
16128
+ if (!wasmModuleCache.has(binary.name)) {
16129
+ const asm = decodeBase64(binary.data);
16130
+ const promise = WebAssembly.compile(asm);
16131
+ wasmModuleCache.set(binary.name, promise);
16132
+ }
16133
+ const module = yield wasmModuleCache.get(binary.name);
16134
+ wasmInstance = yield WebAssembly.instantiate(module, {
16135
+ // env: {
16136
+ // emscripten_memcpy_big: (dest, src, num) => {
16137
+ // const memoryBuffer = wasmInstance.exports.memory.buffer;
16138
+ // const memView = new Uint8Array(memoryBuffer, 0);
16139
+ // memView.set(memView.subarray(src, src + num), dest);
16140
+ // },
16141
+ // print_memory: (offset, len) => {
16142
+ // const memoryBuffer = wasmInstance.exports.memory.buffer;
16143
+ // const memView = new Uint8Array(memoryBuffer, 0);
16144
+ // console.log('print_int32', memView.subarray(offset, offset + len));
16145
+ // },
16146
+ // },
16147
+ });
16148
+ // wasmInstance.exports._start();
16149
+ }));
16150
+ const setupInterface = () => __awaiter(this, void 0, void 0, function* () {
16151
+ if (!wasmInstance) {
16152
+ yield loadWASMPromise;
16153
+ }
16154
+ const arrayOffset = wasmInstance.exports.Hash_GetBuffer();
16155
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
16156
+ memoryView = new Uint8Array(memoryBuffer, arrayOffset, MAX_HEAP);
16157
+ });
16158
+ const init = (bits = null) => {
16159
+ initialized = true;
16160
+ wasmInstance.exports.Hash_Init(bits);
16161
+ };
16162
+ const updateUInt8Array = (data) => {
16163
+ let read = 0;
16164
+ while (read < data.length) {
16165
+ const chunk = data.subarray(read, read + MAX_HEAP);
16166
+ read += chunk.length;
16167
+ memoryView.set(chunk);
16168
+ wasmInstance.exports.Hash_Update(chunk.length);
16169
+ }
16170
+ };
16171
+ const update = (data) => {
16172
+ if (!initialized) {
16173
+ throw new Error('update() called before init()');
16174
+ }
16175
+ const Uint8Buffer = getUInt8Buffer(data);
16176
+ updateUInt8Array(Uint8Buffer);
16177
+ };
16178
+ const digestChars = new Uint8Array(hashLength * 2);
16179
+ const digest = (outputType, padding = null) => {
16180
+ if (!initialized) {
16181
+ throw new Error('digest() called before init()');
16182
+ }
16183
+ initialized = false;
16184
+ wasmInstance.exports.Hash_Final(padding);
16185
+ if (outputType === 'binary') {
16186
+ // the data is copied to allow GC of the original memory object
16187
+ return memoryView.slice(0, hashLength);
16188
+ }
16189
+ return getDigestHex(digestChars, memoryView, hashLength);
16190
+ };
16191
+ const save = () => {
16192
+ if (!initialized) {
16193
+ throw new Error('save() can only be called after init() and before digest()');
16194
+ }
16195
+ const stateOffset = wasmInstance.exports.Hash_GetState();
16196
+ const stateLength = getStateSize();
16197
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
16198
+ const internalState = new Uint8Array(memoryBuffer, stateOffset, stateLength);
16199
+ // prefix is 4 bytes from SHA1 hash of the WASM binary
16200
+ // it is used to detect incompatible internal states between different versions of hash-wasm
16201
+ const prefixedState = new Uint8Array(WASM_FUNC_HASH_LENGTH + stateLength);
16202
+ writeHexToUInt8(prefixedState, binary.hash);
16203
+ prefixedState.set(internalState, WASM_FUNC_HASH_LENGTH);
16204
+ return prefixedState;
16205
+ };
16206
+ const load = (state) => {
16207
+ if (!(state instanceof Uint8Array)) {
16208
+ throw new Error('load() expects an Uint8Array generated by save()');
16209
+ }
16210
+ const stateOffset = wasmInstance.exports.Hash_GetState();
16211
+ const stateLength = getStateSize();
16212
+ const overallLength = WASM_FUNC_HASH_LENGTH + stateLength;
16213
+ const memoryBuffer = wasmInstance.exports.memory.buffer;
16214
+ if (state.length !== overallLength) {
16215
+ throw new Error(`Bad state length (expected ${overallLength} bytes, got ${state.length})`);
16216
+ }
16217
+ if (!hexStringEqualsUInt8(binary.hash, state.subarray(0, WASM_FUNC_HASH_LENGTH))) {
16218
+ throw new Error('This state was written by an incompatible hash implementation');
16219
+ }
16220
+ const internalState = state.subarray(WASM_FUNC_HASH_LENGTH);
16221
+ new Uint8Array(memoryBuffer, stateOffset, stateLength).set(internalState);
16222
+ initialized = true;
16223
+ };
16224
+ const isDataShort = (data) => {
16225
+ if (typeof data === 'string') {
16226
+ // worst case is 4 bytes / char
16227
+ return data.length < MAX_HEAP / 4;
16228
+ }
16229
+ return data.byteLength < MAX_HEAP;
16230
+ };
16231
+ let canSimplify = isDataShort;
16232
+ switch (binary.name) {
16233
+ case 'argon2':
16234
+ case 'scrypt':
16235
+ canSimplify = () => true;
16236
+ break;
16237
+ case 'blake2b':
16238
+ case 'blake2s':
16239
+ // if there is a key at blake2 then cannot simplify
16240
+ canSimplify = (data, initParam) => initParam <= 512 && isDataShort(data);
16241
+ break;
16242
+ case 'blake3':
16243
+ // if there is a key at blake3 then cannot simplify
16244
+ canSimplify = (data, initParam) => initParam === 0 && isDataShort(data);
16245
+ break;
16246
+ case 'xxhash64': // cannot simplify
16247
+ case 'xxhash3':
16248
+ case 'xxhash128':
16249
+ canSimplify = () => false;
16250
+ break;
16251
+ }
16252
+ // shorthand for (init + update + digest) for better performance
16253
+ const calculate = (data, initParam = null, digestParam = null) => {
16254
+ if (!canSimplify(data, initParam)) {
16255
+ init(initParam);
16256
+ update(data);
16257
+ return digest('hex', digestParam);
16258
+ }
16259
+ const buffer = getUInt8Buffer(data);
16260
+ memoryView.set(buffer);
16261
+ wasmInstance.exports.Hash_Calculate(buffer.length, initParam, digestParam);
16262
+ return getDigestHex(digestChars, memoryView, hashLength);
16263
+ };
16264
+ yield setupInterface();
16265
+ return {
16266
+ getMemory,
16267
+ writeMemory,
16268
+ getExports,
16269
+ setMemorySize,
16270
+ init,
16271
+ update,
16272
+ digest,
16273
+ save,
16274
+ load,
16275
+ calculate,
16276
+ hashLength,
16277
+ };
16278
+ });
16279
+ }
16280
+
16281
+ new Mutex();
16200
16282
 
16201
- let sigR = sig.subarray(4, 4 + lenR);
16202
- if (sigR.length === 33 && sigR[0] === 0x00) sigR = sigR.subarray(1);
16203
- if (sigR.length > 32) return 1
16283
+ new Mutex();
16204
16284
 
16205
- let sigS = sig.subarray(6 + lenR);
16206
- if (sigS.length === 33 && sigS[0] === 0x00) sigS = sigS.slice(1);
16207
- if (sigS.length > 32) throw new Error('S length is too long')
16285
+ new Mutex();
16208
16286
 
16209
- let r = new BN(sigR);
16210
- if (r.cmp(ecparams.n) >= 0) r = new BN(0);
16287
+ new Mutex();
16211
16288
 
16212
- let s = new BN(sig.subarray(6 + lenR));
16213
- if (s.cmp(ecparams.n) >= 0) s = new BN(0);
16289
+ new Mutex();
16214
16290
 
16215
- output.set(r.toArrayLike(Uint8Array, 'be', 32), 0);
16216
- output.set(s.toArrayLike(Uint8Array, 'be', 32), 32);
16291
+ new Mutex();
16217
16292
 
16218
- return 0
16219
- },
16293
+ new Mutex();
16220
16294
 
16221
- ecdsaSign (obj, message, seckey, data, noncefn) {
16222
- if (noncefn) {
16223
- const _noncefn = noncefn;
16224
- noncefn = (counter) => {
16225
- const nonce = _noncefn(message, seckey, null, data, counter);
16295
+ new Mutex();
16226
16296
 
16227
- const isValid = nonce instanceof Uint8Array && nonce.length === 32;
16228
- if (!isValid) throw new Error('This is the way')
16297
+ new Mutex();
16229
16298
 
16230
- return new BN(nonce)
16231
- };
16232
- }
16299
+ var name$b = "sha3";
16300
+ var data$b = "AGFzbQEAAAABFARgAAF/YAF/AGACf38AYAN/f38AAwgHAAEBAgEAAwUEAQECAgYOAn8BQZCNBQt/AEGACAsHcAgGbWVtb3J5AgAOSGFzaF9HZXRCdWZmZXIAAAlIYXNoX0luaXQAAQtIYXNoX1VwZGF0ZQACCkhhc2hfRmluYWwABA1IYXNoX0dldFN0YXRlAAUOSGFzaF9DYWxjdWxhdGUABgpTVEFURV9TSVpFAwEKqBwHBQBBgAoL1wMAQQBCADcDgI0BQQBCADcD+IwBQQBCADcD8IwBQQBCADcD6IwBQQBCADcD4IwBQQBCADcD2IwBQQBCADcD0IwBQQBCADcDyIwBQQBCADcDwIwBQQBCADcDuIwBQQBCADcDsIwBQQBCADcDqIwBQQBCADcDoIwBQQBCADcDmIwBQQBCADcDkIwBQQBCADcDiIwBQQBCADcDgIwBQQBCADcD+IsBQQBCADcD8IsBQQBCADcD6IsBQQBCADcD4IsBQQBCADcD2IsBQQBCADcD0IsBQQBCADcDyIsBQQBCADcDwIsBQQBCADcDuIsBQQBCADcDsIsBQQBCADcDqIsBQQBCADcDoIsBQQBCADcDmIsBQQBCADcDkIsBQQBCADcDiIsBQQBCADcDgIsBQQBCADcD+IoBQQBCADcD8IoBQQBCADcD6IoBQQBCADcD4IoBQQBCADcD2IoBQQBCADcD0IoBQQBCADcDyIoBQQBCADcDwIoBQQBCADcDuIoBQQBCADcDsIoBQQBCADcDqIoBQQBCADcDoIoBQQBCADcDmIoBQQBCADcDkIoBQQBCADcDiIoBQQBCADcDgIoBQQBBwAwgAEEBdGtBA3Y2AoyNAUEAQQA2AoiNAQuMAwEIfwJAQQAoAoiNASIBQQBIDQBBACABIABqQQAoAoyNASICcDYCiI0BAkACQCABDQBBgAohAwwBCwJAIAIgAWsiBCAAIAQgAEkbIgNFDQAgA0EDcSEFQQAhBgJAIANBBEkNACABQYCKAWohByADQXxxIQhBACEGA0AgByAGaiIDQcgBaiAGQYAKai0AADoAACADQckBaiAGQYEKai0AADoAACADQcoBaiAGQYIKai0AADoAACADQcsBaiAGQYMKai0AADoAACAIIAZBBGoiBkcNAAsLIAVFDQAgAUHIiwFqIQMDQCADIAZqIAZBgApqLQAAOgAAIAZBAWohBiAFQX9qIgUNAAsLIAQgAEsNAUHIiwEgAhADIAAgBGshACAEQYAKaiEDCwJAIAAgAkkNAANAIAMgAhADIAMgAmohAyAAIAJrIgAgAk8NAAsLIABFDQBBACECQcgBIQYDQCAGQYCKAWogAyAGakG4fmotAAA6AAAgBkEBaiEGIAAgAkEBaiICQf8BcUsNAAsLC+QLAS1+IAApA0AhAkEAKQPAigEhAyAAKQM4IQRBACkDuIoBIQUgACkDMCEGQQApA7CKASEHIAApAyghCEEAKQOoigEhCSAAKQMgIQpBACkDoIoBIQsgACkDGCEMQQApA5iKASENIAApAxAhDkEAKQOQigEhDyAAKQMIIRBBACkDiIoBIREgACkDACESQQApA4CKASETQQApA8iKASEUAkACQCABQcgASw0AQQApA9CKASEVQQApA+CKASEWQQApA9iKASEXDAELQQApA+CKASAAKQNghSEWQQApA9iKASAAKQNYhSEXQQApA9CKASAAKQNQhSEVIBQgACkDSIUhFCABQekASQ0AQQBBACkD6IoBIAApA2iFNwPoigFBAEEAKQPwigEgACkDcIU3A/CKAUEAQQApA/iKASAAKQN4hTcD+IoBQQBBACkDgIsBIAApA4ABhTcDgIsBIAFBiQFJDQBBAEEAKQOIiwEgACkDiAGFNwOIiwELIAMgAoUhGCAFIASFIRkgByAGhSEHIAkgCIUhCCALIAqFIRogDSAMhSEJIA8gDoUhCiARIBCFIQsgEyAShSEMQQApA7iLASESQQApA5CLASETQQApA+iKASEbQQApA6CLASEcQQApA/iKASENQQApA7CLASEdQQApA4iLASEOQQApA8CLASEPQQApA5iLASEeQQApA/CKASEQQQApA6iLASERQQApA4CLASEfQcB+IQADQCAaIAcgC4UgF4UgH4UgEYVCAYmFIBSFIBCFIB6FIA+FIQIgDCAZIAqFIBaFIA6FIB2FQgGJhSAIhSAVhSANhSAchSIDIAeFISAgCSAIIAyFIBWFIA2FIByFQgGJhSAYhSAbhSAThSAShSIEIA+FISEgGCAKIBQgGoUgEIUgHoUgD4VCAYmFIBmFIBaFIA6FIB2FIgWFQjeJIiIgCyAYIAmFIBuFIBOFIBKFQgGJhSAHhSAXhSAfhSARhSIGIAqFQj6JIiNCf4WDIAMgEYVCAokiJIUhDyANIAKFQimJIiUgBCAQhUIniSImQn+FgyAihSERIBIgBYVCOIkiEiAGIA6FQg+JIidCf4WDIAMgF4VCCokiKIUhDiAEIBqFQhuJIikgKCAIIAKFQiSJIipCf4WDhSENIAYgGYVCBokiKyADIAuFQgGJIixCf4WDIBwgAoVCEokiLYUhECArIAQgHoVCCIkiLiAbIAWFQhmJIhtCf4WDhSEXIAYgHYVCPYkiGSAEIBSFQhSJIgQgCSAFhUIciSIIQn+Fg4UhFCAIIBlCf4WDIAMgH4VCLYkiA4UhGCAZIANCf4WDIBUgAoVCA4kiCYUhGSAEIAMgCUJ/hYOFIQcgCSAEQn+FgyAIhSEIIAwgAoUiAiAhQg6JIgNCf4WDIBMgBYVCFYkiBIUhCSAGIBaFQiuJIgUgAyAEQn+Fg4UhCiAEIAVCf4WDICBCLIkiBIUhCyAAQdAJaikDACAFIARCf4WDhSAChSEMICcgKEJ/hYMgKoUiBSEfIAMgBCACQn+Fg4UiAiEaICogKUJ/hYMgEoUiAyEeIC0gLkJ/hYMgG4UiBCEWICYgJCAlQn+Fg4UiBiEdIBsgK0J/hYMgLIUiKCEVICMgJiAiQn+Fg4UiIiEcIC4gLCAtQn+Fg4UiJiEbICcgKSASQn+Fg4UiJyETICMgJEJ/hYMgJYUiIyESIABBCGoiAA0AC0EAIBE3A6iLAUEAIAU3A4CLAUEAIBc3A9iKAUEAIAc3A7CKAUEAIAs3A4iKAUEAIA83A8CLAUEAIAM3A5iLAUEAIBA3A/CKAUEAIBQ3A8iKAUEAIAI3A6CKAUEAIAY3A7CLAUEAIA43A4iLAUEAIAQ3A+CKAUEAIBk3A7iKAUEAIAo3A5CKAUEAICI3A6CLAUEAIA03A/iKAUEAICg3A9CKAUEAIAg3A6iKAUEAIAw3A4CKAUEAICM3A7iLAUEAICc3A5CLAUEAICY3A+iKAUEAIBg3A8CKAUEAIAk3A5iKAQv4AgEFf0HkAEEAKAKMjQEiAUEBdmshAgJAQQAoAoiNASIDQQBIDQAgASEEAkAgASADRg0AIANByIsBaiEFQQAhAwNAIAUgA2pBADoAACADQQFqIgMgAUEAKAKIjQEiBGtJDQALCyAEQciLAWoiAyADLQAAIAByOgAAIAFBx4sBaiIDIAMtAABBgAFyOgAAQciLASABEANBAEGAgICAeDYCiI0BCwJAIAJBBEkNACACQQJ2IgNBA3EhBUEAIQQCQCADQX9qQQNJDQAgA0H8////A3EhAUEAIQNBACEEA0AgA0GACmogA0GAigFqKAIANgIAIANBhApqIANBhIoBaigCADYCACADQYgKaiADQYiKAWooAgA2AgAgA0GMCmogA0GMigFqKAIANgIAIANBEGohAyABIARBBGoiBEcNAAsLIAVFDQAgBUECdCEBIARBAnQhAwNAIANBgApqIANBgIoBaigCADYCACADQQRqIQMgAUF8aiIBDQALCwsGAEGAigEL0QYBA39BAEIANwOAjQFBAEIANwP4jAFBAEIANwPwjAFBAEIANwPojAFBAEIANwPgjAFBAEIANwPYjAFBAEIANwPQjAFBAEIANwPIjAFBAEIANwPAjAFBAEIANwO4jAFBAEIANwOwjAFBAEIANwOojAFBAEIANwOgjAFBAEIANwOYjAFBAEIANwOQjAFBAEIANwOIjAFBAEIANwOAjAFBAEIANwP4iwFBAEIANwPwiwFBAEIANwPoiwFBAEIANwPgiwFBAEIANwPYiwFBAEIANwPQiwFBAEIANwPIiwFBAEIANwPAiwFBAEIANwO4iwFBAEIANwOwiwFBAEIANwOoiwFBAEIANwOgiwFBAEIANwOYiwFBAEIANwOQiwFBAEIANwOIiwFBAEIANwOAiwFBAEIANwP4igFBAEIANwPwigFBAEIANwPoigFBAEIANwPgigFBAEIANwPYigFBAEIANwPQigFBAEIANwPIigFBAEIANwPAigFBAEIANwO4igFBAEIANwOwigFBAEIANwOoigFBAEIANwOgigFBAEIANwOYigFBAEIANwOQigFBAEIANwOIigFBAEIANwOAigFBAEHADCABQQF0a0EDdjYCjI0BQQBBADYCiI0BIAAQAkHkAEEAKAKMjQEiAEEBdmshAwJAQQAoAoiNASIBQQBIDQAgACEEAkAgACABRg0AIAFByIsBaiEFQQAhAQNAIAUgAWpBADoAACABQQFqIgEgAEEAKAKIjQEiBGtJDQALCyAEQciLAWoiASABLQAAIAJyOgAAIABBx4sBaiIBIAEtAABBgAFyOgAAQciLASAAEANBAEGAgICAeDYCiI0BCwJAIANBBEkNACADQQJ2IgFBA3EhBUEAIQQCQCABQX9qQQNJDQAgAUH8////A3EhAEEAIQFBACEEA0AgAUGACmogAUGAigFqKAIANgIAIAFBhApqIAFBhIoBaigCADYCACABQYgKaiABQYiKAWooAgA2AgAgAUGMCmogAUGMigFqKAIANgIAIAFBEGohASAAIARBBGoiBEcNAAsLIAVFDQAgBUECdCEAIARBAnQhAQNAIAFBgApqIAFBgIoBaigCADYCACABQQRqIQEgAEF8aiIADQALCwsL2AEBAEGACAvQAZABAAAAAAAAAAAAAAAAAAABAAAAAAAAAIKAAAAAAAAAioAAAAAAAIAAgACAAAAAgIuAAAAAAAAAAQAAgAAAAACBgACAAAAAgAmAAAAAAACAigAAAAAAAACIAAAAAAAAAAmAAIAAAAAACgAAgAAAAACLgACAAAAAAIsAAAAAAACAiYAAAAAAAIADgAAAAAAAgAKAAAAAAACAgAAAAAAAAIAKgAAAAAAAAAoAAIAAAACAgYAAgAAAAICAgAAAAAAAgAEAAIAAAAAACIAAgAAAAIA=";
16301
+ var hash$b = "f2f6f5b2";
16302
+ var wasmJson$b = {
16303
+ name: name$b,
16304
+ data: data$b,
16305
+ hash: hash$b
16306
+ };
16233
16307
 
16234
- const d = new BN(seckey);
16235
- if (d.cmp(ecparams.n) >= 0 || d.isZero()) return 1
16308
+ new Mutex();
16236
16309
 
16237
- let sig;
16238
- try {
16239
- sig = ec.sign(message, seckey, { canonical: true, k: noncefn, pers: data });
16240
- } catch (err) {
16241
- return 1
16310
+ new Mutex();
16311
+ function validateBits(bits) {
16312
+ if (![224, 256, 384, 512].includes(bits)) {
16313
+ return new Error('Invalid variant! Valid values: 224, 256, 384, 512');
16242
16314
  }
16243
-
16244
- obj.signature.set(sig.r.toArrayLike(Uint8Array, 'be', 32), 0);
16245
- obj.signature.set(sig.s.toArrayLike(Uint8Array, 'be', 32), 32);
16246
- obj.recid = sig.recoveryParam;
16247
-
16248
- return 0
16249
- },
16250
-
16251
- ecdsaVerify (sig, msg32, pubkey) {
16252
- const sigObj = { r: sig.subarray(0, 32), s: sig.subarray(32, 64) };
16253
-
16254
- const sigr = new BN(sigObj.r);
16255
- const sigs = new BN(sigObj.s);
16256
- if (sigr.cmp(ecparams.n) >= 0 || sigs.cmp(ecparams.n) >= 0) return 1
16257
- if (sigs.cmp(ec.nh) === 1 || sigr.isZero() || sigs.isZero()) return 3
16258
-
16259
- const pair = loadPublicKey(pubkey);
16260
- if (pair === null) return 2
16261
-
16262
- const point = pair.getPublic();
16263
- const isValid = ec.verify(msg32, sigObj, point);
16264
- return isValid ? 0 : 3
16265
- },
16266
-
16267
- ecdsaRecover (output, sig, recid, msg32) {
16268
- const sigObj = { r: sig.slice(0, 32), s: sig.slice(32, 64) };
16269
-
16270
- const sigr = new BN(sigObj.r);
16271
- const sigs = new BN(sigObj.s);
16272
- if (sigr.cmp(ecparams.n) >= 0 || sigs.cmp(ecparams.n) >= 0) return 1
16273
-
16274
- if (sigr.isZero() || sigs.isZero()) return 2
16275
-
16276
- // Can throw `throw new Error('Unable to find sencond key candinate');`
16277
- let point;
16278
- try {
16279
- point = ec.recoverPubKey(msg32, sigObj, recid);
16280
- } catch (err) {
16281
- return 2
16315
+ return null;
16316
+ }
16317
+ /**
16318
+ * Creates a new Keccak hash instance
16319
+ * @param bits Number of output bits. Valid values: 224, 256, 384, 512
16320
+ */
16321
+ function createKeccak(bits = 512) {
16322
+ if (validateBits(bits)) {
16323
+ return Promise.reject(validateBits(bits));
16282
16324
  }
16325
+ const outputSize = bits / 8;
16326
+ return WASMInterface(wasmJson$b, outputSize).then((wasm) => {
16327
+ wasm.init(bits);
16328
+ const obj = {
16329
+ init: () => { wasm.init(bits); return obj; },
16330
+ update: (data) => { wasm.update(data); return obj; },
16331
+ digest: (outputType) => wasm.digest(outputType, 0x01),
16332
+ save: () => wasm.save(),
16333
+ load: (data) => { wasm.load(data); return obj; },
16334
+ blockSize: 200 - 2 * outputSize,
16335
+ digestSize: outputSize,
16336
+ };
16337
+ return obj;
16338
+ });
16339
+ }
16283
16340
 
16284
- savePublicKey(output, point);
16285
-
16286
- return 0
16287
- },
16288
-
16289
- ecdh (output, pubkey, seckey, data, hashfn, xbuf, ybuf) {
16290
- const pair = loadPublicKey(pubkey);
16291
- if (pair === null) return 1
16292
-
16293
- const scalar = new BN(seckey);
16294
- if (scalar.cmp(ecparams.n) >= 0 || scalar.isZero()) return 2
16295
-
16296
- const point = pair.getPublic().mul(scalar);
16341
+ new Mutex();
16297
16342
 
16298
- if (hashfn === undefined) {
16299
- const data = point.encode(null, true);
16300
- const sha256 = ec.hash().update(data).digest();
16301
- for (let i = 0; i < 32; ++i) output[i] = sha256[i];
16302
- } else {
16303
- if (!xbuf) xbuf = new Uint8Array(32);
16304
- const x = point.getX().toArray('be', 32);
16305
- for (let i = 0; i < 32; ++i) xbuf[i] = x[i];
16343
+ new Mutex();
16306
16344
 
16307
- if (!ybuf) ybuf = new Uint8Array(32);
16308
- const y = point.getY().toArray('be', 32);
16309
- for (let i = 0; i < 32; ++i) ybuf[i] = y[i];
16345
+ var name$9 = "sha512";
16346
+ var data$9 = "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";
16347
+ var hash$9 = "cdd57f6a";
16348
+ var wasmJson$9 = {
16349
+ name: name$9,
16350
+ data: data$9,
16351
+ hash: hash$9
16352
+ };
16310
16353
 
16311
- const hash = hashfn(xbuf, ybuf, data);
16354
+ new Mutex();
16312
16355
 
16313
- const isValid = hash instanceof Uint8Array && hash.length === output.length;
16314
- if (!isValid) return 2
16356
+ new Mutex();
16357
+ /**
16358
+ * Creates a new SHA-2 (SHA-512) hash instance
16359
+ */
16360
+ function createSHA512() {
16361
+ return WASMInterface(wasmJson$9, 64).then((wasm) => {
16362
+ wasm.init(512);
16363
+ const obj = {
16364
+ init: () => { wasm.init(512); return obj; },
16365
+ update: (data) => { wasm.update(data); return obj; },
16366
+ digest: (outputType) => wasm.digest(outputType),
16367
+ save: () => wasm.save(),
16368
+ load: (data) => { wasm.load(data); return obj; },
16369
+ blockSize: 128,
16370
+ digestSize: 64,
16371
+ };
16372
+ return obj;
16373
+ });
16374
+ }
16315
16375
 
16316
- output.set(hash);
16317
- }
16376
+ new Mutex();
16318
16377
 
16319
- return 0
16320
- }
16321
- };
16378
+ new Mutex();
16322
16379
 
16323
- var elliptic = lib(elliptic$1);
16380
+ new Mutex();
16324
16381
 
16325
- var secp256k1 = /*@__PURE__*/getDefaultExportFromCjs(elliptic);
16382
+ new Mutex();
16326
16383
 
16327
- const leofcoinOlivia = {
16328
- messagePrefix: '\u0019Leofcoin Signed Message:',
16329
- version: 1,
16330
- pubKeyHash: 0x73,
16331
- scriptHash: 0x76,
16332
- multiTxHash: 0x8b4125,
16333
- payments: {
16334
- version: 0,
16335
- unspent: 0x1fa443d7 // ounsp
16336
- },
16337
- wif: 0x7D,
16338
- multiCodec: 0x7c4,
16339
- bip32: { public: 0x13BBF2D5, private: 0x13BBCBC5 }
16340
- };
16341
- const bitcoinTestnet = {
16342
- messagePrefix: '\x18Bitcoin Signed Message:\n',
16343
- version: 1,
16344
- bech32: 'tb',
16345
- pubKeyHash: 0x6f,
16346
- scriptHash: 0xc4,
16347
- wif: 0xef,
16348
- bip32: {
16349
- public: 0x043587cf,
16350
- private: 0x04358394
16351
- },
16352
- multiCodec: 0
16353
- };
16354
- var testnets = {
16355
- 'leofcoin:olivia': leofcoinOlivia,
16356
- 'bitcoin:testnet': bitcoinTestnet
16384
+ var name$4 = "ripemd160";
16385
+ var data$4 = "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";
16386
+ var hash$4 = "c089a7ca";
16387
+ var wasmJson$4 = {
16388
+ name: name$4,
16389
+ data: data$4,
16390
+ hash: hash$4
16357
16391
  };
16358
16392
 
16359
- // https://en.bitcoin.it/wiki/List_of_address_prefixes
16360
- // usage:
16361
- // networks['bitcoin']['testnet']
16362
- // networks.bitcoin.testnet
16393
+ new Mutex();
16363
16394
  /**
16364
- * Main network
16365
- * @return {messagePrefix, pubKeyHash, scriptHash, wif, bip32}
16395
+ * Creates a new RIPEMD-160 hash instance
16366
16396
  */
16367
- const leofcoin = {
16368
- messagePrefix: '\u0019Leofcoin Signed Message:',
16369
- version: 1,
16370
- pubKeyHash: 0x30,
16371
- scriptHash: 0x37,
16372
- multiTxHash: 0x3adeed,
16373
- payments: {
16374
- version: 0,
16375
- unspent: 0x0d6e0327 // Lunsp
16376
- },
16377
- coin_type: 640,
16378
- wif: 0x3F,
16379
- multiCodec: 0x3c4,
16380
- bip32: { public: 0x13BBF2D4, private: 0x13BBCBC4 },
16381
- testnet: testnets['leofcoin:olivia']
16382
- };
16383
- const bitcoin = {
16384
- messagePrefix: '\x18Bitcoin Signed Message:\n',
16385
- version: 1,
16386
- bech32: 'bc',
16387
- pubKeyHash: 0x00,
16388
- multiCodec: 0x00,
16389
- scriptHash: 0x05,
16390
- wif: 0x80,
16391
- coin_type: 0,
16392
- bip32: {
16393
- public: 0x0488b21e, private: 0x0488ade4
16394
- },
16395
- testnet: testnets['bitcoin:testnet']
16396
- };
16397
- const litecoin = {
16398
- messagePrefix: '\x19Litecoin Signed Message:\n',
16399
- version: 1,
16400
- pubKeyHash: 0x30,
16401
- scriptHash: 0x32,
16402
- wif: 0xb0,
16403
- bip32: {
16404
- public: 0x019da462,
16405
- private: 0x019d9cfe
16406
- },
16407
- bech32: '',
16408
- multiCodec: 0
16409
- };
16410
- const ethereum = {
16411
- messagePrefix: '\x19Ethereum Signed Message:\n',
16412
- version: 1,
16413
- pubKeyHash: 0x30,
16414
- scriptHash: 0x32,
16415
- bip32: {
16416
- private: 0x0488ADE4, public: 0x0488B21E
16417
- },
16418
- coin_type: 60,
16419
- wif: 0x45,
16420
- multiCodec: 0x3c5
16421
- };
16397
+ function createRIPEMD160() {
16398
+ return WASMInterface(wasmJson$4, 20).then((wasm) => {
16399
+ wasm.init();
16400
+ const obj = {
16401
+ init: () => { wasm.init(); return obj; },
16402
+ update: (data) => { wasm.update(data); return obj; },
16403
+ digest: (outputType) => wasm.digest(outputType),
16404
+ save: () => wasm.save(),
16405
+ load: (data) => { wasm.load(data); return obj; },
16406
+ blockSize: 64,
16407
+ digestSize: 20,
16408
+ };
16409
+ return obj;
16410
+ });
16411
+ }
16412
+
16413
+ function calculateKeyBuffer(hasher, key) {
16414
+ const { blockSize } = hasher;
16415
+ const buf = getUInt8Buffer(key);
16416
+ if (buf.length > blockSize) {
16417
+ hasher.update(buf);
16418
+ const uintArr = hasher.digest('binary');
16419
+ hasher.init();
16420
+ return uintArr;
16421
+ }
16422
+ return new Uint8Array(buf.buffer, buf.byteOffset, buf.length);
16423
+ }
16424
+ function calculateHmac(hasher, key) {
16425
+ hasher.init();
16426
+ const { blockSize } = hasher;
16427
+ const keyBuf = calculateKeyBuffer(hasher, key);
16428
+ const keyBuffer = new Uint8Array(blockSize);
16429
+ keyBuffer.set(keyBuf);
16430
+ const opad = new Uint8Array(blockSize);
16431
+ for (let i = 0; i < blockSize; i++) {
16432
+ const v = keyBuffer[i];
16433
+ opad[i] = v ^ 0x5C;
16434
+ keyBuffer[i] = v ^ 0x36;
16435
+ }
16436
+ hasher.update(keyBuffer);
16437
+ const obj = {
16438
+ init: () => {
16439
+ hasher.init();
16440
+ hasher.update(keyBuffer);
16441
+ return obj;
16442
+ },
16443
+ update: (data) => {
16444
+ hasher.update(data);
16445
+ return obj;
16446
+ },
16447
+ digest: ((outputType) => {
16448
+ const uintArr = hasher.digest('binary');
16449
+ hasher.init();
16450
+ hasher.update(opad);
16451
+ hasher.update(uintArr);
16452
+ return hasher.digest(outputType);
16453
+ }),
16454
+ save: () => {
16455
+ throw new Error('save() not supported');
16456
+ },
16457
+ load: () => {
16458
+ throw new Error('load() not supported');
16459
+ },
16460
+ blockSize: hasher.blockSize,
16461
+ digestSize: hasher.digestSize,
16462
+ };
16463
+ return obj;
16464
+ }
16422
16465
  /**
16423
- * Our & supported networks
16424
- * @return {leofcoin, olivia}
16466
+ * Calculates HMAC hash
16467
+ * @param hash Hash algorithm to use. It has to be the return value of a function like createSHA1()
16468
+ * @param key Key (string, Buffer or TypedArray)
16425
16469
  */
16426
- var networks$1 = {
16427
- leofcoin,
16428
- bitcoin,
16429
- litecoin,
16430
- ethereum
16431
- };
16470
+ function createHMAC(hash, key) {
16471
+ if (!hash || !hash.then) {
16472
+ throw new Error('Invalid hash function is provided! Usage: createHMAC(createMD5(), "key").');
16473
+ }
16474
+ return hash.then((hasher) => calculateHmac(hasher, key));
16475
+ }
16476
+
16477
+ new Mutex();
16478
+
16479
+ new Mutex();
16432
16480
 
16433
16481
  const encode$1 = (version, privateKey, compressed) => {
16434
16482
  if (privateKey.length !== 32)
@@ -20216,7 +20264,7 @@ class Identity {
20216
20264
  this.selectedAccount = new TextDecoder().decode(selected);
20217
20265
  }
20218
20266
  else {
20219
- const importee = await import(/* webpackChunkName: "generate-account" */ './index-329e0324-f8858eb6.js');
20267
+ const importee = await import(/* webpackChunkName: "generate-account" */ './index-8868bdd8-0d28073e.js');
20220
20268
  const { identity, accounts } = await importee.default(password, this.network);
20221
20269
  await globalThis.accountStore.put('public', JSON.stringify({ walletId: identity.walletId }));
20222
20270
  await globalThis.walletStore.put('version', String(1));
@@ -20312,17 +20360,20 @@ class Peernet {
20312
20360
  /**
20313
20361
  * @property {String} network - current network
20314
20362
  */
20315
- this.network = options.network || 'leofcoin';
20363
+ this.network = options.network || "leofcoin";
20316
20364
  this.autoStart = options.autoStart === undefined ? true : options.autoStart;
20317
20365
  this.stars = options.stars;
20318
- const parts = this.network.split(':');
20319
- this.networkVersion = options.networkVersion || parts.length > 1 ? parts[1] : 'mainnet';
20366
+ const parts = this.network.split(":");
20367
+ this.networkVersion =
20368
+ options.networkVersion || parts.length > 1 ? parts[1] : "mainnet";
20320
20369
  if (!options.storePrefix)
20321
- options.storePrefix = 'lfc';
20370
+ options.storePrefix = "lfc";
20322
20371
  if (!options.port)
20323
20372
  options.port = 2000;
20324
20373
  if (!options.root) {
20325
- parts[1] ? options.root = `.${parts[0]}/${parts[1]}` : options.root = `.${this.network}`;
20374
+ parts[1]
20375
+ ? (options.root = `.${parts[0]}/${parts[1]}`)
20376
+ : (options.root = `.${this.network}`);
20326
20377
  }
20327
20378
  globalThis.peernet = this;
20328
20379
  this.bw = {
@@ -20342,7 +20393,15 @@ class Peernet {
20342
20393
  return this.identity.accounts;
20343
20394
  }
20344
20395
  get defaultStores() {
20345
- return ['account', 'wallet', 'block', 'transaction', 'chain', 'data', 'message'];
20396
+ return [
20397
+ "account",
20398
+ "wallet",
20399
+ "block",
20400
+ "transaction",
20401
+ "chain",
20402
+ "data",
20403
+ "message",
20404
+ ];
20346
20405
  }
20347
20406
  selectAccount(account) {
20348
20407
  return this.identity.selectAccount(account);
@@ -20355,11 +20414,16 @@ class Peernet {
20355
20414
  return utils$p.addCodec(codec);
20356
20415
  }
20357
20416
  async addStore(name, prefix, root, isPrivate = true) {
20358
- if (name === 'block' || name === 'transaction' || name === 'chain' ||
20359
- name === 'data' || name === 'message')
20417
+ if (name === "block" ||
20418
+ name === "transaction" ||
20419
+ name === "chain" ||
20420
+ name === "data" ||
20421
+ name === "message")
20360
20422
  isPrivate = false;
20361
20423
  let Storage;
20362
- this.hasDaemon ? Storage = LeofcoinStorageClient : Storage = LeofcoinStorage;
20424
+ this.hasDaemon
20425
+ ? (Storage = LeofcoinStorageClient)
20426
+ : (Storage = LeofcoinStorage);
20363
20427
  if (!globalThis[`${name}Store`]) {
20364
20428
  globalThis[`${name}Store`] = new Storage(name, root);
20365
20429
  await globalThis[`${name}Store`].init();
@@ -20405,9 +20469,9 @@ class Peernet {
20405
20469
  async _init(options, password) {
20406
20470
  this.storePrefix = options.storePrefix;
20407
20471
  this.root = options.root;
20408
- const { RequestMessage, ResponseMessage, PeerMessage, PeerMessageResponse, PeernetMessage, DHTMessage, DHTMessageResponse, DataMessage, DataMessageResponse, PsMessage, ChatMessage, PeernetFile
20472
+ const { RequestMessage, ResponseMessage, PeerMessage, PeerMessageResponse, PeernetMessage, DHTMessage, DHTMessageResponse, DataMessage, DataMessageResponse, PsMessage, ChatMessage, PeernetFile,
20409
20473
  // FolderMessageResponse
20410
- } = await import(/* webpackChunkName: "messages" */ './messages-000b7f84-2f945543.js');
20474
+ } = await import(/* webpackChunkName: "messages" */ './messages-eb6e5c71-584b278f.js');
20411
20475
  /**
20412
20476
  * proto Object containing protos
20413
20477
  * @type {Object}
@@ -20418,18 +20482,18 @@ class Peernet {
20418
20482
  * @property {DataMessageResponse} protos[peernet-data-response] messageNode
20419
20483
  */
20420
20484
  globalThis.peernet.protos = {
20421
- 'peernet-request': RequestMessage,
20422
- 'peernet-response': ResponseMessage,
20423
- 'peernet-peer': PeerMessage,
20424
- 'peernet-peer-response': PeerMessageResponse,
20425
- 'peernet-message': PeernetMessage,
20426
- 'peernet-dht': DHTMessage,
20427
- 'peernet-dht-response': DHTMessageResponse,
20428
- 'peernet-data': DataMessage,
20429
- 'peernet-data-response': DataMessageResponse,
20430
- 'peernet-ps': PsMessage,
20431
- 'chat-message': ChatMessage,
20432
- 'peernet-file': PeernetFile
20485
+ "peernet-request": RequestMessage,
20486
+ "peernet-response": ResponseMessage,
20487
+ "peernet-peer": PeerMessage,
20488
+ "peernet-peer-response": PeerMessageResponse,
20489
+ "peernet-message": PeernetMessage,
20490
+ "peernet-dht": DHTMessage,
20491
+ "peernet-dht-response": DHTMessageResponse,
20492
+ "peernet-data": DataMessage,
20493
+ "peernet-data-response": DataMessageResponse,
20494
+ "peernet-ps": PsMessage,
20495
+ "chat-message": ChatMessage,
20496
+ "peernet-file": PeernetFile,
20433
20497
  };
20434
20498
  this._messageHandler = new MessageHandler(this.network);
20435
20499
  const { daemon, environment } = await target();
@@ -20441,38 +20505,44 @@ class Peernet {
20441
20505
  await this.identity.load(password);
20442
20506
  this._peerHandler = new PeerDiscovery(this.id);
20443
20507
  this.peerId = this.id;
20444
- this.addRequestHandler('handshake', () => {
20445
- return new peernet.protos['peernet-response']({ response: { peerId: this.id } });
20508
+ this.addRequestHandler("handshake", () => {
20509
+ return new peernet.protos["peernet-response"]({
20510
+ response: { peerId: this.id },
20511
+ });
20446
20512
  });
20447
- pubsub.subscribe('peer:discovered', async (peer) => {
20513
+ pubsub.subscribe("peer:discovered", async (peer) => {
20448
20514
  // console.log(peer);
20449
- if (this.requestProtos['version']) {
20450
- let data = await new globalThis.peernet.protos['peernet-request']({ request: 'version' });
20515
+ if (this.requestProtos["version"]) {
20516
+ let data = await new globalThis.peernet.protos["peernet-request"]({
20517
+ request: "version",
20518
+ });
20451
20519
  let node = await globalThis.peernet.prepareMessage(data);
20452
20520
  let response = await peer.request(node.encoded);
20453
- response = await new globalThis.peernet.protos['peernet-response'](new Uint8Array(Object.values(response)));
20521
+ response = await new globalThis.peernet.protos["peernet-response"](new Uint8Array(Object.values(response)));
20454
20522
  peer.version = response.decoded.response.version;
20455
20523
  }
20456
- let data = await new globalThis.peernet.protos['peernet-request']({ request: 'handshake' });
20524
+ let data = await new globalThis.peernet.protos["peernet-request"]({
20525
+ request: "handshake",
20526
+ });
20457
20527
  let node = await globalThis.peernet.prepareMessage(data);
20458
20528
  let response = await peer.request(node.encoded);
20459
- response = await new globalThis.peernet.protos['peernet-response'](new Uint8Array(Object.values(response)));
20529
+ response = await new globalThis.peernet.protos["peernet-response"](new Uint8Array(Object.values(response)));
20460
20530
  // todo: response.decoded should be the response and not response.peerId
20461
20531
  this.#connections[response.decoded.response.peerId] = peer;
20462
- pubsub.publish('peer:connected', peer);
20532
+ pubsub.publish("peer:connected", peer);
20463
20533
  // todo: cleanup discovered
20464
20534
  });
20465
- pubsub.subscribe('peer:left', this.#peerLeft.bind(this));
20535
+ pubsub.subscribe("peer:left", this.#peerLeft.bind(this));
20466
20536
  /**
20467
20537
  * converts data -> message -> proto
20468
20538
  * @see DataHandler
20469
20539
  */
20470
- pubsub.subscribe('peer:data', dataHandler);
20540
+ pubsub.subscribe("peer:data", dataHandler);
20471
20541
  if (globalThis.navigator) {
20472
- globalThis.addEventListener('beforeunload', async () => this.client.destroy());
20542
+ globalThis.addEventListener("beforeunload", async () => this.client.destroy());
20473
20543
  }
20474
20544
  else {
20475
- process.on('SIGTERM', async () => {
20545
+ process.on("SIGTERM", async () => {
20476
20546
  process.stdin.resume();
20477
20547
  try {
20478
20548
  await this.client.destroy();
@@ -20503,7 +20573,9 @@ class Peernet {
20503
20573
  }
20504
20574
  #peerLeft(peer) {
20505
20575
  for (const [id, _peer] of Object.entries(this.#connections)) {
20506
- if (_peer.id === peer.id && this.#connections[id] && !this.#connections[id].connected) {
20576
+ if (_peer.id === peer.id &&
20577
+ this.#connections[id] &&
20578
+ !this.#connections[id].connected) {
20507
20579
  delete this.#connections[id];
20508
20580
  this.removePeer(_peer);
20509
20581
  }
@@ -20530,18 +20602,26 @@ class Peernet {
20530
20602
  else {
20531
20603
  has = await this.has(hash);
20532
20604
  }
20533
- const data = await new globalThis.peernet.protos['peernet-dht-response']({ hash, has });
20605
+ const data = await new globalThis.peernet.protos["peernet-dht-response"]({
20606
+ hash,
20607
+ has,
20608
+ });
20534
20609
  const node = await this.prepareMessage(data);
20535
20610
  this.sendMessage(peer, id, node.encoded);
20536
20611
  }
20537
20612
  async handleData(peer, id, proto) {
20538
20613
  let { hash, store } = proto.decoded;
20539
20614
  let data;
20540
- store = globalThis[`${store}Store`] || await this.whichStore([...this.stores], hash);
20615
+ store =
20616
+ globalThis[`${store}Store`] ||
20617
+ (await this.whichStore([...this.stores], hash));
20541
20618
  if (store && !store.private) {
20542
20619
  data = await store.get(hash);
20543
20620
  if (data) {
20544
- data = await new globalThis.peernet.protos['peernet-data-response']({ hash, data });
20621
+ data = await new globalThis.peernet.protos["peernet-data-response"]({
20622
+ hash,
20623
+ data,
20624
+ });
20545
20625
  const node = await this.prepareMessage(data);
20546
20626
  this.sendMessage(peer, id, node.encoded);
20547
20627
  }
@@ -20565,21 +20645,20 @@ class Peernet {
20565
20645
  const { id, proto } = message;
20566
20646
  this.bw.down += proto.encoded.length;
20567
20647
  switch (proto.name) {
20568
- case 'peernet-dht': {
20648
+ case "peernet-dht": {
20569
20649
  this.handleDHT(peer, id, proto);
20570
20650
  break;
20571
20651
  }
20572
- case 'peernet-data': {
20652
+ case "peernet-data": {
20573
20653
  this.handleData(peer, id, proto);
20574
20654
  break;
20575
20655
  }
20576
- case 'peernet-request': {
20656
+ case "peernet-request": {
20577
20657
  this.handleRequest(peer, id, proto);
20578
20658
  break;
20579
20659
  }
20580
- case 'peernet-ps': {
20581
- if (peer.peerId !== this.id)
20582
- globalSub.publish(proto.decoded.topic, proto.decoded.data);
20660
+ case "peernet-ps": {
20661
+ globalSub.publish(new TextDecoder().decode(proto.decoded.topic), proto.decoded.data);
20583
20662
  }
20584
20663
  }
20585
20664
  }
@@ -20590,14 +20669,14 @@ class Peernet {
20590
20669
  */
20591
20670
  async walk(hash) {
20592
20671
  if (!hash)
20593
- throw new Error('hash expected, received undefined');
20594
- const data = await new globalThis.peernet.protos['peernet-dht']({ hash });
20672
+ throw new Error("hash expected, received undefined");
20673
+ const data = await new globalThis.peernet.protos["peernet-dht"]({ hash });
20595
20674
  const walk = async (peer, peerId) => {
20596
20675
  const node = await this.prepareMessage(data);
20597
20676
  let result = await peer.request(node.encoded);
20598
20677
  result = new Uint8Array(Object.values(result));
20599
20678
  const proto = await protoFor(result);
20600
- if (proto.name !== 'peernet-dht-response')
20679
+ if (proto.name !== "peernet-dht-response")
20601
20680
  throw dhtError(proto.name);
20602
20681
  const peerInfo = {
20603
20682
  ...peer.connectionStats,
@@ -20623,7 +20702,8 @@ class Peernet {
20623
20702
  let providers = this.dht.providersFor(hash);
20624
20703
  // walk the network to find a provider
20625
20704
  let tries = 0;
20626
- while (!providers && tries < 3 || Object.keys(providers).length === 0 && tries < 3) {
20705
+ while ((!providers && tries < 3) ||
20706
+ (Object.keys(providers).length === 0 && tries < 3)) {
20627
20707
  tries += 1;
20628
20708
  await this.walk(hash);
20629
20709
  providers = this.dht.providersFor(hash);
@@ -20637,7 +20717,7 @@ class Peernet {
20637
20717
  const data = await blockStore.has(hash);
20638
20718
  if (data)
20639
20719
  return blockStore.get(hash);
20640
- return this.requestData(hash, 'block');
20720
+ return this.requestData(hash, "block");
20641
20721
  },
20642
20722
  put: async (hash, data) => {
20643
20723
  if (await blockStore.has(hash))
@@ -20653,7 +20733,7 @@ class Peernet {
20653
20733
  const data = await transactionStore.has(hash);
20654
20734
  if (data)
20655
20735
  return await transactionStore.get(hash);
20656
- return this.requestData(hash, 'transaction');
20736
+ return this.requestData(hash, "transaction");
20657
20737
  },
20658
20738
  put: async (hash, data) => {
20659
20739
  if (await transactionStore.has(hash))
@@ -20665,7 +20745,7 @@ class Peernet {
20665
20745
  }
20666
20746
  async requestData(hash, store) {
20667
20747
  const providers = await this.providersFor(hash);
20668
- if (!providers || providers && Object.keys(providers).length === 0)
20748
+ if (!providers || (providers && Object.keys(providers).length === 0))
20669
20749
  throw nothingFoundError(hash);
20670
20750
  debug(`found ${Object.keys(providers).length} provider(s) for ${hash}`);
20671
20751
  // get closest peer on earth
@@ -20676,7 +20756,10 @@ class Peernet {
20676
20756
  const id = closestPeer.id;
20677
20757
  const peer = this.#connections[id];
20678
20758
  if (peer?.connected) {
20679
- let data = await new globalThis.peernet.protos['peernet-data']({ hash, store: store?.name || store });
20759
+ let data = await new globalThis.peernet.protos["peernet-data"]({
20760
+ hash,
20761
+ store: store?.name || store,
20762
+ });
20680
20763
  const node = await this.prepareMessage(data);
20681
20764
  if (peer)
20682
20765
  data = await peer.request(node.encoded);
@@ -20715,7 +20798,7 @@ class Peernet {
20715
20798
  const message = await messageStore.has(hash);
20716
20799
  if (message)
20717
20800
  return await messageStore.get(hash);
20718
- return this.requestData(hash, 'message');
20801
+ return this.requestData(hash, "message");
20719
20802
  },
20720
20803
  /**
20721
20804
  * put message content
@@ -20743,7 +20826,7 @@ class Peernet {
20743
20826
  const data = await dataStore.has(hash);
20744
20827
  if (data)
20745
20828
  return await dataStore.get(hash);
20746
- return this.requestData(hash, 'data');
20829
+ return this.requestData(hash, "data");
20747
20830
  },
20748
20831
  /**
20749
20832
  * put data content
@@ -20771,7 +20854,7 @@ class Peernet {
20771
20854
  const data = await dataStore.has(hash);
20772
20855
  if (data)
20773
20856
  return await dataStore.get(hash);
20774
- return this.requestData(hash, 'data');
20857
+ return this.requestData(hash, "data");
20775
20858
  },
20776
20859
  /**
20777
20860
  * put data content
@@ -20790,12 +20873,15 @@ class Peernet {
20790
20873
  async addFolder(files) {
20791
20874
  const links = [];
20792
20875
  for (const file of files) {
20793
- const fileNode = await new globalThis.peernet.protos['peernet-file'](file);
20876
+ const fileNode = await new globalThis.peernet.protos["peernet-file"](file);
20794
20877
  const hash = await fileNode.hash;
20795
20878
  await dataStore.put(hash, fileNode.encoded);
20796
20879
  links.push({ hash, path: file.path });
20797
20880
  }
20798
- const node = await new globalThis.peernet.protos['peernet-file']({ path: '/', links });
20881
+ const node = await new globalThis.peernet.protos["peernet-file"]({
20882
+ path: "/",
20883
+ links,
20884
+ });
20799
20885
  const hash = await node.hash;
20800
20886
  await dataStore.put(hash, node.encoded);
20801
20887
  return hash;
@@ -20803,8 +20889,10 @@ class Peernet {
20803
20889
  async ls(hash, options) {
20804
20890
  let data;
20805
20891
  const has = await dataStore.has(hash);
20806
- data = has ? await dataStore.get(hash) : await this.requestData(hash, 'data');
20807
- const node = await new peernet.protos['peernet-file'](data);
20892
+ data = has
20893
+ ? await dataStore.get(hash)
20894
+ : await this.requestData(hash, "data");
20895
+ const node = await new peernet.protos["peernet-file"](data);
20808
20896
  await node.decode();
20809
20897
  console.log(data);
20810
20898
  const paths = [];
@@ -20820,8 +20908,10 @@ class Peernet {
20820
20908
  async cat(hash, options) {
20821
20909
  let data;
20822
20910
  const has = await dataStore.has(hash);
20823
- data = has ? await dataStore.get(hash) : await this.requestData(hash, 'data');
20824
- const node = await new peernet.protos['peernet-file'](data);
20911
+ data = has
20912
+ ? await dataStore.get(hash)
20913
+ : await this.requestData(hash, "data");
20914
+ const node = await new peernet.protos["peernet-file"](data);
20825
20915
  if (node.decoded?.links.length > 0)
20826
20916
  throw new Error(`${hash} is a directory`);
20827
20917
  if (options?.pin)
@@ -20859,7 +20949,7 @@ class Peernet {
20859
20949
  store = globalThis[`${store}Store`];
20860
20950
  if (!store)
20861
20951
  store = await this.whichStore([...this.stores], hash);
20862
- if (store && await store.has(hash))
20952
+ if (store && (await store.has(hash)))
20863
20953
  data = await store.get(hash);
20864
20954
  if (data)
20865
20955
  return data;
@@ -20872,7 +20962,7 @@ class Peernet {
20872
20962
  * @param {Buffer} data
20873
20963
  * @param {String} storeName - storeName to access
20874
20964
  */
20875
- async put(hash, data, storeName = 'data') {
20965
+ async put(hash, data, storeName = "data") {
20876
20966
  const store = globalThis[`${storeName}Store`];
20877
20967
  return store.put(hash, data);
20878
20968
  }
@@ -20895,7 +20985,7 @@ class Peernet {
20895
20985
  async publish(topic, data) {
20896
20986
  // globalSub.publish(topic, data)
20897
20987
  const id = Math.random().toString(36).slice(-12);
20898
- data = await new globalThis.peernet.protos['peernet-ps']({ data, topic });
20988
+ data = await new globalThis.peernet.protos["peernet-ps"]({ data, topic });
20899
20989
  for (const [peerId, peer] of Object.entries(this.#connections)) {
20900
20990
  if (peerId !== this.id) {
20901
20991
  const node = await this.prepareMessage(data);
@@ -20917,7 +21007,7 @@ class Peernet {
20917
21007
  globalSub.subscribe(topic, callback);
20918
21008
  }
20919
21009
  async removePeer(peer) {
20920
- console.log('removepeer', peer.id);
21010
+ console.log("removepeer", peer.id);
20921
21011
  const id = peer.id;
20922
21012
  await this.client._removePeer(peer);
20923
21013
  if (this.client.peers[id]) {
@@ -20925,7 +21015,7 @@ class Peernet {
20925
21015
  // if (this.client.peers[id][connection].connected === false) delete this.client.peers[id][connection]
20926
21016
  // @ts-ignore
20927
21017
  if (this.client.peers[id][connection].connected)
20928
- return this.client.emit('peerconnect', connection);
21018
+ return this.client.emit("peerconnect", connection);
20929
21019
  }
20930
21020
  }
20931
21021
  }