@acala-network/chopsticks 0.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 (61) hide show
  1. package/README.md +52 -0
  2. package/chopsticks.js +2 -0
  3. package/dist/api.d.ts +43 -0
  4. package/dist/api.js +78 -0
  5. package/dist/blockchain/block.d.ts +38 -0
  6. package/dist/blockchain/block.js +178 -0
  7. package/dist/blockchain/head-state.d.ts +13 -0
  8. package/dist/blockchain/head-state.js +57 -0
  9. package/dist/blockchain/index.d.ts +35 -0
  10. package/dist/blockchain/index.js +115 -0
  11. package/dist/blockchain/inherents.d.ts +26 -0
  12. package/dist/blockchain/inherents.js +96 -0
  13. package/dist/blockchain/storage-layer.d.ts +32 -0
  14. package/dist/blockchain/storage-layer.js +168 -0
  15. package/dist/blockchain/txpool.d.ts +13 -0
  16. package/dist/blockchain/txpool.js +165 -0
  17. package/dist/db/entities.d.ts +5 -0
  18. package/dist/db/entities.js +34 -0
  19. package/dist/db/index.d.ts +3 -0
  20. package/dist/db/index.js +41 -0
  21. package/dist/executor.d.ts +16 -0
  22. package/dist/executor.js +25 -0
  23. package/dist/executor.test.d.ts +1 -0
  24. package/dist/executor.test.js +58 -0
  25. package/dist/genesis-provider.d.ts +42 -0
  26. package/dist/genesis-provider.js +141 -0
  27. package/dist/index.d.ts +13 -0
  28. package/dist/index.js +208 -0
  29. package/dist/logger.d.ts +7 -0
  30. package/dist/logger.js +25 -0
  31. package/dist/rpc/dev.d.ts +3 -0
  32. package/dist/rpc/dev.js +33 -0
  33. package/dist/rpc/exec.d.ts +3 -0
  34. package/dist/rpc/exec.js +44 -0
  35. package/dist/rpc/index.d.ts +5 -0
  36. package/dist/rpc/index.js +25 -0
  37. package/dist/rpc/shared.d.ts +30 -0
  38. package/dist/rpc/shared.js +20 -0
  39. package/dist/rpc/substrate/author.d.ts +3 -0
  40. package/dist/rpc/substrate/author.js +42 -0
  41. package/dist/rpc/substrate/chain.d.ts +5 -0
  42. package/dist/rpc/substrate/chain.js +62 -0
  43. package/dist/rpc/substrate/index.d.ts +3 -0
  44. package/dist/rpc/substrate/index.js +20 -0
  45. package/dist/rpc/substrate/state.d.ts +3 -0
  46. package/dist/rpc/substrate/state.js +80 -0
  47. package/dist/rpc/substrate/system.d.ts +3 -0
  48. package/dist/rpc/substrate/system.js +27 -0
  49. package/dist/schema/index.d.ts +183 -0
  50. package/dist/schema/index.js +29 -0
  51. package/dist/server.d.ts +9 -0
  52. package/dist/server.js +148 -0
  53. package/dist/task.d.ts +38 -0
  54. package/dist/task.js +66 -0
  55. package/dist/utils/import-storage.d.ts +4 -0
  56. package/dist/utils/import-storage.js +43 -0
  57. package/dist/utils/index.d.ts +7 -0
  58. package/dist/utils/index.js +32 -0
  59. package/dist/utils/set-storage.d.ts +6 -0
  60. package/dist/utils/set-storage.js +57 -0
  61. package/package.json +91 -0
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.overrideWasm = exports.importStorage = void 0;
7
+ const node_fs_1 = require("node:fs");
8
+ const js_yaml_1 = __importDefault(require("js-yaml"));
9
+ const set_storage_1 = require("./set-storage");
10
+ const logger_1 = require("../logger");
11
+ const importStorage = async (chain, storage) => {
12
+ if (storage == null) {
13
+ return;
14
+ }
15
+ let storageValue;
16
+ if (typeof storage === 'string') {
17
+ if (!(0, node_fs_1.existsSync)(storage))
18
+ throw Error(`File ${storage} does not exist`);
19
+ storageValue = js_yaml_1.default.load(String((0, node_fs_1.readFileSync)(storage)));
20
+ }
21
+ else {
22
+ storageValue = storage;
23
+ }
24
+ const blockHash = await (0, set_storage_1.setStorage)(chain, storageValue);
25
+ logger_1.defaultLogger.trace({ blockHash, storage }, 'ImportStorage');
26
+ };
27
+ exports.importStorage = importStorage;
28
+ const overrideWasm = async (chain, wasmPath) => {
29
+ if (wasmPath == null) {
30
+ return;
31
+ }
32
+ const wasm = (0, node_fs_1.readFileSync)(wasmPath);
33
+ let wasmHex;
34
+ if (wasm.at(0) === 0x30 && wasm.at(1) === 0x78) {
35
+ // starts with 0x
36
+ wasmHex = wasm.toString().trim();
37
+ }
38
+ else {
39
+ wasmHex = '0x' + wasm.toString('hex');
40
+ }
41
+ chain.head.setWasm(wasmHex);
42
+ };
43
+ exports.overrideWasm = overrideWasm;
@@ -0,0 +1,7 @@
1
+ import { HexString } from '@polkadot/util/types';
2
+ import { StorageKey } from '@polkadot/types';
3
+ export type GetKeys = (startKey?: string) => Promise<StorageKey<any>[]>;
4
+ export type ProcessKey = (key: StorageKey<any>) => any;
5
+ export declare function fetchKeys(getKeys: GetKeys, processKey: ProcessKey): Promise<void>;
6
+ export declare function fetchKeysToArray(getKeys: GetKeys): Promise<StorageKey<any>[]>;
7
+ export declare const compactHex: (value: Uint8Array) => HexString;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.compactHex = exports.fetchKeysToArray = exports.fetchKeys = void 0;
4
+ const util_1 = require("@polkadot/util");
5
+ async function fetchKeys(getKeys, processKey) {
6
+ const processKeys = async (keys) => {
7
+ for (const key of keys) {
8
+ await processKey(key);
9
+ }
10
+ if (keys.length > 0) {
11
+ return keys[keys.length - 1];
12
+ }
13
+ return undefined;
14
+ };
15
+ const keys = await getKeys();
16
+ let nextKey = await processKeys(keys);
17
+ while (nextKey) {
18
+ const keys = await getKeys(nextKey.toHex());
19
+ nextKey = await processKeys(keys);
20
+ }
21
+ }
22
+ exports.fetchKeys = fetchKeys;
23
+ async function fetchKeysToArray(getKeys) {
24
+ const res = [];
25
+ await fetchKeys(getKeys, (key) => res.push(key));
26
+ return res;
27
+ }
28
+ exports.fetchKeysToArray = fetchKeysToArray;
29
+ const compactHex = (value) => {
30
+ return (0, util_1.u8aToHex)((0, util_1.compactStripLength)(value)[1]);
31
+ };
32
+ exports.compactHex = compactHex;
@@ -0,0 +1,6 @@
1
+ import { Blockchain } from '../blockchain';
2
+ type RawStorageValues = [string, string | null][];
3
+ type StorageConfig = Record<string, Record<string, any>>;
4
+ export type StorageValues = RawStorageValues | StorageConfig;
5
+ export declare const setStorage: (chain: Blockchain, storage: StorageValues, blockHash?: string) => Promise<string>;
6
+ export {};
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setStorage = void 0;
4
+ const types_1 = require("@polkadot/types");
5
+ const string_1 = require("@polkadot/util/string");
6
+ const util_1 = require("@polkadot/util");
7
+ function objectToStorageItems(meta, storage) {
8
+ const storageItems = [];
9
+ for (const sectionName in storage) {
10
+ const section = storage[sectionName];
11
+ const pallet = meta.query[(0, string_1.stringCamelCase)(sectionName)];
12
+ if (!pallet)
13
+ throw Error(`Cannot find pallet ${sectionName}`);
14
+ for (const storageName in section) {
15
+ const storage = section[storageName];
16
+ if (storageName === '$removePrefix') {
17
+ for (const mapName of storage) {
18
+ const storageEntry = pallet[(0, string_1.stringCamelCase)(mapName)];
19
+ if (!storageEntry)
20
+ throw Error(`Cannot find storage ${mapName} in pallet ${sectionName}`);
21
+ const prefix = storageEntry.keyPrefix();
22
+ storageItems.push([(0, util_1.u8aToHex)(prefix), "DeletedPrefix" /* StorageValueKind.DeletedPrefix */]);
23
+ }
24
+ continue;
25
+ }
26
+ const storageEntry = pallet[(0, string_1.stringCamelCase)(storageName)];
27
+ if (!storageEntry)
28
+ throw Error(`Cannot find storage ${storageName} in pallet ${sectionName}`);
29
+ if (storageEntry.meta.type.isPlain) {
30
+ const key = new types_1.StorageKey(meta.registry, [storageEntry]);
31
+ storageItems.push([key.toHex(), storage ? meta.registry.createType(key.outputType, storage).toHex(true) : null]);
32
+ }
33
+ else {
34
+ for (const [keys, value] of storage) {
35
+ const key = new types_1.StorageKey(meta.registry, [storageEntry, keys]);
36
+ storageItems.push([key.toHex(), value ? meta.registry.createType(key.outputType, value).toHex(true) : null]);
37
+ }
38
+ }
39
+ }
40
+ }
41
+ return storageItems;
42
+ }
43
+ const setStorage = async (chain, storage, blockHash) => {
44
+ const block = await chain.getBlock(blockHash);
45
+ if (!block)
46
+ throw Error(`Cannot find block ${blockHash || 'latest'}`);
47
+ let storageItems;
48
+ if (Array.isArray(storage)) {
49
+ storageItems = storage;
50
+ }
51
+ else {
52
+ storageItems = objectToStorageItems(await block.meta, storage);
53
+ }
54
+ block.pushStorageLayer().setAll(storageItems);
55
+ return block.hash;
56
+ };
57
+ exports.setStorage = setStorage;
package/package.json ADDED
@@ -0,0 +1,91 @@
1
+ {
2
+ "name": "@acala-network/chopsticks",
3
+ "version": "0.1.0",
4
+ "main": "./dist/index.js",
5
+ "types": "./dist/index.d.ts",
6
+ "author": "Bryan Chen <xlchen1291@gmail.com>",
7
+ "license": "MIT",
8
+ "packageManager": "yarn@3.2.4",
9
+ "workspaces": [
10
+ ".",
11
+ "executor/pkg"
12
+ ],
13
+ "bin": "./chopsticks.js",
14
+ "scripts": {
15
+ "lint": "tsc --noEmit --project tsconfig.json && eslint . --ext .js,.ts && prettier --check .",
16
+ "fix": "eslint . --ext .js,.ts --fix && prettier -w .",
17
+ "prepare": "husky install",
18
+ "start": "ts-node --transpile-only src/index.ts",
19
+ "build": "rimraf dist && tsc -p tsconfig.prod.json",
20
+ "build-wasm": "cd executor && wasm-pack --log-level=info build --target nodejs --no-default-features --scope acala-network",
21
+ "check": "cd executor && cargo check --locked",
22
+ "test": "vitest --silent",
23
+ "test:native": "EXECUTOR_CMD='cargo run --manifest-path executor/Cargo.toml --' vitest",
24
+ "test:dev": "LOG_LEVEL=trace vitest --inspect",
25
+ "dev": "LOG_LEVEL=trace ts-node-dev --transpile-only --inspect --notify=false src/index.ts -- dev --config=configs/dev.yml",
26
+ "dev:native": "yarn dev --executor-cmd='cargo run --manifest-path executor/Cargo.toml --'",
27
+ "dev:karura": "ts-node-dev --transpile-only --inspect --notify=false src/index.ts -- dev --config=configs/karura.yml",
28
+ "dev:acala": "ts-node-dev --transpile-only --inspect --notify=false src/index.ts -- dev --config=configs/acala.yml"
29
+ },
30
+ "dependencies": {
31
+ "@acala-network/chopsticks-executor": "workspace:*",
32
+ "@polkadot/api": "^9.10.1",
33
+ "@polkadot/rpc-provider": "^9.10.1",
34
+ "@polkadot/types": "^9.10.1",
35
+ "@polkadot/types-codec": "^9.10.1",
36
+ "@polkadot/types-known": "^9.10.1",
37
+ "@polkadot/util": "^10.2.1",
38
+ "@polkadot/util-crypto": "^10.2.1",
39
+ "axios": "^1.2.1",
40
+ "js-yaml": "^4.1.0",
41
+ "lodash": "^4.17.21",
42
+ "pino": "^8.7.0",
43
+ "pino-pretty": "^9.1.1",
44
+ "reflect-metadata": "^0.1.13",
45
+ "sqlite3": "^5.1.2",
46
+ "typeorm": "^0.3.11",
47
+ "typescript": "^4.9.3",
48
+ "ws": "^8.11.0",
49
+ "yargs": "^17.6.2",
50
+ "zod": "^3.19.1"
51
+ },
52
+ "devDependencies": {
53
+ "@types/js-yaml": "^4.0.5",
54
+ "@types/lodash": "^4.14.191",
55
+ "@types/node": "^18.11.10",
56
+ "@types/rimraf": "^3",
57
+ "@types/ws": "^8.5.3",
58
+ "@types/yargs": "^17.0.15",
59
+ "@typescript-eslint/eslint-plugin": "^5.45.0",
60
+ "@typescript-eslint/parser": "^5.45.0",
61
+ "eslint": "^8.29.0",
62
+ "eslint-config-prettier": "^8.5.0",
63
+ "eslint-plugin-import": "^2.26.0",
64
+ "eslint-plugin-sort-imports-es6-autofix": "^0.6.0",
65
+ "husky": "^8.0.2",
66
+ "lint-staged": "^13.1.0",
67
+ "prettier": "^2.8.0",
68
+ "rimraf": "^3.0.2",
69
+ "ts-node": "^10.9.1",
70
+ "ts-node-dev": "^2.0.0",
71
+ "vitest": "^0.25.3",
72
+ "wasm-pack": "^0.10.3"
73
+ },
74
+ "files": [
75
+ "dist",
76
+ "bin",
77
+ "chopsticks.mjs"
78
+ ],
79
+ "engines": {
80
+ "node": ">=v14"
81
+ },
82
+ "prettier": {
83
+ "tabWidth": 2,
84
+ "semi": false,
85
+ "singleQuote": true
86
+ },
87
+ "lint-staged": {
88
+ "*.{js,ts}": "eslint --cache --fix",
89
+ "*.{js,ts,css,md}": "prettier --write"
90
+ }
91
+ }