Install
openclaw skills install openfunderse-participantParticipant MoltBot for allocation proposal, validation, and submission
openclaw skills install openfunderse-participantParticipant role proposes and validates AllocationClaimV1 only.
npx @wiimdy/openfunderse@2.0.0 ... executes code fetched from npm. Prefer pinning a known version (as shown) and reviewing the package source before running in production.PARTICIPANT_PRIVATE_KEY is highly sensitive. Use a dedicated wallet key for this bot; never reuse treasury/admin keys.bot-init is a destructive rotation tool: it generates a fresh wallet, updates .env.participant, and stores wallet backups under ~/.openclaw/workspace/openfunderse/wallets.install and bot-init also sync env vars into ~/.openclaw/openclaw.json and bot-init runs openclaw gateway restart. This mutates global OpenClaw runtime state and can affect other skills.
--no-sync-openclaw-env for file-only behavior.--no-restart-openclaw-gateway to avoid restarting the gateway.~/.openclaw/openclaw.json.Manual (direct installer; run in a Node project dir, or npm init -y first):
npm init -y && npx @wiimdy/openfunderse@2.0.0 install openfunderse-participant --with-runtime
ClawHub:
npx clawhub@latest install openfunderse-participant
If you already have a key, set PARTICIPANT_PRIVATE_KEY and PARTICIPANT_ADDRESS directly in OpenClaw env (/home/ubuntu/.openclaw/openclaw.json -> env.vars) or in ~/.openclaw/workspace/.env.participant. You do not need to run bot-init.
If you want the installer to generate a new wallet and write it into the role env file:
npx @wiimdy/openfunderse@2.0.0 bot-init \
--skill-name participant \
--yes \
--no-restart-openclaw-gateway
bot-init updates an existing .env.participant.
If the env file is missing, run install first (without --no-init-env) or pass --env-path.
If PARTICIPANT_PRIVATE_KEY is already set (not a placeholder), re-run with --force to rotate.
/home/ubuntu/.openclaw/openclaw.json (env.vars) as the canonical env source..env sourcing for normal skill execution..env* and openclaw.json disagree, use openclaw.json values.openclaw.json first.set -a; source ~/.openclaw/workspace/.env.participant; set +a
This step is not required for normal OpenClaw skill execution.
Telegram slash commands:
Note: Telegram integration is handled by your OpenClaw gateway. This pack does not require a Telegram bot token; configure Telegram credentials at the gateway layer.
/allocation --fund-id <id> --epoch-id <n> --target-weights <w1,w2,...> [--verify] [--submit]
/allocation --claim-file <path> [--verify] [--submit]
/join --room-id <id>
/deposit --amount <wei> [--vault-address <0x...>] [--native] [--submit]
/withdraw --amount <wei> [--vault-address <0x...>] [--native] [--submit]
/redeem --shares <wei> [--vault-address <0x...>] [--submit]
/vault_info [--vault-address <0x...>] [--account <0x...>]
/participant_daemon --fund-id <id> --strategy <A|B|C> [--interval-sec <n>] [--epoch-source <relayer|fixed>] [--epoch-id <n>] [--submit]
Notes:
allocation will auto-validate on submit (--submit implies verify).submit_allocation (legacy) validates the claim hash first; without --submit it is validation-only dry-run.BotFather /setcommands (copy-paste ready):
start - Show quick start
help - Show command help
allocation - Mine (optional verify) and optionally submit allocation claim
join - Register this bot as a participant for the fund mapped to the room id
deposit - Deposit native MON or ERC-20 into vault
withdraw - Withdraw assets from vault (native or ERC-20)
redeem - Burn vault shares and receive assets
vault_info - Show vault status and user PnL
participant_daemon - Run participant allocation daemon
Notes:
/participant_daemon equals /participant-daemon.key=value style is also accepted (fund_id=demo-fund).@BotFather -> /setcommands.OpenClaw note:
install / bot-init sync env keys into ~/.openclaw/openclaw.json (env.vars) by default.bot-init also runs openclaw gateway restart after a successful env sync, so the gateway picks up updates.--no-sync-openclaw-env for file-only behavior, or --no-restart-openclaw-gateway to skip the restart.openclaw gateway restart and verify values in /home/ubuntu/.openclaw/openclaw.json.Note:
bot-init before funding or running production actions.bot-init generates a new wallet (private key + address) and writes it into the role env file.This skill authenticates relayer write APIs with an EIP-191 message signature (no BOT_API_KEY).
Message format:
openfunderse:auth:<botId>:<timestamp>:<nonce>Required headers:
x-bot-id: BOT_IDx-bot-signature: <0x...>x-bot-timestamp: <unix seconds>x-bot-nonce: <uuid/random>Relayer verifies this signature against Supabase fund_bots.bot_address.
Participant bot registration can be done by:
POST /api/v1/rooms/{roomId}/join (recommended for Telegram groups)POST /api/v1/funds/{fundId}/bots/register (direct registration)If the participant bot is not registered for the fund, relayer will reject participant write APIs with 401/403.
propose_allocation outputs canonical allocation claim:
claimVersion: "v1"fundId, epochId, participanttargetWeights[] (integer, non-negative, sum > 0)horizonSec, nonce, submittedAtNo crawl/evidence/sourceRef schema is used.
Vector mapping rule:
targetWeights[i] maps to strategy riskPolicy.allowlistTokens[i].For MVP, the participant runtime supports an always-on daemon that:
targetWeights[] using a fixed allowlist order,AllocationClaimV1 to the relayer on a timer.Use the --strategy command flag:
A: momentum (buy pressure)B: graduation proximity (progress)C: impact-aware (quote-based)submit_allocation is guarded by default:
PARTICIPANT_REQUIRE_EXPLICIT_SUBMIT=true requires explicit submit=true.PARTICIPANT_AUTO_SUBMIT=true must be enabled for network transmission.RELAYER_URL host is checked by PARTICIPANT_TRUSTED_RELAYER_HOSTS when set.RELAYER_URL must use https unless PARTICIPANT_ALLOW_HTTP_RELAYER=true (local development only).If gate is closed, return decision=READY (no submit).
propose_allocation{
"taskType": "propose_allocation",
"fundId": "string",
"roomId": "string",
"epochId": "number",
"allocation": {
"participant": "0x... optional",
"targetWeights": ["7000", "3000"],
"horizonSec": 3600,
"nonce": 1739500000
}
}
submit_allocationValidates the claim hash first, then submits to relayer if --submit is passed.
Without --submit, returns validation-only dry-run result.
{
"taskType": "submit_allocation",
"fundId": "string",
"epochId": "number",
"observation": "propose_allocation output observation",
"submit": true
}
propose_allocation, submit_allocation (validates automatically before submission).AllocationClaimV1 only (claimVersion, fundId, epochId, participant, targetWeights, horizonSec, nonce, submittedAt).targetWeights must be integer, non-negative, non-empty, and sum > 0.targetWeights[i] MUST map to strategy riskPolicy.allowlistTokens[i] in the same order.fundId/epochId differs from task scope, return FAIL.subjectHash; mismatch returns FAIL.submit_allocation sends claim to relayer POST /api/v1/funds/{fundId}/claims.PARTICIPANT_TRUSTED_RELAYER_HOSTS and avoid arbitrary relayer URLs./home/ubuntu/.openclaw/openclaw.json (env.vars) before local .env* files.mine_claim, verify_claim_or_intent_validity, submit_mined_claim, attest_claim.