@acala-network/chopsticks 0.2.3 → 0.3.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 (57) hide show
  1. package/README.md +6 -0
  2. package/dist/api.d.ts +3 -2
  3. package/dist/api.js +15 -20
  4. package/dist/blockchain/block-builder.d.ts +4 -0
  5. package/dist/blockchain/block-builder.js +71 -0
  6. package/dist/blockchain/block.d.ts +5 -3
  7. package/dist/blockchain/block.js +22 -23
  8. package/dist/blockchain/head-state.d.ts +4 -2
  9. package/dist/blockchain/head-state.js +13 -7
  10. package/dist/blockchain/index.d.ts +7 -8
  11. package/dist/blockchain/index.js +26 -26
  12. package/dist/blockchain/inherent/index.d.ts +17 -0
  13. package/dist/blockchain/inherent/index.js +32 -0
  14. package/dist/blockchain/inherent/para-enter.d.ts +7 -0
  15. package/dist/blockchain/inherent/para-enter.js +33 -0
  16. package/dist/blockchain/inherent/parachain/validation-data.d.ts +25 -0
  17. package/dist/blockchain/{inherents.js → inherent/parachain/validation-data.js} +77 -46
  18. package/dist/blockchain/txpool.d.ts +17 -2
  19. package/dist/blockchain/txpool.js +46 -81
  20. package/dist/decode-key.d.ts +2 -0
  21. package/dist/decode-key.js +24 -0
  22. package/dist/executor.d.ts +17 -3
  23. package/dist/executor.js +43 -3
  24. package/dist/executor.test.js +16 -9
  25. package/dist/genesis-provider.d.ts +5 -0
  26. package/dist/genesis-provider.js +15 -3
  27. package/dist/index.d.ts +1 -18
  28. package/dist/index.js +43 -147
  29. package/dist/rpc/dev.js +11 -1
  30. package/dist/rpc/shared.d.ts +0 -4
  31. package/dist/rpc/substrate/author.d.ts +1 -1
  32. package/dist/rpc/substrate/author.js +7 -2
  33. package/dist/rpc/substrate/chain.js +2 -2
  34. package/dist/rpc/substrate/state.js +1 -1
  35. package/dist/rpc/substrate/system.js +3 -3
  36. package/dist/run-block.d.ts +2 -0
  37. package/dist/run-block.js +36 -0
  38. package/dist/schema/index.js +1 -1
  39. package/dist/server.d.ts +3 -3
  40. package/dist/server.js +26 -11
  41. package/dist/setup-with-server.d.ts +8 -0
  42. package/dist/setup-with-server.js +23 -0
  43. package/dist/setup.d.ts +10 -0
  44. package/dist/setup.js +62 -0
  45. package/dist/utils/index.d.ts +2 -0
  46. package/dist/utils/index.js +9 -1
  47. package/dist/utils/proof.d.ts +10 -2
  48. package/dist/utils/proof.js +12 -8
  49. package/dist/utils/set-storage.d.ts +2 -1
  50. package/dist/utils/time-travel.d.ts +5 -0
  51. package/dist/utils/time-travel.js +64 -0
  52. package/dist/xcm/index.d.ts +3 -0
  53. package/dist/xcm/index.js +67 -0
  54. package/package.json +5 -5
  55. package/dist/bindings.d.ts +0 -2
  56. package/dist/bindings.js +0 -31
  57. package/dist/blockchain/inherents.d.ts +0 -24
package/dist/index.js CHANGED
@@ -3,146 +3,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.decodeKey = exports.runBlock = exports.setupWithServer = exports.setup = void 0;
7
- require("@polkadot/types-codec");
8
- const api_1 = require("@polkadot/api");
9
- const util_1 = require("@polkadot/util");
10
6
  const helpers_1 = require("yargs/helpers");
11
7
  const node_fs_1 = require("node:fs");
12
8
  const js_yaml_1 = __importDefault(require("js-yaml"));
13
9
  const yargs_1 = __importDefault(require("yargs"));
