commit 4064f9e56a1021708aea5e37cc58f3423fbeeed3 Author: satoshi Date: Mon Apr 13 03:51:23 2026 +0300 Initial StartOS 0.3.5.1 packaging scaffold for Kamado Pool Multi-stage Dockerfile clones KamadoPool at a pinned SHA, builds ckpool and kamado-api (with embedded Svelte UI), runtime image supervises both processes via tini + wait -n. Config covers bitcoind mainnet/testnet4 variant, payout address, coinbase tag, vardiff knobs, and log level. Web UI interface only — stratum :3333 requires a router port-forward or simpleproxy workaround because StartOS 0.3.x does not forward raw TCP on LAN. TODO before first build: pin KAMADO_REPO + KAMADO_SHA in the Dockerfile to a pushed commit. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..900c5a4 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.s9pk +image.tar +scripts/embassy.js +.DS_Store diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..60faee6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,87 @@ +# syntax=docker/dockerfile:1.6 +# +# Kamado Pool StartOS package image. +# +# Clones KamadoPool at a pinned SHA, builds the patched ckpool-solo +# binary, builds the Go api binary with embedded Svelte UI, then +# assembles a small runtime image that supervises both processes. +# +# TODO: set KAMADO_REPO + KAMADO_SHA to a pushed commit before +# running `make` — the defaults below are placeholders and the build +# WILL fail until the KamadoPool source repo is pushed to GitHub. + +ARG KAMADO_REPO=https://github.com/Relaxo143/KamadoPool.git +ARG KAMADO_SHA=REPLACE_ME_WITH_PUSHED_COMMIT_SHA +ARG ARCH + +# ---------- stage 1: fetch source ---------- +FROM debian:bookworm-slim AS source +ARG KAMADO_REPO +ARG KAMADO_SHA +RUN apt-get update && apt-get install -y --no-install-recommends \ + git ca-certificates \ + && rm -rf /var/lib/apt/lists/* +WORKDIR /src +RUN git clone "${KAMADO_REPO}" kamado \ + && cd kamado && git checkout "${KAMADO_SHA}" + +# ---------- stage 2: build ckpool ---------- +FROM debian:bookworm-slim AS ckpool-build +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential autoconf automake libtool pkg-config \ + yasm libzmq3-dev git ca-certificates \ + && rm -rf /var/lib/apt/lists/* +COPY --from=source /src/kamado /src/kamado +WORKDIR /src/kamado +RUN make ckpool-src \ + && cd ckpool/src \ + && ./autogen.sh \ + && ./configure --without-ckdb --prefix=/usr/local \ + && make -j"$(nproc)" \ + && install -Dm755 src/ckpool /out/usr/local/bin/ckpool + +# ---------- stage 3: build UI ---------- +FROM node:22-bookworm-slim AS ui-build +WORKDIR /ui +COPY --from=source /src/kamado/ui/package.json ./ +RUN npm install --no-audit --no-fund +COPY --from=source /src/kamado/ui/ ./ +RUN npm run build + +# ---------- stage 4: build Go api with embedded UI ---------- +FROM golang:1.22-bookworm AS api-build +WORKDIR /src +COPY --from=source /src/kamado/api/ ./ +RUN rm -rf internal/webui/dist && mkdir -p internal/webui/dist +COPY --from=ui-build /ui/dist/ internal/webui/dist/ +RUN CGO_ENABLED=0 GOOS=linux go build \ + -trimpath -ldflags="-s -w" \ + -o /out/kamado-api ./cmd/kamado-api + +# ---------- stage 5: runtime ---------- +FROM debian:bookworm-slim AS runtime +ARG ARCH +ARG YQ_VERSION=v4.44.3 +RUN apt-get update && apt-get install -y --no-install-recommends \ + tini ca-certificates curl libzmq5 \ + && rm -rf /var/lib/apt/lists/* + +# yq for parsing StartOS config.yaml inside the entrypoint +RUN set -eu; \ + case "${ARCH}" in \ + x86_64|amd64) YQ_ARCH=amd64 ;; \ + aarch64|arm64) YQ_ARCH=arm64 ;; \ + *) echo "unsupported arch: ${ARCH}" >&2; exit 1 ;; \ + esac; \ + curl -fsSL -o /usr/local/bin/yq \ + "https://github.com/mikefarah/yq/releases/download/${YQ_VERSION}/yq_linux_${YQ_ARCH}"; \ + chmod +x /usr/local/bin/yq + +COPY --from=ckpool-build /out/usr/local/bin/ckpool /usr/local/bin/ckpool +COPY --from=api-build /out/kamado-api /usr/local/bin/kamado-api +COPY docker_entrypoint.sh /usr/local/bin/docker_entrypoint.sh +RUN chmod +x /usr/local/bin/docker_entrypoint.sh + +EXPOSE 3333 8080 +WORKDIR /root +ENTRYPOINT ["/usr/bin/tini", "--", "/usr/local/bin/docker_entrypoint.sh"] diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..e13c2cf --- /dev/null +++ b/LICENSE @@ -0,0 +1,22 @@ +Kamado Pool +Copyright (C) 2026 Kamado Pool contributors + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . + +--- + +This project is built on top of CKPool by Con Kolivas, which is itself +licensed under GPL-3.0. See https://bitbucket.org/ckolivas/ckpool for +the upstream source. The full GPL-3.0 text is available at: +https://www.gnu.org/licenses/gpl-3.0.txt diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ebe94c6 --- /dev/null +++ b/Makefile @@ -0,0 +1,31 @@ +PKG_ID := $(shell yq -r .id manifest.yaml) +PKG_VERSION := $(shell yq -r .version manifest.yaml) + +TS_FILES := $(shell find ./scripts -name \*.ts 2>/dev/null) + +.DELETE_ON_ERROR: + +all: verify + +verify: $(PKG_ID).s9pk + start-sdk verify s9pk $(PKG_ID).s9pk + +install: $(PKG_ID).s9pk + start-cli package install $(PKG_ID).s9pk + +$(PKG_ID).s9pk: manifest.yaml instructions.md icon.png LICENSE scripts/embassy.js image.tar + start-sdk pack + +scripts/embassy.js: $(TS_FILES) + deno run --allow-read --allow-write --allow-env --allow-net scripts/bundle.ts + +image.tar: Dockerfile docker_entrypoint.sh + docker buildx build --tag start9/$(PKG_ID)/main:$(PKG_VERSION) \ + --platform=linux/arm64/v8,linux/amd64 \ + --build-arg ARCH=$(shell uname -m) \ + -o type=oci,dest=image.tar . + +clean: + rm -f $(PKG_ID).s9pk image.tar scripts/embassy.js + +.PHONY: all verify install clean diff --git a/README.md b/README.md new file mode 100644 index 0000000..9f81286 --- /dev/null +++ b/README.md @@ -0,0 +1,23 @@ +# Kamado Pool — StartOS Packaging + +StartOS 0.3.5.1 wrapper for [Kamado Pool](https://github.com/Relaxo143/KamadoPool), a modern solo Bitcoin mining pool built on a patched fork of CKPool-solo with a Go middleware API and Svelte real-time dashboard. + +## Build + +```sh +make +``` + +This runs `deno` to bundle the embassy TypeScript procedures, builds a multi-arch OCI image via `docker buildx`, and packs everything into `kamado-pool.s9pk` using `start-sdk`. + +> **Note:** the Dockerfile clones the Kamado source from a pinned git SHA. Before the first build, set the `KAMADO_REPO` and `KAMADO_SHA` build args in [Dockerfile](Dockerfile) to a real pushed commit on the upstream repo. + +## Install + +```sh +make install +``` + +## License + +GPL-3.0 — matches upstream Kamado and CKPool. diff --git a/docker_entrypoint.sh b/docker_entrypoint.sh new file mode 100755 index 0000000..b28760a --- /dev/null +++ b/docker_entrypoint.sh @@ -0,0 +1,100 @@ +#!/bin/bash +# Kamado Pool StartOS entrypoint. +# +# Renders ckpool.conf from /root/.kamado/start9/config.yaml, resolves +# which bitcoind variant the user picked (mainnet vs testnet4), then +# supervises ckpool and kamado-api as a pair — if either exits, tear +# the container down so StartOS restarts the service cleanly. +set -euo pipefail + +CONFIG_FILE="/root/.kamado/start9/config.yaml" +CKPOOL_DIR="/root/.ckpool" +CKPOOL_CONF="${CKPOOL_DIR}/ckpool.conf" +CKPOOL_LOG_DIR="${CKPOOL_DIR}/logs" +mkdir -p "${CKPOOL_DIR}" "${CKPOOL_LOG_DIR}" + +if [[ ! -f "${CONFIG_FILE}" ]]; then + echo "kamado-entrypoint: config file missing: ${CONFIG_FILE}" >&2 + exit 1 +fi + +q() { yq -r "$1" "${CONFIG_FILE}"; } + +BITCOIND_VARIANT=$(q '.bitcoind.type') +case "${BITCOIND_VARIANT}" in + bitcoind) + BITCOIN_HOST="bitcoind.embassy" + BITCOIN_PORT=8332 + ;; + bitcoind-testnet) + BITCOIN_HOST="bitcoind-testnet.embassy" + BITCOIN_PORT=48332 + ;; + *) + echo "kamado-entrypoint: unknown bitcoind variant: ${BITCOIND_VARIANT}" >&2 + exit 1 + ;; +esac + +BITCOIN_USER=$(q '.bitcoind.user') +BITCOIN_PASS=$(q '.bitcoind.password') +POOL_BTCADDRESS=$(q '.pool-address') +POOL_IDENTIFIER=$(q '.pool-identifier') +DROPIDLE=$(q '.dropidle // 0') +STARTDIFF=$(q '.startdiff // 16384') +MINDIFF=$(q '.mindiff // 1000') +MAXDIFF=$(q '.maxdiff // 0') +LOG_LEVEL=$(q '.log-level // "info"') + +cat > "${CKPOOL_CONF}" </dev/null || true + wait "${API_PID}" "${CKPOOL_PID}" 2>/dev/null || true + exit 0 +} +trap term TERM INT + +wait -n "${CKPOOL_PID}" "${API_PID}" +EXIT_CODE=$? +echo "kamado-entrypoint: one of ckpool/kamado-api exited (${EXIT_CODE}), stopping the other" +kill -TERM "${API_PID}" "${CKPOOL_PID}" 2>/dev/null || true +wait || true +exit "${EXIT_CODE}" diff --git a/icon.png b/icon.png new file mode 100644 index 0000000..80985b2 Binary files /dev/null and b/icon.png differ diff --git a/instructions.md b/instructions.md new file mode 100644 index 0000000..9a8d058 --- /dev/null +++ b/instructions.md @@ -0,0 +1,30 @@ +# Kamado Pool + +Kamado is a solo Bitcoin mining pool built on a patched fork of CKPool-solo, with a Go middleware API and a real-time Svelte dashboard. When a miner connected to your Kamado instance solves a block, **the full block reward goes to the payout address you configured** — no pool fees, no splits, no share accounting. + +## Setup + +1. Install Bitcoin Core (mainnet) **or** Bitcoin Core (testnet4). Kamado supports either as a dependency; pick one in the Kamado config under *Bitcoin Core > Type*. +2. In the Kamado config, set **Payout Address** to the Bitcoin address that should receive solved block rewards. +3. Optionally adjust the **Coinbase Tag** (default `/Kamado/`) and the vardiff parameters. +4. Start Kamado. Open the web UI from the Services page to watch live hashrate, miners, best shares, and solved blocks. + +## Connecting miners + +Kamado's stratum server listens on TCP port **3333** inside the container. **StartOS 0.3.x does not forward raw TCP ports on the LAN interface**, so you have two options to reach stratum from miners on your local network: + +- **Router port-forward**: Forward an external port on your router directly to your StartOS server's LAN IP on port 3333 and point miners at that. +- **simpleproxy on a second host**: Run `simpleproxy -L 3333 -R :3333` on any always-on LAN host and point miners at that host. + +Once forwarding is in place, miners connect to `stratum+tcp://:3333` with the username set to **any label you like** (it becomes the worker name in the dashboard) and any password. + +## Troubleshooting + +- **No miners appear after connecting**: confirm the forward actually reaches the StartOS container — `telnet 3333` should connect. Check the Kamado logs in the Services page. +- **Bitcoin Core RPC errors**: make sure Bitcoin Core is fully synced and the RPC dependency was auto-configured (Kamado enables `rpc.enable` during setup). +- **Best share resets to 0 after a block is found**: upstream CKPool zeroes the "current round" best diff on solve. Kamado ships a patch that also exposes the all-time best, so the dashboard has both columns. + +## Upstream + +CKPool-solo by Con Kolivas: +Kamado source: diff --git a/manifest.yaml b/manifest.yaml new file mode 100644 index 0000000..ecdbd8a --- /dev/null +++ b/manifest.yaml @@ -0,0 +1,151 @@ +id: kamado-pool +title: "Kamado Pool" +version: 0.1.0 +release-notes: | + Initial StartOS 0.3.5.1 packaging for Kamado Pool — a modern solo + Bitcoin mining pool built on a patched fork of CKPool-solo with a + Go middleware API and Svelte real-time dashboard. +license: gpl-3.0 +wrapper-repo: "https://github.com/Relaxo143/KamadoPool-StartOS" +upstream-repo: "https://github.com/Relaxo143/KamadoPool" +support-site: "https://github.com/Relaxo143/KamadoPool/issues" +marketing-site: "https://github.com/Relaxo143/KamadoPool" +donation-url: ~ +build: ["make"] +description: + short: "Modern solo Bitcoin mining pool with real-time dashboard" + long: | + Kamado Pool is a solo Bitcoin mining pool built on a patched fork + of CKPool-solo. Unlike wrappers that read periodic stats files, + Kamado talks directly to CKPool's Unix socket API to expose real- + time per-client hashrate, difficulty, hardware detection, full + block history, and best-share leaderboards (both current round + and all-time) via a Svelte dashboard with WebSocket push. + + Stratum listens on port 3333. Because StartOS 0.3.x does not + forward raw TCP ports on the LAN interface, you must use a + simpleproxy or router port-forward to reach the stratum endpoint + from miners on your local network. See instructions. + +assets: + license: LICENSE + icon: icon.png + instructions: instructions.md + docker-images: image.tar + +main: + type: docker + image: main + entrypoint: docker_entrypoint.sh + args: [] + mounts: + main: /root/.kamado + ckpool: /root/.ckpool + compat: /mnt/assets + gpu-acceleration: false + +hardware-requirements: + arch: + - x86_64 + - aarch64 + +health-checks: + web: + name: "Web Dashboard" + success-message: "Kamado dashboard is reachable." + type: script + +config: + get: + type: script + set: + type: script + +properties: + type: script + +volumes: + main: + type: data + ckpool: + type: data + compat: + type: assets + +interfaces: + main: + name: Web Dashboard + description: "Real-time Kamado Pool dashboard (hashrate, miners, blocks, best shares)." + tor-config: + port-mapping: + 80: "8080" + lan-config: + 443: + ssl: true + internal: 8080 + ui: true + protocols: + - tcp + - http + +dependencies: + bitcoind: + version: ">=24.0.0 <30.0.0" + requirement: + type: "opt-in" + how: "Can alternatively use bitcoind-testnet for testnet4 testing." + description: "Used to submit found blocks and receive new block templates via RPC + ZMQ." + config: + check: + type: script + auto-configure: + type: script + bitcoind-testnet: + version: ">=24.0.0 <30.0.0" + requirement: + type: "opt-in" + how: "Can alternatively use mainnet bitcoind." + description: "Testnet4 variant of bitcoind for testing Kamado without real funds." + config: + check: + type: script + auto-configure: + type: script + +backup: + create: + type: docker + image: compat + system: true + entrypoint: compat + args: + - duplicity + - create + - /mnt/backup + - /root/.kamado + mounts: + BACKUP: /mnt/backup + main: /root/.kamado + restore: + type: docker + image: compat + system: true + entrypoint: compat + args: + - duplicity + - restore + - /mnt/backup + - /root/.kamado + mounts: + BACKUP: /mnt/backup + main: /root/.kamado + +migrations: + from: + "*": + type: script + args: ["from"] + to: + "*": + type: script + args: ["to"] diff --git a/scripts/bundle.ts b/scripts/bundle.ts new file mode 100644 index 0000000..4b464c9 --- /dev/null +++ b/scripts/bundle.ts @@ -0,0 +1,4 @@ +import { bundle } from "https://deno.land/x/emit@0.40.0/mod.ts"; + +const result = await bundle(new URL("./embassy.ts", import.meta.url)); +await Deno.writeTextFile("scripts/embassy.js", result.code); diff --git a/scripts/deps.ts b/scripts/deps.ts new file mode 100644 index 0000000..3105b54 --- /dev/null +++ b/scripts/deps.ts @@ -0,0 +1 @@ +export * from "https://deno.land/x/embassyd_sdk@v0.3.3.0.11/mod.ts"; diff --git a/scripts/embassy.ts b/scripts/embassy.ts new file mode 100644 index 0000000..bbdc5f7 --- /dev/null +++ b/scripts/embassy.ts @@ -0,0 +1,6 @@ +export { getConfig } from "./procedures/getConfig.ts"; +export { setConfig } from "./procedures/setConfig.ts"; +export { dependencies } from "./procedures/dependencies.ts"; +export { health } from "./procedures/healthChecks.ts"; +export { migration } from "./procedures/migrations.ts"; +export { properties } from "./procedures/properties.ts"; diff --git a/scripts/procedures/dependencies.ts b/scripts/procedures/dependencies.ts new file mode 100644 index 0000000..ba8a14a --- /dev/null +++ b/scripts/procedures/dependencies.ts @@ -0,0 +1,45 @@ +import { matches, types as T } from "../deps.ts"; + +const { shape, boolean, arrayOf, string, dictionary, any } = matches; + +const bitcoindMatcher = shape({ + "rpc": shape({ + "enable": boolean, + "username": string, + "password": string, + }, ["enable", "username", "password"]), + "advanced": shape({ + "peers": shape({ + "listen": boolean, + }, ["listen"]), + }, ["peers"]), +}, ["rpc", "advanced"]); + +const checkBitcoind: T.ExpectedExports.dependencyConfig["check"] = async ( + effects, + input, +) => { + const res = bitcoindMatcher.test(input); + if (!res) return { error: "Bitcoin Core RPC settings are missing." }; + if (!input.rpc.enable) { + return { error: "Bitcoin Core RPC must be enabled." }; + } + return { result: null }; +}; + +const autoBitcoind: T.ExpectedExports.dependencyConfig["autoConfigure"] = + async (effects, input) => { + input.rpc.enable = true; + return { result: input }; + }; + +export const dependencies: T.ExpectedExports.dependencies = { + "bitcoind": { + check: checkBitcoind, + autoConfigure: autoBitcoind, + }, + "bitcoind-testnet": { + check: checkBitcoind, + autoConfigure: autoBitcoind, + }, +}; diff --git a/scripts/procedures/getConfig.ts b/scripts/procedures/getConfig.ts new file mode 100644 index 0000000..acecf39 --- /dev/null +++ b/scripts/procedures/getConfig.ts @@ -0,0 +1,135 @@ +import { compat, types as T } from "../deps.ts"; + +export const getConfig: T.ExpectedExports.getConfig = compat.getConfig({ + "bitcoind": { + "type": "union", + "name": "Bitcoin Core", + "description": "Select which Bitcoin Core node Kamado should use.", + "tag": { + "id": "type", + "name": "Type", + "description": "Mainnet bitcoind or the testnet4 variant.", + "variant-names": { + "bitcoind": "Bitcoin Core (mainnet)", + "bitcoind-testnet": "Bitcoin Core (testnet4)", + }, + }, + "default": "bitcoind", + "variants": { + "bitcoind": { + "user": { + "type": "pointer", + "name": "RPC Username", + "description": "The RPC username from Bitcoin Core.", + "subtype": "package", + "package-id": "bitcoind", + "target": "config", + "multi": false, + "selector": "$.rpc.username", + }, + "password": { + "type": "pointer", + "name": "RPC Password", + "description": "The RPC password from Bitcoin Core.", + "subtype": "package", + "package-id": "bitcoind", + "target": "config", + "multi": false, + "selector": "$.rpc.password", + }, + }, + "bitcoind-testnet": { + "user": { + "type": "pointer", + "name": "RPC Username", + "description": "The RPC username from Bitcoin Core (testnet4).", + "subtype": "package", + "package-id": "bitcoind-testnet", + "target": "config", + "multi": false, + "selector": "$.rpc.username", + }, + "password": { + "type": "pointer", + "name": "RPC Password", + "description": "The RPC password from Bitcoin Core (testnet4).", + "subtype": "package", + "package-id": "bitcoind-testnet", + "target": "config", + "multi": false, + "selector": "$.rpc.password", + }, + }, + }, + }, + "pool-address": { + "type": "string", + "name": "Payout Address", + "description": + "Bitcoin address that receives the full block reward when a block is solved. Solo mining — no fees, no splits.", + "nullable": false, + "masked": false, + "copyable": true, + }, + "pool-identifier": { + "type": "string", + "name": "Coinbase Tag", + "description": + "Short string embedded in the coinbase transaction of solved blocks. Max 32 characters.", + "nullable": false, + "default": "/Kamado/", + "masked": false, + "copyable": false, + }, + "startdiff": { + "type": "number", + "name": "Starting Difficulty", + "description": + "Initial vardiff target for new miner connections. Bitaxe-class miners typically land around 16384.", + "nullable": false, + "default": 16384, + "range": "[1,*)", + "integral": true, + }, + "mindiff": { + "type": "number", + "name": "Minimum Difficulty", + "description": "Floor for the vardiff algorithm.", + "nullable": false, + "default": 1000, + "range": "[1,*)", + "integral": true, + }, + "maxdiff": { + "type": "number", + "name": "Maximum Difficulty", + "description": "Ceiling for the vardiff algorithm. 0 means no cap.", + "nullable": false, + "default": 0, + "range": "[0,*)", + "integral": true, + }, + "dropidle": { + "type": "number", + "name": "Drop Idle (seconds)", + "description": + "Disconnect clients that have not submitted a share in this many seconds. 0 disables the idle disconnect.", + "nullable": false, + "default": 0, + "range": "[0,*)", + "integral": true, + }, + "log-level": { + "type": "enum", + "name": "Log Level", + "description": "Verbosity of the kamado-api log output.", + "values": ["debug", "info", "warn", "error"], + "value-names": { + "debug": "Debug", + "info": "Info", + "warn": "Warn", + "error": "Error", + }, + "default": "info", + }, +}); diff --git a/scripts/procedures/healthChecks.ts b/scripts/procedures/healthChecks.ts new file mode 100644 index 0000000..54eabe5 --- /dev/null +++ b/scripts/procedures/healthChecks.ts @@ -0,0 +1,10 @@ +import { healthUtil, types as T } from "../deps.ts"; + +export const health: T.ExpectedExports.health = { + "web": async (effects, duration) => { + return healthUtil.checkWebUrl("http://kamado-pool.embassy:8080/api/health")( + effects, + duration, + ); + }, +}; diff --git a/scripts/procedures/migrations.ts b/scripts/procedures/migrations.ts new file mode 100644 index 0000000..b8eba8b --- /dev/null +++ b/scripts/procedures/migrations.ts @@ -0,0 +1,4 @@ +import { compat, types as T } from "../deps.ts"; + +export const migration: T.ExpectedExports.migration = compat.migrations + .fromMapping({}, "0.1.0"); diff --git a/scripts/procedures/properties.ts b/scripts/procedures/properties.ts new file mode 100644 index 0000000..623ff70 --- /dev/null +++ b/scripts/procedures/properties.ts @@ -0,0 +1,22 @@ +import { types as T, YAML } from "../deps.ts"; + +const noProps: T.ExpectedExports.properties = async () => { + return { + result: { + version: 2, + data: { + "Dashboard": { + type: "string", + value: + "Open the Kamado web UI from the Services page for live stats.", + description: "Kamado exposes everything through the web dashboard.", + copyable: false, + qr: false, + masked: false, + }, + }, + }, + }; +}; + +export const properties = noProps; diff --git a/scripts/procedures/setConfig.ts b/scripts/procedures/setConfig.ts new file mode 100644 index 0000000..5a42fe2 --- /dev/null +++ b/scripts/procedures/setConfig.ts @@ -0,0 +1,14 @@ +import { compat, types as T } from "../deps.ts"; + +export const setConfig: T.ExpectedExports.setConfig = compat.setConfig({ + "bitcoind": { + "bitcoind": [{ + "name": "bitcoind", + "version": ">=24.0.0 <30.0.0", + }], + "bitcoind-testnet": [{ + "name": "bitcoind-testnet", + "version": ">=24.0.0 <30.0.0", + }], + }, +});