@acala-network/chopsticks 0.5.10 → 0.6.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.
@@ -8,6 +8,7 @@ import type { RuntimeVersion } from '../executor';
8
8
  export type TaskCallResponse = {
9
9
  result: HexString;
10
10
  storageDiff: [HexString, HexString | null][];
11
+ runtimeLogs: string[];
11
12
  };
12
13
  export declare class Block {
13
14
  #private;
@@ -7,6 +7,7 @@ const util_1 = require("@polkadot/types-known/util");
7
7
  const util_2 = require("@polkadot/util");
8
8
  const storage_layer_1 = require("./storage-layer");
9
9
  const utils_1 = require("../utils");
10
+ const logger_1 = require("../logger");
10
11
  const executor_1 = require("../executor");
11
12
  class Block {
12
13
  number;
@@ -172,9 +173,14 @@ class Block {
172
173
  storage,
173
174
  mockSignatureHost: this.#chain.mockSignatureHost,
174
175
  allowUnresolvedImports: this.#chain.allowUnresolvedImports,
176
+ runtimeLogLevel: this.#chain.runtimeLogLevel,
175
177
  }, (0, executor_1.taskHandler)(this));
176
- if (response.Call)
178
+ if (response.Call) {
179
+ for (const log of response.Call.runtimeLogs) {
180
+ logger_1.defaultLogger.info(`RuntimeLogs:\n${log}`);
181
+ }
177
182
  return response.Call;
183
+ }
178
184
  if (response.Error)
179
185
  throw Error(response.Error);
180
186
  throw Error('Unexpected response');
@@ -18,6 +18,7 @@ export interface Options {
18
18
  };
19
19
  mockSignatureHost?: boolean;
20
20
  allowUnresolvedImports?: boolean;
21
+ runtimeLogLevel?: number;
21
22
  registeredTypes: RegisteredTypes;
22
23
  }