14
- const api_2 = require("./api");
15
- const blockchain_1 = require("./blockchain");
16
10
  const txpool_1 = require("./blockchain/txpool");
17
11
  const schema_1 = require("./schema");
18
- const genesis_provider_1 = require("./genesis-provider");
19
- const inherents_1 = require("./blockchain/inherents");
20
- const server_1 = require("./server");
21
- const logger_1 = require("./logger");
22
- const rpc_1 = require("./rpc");
23
- const import_storage_1 = require("./utils/import-storage");
24
- const db_1 = require("./db");
25
- const executor_1 = require("./executor");
26
- const setup = async (argv) => {
27
- let provider;
28
- if (argv.genesis) {
29
- if (typeof argv.genesis === 'string') {
30
- provider = await genesis_provider_1.GenesisProvider.fromUrl(argv.genesis);
31
- }
32
- else {
33
- provider = new genesis_provider_1.GenesisProvider(argv.genesis);
34
- }
35
- }
36
- else {
37
- provider = new api_1.WsProvider(argv.endpoint);
38
- }
39
- const api = new api_2.Api(provider);
40
- await api.isReady;
41
- let blockHash;
42
- if (argv.block == null) {
43
- blockHash = await api.getBlockHash();
44
- }
45
- else if (Number.isInteger(argv.block)) {
46
- blockHash = await api.getBlockHash(Number(argv.block));
47
- }
48
- else {
49
- blockHash = argv.block;
50
- }
51
- logger_1.defaultLogger.info({ ...argv, blockHash }, 'Args');
52
- let db;
53
- if (argv.db) {
54
- db = await (0, db_1.openDb)(argv.db);
55
- }
56
- const header = await api.getHeader(blockHash);
57
- const blockNumber = +header.number;
58
- const timestamp = argv.timestamp ?? Date.now();
59
- const setTimestamp = new inherents_1.SetTimestamp((newBlockNumber) => {
60
- return timestamp + (newBlockNumber - blockNumber) * 12000; // TODO: make this more flexible
61
- });
62
- const inherents = new inherents_1.InherentProviders(setTimestamp, [new inherents_1.SetValidationData()]);
63
- const chain = new blockchain_1.Blockchain({
64
- api,
65
- buildBlockMode: argv['build-block-mode'],
66
- inherentProvider: inherents,
67
- db,
68
- header: {
69
- hash: blockHash,
70
- number: Number(header.number),
71
- },
72
- });
73
- const context = { chain, api, ws: provider };
74
- await (0, import_storage_1.importStorage)(chain, argv['import-storage']);
75
- await (0, import_storage_1.overrideWasm)(chain, argv['wasm-override']);
76
- return context;
77
- };
78
- exports.setup = setup;
79
- const setupWithServer = async (argv) => {
80
- const context = await (0, exports.setup)(argv);
81
- const port = argv.port || Number(process.env.PORT) || 8000;
82
- const { close } = (0, server_1.createServer)(port, (0, rpc_1.handler)(context));
83
- if (argv.genesis) {
84
- // mine 1st block when starting from genesis to set some mock validation data
85
- await context.chain.newBlock();
86
- }
87
- return {
88
- ...context,
89
- close,
90
- };
91
- };
92
- exports.setupWithServer = setupWithServer;
93
- const runBlock = async (argv) => {
94
- const context = await (0, exports.setupWithServer)(argv);
95
- const header = await context.chain.head.header;
96
- const parent = header.parentHash.toHex();
97
- const wasm = await context.chain.head.wasm;
98
- const block = context.chain.head;
99
- const calls = [['Core_initialize_block', header.toHex()]];
100
- for (const extrinsic of await block.extrinsics) {
101
- calls.push(['BlockBuilder_apply_extrinsic', extrinsic]);
102
- }
103
- calls.push(['BlockBuilder_finalize_block', '0x']);
104
- const result = await (0, executor_1.runTask)({
105
- blockHash: parent,
106
- wasm,
107
- calls,
108
- storage: [],
109
- mockSignatureHost: false,
110
- allowUnresolvedImports: false,
111
- });
112
- if (argv['output-path']) {
113
- (0, node_fs_1.writeFileSync)(argv['output-path'], JSON.stringify(result, null, 2));
114
- }
115
- else {
116
- console.dir(result, { depth: null, colors: false });
117
- }
118
- await context.close();
119
- setTimeout(() => process.exit(0), 50);
120
- };
121
- exports.runBlock = runBlock;
122
- const decodeKey = async (argv) => {
123
- const context = await (0, exports.setup)(argv);
124
- const key = argv.key;
125
- const meta = await context.chain.head.meta;
126
- outer: for (const module of Object.values(meta.query)) {
127
- for (const storage of Object.values(module)) {
128
- const keyPrefix = (0, util_1.u8aToHex)(storage.keyPrefix());
129
- if (key.startsWith(keyPrefix)) {
130
- const decodedKey = meta.registry.createType('StorageKey', key);
131
- decodedKey.setMeta(storage.meta);
132
- console.log(`${storage.section}.${storage.method}`, decodedKey.args.map((x) => x.toHuman()).join(', '));
133
- break outer;
134
- }
135
- }
136
- }
137
- setTimeout(() => process.exit(0), 50);
12
+ const xcm_1 = require("./xcm");
13
+ const decode_key_1 = require("./decode-key");
14
+ const run_block_1 = require("./run-block");
15
+ const setup_with_server_1 = require("./setup-with-server");
16
+ const processConfig = (path) => {
17
+ const configFile = (0, node_fs_1.readFileSync)(path, 'utf8');
18
+ const config = js_yaml_1.default.load(configFile);
19
+ return schema_1.configSchema.parse(config);
138
20
  };
139
- exports.decodeKey = decodeKey;
140
- const processConfig = (argv) => {
21
+ const processArgv = (argv) => {
141
22
  if (argv.config) {
142
- const configFile = (0, node_fs_1.readFileSync)(argv.config, 'utf8');
143
- const config = js_yaml_1.default.load(configFile);
144
- const parsed = schema_1.configSchema.parse(config);
145
- return { ...parsed, ...argv };
23
+ return { ...processConfig(argv.config), ...argv };
146
24
  }
147
25
  return argv;
148
26
  };
@@ -180,11 +58,8 @@ const defaultOptions = {
180
58
  desc: 'File path to print output',
181
59
  string: true,
182
60
  },
183
- }), (argv) => {
184
- (0, exports.runBlock)(processConfig(argv)).catch((err) => {
185
- console.error(err);
186
- process.exit(1);
187
- });
61
+ }), async (argv) => {
62
+ await (0, run_block_1.runBlock)(processArgv(argv));
188
63
  })
