@leofcoin/chain 1.0.25 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (131) hide show
  1. package/demo/151.browser.js +271 -0
  2. package/demo/205.browser.js +215 -0
  3. package/demo/427.browser.js +8092 -0
  4. package/demo/560.browser.js +3 -0
  5. package/demo/911.browser.js +11024 -0
  6. package/{dist → demo}/chain.browser.js +6765 -24141
  7. package/demo/index.html +4 -4
  8. package/demo/main.browser.js +8163 -0
  9. package/{dist → demo}/node.browser.js +3157 -2582
  10. package/{dist → demo}/pako.browser.js +0 -0
  11. package/demo/peernet-worker.browser.js +11330 -0
  12. package/demo/workers/machine-worker.js +12544 -0
  13. package/{dist → demo}/wrtc.browser.js +0 -0
  14. package/dist/chain.js +253 -141
  15. package/dist/module/chain.js +1205 -0
  16. package/dist/module/node.js +1 -0
  17. package/dist/module/workers/machine-worker.js +495 -0
  18. package/dist/node.js +1 -1
  19. package/package.json +11 -19
  20. package/rollup.config.js +87 -3
  21. package/src/chain.js +113 -64
  22. package/src/machine.js +96 -57
  23. package/src/node.js +3 -3
  24. package/src/workers/block-worker.js +71 -0
  25. package/src/workers/machine-worker.js +164 -0
  26. package/src/workers/pool-worker.js +37 -0
  27. package/src/workers/transaction-worker.js +26 -0
  28. package/test/chain.js +29 -25
  29. package/test/create-genesis.js +13 -5
  30. package/webpack.config.js +49 -6
  31. package/workers/block-worker.js +1 -0
  32. package/workers/machine-worker.js +1 -0
  33. package/workers/pool-worker.js +1 -0
  34. package/workers/transaction-worker.js +1 -0
  35. package/dist/protons.browser.js +0 -11429
  36. package/docs/@leofcoin/chain/1.0.22/chain.js.html +0 -891
  37. package/docs/@leofcoin/chain/1.0.22/contracts_factory.js.html +0 -182
  38. package/docs/@leofcoin/chain/1.0.22/contracts_nameService.js.html +0 -231
  39. package/docs/@leofcoin/chain/1.0.22/contracts_proxies_factoryProxy.js.html +0 -135
  40. package/docs/@leofcoin/chain/1.0.22/contracts_proxies_nameServiceProxy.js.html +0 -135
  41. package/docs/@leofcoin/chain/1.0.22/contracts_proxies_nativeTokenProxy.js.html +0 -135
  42. package/docs/@leofcoin/chain/1.0.22/contracts_proxies_validatorsProxy.js.html +0 -135
  43. package/docs/@leofcoin/chain/1.0.22/contracts_proxies_votingProxy.js.html +0 -135
  44. package/docs/@leofcoin/chain/1.0.22/contracts_validators.js.html +0 -242
  45. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-Bold-webfont.eot +0 -0
  46. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-Bold-webfont.svg +0 -1830
  47. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-Bold-webfont.woff +0 -0
  48. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
  49. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-BoldItalic-webfont.svg +0 -1830
  50. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
  51. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-Italic-webfont.eot +0 -0
  52. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-Italic-webfont.svg +0 -1830
  53. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-Italic-webfont.woff +0 -0
  54. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-Light-webfont.eot +0 -0
  55. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-Light-webfont.svg +0 -1831
  56. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-Light-webfont.woff +0 -0
  57. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-LightItalic-webfont.eot +0 -0
  58. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-LightItalic-webfont.svg +0 -1835
  59. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-LightItalic-webfont.woff +0 -0
  60. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-Regular-webfont.eot +0 -0
  61. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-Regular-webfont.svg +0 -1831
  62. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-Regular-webfont.woff +0 -0
  63. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-Semibold-webfont.eot +0 -0
  64. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-Semibold-webfont.svg +0 -1830
  65. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-Semibold-webfont.ttf +0 -0
  66. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-Semibold-webfont.woff +0 -0
  67. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-SemiboldItalic-webfont.eot +0 -0
  68. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-SemiboldItalic-webfont.svg +0 -1830
  69. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-SemiboldItalic-webfont.ttf +0 -0
  70. package/docs/@leofcoin/chain/1.0.22/fonts/OpenSans-SemiboldItalic-webfont.woff +0 -0
  71. package/docs/@leofcoin/chain/1.0.22/global.html +0 -1805
  72. package/docs/@leofcoin/chain/1.0.22/icons/home.svg +0 -4
  73. package/docs/@leofcoin/chain/1.0.22/icons/search.svg +0 -4
  74. package/docs/@leofcoin/chain/1.0.22/index.html +0 -125
  75. package/docs/@leofcoin/chain/1.0.22/machine.js.html +0 -255
  76. package/docs/@leofcoin/chain/1.0.22/scripts/linenumber.js +0 -23
  77. package/docs/@leofcoin/chain/1.0.22/scripts/pagelocation.js +0 -89
  78. package/docs/@leofcoin/chain/1.0.22/standards_roles.js.html +0 -188
  79. package/docs/@leofcoin/chain/1.0.22/standards_token.js.html +0 -260
  80. package/docs/@leofcoin/chain/1.0.22/styles/collapse.css +0 -27
  81. package/docs/@leofcoin/chain/1.0.22/styles/jsdoc-default.css +0 -953
  82. package/docs/@leofcoin/chain/1.0.22/styles/prettify-jsdoc.css +0 -111
  83. package/docs/@leofcoin/chain/1.0.22/styles/prettify-tomorrow.css +0 -138
  84. package/docs/@leofcoin/chain/1.0.24/chain.js.html +0 -891
  85. package/docs/@leofcoin/chain/1.0.24/contracts_factory.js.html +0 -182
  86. package/docs/@leofcoin/chain/1.0.24/contracts_nameService.js.html +0 -231
  87. package/docs/@leofcoin/chain/1.0.24/contracts_proxies_factoryProxy.js.html +0 -135
  88. package/docs/@leofcoin/chain/1.0.24/contracts_proxies_nameServiceProxy.js.html +0 -135
  89. package/docs/@leofcoin/chain/1.0.24/contracts_proxies_nativeTokenProxy.js.html +0 -135
  90. package/docs/@leofcoin/chain/1.0.24/contracts_proxies_validatorsProxy.js.html +0 -135
  91. package/docs/@leofcoin/chain/1.0.24/contracts_proxies_votingProxy.js.html +0 -135
  92. package/docs/@leofcoin/chain/1.0.24/contracts_validators.js.html +0 -242
  93. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-Bold-webfont.eot +0 -0
  94. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-Bold-webfont.svg +0 -1830
  95. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-Bold-webfont.woff +0 -0
  96. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-BoldItalic-webfont.eot +0 -0
  97. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-BoldItalic-webfont.svg +0 -1830
  98. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-BoldItalic-webfont.woff +0 -0
  99. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-Italic-webfont.eot +0 -0
  100. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-Italic-webfont.svg +0 -1830
  101. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-Italic-webfont.woff +0 -0
  102. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-Light-webfont.eot +0 -0
  103. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-Light-webfont.svg +0 -1831
  104. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-Light-webfont.woff +0 -0
  105. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-LightItalic-webfont.eot +0 -0
  106. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-LightItalic-webfont.svg +0 -1835
  107. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-LightItalic-webfont.woff +0 -0
  108. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-Regular-webfont.eot +0 -0
  109. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-Regular-webfont.svg +0 -1831
  110. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-Regular-webfont.woff +0 -0
  111. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-Semibold-webfont.eot +0 -0
  112. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-Semibold-webfont.svg +0 -1830
  113. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-Semibold-webfont.ttf +0 -0
  114. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-Semibold-webfont.woff +0 -0
  115. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-SemiboldItalic-webfont.eot +0 -0
  116. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-SemiboldItalic-webfont.svg +0 -1830
  117. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-SemiboldItalic-webfont.ttf +0 -0
  118. package/docs/@leofcoin/chain/1.0.24/fonts/OpenSans-SemiboldItalic-webfont.woff +0 -0
  119. package/docs/@leofcoin/chain/1.0.24/global.html +0 -1805
  120. package/docs/@leofcoin/chain/1.0.24/icons/home.svg +0 -4
  121. package/docs/@leofcoin/chain/1.0.24/icons/search.svg +0 -4
  122. package/docs/@leofcoin/chain/1.0.24/index.html +0 -125
  123. package/docs/@leofcoin/chain/1.0.24/machine.js.html +0 -255
  124. package/docs/@leofcoin/chain/1.0.24/scripts/linenumber.js +0 -23
  125. package/docs/@leofcoin/chain/1.0.24/scripts/pagelocation.js +0 -89
  126. package/docs/@leofcoin/chain/1.0.24/standards_roles.js.html +0 -188
  127. package/docs/@leofcoin/chain/1.0.24/standards_token.js.html +0 -260
  128. package/docs/@leofcoin/chain/1.0.24/styles/collapse.css +0 -27
  129. package/docs/@leofcoin/chain/1.0.24/styles/jsdoc-default.css +0 -953
  130. package/docs/@leofcoin/chain/1.0.24/styles/prettify-jsdoc.css +0 -111
  131. package/docs/@leofcoin/chain/1.0.24/styles/prettify-tomorrow.css +0 -138
