@acala-network/chopsticks-core 0.8.5-5 → 0.9.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 (128) hide show
  1. package/{lib → dist/cjs}/api.js +7 -7
  2. package/{lib → dist/cjs}/blockchain/block.js +1 -4
  3. package/{lib → dist/cjs}/genesis-provider.js +1 -1
  4. package/{lib → dist/cjs}/rpc/substrate/chain.js +1 -1
  5. package/{lib → dist/cjs}/utils/index.js +11 -1
  6. package/dist/esm/api.js +125 -0
  7. package/dist/esm/blockchain/block-builder.js +293 -0
  8. package/dist/esm/blockchain/block.js +277 -0
  9. package/dist/esm/blockchain/head-state.js +79 -0
  10. package/dist/esm/blockchain/index.js +413 -0
  11. package/dist/esm/blockchain/inherent/index.js +40 -0
  12. package/dist/esm/blockchain/inherent/para-enter.js +29 -0
  13. package/dist/esm/blockchain/inherent/parachain/babe-randomness.js +11 -0
  14. package/dist/esm/blockchain/inherent/parachain/nimbus-author-inherent.js +11 -0
  15. package/dist/esm/blockchain/inherent/parachain/validation-data.js +165 -0
  16. package/dist/esm/blockchain/storage-layer.js +215 -0
  17. package/dist/esm/blockchain/txpool.js +208 -0
  18. package/dist/esm/chopsticks-provider.js +156 -0
  19. package/dist/esm/database.js +1 -0
  20. package/dist/esm/genesis-provider.js +144 -0
  21. package/dist/esm/logger.js +34 -0
  22. package/dist/esm/offchain.js +36 -0
  23. package/dist/esm/rpc/index.js +10 -0
  24. package/dist/esm/rpc/shared.js +15 -0
  25. package/dist/esm/rpc/substrate/author.js +85 -0
  26. package/dist/esm/rpc/substrate/chain.js +84 -0
  27. package/dist/esm/rpc/substrate/index.js +18 -0
  28. package/dist/esm/rpc/substrate/payment.js +40 -0
  29. package/dist/esm/rpc/substrate/state.js +166 -0
  30. package/dist/esm/rpc/substrate/system.js +48 -0
  31. package/dist/esm/schema/index.js +11 -0
  32. package/dist/esm/setup.js +71 -0
  33. package/dist/esm/utils/decoder.js +95 -0
  34. package/dist/esm/utils/index.js +91 -0
  35. package/dist/esm/utils/key-cache.js +61 -0
  36. package/dist/esm/utils/proof.js +33 -0
  37. package/dist/esm/utils/set-storage.js +56 -0
  38. package/dist/esm/utils/time-travel.js +58 -0
  39. package/dist/esm/wasm-executor/browser-wasm-executor.mjs +32 -0
  40. package/dist/esm/wasm-executor/browser-worker.js +15 -0
  41. package/dist/esm/wasm-executor/index.js +146 -0
  42. package/dist/esm/wasm-executor/node-wasm-executor.mjs +29 -0
  43. package/dist/esm/wasm-executor/node-worker.js +15 -0
  44. package/dist/esm/xcm/downward.js +25 -0
  45. package/dist/esm/xcm/horizontal.js +25 -0
  46. package/dist/esm/xcm/index.js +20 -0
  47. package/dist/esm/xcm/upward.js +17 -0
  48. package/{lib → dist/types}/genesis-provider.d.ts +2 -2
  49. package/dist/types/index.d.ts +28 -0
  50. package/{lib → dist/types}/utils/index.d.ts +1 -0
  51. package/package.json +23 -14
  52. /package/{lib → dist/cjs}/blockchain/block-builder.js +0 -0
  53. /package/{lib → dist/cjs}/blockchain/head-state.js +0 -0
  54. /package/{lib → dist/cjs}/blockchain/index.js +0 -0
  55. /package/{lib → dist/cjs}/blockchain/inherent/index.js +0 -0
  56. /package/{lib → dist/cjs}/blockchain/inherent/para-enter.js +0 -0
  57. /package/{lib → dist/cjs}/blockchain/inherent/parachain/babe-randomness.js +0 -0
  58. /package/{lib → dist/cjs}/blockchain/inherent/parachain/nimbus-author-inherent.js +0 -0
  59. /package/{lib → dist/cjs}/blockchain/inherent/parachain/validation-data.js +0 -0
  60. /package/{lib → dist/cjs}/blockchain/storage-layer.js +0 -0
  61. /package/{lib → dist/cjs}/blockchain/txpool.js +0 -0
  62. /package/{lib → dist/cjs}/chopsticks-provider.js +0 -0
  63. /package/{lib → dist/cjs}/database.js +0 -0
  64. /package/{lib → dist/cjs}/index.js +0 -0
  65. /package/{lib → dist/cjs}/logger.js +0 -0
  66. /package/{lib → dist/cjs}/offchain.js +0 -0
  67. /package/{lib → dist/cjs}/rpc/index.js +0 -0
  68. /package/{lib → dist/cjs}/rpc/shared.js +0 -0
  69. /package/{lib → dist/cjs}/rpc/substrate/author.js +0 -0
  70. /package/{lib → dist/cjs}/rpc/substrate/index.js +0 -0
  71. /package/{lib → dist/cjs}/rpc/substrate/payment.js +0 -0
  72. /package/{lib → dist/cjs}/rpc/substrate/state.js +0 -0
  73. /package/{lib → dist/cjs}/rpc/substrate/system.js +0 -0
  74. /package/{lib → dist/cjs}/schema/index.js +0 -0
  75. /package/{lib → dist/cjs}/setup.js +0 -0
  76. /package/{lib → dist/cjs}/utils/decoder.js +0 -0
  77. /package/{lib → dist/cjs}/utils/key-cache.js +0 -0
  78. /package/{lib → dist/cjs}/utils/proof.js +0 -0
  79. /package/{lib → dist/cjs}/utils/set-storage.js +0 -0
  80. /package/{lib → dist/cjs}/utils/time-travel.js +0 -0
  81. /package/{lib → dist/cjs}/wasm-executor/browser-wasm-executor.mjs +0 -0
  82. /package/{lib → dist/cjs}/wasm-executor/browser-worker.js +0 -0
  83. /package/{lib → dist/cjs}/wasm-executor/index.js +0 -0
  84. /package/{lib → dist/cjs}/wasm-executor/node-wasm-executor.mjs +0 -0
  85. /package/{lib → dist/cjs}/wasm-executor/node-worker.js +0 -0
  86. /package/{lib → dist/cjs}/xcm/downward.js +0 -0
  87. /package/{lib → dist/cjs}/xcm/horizontal.js +0 -0
  88. /package/{lib → dist/cjs}/xcm/index.js +0 -0
  89. /package/{lib → dist/cjs}/xcm/upward.js +0 -0
  90. /package/{lib/index.d.ts → dist/esm/index.js} +0 -0
  91. /package/{lib → dist/types}/api.d.ts +0 -0
  92. /package/{lib → dist/types}/blockchain/block-builder.d.ts +0 -0
  93. /package/{lib → dist/types}/blockchain/block.d.ts +0 -0
  94. /package/{lib → dist/types}/blockchain/head-state.d.ts +0 -0
  95. /package/{lib → dist/types}/blockchain/index.d.ts +0 -0
  96. /package/{lib → dist/types}/blockchain/inherent/index.d.ts +0 -0
  97. /package/{lib → dist/types}/blockchain/inherent/para-enter.d.ts +0 -0
  98. /package/{lib → dist/types}/blockchain/inherent/parachain/babe-randomness.d.ts +0 -0
  99. /package/{lib → dist/types}/blockchain/inherent/parachain/nimbus-author-inherent.d.ts +0 -0
  100. /package/{lib → dist/types}/blockchain/inherent/parachain/validation-data.d.ts +0 -0
  101. /package/{lib → dist/types}/blockchain/storage-layer.d.ts +0 -0
  102. /package/{lib → dist/types}/blockchain/txpool.d.ts +0 -0
  103. /package/{lib → dist/types}/chopsticks-provider.d.ts +0 -0
  104. /package/{lib → dist/types}/database.d.ts +0 -0
  105. /package/{lib → dist/types}/logger.d.ts +0 -0
  106. /package/{lib → dist/types}/offchain.d.ts +0 -0
  107. /package/{lib → dist/types}/rpc/index.d.ts +0 -0
  108. /package/{lib → dist/types}/rpc/shared.d.ts +0 -0
  109. /package/{lib → dist/types}/rpc/substrate/author.d.ts +0 -0
  110. /package/{lib → dist/types}/rpc/substrate/chain.d.ts +0 -0
  111. /package/{lib → dist/types}/rpc/substrate/index.d.ts +0 -0
  112. /package/{lib → dist/types}/rpc/substrate/payment.d.ts +0 -0
  113. /package/{lib → dist/types}/rpc/substrate/state.d.ts +0 -0
  114. /package/{lib → dist/types}/rpc/substrate/system.d.ts +0 -0
  115. /package/{lib → dist/types}/schema/index.d.ts +0 -0
  116. /package/{lib → dist/types}/setup.d.ts +0 -0
  117. /package/{lib → dist/types}/utils/decoder.d.ts +0 -0
  118. /package/{lib → dist/types}/utils/key-cache.d.ts +0 -0
  119. /package/{lib → dist/types}/utils/proof.d.ts +0 -0
  120. /package/{lib → dist/types}/utils/set-storage.d.ts +0 -0
  121. /package/{lib → dist/types}/utils/time-travel.d.ts +0 -0
  122. /package/{lib → dist/types}/wasm-executor/browser-worker.d.ts +0 -0
  123. /package/{lib → dist/types}/wasm-executor/index.d.ts +0 -0
  124. /package/{lib → dist/types}/wasm-executor/node-worker.d.ts +0 -0
  125. /package/{lib → dist/types}/xcm/downward.d.ts +0 -0
  126. /package/{lib → dist/types}/xcm/horizontal.d.ts +0 -0
  127. /package/{lib → dist/types}/xcm/index.d.ts +0 -0
  128. /package/{lib → dist/types}/xcm/upward.d.ts +0 -0