189
64
  .command('dev', 'Dev mode', (yargs) => yargs.options({
190
65
  ...defaultOptions,
@@ -204,11 +79,8 @@ const defaultOptions = {
204
79
  desc: 'Mock signature host so any signature starts with 0xdeadbeef and filled by 0xcd is considered valid',
205
80
  boolean: true,
206
81
  },
207
- }), (argv) => {
208
- (0, exports.setupWithServer)(processConfig(argv)).catch((err) => {
209
- console.error(err);
210
- process.exit(1);
211
- });
82
+ }), async (argv) => {
83
+ await (0, setup_with_server_1.setupWithServer)(processArgv(argv));
212
84
  })
213
85
  .command('decode-key <key>', 'Deocde a key', (yargs) => yargs
214
86
  .positional('key', {
@@ -217,11 +89,35 @@ const defaultOptions = {
217
89
  })
218
90
  .options({
219
91
  ...defaultOptions,
220
- }), (argv) => {
221
- (0, exports.decodeKey)(processConfig(argv)).catch((err) => {
222
- console.error(err);
223
- process.exit(1);
224
- });
92
+ }), async (argv) => {
93
+ await (0, decode_key_1.decodeKey)(processArgv(argv));
94
+ })
95
+ .command('xcm', 'XCM setup with relaychain and parachains', (yargs) => yargs.options({
96
+ relaychain: {
97
+ desc: 'Relaychain config file path',
98
+ string: true,
99
+ },
100
+ parachain: {
101
+ desc: 'Parachain config file path',
102
+ type: 'array',
103
+ string: true,
104
+ required: true,
105
+ },
106
+ }), async (argv) => {
107
+ const parachains = [];
108
+ for (const config of argv.parachain) {
109
+ const { chain } = await (0, setup_with_server_1.setupWithServer)(processConfig(config));
110
+ parachains.push(chain);
111
+ }
112
+ if (parachains.length > 1) {
113
+ await (0, xcm_1.connectParachains)(parachains);
114
+ }
115
+ if (argv.relaychain) {
116
+ const { chain: relaychain } = await (0, setup_with_server_1.setupWithServer)(processConfig(argv.relaychain));
117
+ for (const parachain of parachains) {
118
+ await (0, xcm_1.connectDownward)(relaychain, parachain);
119
+ }
120
+ }
225
121
  })
