ワンクリックで
openfunderse-strategy
OpenFunderse Strategy bot for proposing and gated submission of trade intents
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
OpenFunderse Strategy bot for proposing and gated submission of trade intents
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
| name | openfunderse-strategy |
| description | OpenFunderse Strategy bot for proposing and gated submission of trade intents |
| always | false |
| disable-model-invocation | false |
| metadata | {"openclaw":{"installCommand":"npx @wiimdy/openfunderse@2.0.0 install openfunderse-strategy --with-runtime","requires":{"env":["RELAYER_URL","BOT_ID","STRATEGY_ADDRESS","CHAIN_ID","RPC_URL","STRATEGY_PRIVATE_KEY","INTENT_BOOK_ADDRESS","NADFUN_EXECUTION_ADAPTER_ADDRESS","ADAPTER_ADDRESS","NADFUN_LENS_ADDRESS","NADFUN_BONDING_CURVE_ROUTER","NADFUN_DEX_ROUTER","NADFUN_WMON_ADDRESS","VAULT_ADDRESS","STRATEGY_AUTO_SUBMIT","STRATEGY_REQUIRE_EXPLICIT_SUBMIT","STRATEGY_TRUSTED_RELAYER_HOSTS","STRATEGY_ALLOW_HTTP_RELAYER","STRATEGY_MAX_IMPACT_BPS","STRATEGY_SELL_TAKE_PROFIT_BPS","STRATEGY_SELL_STOP_LOSS_BPS","STRATEGY_SELL_MAX_HOLD_SECONDS","STRATEGY_DEADLINE_MIN_SECONDS","STRATEGY_DEADLINE_BASE_SECONDS","STRATEGY_DEADLINE_MAX_SECONDS","STRATEGY_DEADLINE_PER_CLAIM_SECONDS"]},"primaryEnv":"STRATEGY_PRIVATE_KEY","skillKey":"strategy"}} |
The Strategy MoltBot is responsible for proposing structured trade intents based on finalized data snapshots. It evaluates market conditions, liquidity, and risk policies to decide whether to propose a trade or hold.
For NadFun venues, it must use lens quotes to derive minAmountOut and reject router mismatch.
In runtime, use proposeIntentAndSubmit to build a canonical proposal first, then submit only when explicit submit gating is satisfied.
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.STRATEGY_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.strategy, and stores wallet backups under ~/.openclaw/workspace/openfunderse/wallets.install and bot-init can sync env vars into ~/.openclaw/openclaw.json, and bot-init may run 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-strategy --with-runtime
ClawHub:
npx clawhub@latest install openfunderse-strategy
If you already have a key, set STRATEGY_PRIVATE_KEY and STRATEGY_ADDRESS directly in OpenClaw env (/home/ubuntu/.openclaw/openclaw.json -> env.vars) or in ~/.openclaw/workspace/.env.strategy. 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 strategy \
--yes \
--no-restart-openclaw-gateway
bot-init updates an existing .env.strategy.
If the env file is missing, run install first (without --no-init-env) or pass --env-path.
/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.strategy; 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.
/propose_intent --fund-id <id> --intent-file <path> --execution-route-file <path>
/dry_run_intent --intent-hash <0x...> --intent-file <path> --execution-route-file <path>
/attest_intent --fund-id <id> --intent-hash <0x...>
/execute_intent --fund-id <id> [--limit <n>]
/create_fund --fund-id <id> --fund-name <name> --deploy-config-file <path>
BotFather /setcommands (copy-paste ready):
start - Show quick start
help - Show command help
create_fund - Create fund onchain via Factory
propose_intent - Propose a trade intent from snapshot
dry_run_intent - Simulate intent execution against ClawCore
attest_intent - Submit intent attestation to IntentBook
execute_intent - Execute attested intent onchain
Notes:
/propose_intent equals /propose-intent.key=value style is also accepted (fund_id=demo-fund).@BotFather -> /setcommands.OpenClaw note:
install / bot-init can sync env keys into ~/.openclaw/openclaw.json (env.vars).bot-init may also run openclaw gateway restart so the gateway picks up updated env.--no-sync-openclaw-env for file-only behavior--no-restart-openclaw-gateway to skip the restart (restart later manually if desired)/home/ubuntu/.openclaw/openclaw.json and run openclaw gateway restart intentionally.Note:
bot-init, you must still supply a real STRATEGY_PRIVATE_KEY + STRATEGY_ADDRESS (dedicated, least-privilege) before any production action.bot-init generates a new wallet (private key + address) and writes it into the role env file; treat the generated private key as a secret.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.
Role-derived scopes:
intents.propose, bots.register, funds.bootstrapclaims.submit, intents.attestPOST /api/v1/funds/sync-by-strategy supports a one-time bootstrap when the strategy bot is not yet registered.
Include auth in the JSON body (signed by strategyBotAddress) with:
signaturenonceexpiresAtAfter a successful sync, subsequent calls can use normal signature headers.
STRATEGY_PRIVATE_KEY is the strategy signer key (EOA) used for onchain strategy operations.disable-model-invocation: false).STRATEGY_REQUIRE_EXPLICIT_SUBMIT=true, STRATEGY_AUTO_SUBMIT=false) unless intentionally overridden.proposeIntentAndSubmit is guarded by default:
STRATEGY_REQUIRE_EXPLICIT_SUBMIT=true (default) requires explicit submit=true.STRATEGY_AUTO_SUBMIT=true must be enabled to allow external submission.RELAYER_URL is validated; enforce trusted hosts with STRATEGY_TRUSTED_RELAYER_HOSTS.decision=READY and does not post to relayer or send onchain tx.STRATEGY_AUTO_SUBMIT=false in production unless you intentionally enable unattended submission.The skill accepts a propose_intent task with the following schema:
{
"taskType": "propose_intent",
"fundId": "string",
"roomId": "string",
"epochId": "number",
"snapshot": {
"snapshotHash": "string",
"finalized": "boolean",
"claimCount": "number",
"aggregateWeights": ["string | number (optional)"]
},
"marketState": {
"network": "number",
"nadfunCurveState": "object",
"liquidity": "object",
"volatility": "object",
"positions": [
{
"token": "string",
"quantity": "string | number",
"costBasisAsset": "string | number (optional)",
"openedAt": "unix seconds or milliseconds (optional)"
}
]
},
"riskPolicy": {
"maxNotional": "string",
"maxSlippageBps": "number",
"allowlistTokens": ["string"],
"allowlistVenues": ["string"]
}
}
{
"taskType": "propose_intent",
"fundId": "fund-001",
"roomId": "telegram-room-abc",
"epochId": 12,
"snapshot": {
"snapshotHash": "0xabc123...",
"finalized": true,
"claimCount": 19,
"aggregateWeights": ["7000", "3000"]
},
"marketState": {
"network": 10143,
"nadfunCurveState": {},
"liquidity": {},
"volatility": {},
"positions": [
{
"token": "0xtoken1...",
"quantity": "1200000000000000000",
"costBasisAsset": "1000000000000000000",
"openedAt": 1730000000
}
]
},
"riskPolicy": {
"maxNotional": "1000",
"maxSlippageBps": 80,
"allowlistTokens": ["0xtoken1...", "0xtoken2..."],
"allowlistVenues": ["NadFun", "UniswapV3"]
}
}
The skill returns either a PROPOSE or HOLD decision.
Returned when market conditions meet the risk policy and a profitable trade is identified.
{
"status": "OK",
"taskType": "propose_intent",
"fundId": "string",
"epochId": "number",
"decision": "PROPOSE",
"intent": {
"intentVersion": "V1",
"fundId": "string",
"roomId": "string",
"epochId": "number",
"vault": "string",
"action": "BUY | SELL",
"tokenIn": "string",
"tokenOut": "string",
"amountIn": "string",
"minAmountOut": "string",
"deadline": "number",
"maxSlippageBps": "number",
"snapshotHash": "string"
},
"executionPlan": {
"venue": "NADFUN_BONDING_CURVE | NADFUN_DEX",
"router": "string",
"quoteAmountOut": "string"
},
"reason": "string",
"riskChecks": {
"allowlistPass": "boolean",
"notionalPass": "boolean",
"slippagePass": "boolean",
"deadlinePass": "boolean"
},
"confidence": "number",
"assumptions": ["string"]
}
When using proposeIntentAndSubmit with explicit submit gates satisfied, a PROPOSE decision is followed by:
POST /api/v1/funds/{fundId}/intents/proposeIntentBook.proposeIntent(...)This keeps offchain canonical intent and onchain intent registration aligned in the same skill timing.
For end-to-end execution, strategy/relayer interaction follows:
GET /api/v1/funds/{fundId}/epochs/latest for snapshotHash, claimCount, aggregateWeights.POST /api/v1/funds/{fundId}/intents/propose.IntentBook.proposeIntent(...).GET /api/v1/funds/{fundId}/intents/{intentHash}/onchain-bundle.IntentBook.attestIntent(...), then ack relayer POST /api/v1/funds/{fundId}/intents/{intentHash}/onchain-attested.GET /api/v1/funds/{fundId}/intents/ready-execution.ClawCore.dryRunIntentExecution(...) then ClawCore.executeIntent(...).POST /api/v1/funds/{fundId}/intents/{intentHash}/onchain-executedPOST /api/v1/funds/{fundId}/intents/{intentHash}/onchain-failedReturned when no trade is proposed due to risk constraints or market conditions.
{
"status": "OK",
"taskType": "propose_intent",
"fundId": "string",
"roomId": "string",
"epochId": "number",
"decision": "HOLD",
"reason": "string",
"confidence": "number",
"assumptions": ["string"]
}
snapshot.finalized is true.snapshotHash from the input MUST be included in the intent object.HOLD.getAmountOut and compute minAmountOut from quote + slippage.minAmountOut=0.HOLD.SELL triggers first (take-profit, stop-loss, time-exit) before considering BUY.openedAt may be in seconds or milliseconds; normalize before age-based exits.STRATEGY_TRUSTED_RELAYER_HOSTS and avoid arbitrary relayer URLs./home/ubuntu/.openclaw/openclaw.json (env.vars) before local .env* files.