@@ -0,0 +1,1205 @@
1
+ import { BigNumber, formatUnits, parseUnits } from '@leofcoin/utils';
2
+ import { FormatInterface } from '@leofcoin/codec-format-interface';
3
+ import _BN from 'bn.js';
4
+ import '@ethersproject/bytes';
5
+ import { Logger } from '@ethersproject/logger';
6
+ import '@ethersproject/bignumber';
7
+ import { MessageChannel } from 'worker_threads';
8
+ import { randomBytes } from 'crypto';
9
+ import 'path';
10
+ import { fork } from 'child_process';
11
+ import 'express';
12
+ import MultiWallet from '@leofcoin/multi-wallet';
13
+ import { CodecHash } from '@leofcoin/codec-format-interface/dist/index';
14
+ import bs32 from '@vandeurenglenn/base32';
15
+
16
+ var proto$4 = `
17
+ message ContractMessage {
18
+ required string creator = 1;
19
+ required bytes contract = 2;
20
+ repeated string constructorParameters = 3;
21
+ }
22
+ `;
23
+
24
+ class ContractMessage extends FormatInterface {
25
+ get keys() {
26
+ return ['creator', 'contract', 'constructorParameters']
27
+ }
28
+
29
+ get messageName() {
30
+ return 'ContractMessage'
31
+ }
32
+
33
+ constructor(buffer) {
34
+ super(buffer, proto$4, {name: 'contract-message'});
35
+ }
36
+ }
37
+
38
+ var proto$3 = `
39
+
40
+ message TransactionMessage {
41
+ required uint64 timestamp = 1;
42
+ required string from = 2;
43
+ required string to = 3;
44
+ required uint64 nonce = 4;
45
+ required string method = 5;
46
+ repeated string params = 6;
47
+ required string signature = 7;
48
+ }
49
+ `;
50
+
51
+ class TransactionMessage extends FormatInterface {
52
+ get keys() {
53
+ return ['timestamp', 'from', 'to', 'nonce', 'method', 'params', 'signature']
54
+ }
55
+
56
+ get messageName() {
57
+ return 'TransactionMessage'
58
+ }
59
+
60
+ constructor(buffer) {
61
+ const name = 'transaction-message';
62
+ super(buffer, proto$3, {name});
63
+ }
64
+ }
65
+
66
+ var proto$2 = `
67
+ message ValidatorMessage {
68
+ required string address = 1;
69
+ required string reward = 2;
70
+ }
71
+
72
+ message Transaction {
73
+ required string hash = 1;
74
+ required uint64 timestamp = 2;
75
+ required string from = 3;
76
+ required string to = 4;
77
+ required uint64 nonce = 5;
78
+ required string method = 6;
79
+ repeated string params = 7;
80
+ }
81
+
82
+ message BlockMessage {
83
+ required uint64 index = 1;
84
+ required string previousHash = 3;
85
+ required uint64 timestamp = 4;
86
+ required uint64 reward = 5;
87
+ required string fees = 6;
88
+ repeated Transaction transactions = 7;
89
+ repeated ValidatorMessage validators = 8;
90
+ }
91
+ `;
92
+
93
+ class BlockMessage extends FormatInterface {
94
+ get keys() {
95
+ return ['index', 'previousHash', 'timestamp', 'reward', 'fees', 'transactions', 'validators']
96
+ }
97
+
98
+ get messageName() {
99
+ return 'BlockMessage'
100
+ }
101
+
102
+ constructor(buffer) {
103
+ const name = 'block-message';
104
+ super(buffer, proto$2, {name});
105
+ }
106
+ }
107
+
108
+ var proto$1 = `
109
+
110
+ message BWMessage {
111
+ required uint64 up = 1;
112
+ required uint64 down = 2;
113
+ }
114
+ `;
115
+
116
+ class BWMessage extends FormatInterface {
117
+ get keys() {
118
+ return ['up', 'down']
119
+ }
120
+
121
+ get messageName() {
122
+ return 'BWMessage'
123
+ }
124
+
125
+ constructor(buffer) {
126
+ const name = 'bw-message';
127
+ super(buffer, proto$1, {name});
128
+ }
129
+ }
130
+
131
+ var proto = `
132
+
133
+ message BWRequestMessage {
134
+ }
135
+ `;
136
+
137
+ class BWRequestMessage extends FormatInterface {
138
+ get keys() {
139
+ return []
140
+ }
141
+
142
+ get messageName() {
143
+ return 'BWRequestMessage'
144
+ }
145
+
146
+ constructor(buffer) {
147
+ const name = 'bw-request-message';
148
+ super(buffer, proto, {name});
149
+ }
150
+ }
151
+
152
+ var contractFactory$2 = "ihny2gqgorwofhvfgtr5dm2targnxrul5rr4wnyk4vl7akbmwox43nlvpim";
153
+ var nativeToken$2 = "ihny2gqhe7gazkieey4o3rztfy757ia3as6snrmov4e3vkfdvt2olvx3ste";
154
+ var nameService$2 = "ihny2gqgztuego4qkbcaqp5ttunly3j3f5vehe65txord7r7osv7xrqxbl6";
155
+ var validators$2 = "ihny2gqhlmubrvkl3ixyfadompvfiinvwthi43wpt4qdfj767nhpyjlnwin";
156
+ var addresses = {
157
+ contractFactory: contractFactory$2,
158
+ nativeToken: nativeToken$2,
159
+ nameService: nameService$2,
160
+ validators: validators$2
161
+ };
162
+
163
+ const contractFactory$1 = addresses.contractFactory;
164
+ const nameService$1 = addresses.nameService;
165
+ const nativeToken$1 = addresses.nativeToken;
166
+ const validators$1 = addresses.validators;
167
+
168
+ const version$1 = "bignumber/5.6.2";
169
+
170
+ _BN.BN;
171
+ new Logger(version$1);
172
+
173
+ const version = "units/5.6.1";
174
+
175
+ new Logger(version);
176
+
177
+ const byteFormats = ['Bytes', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'];
178
+
179
+ const formatBytes = (bytes, decimals = 2) => {
180
+ if (bytes === 0) return '0 Bytes';
181
+ if (decimals < 0) decimals = 0;
182
+
183
+ const k = 1024;
184
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
185
+
186
+ return `${parseFloat((bytes / Math.pow(k, i)).toFixed(decimals))} ${byteFormats[i]}`
187
+ };
188
+
189
+ // import State from './state'
190
+ new MessageChannel();
191
+ class Machine {
192
+ #contracts = {}
193
+ #nonces = {}
194
+ constructor() {
195
+ return this.#init()
196
+ }
197
+
198
+ #createMessage(sender = peernet.id) {
199
+ return {
200
+ sender,
201
+ call: this.execute,
202
+ staticCall: this.get.bind(this)
203
+ }
204
+ }
205
+
206
+ async #onmessage(data) {
207
+ switch (data.type) {
208
+ case 'contractError':
209
+ console.warn(`removing contract ${await data.hash}`);
210
+ await contractStore.delete(await data.hash);
211
+ break
212
+
213
+ case 'executionError':
214
+ // console.warn(`error executing transaction ${data.message}`);
215
+ pubsub.publish(data.id, {error: data.message});
216
+ break
217
+
218
+ case 'debug':
219
+ data.messages.forEach(message => debug(message));
220
+ break
221
+ case 'machine-ready':
222
+ pubsub.publish('machine.ready');
223
+ break
224
+ case 'response':
225
+ pubsub.publish(data.id, data.value);
226
+ break
227
+ }
228
+
229
+ }
230
+
231
+ async #init() {
232
+ return new Promise(async (resolve) => {
233
+ // this.worker = new Worker('./workers/machine-worker.js')
234
+ // this.worker.onmessage = this.#onmessage.bind(this)
235
+
236
+ pubsub.subscribe('machine.ready', () => {
237
+ resolve(this);
238
+ });
239
+ this.worker = fork('./workers/machine-worker.js', {serialization: 'advanced'});
240
+ this.worker.on('message', this.#onmessage.bind(this));
241
+ const blocks = await blockStore.values();
242
+ const contracts = await Promise.all([
243
+ contractStore.get(contractFactory$1),
244
+ contractStore.get(nativeToken$1),
245
+ contractStore.get(validators$1),
246
+ contractStore.get(nameService$1)
247
+ ]);
248
+
249
+ const message = {
250
+ type: 'init',
251
+ input: {
252
+ contracts,
253
+ blocks,
254
+ peerid: peernet.peerId
255
+ }
256
+ };
257
+ this.worker.send(message);
258
+ // this.worker.postMessage(message)
259
+ })
260
+ // return
261
+
262
+ }
263
+
264
+ async #runContract(contractMessage) {
265
+ const params = contractMessage.decoded.constructorParameters;
266
+ try {
267
+
268
+ const func = new Function(contractMessage.decoded.contract);
269
+ const Contract = func();
270
+
271
+ globalThis.msg = this.#createMessage(contractMessage.decoded.creator);
272
+ // globalThis.msg = {sender: contractMessage.decoded.creator}
273
+ this.#contracts[await contractMessage.hash] = await new Contract(...params);
274
+ debug(`loaded contract: ${await contractMessage.hash}`);
275
+ debug(`size: ${formatBytes(contractMessage.encoded.length)}`);
276
+ } catch (e) {
277
+ console.log(e);
278
+ console.warn(`removing contract ${await contractMessage.hash}`);
279
+ await contractStore.delete(await contractMessage.hash, contractMessage.encoded);
280
+ }
281
+ }
282
+ /**
283
+ * @params {ContractMessage} - contractMessage
284
+ */
285
+ async addContract(contractMessage) {
286
+ if (!await contractStore.has(contractMessage.hash)) {
287
+ await contractStore.put(contractMessage.hash, contractMessage.encoded);
288
+ await this.#runContract(contractMessage);
289
+ return contractMessage.hash
290
+ }
291
+ throw new Error('duplicate contract')
292
+ }
293
+
294
+ async execute(contract, method, params) {
295
+ return new Promise((resolve, reject) => {
296
+ const id = randomBytes(20).toString('hex');
297
+ const message = message => {
298
+ if (message?.error) reject(message.error);
299
+ else resolve(message);
300
+ };
301
+ pubsub.subscribe(id, message);
302
+ this.worker.send({
303
+ type: 'execute',
304
+ id,
305
+ input: {
306
+ contract,
307
+ method,
308
+ params
309
+ }
310
+ });
311
+ })
312
+
313
+ }
314
+
315
+ addJob(contract, method, params, from, nonce) {
316
+ if (!this.#nonces[from]) this.#nonces[from] = nonce;
317
+ if (nonce === this.#nonces[from] + 1) return this.#contracts[contract][method](...params)
318
+ // return setTimeout(() => {
319
+ // return this.addJob(contract, method, params, from, nonce)
320
+ // }, 50)
321
+ }
322
+
323
+ get(contract, method, params) {
324
+ return new Promise((resolve, reject) => {
325
+ const id = randomBytes(20).toString();
326
+ const message = message => {
327
+ resolve(message);
328
+ };
329
+ pubsub.subscribe(id, message);
330
+ this.worker.send({
331
+ type: 'get',
332
+ id,
333
+ input: {
334
+ contract,
335
+ method,
336
+ params
337
+ }
338
+ });
339
+ })
340
+ }
341
+
342
+ async delete(hash) {
343
+ return contractStore.delete(hash)
344
+ }
345
+
346
+ async deleteAll() {
347
+ let hashes = await contractStore.get();
348
+ hashes = Object.keys(hashes).map(hash => this.delete(hash));
349
+ return Promise.all(hashes)
350
+ }
351
+ }
352
+
353
+ var contractFactory = "237,198,141,3,123,34,99,114,101,97,116,111,114,34,58,34,51,67,122,86,51,66,98,76,103,117,57,105,55,119,70,115,83,101,82,101,90,113,110,80,111,53,82,114,121,49,118,81,98,82,115,89,114,116,67,67,97,81,103,98,113,80,72,112,116,117,85,111,72,52,34,44,34,99,111,110,116,114,97,99,116,34,58,34,114,101,116,117,114,110,32,99,108,97,115,115,32,70,97,99,116,111,114,121,123,35,110,97,109,101,61,92,34,65,114,116,79,110,108,105,110,101,67,111,110,116,114,97,99,116,70,97,99,116,111,114,121,92,34,59,35,116,111,116,97,108,67,111,110,116,114,97,99,116,115,61,48,59,35,99,111,110,116,114,97,99,116,115,61,91,93,59,99,111,110,115,116,114,117,99,116,111,114,40,115,116,97,116,101,41,123,115,116,97,116,101,38,38,40,116,104,105,115,46,35,99,111,110,116,114,97,99,116,115,61,115,116,97,116,101,46,99,111,110,116,114,97,99,116,115,44,116,104,105,115,46,35,116,111,116,97,108,67,111,110,116,114,97,99,116,115,61,115,116,97,116,101,46,116,111,116,97,108,67,111,110,116,114,97,99,116,115,41,125,103,101,116,32,115,116,97,116,101,40,41,123,114,101,116,117,114,110,123,116,111,116,97,108,67,111,110,116,114,97,99,116,115,58,116,104,105,115,46,35,116,111,116,97,108,67,111,110,116,114,97,99,116,115,44,99,111,110,116,114,97,99,116,115,58,116,104,105,115,46,35,99,111,110,116,114,97,99,116,115,125,125,103,101,116,32,110,97,109,101,40,41,123,114,101,116,117,114,110,32,116,104,105,115,46,35,110,97,109,101,125,103,101,116,32,99,111,110,116,114,97,99,116,115,40,41,123,114,101,116,117,114,110,91,46,46,46,116,104,105,115,46,35,99,111,110,116,114,97,99,116,115,93,125,103,101,116,32,116,111,116,97,108,67,111,110,116,114,97,99,116,115,40,41,123,114,101,116,117,114,110,32,116,104,105,115,46,35,116,111,116,97,108,67,111,110,116,114,97,99,116,115,125,105,115,118,97,108,105,100,40,104,97,115,104,44,99,114,101,97,116,111,114,44,99,111,110,116,114,97,99,116,44,99,111,110,115,116,114,117,99,116,111,114,80,97,114,97,109,101,116,101,114,115,61,91,93,41,123,99,111,110,115,116,32,109,101,115,115,97,103,101,61,110,101,119,32,67,111,110,116,114,97,99,116,77,101,115,115,97,103,101,40,123,99,114,101,97,116,111,114,58,99,114,101,97,116,111,114,44,99,111,110,116,114,97,99,116,58,99,111,110,116,114,97,99,116,44,99,111,110,115,116,114,117,99,116,111,114,80,97,114,97,109,101,116,101,114,115,58,99,111,110,115,116,114,117,99,116,111,114,80,97,114,97,109,101,116,101,114,115,125,41,59,114,101,116,117,114,110,32,66,111,111,108,101,97,110,40,109,101,115,115,97,103,101,46,104,97,115,104,61,61,61,104,97,115,104,41,125,97,115,121,110,99,32,100,101,112,108,111,121,67,111,110,116,114,97,99,116,40,99,111,110,116,114,97,99,116,72,97,115,104,44,99,114,101,97,116,111,114,44,99,111,110,116,114,97,99,116,44,99,111,110,115,116,114,117,99,116,111,114,80,97,114,97,109,101,116,101,114,115,61,91,93,41,123,105,102,40,99,111,110,116,114,97,99,116,46,99,114,101,97,116,111,114,33,61,61,109,115,103,46,115,101,110,100,101,114,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,111,110,108,121,32,97,32,99,111,110,116,114,97,99,116,32,99,114,101,97,116,111,114,32,99,97,110,32,100,101,112,108,111,121,32,97,32,99,111,110,116,114,97,99,116,92,34,41,59,105,102,40,97,119,97,105,116,32,99,111,110,116,114,97,99,116,83,116,111,114,101,46,104,97,115,40,104,97,115,104,41,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,100,117,112,108,105,99,97,116,101,32,99,111,110,116,114,97,99,116,92,34,41,59,105,102,40,33,116,104,105,115,46,105,115,86,97,108,105,100,40,99,111,110,116,114,97,99,116,72,97,115,104,44,99,114,101,97,116,111,114,44,99,111,110,116,114,97,99,116,44,99,111,110,115,116,114,117,99,116,111,114,80,97,114,97,109,101,116,101,114,115,41,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,105,110,118,97,108,105,100,32,99,111,110,116,114,97,99,116,92,34,41,59,97,119,97,105,116,32,99,111,110,116,114,97,99,116,83,116,111,114,101,46,112,117,116,40,104,97,115,104,44,101,110,99,111,100,101,100,41,44,116,104,105,115,46,35,116,111,116,97,108,67,111,110,116,114,97,99,116,115,43,61,49,44,116,104,105,115,46,35,99,111,110,116,114,97,99,116,115,46,112,117,115,104,40,104,97,115,104,41,125,125,59,92,110,34,44,34,99,111,110,115,116,114,117,99,116,111,114,80,97,114,97,109,101,116,101,114,115,34,58,91,93,125";
354
+ var nativeToken = "237,198,141,3,123,34,99,114,101,97,116,111,114,34,58,34,51,67,122,86,51,66,98,76,103,117,57,105,55,119,70,115,83,101,82,101,90,113,110,80,111,53,82,114,121,49,118,81,98,82,115,89,114,116,67,67,97,81,103,98,113,80,72,112,116,117,85,111,72,52,34,44,34,99,111,110,116,114,97,99,116,34,58,34,114,101,116,117,114,110,32,99,108,97,115,115,32,65,114,116,79,110,108,105,110,101,32,101,120,116,101,110,100,115,32,99,108,97,115,115,32,84,111,107,101,110,32,101,120,116,101,110,100,115,32,99,108,97,115,115,32,82,111,108,101,115,123,35,114,111,108,101,115,61,123,79,87,78,69,82,58,91,93,44,77,73,78,84,58,91,93,44,66,85,82,78,58,91,93,125,59,99,111,110,115,116,114,117,99,116,111,114,40,114,111,108,101,115,41,123,105,102,40,114,111,108,101,115,41,123,105,102,40,33,40,114,111,108,101,115,32,105,110,115,116,97,110,99,101,111,102,32,79,98,106,101,99,116,41,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,101,120,112,101,99,116,101,100,32,114,111,108,101,115,32,116,111,32,98,101,32,97,110,32,111,98,106,101,99,116,92,34,41,59,116,104,105,115,46,35,114,111,108,101,115,61,123,46,46,46,114,111,108,101,115,44,46,46,46,116,104,105,115,46,35,114,111,108,101,115,125,125,101,108,115,101,32,116,104,105,115,46,35,103,114,97,110,116,82,111,108,101,40,109,115,103,46,115,101,110,100,101,114,44,92,34,79,87,78,69,82,92,34,41,125,103,101,116,32,115,116,97,116,101,40,41,123,114,101,116,117,114,110,123,114,111,108,101,115,58,116,104,105,115,46,114,111,108,101,115,125,125,103,101,116,32,114,111,108,101,115,40,41,123,114,101,116,117,114,110,123,46,46,46,116,104,105,115,46,35,114,111,108,101,115,125,125,104,97,115,82,111,108,101,40,97,100,100,114,101,115,115,44,114,111,108,101,41,123,114,101,116,117,114,110,33,33,116,104,105,115,46,35,114,111,108,101,115,91,114,111,108,101,93,38,38,45,49,33,61,61,116,104,105,115,46,35,114,111,108,101,115,91,114,111,108,101,93,46,105,110,100,101,120,79,102,40,97,100,100,114,101,115,115,41,125,35,103,114,97,110,116,82,111,108,101,40,97,100,100,114,101,115,115,44,114,111,108,101,41,123,105,102,40,116,104,105,115,46,104,97,115,82,111,108,101,40,97,100,100,114,101,115,115,44,114,111,108,101,41,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,36,123,114,111,108,101,125,32,114,111,108,101,32,97,108,114,101,97,100,121,32,103,114,97,110,116,101,100,32,102,111,114,32,36,123,97,100,100,114,101,115,115,125,96,41,59,116,104,105,115,46,35,114,111,108,101,115,91,114,111,108,101,93,46,112,117,115,104,40,97,100,100,114,101,115,115,41,125,35,114,101,118,111,107,101,82,111,108,101,40,97,100,100,114,101,115,115,44,114,111,108,101,41,123,105,102,40,33,116,104,105,115,46,104,97,115,82,111,108,101,40,97,100,100,114,101,115,115,44,114,111,108,101,41,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,36,123,114,111,108,101,125,32,114,111,108,101,32,97,108,114,101,97,100,121,32,114,101,118,111,107,101,100,32,102,111,114,32,36,123,97,100,100,114,101,115,115,125,96,41,59,105,102,40,92,34,79,87,78,69,82,92,34,61,61,61,114,111,108,101,38,38,49,61,61,61,116,104,105,115,46,35,114,111,108,101,115,91,114,111,108,101,93,46,108,101,110,103,116,104,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,97,116,108,101,97,115,116,32,111,110,101,32,111,119,110,101,114,32,105,115,32,110,101,101,100,101,100,33,92,34,41,59,116,104,105,115,46,35,114,111,108,101,115,91,114,111,108,101,93,46,115,112,108,105,99,101,40,116,104,105,115,46,35,114,111,108,101,115,91,114,111,108,101,93,46,105,110,100,101,120,79,102,40,97,100,100,114,101,115,115,41,41,125,103,114,97,110,116,82,111,108,101,40,97,100,100,114,101,115,115,44,114,111,108,101,41,123,105,102,40,33,116,104,105,115,46,104,97,115,82,111,108,101,40,97,100,100,114,101,115,115,44,92,34,79,87,78,69,82,92,34,41,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,78,111,116,32,97,108,108,111,119,101,100,92,34,41,59,116,104,105,115,46,35,103,114,97,110,116,82,111,108,101,40,97,100,100,114,101,115,115,44,114,111,108,101,41,125,114,101,118,111,107,101,82,111,108,101,40,97,100,100,114,101,115,115,44,114,111,108,101,41,123,105,102,40,33,116,104,105,115,46,104,97,115,82,111,108,101,40,97,100,100,114,101,115,115,44,92,34,79,87,78,69,82,92,34,41,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,78,111,116,32,97,108,108,111,119,101,100,92,34,41,59,116,104,105,115,46,35,114,101,118,111,107,101,82,111,108,101,40,97,100,100,114,101,115,115,44,114,111,108,101,41,125,125,123,35,110,97,109,101,59,35,115,121,109,98,111,108,59,35,104,111,108,100,101,114,115,61,48,59,35,98,97,108,97,110,99,101,115,61,123,125,59,35,97,112,112,114,111,118,97,108,115,61,123,125,59,35,100,101,99,105,109,97,108,115,61,49,56,59,35,116,111,116,97,108,83,117,112,112,108,121,61,66,105,103,78,117,109,98,101,114,46,102,114,111,109,40,48,41,59,99,111,110,115,116,114,117,99,116,111,114,40,110,97,109,101,44,115,121,109,98,111,108,44,100,101,99,105,109,97,108,115,61,49,56,44,115,116,97,116,101,41,123,105,102,40,33,110,97,109,101,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,110,97,109,101,32,117,110,100,101,102,105,110,101,100,92,34,41,59,105,102,40,33,115,121,109,98,111,108,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,115,121,109,98,111,108,32,117,110,100,101,102,105,110,101,100,92,34,41,59,115,117,112,101,114,40,115,116,97,116,101,63,46,114,111,108,101,115,41,44,116,104,105,115,46,35,110,97,109,101,61,110,97,109,101,44,116,104,105,115,46,35,115,121,109,98,111,108,61,115,121,109,98,111,108,44,116,104,105,115,46,35,100,101,99,105,109,97,108,115,61,100,101,99,105,109,97,108,115,125,103,101,116,32,115,116,97,116,101,40,41,123,114,101,116,117,114,110,123,46,46,46,115,117,112,101,114,46,115,116,97,116,101,44,104,111,108,100,101,114,115,58,116,104,105,115,46,104,111,108,100,101,114,115,44,98,97,108,97,110,99,101,115,58,116,104,105,115,46,98,97,108,97,110,99,101,115,44,97,112,112,114,111,118,97,108,115,58,123,46,46,46,116,104,105,115,46,35,97,112,112,114,111,118,97,108,115,125,44,116,111,116,97,108,83,117,112,112,108,121,58,116,104,105,115,46,116,111,116,97,108,83,117,112,112,108,121,125,125,103,101,116,32,116,111,116,97,108,83,117,112,112,108,121,40,41,123,114,101,116,117,114,110,32,116,104,105,115,46,35,116,111,116,97,108,83,117,112,112,108,121,125,103,101,116,32,110,97,109,101,40,41,123,114,101,116,117,114,110,32,116,104,105,115,46,35,110,97,109,101,125,103,101,116,32,115,121,109,98,111,108,40,41,123,114,101,116,117,114,110,32,116,104,105,115,46,35,115,121,109,98,111,108,125,103,101,116,32,104,111,108,100,101,114,115,40,41,123,114,101,116,117,114,110,32,116,104,105,115,46,35,104,111,108,100,101,114,115,125,103,101,116,32,98,97,108,97,110,99,101,115,40,41,123,114,101,116,117,114,110,123,46,46,46,116,104,105,115,46,35,98,97,108,97,110,99,101,115,125,125,109,105,110,116,40,116,111,44,97,109,111,117,110,116,41,123,105,102,40,33,116,104,105,115,46,104,97,115,82,111,108,101,40,109,115,103,46,115,101,110,100,101,114,44,92,34,77,73,78,84,92,34,41,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,110,111,116,32,97,108,108,111,119,101,100,92,34,41,59,116,104,105,115,46,35,116,111,116,97,108,83,117,112,112,108,121,61,116,104,105,115,46,35,116,111,116,97,108,83,117,112,112,108,121,46,97,100,100,40,97,109,111,117,110,116,41,44,116,104,105,115,46,35,105,110,99,114,101,97,115,101,66,97,108,97,110,99,101,40,116,111,44,97,109,111,117,110,116,41,125,98,117,114,110,40,116,111,44,97,109,111,117,110,116,41,123,105,102,40,33,116,104,105,115,46,104,97,115,82,111,108,101,40,109,115,103,46,115,101,110,100,101,114,44,92,34,66,85,82,78,92,34,41,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,110,111,116,32,97,108,108,111,119,101,100,92,34,41,59,116,104,105,115,46,35,116,111,116,97,108,83,117,112,112,108,121,61,116,104,105,115,46,35,116,111,116,97,108,83,117,112,112,108,121,46,115,117,98,40,97,109,111,117,110,116,41,44,116,104,105,115,46,35,100,101,99,114,101,97,115,101,66,97,108,97,110,99,101,40,116,111,44,97,109,111,117,110,116,41,125,35,98,101,102,111,114,101,84,114,97,110,115,102,101,114,40,102,114,111,109,44,116,111,44,97,109,111,117,110,116,41,123,105,102,40,33,116,104,105,115,46,35,98,97,108,97,110,99,101,115,91,102,114,111,109,93,124,124,116,104,105,115,46,35,98,97,108,97,110,99,101,115,91,102,114,111,109,93,60,97,109,111,117,110,116,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,97,109,111,117,110,116,32,101,120,99,101,101,100,115,32,98,97,108,97,110,99,101,92,34,41,125,35,117,112,100,97,116,101,72,111,108,100,101,114,115,40,97,100,100,114,101,115,115,44,112,114,101,118,105,111,117,115,66,97,108,97,110,99,101,41,123,92,34,48,120,48,48,92,34,61,61,61,116,104,105,115,46,35,98,97,108,97,110,99,101,115,91,97,100,100,114,101,115,115,93,46,116,111,72,101,120,83,116,114,105,110,103,40,41,63,116,104,105,115,46,35,104,111,108,100,101,114,115,45,61,49,58,92,34,48,120,48,48,92,34,33,61,61,116,104,105,115,46,35,98,97,108,97,110,99,101,115,91,97,100,100,114,101,115,115,93,46,116,111,72,101,120,83,116,114,105,110,103,40,41,38,38,92,34,48,120,48,48,92,34,61,61,61,112,114,101,118,105,111,117,115,66,97,108,97,110,99,101,46,116,111,72,101,120,83,116,114,105,110,103,40,41,38,38,40,116,104,105,115,46,35,104,111,108,100,101,114,115,43,61,49,41,125,35,105,110,99,114,101,97,115,101,66,97,108,97,110,99,101,40,97,100,100,114,101,115,115,44,97,109,111,117,110,116,41,123,116,104,105,115,46,35,98,97,108,97,110,99,101,115,91,97,100,100,114,101,115,115,93,124,124,40,116,104,105,115,46,35,98,97,108,97,110,99,101,115,91,97,100,100,114,101,115,115,93,61,66,105,103,78,117,109,98,101,114,46,102,114,111,109,40,48,41,41,59,99,111,110,115,116,32,112,114,101,118,105,111,117,115,66,97,108,97,110,99,101,61,116,104,105,115,46,35,98,97,108,97,110,99,101,115,91,97,100,100,114,101,115,115,93,59,116,104,105,115,46,35,98,97,108,97,110,99,101,115,91,97,100,100,114,101,115,115,93,61,116,104,105,115,46,35,98,97,108,97,110,99,101,115,91,97,100,100,114,101,115,115,93,46,97,100,100,40,97,109,111,117,110,116,41,44,116,104,105,115,46,35,117,112,100,97,116,101,72,111,108,100,101,114,115,40,97,100,100,114,101,115,115,44,112,114,101,118,105,111,117,115,66,97,108,97,110,99,101,41,125,35,100,101,99,114,101,97,115,101,66,97,108,97,110,99,101,40,97,100,100,114,101,115,115,44,97,109,111,117,110,116,41,123,99,111,110,115,116,32,112,114,101,118,105,111,117,115,66,97,108,97,110,99,101,61,116,104,105,115,46,35,98,97,108,97,110,99,101,115,91,97,100,100,114,101,115,115,93,59,116,104,105,115,46,35,98,97,108,97,110,99,101,115,91,97,100,100,114,101,115,115,93,61,116,104,105,115,46,35,98,97,108,97,110,99,101,115,91,97,100,100,114,101,115,115,93,46,115,117,98,40,97,109,111,117,110,116,41,44,116,104,105,115,46,35,117,112,100,97,116,101,72,111,108,100,101,114,115,40,97,100,100,114,101,115,115,44,112,114,101,118,105,111,117,115,66,97,108,97,110,99,101,41,125,98,97,108,97,110,99,101,79,102,40,97,100,100,114,101,115,115,41,123,114,101,116,117,114,110,32,116,104,105,115,46,35,98,97,108,97,110,99,101,115,91,97,100,100,114,101,115,115,93,125,115,101,116,65,112,112,114,111,118,97,108,40,111,112,101,114,97,116,111,114,44,97,109,111,117,110,116,41,123,99,111,110,115,116,32,111,119,110,101,114,61,103,108,111,98,97,108,84,104,105,115,46,109,115,103,46,115,101,110,100,101,114,59,116,104,105,115,46,35,97,112,112,114,111,118,97,108,115,91,111,119,110,101,114,93,124,124,40,116,104,105,115,46,35,97,112,112,114,111,118,97,108,115,91,111,119,110,101,114,93,61,123,125,41,44,116,104,105,115,46,35,97,112,112,114,111,118,97,108,115,91,111,119,110,101,114,93,91,111,112,101,114,97,116,111,114,93,61,97,109,111,117,110,116,125,97,112,112,114,111,118,101,100,40,111,119,110,101,114,44,111,112,101,114,97,116,111,114,44,97,109,111,117,110,116,41,123,114,101,116,117,114,110,32,116,104,105,115,46,35,97,112,112,114,111,118,97,108,115,91,111,119,110,101,114,93,91,111,112,101,114,97,116,111,114,93,61,61,61,97,109,111,117,110,116,125,116,114,97,110,115,102,101,114,40,102,114,111,109,44,116,111,44,97,109,111,117,110,116,41,123,97,109,111,117,110,116,61,66,105,103,78,117,109,98,101,114,46,102,114,111,109,40,97,109,111,117,110,116,41,44,116,104,105,115,46,35,98,101,102,111,114,101,84,114,97,110,115,102,101,114,40,102,114,111,109,44,116,111,44,97,109,111,117,110,116,41,44,116,104,105,115,46,35,100,101,99,114,101,97,115,101,66,97,108,97,110,99,101,40,102,114,111,109,44,97,109,111,117,110,116,41,44,116,104,105,115,46,35,105,110,99,114,101,97,115,101,66,97,108,97,110,99,101,40,116,111,44,97,109,111,117,110,116,41,125,125,123,99,111,110,115,116,114,117,99,116,111,114,40,115,116,97,116,101,41,123,115,117,112,101,114,40,92,34,65,114,116,79,110,108,105,110,101,92,34,44,92,34,65,82,84,92,34,44,49,56,44,115,116,97,116,101,41,125,125,59,92,110,34,44,34,99,111,110,115,116,114,117,99,116,111,114,80,97,114,97,109,101,116,101,114,115,34,58,91,93,125";
355
+ var nameService = "237,198,141,3,123,34,99,114,101,97,116,111,114,34,58,34,51,67,122,86,51,66,98,76,103,117,57,105,55,119,70,115,83,101,82,101,90,113,110,80,111,53,82,114,121,49,118,81,98,82,115,89,114,116,67,67,97,81,103,98,113,80,72,112,116,117,85,111,72,52,34,44,34,99,111,110,116,114,97,99,116,34,58,34,114,101,116,117,114,110,32,99,108,97,115,115,32,78,97,109,101,83,101,114,118,105,99,101,123,35,110,97,109,101,61,92,34,65,114,116,79,110,108,105,110,101,78,97,109,101,83,101,114,118,105,99,101,92,34,59,35,111,119,110,101,114,59,35,112,114,105,99,101,61,48,59,35,114,101,103,105,115,116,114,121,61,123,125,59,35,99,117,114,114,101,110,99,121,59,103,101,116,32,110,97,109,101,40,41,123,114,101,116,117,114,110,32,116,104,105,115,46,35,110,97,109,101,125,103,101,116,32,114,101,103,105,115,116,114,121,40,41,123,114,101,116,117,114,110,123,46,46,46,116,104,105,115,46,35,114,101,103,105,115,116,114,121,125,125,103,101,116,32,115,116,97,116,101,40,41,123,125,99,111,110,115,116,114,117,99,116,111,114,40,102,97,99,116,111,114,121,65,100,100,114,101,115,115,44,99,117,114,114,101,110,99,121,44,118,97,108,105,100,97,116,111,114,65,100,100,114,101,115,115,44,112,114,105,99,101,44,115,116,97,116,101,41,123,115,116,97,116,101,63,40,116,104,105,115,46,35,111,119,110,101,114,61,115,116,97,116,101,46,111,119,110,101,114,44,116,104,105,115,46,35,114,101,103,105,115,116,114,121,61,115,116,97,116,101,46,114,101,103,105,115,116,114,121,44,116,104,105,115,46,35,99,117,114,114,101,110,99,121,61,115,116,97,116,101,46,99,117,114,114,101,110,99,121,44,116,104,105,115,46,35,112,114,105,99,101,61,115,116,97,116,101,46,112,114,105,99,101,41,58,40,116,104,105,115,46,35,111,119,110,101,114,61,109,115,103,46,115,101,110,100,101,114,44,116,104,105,115,46,35,112,114,105,99,101,61,112,114,105,99,101,44,116,104,105,115,46,35,114,101,103,105,115,116,114,121,46,65,114,116,79,110,108,105,110,101,67,111,110,116,114,97,99,116,70,97,99,116,111,114,121,61,123,111,119,110,101,114,58,109,115,103,46,115,101,110,100,101,114,44,97,100,100,114,101,115,115,58,102,97,99,116,111,114,121,65,100,100,114,101,115,115,125,44,116,104,105,115,46,35,114,101,103,105,115,116,114,121,46,65,114,116,79,110,108,105,110,101,84,111,107,101,110,61,123,111,119,110,101,114,58,109,115,103,46,115,101,110,100,101,114,44,97,100,100,114,101,115,115,58,99,117,114,114,101,110,99,121,125,44,116,104,105,115,46,35,114,101,103,105,115,116,114,121,46,65,114,116,79,110,108,105,110,101,86,97,108,105,100,97,116,111,114,115,61,123,111,119,110,101,114,58,109,115,103,46,115,101,110,100,101,114,44,97,100,100,114,101,115,115,58,118,97,108,105,100,97,116,111,114,65,100,100,114,101,115,115,125,44,116,104,105,115,46,35,99,117,114,114,101,110,99,121,61,99,117,114,114,101,110,99,121,41,125,99,104,97,110,103,101,79,119,110,101,114,40,111,119,110,101,114,41,123,105,102,40,109,115,103,46,115,101,110,100,101,114,33,61,61,116,104,105,115,46,35,111,119,110,101,114,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,110,111,32,111,119,110,101,114,92,34,41,59,116,104,105,115,46,35,111,119,110,101,114,61,111,119,110,101,114,125,99,104,97,110,103,101,80,114,105,99,101,40,112,114,105,99,101,41,123,105,102,40,109,115,103,46,115,101,110,100,101,114,33,61,61,116,104,105,115,46,35,111,119,110,101,114,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,110,111,32,111,119,110,101,114,92,34,41,59,116,104,105,115,46,35,112,114,105,99,101,61,112,114,105,99,101,125,99,104,97,110,103,101,67,117,114,114,101,110,99,121,40,99,117,114,114,101,110,99,121,41,123,105,102,40,109,115,103,46,115,101,110,100,101,114,33,61,61,116,104,105,115,46,35,111,119,110,101,114,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,110,111,32,111,119,110,101,114,92,34,41,59,116,104,105,115,46,35,99,117,114,114,101,110,99,121,61,99,117,114,114,101,110,99,121,125,97,115,121,110,99,32,112,117,114,99,104,97,115,101,78,97,109,101,40,110,97,109,101,44,97,100,100,114,101,115,115,41,123,105,102,40,97,119,97,105,116,32,109,115,103,46,99,97,108,108,40,116,104,105,115,46,35,99,117,114,114,101,110,99,121,44,92,34,98,97,108,97,110,99,101,79,102,92,34,44,91,109,115,103,46,115,101,110,100,101,114,93,41,60,116,104,105,115,46,35,112,114,105,99,101,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,112,114,105,99,101,32,101,120,99,101,101,100,115,32,98,97,108,97,110,99,101,92,34,41,59,116,114,121,123,97,119,97,105,116,32,109,115,103,46,99,97,108,108,40,116,104,105,115,46,35,99,117,114,114,101,110,99,121,44,92,34,116,114,97,110,115,102,101,114,92,34,44,91,109,115,103,46,115,101,110,100,101,114,44,116,104,105,115,46,35,111,119,110,101,114,44,116,104,105,115,46,35,112,114,105,99,101,93,41,125,99,97,116,99,104,40,101,41,123,116,104,114,111,119,32,101,125,116,104,105,115,46,35,114,101,103,105,115,116,114,121,91,110,97,109,101,93,61,123,111,119,110,101,114,58,109,115,103,46,115,101,110,100,101,114,44,97,100,100,114,101,115,115,58,97,100,100,114,101,115,115,125,125,108,111,111,107,117,112,40,110,97,109,101,41,123,114,101,116,117,114,110,32,116,104,105,115,46,35,114,101,103,105,115,116,114,121,91,110,97,109,101,93,125,116,114,97,110,115,102,101,114,79,119,110,101,114,115,104,105,112,40,110,97,109,101,44,116,111,41,123,105,102,40,109,115,103,46,115,101,110,100,101,114,33,61,61,116,104,105,115,46,35,114,101,103,105,115,116,114,121,46,111,119,110,101,114,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,110,111,116,32,97,32,111,119,110,101,114,92,34,41,59,116,104,105,115,46,35,114,101,103,105,115,116,114,121,91,110,97,109,101,93,46,111,119,110,101,114,61,116,111,125,99,104,97,110,103,101,65,100,100,114,101,115,115,40,110,97,109,101,44,97,100,100,114,101,115,115,41,123,105,102,40,109,115,103,46,115,101,110,100,101,114,33,61,61,116,104,105,115,46,35,114,101,103,105,115,116,114,121,46,111,119,110,101,114,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,110,111,116,32,97,32,111,119,110,101,114,92,34,41,59,116,104,105,115,46,35,114,101,103,105,115,116,114,121,91,110,97,109,101,93,46,97,100,100,114,101,115,115,61,97,100,100,114,101,115,115,125,125,59,92,110,34,44,34,99,111,110,115,116,114,117,99,116,111,114,80,97,114,97,109,101,116,101,114,115,34,58,91,34,105,104,110,121,50,103,113,103,111,114,119,111,102,104,118,102,103,116,114,53,100,109,50,116,97,114,103,110,120,114,117,108,53,114,114,52,119,110,121,107,52,118,108,55,97,107,98,109,119,111,120,52,51,110,108,118,112,105,109,34,44,34,105,104,110,121,50,103,113,104,101,55,103,97,122,107,105,101,101,121,52,111,51,114,122,116,102,121,55,53,55,105,97,51,97,115,54,115,110,114,109,111,118,52,101,51,118,107,102,100,118,116,50,111,108,118,120,51,115,116,101,34,44,34,105,104,110,121,50,103,113,104,108,109,117,98,114,118,107,108,51,105,120,121,102,97,100,111,109,112,118,102,105,105,110,118,119,116,104,105,52,51,119,112,116,52,113,100,102,106,55,54,55,110,104,112,121,106,108,110,119,105,110,34,44,34,49,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,48,34,93,125";
356
+ var validators = "237,198,141,3,123,34,99,114,101,97,116,111,114,34,58,34,51,67,122,86,51,66,98,76,103,117,57,105,55,119,70,115,83,101,82,101,90,113,110,80,111,53,82,114,121,49,118,81,98,82,115,89,114,116,67,67,97,81,103,98,113,80,72,112,116,117,85,111,72,52,34,44,34,99,111,110,116,114,97,99,116,34,58,34,114,101,116,117,114,110,32,99,108,97,115,115,32,86,97,108,105,100,97,116,111,114,115,123,35,110,97,109,101,61,92,34,65,114,116,79,110,108,105,110,101,86,97,108,105,100,97,116,111,114,115,92,34,59,35,116,111,116,97,108,86,97,108,105,100,97,116,111,114,115,61,48,59,35,118,97,108,105,100,97,116,111,114,115,61,123,125,59,35,111,119,110,101,114,59,35,99,117,114,114,101,110,99,121,59,35,109,105,110,105,109,117,109,66,97,108,97,110,99,101,59,103,101,116,32,115,116,97,116,101,40,41,123,114,101,116,117,114,110,123,111,119,110,101,114,58,116,104,105,115,46,35,111,119,110,101,114,44,109,105,110,105,109,117,109,66,97,108,97,110,99,101,58,116,104,105,115,46,35,109,105,110,105,109,117,109,66,97,108,97,110,99,101,44,99,117,114,114,101,110,99,121,58,116,104,105,115,46,35,99,117,114,114,101,110,99,121,44,116,111,116,97,108,86,97,108,105,100,97,116,111,114,115,58,116,104,105,115,46,35,116,111,116,97,108,86,97,108,105,100,97,116,111,114,115,44,118,97,108,105,100,97,116,111,114,115,58,116,104,105,115,46,35,118,97,108,105,100,97,116,111,114,115,125,125,99,111,110,115,116,114,117,99,116,111,114,40,116,111,107,101,110,65,100,100,114,101,115,115,44,115,116,97,116,101,41,123,115,116,97,116,101,63,40,116,104,105,115,46,35,111,119,110,101,114,61,115,116,97,116,101,46,111,119,110,101,114,44,116,104,105,115,46,35,109,105,110,105,109,117,109,66,97,108,97,110,99,101,61,115,116,97,116,101,46,109,105,110,105,109,117,109,66,97,108,97,110,99,101,44,116,104,105,115,46,35,99,117,114,114,101,110,99,121,61,115,116,97,116,101,46,99,117,114,114,101,110,99,121,44,116,104,105,115,46,35,116,111,116,97,108,86,97,108,105,100,97,116,111,114,115,61,115,116,97,116,101,46,116,111,116,97,108,86,97,108,105,100,97,116,111,114,115,44,116,104,105,115,46,35,118,97,108,105,100,97,116,111,114,115,61,115,116,97,116,101,46,118,97,108,105,100,97,116,111,114,115,41,58,40,116,104,105,115,46,35,111,119,110,101,114,61,109,115,103,46,115,101,110,100,101,114,44,116,104,105,115,46,35,109,105,110,105,109,117,109,66,97,108,97,110,99,101,61,53,101,52,44,116,104,105,115,46,35,99,117,114,114,101,110,99,121,61,116,111,107,101,110,65,100,100,114,101,115,115,44,116,104,105,115,46,35,116,111,116,97,108,86,97,108,105,100,97,116,111,114,115,43,61,49,44,116,104,105,115,46,35,118,97,108,105,100,97,116,111,114,115,91,109,115,103,46,115,101,110,100,101,114,93,61,123,102,105,114,115,116,83,101,101,110,58,40,110,101,119,32,68,97,116,101,41,46,103,101,116,84,105,109,101,40,41,44,97,99,116,105,118,101,58,33,48,125,41,125,103,101,116,32,110,97,109,101,40,41,123,114,101,116,117,114,110,32,116,104,105,115,46,35,110,97,109,101,125,103,101,116,32,111,119,110,101,114,40,41,123,114,101,116,117,114,110,32,116,104,105,115,46,35,111,119,110,101,114,125,103,101,116,32,99,117,114,114,101,110,99,121,40,41,123,114,101,116,117,114,110,32,116,104,105,115,46,35,99,117,114,114,101,110,99,121,125,103,101,116,32,118,97,108,105,100,97,116,111,114,115,40,41,123,114,101,116,117,114,110,123,46,46,46,116,104,105,115,46,35,118,97,108,105,100,97,116,111,114,115,125,125,103,101,116,32,116,111,116,97,108,86,97,108,105,100,97,116,111,114,115,40,41,123,114,101,116,117,114,110,32,116,104,105,115,46,35,116,111,116,97,108,86,97,108,105,100,97,116,111,114,115,125,103,101,116,32,109,105,110,105,109,117,109,66,97,108,97,110,99,101,40,41,123,114,101,116,117,114,110,32,116,104,105,115,46,35,109,105,110,105,109,117,109,66,97,108,97,110,99,101,125,99,104,97,110,103,101,79,119,110,101,114,40,111,119,110,101,114,41,123,105,102,40,109,115,103,46,115,101,110,100,101,114,33,61,61,116,104,105,115,46,35,111,119,110,101,114,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,110,111,116,32,97,110,32,111,119,110,101,114,92,34,41,125,99,104,97,110,103,101,67,117,114,114,101,110,99,121,40,99,117,114,114,101,110,99,121,41,123,105,102,40,109,115,103,46,115,101,110,100,101,114,33,61,61,116,104,105,115,46,35,111,119,110,101,114,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,110,111,116,32,97,110,32,111,119,110,101,114,92,34,41,59,116,104,105,115,46,35,99,117,114,114,101,110,99,121,61,99,117,114,114,101,110,99,121,125,104,97,115,40,118,97,108,105,100,97,116,111,114,41,123,114,101,116,117,114,110,32,66,111,111,108,101,97,110,40,118,111,105,100,32,48,33,61,61,116,104,105,115,46,35,118,97,108,105,100,97,116,111,114,115,91,118,97,108,105,100,97,116,111,114,93,41,125,97,115,121,110,99,32,97,100,100,86,97,108,105,100,97,116,111,114,40,118,97,108,105,100,97,116,111,114,41,123,105,102,40,116,104,105,115,46,104,97,115,40,118,97,108,105,100,97,116,111,114,41,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,97,108,114,101,97,100,121,32,97,32,118,97,108,105,100,97,116,111,114,92,34,41,59,99,111,110,115,116,32,98,97,108,97,110,99,101,61,97,119,97,105,116,32,109,115,103,46,115,116,97,116,105,99,67,97,108,108,40,116,104,105,115,46,99,117,114,114,101,110,99,121,44,92,34,98,97,108,97,110,99,101,79,102,92,34,44,91,109,115,103,46,115,101,110,100,101,114,93,41,59,105,102,40,98,97,108,97,110,99,101,60,116,104,105,115,46,109,105,110,105,109,117,109,66,97,108,97,110,99,101,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,98,97,108,97,110,99,101,32,116,111,32,108,111,119,33,32,103,111,116,58,32,36,123,98,97,108,97,110,99,101,125,32,110,101,101,100,58,32,36,123,116,104,105,115,46,35,109,105,110,105,109,117,109,66,97,108,97,110,99,101,125,96,41,59,116,104,105,115,46,35,116,111,116,97,108,86,97,108,105,100,97,116,111,114,115,43,61,49,44,116,104,105,115,46,35,118,97,108,105,100,97,116,111,114,115,91,118,97,108,105,100,97,116,111,114,93,61,123,102,105,114,115,116,83,101,101,110,58,40,110,101,119,32,68,97,116,101,41,46,103,101,116,84,105,109,101,40,41,44,97,99,116,105,118,101,58,33,48,125,125,114,101,109,111,118,101,86,97,108,105,100,97,116,111,114,40,118,97,108,105,100,97,116,111,114,41,123,105,102,40,33,116,104,105,115,46,104,97,115,40,118,97,108,105,100,97,116,111,114,41,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,118,97,108,105,100,97,116,111,114,32,110,111,116,32,102,111,117,110,100,92,34,41,59,116,104,105,115,46,35,116,111,116,97,108,86,97,108,105,100,97,116,111,114,115,45,61,49,44,100,101,108,101,116,101,32,116,104,105,115,46,35,118,97,108,105,100,97,116,111,114,115,91,118,97,108,105,100,97,116,111,114,93,125,97,115,121,110,99,32,117,112,100,97,116,101,86,97,108,105,100,97,116,111,114,40,118,97,108,105,100,97,116,111,114,44,97,99,116,105,118,101,41,123,105,102,40,33,116,104,105,115,46,104,97,115,40,118,97,108,105,100,97,116,111,114,41,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,92,34,118,97,108,105,100,97,116,111,114,32,110,111,116,32,102,111,117,110,100,92,34,41,59,99,111,110,115,116,32,98,97,108,97,110,99,101,61,97,119,97,105,116,32,109,115,103,46,115,116,97,116,105,99,67,97,108,108,40,116,104,105,115,46,99,117,114,114,101,110,99,121,44,92,34,98,97,108,97,110,99,101,79,102,92,34,44,91,109,115,103,46,115,101,110,100,101,114,93,41,59,105,102,40,98,97,108,97,110,99,101,60,116,104,105,115,46,109,105,110,105,109,117,109,66,97,108,97,110,99,101,38,38,116,104,105,115,46,35,118,97,108,105,100,97,116,111,114,115,91,118,97,108,105,100,97,116,111,114,93,46,97,99,116,105,118,101,38,38,40,116,104,105,115,46,35,118,97,108,105,100,97,116,111,114,115,91,118,97,108,105,100,97,116,111,114,93,46,97,99,116,105,118,101,61,33,49,41,44,98,97,108,97,110,99,101,60,116,104,105,115,46,109,105,110,105,109,117,109,66,97,108,97,110,99,101,41,116,104,114,111,119,32,110,101,119,32,69,114,114,111,114,40,96,98,97,108,97,110,99,101,32,116,111,32,108,111,119,33,32,103,111,116,58,32,36,123,98,97,108,97,110,99,101,125,32,110,101,101,100,58,32,36,123,116,104,105,115,46,35,109,105,110,105,109,117,109,66,97,108,97,110,99,101,125,96,41,59,116,104,105,115,46,35,118,97,108,105,100,97,116,111,114,115,91,118,97,108,105,100,97,116,111,114,93,46,97,99,116,105,118,101,61,97,99,116,105,118,101,125,125,59,92,110,34,44,34,99,111,110,115,116,114,117,99,116,111,114,80,97,114,97,109,101,116,101,114,115,34,58,91,34,105,104,110,121,50,103,113,104,101,55,103,97,122,107,105,101,101,121,52,111,51,114,122,116,102,121,55,53,55,105,97,51,97,115,54,115,110,114,109,111,118,52,101,51,118,107,102,100,118,116,50,111,108,118,120,51,115,116,101,34,93,125";
357
+ var bytecodes = {
358
+ contractFactory: contractFactory,
359
+ nativeToken: nativeToken,
360
+ nameService: nameService,
361
+ validators: validators
362
+ };
363
+
364
+ const contractFactoryMessage = bytecodes.contractFactory;
365
+ const nativeTokenMessage = bytecodes.nativeToken;
366
+
367
+ const nameServiceMessage = bytecodes.nameService;
368
+ const validatorsMessage = bytecodes.validators;
369
+
370
+ const createContractMessage = async (creator, contract, constructorParameters = []) => {
371
+ return new ContractMessage({
372
+ creator,
373
+ contract,
374
+ constructorParameters
375
+ })
376
+ };
377
+
378
+ const calculateFee = async transaction => {
379
+ // excluded from fees
380
+ if (transaction.to === validators$1) return 0
381
+ // fee per gb
382
+ transaction = await new TransactionMessage(transaction);
383
+ let fee = transaction.encoded.length;
384
+ fee = fee / 1024;
385
+ fee = fee / 1000000;
386
+ const parts = String(fee).split('.');
387
+ let decimals = 0;
388
+ if (parts[1]) {
389
+ const potentional = parts[1].split('e');
390
+ parts[1] = potentional[0];
391
+ decimals = Number(potentional[1].replace(/\-|\+/g, '')) + Number(potentional[0].length);
392
+ }
393
+
394
+ return Number.parseFloat(fee.toString()).toFixed(decimals)
395
+ };
396
+
397
+ globalThis.BigNumber = BigNumber;
398
+
399
+ // check if browser or local
400
+ class Chain {
401
+ #validators = []
402
+ #blocks = []
403
+ #machine
404
+ #runningEpoch = false
405
+ #lastBlock = {index: 0, previousHash: '0x0'}
406
+
407
+ #jail = []
408
+
409
+ constructor() {
410
+ return this.#init()
411
+ }
412
+
413
+ get lib() {
414
+ return lib
415
+ }
416
+
417
+ get lastBlock() {
418
+ return this.#lastBlock
419
+ }
420
+
421
+ get nativeToken() {
422
+ return addresses.nativeToken
423
+ }
424
+
425
+ get validators() {
426
+ return [...this.#validators]
427
+ }
428
+
429
+ get blocks() {
430
+ return [...this.#blocks]
431
+ }
432
+
433
+ async hasTransactionToHandle() {
434
+ const size = await transactionPoolStore.size();
435
+ if (size > 0) return true
436
+ return false
437
+ }
438
+
439
+ async #runEpoch() {
440
+ this.#runningEpoch = true;
441
+ console.log('epoch');
442
+ const validators = await this.staticCall(addresses.validators, 'validators');
443
+ console.log(validators);
444
+ if (!validators[peernet.id]?.active) return
445
+ console.log('active');
446
+
447
+
448
+ const start = new Date().getTime();
449
+ try {
450
+ await this.#createBlock();
451
+ } catch (e) {
452
+ console.error(e);
453
+ }
454
+
455
+ const end = new Date().getTime();
456
+ console.log(((end - start) / 1000) + ' s');
457
+
458
+ if (await this.hasTransactionToHandle()) return this.#runEpoch()
459
+ this.#runningEpoch = false;
460
+ // if (await this.hasTransactionToHandle() && !this.#runningEpoch) return this.#runEpoch()
461
+ }
462
+
463
+ async #setup() {
464
+
465
+ const contracts = [{
466
+ address: addresses.contractFactory,
467
+ message: contractFactoryMessage
468
+ }, {
469
+ address: addresses.nativeToken,
470
+ message: nativeTokenMessage
471
+ }, {
472
+ address: addresses.validators,
473
+ message: validatorsMessage
474
+ }, {
475
+ address: addresses.nameService,
476
+ message: nameServiceMessage
477
+ }];
478
+
479
+ await Promise.all(contracts.map(async ({address, message}) => {
480
+ message = await new ContractMessage(message);
481
+ await contractStore.put(address, message.encoded);
482
+ }));
483
+ console.log('handle native contracts');
484
+ // handle native contracts
485
+ }
486
+
487
+ async #sync() {
488
+ let promises = [];
489
+ for (const peer of peernet.connections) {
490
+ if (peer.peerId !== this.id) {
491
+ let data = new peernet.protos['peernet-request']({request: 'lastBlock'});
492
+
493
+ const node = await peernet.prepareMessage(id, data.encoded);
494
+ promises.push(peer.request(node.encoded));
495
+ }
496
+ }
497
+ // if (this.)
498
+
499
+ promises = await Promise.allSettled(promises);
500
+ promises = promises.reduce((set, c) => {
501
+ if (c.index > set.index) {
502
+ set.index = c.index;
503
+ set.hash = c.hash;
504
+ }
505
+ return set
506
+ }, {index: 0, hash: '0x0'});
507
+ // get lastblock
508
+ console.log(promises.hash);
509
+ if (promises.hash && promises.hash !== '0x0') {
510
+ console.log('get');
511
+ let localBlock = await peernet.get(promises.hash);
512
+ console.log({localBlock});
513
+ }
514
+
515
+
516
+ }
517
+
518
+ async #init() {
519
+ // this.node = await new Node()
520
+ this.participants = [];
521
+ this.participating = false;
522
+ const initialized = await contractStore.has(addresses.contractFactory);
523
+ if (!initialized) await this.#setup();
524
+
525
+ this.#machine = await new Machine();
526
+ this.utils = { BigNumber, formatUnits, parseUnits };
527
+
528
+ await peernet.addRequestHandler('bw-request-message', () => {
529
+
530
+ return new BWMessage(peernet.client.bw) || { up: 0, down: 0 }
531
+ });
532
+
533
+ await peernet.addRequestHandler('lastBlock', this.#lastBlockHandler.bind(this));
534
+
535
+ peernet.subscribe('add-block', this.#addBlock.bind(this));
536
+
537
+ peernet.subscribe('add-transaction', this.#addTransaction.bind(this));
538
+
539
+ peernet.subscribe('validator:timeout', this.#validatorTimeout.bind(this));
540
+
541
+ pubsub.subscribe('peer:connected', this.#peerConnected.bind(this));
542
+
543
+ try {
544
+ let localBlock = await chainStore.get('lastBlock');
545
+ localBlock = new TextDecoder().decode(localBlock);
546
+ if (localBlock && localBlock !== '0x0') {
547
+ localBlock = await peernet.get(localBlock);
548
+ localBlock = await new BlockMessage(localBlock);
549
+ this.#lastBlock = {...localBlock.decoded, hash: await localBlock.hash};
550
+ } else {
551
+ await this.#sync();
552
+ }
553
+
554
+ // console.log(this.lastBlock.decoded.transactions);
555
+ } catch (e) {
556
+ console.log({e});
557
+ await chainStore.put('lastBlock', '0x0');
558
+ let localBlock = await chainStore.get('lastBlock');
559
+ localBlock = new TextDecoder().decode(localBlock);
560
+ if (localBlock && localBlock !== '0x0') {
561
+ localBlock = await peernet.get(localBlock);
562
+ localBlock = await new BlockMessage(localBlock);
563
+ this.#lastBlock = {...localBlock.decoded, hash: await localBlock.hash};
564
+ } else {
565
+ await this.#sync();
566
+ }
567
+
568
+
569
+ // this.#setup()
570
+ }
571
+ // load local blocks
572
+ if (peernet.connections?.length > 1) await this.resolveBlocks();
573
+ return this
574
+ }
575
+
576
+ async #validatorTimeout(validatorInfo) {
577
+ setTimeout(() => {
578
+ this.#jail.splice(this.jail.indexOf(validatorInfo.address), 1);
579
+ }, validatorInfo.timeout);
580
+ this.#jail.push(validatorInfo.address);
581
+ }
582
+
583
+ async #peerConnected(peer) {
584
+ let node = await new peernet.protos['peernet-request']({request: 'lastBlock'});
585
+ console.log(node);
586
+ node = await peernet.prepareMessage(node);
587
+ let response = await peer.request(node.encoded);
588
+ console.log({response});
589
+ response = await new globalThis.peernet.protos['peernet-response'](response);
590
+ let lastBlock = response.decoded.response;
591
+
592
+ if (!this.lastBlock || this.lastBlock.index < lastBlock.index) {
593
+ // TODO: check if valid
594
+ const localIndex = this.lastBlock ? this.lastBlock.index : 0;
595
+ const index = lastBlock.index;
596
+ await this.resolveBlock(lastBlock.hash);
597
+ this.#lastBlock = this.#blocks[this.#blocks.length - 1];
598
+ let blocksSynced = localIndex > 0 ? localIndex - index : index;
599
+ blocksSynced += 1;
600
+ debug(`synced ${blocksSynced} ${blocksSynced > 1 ? 'blocks' : 'block'}`);
601
+
602
+ this.#blocks.length;
603
+ (this.#blocks.length) - blocksSynced;
604
+ await this.#loadBlocks(this.#blocks);
605
+ const message = await new BlockMessage(this.lastBlock);
606
+ await blockStore.put(await message.hash, message.encoded);
607
+ await chainStore.put('lastBlock', this.lastBlock.hash);
608
+ }
609
+ }
610
+
611
+ #epochTimeout
612
+
613
+ async #addTransaction(transaction) {
614
+ try {
615
+ transaction = await new TransactionMessage(transaction);
616
+ const has = await transactionPoolStore.has(await transaction.hash);
617
+ if (!has) await transactionPoolStore.put(await transaction.hash, transaction.encoded);
618
+ if (this.participating && !this.#runningEpoch) this.#runEpoch();
619
+ } catch (e) {
620
+ throw Error('invalid transaction')
621
+ }
622
+ }
623
+
624
+ async #lastBlockHandler() {
625
+ return new peernet.protos['peernet-response']({response: { hash: this.lastBlock?.hash, index: this.lastBlock?.index }})
626
+ }
627
+
628
+ async resolveBlock(hash) {
629
+ if (!hash) throw new Error(`expected hash, got: ${hash}`)
630
+ let block = await peernet.get(hash, 'block');
631
+ if (!await peernet.has(hash, 'block')) await peernet.put(hash, block, 'block');
632
+ block = await new BlockMessage(block);
633
+ const size = block.encoded.length || block.encoded.byteLength;
634
+ block = {...block.decoded, hash};
635
+ this.#blocks[block.index] = block;
636
+ console.log(`loaded block: ${hash} @${block.index} ${formatBytes(size)}`);
637
+ if (block.index !== 0) {
638
+ return this.resolveBlock(block.previousHash)
639
+ }
640
+ }
641
+
642
+ async resolveBlocks() {
643
+ try {
644
+
645
+ const localBlock = await chainStore.get('lastBlock');
646
+ const hash = new TextDecoder().decode(localBlock);
647
+ if (hash && hash !== '0x0')
648
+ await this.resolveBlock(localBlock);
649
+ this.#lastBlock = this.#blocks[this.#blocks.length - 1];
650
+ await this.#loadBlocks(this.#blocks);
651
+ } catch (e) {
652
+ await chainStore.put('lastBlock', new TextEncoder().encode('0x0'));
653
+ return this.resolveBlocks()
654
+ // console.log(e);
655
+ }
656
+ }
657
+
658
+ async #loadBlocks(blocks) {
659
+ for (const block of blocks) {
660
+ if (!block.loaded) {
661
+ for (const transaction of block.transactions) {
662
+ try {
663
+ await this.#machine.execute(transaction.to, transaction.method, transaction.params);
664
+
665
+ } catch (e) {
666
+ console.log(e);
667
+ }
668
+ }
669
+ block.loaded = true;
670
+ // let message = await peernet.get(block.hash, 'block')
671
+
672
+ // const compressed = pako.deflate(message);
673
+ // const result = pako.inflate(compressed);
674
+ // console.log(result.length, compressed.length);
675
+ //
676
+ // console.log(result.length - compressed.length);
677
+
678
+ // message = new BlockMessage(message)
679
+ // for (const transaction of message.decoded.transactions) {
680
+ // try {
681
+ // await this.#machine.execute(transaction.to, transaction.method, transaction.params)
682
+ //
683
+ // } catch (e) {
684
+ // // console.log(e);
685
+ // }
686
+ // }
687
+ // block.loaded = true
688
+ }
689
+ }
690
+ }
691
+
692
+ async #executeTransaction({hash, from, to, method, params, nonce}) {
693
+ try {
694
+ let result = await this.#machine.execute(to, method, params, from, nonce);
695
+ // if (!result) result = this.#machine.state
696
+ pubsub.publish(`transaction.completed.${hash}`, {status: 'fulfilled', hash});
697
+ return result ? result : 'no state change'
698
+ } catch (e) {
699
+ pubsub.publish(`transaction.completed.${hash}`, {status: 'fail', hash, error: e});
700
+ throw e
701
+ }
702
+ }
703
+
704
+ async #addBlock(block) {
705
+ const blockMessage = await new BlockMessage(block);
706
+ // if (!Buffer.isBuffer(block)) block = Buffer.from(block, 'hex')
707
+ // const transactionJob = async transaction => {
708
+ // try {
709
+ // transaction = await transactionPoolStore.get(transaction)
710
+ // } catch (e) {
711
+ // try {
712
+ // transaction = await peernet.get(transaction, 'transaction')
713
+ // } catch (e) {
714
+ // console.warn(`couldn't resolve ${transaction}`);
715
+ // }
716
+ // }
717
+ // transaction = new TransactionMessage(transaction)
718
+ // return transaction
719
+ // }
720
+ await Promise.all(blockMessage.decoded.transactions
721
+ .map(async transaction => transactionPoolStore.delete(await transaction.hash)));
722
+ const hash = await blockMessage.hash;
723
+ // let transactions = blockMessage.decoded.transactions.map(tx => transactionJob(tx))
724
+ // transactions = await Promise.all(transactions)
725
+ this.#lastBlock = { hash, ...blockMessage.decoded };
726
+ await blockStore.put(hash, blockMessage.encoded);
727
+ await chainStore.put('lastBlock', hash);
728
+ debug(`added block: ${hash}`);
729
+ let promises = [];
730
+ let contracts = [];
731
+ for (let transaction of blockMessage.decoded.transactions) {
732
+ // await transactionStore.put(transaction.hash, transaction.encoded)
733
+ const index = contracts.indexOf(transaction.to);
734
+ if (index === -1) contracts.push(transaction.to);
735
+ promises.push(this.#executeTransaction(transaction));
736
+ }
737
+ try {
738
+ promises = await Promise.allSettled(promises);
739
+ for (let transaction of blockMessage.decoded.transactions) {
740
+ await accountsStore.put(transaction.from, String(transaction.nonce));
741
+ }
742
+
743
+ // todo finish state
744
+ // for (const contract of contracts) {
745
+ // const state = await this.#machine.get(contract, 'state')
746
+ // // await stateStore.put(contract, state)
747
+ // console.log(state);
748
+ // }
749
+ pubsub.publish('block-processed', blockMessage.decoded);
750
+ } catch (e) {
751
+ console.log({e});
752
+ }
753
+
754
+ }
755
+
756
+ async #updateState() {
757
+
758
+ }
759
+
760
+
761
+
762
+ async participate() {
763
+ // TODO: validate participant
764
+ // hold min amount of 50k ART for 7 days
765
+ // lock the 50k
766
+ // introduce peer-reputation
767
+ // peerReputation(peerId)
768
+ // {bandwith: {up, down}, uptime}
769
+ this.participating = true;
770
+ if (!await this.staticCall(addresses.validators, 'has', [peernet.id])) await this.createTransactionFrom(peernet.id, addresses.validators, 'addValidator', [peernet.id]);
771
+ if (await this.hasTransactionToHandle() && !this.#runningEpoch) await this.#runEpoch();
772
+
773
+ // const runEpoch = () => setTimeout(async () => {
774
+ // if (await this.hasTransactionToHandle() && !this.#runningEpoch) await this.#runEpoch()
775
+ // runEpoch()
776
+ // }, 5000)
777
+ // runEpoch()
778
+ }
779
+
780
+ calculateFee(transaction) {
781
+ // excluded from fees
782
+ // if (transaction.decoded.to === addresses.validators) return 0
783
+ // fee per gb
784
+ return (transaction.encoded.length / 1024) / 1e-6
785
+ }
786
+
787
+ async getTransactions (transactions) {
788
+ return new Promise(async (resolve, reject) => {
789
+ let size = 0;
790
+ const _transactions = [];
791
+
792
+
793
+ await Promise.all(transactions
794
+ .map(async tx => {
795
+ tx = await new TransactionMessage(tx);
796
+ size += tx.encoded.length;
797
+ if (!formatBytes(size).includes('MB') || formatBytes(size).includes('MB') && Number(formatBytes(size).split(' MB')[0]) <= 0.75) _transactions.push({...tx.decoded, hash: await tx.hash});
798
+ else resolve(_transactions);
799
+ }));
800
+
801
+ return resolve(_transactions)
802
+ })
803
+
804
+ }
805
+
806
+ // todo filter tx that need to wait on prev nonce
807
+ async #createBlock(limit = 1800) {
808
+ // vote for transactions
809
+ if (await transactionPoolStore.size() === 0) return;
810
+
811
+ let transactions = await transactionPoolStore.values(limit);
812
+
813
+ if (Object.keys(transactions)?.length === 0 ) return
814
+
815
+ let block = {
816
+ transactions: [],
817
+ validators: [],
818
+ fees: 0
819
+ };
820
+
821
+ // exclude failing tx
822
+ transactions = await this.getTransactions(transactions.slice(0, transactions.length < 1800 ? transactions.length : 1800));
823
+
824
+ transactions = transactions.sort((a, b) => a.nonce - b.nonce);
825
+ for (let transaction of transactions) {
826
+ try {
827
+ await this.#executeTransaction(transaction);
828
+ block.transactions.push(transaction);
829
+ block.fees += Number(calculateFee(transaction));
830
+ await accountsStore.put(transaction.from, new TextEncoder().encode(String(transaction.nonce)));
831
+ } catch (e) {
832
+ transaction = await new TransactionMessage(transaction);
833
+ await transactionPoolStore.delete(await transaction.hash);
834
+ }
835
+ }
836
+ // don't add empty block
837
+ if (block.transactions.length === 0) return
838
+ const validators = await this.staticCall(addresses.validators, 'validators');
839
+ console.log({validators});
840
+ // block.validators = Object.keys(block.validators).reduce((set, key) => {
841
+ // if (block.validators[key].active) {
842
+ // push({
843
+ // address: key
844
+ // })
845
+ // }
846
+ // }, [])
847
+ const peers = {};
848
+ for (const entry of peernet.peerEntries) {
849
+ peers[entry[0]] = entry[1];
850
+ }
851
+ for (const validator of Object.keys(validators)) {
852
+ if (validators[validator].active) {
853
+ const peer = peers[validator];
854
+ if (peer && peer.connected) {
855
+ let data = await new BWRequestMessage();
856
+ const node = await peernet.prepareMessage(validator, data.encoded);
857
+ try {
858
+ const bw = await peer.request(node.encoded);
859
+ console.log(bw);
860
+ block.validators.push({
861
+ address: validator,
862
+ bw: bw.up + bw.down
863
+ });
864
+ } catch(e) {
865
+
866
+ }
867
+
868
+ } else if (peernet.id === validator) {
869
+ block.validators.push({
870
+ address: peernet.id,
871
+ bw: peernet.bw.up + peernet.bw.down
872
+ });
873
+
874
+ }
875
+ }
876
+
877
+ }
878
+
879
+ console.log({validators: block.validators});
880
+
881
+ block.reward = 150;
882
+ block.validators = block.validators.map(validator => {
883
+ validator.reward = String(Number(block.fees) + block.reward / block.validators.length);
884
+ delete validator.bw;
885
+ return validator
886
+ });
887
+ // block.validators = calculateValidatorReward(block.validators, block.fees)
888
+
889
+ block.index = this.lastBlock?.index;
890
+ if (block.index === undefined) block.index = 0;
891
+ else block.index += 1;
892
+
893
+ block.previousHash = this.lastBlock?.hash || '0x0';
894
+ block.timestamp = new Date().getTime();
895
+
896
+ const parts = String(block.fees).split('.');
897
+ let decimals = 0;
898
+ if (parts[1]) {
899
+ const potentional = parts[1].split('e');
900
+ if (potentional[0] !== parts[1]) {
901
+ parts[1] = potentional[0];
902
+ decimals = Number(potentional[1]?.replace(/\-|\+/g, '')) + Number(potentional[0].length);
903
+ } else {
904
+ decimals = parts[1].length;
905
+ }
906
+
907
+ }
908
+ block.fees = Number.parseFloat(String(block.fees)).toFixed(decimals);
909
+
910
+ try {
911
+ let blockMessage = await new BlockMessage(block);
912
+ const hash = await blockMessage.hash;
913
+ await Promise.all(blockMessage.decoded.transactions
914
+ .map(async transaction => transactionPoolStore.delete(await transaction.hash)));
915
+
916
+ this.#lastBlock = { hash, ...blockMessage.decoded };
917
+ await blockStore.put(hash, blockMessage.encoded);
918
+ await chainStore.put('lastBlock', hash);
919
+ debug(`created block: ${hash}`);
920
+
921
+ peernet.publish('add-block', blockMessage.encoded);
922
+ this.#updateState(blockMessage);
923
+ } catch (e) {
924
+ console.log(e);
925
+ throw Error(`invalid block ${block}`)
926
+ }
927
+ // data = await this.#machine.execute(to, method, params)
928
+ // transactionStore.put(message.hash, message.encoded)
929
+ }
930
+
931
+ async promiseTransactions(transactions) {
932
+ transactions = await Promise.all(transactions.map(tx => new TransactionMessage(tx)));
933
+ return transactions
934
+ }
935
+
936
+ async promiseTransactionsContent(transactions) {
937
+ transactions = await Promise.all(transactions.map(tx => new Promise(async (resolve, reject) => {
938
+ resolve({ ...tx.decoded, hash: await tx.hash });
939
+ })));
940
+
941
+ return transactions
942
+ }
943
+
944
+ async #getNonceFallback(address) {
945
+ let transactions = await transactionPoolStore.values();
946
+ transactions = await this.promiseTransactions(transactions);
947
+ transactions = transactions.filter(tx => tx.decoded.from === address);
948
+ transactions = await this.promiseTransactionsContent(transactions);
949
+
950
+ if (this.lastBlock?.hash && transactions.length === 0 && this.lastBlock.hash !== '0x0') {
951
+
952
+ let block = await peernet.get(this.lastBlock.hash);
953
+ block = await new BlockMessage(block);
954
+
955
+ // for (let tx of block.decoded?.transactions) {
956
+ // tx = await peernet.get(tx, 'transaction')
957
+ // transactions.push(new TransactionMessage(tx))
958
+ // }
959
+ transactions = transactions.filter(tx => tx.from === address);
960
+ while (transactions.length === 0 && block.decoded.index !== 0 && block.decoded.previousHash !== '0x0') {
961
+ block = await blockStore.get(block.decoded.previousHash);
962
+ block = await new BlockMessage(block);
963
+ transactions = block.decoded.transactions.filter(tx => tx.from === address);
964
+ }
965
+
966
+ }
967
+ if (transactions.length === 0) return 0
968
+
969
+ transactions = transactions.sort((a, b) => a.timestamp - b.timestamp);
970
+ return transactions[transactions.length - 1].nonce
971
+ }
972
+
973
+ async getNonce(address) {
974
+ if (!await accountsStore.has(address)) {
975
+ const nonce = await this.#getNonceFallback(address);
976
+ await accountsStore.put(address, new TextEncoder().encode(String(nonce)));
977
+ }
978
+ let nonce = await accountsStore.get(address);
979
+ nonce = new TextDecoder().decode(nonce);
980
+ return Number(nonce)
981
+ }
982
+
983
+ /**
984
+ * whenever method = createContract params should hold the contract hash
985
+ *
986
+ * example: [hash]
987
+ * createTransaction('0x0', 'createContract', [hash])
988
+ *
989
+ * @param {String} to - the contract address for the contract to interact with
990
+ * @param {String} method - the method/function to run
991
+ * @param {Array} params - array of paramters to apply to the contract method
992
+ * @param {Number} nonce - total transaction count [optional]
993
+ */
994
+ async createTransaction(to, method, params, nonce, signature) {
995
+ return this.createTransactionFrom(peernet.id, to, method, params, nonce)
996
+ }
997
+
998
+
999
+
1000
+ /**
1001
+ *
1002
+ * @param {Object} transaction {}
1003
+ * @param {String} transaction.from address
1004
+ * @param {String} transaction.to address
1005
+ * @param {Object} transaction.params {}
1006
+ * @param {String} transaction.params.method get, call
1007
+ * @param {Buffer} transaction.params.data
1008
+ * @returns
1009
+ */
1010
+ async createTransactionHash(transaction) {
1011
+ // todo: validate
1012
+ const peernetHash = await new CodecHash(transaction, {name: 'transaction-message'});
1013
+ return peernetHash.digest
1014
+ }
1015
+
1016
+ /**
1017
+ * @params {object} transaction -
1018
+ * @params {object} wallet - any wallet/signer that supports sign(RAWtransaction)
1019
+ */
1020
+ async #signTransaction (transaction, wallet) {
1021
+ return wallet.sign(await this.createTransactionHash(transaction))
1022
+ }
1023
+
1024
+ async signTransaction(transaction, signer) {
1025
+ let identity = await walletStore.get('identity');
1026
+ identity = JSON.parse(new TextDecoder().decode(identity));
1027
+ const wallet = new MultiWallet(peernet.network);
1028
+ wallet.recover(identity.mnemonic);
1029
+ const account = wallet.account(0).external(0);
1030
+ transaction.signature = await this.#signTransaction(transaction, account);
1031
+ transaction.signature = bs32.encode(transaction.signature);
1032
+ return transaction
1033
+ }
1034
+
1035
+ /**
1036
+ *
1037
+ * @param {Object} transaction
1038
+ * @param {Address} transaction.from
1039
+ * @param {Address} transaction.to
1040
+ * @param {String} transaction.method
1041
+ * @param {Array} transaction.params
1042
+ * @param {Number} transaction.nonce
1043
+ *
1044
+ * @returns {Object} transaction
1045
+ */
1046
+ async createRawTransaction(transaction) {
1047
+ if (!transaction.from) transaction.from = peernet.id;
1048
+ transaction.timestamp = Date.now();
1049
+
1050
+ if (transaction.nonce === undefined) {
1051
+ transaction.nonce = await this.getNonce(transaction.from);
1052
+ } else {
1053
+ let nonce = await accountsStore.get(transaction.from);
1054
+ nonce = new TextDecoder().decode(nonce);
1055
+ if (transaction.nonce < nonce) throw Error(`a transaction with a higher nonce already exists`)
1056
+ if (transaction.nonce === nonce) throw Error(`a transaction with the same nonce already exists`)
1057
+ }
1058
+ return transaction
1059
+ }
1060
+ /**
1061
+ * every tx done is trough contracts so no need for amount
1062
+ * data is undefined when nothing is returned
1063
+ * error is thrown on error so undefined data doesn't mean there is an error...
1064
+ *
1065
+ * @param {String} from - the sender address
1066
+ * @param {String} to - the contract address for the contract to interact with
1067
+ * @param {String} method - the method/function to run
1068
+ * @param {Array} params - array of paramters to apply to the contract method
1069
+ * @param {Number} nonce - total transaction count [optional]
1070
+ */
1071
+ async createTransactionFrom(from, to, method, params, nonce) {
1072
+ try {
1073
+
1074
+ const rawTransaction = await this.createRawTransaction({from, to, nonce, method, params});
1075
+ const transaction = await this.signTransaction(rawTransaction, from);
1076
+ const message = await new TransactionMessage(transaction);
1077
+
1078
+ let data;
1079
+ // await transactionPoolStore.put(message.hash, new TextEncoder().encode(JSON.stringify({signature, message: message.encoded})))
1080
+ const wait = () => new Promise(async (resolve, reject) => {
1081
+ if (pubsub.subscribers[`transaction.completed.${await message.hash}`]) {
1082
+ const result = pubsub.subscribers[`transaction.completed.${await message.hash}`].value;
1083
+ result.status === 'fulfilled' ? resolve(await result.hash) : reject({hash: await result.hash, error: result.error});
1084
+ } else {
1085
+ const completed = async result => {
1086
+ result.status === 'fulfilled' ? resolve(await result.hash) : reject({hash: await result.hash, error: result.error});
1087
+
1088
+ setTimeout(async () => {
1089
+ pubsub.unsubscribe(`transaction.completed.${await message.hash}`, completed);
1090
+ }, 10000);
1091
+ };
1092
+ pubsub.subscribe(`transaction.completed.${await message.hash}`, completed);
1093
+ }
1094
+
1095
+
1096
+ });
1097
+
1098
+ await transactionPoolStore.put(await message.hash, message.encoded);
1099
+ peernet.publish('add-transaction', message.encoded);
1100
+ this.#addTransaction(message.encoded);
1101
+ return {hash: await message.hash, data, fee: await calculateFee(message.decoded), wait}
1102
+ } catch (e) {
1103
+ console.log(e);
1104
+ console.log(e);
1105
+ throw e
1106
+ }
1107
+
1108
+ }
1109
+
1110
+ async createContractMessage(creator, contract, constructorParameters = []) {
1111
+ return createContractMessage(creator, contract, constructorParameters = [])
1112
+ }
1113
+
1114
+ async createContractAddress(creator, contract, constructorParameters = []) {
1115
+ contract = await this.createContractMessage(creator, contract, constructorParameters);
1116
+ return contract.hash
1117
+ }
1118
+
1119
+ /**
1120
+ *
1121
+ * @param {String} contract - a contract string (see plugins/deployContract)
1122
+ */
1123
+ async deployContract(contract, params = []) {
1124
+ globalThis.msg = {sender: peernet.id, call: this.call};
1125
+
1126
+ const hash = await this.createContractAddress(creator, contract, params);
1127
+ console.log(hash);
1128
+ try {
1129
+ const tx = await this.createTransactionFrom(peernet.id, addresses.contractFactory, 'deployContract', [hash, creator, contract, constructorParameters]);
1130
+ } catch (e) {
1131
+ throw e
1132
+ }
1133
+ return this.#machine.addContract(message)
1134
+ }
1135
+
1136
+ #createMessage(sender = peernet.id) {
1137
+ return {
1138
+ sender: peernet.id,
1139
+ call: this.call,
1140
+ staticCall: this.staticCall,
1141
+ delegate: this.delegate,
1142
+ staticDelegate: this.staticDelegate
1143
+ }
1144
+ }
1145
+
1146
+ internalCall(sender, contract, method, params) {
1147
+ globalThis.msg = this.#createMessage(sender);
1148
+
1149
+ return this.#machine.execute(contract, method, params)
1150
+ }
1151
+
1152
+ call(contract, method, params) {
1153
+ globalThis.msg = this.#createMessage();
1154
+
1155
+ return this.#machine.execute(contract, method, params)
1156
+ }
1157
+
1158
+ staticCall(contract, method, params) {
1159
+ globalThis.msg = this.#createMessage();
1160
+ return this.#machine.get(contract, method, params)
1161
+ }
1162
+
1163
+ delegate(contract, method, params) {
1164
+ globalThis.msg = this.#createMessage();
1165
+
1166
+ return this.#machine.execute(contract, method, params)
1167
+ }
1168
+
1169
+ staticDelegate(contract, method, params) {
1170
+ globalThis.msg = this.#createMessage();
1171
+
1172
+ return this.#machine.get(contract, method, params)
1173
+ }
1174
+
1175
+ mint(to, amount) {
1176
+ return this.call(addresses.nativeToken, 'mint', [to, amount])
1177
+ }
1178
+
1179
+ transfer(from, to, amount) {
1180
+ return this.call(addresses.nativeToken, 'transfer', [from, to, amount])
1181
+ }
1182
+
1183
+ get balances() {
1184
+ return this.staticCall(addresses.nativeToken, 'balances')
1185
+ }
1186
+
1187
+ deleteAll() {
1188
+ return this.#machine.deleteAll()
1189
+ }
1190
+
1191
+ /**
1192
+ * lookup an address for a registered name using the builtin nameService
1193
+ * @check nameService
1194
+ *
1195
+ * @param {String} - contractName
1196
+ * @returns {String} - address
1197
+ *
1198
+ * @example chain.lookup('myCoolContractName') // qmqsfddfdgfg...
1199
+ */
1200
+ lookup(name) {
1201
+ return this.call(addresses.nameService, 'lookup', [name])
1202
+ }
1203
+ }
1204
+
1205
+ export { Chain as default };