Distribute single binary with bun#942
Conversation
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
📝 WalkthroughWalkthroughThis PR adds Bun-compiled standalone binary support and release packaging: a new CI job builds platform-specific binaries (darwin-arm64 and linux-x64-gnu), runs a smoke test, and uploads zip artifacts to releases; release notes are updated to include a "Standalone Binaries" section. A new build script (bin/jam/build-for-bun.sh) compiles the app with Bun, bundles native .node addons, writes version info, and zips the distribution. A Bun entry script (bin/jam/bun-entry.ts) patches module resolution and dlopen to load sibling native addons, then imports the app. Worker bootstrap selection is made Bun-aware by adding WORKER_BUN exports in several worker packages and rewriting worker URLs when running under Bun. package.json gains a trustedDependencies entry for protobufjs. Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Suggested reviewers
Poem
🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (2 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (1)
.github/workflows/publish.yml (1)
179-201:⚠️ Potential issue | 🟡 MinorMake the release-notes update idempotent.
append_body: truealready preserves the current release notes. Interpolating${{ github.event.release.body }}into the appended block duplicates the existing body on the first run, and reruns append another copy of the standalone/docker/npm section again.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.github/workflows/publish.yml around lines 179 - 201, The body block passed to softprops/action-gh-release@v2 currently includes interpolation of ${{ github.event.release.body }} and also sets append_body: true, which causes duplicate release notes on reruns; remove the interpolation of ${{ github.event.release.body }} from the body field and let append_body: true handle preserving the existing release notes so only the new standalone/docker/npm section is appended (update the body value in the action that defines body: | and keep append_body: true).
🧹 Nitpick comments (2)
.github/workflows/publish.yml (1)
152-155: Exercise at least one worker path in the binary smoke test.
./dist/jam-bun/jam --helpproves the executable starts, but it won't touch the newWORKER_BUNselection inpackages/jam/node/workers.tsor most of the.noderedirection inbin/jam/bun-entry.ts. A minimal command that spawns a worker would catch the PR's highest-risk runtime failure before upload.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In @.github/workflows/publish.yml around lines 152 - 155, The smoke test only checks that the binary starts but doesn't exercise the worker code paths; update the workflow step that runs ./dist/jam-bun/jam to invoke a command that spawns a Bun worker so WORKER_BUN in packages/jam/node/workers.ts and the .node redirection in bin/jam/bun-entry.ts are executed (for example run a lightweight subcommand or flag that creates a worker and exits). Ensure the chosen subcommand is non-interactive and deterministic so the CI step completes quickly and reliably while touching the worker path.packages/jam/node/workers.ts (1)
11-17: Use an explicit property read for Bun detection.
"Bun" in globalThisis thein-based runtime detection pattern the repo asks us to avoid. A direct property read keeps the same behavior without adding another type probe.♻️ Proposed fix
-const isBun = "Bun" in globalThis; +const isBun = (globalThis as typeof globalThis & { Bun?: unknown }).Bun !== undefined;As per coding guidelines, "Avoid
instanceofand use explicit checks rather than type detection viainoperator."🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@packages/jam/node/workers.ts` around lines 11 - 17, Replace the `in`-based runtime detection for Bun with an explicit property read: update the isBun variable (used by workerUrl) to check the Bun property on globalThis via an explicit undefined/type check (so it does not throw) and coerce to boolean; keep workerUrl unchanged but rely on the new isBun value. Ensure you reference the isBun variable and workerUrl function when making the change.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In @.github/workflows/publish.yml:
- Around line 138-142: Pin the Bun setup action and enforce frozen dependency
resolution: update the "Setup Bun" step that uses oven-sh/setup-bun to reference
an exact, immutable tag (replace the floating `@v2` with a specific release tag)
and change the "Install dependencies" step (currently running `bun install`) to
run with the frozen-lockfile flag (use `bun install --frozen-lockfile`) so
builds use the committed lockfile and the toolchain is pinned.
In `@bin/jam/build-for-bun.sh`:
- Around line 9-12: The VERSION lookup and the `cd ../..` are resolving from the
caller's cwd; change both to resolve paths relative to the script location
instead: compute the script directory (referenced in this file as the context
for VERSION and the subsequent cd) and use that base when invoking bun to read
package.json for VERSION and when changing directories (replace the current
`VERSION=$(bun -e "console.log(require('./package.json').version)")` and `cd
../..` usage with versions that reference the computed script directory variable
so the script always reads the correct package.json and cd's into the intended
repo location).
- Around line 21-23: The bun build invocation currently compiles for the CI host
instead of the intended $PLATFORM; add a small mapping from $PLATFORM to a bun
compile target (e.g., map darwin-arm64 -> bun-darwin-arm64, linux-x64 ->
bun-linux-x64) and pass it to bun via --target "$TARGET" in the existing bun
build --compile ... --outfile "$DIST_FOLDER/jam" ./bin/jam/bun-entry.ts command;
implement the mapping as a case/switch before the bun build and validate TARGET
is set (exit with an error if unknown) so the produced binary matches the staged
native addons and zip naming.
In `@bin/jam/bun-entry.ts`:
- Around line 3-5: The build imports "reflect-metadata" directly in
bin/jam/bun-entry.ts but doesn't declare it as a dependency in
bin/jam/package.json, relying on a fragile transitive chain; add
"reflect-metadata" to the dependencies section of bin/jam/package.json (pick a
version consistent with your repo's root or use a caret range matching the
version used elsewhere), save the file, and run your Bun install command to
update the lockfile so the Bun binary build no longer depends on a transitive
package for the reflect-metadata import.
---
Outside diff comments:
In @.github/workflows/publish.yml:
- Around line 179-201: The body block passed to softprops/action-gh-release@v2
currently includes interpolation of ${{ github.event.release.body }} and also
sets append_body: true, which causes duplicate release notes on reruns; remove
the interpolation of ${{ github.event.release.body }} from the body field and
let append_body: true handle preserving the existing release notes so only the
new standalone/docker/npm section is appended (update the body value in the
action that defines body: | and keep append_body: true).
---
Nitpick comments:
In @.github/workflows/publish.yml:
- Around line 152-155: The smoke test only checks that the binary starts but
doesn't exercise the worker code paths; update the workflow step that runs
./dist/jam-bun/jam to invoke a command that spawns a Bun worker so WORKER_BUN in
packages/jam/node/workers.ts and the .node redirection in bin/jam/bun-entry.ts
are executed (for example run a lightweight subcommand or flag that creates a
worker and exits). Ensure the chosen subcommand is non-interactive and
deterministic so the CI step completes quickly and reliably while touching the
worker path.
In `@packages/jam/node/workers.ts`:
- Around line 11-17: Replace the `in`-based runtime detection for Bun with an
explicit property read: update the isBun variable (used by workerUrl) to check
the Bun property on globalThis via an explicit undefined/type check (so it does
not throw) and coerce to boolean; keep workerUrl unchanged but rely on the new
isBun value. Ensure you reference the isBun variable and workerUrl function when
making the change.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 1ddf8873-5762-4ff6-8f70-f4d1a4740195
⛔ Files ignored due to path filters (1)
bun.lockis excluded by!**/*.lock
📒 Files selected for processing (8)
.github/workflows/publish.ymlbin/jam/build-for-bun.shbin/jam/bun-entry.tspackage.jsonpackages/jam/node/workers.tspackages/workers/block-authorship/index.tspackages/workers/importer/index.tspackages/workers/jam-network/index.ts
| - name: Setup Bun | ||
| uses: oven-sh/setup-bun@v2 | ||
|
|
||
| - name: Install dependencies | ||
| run: bun install |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Workflow step under review:"
sed -n '138,143p' .github/workflows/publish.yml
echo
echo "Committed lockfiles:"
fd -a 'bun\.lockb?$|package-lock\.json$|npm-shrinkwrap\.json$' .Repository: FluffyLabs/typeberry
Length of output: 291
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "=== Checking package.json for Bun version requirement ==="
if [ -f package.json ]; then
jq -r '.engines.bun // "No bun version specified"' package.json
fi
echo
echo "=== Full engines section if present ==="
if [ -f package.json ]; then
jq '.engines // "No engines section"' package.json
fi
echo
echo "=== Checking full publish.yml workflow for Bun version references ==="
rg -i 'bun.*version|version.*bun' .github/workflows/publish.yml || echo "No version references found"
echo
echo "=== Lockfile sizes and timestamps ==="
ls -lh bun.lock package-lock.json 2>/dev/null || echo "Lockfiles info unavailable"
echo
echo "=== Checking if bun.lock is actually a binary or text lockfile ==="
file bun.lock 2>/dev/null || echo "Could not determine file type"Repository: FluffyLabs/typeberry
Length of output: 586
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "=== All uses of setup-bun in workflow files ==="
rg 'setup-bun' .github/workflows/
echo
echo "=== All workflow files listing ==="
fd '\.ya?ml$' .github/workflows/
echo
echo "=== Checking if bun-version is documented or used anywhere ==="
rg 'bun-version' .github/workflows/ || echo "bun-version parameter not used"Repository: FluffyLabs/typeberry
Length of output: 729
Pin the Bun toolchain and enforce frozen dependency resolution for releases.
This job currently floats both the compiler/runtime (setup-bun@v2 without a version pin) and does not enforce the committed lockfile (bun install lacks --frozen-lockfile). This allows the same release tag to produce different binaries when built at different times.
🔒 Proposed hardening
- name: Setup Bun
uses: oven-sh/setup-bun@v2
+ with:
+ bun-version: 1.2.x
- name: Install dependencies
- run: bun install
+ run: bun install --frozen-lockfile📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| - name: Setup Bun | |
| uses: oven-sh/setup-bun@v2 | |
| - name: Install dependencies | |
| run: bun install | |
| - name: Setup Bun | |
| uses: oven-sh/setup-bun@v2 | |
| with: | |
| bun-version: 1.2.x | |
| - name: Install dependencies | |
| run: bun install --frozen-lockfile |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In @.github/workflows/publish.yml around lines 138 - 142, Pin the Bun setup
action and enforce frozen dependency resolution: update the "Setup Bun" step
that uses oven-sh/setup-bun to reference an exact, immutable tag (replace the
floating `@v2` with a specific release tag) and change the "Install dependencies"
step (currently running `bun install`) to run with the frozen-lockfile flag (use
`bun install --frozen-lockfile`) so builds use the committed lockfile and the
toolchain is pinned.
| VERSION=$(bun -e "console.log(require('./package.json').version)") | ||
|
|
||
| # Start from the top-level project directory | ||
| cd ../.. |
There was a problem hiding this comment.
Resolve paths from the script location, not the caller's cwd.
Both the version lookup and cd ../.. only work when this script is launched from bin/jam. Running bin/jam/build-for-bun.sh from the repo root reads a different package.json and then cds outside the repository.
🧭 Proposed fix
-VERSION=$(bun -e "console.log(require('./package.json').version)")
-
-# Start from the top-level project directory
-cd ../..
+SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
+ROOT_DIR="$(cd -- "$SCRIPT_DIR/../.." && pwd)"
+VERSION="$(cd "$SCRIPT_DIR" && bun -e 'console.log(require("./package.json").version)')"
+
+# Start from the top-level project directory
+cd "$ROOT_DIR"📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| VERSION=$(bun -e "console.log(require('./package.json').version)") | |
| # Start from the top-level project directory | |
| cd ../.. | |
| SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)" | |
| ROOT_DIR="$(cd -- "$SCRIPT_DIR/../.." && pwd)" | |
| VERSION="$(cd "$SCRIPT_DIR" && bun -e 'console.log(require("./package.json").version)')" | |
| # Start from the top-level project directory | |
| cd "$ROOT_DIR" |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@bin/jam/build-for-bun.sh` around lines 9 - 12, The VERSION lookup and the `cd
../..` are resolving from the caller's cwd; change both to resolve paths
relative to the script location instead: compute the script directory
(referenced in this file as the context for VERSION and the subsequent cd) and
use that base when invoking bun to read package.json for VERSION and when
changing directories (replace the current `VERSION=$(bun -e
"console.log(require('./package.json').version)")` and `cd ../..` usage with
versions that reference the computed script directory variable so the script
always reads the correct package.json and cd's into the intended repo location).
| bun build --compile \ | ||
| --outfile "$DIST_FOLDER/jam" \ | ||
| ./bin/jam/bun-entry.ts |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Binary matrix:"
sed -n '124,150p' .github/workflows/publish.yml
echo
echo "Compile command:"
sed -n '18,24p' bin/jam/build-for-bun.shRepository: FluffyLabs/typeberry
Length of output: 1120
🌐 Web query:
bun build --target option documentation
💡 Result:
bun build --target (bundling)
--target sets the intended runtime environment for the generated bundle (default: browser). Valid values are: browser, bun, node. It affects resolution conditions and optimizations. The CLI form is, for example: bun build ./index.ts --outdir ./out --target browser. [1]
Reference: Bun “Bundler” docs → CLI Usage / --target, and the target option description. [1]
bun build --compile --target (single-file executable)
When using --compile, --target is used for cross-compiling a Bun executable, and takes values like bun-linux-arm64, bun-windows-x64, etc. Example: bun build --compile --target=bun-linux-arm64 ./index.ts --outfile myapp. [2]
Reference: Bun “Single-file executable” docs → supported compile targets + examples. [2]
Sources: [1] [2]
🏁 Script executed:
# Check if there's any existing usage of --target flag in the repository
rg --type sh "bun build.*--target" || echo "No --target usage found"
# Also check for any bun configuration files
fd -e bunfig.toml -e bunfig.jsonRepository: FluffyLabs/typeberry
Length of output: 87
🏁 Script executed:
cat -n bin/jam/build-for-bun.shRepository: FluffyLabs/typeberry
Length of output: 2725
🌐 Web query:
bun build --compile --target bun-darwin-arm64 supported targets
💡 Result:
bun build --compile --target=... supports these targets (including bun-darwin-arm64): [1]
- macOS
bun-darwin-arm64bun-darwin-x64bun-darwin-x64-baseline
- Linux (glibc)
bun-linux-x64bun-linux-x64-baselinebun-linux-x64-modernbun-linux-arm64
- Linux (musl)
bun-linux-x64-muslbun-linux-arm64-musl
- Windows
bun-windows-x64bun-windows-x64-baselinebun-windows-x64-modernbun-windows-arm64
Sources: [1]
🏁 Script executed:
# Check if there's any bun documentation or examples in the repository
find . -type f \( -name "*.md" -o -name "*.ts" -o -name "*.js" \) -exec grep -l "bun build.*compile" {} \; | head -10Repository: FluffyLabs/typeberry
Length of output: 46
Add --target flag to cross-compile for the intended platform, not the host runner.
The zip name and staged native addons are keyed off $PLATFORM, but the executable is currently built for whatever machine runs CI. If the CI runner's platform diverges from the target (e.g., macOS builder for darwin-arm64 vs. Linux builder for linux-x64), you'll ship a binary/addon mismatch. Cross-compiling ensures consistency:
🎯 Proposed fix
bun build --compile \
+ --target="bun-${PLATFORM}" \
--outfile "$DIST_FOLDER/jam" \
./bin/jam/bun-entry.tsThis maps $PLATFORM values (darwin-arm64, linux-x64) to the corresponding bun compile targets (bun-darwin-arm64, bun-linux-x64).
📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| bun build --compile \ | |
| --outfile "$DIST_FOLDER/jam" \ | |
| ./bin/jam/bun-entry.ts | |
| bun build --compile \ | |
| --target="bun-${PLATFORM}" \ | |
| --outfile "$DIST_FOLDER/jam" \ | |
| ./bin/jam/bun-entry.ts |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@bin/jam/build-for-bun.sh` around lines 21 - 23, The bun build invocation
currently compiles for the CI host instead of the intended $PLATFORM; add a
small mapping from $PLATFORM to a bun compile target (e.g., map darwin-arm64 ->
bun-darwin-arm64, linux-x64 -> bun-linux-x64) and pass it to bun via --target
"$TARGET" in the existing bun build --compile ... --outfile "$DIST_FOLDER/jam"
./bin/jam/bun-entry.ts command; implement the mapping as a case/switch before
the bun build and validate TARGET is set (exit with an error if unknown) so the
produced binary matches the staged native addons and zip naming.
| // reflect-metadata polyfill required by tsyringe (transitive dep of @matrixai/quic) | ||
| // eslint-disable-next-line import/no-extraneous-dependencies | ||
| import "reflect-metadata"; |
There was a problem hiding this comment.
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "Imports of reflect-metadata:"
rg -n '["'"'"']reflect-metadata["'"'"']' .
echo
echo "Package manifests declaring reflect-metadata:"
python - <<'PY'
import json, pathlib
for path in pathlib.Path('.').rglob('package.json'):
try:
data = json.loads(path.read_text())
except Exception:
continue
for key in ("dependencies", "devDependencies", "peerDependencies", "optionalDependencies"):
version = data.get(key, {}).get("reflect-metadata")
if version:
print(f"{path}: {key} -> {version}")
PYRepository: FluffyLabs/typeberry
Length of output: 952
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "=== Workspace structure ==="
find . -maxdepth 3 -name "package.json" -type f | head -20
echo
echo "=== Root package.json dependencies (first 50 lines) ==="
if [ -f "package.json" ]; then
cat package.json | head -50
fi
echo
echo "=== bin/jam manifest (if exists) ==="
if [ -f "bin/jam/package.json" ]; then
cat bin/jam/package.json
else
echo "No bin/jam/package.json found"
fi
echo
echo "=== Search for `@matrixai/quic` declarations ==="
rg -n '@matrixai/quic' --type json
echo
echo "=== Content of bin/jam/bun-entry.ts ==="
cat bin/jam/bun-entry.tsRepository: FluffyLabs/typeberry
Length of output: 7269
Declare reflect-metadata explicitly in bin/jam/package.json.
The import is currently a transitive dependency via @typeberry/networking → @matrixai/quic → reflect-metadata. While the chain exists today, this creates brittleness: if the transitive path breaks or lockfile churn removes it, the Bun build fails without an explicit declaration. Add "reflect-metadata" to bin/jam dependencies to ensure the Bun binary build remains stable across lockfile updates.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@bin/jam/bun-entry.ts` around lines 3 - 5, The build imports
"reflect-metadata" directly in bin/jam/bun-entry.ts but doesn't declare it as a
dependency in bin/jam/package.json, relying on a fragile transitive chain; add
"reflect-metadata" to the dependencies section of bin/jam/package.json (pick a
version consistent with your repo's root or use a caret range matching the
version used elsewhere), save the file, and run your Bun install command to
update the lockfile so the Bun binary build no longer depends on a transitive
package for the reflect-metadata import.
66e95b7 to
0f17644
Compare
There was a problem hiding this comment.
🧹 Nitpick comments (1)
bin/jam/bun-entry.ts (1)
21-24: Consider tightening the regex patterns to reduce false-positive risk.The current patterns
/quic/and/bandersnatch/are broad and could theoretically match unrelated module identifiers (e.g., a hypothetical package containing "oblique" or "bandersnatcher"). While unlikely given the current codebase, anchoring the patterns to expected package prefixes would be more defensive.🔧 Suggested pattern refinement
const NATIVE_SIBLING_FILES: [pattern: RegExp, file: string][] = [ - [/quic/, "quic.node"], - [/bandersnatch/, "bandersnatch.node"], + [/@matrixai\/quic/, "quic.node"], + [/@typeberry\/bandersnatch-native/, "bandersnatch.node"], ];🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@bin/jam/bun-entry.ts` around lines 21 - 24, Tighten the broad RegExp entries in the NATIVE_SIBLING_FILES constant to avoid false positives: replace the loose substring matches for "quic" and "bandersnatch" with anchored patterns that match package names (including optional scoped prefixes) and ensure they only match the module identifier at the start or at a path boundary, then update the two entries in NATIVE_SIBLING_FILES accordingly (the array and its two elements that currently use /quic/ and /bandersnatch/).
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Nitpick comments:
In `@bin/jam/bun-entry.ts`:
- Around line 21-24: Tighten the broad RegExp entries in the
NATIVE_SIBLING_FILES constant to avoid false positives: replace the loose
substring matches for "quic" and "bandersnatch" with anchored patterns that
match package names (including optional scoped prefixes) and ensure they only
match the module identifier at the start or at a path boundary, then update the
two entries in NATIVE_SIBLING_FILES accordingly (the array and its two elements
that currently use /quic/ and /bandersnatch/).
ℹ️ Review info
⚙️ Run configuration
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Run ID: 95a10e8e-e4ad-4a09-8f1c-89e52823ec33
⛔ Files ignored due to path filters (1)
bun.lockis excluded by!**/*.lock
📒 Files selected for processing (8)
.github/workflows/publish.ymlbin/jam/build-for-bun.shbin/jam/bun-entry.tspackage.jsonpackages/jam/node/workers.tspackages/workers/block-authorship/index.tspackages/workers/importer/index.tspackages/workers/jam-network/index.ts
✅ Files skipped from review due to trivial changes (3)
- packages/workers/importer/index.ts
- packages/workers/block-authorship/index.ts
- packages/workers/jam-network/index.ts
🚧 Files skipped from review as they are similar to previous changes (3)
- package.json
- .github/workflows/publish.yml
- bin/jam/build-for-bun.sh
289621a to
7de6ca7
Compare
c54b963 to
1a4a5db
Compare
View all
Benchmarks summary: 83/83 OK ✅ |
|
@fluffylabs-bot benchmark |
Related #941