Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
Show all changes
20 commits
Select commit Hold shift + click to select a range
e519ba7
ci: prototype bulletin-polkadot in integration-test matrix
x3c41a May 8, 2026
dddc177
ci: drop continue-on-error from bulletin-polkadot steps
x3c41a May 8, 2026
d5220ad
ci: drop em dash from comment
x3c41a May 8, 2026
9e44eb1
ci: split experimental runtimes into dedicated job
x3c41a May 8, 2026
6280ce1
Merge branch 'main' into ndk/issue-507-bulletin-polkadot-ci
x3c41a May 8, 2026
768da56
Merge branch 'main' into ndk/issue-507-bulletin-polkadot-ci
bkontur May 9, 2026
2e98756
ci: run bulletin-polkadot through the regular integration-tests job
x3c41a May 11, 2026
4574f5e
ci: split external runtime build out of the spec script
x3c41a May 13, 2026
0f86c8e
ci: run check-migrations against bulletin-polkadot via external build
x3c41a May 14, 2026
6551097
Merge remote-tracking branch 'origin/main' into ndk/issue-507-bulleti…
x3c41a May 14, 2026
ce61364
ci: point bulletin-polkadot matrix at the configurable-authorizers port
x3c41a May 15, 2026
7bd69d2
Merge branch 'main' into ndk/issue-507-bulletin-polkadot-ci
x3c41a May 15, 2026
db5ee99
Merge remote-tracking branch 'origin/main' into ndk/issue-507-bulleti…
x3c41a May 18, 2026
ace00fa
Merge branch 'main' into ndk/issue-507-bulletin-polkadot-ci
x3c41a May 21, 2026
bf23a77
Merge branch 'main' into ndk/issue-507-bulletin-polkadot-ci
x3c41a May 25, 2026
23075f7
ci: enable HOP and add charlie validator in bulletin-polkadot zombienet
x3c41a May 26, 2026
b666aad
examples/ts: detect Sudo before wrapping authorize_account
x3c41a May 26, 2026
e6972ab
examples/ts: drop sudo wrap unconditionally
x3c41a May 26, 2026
cfa32ab
Merge branch 'main' into ndk/issue-507-bulletin-polkadot-ci
x3c41a May 26, 2026
320783a
trim verbose comments
x3c41a May 27, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
101 changes: 96 additions & 5 deletions .github/workflows/integration-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -103,19 +103,23 @@ jobs:
runs-on: ubuntu-latest
outputs:
runtime: ${{ steps.runtime.outputs.runtime }}
runtime_experimental: ${{ steps.runtime.outputs.runtime_experimental }}
name: Extract tasks from matrix
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6
- id: runtime
run: |
TASKS=$(jq '[.[] | select(.integration_tests == true)]' scripts/runtimes-matrix.json)
TASKS=$(jq '[.[] | select(.integration_tests == true and (.experimental // false) == false)]' scripts/runtimes-matrix.json)
EXPERIMENTAL=$(jq '[.[] | select(.integration_tests == true and (.experimental // false) == true)]' scripts/runtimes-matrix.json)
SKIPPED=$(jq '[.[] | select(.integration_tests != true)]' scripts/runtimes-matrix.json)
echo "--- Running integration tests for ---"
echo "--- Running full integration tests for ---"
echo "$TASKS"
echo "--- Running experimental smoke tests for ---"
echo "$EXPERIMENTAL"
echo "--- Skipping integration tests for ---"
echo "$SKIPPED"
TASKS=$(echo "$TASKS" | jq -c .)
echo "runtime=$TASKS" >> $GITHUB_OUTPUT
echo "runtime=$(echo "$TASKS" | jq -c .)" >> $GITHUB_OUTPUT
echo "runtime_experimental=$(echo "$EXPERIMENTAL" | jq -c .)" >> $GITHUB_OUTPUT