23
24
  export declare class Blockchain {
@@ -27,9 +28,10 @@ export declare class Blockchain {
27
28
  readonly db: DataSource | undefined;
28
29
  readonly mockSignatureHost: boolean;
29
30
  readonly allowUnresolvedImports: boolean;
31
+ readonly runtimeLogLevel: number;
30
32
  readonly registeredTypes: RegisteredTypes;
31
33
  readonly headState: HeadState;
32
- constructor({ api, buildBlockMode, inherentProvider, db, header, mockSignatureHost, allowUnresolvedImports, registeredTypes, }: Options);
34
+ constructor({ api, buildBlockMode, inherentProvider, db, header, mockSignatureHost, allowUnresolvedImports, runtimeLogLevel, registeredTypes, }: Options);
33
35
  get head(): Block;
34
36
  get txPool(): TxPool;
35
37
  getBlockAt(number?: number): Promise<Block | undefined>;
@@ -16,6 +16,7 @@ class Blockchain {
16
16
  db;
17
17
  mockSignatureHost;
18
18
  allowUnresolvedImports;
19
+ runtimeLogLevel;
19
20
  registeredTypes;
20
21
  #txpool;
21
22
  #inherentProvider;
@@ -24,11 +25,12 @@ class Blockchain {
24
25
  #blocksByHash = {};
25
26
  #loadingBlocks = {};
26
27
  headState;
27
- constructor({ api, buildBlockMode, inherentProvider, db, header, mockSignatureHost = false, allowUnresolvedImports = false, registeredTypes = {}, }) {
28
+ constructor({ api, buildBlockMode, inherentProvider, db, header, mockSignatureHost = false, allowUnresolvedImports = false, runtimeLogLevel = 0, registeredTypes = {}, }) {
28
29
  this.api = api;
29
30
  this.db = db;
30
31
  this.mockSignatureHost = mockSignatureHost;
31
32
  this.allowUnresolvedImports = allowUnresolvedImports;
33
+ this.runtimeLogLevel = runtimeLogLevel;
32
34
  this.registeredTypes = registeredTypes;
33
35
  this.#head = new block_1.Block(this, header.number, header.hash);
34
36
  this.#registerBlock(this.#head);
@@ -28,6 +28,10 @@ export declare class TxPool {
28
28
  readonly event: EventEmitter;
29
29
  constructor(chain: Blockchain, inherentProvider: InherentProvider, mode?: BuildBlockMode);
30
30
  get pendingExtrinsics(): HexString[];
31
+ get ump(): Record<number, HexString[]>;
32
+ get dmp(): DownwardMessage[];
33
+ get hrmp(): Record<number, HorizontalMessage[]>;
34
+ clear(): void;
31
35
  pendingExtrinsicsBy(address: string): HexString[];
32
36
  submitExtrinsic(extrinsic: HexString): Promise<void>;
33
37
  submitUpwardMessages(id: number, ump: HexString[]): void;
@@ -36,6 +36,25 @@ class TxPool {
36
36
  get pendingExtrinsics() {
37
37
  return this.#pool.map(({ extrinsic }) => extrinsic);
38
38
  }
39
+ get ump() {
40
+ return this.#ump;
41
+ }
42
+ get dmp() {
43
+ return this.#dmp;
44
+ }
45
+ get hrmp() {
46
+ return this.#hrmp;
47
+ }
48
+ clear() {
49
+ this.#pool.length = 0;
50
+ for (const id of Object.keys(this.#ump)) {
51
+ delete this.#ump[id];
52
+ }
53
+ this.#dmp.length = 0;
54
+ for (const id of Object.keys(this.#hrmp)) {
55
+ delete this.#hrmp[id];
56
+ }
57
+ }
39
58
  pendingExtrinsicsBy(address) {
40
59
  return this.#pool.filter(({ signer }) => signer === address).map(({ extrinsic }) => extrinsic);
41
60
  }
package/lib/cli.js CHANGED
@@ -5,7 +5,9 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  const helpers_1 = require("yargs/helpers");
7
7
  const node_fs_1 = require("node:fs");
8
+ const lodash_1 = __importDefault(require("lodash"));
8
9
  const axios_1 = __importDefault(require("axios"));
10
+ const dotenv_1 = __importDefault(require("dotenv"));
9
11
  const js_yaml_1 = __importDefault(require("js-yaml"));
10
12
  const yargs_1 = __importDefault(require("yargs"));
11
13
  const _1 = require(".");
@@ -16,6 +18,7 @@ const dry_run_preimage_1 = require("./dry-run-preimage");
16
18
  const utils_1 = require("./utils");
17
19
  const run_block_1 = require("./run-block");
18
20
  const try_runtime_1 = require("./try-runtime");
21
+ dotenv_1.default.config();
19
22
  const processConfig = async (path) => {
20
23
  let file;
21
24
  if ((0, utils_1.isUrl)(path)) {
@@ -24,7 +27,7 @@ const processConfig = async (path) => {
24
27
  else {
25
28
  file = (0, node_fs_1.readFileSync)(path, 'utf8');
26
29
  }
27
- const config = js_yaml_1.default.load(file);
30
+ const config = js_yaml_1.default.load(lodash_1.default.template(file, { variable: 'env' })(process.env));
28
31
  return schema_1.configSchema.parse(config);
29
32
  };
30
33
  const processArgv = async (argv) => {
@@ -55,6 +58,10 @@ const defaultOptions = {
55
58
  desc: 'Path to config file',
56
59
  string: true,
57
60
  },
61
+ 'runtime-log-level': {
62
+ desc: 'Runtime maximum log level [off = 0; error = 1; warn = 2; info = 3; debug = 4; trace = 5]',
63
+ number: true,
64
+ },
58
65
  };
59
66
  (0, yargs_1.default)((0, helpers_1.hideBin)(process.argv))
60
67
  .scriptName('chopsticks')
@@ -67,10 +67,14 @@ const dryRunPreimage = async (argv) => {
67
67
  storage: [],
68
68
  mockSignatureHost: false,
69
69
  allowUnresolvedImports: false,
70
+ runtimeLogLevel: argv['runtime-log-level'] || 0,
70
71
  }, (0, executor_1.taskHandler)(block));
71
72
  if (result.Error) {
72
73
  throw new Error(result.Error);
73
74
  }
75
+ for (const logs of result.Call.runtimeLogs) {
76
+ logger_1.defaultLogger.info(`RuntimeLogs:\n${logs}`);
77
+ }
74
78
  const filePath = await (0, generate_html_diff_1.generateHtmlDiffPreviewFile)(block, result.Call.storageDiff, hash);
75
79
  console.log(`Generated preview ${filePath}`);
76
80
  if (argv['open']) {
@@ -85,9 +89,7 @@ const dryRunPreimage = async (argv) => {
85
89
  if (outcome.isErr) {
86
90
  throw new Error(outcome.asErr.toString());
87
91
  }
88
- else {
89
- logger_1.defaultLogger.info(outcome.toHuman(), 'dry_run_outcome');
90
- }
92
+ logger_1.defaultLogger.info(outcome.toHuman(), 'dry_run_outcome');
91
93
  const filePath = await (0, generate_html_diff_1.generateHtmlDiffPreviewFile)(context.chain.head, storageDiff, (0, util_crypto_1.blake2AsHex)(argv['extrinsic'], 256));
92
94
  console.log(`Generated preview ${filePath}`);
93
95
  if (argv['open']) {
package/lib/dry-run.js CHANGED
@@ -14,9 +14,7 @@ const dryRun = async (argv) => {
14
14
  if (outcome.isErr) {
15
15
  throw new Error(outcome.asErr.toString());
16
16
  }
17
- else {
18
- logger_1.defaultLogger.info(outcome.toHuman(), 'dry_run_outcome');
19
- }
17
+ logger_1.defaultLogger.info(outcome.toHuman(), 'dry_run_outcome');
20
18
  if (argv['html']) {
21
19
  const filePath = await (0, generate_html_diff_1.generateHtmlDiffPreviewFile)(context.chain.head, storageDiff, (0, util_crypto_1.blake2AsHex)(argv['extrinsic'], 256));
22
20
  console.log(`Generated preview ${filePath}`);
package/lib/executor.d.ts CHANGED
@@ -30,6 +30,7 @@ export declare const runTask: (task: {
30
30
  storage: [HexString, HexString | null][];
31
31
  mockSignatureHost: boolean;
32
32
  allowUnresolvedImports: boolean;
33
+ runtimeLogLevel: number;
33
34
  }, callback?: JsCallback) => Promise<any>;
34
35
  export declare const taskHandler: (block: Block) => JsCallback;
35
36
  export declare const emptyTaskHandler: {
package/lib/executor.js CHANGED
@@ -79,6 +79,7 @@ exports.getAuraSlotDuration = lodash_1.default.memoize(async (wasm, registry) =>
79
79
  storage: [],
80
80
  mockSignatureHost: false,
81
81
  allowUnresolvedImports: false,
82
+ runtimeLogLevel: 0,
82
83
  });
83
84
  if (!result.Call)
84
85
  throw new Error(result.Error);
@@ -127,6 +127,7 @@ class GenesisProvider {
127
127
  storage: [],
128
128
  mockSignatureHost: false,
129
129
  allowUnresolvedImports: true,
130
+ runtimeLogLevel: 0,
130
131
  }, this._jsCallback);
131
132
  }
132
133
  case 'chain_getHeader':
package/lib/run-block.js CHANGED
@@ -2,6 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.runBlock = void 0;
4
4
  const node_fs_1 = require("node:fs");
5
+ const logger_1 = require("./logger");
5
6
  const generate_html_diff_1 = require("./utils/generate-html-diff");
6
7
  const open_html_1 = require("./utils/open-html");
7
8
  const executor_1 = require("./executor");
@@ -25,10 +26,14 @@ const runBlock = async (argv) => {
25
26
  storage: [],
26
27
  mockSignatureHost: false,
27
28
  allowUnresolvedImports: false,
29
+ runtimeLogLevel: argv['runtime-log-level'] || 0,
28
30
  }, (0, executor_1.taskHandler)(parent));
29
31
  if (result.Error) {
30
32
  throw new Error(result.Error);
31
33
  }
34
+ for (const logs of result.Call.runtimeLogs) {
35
+ logger_1.defaultLogger.info(`RuntimeLogs:\n${logs}`);
36
+ }
32
37
  if (argv['html']) {
33
38
  const filePath = await (0, generate_html_diff_1.generateHtmlDiffPreviewFile)(parent, result.Call.storageDiff, block.hash);
34
39
  console.log(`Generated preview ${filePath}`);
@@ -64,7 +64,7 @@ export type Genesis = z.infer<typeof genesisSchema>;
64
64
  export declare const configSchema: z.ZodObject<{
65
65
  port: z.ZodOptional<z.ZodNumber>;
66
66
  endpoint: z.ZodOptional<z.ZodString>;
67
- block: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber]>>;
67
+ block: z.ZodOptional<z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodNull]>>;
68
68
  'build-block-mode': z.ZodOptional<z.ZodNativeEnum<typeof BuildBlockMode>>;
69
69
  'import-storage': z.ZodOptional<z.ZodAny>;
70
70
  'mock-signature-host': z.ZodOptional<z.ZodBoolean>;
@@ -132,10 +132,16 @@ export declare const configSchema: z.ZodObject<{
132
132
  }>]>>;
133
133
  timestamp: z.ZodOptional<z.ZodNumber>;
134
134
  'registered-types': z.ZodOptional<z.ZodAny>;
135
+ 'runtime-log-level': z.ZodOptional<z.ZodNumber>;
135
136
  }, "strict", z.ZodTypeAny, {
136
- timestamp?: number | undefined;
137
- block?: string | number | undefined;
137
+ port?: number | undefined;
138
+ endpoint?: string | undefined;
139
+ block?: string | number | null | undefined;
140
+ 'build-block-mode'?: BuildBlockMode | undefined;
141
+ 'import-storage'?: any;
142
+ 'mock-signature-host'?: boolean | undefined;
138
143
  db?: string | undefined;
144
+ 'wasm-override'?: string | undefined;
139
145
  genesis?: string | {
140
146
  name: string;
141
147
  properties: {
@@ -150,17 +156,18 @@ export declare const configSchema: z.ZodObject<{
150
156
  };
151
157
  };
152
158
  } | undefined;
159
+ timestamp?: number | undefined;
160
+ 'registered-types'?: any;
161
+ 'runtime-log-level'?: number | undefined;
162
+ }, {
153
163
  port?: number | undefined;
154
164
  endpoint?: string | undefined;
165
+ block?: string | number | null | undefined;
155
166
  'build-block-mode'?: BuildBlockMode | undefined;
156
167
  'import-storage'?: any;
157
168
  'mock-signature-host'?: boolean | undefined;
158
- 'wasm-override'?: string | undefined;
159
- 'registered-types'?: any;
160
- }, {
161
- timestamp?: number | undefined;
162
- block?: string | number | undefined;
163
169
  db?: string | undefined;
170
+ 'wasm-override'?: string | undefined;
164
171
  genesis?: string | {
165
172
  name: string;
166
173
  properties: {
@@ -175,12 +182,8 @@ export declare const configSchema: z.ZodObject<{
175
182
  };
176
183
  };
177
184
  } | undefined;
178
- port?: number | undefined;
179
- endpoint?: string | undefined;
180
- 'build-block-mode'?: BuildBlockMode | undefined;
181
- 'import-storage'?: any;
182
- 'mock-signature-host'?: boolean | undefined;
183
- 'wasm-override'?: string | undefined;
185
+ timestamp?: number | undefined;
184
186
  'registered-types'?: any;
187
+ 'runtime-log-level'?: number | undefined;
185
188
  }>;
186
189
  export type Config = z.infer<typeof configSchema>;
@@ -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().length(66).startsWith('0x'), zod_1.z.number()]).optional(),
20
+ block: zod_1.z.union([zod_1.z.string().length(66).startsWith('0x'), zod_1.z.number(), zod_1.z.null()]).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(),
@@ -26,5 +26,6 @@ exports.configSchema = zod_1.z
26
26
  genesis: zod_1.z.union([zod_1.z.string(), exports.genesisSchema]).optional(),
27
27
  timestamp: zod_1.z.number().optional(),
28
28
  'registered-types': zod_1.z.any().optional(),
29
+ 'runtime-log-level': zod_1.z.number().min(0).max(5).optional(),
29
30
  })
30
31
  .strict();
package/lib/server.js CHANGED
@@ -50,7 +50,7 @@ const createWS = async (port) => {
50
50
  const createServer = async (handler, port) => {
51
51
  let wss;
52
52
  let listenPort;
53
- for (let i = 0; i < 5; i++) {
53
+ for (let i = 0; i < 10; i++) {
54
54
  const preferPort = (port ?? 0) > 0 ? (port ?? 0) + i : 0;
55
55
  logger.debug('Try starting on port %d', preferPort);
56
56
  const [maybeWss, maybeListenPort] = await createWS(preferPort);
package/lib/setup.js CHANGED
@@ -62,6 +62,7 @@ const setup = async (argv, runBlock = false) => {
62
62
  },
63
63
  mockSignatureHost: argv['mock-signature-host'],
64
64
  allowUnresolvedImports: argv['allow-unresolved-imports'],
65
+ runtimeLogLevel: argv['runtime-log-level'],
65
66
  registeredTypes: argv['registered-types'],
66
67
  });
67
68
  if (argv.timestamp)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@acala-network/chopsticks",
3
- "version": "0.5.10",
3
+ "version": "0.6.0",
4
4
  "author": "Bryan Chen <xlchen1291@gmail.com>",
5
5
  "license": "Apache-2.0",
6
6
  "bin": "./chopsticks.js",
@@ -8,43 +8,43 @@
8
8
  "clean": "rm -rf lib tsconfig.tsbuildinfo",
9
9
  "build": "tsc -p ./tsconfig.json",
10
10
  "script:start": "cd ../..; ts-node --transpile-only packages/chopsticks/src/cli.ts",
11
- "script:run": "LOG_LEVEL=trace ts-node-dev --transpile-only --inspect --notify=false src/cli.ts -- dev --config=../../configs/dev.yml",
12
- "dev:karura": "ts-node-dev --transpile-only --inspect --notify=false src/cli.ts -- dev --config=../../configs/karura.yml",
13
- "dev:acala": "ts-node-dev --transpile-only --inspect --notify=false src/cli.ts -- dev --config=../../configs/acala.yml",
14
- "dev:moonriver": "ts-node-dev --transpile-only --inspect --notify=false src/cli.ts -- dev --config=../../configs/moonriver.yml",
15
- "dev:moonbeam": "ts-node-dev --transpile-only --inspect --notify=false src/cli.ts -- dev --config=../../configs/moonbeam.yml"
11
+ "script:run": "cd ../..; LOG_LEVEL=trace ts-node-dev --transpile-only --inspect --notify=false packages/chopsticks/src/cli.ts -- dev --config=configs/dev.yml",
12
+ "dev:karura": "cd ../..; ts-node-dev --transpile-only --inspect --notify=false packages/chopsticks/src/cli.ts -- dev --config=configs/karura.yml",
13
+ "dev:acala": "cd ../..; ts-node-dev --transpile-only --inspect --notify=false packages/chopsticks/src/cli.ts -- dev --config=configs/acala.yml",
14
+ "dev:moonriver": "cd ../..; ts-node-dev --transpile-only --inspect --notify=false packages/chopsticks/src/cli.ts -- dev --config=configs/moonriver.yml",
15
+ "dev:moonbeam": "cd ../..; ts-node-dev --transpile-only --inspect --notify=false packages/chopsticks/src/cli.ts -- dev --config=configs/moonbeam.yml"
16
16
  },
17
17
  "dependencies": {
18
- "@acala-network/chopsticks-executor": "0.5.10",
19
- "@polkadot/api": "^9.14.2",
20
- "@polkadot/rpc-provider": "^9.14.2",
21
- "@polkadot/types": "^9.14.2",
22
- "@polkadot/types-codec": "^9.14.2",
23
- "@polkadot/types-known": "^9.14.2",
24
- "@polkadot/util": "^10.4.2",
25
- "@polkadot/util-crypto": "^10.4.2",
26
- "axios": "^1.3.3",
18
+ "@acala-network/chopsticks-executor": "0.6.0",
19
+ "@polkadot/api": "^10.2.1",
20
+ "@polkadot/rpc-provider": "^10.2.1",
21
+ "@polkadot/types": "^10.2.1",
22
+ "@polkadot/types-codec": "^10.2.1",
23
+ "@polkadot/types-known": "^10.2.1",
24
+ "@polkadot/util": "^11.1.2",
25
+ "@polkadot/util-crypto": "^11.1.2",
26
+ "axios": "^1.3.4",
27
27
  "js-yaml": "^4.1.0",
28
28
  "jsondiffpatch": "^0.4.1",
29
29
  "lodash": "^4.17.21",
30
30
  "pino": "^8.11.0",
31
- "pino-pretty": "^9.4.0",
31
+ "pino-pretty": "^10.0.0",
32
32
  "reflect-metadata": "^0.1.13",
33
- "sqlite3": "^5.1.4",
33
+ "sqlite3": "^5.1.6",
34
34
  "typeorm": "^0.3.12",
35
- "ws": "^8.12.1",
35
+ "ws": "^8.13.0",
36
36
  "yargs": "^17.7.1",
37
- "zod": "^3.20.6"
37
+ "zod": "^3.21.4"
38
38
  },
39
39
  "devDependencies": {
40
40
  "@types/js-yaml": "^4.0.5",
41
- "@types/lodash": "^4.14.191",
42
- "@types/node": "^18.14.2",
41
+ "@types/lodash": "^4.14.192",
42
+ "@types/node": "^18.15.10",
43
43
  "@types/ws": "^8.5.4",
44
- "@types/yargs": "^17.0.22",
44
+ "@types/yargs": "^17.0.24",
45
45
  "ts-node": "^10.9.1",
46
46
  "ts-node-dev": "^2.0.0",
47
- "typescript": "^4.9.5"
47
+ "typescript": "^5.0.2"
48
48
  },
49
49
  "files": [
50
50
  "lib",