Install
openclaw skills install safelinkSecure agent-to-agent hiring and execution skill for OpenClaw MCP with escrowed settlement, x402 facilitator payments, ERC-8004 identity/reputation checks, s...
openclaw skills install safelinkProduction-grade OpenClaw skill for safe bidirectional hire-agent and execute-agent flows.
SafeLink is designed for trusted agent economies:
Secure A2A hiring, settled by proofsecurityweb3a2apaymentsescrowx402erc-8004agentic-walletmcpproductionSafeLink enforces the following guarantees in runtime code paths:
Reference themes: x402 v2 facilitator model, ERC-8004 reputation/verification tiers, proof-before-settlement, cryptoeconomic reputation, opaque A2A execution, gas-aware risk controls, zkML/TEE extensibility.
Partially covered
Covered
Covered
Partially covered
Partially covered
Partially covered
Partially covered
setup_agentic_walletPurpose: Create or load an MPC wallet and return balance/network readiness.
Parameters:
provider (optional): "auto" | "coinbase" | "privy"
auto: choose Coinbase when available, else PrivyReturns:
{
"provider": "coinbase",
"wallet_id": "wallet_...",
"address": "0x...",
"eth_balance": "0.120000 ETH",
"usdc_balance": "12.50 USDC",
"network": "base-sepolia",
"network_id": 84532,
"ready": true,
"setup_note": "optional"
}
Safety notes:
Example:
{
"tool": "setup_agentic_wallet",
"arguments": { "provider": "auto" }
}
safe_hire_agentPurpose: Hire one agent with escrow + x402 + proof verification.
Parameters:
target_id: 0x... agent addresstask_description: text taskpayment_model: "per_request" | "per_min" | "per_execution"rate: number USDCidempotency_key (optional): dedupe keypolicy (optional): runtime constraintsconfirmed (optional): explicit high-risk confirmationReturns:
{
"task_id": "...",
"escrow_id": "0x...",
"result": {},
"proof_hash": "0x...",
"status": "completed",
"reputation_score_at_hire": 82,
"amount_paid_usdc": 0.05,
"idempotency_key": "hire-..."
}
Safety notes:
Example:
{
"tool": "safe_hire_agent",
"arguments": {
"target_id": "0xabc123...",
"task_description": "Summarize this PR and list top 3 security risks.",
"payment_model": "per_request",
"rate": 0.05,
"idempotency_key": "hire-pr-2026-03-05"
}
}
safe_execute_txPurpose: Intent-to-transaction execution pipeline with mandatory simulation and risk gating.
Parameters:
intent_description: plain-English tx intentconfirmed (optional): high-risk confirmationReturns:
{
"tx_hash": "0x...",
"simulation_report": {
"success": true,
"gas_estimate": "142331"
},
"risk_score": 24,
"risk_flags": ["HIGH_GAS"],
"status": "broadcast"
}
Safety notes:
Example:
{
"tool": "safe_execute_tx",
"arguments": {
"intent_description": "Approve 5 USDC to escrow contract 0x... on Base Sepolia"
}
}
safe_listen_for_hirePurpose: Start local HTTP receiver for inbound paid tasks.
Parameters:
Returns:
{
"status": "listening",
"message": "Agent ... is now accepting hire requests ...",
"tasks_processed": 0,
"endpoint": "http://127.0.0.1:8787/task"
}
Safety notes:
Example:
{
"tool": "safe_listen_for_hire",
"arguments": {}
}
safe_hire_agents_batch: batch hires with bounded concurrency and failure policysafe_register_as_service: publish capabilities/policy to registryverify_task_proof: validate proof locally and optionally against escrow recordget_agent_reputation: fetch and evaluate target reputation profilegenerate_agent_card: produce JSON and markdown profile artifactscheckpoint_memory: encrypted memory checkpoint + Merkle anchoringagent_analytics_summary: period metrics and operations summarynpm install
npm run setup
npm run build
npm start
{
"tool": "setup_agentic_wallet",
"arguments": { "provider": "auto" }
}
await agent.call("safe_hire_agent", {
target_id: "0xabc123...",
task_description: "Analyze the staking contract for reentrancy and auth flaws.",
payment_model: "per_request",
rate: 0.08,
idempotency_key: "audit-staking-v1-2026-03-05"
});
const firstTry = await agent.call("safe_execute_tx", {
intent_description: "Upgrade proxy at 0x... to implementation 0x..."
});
// If approval required, call again:
await agent.call("safe_execute_tx", {
intent_description: "Upgrade proxy at 0x... to implementation 0x...",
confirmed: true
});
setup_agentic_walletexport async function setup_agentic_wallet(rawInput: unknown) {
const input = validateInput(WalletSchema, rawInput);
const wallet = await getMPCWalletClient(resolveProvider(input.provider));
const [eth, usdc, chainId] = await Promise.all([
publicClient.getBalance({ address: wallet.address }),
getUSDCBalance(wallet.address, resolveNetwork()),
publicClient.getChainId()
]);
return formatWalletReady(wallet, eth, usdc, chainId);
}
safe_hire_agentexport async function safe_hire_agent(rawInput: unknown): Promise<HireResult> {
const input = validateInput(HireSchema, rawInput);
const key = deriveOrUseIdempotencyKey(input);
await acquireIdempotencyLock(key);
try {
const rep = await assertReputation(input.target_id);
const commitment = computeProofCommitment(session.id, input.target_id);
const escrow = await depositEscrow(...);
const payment = await sendX402Payment(...);
const task = await deliverTaskToAgentStrict(...);
if (!verifyProof(task.proof_hash, session.id, input.target_id)) {
await refundEscrow(escrow.escrowId);
throw new ProofVerificationError(task.proof_hash);
}
await releaseEscrow(escrow.escrowId, task.proof_hash);
await markIdempotencyCompleted(key);
return buildHireResult("completed", ...);
} catch (e) {
await attemptRefundIfNeeded();
throw e;
} finally {
await releaseIdempotencyLock(key);
await destroySession(session.id);
}
}
safe_execute_txexport async function safe_execute_tx(rawInput: unknown): Promise<ExecuteTxResult> {
const input = validateInput(ExecuteTxSchema, rawInput);
const parsed = await intentToTransaction(input.intent_description);
const simulation = await simulateTx(parsed);
if (!simulation.success) return simulationFailed(simulation);
const { score, flags } = await scoreRisk(simulation);
enforceApprovalGate(score, flags, input.confirmed, simulation);
const wallet = await getMPCWalletClient();
const txHash = await wallet.sendTransaction(toTxRequest(parsed, simulation));
return buildExecuteResult(txHash, simulation, score, flags);
}
safe_listen_for_hireexport async function safe_listen_for_hire(): Promise<ListenResult> {
const server = await startTaskServer(getConfig().TASK_SERVER_PORT);
return {
status: "listening",
message: `Register capability endpoint:${server.address}/task`,
tasks_processed: 0,
endpoint: `${server.address}/task`
};
}
safe_verify_attestation
safe_challenge_settlement
safe_rate_limit_admin
SAFE_ENDPOINT_ALLOWLIST: allowed destination domains for outbound A2A callsMAX_INBOUND_AMOUNT_ATOMIC_USDC: hard cap on inbound job valueIDEMPOTENCY_COMPLETED_TTL_MS: terminal dedupe windowSIWX_REQUIRED: require SIWx signature binding for paid task requestsENABLE_OPAQUE_ENVELOPE: encrypted A2A payload modeANTHROPIC_API_KEY (LLM), BASE_RPC_URL, and one of Privy (PRIVY_APP_ID + PRIVY_APP_SECRET) or Coinbase CDP (COINBASE_CDP_API_KEY_NAME + COINBASE_CDP_API_KEY_PRIVATE_KEY) for MPC wallet signing. Full list in .env.example and _meta.json.DEPLOYER_PRIVATE_KEY: Used once by scripts/deploy-contracts.ts for initial on-chain contract deployment only. Not loaded at MCP runtime. Use a throwaway funded key; discard after deployment.safe_listen_for_hire opens an HTTP server on TASK_SERVER_PORT (default 3402), bound to 127.0.0.1 unless explicitly reconfigured.scripts/deploy-contracts.ts writes deployed contract addresses back to .env. scripts/generate-env.ts creates .env interactively. Neither runs automatically on MCP startup.forge): Used by scripts/deploy-contracts.ts for one-time Solidity contract compilation and deployment only. Not required or invoked at MCP runtime.tests/stress/ contains literal prompt-injection strings (e.g. Ignore all previous instructions) as adversarial test fixtures that verify the input-gate blocks them. These are not instructions to any agent.v0.1.1 (2026-03-05)
_meta.json with full required env vars, binaries, runtime behavior, and security disclosure for registry scannersx402 to ^1.1.0 (fixes GHSA-3j63-5h8p-gf7c)v0.1.0 (2026-03-05)
/.well-known/agent-card.json HTTP endpointbasic, tee_attested, zkml_attested, stake_secured)