@@ -0,0 +1,156 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _a, _ChopsticksProvider_isConnected, _ChopsticksProvider_eventemitter, _ChopsticksProvider_isReadyPromise, _ChopsticksProvider_subscriptions;
13
+ import { EventEmitter } from 'eventemitter3';
14
+ import { allHandlers } from './rpc';
15
+ import { defaultLogger } from './logger';
16
+ import { setup } from './setup';
17
+ const providerHandlers = {
18
+ ...allHandlers,
19
+ dev_newBlock: async (context, _params, _subscriptionManager) => {
20
+ const block = await context.chain.newBlock();
21
+ return block.hash;
22
+ },
23
+ };
24
+ const logger = defaultLogger.child({ name: '[Chopsticks provider]' });
25
+ /**
26
+ * Provider for local chopsticks chain
27
+ */
28
+ export class ChopsticksProvider {
29
+ constructor(chain) {
30
+ this.chain = chain;
31
+ _ChopsticksProvider_isConnected.set(this, false);
32
+ _ChopsticksProvider_eventemitter.set(this, void 0);
33
+ _ChopsticksProvider_isReadyPromise.set(this, void 0);
34
+ _ChopsticksProvider_subscriptions.set(this, {});
35
+ this.clone = () => {
36
+ return new ChopsticksProvider(this.chain);
37
+ };
38
+ this.connect = async () => {
39
+ __classPrivateFieldSet(this, _ChopsticksProvider_isConnected, true, "f");
40
+ __classPrivateFieldGet(this, _ChopsticksProvider_eventemitter, "f").emit('connected');
41
+ };
42
+ this.disconnect = async () => {
43
+ __classPrivateFieldSet(this, _ChopsticksProvider_isConnected, false, "f");
44
+ __classPrivateFieldGet(this, _ChopsticksProvider_eventemitter, "f").emit('disconnected');
45
+ };
46
+ this.on = (type, sub) => {
47
+ __classPrivateFieldGet(this, _ChopsticksProvider_eventemitter, "f").on(type, sub);
48
+ return () => {
49
+ __classPrivateFieldGet(this, _ChopsticksProvider_eventemitter, "f").removeListener(type, sub);
50
+ };
51
+ };
52
+ this.subscriptionManager = {
53
+ subscribe: (method, subid, onCancel = () => { }) => {
54
+ const sub = __classPrivateFieldGet(this, _ChopsticksProvider_subscriptions, "f")[subid];
55
+ if (sub) {
56
+ sub.onCancel = onCancel;
57
+ }
58
+ return (data) => {
59
+ logger.debug('subscribe-callback', method, subid, data);
60
+ const sub = __classPrivateFieldGet(this, _ChopsticksProvider_subscriptions, "f")[subid];
61
+ if (sub) {
62
+ sub.callback(null, data);
63
+ }
64
+ else {
65
+ logger.trace(`Unable to find active subscription=${subid}`);
66
+ }
67
+ };
68
+ },
69
+ unsubscribe: (subid) => {
70
+ logger.debug('unsubscribe-callback', subid);
71
+ const sub = __classPrivateFieldGet(this, _ChopsticksProvider_subscriptions, "f")[subid];
72
+ if (sub) {
73
+ sub.onCancel?.();
74
+ delete __classPrivateFieldGet(this, _ChopsticksProvider_subscriptions, "f")[subid];
75
+ }
76
+ else {
77
+ logger.trace(`Unable to find active subscription=${subid}`);
78
+ }
79
+ },
80
+ };
81
+ this.send = async (method, params, _isCacheable, subscription) => {
82
+ try {
83
+ logger.debug('send', { method, params });
84
+ const rpcHandler = providerHandlers[method];
85
+ if (!rpcHandler) {
86
+ logger.error(`Unable to find rpc handler=${method}`);
87
+ throw new Error(`Unable to find rpc handler=${method}`);
88
+ }
89
+ if (subscription) {
90
+ logger.debug('subscribe', { method, params });
91
+ const subid = await rpcHandler({ chain: this.chain }, params, this.subscriptionManager);
92
+ if (!subid) {
93
+ throw new Error(`Unable to subscribe=${method}`);
94
+ }
95
+ __classPrivateFieldGet(this, _ChopsticksProvider_subscriptions, "f")[subid] = {
96
+ callback: subscription.callback,
97
+ method,
98
+ params,
99
+ type: subscription.type,
100
+ };
101
+ return subid;
102
+ }
103
+ else {
104
+ logger.debug('call', { method, params });
105
+ return rpcHandler({ chain: this.chain }, params, this.subscriptionManager);
106
+ }
107
+ }
108
+ catch (e) {
109
+ logger.error('send error.', e);
110
+ throw e;
111
+ }
112
+ };
113
+ __classPrivateFieldSet(this, _ChopsticksProvider_eventemitter, new EventEmitter(), "f");
114
+ __classPrivateFieldSet(this, _ChopsticksProvider_isReadyPromise, new Promise((resolve, reject) => {
115
+ __classPrivateFieldGet(this, _ChopsticksProvider_eventemitter, "f").once('connected', resolve);
116
+ __classPrivateFieldGet(this, _ChopsticksProvider_eventemitter, "f").once('error', reject);
117
+ this.connect();
118
+ }), "f");
119
+ }
120
+ get hasSubscriptions() {
121
+ return true;
122
+ }
123
+ get isClonable() {
124
+ return true;
125
+ }
126
+ get isConnected() {
127
+ return __classPrivateFieldGet(this, _ChopsticksProvider_isConnected, "f");
128
+ }
129
+ get isReady() {
130
+ return __classPrivateFieldGet(this, _ChopsticksProvider_isReadyPromise, "f");
131
+ }
132
+ subscribe(type, method, params, callback) {
133
+ return this.send(method, params, false, { callback, type });
134
+ }
135
+ async unsubscribe(_type, method, id) {
136
+ if (!__classPrivateFieldGet(this, _ChopsticksProvider_subscriptions, "f")[id]) {
137
+ logger.trace(`Unable to find active subscription=${id}`);
138
+ return false;
139
+ }
140
+ try {
141
+ return this.send(method, [id]);
142
+ }
143
+ catch {
144
+ return false;
145
+ }
146
+ }
147
+ }
148
+ _a = ChopsticksProvider, _ChopsticksProvider_isConnected = new WeakMap(), _ChopsticksProvider_eventemitter = new WeakMap(), _ChopsticksProvider_isReadyPromise = new WeakMap(), _ChopsticksProvider_subscriptions = new WeakMap();
149
+ ChopsticksProvider.fromEndpoint = async (endpoint, block, db) => {
150
+ return new ChopsticksProvider(await setup({
151
+ endpoint,
152
+ mockSignatureHost: true,
153
+ block,
154
+ db,
155
+ }));
156
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,144 @@
1
+ var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
2
+ if (kind === "m") throw new TypeError("Private method is not writable");
3
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
4
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
5
+ return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
6
+ };
7
+ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
8
+ if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
9
+ if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
10
+ return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
11
+ };
12
+ var _GenesisProvider_isConnected, _GenesisProvider_eventemitter, _GenesisProvider_isReadyPromise, _GenesisProvider_genesis, _GenesisProvider_stateRoot;
13
+ import { EventEmitter } from 'eventemitter3';
14
+ import { genesisSchema } from './schema';
15
+ import { calculateStateRoot, emptyTaskHandler } from './wasm-executor';
16
+ /**
17
+ * Provider to start a chain from genesis
18
+ */
19
+ export class GenesisProvider {
20
+ /**
21
+ * @ignore
22
+ * Create a genesis provider
23
+ *
24
+ * @param genesis - genesis file
25
+ * @requires genesis provider
26
+ */
27
+ constructor(genesis) {
28
+ _GenesisProvider_isConnected.set(this, false);
29
+ _GenesisProvider_eventemitter.set(this, void 0);
30
+ _GenesisProvider_isReadyPromise.set(this, void 0);
31
+ _GenesisProvider_genesis.set(this, void 0);
32
+ _GenesisProvider_stateRoot.set(this, void 0);
33
+ this.clone = () => {
34
+ return new GenesisProvider(__classPrivateFieldGet(this, _GenesisProvider_genesis, "f"));
35
+ };
36
+ this.connect = async () => {
37
+ __classPrivateFieldSet(this, _GenesisProvider_isConnected, true, "f");
38
+ __classPrivateFieldGet(this, _GenesisProvider_eventemitter, "f").emit('connected');
39
+ };
40
+ this.disconnect = async () => {
41
+ __classPrivateFieldSet(this, _GenesisProvider_isConnected, false, "f");
42
+ __classPrivateFieldGet(this, _GenesisProvider_eventemitter, "f").emit('disconnected');
43
+ };
44
+ this.on = (type, sub) => {
45
+ __classPrivateFieldGet(this, _GenesisProvider_eventemitter, "f").on(type, sub);
46
+ return () => {
47
+ __classPrivateFieldGet(this, _GenesisProvider_eventemitter, "f").removeListener(type, sub);
48
+ };
49
+ };
50
+ this.getHeader = async () => {
51
+ return {
52
+ blockHash: this.blockHash,
53
+ number: '0x0',
54
+ stateRoot: await __classPrivateFieldGet(this, _GenesisProvider_stateRoot, "f"),
55
+ digest: {
56
+ logs: [],
57
+ },
58
+ };
59
+ };
60
+ this.getBlock = async () => {
61
+ return {
62
+ block: {
63
+ header: await this.getHeader(),
64
+ extrinsics: [],
65
+ },
66
+ };
67
+ };
68
+ this.send = async (method, params, _isCacheable) => {
69
+ await this.isReady;
70
+ switch (method) {
71
+ case 'system_properties':
72
+ return __classPrivateFieldGet(this, _GenesisProvider_genesis, "f").properties;
73
+ case 'system_chain':
74
+ return __classPrivateFieldGet(this, _GenesisProvider_genesis, "f").id;
75
+ case 'system_name':
76
+ return __classPrivateFieldGet(this, _GenesisProvider_genesis, "f").name;
77
+ case 'chain_getHeader':
78
+ return this.getHeader();
79
+ case 'chain_getBlock':
80
+ return this.getBlock();
81
+ case 'chain_getBlockHash':
82
+ return this.blockHash;
83
+ case 'state_getKeysPaged':
84
+ case 'state_getKeysPagedAt':
85
+ return [];
86
+ case 'state_getStorage':
87
+ case 'state_getStorageAt':
88
+ return __classPrivateFieldGet(this, _GenesisProvider_genesis, "f").genesis.raw.top[params[0]];
89
+ default:
90
+ throw Error(`${method} not implemented`);
91
+ }
92
+ };
93
+ this.subscribe = async (_type, _method, _params, _cb) => {
94
+ throw Error('unimplemented');
95
+ };
96
+ this.unsubscribe = async (_type, _method, _id) => {
97
+ throw Error('unimplemented');
98
+ };
99
+ __classPrivateFieldSet(this, _GenesisProvider_genesis, genesisSchema.parse(genesis), "f");
100
+ __classPrivateFieldSet(this, _GenesisProvider_stateRoot, calculateStateRoot(Object.entries(__classPrivateFieldGet(this, _GenesisProvider_genesis, "f").genesis.raw.top).reduce((accu, item) => {
101
+ accu.push(item);
102
+ return accu;
103
+ }, []), 1), "f");
104
+ __classPrivateFieldSet(this, _GenesisProvider_eventemitter, new EventEmitter(), "f");
105
+ __classPrivateFieldSet(this, _GenesisProvider_isReadyPromise, new Promise((resolve, reject) => {
106
+ __classPrivateFieldGet(this, _GenesisProvider_eventemitter, "f").once('connected', () => {
107
+ resolve();
108
+ });
109
+ __classPrivateFieldGet(this, _GenesisProvider_eventemitter, "f").once('error', reject);
110
+ this.connect();
111
+ }), "f");
112
+ }
113
+ get isClonable() {
114
+ return true;
115
+ }
116
+ get hasSubscriptions() {
117
+ return false;
118
+ }
119
+ get isConnected() {
120
+ return __classPrivateFieldGet(this, _GenesisProvider_isConnected, "f");
121
+ }
122
+ get isReady() {
123
+ return __classPrivateFieldGet(this, _GenesisProvider_isReadyPromise, "f");
124
+ }
125
+ get blockHash() {
126
+ return '0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3';
127
+ }
128
+ get _jsCallback() {
129
+ const storage = __classPrivateFieldGet(this, _GenesisProvider_genesis, "f").genesis.raw.top;
130
+ return {
131
+ ...emptyTaskHandler,
132
+ getStorage: async function (key) {
133
+ return storage[key];
134
+ },
135
+ getStateRoot: async function () {
136
+ return '0x49416764844ff0d8bad851e8abe686dff9dd2de78621180ef8e9f99bb7a480f1';
137
+ },
138
+ getNextKey: async function (_prefix, _key) {
139
+ return undefined;
140
+ },
141
+ };
142
+ }
143
+ }
144
+ _GenesisProvider_isConnected = new WeakMap(), _GenesisProvider_eventemitter = new WeakMap(), _GenesisProvider_isReadyPromise = new WeakMap(), _GenesisProvider_genesis = new WeakMap(), _GenesisProvider_stateRoot = new WeakMap();
@@ -0,0 +1,34 @@
1
+ import createLogger from 'pino';
2
+ export const defaultLogger = createLogger({
3
+ level: (typeof process === 'object' && process.env.LOG_LEVEL) || 'info',
4
+ transport: {
5
+ target: 'pino-pretty',
6
+ },
7
+ });
8
+ const innerTruncate = (level = 0) => (val) => {
9
+ const verboseLog = typeof process === 'object' ? !!process.env.VERBOSE_LOG : false;
10
+ const levelLimit = verboseLog ? 10 : 5;
11
+ if (val == null) {
12
+ return val;
13
+ }
14
+ if (level > levelLimit) {
15
+ return '( Too Deep )';
16
+ }
17
+ switch (typeof val) {
18
+ case 'string':
19
+ if (val.length > 66 && !verboseLog) {
20
+ return val.slice(0, 34) + '…' + val.slice(-32);
21
+ }
22
+ else {
23
+ return val;
24
+ }
25
+ case 'object':
26
+ if (Array.isArray(val)) {
27
+ return val.map(innerTruncate(level + 1));
28
+ }
29
+ return Object.fromEntries(Object.entries(val.toJSON ? val.toJSON() : val).map(([k, v]) => [k, innerTruncate(level + 1)(v)]));
30
+ default:
31
+ return val;
32
+ }
33
+ };
34
+ export const truncate = (val) => innerTruncate(0)(val);
@@ -0,0 +1,36 @@
1
+ import { blake2AsHex } from '@polkadot/util-crypto';
2
+ import { defaultLogger } from './logger';
3
+ import { queueScheduler } from 'rxjs';
4
+ const logger = defaultLogger.child({ name: 'offchain' });
5
+ export class OffchainWorker {
6
+ constructor() {
7
+ this.pendingExtrinsics = [];
8
+ this.offchainStorage = new Map();
9
+ }
10
+ get(key) {
11
+ return this.offchainStorage.get(key);
12
+ }
13
+ set(key, value) {
14
+ this.offchainStorage.set(key, value);
15
+ }
16
+ async run(block) {
17
+ logger.info({ number: block.number, hash: block.hash }, `Run Offchain Worker for block #${block.number.toLocaleString()}`);
18
+ const header = await block.header;
19
+ await block.call('OffchainWorkerApi_offchain_worker', [header.toHex()]);
20
+ logger.info(`Offchain Worker complete for block #${block.number.toLocaleString()}`);
21
+ const txs = this.pendingExtrinsics.splice(0);
22
+ if (txs.length > 0) {
23
+ queueScheduler.schedule(async (transactions) => {
24
+ await block.chain.txPool.buildBlock({ transactions });
25
+ }, 100, txs);
26
+ }
27
+ }
28
+ async pushExtrinsic(block, extrinsic) {
29
+ const validity = await block.chain.validateExtrinsic(extrinsic, '0x01');
30
+ if (validity.isOk) {
31
+ this.pendingExtrinsics.push(extrinsic);
32
+ return blake2AsHex(extrinsic, 256);
33
+ }
34
+ throw validity.asErr;
35
+ }
36
+ }
@@ -0,0 +1,10 @@
1
+ import substrate from './substrate';
2
+ export const allHandlers = {
3
+ ...substrate,
4
+ rpc_methods: async () => Promise.resolve({
5
+ version: 1,
6
+ methods: [...Object.keys(allHandlers)],
7
+ }),
8
+ };
9
+ export { default as substrate } from './substrate';
10
+ export { ResponseError } from './shared';
@@ -0,0 +1,15 @@
1
+ import { defaultLogger } from '../logger';
2
+ export const logger = defaultLogger.child({ name: 'rpc' });
3
+ export class ResponseError extends Error {
4
+ constructor(code, message) {
5
+ super(message);
6
+ this.name = 'ResponseError';
7
+ this.code = code;
8
+ }
9
+ toJSON() {
10
+ return {
11
+ code: this.code,
12
+ message: this.message,
13
+ };
14
+ }
15
+ }
@@ -0,0 +1,85 @@
1
+ import { APPLY_EXTRINSIC_ERROR } from '../../blockchain/txpool';
2
+ import { ResponseError } from '../shared';
3
+ import { defaultLogger } from '../../logger';
4
+ const logger = defaultLogger.child({ name: 'rpc-author' });
5
+ /**
6
+ * @param context
7
+ * @param params - [`extrinsic`]
8
+ *
9
+ * @return Hash
10
+ */
11
+ export const author_submitExtrinsic = async (context, [extrinsic]) => {
12
+ return context.chain.submitExtrinsic(extrinsic).catch((error) => {
13
+ const code = error.isInvalid ? 1010 : 1011;
14
+ throw new ResponseError(code, error.toString());
15
+ });
16
+ };
17
+ /**
18
+ * @param context
19
+ * @param params - [`extrinsic`]
20
+ * @param subscriptionManager
21
+ *
22
+ * @return subscription id
23
+ */
24
+ export const author_submitAndWatchExtrinsic = async (context, [extrinsic], { subscribe, unsubscribe }) => {
25
+ let update = (_block) => { };
26
+ const id = context.chain.headState.subscribeHead((block) => update(block));
27
+ const callback = subscribe('author_extrinsicUpdate', id, () => context.chain.headState.unsubscribeHead(id));
28
+ const onExtrinsicFail = ([failedExtrinsic, error]) => {
29
+ if (failedExtrinsic === extrinsic) {
30
+ callback(error.toJSON());
31
+ done(id);
32
+ }
33
+ };
34
+ context.chain.txPool.event.on(APPLY_EXTRINSIC_ERROR, onExtrinsicFail);
35
+ const done = (id) => {
36
+ context.chain.txPool.event.removeListener(APPLY_EXTRINSIC_ERROR, onExtrinsicFail);
37
+ unsubscribe(id);
38
+ };
39
+ update = async (block) => {
40
+ const extrisnics = await block.extrinsics;
41
+ if (!extrisnics.includes(extrinsic))
42
+ return;
43
+ logger.debug({ block: block.hash }, 'author_extrinsicUpdate');
44
+ callback({
45
+ inBlock: block.hash,
46
+ });
47
+ // wait a bit for InBlock to be sent
48
+ await new Promise((r) => setTimeout(r, 100));
49
+ callback({
50
+ finalized: block.hash,
51
+ });
52
+ done(id);
53
+ };
54
+ try {
55
+ await context.chain.submitExtrinsic(extrinsic);
56
+ // send callback after subscription id is returned
57
+ setTimeout(() => {
58
+ callback({
59
+ ready: null,
60
+ });
61
+ }, 50);
62
+ }
63
+ catch (error) {
64
+ logger.error({ error }, 'ExtrinsicFailed');
65
+ const code = error.isInvalid ? 1010 : 1011;
66
+ done(id);
67
+ throw new ResponseError(code, error.toString());
68
+ }
69
+ return id;
70
+ };
71
+ /**
72
+ * @param _context
73
+ * @param params - [`subid`]
74
+ */
75
+ export const author_unwatchExtrinsic = async (_context, [subid], { unsubscribe }) => {
76
+ unsubscribe(subid);
77
+ };
78
+ /**
79
+ * Get pending extrinsics
80
+ *
81
+ * @return Array of pending extrinsics
82
+ */
83
+ export const author_pendingExtrinsics = async (context) => {
84
+ return context.chain.txPool.pendingExtrinsics;
85
+ };
@@ -0,0 +1,84 @@
1
+ import { ResponseError } from '../shared';
2
+ const processHeader = (header) => {
3
+ const res = header.toJSON();
4
+ res.number = '0x' + res.number.toString(16); // number is hex format
5
+ return res;
6
+ };
7
+ /**
8
+ * @param context
9
+ * @param params - [`blockNumber` | `blockNumber[]` | null]
10
+ *
11
+ * @return Block hash | hash[] | null
12
+ */
13
+ export const chain_getBlockHash = async (context, [blockNumber]) => {
14
+ const numbers = Array.isArray(blockNumber) ? blockNumber : [blockNumber];
15
+ const hashes = await Promise.all(numbers.map((n) => context.chain.getBlockAt(n))).then((blocks) => blocks.map((b) => b?.hash || null));
16
+ return Array.isArray(blockNumber) ? hashes : hashes[0];
17
+ };
18
+ /**
19
+ * @param context
20
+ * @param params - [`blockhash`]
21
+ *
22
+ * @return Header - see `@polkadot/types/interfaces`
23
+ */
24
+ export const chain_getHeader = async (context, [hash]) => {
25
+ const block = await context.chain.getBlock(hash);
26
+ if (!block) {
27
+ throw new ResponseError(1, `Block ${hash} not found`);
28
+ }
29
+ return processHeader(await block.header);
30
+ };
31
+ /**
32
+ * @param context
33
+ * @param params - [`blockhash`]
34
+ *
35
+ * @return Block header and extrinsics
36
+ */
37
+ export const chain_getBlock = async (context, [hash]) => {
38
+ const block = await context.chain.getBlock(hash);
39
+ if (!block) {
40
+ throw new ResponseError(1, `Block ${hash} not found`);
41
+ }
42
+ return {
43
+ block: {
44
+ header: processHeader(await block.header),
45
+ extrinsics: await block.extrinsics,
46
+ },
47
+ justifications: null,
48
+ };
49
+ };
50
+ /**
51
+ * @param context
52
+ *
53
+ * @return head hash
54
+ */
55
+ export const chain_getFinalizedHead = async (context) => {
56
+ return context.chain.head.hash;
57
+ };
58
+ export const chain_subscribeNewHead = async (context, _params, { subscribe }) => {
59
+ let update = () => { };
60
+ const id = context.chain.headState.subscribeHead(() => update());
61
+ const callback = subscribe('chain_newHead', id, () => context.chain.headState.unsubscribeHead(id));
62
+ update = async () => {
63
+ callback(processHeader(await context.chain.head.header));
64
+ };
65
+ setTimeout(update, 50);
66
+ return id;
67
+ };
68
+ export const chain_subscribeFinalizedHeads = async (context, _params, { subscribe }) => {
69
+ let update = () => { };
70
+ const id = context.chain.headState.subscribeHead(() => update());
71
+ const callback = subscribe('chain_finalizedHead', id, () => context.chain.headState.unsubscribeHead(id));
72
+ update = async () => {
73
+ callback(processHeader(await context.chain.head.header));
74
+ };
75
+ setTimeout(update, 50);
76
+ return id;
77
+ };
78
+ export const chain_unsubscribeNewHead = async (_context, [subid], { unsubscribe }) => {
79
+ unsubscribe(subid);
80
+ };
81
+ export const chain_getHead = chain_getBlockHash;
82
+ export const chain_subscribeNewHeads = chain_subscribeNewHead;
83
+ export const chain_unsubscribeNewHeads = chain_unsubscribeNewHead;
84
+ export const chain_unsubscribeFinalizedHeads = chain_unsubscribeNewHead;
@@ -0,0 +1,18 @@
1
+ import * as AuthorRPC from './author';
2
+ import * as ChainRPC from './chain';
3
+ import * as PaymentRPC from './payment';
4
+ import * as StateRPC from './state';
5
+ import * as SystemRPC from './system';
6
+ export { AuthorRPC };
7
+ export { ChainRPC };
8
+ export { PaymentRPC };
9
+ export { StateRPC };
10
+ export { SystemRPC };
11
+ const handlers = {
12
+ ...AuthorRPC,
13
+ ...ChainRPC,
14
+ ...PaymentRPC,
15
+ ...StateRPC,
16
+ ...SystemRPC,
17
+ };
18
+ export default handlers;
@@ -0,0 +1,40 @@
1
+ import { hexToU8a } from '@polkadot/util';
2
+ import { ResponseError } from '../shared';
3
+ /**
4
+ * @param context
5
+ * @param params - [`extrinsic`, `blockhash`]
6
+ *
7
+ * @return result in hash
8
+ */
9
+ export const payment_queryFeeDetails = async (context, [extrinsic, hash]) => {
10
+ const block = await context.chain.getBlock(hash);
11
+ if (!block) {
12
+ throw new ResponseError(1, `Block ${hash} not found`);
13
+ }
14
+ const registry = await block.registry;
15
+ const tx = hexToU8a(extrinsic);
16
+ const resp = await block.call('TransactionPaymentApi_query_fee_details', [
17
+ registry.createType('Extrinsic', tx).toHex(),
18
+ registry.createType('u32', tx.byteLength).toHex(),
19
+ ]);
20
+ return resp.result;
21
+ };
22
+ /**
23
+ * @param context
24
+ * @param params - [`extrinsic`, `blockhash`]
25
+ *
26
+ * @return result in hash
27
+ */
28
+ export const payment_queryInfo = async (context, [extrinsic, hash]) => {
29
+ const block = await context.chain.getBlock(hash);
30
+ if (!block) {
31
+ throw new ResponseError(1, `Block ${hash} not found`);
32
+ }
33
+ const registry = await block.registry;
34
+ const tx = hexToU8a(extrinsic);
35
+ const resp = await block.call('TransactionPaymentApi_query_info', [
36
+ registry.createType('Extrinsic', tx).toHex(),
37
+ registry.createType('u32', tx.byteLength).toHex(),
38
+ ]);
39
+ return resp.result;
40
+ };