prool 0.2.6 → 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/tempo.d.ts.map +1 -1
- package/dist/instances/tempo.js +13 -3
- package/dist/instances/tempo.js.map +1 -1
- package/dist/instances/tempoZone.d.ts +4 -1
- package/dist/instances/tempoZone.d.ts.map +1 -1
- package/dist/instances/tempoZone.js +15 -12
- package/dist/instances/tempoZone.js.map +1 -1
- package/dist/testcontainers/Instance.d.ts +15 -5
- package/dist/testcontainers/Instance.d.ts.map +1 -1
- package/dist/testcontainers/Instance.js +41 -12
- package/dist/testcontainers/Instance.js.map +1 -1
- package/package.json +1 -1
- package/src/instances/tempo.test.ts +35 -4
- package/src/instances/tempo.ts +14 -3
- package/src/instances/tempoZone.test.ts +20 -5
- package/src/instances/tempoZone.ts +18 -12
- package/src/testcontainers/Instance.test.ts +27 -8
- package/src/testcontainers/Instance.ts +52 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tempo.d.ts","sourceRoot":"","sources":["../../src/instances/tempo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAI1C,wBAAgB,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,MAAM,EAAE,
|
|
1
|
+
{"version":3,"file":"tempo.d.ts","sourceRoot":"","sources":["../../src/instances/tempo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAI1C,wBAAgB,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,MAAM,EAAE,CAuE9D;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,KAAK;;;QAqEd;;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;;;eAGG;YACH,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;YAC7B;;;eAGG;YACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;YAChC;;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;;;yCAxF3B,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;;;eAGG;YACH,OAAO,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;YAC7B;;;eAGG;YACH,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;YAChC;;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"}
|
package/dist/instances/tempo.js
CHANGED
|
@@ -41,9 +41,13 @@ export function command(parameters) {
|
|
|
41
41
|
port: port,
|
|
42
42
|
},
|
|
43
43
|
port: port + 10,
|
|
44
|
-
ws:
|
|
45
|
-
|
|
46
|
-
|
|
44
|
+
ws: [
|
|
45
|
+
true,
|
|
46
|
+
{
|
|
47
|
+
addr: '0.0.0.0',
|
|
48
|
+
api: 'all',
|
|
49
|
+
},
|
|
50
|
+
],
|
|
47
51
|
};
|
|
48
52
|
const args = deepAssign(defaultParameters, rest);
|
|
49
53
|
// Faucet submits funding transactions over RPC; point it at the resolved http port (node default: 8545).
|
|
@@ -51,6 +55,12 @@ export function command(parameters) {
|
|
|
51
55
|
const http = args['http'];
|
|
52
56
|
if (faucet?.enabled && !faucet.nodeAddress)
|
|
53
57
|
faucet.nodeAddress = `http://localhost:${http.port}`;
|
|
58
|
+
// WS defaults to the http port: one endpoint (and one proxied server port) serves both protocols.
|
|
59
|
+
const ws = args['ws'];
|
|
60
|
+
if (Array.isArray(ws) && ws[0] === true) {
|
|
61
|
+
ws[1] ??= {};
|
|
62
|
+
ws[1].port ??= http.port;
|
|
63
|
+
}
|
|
54
64
|
return [
|
|
55
65
|
'node',
|
|
56
66
|
...toArgs(args, {
|
|
@@ -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,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAE7C,MAAM,UAAU,OAAO,CAAC,UAA4B;IAClD,MAAM,EAAE,oBAAoB,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAChE,UAAU,CAAA;IAEZ,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC,CAAA;IACjE,MAAM,iBAAiB,GAAG;QACxB,OAAO,EAAE;YACP,IAAI,EAAE,IAAK,GAAG,EAAE;SACjB;QACD,OAAO;QACP,GAAG,EAAE;YACH,IAAI;YACJ;gBACE,SAAS,EAAE,SAAS,IAAI,MAAM;gBAC9B,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClC;SACF;QACD,MAAM,EAAE;YACN,sBAAsB,EAAE,IAAI;YAC5B,eAAe,EAAE,IAAI;SACtB;QACD,MAAM,EAAE;YACN,OAAO,EAAE;gBACP,4CAA4C;gBAC5C,4CAA4C;gBAC5C,4CAA4C;gBAC5C,4CAA4C;aAC7C;YACD,MAAM,EAAE,eAAe;YACvB,OAAO,EAAE,IAAI;YACb,UAAU,EACR,oEAAoE;SACvE;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,KAAK;YACV,UAAU,EAAE,GAAG;YACf,IAAI,EAAE,IAAK;SACZ;QACD,IAAI,EAAE,IAAK,GAAG,EAAE;QAChB,EAAE,EAAE;YACF,IAAI,EAAE,
|
|
1
|
+
{"version":3,"file":"tempo.js","sourceRoot":"","sources":["../../src/instances/tempo.ts"],"names":[],"mappings":"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"}
|
|
@@ -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,20 +80,20 @@ 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 zone RPC server is listening (fires after provisioning).
|
|
86
90
|
resolver({ process, reject, resolve }) {
|
|
87
91
|
let stderr = '';
|
|
88
92
|
process.stdout.on('data', (data) => {
|
|
89
93
|
const message = data.toString();
|
|
90
94
|
if (log)
|
|
91
95
|
console.log(message);
|
|
92
|
-
if (message.includes('RPC
|
|
96
|
+
if (message.includes('Private zone RPC server started'))
|
|
93
97
|
resolve();
|
|
94
98
|
if (message.includes('shutting down'))
|
|
95
99
|
reject('shutting down');
|
|
@@ -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
|
|
@@ -80,17 +79,27 @@ export declare const tempoZone: Instance.define.ReturnType<{
|
|
|
80
79
|
port: number;
|
|
81
80
|
wsPort: number;
|
|
82
81
|
} | undefined;
|
|
82
|
+
readonly privateRpc: {
|
|
83
|
+
host: string;
|
|
84
|
+
port: number;
|
|
85
|
+
} | undefined;
|
|
83
86
|
}, tempoZone.Parameters | undefined>;
|
|
84
87
|
export declare namespace tempoZone {
|
|
85
|
-
type Parameters = Omit<core_tempoZone.Parameters, 'binary' | 'l1'> & ContainerOptions.Parameters & {
|
|
88
|
+
type Parameters = Omit<core_tempoZone.Parameters, 'binary' | 'l1'> & Omit<ContainerOptions.Parameters, 'startupTimeout'> & {
|
|
86
89
|
/**
|
|
87
90
|
* Name of the container.
|
|
88
91
|
*/
|
|
89
92
|
containerName?: string | undefined;
|
|
90
93
|
/**
|
|
91
94
|
* Docker image to use for the zone node.
|
|
95
|
+
* @default "ghcr.io/tempoxyz/tempo-zone:latest"
|
|
92
96
|
*/
|
|
93
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;
|
|
94
103
|
/**
|
|
95
104
|
* Host the server will listen on.
|
|
96
105
|
*/
|
|
@@ -107,6 +116,7 @@ export declare namespace tempoZone {
|
|
|
107
116
|
* Existing Tempo L1 WebSocket RPC URL, reachable from inside the
|
|
108
117
|
* container (e.g. `ws://host.docker.internal:8546`). Starts a
|
|
109
118
|
* dev L1 container when omitted.
|
|
119
|
+
* Anvil requires Foundry 1.8 or newer.
|
|
110
120
|
*/
|
|
111
121
|
rpcUrl?: string | undefined;
|
|
112
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;
|
|
@@ -121,6 +124,7 @@ export const tempoZone = Instance.define((parameters) => {
|
|
|
121
124
|
let container;
|
|
122
125
|
let l1Container;
|
|
123
126
|
let network;
|
|
127
|
+
let privateRpcPort;
|
|
124
128
|
async function teardown() {
|
|
125
129
|
if (container)
|
|
126
130
|
await container.stop().catch(() => { });
|
|
@@ -131,6 +135,7 @@ export const tempoZone = Instance.define((parameters) => {
|
|
|
131
135
|
container = undefined;
|
|
132
136
|
l1Container = undefined;
|
|
133
137
|
network = undefined;
|
|
138
|
+
privateRpcPort = undefined;
|
|
134
139
|
}
|
|
135
140
|
return {
|
|
136
141
|
_internal: {
|
|
@@ -144,16 +149,35 @@ export const tempoZone = Instance.define((parameters) => {
|
|
|
144
149
|
wsPort: l1Container.getMappedPort(l1WsPort),
|
|
145
150
|
};
|
|
146
151
|
},
|
|
152
|
+
get privateRpc() {
|
|
153
|
+
if (!container || !privateRpcPort)
|
|
154
|
+
return undefined;
|
|
155
|
+
return {
|
|
156
|
+
host: container.getHost(),
|
|
157
|
+
port: container.getMappedPort(privateRpcPort),
|
|
158
|
+
};
|
|
159
|
+
},
|
|
147
160
|
},
|
|
148
161
|
host: args.host ?? 'localhost',
|
|
149
162
|
name,
|
|
150
163
|
port: args.port ?? 9545,
|
|
151
164
|
async start({ port = args.port }, { emitter, setEndpoint }) {
|
|
152
165
|
const containerPort = port ?? 9545;
|
|
153
|
-
|
|
154
|
-
|
|
166
|
+
// Mirrors the `zoneCommand` default; serves authenticated `eth_*` + `zone_*`.
|
|
167
|
+
privateRpcPort =
|
|
168
|
+
args['privateRpc']?.port ??
|
|
169
|
+
containerPort + 3;
|
|
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) => {
|
|
155
177
|
stream.on('data', (data) => {
|
|
156
178
|
const message = data.toString();
|
|
179
|
+
if (!include(message))
|
|
180
|
+
return;
|
|
157
181
|
emitter.emit('message', message);
|
|
158
182
|
emitter.emit('stdout', message);
|
|
159
183
|
if (log)
|
|
@@ -176,12 +200,12 @@ export const tempoZone = Instance.define((parameters) => {
|
|
|
176
200
|
network = await new Network().start();
|
|
177
201
|
l1Container = await new GenericContainer(l1Parameters?.image ?? 'ghcr.io/tempoxyz/tempo:latest')
|
|
178
202
|
.withPullPolicy(PullPolicy.alwaysPull())
|
|
179
|
-
.withPlatform('linux/
|
|
203
|
+
.withPlatform('linux/amd64')
|
|
180
204
|
.withNetwork(network)
|
|
181
205
|
.withNetworkAliases('l1')
|
|
182
206
|
.withExposedPorts(l1HttpPort, l1WsPort)
|
|
183
207
|
.withName(`${containerName}.l1`)
|
|
184
|
-
.withEnvironment({ RUST_LOG })
|
|
208
|
+
.withEnvironment({ RUST_LOG: L1_RUST_LOG })
|
|
185
209
|
.withCommand(command({
|
|
186
210
|
port: l1HttpPort,
|
|
187
211
|
// The zone anchors to the L1 over WebSocket.
|
|
@@ -190,7 +214,7 @@ export const tempoZone = Instance.define((parameters) => {
|
|
|
190
214
|
.withWaitStrategy(Wait.forLogMessage(/Received (block|new payload) from consensus engine/))
|
|
191
215
|
.withLogConsumer(logConsumer(() => {
|
|
192
216
|
// L1 shutdown surfaces via the zone container failing to start.
|
|
193
|
-
}))
|
|
217
|
+
}, includeL1Log))
|
|
194
218
|
.withStartupTimeout(timeout)
|
|
195
219
|
.start();
|
|
196
220
|
l1RpcUrl = `ws://l1:${l1WsPort}`;
|
|
@@ -198,8 +222,9 @@ export const tempoZone = Instance.define((parameters) => {
|
|
|
198
222
|
const promise = Promise.withResolvers();
|
|
199
223
|
let c = new GenericContainer(image)
|
|
200
224
|
.withPullPolicy(PullPolicy.alwaysPull())
|
|
201
|
-
|
|
202
|
-
.
|
|
225
|
+
// The public image currently publishes only linux/amd64.
|
|
226
|
+
.withPlatform('linux/amd64')
|
|
227
|
+
.withExposedPorts(containerPort, privateRpcPort)
|
|
203
228
|
.withExtraHosts([
|
|
204
229
|
{ host: 'host.docker.internal', ipAddress: 'host-gateway' },
|
|
205
230
|
])
|
|
@@ -215,7 +240,11 @@ export const tempoZone = Instance.define((parameters) => {
|
|
|
215
240
|
},
|
|
216
241
|
port: containerPort,
|
|
217
242
|
}))
|
|
218
|
-
.withWaitStrategy(Wait.
|
|
243
|
+
.withWaitStrategy(Wait.forHttp('/', privateRpcPort, {
|
|
244
|
+
abortOnContainerExit: true,
|
|
245
|
+
})
|
|
246
|
+
.withMethod('POST')
|
|
247
|
+
.forStatusCode(401))
|
|
219
248
|
.withLogConsumer(logConsumer(promise.reject))
|
|
220
249
|
.withStartupTimeout(timeout);
|
|
221
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
|
@@ -2,6 +2,7 @@ import * as os from 'node:os'
|
|
|
2
2
|
import getPort from 'get-port'
|
|
3
3
|
import { Instance } from 'prool'
|
|
4
4
|
import { afterEach, expect, test } from 'vitest'
|
|
5
|
+
import { type MessageEvent, WebSocket } from 'ws'
|
|
5
6
|
import { command } from './tempo.js'
|
|
6
7
|
|
|
7
8
|
const instances: Instance.Instance[] = []
|
|
@@ -140,12 +141,34 @@ test(
|
|
|
140
141
|
},
|
|
141
142
|
)
|
|
142
143
|
|
|
144
|
+
test(
|
|
145
|
+
'behavior: serves websocket on http port',
|
|
146
|
+
{ timeout: slowTestTimeout },
|
|
147
|
+
async () => {
|
|
148
|
+
const instance = defineInstance()
|
|
149
|
+
await instance.start()
|
|
150
|
+
|
|
151
|
+
const ws = new WebSocket(`ws://localhost:${port}`)
|
|
152
|
+
await new Promise((resolve, reject) => {
|
|
153
|
+
ws.addEventListener('open', resolve)
|
|
154
|
+
ws.addEventListener('error', reject)
|
|
155
|
+
})
|
|
156
|
+
ws.send(JSON.stringify({ id: 0, jsonrpc: '2.0', method: 'eth_chainId' }))
|
|
157
|
+
const { data } = await new Promise<MessageEvent>((resolve) =>
|
|
158
|
+
ws.addEventListener('message', resolve),
|
|
159
|
+
)
|
|
160
|
+
ws.close()
|
|
161
|
+
|
|
162
|
+
expect(JSON.parse(data.toString()).result).toBeDefined()
|
|
163
|
+
},
|
|
164
|
+
)
|
|
165
|
+
|
|
143
166
|
const redact = (args: string[]) =>
|
|
144
167
|
args.join(' ').replaceAll(os.tmpdir(), '<tmpdir>')
|
|
145
168
|
|
|
146
169
|
test('command: default', () => {
|
|
147
170
|
expect(redact(command({ port: 8545 }))).toMatchInlineSnapshot(
|
|
148
|
-
`"node --authrpc.port 8575 --datadir <tmpdir>/.prool/tempo.8545 --dev --dev.block-time 50ms --engine.disable-precompile-cache --engine.legacy-state-root --faucet.address 0x20c0000000000000000000000000000000000000 0x20c0000000000000000000000000000000000001 0x20c0000000000000000000000000000000000002 0x20c0000000000000000000000000000000000003 --faucet.amount 1000000000000 --faucet.enabled --faucet.private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --faucet.node-address http://localhost:8545 --http.addr 0.0.0.0 --http.api all --http.corsdomain * --http.port 8545 --port 8555 --ws.port
|
|
171
|
+
`"node --authrpc.port 8575 --datadir <tmpdir>/.prool/tempo.8545 --dev --dev.block-time 50ms --engine.disable-precompile-cache --engine.legacy-state-root --faucet.address 0x20c0000000000000000000000000000000000000 0x20c0000000000000000000000000000000000001 0x20c0000000000000000000000000000000000002 0x20c0000000000000000000000000000000000003 --faucet.amount 1000000000000 --faucet.enabled --faucet.private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --faucet.node-address http://localhost:8545 --http.addr 0.0.0.0 --http.api all --http.corsdomain * --http.port 8545 --port 8555 --ws --ws.addr 0.0.0.0 --ws.api all --ws.port 8545"`,
|
|
149
172
|
)
|
|
150
173
|
})
|
|
151
174
|
|
|
@@ -155,7 +178,7 @@ test('command: behavior: faucet node address', () => {
|
|
|
155
178
|
command({ faucet: { nodeAddress: 'http://localhost:1337' }, port: 8545 }),
|
|
156
179
|
),
|
|
157
180
|
).toMatchInlineSnapshot(
|
|
158
|
-
`"node --authrpc.port 8575 --datadir <tmpdir>/.prool/tempo.8545 --dev --dev.block-time 50ms --engine.disable-precompile-cache --engine.legacy-state-root --faucet.address 0x20c0000000000000000000000000000000000000 0x20c0000000000000000000000000000000000001 0x20c0000000000000000000000000000000000002 0x20c0000000000000000000000000000000000003 --faucet.amount 1000000000000 --faucet.enabled --faucet.private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --faucet.node-address http://localhost:1337 --http.addr 0.0.0.0 --http.api all --http.corsdomain * --http.port 8545 --port 8555 --ws.port
|
|
181
|
+
`"node --authrpc.port 8575 --datadir <tmpdir>/.prool/tempo.8545 --dev --dev.block-time 50ms --engine.disable-precompile-cache --engine.legacy-state-root --faucet.address 0x20c0000000000000000000000000000000000000 0x20c0000000000000000000000000000000000001 0x20c0000000000000000000000000000000000002 0x20c0000000000000000000000000000000000003 --faucet.amount 1000000000000 --faucet.enabled --faucet.private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --faucet.node-address http://localhost:1337 --http.addr 0.0.0.0 --http.api all --http.corsdomain * --http.port 8545 --port 8555 --ws --ws.addr 0.0.0.0 --ws.api all --ws.port 8545"`,
|
|
159
182
|
)
|
|
160
183
|
})
|
|
161
184
|
|
|
@@ -163,7 +186,15 @@ test('command: behavior: faucet disabled', () => {
|
|
|
163
186
|
expect(
|
|
164
187
|
redact(command({ faucet: { enabled: false }, port: 8545 })),
|
|
165
188
|
).toMatchInlineSnapshot(
|
|
166
|
-
`"node --authrpc.port 8575 --datadir <tmpdir>/.prool/tempo.8545 --dev --dev.block-time 50ms --engine.disable-precompile-cache --engine.legacy-state-root --faucet.address 0x20c0000000000000000000000000000000000000 0x20c0000000000000000000000000000000000001 0x20c0000000000000000000000000000000000002 0x20c0000000000000000000000000000000000003 --faucet.amount 1000000000000 --faucet.enabled false --faucet.private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --http.addr 0.0.0.0 --http.api all --http.corsdomain * --http.port 8545 --port 8555 --ws.port
|
|
189
|
+
`"node --authrpc.port 8575 --datadir <tmpdir>/.prool/tempo.8545 --dev --dev.block-time 50ms --engine.disable-precompile-cache --engine.legacy-state-root --faucet.address 0x20c0000000000000000000000000000000000000 0x20c0000000000000000000000000000000000001 0x20c0000000000000000000000000000000000002 0x20c0000000000000000000000000000000000003 --faucet.amount 1000000000000 --faucet.enabled false --faucet.private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --http.addr 0.0.0.0 --http.api all --http.corsdomain * --http.port 8545 --port 8555 --ws --ws.addr 0.0.0.0 --ws.api all --ws.port 8545"`,
|
|
190
|
+
)
|
|
191
|
+
})
|
|
192
|
+
|
|
193
|
+
test('command: behavior: ws port override', () => {
|
|
194
|
+
expect(
|
|
195
|
+
redact(command({ port: 8545, ws: [true, { port: 8565 }] })),
|
|
196
|
+
).toMatchInlineSnapshot(
|
|
197
|
+
`"node --authrpc.port 8575 --datadir <tmpdir>/.prool/tempo.8545 --dev --dev.block-time 50ms --engine.disable-precompile-cache --engine.legacy-state-root --faucet.address 0x20c0000000000000000000000000000000000000 0x20c0000000000000000000000000000000000001 0x20c0000000000000000000000000000000000002 0x20c0000000000000000000000000000000000003 --faucet.amount 1000000000000 --faucet.enabled --faucet.private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --faucet.node-address http://localhost:8545 --http.addr 0.0.0.0 --http.api all --http.corsdomain * --http.port 8545 --port 8555 --ws --ws.port 8565"`,
|
|
167
198
|
)
|
|
168
199
|
})
|
|
169
200
|
|
|
@@ -171,6 +202,6 @@ test('command: behavior: http port override', () => {
|
|
|
171
202
|
expect(
|
|
172
203
|
redact(command({ http: { port: 1337 }, port: 8545 })),
|
|
173
204
|
).toMatchInlineSnapshot(
|
|
174
|
-
`"node --authrpc.port 8575 --datadir <tmpdir>/.prool/tempo.8545 --dev --dev.block-time 50ms --engine.disable-precompile-cache --engine.legacy-state-root --faucet.address 0x20c0000000000000000000000000000000000000 0x20c0000000000000000000000000000000000001 0x20c0000000000000000000000000000000000002 0x20c0000000000000000000000000000000000003 --faucet.amount 1000000000000 --faucet.enabled --faucet.private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --faucet.node-address http://localhost:1337 --http.addr 0.0.0.0 --http.api all --http.corsdomain * --http.port 1337 --port 8555 --ws.port
|
|
205
|
+
`"node --authrpc.port 8575 --datadir <tmpdir>/.prool/tempo.8545 --dev --dev.block-time 50ms --engine.disable-precompile-cache --engine.legacy-state-root --faucet.address 0x20c0000000000000000000000000000000000000 0x20c0000000000000000000000000000000000001 0x20c0000000000000000000000000000000000002 0x20c0000000000000000000000000000000000003 --faucet.amount 1000000000000 --faucet.enabled --faucet.private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 --faucet.node-address http://localhost:1337 --http.addr 0.0.0.0 --http.api all --http.corsdomain * --http.port 1337 --port 8555 --ws --ws.addr 0.0.0.0 --ws.api all --ws.port 1337"`,
|
|
175
206
|
)
|
|
176
207
|
})
|
package/src/instances/tempo.ts
CHANGED
|
@@ -45,9 +45,13 @@ export function command(parameters: tempo.Parameters): string[] {
|
|
|
45
45
|
port: port!,
|
|
46
46
|
},
|
|
47
47
|
port: port! + 10,
|
|
48
|
-
ws:
|
|
49
|
-
|
|
50
|
-
|
|
48
|
+
ws: [
|
|
49
|
+
true,
|
|
50
|
+
{
|
|
51
|
+
addr: '0.0.0.0',
|
|
52
|
+
api: 'all',
|
|
53
|
+
},
|
|
54
|
+
],
|
|
51
55
|
}
|
|
52
56
|
|
|
53
57
|
const args = deepAssign(defaultParameters, rest)
|
|
@@ -58,6 +62,13 @@ export function command(parameters: tempo.Parameters): string[] {
|
|
|
58
62
|
if (faucet?.enabled && !faucet.nodeAddress)
|
|
59
63
|
faucet.nodeAddress = `http://localhost:${http.port}`
|
|
60
64
|
|
|
65
|
+
// WS defaults to the http port: one endpoint (and one proxied server port) serves both protocols.
|
|
66
|
+
const ws = args['ws'] as [true, { port?: number | undefined }?] | undefined
|
|
67
|
+
if (Array.isArray(ws) && ws[0] === true) {
|
|
68
|
+
ws[1] ??= {}
|
|
69
|
+
ws[1].port ??= http.port
|
|
70
|
+
}
|
|
71
|
+
|
|
61
72
|
return [
|
|
62
73
|
'node',
|
|
63
74
|
...toArgs(args, {
|
|
@@ -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,22 +89,23 @@ 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 zone RPC server is listening (fires after provisioning).
|
|
97
102
|
resolver({ process, reject, resolve }) {
|
|
98
103
|
let stderr = ''
|
|
99
104
|
process.stdout.on('data', (data) => {
|
|
100
105
|
const message = data.toString()
|
|
101
106
|
if (log) console.log(message)
|
|
102
|
-
if (message.includes('RPC
|
|
107
|
+
if (message.includes('Private zone RPC server started'))
|
|
108
|
+
resolve()
|
|
103
109
|
if (message.includes('shutting down')) reject('shutting down')
|
|
104
110
|
})
|
|
105
111
|
process.stderr.on('data', (data) => {
|
|
@@ -107,7 +113,6 @@ export const tempoZone = Instance.define(
|
|
|
107
113
|
if (log) console.error(message)
|
|
108
114
|
stderr += message
|
|
109
115
|
})
|
|
110
|
-
// Provisioning failures (e.g. unreachable L1) exit non-zero before the RPC starts.
|
|
111
116
|
process.once('exit', (code) => {
|
|
112
117
|
if (code) reject(stderr || `exited with code ${code}`)
|
|
113
118
|
})
|
|
@@ -165,6 +170,7 @@ export declare namespace tempoZone {
|
|
|
165
170
|
factoryAddress?: string | undefined
|
|
166
171
|
/**
|
|
167
172
|
* Tempo L1 WebSocket RPC URL.
|
|
173
|
+
* Anvil requires Foundry 1.8 or newer.
|
|
168
174
|
* @default "ws://localhost:8546"
|
|
169
175
|
*/
|
|
170
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,6 +162,30 @@ describe.runIf(tempoZoneImage)('tempoZone', () => {
|
|
|
167
162
|
const { result: blockNumber } = await rpc('eth_blockNumber', [])
|
|
168
163
|
expect(blockNumber).toBeDefined()
|
|
169
164
|
|
|
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.
|
|
172
|
+
const { privateRpc } = instance._internal
|
|
173
|
+
expect(privateRpc).toBeDefined()
|
|
174
|
+
const response = await fetch(
|
|
175
|
+
`http://${privateRpc!.host}:${privateRpc!.port}`,
|
|
176
|
+
{
|
|
177
|
+
body: JSON.stringify({
|
|
178
|
+
id: 0,
|
|
179
|
+
jsonrpc: '2.0',
|
|
180
|
+
method: 'zone_getZoneInfo',
|
|
181
|
+
params: [],
|
|
182
|
+
}),
|
|
183
|
+
headers: { 'Content-Type': 'application/json' },
|
|
184
|
+
method: 'POST',
|
|
185
|
+
},
|
|
186
|
+
)
|
|
187
|
+
expect(response.status).toBe(401)
|
|
188
|
+
|
|
170
189
|
await instance.stop()
|
|
171
190
|
expect(instance.status).toEqual('stopped')
|
|
172
191
|
})
|
|
@@ -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
|
|
@@ -182,6 +186,7 @@ export const tempoZone = Instance.define(
|
|
|
182
186
|
let container: StartedTestContainer | undefined
|
|
183
187
|
let l1Container: StartedTestContainer | undefined
|
|
184
188
|
let network: StartedNetwork | undefined
|
|
189
|
+
let privateRpcPort: number | undefined
|
|
185
190
|
|
|
186
191
|
async function teardown() {
|
|
187
192
|
if (container) await container.stop().catch(() => {})
|
|
@@ -190,6 +195,7 @@ export const tempoZone = Instance.define(
|
|
|
190
195
|
container = undefined
|
|
191
196
|
l1Container = undefined
|
|
192
197
|
network = undefined
|
|
198
|
+
privateRpcPort = undefined
|
|
193
199
|
}
|
|
194
200
|
|
|
195
201
|
return {
|
|
@@ -203,19 +209,38 @@ export const tempoZone = Instance.define(
|
|
|
203
209
|
wsPort: l1Container.getMappedPort(l1WsPort),
|
|
204
210
|
}
|
|
205
211
|
},
|
|
212
|
+
get privateRpc() {
|
|
213
|
+
if (!container || !privateRpcPort) return undefined
|
|
214
|
+
return {
|
|
215
|
+
host: container.getHost(),
|
|
216
|
+
port: container.getMappedPort(privateRpcPort),
|
|
217
|
+
}
|
|
218
|
+
},
|
|
206
219
|
},
|
|
207
220
|
host: args.host ?? 'localhost',
|
|
208
221
|
name,
|
|
209
222
|
port: args.port ?? 9545,
|
|
210
223
|
async start({ port = args.port }, { emitter, setEndpoint }) {
|
|
211
224
|
const containerPort = port ?? 9545
|
|
212
|
-
|
|
225
|
+
// Mirrors the `zoneCommand` default; serves authenticated `eth_*` + `zone_*`.
|
|
226
|
+
privateRpcPort =
|
|
227
|
+
(args['privateRpc'] as { port?: number } | undefined)?.port ??
|
|
228
|
+
containerPort + 3
|
|
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
|
+
}
|
|
213
234
|
|
|
214
235
|
const logConsumer =
|
|
215
|
-
(
|
|
236
|
+
(
|
|
237
|
+
reject: (error: Error) => void,
|
|
238
|
+
include: (message: string) => boolean = () => true,
|
|
239
|
+
) =>
|
|
216
240
|
(stream: NodeJS.ReadableStream) => {
|
|
217
241
|
stream.on('data', (data) => {
|
|
218
242
|
const message = data.toString()
|
|
243
|
+
if (!include(message)) return
|
|
219
244
|
emitter.emit('message', message)
|
|
220
245
|
emitter.emit('stdout', message)
|
|
221
246
|
if (log) console.log(message)
|
|
@@ -239,12 +264,12 @@ export const tempoZone = Instance.define(
|
|
|
239
264
|
l1Parameters?.image ?? 'ghcr.io/tempoxyz/tempo:latest',
|
|
240
265
|
)
|
|
241
266
|
.withPullPolicy(PullPolicy.alwaysPull())
|
|
242
|
-
.withPlatform('linux/
|
|
267
|
+
.withPlatform('linux/amd64')
|
|
243
268
|
.withNetwork(network)
|
|
244
269
|
.withNetworkAliases('l1')
|
|
245
270
|
.withExposedPorts(l1HttpPort, l1WsPort)
|
|
246
271
|
.withName(`${containerName}.l1`)
|
|
247
|
-
.withEnvironment({ RUST_LOG })
|
|
272
|
+
.withEnvironment({ RUST_LOG: L1_RUST_LOG })
|
|
248
273
|
.withCommand(
|
|
249
274
|
command({
|
|
250
275
|
port: l1HttpPort,
|
|
@@ -260,7 +285,7 @@ export const tempoZone = Instance.define(
|
|
|
260
285
|
.withLogConsumer(
|
|
261
286
|
logConsumer(() => {
|
|
262
287
|
// L1 shutdown surfaces via the zone container failing to start.
|
|
263
|
-
}),
|
|
288
|
+
}, includeL1Log),
|
|
264
289
|
)
|
|
265
290
|
.withStartupTimeout(timeout)
|
|
266
291
|
.start()
|
|
@@ -271,8 +296,9 @@ export const tempoZone = Instance.define(
|
|
|
271
296
|
|
|
272
297
|
let c = new GenericContainer(image)
|
|
273
298
|
.withPullPolicy(PullPolicy.alwaysPull())
|
|
274
|
-
|
|
275
|
-
.
|
|
299
|
+
// The public image currently publishes only linux/amd64.
|
|
300
|
+
.withPlatform('linux/amd64')
|
|
301
|
+
.withExposedPorts(containerPort, privateRpcPort)
|
|
276
302
|
.withExtraHosts([
|
|
277
303
|
{ host: 'host.docker.internal', ipAddress: 'host-gateway' },
|
|
278
304
|
])
|
|
@@ -290,7 +316,13 @@ export const tempoZone = Instance.define(
|
|
|
290
316
|
port: containerPort,
|
|
291
317
|
}),
|
|
292
318
|
)
|
|
293
|
-
.withWaitStrategy(
|
|
319
|
+
.withWaitStrategy(
|
|
320
|
+
Wait.forHttp('/', privateRpcPort, {
|
|
321
|
+
abortOnContainerExit: true,
|
|
322
|
+
})
|
|
323
|
+
.withMethod('POST')
|
|
324
|
+
.forStatusCode(401),
|
|
325
|
+
)
|
|
294
326
|
.withLogConsumer(logConsumer(promise.reject))
|
|
295
327
|
.withStartupTimeout(timeout)
|
|
296
328
|
if (network) c = c.withNetwork(network)
|
|
@@ -321,15 +353,21 @@ export const tempoZone = Instance.define(
|
|
|
321
353
|
|
|
322
354
|
export declare namespace tempoZone {
|
|
323
355
|
export type Parameters = Omit<core_tempoZone.Parameters, 'binary' | 'l1'> &
|
|
324
|
-
ContainerOptions.Parameters & {
|
|
356
|
+
Omit<ContainerOptions.Parameters, 'startupTimeout'> & {
|
|
325
357
|
/**
|
|
326
358
|
* Name of the container.
|
|
327
359
|
*/
|
|
328
360
|
containerName?: string | undefined
|
|
329
361
|
/**
|
|
330
362
|
* Docker image to use for the zone node.
|
|
363
|
+
* @default "ghcr.io/tempoxyz/tempo-zone:latest"
|
|
331
364
|
*/
|
|
332
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
|
|
333
371
|
/**
|
|
334
372
|
* Host the server will listen on.
|
|
335
373
|
*/
|
|
@@ -347,6 +385,7 @@ export declare namespace tempoZone {
|
|
|
347
385
|
* Existing Tempo L1 WebSocket RPC URL, reachable from inside the
|
|
348
386
|
* container (e.g. `ws://host.docker.internal:8546`). Starts a
|
|
349
387
|
* dev L1 container when omitted.
|
|
388
|
+
* Anvil requires Foundry 1.8 or newer.
|
|
350
389
|
*/
|
|
351
390
|
rpcUrl?: string | undefined
|
|
352
391
|
})
|