mirror of
https://github.com/logos-messaging/logos-messaging-simulator.git
synced 2026-07-09 09:40:09 +00:00
Merge 08d8daca374241bc7803cd584b60e50f121672d0 into 0faeda33aed2aeaff581f6789b3bed3a0599f68f
This commit is contained in:
commit
a208201df1
1
.gitignore
vendored
1
.gitignore
vendored
@ -6,3 +6,4 @@ __pycache__/
|
||||
*.pyc
|
||||
*.pyo
|
||||
*.pyd
|
||||
node_modules
|
||||
|
||||
@ -2,20 +2,19 @@ version: "3.7"
|
||||
|
||||
networks:
|
||||
simulation:
|
||||
driver: bridge
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: "10.2.0.0/24"
|
||||
driver: bridge
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: "10.2.0.0/24"
|
||||
|
||||
services:
|
||||
|
||||
# Accounts are hardcoded to 520 with the idea that nwaku nodes use up to 500 for membership registration and the last 20 are used for ad-hoc testing.
|
||||
# The account number and private key pairs of the last 20 accounts can be found in the Register memberships section of the Logos Delivery Simulator book.
|
||||
# Accounts are hardcoded to 520 with the idea that nwaku nodes use up to 500 for membership registration and the last 20 are used for ad-hoc testing.
|
||||
# The account number and private key pairs of the last 20 accounts can be found in the Register memberships section of the Logos Delivery Simulator book.
|
||||
foundry:
|
||||
image: ghcr.io/foundry-rs/foundry:nightly-9b73e06e1fe376738b92ae081107620291d50188
|
||||
labels:
|
||||
com.centurylinklabs.watchtower.enable: '${WATCHTOWER_ENABLED:-false}'
|
||||
com.centurylinklabs.watchtower.enable: "${WATCHTOWER_ENABLED:-false}"
|
||||
ports:
|
||||
- 0.0.0.0:8545:8545
|
||||
command:
|
||||
@ -38,7 +37,7 @@ services:
|
||||
contract-repo-deployer:
|
||||
image: node:hydrogen-bookworm
|
||||
labels:
|
||||
com.centurylinklabs.watchtower.enable: '${WATCHTOWER_ENABLED:-false}'
|
||||
com.centurylinklabs.watchtower.enable: "${WATCHTOWER_ENABLED:-false}"
|
||||
environment:
|
||||
- RLN_CONTRACT_REPO_COMMIT=${RLN_CONTRACT_REPO_COMMIT:-e75ac913e579ad872f54b2225eec35d1de3d98b0}
|
||||
- PRIVATE_KEY=${PRIVATE_KEY}
|
||||
@ -47,7 +46,7 @@ services:
|
||||
- NUM_LD_NODES=${NUM_LD_NODES:-5}
|
||||
entrypoint: sh
|
||||
command:
|
||||
- '/opt/deploy_rln_contract.sh'
|
||||
- "/opt/deploy_rln_contract.sh"
|
||||
volumes:
|
||||
- ./deploy_rln_contract.sh:/opt/deploy_rln_contract.sh
|
||||
- privatekeys-volume:/shared
|
||||
@ -60,7 +59,7 @@ services:
|
||||
image: ${LD_IMAGE:-wakuorg/nwaku:latest}
|
||||
restart: on-failure
|
||||
labels:
|
||||
com.centurylinklabs.watchtower.enable: '${WATCHTOWER_ENABLED:-false}'
|
||||
com.centurylinklabs.watchtower.enable: "${WATCHTOWER_ENABLED:-false}"
|
||||
# TODO: expose some ports to inject traffic
|
||||
ports:
|
||||
- 127.0.0.1:60000:60000
|
||||
@ -69,7 +68,7 @@ services:
|
||||
- 127.0.0.1:8645:8645
|
||||
entrypoint: sh
|
||||
command:
|
||||
- '/opt/run_bootstrap.sh'
|
||||
- "/opt/run_bootstrap.sh"
|
||||
volumes:
|
||||
- ./run_bootstrap.sh:/opt/run_bootstrap.sh:Z
|
||||
networks:
|
||||
@ -79,7 +78,7 @@ services:
|
||||
image: ${LD_IMAGE:-wakuorg/nwaku:latest}
|
||||
restart: on-failure
|
||||
labels:
|
||||
com.centurylinklabs.watchtower.enable: '${WATCHTOWER_ENABLED:-false}'
|
||||
com.centurylinklabs.watchtower.enable: "${WATCHTOWER_ENABLED:-false}"
|
||||
deploy:
|
||||
replicas: ${NUM_LD_NODES:-5}
|
||||
entrypoint: sh
|
||||
@ -93,7 +92,7 @@ services:
|
||||
- TOKEN_ADDRESS=${TOKEN_ADDRESS:-0xe7f1725E7734CE288F8367e1Bb143E90bb3F0512}
|
||||
- PRIVATE_KEY=${PRIVATE_KEY}
|
||||
command:
|
||||
- '/opt/run_nwaku.sh'
|
||||
- "/opt/run_nwaku.sh"
|
||||
volumes:
|
||||
- ./run_nwaku.sh:/opt/run_nwaku.sh:Z
|
||||
- privatekeys-volume:/shared
|
||||
@ -125,15 +124,27 @@ services:
|
||||
condition: service_completed_successfully
|
||||
networks:
|
||||
- simulation
|
||||
|
||||
rest-traffic:
|
||||
|
||||
traffic-post:
|
||||
build:
|
||||
context: ./tools/rest-traffic
|
||||
context: ./tools/traffic-post
|
||||
dockerfile: Dockerfile
|
||||
command:
|
||||
--multiple-nodes=http://logos-delivery-simulator_nwaku_[1..${NUM_LD_NODES:-5}]:8645
|
||||
--multiple-nodes=http://logos-delivery-simulator-nwaku-[1..${NUM_LD_NODES:-5}]:8645
|
||||
--msg-size-kbytes=${MSG_SIZE_KBYTES:-10}
|
||||
--delay-seconds=${TRAFFIC_DELAY_SECONDS:-15}
|
||||
--delay-seconds=${TRAFFIC_DELAY_SECONDS:-30}
|
||||
restart: on-failure
|
||||
networks:
|
||||
- simulation
|
||||
depends_on:
|
||||
- nwaku
|
||||
|
||||
traffic-subscribe:
|
||||
build:
|
||||
context: ./tools/traffic-subscribe
|
||||
dockerfile: Dockerfile
|
||||
command: --multiple-nodes=http://logos-delivery-simulator-nwaku-[1..${NUM_LD_NODES:-5}]:8645
|
||||
restart: on-failure
|
||||
networks:
|
||||
- simulation
|
||||
depends_on:
|
||||
@ -265,4 +276,4 @@ services:
|
||||
- simulation
|
||||
|
||||
volumes:
|
||||
privatekeys-volume:
|
||||
privatekeys-volume:
|
||||
|
||||
@ -133,6 +133,9 @@ exec /usr/bin/wakunode\
|
||||
--rest=true\
|
||||
--rest-address=0.0.0.0\
|
||||
--rest-port=8645\
|
||||
--websocket-support=true\
|
||||
--websocket-port=8000\
|
||||
--filter=true\
|
||||
--rln-relay=true\
|
||||
--rln-relay-dynamic=true\
|
||||
--rln-relay-eth-client-address="$RPC_URL"\
|
||||
|
||||
@ -1,11 +0,0 @@
|
||||
FROM python:3.9-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY requirements.txt requirements.txt
|
||||
|
||||
RUN pip install --no-cache-dir -r requirements.txt
|
||||
|
||||
COPY . .
|
||||
|
||||
ENTRYPOINT ["python", "./traffic.py"]
|
||||
@ -1,16 +0,0 @@
|
||||
# rest-traffic
|
||||
|
||||
Test utility for [nwaku](https://github.com/waku-org/nwaku).
|
||||
Given the REST API endpoint, it injects traffic with a given message size at a given rate.
|
||||
|
||||
See usage:
|
||||
```
|
||||
./python traffic.py ---help
|
||||
```
|
||||
|
||||
Use with docker:
|
||||
```
|
||||
build:
|
||||
context: ./tools/rest-traffic
|
||||
dockerfile: Dockerfile
|
||||
```
|
||||
@ -1,2 +0,0 @@
|
||||
requests==2.32.3
|
||||
argparse==1.4.0
|
||||
14
tools/traffic-post/Dockerfile
Normal file
14
tools/traffic-post/Dockerfile
Normal file
@ -0,0 +1,14 @@
|
||||
FROM python:3.9-slim
|
||||
|
||||
COPY --from=ghcr.io/astral-sh/uv:latest /uv /uvx /bin/
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY pyproject.toml uv.lock ./
|
||||
|
||||
RUN uv sync --frozen --no-install-project
|
||||
|
||||
COPY . .
|
||||
|
||||
ENTRYPOINT ["uv", "run", "traffic.py"]
|
||||
|
||||
24
tools/traffic-post/README.md
Normal file
24
tools/traffic-post/README.md
Normal file
@ -0,0 +1,24 @@
|
||||
# rest-traffic
|
||||
|
||||
Test utility for [nwaku](https://github.com/waku-org/nwaku).
|
||||
Given the REST API endpoint, it injects traffic with a given message size at a given rate.
|
||||
|
||||
See usage:
|
||||
```
|
||||
uv run traffic.py --help
|
||||
```
|
||||
|
||||
Use with docker:
|
||||
```
|
||||
build:
|
||||
context: ./tools/traffic-post
|
||||
dockerfile: Dockerfile
|
||||
```
|
||||
|
||||
Run outside docker:
|
||||
```
|
||||
IP=$(docker inspect logos-delivery-simulator-nwaku-1 -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}')
|
||||
uv run traffic.py --single-node=http://$IP:8645
|
||||
```
|
||||
|
||||
|
||||
9
tools/traffic-post/pyproject.toml
Normal file
9
tools/traffic-post/pyproject.toml
Normal file
@ -0,0 +1,9 @@
|
||||
[project]
|
||||
name = "traffic-post"
|
||||
version = "0.1.0"
|
||||
readme = "README.md"
|
||||
requires-python = ">=3.13"
|
||||
dependencies = [
|
||||
"argparse>=1.4.0",
|
||||
"requests>=2.34.2",
|
||||
]
|
||||
@ -16,7 +16,7 @@ def send_waku_msg(node_address, kbytes, pubsub_topic, content_topic):
|
||||
body = {
|
||||
"payload": base64_payload,
|
||||
"contentTopic": content_topic,
|
||||
"version": 1, # You can adjust the version as needed
|
||||
"version": 0, # You can adjust the version as needed
|
||||
"timestamp": int(time.time() * 1_000_000_000) # use nanoseconds to match nwaku node time unit
|
||||
}
|
||||
|
||||
@ -101,4 +101,4 @@ while True:
|
||||
else:
|
||||
logging.info("No sleep needed to maintain delay of %d seconds between rounds", args.delay_seconds)
|
||||
|
||||
time.sleep(max(0, time_to_sleep))
|
||||
time.sleep(max(0, time_to_sleep))
|
||||
126
tools/traffic-post/uv.lock
generated
Normal file
126
tools/traffic-post/uv.lock
generated
Normal file
@ -0,0 +1,126 @@
|
||||
version = 1
|
||||
revision = 3
|
||||
requires-python = ">=3.13"
|
||||
|
||||
[[package]]
|
||||
name = "argparse"
|
||||
version = "1.4.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/18/dd/e617cfc3f6210ae183374cd9f6a26b20514bbb5a792af97949c5aacddf0f/argparse-1.4.0.tar.gz", hash = "sha256:62b089a55be1d8949cd2bc7e0df0bddb9e028faefc8c32038cc84862aefdd6e4", size = 70508, upload-time = "2015-09-12T20:22:16.217Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/f2/94/3af39d34be01a24a6e65433d19e107099374224905f1e0cc6bbe1fd22a2f/argparse-1.4.0-py2.py3-none-any.whl", hash = "sha256:c31647edb69fd3d465a847ea3157d37bed1f95f19760b11a47aa91c04b666314", size = 23000, upload-time = "2015-09-14T16:03:16.137Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "certifi"
|
||||
version = "2026.5.20"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/f3/ce/ee2ecad540810a79593028e88299baeae54d346cc7a0d94b6199988b89b1/certifi-2026.5.20.tar.gz", hash = "sha256:69dea482ab64caa7b9f6aba1c6bf48bb6a5448d1c0f1b17ab42ad8c763a5344d", size = 135422, upload-time = "2026-05-20T11:46:50.073Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/59/8c/57e832b7af6d7c5abe66eb3fbe3a3a32f4d11ea23a1aa7131371035be991/certifi-2026.5.20-py3-none-any.whl", hash = "sha256:3c52e209ba0a4ad7aebe60436a4ab349c39e1e602e8c134221e546902ad25897", size = 134134, upload-time = "2026-05-20T11:46:48.578Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "charset-normalizer"
|
||||
version = "3.4.7"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "3.18"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "requests"
|
||||
version = "2.34.2"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "certifi" },
|
||||
{ name = "charset-normalizer" },
|
||||
{ name = "idna" },
|
||||
{ name = "urllib3" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "traffic-post"
|
||||
version = "0.1.0"
|
||||
source = { virtual = "." }
|
||||
dependencies = [
|
||||
{ name = "argparse" },
|
||||
{ name = "requests" },
|
||||
]
|
||||
|
||||
[package.metadata]
|
||||
requires-dist = [
|
||||
{ name = "argparse", specifier = ">=1.4.0" },
|
||||
{ name = "requests", specifier = ">=2.34.2" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "urllib3"
|
||||
version = "2.7.0"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" },
|
||||
]
|
||||
12
tools/traffic-subscribe/Dockerfile
Normal file
12
tools/traffic-subscribe/Dockerfile
Normal file
@ -0,0 +1,12 @@
|
||||
FROM node:22-slim
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY package.json package-lock.json* ./
|
||||
|
||||
RUN npm ci
|
||||
|
||||
COPY . .
|
||||
|
||||
ENTRYPOINT ["node", "index.ts"]
|
||||
|
||||
25
tools/traffic-subscribe/README.md
Normal file
25
tools/traffic-subscribe/README.md
Normal file
@ -0,0 +1,25 @@
|
||||
# rest-traffic
|
||||
|
||||
Test utility for [nwaku](https://github.com/waku-org/nwaku).
|
||||
Given the REST API endpoint, it injects traffic with a given message size at a given rate.
|
||||
|
||||
See usage:
|
||||
```
|
||||
node index.ts --help
|
||||
```
|
||||
|
||||
Use with docker:
|
||||
```
|
||||
build:
|
||||
context: ./tools/traffic-subscribe
|
||||
dockerfile: Dockerfile
|
||||
```
|
||||
|
||||
|
||||
Run outside docker:
|
||||
```
|
||||
IP=$(docker inspect logos-delivery-simulator-nwaku-1 -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}')
|
||||
node index.ts --single-node=http://$IP:8645
|
||||
```
|
||||
|
||||
|
||||
126
tools/traffic-subscribe/index.ts
Normal file
126
tools/traffic-subscribe/index.ts
Normal file
@ -0,0 +1,126 @@
|
||||
import { createLightNode, WakuEvent, Protocols } from "@waku/sdk";
|
||||
import type { IDecodedMessage } from "@waku/sdk";
|
||||
import { program } from "commander";
|
||||
import { EnrDecoder } from "@waku/enr";
|
||||
|
||||
const DEFAULT_NODE = "http://logos-delivery-simulator-nwaku-1:8645";
|
||||
|
||||
program
|
||||
.option("-t, --content-topic <string>", "Content topic", "my-ctopic")
|
||||
.option("-s, --shard-id <number>", "Shard ID", parseInt, 0)
|
||||
.option("-c, --cluster-id <number>", "Cluster ID", parseInt, 66)
|
||||
.option(
|
||||
"--single-node <string>",
|
||||
"example: http://logos-delivery-simulator-nwaku-1:8645",
|
||||
)
|
||||
.option(
|
||||
"--multiple-nodes <string>",
|
||||
"example: http://logos-delivery-simulator-nwaku-[1..10]:8645",
|
||||
)
|
||||
.parse(process.argv);
|
||||
|
||||
const {
|
||||
contentTopic: CONTENT_TOPIC,
|
||||
shardId: SHARD_ID,
|
||||
clusterId: CLUSTER_ID,
|
||||
singleNode: SINGLE_NODE,
|
||||
multipleNodes: MULTIPLE_NODES,
|
||||
} = program.opts();
|
||||
|
||||
if (SINGLE_NODE && MULTIPLE_NODES) {
|
||||
console.error(
|
||||
"Error: --single-node and --multiple-nodes are mutually exclusive.",
|
||||
);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// Expands "http://host-[1..5]:8645" → ["http://host-1:8645", ..., "http://host-5:8645"]
|
||||
function expandNodePattern(pattern: string): string[] {
|
||||
const match = pattern.match(/^(.*)\[(\d+)\.\.(\d+)\](.*)$/);
|
||||
if (!match) return [pattern];
|
||||
|
||||
const [, prefix, startStr, endStr, suffix] = match;
|
||||
const start = parseInt(startStr);
|
||||
const end = parseInt(endStr);
|
||||
|
||||
return Array.from(
|
||||
{ length: end - start + 1 },
|
||||
(_, i) => `${prefix}${start + i}${suffix}`,
|
||||
);
|
||||
}
|
||||
|
||||
function resolveNodeUrls(): string[] {
|
||||
if (MULTIPLE_NODES) return expandNodePattern(MULTIPLE_NODES);
|
||||
return [SINGLE_NODE ?? DEFAULT_NODE];
|
||||
}
|
||||
|
||||
async function enrToMultiaddrs(enrString: string): Promise<string[]> {
|
||||
try {
|
||||
const enr = await EnrDecoder.fromString(enrString);
|
||||
return enr.getFullMultiaddrs().map((addr) => addr.toString());
|
||||
} catch {
|
||||
return [];
|
||||
}
|
||||
}
|
||||
|
||||
async function fetchBootstrapPeers(): Promise<string[]> {
|
||||
const nodeUrls = resolveNodeUrls();
|
||||
console.log(`Fetching peers from ${nodeUrls.length} node(s):`, nodeUrls);
|
||||
|
||||
const results = await Promise.allSettled(
|
||||
nodeUrls.map(async (url) => {
|
||||
const res = await fetch(`${url}/info`);
|
||||
const { enrUri } = await res.json();
|
||||
return enrToMultiaddrs(enrUri);
|
||||
}),
|
||||
);
|
||||
|
||||
const multiaddrs = results.flatMap((r) =>
|
||||
r.status === "fulfilled" ? r.value : [],
|
||||
);
|
||||
console.log("Bootstrap peers:", multiaddrs);
|
||||
return multiaddrs;
|
||||
}
|
||||
|
||||
// Main
|
||||
|
||||
async function initLocalWakuClient() {
|
||||
const bootstrapPeers = await fetchBootstrapPeers();
|
||||
|
||||
const node = await createLightNode({
|
||||
defaultBootstrap: false,
|
||||
bootstrapPeers,
|
||||
discovery: { peerExchange: true },
|
||||
libp2p: { filterMultiaddrs: false },
|
||||
networkConfig: { clusterId: CLUSTER_ID },
|
||||
});
|
||||
|
||||
node.events.addEventListener(WakuEvent.Health, ({ detail }) =>
|
||||
console.log("Health:", detail),
|
||||
);
|
||||
|
||||
await node.start();
|
||||
await node.waitForPeers([Protocols.LightPush, Protocols.Filter], 30_000);
|
||||
node.lightPush.start();
|
||||
|
||||
const topicConfig = { contentTopic: CONTENT_TOPIC, shardId: SHARD_ID };
|
||||
const decoder = node.createDecoder(topicConfig);
|
||||
|
||||
console.log("Subscribing to filter updates...");
|
||||
|
||||
await node.filter.subscribe([decoder], (message: IDecodedMessage) => {
|
||||
if (message?.payload) {
|
||||
console.log("📩 Received message", {
|
||||
topic: message.contentTopic,
|
||||
size: message.payload.byteLength,
|
||||
});
|
||||
} else {
|
||||
console.warn("⚠️ Received empty message frame.");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
initLocalWakuClient().catch((error) => {
|
||||
console.error("Fatal error:", error);
|
||||
process.exit(1);
|
||||
});
|
||||
1928
tools/traffic-subscribe/package-lock.json
generated
Normal file
1928
tools/traffic-subscribe/package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
18
tools/traffic-subscribe/package.json
Normal file
18
tools/traffic-subscribe/package.json
Normal file
@ -0,0 +1,18 @@
|
||||
{
|
||||
"name": "traffic-subscribe",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"@waku/enr": "^0.0.33",
|
||||
"@waku/sdk": "^0.0.36",
|
||||
"commander": "^15.0.0"
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user