226
122
  .strict()
227
123
  .help()
package/dist/rpc/dev.js CHANGED
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const shared_1 = require("./shared");
4
4
  const set_storage_1 = require("../utils/set-storage");
5
5
  const logger_1 = require("../logger");
6
+ const time_travel_1 = require("../utils/time-travel");
6
7
  const logger = logger_1.defaultLogger.child({ name: 'rpc-dev' });
7
8
  const handlers = {
8
9
  dev_newBlock: async (context, [param]) => {
@@ -12,7 +13,9 @@ const handlers = {
12
13
  const finalCount = diff > 0 ? diff : 1;
13
14
  let finalHash;
14
15
  for (let i = 0; i < finalCount; i++) {
15
- const block = await context.chain.newBlock();
16
+ const block = await context.chain.newBlock().catch((error) => {
17
+ throw new shared_1.ResponseError(1, error.toString());
18
+ });
16
19
  logger.debug({ hash: block.hash }, 'dev_newBlock');
17
20
  finalHash = block.hash;
18
21
  }
@@ -29,5 +32,12 @@ const handlers = {
29
32
  }, 'dev_setStorages');
30
33
  return hash;
31
34
  },
35
+ dev_timeTravel: async (context, [date]) => {
36
+ const timestamp = typeof date === 'string' ? Date.parse(date) : date;
37
+ if (Number.isNaN(timestamp))
38
+ throw new shared_1.ResponseError(1, 'Invalid date');
39
+ await (0, time_travel_1.timeTravel)(context.chain, timestamp);
40
+ return timestamp;
41
+ },
32
42
  };
33
43
  exports.default = handlers;
@@ -1,5 +1,3 @@
1
- import { ProviderInterface } from '@polkadot/rpc-provider/types';
2
- import { Api } from '../api';
3
1
  import { Blockchain } from '../blockchain';
