원클릭으로
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.