prool 0.2.7 → 0.2.8
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/tempoZone.d.ts +4 -1
- package/dist/instances/tempoZone.d.ts.map +1 -1
- package/dist/instances/tempoZone.js +14 -11
- package/dist/instances/tempoZone.js.map +1 -1
- package/dist/testcontainers/Instance.d.ts +11 -5
- package/dist/testcontainers/Instance.d.ts.map +1 -1
- package/dist/testcontainers/Instance.js +26 -12
- package/dist/testcontainers/Instance.js.map +1 -1
- package/package.json +1 -1
- package/src/instances/tempoZone.test.ts +20 -5
- package/src/instances/tempoZone.ts +16 -11
- package/src/testcontainers/Instance.test.ts +11 -10
- package/src/testcontainers/Instance.ts +36 -13
|
@@ -4,7 +4,8 @@ export declare function command(parameters: tempoZone.Parameters): string[];
|
|
|
4
4
|
* Defines a Tempo Zone instance.
|
|
5
5
|
*
|
|
6
6
|
* Provisions a fresh zone against a Tempo dev L1 (`tempo-zone dev`) and runs
|
|
7
|
-
* the zone node.
|
|
7
|
+
* the zone node. The L1 must mine canonical Tempo headers, and the dev key
|
|
8
|
+
* must hold pathUSD.
|
|
8
9
|
*
|
|
9
10
|
* @example
|
|
10
11
|
* ```ts
|
|
@@ -54,6 +55,7 @@ export declare const tempoZone: Instance.define.ReturnType<{
|
|
|
54
55
|
factoryAddress?: string | undefined;
|
|
55
56
|
/**
|
|
56
57
|
* Tempo L1 WebSocket RPC URL.
|
|
58
|
+
* Anvil requires Foundry 1.8 or newer.
|
|
57
59
|
* @default "ws://localhost:8546"
|
|
58
60
|
*/
|
|
59
61
|
rpcUrl?: string | undefined;
|
|
@@ -119,6 +121,7 @@ export declare namespace tempoZone {
|
|
|
119
121
|
factoryAddress?: string | undefined;
|
|
120
122
|
/**
|
|
121
123
|
* Tempo L1 WebSocket RPC URL.
|
|
124
|
+
* Anvil requires Foundry 1.8 or newer.
|
|
122
125
|
* @default "ws://localhost:8546"
|
|
123
126
|
*/
|
|
124
127
|
rpcUrl?: string | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tempoZone.d.ts","sourceRoot":"","sources":["../../src/instances/tempoZone.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAM1C,wBAAgB,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"tempoZone.d.ts","sourceRoot":"","sources":["../../src/instances/tempoZone.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAM1C,wBAAgB,OAAO,CAAC,UAAU,EAAE,SAAS,CAAC,UAAU,GAAG,MAAM,EAAE,CAmClE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,SAAS;;;QAwElB;;WAEG;kBACO,MAAM,GAAG,SAAS;QAC5B;;WAEG;cAEC;YACE;;;eAGG;YACH,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;YACxB;;;eAGG;YACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAC3B,GACD,SAAS;QACb;;WAEG;eACI,MAAM,GAAG,SAAS;QACzB;;WAEG;aAEC;YACE;;;eAGG;YACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;YACnC;;;;eAIG;YACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAC5B,GACD,SAAS;QAcb;;WAEG;mBACQ,MAAM,EAAE,GAAG,SAAS;QAC/B;;WAEG;eACI,MAAM,GAAG,SAAS;QACzB;;WAEG;qBAEC;YACE;;;eAGG;YACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAC1B,GACD,SAAS;;;6CAnFhB,CAAA;AAED,MAAM,CAAC,OAAO,WAAW,SAAS,CAAC;IACjC,KAAY,UAAU,GAAG;QACvB;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC5B;;WAEG;QACH,GAAG,CAAC,EACA;YACE;;;eAGG;YACH,GAAG,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;YACxB;;;eAGG;YACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAC3B,GACD,SAAS,CAAA;QACb;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB;;WAEG;QACH,EAAE,CAAC,EACC;YACE;;;eAGG;YACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;YACnC;;;;eAIG;YACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAC5B,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,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;QAC/B;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB;;WAEG;QACH,UAAU,CAAC,EACP;YACE;;;eAGG;YACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAC1B,GACD,SAAS,CAAA;KACd,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC5B"}
|
|
@@ -4,9 +4,15 @@ import * as Instance from '../Instance.js';
|
|
|
4
4
|
import { deepAssign, toArgs } from '../internal/utils.js';
|
|
5
5
|
import { execa } from '../processes/execa.js';
|
|
6
6
|
// `tempo-zone dev` derives the WS RPC (port + 1) and P2P (port + 2) ports from
|
|
7
|
-
// `http.port`. Each instance occupies the compact block [port, port +
|
|
7
|
+
// `http.port`. Each instance occupies the compact block [port, port + 3].
|
|
8
8
|
export function command(parameters) {
|
|
9
|
-
const { nodeArgs, port
|
|
9
|
+
const { nodeArgs, port } = parameters;
|
|
10
|
+
const options = { ...parameters };
|
|
11
|
+
delete options.binary;
|
|
12
|
+
delete options.host;
|
|
13
|
+
delete options.log;
|
|
14
|
+
delete options.nodeArgs;
|
|
15
|
+
delete options.port;
|
|
10
16
|
const datadir = path.join(os.tmpdir(), '.prool', `tempo-zone.${port}`);
|
|
11
17
|
const defaultParameters = {
|
|
12
18
|
datadir,
|
|
@@ -21,16 +27,13 @@ export function command(parameters) {
|
|
|
21
27
|
port: port + 3,
|
|
22
28
|
},
|
|
23
29
|
};
|
|
24
|
-
const args = deepAssign(defaultParameters,
|
|
30
|
+
const args = deepAssign(defaultParameters, options);
|
|
25
31
|
return [
|
|
26
32
|
'dev',
|
|
27
33
|
...toArgs(args, {
|
|
28
34
|
arraySeparator: null,
|
|
29
35
|
}),
|
|
30
|
-
// Forwarded to `tempo-zone node`; keeps concurrent instances from colliding.
|
|
31
36
|
'--',
|
|
32
|
-
'--authrpc.port',
|
|
33
|
-
String(port + 4),
|
|
34
37
|
'--ipcdisable',
|
|
35
38
|
...(nodeArgs ?? []),
|
|
36
39
|
];
|
|
@@ -39,7 +42,8 @@ export function command(parameters) {
|
|
|
39
42
|
* Defines a Tempo Zone instance.
|
|
40
43
|
*
|
|
41
44
|
* Provisions a fresh zone against a Tempo dev L1 (`tempo-zone dev`) and runs
|
|
42
|
-
* the zone node.
|
|
45
|
+
* the zone node. The L1 must mine canonical Tempo headers, and the dev key
|
|
46
|
+
* must hold pathUSD.
|
|
43
47
|
*
|
|
44
48
|
* @example
|
|
45
49
|
* ```ts
|
|
@@ -62,7 +66,7 @@ export const tempoZone = Instance.define((parameters) => {
|
|
|
62
66
|
return log_;
|
|
63
67
|
}
|
|
64
68
|
})();
|
|
65
|
-
const RUST_LOG = log && typeof log !== 'boolean' ? log : '';
|
|
69
|
+
const RUST_LOG = log && typeof log !== 'boolean' ? `${log},reth::cli=info` : '';
|
|
66
70
|
const name = 'tempo-zone';
|
|
67
71
|
const process = execa({ name });
|
|
68
72
|
return {
|
|
@@ -76,13 +80,13 @@ export const tempoZone = Instance.define((parameters) => {
|
|
|
76
80
|
name,
|
|
77
81
|
port: args.port ?? 9545,
|
|
78
82
|
async start({ port = args.port }, options) {
|
|
83
|
+
const httpPort = port ?? 9545;
|
|
79
84
|
return await process.start(($) => $({
|
|
80
85
|
env: {
|
|
81
86
|
RUST_LOG,
|
|
82
87
|
},
|
|
83
|
-
}) `${[binary, ...command({ ...args, port })]}`, {
|
|
88
|
+
}) `${[binary, ...command({ ...args, port: httpPort })]}`, {
|
|
84
89
|
...options,
|
|
85
|
-
// Resolve when the private zone RPC is listening (last server to start).
|
|
86
90
|
resolver({ process, reject, resolve }) {
|
|
87
91
|
let stderr = '';
|
|
88
92
|
process.stdout.on('data', (data) => {
|
|
@@ -100,7 +104,6 @@ export const tempoZone = Instance.define((parameters) => {
|
|
|
100
104
|
console.error(message);
|
|
101
105
|
stderr += message;
|
|
102
106
|
});
|
|
103
|
-
// Provisioning failures (e.g. unreachable L1) exit non-zero before the RPC starts.
|
|
104
107
|
process.once('exit', (code) => {
|
|
105
108
|
if (code)
|
|
106
109
|
reject(stderr || `exited with code ${code}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tempoZone.js","sourceRoot":"","sources":["../../src/instances/tempoZone.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAE7C,+EAA+E;AAC/E,0EAA0E;AAC1E,MAAM,UAAU,OAAO,CAAC,UAAgC;IACtD,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,
|
|
1
|
+
{"version":3,"file":"tempoZone.js","sourceRoot":"","sources":["../../src/instances/tempoZone.ts"],"names":[],"mappings":"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"}
|
|
@@ -50,10 +50,9 @@ export declare namespace tempo {
|
|
|
50
50
|
/**
|
|
51
51
|
* Defines a Tempo Zone instance.
|
|
52
52
|
*
|
|
53
|
-
* Starts a Tempo dev L1
|
|
54
|
-
*
|
|
55
|
-
*
|
|
56
|
-
* the container, e.g. `ws://host.docker.internal:8546`).
|
|
53
|
+
* Starts a Tempo dev L1 and `tempo-zone dev` on a shared network. An external
|
|
54
|
+
* `l1.rpcUrl` must be container-reachable, mine canonical headers, and fund
|
|
55
|
+
* the configured dev key with pathUSD.
|
|
57
56
|
*
|
|
58
57
|
* @example
|
|
59
58
|
* ```ts
|
|
@@ -86,15 +85,21 @@ export declare const tempoZone: Instance.define.ReturnType<{
|
|
|
86
85
|
} | undefined;
|
|
87
86
|
}, tempoZone.Parameters | undefined>;
|
|
88
87
|
export declare namespace tempoZone {
|
|
89
|
-
type Parameters = Omit<core_tempoZone.Parameters, 'binary' | 'l1'> & ContainerOptions.Parameters & {
|
|
88
|
+
type Parameters = Omit<core_tempoZone.Parameters, 'binary' | 'l1'> & Omit<ContainerOptions.Parameters, 'startupTimeout'> & {
|
|
90
89
|
/**
|
|
91
90
|
* Name of the container.
|
|
92
91
|
*/
|
|
93
92
|
containerName?: string | undefined;
|
|
94
93
|
/**
|
|
95
94
|
* Docker image to use for the zone node.
|
|
95
|
+
* @default "ghcr.io/tempoxyz/tempo-zone:latest"
|
|
96
96
|
*/
|
|
97
97
|
image?: string | undefined;
|
|
98
|
+
/**
|
|
99
|
+
* Startup timeout for each L1 and zone readiness check, in milliseconds.
|
|
100
|
+
* @default 120_000
|
|
101
|
+
*/
|
|
102
|
+
startupTimeout?: number | undefined;
|
|
98
103
|
/**
|
|
99
104
|
* Host the server will listen on.
|
|
100
105
|
*/
|
|
@@ -111,6 +116,7 @@ export declare namespace tempoZone {
|
|
|
111
116
|
* Existing Tempo L1 WebSocket RPC URL, reachable from inside the
|
|
112
117
|
* container (e.g. `ws://host.docker.internal:8546`). Starts a
|
|
113
118
|
* dev L1 container when omitted.
|
|
119
|
+
* Anvil requires Foundry 1.8 or newer.
|
|
114
120
|
*/
|
|
115
121
|
rpcUrl?: string | undefined;
|
|
116
122
|
}) | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Instance.d.ts","sourceRoot":"","sources":["../../src/testcontainers/Instance.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAW,KAAK,KAAK,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACzE,OAAO,EACL,KAAK,SAAS,IAAI,cAAc,EAEjC,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAA;AAEzD,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAE/D;;;;;;;;;;GAUG;AACH,eAAO,MAAM,KAAK;;;QAoGZ;;WAEG;eACI,MAAM,GAAG,SAAS;QACzB;;WAEG;eACI,MAAM,GAAG,SAAS;;gCApB7B,CAAA;AAEF,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,KAAY,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,GAC5D,gBAAgB,CAAC,UAAU,GAAG;QAC5B;;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;CACJ;
|
|
1
|
+
{"version":3,"file":"Instance.d.ts","sourceRoot":"","sources":["../../src/testcontainers/Instance.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAW,KAAK,KAAK,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAA;AACzE,OAAO,EACL,KAAK,SAAS,IAAI,cAAc,EAEjC,MAAM,2BAA2B,CAAA;AAClC,OAAO,KAAK,gBAAgB,MAAM,uBAAuB,CAAA;AAEzD,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAE/D;;;;;;;;;;GAUG;AACH,eAAO,MAAM,KAAK;;;QAoGZ;;WAEG;eACI,MAAM,GAAG,SAAS;QACzB;;WAEG;eACI,MAAM,GAAG,SAAS;;gCApB7B,CAAA;AAEF,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,KAAY,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,GAC5D,gBAAgB,CAAC,UAAU,GAAG;QAC5B;;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;CACJ;AAID;;;;;;;;;;;;;;GAcG;AACH,eAAO,MAAM,SAAS;;;QAqNhB;;WAEG;eACI,MAAM,GAAG,SAAS;QAmBzB;;WAEG;eACI,MAAM,GAAG,SAAS;;;;;;;;;;;oCA5C9B,CAAA;AAED,MAAM,CAAC,OAAO,WAAW,SAAS,CAAC;IACjC,KAAY,UAAU,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,EAAE,QAAQ,GAAG,IAAI,CAAC,GACvE,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,gBAAgB,CAAC,GAAG;QACpD;;WAEG;QACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAClC;;;WAGG;QACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC1B;;;WAGG;QACH,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACnC;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB;;WAEG;QACH,EAAE,CAAC,EACC,CAAC,WAAW,CAAC,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG;YAC9C;;eAEG;YACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;YAC1B;;;;;eAKG;YACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAC5B,CAAC,GACF,SAAS,CAAA;QACb;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,CAAA;CACJ"}
|
|
@@ -87,13 +87,13 @@ export const tempo = Instance.define((parameters) => {
|
|
|
87
87
|
},
|
|
88
88
|
};
|
|
89
89
|
});
|
|
90
|
+
const tempoZoneStartupTimeout = 120_000;
|
|
90
91
|
/**
|
|
91
92
|
* Defines a Tempo Zone instance.
|
|
92
93
|
*
|
|
93
|
-
* Starts a Tempo dev L1
|
|
94
|
-
*
|
|
95
|
-
*
|
|
96
|
-
* the container, e.g. `ws://host.docker.internal:8546`).
|
|
94
|
+
* Starts a Tempo dev L1 and `tempo-zone dev` on a shared network. An external
|
|
95
|
+
* `l1.rpcUrl` must be container-reachable, mine canonical headers, and fund
|
|
96
|
+
* the configured dev key with pathUSD.
|
|
97
97
|
*
|
|
98
98
|
* @example
|
|
99
99
|
* ```ts
|
|
@@ -114,6 +114,9 @@ export const tempoZone = Instance.define((parameters) => {
|
|
|
114
114
|
}
|
|
115
115
|
})();
|
|
116
116
|
const RUST_LOG = log && typeof log !== 'boolean' ? log : '';
|
|
117
|
+
const L1_RUST_LOG = RUST_LOG
|
|
118
|
+
? `${RUST_LOG},reth_node_events=info`
|
|
119
|
+
: RUST_LOG;
|
|
117
120
|
// L1 ports inside the container (only reachable over the shared network).
|
|
118
121
|
const l1HttpPort = 8545;
|
|
119
122
|
const l1WsPort = 8546;
|
|
@@ -164,10 +167,17 @@ export const tempoZone = Instance.define((parameters) => {
|
|
|
164
167
|
privateRpcPort =
|
|
165
168
|
args['privateRpc']?.port ??
|
|
166
169
|
containerPort + 3;
|
|
167
|
-
const timeout =
|
|
168
|
-
const
|
|
170
|
+
const timeout = startupTimeout ?? tempoZoneStartupTimeout;
|
|
171
|
+
const includeL1Log = (message) => {
|
|
172
|
+
if (log !== 'warn' && log !== 'error')
|
|
173
|
+
return true;
|
|
174
|
+
return !/INFO.*reth_node_events::node/.test(message);
|
|
175
|
+
};
|
|
176
|
+
const logConsumer = (reject, include = () => true) => (stream) => {
|
|
169
177
|
stream.on('data', (data) => {
|
|
170
178
|
const message = data.toString();
|
|
179
|
+
if (!include(message))
|
|
180
|
+
return;
|
|
171
181
|
emitter.emit('message', message);
|
|
172
182
|
emitter.emit('stdout', message);
|
|
173
183
|
if (log)
|
|
@@ -190,12 +200,12 @@ export const tempoZone = Instance.define((parameters) => {
|
|
|
190
200
|
network = await new Network().start();
|
|
191
201
|
l1Container = await new GenericContainer(l1Parameters?.image ?? 'ghcr.io/tempoxyz/tempo:latest')
|
|
192
202
|
.withPullPolicy(PullPolicy.alwaysPull())
|
|
193
|
-
.withPlatform('linux/
|
|
203
|
+
.withPlatform('linux/amd64')
|
|
194
204
|
.withNetwork(network)
|
|
195
205
|
.withNetworkAliases('l1')
|
|
196
206
|
.withExposedPorts(l1HttpPort, l1WsPort)
|
|
197
207
|
.withName(`${containerName}.l1`)
|
|
198
|
-
.withEnvironment({ RUST_LOG })
|
|
208
|
+
.withEnvironment({ RUST_LOG: L1_RUST_LOG })
|
|
199
209
|
.withCommand(command({
|
|
200
210
|
port: l1HttpPort,
|
|
201
211
|
// The zone anchors to the L1 over WebSocket.
|
|
@@ -204,7 +214,7 @@ export const tempoZone = Instance.define((parameters) => {
|
|
|
204
214
|
.withWaitStrategy(Wait.forLogMessage(/Received (block|new payload) from consensus engine/))
|
|
205
215
|
.withLogConsumer(logConsumer(() => {
|
|
206
216
|
// L1 shutdown surfaces via the zone container failing to start.
|
|
207
|
-
}))
|
|
217
|
+
}, includeL1Log))
|
|
208
218
|
.withStartupTimeout(timeout)
|
|
209
219
|
.start();
|
|
210
220
|
l1RpcUrl = `ws://l1:${l1WsPort}`;
|
|
@@ -212,7 +222,8 @@ export const tempoZone = Instance.define((parameters) => {
|
|
|
212
222
|
const promise = Promise.withResolvers();
|
|
213
223
|
let c = new GenericContainer(image)
|
|
214
224
|
.withPullPolicy(PullPolicy.alwaysPull())
|
|
215
|
-
|
|
225
|
+
// The public image currently publishes only linux/amd64.
|
|
226
|
+
.withPlatform('linux/amd64')
|
|
216
227
|
.withExposedPorts(containerPort, privateRpcPort)
|
|
217
228
|
.withExtraHosts([
|
|
218
229
|
{ host: 'host.docker.internal', ipAddress: 'host-gateway' },
|
|
@@ -229,8 +240,11 @@ export const tempoZone = Instance.define((parameters) => {
|
|
|
229
240
|
},
|
|
230
241
|
port: containerPort,
|
|
231
242
|
}))
|
|
232
|
-
|
|
233
|
-
|
|
243
|
+
.withWaitStrategy(Wait.forHttp('/', privateRpcPort, {
|
|
244
|
+
abortOnContainerExit: true,
|
|
245
|
+
})
|
|
246
|
+
.withMethod('POST')
|
|
247
|
+
.forStatusCode(401))
|
|
234
248
|
.withLogConsumer(logConsumer(promise.reject))
|
|
235
249
|
.withStartupTimeout(timeout);
|
|
236
250
|
if (network)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Instance.js","sourceRoot":"","sources":["../../src/testcontainers/Instance.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"Instance.js","sourceRoot":"","sources":["../../src/testcontainers/Instance.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@ const redact = (args: string[]) =>
|
|
|
7
7
|
|
|
8
8
|
test('command: default', () => {
|
|
9
9
|
expect(redact(command({ port: 9545 }))).toMatchInlineSnapshot(
|
|
10
|
-
`"dev --datadir <tmpdir>/.prool/tempo-zone.9545 --http.addr 0.0.0.0 --http.port 9545 --l1.rpc-url ws://localhost:8546 --private-rpc.port 9548 -- --
|
|
10
|
+
`"dev --datadir <tmpdir>/.prool/tempo-zone.9545 --http.addr 0.0.0.0 --http.port 9545 --l1.rpc-url ws://localhost:8546 --private-rpc.port 9548 -- --ipcdisable"`,
|
|
11
11
|
)
|
|
12
12
|
})
|
|
13
13
|
|
|
@@ -23,7 +23,7 @@ test('command: behavior: l1 options', () => {
|
|
|
23
23
|
}),
|
|
24
24
|
),
|
|
25
25
|
).toMatchInlineSnapshot(
|
|
26
|
-
`"dev --datadir <tmpdir>/.prool/tempo-zone.9545 --http.addr 0.0.0.0 --http.port 9545 --l1.rpc-url ws://l1:8546 --l1.factory-address 0x00000000000000000000000000000000000fac70 --private-rpc.port 9548 -- --
|
|
26
|
+
`"dev --datadir <tmpdir>/.prool/tempo-zone.9545 --http.addr 0.0.0.0 --http.port 9545 --l1.rpc-url ws://l1:8546 --l1.factory-address 0x00000000000000000000000000000000000fac70 --private-rpc.port 9548 -- --ipcdisable"`,
|
|
27
27
|
)
|
|
28
28
|
})
|
|
29
29
|
|
|
@@ -39,7 +39,7 @@ test('command: behavior: dev options', () => {
|
|
|
39
39
|
}),
|
|
40
40
|
),
|
|
41
41
|
).toMatchInlineSnapshot(
|
|
42
|
-
`"dev --datadir <tmpdir>/.prool/tempo-zone.9545 --http.addr 0.0.0.0 --http.port 9545 --l1.rpc-url ws://localhost:8546 --private-rpc.port 9548 --dev.key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --dev.token 0x20c0000000000000000000000000000000000001 -- --
|
|
42
|
+
`"dev --datadir <tmpdir>/.prool/tempo-zone.9545 --http.addr 0.0.0.0 --http.port 9545 --l1.rpc-url ws://localhost:8546 --private-rpc.port 9548 --dev.key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --dev.token 0x20c0000000000000000000000000000000000001 -- --ipcdisable"`,
|
|
43
43
|
)
|
|
44
44
|
})
|
|
45
45
|
|
|
@@ -47,7 +47,7 @@ test('command: behavior: node args', () => {
|
|
|
47
47
|
expect(
|
|
48
48
|
redact(command({ nodeArgs: ['--full'], port: 9545 })),
|
|
49
49
|
).toMatchInlineSnapshot(
|
|
50
|
-
`"dev --datadir <tmpdir>/.prool/tempo-zone.9545 --http.addr 0.0.0.0 --http.port 9545 --l1.rpc-url ws://localhost:8546 --private-rpc.port 9548 -- --
|
|
50
|
+
`"dev --datadir <tmpdir>/.prool/tempo-zone.9545 --http.addr 0.0.0.0 --http.port 9545 --l1.rpc-url ws://localhost:8546 --private-rpc.port 9548 -- --ipcdisable --full"`,
|
|
51
51
|
)
|
|
52
52
|
})
|
|
53
53
|
|
|
@@ -55,6 +55,21 @@ test('command: behavior: private rpc port override', () => {
|
|
|
55
55
|
expect(
|
|
56
56
|
redact(command({ port: 9545, privateRpc: { port: 1337 } })),
|
|
57
57
|
).toMatchInlineSnapshot(
|
|
58
|
-
`"dev --datadir <tmpdir>/.prool/tempo-zone.9545 --http.addr 0.0.0.0 --http.port 9545 --l1.rpc-url ws://localhost:8546 --private-rpc.port 1337 -- --
|
|
58
|
+
`"dev --datadir <tmpdir>/.prool/tempo-zone.9545 --http.addr 0.0.0.0 --http.port 9545 --l1.rpc-url ws://localhost:8546 --private-rpc.port 1337 -- --ipcdisable"`,
|
|
59
|
+
)
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
test('command: behavior: instance options are not forwarded', () => {
|
|
63
|
+
expect(
|
|
64
|
+
redact(
|
|
65
|
+
command({
|
|
66
|
+
binary: '/usr/local/bin/tempo-zone',
|
|
67
|
+
host: '127.0.0.1',
|
|
68
|
+
log: 'error',
|
|
69
|
+
port: 9545,
|
|
70
|
+
}),
|
|
71
|
+
),
|
|
72
|
+
).toMatchInlineSnapshot(
|
|
73
|
+
`"dev --datadir <tmpdir>/.prool/tempo-zone.9545 --http.addr 0.0.0.0 --http.port 9545 --l1.rpc-url ws://localhost:8546 --private-rpc.port 9548 -- --ipcdisable"`,
|
|
59
74
|
)
|
|
60
75
|
})
|
|
@@ -5,9 +5,15 @@ import { deepAssign, toArgs } from '../internal/utils.js'
|
|
|
5
5
|
import { execa } from '../processes/execa.js'
|
|
6
6
|
|
|
7
7
|
// `tempo-zone dev` derives the WS RPC (port + 1) and P2P (port + 2) ports from
|
|
8
|
-
// `http.port`. Each instance occupies the compact block [port, port +
|
|
8
|
+
// `http.port`. Each instance occupies the compact block [port, port + 3].
|
|
9
9
|
export function command(parameters: tempoZone.Parameters): string[] {
|
|
10
|
-
const { nodeArgs, port
|
|
10
|
+
const { nodeArgs, port } = parameters
|
|
11
|
+
const options = { ...parameters }
|
|
12
|
+
delete options.binary
|
|
13
|
+
delete options.host
|
|
14
|
+
delete options.log
|
|
15
|
+
delete options.nodeArgs
|
|
16
|
+
delete options.port
|
|
11
17
|
|
|
12
18
|
const datadir = path.join(os.tmpdir(), '.prool', `tempo-zone.${port}`)
|
|
13
19
|
const defaultParameters = {
|
|
@@ -24,17 +30,14 @@ export function command(parameters: tempoZone.Parameters): string[] {
|
|
|
24
30
|
},
|
|
25
31
|
}
|
|
26
32
|
|
|
27
|
-
const args = deepAssign(defaultParameters,
|
|
33
|
+
const args = deepAssign(defaultParameters, options)
|
|
28
34
|
|
|
29
35
|
return [
|
|
30
36
|
'dev',
|
|
31
37
|
...toArgs(args, {
|
|
32
38
|
arraySeparator: null,
|
|
33
39
|
}),
|
|
34
|
-
// Forwarded to `tempo-zone node`; keeps concurrent instances from colliding.
|
|
35
40
|
'--',
|
|
36
|
-
'--authrpc.port',
|
|
37
|
-
String(port! + 4),
|
|
38
41
|
'--ipcdisable',
|
|
39
42
|
...((nodeArgs as string[] | undefined) ?? []),
|
|
40
43
|
]
|
|
@@ -44,7 +47,8 @@ export function command(parameters: tempoZone.Parameters): string[] {
|
|
|
44
47
|
* Defines a Tempo Zone instance.
|
|
45
48
|
*
|
|
46
49
|
* Provisions a fresh zone against a Tempo dev L1 (`tempo-zone dev`) and runs
|
|
47
|
-
* the zone node.
|
|
50
|
+
* the zone node. The L1 must mine canonical Tempo headers, and the dev key
|
|
51
|
+
* must hold pathUSD.
|
|
48
52
|
*
|
|
49
53
|
* @example
|
|
50
54
|
* ```ts
|
|
@@ -68,7 +72,8 @@ export const tempoZone = Instance.define(
|
|
|
68
72
|
return log_
|
|
69
73
|
}
|
|
70
74
|
})()
|
|
71
|
-
const RUST_LOG =
|
|
75
|
+
const RUST_LOG =
|
|
76
|
+
log && typeof log !== 'boolean' ? `${log},reth::cli=info` : ''
|
|
72
77
|
|
|
73
78
|
const name = 'tempo-zone'
|
|
74
79
|
const process = execa({ name })
|
|
@@ -84,16 +89,16 @@ export const tempoZone = Instance.define(
|
|
|
84
89
|
name,
|
|
85
90
|
port: args.port ?? 9545,
|
|
86
91
|
async start({ port = args.port }, options) {
|
|
92
|
+
const httpPort = port ?? 9545
|
|
87
93
|
return await process.start(
|
|
88
94
|
($) =>
|
|
89
95
|
$({
|
|
90
96
|
env: {
|
|
91
97
|
RUST_LOG,
|
|
92
98
|
},
|
|
93
|
-
})`${[binary, ...command({ ...args, port })]}`,
|
|
99
|
+
})`${[binary, ...command({ ...args, port: httpPort })]}`,
|
|
94
100
|
{
|
|
95
101
|
...options,
|
|
96
|
-
// Resolve when the private zone RPC is listening (last server to start).
|
|
97
102
|
resolver({ process, reject, resolve }) {
|
|
98
103
|
let stderr = ''
|
|
99
104
|
process.stdout.on('data', (data) => {
|
|
@@ -108,7 +113,6 @@ export const tempoZone = Instance.define(
|
|
|
108
113
|
if (log) console.error(message)
|
|
109
114
|
stderr += message
|
|
110
115
|
})
|
|
111
|
-
// Provisioning failures (e.g. unreachable L1) exit non-zero before the RPC starts.
|
|
112
116
|
process.once('exit', (code) => {
|
|
113
117
|
if (code) reject(stderr || `exited with code ${code}`)
|
|
114
118
|
})
|
|
@@ -166,6 +170,7 @@ export declare namespace tempoZone {
|
|
|
166
170
|
factoryAddress?: string | undefined
|
|
167
171
|
/**
|
|
168
172
|
* Tempo L1 WebSocket RPC URL.
|
|
173
|
+
* Anvil requires Foundry 1.8 or newer.
|
|
169
174
|
* @default "ws://localhost:8546"
|
|
170
175
|
*/
|
|
171
176
|
rpcUrl?: string | undefined
|
|
@@ -126,27 +126,22 @@ test('behavior: faucet funds address', { timeout: 120_000 }, async () => {
|
|
|
126
126
|
expect(balance).toBeGreaterThan(0n)
|
|
127
127
|
})
|
|
128
128
|
|
|
129
|
-
// Requires a `tempo-zone` image with the `dev` command and GHCR access
|
|
130
|
-
// (the package is private), e.g. `VITE_TEMPO_ZONE_IMAGE=ghcr.io/tempoxyz/tempo-zone:latest`.
|
|
131
|
-
const tempoZoneImage = process.env['VITE_TEMPO_ZONE_IMAGE']
|
|
132
129
|
const zonePort = await getPort()
|
|
133
130
|
|
|
134
|
-
describe
|
|
131
|
+
describe('tempoZone', () => {
|
|
135
132
|
const defineZoneInstance = (
|
|
136
133
|
parameters: Instance.tempoZone.Parameters = {},
|
|
137
134
|
) => {
|
|
138
135
|
const instance = Instance.tempoZone({
|
|
139
|
-
image: tempoZoneImage,
|
|
140
136
|
port: zonePort,
|
|
141
|
-
startupTimeout: 120_000,
|
|
142
137
|
...parameters,
|
|
143
138
|
})
|
|
144
139
|
instances.push(instance)
|
|
145
140
|
return instance
|
|
146
141
|
}
|
|
147
142
|
|
|
148
|
-
test('default', { timeout:
|
|
149
|
-
const instance = defineZoneInstance()
|
|
143
|
+
test('default image with quiet logs', { timeout: 600_000 }, async () => {
|
|
144
|
+
const instance = defineZoneInstance({ log: 'warn' })
|
|
150
145
|
|
|
151
146
|
await instance.start()
|
|
152
147
|
expect(instance.status).toEqual('started')
|
|
@@ -167,7 +162,13 @@ describe.runIf(tempoZoneImage)('tempoZone', () => {
|
|
|
167
162
|
const { result: blockNumber } = await rpc('eth_blockNumber', [])
|
|
168
163
|
expect(blockNumber).toBeDefined()
|
|
169
164
|
|
|
170
|
-
|
|
165
|
+
const { result: pathUsdCode } = await rpc('eth_getCode', [
|
|
166
|
+
'0x20c0000000000000000000000000000000000000',
|
|
167
|
+
'latest',
|
|
168
|
+
])
|
|
169
|
+
expect(pathUsdCode).toMatch(/^0x[0-9a-f]{2,}$/)
|
|
170
|
+
|
|
171
|
+
// Private RPC rejects unauthenticated requests after becoming reachable.
|
|
171
172
|
const { privateRpc } = instance._internal
|
|
172
173
|
expect(privateRpc).toBeDefined()
|
|
173
174
|
const response = await fetch(
|
|
@@ -183,7 +184,7 @@ describe.runIf(tempoZoneImage)('tempoZone', () => {
|
|
|
183
184
|
method: 'POST',
|
|
184
185
|
},
|
|
185
186
|
)
|
|
186
|
-
expect(response.status).
|
|
187
|
+
expect(response.status).toBe(401)
|
|
187
188
|
|
|
188
189
|
await instance.stop()
|
|
189
190
|
expect(instance.status).toEqual('stopped')
|
|
@@ -138,13 +138,14 @@ export declare namespace tempo {
|
|
|
138
138
|
}
|
|
139
139
|
}
|
|
140
140
|
|
|
141
|
+
const tempoZoneStartupTimeout = 120_000
|
|
142
|
+
|
|
141
143
|
/**
|
|
142
144
|
* Defines a Tempo Zone instance.
|
|
143
145
|
*
|
|
144
|
-
* Starts a Tempo dev L1
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
* the container, e.g. `ws://host.docker.internal:8546`).
|
|
146
|
+
* Starts a Tempo dev L1 and `tempo-zone dev` on a shared network. An external
|
|
147
|
+
* `l1.rpcUrl` must be container-reachable, mine canonical headers, and fund
|
|
148
|
+
* the configured dev key with pathUSD.
|
|
148
149
|
*
|
|
149
150
|
* @example
|
|
150
151
|
* ```ts
|
|
@@ -173,6 +174,9 @@ export const tempoZone = Instance.define(
|
|
|
173
174
|
}
|
|
174
175
|
})()
|
|
175
176
|
const RUST_LOG = log && typeof log !== 'boolean' ? log : ''
|
|
177
|
+
const L1_RUST_LOG = RUST_LOG
|
|
178
|
+
? `${RUST_LOG},reth_node_events=info`
|
|
179
|
+
: RUST_LOG
|
|
176
180
|
|
|
177
181
|
// L1 ports inside the container (only reachable over the shared network).
|
|
178
182
|
const l1HttpPort = 8545
|
|
@@ -222,13 +226,21 @@ export const tempoZone = Instance.define(
|
|
|
222
226
|
privateRpcPort =
|
|
223
227
|
(args['privateRpc'] as { port?: number } | undefined)?.port ??
|
|
224
228
|
containerPort + 3
|
|
225
|
-
const timeout =
|
|
229
|
+
const timeout = startupTimeout ?? tempoZoneStartupTimeout
|
|
230
|
+
const includeL1Log = (message: string) => {
|
|
231
|
+
if (log !== 'warn' && log !== 'error') return true
|
|
232
|
+
return !/INFO.*reth_node_events::node/.test(message)
|
|
233
|
+
}
|
|
226
234
|
|
|
227
235
|
const logConsumer =
|
|
228
|
-
(
|
|
236
|
+
(
|
|
237
|
+
reject: (error: Error) => void,
|
|
238
|
+
include: (message: string) => boolean = () => true,
|
|
239
|
+
) =>
|
|
229
240
|
(stream: NodeJS.ReadableStream) => {
|
|
230
241
|
stream.on('data', (data) => {
|
|
231
242
|
const message = data.toString()
|
|
243
|
+
if (!include(message)) return
|
|
232
244
|
emitter.emit('message', message)
|
|
233
245
|
emitter.emit('stdout', message)
|
|
234
246
|
if (log) console.log(message)
|
|
@@ -252,12 +264,12 @@ export const tempoZone = Instance.define(
|
|
|
252
264
|
l1Parameters?.image ?? 'ghcr.io/tempoxyz/tempo:latest',
|
|
253
265
|
)
|
|
254
266
|
.withPullPolicy(PullPolicy.alwaysPull())
|
|
255
|
-
.withPlatform('linux/
|
|
267
|
+
.withPlatform('linux/amd64')
|
|
256
268
|
.withNetwork(network)
|
|
257
269
|
.withNetworkAliases('l1')
|
|
258
270
|
.withExposedPorts(l1HttpPort, l1WsPort)
|
|
259
271
|
.withName(`${containerName}.l1`)
|
|
260
|
-
.withEnvironment({ RUST_LOG })
|
|
272
|
+
.withEnvironment({ RUST_LOG: L1_RUST_LOG })
|
|
261
273
|
.withCommand(
|
|
262
274
|
command({
|
|
263
275
|
port: l1HttpPort,
|
|
@@ -273,7 +285,7 @@ export const tempoZone = Instance.define(
|
|
|
273
285
|
.withLogConsumer(
|
|
274
286
|
logConsumer(() => {
|
|
275
287
|
// L1 shutdown surfaces via the zone container failing to start.
|
|
276
|
-
}),
|
|
288
|
+
}, includeL1Log),
|
|
277
289
|
)
|
|
278
290
|
.withStartupTimeout(timeout)
|
|
279
291
|
.start()
|
|
@@ -284,7 +296,8 @@ export const tempoZone = Instance.define(
|
|
|
284
296
|
|
|
285
297
|
let c = new GenericContainer(image)
|
|
286
298
|
.withPullPolicy(PullPolicy.alwaysPull())
|
|
287
|
-
|
|
299
|
+
// The public image currently publishes only linux/amd64.
|
|
300
|
+
.withPlatform('linux/amd64')
|
|
288
301
|
.withExposedPorts(containerPort, privateRpcPort)
|
|
289
302
|
.withExtraHosts([
|
|
290
303
|
{ host: 'host.docker.internal', ipAddress: 'host-gateway' },
|
|
@@ -303,9 +316,12 @@ export const tempoZone = Instance.define(
|
|
|
303
316
|
port: containerPort,
|
|
304
317
|
}),
|
|
305
318
|
)
|
|
306
|
-
// Fires after the public RPC; last server to start.
|
|
307
319
|
.withWaitStrategy(
|
|
308
|
-
Wait.
|
|
320
|
+
Wait.forHttp('/', privateRpcPort, {
|
|
321
|
+
abortOnContainerExit: true,
|
|
322
|
+
})
|
|
323
|
+
.withMethod('POST')
|
|
324
|
+
.forStatusCode(401),
|
|
309
325
|
)
|
|
310
326
|
.withLogConsumer(logConsumer(promise.reject))
|
|
311
327
|
.withStartupTimeout(timeout)
|
|
@@ -337,15 +353,21 @@ export const tempoZone = Instance.define(
|
|
|
337
353
|
|
|
338
354
|
export declare namespace tempoZone {
|
|
339
355
|
export type Parameters = Omit<core_tempoZone.Parameters, 'binary' | 'l1'> &
|
|
340
|
-
ContainerOptions.Parameters & {
|
|
356
|
+
Omit<ContainerOptions.Parameters, 'startupTimeout'> & {
|
|
341
357
|
/**
|
|
342
358
|
* Name of the container.
|
|
343
359
|
*/
|
|
344
360
|
containerName?: string | undefined
|
|
345
361
|
/**
|
|
346
362
|
* Docker image to use for the zone node.
|
|
363
|
+
* @default "ghcr.io/tempoxyz/tempo-zone:latest"
|
|
347
364
|
*/
|
|
348
365
|
image?: string | undefined
|
|
366
|
+
/**
|
|
367
|
+
* Startup timeout for each L1 and zone readiness check, in milliseconds.
|
|
368
|
+
* @default 120_000
|
|
369
|
+
*/
|
|
370
|
+
startupTimeout?: number | undefined
|
|
349
371
|
/**
|
|
350
372
|
* Host the server will listen on.
|
|
351
373
|
*/
|
|
@@ -363,6 +385,7 @@ export declare namespace tempoZone {
|
|
|
363
385
|
* Existing Tempo L1 WebSocket RPC URL, reachable from inside the
|
|
364
386
|
* container (e.g. `ws://host.docker.internal:8546`). Starts a
|
|
365
387
|
* dev L1 container when omitted.
|
|
388
|
+
* Anvil requires Foundry 1.8 or newer.
|
|
366
389
|
*/
|
|
367
390
|
rpcUrl?: string | undefined
|
|
368
391
|
})
|