integration-tests:
needs: [set-image, setup, runtime-matrix]
Expand Down Expand Up @@ -268,9 +272,96 @@ jobs:
path: |
${{ env.TEST_DIR }}/*.log

# Smoke tests for runtimes flagged `experimental` in runtimes-matrix.json.
# The bulletin-polkadot Fellows runtime exposes neither Sudo nor TestAccounts,
# so signed `authorize_account` paths exercised by the full suite don't apply.
# Verify chain-up and chopsticks compatibility only.
integration-tests-experimental:
Comment thread
x3c41a marked this conversation as resolved.
Outdated
needs: [set-image, setup, runtime-matrix]
if: ${{ needs.runtime-matrix.outputs.runtime_experimental != '[]' }}
name: Integration Tests (${{ matrix.runtime.name }}, experimental)
runs-on: parity-large
container:
image: ${{ needs.set-image.outputs.CI_IMAGE }}
timeout-minutes: 60
strategy:
fail-fast: false
matrix:
runtime: ${{ fromJSON(needs.runtime-matrix.outputs.runtime_experimental) }}

steps:
- name: Checkout sources
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6

- name: Load common environment variables via env file
run: cat .github/env >> $GITHUB_ENV

- name: Rust cache (Bulletin)
uses: Swatinem/rust-cache@c19371144df3bb44fab255c43d04cbc2ab54d1c4 # v2.9.1
with:
workspaces: .
shared-key: "bulletin-cache-bulletin-integration-tests-experimental-${{ matrix.runtime.name }}"
save-if: ${{ github.ref == 'refs/heads/main' }}

- name: Setup Node.js
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
with:
node-version: ${{ env.NODE_VERSION }}
cache: 'npm'
cache-dependency-path: examples/package.json

- name: Install just
run: cargo install just --locked || true

- name: Cache Polkadot SDK binaries
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
with:
path: ${{ env.POLKADOT_SDK_BIN_DIR }}
key: polkadot-sdk-${{ env.POLKADOT_SDK_VERSION }}-binaries
- name: Cache Zombienet
uses: actions/cache@27d5ce7f107fe9357f9df03efb73ab90386fccae # v5
with:
path: ${{ env.ZOMBIENET_BIN_DIR }}
key: zombienet-${{ env.ZOMBIENET_VERSION }}-binaries
- name: Add binaries to PATH
run: |
chmod +x "${POLKADOT_SDK_BIN_DIR}"/*
chmod +x "${ZOMBIENET_BIN_DIR}"/*
echo "${POLKADOT_SDK_BIN_DIR}" >> "$GITHUB_PATH"
echo "${ZOMBIENET_BIN_DIR}" >> "$GITHUB_PATH"
echo "SKIP_PARACHAIN_SETUP=1" >> "$GITHUB_ENV"
echo "ZOMBIENET_BINARY=zombienet-linux-x64" >> "$GITHUB_ENV"

- name: Start services
working-directory: examples
env:
RUNTIME_PACKAGE: ${{ matrix.runtime.package }}
run: |
TEST_DIR="$(mktemp -d $GITHUB_WORKSPACE/bulletin-tests-run-XXXXX)/test"
echo "TEST_DIR=$TEST_DIR" >> "$GITHUB_ENV"
echo "RUNTIME_PACKAGE=${RUNTIME_PACKAGE}" >> "$GITHUB_ENV"
just KUBO_VERSION="${KUBO_VERSION}" start-services "$TEST_DIR" "$RUNTIME_PACKAGE" "kubo-native"

- name: Test chopsticks compatibility
working-directory: examples
run: just run-test-chopsticks "ws://127.0.0.1:10000"

- name: Stop services
if: always()
working-directory: examples
run: just KUBO_VERSION="${KUBO_VERSION}" stop-services "$TEST_DIR" "kubo-native"

- name: Upload Zombienet logs (on failure)
if: failure()
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
with:
name: failed-zombienet-logs-${{ matrix.runtime.name }}
path: |
${{ env.TEST_DIR }}/*.log

integration-tests-complete:
name: All integration tests passed
needs: [changes, integration-tests]
needs: [changes, integration-tests, integration-tests-experimental]
if: always()
runs-on: ubuntu-latest
steps:
Expand Down
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -47,3 +47,4 @@ console-ui/playwright/.cache/
# Specs for zombienet (need to be fresh)
zombienet/bulletin-westend-spec.json
zombienet/bulletin-paseo-spec.json
zombienet/bulletin-polkadot-spec.json
17 changes: 16 additions & 1 deletion examples/justfile
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,9 @@ bulletin-parachain-zombienet-start test_dir runtime="bulletin-westend-runtime":
elif [ "{{ runtime }}" = "bulletin-paseo-runtime" ]; then
SPEC_SCRIPT="create_bulletin_paseo_spec.sh"
ZOMBIENET_TOML="zombienet/bulletin-paseo-local.toml"
elif [ "{{ runtime }}" = "bulletin-polkadot-runtime" ]; then
SPEC_SCRIPT="create_bulletin_polkadot_spec.sh"
ZOMBIENET_TOML="zombienet/bulletin-polkadot-local.toml"
else
echo "❌ Unhandled runtime: {{ runtime }}"
exit 1
Expand Down Expand Up @@ -227,6 +230,10 @@ PASEO_PEER1_ID := "12D3KooWKjTeRJH8nMcFytc7qTTCQy7JrFgiZFr7iUjd1aPEBn8v"
PASEO_PEER1_PORT := "10001"
PASEO_PEER2_ID := "12D3KooWM8qgmWsh9ddbdX3kqR7W8tWuh62zhsdpwfs81eSnQuaH"
PASEO_PEER2_PORT := "12347"
POLKADOT_PEER1_ID := "12D3KooWGgRm1jr8y5qKQYBAvjwfufdSVTLUnzeJacFdUmR8Sqvt"
POLKADOT_PEER1_PORT := "10001"
POLKADOT_PEER2_ID := "12D3KooWMbdwf9fEURv6BAAEBXM3raYDdcWCZYfiZA4eZHaFjYPd"
POLKADOT_PEER2_PORT := "12347"


# Download and install Kubo IPFS binary
Expand Down Expand Up @@ -299,6 +306,8 @@ ipfs-kubo-start test_dir runtime: ipfs-kubo-install
PEERS='[{"ID":"{{ WESTEND_PEER1_ID }}","Addrs":["/ip4/127.0.0.1/tcp/{{ WESTEND_PEER1_PORT }}/ws"]},{"ID":"{{ WESTEND_PEER2_ID }}","Addrs":["/ip4/127.0.0.1/tcp/{{ WESTEND_PEER2_PORT }}/ws"]}]'
elif [ "{{ runtime }}" = "bulletin-paseo-runtime" ]; then
PEERS='[{"ID":"{{ PASEO_PEER1_ID }}","Addrs":["/ip4/127.0.0.1/tcp/{{ PASEO_PEER1_PORT }}/ws"]},{"ID":"{{ PASEO_PEER2_ID }}","Addrs":["/ip4/127.0.0.1/tcp/{{ PASEO_PEER2_PORT }}/ws"]}]'
elif [ "{{ runtime }}" = "bulletin-polkadot-runtime" ]; then
PEERS='[{"ID":"{{ POLKADOT_PEER1_ID }}","Addrs":["/ip4/127.0.0.1/tcp/{{ POLKADOT_PEER1_PORT }}/ws"]},{"ID":"{{ POLKADOT_PEER2_ID }}","Addrs":["/ip4/127.0.0.1/tcp/{{ POLKADOT_PEER2_PORT }}/ws"]}]'
else
echo "❌ Unhandled runtime: {{ runtime }}"
exit 1
Expand Down Expand Up @@ -430,6 +439,8 @@ ipfs-start test_dir runtime: _check-docker
PEERS="[{\"ID\":\"{{ WESTEND_PEER1_ID }}\",\"Addrs\":[\"${PEER_ADDR}/tcp/{{ WESTEND_PEER1_PORT }}/ws\"]},{\"ID\":\"{{ WESTEND_PEER2_ID }}\",\"Addrs\":[\"${PEER_ADDR}/tcp/{{ WESTEND_PEER2_PORT }}/ws\"]}]"
elif [ "{{ runtime }}" = "bulletin-paseo-runtime" ]; then
PEERS="[{\"ID\":\"{{ PASEO_PEER1_ID }}\",\"Addrs\":[\"${PEER_ADDR}/tcp/{{ PASEO_PEER1_PORT }}/ws\"]},{\"ID\":\"{{ PASEO_PEER2_ID }}\",\"Addrs\":[\"${PEER_ADDR}/tcp/{{ PASEO_PEER2_PORT }}/ws\"]}]"
elif [ "{{ runtime }}" = "bulletin-polkadot-runtime" ]; then
PEERS="[{\"ID\":\"{{ POLKADOT_PEER1_ID }}\",\"Addrs\":[\"${PEER_ADDR}/tcp/{{ POLKADOT_PEER1_PORT }}/ws\"]},{\"ID\":\"{{ POLKADOT_PEER2_ID }}\",\"Addrs\":[\"${PEER_ADDR}/tcp/{{ POLKADOT_PEER2_PORT }}/ws\"]}]"
else
echo "❌ Unhandled runtime: {{ runtime }}"
exit 1
Expand Down Expand Up @@ -494,7 +505,7 @@ setup-services test_dir runtime ipfs_mode="kubo-docker": npm-install
#!/usr/bin/env bash
set -e

if [ "{{ runtime }}" = "bulletin-westend-runtime" ] || [ "{{ runtime }}" = "bulletin-paseo-runtime" ]; then
if [ "{{ runtime }}" = "bulletin-westend-runtime" ] || [ "{{ runtime }}" = "bulletin-paseo-runtime" ] || [ "{{ runtime }}" = "bulletin-polkadot-runtime" ]; then
just bulletin-parachain-zombienet-start "{{ test_dir }}" "{{ runtime }}"
else
echo "❌ Unhandled runtime: {{ runtime }} specified!"
Expand Down Expand Up @@ -591,6 +602,8 @@ run-test-authorize-and-store test_dir runtime mode="ws" ws_url="ws://127.0.0.1:1
PARACHAIN_CHAINSPEC_PATH="{{ test_dir }}/bulletin-westend-collator-2/cfg/westend-local-1010.json"
elif [ "{{ runtime }}" = "bulletin-paseo-runtime" ]; then
PARACHAIN_CHAINSPEC_PATH="{{ test_dir }}/bulletin-paseo-collator-2/cfg/westend-local-1501.json"
elif [ "{{ runtime }}" = "bulletin-polkadot-runtime" ]; then
PARACHAIN_CHAINSPEC_PATH="{{ test_dir }}/bulletin-polkadot-collator-2/cfg/westend-local-1010.json"
else
echo "❌ Unhandled runtime: {{ runtime }}"
exit 1
Expand Down Expand Up @@ -800,6 +813,8 @@ run-authorize-and-store runtime mode="ws" ipfs_mode="kubo-docker": npm-install
PARACHAIN_CHAINSPEC_PATH="$TEST_DIR/bulletin-westend-collator-2/cfg/westend-local-1010.json"
elif [ "{{ runtime }}" = "bulletin-paseo-runtime" ]; then
PARACHAIN_CHAINSPEC_PATH="$TEST_DIR/bulletin-paseo-collator-2/cfg/westend-local-1501.json"
elif [ "{{ runtime }}" = "bulletin-polkadot-runtime" ]; then
PARACHAIN_CHAINSPEC_PATH="$TEST_DIR/bulletin-polkadot-collator-2/cfg/westend-local-1010.json"
else
echo "❌ Unhandled runtime: {{ runtime }}"
exit 1
Expand Down
59 changes: 59 additions & 0 deletions scripts/create_bulletin_polkadot_spec.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
#!/usr/bin/env bash
#
# Build the bulletin-polkadot runtime WASM from the Polkadot Fellows
# `runtimes` repo and generate the chain spec used by the local zombienet
# config.
#
# The runtime is not part of this Cargo workspace, so we clone the upstream
# repository at a configurable ref and build it out-of-tree.
#
# Override the source via env vars (defaults track Fellows PR #1170):
# FELLOWS_RUNTIMES_REPO - git URL (default: bkontur/runtimes fork)
# FELLOWS_RUNTIMES_REF - branch / tag / sha (default: bko-bulletin-stage1)
# FELLOWS_RUNTIMES_DIR - local checkout dir (default: target/fellows-runtimes)

set -e

SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ROOT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"

FELLOWS_RUNTIMES_REPO="${FELLOWS_RUNTIMES_REPO:-https://github.com/bkontur/runtimes.git}"
FELLOWS_RUNTIMES_REF="${FELLOWS_RUNTIMES_REF:-bko-bulletin-stage1}"
FELLOWS_RUNTIMES_DIR="${FELLOWS_RUNTIMES_DIR:-$ROOT_DIR/target/fellows-runtimes}"
Comment thread
x3c41a marked this conversation as resolved.
Outdated

mkdir -p "$(dirname "$FELLOWS_RUNTIMES_DIR")"

if [ ! -d "$FELLOWS_RUNTIMES_DIR/.git" ]; then
echo "📥 Cloning $FELLOWS_RUNTIMES_REPO into $FELLOWS_RUNTIMES_DIR..."
git clone --filter=blob:none "$FELLOWS_RUNTIMES_REPO" "$FELLOWS_RUNTIMES_DIR"
else
echo "♻️ Reusing existing checkout at $FELLOWS_RUNTIMES_DIR"
git -C "$FELLOWS_RUNTIMES_DIR" remote set-url origin "$FELLOWS_RUNTIMES_REPO"
fi

echo "🔀 Fetching ref: $FELLOWS_RUNTIMES_REF..."
git -C "$FELLOWS_RUNTIMES_DIR" fetch --depth 1 origin "$FELLOWS_RUNTIMES_REF"
git -C "$FELLOWS_RUNTIMES_DIR" checkout -q FETCH_HEAD

echo "🔨 Building bulletin-polkadot-runtime..."
(cd "$FELLOWS_RUNTIMES_DIR" && cargo build --release -p bulletin-polkadot-runtime)

WASM_PATH="$FELLOWS_RUNTIMES_DIR/target/release/wbuild/bulletin-polkadot-runtime/bulletin_polkadot_runtime.compact.compressed.wasm"
if [ ! -f "$WASM_PATH" ]; then
echo "❌ Expected WASM not found at: $WASM_PATH"
exit 1
fi

cd "$ROOT_DIR"

chain-spec-builder create \
-p 1010 \
-c westend \
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

westend?

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah, per @bkontur comment below: for now westend is ok. we will change it to polkadot-local relay later on...

-i bulletin-polkadot \
-n Bulletin \
-t local \
-r "$WASM_PATH" \
named-preset local_testnet

mv chain_spec.json ./zombienet/bulletin-polkadot-spec.json
echo "✅ Wrote ./zombienet/bulletin-polkadot-spec.json"
12 changes: 12 additions & 0 deletions scripts/runtimes-matrix.json
Original file line number Diff line number Diff line change
Expand Up @@ -31,5 +31,17 @@
"pallet_xcm_benchmarks::generic": "templates/xcm-bench-template.hbs",
"pallet_xcm_benchmarks::fungible": "templates/xcm-bench-template.hbs"
}
},
{
"name": "bulletin-polkadot",
"package": "bulletin-polkadot-runtime",
"path": "external/fellows-runtimes/system-parachains/bulletin/bulletin-polkadot",
Comment thread
x3c41a marked this conversation as resolved.
Outdated
"uris": [],
Comment thread
x3c41a marked this conversation as resolved.
Outdated
"integration_tests": true,
"experimental": true,
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the divide between experimental and not?

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

What's the divide between experimental and not?

yes, no experimental, point is to add to the runtimes-matrix.json (and do the very minimalistic changes on the way - only where is really needed - justfile, chain-spec script + zombienet, the important one is to run correct bulletin-polkadot-local.toml (for now westend is ok, we will chain with polkadot-local relay later) + scripts/create_bulletin_polkadot_spec.sh which will checkout that branch - this can be hard-coded here or I like external_runtime) and it should run

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, no experimental, point is to add to the runtimes-matrix.json (...) and it should run

did that but the CI failed. The Authorizer is Root | EnsureXcm<Equals<PeopleLocation>>. So it accepts either Root or XCM from People. None of them work with local zombie-net.
We can:

  1. either have a smoke-only job (chain-up + chopsticks)
  2. or add #[cfg(feature = "test-accounts")] EnsureSignedBy<TestAccounts, _> to the Authorizer upstream (fellows repo) and build with that feature.

For now having a smoke test looks reasonable to me. What do you think? @bkontur @franciscoaguirre
Also what do we do long term? Can we add second option to fellows? it will make testing way easier...

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. we can request a continuous (auto-renewed) quota for a test account and use that account

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yes, no experimental, point is to add to the runtimes-matrix.json (...) and it should run

did that but the CI failed. The Authorizer is Root | EnsureXcm<Equals<PeopleLocation>>. So it accepts either Root or XCM from People. None of them work with local zombie-net. We can:

1. either have a smoke-only job (chain-up + chopsticks)

2. or add  `#[cfg(feature = "test-accounts")] EnsureSignedBy<TestAccounts, _>` to the Authorizer upstream (fellows repo) and build with that feature.

For now having a smoke test looks reasonable to me. What do you think? @bkontur @franciscoaguirre Also what do we do long term? Can we add second option to fellows? it will make testing way easier...

exactly, for this, we should be able to use #405 (let me rebase that)

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

oh, nice! I was not aware of this PR.
Please, ping me, once you rebase it 🙏🏻

Comment thread
x3c41a marked this conversation as resolved.
Outdated
"external_runtime": {
"repo": "https://github.com/bkontur/runtimes.git",
"ref": "bko-bulletin-stage1"
Comment thread
x3c41a marked this conversation as resolved.
Outdated
}
}
]
67 changes: 67 additions & 0 deletions zombienet/bulletin-polkadot-local.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
# To run the network, execute the following command:
#
# cd <root dir>
# ./scripts/create_bulletin_polkadot_spec.sh
# POLKADOT_BINARY_PATH=~/local_bridge_testing/bin/polkadot POLKADOT_PARACHAIN_BINARY_PATH=~/local_bridge_testing/bin/polkadot-parachain zombienet -p native spawn ./zombienet/bulletin-polkadot-local.toml

[settings]
node_spawn_timeout = 240

[relaychain]
default_command = "{{POLKADOT_BINARY_PATH}}"
default_args = ["-lruntime=debug,xcm=trace"]
chain = "westend-local"

[[relaychain.nodes]]
name = "alice"
validator = true
p2p_port = 30333
rpc_port = 9942
balance = 2000000000000

[[relaychain.nodes]]
name = "bob"
validator = true
p2p_port = 30433
rpc_port = 9943
balance = 2000000000000

[[parachains]]
id = 1010
chain_spec_path = "./zombienet/bulletin-polkadot-spec.json"
cumulus_based = true

[[parachains.collators]]
name = "bulletin-polkadot-collator-1"
command = "{{POLKADOT_PARACHAIN_BINARY_PATH}}"
validator = true
p2p_port = 10001
rpc_port = 10000
args = [
"--ipfs-server",
"--pool-kbytes 65536",
"-lparachain=info,runtime=debug,xcm=trace,sub-libp2p::bitswap=trace,runtime::transaction-storage=trace",
# Embedded relay chain args (after "--"):
# Use -:--port to exclude zombienet's auto-generated --port flag,
# then provide --listen-addr to bind only on 127.0.0.1 (avoids litep2p
# IPv6 dual-stack crash on macOS and prevents 0.0.0.0 exposure).
"--",
"--listen-addr=/ip4/127.0.0.1/tcp/10003/ws",
"-:--port",
]

[[parachains.collators]]
name = "bulletin-polkadot-collator-2"
command = "{{POLKADOT_PARACHAIN_BINARY_PATH}}"
validator = true
p2p_port = 12347
rpc_port = 12346
args = [
"--ipfs-server",
"--pool-kbytes 65536",
"-lparachain=info,runtime=debug,xcm=trace,bitswap=trace,sub-libp2p::bitswap=trace,runtime::transaction-storage=trace",
# Embedded relay chain args (after "--"):
"--",
"--listen-addr=/ip4/127.0.0.1/tcp/12349/ws",
"-:--port",
]