@acala-network/chopsticks-testing 0.9.1-1 → 0.9.1-3
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.
- package/dist/cjs/check.js +155 -83
- package/dist/cjs/index.js +157 -100
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/signFake.js +27 -9
- package/dist/esm/check.js +103 -119
- package/dist/esm/index.js +80 -55
- package/dist/esm/signFake.js +9 -4
- package/package.json +11 -4
package/dist/cjs/index.js
CHANGED
|
@@ -1,27 +1,71 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
createConfig: function() {
|
|
13
|
+
return createConfig;
|
|
14
|
+
},
|
|
15
|
+
defer: function() {
|
|
16
|
+
return defer;
|
|
17
|
+
},
|
|
18
|
+
expectHex: function() {
|
|
19
|
+
return expectHex;
|
|
20
|
+
},
|
|
21
|
+
expectJson: function() {
|
|
22
|
+
return expectJson;
|
|
23
|
+
},
|
|
24
|
+
matchEvents: function() {
|
|
25
|
+
return matchEvents;
|
|
26
|
+
},
|
|
27
|
+
matchSystemEvents: function() {
|
|
28
|
+
return matchSystemEvents;
|
|
29
|
+
},
|
|
30
|
+
redact: function() {
|
|
31
|
+
return redact;
|
|
32
|
+
},
|
|
33
|
+
sendTransaction: function() {
|
|
34
|
+
return sendTransaction;
|
|
35
|
+
},
|
|
36
|
+
setupContext: function() {
|
|
37
|
+
return setupContext;
|
|
38
|
+
},
|
|
39
|
+
setupContextWithConfig: function() {
|
|
40
|
+
return setupContextWithConfig;
|
|
41
|
+
},
|
|
42
|
+
setupNetworks: function() {
|
|
43
|
+
return setupNetworks;
|
|
44
|
+
},
|
|
45
|
+
testingPairs: function() {
|
|
46
|
+
return testingPairs;
|
|
7
47
|
}
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
Object.
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
48
|
+
});
|
|
49
|
+
const _api = require("@polkadot/api");
|
|
50
|
+
const _chopsticks = require("@acala-network/chopsticks");
|
|
51
|
+
const _keyring = require("@polkadot/keyring");
|
|
52
|
+
const _vitest = require("vitest");
|
|
53
|
+
_export_star(require("./check"), exports);
|
|
54
|
+
_export_star(require("./signFake"), exports);
|
|
55
|
+
function _export_star(from, to) {
|
|
56
|
+
Object.keys(from).forEach(function(k) {
|
|
57
|
+
if (k !== "default" && !Object.prototype.hasOwnProperty.call(to, k)) {
|
|
58
|
+
Object.defineProperty(to, k, {
|
|
59
|
+
enumerable: true,
|
|
60
|
+
get: function() {
|
|
61
|
+
return from[k];
|
|
62
|
+
}
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
return from;
|
|
67
|
+
}
|
|
68
|
+
const createConfig = ({ endpoint, blockNumber, blockHash, wasmOverride, db, timeout, port, maxMemoryBlockCount, resume })=>{
|
|
25
69
|
// random port if not specified
|
|
26
70
|
port = port ?? Math.floor(Math.random() * 10000) + 10000;
|
|
27
71
|
const config = {
|
|
@@ -29,32 +73,30 @@ const createConfig = ({ endpoint, blockNumber, blockHash, wasmOverride, db, time
|
|
|
29
73
|
port,
|
|
30
74
|
block: blockNumber || blockHash,
|
|
31
75
|
'mock-signature-host': true,
|
|
32
|
-
'build-block-mode':
|
|
76
|
+
'build-block-mode': _chopsticks.BuildBlockMode.Manual,
|
|
33
77
|
'max-memory-block-count': maxMemoryBlockCount ?? 100,
|
|
34
78
|
db,
|
|
35
79
|
'wasm-override': wasmOverride,
|
|
36
80
|
timeout,
|
|
37
|
-
resume: resume ?? false
|
|
81
|
+
resume: resume ?? false
|
|
38
82
|
};
|
|
39
83
|
return config;
|
|
40
84
|
};
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
return (0, exports.setupContextWithConfig)((0, exports.createConfig)(option));
|
|
85
|
+
const setupContext = async (option)=>{
|
|
86
|
+
return setupContextWithConfig(createConfig(option));
|
|
44
87
|
};
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
const { chain, listenPort, close } = await (0, chopsticks_1.setupWithServer)(config);
|
|
88
|
+
const setupContextWithConfig = async ({ timeout, ...config })=>{
|
|
89
|
+
const { chain, listenPort, close } = await (0, _chopsticks.setupWithServer)(config);
|
|
48
90
|
const url = `ws://localhost:${listenPort}`;
|
|
49
|
-
const ws = new
|
|
50
|
-
const api = await
|
|
91
|
+
const ws = new _api.WsProvider(url, undefined, undefined, timeout);
|
|
92
|
+
const api = await _api.ApiPromise.create({
|
|
51
93
|
provider: ws,
|
|
52
94
|
signedExtensions: {
|
|
53
95
|
SetEvmOrigin: {
|
|
54
96
|
extrinsic: {},
|
|
55
|
-
payload: {}
|
|
56
|
-
}
|
|
57
|
-
}
|
|
97
|
+
payload: {}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
58
100
|
});
|
|
59
101
|
await api.isReady;
|
|
60
102
|
return {
|
|
@@ -63,82 +105,95 @@ const setupContextWithConfig = async ({ timeout, ...config }) => {
|
|
|
63
105
|
ws,
|
|
64
106
|
api,
|
|
65
107
|
dev: {
|
|
66
|
-
newBlock: (param)
|
|
67
|
-
return ws.send('dev_newBlock', [
|
|
108
|
+
newBlock: (param)=>{
|
|
109
|
+
return ws.send('dev_newBlock', [
|
|
110
|
+
param
|
|
111
|
+
]);
|
|
68
112
|
},
|
|
69
|
-
setStorage: (values, blockHash)
|
|
70
|
-
return ws.send('dev_setStorage', [
|
|
113
|
+
setStorage: (values, blockHash)=>{
|
|
114
|
+
return ws.send('dev_setStorage', [
|
|
115
|
+
values,
|
|
116
|
+
blockHash
|
|
117
|
+
]);
|
|
71
118
|
},
|
|
72
|
-
timeTravel: (date)
|
|
73
|
-
return ws.send('dev_timeTravel', [
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
return ws.send('dev_setHead', [hashOrNumber]);
|
|
119
|
+
timeTravel: (date)=>{
|
|
120
|
+
return ws.send('dev_timeTravel', [
|
|
121
|
+
date
|
|
122
|
+
]);
|
|
77
123
|
},
|
|
124
|
+
setHead: (hashOrNumber)=>{
|
|
125
|
+
return ws.send('dev_setHead', [
|
|
126
|
+
hashOrNumber
|
|
127
|
+
]);
|
|
128
|
+
}
|
|
78
129
|
},
|
|
79
|
-
async teardown() {
|
|
130
|
+
async teardown () {
|
|
80
131
|
await api.disconnect();
|
|
81
132
|
await close();
|
|
82
133
|
},
|
|
83
|
-
async pause() {
|
|
84
|
-
await ws.send('dev_setBlockBuildMode', [
|
|
134
|
+
async pause () {
|
|
135
|
+
await ws.send('dev_setBlockBuildMode', [
|
|
136
|
+
_chopsticks.BuildBlockMode.Instant
|
|
137
|
+
]);
|
|
85
138
|
// log a bit later to ensure the message is visible
|
|
86
|
-
setTimeout(()
|
|
87
|
-
return new Promise((_resolve)
|
|
88
|
-
|
|
139
|
+
setTimeout(()=>console.log(`Test paused. Polkadot.js apps URL: https://polkadot.js.org/apps/?rpc=${url}`), 100);
|
|
140
|
+
return new Promise((_resolve)=>{}) // wait forever
|
|
141
|
+
;
|
|
142
|
+
}
|
|
89
143
|
};
|
|
90
144
|
};
|
|
91
|
-
|
|
92
|
-
const setupNetworks = async (networkOptions) => {
|
|
145
|
+
const setupNetworks = async (networkOptions)=>{
|
|
93
146
|
const ret = {};
|
|
94
147
|
let wasmOverriden = false;
|
|
95
|
-
for (const [name, options] of Object.entries(networkOptions))
|
|
96
|
-
const config = typeof options === 'string' ? await (0,
|
|
97
|
-
ret[name] = await
|
|
148
|
+
for (const [name, options] of Object.entries(networkOptions)){
|
|
149
|
+
const config = typeof options === 'string' ? await (0, _chopsticks.fetchConfig)(options) : options ?? await (0, _chopsticks.fetchConfig)(name);
|
|
150
|
+
ret[name] = await setupContextWithConfig(config);
|
|
98
151
|
wasmOverriden ||= config['wasm-override'] != null;
|
|
99
152
|
}
|
|
100
|
-
const relaychainName = Object.keys(ret).filter((x)
|
|
153
|
+
const relaychainName = Object.keys(ret).filter((x)=>[
|
|
154
|
+
'polkadot',
|
|
155
|
+
'kusama'
|
|
156
|
+
].includes(x.toLocaleLowerCase()))[0];
|
|
101
157
|
const { [relaychainName]: relaychain, ...parachains } = ret;
|
|
102
158
|
if (relaychain) {
|
|
103
|
-
for (const parachain of Object.values(parachains))
|
|
104
|
-
await (0,
|
|
159
|
+
for (const parachain of Object.values(parachains)){
|
|
160
|
+
await (0, _chopsticks.connectVertical)(relaychain.chain, parachain.chain);
|
|
105
161
|
}
|
|
106
162
|
}
|
|
107
|
-
const parachainList = Object.values(parachains).map((i)
|
|
163
|
+
const parachainList = Object.values(parachains).map((i)=>i.chain);
|
|
108
164
|
if (parachainList.length > 0) {
|
|
109
|
-
await (0,
|
|
165
|
+
await (0, _chopsticks.connectParachains)(parachainList);
|
|
110
166
|
}
|
|
111
167
|
if (wasmOverriden) {
|
|
112
168
|
// trigger runtime upgrade if needed (due to wasm override)
|
|
113
|
-
for (const chain of Object.values(ret))
|
|
169
|
+
for (const chain of Object.values(ret)){
|
|
114
170
|
await chain.dev.newBlock();
|
|
115
171
|
}
|
|
116
172
|
// handle xcm version message if needed (due to wasm override triggered xcm version upgrade)
|
|
117
|
-
for (const chain of Object.values(ret))
|
|
173
|
+
for (const chain of Object.values(ret)){
|
|
118
174
|
await chain.dev.newBlock();
|
|
119
175
|
}
|
|
120
176
|
}
|
|
121
177
|
return ret;
|
|
122
178
|
};
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
const
|
|
126
|
-
const
|
|
127
|
-
const
|
|
128
|
-
|
|
129
|
-
return (0, vitest_1.expect)(toJson(codec));
|
|
179
|
+
const processCodecOrArray = (codec, fn)=>Array.isArray(codec) ? codec.map(fn) : fn(codec);
|
|
180
|
+
const toHuman = (codec)=>processCodecOrArray(codec, (c)=>c?.toHuman?.() ?? c);
|
|
181
|
+
const toJson = (codec)=>processCodecOrArray(codec, (c)=>c?.toJSON?.() ?? c);
|
|
182
|
+
const toHex = (codec)=>processCodecOrArray(codec, (c)=>c?.toHex?.() ?? c);
|
|
183
|
+
const expectJson = (codec)=>{
|
|
184
|
+
return (0, _vitest.expect)(toJson(codec));
|
|
130
185
|
};
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
return (0, vitest_1.expect)(toHex(codec));
|
|
186
|
+
const expectHex = (codec)=>{
|
|
187
|
+
return (0, _vitest.expect)(toHex(codec));
|
|
134
188
|
};
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
let data = toHuman(await events).map(({ event: { index: _, ...event } }) => event);
|
|
189
|
+
const _matchEvents = async (msg, events, ...filters)=>{
|
|
190
|
+
let data = toHuman(await events).map(({ event: { index: _, ...event } })=>event);
|
|
138
191
|
if (filters.length > 0) {
|
|
139
|
-
const filtersArr = Array.isArray(filters) ? filters : [
|
|
140
|
-
|
|
141
|
-
|
|
192
|
+
const filtersArr = Array.isArray(filters) ? filters : [
|
|
193
|
+
filters
|
|
194
|
+
];
|
|
195
|
+
data = data.filter((evt)=>{
|
|
196
|
+
return filtersArr.some((filter)=>{
|
|
142
197
|
if (typeof filter === 'string') {
|
|
143
198
|
return evt.section === filter;
|
|
144
199
|
}
|
|
@@ -147,19 +202,17 @@ const _matchEvents = async (msg, events, ...filters) => {
|
|
|
147
202
|
});
|
|
148
203
|
});
|
|
149
204
|
}
|
|
150
|
-
return (0,
|
|
205
|
+
return (0, _vitest.expect)(data).toMatchSnapshot(msg);
|
|
151
206
|
};
|
|
152
|
-
const matchEvents = async (events, ...filters)
|
|
153
|
-
return _matchEvents('events',
|
|
207
|
+
const matchEvents = async (events, ...filters)=>{
|
|
208
|
+
return _matchEvents('events', redact(events), ...filters);
|
|
154
209
|
};
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
await _matchEvents('system events', (0, exports.redact)(api.query.system.events()), ...filters);
|
|
210
|
+
const matchSystemEvents = async ({ api }, ...filters)=>{
|
|
211
|
+
await _matchEvents('system events', redact(api.query.system.events()), ...filters);
|
|
158
212
|
};
|
|
159
|
-
|
|
160
|
-
const redact = async (data) => {
|
|
213
|
+
const redact = async (data)=>{
|
|
161
214
|
const json = toHuman(await data);
|
|
162
|
-
const process = (obj)
|
|
215
|
+
const process = (obj)=>{
|
|
163
216
|
if (obj == null) {
|
|
164
217
|
return obj;
|
|
165
218
|
}
|
|
@@ -188,26 +241,27 @@ const redact = async (data) => {
|
|
|
188
241
|
return obj;
|
|
189
242
|
}
|
|
190
243
|
if (typeof obj === 'object') {
|
|
191
|
-
return Object.fromEntries(Object.entries(obj).map(([k, v])
|
|
244
|
+
return Object.fromEntries(Object.entries(obj).map(([k, v])=>[
|
|
245
|
+
k,
|
|
246
|
+
process(v)
|
|
247
|
+
]));
|
|
192
248
|
}
|
|
193
249
|
return obj;
|
|
194
250
|
};
|
|
195
251
|
return process(json);
|
|
196
252
|
};
|
|
197
|
-
exports.redact = redact;
|
|
198
253
|
function defer() {
|
|
199
254
|
const deferred = {};
|
|
200
|
-
deferred.promise = new Promise((resolve, reject)
|
|
255
|
+
deferred.promise = new Promise((resolve, reject)=>{
|
|
201
256
|
deferred.resolve = resolve;
|
|
202
257
|
deferred.reject = reject;
|
|
203
258
|
});
|
|
204
259
|
return deferred;
|
|
205
260
|
}
|
|
206
|
-
|
|
207
|
-
const sendTransaction = async (tx) => {
|
|
261
|
+
const sendTransaction = async (tx)=>{
|
|
208
262
|
const signed = await tx;
|
|
209
263
|
const deferred = defer();
|
|
210
|
-
await signed.send((status)
|
|
264
|
+
await signed.send((status)=>{
|
|
211
265
|
console.log('tranaction status: ', status.status.toHuman());
|
|
212
266
|
if (status.isInBlock || status.isFinalized) {
|
|
213
267
|
deferred.resolve(status.events);
|
|
@@ -217,14 +271,18 @@ const sendTransaction = async (tx) => {
|
|
|
217
271
|
}
|
|
218
272
|
});
|
|
219
273
|
return {
|
|
220
|
-
events: deferred.promise
|
|
274
|
+
events: deferred.promise
|
|
221
275
|
};
|
|
222
276
|
};
|
|
223
|
-
|
|
224
|
-
const
|
|
225
|
-
|
|
277
|
+
const testingPairs = (keyringType = 'ed25519', ss58Format)=>{
|
|
278
|
+
const keyringEth = (0, _keyring.createTestKeyring)({
|
|
279
|
+
type: 'ethereum'
|
|
280
|
+
});
|
|
226
281
|
// default to ed25519 because sr25519 signature is non-deterministic
|
|
227
|
-
const keyring = new
|
|
282
|
+
const keyring = new _keyring.Keyring({
|
|
283
|
+
type: keyringType,
|
|
284
|
+
ss58Format
|
|
285
|
+
});
|
|
228
286
|
return {
|
|
229
287
|
alice: keyring.addFromUri('//Alice'),
|
|
230
288
|
bob: keyring.addFromUri('//Bob'),
|
|
@@ -237,7 +295,6 @@ const testingPairs = (keyringType = 'ed25519', ss58Format) => {
|
|
|
237
295
|
dorothy: keyringEth.getPair('0x773539d4Ac0e786233D90A233654ccEE26a613D9'),
|
|
238
296
|
ethan: keyringEth.getPair('0xFf64d3F6efE2317EE2807d223a0Bdc4c0c49dfDB'),
|
|
239
297
|
keyring,
|
|
240
|
-
keyringEth
|
|
298
|
+
keyringEth
|
|
241
299
|
};
|
|
242
300
|
};
|
|
243
|
-
exports.testingPairs = testingPairs;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"type": "commonjs"}
|
package/dist/cjs/signFake.js
CHANGED
|
@@ -1,22 +1,40 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
|
|
4
|
-
|
|
2
|
+
Object.defineProperty(exports, "__esModule", {
|
|
3
|
+
value: true
|
|
4
|
+
});
|
|
5
|
+
function _export(target, all) {
|
|
6
|
+
for(var name in all)Object.defineProperty(target, name, {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: all[name]
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
_export(exports, {
|
|
12
|
+
signFake: function() {
|
|
13
|
+
return signFake;
|
|
14
|
+
},
|
|
15
|
+
signFakeWithApi: function() {
|
|
16
|
+
return signFakeWithApi;
|
|
17
|
+
}
|
|
18
|
+
});
|
|
19
|
+
const signFakeWithApi = async (api, tx, addr, options = {})=>{
|
|
5
20
|
const nonce = options.nonce ?? (await api.query.system.account(addr)).nonce;
|
|
6
|
-
|
|
21
|
+
signFake(tx, addr, {
|
|
7
22
|
nonce,
|
|
8
23
|
genesisHash: api.genesisHash,
|
|
9
24
|
runtimeVersion: api.runtimeVersion,
|
|
10
25
|
blockHash: api.genesisHash,
|
|
11
|
-
...options
|
|
26
|
+
...options
|
|
12
27
|
});
|
|
13
28
|
};
|
|
14
|
-
|
|
15
|
-
const signFake = (tx, addr, options) => {
|
|
29
|
+
const signFake = (tx, addr, options)=>{
|
|
16
30
|
const mockSignature = new Uint8Array(64);
|
|
17
31
|
mockSignature.fill(0xcd);
|
|
18
|
-
mockSignature.set([
|
|
32
|
+
mockSignature.set([
|
|
33
|
+
0xde,
|
|
34
|
+
0xad,
|
|
35
|
+
0xbe,
|
|
36
|
+
0xef
|
|
37
|
+
]);
|
|
19
38
|
tx.signFake(addr, options);
|
|
20
39
|
tx.signature.set(mockSignature);
|
|
21
40
|
};
|
|
22
|
-
exports.signFake = signFake;
|