4
2
  export declare const logger: import("pino").default.Logger<{
5
3
  level: string;
@@ -17,8 +15,6 @@ export declare class ResponseError extends Error {
17
15
  }
18
16
  export interface Context {
19
17
  chain: Blockchain;
20
- api: Api;
21
- ws: ProviderInterface;
22
18
  }
23
19
  export interface SubscriptionManager {
24
20
  subscribe: (method: string, subid: string, onCancel?: () => void) => (data: any) => void;
@@ -1,3 +1,3 @@
1
- import { Handlers } from '../shared';
1
+ import { Handlers } from '../../rpc/shared';
2
2
  declare const handlers: Handlers;
3
3
  export default handlers;
@@ -1,10 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ const shared_1 = require("../../rpc/shared");
3
4
  const logger_1 = require("../../logger");
4
5
  const logger = logger_1.defaultLogger.child({ name: 'rpc-author' });
5
6
  const handlers = {
6
7
  author_submitExtrinsic: async (context, [extrinsic]) => {
7
- return context.chain.submitExtrinsic(extrinsic);
8
+ return context.chain.submitExtrinsic(extrinsic).catch((error) => {
9
+ throw new shared_1.ResponseError(1, error.toString());
10
+ });
8
11
  },
9
12
  author_submitAndWatchExtrinsic: async (context, [extrinsic], { subscribe, unsubscribe }) => {
10
13
  let update = (_block) => { };
@@ -38,6 +41,8 @@ const handlers = {
38
41
  author_unwatchExtrinsic: async (_context, [subid], { unsubscribe }) => {
39
42
  unsubscribe(subid);
40
43
  },
41
- author_pendingExtrinsics: async (_context) => [],
44
+ author_pendingExtrinsics: async (context) => {
45
+ return context.chain.pendingExtrinsics;
46
+ },
42
47
  };
43
48
  exports.default = handlers;
@@ -5,7 +5,7 @@ const handlers = {
5
5
  chain_getBlockHash: async (context, [blockNumber]) => {
6
6
  const block = await context.chain.getBlockAt(blockNumber);
7
7
  if (!block) {
8
- throw new shared_1.ResponseError(1, 'Block not found');
8
+ throw new shared_1.ResponseError(1, `Block #${blockNumber} not found`);
9
9
  }
10
10
  return block.hash;
11
11
  },
@@ -15,7 +15,7 @@ const handlers = {
15
15
  chain_getBlock: async (context, [hash]) => {
16
16
  const block = await context.chain.getBlock(hash);
17
17
  if (!block) {
18
- throw new shared_1.ResponseError(1, 'Block not found');
18
+ throw new shared_1.ResponseError(1, `Block ${hash} not found`);
19
19
  }
20
20
  return {
21
21
  block: {
@@ -41,7 +41,7 @@ const handlers = {
41
41
  },
42
42
  state_subscribeRuntimeVersion: async (context, _params, { subscribe }) => {
43
43
  let update = (_block) => { };
44
- const id = context.chain.headState.subscrubeRuntimeVersion((block) => update(block));
44
+ const id = await context.chain.headState.subscrubeRuntimeVersion((block) => update(block));
45
45
  const callback = subscribe('state_runtimeVersion', id);
46
46
  update = async (block) => callback(await block.runtimeVersion);
47
47
  context.chain.head.runtimeVersion.then(callback);
@@ -2,13 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  const handlers = {
4
4
  system_chain: async (context) => {
5
- return context.api.getSystemChain();
5
+ return context.chain.api.getSystemChain();
6
6
  },
7
7
  system_properties: async (context) => {
8
- return context.api.getSystemProperties();
8
+ return context.chain.api.getSystemProperties();
9
9
  },
10
10
  system_name: async (context) => {
11
- return context.api.getSystemName();
11
+ return context.chain.api.getSystemName();
12
12
  },
13
13
  system_version: async (_context) => {
14
14
  return 'chopsticks-1.1.0';
@@ -0,0 +1,2 @@
1
+ import { Config } from './schema';
2
+ export declare const runBlock: (argv: Config) => Promise<void>;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runBlock = void 0;
4
+ const node_fs_1 = require("node:fs");
5
+ const executor_1 = require("./executor");
6
+ const setup_with_server_1 = require("./setup-with-server");
7
+ const runBlock = async (argv) => {
8
+ const context = await (0, setup_with_server_1.setupWithServer)(argv);
9
+ const header = await context.chain.head.header;
10
+ const wasm = await context.chain.head.wasm;
11
+ const block = context.chain.head;
12
+ const parent = await block.parentBlock;
13
+ if (!parent)
14
+ throw Error('cant find parent block');
15
+ const calls = [['Core_initialize_block', header.toHex()]];
16
+ for (const extrinsic of await block.extrinsics) {
17
+ calls.push(['BlockBuilder_apply_extrinsic', extrinsic]);
18
+ }
19
+ calls.push(['BlockBuilder_finalize_block', '0x']);
20
+ const result = await (0, executor_1.runTask)({
21
+ wasm,
22
+ calls,
23
+ storage: [],
24
+ mockSignatureHost: false,
25
+ allowUnresolvedImports: false,
26
+ }, (0, executor_1.taskHandler)(parent));
27
+ if (argv['output-path']) {
28
+ (0, node_fs_1.writeFileSync)(argv['output-path'], JSON.stringify(result, null, 2));
29
+ }
30
+ else {
31
+ console.dir(result, { depth: null, colors: false });
32
+ }
33
+ await context.close();
34
+ setTimeout(() => process.exit(0), 50);
35
+ };
36
+ exports.runBlock = runBlock;
@@ -17,7 +17,7 @@ exports.configSchema = zod_1.z
17
17
  .object({
18
18
  port: zod_1.z.number().optional(),
19
19
  endpoint: zod_1.z.string().optional(),
20
- block: zod_1.z.union([zod_1.z.string(), zod_1.z.number()]).optional(),
20
+ block: zod_1.z.union([zod_1.z.string().length(66).startsWith('0x'), zod_1.z.number()]).optional(),
21
21
  'build-block-mode': zod_1.z.nativeEnum(txpool_1.BuildBlockMode).optional(),
22
22
  'import-storage': zod_1.z.any().optional(),
23
23
  'mock-signature-host': zod_1.z.boolean().optional(),
package/dist/server.d.ts CHANGED
@@ -3,7 +3,7 @@ export type Handler = (data: {
3
3
  method: string;
4
4
  params: string[];
5
5
  }, subscriptionManager: SubscriptionManager) => Promise<any>;
6
- export declare const createServer: (port: number, handler: Handler) => {
7
- port: Promise<number>;
6
+ export declare const createServer: (handler: Handler, port?: number) => Promise<{
7
+ port: number;
8
8
  close: () => Promise<void>;
9
- };
9
+ }>;
package/dist/server.js CHANGED
@@ -35,19 +35,34 @@ const parseRequest = (request) => {
35
35
  return undefined;
36
36
  }
37
37
  };
38
- const createServer = (port, handler) => {
39
- logger.debug('Starting on port %d', port);
38
+ const createWS = async (port) => {
40
39
  const wss = new ws_1.WebSocketServer({ port, maxPayload: 1024 * 1024 * 100 });
41
- const promise = new Promise((resolve, reject) => {
40
+ const promise = new Promise((resolve) => {
42
41
  wss.on('listening', () => {
43
- logger.debug(wss.address(), 'Listening');
44
- resolve(wss.address().port);
42
+ resolve([wss, wss.address().port]);
45
43
  });
46
- wss.on('error', (err) => {
47
- logger.error(err, 'Error');
48
- reject(err);
44
+ wss.on('error', (_) => {
45
+ resolve([]);
49
46
  });
50
47
  });
48
+ return promise;
49
+ };
50
+ const createServer = async (handler, port) => {
51
+ let wss;
52
+ let listenPort;
53
+ for (let i = 0; i < 5; i++) {
54
+ const preferPort = (port || 0) + i;
55
+ logger.debug('Try starting on port %d', preferPort);
56
+ const [maybeWss, maybeListenPort] = await createWS(preferPort);
57
+ if (maybeWss && maybeListenPort) {
58
+ wss = maybeWss;
59
+ listenPort = maybeListenPort;
60
+ break;
61
+ }
62
+ }
63
+ if (!wss || !listenPort) {
64
+ throw new Error(`Failed to create WebsocketServer at port ${port}`);
65
+ }
51
66
  wss.on('connection', (ws) => {
52
67
  logger.debug('New connection');
53
68
  const send = (data) => {
@@ -131,10 +146,10 @@ const createServer = (port, handler) => {
131
146
  });
132
147
  });
133
148
  return {
134
- port: promise,
149
+ port: listenPort,
135
150
  close: () => new Promise((resolve, reject) => {
136
- wss.clients.forEach((socket) => socket.close());
137
- wss.close((err) => {
151
+ wss?.clients.forEach((socket) => socket.close());
152
+ wss?.close((err) => {
138
153
  if (err) {
139
154
  reject(err);
140
155
  }
@@ -0,0 +1,8 @@
1
+ import { Config } from './schema';
2
+ export declare const setupWithServer: (argv: Config) => Promise<{
3
+ close: () => Promise<void>;
4
+ listenPort: number;
5
+ chain: import("./blockchain").Blockchain;
6
+ api: import("./api").Api;
7
+ ws: import("@polkadot/rpc-provider/types").ProviderInterface;
8
+ }>;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setupWithServer = void 0;
4
+ const server_1 = require("./server");
5
+ const rpc_1 = require("./rpc");
6
+ const shared_1 = require("./rpc/shared");
7
+ const setup_1 = require("./setup");
8
+ const setupWithServer = async (argv) => {
9
+ const context = await (0, setup_1.setup)(argv);
10
+ const port = argv.port || Number(process.env.PORT) || 8000;
11
+ if (argv.genesis) {
12
+ // mine 1st block when starting from genesis to set some mock validation data
13
+ await context.chain.newBlock();
14
+ }
15
+ const { close, port: listenPort } = await (0, server_1.createServer)((0, rpc_1.handler)(context), port);
16
+ shared_1.logger.info(`${await context.chain.api.getSystemChain()} RPC listening on port ${listenPort}`);
17
+ return {
18
+ ...context,
19
+ close,
20
+ listenPort,
21
+ };
22
+ };
23
+ exports.setupWithServer = setupWithServer;
@@ -0,0 +1,10 @@
1
+ import '@polkadot/types-codec';
2
+ import { ProviderInterface } from '@polkadot/rpc-provider/types';
3
+ import { Api } from './api';
4
+ import { Blockchain } from './blockchain';
5
+ import { Config } from './schema';
6
+ export declare const setup: (argv: Config) => Promise<{
7
+ chain: Blockchain;
8
+ api: Api;
9
+ ws: ProviderInterface;
10
+ }>;
package/dist/setup.js ADDED
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setup = void 0;
4
+ require("@polkadot/types-codec");
5
+ const api_1 = require("@polkadot/api");
6
+ const api_2 = require("./api");
7
+ const blockchain_1 = require("./blockchain");
8
+ const genesis_provider_1 = require("./genesis-provider");
9
+ const inherent_1 = require("./blockchain/inherent");
10
+ const logger_1 = require("./logger");
11
+ const import_storage_1 = require("./utils/import-storage");
12
+ const db_1 = require("./db");
13
+ const time_travel_1 = require("./utils/time-travel");
14
+ const setup = async (argv) => {
15
+ let provider;
16
+ if (argv.genesis) {
17
+ if (typeof argv.genesis === 'string') {
18
+ provider = await genesis_provider_1.GenesisProvider.fromUrl(argv.genesis);
19
+ }
20
+ else {
21
+ provider = new genesis_provider_1.GenesisProvider(argv.genesis);
22
+ }
23
+ }
24
+ else {
25
+ provider = new api_1.WsProvider(argv.endpoint);
26
+ }
27
+ const api = new api_2.Api(provider);
28
+ await api.isReady;
29
+ let blockHash;
30
+ if (argv.block == null) {
31
+ blockHash = await api.getBlockHash();
32
+ }
33
+ else if (Number.isInteger(argv.block)) {
34
+ blockHash = await api.getBlockHash(Number(argv.block));
35
+ }
36
+ else {
37
+ blockHash = argv.block;
38
+ }
39
+ logger_1.defaultLogger.debug({ ...argv, blockHash }, 'Args');
40
+ let db;
41
+ if (argv.db) {
42
+ db = await (0, db_1.openDb)(argv.db);
43
+ }
44
+ const header = await api.getHeader(blockHash);
45
+ const inherents = new inherent_1.InherentProviders(new inherent_1.SetTimestamp(), [new inherent_1.SetValidationData(), new inherent_1.ParaInherentEnter()]);
46
+ const chain = new blockchain_1.Blockchain({
47
+ api,
48
+ buildBlockMode: argv['build-block-mode'],
49
+ inherentProvider: inherents,
50
+ db,
51
+ header: {
52
+ hash: blockHash,
53
+ number: Number(header.number),
54
+ },
55
+ });
56
+ if (argv.timestamp)
57
+ await (0, time_travel_1.timeTravel)(chain, argv.timestamp);
58
+ await (0, import_storage_1.importStorage)(chain, argv['import-storage']);
59
+ await (0, import_storage_1.overrideWasm)(chain, argv['wasm-override']);
60
+ return { chain, api, ws: provider };
61
+ };
62
+ exports.setup = setup;
@@ -1,7 +1,9 @@
1
1
  import { HexString } from '@polkadot/util/types';
2
2
  import { StorageKey } from '@polkadot/types';
3
+ import { Blockchain } from '../blockchain';
3
4
  export type GetKeys = (startKey?: string) => Promise<StorageKey<any>[]>;
4
5
  export type ProcessKey = (key: StorageKey<any>) => any;
5
6
  export declare function fetchKeys(getKeys: GetKeys, processKey: ProcessKey): Promise<void>;
6
7
  export declare function fetchKeysToArray(getKeys: GetKeys): Promise<StorageKey<any>[]>;
7
8
  export declare const compactHex: (value: Uint8Array) => HexString;
9
+ export declare const getParaId: (chain: Blockchain) => Promise<import("@polkadot/types").u32>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.compactHex = exports.fetchKeysToArray = exports.fetchKeys = void 0;
3
+ exports.getParaId = exports.compactHex = exports.fetchKeysToArray = exports.fetchKeys = void 0;
4
4
  const util_1 = require("@polkadot/util");
5
5
  async function fetchKeys(getKeys, processKey) {
6
6
  const processKeys = async (keys) => {
@@ -30,3 +30,11 @@ const compactHex = (value) => {
30
30
  return (0, util_1.u8aToHex)((0, util_1.compactStripLength)(value)[1]);
31
31
  };
32
32
  exports.compactHex = compactHex;
33
+ const getParaId = async (chain) => {
34
+ const meta = await chain.head.meta;
35
+ const raw = await chain.head.get((0, exports.compactHex)(meta.query.parachainInfo.parachainId()));
36
+ if (!raw)
37
+ throw new Error('Cannot find parachain id');
38
+ return meta.registry.createType('u32', (0, util_1.hexToU8a)(raw));
39
+ };
40
+ exports.getParaId = getParaId;
@@ -1,7 +1,15 @@
1
- import { HexString } from '@polkadot/util/types';
1
+ import { HrmpChannelId } from '@polkadot/types/interfaces';
2
2
  import { u32 } from '@polkadot/types';
3
- export declare const WELL_KNOWN_KEYS: Record<string, HexString>;
3
+ export declare const WELL_KNOWN_KEYS: {
4
+ EPOCH_INDEX: `0x${string}`;
5
+ CURRENT_BLOCK_RANDOMNESS: `0x${string}`;
6
+ ONE_EPOCH_AGO_RANDOMNESS: `0x${string}`;
7
+ TWO_EPOCHS_AGO_RANDOMNESS: `0x${string}`;
8
+ CURRENT_SLOT: `0x${string}`;
9
+ ACTIVE_CONFIG: `0x${string}`;
10
+ };
4
11
  export declare const dmqMqcHead: (paraId: u32) => `0x${string}`;
5
12
  export declare const upgradeGoAheadSignal: (paraId: u32) => `0x${string}`;
6
13
  export declare const hrmpIngressChannelIndex: (paraId: u32) => `0x${string}`;
7
14
  export declare const hrmpEgressChannelIndex: (paraId: u32) => `0x${string}`;
15
+ export declare const hrmpChannels: (channelId: HrmpChannelId) => `0x${string}`;