prool 0.1.0 → 0.1.1
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/instances/tempo.d.ts +57 -25
- package/dist/instances/tempo.d.ts.map +1 -1
- package/dist/instances/tempo.js +47 -34
- package/dist/instances/tempo.js.map +1 -1
- package/dist/internal/utils.d.ts +5 -5
- package/dist/internal/utils.d.ts.map +1 -1
- package/dist/internal/utils.js +36 -6
- package/dist/internal/utils.js.map +1 -1
- package/package.json +1 -1
- package/src/instances/tempo.ts +79 -35
- package/src/internal/utils.test.ts +14 -0
- package/src/internal/utils.ts +46 -16
|
@@ -13,10 +13,33 @@ export declare function command(parameters: tempo.Parameters): string[];
|
|
|
13
13
|
*/
|
|
14
14
|
export declare const tempo: Instance.define.ReturnType<{
|
|
15
15
|
args: {
|
|
16
|
+
[x: string]: unknown;
|
|
16
17
|
/**
|
|
17
18
|
* Interval between blocks.
|
|
18
19
|
*/
|
|
19
20
|
blockTime?: string | undefined;
|
|
21
|
+
/**
|
|
22
|
+
* How many transactions to mine per block
|
|
23
|
+
*/
|
|
24
|
+
blockMaxTransactions?: number | undefined;
|
|
25
|
+
/**
|
|
26
|
+
* Path to a configuration file.
|
|
27
|
+
*/
|
|
28
|
+
config?: string | undefined;
|
|
29
|
+
/**
|
|
30
|
+
* The chain this node is running.
|
|
31
|
+
* Possible values are either a built-in chain or the path to a chain specification file.
|
|
32
|
+
*
|
|
33
|
+
* Built-in chains:
|
|
34
|
+
* - testnet
|
|
35
|
+
*
|
|
36
|
+
* @default "testnet"
|
|
37
|
+
*/
|
|
38
|
+
chain?: string | undefined;
|
|
39
|
+
/**
|
|
40
|
+
* The path to the data dir for all reth files and subdirectories.
|
|
41
|
+
*/
|
|
42
|
+
datadir?: string | undefined;
|
|
20
43
|
/**
|
|
21
44
|
* Faucet options.
|
|
22
45
|
*/
|
|
@@ -38,6 +61,11 @@ export declare const tempo: Instance.define.ReturnType<{
|
|
|
38
61
|
* Host the server will listen on.
|
|
39
62
|
*/
|
|
40
63
|
host?: string | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Derive dev accounts from a fixed mnemonic instead of random ones.
|
|
66
|
+
* @default "test test test test test test test test test test test junk"
|
|
67
|
+
*/
|
|
68
|
+
mnemonic?: string | undefined;
|
|
41
69
|
/**
|
|
42
70
|
* Port the server will listen on.
|
|
43
71
|
*/
|
|
@@ -55,6 +83,28 @@ export declare namespace tempo {
|
|
|
55
83
|
* Interval between blocks.
|
|
56
84
|
*/
|
|
57
85
|
blockTime?: string | undefined;
|
|
86
|
+
/**
|
|
87
|
+
* How many transactions to mine per block
|
|
88
|
+
*/
|
|
89
|
+
blockMaxTransactions?: number | undefined;
|
|
90
|
+
/**
|
|
91
|
+
* Path to a configuration file.
|
|
92
|
+
*/
|
|
93
|
+
config?: string | undefined;
|
|
94
|
+
/**
|
|
95
|
+
* The chain this node is running.
|
|
96
|
+
* Possible values are either a built-in chain or the path to a chain specification file.
|
|
97
|
+
*
|
|
98
|
+
* Built-in chains:
|
|
99
|
+
* - testnet
|
|
100
|
+
*
|
|
101
|
+
* @default "testnet"
|
|
102
|
+
*/
|
|
103
|
+
chain?: string | undefined;
|
|
104
|
+
/**
|
|
105
|
+
* The path to the data dir for all reth files and subdirectories.
|
|
106
|
+
*/
|
|
107
|
+
datadir?: string | undefined;
|
|
58
108
|
/**
|
|
59
109
|
* Faucet options.
|
|
60
110
|
*/
|
|
@@ -81,11 +131,16 @@ export declare namespace tempo {
|
|
|
81
131
|
* Host the server will listen on.
|
|
82
132
|
*/
|
|
83
133
|
host?: string | undefined;
|
|
134
|
+
/**
|
|
135
|
+
* Derive dev accounts from a fixed mnemonic instead of random ones.
|
|
136
|
+
* @default "test test test test test test test test test test test junk"
|
|
137
|
+
*/
|
|
138
|
+
mnemonic?: string | undefined;
|
|
84
139
|
/**
|
|
85
140
|
* Port the server will listen on.
|
|
86
141
|
*/
|
|
87
142
|
port?: number | undefined;
|
|
88
|
-
}
|
|
143
|
+
} & Record<string, unknown>;
|
|
89
144
|
}
|
|
90
145
|
/**
|
|
91
146
|
* Defines a Tempo instance.
|
|
@@ -100,6 +155,7 @@ export declare namespace tempo {
|
|
|
100
155
|
*/
|
|
101
156
|
export declare const tempoDocker: Instance.define.ReturnType<{
|
|
102
157
|
args: {
|
|
158
|
+
[x: string]: unknown;
|
|
103
159
|
/**
|
|
104
160
|
* Host the server will listen on.
|
|
105
161
|
*/
|
|
@@ -108,30 +164,6 @@ export declare const tempoDocker: Instance.define.ReturnType<{
|
|
|
108
164
|
* Port the server will listen on.
|
|
109
165
|
*/
|
|
110
166
|
port?: number | undefined;
|
|
111
|
-
blockTime?: string | undefined
|
|
112
|
-
/**
|
|
113
|
-
* Faucet options.
|
|
114
|
-
*/
|
|
115
|
-
| undefined;
|
|
116
|
-
faucet?: {
|
|
117
|
-
/**
|
|
118
|
-
* Target token addresses for the faucet to be funding with
|
|
119
|
-
*/
|
|
120
|
-
addresses?: string[] | undefined;
|
|
121
|
-
/**
|
|
122
|
-
* Amount for each faucet funding transaction
|
|
123
|
-
*/
|
|
124
|
-
amount?: bigint | undefined;
|
|
125
|
-
/**
|
|
126
|
-
* Faucet funding mnemonic
|
|
127
|
-
*/
|
|
128
|
-
privateKey?: string | undefined;
|
|
129
|
-
} | undefined
|
|
130
|
-
/**
|
|
131
|
-
* Rust log level configuration (sets RUST_LOG environment variable).
|
|
132
|
-
* Can be a log level or a custom filter string.
|
|
133
|
-
*/
|
|
134
|
-
| undefined;
|
|
135
167
|
};
|
|
136
168
|
}, Instance.tempoDocker.Parameters | undefined>;
|
|
137
169
|
export declare namespace tempoDocker {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tempo.d.ts","sourceRoot":"","sources":["../../src/instances/tempo.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"tempo.d.ts","sourceRoot":"","sources":["../../src/instances/tempo.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAI1C,wBAAgB,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,MAAM,EAAE,CAoD9D;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,KAAK;;;QA+Dd;;WAEG;oBACS,MAAM,GAAG,SAAS;QAC9B;;WAEG;+BACoB,MAAM,GAAG,SAAS;QACzC;;WAEG;iBACM,MAAM,GAAG,SAAS;QAC3B;;;;;;;;WAQG;gBACK,MAAM,GAAG,SAAS;QAC1B;;WAEG;kBACO,MAAM,GAAG,SAAS;QAC5B;;WAEG;iBAEC;YACE;;eAEG;YACH,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;YAChC;;eAEG;YACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;YAC3B;;eAEG;YACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAChC,GACD,SAAS;QAcb;;WAEG;eACI,MAAM,GAAG,SAAS;QACzB;;;WAGG;mBACQ,MAAM,GAAG,SAAS;QAC7B;;WAEG;eACI,MAAM,GAAG,SAAS;;;yCA9E3B,CAAA;AAEF,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,KAAY,UAAU,GAAG;QACvB;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B;;WAEG;QACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC9B;;WAEG;QACH,oBAAoB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzC;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B;;;;;;;;WAQG;QACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC1B;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC5B;;WAEG;QACH,MAAM,CAAC,EACH;YACE;;eAEG;YACH,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;YAChC;;eAEG;YACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;YAC3B;;eAEG;YACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAChC,GACD,SAAS,CAAA;QACb;;;WAGG;QACH,GAAG,CAAC,EACA,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,OAAO,GACP,CAAC,MAAM,GAAG,EAAE,CAAC,GACb,OAAO,GACP,SAAS,CAAA;QACb;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB;;;WAGG;QACH,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC7B;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC5B;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,WAAW;;;QAwFpB;;WAEG;eACI,MAAM,GAAG,SAAS;QACzB;;WAEG;eACI,MAAM,GAAG,SAAS;;+CAnB5B,CAAA;AAED,MAAM,CAAC,OAAO,WAAW,WAAW,CAAC;IACnC,KAAY,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG;QAC1D;;WAEG;QACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAClC;;WAEG;QACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC1B;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,CAAA;CACF"}
|
package/dist/instances/tempo.js
CHANGED
|
@@ -2,42 +2,55 @@ import * as os from 'node:os';
|
|
|
2
2
|
import * as path from 'node:path';
|
|
3
3
|
import { GenericContainer, Wait, } from 'testcontainers';
|
|
4
4
|
import * as Instance from '../Instance.js';
|
|
5
|
+
import { deepAssign, toArgs } from '../internal/utils.js';
|
|
5
6
|
import { execa } from '../processes/execa.js';
|
|
6
7
|
export function command(parameters) {
|
|
7
|
-
const {
|
|
8
|
-
const
|
|
8
|
+
const { blockMaxTransactions, blockTime, mnemonic, port, ...rest } = parameters;
|
|
9
|
+
const datadir = path.join(os.tmpdir(), '.prool', `tempo.${port}`);
|
|
10
|
+
const defaultParameters = {
|
|
11
|
+
authrpc: {
|
|
12
|
+
port: port + 30,
|
|
13
|
+
},
|
|
14
|
+
datadir,
|
|
15
|
+
dev: [
|
|
16
|
+
true,
|
|
17
|
+
{
|
|
18
|
+
blockTime: blockTime ?? '50ms',
|
|
19
|
+
...(blockMaxTransactions ? { blockMaxTransactions } : {}),
|
|
20
|
+
...(mnemonic ? { mnemonic } : {}),
|
|
21
|
+
},
|
|
22
|
+
],
|
|
23
|
+
engine: {
|
|
24
|
+
disablePrecompileCache: true,
|
|
25
|
+
legacyStateRoot: true,
|
|
26
|
+
},
|
|
27
|
+
faucet: {
|
|
28
|
+
address: [
|
|
29
|
+
'0x20c0000000000000000000000000000000000000',
|
|
30
|
+
'0x20c0000000000000000000000000000000000001',
|
|
31
|
+
'0x20c0000000000000000000000000000000000002',
|
|
32
|
+
'0x20c0000000000000000000000000000000000003',
|
|
33
|
+
],
|
|
34
|
+
amount: '1000000000000',
|
|
35
|
+
enabled: true,
|
|
36
|
+
privateKey: '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',
|
|
37
|
+
},
|
|
38
|
+
http: {
|
|
39
|
+
addr: '0.0.0.0',
|
|
40
|
+
api: 'all',
|
|
41
|
+
corsdomain: '*',
|
|
42
|
+
port: port,
|
|
43
|
+
},
|
|
44
|
+
port: port + 10,
|
|
45
|
+
ws: {
|
|
46
|
+
port: port + 20,
|
|
47
|
+
},
|
|
48
|
+
};
|
|
9
49
|
return [
|
|
10
50
|
'node',
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
`--dev.block-time=${parameters?.blockTime ?? '50ms'}`,
|
|
15
|
-
'--engine.disable-precompile-cache',
|
|
16
|
-
'--engine.legacy-state-root',
|
|
17
|
-
'--faucet.address',
|
|
18
|
-
...(faucet?.addresses ?? [
|
|
19
|
-
'0x20c0000000000000000000000000000000000000',
|
|
20
|
-
'0x20c0000000000000000000000000000000000001',
|
|
21
|
-
'0x20c0000000000000000000000000000000000002',
|
|
22
|
-
'0x20c0000000000000000000000000000000000003',
|
|
23
|
-
]),
|
|
24
|
-
`--faucet.amount=${faucet?.amount ?? '1000000000000'}`,
|
|
25
|
-
'--faucet.enabled',
|
|
26
|
-
`--faucet.private-key=${faucet?.privateKey ?? '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'}`,
|
|
27
|
-
'--http',
|
|
28
|
-
'--http.addr=0.0.0.0',
|
|
29
|
-
'--http.api=all',
|
|
30
|
-
'--http.corsdomain=*',
|
|
31
|
-
`--http.port=${port}`,
|
|
32
|
-
`--port=${port + 10}`,
|
|
33
|
-
'--txpool.basefee-max-count=10000000000000',
|
|
34
|
-
'--txpool.basefee-max-size=10000',
|
|
35
|
-
'--txpool.max-account-slots=500000',
|
|
36
|
-
'--txpool.pending-max-count=10000000000000',
|
|
37
|
-
'--txpool.pending-max-size=10000',
|
|
38
|
-
'--txpool.queued-max-count=10000000000000',
|
|
39
|
-
'--txpool.queued-max-size=10000',
|
|
40
|
-
`--ws.port=${port + 20}`,
|
|
51
|
+
...toArgs(deepAssign(defaultParameters, rest), {
|
|
52
|
+
arraySeparator: null,
|
|
53
|
+
}),
|
|
41
54
|
];
|
|
42
55
|
}
|
|
43
56
|
/**
|
|
@@ -79,7 +92,7 @@ export const tempo = Instance.define((parameters) => {
|
|
|
79
92
|
env: {
|
|
80
93
|
RUST_LOG,
|
|
81
94
|
},
|
|
82
|
-
}) `${[binary, ...command({ ...
|
|
95
|
+
}) `${[binary, ...command({ ...args, port })]}`, {
|
|
83
96
|
...options,
|
|
84
97
|
// Resolve when the process is listening via "RPC HTTP server started" message.
|
|
85
98
|
resolver({ process, reject, resolve }) {
|
|
@@ -147,7 +160,7 @@ export const tempoDocker = Instance.define((parameters) => {
|
|
|
147
160
|
])
|
|
148
161
|
.withName(containerName)
|
|
149
162
|
.withEnvironment({ RUST_LOG })
|
|
150
|
-
.withCommand(command({ ...
|
|
163
|
+
.withCommand(command({ ...args, port }))
|
|
151
164
|
.withWaitStrategy(Wait.forLogMessage(/RPC HTTP server started/))
|
|
152
165
|
.withLogConsumer((stream) => {
|
|
153
166
|
stream.on('data', (data) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tempo.js","sourceRoot":"","sources":["../../src/instances/tempo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,EACL,gBAAgB,EAEhB,IAAI,GACL,MAAM,gBAAgB,CAAA;AACvB,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAE7C,MAAM,UAAU,OAAO,CAAC,UAA4B;IAClD,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"tempo.js","sourceRoot":"","sources":["../../src/instances/tempo.ts"],"names":[],"mappings":"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"}
|
package/dist/internal/utils.d.ts
CHANGED
|
@@ -22,11 +22,11 @@ export declare function stripColors(message: string): string;
|
|
|
22
22
|
* @param options The options object.
|
|
23
23
|
* @returns The command line arguments.
|
|
24
24
|
*/
|
|
25
|
-
export declare function toArgs(obj: {
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}): any[];
|
|
25
|
+
export declare function toArgs(obj: Record<string, unknown>, options?: {
|
|
26
|
+
arraySeparator?: string | null | undefined;
|
|
27
|
+
casing?: 'kebab' | 'snake' | undefined;
|
|
28
|
+
}): string[];
|
|
30
29
|
/** Converts to a --flag-case string. */
|
|
31
30
|
export declare function toFlagCase(str: string, separator?: string): string;
|
|
31
|
+
export declare function deepAssign(target: Record<string, unknown>, ...sources: Record<string, unknown>[]): Record<string, unknown>;
|
|
32
32
|
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAkBlE;AAMD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,UAE1C;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CACpB,GAAG,EAAE
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG;IAClC,EAAE,EAAE,MAAM,GAAG,SAAS,CAAA;IACtB,IAAI,EAAE,MAAM,CAAA;CACb,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,qBAAqB,CAkBlE;AAMD;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,OAAO,EAAE,MAAM,UAE1C;AAED;;;;;GAKG;AACH,wBAAgB,MAAM,CACpB,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5B,OAAO,GAAE;IACP,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAA;IAC1C,MAAM,CAAC,EAAE,OAAO,GAAG,OAAO,GAAG,SAAS,CAAA;CAClC,GACL,MAAM,EAAE,CAqCV;AAED,wCAAwC;AACxC,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,SAAS,SAAM,UAatD;AAMD,wBAAgB,UAAU,CACxB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/B,GAAG,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GACpC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB"}
|
package/dist/internal/utils.js
CHANGED
|
@@ -36,19 +36,27 @@ export function stripColors(message) {
|
|
|
36
36
|
* @param options The options object.
|
|
37
37
|
* @returns The command line arguments.
|
|
38
38
|
*/
|
|
39
|
-
export function toArgs(obj, options = {
|
|
40
|
-
const { casing } = options;
|
|
39
|
+
export function toArgs(obj, options = {}) {
|
|
40
|
+
const { arraySeparator = ',', casing = 'kebab' } = options;
|
|
41
41
|
return Object.entries(obj).flatMap(([key, value]) => {
|
|
42
42
|
if (value === undefined)
|
|
43
43
|
return [];
|
|
44
|
-
if (Array.isArray(value))
|
|
45
|
-
|
|
44
|
+
if (Array.isArray(value)) {
|
|
45
|
+
if (value[0] === true)
|
|
46
|
+
return [toFlagCase(key), ...toArgs({ [key]: value[1] }, options)];
|
|
47
|
+
const arrayValue = (() => {
|
|
48
|
+
if (arraySeparator === null)
|
|
49
|
+
return value;
|
|
50
|
+
return value.join(arraySeparator);
|
|
51
|
+
})();
|
|
52
|
+
return [toFlagCase(key), arrayValue].flat();
|
|
53
|
+
}
|
|
46
54
|
if (typeof value === 'object' && value !== null) {
|
|
47
55
|
return Object.entries(value).flatMap(([subKey, subValue]) => {
|
|
48
56
|
if (subValue === undefined)
|
|
49
57
|
return [];
|
|
50
58
|
const flag = toFlagCase(`${key}.${subKey}`, casing === 'kebab' ? '-' : '_');
|
|
51
|
-
return [flag
|
|
59
|
+
return toArgs({ [flag.slice(2)]: subValue }, options);
|
|
52
60
|
});
|
|
53
61
|
}
|
|
54
62
|
const flag = toFlagCase(key, casing === 'kebab' ? '-' : '_');
|
|
@@ -56,7 +64,7 @@ export function toArgs(obj, options = { casing: 'kebab' }) {
|
|
|
56
64
|
return [flag, 'false'];
|
|
57
65
|
if (value === true)
|
|
58
66
|
return [flag];
|
|
59
|
-
const stringified = value
|
|
67
|
+
const stringified = value?.toString() ?? '';
|
|
60
68
|
if (stringified === '')
|
|
61
69
|
return [flag];
|
|
62
70
|
return [flag, stringified];
|
|
@@ -76,4 +84,26 @@ export function toFlagCase(str, separator = '-') {
|
|
|
76
84
|
}
|
|
77
85
|
return `--${keys.join('.')}`;
|
|
78
86
|
}
|
|
87
|
+
function isPlainObject(value) {
|
|
88
|
+
return Object.prototype.toString.call(value) === '[object Object]';
|
|
89
|
+
}
|
|
90
|
+
export function deepAssign(target, ...sources) {
|
|
91
|
+
for (const source of sources) {
|
|
92
|
+
if (!isPlainObject(source))
|
|
93
|
+
continue;
|
|
94
|
+
for (const key of Reflect.ownKeys(source)) {
|
|
95
|
+
const srcVal = source[key];
|
|
96
|
+
const tgtVal = target[key];
|
|
97
|
+
// If both are plain objects, merge recursively
|
|
98
|
+
if (isPlainObject(srcVal) && isPlainObject(tgtVal)) {
|
|
99
|
+
deepAssign(tgtVal, srcVal);
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
// Otherwise, assign a deep clone of the source value
|
|
103
|
+
;
|
|
104
|
+
target[key] = structuredClone(srcVal);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return target;
|
|
108
|
+
}
|
|
79
109
|
//# sourceMappingURL=utils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"AAKA;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,MAAM,IAAI,GAAG,kBAAkB,CAAA,CAAC,kCAAkC;IAClE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,IAAI,GAAG,OAAO,IAAI,GAAG,EAAE,CAAC,CAAA;IAC/C,MAAM,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,GAAG,GAAG,CAAC,QAAQ;SACzC,KAAK,CAAC,GAAG,CAAC;SACV,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,EAAE,CAAC,CAAA;IAEhC,MAAM,EAAE,GACN,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QACrD,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QAClB,CAAC,CAAC,SAAS,CAAA;IACf,MAAM,IAAI,GAAG,IACX,OAAO,EAAE,KAAK,QAAQ;QACpB,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;QACpB,CAAC,CAAC,CAAC,QAAQ,EAAE,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CACtC,EAAE,CAAA;IAEF,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,CAAA;AACrB,CAAC;AAED,MAAM,cAAc;AAClB,6DAA6D;AAC7D,6EAA6E,CAAA;AAE/E;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe;IACzC,OAAO,OAAO,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAA;AAC5C,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,MAAM,CACpB,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/internal/utils.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/instances/tempo.ts
CHANGED
|
@@ -6,43 +6,60 @@ import {
|
|
|
6
6
|
Wait,
|
|
7
7
|
} from 'testcontainers'
|
|
8
8
|
import * as Instance from '../Instance.js'
|
|
9
|
+
import { deepAssign, toArgs } from '../internal/utils.js'
|
|
9
10
|
import { execa } from '../processes/execa.js'
|
|
10
11
|
|
|
11
12
|
export function command(parameters: tempo.Parameters): string[] {
|
|
12
|
-
const {
|
|
13
|
-
|
|
13
|
+
const { blockMaxTransactions, blockTime, mnemonic, port, ...rest } =
|
|
14
|
+
parameters
|
|
15
|
+
|
|
16
|
+
const datadir = path.join(os.tmpdir(), '.prool', `tempo.${port}`)
|
|
17
|
+
const defaultParameters = {
|
|
18
|
+
authrpc: {
|
|
19
|
+
port: port! + 30,
|
|
20
|
+
},
|
|
21
|
+
datadir,
|
|
22
|
+
dev: [
|
|
23
|
+
true,
|
|
24
|
+
{
|
|
25
|
+
blockTime: blockTime ?? '50ms',
|
|
26
|
+
...(blockMaxTransactions ? { blockMaxTransactions } : {}),
|
|
27
|
+
...(mnemonic ? { mnemonic } : {}),
|
|
28
|
+
},
|
|
29
|
+
],
|
|
30
|
+
engine: {
|
|
31
|
+
disablePrecompileCache: true,
|
|
32
|
+
legacyStateRoot: true,
|
|
33
|
+
},
|
|
34
|
+
faucet: {
|
|
35
|
+
address: [
|
|
36
|
+
'0x20c0000000000000000000000000000000000000',
|
|
37
|
+
'0x20c0000000000000000000000000000000000001',
|
|
38
|
+
'0x20c0000000000000000000000000000000000002',
|
|
39
|
+
'0x20c0000000000000000000000000000000000003',
|
|
40
|
+
],
|
|
41
|
+
amount: '1000000000000',
|
|
42
|
+
enabled: true,
|
|
43
|
+
privateKey:
|
|
44
|
+
'0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80',
|
|
45
|
+
},
|
|
46
|
+
http: {
|
|
47
|
+
addr: '0.0.0.0',
|
|
48
|
+
api: 'all',
|
|
49
|
+
corsdomain: '*',
|
|
50
|
+
port: port!,
|
|
51
|
+
},
|
|
52
|
+
port: port! + 10,
|
|
53
|
+
ws: {
|
|
54
|
+
port: port! + 20,
|
|
55
|
+
},
|
|
56
|
+
}
|
|
57
|
+
|
|
14
58
|
return [
|
|
15
59
|
'node',
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
`--dev.block-time=${parameters?.blockTime ?? '50ms'}`,
|
|
20
|
-
'--engine.disable-precompile-cache',
|
|
21
|
-
'--engine.legacy-state-root',
|
|
22
|
-
'--faucet.address',
|
|
23
|
-
...(faucet?.addresses ?? [
|
|
24
|
-
'0x20c0000000000000000000000000000000000000',
|
|
25
|
-
'0x20c0000000000000000000000000000000000001',
|
|
26
|
-
'0x20c0000000000000000000000000000000000002',
|
|
27
|
-
'0x20c0000000000000000000000000000000000003',
|
|
28
|
-
]),
|
|
29
|
-
`--faucet.amount=${faucet?.amount ?? '1000000000000'}`,
|
|
30
|
-
'--faucet.enabled',
|
|
31
|
-
`--faucet.private-key=${faucet?.privateKey ?? '0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80'}`,
|
|
32
|
-
'--http',
|
|
33
|
-
'--http.addr=0.0.0.0',
|
|
34
|
-
'--http.api=all',
|
|
35
|
-
'--http.corsdomain=*',
|
|
36
|
-
`--http.port=${port!}`,
|
|
37
|
-
`--port=${port! + 10}`,
|
|
38
|
-
'--txpool.basefee-max-count=10000000000000',
|
|
39
|
-
'--txpool.basefee-max-size=10000',
|
|
40
|
-
'--txpool.max-account-slots=500000',
|
|
41
|
-
'--txpool.pending-max-count=10000000000000',
|
|
42
|
-
'--txpool.pending-max-size=10000',
|
|
43
|
-
'--txpool.queued-max-count=10000000000000',
|
|
44
|
-
'--txpool.queued-max-size=10000',
|
|
45
|
-
`--ws.port=${port! + 20}`,
|
|
60
|
+
...toArgs(deepAssign(defaultParameters, rest), {
|
|
61
|
+
arraySeparator: null,
|
|
62
|
+
}),
|
|
46
63
|
]
|
|
47
64
|
}
|
|
48
65
|
|
|
@@ -89,7 +106,7 @@ export const tempo = Instance.define((parameters?: tempo.Parameters) => {
|
|
|
89
106
|
env: {
|
|
90
107
|
RUST_LOG,
|
|
91
108
|
},
|
|
92
|
-
})`${[binary, ...command({ ...
|
|
109
|
+
})`${[binary, ...command({ ...args, port })]}`,
|
|
93
110
|
{
|
|
94
111
|
...options,
|
|
95
112
|
// Resolve when the process is listening via "RPC HTTP server started" message.
|
|
@@ -124,6 +141,28 @@ export declare namespace tempo {
|
|
|
124
141
|
* Interval between blocks.
|
|
125
142
|
*/
|
|
126
143
|
blockTime?: string | undefined
|
|
144
|
+
/**
|
|
145
|
+
* How many transactions to mine per block
|
|
146
|
+
*/
|
|
147
|
+
blockMaxTransactions?: number | undefined
|
|
148
|
+
/**
|
|
149
|
+
* Path to a configuration file.
|
|
150
|
+
*/
|
|
151
|
+
config?: string | undefined
|
|
152
|
+
/**
|
|
153
|
+
* The chain this node is running.
|
|
154
|
+
* Possible values are either a built-in chain or the path to a chain specification file.
|
|
155
|
+
*
|
|
156
|
+
* Built-in chains:
|
|
157
|
+
* - testnet
|
|
158
|
+
*
|
|
159
|
+
* @default "testnet"
|
|
160
|
+
*/
|
|
161
|
+
chain?: string | undefined
|
|
162
|
+
/**
|
|
163
|
+
* The path to the data dir for all reth files and subdirectories.
|
|
164
|
+
*/
|
|
165
|
+
datadir?: string | undefined
|
|
127
166
|
/**
|
|
128
167
|
* Faucet options.
|
|
129
168
|
*/
|
|
@@ -160,11 +199,16 @@ export declare namespace tempo {
|
|
|
160
199
|
* Host the server will listen on.
|
|
161
200
|
*/
|
|
162
201
|
host?: string | undefined
|
|
202
|
+
/**
|
|
203
|
+
* Derive dev accounts from a fixed mnemonic instead of random ones.
|
|
204
|
+
* @default "test test test test test test test test test test test junk"
|
|
205
|
+
*/
|
|
206
|
+
mnemonic?: string | undefined
|
|
163
207
|
/**
|
|
164
208
|
* Port the server will listen on.
|
|
165
209
|
*/
|
|
166
210
|
port?: number | undefined
|
|
167
|
-
}
|
|
211
|
+
} & Record<string, unknown>
|
|
168
212
|
}
|
|
169
213
|
|
|
170
214
|
/**
|
|
@@ -218,7 +262,7 @@ export const tempoDocker = Instance.define(
|
|
|
218
262
|
])
|
|
219
263
|
.withName(containerName)
|
|
220
264
|
.withEnvironment({ RUST_LOG })
|
|
221
|
-
.withCommand(command({ ...
|
|
265
|
+
.withCommand(command({ ...args, port }))
|
|
222
266
|
.withWaitStrategy(Wait.forLogMessage(/RPC HTTP server started/))
|
|
223
267
|
.withLogConsumer((stream) => {
|
|
224
268
|
stream.on('data', (data) => {
|
|
@@ -30,10 +30,12 @@ test.each([
|
|
|
30
30
|
[[{ foo: 0 }], ['--foo', '0']],
|
|
31
31
|
[[{ foo: 1 }], ['--foo', '1']],
|
|
32
32
|
[[{ foo: 1n }], ['--foo', '1']],
|
|
33
|
+
[[{ foo: 1n }], ['--foo', '1']],
|
|
33
34
|
[[{ foo: 'bar', baz: 1 }], ['--foo', 'bar', '--baz', '1']],
|
|
34
35
|
[[{ fooBar: 'test' }], ['--foo-bar', 'test']],
|
|
35
36
|
[[{ foo: ['bar', 'baz'] }], ['--foo', 'bar,baz']],
|
|
36
37
|
[[{ foo: { barBaz: 'test' } }], ['--foo.bar-baz', 'test']],
|
|
38
|
+
[[{ foo: [true, { barBaz: 'test' }] }], ['--foo', '--foo.bar-baz', 'test']],
|
|
37
39
|
[[{ foo: { barBaz: ['test', 'test2'] } }], ['--foo.bar-baz', 'test,test2']],
|
|
38
40
|
[
|
|
39
41
|
[{ fooBar: 'test' }, { casing: 'snake' }],
|
|
@@ -43,6 +45,18 @@ test.each([
|
|
|
43
45
|
[{ foo: { barBaz: 'test' } }, { casing: 'snake' }],
|
|
44
46
|
['--foo.bar_baz', 'test'],
|
|
45
47
|
],
|
|
48
|
+
[
|
|
49
|
+
[{ foo: ['bar', 'baz'] }, { arraySeparator: null }],
|
|
50
|
+
['--foo', 'bar', 'baz'],
|
|
51
|
+
],
|
|
52
|
+
[
|
|
53
|
+
[{ foo: { bar: ['baz', 'qux'] } }, { arraySeparator: null }],
|
|
54
|
+
['--foo.bar', 'baz', 'qux'],
|
|
55
|
+
],
|
|
56
|
+
[
|
|
57
|
+
[{ foo: ['bar', 'baz'] }, { arraySeparator: null }],
|
|
58
|
+
['--foo', 'bar', 'baz'],
|
|
59
|
+
],
|
|
46
60
|
] as [Parameters<typeof toArgs>, string[]][])('toArgs(%o) -> %o', ([
|
|
47
61
|
input,
|
|
48
62
|
options,
|
package/src/internal/utils.ts
CHANGED
|
@@ -50,23 +50,26 @@ export function stripColors(message: string) {
|
|
|
50
50
|
* @returns The command line arguments.
|
|
51
51
|
*/
|
|
52
52
|
export function toArgs(
|
|
53
|
-
obj:
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
| bigint
|
|
61
|
-
| undefined
|
|
62
|
-
},
|
|
63
|
-
options: { casing: 'kebab' | 'snake' } = { casing: 'kebab' },
|
|
64
|
-
) {
|
|
65
|
-
const { casing } = options
|
|
53
|
+
obj: Record<string, unknown>,
|
|
54
|
+
options: {
|
|
55
|
+
arraySeparator?: string | null | undefined
|
|
56
|
+
casing?: 'kebab' | 'snake' | undefined
|
|
57
|
+
} = {},
|
|
58
|
+
): string[] {
|
|
59
|
+
const { arraySeparator = ',', casing = 'kebab' } = options
|
|
66
60
|
return Object.entries(obj).flatMap(([key, value]) => {
|
|
67
61
|
if (value === undefined) return []
|
|
68
62
|
|
|
69
|
-
if (Array.isArray(value))
|
|
63
|
+
if (Array.isArray(value)) {
|
|
64
|
+
if (value[0] === true)
|
|
65
|
+
return [toFlagCase(key), ...toArgs({ [key]: value[1] }, options)]
|
|
66
|
+
const arrayValue = (() => {
|
|
67
|
+
if (arraySeparator === null) return value
|
|
68
|
+
return value.join(arraySeparator)
|
|
69
|
+
})()
|
|
70
|
+
|
|
71
|
+
return [toFlagCase(key), arrayValue].flat()
|
|
72
|
+
}
|
|
70
73
|
|
|
71
74
|
if (typeof value === 'object' && value !== null) {
|
|
72
75
|
return Object.entries(value).flatMap(([subKey, subValue]) => {
|
|
@@ -75,7 +78,7 @@ export function toArgs(
|
|
|
75
78
|
`${key}.${subKey}`,
|
|
76
79
|
casing === 'kebab' ? '-' : '_',
|
|
77
80
|
)
|
|
78
|
-
return [flag
|
|
81
|
+
return toArgs({ [flag.slice(2)]: subValue }, options)
|
|
79
82
|
})
|
|
80
83
|
}
|
|
81
84
|
|
|
@@ -84,7 +87,7 @@ export function toArgs(
|
|
|
84
87
|
if (value === false) return [flag, 'false']
|
|
85
88
|
if (value === true) return [flag]
|
|
86
89
|
|
|
87
|
-
const stringified = value
|
|
90
|
+
const stringified = value?.toString() ?? ''
|
|
88
91
|
if (stringified === '') return [flag]
|
|
89
92
|
|
|
90
93
|
return [flag, stringified]
|
|
@@ -106,3 +109,30 @@ export function toFlagCase(str: string, separator = '-') {
|
|
|
106
109
|
}
|
|
107
110
|
return `--${keys.join('.')}`
|
|
108
111
|
}
|
|
112
|
+
|
|
113
|
+
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
114
|
+
return Object.prototype.toString.call(value) === '[object Object]'
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
export function deepAssign(
|
|
118
|
+
target: Record<string, unknown>,
|
|
119
|
+
...sources: Record<string, unknown>[]
|
|
120
|
+
): Record<string, unknown> {
|
|
121
|
+
for (const source of sources) {
|
|
122
|
+
if (!isPlainObject(source)) continue
|
|
123
|
+
|
|
124
|
+
for (const key of Reflect.ownKeys(source)) {
|
|
125
|
+
const srcVal = source[key as keyof typeof source]
|
|
126
|
+
const tgtVal = target[key as keyof typeof target]
|
|
127
|
+
|
|
128
|
+
// If both are plain objects, merge recursively
|
|
129
|
+
if (isPlainObject(srcVal) && isPlainObject(tgtVal)) {
|
|
130
|
+
deepAssign(tgtVal, srcVal)
|
|
131
|
+
continue
|
|
132
|
+
}
|
|
133
|
+
// Otherwise, assign a deep clone of the source value
|
|
134
|
+
;(target as any)[key] = structuredClone(srcVal)
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return target
|
|
138
|
+
}
|